From 1d5cfd8d10f497f0acb321113794d41157920e90 Mon Sep 17 00:00:00 2001 From: pnenzi Date: Mon, 11 Aug 2003 20:31:51 +0000 Subject: [PATCH] Code update. CIDER compatiblity. Variuous enhancements. --- src/spicelib/devices/Makefile.am | 16 +- src/spicelib/devices/asrc/asrcinit.c | 5 +- src/spicelib/devices/bjt/bjtinit.c | 5 +- src/spicelib/devices/bjt2/Makefile.am | 4 +- src/spicelib/devices/bjt2/bjt2.c | 1 - src/spicelib/devices/bjt2/bjt2acld.c | 1 - src/spicelib/devices/bjt2/bjt2ask.c | 1 - src/spicelib/devices/bjt2/bjt2conv.c | 1 - src/spicelib/devices/bjt2/bjt2del.c | 1 - src/spicelib/devices/bjt2/bjt2dest.c | 1 - src/spicelib/devices/bjt2/bjt2disto.c | 1 - src/spicelib/devices/bjt2/bjt2dset.c | 1 - src/spicelib/devices/bjt2/bjt2getic.c | 1 - src/spicelib/devices/bjt2/bjt2init.c | 21 +- src/spicelib/devices/bjt2/bjt2load.c | 1 - src/spicelib/devices/bjt2/bjt2mask.c | 1 - src/spicelib/devices/bjt2/bjt2mdel.c | 1 - src/spicelib/devices/bjt2/bjt2mpar.c | 1 - src/spicelib/devices/bjt2/bjt2noise.c | 1 - src/spicelib/devices/bjt2/bjt2param.c | 1 - src/spicelib/devices/bjt2/bjt2pzld.c | 48 +- src/spicelib/devices/bjt2/bjt2sacl.c | 1 - src/spicelib/devices/bjt2/bjt2setup.c | 1 - src/spicelib/devices/bjt2/bjt2sload.c | 1 - src/spicelib/devices/bjt2/bjt2sprt.c | 1 - src/spicelib/devices/bjt2/bjt2sset.c | 1 - src/spicelib/devices/bjt2/bjt2supd.c | 1 - src/spicelib/devices/bjt2/bjt2temp.c | 1 - src/spicelib/devices/bjt2/bjt2trun.c | 1 - src/spicelib/devices/bsim1/bsim1init.c | 5 +- src/spicelib/devices/bsim2/bsim2init.c | 5 +- src/spicelib/devices/bsim3/b3.c | 903 +- src/spicelib/devices/bsim3/b3acld.c | 751 +- src/spicelib/devices/bsim3/b3ask.c | 435 +- src/spicelib/devices/bsim3/b3check.c | 951 +- src/spicelib/devices/bsim3/b3cvtest.c | 207 +- src/spicelib/devices/bsim3/b3del.c | 68 +- src/spicelib/devices/bsim3/b3dest.c | 73 +- src/spicelib/devices/bsim3/b3getic.c | 83 +- src/spicelib/devices/bsim3/b3ld.c | 5663 ++++++----- src/spicelib/devices/bsim3/b3mask.c | 2434 ++--- src/spicelib/devices/bsim3/b3mdel.c | 81 +- src/spicelib/devices/bsim3/b3mpar.c | 3294 +++---- src/spicelib/devices/bsim3/b3noi.c | 850 +- src/spicelib/devices/bsim3/b3par.c | 190 +- src/spicelib/devices/bsim3/b3pzld.c | 821 +- src/spicelib/devices/bsim3/b3set.c | 1997 ++-- src/spicelib/devices/bsim3/b3temp.c | 1975 ++-- src/spicelib/devices/bsim3/b3trunc.c | 73 +- src/spicelib/devices/bsim3/bsim3def.h | 43 +- src/spicelib/devices/bsim3/bsim3ext.h | 25 +- src/spicelib/devices/bsim3/bsim3init.c | 9 +- src/spicelib/devices/bsim3/bsim3itf.h | 2 + src/spicelib/devices/bsim3soi_dd/b3soidd.c | 9 +- .../devices/bsim3soi_dd/b3soiddacld.c | 257 +- src/spicelib/devices/bsim3soi_dd/b3soiddask.c | 52 +- .../devices/bsim3soi_dd/b3soiddcheck.c | 19 +- .../devices/bsim3soi_dd/b3soiddcvtest.c | 22 +- src/spicelib/devices/bsim3soi_dd/b3soidddef.h | 18 +- src/spicelib/devices/bsim3soi_dd/b3soidddel.c | 11 +- .../devices/bsim3soi_dd/b3soidddest.c | 9 +- src/spicelib/devices/bsim3soi_dd/b3soiddext.h | 26 +- .../devices/bsim3soi_dd/b3soiddgetic.c | 19 +- .../devices/bsim3soi_dd/b3soiddinit.c | 76 +- src/spicelib/devices/bsim3soi_dd/b3soidditf.h | 2 +- src/spicelib/devices/bsim3soi_dd/b3soiddld.c | 247 +- .../devices/bsim3soi_dd/b3soiddmask.c | 8 +- .../devices/bsim3soi_dd/b3soiddmdel.c | 11 +- .../devices/bsim3soi_dd/b3soiddmpar.c | 11 +- src/spicelib/devices/bsim3soi_dd/b3soiddnoi.c | 59 +- src/spicelib/devices/bsim3soi_dd/b3soiddpar.c | 16 +- .../devices/bsim3soi_dd/b3soiddpzld.c | 120 +- src/spicelib/devices/bsim3soi_dd/b3soiddset.c | 67 +- .../devices/bsim3soi_dd/b3soiddtemp.c | 26 +- .../devices/bsim3soi_dd/b3soiddtrunc.c | 19 +- src/spicelib/devices/bsim3soi_fd/b3soifd.c | 7 +- .../devices/bsim3soi_fd/b3soifdacld.c | 219 +- src/spicelib/devices/bsim3soi_fd/b3soifdask.c | 67 +- .../devices/bsim3soi_fd/b3soifdcheck.c | 19 +- .../devices/bsim3soi_fd/b3soifdcvtest.c | 22 +- src/spicelib/devices/bsim3soi_fd/b3soifddef.h | 16 +- src/spicelib/devices/bsim3soi_fd/b3soifddel.c | 11 +- .../devices/bsim3soi_fd/b3soifddest.c | 9 +- src/spicelib/devices/bsim3soi_fd/b3soifdext.h | 24 +- .../devices/bsim3soi_fd/b3soifdgetic.c | 18 +- .../devices/bsim3soi_fd/b3soifdinit.c | 79 +- src/spicelib/devices/bsim3soi_fd/b3soifditf.h | 2 +- src/spicelib/devices/bsim3soi_fd/b3soifdld.c | 224 +- .../devices/bsim3soi_fd/b3soifdmask.c | 12 +- .../devices/bsim3soi_fd/b3soifdmdel.c | 11 +- .../devices/bsim3soi_fd/b3soifdmpar.c | 11 +- src/spicelib/devices/bsim3soi_fd/b3soifdnoi.c | 57 +- src/spicelib/devices/bsim3soi_fd/b3soifdpar.c | 17 +- .../devices/bsim3soi_fd/b3soifdpzld.c | 122 +- src/spicelib/devices/bsim3soi_fd/b3soifdset.c | 65 +- .../devices/bsim3soi_fd/b3soifdtemp.c | 24 +- .../devices/bsim3soi_fd/b3soifdtrunc.c | 20 +- src/spicelib/devices/bsim3soi_pd/b3soipd.c | 1237 ++- .../devices/bsim3soi_pd/b3soipdacld.c | 678 +- src/spicelib/devices/bsim3soi_pd/b3soipdask.c | 471 +- .../devices/bsim3soi_pd/b3soipdcheck.c | 1551 ++- .../devices/bsim3soi_pd/b3soipdcvtest.c | 143 +- src/spicelib/devices/bsim3soi_pd/b3soipddef.h | 3085 +++--- src/spicelib/devices/bsim3soi_pd/b3soipddel.c | 46 +- .../devices/bsim3soi_pd/b3soipddest.c | 53 +- src/spicelib/devices/bsim3soi_pd/b3soipdext.h | 73 +- .../devices/bsim3soi_pd/b3soipdgetic.c | 77 +- .../devices/bsim3soi_pd/b3soipdinit.c | 78 +- src/spicelib/devices/bsim3soi_pd/b3soipditf.h | 2 +- src/spicelib/devices/bsim3soi_pd/b3soipdld.c | 8378 ++++++++--------- .../devices/bsim3soi_pd/b3soipdmask.c | 2823 +++--- .../devices/bsim3soi_pd/b3soipdmdel.c | 59 +- .../devices/bsim3soi_pd/b3soipdmpar.c | 3785 ++++---- src/spicelib/devices/bsim3soi_pd/b3soipdnoi.c | 739 +- src/spicelib/devices/bsim3soi_pd/b3soipdpar.c | 296 +- .../devices/bsim3soi_pd/b3soipdpzld.c | 269 +- src/spicelib/devices/bsim3soi_pd/b3soipdset.c | 2829 +++--- .../devices/bsim3soi_pd/b3soipdtemp.c | 1929 ++-- .../devices/bsim3soi_pd/b3soipdtrunc.c | 55 +- src/spicelib/devices/bsim3v1/b3v1.c | 809 +- src/spicelib/devices/bsim3v1/b3v1acld.c | 345 +- src/spicelib/devices/bsim3v1/b3v1ask.c | 395 +- src/spicelib/devices/bsim3v1/b3v1check.c | 330 +- src/spicelib/devices/bsim3v1/b3v1cvtest.c | 121 +- src/spicelib/devices/bsim3v1/b3v1del.c | 39 +- src/spicelib/devices/bsim3v1/b3v1dest.c | 34 +- src/spicelib/devices/bsim3v1/b3v1getic.c | 51 +- src/spicelib/devices/bsim3v1/b3v1ld.c | 1528 +-- src/spicelib/devices/bsim3v1/b3v1mask.c | 1463 +-- src/spicelib/devices/bsim3v1/b3v1mdel.c | 38 +- src/spicelib/devices/bsim3v1/b3v1mpar.c | 2447 +++-- src/spicelib/devices/bsim3v1/b3v1noi.c | 293 +- src/spicelib/devices/bsim3v1/b3v1par.c | 118 +- src/spicelib/devices/bsim3v1/b3v1pzld.c | 204 +- src/spicelib/devices/bsim3v1/b3v1set.c | 1701 ++-- src/spicelib/devices/bsim3v1/b3v1temp.c | 1039 +- src/spicelib/devices/bsim3v1/b3v1trunc.c | 50 +- src/spicelib/devices/bsim3v1/bsim3v1def.h | 3033 +++--- src/spicelib/devices/bsim3v1/bsim3v1ext.h | 64 +- src/spicelib/devices/bsim3v1/bsim3v1init.c | 76 +- src/spicelib/devices/bsim3v1/bsim3v1init.h | 20 +- src/spicelib/devices/bsim3v1/bsim3v1itf.h | 7 +- src/spicelib/devices/cap/cap.c | 1 - src/spicelib/devices/cap/capacld.c | 1 - src/spicelib/devices/cap/capask.c | 1 - src/spicelib/devices/cap/capdel.c | 1 - src/spicelib/devices/cap/capdest.c | 1 - src/spicelib/devices/cap/capgetic.c | 1 - src/spicelib/devices/cap/capinit.c | 5 +- src/spicelib/devices/cap/capload.c | 1 - src/spicelib/devices/cap/capmask.c | 1 - src/spicelib/devices/cap/capmdel.c | 1 - src/spicelib/devices/cap/capmpar.c | 1 - src/spicelib/devices/cap/capparam.c | 1 - src/spicelib/devices/cap/cappzld.c | 1 - src/spicelib/devices/cap/capsacl.c | 1 - src/spicelib/devices/cap/capsetup.c | 1 - src/spicelib/devices/cap/capsload.c | 1 - src/spicelib/devices/cap/capsprt.c | 1 - src/spicelib/devices/cap/capsset.c | 1 - src/spicelib/devices/cap/capsupd.c | 1 - src/spicelib/devices/cap/captemp.c | 1 - src/spicelib/devices/cap/captrunc.c | 1 - src/spicelib/devices/cccs/cccsinit.c | 5 +- src/spicelib/devices/ccvs/ccvsinit.c | 5 +- src/spicelib/devices/cpl/cpl.c | 1 - src/spicelib/devices/cpl/cpldefs.h | 1 + src/spicelib/devices/cpl/cpldel.c | 1 - src/spicelib/devices/cpl/cpldest.c | 1 - src/spicelib/devices/cpl/cplinit.c | 69 +- src/spicelib/devices/cpl/cplload.c | 1 - src/spicelib/devices/cpl/cplmdel.c | 1 - src/spicelib/devices/cpl/cplmpar.c | 1 - src/spicelib/devices/cpl/cplparam.c | 1 - src/spicelib/devices/cpl/cplsetup.c | 1 - src/spicelib/devices/csw/cswinit.c | 5 +- src/spicelib/devices/dev.c | 126 +- src/spicelib/devices/devsup.c | 113 +- src/spicelib/devices/dio/dio.c | 1 - src/spicelib/devices/dio/dioacld.c | 1 - src/spicelib/devices/dio/dioask.c | 1 - src/spicelib/devices/dio/dioconv.c | 1 - src/spicelib/devices/dio/diodel.c | 1 - src/spicelib/devices/dio/diodest.c | 1 - src/spicelib/devices/dio/diodisto.c | 1 - src/spicelib/devices/dio/diodset.c | 1 - src/spicelib/devices/dio/diogetic.c | 1 - src/spicelib/devices/dio/dioinit.c | 4 +- src/spicelib/devices/dio/dioload.c | 1 - src/spicelib/devices/dio/diomask.c | 1 - src/spicelib/devices/dio/diomdel.c | 1 - src/spicelib/devices/dio/diompar.c | 1 - src/spicelib/devices/dio/dionoise.c | 1 - src/spicelib/devices/dio/dioparam.c | 1 - src/spicelib/devices/dio/diopzld.c | 1 - src/spicelib/devices/dio/diosacl.c | 1 - src/spicelib/devices/dio/diosetup.c | 1 - src/spicelib/devices/dio/diosload.c | 1 - src/spicelib/devices/dio/diosprt.c | 1 - src/spicelib/devices/dio/diosset.c | 1 - src/spicelib/devices/dio/diosupd.c | 1 - src/spicelib/devices/dio/diotemp.c | 1 - src/spicelib/devices/dio/diotrunc.c | 1 - src/spicelib/devices/hfet1/hfetinit.c | 5 +- src/spicelib/devices/hfet2/hfet2init.c | 5 +- src/spicelib/devices/ind/ind.c | 1 - src/spicelib/devices/ind/indacld.c | 1 - src/spicelib/devices/ind/indask.c | 1 - src/spicelib/devices/ind/inddel.c | 1 - src/spicelib/devices/ind/inddest.c | 1 - src/spicelib/devices/ind/indinit.c | 5 +- src/spicelib/devices/ind/indload.c | 1 - src/spicelib/devices/ind/indmdel.c | 1 - src/spicelib/devices/ind/indparam.c | 1 - src/spicelib/devices/ind/indpzld.c | 1 - src/spicelib/devices/ind/indsacl.c | 1 - src/spicelib/devices/ind/indsetup.c | 1 - src/spicelib/devices/ind/indsload.c | 1 - src/spicelib/devices/ind/indsprt.c | 1 - src/spicelib/devices/ind/indsset.c | 1 - src/spicelib/devices/ind/indsupd.c | 1 - src/spicelib/devices/ind/indtrunc.c | 1 - src/spicelib/devices/ind/mutacld.c | 1 - src/spicelib/devices/ind/mutask.c | 1 - src/spicelib/devices/ind/mutdel.c | 1 - src/spicelib/devices/ind/mutdest.c | 1 - src/spicelib/devices/ind/mutmdel.c | 1 - src/spicelib/devices/ind/mutparam.c | 1 - src/spicelib/devices/ind/mutpzld.c | 1 - src/spicelib/devices/ind/mutsetup.c | 1 - src/spicelib/devices/ind/mutsprt.c | 1 - src/spicelib/devices/ind/mutsset.c | 1 - src/spicelib/devices/isrc/isrcinit.c | 5 +- src/spicelib/devices/jfet/jfetinit.c | 5 +- src/spicelib/devices/jfet2/jfet2init.c | 5 +- src/spicelib/devices/ltra/ltrainit.c | 5 +- src/spicelib/devices/mes/mesinit.c | 5 +- src/spicelib/devices/mesa/mesainit.c | 5 +- src/spicelib/devices/mos1/mos1.c | 1 - src/spicelib/devices/mos1/mos1acld.c | 1 - src/spicelib/devices/mos1/mos1ask.c | 1 - src/spicelib/devices/mos1/mos1conv.c | 1 - src/spicelib/devices/mos1/mos1del.c | 1 - src/spicelib/devices/mos1/mos1dest.c | 1 - src/spicelib/devices/mos1/mos1dist.c | 1 - src/spicelib/devices/mos1/mos1dset.c | 1 - src/spicelib/devices/mos1/mos1ic.c | 1 - src/spicelib/devices/mos1/mos1init.c | 5 +- src/spicelib/devices/mos1/mos1load.c | 39 +- src/spicelib/devices/mos1/mos1mask.c | 1 - src/spicelib/devices/mos1/mos1mdel.c | 1 - src/spicelib/devices/mos1/mos1mpar.c | 1 - src/spicelib/devices/mos1/mos1noi.c | 1 - src/spicelib/devices/mos1/mos1par.c | 1 - src/spicelib/devices/mos1/mos1pzld.c | 1 - src/spicelib/devices/mos1/mos1sacl.c | 1 - src/spicelib/devices/mos1/mos1set.c | 1 - src/spicelib/devices/mos1/mos1sld.c | 1 - src/spicelib/devices/mos1/mos1sprt.c | 1 - src/spicelib/devices/mos1/mos1sset.c | 1 - src/spicelib/devices/mos1/mos1supd.c | 1 - src/spicelib/devices/mos1/mos1temp.c | 1 - src/spicelib/devices/mos1/mos1trun.c | 1 - src/spicelib/devices/mos2/mos2.c | 1 - src/spicelib/devices/mos2/mos2acld.c | 1 - src/spicelib/devices/mos2/mos2ask.c | 1 - src/spicelib/devices/mos2/mos2conv.c | 1 - src/spicelib/devices/mos2/mos2del.c | 1 - src/spicelib/devices/mos2/mos2dest.c | 1 - src/spicelib/devices/mos2/mos2dist.c | 1 - src/spicelib/devices/mos2/mos2dset.c | 1 - src/spicelib/devices/mos2/mos2ic.c | 1 - src/spicelib/devices/mos2/mos2init.c | 5 +- src/spicelib/devices/mos2/mos2load.c | 46 +- src/spicelib/devices/mos2/mos2mask.c | 1 - src/spicelib/devices/mos2/mos2mdel.c | 1 - src/spicelib/devices/mos2/mos2mpar.c | 1 - src/spicelib/devices/mos2/mos2noi.c | 1 - src/spicelib/devices/mos2/mos2par.c | 1 - src/spicelib/devices/mos2/mos2pzld.c | 1 - src/spicelib/devices/mos2/mos2sacl.c | 1 - src/spicelib/devices/mos2/mos2set.c | 1 - src/spicelib/devices/mos2/mos2sld.c | 1 - src/spicelib/devices/mos2/mos2sprt.c | 1 - src/spicelib/devices/mos2/mos2sset.c | 1 - src/spicelib/devices/mos2/mos2supd.c | 1 - src/spicelib/devices/mos2/mos2temp.c | 1 - src/spicelib/devices/mos2/mos2trun.c | 1 - src/spicelib/devices/mos3/mos3.c | 1 - src/spicelib/devices/mos3/mos3acld.c | 1 - src/spicelib/devices/mos3/mos3ask.c | 1 - src/spicelib/devices/mos3/mos3conv.c | 1 - src/spicelib/devices/mos3/mos3del.c | 1 - src/spicelib/devices/mos3/mos3dest.c | 1 - src/spicelib/devices/mos3/mos3dist.c | 1 - src/spicelib/devices/mos3/mos3dset.c | 1 - src/spicelib/devices/mos3/mos3ic.c | 1 - src/spicelib/devices/mos3/mos3init.c | 5 +- src/spicelib/devices/mos3/mos3load.c | 51 +- src/spicelib/devices/mos3/mos3mask.c | 1 - src/spicelib/devices/mos3/mos3mdel.c | 1 - src/spicelib/devices/mos3/mos3mpar.c | 1 - src/spicelib/devices/mos3/mos3noi.c | 1 - src/spicelib/devices/mos3/mos3par.c | 1 - src/spicelib/devices/mos3/mos3pzld.c | 1 - src/spicelib/devices/mos3/mos3sacl.c | 1 - src/spicelib/devices/mos3/mos3set.c | 1 - src/spicelib/devices/mos3/mos3sld.c | 1 - src/spicelib/devices/mos3/mos3sprt.c | 1 - src/spicelib/devices/mos3/mos3sset.c | 1 - src/spicelib/devices/mos3/mos3supd.c | 1 - src/spicelib/devices/mos3/mos3temp.c | 1 - src/spicelib/devices/mos3/mos3trun.c | 1 - src/spicelib/devices/mos6/mos6init.c | 5 +- src/spicelib/devices/mos9/mos9init.c | 5 +- src/spicelib/devices/res/res.c | 1 - src/spicelib/devices/res/resask.c | 1 - src/spicelib/devices/res/resdel.c | 1 - src/spicelib/devices/res/resdest.c | 1 - src/spicelib/devices/res/resinit.c | 5 +- src/spicelib/devices/res/resload.c | 1 - src/spicelib/devices/res/resmask.c | 1 - src/spicelib/devices/res/resmdel.c | 1 - src/spicelib/devices/res/resmpar.c | 1 - src/spicelib/devices/res/resnoise.c | 1 - src/spicelib/devices/res/resparam.c | 1 - src/spicelib/devices/res/respzld.c | 1 - src/spicelib/devices/res/ressacl.c | 1 - src/spicelib/devices/res/ressetup.c | 1 - src/spicelib/devices/res/ressload.c | 1 - src/spicelib/devices/res/ressprt.c | 7 +- src/spicelib/devices/res/ressset.c | 1 - src/spicelib/devices/res/restemp.c | 1 - src/spicelib/devices/soi3/soi3.c | 25 +- src/spicelib/devices/soi3/soi3acld.c | 855 +- src/spicelib/devices/soi3/soi3ask.c | 109 +- src/spicelib/devices/soi3/soi3cap.c | 301 +- src/spicelib/devices/soi3/soi3conv.c | 29 +- src/spicelib/devices/soi3/soi3defs.h | 433 +- src/spicelib/devices/soi3/soi3del.c | 15 +- src/spicelib/devices/soi3/soi3dest.c | 13 +- src/spicelib/devices/soi3/soi3ext.h | 80 +- src/spicelib/devices/soi3/soi3ic.c | 20 +- src/spicelib/devices/soi3/soi3init.c | 7 +- src/spicelib/devices/soi3/soi3itf.h | 9 +- src/spicelib/devices/soi3/soi3load.c | 741 +- src/spicelib/devices/soi3/soi3mask.c | 27 +- src/spicelib/devices/soi3/soi3mdel.c | 15 +- src/spicelib/devices/soi3/soi3mpar.c | 33 +- src/spicelib/devices/soi3/soi3nois.c | 44 +- src/spicelib/devices/soi3/soi3par.c | 32 +- src/spicelib/devices/soi3/soi3set.c | 232 +- src/spicelib/devices/soi3/soi3temp.c | 29 +- src/spicelib/devices/soi3/soi3trun.c | 23 +- src/spicelib/devices/sw/swinit.c | 5 +- src/spicelib/devices/tra/trainit.c | 5 +- src/spicelib/devices/txl/txl.c | 1 - src/spicelib/devices/txl/txlacct.c | 1 - src/spicelib/devices/txl/txlask.c | 1 - src/spicelib/devices/txl/txldefs.h | 4 +- src/spicelib/devices/txl/txldel.c | 1 - src/spicelib/devices/txl/txldest.c | 1 - src/spicelib/devices/txl/txlfbr.c | 1 - src/spicelib/devices/txl/txlinit.c | 64 +- src/spicelib/devices/txl/txlload.c | 1 - src/spicelib/devices/txl/txlmask.c | 1 - src/spicelib/devices/txl/txlmdel.c | 1 - src/spicelib/devices/txl/txlmpar.c | 1 - src/spicelib/devices/txl/txlparam.c | 1 - src/spicelib/devices/txl/txlsetup.c | 1 - src/spicelib/devices/urc/urcinit.c | 5 +- src/spicelib/devices/vccs/vccsask.c | 2 +- src/spicelib/devices/vccs/vccsinit.c | 5 +- src/spicelib/devices/vcvs/vcvsinit.c | 5 +- src/spicelib/devices/vsrc/vsrcinit.c | 5 +- 375 files changed, 35925 insertions(+), 34054 deletions(-) diff --git a/src/spicelib/devices/Makefile.am b/src/spicelib/devices/Makefile.am index 686187710..3a4b11350 100644 --- a/src/spicelib/devices/Makefile.am +++ b/src/spicelib/devices/Makefile.am @@ -3,12 +3,16 @@ SUBDIRS = \ asrc \ bjt \ + bjt2 \ bsim1 \ bsim2 \ bsim3 \ + bsim3soi \ bsim4 \ + bsim3v0 \ bsim3v1 \ - bsim3v2 \ + bsim3v1s \ + bsim3v1a \ bsim3soi_pd \ bsim3soi_fd \ bsim3soi_dd \ @@ -23,6 +27,7 @@ SUBDIRS = \ isrc \ hfet1 \ hfet2 \ + hisim \ jfet \ jfet2 \ ltra \ @@ -41,11 +46,9 @@ SUBDIRS = \ urc \ vccs \ vcvs \ - vsrc + vsrc \ + @NUMDEVDIR@ -## This line move to here 'cause it was causing automake to choke -## when it was in the list of subdirs -## bjt2 \ noinst_LIBRARIES = libdev.a @@ -60,7 +63,8 @@ libdev_a_SOURCES = \ cktbindnode.c \ cktcrte.c \ cktfinddev.c \ - cktinit.c + cktinit.c \ + limit.c INCLUDES = -I$(top_srcdir)/src/include -I$(top_srcdir)/src/spicelib/devices diff --git a/src/spicelib/devices/asrc/asrcinit.c b/src/spicelib/devices/asrc/asrcinit.c index abb429b4e..52e2255cf 100644 --- a/src/spicelib/devices/asrc/asrcinit.c +++ b/src/spicelib/devices/asrc/asrcinit.c @@ -68,7 +68,10 @@ SPICEdev ASRCinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, /* DISTO */ DEVnoise : NULL, /* NOISE */ - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &ASRCiSize, DEVmodSize : &ASRCmSize }; diff --git a/src/spicelib/devices/bjt/bjtinit.c b/src/spicelib/devices/bjt/bjtinit.c index 3cab0bcbd..035b7fd3e 100644 --- a/src/spicelib/devices/bjt/bjtinit.c +++ b/src/spicelib/devices/bjt/bjtinit.c @@ -67,7 +67,10 @@ SPICEdev BJTinfo = { /* description from struct IFdevice */ DEVsenTrunc : NULL, DEVdisto : BJTdisto, DEVnoise : BJTnoise, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &BJTiSize, DEVmodSize : &BJTmSize diff --git a/src/spicelib/devices/bjt2/Makefile.am b/src/spicelib/devices/bjt2/Makefile.am index 40093e8ac..38a2b8f56 100644 --- a/src/spicelib/devices/bjt2/Makefile.am +++ b/src/spicelib/devices/bjt2/Makefile.am @@ -1,8 +1,8 @@ ## Process this file with automake to produce Makefile.in -pkglib_LTLIBRARIES = libbjt2.la +noinst_LIBRARIES = libbjt2.a -libbjt2_la_SOURCES = \ +libbjt2_a_SOURCES = \ bjt2.c \ bjt2acld.c \ bjt2ask.c \ diff --git a/src/spicelib/devices/bjt2/bjt2.c b/src/spicelib/devices/bjt2/bjt2.c index 81909d138..6b4d6f3d7 100644 --- a/src/spicelib/devices/bjt2/bjt2.c +++ b/src/spicelib/devices/bjt2/bjt2.c @@ -10,7 +10,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "devdefs.h" #include "bjt2defs.h" #include "suffix.h" diff --git a/src/spicelib/devices/bjt2/bjt2acld.c b/src/spicelib/devices/bjt2/bjt2acld.c index 1747ea644..9d8ee9d6b 100644 --- a/src/spicelib/devices/bjt2/bjt2acld.c +++ b/src/spicelib/devices/bjt2/bjt2acld.c @@ -11,7 +11,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "cktdefs.h" #include "bjt2defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/bjt2/bjt2ask.c b/src/spicelib/devices/bjt2/bjt2ask.c index 9e8783244..f72bdbac7 100644 --- a/src/spicelib/devices/bjt2/bjt2ask.c +++ b/src/spicelib/devices/bjt2/bjt2ask.c @@ -11,7 +11,6 @@ Modified: Alan Gillespie #include "ngspice.h" #include "const.h" -#include #include "cktdefs.h" #include "bjt2defs.h" #include "ifsim.h" diff --git a/src/spicelib/devices/bjt2/bjt2conv.c b/src/spicelib/devices/bjt2/bjt2conv.c index 9e7ee3f81..5a0afa470 100644 --- a/src/spicelib/devices/bjt2/bjt2conv.c +++ b/src/spicelib/devices/bjt2/bjt2conv.c @@ -10,7 +10,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "cktdefs.h" #include "bjt2defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/bjt2/bjt2del.c b/src/spicelib/devices/bjt2/bjt2del.c index dc1a4288e..bf28ed671 100644 --- a/src/spicelib/devices/bjt2/bjt2del.c +++ b/src/spicelib/devices/bjt2/bjt2del.c @@ -10,7 +10,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "bjt2defs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/bjt2/bjt2dest.c b/src/spicelib/devices/bjt2/bjt2dest.c index b573c0418..4edc8b332 100644 --- a/src/spicelib/devices/bjt2/bjt2dest.c +++ b/src/spicelib/devices/bjt2/bjt2dest.c @@ -12,7 +12,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "bjt2defs.h" #include "suffix.h" diff --git a/src/spicelib/devices/bjt2/bjt2disto.c b/src/spicelib/devices/bjt2/bjt2disto.c index 4d37656d7..5ba2159b0 100644 --- a/src/spicelib/devices/bjt2/bjt2disto.c +++ b/src/spicelib/devices/bjt2/bjt2disto.c @@ -5,7 +5,6 @@ Modified: Alan Gillespie **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "bjt2defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/bjt2/bjt2dset.c b/src/spicelib/devices/bjt2/bjt2dset.c index 281b1222e..fcd78efb2 100644 --- a/src/spicelib/devices/bjt2/bjt2dset.c +++ b/src/spicelib/devices/bjt2/bjt2dset.c @@ -5,7 +5,6 @@ Modified: Alan Gillespie **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "bjt2defs.h" #include "const.h" diff --git a/src/spicelib/devices/bjt2/bjt2getic.c b/src/spicelib/devices/bjt2/bjt2getic.c index 9449389cc..07ba95c50 100644 --- a/src/spicelib/devices/bjt2/bjt2getic.c +++ b/src/spicelib/devices/bjt2/bjt2getic.c @@ -12,7 +12,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "cktdefs.h" #include "bjt2defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/bjt2/bjt2init.c b/src/spicelib/devices/bjt2/bjt2init.c index 8dec16d58..26f30fd11 100644 --- a/src/spicelib/devices/bjt2/bjt2init.c +++ b/src/spicelib/devices/bjt2/bjt2init.c @@ -21,6 +21,22 @@ SPICEdev BJT2info = { &BJT2mPTSize, BJT2mPTable, + +#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 }, @@ -51,7 +67,10 @@ SPICEdev BJT2info = { DEVsenTrunc : NULL, DEVdisto : BJT2disto, DEVnoise : BJT2noise, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &BJT2iSize, DEVmodSize : &BJT2mSize diff --git a/src/spicelib/devices/bjt2/bjt2load.c b/src/spicelib/devices/bjt2/bjt2load.c index a434a9665..40ce5569d 100644 --- a/src/spicelib/devices/bjt2/bjt2load.c +++ b/src/spicelib/devices/bjt2/bjt2load.c @@ -10,7 +10,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "cktdefs.h" #include "bjt2defs.h" #include "const.h" diff --git a/src/spicelib/devices/bjt2/bjt2mask.c b/src/spicelib/devices/bjt2/bjt2mask.c index 52e9f43c2..1e232a5b2 100644 --- a/src/spicelib/devices/bjt2/bjt2mask.c +++ b/src/spicelib/devices/bjt2/bjt2mask.c @@ -7,7 +7,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "cktdefs.h" diff --git a/src/spicelib/devices/bjt2/bjt2mdel.c b/src/spicelib/devices/bjt2/bjt2mdel.c index 855cadaa7..554c740a4 100644 --- a/src/spicelib/devices/bjt2/bjt2mdel.c +++ b/src/spicelib/devices/bjt2/bjt2mdel.c @@ -13,7 +13,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "bjt2defs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/bjt2/bjt2mpar.c b/src/spicelib/devices/bjt2/bjt2mpar.c index bdac26596..4db2595e5 100644 --- a/src/spicelib/devices/bjt2/bjt2mpar.c +++ b/src/spicelib/devices/bjt2/bjt2mpar.c @@ -12,7 +12,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "bjt2defs.h" diff --git a/src/spicelib/devices/bjt2/bjt2noise.c b/src/spicelib/devices/bjt2/bjt2noise.c index a01b5c644..bd90bd3b8 100644 --- a/src/spicelib/devices/bjt2/bjt2noise.c +++ b/src/spicelib/devices/bjt2/bjt2noise.c @@ -5,7 +5,6 @@ Modified: Alan Gillespie **********/ #include "ngspice.h" -#include #include "bjt2defs.h" #include "cktdefs.h" #include "iferrmsg.h" diff --git a/src/spicelib/devices/bjt2/bjt2param.c b/src/spicelib/devices/bjt2/bjt2param.c index 280056239..83566fc62 100644 --- a/src/spicelib/devices/bjt2/bjt2param.c +++ b/src/spicelib/devices/bjt2/bjt2param.c @@ -12,7 +12,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "bjt2defs.h" diff --git a/src/spicelib/devices/bjt2/bjt2pzld.c b/src/spicelib/devices/bjt2/bjt2pzld.c index 92b82a7d3..dc4db9d8f 100644 --- a/src/spicelib/devices/bjt2/bjt2pzld.c +++ b/src/spicelib/devices/bjt2/bjt2pzld.c @@ -7,7 +7,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "cktdefs.h" #include "complex.h" #include "bjt2defs.h" @@ -35,7 +34,7 @@ BJT2pzLoad(inModel,ckt,s) double xcpi; double xcmu; double xcbx; - double xccs; + double xcsub; double xcmcb; for( ; model != NULL; model = model->BJT2nextModel) { @@ -54,16 +53,22 @@ BJT2pzLoad(inModel,ckt,s) xcpi= *(ckt->CKTstate0 + here->BJT2cqbe); xcmu= *(ckt->CKTstate0 + here->BJT2cqbc); xcbx= *(ckt->CKTstate0 + here->BJT2cqbx); - xccs= *(ckt->CKTstate0 + here->BJT2cqsub); /* PN */ + xcsub= *(ckt->CKTstate0 + here->BJT2cqsub); xcmcb= *(ckt->CKTstate0 + here->BJT2cexbc); *(here->BJT2colColPtr) += (gcpr); *(here->BJT2baseBasePtr) += (gx) + (xcbx) * (s->real); *(here->BJT2baseBasePtr + 1) += (xcbx) * (s->imag); *(here->BJT2emitEmitPtr) += (gepr); - *(here->BJT2colPrimeColPrimePtr) += (gmu+go+gcpr) - + (xcmu+xccs+xcbx) * (s->real); - *(here->BJT2colPrimeColPrimePtr + 1) += (xcmu+xccs+xcbx) + + *(here->BJT2colPrimeColPrimePtr) += (gmu+go+gcpr) + + (xcmu+xcbx) * (s->real); + *(here->BJT2colPrimeColPrimePtr + 1) += (xcmu+xcbx) * (s->imag); + + *(here->BJT2substConSubstPtr) += (-xcsub) * (s->real); + *(here->BJT2substConSubstPtr = 1) += (-xcsub) * (s->imag); + + *(here->BJT2basePrimeBasePrimePtr) += (gx+gpi+gmu) + (xcpi+xcmu+xcmcb) * (s->real); *(here->BJT2basePrimeBasePrimePtr + 1) += (xcpi+xcmu+xcmcb) @@ -102,12 +107,31 @@ BJT2pzLoad(inModel,ckt,s) + (-xcpi-xgm-xcmcb) * (s->real); *(here->BJT2emitPrimeBasePrimePtr + 1) += (-xcpi-xgm-xcmcb) * (s->imag); - *(here->BJT2substSubstPtr) += (xccs) * (s->real); - *(here->BJT2substSubstPtr + 1) += (xccs) * (s->imag); - *(here->BJT2colPrimeSubstPtr) += (-xccs) * (s->real); - *(here->BJT2colPrimeSubstPtr + 1) += (-xccs) * (s->imag); - *(here->BJT2substColPrimePtr) += (-xccs) * (s->real); - *(here->BJT2substColPrimePtr + 1) += (-xccs) * (s->imag); + +/* + * Paolo Nenzi 2002 + * + * This is a very quick and dirty hack to make BJ2 compile. + * The code replacing the commented out one has been built using + * the one in bjt2acld.c + * DO NOT USE THIS DEVICE + * + * *(here->BJT2substSubstPtr) += (xccs) * (s->real); + * *(here->BJT2substSubstPtr + 1) += (xccs) * (s->imag); + * *(here->BJT2colPrimeSubstPtr) += (-xccs) * (s->real); + * *(here->BJT2colPrimeSubstPtr + 1) += (-xccs) * (s->imag); + * *(here->BJT2substColPrimePtr) += (-xccs) * (s->real); + * *(here->BJT2substColPrimePtr + 1) += (-xccs) * (s->imag); + */ + + *(here->BJT2substSubstPtr) += (xcsub) * (s->real); + *(here->BJT2substSubstPtr + 1) += (xcsub) * (s->imag); + *(here->BJT2substConSubstPtr) += (-xcsub) * (s->real); + *(here->BJT2substConSubstPtr = 1) += (-xcsub) * (s->imag); + *(here->BJT2substSubstConPtr) += (-xcsub) * (s->real); + *(here->BJT2substSubstConPtr = 1) += (-xcsub) * (s->imag); + + *(here->BJT2baseColPrimePtr) += (-xcbx) * (s->real); *(here->BJT2baseColPrimePtr + 1) += (-xcbx) * (s->imag); *(here->BJT2colPrimeBasePtr) += (-xcbx) * (s->real); diff --git a/src/spicelib/devices/bjt2/bjt2sacl.c b/src/spicelib/devices/bjt2/bjt2sacl.c index 01edd859f..13c27ed34 100644 --- a/src/spicelib/devices/bjt2/bjt2sacl.c +++ b/src/spicelib/devices/bjt2/bjt2sacl.c @@ -9,7 +9,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "cktdefs.h" #include "smpdefs.h" #include "bjt2defs.h" diff --git a/src/spicelib/devices/bjt2/bjt2setup.c b/src/spicelib/devices/bjt2/bjt2setup.c index ae975eb64..ed2f973e7 100644 --- a/src/spicelib/devices/bjt2/bjt2setup.c +++ b/src/spicelib/devices/bjt2/bjt2setup.c @@ -12,7 +12,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "cktdefs.h" #include "smpdefs.h" #include "bjt2defs.h" diff --git a/src/spicelib/devices/bjt2/bjt2sload.c b/src/spicelib/devices/bjt2/bjt2sload.c index df19190ec..8905396c4 100644 --- a/src/spicelib/devices/bjt2/bjt2sload.c +++ b/src/spicelib/devices/bjt2/bjt2sload.c @@ -9,7 +9,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "cktdefs.h" #include "smpdefs.h" #include "bjt2defs.h" diff --git a/src/spicelib/devices/bjt2/bjt2sprt.c b/src/spicelib/devices/bjt2/bjt2sprt.c index 6f7743592..8a85c732e 100644 --- a/src/spicelib/devices/bjt2/bjt2sprt.c +++ b/src/spicelib/devices/bjt2/bjt2sprt.c @@ -9,7 +9,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "cktdefs.h" #include "smpdefs.h" #include "bjt2defs.h" diff --git a/src/spicelib/devices/bjt2/bjt2sset.c b/src/spicelib/devices/bjt2/bjt2sset.c index b497a91b0..79aac1433 100644 --- a/src/spicelib/devices/bjt2/bjt2sset.c +++ b/src/spicelib/devices/bjt2/bjt2sset.c @@ -9,7 +9,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "cktdefs.h" #include "smpdefs.h" #include "bjt2defs.h" diff --git a/src/spicelib/devices/bjt2/bjt2supd.c b/src/spicelib/devices/bjt2/bjt2supd.c index 1a5903bcf..7df808353 100644 --- a/src/spicelib/devices/bjt2/bjt2supd.c +++ b/src/spicelib/devices/bjt2/bjt2supd.c @@ -7,7 +7,6 @@ Modified: Alan Gillespie /* update the charge sensitivities and their derivatives */ #include "ngspice.h" -#include #include "cktdefs.h" #include "smpdefs.h" #include "bjt2defs.h" diff --git a/src/spicelib/devices/bjt2/bjt2temp.c b/src/spicelib/devices/bjt2/bjt2temp.c index 4062535f4..c2cb5dbb4 100644 --- a/src/spicelib/devices/bjt2/bjt2temp.c +++ b/src/spicelib/devices/bjt2/bjt2temp.c @@ -5,7 +5,6 @@ Modified: Alan Gillespie **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "smpdefs.h" #include "bjt2defs.h" diff --git a/src/spicelib/devices/bjt2/bjt2trun.c b/src/spicelib/devices/bjt2/bjt2trun.c index 83a03ecaa..a19dfb915 100644 --- a/src/spicelib/devices/bjt2/bjt2trun.c +++ b/src/spicelib/devices/bjt2/bjt2trun.c @@ -12,7 +12,6 @@ Modified: Alan Gillespie */ #include "ngspice.h" -#include #include "cktdefs.h" #include "bjt2defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/bsim1/bsim1init.c b/src/spicelib/devices/bsim1/bsim1init.c index b0ae16bbe..b069c386f 100644 --- a/src/spicelib/devices/bsim1/bsim1init.c +++ b/src/spicelib/devices/bsim1/bsim1init.c @@ -67,7 +67,10 @@ SPICEdev B1info = { DEVsenTrunc : NULL, DEVdisto : B1disto, DEVnoise : NULL, /* NOISE */ - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &B1iSize, DEVmodSize : &B1mSize diff --git a/src/spicelib/devices/bsim2/bsim2init.c b/src/spicelib/devices/bsim2/bsim2init.c index 8d139fe57..23ee70eb9 100644 --- a/src/spicelib/devices/bsim2/bsim2init.c +++ b/src/spicelib/devices/bsim2/bsim2init.c @@ -67,7 +67,10 @@ SPICEdev B2info = { DEVsenTrunc : NULL, DEVdisto : NULL, DEVnoise : NULL, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &B2iSize, DEVmodSize : &B2mSize diff --git a/src/spicelib/devices/bsim3/b3.c b/src/spicelib/devices/bsim3/b3.c index 4d78e07e6..2cb56be5d 100644 --- a/src/spicelib/devices/bsim3/b3.c +++ b/src/spicelib/devices/bsim3/b3.c @@ -1,479 +1,488 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -Modified: 2000 AlansFixes -File: b3.c -**********/ + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng and Mansun Chan + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + + +/*************************************/ #include "ngspice.h" -#include #include "devdefs.h" #include "bsim3def.h" #include "suffix.h" -IFparm BSIM3pTable[] = { /* parameters */ -IOP( "l", BSIM3_L, IF_REAL , "Length"), -IOP( "w", BSIM3_W, IF_REAL , "Width"), -IOP( "m", BSIM3_M, IF_REAL , "Parallel multiplier"), -IOP( "ad", BSIM3_AD, IF_REAL , "Drain area"), -IOP( "as", BSIM3_AS, IF_REAL , "Source area"), -IOP( "pd", BSIM3_PD, IF_REAL , "Drain perimeter"), -IOP( "ps", BSIM3_PS, IF_REAL , "Source perimeter"), -IOP( "nrd", BSIM3_NRD, IF_REAL , "Number of squares in drain"), -IOP( "nrs", BSIM3_NRS, IF_REAL , "Number of squares in source"), -IOP( "off", BSIM3_OFF, IF_FLAG , "Device is initially off"), -IOP( "nqsmod", BSIM3_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), -IP( "ic", BSIM3_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), -OP( "gmbs", BSIM3_GMBS, IF_REAL, "Gmb"), -OP( "gm", BSIM3_GM, IF_REAL, "Gm"), -OP( "gds", BSIM3_GDS, IF_REAL, "Gds"), -OP( "vdsat", BSIM3_VDSAT, IF_REAL, "Vdsat"), -OP( "vth", BSIM3_VON, IF_REAL, "Vth"), -OP( "id", BSIM3_CD, IF_REAL, "Ids"), -OP( "vbs", BSIM3_VBS, IF_REAL, "Vbs"), -OP( "vgs", BSIM3_VGS, IF_REAL, "Vgs"), -OP( "vds", BSIM3_VDS, IF_REAL, "Vds"), +IFparm BSIM3pTable[] = { /* parameters */ + IOP ("l", BSIM3_L, IF_REAL, "Length"), + IOP ("w", BSIM3_W, IF_REAL, "Width"), + IOP ("m", BSIM3_M, IF_REAL, "Parallel multiplier"), + IOP ("ad", BSIM3_AD, IF_REAL, "Drain area"), + IOP ("as", BSIM3_AS, IF_REAL, "Source area"), + IOP ("pd", BSIM3_PD, IF_REAL, "Drain perimeter"), + IOP ("ps", BSIM3_PS, IF_REAL, "Source perimeter"), + IOP ("nrd", BSIM3_NRD, IF_REAL, "Number of squares in drain"), + IOP ("nrs", BSIM3_NRS, IF_REAL, "Number of squares in source"), + IOP ("off", BSIM3_OFF, IF_FLAG, "Device is initially off"), + IOP ("nqsmod", BSIM3_NQSMOD, IF_INTEGER, + "Non-quasi-static model selector"), + IP ("ic", BSIM3_IC, IF_REALVEC, + "Vector of DS,GS,BS initial voltages"), + OP ("gmbs", BSIM3_GMBS, IF_REAL, "Gmb"), + OP ("gm", BSIM3_GM, IF_REAL, "Gm"), + OP ("gds", BSIM3_GDS, IF_REAL, "Gds"), + OP ("vdsat", BSIM3_VDSAT, IF_REAL, "Vdsat"), + OP ("vth", BSIM3_VON, IF_REAL, "Vth"), + OP ("id", BSIM3_CD, IF_REAL, "Ids"), + OP ("vbs", BSIM3_VBS, IF_REAL, "Vbs"), + OP ("vgs", BSIM3_VGS, IF_REAL, "Vgs"), + OP ("vds", BSIM3_VDS, IF_REAL, "Vds"), }; -IFparm BSIM3mPTable[] = { /* model parameters */ -IOP( "capmod", BSIM3_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), -IOP( "mobmod", BSIM3_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), -IOP( "noimod", BSIM3_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), -IOP( "paramchk", BSIM3_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), -IOP( "binunit", BSIM3_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), -IOP( "version", BSIM3_MOD_VERSION, IF_STRING, " parameter for model version"), -IOP( "tox", BSIM3_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), - -IOP( "toxm", BSIM3_MOD_TOXM, IF_REAL, "Gate oxide thickness used in extraction"), -IOP( "cdsc", BSIM3_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", BSIM3_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", BSIM3_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), -IOP( "cit", BSIM3_MOD_CIT, IF_REAL, "Interface state capacitance"), -IOP( "nfactor", BSIM3_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), -IOP( "xj", BSIM3_MOD_XJ, IF_REAL, "Junction depth in meters"), -IOP( "vsat", BSIM3_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), -IOP( "at", BSIM3_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", BSIM3_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", BSIM3_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), -IOP( "a1", BSIM3_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), -IOP( "a2", BSIM3_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), -IOP( "keta", BSIM3_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), -IOP( "nsub", BSIM3_MOD_NSUB, IF_REAL, "Substrate doping concentration"), -IOP( "nch", BSIM3_MOD_NPEAK, IF_REAL, "Channel doping concentration"), -IOP( "ngate", BSIM3_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), -IOP( "gamma1", BSIM3_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), -IOP( "gamma2", BSIM3_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), -IOP( "vbx", BSIM3_MOD_VBX, IF_REAL, "Vth transition body Voltage"), -IOP( "vbm", BSIM3_MOD_VBM, IF_REAL, "Maximum body voltage"), +IFparm BSIM3mPTable[] = { /* model parameters */ + IOP ("capmod", BSIM3_MOD_CAPMOD, IF_INTEGER,"Capacitance model selector"), + IOP ("mobmod", BSIM3_MOD_MOBMOD, IF_INTEGER,"Mobility model selector"), + IOP ("noimod", BSIM3_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), + IOP ("paramchk", BSIM3_MOD_PARAMCHK, IF_INTEGER,"Model parameter checking selector"), + IOP ("binunit", BSIM3_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), + IOP ("version", BSIM3_MOD_VERSION, IF_STRING," parameter for model version"), + IOP ("tox", BSIM3_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), + IOP ("toxm", BSIM3_MOD_TOXM, IF_REAL,"Gate oxide thickness used in extraction"), + IOP ("cdsc", BSIM3_MOD_CDSC, IF_REAL,"Drain/Source and channel coupling capacitance"), + IOP ("cdscb", BSIM3_MOD_CDSCB, IF_REAL,"Body-bias dependence of cdsc"), + IOP ("cdscd", BSIM3_MOD_CDSCD, IF_REAL,"Drain-bias dependence of cdsc"), + IOP ("cit", BSIM3_MOD_CIT, IF_REAL, "Interface state capacitance"), + IOP ("nfactor", BSIM3_MOD_NFACTOR, IF_REAL,"Subthreshold swing Coefficient"), + IOP ("xj", BSIM3_MOD_XJ, IF_REAL, "Junction depth in meters"), + IOP ("vsat", BSIM3_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), + IOP ("at", BSIM3_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), + IOP ("a0", BSIM3_MOD_A0, IF_REAL,"Non-uniform depletion width effect coefficient."), + IOP ("ags", BSIM3_MOD_AGS, IF_REAL,"Gate bias coefficient of Abulk."), + IOP ("a1", BSIM3_MOD_A1, IF_REAL,"Non-saturation effect coefficient"), + IOP ("a2", BSIM3_MOD_A2, IF_REAL,"Non-saturation effect coefficient"), + IOP ("keta", BSIM3_MOD_KETA, IF_REAL,"Body-bias coefficient of non-uniform depletion width effect."), + IOP ("nsub", BSIM3_MOD_NSUB, IF_REAL,"Substrate doping concentration"), + IOP ("nch", BSIM3_MOD_NPEAK, IF_REAL, "Channel doping concentration"), + IOP ("ngate", BSIM3_MOD_NGATE, IF_REAL,"Poly-gate doping concentration"), + IOP ("gamma1", BSIM3_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), + IOP ("gamma2", BSIM3_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), + IOP ("vbx", BSIM3_MOD_VBX, IF_REAL, "Vth transition body Voltage"), + IOP ("vbm", BSIM3_MOD_VBM, IF_REAL, "Maximum body voltage"), -IOP( "xt", BSIM3_MOD_XT, IF_REAL, "Doping depth"), -IOP( "k1", BSIM3_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), -IOP( "kt1", BSIM3_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt1l", BSIM3_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt2", BSIM3_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), -IOP( "k2", BSIM3_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), -IOP( "k3", BSIM3_MOD_K3, IF_REAL, "Narrow width effect coefficient"), -IOP( "k3b", BSIM3_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), -IOP( "w0", BSIM3_MOD_W0, IF_REAL, "Narrow width effect parameter"), -IOP( "nlx", BSIM3_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"), -IOP( "dvt0", BSIM3_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), -IOP( "dvt1", BSIM3_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), -IOP( "dvt2", BSIM3_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), -IOP( "dvt0w", BSIM3_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), -IOP( "dvt1w", BSIM3_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), -IOP( "dvt2w", BSIM3_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), -IOP( "drout", BSIM3_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), -IOP( "dsub", BSIM3_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), -IOP( "vth0", BSIM3_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "vtho", BSIM3_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "ua", BSIM3_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), -IOP( "ua1", BSIM3_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), -IOP( "ub", BSIM3_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), -IOP( "ub1", BSIM3_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), -IOP( "uc", BSIM3_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), -IOP( "uc1", BSIM3_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), -IOP( "u0", BSIM3_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), -IOP( "ute", BSIM3_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), -IOP( "voff", BSIM3_MOD_VOFF, IF_REAL, "Threshold voltage offset"), -IOP( "tnom", BSIM3_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), -IOP( "cgso", BSIM3_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), -IOP( "cgdo", BSIM3_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), -IOP( "cgbo", BSIM3_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"), -IOP( "xpart", BSIM3_MOD_XPART, IF_REAL, "Channel charge partitioning"), -IOP( "elm", BSIM3_MOD_ELM, IF_REAL, "Non-quasi-static Elmore Constant Parameter"), -IOP( "delta", BSIM3_MOD_DELTA, IF_REAL, "Effective Vds parameter"), -IOP( "rsh", BSIM3_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", BSIM3_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), + IOP ("xt", BSIM3_MOD_XT, IF_REAL, "Doping depth"), + IOP ("k1", BSIM3_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), + IOP ("kt1", BSIM3_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), + IOP ("kt1l", BSIM3_MOD_KT1L, IF_REAL,"Temperature coefficient of Vth"), + IOP ("kt2", BSIM3_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), + IOP ("k2", BSIM3_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), + IOP ("k3", BSIM3_MOD_K3, IF_REAL, "Narrow width effect coefficient"), + IOP ("k3b", BSIM3_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), + IOP ("w0", BSIM3_MOD_W0, IF_REAL, "Narrow width effect parameter"), + IOP ("nlx", BSIM3_MOD_NLX, IF_REAL,"Lateral non-uniform doping effect"), + IOP ("dvt0", BSIM3_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), + IOP ("dvt1", BSIM3_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), + IOP ("dvt2", BSIM3_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), + IOP ("dvt0w", BSIM3_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), + IOP ("dvt1w", BSIM3_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), + IOP ("dvt2w", BSIM3_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), + IOP ("drout", BSIM3_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), + IOP ("dsub", BSIM3_MOD_DSUB, IF_REAL,"DIBL coefficient in the subthreshold region"), + IOP ("vth0", BSIM3_MOD_VTH0, IF_REAL, "Threshold voltage"), + IOP ("vtho", BSIM3_MOD_VTH0, IF_REAL, "Threshold voltage"), + IOP ("ua", BSIM3_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), + IOP ("ua1", BSIM3_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), + IOP ("ub", BSIM3_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), + IOP ("ub1", BSIM3_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), + IOP ("uc", BSIM3_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), + IOP ("uc1", BSIM3_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), + IOP ("u0", BSIM3_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), + IOP ("ute", BSIM3_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), + IOP ("voff", BSIM3_MOD_VOFF, IF_REAL, "Threshold voltage offset"), + IOP ("tnom", BSIM3_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), + IOP ("cgso", BSIM3_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), + IOP ("cgdo", BSIM3_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), + IOP ("cgbo", BSIM3_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"), + IOP ("xpart", BSIM3_MOD_XPART, IF_REAL, "Channel charge partitioning"), + IOP ("elm", BSIM3_MOD_ELM, IF_REAL, "Non-quasi-static Elmore Constant Parameter"), + IOP ("delta", BSIM3_MOD_DELTA, IF_REAL, "Effective Vds parameter"), + IOP ("rsh", BSIM3_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), + IOP ("rdsw", BSIM3_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), -IOP( "prwg", BSIM3_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", BSIM3_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), + IOP ("prwg", BSIM3_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), + IOP ("prwb", BSIM3_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), -IOP( "prt", BSIM3_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), -IOP( "eta0", BSIM3_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "etab", BSIM3_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "pclm", BSIM3_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", BSIM3_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", BSIM3_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", BSIM3_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), -IOP( "pscbe1", BSIM3_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pscbe2", BSIM3_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pvag", BSIM3_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), -IOP( "js", BSIM3_MOD_JS, IF_REAL, "Source/drain junction reverse saturation current density"), -IOP( "jsw", BSIM3_MOD_JSW, IF_REAL, "Sidewall junction reverse saturation current density"), -IOP( "pb", BSIM3_MOD_PB, IF_REAL, "Source/drain junction built-in potential"), -IOP( "nj", BSIM3_MOD_NJ, IF_REAL, "Source/drain junction emission coefficient"), -IOP( "xti", BSIM3_MOD_XTI, IF_REAL, "Junction current temperature exponent"), -IOP( "mj", BSIM3_MOD_MJ, IF_REAL, "Source/drain bottom junction capacitance grading coefficient"), -IOP( "pbsw", BSIM3_MOD_PBSW, IF_REAL, "Source/drain sidewall junction capacitance built in potential"), -IOP( "mjsw", BSIM3_MOD_MJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient"), -IOP( "pbswg", BSIM3_MOD_PBSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswg", BSIM3_MOD_MJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance grading coefficient"), -IOP( "cj", BSIM3_MOD_CJ, IF_REAL, "Source/drain bottom junction capacitance per unit area"), -IOP( "vfbcv", BSIM3_MOD_VFBCV, IF_REAL, "Flat Band Voltage parameter for capmod=0 only"), -IOP( "vfb", BSIM3_MOD_VFB, IF_REAL, "Flat Band Voltage"), -IOP( "cjsw", BSIM3_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance per unit periphery"), -IOP( "cjswg", BSIM3_MOD_CJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance per unit width"), -IOP( "tpb", BSIM3_MOD_TPB, IF_REAL, "Temperature coefficient of pb"), -IOP( "tcj", BSIM3_MOD_TCJ, IF_REAL, "Temperature coefficient of cj"), -IOP( "tpbsw", BSIM3_MOD_TPBSW, IF_REAL, "Temperature coefficient of pbsw"), -IOP( "tcjsw", BSIM3_MOD_TCJSW, IF_REAL, "Temperature coefficient of cjsw"), -IOP( "tpbswg", BSIM3_MOD_TPBSWG, IF_REAL, "Temperature coefficient of pbswg"), -IOP( "tcjswg", BSIM3_MOD_TCJSWG, IF_REAL, "Temperature coefficient of cjswg"), -IOP( "acde", BSIM3_MOD_ACDE, IF_REAL, "Exponential coefficient for finite charge thickness"), -IOP( "moin", BSIM3_MOD_MOIN, IF_REAL, "Coefficient for gate-bias dependent surface potential"), -IOP( "noff", BSIM3_MOD_NOFF, IF_REAL, "C-V turn-on/off parameter"), -IOP( "voffcv", BSIM3_MOD_VOFFCV, IF_REAL, "C-V lateral-shift parameter"), -IOP( "lint", BSIM3_MOD_LINT, IF_REAL, "Length reduction parameter"), -IOP( "ll", BSIM3_MOD_LL, IF_REAL, "Length reduction parameter"), -IOP( "llc", BSIM3_MOD_LLC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lln", BSIM3_MOD_LLN, IF_REAL, "Length reduction parameter"), -IOP( "lw", BSIM3_MOD_LW, IF_REAL, "Length reduction parameter"), -IOP( "lwc", BSIM3_MOD_LWC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lwn", BSIM3_MOD_LWN, IF_REAL, "Length reduction parameter"), -IOP( "lwl", BSIM3_MOD_LWL, IF_REAL, "Length reduction parameter"), -IOP( "lwlc", BSIM3_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"), -IOP( "lmin", BSIM3_MOD_LMIN, IF_REAL, "Minimum length for the model"), -IOP( "lmax", BSIM3_MOD_LMAX, IF_REAL, "Maximum length for the model"), + IOP ("prt", BSIM3_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), + IOP ("eta0", BSIM3_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), + IOP ("etab", BSIM3_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), + IOP ("pclm", BSIM3_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), + IOP ("pdiblc1", BSIM3_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), + IOP ("pdiblc2", BSIM3_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), + IOP ("pdiblcb", BSIM3_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), + IOP ("pscbe1", BSIM3_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), + IOP ("pscbe2", BSIM3_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), + IOP ("pvag", BSIM3_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), + IOP ("js", BSIM3_MOD_JS, IF_REAL, "Source/drain junction reverse saturation current density"), + IOP ("jsw", BSIM3_MOD_JSW, IF_REAL, "Sidewall junction reverse saturation current density"), + IOP ("pb", BSIM3_MOD_PB, IF_REAL, "Source/drain junction built-in potential"), + IOP ("nj", BSIM3_MOD_NJ, IF_REAL, "Source/drain junction emission coefficient"), + IOP ("xti", BSIM3_MOD_XTI, IF_REAL, "Junction current temperature exponent"), + IOP ("mj", BSIM3_MOD_MJ, IF_REAL, "Source/drain bottom junction capacitance grading coefficient"), + IOP ("pbsw", BSIM3_MOD_PBSW, IF_REAL, "Source/drain sidewall junction capacitance built in potential"), + IOP ("mjsw", BSIM3_MOD_MJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient"), + IOP ("pbswg", BSIM3_MOD_PBSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance built in potential"), + IOP ("mjswg", BSIM3_MOD_MJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance grading coefficient"), + IOP ("cj", BSIM3_MOD_CJ, IF_REAL, "Source/drain bottom junction capacitance per unit area"), + IOP ("vfbcv", BSIM3_MOD_VFBCV, IF_REAL, "Flat Band Voltage parameter for capmod=0 only"), + IOP ("vfb", BSIM3_MOD_VFB, IF_REAL, "Flat Band Voltage"), + IOP ("cjsw", BSIM3_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance per unit periphery"), + IOP ("cjswg", BSIM3_MOD_CJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance per unit width"), + IOP ("tpb", BSIM3_MOD_TPB, IF_REAL, "Temperature coefficient of pb"), + IOP ("tcj", BSIM3_MOD_TCJ, IF_REAL, "Temperature coefficient of cj"), + IOP ("tpbsw", BSIM3_MOD_TPBSW, IF_REAL, "Temperature coefficient of pbsw"), + IOP ("tcjsw", BSIM3_MOD_TCJSW, IF_REAL, "Temperature coefficient of cjsw"), + IOP ("tpbswg", BSIM3_MOD_TPBSWG, IF_REAL, "Temperature coefficient of pbswg"), + IOP ("tcjswg", BSIM3_MOD_TCJSWG, IF_REAL, "Temperature coefficient of cjswg"), + IOP ("acde", BSIM3_MOD_ACDE, IF_REAL, "Exponential coefficient for finite charge thickness"), + IOP ("moin", BSIM3_MOD_MOIN, IF_REAL, "Coefficient for gate-bias dependent surface potential"), + IOP ("noff", BSIM3_MOD_NOFF, IF_REAL, "C-V turn-on/off parameter"), + IOP ("voffcv", BSIM3_MOD_VOFFCV, IF_REAL, "C-V lateral-shift parameter"), + IOP ("lint", BSIM3_MOD_LINT, IF_REAL, "Length reduction parameter"), + IOP ("ll", BSIM3_MOD_LL, IF_REAL, "Length reduction parameter"), + IOP ("llc", BSIM3_MOD_LLC, IF_REAL, "Length reduction parameter for CV"), + IOP ("lln", BSIM3_MOD_LLN, IF_REAL, "Length reduction parameter"), + IOP ("lw", BSIM3_MOD_LW, IF_REAL, "Length reduction parameter"), + IOP ("lwc", BSIM3_MOD_LWC, IF_REAL, "Length reduction parameter for CV"), + IOP ("lwn", BSIM3_MOD_LWN, IF_REAL, "Length reduction parameter"), + IOP ("lwl", BSIM3_MOD_LWL, IF_REAL, "Length reduction parameter"), + IOP ("lwlc", BSIM3_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"), + IOP ("lmin", BSIM3_MOD_LMIN, IF_REAL, "Minimum length for the model"), + IOP ("lmax", BSIM3_MOD_LMAX, IF_REAL, "Maximum length for the model"), -IOP( "wr", BSIM3_MOD_WR, IF_REAL, "Width dependence of rds"), -IOP( "wint", BSIM3_MOD_WINT, IF_REAL, "Width reduction parameter"), -IOP( "dwg", BSIM3_MOD_DWG, IF_REAL, "Width reduction parameter"), -IOP( "dwb", BSIM3_MOD_DWB, IF_REAL, "Width reduction parameter"), + IOP ("wr", BSIM3_MOD_WR, IF_REAL, "Width dependence of rds"), + IOP ("wint", BSIM3_MOD_WINT, IF_REAL, "Width reduction parameter"), + IOP ("dwg", BSIM3_MOD_DWG, IF_REAL, "Width reduction parameter"), + IOP ("dwb", BSIM3_MOD_DWB, IF_REAL, "Width reduction parameter"), -IOP( "wl", BSIM3_MOD_WL, IF_REAL, "Width reduction parameter"), -IOP( "wlc", BSIM3_MOD_WLC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wln", BSIM3_MOD_WLN, IF_REAL, "Width reduction parameter"), -IOP( "ww", BSIM3_MOD_WW, IF_REAL, "Width reduction parameter"), -IOP( "wwc", BSIM3_MOD_WWC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wwn", BSIM3_MOD_WWN, IF_REAL, "Width reduction parameter"), -IOP( "wwl", BSIM3_MOD_WWL, IF_REAL, "Width reduction parameter"), -IOP( "wwlc", BSIM3_MOD_WWLC, IF_REAL, "Width reduction parameter for CV"), -IOP( "wmin", BSIM3_MOD_WMIN, IF_REAL, "Minimum width for the model"), -IOP( "wmax", BSIM3_MOD_WMAX, IF_REAL, "Maximum width for the model"), + IOP ("wl", BSIM3_MOD_WL, IF_REAL, "Width reduction parameter"), + IOP ("wlc", BSIM3_MOD_WLC, IF_REAL, "Width reduction parameter for CV"), + IOP ("wln", BSIM3_MOD_WLN, IF_REAL, "Width reduction parameter"), + IOP ("ww", BSIM3_MOD_WW, IF_REAL, "Width reduction parameter"), + IOP ("wwc", BSIM3_MOD_WWC, IF_REAL, "Width reduction parameter for CV"), + IOP ("wwn", BSIM3_MOD_WWN, IF_REAL, "Width reduction parameter"), + IOP ("wwl", BSIM3_MOD_WWL, IF_REAL, "Width reduction parameter"), + IOP ("wwlc", BSIM3_MOD_WWLC, IF_REAL, "Width reduction parameter for CV"), + IOP ("wmin", BSIM3_MOD_WMIN, IF_REAL, "Minimum width for the model"), + IOP ("wmax", BSIM3_MOD_WMAX, IF_REAL, "Maximum width for the model"), -IOP( "b0", BSIM3_MOD_B0, IF_REAL, "Abulk narrow width parameter"), -IOP( "b1", BSIM3_MOD_B1, IF_REAL, "Abulk narrow width parameter"), + IOP ("b0", BSIM3_MOD_B0, IF_REAL, "Abulk narrow width parameter"), + IOP ("b1", BSIM3_MOD_B1, IF_REAL, "Abulk narrow width parameter"), -IOP( "cgsl", BSIM3_MOD_CGSL, IF_REAL, "New C-V model parameter"), -IOP( "cgdl", BSIM3_MOD_CGDL, IF_REAL, "New C-V model parameter"), -IOP( "ckappa", BSIM3_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), -IOP( "cf", BSIM3_MOD_CF, IF_REAL, "Fringe capacitance parameter"), -IOP( "clc", BSIM3_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "cle", BSIM3_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "dwc", BSIM3_MOD_DWC, IF_REAL, "Delta W for C-V model"), -IOP( "dlc", BSIM3_MOD_DLC, IF_REAL, "Delta L for C-V model"), + IOP ("cgsl", BSIM3_MOD_CGSL, IF_REAL, "New C-V model parameter"), + IOP ("cgdl", BSIM3_MOD_CGDL, IF_REAL, "New C-V model parameter"), + IOP ("ckappa", BSIM3_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), + IOP ("cf", BSIM3_MOD_CF, IF_REAL, "Fringe capacitance parameter"), + IOP ("clc", BSIM3_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), + IOP ("cle", BSIM3_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), + IOP ("dwc", BSIM3_MOD_DWC, IF_REAL, "Delta W for C-V model"), + IOP ("dlc", BSIM3_MOD_DLC, IF_REAL, "Delta L for C-V model"), -IOP( "alpha0", BSIM3_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), -IOP( "alpha1", BSIM3_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), -IOP( "beta0", BSIM3_MOD_BETA0, IF_REAL, "substrate current model parameter"), -IOP( "ijth", BSIM3_MOD_IJTH, IF_REAL, "Diode limiting current"), + IOP ("alpha0", BSIM3_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), + IOP ("alpha1", BSIM3_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), + IOP ("beta0", BSIM3_MOD_BETA0, IF_REAL, "substrate current model parameter"), + IOP ("ijth", BSIM3_MOD_IJTH, IF_REAL, "Diode limiting current"), -IOP( "lcdsc", BSIM3_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), -IOP( "lcdscb", BSIM3_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), -IOP( "lcdscd", BSIM3_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), -IOP( "lcit", BSIM3_MOD_LCIT, IF_REAL, "Length dependence of cit"), -IOP( "lnfactor", BSIM3_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), -IOP( "lxj", BSIM3_MOD_LXJ, IF_REAL, "Length dependence of xj"), -IOP( "lvsat", BSIM3_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), -IOP( "lat", BSIM3_MOD_LAT, IF_REAL, "Length dependence of at"), -IOP( "la0", BSIM3_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", BSIM3_MOD_LAGS, IF_REAL, "Length dependence of ags"), -IOP( "la1", BSIM3_MOD_LA1, IF_REAL, "Length dependence of a1"), -IOP( "la2", BSIM3_MOD_LA2, IF_REAL, "Length dependence of a2"), -IOP( "lketa", BSIM3_MOD_LKETA, IF_REAL, "Length dependence of keta"), -IOP( "lnsub", BSIM3_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), -IOP( "lnch", BSIM3_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), -IOP( "lngate", BSIM3_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), -IOP( "lgamma1", BSIM3_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"), -IOP( "lgamma2", BSIM3_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"), -IOP( "lvbx", BSIM3_MOD_LVBX, IF_REAL, "Length dependence of vbx"), -IOP( "lvbm", BSIM3_MOD_LVBM, IF_REAL, "Length dependence of vbm"), -IOP( "lxt", BSIM3_MOD_LXT, IF_REAL, "Length dependence of xt"), -IOP( "lk1", BSIM3_MOD_LK1, IF_REAL, "Length dependence of k1"), -IOP( "lkt1", BSIM3_MOD_LKT1, IF_REAL, "Length dependence of kt1"), -IOP( "lkt1l", BSIM3_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), -IOP( "lkt2", BSIM3_MOD_LKT2, IF_REAL, "Length dependence of kt2"), -IOP( "lk2", BSIM3_MOD_LK2, IF_REAL, "Length dependence of k2"), -IOP( "lk3", BSIM3_MOD_LK3, IF_REAL, "Length dependence of k3"), -IOP( "lk3b", BSIM3_MOD_LK3B, IF_REAL, "Length dependence of k3b"), -IOP( "lw0", BSIM3_MOD_LW0, IF_REAL, "Length dependence of w0"), -IOP( "lnlx", BSIM3_MOD_LNLX, IF_REAL, "Length dependence of nlx"), -IOP( "ldvt0", BSIM3_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), -IOP( "ldvt1", BSIM3_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), -IOP( "ldvt2", BSIM3_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), -IOP( "ldvt0w", BSIM3_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), -IOP( "ldvt1w", BSIM3_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), -IOP( "ldvt2w", BSIM3_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), -IOP( "ldrout", BSIM3_MOD_LDROUT, IF_REAL, "Length dependence of drout"), -IOP( "ldsub", BSIM3_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), -IOP( "lvth0", BSIM3_MOD_LVTH0, IF_REAL,"Length dependence of vto"), -IOP( "lvtho", BSIM3_MOD_LVTH0, IF_REAL,"Length dependence of vto"), -IOP( "lua", BSIM3_MOD_LUA, IF_REAL, "Length dependence of ua"), -IOP( "lua1", BSIM3_MOD_LUA1, IF_REAL, "Length dependence of ua1"), -IOP( "lub", BSIM3_MOD_LUB, IF_REAL, "Length dependence of ub"), -IOP( "lub1", BSIM3_MOD_LUB1, IF_REAL, "Length dependence of ub1"), -IOP( "luc", BSIM3_MOD_LUC, IF_REAL, "Length dependence of uc"), -IOP( "luc1", BSIM3_MOD_LUC1, IF_REAL, "Length dependence of uc1"), -IOP( "lu0", BSIM3_MOD_LU0, IF_REAL, "Length dependence of u0"), -IOP( "lute", BSIM3_MOD_LUTE, IF_REAL, "Length dependence of ute"), -IOP( "lvoff", BSIM3_MOD_LVOFF, IF_REAL, "Length dependence of voff"), -IOP( "lelm", BSIM3_MOD_LELM, IF_REAL, "Length dependence of elm"), -IOP( "ldelta", BSIM3_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "lrdsw", BSIM3_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), + IOP ("lcdsc", BSIM3_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), + IOP ("lcdscb", BSIM3_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), + IOP ("lcdscd", BSIM3_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), + IOP ("lcit", BSIM3_MOD_LCIT, IF_REAL, "Length dependence of cit"), + IOP ("lnfactor", BSIM3_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), + IOP ("lxj", BSIM3_MOD_LXJ, IF_REAL, "Length dependence of xj"), + IOP ("lvsat", BSIM3_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), + IOP ("lat", BSIM3_MOD_LAT, IF_REAL, "Length dependence of at"), + IOP ("la0", BSIM3_MOD_LA0, IF_REAL, "Length dependence of a0"), + IOP ("lags", BSIM3_MOD_LAGS, IF_REAL, "Length dependence of ags"), + IOP ("la1", BSIM3_MOD_LA1, IF_REAL, "Length dependence of a1"), + IOP ("la2", BSIM3_MOD_LA2, IF_REAL, "Length dependence of a2"), + IOP ("lketa", BSIM3_MOD_LKETA, IF_REAL, "Length dependence of keta"), + IOP ("lnsub", BSIM3_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), + IOP ("lnch", BSIM3_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), + IOP ("lngate", BSIM3_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), + IOP ("lgamma1", BSIM3_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"), + IOP ("lgamma2", BSIM3_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"), + IOP ("lvbx", BSIM3_MOD_LVBX, IF_REAL, "Length dependence of vbx"), + IOP ("lvbm", BSIM3_MOD_LVBM, IF_REAL, "Length dependence of vbm"), + IOP ("lxt", BSIM3_MOD_LXT, IF_REAL, "Length dependence of xt"), + IOP ("lk1", BSIM3_MOD_LK1, IF_REAL, "Length dependence of k1"), + IOP ("lkt1", BSIM3_MOD_LKT1, IF_REAL, "Length dependence of kt1"), + IOP ("lkt1l", BSIM3_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), + IOP ("lkt2", BSIM3_MOD_LKT2, IF_REAL, "Length dependence of kt2"), + IOP ("lk2", BSIM3_MOD_LK2, IF_REAL, "Length dependence of k2"), + IOP ("lk3", BSIM3_MOD_LK3, IF_REAL, "Length dependence of k3"), + IOP ("lk3b", BSIM3_MOD_LK3B, IF_REAL, "Length dependence of k3b"), + IOP ("lw0", BSIM3_MOD_LW0, IF_REAL, "Length dependence of w0"), + IOP ("lnlx", BSIM3_MOD_LNLX, IF_REAL, "Length dependence of nlx"), + IOP ("ldvt0", BSIM3_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), + IOP ("ldvt1", BSIM3_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), + IOP ("ldvt2", BSIM3_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), + IOP ("ldvt0w", BSIM3_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), + IOP ("ldvt1w", BSIM3_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), + IOP ("ldvt2w", BSIM3_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), + IOP ("ldrout", BSIM3_MOD_LDROUT, IF_REAL, "Length dependence of drout"), + IOP ("ldsub", BSIM3_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), + IOP ("lvth0", BSIM3_MOD_LVTH0, IF_REAL, "Length dependence of vto"), + IOP ("lvtho", BSIM3_MOD_LVTH0, IF_REAL, "Length dependence of vto"), + IOP ("lua", BSIM3_MOD_LUA, IF_REAL, "Length dependence of ua"), + IOP ("lua1", BSIM3_MOD_LUA1, IF_REAL, "Length dependence of ua1"), + IOP ("lub", BSIM3_MOD_LUB, IF_REAL, "Length dependence of ub"), + IOP ("lub1", BSIM3_MOD_LUB1, IF_REAL, "Length dependence of ub1"), + IOP ("luc", BSIM3_MOD_LUC, IF_REAL, "Length dependence of uc"), + IOP ("luc1", BSIM3_MOD_LUC1, IF_REAL, "Length dependence of uc1"), + IOP ("lu0", BSIM3_MOD_LU0, IF_REAL, "Length dependence of u0"), + IOP ("lute", BSIM3_MOD_LUTE, IF_REAL, "Length dependence of ute"), + IOP ("lvoff", BSIM3_MOD_LVOFF, IF_REAL, "Length dependence of voff"), + IOP ("lelm", BSIM3_MOD_LELM, IF_REAL, "Length dependence of elm"), + IOP ("ldelta", BSIM3_MOD_LDELTA, IF_REAL, "Length dependence of delta"), + IOP ("lrdsw", BSIM3_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), -IOP( "lprwg", BSIM3_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lprwb", BSIM3_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), + IOP ("lprwg", BSIM3_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), + IOP ("lprwb", BSIM3_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), -IOP( "lprt", BSIM3_MOD_LPRT, IF_REAL, "Length dependence of prt "), -IOP( "leta0", BSIM3_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", BSIM3_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "lpclm", BSIM3_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", BSIM3_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", BSIM3_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", BSIM3_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lpscbe1", BSIM3_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), -IOP( "lpscbe2", BSIM3_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), -IOP( "lpvag", BSIM3_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), -IOP( "lwr", BSIM3_MOD_LWR, IF_REAL, "Length dependence of wr"), -IOP( "ldwg", BSIM3_MOD_LDWG, IF_REAL, "Length dependence of dwg"), -IOP( "ldwb", BSIM3_MOD_LDWB, IF_REAL, "Length dependence of dwb"), -IOP( "lb0", BSIM3_MOD_LB0, IF_REAL, "Length dependence of b0"), -IOP( "lb1", BSIM3_MOD_LB1, IF_REAL, "Length dependence of b1"), -IOP( "lcgsl", BSIM3_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), -IOP( "lcgdl", BSIM3_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), -IOP( "lckappa", BSIM3_MOD_LCKAPPA, IF_REAL, "Length dependence of ckappa"), -IOP( "lcf", BSIM3_MOD_LCF, IF_REAL, "Length dependence of cf"), -IOP( "lclc", BSIM3_MOD_LCLC, IF_REAL, "Length dependence of clc"), -IOP( "lcle", BSIM3_MOD_LCLE, IF_REAL, "Length dependence of cle"), -IOP( "lalpha0", BSIM3_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), -IOP( "lalpha1", BSIM3_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"), -IOP( "lbeta0", BSIM3_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), -IOP( "lvfbcv", BSIM3_MOD_LVFBCV, IF_REAL, "Length dependence of vfbcv"), -IOP( "lvfb", BSIM3_MOD_LVFB, IF_REAL, "Length dependence of vfb"), -IOP( "lacde", BSIM3_MOD_LACDE, IF_REAL, "Length dependence of acde"), -IOP( "lmoin", BSIM3_MOD_LMOIN, IF_REAL, "Length dependence of moin"), -IOP( "lnoff", BSIM3_MOD_LNOFF, IF_REAL, "Length dependence of noff"), -IOP( "lvoffcv", BSIM3_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"), -IOP( "wcdsc", BSIM3_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", BSIM3_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", BSIM3_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), -IOP( "wcit", BSIM3_MOD_WCIT, IF_REAL, "Width dependence of cit"), -IOP( "wnfactor", BSIM3_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), -IOP( "wxj", BSIM3_MOD_WXJ, IF_REAL, "Width dependence of xj"), -IOP( "wvsat", BSIM3_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), -IOP( "wat", BSIM3_MOD_WAT, IF_REAL, "Width dependence of at"), -IOP( "wa0", BSIM3_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", BSIM3_MOD_WAGS, IF_REAL, "Width dependence of ags"), -IOP( "wa1", BSIM3_MOD_WA1, IF_REAL, "Width dependence of a1"), -IOP( "wa2", BSIM3_MOD_WA2, IF_REAL, "Width dependence of a2"), -IOP( "wketa", BSIM3_MOD_WKETA, IF_REAL, "Width dependence of keta"), -IOP( "wnsub", BSIM3_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), -IOP( "wnch", BSIM3_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), -IOP( "wngate", BSIM3_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), -IOP( "wgamma1", BSIM3_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"), -IOP( "wgamma2", BSIM3_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"), -IOP( "wvbx", BSIM3_MOD_WVBX, IF_REAL, "Width dependence of vbx"), -IOP( "wvbm", BSIM3_MOD_WVBM, IF_REAL, "Width dependence of vbm"), -IOP( "wxt", BSIM3_MOD_WXT, IF_REAL, "Width dependence of xt"), -IOP( "wk1", BSIM3_MOD_WK1, IF_REAL, "Width dependence of k1"), -IOP( "wkt1", BSIM3_MOD_WKT1, IF_REAL, "Width dependence of kt1"), -IOP( "wkt1l", BSIM3_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), -IOP( "wkt2", BSIM3_MOD_WKT2, IF_REAL, "Width dependence of kt2"), -IOP( "wk2", BSIM3_MOD_WK2, IF_REAL, "Width dependence of k2"), -IOP( "wk3", BSIM3_MOD_WK3, IF_REAL, "Width dependence of k3"), -IOP( "wk3b", BSIM3_MOD_WK3B, IF_REAL, "Width dependence of k3b"), -IOP( "ww0", BSIM3_MOD_WW0, IF_REAL, "Width dependence of w0"), -IOP( "wnlx", BSIM3_MOD_WNLX, IF_REAL, "Width dependence of nlx"), -IOP( "wdvt0", BSIM3_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), -IOP( "wdvt1", BSIM3_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), -IOP( "wdvt2", BSIM3_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), -IOP( "wdvt0w", BSIM3_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), -IOP( "wdvt1w", BSIM3_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), -IOP( "wdvt2w", BSIM3_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), -IOP( "wdrout", BSIM3_MOD_WDROUT, IF_REAL, "Width dependence of drout"), -IOP( "wdsub", BSIM3_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), -IOP( "wvth0", BSIM3_MOD_WVTH0, IF_REAL,"Width dependence of vto"), -IOP( "wvtho", BSIM3_MOD_WVTH0, IF_REAL,"Width dependence of vto"), -IOP( "wua", BSIM3_MOD_WUA, IF_REAL, "Width dependence of ua"), -IOP( "wua1", BSIM3_MOD_WUA1, IF_REAL, "Width dependence of ua1"), -IOP( "wub", BSIM3_MOD_WUB, IF_REAL, "Width dependence of ub"), -IOP( "wub1", BSIM3_MOD_WUB1, IF_REAL, "Width dependence of ub1"), -IOP( "wuc", BSIM3_MOD_WUC, IF_REAL, "Width dependence of uc"), -IOP( "wuc1", BSIM3_MOD_WUC1, IF_REAL, "Width dependence of uc1"), -IOP( "wu0", BSIM3_MOD_WU0, IF_REAL, "Width dependence of u0"), -IOP( "wute", BSIM3_MOD_WUTE, IF_REAL, "Width dependence of ute"), -IOP( "wvoff", BSIM3_MOD_WVOFF, IF_REAL, "Width dependence of voff"), -IOP( "welm", BSIM3_MOD_WELM, IF_REAL, "Width dependence of elm"), -IOP( "wdelta", BSIM3_MOD_WDELTA, IF_REAL, "Width dependence of delta"), -IOP( "wrdsw", BSIM3_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), + IOP ("lprt", BSIM3_MOD_LPRT, IF_REAL, "Length dependence of prt "), + IOP ("leta0", BSIM3_MOD_LETA0, IF_REAL, "Length dependence of eta0"), + IOP ("letab", BSIM3_MOD_LETAB, IF_REAL, "Length dependence of etab"), + IOP ("lpclm", BSIM3_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), + IOP ("lpdiblc1", BSIM3_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), + IOP ("lpdiblc2", BSIM3_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), + IOP ("lpdiblcb", BSIM3_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), + IOP ("lpscbe1", BSIM3_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), + IOP ("lpscbe2", BSIM3_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), + IOP ("lpvag", BSIM3_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), + IOP ("lwr", BSIM3_MOD_LWR, IF_REAL, "Length dependence of wr"), + IOP ("ldwg", BSIM3_MOD_LDWG, IF_REAL, "Length dependence of dwg"), + IOP ("ldwb", BSIM3_MOD_LDWB, IF_REAL, "Length dependence of dwb"), + IOP ("lb0", BSIM3_MOD_LB0, IF_REAL, "Length dependence of b0"), + IOP ("lb1", BSIM3_MOD_LB1, IF_REAL, "Length dependence of b1"), + IOP ("lcgsl", BSIM3_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), + IOP ("lcgdl", BSIM3_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), + IOP ("lckappa", BSIM3_MOD_LCKAPPA, IF_REAL, "Length dependence of ckappa"), + IOP ("lcf", BSIM3_MOD_LCF, IF_REAL, "Length dependence of cf"), + IOP ("lclc", BSIM3_MOD_LCLC, IF_REAL, "Length dependence of clc"), + IOP ("lcle", BSIM3_MOD_LCLE, IF_REAL, "Length dependence of cle"), + IOP ("lalpha0", BSIM3_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), + IOP ("lalpha1", BSIM3_MOD_LALPHA1, IF_REAL, "Length dependence of alpha1"), + IOP ("lbeta0", BSIM3_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), + IOP ("lvfbcv", BSIM3_MOD_LVFBCV, IF_REAL, "Length dependence of vfbcv"), + IOP ("lvfb", BSIM3_MOD_LVFB, IF_REAL, "Length dependence of vfb"), + IOP ("lacde", BSIM3_MOD_LACDE, IF_REAL, "Length dependence of acde"), + IOP ("lmoin", BSIM3_MOD_LMOIN, IF_REAL, "Length dependence of moin"), + IOP ("lnoff", BSIM3_MOD_LNOFF, IF_REAL, "Length dependence of noff"), + IOP ("lvoffcv", BSIM3_MOD_LVOFFCV, IF_REAL, "Length dependence of voffcv"), + IOP ("wcdsc", BSIM3_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), + IOP ("wcdscb", BSIM3_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), + IOP ("wcdscd", BSIM3_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), + IOP ("wcit", BSIM3_MOD_WCIT, IF_REAL, "Width dependence of cit"), + IOP ("wnfactor", BSIM3_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), + IOP ("wxj", BSIM3_MOD_WXJ, IF_REAL, "Width dependence of xj"), + IOP ("wvsat", BSIM3_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), + IOP ("wat", BSIM3_MOD_WAT, IF_REAL, "Width dependence of at"), + IOP ("wa0", BSIM3_MOD_WA0, IF_REAL, "Width dependence of a0"), + IOP ("wags", BSIM3_MOD_WAGS, IF_REAL, "Width dependence of ags"), + IOP ("wa1", BSIM3_MOD_WA1, IF_REAL, "Width dependence of a1"), + IOP ("wa2", BSIM3_MOD_WA2, IF_REAL, "Width dependence of a2"), + IOP ("wketa", BSIM3_MOD_WKETA, IF_REAL, "Width dependence of keta"), + IOP ("wnsub", BSIM3_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), + IOP ("wnch", BSIM3_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), + IOP ("wngate", BSIM3_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), + IOP ("wgamma1", BSIM3_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"), + IOP ("wgamma2", BSIM3_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"), + IOP ("wvbx", BSIM3_MOD_WVBX, IF_REAL, "Width dependence of vbx"), + IOP ("wvbm", BSIM3_MOD_WVBM, IF_REAL, "Width dependence of vbm"), + IOP ("wxt", BSIM3_MOD_WXT, IF_REAL, "Width dependence of xt"), + IOP ("wk1", BSIM3_MOD_WK1, IF_REAL, "Width dependence of k1"), + IOP ("wkt1", BSIM3_MOD_WKT1, IF_REAL, "Width dependence of kt1"), + IOP ("wkt1l", BSIM3_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), + IOP ("wkt2", BSIM3_MOD_WKT2, IF_REAL, "Width dependence of kt2"), + IOP ("wk2", BSIM3_MOD_WK2, IF_REAL, "Width dependence of k2"), + IOP ("wk3", BSIM3_MOD_WK3, IF_REAL, "Width dependence of k3"), + IOP ("wk3b", BSIM3_MOD_WK3B, IF_REAL, "Width dependence of k3b"), + IOP ("ww0", BSIM3_MOD_WW0, IF_REAL, "Width dependence of w0"), + IOP ("wnlx", BSIM3_MOD_WNLX, IF_REAL, "Width dependence of nlx"), + IOP ("wdvt0", BSIM3_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), + IOP ("wdvt1", BSIM3_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), + IOP ("wdvt2", BSIM3_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), + IOP ("wdvt0w", BSIM3_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), + IOP ("wdvt1w", BSIM3_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), + IOP ("wdvt2w", BSIM3_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), + IOP ("wdrout", BSIM3_MOD_WDROUT, IF_REAL, "Width dependence of drout"), + IOP ("wdsub", BSIM3_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), + IOP ("wvth0", BSIM3_MOD_WVTH0, IF_REAL, "Width dependence of vto"), + IOP ("wvtho", BSIM3_MOD_WVTH0, IF_REAL, "Width dependence of vto"), + IOP ("wua", BSIM3_MOD_WUA, IF_REAL, "Width dependence of ua"), + IOP ("wua1", BSIM3_MOD_WUA1, IF_REAL, "Width dependence of ua1"), + IOP ("wub", BSIM3_MOD_WUB, IF_REAL, "Width dependence of ub"), + IOP ("wub1", BSIM3_MOD_WUB1, IF_REAL, "Width dependence of ub1"), + IOP ("wuc", BSIM3_MOD_WUC, IF_REAL, "Width dependence of uc"), + IOP ("wuc1", BSIM3_MOD_WUC1, IF_REAL, "Width dependence of uc1"), + IOP ("wu0", BSIM3_MOD_WU0, IF_REAL, "Width dependence of u0"), + IOP ("wute", BSIM3_MOD_WUTE, IF_REAL, "Width dependence of ute"), + IOP ("wvoff", BSIM3_MOD_WVOFF, IF_REAL, "Width dependence of voff"), + IOP ("welm", BSIM3_MOD_WELM, IF_REAL, "Width dependence of elm"), + IOP ("wdelta", BSIM3_MOD_WDELTA, IF_REAL, "Width dependence of delta"), + IOP ("wrdsw", BSIM3_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), -IOP( "wprwg", BSIM3_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), -IOP( "wprwb", BSIM3_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), + IOP ("wprwg", BSIM3_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), + IOP ("wprwb", BSIM3_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), -IOP( "wprt", BSIM3_MOD_WPRT, IF_REAL, "Width dependence of prt"), -IOP( "weta0", BSIM3_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", BSIM3_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wpclm", BSIM3_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", BSIM3_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", BSIM3_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", BSIM3_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wpscbe1", BSIM3_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), -IOP( "wpscbe2", BSIM3_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), -IOP( "wpvag", BSIM3_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), -IOP( "wwr", BSIM3_MOD_WWR, IF_REAL, "Width dependence of wr"), -IOP( "wdwg", BSIM3_MOD_WDWG, IF_REAL, "Width dependence of dwg"), -IOP( "wdwb", BSIM3_MOD_WDWB, IF_REAL, "Width dependence of dwb"), -IOP( "wb0", BSIM3_MOD_WB0, IF_REAL, "Width dependence of b0"), -IOP( "wb1", BSIM3_MOD_WB1, IF_REAL, "Width dependence of b1"), -IOP( "wcgsl", BSIM3_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), -IOP( "wcgdl", BSIM3_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), -IOP( "wckappa", BSIM3_MOD_WCKAPPA, IF_REAL, "Width dependence of ckappa"), -IOP( "wcf", BSIM3_MOD_WCF, IF_REAL, "Width dependence of cf"), -IOP( "wclc", BSIM3_MOD_WCLC, IF_REAL, "Width dependence of clc"), -IOP( "wcle", BSIM3_MOD_WCLE, IF_REAL, "Width dependence of cle"), -IOP( "walpha0", BSIM3_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), -IOP( "walpha1", BSIM3_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"), -IOP( "wbeta0", BSIM3_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), -IOP( "wvfbcv", BSIM3_MOD_WVFBCV, IF_REAL, "Width dependence of vfbcv"), -IOP( "wvfb", BSIM3_MOD_WVFB, IF_REAL, "Width dependence of vfb"), -IOP( "wacde", BSIM3_MOD_WACDE, IF_REAL, "Width dependence of acde"), -IOP( "wmoin", BSIM3_MOD_WMOIN, IF_REAL, "Width dependence of moin"), -IOP( "wnoff", BSIM3_MOD_WNOFF, IF_REAL, "Width dependence of noff"), -IOP( "wvoffcv", BSIM3_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"), + IOP ("wprt", BSIM3_MOD_WPRT, IF_REAL, "Width dependence of prt"), + IOP ("weta0", BSIM3_MOD_WETA0, IF_REAL, "Width dependence of eta0"), + IOP ("wetab", BSIM3_MOD_WETAB, IF_REAL, "Width dependence of etab"), + IOP ("wpclm", BSIM3_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), + IOP ("wpdiblc1", BSIM3_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), + IOP ("wpdiblc2", BSIM3_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), + IOP ("wpdiblcb", BSIM3_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), + IOP ("wpscbe1", BSIM3_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), + IOP ("wpscbe2", BSIM3_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), + IOP ("wpvag", BSIM3_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), + IOP ("wwr", BSIM3_MOD_WWR, IF_REAL, "Width dependence of wr"), + IOP ("wdwg", BSIM3_MOD_WDWG, IF_REAL, "Width dependence of dwg"), + IOP ("wdwb", BSIM3_MOD_WDWB, IF_REAL, "Width dependence of dwb"), + IOP ("wb0", BSIM3_MOD_WB0, IF_REAL, "Width dependence of b0"), + IOP ("wb1", BSIM3_MOD_WB1, IF_REAL, "Width dependence of b1"), + IOP ("wcgsl", BSIM3_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), + IOP ("wcgdl", BSIM3_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), + IOP ("wckappa", BSIM3_MOD_WCKAPPA, IF_REAL, "Width dependence of ckappa"), + IOP ("wcf", BSIM3_MOD_WCF, IF_REAL, "Width dependence of cf"), + IOP ("wclc", BSIM3_MOD_WCLC, IF_REAL, "Width dependence of clc"), + IOP ("wcle", BSIM3_MOD_WCLE, IF_REAL, "Width dependence of cle"), + IOP ("walpha0", BSIM3_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), + IOP ("walpha1", BSIM3_MOD_WALPHA1, IF_REAL, "Width dependence of alpha1"), + IOP ("wbeta0", BSIM3_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), + IOP ("wvfbcv", BSIM3_MOD_WVFBCV, IF_REAL, "Width dependence of vfbcv"), + IOP ("wvfb", BSIM3_MOD_WVFB, IF_REAL, "Width dependence of vfb"), + IOP ("wacde", BSIM3_MOD_WACDE, IF_REAL, "Width dependence of acde"), + IOP ("wmoin", BSIM3_MOD_WMOIN, IF_REAL, "Width dependence of moin"), + IOP ("wnoff", BSIM3_MOD_WNOFF, IF_REAL, "Width dependence of noff"), + IOP ("wvoffcv", BSIM3_MOD_WVOFFCV, IF_REAL, "Width dependence of voffcv"), -IOP( "pcdsc", BSIM3_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", BSIM3_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), -IOP( "pcdscd", BSIM3_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), -IOP( "pcit", BSIM3_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), -IOP( "pnfactor", BSIM3_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), -IOP( "pxj", BSIM3_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), -IOP( "pvsat", BSIM3_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), -IOP( "pat", BSIM3_MOD_PAT, IF_REAL, "Cross-term dependence of at"), -IOP( "pa0", BSIM3_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), -IOP( "pags", BSIM3_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), -IOP( "pa1", BSIM3_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), -IOP( "pa2", BSIM3_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), -IOP( "pketa", BSIM3_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), -IOP( "pnsub", BSIM3_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), -IOP( "pnch", BSIM3_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), -IOP( "pngate", BSIM3_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), -IOP( "pgamma1", BSIM3_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"), -IOP( "pgamma2", BSIM3_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"), -IOP( "pvbx", BSIM3_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"), -IOP( "pvbm", BSIM3_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"), -IOP( "pxt", BSIM3_MOD_PXT, IF_REAL, "Cross-term dependence of xt"), -IOP( "pk1", BSIM3_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), -IOP( "pkt1", BSIM3_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), -IOP( "pkt1l", BSIM3_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), -IOP( "pkt2", BSIM3_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), -IOP( "pk2", BSIM3_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), -IOP( "pk3", BSIM3_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), -IOP( "pk3b", BSIM3_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), -IOP( "pw0", BSIM3_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), -IOP( "pnlx", BSIM3_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), -IOP( "pdvt0", BSIM3_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), -IOP( "pdvt1", BSIM3_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), -IOP( "pdvt2", BSIM3_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), -IOP( "pdvt0w", BSIM3_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), -IOP( "pdvt1w", BSIM3_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), -IOP( "pdvt2w", BSIM3_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), -IOP( "pdrout", BSIM3_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), -IOP( "pdsub", BSIM3_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), -IOP( "pvth0", BSIM3_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"), -IOP( "pvtho", BSIM3_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"), -IOP( "pua", BSIM3_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), -IOP( "pua1", BSIM3_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), -IOP( "pub", BSIM3_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), -IOP( "pub1", BSIM3_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), -IOP( "puc", BSIM3_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), -IOP( "puc1", BSIM3_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), -IOP( "pu0", BSIM3_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), -IOP( "pute", BSIM3_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), -IOP( "pvoff", BSIM3_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), -IOP( "pelm", BSIM3_MOD_PELM, IF_REAL, "Cross-term dependence of elm"), -IOP( "pdelta", BSIM3_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "prdsw", BSIM3_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), + IOP ("pcdsc", BSIM3_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), + IOP ("pcdscb", BSIM3_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), + IOP ("pcdscd", BSIM3_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), + IOP ("pcit", BSIM3_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), + IOP ("pnfactor", BSIM3_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), + IOP ("pxj", BSIM3_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), + IOP ("pvsat", BSIM3_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), + IOP ("pat", BSIM3_MOD_PAT, IF_REAL, "Cross-term dependence of at"), + IOP ("pa0", BSIM3_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), + IOP ("pags", BSIM3_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), + IOP ("pa1", BSIM3_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), + IOP ("pa2", BSIM3_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), + IOP ("pketa", BSIM3_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), + IOP ("pnsub", BSIM3_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), + IOP ("pnch", BSIM3_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), + IOP ("pngate", BSIM3_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), + IOP ("pgamma1", BSIM3_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"), + IOP ("pgamma2", BSIM3_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"), + IOP ("pvbx", BSIM3_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"), + IOP ("pvbm", BSIM3_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"), + IOP ("pxt", BSIM3_MOD_PXT, IF_REAL, "Cross-term dependence of xt"), + IOP ("pk1", BSIM3_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), + IOP ("pkt1", BSIM3_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), + IOP ("pkt1l", BSIM3_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), + IOP ("pkt2", BSIM3_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), + IOP ("pk2", BSIM3_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), + IOP ("pk3", BSIM3_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), + IOP ("pk3b", BSIM3_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), + IOP ("pw0", BSIM3_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), + IOP ("pnlx", BSIM3_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), + IOP ("pdvt0", BSIM3_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), + IOP ("pdvt1", BSIM3_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), + IOP ("pdvt2", BSIM3_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), + IOP ("pdvt0w", BSIM3_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), + IOP ("pdvt1w", BSIM3_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), + IOP ("pdvt2w", BSIM3_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), + IOP ("pdrout", BSIM3_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), + IOP ("pdsub", BSIM3_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), + IOP ("pvth0", BSIM3_MOD_PVTH0, IF_REAL, "Cross-term dependence of vto"), + IOP ("pvtho", BSIM3_MOD_PVTH0, IF_REAL, "Cross-term dependence of vto"), + IOP ("pua", BSIM3_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), + IOP ("pua1", BSIM3_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), + IOP ("pub", BSIM3_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), + IOP ("pub1", BSIM3_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), + IOP ("puc", BSIM3_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), + IOP ("puc1", BSIM3_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), + IOP ("pu0", BSIM3_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), + IOP ("pute", BSIM3_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), + IOP ("pvoff", BSIM3_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), + IOP ("pelm", BSIM3_MOD_PELM, IF_REAL, "Cross-term dependence of elm"), + IOP ("pdelta", BSIM3_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), + IOP ("prdsw", BSIM3_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), -IOP( "pprwg", BSIM3_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pprwb", BSIM3_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), + IOP ("pprwg", BSIM3_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), + IOP ("pprwb", BSIM3_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), -IOP( "pprt", BSIM3_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), -IOP( "peta0", BSIM3_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), -IOP( "petab", BSIM3_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), -IOP( "ppclm", BSIM3_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), -IOP( "ppdiblc1", BSIM3_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), -IOP( "ppdiblc2", BSIM3_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), -IOP( "ppdiblcb", BSIM3_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "ppscbe1", BSIM3_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), -IOP( "ppscbe2", BSIM3_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), -IOP( "ppvag", BSIM3_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), -IOP( "pwr", BSIM3_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), -IOP( "pdwg", BSIM3_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), -IOP( "pdwb", BSIM3_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), -IOP( "pb0", BSIM3_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), -IOP( "pb1", BSIM3_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), -IOP( "pcgsl", BSIM3_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), -IOP( "pcgdl", BSIM3_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), -IOP( "pckappa", BSIM3_MOD_PCKAPPA, IF_REAL, "Cross-term dependence of ckappa"), -IOP( "pcf", BSIM3_MOD_PCF, IF_REAL, "Cross-term dependence of cf"), -IOP( "pclc", BSIM3_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"), -IOP( "pcle", BSIM3_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), -IOP( "palpha0", BSIM3_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), -IOP( "palpha1", BSIM3_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"), -IOP( "pbeta0", BSIM3_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), -IOP( "pvfbcv", BSIM3_MOD_PVFBCV, IF_REAL, "Cross-term dependence of vfbcv"), -IOP( "pvfb", BSIM3_MOD_PVFB, IF_REAL, "Cross-term dependence of vfb"), -IOP( "pacde", BSIM3_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), -IOP( "pmoin", BSIM3_MOD_PMOIN, IF_REAL, "Cross-term dependence of moin"), -IOP( "pnoff", BSIM3_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"), -IOP( "pvoffcv", BSIM3_MOD_PVOFFCV, IF_REAL, "Cross-term dependence of voffcv"), + IOP ("pprt", BSIM3_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), + IOP ("peta0", BSIM3_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), + IOP ("petab", BSIM3_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), + IOP ("ppclm", BSIM3_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), + IOP ("ppdiblc1", BSIM3_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), + IOP ("ppdiblc2", BSIM3_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), + IOP ("ppdiblcb", BSIM3_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), + IOP ("ppscbe1", BSIM3_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), + IOP ("ppscbe2", BSIM3_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), + IOP ("ppvag", BSIM3_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), + IOP ("pwr", BSIM3_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), + IOP ("pdwg", BSIM3_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), + IOP ("pdwb", BSIM3_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), + IOP ("pb0", BSIM3_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), + IOP ("pb1", BSIM3_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), + IOP ("pcgsl", BSIM3_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), + IOP ("pcgdl", BSIM3_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), + IOP ("pckappa", BSIM3_MOD_PCKAPPA, IF_REAL, "Cross-term dependence of ckappa"), + IOP ("pcf", BSIM3_MOD_PCF, IF_REAL, "Cross-term dependence of cf"), + IOP ("pclc", BSIM3_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"), + IOP ("pcle", BSIM3_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), + IOP ("palpha0", BSIM3_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), + IOP ("palpha1", BSIM3_MOD_PALPHA1, IF_REAL, "Cross-term dependence of alpha1"), + IOP ("pbeta0", BSIM3_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), + IOP ("pvfbcv", BSIM3_MOD_PVFBCV, IF_REAL, "Cross-term dependence of vfbcv"), + IOP ("pvfb", BSIM3_MOD_PVFB, IF_REAL, "Cross-term dependence of vfb"), + IOP ("pacde", BSIM3_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), + IOP ("pmoin", BSIM3_MOD_PMOIN, IF_REAL, "Cross-term dependence of moin"), + IOP ("pnoff", BSIM3_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"), + IOP ("pvoffcv", BSIM3_MOD_PVOFFCV, IF_REAL, "Cross-term dependence of voffcv"), -IOP( "noia", BSIM3_MOD_NOIA, IF_REAL, "Flicker noise parameter"), -IOP( "noib", BSIM3_MOD_NOIB, IF_REAL, "Flicker noise parameter"), -IOP( "noic", BSIM3_MOD_NOIC, IF_REAL, "Flicker noise parameter"), -IOP( "em", BSIM3_MOD_EM, IF_REAL, "Flicker noise parameter"), -IOP( "ef", BSIM3_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), -IOP( "af", BSIM3_MOD_AF, IF_REAL, "Flicker noise exponent"), -IOP( "kf", BSIM3_MOD_KF, IF_REAL, "Flicker noise coefficient"), + IOP ("noia", BSIM3_MOD_NOIA, IF_REAL, "Flicker noise parameter"), + IOP ("noib", BSIM3_MOD_NOIB, IF_REAL, "Flicker noise parameter"), + IOP ("noic", BSIM3_MOD_NOIC, IF_REAL, "Flicker noise parameter"), + IOP ("em", BSIM3_MOD_EM, IF_REAL, "Flicker noise parameter"), + IOP ("ef", BSIM3_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), + IOP ("af", BSIM3_MOD_AF, IF_REAL, "Flicker noise exponent"), + IOP ("kf", BSIM3_MOD_KF, IF_REAL, "Flicker noise coefficient"), -IP( "nmos", BSIM3_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), -IP( "pmos", BSIM3_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), + IP ("nmos", BSIM3_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), + IP ("pmos", BSIM3_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), }; char *BSIM3names[] = { - "Drain", - "Gate", - "Source", - "Bulk", - "Charge" + "Drain", + "Gate", + "Source", + "Bulk", + "Charge" }; -int BSIM3nSize = NUMELEMS(BSIM3names); -int BSIM3pTSize = NUMELEMS(BSIM3pTable); -int BSIM3mPTSize = NUMELEMS(BSIM3mPTable); -int BSIM3iSize = sizeof(BSIM3instance); -int BSIM3mSize = sizeof(BSIM3model); - - - +int BSIM3nSize = NUMELEMS (BSIM3names); +int BSIM3pTSize = NUMELEMS (BSIM3pTable); +int BSIM3mPTSize = NUMELEMS (BSIM3mPTable); +int BSIM3iSize = sizeof (BSIM3instance); +int BSIM3mSize = sizeof (BSIM3model); diff --git a/src/spicelib/devices/bsim3/b3acld.c b/src/spicelib/devices/bsim3/b3acld.c index 480ee12ee..0672c3ff4 100644 --- a/src/spicelib/devices/bsim3/b3acld.c +++ b/src/spicelib/devices/bsim3/b3acld.c @@ -1,13 +1,23 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -Modified: 2000 AlansFixes -File: b3acld.c -**********/ + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3acld.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng and Mansun Chan + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + +/*************************************/ #include "ngspice.h" -#include #include "cktdefs.h" #include "bsim3def.h" #include "sperror.h" @@ -15,319 +25,426 @@ File: b3acld.c int -BSIM3acLoad(GENmodel *inModel, CKTcircuit *ckt) +BSIM3acLoad (GENmodel * inModel, CKTcircuit * ckt) { - BSIM3model *model = (BSIM3model*)inModel; - BSIM3instance *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, omega; - double GSoverlapCap, GDoverlapCap, GBoverlapCap, FwdSum, RevSum, Gm, Gmbs; - double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb, xcqdb, xcqsb, xcqbb; - double gbspsp, gbbdp, gbbsp, gbspg, gbspb; - double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; - double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; - double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; - double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; - double ScalingFactor = 1.0e-9; - double m; - - omega = ckt->CKTomega; - for (; model != NULL; model = model->BSIM3nextModel) { - for (here = model->BSIM3instances; here!= NULL; - here = here->BSIM3nextInstance) { - if (here->BSIM3owner != ARCHme) - continue; - if (here->BSIM3mode >= 0) { - Gm = here->BSIM3gm; - Gmbs = here->BSIM3gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - gbbdp = -here->BSIM3gbds; - gbbsp = here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs; - - gbdpg = here->BSIM3gbgs; - gbdpb = here->BSIM3gbbs; - gbdpdp = here->BSIM3gbds; - gbdpsp = -(gbdpg + gbdpb + gbdpdp); - - gbspdp = 0.0; - gbspg = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (here->BSIM3nqsMod == 0) { - cggb = here->BSIM3cggb; - cgsb = here->BSIM3cgsb; - cgdb = here->BSIM3cgdb; - - cbgb = here->BSIM3cbgb; - cbsb = here->BSIM3cbsb; - cbdb = here->BSIM3cbdb; - - cdgb = here->BSIM3cdgb; - cdsb = here->BSIM3cdsb; - cddb = here->BSIM3cddb; - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } else { - cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3gtg; - xgtd = here->BSIM3gtd; - xgts = here->BSIM3gts; - xgtb = here->BSIM3gtb; - - xcqgb = here->BSIM3cqgb * omega; - xcqdb = here->BSIM3cqdb * omega; - xcqsb = here->BSIM3cqsb * omega; - xcqbb = here->BSIM3cqbb * omega; - - CoxWL = model->BSIM3cox * here->pParam->BSIM3weffCV - * here->pParam->BSIM3leffCV; - qcheq = -(here->BSIM3qgate + here->BSIM3qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) { - if (model->BSIM3xpart < 0.5) { - dxpart = 0.4; + BSIM3model *model = (BSIM3model *) inModel; + BSIM3instance *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, omega; + double GSoverlapCap, GDoverlapCap, GBoverlapCap, FwdSum, RevSum, Gm, + Gmbs; + double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb, xcqdb, xcqsb, + xcqbb; + double gbspsp, gbbdp, gbbsp, gbspg, gbspb; + double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; + double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; + double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; + double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Cdb, Csg, Csd, Css, Csb; + double ScalingFactor = 1.0e-9; + double m; + + omega = ckt->CKTomega; + for (; model != NULL; model = model->BSIM3nextModel) + { + for (here = model->BSIM3instances; here != NULL; + here = here->BSIM3nextInstance) + { + + if (here->BSIM3owner != ARCHme) + continue; + + if (here->BSIM3mode >= 0) + { + Gm = here->BSIM3gm; + Gmbs = here->BSIM3gmbs; + FwdSum = Gm + Gmbs; + RevSum = 0.0; + + gbbdp = -here->BSIM3gbds; + gbbsp = here->BSIM3gbds + here->BSIM3gbgs + + here->BSIM3gbbs; + + gbdpg = here->BSIM3gbgs; + gbdpb = here->BSIM3gbbs; + gbdpdp = here->BSIM3gbds; + gbdpsp = -(gbdpg + gbdpb + gbdpdp); + + gbspdp = 0.0; + gbspg = 0.0; + gbspb = 0.0; + gbspsp = 0.0; + + if (here->BSIM3nqsMod == 0) + { + cggb = here->BSIM3cggb; + cgsb = here->BSIM3cgsb; + cgdb = here->BSIM3cgdb; + + cbgb = here->BSIM3cbgb; + cbsb = here->BSIM3cbsb; + cbdb = here->BSIM3cbdb; + + cdgb = here->BSIM3cdgb; + cdsb = here->BSIM3cdsb; + cddb = here->BSIM3cddb; + + xgtg = xgtd = xgts = xgtb = 0.0; + sxpart = 0.6; + dxpart = 0.4; + ddxpart_dVd = ddxpart_dVg = + ddxpart_dVb = ddxpart_dVs = + 0.0; + dsxpart_dVd = dsxpart_dVg = + dsxpart_dVb = dsxpart_dVs = + 0.0; + } + else + { + cggb = cgdb = cgsb = 0.0; + cbgb = cbdb = cbsb = 0.0; + cdgb = cddb = cdsb = 0.0; + + xgtg = here->BSIM3gtg; + xgtd = here->BSIM3gtd; + xgts = here->BSIM3gts; + xgtb = here->BSIM3gtb; + + xcqgb = here->BSIM3cqgb * omega; + xcqdb = here->BSIM3cqdb * omega; + xcqsb = here->BSIM3cqsb * omega; + xcqbb = here->BSIM3cqbb * omega; + + CoxWL = model->BSIM3cox * + here->pParam->BSIM3weffCV * + here->pParam->BSIM3leffCV; + qcheq = -(here->BSIM3qgate + + here->BSIM3qbulk); + if (fabs (qcheq) <= 1.0e-5 * CoxWL) + { + if (model->BSIM3xpart < 0.5) + { + dxpart = 0.4; + } + else if (model->BSIM3xpart > + 0.5) + { + dxpart = 0.0; + } + else + { + dxpart = 0.5; + } + ddxpart_dVd = ddxpart_dVg = + ddxpart_dVb = + ddxpart_dVs = 0.0; + } + else + { + dxpart = here->BSIM3qdrn / + qcheq; + Cdd = here->BSIM3cddb; + Csd = -(here->BSIM3cgdb + + here->BSIM3cddb + + here->BSIM3cbdb); + ddxpart_dVd = + (Cdd - + dxpart * (Cdd + + Csd)) / + qcheq; + Cdg = here->BSIM3cdgb; + Csg = -(here->BSIM3cggb + + here->BSIM3cdgb + + here->BSIM3cbgb); + ddxpart_dVg = + (Cdg - + dxpart * (Cdg + + Csg)) / + qcheq; + + Cds = here->BSIM3cdsb; + Css = -(here->BSIM3cgsb + + here->BSIM3cdsb + + here->BSIM3cbsb); + ddxpart_dVs = + (Cds - + dxpart * (Cds + + Css)) / + qcheq; + + ddxpart_dVb = + -(ddxpart_dVd + + ddxpart_dVg + + ddxpart_dVs); + } + sxpart = 1.0 - dxpart; + dsxpart_dVd = -ddxpart_dVd; + dsxpart_dVg = -ddxpart_dVg; + dsxpart_dVs = -ddxpart_dVs; + dsxpart_dVb = + -(dsxpart_dVd + dsxpart_dVg + + dsxpart_dVs); + } } - else if (model->BSIM3xpart > 0.5) { - dxpart = 0.0; - } else { - dxpart = 0.5; + else + { + Gm = -here->BSIM3gm; + Gmbs = -here->BSIM3gmbs; + FwdSum = 0.0; + RevSum = -(Gm + Gmbs); + + gbbsp = -here->BSIM3gbds; + gbbdp = here->BSIM3gbds + here->BSIM3gbgs + + here->BSIM3gbbs; + + gbdpg = 0.0; + gbdpsp = 0.0; + gbdpb = 0.0; + gbdpdp = 0.0; + + gbspg = here->BSIM3gbgs; + gbspsp = here->BSIM3gbds; + gbspb = here->BSIM3gbbs; + gbspdp = -(gbspg + gbspsp + gbspb); + + if (here->BSIM3nqsMod == 0) + { + cggb = here->BSIM3cggb; + cgsb = here->BSIM3cgdb; + cgdb = here->BSIM3cgsb; + + cbgb = here->BSIM3cbgb; + cbsb = here->BSIM3cbdb; + cbdb = here->BSIM3cbsb; + + cdgb = -(here->BSIM3cdgb + cggb + + cbgb); + cdsb = -(here->BSIM3cddb + cgsb + + cbsb); + cddb = -(here->BSIM3cdsb + cgdb + + cbdb); + + xgtg = xgtd = xgts = xgtb = 0.0; + sxpart = 0.4; + dxpart = 0.6; + ddxpart_dVd = ddxpart_dVg = + ddxpart_dVb = ddxpart_dVs = + 0.0; + dsxpart_dVd = dsxpart_dVg = + dsxpart_dVb = dsxpart_dVs = + 0.0; + } + else + { + cggb = cgdb = cgsb = 0.0; + cbgb = cbdb = cbsb = 0.0; + cdgb = cddb = cdsb = 0.0; + + xgtg = here->BSIM3gtg; + xgtd = here->BSIM3gts; + xgts = here->BSIM3gtd; + xgtb = here->BSIM3gtb; + + xcqgb = here->BSIM3cqgb * omega; + xcqdb = here->BSIM3cqsb * omega; + xcqsb = here->BSIM3cqdb * omega; + xcqbb = here->BSIM3cqbb * omega; + + CoxWL = model->BSIM3cox * + here->pParam->BSIM3weffCV * + here->pParam->BSIM3leffCV; + qcheq = -(here->BSIM3qgate + + here->BSIM3qbulk); + if (fabs (qcheq) <= 1.0e-5 * CoxWL) + { + if (model->BSIM3xpart < 0.5) + { + sxpart = 0.4; + } + else if (model->BSIM3xpart > + 0.5) + { + sxpart = 0.0; + } + else + { + sxpart = 0.5; + } + dsxpart_dVd = dsxpart_dVg = + dsxpart_dVb = + dsxpart_dVs = 0.0; + } + else + { + sxpart = here->BSIM3qdrn / + qcheq; + Css = here->BSIM3cddb; + Cds = -(here->BSIM3cgdb + + here->BSIM3cddb + + here->BSIM3cbdb); + dsxpart_dVs = + (Css - + sxpart * (Css + + Cds)) / + qcheq; + Csg = here->BSIM3cdgb; + Cdg = -(here->BSIM3cggb + + here->BSIM3cdgb + + here->BSIM3cbgb); + dsxpart_dVg = + (Csg - + sxpart * (Csg + + Cdg)) / + qcheq; + + Csd = here->BSIM3cdsb; + Cdd = -(here->BSIM3cgsb + + here->BSIM3cdsb + + here->BSIM3cbsb); + dsxpart_dVd = + (Csd - + sxpart * (Csd + + Cdd)) / + qcheq; + + dsxpart_dVb = + -(dsxpart_dVd + + dsxpart_dVg + + dsxpart_dVs); + } + dxpart = 1.0 - sxpart; + ddxpart_dVd = -dsxpart_dVd; + ddxpart_dVg = -dsxpart_dVg; + ddxpart_dVs = -dsxpart_dVs; + ddxpart_dVb = + -(ddxpart_dVd + ddxpart_dVg + + ddxpart_dVs); + } } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } else { - dxpart = here->BSIM3qdrn / qcheq; - Cdd = here->BSIM3cddb; - Csd = -(here->BSIM3cgdb + here->BSIM3cddb - + here->BSIM3cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM3cdgb; - Csg = -(here->BSIM3cggb + here->BSIM3cdgb - + here->BSIM3cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM3cdsb; - Css = -(here->BSIM3cgsb + here->BSIM3cdsb - + here->BSIM3cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg - + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - } else { - Gm = -here->BSIM3gm; - Gmbs = -here->BSIM3gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - gbbsp = -here->BSIM3gbds; - gbbdp = here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM3gbgs; - gbspsp = here->BSIM3gbds; - gbspb = here->BSIM3gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (here->BSIM3nqsMod == 0) { - cggb = here->BSIM3cggb; - cgsb = here->BSIM3cgdb; - cgdb = here->BSIM3cgsb; - - cbgb = here->BSIM3cbgb; - cbsb = here->BSIM3cbdb; - cbdb = here->BSIM3cbsb; - - cdgb = -(here->BSIM3cdgb + cggb + cbgb); - cdsb = -(here->BSIM3cddb + cgsb + cbsb); - cddb = -(here->BSIM3cdsb + cgdb + cbdb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } else { - cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3gtg; - xgtd = here->BSIM3gts; - xgts = here->BSIM3gtd; - xgtb = here->BSIM3gtb; - - xcqgb = here->BSIM3cqgb * omega; - xcqdb = here->BSIM3cqsb * omega; - xcqsb = here->BSIM3cqdb * omega; - xcqbb = here->BSIM3cqbb * omega; - - CoxWL = model->BSIM3cox * here->pParam->BSIM3weffCV - * here->pParam->BSIM3leffCV; - qcheq = -(here->BSIM3qgate + here->BSIM3qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) { - if (model->BSIM3xpart < 0.5) { - sxpart = 0.4; - } else if (model->BSIM3xpart > 0.5) { - sxpart = 0.0; - } else { - sxpart = 0.5; + + T1 = *(ckt->CKTstate0 + + here->BSIM3qdef) * here->BSIM3gtau; + gdpr = here->BSIM3drainConductance; + gspr = here->BSIM3sourceConductance; + gds = here->BSIM3gds; + gbd = here->BSIM3gbd; + gbs = here->BSIM3gbs; + capbd = here->BSIM3capbd; + capbs = here->BSIM3capbs; + + GSoverlapCap = here->BSIM3cgso; + GDoverlapCap = here->BSIM3cgdo; + GBoverlapCap = here->pParam->BSIM3cgbo; + + xcdgb = (cdgb - GDoverlapCap) * omega; + xcddb = (cddb + capbd + GDoverlapCap) * omega; + xcdsb = cdsb * omega; + xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega; + xcsdb = -(cgdb + cbdb + cddb) * omega; + xcssb = (capbs + GSoverlapCap - + (cgsb + cbsb + cdsb)) * omega; + xcggb = (cggb + GDoverlapCap + GSoverlapCap + + GBoverlapCap) * omega; + xcgdb = (cgdb - GDoverlapCap) * omega; + xcgsb = (cgsb - GSoverlapCap) * omega; + xcbgb = (cbgb - GBoverlapCap) * omega; + xcbdb = (cbdb - capbd) * omega; + xcbsb = (cbsb - capbs) * omega; + + + m = here->BSIM3m; + + *(here->BSIM3GgPtr + 1) += m * xcggb; + *(here->BSIM3BbPtr + 1) -= + m * (xcbgb + xcbdb + xcbsb); + *(here->BSIM3DPdpPtr + 1) += m * xcddb; + *(here->BSIM3SPspPtr + 1) += m * xcssb; + *(here->BSIM3GbPtr + 1) -= + m * (xcggb + xcgdb + xcgsb); + *(here->BSIM3GdpPtr + 1) += m * xcgdb; + *(here->BSIM3GspPtr + 1) += m * xcgsb; + *(here->BSIM3BgPtr + 1) += m * xcbgb; + *(here->BSIM3BdpPtr + 1) += m * xcbdb; + *(here->BSIM3BspPtr + 1) += m * xcbsb; + *(here->BSIM3DPgPtr + 1) += m * xcdgb; + *(here->BSIM3DPbPtr + 1) -= + m * (xcdgb + xcddb + xcdsb); + *(here->BSIM3DPspPtr + 1) += m * xcdsb; + *(here->BSIM3SPgPtr + 1) += m * xcsgb; + *(here->BSIM3SPbPtr + 1) -= + m * (xcsgb + xcsdb + xcssb); + *(here->BSIM3SPdpPtr + 1) += m * xcsdb; + + *(here->BSIM3DdPtr) += m * gdpr; + *(here->BSIM3SsPtr) += m * gspr; + *(here->BSIM3BbPtr) += + m * (gbd + gbs - here->BSIM3gbbs); + *(here->BSIM3DPdpPtr) += + m * (gdpr + gds + gbd + RevSum + + dxpart * xgtd + T1 * ddxpart_dVd + + gbdpdp); + *(here->BSIM3SPspPtr) += + m * (gspr + gds + gbs + FwdSum + + sxpart * xgts + T1 * dsxpart_dVs + + gbspsp); + + *(here->BSIM3DdpPtr) -= m * gdpr; + *(here->BSIM3SspPtr) -= m * gspr; + + *(here->BSIM3BgPtr) -= m * here->BSIM3gbgs; + *(here->BSIM3BdpPtr) -= m * (gbd - gbbdp); + *(here->BSIM3BspPtr) -= m * (gbs - gbbsp); + + *(here->BSIM3DPdPtr) -= m * gdpr; + *(here->BSIM3DPgPtr) += + m * (Gm + dxpart * xgtg + T1 * ddxpart_dVg + + gbdpg); + *(here->BSIM3DPbPtr) -= + m * (gbd - Gmbs - dxpart * xgtb - + T1 * ddxpart_dVb - gbdpb); + *(here->BSIM3DPspPtr) -= + m * (gds + FwdSum - dxpart * xgts - + T1 * ddxpart_dVs - gbdpsp); + + *(here->BSIM3SPgPtr) -= + m * (Gm - sxpart * xgtg - T1 * dsxpart_dVg - + gbspg); + *(here->BSIM3SPsPtr) -= m * gspr; + *(here->BSIM3SPbPtr) -= + m * (gbs + Gmbs - sxpart * xgtb - + T1 * dsxpart_dVb - gbspb); + *(here->BSIM3SPdpPtr) -= + m * (gds + RevSum - sxpart * xgtd - + T1 * dsxpart_dVd - gbspdp); + + *(here->BSIM3GgPtr) -= m * xgtg; + *(here->BSIM3GbPtr) -= m * xgtb; + *(here->BSIM3GdpPtr) -= m * xgtd; + *(here->BSIM3GspPtr) -= m * xgts; + + if (here->BSIM3nqsMod) + { + *(here->BSIM3QqPtr + 1) += + m * omega * ScalingFactor; + *(here->BSIM3QgPtr + 1) -= m * xcqgb; + *(here->BSIM3QdpPtr + 1) -= m * xcqdb; + *(here->BSIM3QspPtr + 1) -= m * xcqsb; + *(here->BSIM3QbPtr + 1) -= m * xcqbb; + + *(here->BSIM3QqPtr) += m * here->BSIM3gtau; + + *(here->BSIM3DPqPtr) += + m * (dxpart * here->BSIM3gtau); + *(here->BSIM3SPqPtr) += + m * (sxpart * here->BSIM3gtau); + *(here->BSIM3GqPtr) -= m * here->BSIM3gtau; + + *(here->BSIM3QgPtr) += m * xgtg; + *(here->BSIM3QdpPtr) += m * xgtd; + *(here->BSIM3QspPtr) += m * xgts; + *(here->BSIM3QbPtr) += m * xgtb; } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } else { - sxpart = here->BSIM3qdrn / qcheq; - Css = here->BSIM3cddb; - Cds = -(here->BSIM3cgdb + here->BSIM3cddb - + here->BSIM3cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM3cdgb; - Cdg = -(here->BSIM3cggb + here->BSIM3cdgb - + here->BSIM3cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM3cdsb; - Cdd = -(here->BSIM3cgsb + here->BSIM3cdsb - + here->BSIM3cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg - + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); } - } - - T1 = *(ckt->CKTstate0 + here->BSIM3qdef) * here->BSIM3gtau; - gdpr = here->BSIM3drainConductance; - gspr = here->BSIM3sourceConductance; - gds = here->BSIM3gds; - gbd = here->BSIM3gbd; - gbs = here->BSIM3gbs; - capbd = here->BSIM3capbd; - capbs = here->BSIM3capbs; - - GSoverlapCap = here->BSIM3cgso; - GDoverlapCap = here->BSIM3cgdo; - GBoverlapCap = here->pParam->BSIM3cgbo; - - xcdgb = (cdgb - GDoverlapCap) * omega; - xcddb = (cddb + capbd + GDoverlapCap) * omega; - xcdsb = cdsb * omega; - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega; - xcsdb = -(cgdb + cbdb + cddb) * omega; - xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)) * omega; - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap) - * omega; - xcgdb = (cgdb - GDoverlapCap ) * omega; - xcgsb = (cgsb - GSoverlapCap) * omega; - xcbgb = (cbgb - GBoverlapCap) * omega; - xcbdb = (cbdb - capbd ) * omega; - xcbsb = (cbsb - capbs ) * omega; - - - m = here->BSIM3m; - - *(here->BSIM3GgPtr +1) += m * xcggb; - *(here->BSIM3BbPtr +1) -= xcbgb + xcbdb + xcbsb; - *(here->BSIM3DPdpPtr +1) += m * xcddb; - *(here->BSIM3SPspPtr +1) += m * xcssb; - *(here->BSIM3GbPtr +1) -= xcggb + xcgdb + xcgsb; - *(here->BSIM3GdpPtr +1) += m * xcgdb; - *(here->BSIM3GspPtr +1) += m * xcgsb; - *(here->BSIM3BgPtr +1) += m * xcbgb; - *(here->BSIM3BdpPtr +1) += m * xcbdb; - *(here->BSIM3BspPtr +1) += m * xcbsb; - *(here->BSIM3DPgPtr +1) += m * xcdgb; - *(here->BSIM3DPbPtr +1) -= xcdgb + xcddb + xcdsb; - *(here->BSIM3DPspPtr +1) += m * xcdsb; - *(here->BSIM3SPgPtr +1) += m * xcsgb; - *(here->BSIM3SPbPtr +1) -= xcsgb + xcsdb + xcssb; - *(here->BSIM3SPdpPtr +1) += m * xcsdb; - - *(here->BSIM3DdPtr) += m * gdpr; - *(here->BSIM3SsPtr) += m * gspr; - *(here->BSIM3BbPtr) += m * (gbd + gbs - here->BSIM3gbbs); - *(here->BSIM3DPdpPtr) += m * (gdpr + gds + gbd + RevSum - +dxpart * xgtd + T1 * ddxpart_dVd + gbdpdp); - *(here->BSIM3SPspPtr) += m * (gspr + gds + gbs + FwdSum - +sxpart * xgts + T1 * dsxpart_dVs + gbspsp); - - *(here->BSIM3DdpPtr) -= m * gdpr; - *(here->BSIM3SspPtr) -= m * gspr; - - *(here->BSIM3BgPtr) -= m * here->BSIM3gbgs; - *(here->BSIM3BdpPtr) -= m * (gbd - gbbdp); - *(here->BSIM3BspPtr) -= m * (gbs - gbbsp); - - *(here->BSIM3DPdPtr) -= m * gdpr; - *(here->BSIM3DPgPtr) += m * (Gm + dxpart * xgtg + T1 * ddxpart_dVg - + gbdpg); - *(here->BSIM3DPbPtr) -= m * (gbd - Gmbs - dxpart * xgtb - - T1 * ddxpart_dVb - gbdpb); - *(here->BSIM3DPspPtr) -= m * (gds + FwdSum - dxpart * xgts - - T1 * ddxpart_dVs - gbdpsp); - - *(here->BSIM3SPgPtr) -= m * (Gm - sxpart * xgtg - T1 * dsxpart_dVg - - gbspg); - *(here->BSIM3SPsPtr) -= m * gspr; - *(here->BSIM3SPbPtr) -= m * (gbs + Gmbs - sxpart * xgtb - - T1 * dsxpart_dVb - gbspb); - *(here->BSIM3SPdpPtr) -= m * (gds + RevSum - sxpart * xgtd - - T1 * dsxpart_dVd - gbspdp); - - *(here->BSIM3GgPtr) -= m * xgtg; - *(here->BSIM3GbPtr) -= m * xgtb; - *(here->BSIM3GdpPtr) -= m * xgtd; - *(here->BSIM3GspPtr) -= m * xgts; - - if (here->BSIM3nqsMod) { - *(here->BSIM3QqPtr +1) += m * (omega * ScalingFactor); - *(here->BSIM3QgPtr +1) -= m * xcqgb; - *(here->BSIM3QdpPtr +1) -= m * xcqdb; - *(here->BSIM3QspPtr +1) -= m * xcqsb; - *(here->BSIM3QbPtr +1) -= m * xcqbb; - - *(here->BSIM3QqPtr) += m * here->BSIM3gtau; - - *(here->BSIM3DPqPtr) += m * (dxpart * here->BSIM3gtau); - *(here->BSIM3SPqPtr) += m * (sxpart * here->BSIM3gtau); - *(here->BSIM3GqPtr) -= m * here->BSIM3gtau; - - *(here->BSIM3QgPtr) += m * xgtg; - *(here->BSIM3QdpPtr) += m * xgtd; - *(here->BSIM3QspPtr) += m * xgts; - *(here->BSIM3QbPtr) += m * xgtb; - } - } - } - return(OK); + } + return (OK); } - diff --git a/src/spicelib/devices/bsim3/b3ask.c b/src/spicelib/devices/bsim3/b3ask.c index 16c903c67..51765869b 100644 --- a/src/spicelib/devices/bsim3/b3ask.c +++ b/src/spicelib/devices/bsim3/b3ask.c @@ -1,13 +1,24 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -File: b3ask.c -**********/ + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3ask.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng and Mansun Chan + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified bt Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + + +/*************************************/ #include "ngspice.h" -#include -#include #include "ifsim.h" #include "cktdefs.h" #include "devdefs.h" @@ -16,213 +27,209 @@ File: b3ask.c #include "suffix.h" int -BSIM3ask(ckt,inst,which,value,select) -CKTcircuit *ckt; -GENinstance *inst; -int which; -IFvalue *value; -IFvalue *select; +BSIM3ask (CKTcircuit * ckt, GENinstance * inst, int which, IFvalue * value, + IFvalue * select) { -BSIM3instance *here = (BSIM3instance*)inst; + BSIM3instance *here = (BSIM3instance *) inst; - switch(which) - { case BSIM3_L: - value->rValue = here->BSIM3l; - return(OK); - case BSIM3_W: - value->rValue = here->BSIM3w; - return(OK); - case BSIM3_M: - value->rValue = here->BSIM3m; - return(OK); - case BSIM3_AS: - value->rValue = here->BSIM3sourceArea; - return(OK); - case BSIM3_AD: - value->rValue = here->BSIM3drainArea; - return(OK); - case BSIM3_PS: - value->rValue = here->BSIM3sourcePerimeter; - return(OK); - case BSIM3_PD: - value->rValue = here->BSIM3drainPerimeter; - return(OK); - case BSIM3_NRS: - value->rValue = here->BSIM3sourceSquares; - return(OK); - case BSIM3_NRD: - value->rValue = here->BSIM3drainSquares; - return(OK); - case BSIM3_OFF: - value->rValue = here->BSIM3off; - return(OK); - case BSIM3_NQSMOD: - value->iValue = here->BSIM3nqsMod; - return(OK); - case BSIM3_IC_VBS: - value->rValue = here->BSIM3icVBS; - return(OK); - case BSIM3_IC_VDS: - value->rValue = here->BSIM3icVDS; - return(OK); - case BSIM3_IC_VGS: - value->rValue = here->BSIM3icVGS; - return(OK); - case BSIM3_DNODE: - value->iValue = here->BSIM3dNode; - return(OK); - case BSIM3_GNODE: - value->iValue = here->BSIM3gNode; - return(OK); - case BSIM3_SNODE: - value->iValue = here->BSIM3sNode; - return(OK); - case BSIM3_BNODE: - value->iValue = here->BSIM3bNode; - return(OK); - case BSIM3_DNODEPRIME: - value->iValue = here->BSIM3dNodePrime; - return(OK); - case BSIM3_SNODEPRIME: - value->iValue = here->BSIM3sNodePrime; - return(OK); - case BSIM3_SOURCECONDUCT: - value->rValue = here->BSIM3sourceConductance; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_DRAINCONDUCT: - value->rValue = here->BSIM3drainConductance; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_VBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3vbd); - return(OK); - case BSIM3_VBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3vbs); - return(OK); - case BSIM3_VGS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3vgs); - return(OK); - case BSIM3_VDS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3vds); - return(OK); - case BSIM3_CD: - value->rValue = here->BSIM3cd; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CBS: - value->rValue = here->BSIM3cbs; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CBD: - value->rValue = here->BSIM3cbd; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_GM: - value->rValue = here->BSIM3gm; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_GDS: - value->rValue = here->BSIM3gds; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_GMBS: - value->rValue = here->BSIM3gmbs; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_GBD: - value->rValue = here->BSIM3gbd; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_GBS: - value->rValue = here->BSIM3gbs; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_QB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qb); - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CQB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3cqb); - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_QG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qg); - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CQG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3cqg); - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_QD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qd); - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CQD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3cqd); - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CGG: - value->rValue = here->BSIM3cggb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CGD: - value->rValue = here->BSIM3cgdb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CGS: - value->rValue = here->BSIM3cgsb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CDG: - value->rValue = here->BSIM3cdgb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CDD: - value->rValue = here->BSIM3cddb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CDS: - value->rValue = here->BSIM3cdsb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CBG: - value->rValue = here->BSIM3cbgb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CBDB: - value->rValue = here->BSIM3cbdb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CBSB: - value->rValue = here->BSIM3cbsb; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CAPBD: - value->rValue = here->BSIM3capbd; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_CAPBS: - value->rValue = here->BSIM3capbs; - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_VON: - value->rValue = here->BSIM3von; - return(OK); - case BSIM3_VDSAT: - value->rValue = here->BSIM3vdsat; - return(OK); - case BSIM3_QBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qbs); - value->rValue *= here->BSIM3m; - return(OK); - case BSIM3_QBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3qbd); - value->rValue *= here->BSIM3m; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ + switch (which) + { + case BSIM3_L: + value->rValue = here->BSIM3l; + return (OK); + case BSIM3_W: + value->rValue = here->BSIM3w; + return (OK); + case BSIM3_M: + value->rValue = here->BSIM3m; + return (OK); + case BSIM3_AS: + value->rValue = here->BSIM3sourceArea; + return (OK); + case BSIM3_AD: + value->rValue = here->BSIM3drainArea; + return (OK); + case BSIM3_PS: + value->rValue = here->BSIM3sourcePerimeter; + return (OK); + case BSIM3_PD: + value->rValue = here->BSIM3drainPerimeter; + return (OK); + case BSIM3_NRS: + value->rValue = here->BSIM3sourceSquares; + return (OK); + case BSIM3_NRD: + value->rValue = here->BSIM3drainSquares; + return (OK); + case BSIM3_OFF: + value->rValue = here->BSIM3off; + return (OK); + case BSIM3_NQSMOD: + value->iValue = here->BSIM3nqsMod; + return (OK); + case BSIM3_IC_VBS: + value->rValue = here->BSIM3icVBS; + return (OK); + case BSIM3_IC_VDS: + value->rValue = here->BSIM3icVDS; + return (OK); + case BSIM3_IC_VGS: + value->rValue = here->BSIM3icVGS; + return (OK); + case BSIM3_DNODE: + value->iValue = here->BSIM3dNode; + return (OK); + case BSIM3_GNODE: + value->iValue = here->BSIM3gNode; + return (OK); + case BSIM3_SNODE: + value->iValue = here->BSIM3sNode; + return (OK); + case BSIM3_BNODE: + value->iValue = here->BSIM3bNode; + return (OK); + case BSIM3_DNODEPRIME: + value->iValue = here->BSIM3dNodePrime; + return (OK); + case BSIM3_SNODEPRIME: + value->iValue = here->BSIM3sNodePrime; + return (OK); + case BSIM3_SOURCECONDUCT: + value->rValue = here->BSIM3sourceConductance; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_DRAINCONDUCT: + value->rValue = here->BSIM3drainConductance; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_VBD: + value->rValue = *(ckt->CKTstate0 + here->BSIM3vbd); + return (OK); + case BSIM3_VBS: + value->rValue = *(ckt->CKTstate0 + here->BSIM3vbs); + return (OK); + case BSIM3_VGS: + value->rValue = *(ckt->CKTstate0 + here->BSIM3vgs); + return (OK); + case BSIM3_VDS: + value->rValue = *(ckt->CKTstate0 + here->BSIM3vds); + return (OK); + case BSIM3_CD: + value->rValue = here->BSIM3cd; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CBS: + value->rValue = here->BSIM3cbs; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CBD: + value->rValue = here->BSIM3cbd; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_GM: + value->rValue = here->BSIM3gm; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_GDS: + value->rValue = here->BSIM3gds; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_GMBS: + value->rValue = here->BSIM3gmbs; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_GBD: + value->rValue = here->BSIM3gbd; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_GBS: + value->rValue = here->BSIM3gbs; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_QB: + value->rValue = *(ckt->CKTstate0 + here->BSIM3qb); + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CQB: + value->rValue = *(ckt->CKTstate0 + here->BSIM3cqb); + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_QG: + value->rValue = *(ckt->CKTstate0 + here->BSIM3qg); + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CQG: + value->rValue = *(ckt->CKTstate0 + here->BSIM3cqg); + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_QD: + value->rValue = *(ckt->CKTstate0 + here->BSIM3qd); + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CQD: + value->rValue = *(ckt->CKTstate0 + here->BSIM3cqd); + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CGG: + value->rValue = here->BSIM3cggb; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CGD: + value->rValue = here->BSIM3cgdb; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CGS: + value->rValue = here->BSIM3cgsb; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CDG: + value->rValue = here->BSIM3cdgb; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CDD: + value->rValue = here->BSIM3cddb; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CDS: + value->rValue = here->BSIM3cdsb; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CBG: + value->rValue = here->BSIM3cbgb; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CBDB: + value->rValue = here->BSIM3cbdb; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CBSB: + value->rValue = here->BSIM3cbsb; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CAPBD: + value->rValue = here->BSIM3capbd; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_CAPBS: + value->rValue = here->BSIM3capbs; + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_VON: + value->rValue = here->BSIM3von; + return (OK); + case BSIM3_VDSAT: + value->rValue = here->BSIM3vdsat; + return (OK); + case BSIM3_QBS: + value->rValue = *(ckt->CKTstate0 + here->BSIM3qbs); + value->rValue *= here->BSIM3m; + return (OK); + case BSIM3_QBD: + value->rValue = *(ckt->CKTstate0 + here->BSIM3qbd); + value->rValue *= here->BSIM3m; + return (OK); + default: + return (E_BADPARM); + } + /* NOTREACHED */ } - diff --git a/src/spicelib/devices/bsim3/b3check.c b/src/spicelib/devices/bsim3/b3check.c index 5275c823d..894668adf 100644 --- a/src/spicelib/devices/bsim3/b3check.c +++ b/src/spicelib/devices/bsim3/b3check.c @@ -1,13 +1,25 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: Min-Chie Jeng. -Author: 1997-1999 Weidong Liu. -File: b3check.c -**********/ + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3check.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Xuemei Xi, 10/05, 12/14, 2001. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + + +/*************************************/ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "bsim3def.h" #include "trandefs.h" @@ -17,414 +29,561 @@ File: b3check.c #include "suffix.h" int -BSIM3checkModel(model, here, ckt) -BSIM3model *model; -BSIM3instance *here; -CKTcircuit *ckt; +BSIM3checkModel (BSIM3model * model, BSIM3instance * here, CKTcircuit * ckt) { -struct bsim3SizeDependParam *pParam; -int Fatal_Flag = 0; -FILE *fplog; - - if ((fplog = fopen("b3v3check.log", "w")) != NULL) - { pParam = here->pParam; - fprintf(fplog, "BSIM3v3.2.2 Parameter Checking.\n"); - if (strcmp(model->BSIM3version, "3.2.2")) - { fprintf(fplog, "Warning: This model is BSIM3v3.2.2; you specified a wrong version number.\n"); - printf("Warning: This model is BSIM3v3.2.2; you specified a wrong version number.\n"); - } - fprintf(fplog, "Model = %s\n", model->BSIM3modName); - - if (pParam->BSIM3nlx < -pParam->BSIM3leff) - { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3nlx); - printf("Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3nlx); - Fatal_Flag = 1; - } - - if (model->BSIM3tox <= 0.0) - { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", - model->BSIM3tox); - printf("Fatal: Tox = %g is not positive.\n", model->BSIM3tox); - Fatal_Flag = 1; - } + struct bsim3SizeDependParam *pParam; + int Fatal_Flag = 0; + FILE *fplog; - if (model->BSIM3toxm <= 0.0) - { fprintf(fplog, "Fatal: Toxm = %g is not positive.\n", - model->BSIM3toxm); - printf("Fatal: Toxm = %g is not positive.\n", model->BSIM3toxm); - Fatal_Flag = 1; - } - - if (pParam->BSIM3npeak <= 0.0) - { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", - pParam->BSIM3npeak); - printf("Fatal: Nch = %g is not positive.\n", - pParam->BSIM3npeak); - Fatal_Flag = 1; - } - if (pParam->BSIM3nsub <= 0.0) - { fprintf(fplog, "Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3nsub); - printf("Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3nsub); - Fatal_Flag = 1; - } - if (pParam->BSIM3ngate < 0.0) - { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", - pParam->BSIM3ngate); - printf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->BSIM3ngate); - Fatal_Flag = 1; - } - if (pParam->BSIM3ngate > 1.e25) - { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", - pParam->BSIM3ngate); - printf("Fatal: Ngate = %g Ngate is too high\n", - pParam->BSIM3ngate); - Fatal_Flag = 1; - } - if (pParam->BSIM3xj <= 0.0) - { fprintf(fplog, "Fatal: Xj = %g is not positive.\n", - pParam->BSIM3xj); - printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM3xj); - Fatal_Flag = 1; - } + if ((fplog = fopen ("b3v3check.log", "w")) != NULL) + { + pParam = here->pParam; - if (pParam->BSIM3dvt1 < 0.0) - { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", - pParam->BSIM3dvt1); - printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM3dvt1); - Fatal_Flag = 1; - } - - if (pParam->BSIM3dvt1w < 0.0) - { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", - pParam->BSIM3dvt1w); - printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM3dvt1w); - Fatal_Flag = 1; - } - - if (pParam->BSIM3w0 == -pParam->BSIM3weff) - { fprintf(fplog, "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; - } - - if (pParam->BSIM3dsub < 0.0) - { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub); - printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3dsub); - Fatal_Flag = 1; - } - if (pParam->BSIM3b1 == -pParam->BSIM3weff) - { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; - } - if (pParam->BSIM3u0temp <= 0.0) - { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3u0temp); - printf("Fatal: u0 at current temperature = %g is not positive.\n", - pParam->BSIM3u0temp); - Fatal_Flag = 1; - } - -/* Check delta parameter */ - if (pParam->BSIM3delta < 0.0) - { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", - pParam->BSIM3delta); - printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM3delta); - Fatal_Flag = 1; - } - - if (pParam->BSIM3vsattemp <= 0.0) - { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3vsattemp); - printf("Fatal: Vsat at current temperature = %g is not positive.\n", - pParam->BSIM3vsattemp); - Fatal_Flag = 1; - } + fprintf (fplog, + "BSIM3v3.2 Model (Supports: v3.2 and v3.2.{2,3,4}.\n"); + fprintf (fplog, "Parameter Checking.\n"); + fprintf (fplog, "Model = %s\n", model->BSIM3modName); + fprintf (fplog, "W = %g, L = %g, M = %g\n", here->BSIM3w, + here->BSIM3l, here->BSIM3m); + + if ((strcmp (model->BSIM3version, "3.2.4")) + && (strcmp (model->BSIM3version, "3.2.3")) + && (strcmp (model->BSIM3version, "3.2.2")) + && (strcmp (model->BSIM3version, "3.2"))) + { + fprintf (fplog, + "Warning: This model supports BSIM3v3.2 and BSIM3v3.{2,3,4}\n"); + fprintf (fplog, + "You specified a wrong version number.\n."); + printf ("Warning: This model supports BSIM3v3.2 and BSIM3v3.{2,3,4}\n"); + printf ("You specified a wrong version number.\n."); + } + + if (pParam->BSIM3nlx < -pParam->BSIM3leff) + { + fprintf (fplog, + "Fatal: Nlx = %g is less than -Leff.\n", + pParam->BSIM3nlx); + printf ("Fatal: Nlx = %g is less than -Leff.\n", + pParam->BSIM3nlx); + Fatal_Flag = 1; + } + + if (model->BSIM3tox <= 0.0) + { + fprintf (fplog, "Fatal: Tox = %g is not positive.\n", + model->BSIM3tox); + printf ("Fatal: Tox = %g is not positive.\n", + model->BSIM3tox); + Fatal_Flag = 1; + } + + if (model->BSIM3toxm <= 0.0) + { + fprintf (fplog, "Fatal: Toxm = %g is not positive.\n", + model->BSIM3toxm); + printf ("Fatal: Toxm = %g is not positive.\n", + model->BSIM3toxm); + Fatal_Flag = 1; + } + + if (pParam->BSIM3npeak <= 0.0) + { + fprintf (fplog, "Fatal: Nch = %g is not positive.\n", + pParam->BSIM3npeak); + printf ("Fatal: Nch = %g is not positive.\n", + pParam->BSIM3npeak); + Fatal_Flag = 1; + } + if (pParam->BSIM3nsub <= 0.0) + { + fprintf (fplog, "Fatal: Nsub = %g is not positive.\n", + pParam->BSIM3nsub); + printf ("Fatal: Nsub = %g is not positive.\n", + pParam->BSIM3nsub); + Fatal_Flag = 1; + } + if (pParam->BSIM3ngate < 0.0) + { + fprintf (fplog, + "Fatal: Ngate = %g is not positive.\n", + pParam->BSIM3ngate); + printf ("Fatal: Ngate = %g Ngate is not positive.\n", + pParam->BSIM3ngate); + Fatal_Flag = 1; + } + if (pParam->BSIM3ngate > 1.e25) + { + fprintf (fplog, "Fatal: Ngate = %g is too high.\n", + pParam->BSIM3ngate); + printf ("Fatal: Ngate = %g Ngate is too high\n", + pParam->BSIM3ngate); + Fatal_Flag = 1; + } + if (pParam->BSIM3xj <= 0.0) + { + fprintf (fplog, "Fatal: Xj = %g is not positive.\n", + pParam->BSIM3xj); + printf ("Fatal: Xj = %g is not positive.\n", + pParam->BSIM3xj); + Fatal_Flag = 1; + } + + if (pParam->BSIM3dvt1 < 0.0) + { + fprintf (fplog, "Fatal: Dvt1 = %g is negative.\n", + pParam->BSIM3dvt1); + printf ("Fatal: Dvt1 = %g is negative.\n", + pParam->BSIM3dvt1); + Fatal_Flag = 1; + } + + if (pParam->BSIM3dvt1w < 0.0) + { + fprintf (fplog, "Fatal: Dvt1w = %g is negative.\n", + pParam->BSIM3dvt1w); + printf ("Fatal: Dvt1w = %g is negative.\n", + pParam->BSIM3dvt1w); + Fatal_Flag = 1; + } + + if (pParam->BSIM3w0 == -pParam->BSIM3weff) + { + fprintf (fplog, + "Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); + printf ("Fatal: (W0 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; + } + + if (pParam->BSIM3dsub < 0.0) + { + fprintf (fplog, "Fatal: Dsub = %g is negative.\n", + pParam->BSIM3dsub); + printf ("Fatal: Dsub = %g is negative.\n", + pParam->BSIM3dsub); + Fatal_Flag = 1; + } + if (pParam->BSIM3b1 == -pParam->BSIM3weff) + { + fprintf (fplog, + "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + printf ("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; + } + if (pParam->BSIM3u0temp <= 0.0) + { + fprintf (fplog, + "Fatal: u0 at current temperature = %g is not positive.\n", + pParam->BSIM3u0temp); + printf ("Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3u0temp); + Fatal_Flag = 1; + } + +/* Check delta parameter */ + if (pParam->BSIM3delta < 0.0) + { + fprintf (fplog, + "Fatal: Delta = %g is less than zero.\n", + pParam->BSIM3delta); + printf ("Fatal: Delta = %g is less than zero.\n", + pParam->BSIM3delta); + Fatal_Flag = 1; + } + + if (pParam->BSIM3vsattemp <= 0.0) + { + fprintf (fplog, + "Fatal: Vsat at current temperature = %g is not positive.\n", + pParam->BSIM3vsattemp); + printf ("Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3vsattemp); + Fatal_Flag = 1; + } /* Check Rout parameters */ - if (pParam->BSIM3pclm <= 0.0) - { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm); - printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3pclm); - Fatal_Flag = 1; - } + if (pParam->BSIM3pclm <= 0.0) + { + fprintf (fplog, "Fatal: Pclm = %g is not positive.\n", + pParam->BSIM3pclm); + printf ("Fatal: Pclm = %g is not positive.\n", + pParam->BSIM3pclm); + Fatal_Flag = 1; + } - if (pParam->BSIM3drout < 0.0) - { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM3drout); - printf("Fatal: Drout = %g is negative.\n", pParam->BSIM3drout); - Fatal_Flag = 1; - } + if (pParam->BSIM3drout < 0.0) + { + fprintf (fplog, "Fatal: Drout = %g is negative.\n", + pParam->BSIM3drout); + printf ("Fatal: Drout = %g is negative.\n", + pParam->BSIM3drout); + Fatal_Flag = 1; + } - if (pParam->BSIM3pscbe2 <= 0.0) - { fprintf(fplog, "Warning: Pscbe2 = %g is not positive.\n", - pParam->BSIM3pscbe2); - printf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM3pscbe2); - } - - if (model->BSIM3unitLengthSidewallJctCap > 0.0 || - model->BSIM3unitLengthGateSidewallJctCap > 0.0) - { - if (here->BSIM3drainPerimeter < pParam->BSIM3weff) - { fprintf(fplog, "Warning: Pd = %g is less than W.\n", - here->BSIM3drainPerimeter); - printf("Warning: Pd = %g is less than W.\n", - here->BSIM3drainPerimeter); - } - if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) - { fprintf(fplog, "Warning: Ps = %g is less than W.\n", - here->BSIM3sourcePerimeter); - printf("Warning: Ps = %g is less than W.\n", - here->BSIM3sourcePerimeter); - } - } - - if (pParam->BSIM3noff < 0.1) - { fprintf(fplog, "Warning: Noff = %g is too small.\n", - pParam->BSIM3noff); - printf("Warning: Noff = %g is too small.\n", pParam->BSIM3noff); - } - if (pParam->BSIM3noff > 4.0) - { fprintf(fplog, "Warning: Noff = %g is too large.\n", - pParam->BSIM3noff); - printf("Warning: Noff = %g is too large.\n", pParam->BSIM3noff); - } - - if (pParam->BSIM3voffcv < -0.5) - { fprintf(fplog, "Warning: Voffcv = %g is too small.\n", - pParam->BSIM3voffcv); - printf("Warning: Voffcv = %g is too small.\n", pParam->BSIM3voffcv); - } - if (pParam->BSIM3voffcv > 0.5) - { fprintf(fplog, "Warning: Voffcv = %g is too large.\n", - pParam->BSIM3voffcv); - printf("Warning: Voffcv = %g is too large.\n", pParam->BSIM3voffcv); - } - - if (model->BSIM3ijth < 0.0) - { fprintf(fplog, "Fatal: Ijth = %g cannot be negative.\n", - model->BSIM3ijth); - printf("Fatal: Ijth = %g cannot be negative.\n", model->BSIM3ijth); - Fatal_Flag = 1; - } + if (pParam->BSIM3pscbe2 <= 0.0) + { + fprintf (fplog, + "Warning: Pscbe2 = %g is not positive.\n", + pParam->BSIM3pscbe2); + printf ("Warning: Pscbe2 = %g is not positive.\n", + pParam->BSIM3pscbe2); + } + + if (model->BSIM3unitLengthSidewallJctCap > 0.0 || + model->BSIM3unitLengthGateSidewallJctCap > 0.0) + { + if (here->BSIM3drainPerimeter < pParam->BSIM3weff) + { + fprintf (fplog, + "Warning: Pd = %g is less than W.\n", + here->BSIM3drainPerimeter); + printf ("Warning: Pd = %g is less than W.\n", + here->BSIM3drainPerimeter); + } + if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) + { + fprintf (fplog, + "Warning: Ps = %g is less than W.\n", + here->BSIM3sourcePerimeter); + printf ("Warning: Ps = %g is less than W.\n", + here->BSIM3sourcePerimeter); + } + } + + if (pParam->BSIM3noff < 0.1) + { + fprintf (fplog, "Warning: Noff = %g is too small.\n", + pParam->BSIM3noff); + printf ("Warning: Noff = %g is too small.\n", + pParam->BSIM3noff); + } + if (pParam->BSIM3noff > 4.0) + { + fprintf (fplog, "Warning: Noff = %g is too large.\n", + pParam->BSIM3noff); + printf ("Warning: Noff = %g is too large.\n", + pParam->BSIM3noff); + } + + if (pParam->BSIM3voffcv < -0.5) + { + fprintf (fplog, + "Warning: Voffcv = %g is too small.\n", + pParam->BSIM3voffcv); + printf ("Warning: Voffcv = %g is too small.\n", + pParam->BSIM3voffcv); + } + if (pParam->BSIM3voffcv > 0.5) + { + fprintf (fplog, + "Warning: Voffcv = %g is too large.\n", + pParam->BSIM3voffcv); + printf ("Warning: Voffcv = %g is too large.\n", + pParam->BSIM3voffcv); + } + + if (model->BSIM3ijth < 0.0) + { + fprintf (fplog, + "Fatal: Ijth = %g cannot be negative.\n", + model->BSIM3ijth); + printf ("Fatal: Ijth = %g cannot be negative.\n", + model->BSIM3ijth); + Fatal_Flag = 1; + } /* Check capacitance parameters */ - if (pParam->BSIM3clc < 0.0) - { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM3clc); - printf("Fatal: Clc = %g is negative.\n", pParam->BSIM3clc); - Fatal_Flag = 1; - } - - if (pParam->BSIM3moin < 5.0) - { fprintf(fplog, "Warning: Moin = %g is too small.\n", - pParam->BSIM3moin); - printf("Warning: Moin = %g is too small.\n", pParam->BSIM3moin); - } - if (pParam->BSIM3moin > 25.0) - { fprintf(fplog, "Warning: Moin = %g is too large.\n", - pParam->BSIM3moin); - printf("Warning: Moin = %g is too large.\n", pParam->BSIM3moin); - } - - if (pParam->BSIM3acde < 0.4) - { fprintf(fplog, "Warning: Acde = %g is too small.\n", - pParam->BSIM3acde); - printf("Warning: Acde = %g is too small.\n", pParam->BSIM3acde); - } - if (pParam->BSIM3acde > 1.6) - { fprintf(fplog, "Warning: Acde = %g is too large.\n", - pParam->BSIM3acde); - printf("Warning: Acde = %g is too large.\n", pParam->BSIM3acde); - } - - if (model->BSIM3paramChk ==1) - { -/* Check L and W parameters */ - if (pParam->BSIM3leff <= 5.0e-8) - { fprintf(fplog, "Warning: Leff = %g may be too small.\n", - pParam->BSIM3leff); - printf("Warning: Leff = %g may be too small.\n", - pParam->BSIM3leff); - } - - if (pParam->BSIM3leffCV <= 5.0e-8) - { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", - pParam->BSIM3leffCV); - printf("Warning: Leff for CV = %g may be too small.\n", - pParam->BSIM3leffCV); - } - - if (pParam->BSIM3weff <= 1.0e-7) - { fprintf(fplog, "Warning: Weff = %g may be too small.\n", - pParam->BSIM3weff); - printf("Warning: Weff = %g may be too small.\n", - pParam->BSIM3weff); - } - - if (pParam->BSIM3weffCV <= 1.0e-7) - { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", - pParam->BSIM3weffCV); - printf("Warning: Weff for CV = %g may be too small.\n", - pParam->BSIM3weffCV); - } - + if (pParam->BSIM3clc < 0.0) + { + fprintf (fplog, "Fatal: Clc = %g is negative.\n", + pParam->BSIM3clc); + printf ("Fatal: Clc = %g is negative.\n", + pParam->BSIM3clc); + Fatal_Flag = 1; + } + + if (pParam->BSIM3moin < 5.0) + { + fprintf (fplog, "Warning: Moin = %g is too small.\n", + pParam->BSIM3moin); + printf ("Warning: Moin = %g is too small.\n", + pParam->BSIM3moin); + } + if (pParam->BSIM3moin > 25.0) + { + fprintf (fplog, "Warning: Moin = %g is too large.\n", + pParam->BSIM3moin); + printf ("Warning: Moin = %g is too large.\n", + pParam->BSIM3moin); + } + + if (model->BSIM3capMod == 3) + { + if (pParam->BSIM3acde < 0.4) + { + fprintf (fplog, + "Warning: Acde = %g is too small.\n", + pParam->BSIM3acde); + printf ("Warning: Acde = %g is too small.\n", + pParam->BSIM3acde); + } + if (pParam->BSIM3acde > 1.6) + { + fprintf (fplog, + "Warning: Acde = %g is too large.\n", + pParam->BSIM3acde); + printf ("Warning: Acde = %g is too large.\n", + pParam->BSIM3acde); + } + } + + if (model->BSIM3paramChk == 1) + { +/* Check L and W parameters */ + if (pParam->BSIM3leff <= 5.0e-8) + { + fprintf (fplog, + "Warning: Leff = %g may be too small.\n", + pParam->BSIM3leff); + printf ("Warning: Leff = %g may be too small.\n", pParam->BSIM3leff); + } + + if (pParam->BSIM3leffCV <= 5.0e-8) + { + fprintf (fplog, + "Warning: Leff for CV = %g may be too small.\n", + pParam->BSIM3leffCV); + printf ("Warning: Leff for CV = %g may be too small.\n", pParam->BSIM3leffCV); + } + + if (pParam->BSIM3weff <= 1.0e-7) + { + fprintf (fplog, + "Warning: Weff = %g may be too small.\n", + pParam->BSIM3weff); + printf ("Warning: Weff = %g may be too small.\n", pParam->BSIM3weff); + } + + if (pParam->BSIM3weffCV <= 1.0e-7) + { + fprintf (fplog, + "Warning: Weff for CV = %g may be too small.\n", + pParam->BSIM3weffCV); + printf ("Warning: Weff for CV = %g may be too small.\n", pParam->BSIM3weffCV); + } + /* Check threshold voltage parameters */ - if (pParam->BSIM3nlx < 0.0) - { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx); - printf("Warning: Nlx = %g is negative.\n", pParam->BSIM3nlx); - } - if (model->BSIM3tox < 1.0e-9) - { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", - model->BSIM3tox); - printf("Warning: Tox = %g is less than 10A.\n", model->BSIM3tox); - } - - if (pParam->BSIM3npeak <= 1.0e15) - { fprintf(fplog, "Warning: Nch = %g may be too small.\n", - pParam->BSIM3npeak); - printf("Warning: Nch = %g may be too small.\n", - pParam->BSIM3npeak); - } - else if (pParam->BSIM3npeak >= 1.0e21) - { fprintf(fplog, "Warning: Nch = %g may be too large.\n", - pParam->BSIM3npeak); - printf("Warning: Nch = %g may be too large.\n", - pParam->BSIM3npeak); - } + if (pParam->BSIM3nlx < 0.0) + { + fprintf (fplog, + "Warning: Nlx = %g is negative.\n", + pParam->BSIM3nlx); + printf ("Warning: Nlx = %g is negative.\n", + pParam->BSIM3nlx); + } + if (model->BSIM3tox < 1.0e-9) + { + fprintf (fplog, + "Warning: Tox = %g is less than 10A.\n", + model->BSIM3tox); + printf ("Warning: Tox = %g is less than 10A.\n", model->BSIM3tox); + } - if (pParam->BSIM3nsub <= 1.0e14) - { fprintf(fplog, "Warning: Nsub = %g may be too small.\n", - pParam->BSIM3nsub); - printf("Warning: Nsub = %g may be too small.\n", - pParam->BSIM3nsub); - } - else if (pParam->BSIM3nsub >= 1.0e21) - { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", - pParam->BSIM3nsub); - printf("Warning: Nsub = %g may be too large.\n", - pParam->BSIM3nsub); - } + if (pParam->BSIM3npeak <= 1.0e15) + { + fprintf (fplog, + "Warning: Nch = %g may be too small.\n", + pParam->BSIM3npeak); + printf ("Warning: Nch = %g may be too small.\n", pParam->BSIM3npeak); + } + else if (pParam->BSIM3npeak >= 1.0e21) + { + fprintf (fplog, + "Warning: Nch = %g may be too large.\n", + pParam->BSIM3npeak); + printf ("Warning: Nch = %g may be too large.\n", pParam->BSIM3npeak); + } - if ((pParam->BSIM3ngate > 0.0) && - (pParam->BSIM3ngate <= 1.e18)) - { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM3ngate); - printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM3ngate); - } - - if (pParam->BSIM3dvt0 < 0.0) - { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", - pParam->BSIM3dvt0); - printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM3dvt0); - } - - if (fabs(1.0e-6 / (pParam->BSIM3w0 + pParam->BSIM3weff)) > 10.0) - { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); - printf("Warning: (W0 + Weff) may be too small.\n"); - } + if (pParam->BSIM3nsub <= 1.0e14) + { + fprintf (fplog, + "Warning: Nsub = %g may be too small.\n", + pParam->BSIM3nsub); + printf ("Warning: Nsub = %g may be too small.\n", pParam->BSIM3nsub); + } + else if (pParam->BSIM3nsub >= 1.0e21) + { + fprintf (fplog, + "Warning: Nsub = %g may be too large.\n", + pParam->BSIM3nsub); + printf ("Warning: Nsub = %g may be too large.\n", pParam->BSIM3nsub); + } + + if ((pParam->BSIM3ngate > 0.0) && + (pParam->BSIM3ngate <= 1.e18)) + { + fprintf (fplog, + "Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->BSIM3ngate); + printf ("Warning: Ngate = %g is less than 1.E18cm^-3.\n", pParam->BSIM3ngate); + } + + if (pParam->BSIM3dvt0 < 0.0) + { + fprintf (fplog, + "Warning: Dvt0 = %g is negative.\n", + pParam->BSIM3dvt0); + printf ("Warning: Dvt0 = %g is negative.\n", + pParam->BSIM3dvt0); + } + + if (fabs + (1.0e-6 / (pParam->BSIM3w0 + pParam->BSIM3weff)) > + 10.0) + { + fprintf (fplog, + "Warning: (W0 + Weff) may be too small.\n"); + printf ("Warning: (W0 + Weff) may be too small.\n"); + } /* Check subthreshold parameters */ - if (pParam->BSIM3nfactor < 0.0) - { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", - pParam->BSIM3nfactor); - printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM3nfactor); - } - if (pParam->BSIM3cdsc < 0.0) - { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", - pParam->BSIM3cdsc); - printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM3cdsc); - } - if (pParam->BSIM3cdscd < 0.0) - { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", - pParam->BSIM3cdscd); - printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM3cdscd); - } + if (pParam->BSIM3nfactor < 0.0) + { + fprintf (fplog, + "Warning: Nfactor = %g is negative.\n", + pParam->BSIM3nfactor); + printf ("Warning: Nfactor = %g is negative.\n", pParam->BSIM3nfactor); + } + if (pParam->BSIM3cdsc < 0.0) + { + fprintf (fplog, + "Warning: Cdsc = %g is negative.\n", + pParam->BSIM3cdsc); + printf ("Warning: Cdsc = %g is negative.\n", + pParam->BSIM3cdsc); + } + if (pParam->BSIM3cdscd < 0.0) + { + fprintf (fplog, + "Warning: Cdscd = %g is negative.\n", + pParam->BSIM3cdscd); + printf ("Warning: Cdscd = %g is negative.\n", + pParam->BSIM3cdscd); + } /* Check DIBL parameters */ - if (pParam->BSIM3eta0 < 0.0) - { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", - pParam->BSIM3eta0); - printf("Warning: Eta0 = %g is negative.\n", pParam->BSIM3eta0); - } - -/* Check Abulk parameters */ - if (fabs(1.0e-6 / (pParam->BSIM3b1 + pParam->BSIM3weff)) > 10.0) - { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); - printf("Warning: (B1 + Weff) may be too small.\n"); - } - + if (pParam->BSIM3eta0 < 0.0) + { + fprintf (fplog, + "Warning: Eta0 = %g is negative.\n", + pParam->BSIM3eta0); + printf ("Warning: Eta0 = %g is negative.\n", + pParam->BSIM3eta0); + } + +/* Check Abulk parameters */ + if (fabs + (1.0e-6 / (pParam->BSIM3b1 + pParam->BSIM3weff)) > + 10.0) + { + fprintf (fplog, + "Warning: (B1 + Weff) may be too small.\n"); + printf ("Warning: (B1 + Weff) may be too small.\n"); + } + /* Check Saturation parameters */ - if (pParam->BSIM3a2 < 0.01) - { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3a2); - printf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->BSIM3a2); - pParam->BSIM3a2 = 0.01; - } - else if (pParam->BSIM3a2 > 1.0) - { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM3a2); - printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM3a2); - pParam->BSIM3a2 = 1.0; - pParam->BSIM3a1 = 0.0; + if (pParam->BSIM3a2 < 0.01) + { + fprintf (fplog, + "Warning: A2 = %g is too small. Set to 0.01.\n", + pParam->BSIM3a2); + printf ("Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3a2); + pParam->BSIM3a2 = 0.01; + } + else if (pParam->BSIM3a2 > 1.0) + { + fprintf (fplog, + "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->BSIM3a2); + printf ("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", pParam->BSIM3a2); + pParam->BSIM3a2 = 1.0; + pParam->BSIM3a1 = 0.0; - } + } - if (pParam->BSIM3rdsw < 0.0) - { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM3rdsw); - printf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM3rdsw); - pParam->BSIM3rdsw = 0.0; - pParam->BSIM3rds0 = 0.0; - } - else if ((pParam->BSIM3rds0 > 0.0) && (pParam->BSIM3rds0 < 0.001)) - { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->BSIM3rds0); - printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->BSIM3rds0); - pParam->BSIM3rds0 = 0.0; - } - if (pParam->BSIM3vsattemp < 1.0e3) - { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); - printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); - } + if (pParam->BSIM3rdsw < 0.0) + { + fprintf (fplog, + "Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->BSIM3rdsw); + printf ("Warning: Rdsw = %g is negative. Set to zero.\n", pParam->BSIM3rdsw); + pParam->BSIM3rdsw = 0.0; + pParam->BSIM3rds0 = 0.0; + } + else if ((pParam->BSIM3rds0 > 0.0) + && (pParam->BSIM3rds0 < 0.001)) + { + fprintf (fplog, + "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", + pParam->BSIM3rds0); + printf ("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", pParam->BSIM3rds0); + pParam->BSIM3rds0 = 0.0; + } + if (pParam->BSIM3vsattemp < 1.0e3) + { + fprintf (fplog, + "Warning: Vsat at current temperature = %g may be too small.\n", + pParam->BSIM3vsattemp); + printf ("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); + } + + if (pParam->BSIM3pdibl1 < 0.0) + { + fprintf (fplog, + "Warning: Pdibl1 = %g is negative.\n", + pParam->BSIM3pdibl1); + printf ("Warning: Pdibl1 = %g is negative.\n", + pParam->BSIM3pdibl1); + } + if (pParam->BSIM3pdibl2 < 0.0) + { + fprintf (fplog, + "Warning: Pdibl2 = %g is negative.\n", + pParam->BSIM3pdibl2); + printf ("Warning: Pdibl2 = %g is negative.\n", + pParam->BSIM3pdibl2); + } +/* Check overlap capacitance parameters */ + if (model->BSIM3cgdo < 0.0) + { + fprintf (fplog, + "Warning: cgdo = %g is negative. Set to zero.\n", + model->BSIM3cgdo); + printf ("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo); + model->BSIM3cgdo = 0.0; + } + if (model->BSIM3cgso < 0.0) + { + fprintf (fplog, + "Warning: cgso = %g is negative. Set to zero.\n", + model->BSIM3cgso); + printf ("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso); + model->BSIM3cgso = 0.0; + } + if (model->BSIM3cgbo < 0.0) + { + fprintf (fplog, + "Warning: cgbo = %g is negative. Set to zero.\n", + model->BSIM3cgbo); + printf ("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo); + model->BSIM3cgbo = 0.0; + } - if (pParam->BSIM3pdibl1 < 0.0) - { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", - pParam->BSIM3pdibl1); - printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM3pdibl1); + } /* loop for the parameter check for warning messages */ + fclose (fplog); } - if (pParam->BSIM3pdibl2 < 0.0) - { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", - pParam->BSIM3pdibl2); - printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM3pdibl2); + else + { + fprintf (stderr, + "Warning: Can't open log file. Parameter checking skipped.\n"); } -/* Check overlap capacitance parameters */ - if (model->BSIM3cgdo < 0.0) - { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo); - printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3cgdo); - model->BSIM3cgdo = 0.0; - } - if (model->BSIM3cgso < 0.0) - { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso); - printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3cgso); - model->BSIM3cgso = 0.0; - } - if (model->BSIM3cgbo < 0.0) - { fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo); - printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3cgbo); - model->BSIM3cgbo = 0.0; - } - - }/* loop for the parameter check for warning messages */ - fclose(fplog); - } - else - { fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n"); - } - - return(Fatal_Flag); -} + return (Fatal_Flag); +} diff --git a/src/spicelib/devices/bsim3/b3cvtest.c b/src/spicelib/devices/bsim3/b3cvtest.c index efc11d12b..9608e3038 100644 --- a/src/spicelib/devices/bsim3/b3cvtest.c +++ b/src/spicelib/devices/bsim3/b3cvtest.c @@ -1,13 +1,23 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -File: b3cvtest.c -**********/ + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3cvtest.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng and Mansun Chan + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + +/*************************************/ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "bsim3def.h" #include "trandefs.h" @@ -18,90 +28,111 @@ File: b3cvtest.c int -BSIM3convTest(inModel,ckt) -GENmodel *inModel; -CKTcircuit *ckt; +BSIM3convTest (GENmodel * inModel, CKTcircuit * ckt) { -BSIM3model *model = (BSIM3model*)inModel; -BSIM3instance *here; -double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; -double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; + BSIM3model *model = (BSIM3model *) inModel; + BSIM3instance *here; + double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; + double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; - /* loop through all the BSIM3 device models */ - for (; model != NULL; model = model->BSIM3nextModel) - { /* loop through all the instances of the model */ - for (here = model->BSIM3instances; here != NULL ; - here=here->BSIM3nextInstance) - { - if (here->BSIM3owner != ARCHme) continue; - vbs = model->BSIM3type - * (*(ckt->CKTrhsOld+here->BSIM3bNode) - - *(ckt->CKTrhsOld+here->BSIM3sNodePrime)); - vgs = model->BSIM3type - * (*(ckt->CKTrhsOld+here->BSIM3gNode) - - *(ckt->CKTrhsOld+here->BSIM3sNodePrime)); - vds = model->BSIM3type - * (*(ckt->CKTrhsOld+here->BSIM3dNodePrime) - - *(ckt->CKTrhsOld+here->BSIM3sNodePrime)); - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->BSIM3vgs) - - *(ckt->CKTstate0 + here->BSIM3vds); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3vgs); - delvds = vds - *(ckt->CKTstate0 + here->BSIM3vds); - delvgd = vgd-vgdo; + /* loop through all the BSIM3 device models */ + for (; model != NULL; model = model->BSIM3nextModel) + { /* loop through all the instances of the model */ + for (here = model->BSIM3instances; here != NULL; + here = here->BSIM3nextInstance) + { - cd = here->BSIM3cd - here->BSIM3cbd; - if (here->BSIM3mode >= 0) - { cd += here->BSIM3csub; - cdhat = cd - here->BSIM3gbd * delvbd - + (here->BSIM3gmbs + here->BSIM3gbbs) * delvbs - + (here->BSIM3gm + here->BSIM3gbgs) * delvgs - + (here->BSIM3gds + here->BSIM3gbds) * delvds; - } - else - { cdhat = cd + (here->BSIM3gmbs - here->BSIM3gbd) * delvbd - + here->BSIM3gm * delvgd - here->BSIM3gds * delvds; - } + if (here->BSIM3owner != ARCHme) + continue; - /* - * check convergence - */ - if ((here->BSIM3off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) - + ckt->CKTabstol; - if (fabs(cdhat - cd) >= tol) - { ckt->CKTnoncon++; - return(OK); - } - cbs = here->BSIM3cbs; - cbd = here->BSIM3cbd; - if (here->BSIM3mode >= 0) - { cbhat = cbs + cbd - here->BSIM3csub - + here->BSIM3gbd * delvbd - + (here->BSIM3gbs - here->BSIM3gbbs) * delvbs - - here->BSIM3gbgs * delvgs - - here->BSIM3gbds * delvds; - } - else - { cbhat = cbs + cbd - here->BSIM3csub - + here->BSIM3gbs * delvbs - + (here->BSIM3gbd - here->BSIM3gbbs) * delvbd - - here->BSIM3gbgs * delvgd - + here->BSIM3gbds * delvds; - } - tol = ckt->CKTreltol * MAX(fabs(cbhat), - fabs(cbs + cbd - here->BSIM3csub)) + ckt->CKTabstol; - if (fabs(cbhat - (cbs + cbd - here->BSIM3csub)) > tol) - { ckt->CKTnoncon++; - return(OK); - } - } - } - } - return(OK); -} + vbs = model->BSIM3type + * (*(ckt->CKTrhsOld + here->BSIM3bNode) + - *(ckt->CKTrhsOld + + here->BSIM3sNodePrime)); + vgs = model->BSIM3type * + (*(ckt->CKTrhsOld + here->BSIM3gNode) - + *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); + vds = model->BSIM3type * + (*(ckt->CKTrhsOld + here->BSIM3dNodePrime) - + *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); + vbd = vbs - vds; + vgd = vgs - vds; + vgdo = *(ckt->CKTstate0 + here->BSIM3vgs) + - *(ckt->CKTstate0 + here->BSIM3vds); + delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3vbs); + delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3vbd); + delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3vgs); + delvds = vds - *(ckt->CKTstate0 + here->BSIM3vds); + delvgd = vgd - vgdo; + cd = here->BSIM3cd - here->BSIM3cbd; + if (here->BSIM3mode >= 0) + { + cd += here->BSIM3csub; + cdhat = cd - here->BSIM3gbd * delvbd + + (here->BSIM3gmbs + + here->BSIM3gbbs) * delvbs + + (here->BSIM3gm + + here->BSIM3gbgs) * delvgs + + (here->BSIM3gds + + here->BSIM3gbds) * delvds; + } + else + { + cdhat = cd + (here->BSIM3gmbs - + here->BSIM3gbd) * delvbd + + here->BSIM3gm * delvgd - + here->BSIM3gds * delvds; + } + /* + * check convergence + */ + if ((here->BSIM3off == 0) + || (!(ckt->CKTmode & MODEINITFIX))) + { + tol = ckt->CKTreltol * MAX (fabs (cdhat), + fabs (cd)) + + ckt->CKTabstol; + if (fabs (cdhat - cd) >= tol) + { + ckt->CKTnoncon++; + return (OK); + } + cbs = here->BSIM3cbs; + cbd = here->BSIM3cbd; + if (here->BSIM3mode >= 0) + { + cbhat = cbs + cbd - here->BSIM3csub + + here->BSIM3gbd * delvbd + + (here->BSIM3gbs - + here->BSIM3gbbs) * delvbs - + here->BSIM3gbgs * delvgs - + here->BSIM3gbds * delvds; + } + else + { + cbhat = cbs + cbd - here->BSIM3csub + + here->BSIM3gbs * delvbs + + (here->BSIM3gbd - + here->BSIM3gbbs) * delvbd - + here->BSIM3gbgs * delvgd + + here->BSIM3gbds * delvds; + } + tol = ckt->CKTreltol * MAX (fabs (cbhat), + fabs (cbs + cbd - + here-> + BSIM3csub)) + + ckt->CKTabstol; + if (fabs + (cbhat - (cbs + cbd - here->BSIM3csub)) > + tol) + { + ckt->CKTnoncon++; + return (OK); + } + } + } + } + return (OK); +} diff --git a/src/spicelib/devices/bsim3/b3del.c b/src/spicelib/devices/bsim3/b3del.c index dd94259b8..14d8ec78b 100644 --- a/src/spicelib/devices/bsim3/b3del.c +++ b/src/spicelib/devices/bsim3/b3del.c @@ -1,14 +1,25 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -File: b3del.c -**********/ -/* + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3del.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng and Mansun Chan + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Xuemei Xi, 10/05, 12/14, 2001. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 */ + +/*************************************/ + #include "ngspice.h" -#include #include "bsim3def.h" #include "sperror.h" #include "gendefs.h" @@ -16,28 +27,27 @@ File: b3del.c int -BSIM3delete(inModel,name,inInst) -GENmodel *inModel; -IFuid name; -GENinstance **inInst; +BSIM3delete (GENmodel * inModel, IFuid name, GENinstance ** inInst) { -BSIM3instance **fast = (BSIM3instance**)inInst; -BSIM3model *model = (BSIM3model*)inModel; -BSIM3instance **prev = NULL; -BSIM3instance *here; + BSIM3instance **fast = (BSIM3instance **) inInst; + BSIM3model *model = (BSIM3model *) inModel; + BSIM3instance **prev = NULL; + BSIM3instance *here; - for (; model ; model = model->BSIM3nextModel) - { prev = &(model->BSIM3instances); - for (here = *prev; here ; here = *prev) - { if (here->BSIM3name == name || (fast && here==*fast)) - { *prev= here->BSIM3nextInstance; - FREE(here); - return(OK); - } - prev = &(here->BSIM3nextInstance); - } - } - return(E_NODEV); + for (; model; model = model->BSIM3nextModel) + { + prev = &(model->BSIM3instances); + for (here = *prev; here; here = *prev) + { + if (here->BSIM3name == name + || (fast && here == *fast)) + { + *prev = here->BSIM3nextInstance; + FREE (here); + return (OK); + } + prev = &(here->BSIM3nextInstance); + } + } + return (E_NODEV); } - - diff --git a/src/spicelib/devices/bsim3/b3dest.c b/src/spicelib/devices/bsim3/b3dest.c index 5fb8ab439..beaa097f9 100644 --- a/src/spicelib/devices/bsim3/b3dest.c +++ b/src/spicelib/devices/bsim3/b3dest.c @@ -1,39 +1,54 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -File: b3dest.c -**********/ + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3dest.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + + +/*************************************/ #include "ngspice.h" -#include #include "bsim3def.h" #include "suffix.h" void -BSIM3destroy(inModel) -GENmodel **inModel; +BSIM3destroy (GENmodel ** inModel) { -BSIM3model **model = (BSIM3model**)inModel; -BSIM3instance *here; -BSIM3instance *prev = NULL; -BSIM3model *mod = *model; -BSIM3model *oldmod = NULL; + BSIM3model **model = (BSIM3model **) inModel; + BSIM3instance *here; + BSIM3instance *prev = NULL; + BSIM3model *mod = *model; + BSIM3model *oldmod = NULL; - for (; mod ; mod = mod->BSIM3nextModel) - { if(oldmod) FREE(oldmod); - oldmod = mod; - prev = (BSIM3instance *)NULL; - for (here = mod->BSIM3instances; here; here = here->BSIM3nextInstance) - { if(prev) FREE(prev); - prev = here; - } - if(prev) FREE(prev); - } - if(oldmod) FREE(oldmod); - *model = NULL; - return; + for (; mod; mod = mod->BSIM3nextModel) + { + if (oldmod) + FREE (oldmod); + oldmod = mod; + prev = (BSIM3instance *) NULL; + for (here = mod->BSIM3instances; here; + here = here->BSIM3nextInstance) + { + if (prev) + FREE (prev); + prev = here; + } + if (prev) + FREE (prev); + } + if (oldmod) + FREE (oldmod); + *model = NULL; + return; } - - - diff --git a/src/spicelib/devices/bsim3/b3getic.c b/src/spicelib/devices/bsim3/b3getic.c index 69fe29c10..e64ab802b 100644 --- a/src/spicelib/devices/bsim3/b3getic.c +++ b/src/spicelib/devices/bsim3/b3getic.c @@ -1,12 +1,24 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -File: b3getic.c -**********/ + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3getic.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + + +/*************************************/ #include "ngspice.h" -#include #include "cktdefs.h" #include "bsim3def.h" #include "sperror.h" @@ -14,32 +26,39 @@ File: b3getic.c int -BSIM3getic(inModel,ckt) -GENmodel *inModel; -CKTcircuit *ckt; +BSIM3getic (GENmodel * inModel, CKTcircuit * ckt) { -BSIM3model *model = (BSIM3model*)inModel; -BSIM3instance *here; - - for (; model ; model = model->BSIM3nextModel) - { for (here = model->BSIM3instances; here; here = here->BSIM3nextInstance) - { - if (here->BSIM3owner != ARCHme) continue; - if(!here->BSIM3icVBSGiven) - { here->BSIM3icVBS = *(ckt->CKTrhs + here->BSIM3bNode) - - *(ckt->CKTrhs + here->BSIM3sNode); - } - if (!here->BSIM3icVDSGiven) - { here->BSIM3icVDS = *(ckt->CKTrhs + here->BSIM3dNode) - - *(ckt->CKTrhs + here->BSIM3sNode); - } - if (!here->BSIM3icVGSGiven) - { here->BSIM3icVGS = *(ckt->CKTrhs + here->BSIM3gNode) - - *(ckt->CKTrhs + here->BSIM3sNode); - } - } - } - return(OK); -} + BSIM3model *model = (BSIM3model *) inModel; + BSIM3instance *here; + + for (; model; model = model->BSIM3nextModel) + { + for (here = model->BSIM3instances; here; + here = here->BSIM3nextInstance) + { + if (here->BSIM3owner != ARCHme) + continue; + if (!here->BSIM3icVBSGiven) + { + here->BSIM3icVBS = + *(ckt->CKTrhs + here->BSIM3bNode) - + *(ckt->CKTrhs + here->BSIM3sNode); + } + if (!here->BSIM3icVDSGiven) + { + here->BSIM3icVDS = + *(ckt->CKTrhs + here->BSIM3dNode) - + *(ckt->CKTrhs + here->BSIM3sNode); + } + if (!here->BSIM3icVGSGiven) + { + here->BSIM3icVGS = + *(ckt->CKTrhs + here->BSIM3gNode) - + *(ckt->CKTrhs + here->BSIM3sNode); + } + } + } + return (OK); +} diff --git a/src/spicelib/devices/bsim3/b3ld.c b/src/spicelib/devices/bsim3/b3ld.c index 64b1c6198..b0ab9801e 100644 --- a/src/spicelib/devices/bsim3/b3ld.c +++ b/src/spicelib/devices/bsim3/b3ld.c @@ -1,15 +1,26 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1991 JianHui Huang and Min-Chie Jeng. -Modified by Mansun Chan (1995). -Author: 1997-1999 Weidong Liu. -Modified: 2000 AlansFixes -File: b3ld.c -**********/ + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3ld.c of BSIM3v3.2.4 + * Author: 1991 JianHui Huang and Min-Chie Jeng. + * Modified by Mansun Chan (1995). + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Xuemei Xi, 10/05, 12/21, 2001. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + + +/*************************************/ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "bsim3def.h" #include "trandefs.h" @@ -31,685 +42,886 @@ File: b3ld.c int -BSIM3load(inModel,ckt) -GENmodel *inModel; -CKTcircuit *ckt; +BSIM3load (GENmodel * inModel, CKTcircuit * ckt) { -BSIM3model *model = (BSIM3model*)inModel; -BSIM3instance *here; -double SourceSatCurrent, DrainSatCurrent; -double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst; -double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; -double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; -double delvbd, delvbs, delvds, delvgd, delvgs; -double Vfbeff, dVfbeff_dVg, dVfbeff_dVb, V3, V4; -double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb; -double gcsgb, gcssb, MJ, MJSW, MJSWG; -double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact; -double qgate, qbulk, qdrn, qsrc, qinoi, cqgate, cqbulk, cqdrn; -double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; -double Vgs_eff, Vfb; -double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd; -double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm; -double Vtm; -double n, dn_dVb, dn_dVd, voffcv, noff, dnoff_dVd, dnoff_dVb; -double ExpArg, V0, CoxWLcen, QovCox, LINK; -double DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dVd, dDeltaPhi_dVb; -double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb; -double Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVd, dCoxeff_dVb; -double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; -double ueff, dueff_dVg, dueff_dVd, dueff_dVb; -double Esat, Vdsat; -double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; -double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; -double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; -double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; -double T0, dT0_dVg, dT0_dVd, dT0_dVb; -double T1, dT1_dVg, dT1_dVd, dT1_dVb; -double T2, dT2_dVg, dT2_dVd, dT2_dVb; -double T3, dT3_dVg, dT3_dVd, dT3_dVb; - double T4; - double T5; - double T6; - double T7; - double T8; - double T9; - double T10; -double T11, T12; -double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; -double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; -double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; -double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb; -double Theta0, dTheta0_dVb; -double TempRatio, tmp1, tmp2, tmp3, tmp4; -double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; -double Idtot, Ibtot; -double tempv, a1, ScalingFactor; - -double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; -double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb; -double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; -double diffVds, dAbulk_dVg; -double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; -double gche, dgche_dVg, dgche_dVd, dgche_dVb; -double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb; -double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb; -double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb; -double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb; -double Ids, Gm, Gds, Gmb; -double Isub, Gbd, Gbg, Gbb; -double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb; -double CoxWovL; -double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; -double Vgst2Vtm, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb; -double Leff, Weff, dWeff_dVg, dWeff_dVb; -double AbulkCV, dAbulkCV_dVb; -double qgdo, qgso, cgdo, cgso; - -double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift; -double gcqdb, gcqsb, gcqgb, gcqbb; -double dxpart, sxpart, ggtg, ggtd, ggts, ggtb; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; - -double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; -double gbdpdp, gbdpg, gbdpb, gbdpsp; -double Cgg, Cgd, Cgb, Cdg, Cdd, Cds; -double Csg, Csd, Css, Csb, Cbg, Cbd, Cbb; -double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0; -double dQac0_dVg, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; - -double m; - -struct bsim3SizeDependParam *pParam; -int ByPass, Check, ChargeComputationNeeded, error; - -ScalingFactor = 1.0e-9; -ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; -for (; model != NULL; model = model->BSIM3nextModel) -{ for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) - { - if (here->BSIM3owner != ARCHme) continue; - Check = 1; - ByPass = 0; + BSIM3model *model = (BSIM3model *) inModel; + BSIM3instance *here; + double SourceSatCurrent, DrainSatCurrent; + double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst; + double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; + double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; + double delvbd, delvbs, delvds, delvgd, delvgs; + double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4; + double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb; + double gcsgb, gcssb, tol, MJ, MJSW, MJSWG; + double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact; + double qgate, qbulk, qdrn, qsrc, qinoi, cqgate, cqbulk, cqdrn; + double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; + double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVbs_dVb; + double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd; + double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm; + double Vgdt, Vgsaddvth, Vgsaddvth2, Vgsaddvth1o3, Vtm; + double n, dn_dVb, dn_dVd, voffcv, noff, dnoff_dVd, dnoff_dVb; + double ExpArg, ExpArg1, V0, CoxWLcen, QovCox, LINK; + double DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dVd, dDeltaPhi_dVb; + double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb; + double Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVd, dCoxeff_dVb; + double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; + double ueff, dueff_dVg, dueff_dVd, dueff_dVb; + double Esat, dEsat_dVg, dEsat_dVd, dEsat_dVb, Vdsat, Vdsat0; + double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; + double Ilimit, Iexp, dIexp_dVg, dIexp_dVd, dIexp_dVb; + double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; + double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, Va2, dVa_dVd, dVa_dVg, + dVa_dVb; + double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; + double Arg1, Arg2, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; + double dqbulk_dVb, dVgdt_dVg, dVgdt_dVd, dVgdt_dVb; + double T0, dT0_dVg, dT0_dVd, dT0_dVb; + double T1, dT1_dVg, dT1_dVd, dT1_dVb; + double T2, dT2_dVg, dT2_dVd, dT2_dVb; + double T3, dT3_dVg, dT3_dVd, dT3_dVb; + double T4, dT4_dVg, dT4_dVd, dT4_dVb; + double T5, dT5_dVg, dT5_dVd, dT5_dVb; + double T6, dT6_dVg, dT6_dVd, dT6_dVb; + double T7, dT7_dVg, dT7_dVd, dT7_dVb; + double T8, dT8_dVg, dT8_dVd, dT8_dVb; + double T9, dT9_dVg, dT9_dVd, dT9_dVb; + double T10, dT10_dVg, dT10_dVb, dT10_dVd; + double T11, T12; + double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; + double T100, T101; + double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; + double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; + double VAHCE, dVAHCE_dVg, dVAHCE_dVd, dVAHCE_dVb; + double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, + dDelt_vth_dVb; + double Theta0, dTheta0_dVb, Theta1, dTheta1_dVb; + double Thetarout, dThetarout_dVb, TempRatio, tmp1, tmp2, tmp3, tmp4; + double DIBL_Sft, dDIBL_Sft_dVd, DIBL_fact, Lambda, dLambda_dVg; + double Rout_Vgs_factor, dRout_Vgs_factor_dVg, dRout_Vgs_factor_dVb; + double dRout_Vgs_factor_dVd, Idtot, Ibtot; + double tempv, a1, ScalingFactor; + + double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; + double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb; + double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; + double diffVds, diffVdsCV, dAbulk_dVg; + double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; + double gche, dgche_dVg, dgche_dVd, dgche_dVb; + double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb; + double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb; + double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb; + double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb; + double Ids, Gm, Gds, Gmb; + double Isub, Isubd, Isubs, Gbd, Gbg, Gbb; + double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb; + double CoxWovL; + double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; + double Vgst2Vtm, VdsatCV, dVdsatCV_dVd, dVdsatCV_dVg, dVdsatCV_dVb; + double Leff, Weff, dWeff_dVg, dWeff_dVb; + double AbulkCV, dAbulkCV_dVb; + double qgdo, qgso, cgdo, cgso; + + double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift, csreq; + double gcqdb, gcqsb, gcqgb, gcqbb, vss; + double dxpart, sxpart, ggtg, ggtd, ggts, ggtb; + double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; + double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; + + double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; + double gbdpdp, gbdpg, gbdpb, gbdpsp; + double Cgg, Cgd, Cgs, Cgb, Cdg, Cdd, Cds, Cdb, Qg, Qd; + double Csg, Csd, Css, Csb, Cbg, Cbd, Cbs, Cbb, Qs, Qb; + double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1, Qac0, Qsub0; + double dQac0_dVg, dQac0_dVd, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; + + double m; + + struct bsim3SizeDependParam *pParam; + int ByPass, Check, ChargeComputationNeeded, J, error, I; + double junk[50]; + + ScalingFactor = 1.0e-9; + ChargeComputationNeeded = + ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || + ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) ? 1 : 0; + + for (; model != NULL; model = model->BSIM3nextModel) + { + for (here = model->BSIM3instances; here != NULL; + here = here->BSIM3nextInstance) + { + + if (here->BSIM3owner != ARCHme) + continue; + + Check = 1; + ByPass = 0; pParam = here->pParam; - if ((ckt->CKTmode & MODEINITSMSIG)) - { vbs = *(ckt->CKTstate0 + here->BSIM3vbs); - vgs = *(ckt->CKTstate0 + here->BSIM3vgs); - vds = *(ckt->CKTstate0 + here->BSIM3vds); - qdef = *(ckt->CKTstate0 + here->BSIM3qdef); - } + if ((ckt->CKTmode & MODEINITSMSIG)) + { + vbs = *(ckt->CKTstate0 + here->BSIM3vbs); + vgs = *(ckt->CKTstate0 + here->BSIM3vgs); + vds = *(ckt->CKTstate0 + here->BSIM3vds); + qdef = *(ckt->CKTstate0 + here->BSIM3qdef); + } else if ((ckt->CKTmode & MODEINITTRAN)) - { vbs = *(ckt->CKTstate1 + here->BSIM3vbs); - vgs = *(ckt->CKTstate1 + here->BSIM3vgs); - vds = *(ckt->CKTstate1 + here->BSIM3vds); - qdef = *(ckt->CKTstate1 + here->BSIM3qdef); - } + { + vbs = *(ckt->CKTstate1 + here->BSIM3vbs); + vgs = *(ckt->CKTstate1 + here->BSIM3vgs); + vds = *(ckt->CKTstate1 + here->BSIM3vds); + qdef = *(ckt->CKTstate1 + here->BSIM3qdef); + } else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM3off) - { vds = model->BSIM3type * here->BSIM3icVDS; - vgs = model->BSIM3type * here->BSIM3icVGS; - vbs = model->BSIM3type * here->BSIM3icVBS; - qdef = 0.0; - - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | - MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vbs = 0.0; - vgs = model->BSIM3type * pParam->BSIM3vth0 + 0.1; - vds = 0.1; - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->BSIM3off)) - { qdef = vbs = vgs = vds = 0.0; - } - else - { + { + vds = model->BSIM3type * here->BSIM3icVDS; + vgs = model->BSIM3type * here->BSIM3icVGS; + vbs = model->BSIM3type * here->BSIM3icVBS; + qdef = 0.0; + + if ((vds == 0.0) && (vgs == 0.0) + && (vbs == 0.0) + && + ((ckt-> + CKTmode & (MODETRAN | MODEAC | MODEDCOP | + MODEDCTRANCURVE)) + || (!(ckt->CKTmode & MODEUIC)))) + { + vbs = 0.0; + vgs = model->BSIM3type * pParam->BSIM3vth0 + 0.1; + vds = 0.1; + } + } + else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) + && (here->BSIM3off)) + { + qdef = vbs = vgs = vds = 0.0; + } + else + { #ifndef PREDICTOR - if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->BSIM3vbs) = - *(ckt->CKTstate1 + here->BSIM3vbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3vbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3vbs))); - *(ckt->CKTstate0 + here->BSIM3vgs) = - *(ckt->CKTstate1 + here->BSIM3vgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3vgs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3vgs))); - *(ckt->CKTstate0 + here->BSIM3vds) = - *(ckt->CKTstate1 + here->BSIM3vds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3vds)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3vds))); - *(ckt->CKTstate0 + here->BSIM3vbd) = - *(ckt->CKTstate0 + here->BSIM3vbs) - - *(ckt->CKTstate0 + here->BSIM3vds); - *(ckt->CKTstate0 + here->BSIM3qdef) = - *(ckt->CKTstate1 + here->BSIM3qdef); - qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3qdef)) - -(xfact * (*(ckt->CKTstate2 + here->BSIM3qdef))); - } - else - { + if ((ckt->CKTmode & MODEINITPRED)) + { + xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; + *(ckt->CKTstate0 + here->BSIM3vbs) = + *(ckt->CKTstate1 + here->BSIM3vbs); + vbs = (1.0 + + xfact) * (*(ckt->CKTstate1 + + here->BSIM3vbs)) - + (xfact * (*(ckt->CKTstate2 + here->BSIM3vbs))); + *(ckt->CKTstate0 + here->BSIM3vgs) = + *(ckt->CKTstate1 + here->BSIM3vgs); + vgs = (1.0 + + xfact) * (*(ckt->CKTstate1 + + here->BSIM3vgs)) - + (xfact * (*(ckt->CKTstate2 + here->BSIM3vgs))); + *(ckt->CKTstate0 + here->BSIM3vds) = + *(ckt->CKTstate1 + here->BSIM3vds); + vds = (1.0 + + xfact) * (*(ckt->CKTstate1 + + here->BSIM3vds)) - + (xfact * (*(ckt->CKTstate2 + here->BSIM3vds))); + *(ckt->CKTstate0 + here->BSIM3vbd) = + *(ckt->CKTstate0 + + here->BSIM3vbs) - *(ckt->CKTstate0 + here->BSIM3vds); + *(ckt->CKTstate0 + here->BSIM3qdef) = + *(ckt->CKTstate1 + here->BSIM3qdef); + qdef = (1.0 + + xfact) * (*(ckt->CKTstate1 + + here-> + BSIM3qdef)) - + (xfact * (*(ckt->CKTstate2 + here->BSIM3qdef))); + } + else + { #endif /* PREDICTOR */ - vbs = model->BSIM3type - * (*(ckt->CKTrhsOld + here->BSIM3bNode) - - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); - vgs = model->BSIM3type - * (*(ckt->CKTrhsOld + here->BSIM3gNode) - - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); - vds = model->BSIM3type - * (*(ckt->CKTrhsOld + here->BSIM3dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); - qdef = model->BSIM3type - * (*(ckt->CKTrhsOld + here->BSIM3qNode)); + vbs = model->BSIM3type + * + (* + (ckt->CKTrhsOld + + here->BSIM3bNode) - + *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); + vgs = model->BSIM3type * + (* + (ckt->CKTrhsOld + + here->BSIM3gNode) - + *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); + vds = model->BSIM3type * + (* + (ckt->CKTrhsOld + + here->BSIM3dNodePrime) - + *(ckt->CKTrhsOld + here->BSIM3sNodePrime)); + qdef = model->BSIM3type * + (*(ckt->CKTrhsOld + here->BSIM3qNode)); #ifndef PREDICTOR - } + } #endif /* PREDICTOR */ - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->BSIM3vgs) - - *(ckt->CKTstate0 + here->BSIM3vds); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3vgs); - delvds = vds - *(ckt->CKTstate0 + here->BSIM3vds); - delvgd = vgd - vgdo; - - if (here->BSIM3mode >= 0) - { Idtot = here->BSIM3cd + here->BSIM3csub - here->BSIM3cbd; - cdhat = Idtot - here->BSIM3gbd * delvbd - + (here->BSIM3gmbs + here->BSIM3gbbs) * delvbs - + (here->BSIM3gm + here->BSIM3gbgs) * delvgs - + (here->BSIM3gds + here->BSIM3gbds) * delvds; - Ibtot = here->BSIM3cbs + here->BSIM3cbd - here->BSIM3csub; - cbhat = Ibtot + here->BSIM3gbd * delvbd - + (here->BSIM3gbs - here->BSIM3gbbs) * delvbs - - here->BSIM3gbgs * delvgs - - here->BSIM3gbds * delvds; - } - else - { Idtot = here->BSIM3cd - here->BSIM3cbd; - cdhat = Idtot - (here->BSIM3gbd - here->BSIM3gmbs) * delvbd - + here->BSIM3gm * delvgd - - here->BSIM3gds * delvds; - Ibtot = here->BSIM3cbs + here->BSIM3cbd - here->BSIM3csub; - cbhat = Ibtot + here->BSIM3gbs * delvbs - + (here->BSIM3gbd - here->BSIM3gbbs) * delvbd - - here->BSIM3gbgs * delvgd - + here->BSIM3gbds * delvds; - } - - /* following should be one big if connected by && all over - * the place, but some C compilers can't handle that, so - * we split it up here to let them digest it in stages - */ - - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) - if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->BSIM3vbs))) + ckt->CKTvoltTol))) - if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->BSIM3vbd))) + ckt->CKTvoltTol))) - if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->BSIM3vgs))) + ckt->CKTvoltTol))) - if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->BSIM3vds))) + ckt->CKTvoltTol))) - if ((fabs(cdhat - Idtot) < ckt->CKTreltol - * MAX(fabs(cdhat),fabs(Idtot)) + ckt->CKTabstol)) - { tempv = MAX(fabs(cbhat),fabs(Ibtot)) + ckt->CKTabstol; - if ((fabs(cbhat - Ibtot)) < ckt->CKTreltol * tempv) - { /* bypass code */ - vbs = *(ckt->CKTstate0 + here->BSIM3vbs); - vbd = *(ckt->CKTstate0 + here->BSIM3vbd); - vgs = *(ckt->CKTstate0 + here->BSIM3vgs); - vds = *(ckt->CKTstate0 + here->BSIM3vds); - qdef = *(ckt->CKTstate0 + here->BSIM3qdef); - - vgd = vgs - vds; - vgb = vgs - vbs; - - cdrain = here->BSIM3cd; - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && - (ckt->CKTmode & MODEUIC))) - { ByPass = 1; - qgate = here->BSIM3qgate; - qbulk = here->BSIM3qbulk; - qdrn = here->BSIM3qdrn; - goto line755; - } - else - { goto line850; - } - } - } - - von = here->BSIM3von; - if (*(ckt->CKTstate0 + here->BSIM3vds) >= 0.0) - { vgs = DEVfetlim(vgs, *(ckt->CKTstate0+here->BSIM3vgs), von); - vds = vgs - vgd; - vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM3vds)); - vgd = vgs - vds; - - } - else - { vgd = DEVfetlim(vgd, vgdo, von); - vds = vgs - vgd; - vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0+here->BSIM3vds))); - vgs = vgd + vds; - } - - if (vds >= 0.0) - { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM3vbs), - CONSTvt0, model->BSIM3vcrit, &Check); - vbd = vbs - vds; - - } - else - { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM3vbd), - CONSTvt0, model->BSIM3vcrit, &Check); - vbs = vbd + vds; - } - } - - /* determine DC current and derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - - m=here->BSIM3m; - - /* Source/drain junction diode DC model begins */ - Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; - if ((here->BSIM3sourceArea <= 0.0) && (here->BSIM3sourcePerimeter <= 0.0)) - { SourceSatCurrent = 1.0e-14; - } + vbd = vbs - vds; + vgd = vgs - vds; + vgdo = *(ckt->CKTstate0 + here->BSIM3vgs) + - *(ckt->CKTstate0 + here->BSIM3vds); + delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3vbs); + delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3vbd); + delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3vgs); + delvds = vds - *(ckt->CKTstate0 + here->BSIM3vds); + delvgd = vgd - vgdo; + + if (here->BSIM3mode >= 0) + { + Idtot = here->BSIM3cd + here->BSIM3csub - here->BSIM3cbd; + cdhat = Idtot - + here->BSIM3gbd * delvbd + + (here->BSIM3gmbs + + here->BSIM3gbbs) * delvbs + + (here->BSIM3gm + + here->BSIM3gbgs) * delvgs + + (here->BSIM3gds + here->BSIM3gbds) * delvds; + Ibtot = here->BSIM3cbs + here->BSIM3cbd - here->BSIM3csub; + cbhat = Ibtot + + here->BSIM3gbd * delvbd + + (here->BSIM3gbs - + here->BSIM3gbbs) * delvbs - + here->BSIM3gbgs * delvgs - here->BSIM3gbds * delvds; + } + else + { + Idtot = here->BSIM3cd - here->BSIM3cbd; + cdhat = Idtot - (here->BSIM3gbd - + here->BSIM3gmbs) * + delvbd + here->BSIM3gm * delvgd - here->BSIM3gds * delvds; + Ibtot = here->BSIM3cbs + here->BSIM3cbd - here->BSIM3csub; + cbhat = Ibtot + + here->BSIM3gbs * delvbs + + (here->BSIM3gbd - + here->BSIM3gbbs) * delvbd - + here->BSIM3gbgs * delvgd + here->BSIM3gbds * delvds; + } + +#ifndef NOBYPASS + /* following should be one big if connected by && all over + * the place, but some C compilers can't handle that, so + * we split it up here to let them digest it in stages + */ + + if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) + if ((fabs (delvbs) < + (ckt->CKTreltol * + MAX (fabs (vbs), + fabs (*(ckt->CKTstate0 + here->BSIM3vbs))) + + ckt->CKTvoltTol))) + if ((fabs (delvbd) < + (ckt->CKTreltol * + MAX (fabs (vbd), + fabs (*(ckt->CKTstate0 + here->BSIM3vbd))) + + ckt->CKTvoltTol))) + if ((fabs (delvgs) < + (ckt->CKTreltol * + MAX (fabs (vgs), + fabs (*(ckt->CKTstate0 + here->BSIM3vgs))) + + ckt->CKTvoltTol))) + if ((fabs (delvds) < + (ckt->CKTreltol * + MAX (fabs (vds), + fabs (*(ckt->CKTstate0 + here->BSIM3vds))) + + ckt->CKTvoltTol))) + if ((fabs (cdhat - Idtot) < + ckt->CKTreltol * MAX (fabs (cdhat), + fabs (Idtot)) + + ckt->CKTabstol)) + { + tempv = + MAX (fabs (cbhat), + fabs (Ibtot)) + ckt->CKTabstol; + if ((fabs (cbhat - Ibtot)) < + ckt->CKTreltol * tempv) + { /* bypass code */ + vbs = *(ckt->CKTstate0 + here->BSIM3vbs); + vbd = *(ckt->CKTstate0 + here->BSIM3vbd); + vgs = *(ckt->CKTstate0 + here->BSIM3vgs); + vds = *(ckt->CKTstate0 + here->BSIM3vds); + qdef = *(ckt->CKTstate0 + here->BSIM3qdef); + + vgd = vgs - vds; + vgb = vgs - vbs; + + cdrain = here->BSIM3cd; + if ((ckt->CKTmode & (MODETRAN | MODEAC)) + || ((ckt->CKTmode & MODETRANOP) + && (ckt->CKTmode & MODEUIC))) + { + ByPass = 1; + qgate = here->BSIM3qgate; + qbulk = here->BSIM3qbulk; + qdrn = here->BSIM3qdrn; + goto line755; + } + else + { + goto line850; + } + } + } + +#endif /*NOBYPASS*/ + von = here->BSIM3von; + if (*(ckt->CKTstate0 + here->BSIM3vds) >= 0.0) + { + vgs = DEVfetlim (vgs, + *(ckt->CKTstate0 + here->BSIM3vgs), von); + vds = vgs - vgd; + vds = DEVlimvds (vds, *(ckt->CKTstate0 + here->BSIM3vds)); + vgd = vgs - vds; + + } + else + { + vgd = DEVfetlim (vgd, vgdo, von); + vds = vgs - vgd; + vds = -DEVlimvds (-vds, + -(*(ckt->CKTstate0 + here->BSIM3vds))); + vgs = vgd + vds; + } + + if (vds >= 0.0) + { + vbs = DEVpnjlim (vbs, + *(ckt->CKTstate0 + + here->BSIM3vbs), + CONSTvt0, model->BSIM3vcrit, &Check); + vbd = vbs - vds; + + } + else + { + vbd = DEVpnjlim (vbd, + *(ckt->CKTstate0 + + here->BSIM3vbd), + CONSTvt0, model->BSIM3vcrit, &Check); + vbs = vbd + vds; + } + } + + /* determine DC current and derivatives */ + vbd = vbs - vds; + vgd = vgs - vds; + vgb = vgs - vbs; + + m = here->BSIM3m; + + /* Source/drain junction diode DC model begins */ + Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; + if ((here->BSIM3sourceArea <= 0.0) + && (here->BSIM3sourcePerimeter <= 0.0)) + { + SourceSatCurrent = 1.0e-14; + } else - { SourceSatCurrent = here->BSIM3sourceArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3sourcePerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } + { + SourceSatCurrent = here->BSIM3sourceArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3sourcePerimeter + * model->BSIM3jctSidewallTempSatCurDensity; + } if (SourceSatCurrent <= 0.0) - { here->BSIM3gbs = ckt->CKTgmin/m; - here->BSIM3cbs = here->BSIM3gbs * vbs; - } - else - { if (model->BSIM3ijth == 0.0) - { evbs = exp(vbs / Nvtm); - here->BSIM3gbs = SourceSatCurrent * evbs / Nvtm + (ckt->CKTgmin/m); - here->BSIM3cbs = SourceSatCurrent * (evbs - 1.0) - + (ckt->CKTgmin/m) * vbs; - } - else - { if (vbs < here->BSIM3vjsm) - { evbs = exp(vbs / Nvtm); - here->BSIM3gbs = SourceSatCurrent * evbs / Nvtm + (ckt->CKTgmin/m); - here->BSIM3cbs = SourceSatCurrent * (evbs - 1.0) - + (ckt->CKTgmin/m) * vbs; - } - else - { T0 = here->BSIM3IsEvjsm / Nvtm; - here->BSIM3gbs = T0 + (ckt->CKTgmin/m); - here->BSIM3cbs = here->BSIM3IsEvjsm - SourceSatCurrent - + T0 * (vbs - here->BSIM3vjsm) - + (ckt->CKTgmin/m) * vbs; - } - } - } - - if ((here->BSIM3drainArea <= 0.0) && (here->BSIM3drainPerimeter <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } + { + here->BSIM3gbs = ckt->CKTgmin; + + here->BSIM3cbs = here->BSIM3gbs * vbs; + } else - { DrainSatCurrent = here->BSIM3drainArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3drainPerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } + { + if (model->BSIM3ijth == 0.0) + { + evbs = exp (vbs / Nvtm); + here->BSIM3gbs = + SourceSatCurrent * evbs / Nvtm + (ckt->CKTgmin); + here->BSIM3cbs = + SourceSatCurrent * (evbs - + 1.0) + (ckt->CKTgmin) * vbs; + + } + else + { + if (vbs < here->BSIM3vjsm) + { + evbs = exp (vbs / Nvtm); + here->BSIM3gbs = + SourceSatCurrent * evbs / Nvtm + (ckt->CKTgmin); + + here->BSIM3cbs = + SourceSatCurrent * + (evbs - 1.0) + (ckt->CKTgmin) * vbs; + } + else + { + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + T0 = here->BSIM3IsEvjsm / Nvtm; + here->BSIM3gbs = T0 + (ckt->CKTgmin); + here->BSIM3cbs = + here-> + BSIM3IsEvjsm - + SourceSatCurrent + + T0 * (vbs - + here-> + BSIM3vjsm) + (ckt->CKTgmin) * vbs; + + break; + case BSIM3V32: + default: + T0 = (SourceSatCurrent + model->BSIM3ijth) / Nvtm; + here->BSIM3gbs = T0 + (ckt->CKTgmin); + here->BSIM3cbs = + model-> + BSIM3ijth + + (ckt->CKTgmin) * vbs + T0 * (vbs - + here->BSIM3vjsm); + } + + } + } + } + + if ((here->BSIM3drainArea <= 0.0) + && (here->BSIM3drainPerimeter <= 0.0)) + { + DrainSatCurrent = 1.0e-14; + } + else + { + DrainSatCurrent = here->BSIM3drainArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3drainPerimeter + * model->BSIM3jctSidewallTempSatCurDensity; + } if (DrainSatCurrent <= 0.0) - { here->BSIM3gbd = (ckt->CKTgmin/m); - here->BSIM3cbd = here->BSIM3gbd * vbd; - } - else - { if (model->BSIM3ijth == 0.0) - { evbd = exp(vbd / Nvtm); - here->BSIM3gbd = DrainSatCurrent * evbd / Nvtm + (ckt->CKTgmin/m); - here->BSIM3cbd = DrainSatCurrent * (evbd - 1.0) - + (ckt->CKTgmin/m) * vbd; - } - else - { if (vbd < here->BSIM3vjdm) - { evbd = exp(vbd / Nvtm); - here->BSIM3gbd = DrainSatCurrent * evbd / Nvtm + (ckt->CKTgmin/m); - here->BSIM3cbd = DrainSatCurrent * (evbd - 1.0) - + (ckt->CKTgmin/m) * vbd; - } - else - { T0 = here->BSIM3IsEvjdm / Nvtm; - here->BSIM3gbd = T0 + (ckt->CKTgmin/m); - here->BSIM3cbd = here->BSIM3IsEvjdm - DrainSatCurrent - + T0 * (vbd - here->BSIM3vjdm) - + (ckt->CKTgmin/m) * vbd; - } - } - } - /* End of diode DC model */ - - if (vds >= 0.0) - { /* normal mode */ - here->BSIM3mode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - } + { + here->BSIM3gbd = ckt->CKTgmin; + here->BSIM3cbd = here->BSIM3gbd * vbd; + } + else + { + if (model->BSIM3ijth == 0.0) + { + evbd = exp (vbd / Nvtm); + here->BSIM3gbd = + DrainSatCurrent * evbd / Nvtm + (ckt->CKTgmin); + here->BSIM3cbd = + DrainSatCurrent * (evbd - 1.0) + (ckt->CKTgmin) * vbd; + } + else + { + if (vbd < here->BSIM3vjdm) + { + evbd = exp (vbd / Nvtm); + here->BSIM3gbd = + DrainSatCurrent * evbd / Nvtm + (ckt->CKTgmin); + here->BSIM3cbd = + DrainSatCurrent * + (evbd - 1.0) + (ckt->CKTgmin) * vbd; + + } + else + { + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + T0 = here->BSIM3IsEvjdm / Nvtm; + here->BSIM3gbd = T0 + (ckt->CKTgmin); + here->BSIM3cbd = + here-> + BSIM3IsEvjdm - + DrainSatCurrent + + T0 * (vbd - + here-> + BSIM3vjdm) + (ckt->CKTgmin) * vbd; + + case BSIM3V32: + default: + T0 = (DrainSatCurrent + model->BSIM3ijth) / Nvtm; + here->BSIM3gbd = T0 + (ckt->CKTgmin); + here->BSIM3cbd = + model->BSIM3ijth + (ckt->CKTgmin) * vbd + + T0 * (vbd - here->BSIM3vjdm); + } + + } + } + } + /* End of diode DC model */ + + if (vds >= 0.0) + { /* normal mode */ + here->BSIM3mode = 1; + Vds = vds; + Vgs = vgs; + Vbs = vbs; + } else - { /* inverse mode */ - here->BSIM3mode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - } + { /* inverse mode */ + here->BSIM3mode = -1; + Vds = -vds; + Vgs = vgd; + Vbs = vbd; + } T0 = Vbs - pParam->BSIM3vbsc - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * pParam->BSIM3vbsc); + T1 = sqrt (T0 * T0 - 0.004 * pParam->BSIM3vbsc); Vbseff = pParam->BSIM3vbsc + 0.5 * (T0 + T1); dVbseff_dVb = 0.5 * (1.0 + T0 / T1); - if (Vbseff < Vbs) - { Vbseff = Vbs; - } - - if (Vbseff > 0.0) - { T0 = pParam->BSIM3phi / (pParam->BSIM3phi + Vbseff); - Phis = pParam->BSIM3phi * T0; - dPhis_dVb = -T0 * T0; - sqrtPhis = pParam->BSIM3phis3 / (pParam->BSIM3phi + 0.5 * Vbseff); - dsqrtPhis_dVb = -0.5 * sqrtPhis * sqrtPhis / pParam->BSIM3phis3; - } + if (Vbseff < Vbs) + { + Vbseff = Vbs; + } /* Added to avoid the possible numerical problems due to computer accuracy. See comments for diffVds */ + + if (Vbseff > 0.0) + { + T0 = pParam->BSIM3phi / (pParam->BSIM3phi + Vbseff); + Phis = pParam->BSIM3phi * T0; + dPhis_dVb = -T0 * T0; + sqrtPhis = + pParam->BSIM3phis3 / (pParam->BSIM3phi + 0.5 * Vbseff); + dsqrtPhis_dVb = -0.5 * sqrtPhis * sqrtPhis / pParam->BSIM3phis3; + } else - { Phis = pParam->BSIM3phi - Vbseff; - dPhis_dVb = -1.0; - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - } - Xdep = pParam->BSIM3Xdep0 * sqrtPhis / pParam->BSIM3sqrtPhi; - dXdep_dVb = (pParam->BSIM3Xdep0 / pParam->BSIM3sqrtPhi) - * dsqrtPhis_dVb; - - Leff = pParam->BSIM3leff; - Vtm = model->BSIM3vtm; + { + Phis = pParam->BSIM3phi - Vbseff; + dPhis_dVb = -1.0; + sqrtPhis = sqrt (Phis); + dsqrtPhis_dVb = -0.5 / sqrtPhis; + } + Xdep = pParam->BSIM3Xdep0 * sqrtPhis / pParam->BSIM3sqrtPhi; + dXdep_dVb = + (pParam->BSIM3Xdep0 / pParam->BSIM3sqrtPhi) * dsqrtPhis_dVb; + + Leff = pParam->BSIM3leff; + Vtm = model->BSIM3vtm; /* Vth Calculation */ - T3 = sqrt(Xdep); - V0 = pParam->BSIM3vbi - pParam->BSIM3phi; + T3 = sqrt (Xdep); + V0 = pParam->BSIM3vbi - pParam->BSIM3phi; - T0 = pParam->BSIM3dvt2 * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; + T0 = pParam->BSIM3dvt2 * Vbseff; + if (T0 >= -0.5) + { + T1 = 1.0 + T0; T2 = pParam->BSIM3dvt2; - } - else /* Added to avoid any discontinuity problems caused by dvt2 */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; + } + else /* Added to avoid any discontinuity problems caused by dvt2 */ + { + T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; T2 = pParam->BSIM3dvt2 * T4 * T4; - } - lt1 = model->BSIM3factor1 * T3 * T1; - dlt1_dVb = model->BSIM3factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->BSIM3dvt2w * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; + } + lt1 = model->BSIM3factor1 * T3 * T1; + dlt1_dVb = + model->BSIM3factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + + T0 = pParam->BSIM3dvt2w * Vbseff; + if (T0 >= -0.5) + { + T1 = 1.0 + T0; T2 = pParam->BSIM3dvt2w; - } - else /* Added to avoid any discontinuity problems caused by dvt2w */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; + } + else /* Added to avoid any discontinuity problems caused by dvt2w */ + { + T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; T2 = pParam->BSIM3dvt2w * T4 * T4; - } - ltw = model->BSIM3factor1 * T3 * T1; - dltw_dVb = model->BSIM3factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = -0.5 * pParam->BSIM3dvt1 * Leff / lt1; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - Theta0 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = 0.0; - } - - here->BSIM3thetavth = pParam->BSIM3dvt0 * Theta0; - Delt_vth = here->BSIM3thetavth * V0; - dDelt_vth_dVb = pParam->BSIM3dvt0 * dTheta0_dVb * V0; - - T0 = -0.5 * pParam->BSIM3dvt1w * pParam->BSIM3weff * Leff / ltw; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXP; - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dVb = 0.0; - } - - T0 = pParam->BSIM3dvt0w * T2; - T2 = T0 * V0; - dT2_dVb = pParam->BSIM3dvt0w * dT2_dVb * V0; - - TempRatio = ckt->CKTtemp / model->BSIM3tnom - 1.0; - T0 = sqrt(1.0 + pParam->BSIM3nlx / Leff); - T1 = pParam->BSIM3k1ox * (T0 - 1.0) * pParam->BSIM3sqrtPhi - + (pParam->BSIM3kt1 + pParam->BSIM3kt1l / Leff - + pParam->BSIM3kt2 * Vbseff) * TempRatio; - tmp2 = model->BSIM3tox * pParam->BSIM3phi - / (pParam->BSIM3weff + pParam->BSIM3w0); + } + ltw = model->BSIM3factor1 * T3 * T1; + dltw_dVb = + model->BSIM3factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + + T0 = -0.5 * pParam->BSIM3dvt1 * Leff / lt1; + if (T0 > -EXP_THRESHOLD) + { + T1 = exp (T0); + Theta0 = T1 * (1.0 + 2.0 * T1); + dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; + dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; + } + else + { + T1 = MIN_EXP; + Theta0 = T1 * (1.0 + 2.0 * T1); + dTheta0_dVb = 0.0; + } + + here->BSIM3thetavth = pParam->BSIM3dvt0 * Theta0; + Delt_vth = here->BSIM3thetavth * V0; + dDelt_vth_dVb = pParam->BSIM3dvt0 * dTheta0_dVb * V0; + + T0 = -0.5 * pParam->BSIM3dvt1w * pParam->BSIM3weff * Leff / ltw; + if (T0 > -EXP_THRESHOLD) + { + T1 = exp (T0); + T2 = T1 * (1.0 + 2.0 * T1); + dT1_dVb = -T0 / ltw * T1 * dltw_dVb; + dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; + } + else + { + T1 = MIN_EXP; + T2 = T1 * (1.0 + 2.0 * T1); + dT2_dVb = 0.0; + } + + T0 = pParam->BSIM3dvt0w * T2; + T2 = T0 * V0; + dT2_dVb = pParam->BSIM3dvt0w * dT2_dVb * V0; + + TempRatio = ckt->CKTtemp / model->BSIM3tnom - 1.0; + T0 = sqrt (1.0 + pParam->BSIM3nlx / Leff); + T1 = pParam->BSIM3k1ox * (T0 - + 1.0) * + pParam->BSIM3sqrtPhi + (pParam->BSIM3kt1 + + pParam->BSIM3kt1l / + Leff + + pParam->BSIM3kt2 * Vbseff) * TempRatio; + tmp2 = model->BSIM3tox * pParam->BSIM3phi / + (pParam->BSIM3weff + pParam->BSIM3w0); T3 = pParam->BSIM3eta0 + pParam->BSIM3etab * Vbseff; - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { T9 = 1.0 / (3.0 - 2.0e4 * T3); + if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ + { + T9 = 1.0 / (3.0 - 2.0e4 * T3); T3 = (2.0e-4 - T3) * T9; T4 = T9 * T9; - } + } else - { T4 = 1.0; - } + { + T4 = 1.0; + } dDIBL_Sft_dVd = T3 * pParam->BSIM3theta0vb0; - DIBL_Sft = dDIBL_Sft_dVd * Vds; + DIBL_Sft = dDIBL_Sft_dVd * Vds; - Vth = model->BSIM3type * pParam->BSIM3vth0 - pParam->BSIM3k1 - * pParam->BSIM3sqrtPhi + pParam->BSIM3k1ox * sqrtPhis - - pParam->BSIM3k2ox * Vbseff - Delt_vth - T2 + (pParam->BSIM3k3 - + pParam->BSIM3k3b * Vbseff) * tmp2 + T1 - DIBL_Sft; + Vth = model->BSIM3type * pParam->BSIM3vth0 - + pParam->BSIM3k1 * pParam->BSIM3sqrtPhi + + pParam->BSIM3k1ox * sqrtPhis - + pParam->BSIM3k2ox * Vbseff - Delt_vth - T2 + + (pParam->BSIM3k3 + + pParam->BSIM3k3b * Vbseff) * tmp2 + T1 - DIBL_Sft; - here->BSIM3von = Vth; + here->BSIM3von = Vth; - dVth_dVb = pParam->BSIM3k1ox * dsqrtPhis_dVb - pParam->BSIM3k2ox - - dDelt_vth_dVb - dT2_dVb + pParam->BSIM3k3b * tmp2 - - pParam->BSIM3etab * Vds * pParam->BSIM3theta0vb0 * T4 - + pParam->BSIM3kt2 * TempRatio; - dVth_dVd = -dDIBL_Sft_dVd; + dVth_dVb = + pParam->BSIM3k1ox * dsqrtPhis_dVb - + pParam->BSIM3k2ox - dDelt_vth_dVb - dT2_dVb + + pParam->BSIM3k3b * tmp2 - + pParam->BSIM3etab * Vds * + pParam->BSIM3theta0vb0 * T4 + pParam->BSIM3kt2 * TempRatio; + dVth_dVd = -dDIBL_Sft_dVd; /* Calculate n */ - tmp2 = pParam->BSIM3nfactor * EPSSI / Xdep; - tmp3 = pParam->BSIM3cdsc + pParam->BSIM3cdscb * Vbseff - + pParam->BSIM3cdscd * Vds; + tmp2 = pParam->BSIM3nfactor * EPSSI / Xdep; + tmp3 = pParam->BSIM3cdsc + pParam->BSIM3cdscb * Vbseff + + pParam->BSIM3cdscd * Vds; tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM3cit) / model->BSIM3cox; if (tmp4 >= -0.5) - { n = 1.0 + tmp4; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM3cdscb * Theta0) / model->BSIM3cox; - dn_dVd = pParam->BSIM3cdscd * Theta0 / model->BSIM3cox; - } + { + n = 1.0 + tmp4; + dn_dVb = (-tmp2 / Xdep * dXdep_dVb + + tmp3 * dTheta0_dVb + + pParam->BSIM3cdscb * Theta0) / model->BSIM3cox; + dn_dVd = pParam->BSIM3cdscd * Theta0 / model->BSIM3cox; + } else - /* avoid discontinuity problems caused by tmp4 */ - { T0 = 1.0 / (3.0 + 8.0 * tmp4); + /* avoid discontinuity problems caused by tmp4 */ + { + T0 = 1.0 / (3.0 + 8.0 * tmp4); n = (1.0 + 3.0 * tmp4) * T0; T0 *= T0; - dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM3cdscb * Theta0) / model->BSIM3cox * T0; - dn_dVd = pParam->BSIM3cdscd * Theta0 / model->BSIM3cox * T0; - } + dn_dVb = (-tmp2 / Xdep * dXdep_dVb + + tmp3 * dTheta0_dVb + + pParam->BSIM3cdscb * Theta0) / model->BSIM3cox * T0; + dn_dVd = pParam->BSIM3cdscd * Theta0 / model->BSIM3cox * T0; + } /* Poly Gate Si Depletion Effect */ T0 = pParam->BSIM3vfb + pParam->BSIM3phi; - if ((pParam->BSIM3ngate > 1.e18) && (pParam->BSIM3ngate < 1.e25) - && (Vgs > T0)) - /* added to avoid the problem caused by ngate */ - { T1 = 1.0e6 * Charge_q * EPSSI * pParam->BSIM3ngate - / (model->BSIM3cox * model->BSIM3cox); - T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = Vgs - T5; - dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - } + if ((pParam->BSIM3ngate > 1.e18) + && (pParam->BSIM3ngate < 1.e25) && (Vgs > T0)) + /* added to avoid the problem caused by ngate */ + { + T1 = 1.0e6 * Charge_q * EPSSI * + pParam->BSIM3ngate / (model->BSIM3cox * model->BSIM3cox); + T4 = sqrt (1.0 + 2.0 * (Vgs - T0) / T1); + T2 = T1 * (T4 - 1.0); + T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ + T7 = 1.12 - T3 - 0.05; + T6 = sqrt (T7 * T7 + 0.224); + T5 = 1.12 - 0.5 * (T7 + T6); + Vgs_eff = Vgs - T5; + dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); + } else - { Vgs_eff = Vgs; - dVgs_eff_dVg = 1.0; - } - Vgst = Vgs_eff - Vth; + { + Vgs_eff = Vgs; + dVgs_eff_dVg = 1.0; + } + Vgst = Vgs_eff - Vth; /* Effective Vgst (Vgsteff) Calculation */ - T10 = 2.0 * n * Vtm; - VgstNVt = Vgst / T10; - ExpArg = (2.0 * pParam->BSIM3voff - Vgst) / T10; + T10 = 2.0 * n * Vtm; + VgstNVt = Vgst / T10; + ExpArg = (2.0 * pParam->BSIM3voff - Vgst) / T10; /* MCJ: Very small Vgst */ - if (VgstNVt > EXP_THRESHOLD) - { Vgsteff = Vgst; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = -dVth_dVb; - } + if (VgstNVt > EXP_THRESHOLD) + { + Vgsteff = Vgst; + dVgsteff_dVg = dVgs_eff_dVg; + dVgsteff_dVd = -dVth_dVd; + dVgsteff_dVb = -dVth_dVb; + } else if (ExpArg > EXP_THRESHOLD) - { T0 = (Vgst - pParam->BSIM3voff) / (n * Vtm); - ExpVgst = exp(T0); + { + T0 = (Vgst - pParam->BSIM3voff) / (n * Vtm); + ExpVgst = exp (T0); Vgsteff = Vtm * pParam->BSIM3cdep0 / model->BSIM3cox * ExpVgst; - dVgsteff_dVg = Vgsteff / (n * Vtm); - dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + T0 * Vtm * dn_dVd); - dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + T0 * Vtm * dn_dVb); + dVgsteff_dVg = Vgsteff / (n * Vtm); + dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + T0 * Vtm * dn_dVd); + dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + T0 * Vtm * dn_dVb); dVgsteff_dVg *= dVgs_eff_dVg; - } + } else - { ExpVgst = exp(VgstNVt); - T1 = T10 * log(1.0 + ExpVgst); - dT1_dVg = ExpVgst / (1.0 + ExpVgst); - dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) - + T1 / n * dn_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) - + T1 / n * dn_dVd; - - dT2_dVg = -model->BSIM3cox / (Vtm * pParam->BSIM3cdep0) - * exp(ExpArg); - T2 = 1.0 - T10 * dT2_dVg; - dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd) - + (T2 - 1.0) / n * dn_dVd; - dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb) - + (T2 - 1.0) / n * dn_dVb; - - Vgsteff = T1 / T2; + { + ExpVgst = exp (VgstNVt); + T1 = T10 * log (1.0 + ExpVgst); + dT1_dVg = ExpVgst / (1.0 + ExpVgst); + dT1_dVb = + -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) + T1 / n * dn_dVb; + dT1_dVd = + -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) + T1 / n * dn_dVd; + + dT2_dVg = + -model->BSIM3cox / (Vtm * pParam->BSIM3cdep0) * exp (ExpArg); + T2 = 1.0 - T10 * dT2_dVg; + dT2_dVd = + -dT2_dVg * (dVth_dVd - + 2.0 * Vtm * ExpArg * + dn_dVd) + (T2 - 1.0) / n * dn_dVd; + dT2_dVb = + -dT2_dVg * (dVth_dVb - + 2.0 * Vtm * ExpArg * + dn_dVb) + (T2 - 1.0) / n * dn_dVb; + + Vgsteff = T1 / T2; T3 = T2 * T2; - dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg; - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; - dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - } + dVgsteff_dVg = + (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg; + dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; + dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; + } + + here->BSIM3Vgsteff = Vgsteff; /* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - pParam->BSIM3sqrtPhi; - Weff = pParam->BSIM3weff - 2.0 * (pParam->BSIM3dwg * Vgsteff - + pParam->BSIM3dwb * T9); - dWeff_dVg = -2.0 * pParam->BSIM3dwg; - dWeff_dVb = -2.0 * pParam->BSIM3dwb * dsqrtPhis_dVb; - - if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); + T9 = sqrtPhis - pParam->BSIM3sqrtPhi; + Weff = pParam->BSIM3weff - + 2.0 * (pParam->BSIM3dwg * Vgsteff + pParam->BSIM3dwb * T9); + dWeff_dVg = -2.0 * pParam->BSIM3dwg; + dWeff_dVb = -2.0 * pParam->BSIM3dwb * dsqrtPhis_dVb; + + if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff */ + { + T0 = 1.0 / (6.0e-8 - 2.0 * Weff); Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; T0 *= T0 * 4.0e-16; - dWeff_dVg *= T0; + dWeff_dVg *= T0; dWeff_dVb *= T0; - } + } - T0 = pParam->BSIM3prwg * Vgsteff + pParam->BSIM3prwb * T9; + T0 = pParam->BSIM3prwg * Vgsteff + pParam->BSIM3prwb * T9; if (T0 >= -0.9) - { Rds = pParam->BSIM3rds0 * (1.0 + T0); + { + Rds = pParam->BSIM3rds0 * (1.0 + T0); dRds_dVg = pParam->BSIM3rds0 * pParam->BSIM3prwg; - dRds_dVb = pParam->BSIM3rds0 * pParam->BSIM3prwb * dsqrtPhis_dVb; - } + dRds_dVb = + pParam->BSIM3rds0 * pParam->BSIM3prwb * dsqrtPhis_dVb; + } else - /* to avoid the discontinuity problem due to prwg and prwb*/ - { T1 = 1.0 / (17.0 + 20.0 * T0); + /* to avoid the discontinuity problem due to prwg and prwb */ + { + T1 = 1.0 / (17.0 + 20.0 * T0); Rds = pParam->BSIM3rds0 * (0.8 + T0) * T1; T1 *= T1; dRds_dVg = pParam->BSIM3rds0 * pParam->BSIM3prwg * T1; - dRds_dVb = pParam->BSIM3rds0 * pParam->BSIM3prwb * dsqrtPhis_dVb - * T1; - } - + dRds_dVb = + pParam->BSIM3rds0 * pParam->BSIM3prwb * dsqrtPhis_dVb * T1; + } + + + here->BSIM3rds = Rds; /* Noise Bugfix */ + /* Calculate Abulk */ - T1 = 0.5 * pParam->BSIM3k1ox / sqrtPhis; - dT1_dVb = -T1 / sqrtPhis * dsqrtPhis_dVb; - - T9 = sqrt(pParam->BSIM3xj * Xdep); - tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; - tmp2 = pParam->BSIM3a0 * T5; - tmp3 = pParam->BSIM3weff + pParam->BSIM3b1; - tmp4 = pParam->BSIM3b0 / tmp3; - T2 = tmp2 + tmp4; - dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb; - T6 = T5 * T5; - T7 = T5 * T6; - - Abulk0 = 1.0 + T1 * T2; - dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb; - - T8 = pParam->BSIM3ags * pParam->BSIM3a0 * T7; - dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb - + 3.0 * T1 * dT2_dVb); - - if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk0); + T1 = 0.5 * pParam->BSIM3k1ox / sqrtPhis; + dT1_dVb = -T1 / sqrtPhis * dsqrtPhis_dVb; + + T9 = sqrt (pParam->BSIM3xj * Xdep); + tmp1 = Leff + 2.0 * T9; + T5 = Leff / tmp1; + tmp2 = pParam->BSIM3a0 * T5; + tmp3 = pParam->BSIM3weff + pParam->BSIM3b1; + tmp4 = pParam->BSIM3b0 / tmp3; + T2 = tmp2 + tmp4; + dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb; + T6 = T5 * T5; + T7 = T5 * T6; + + Abulk0 = 1.0 + T1 * T2; + dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb; + + T8 = pParam->BSIM3ags * pParam->BSIM3a0 * T7; + dAbulk_dVg = -T1 * T8; + Abulk = Abulk0 + dAbulk_dVg * Vgsteff; + dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb + + 3.0 * T1 * dT2_dVb); + + if (Abulk0 < 0.1) /* added to avoid the problems caused by Abulk0 */ + { + T9 = 1.0 / (3.0 - 20.0 * Abulk0); Abulk0 = (0.2 - Abulk0) * T9; dAbulk0_dVb *= T9 * T9; - } + } - if (Abulk < 0.1) - /* added to avoid the problems caused by Abulk */ - { T9 = 1.0 / (3.0 - 20.0 * Abulk); + if (Abulk < 0.1) + /* added to avoid the problems caused by Abulk */ + { + T9 = 1.0 / (3.0 - 20.0 * Abulk); Abulk = (0.2 - Abulk) * T9; - T10 = T9 * T9; + T10 = T9 * T9; dAbulk_dVb *= T10; - dAbulk_dVg *= T10; - } + dAbulk_dVg *= T10; + + } - T2 = pParam->BSIM3keta * Vbseff; + here->BSIM3Abulk = Abulk; + + T2 = pParam->BSIM3keta * Vbseff; if (T2 >= -0.9) - { T0 = 1.0 / (1.0 + T2); - dT0_dVb = -pParam->BSIM3keta * T0 * T0; - } + { + T0 = 1.0 / (1.0 + T2); + dT0_dVb = -pParam->BSIM3keta * T0 * T0; + } else - /* added to avoid the problems caused by Keta */ - { T1 = 1.0 / (0.8 + T2); + /* added to avoid the problems caused by Keta */ + { + T1 = 1.0 / (0.8 + T2); T0 = (17.0 + 20.0 * T2) * T1; - dT0_dVb = -pParam->BSIM3keta * T1 * T1; - } + dT0_dVb = -pParam->BSIM3keta * T1 * T1; + } dAbulk_dVg *= T0; dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; dAbulk0_dVb = dAbulk0_dVb * T0 + Abulk0 * dT0_dVb; @@ -718,869 +930,1052 @@ for (; model != NULL; model = model->BSIM3nextModel) /* Mobility calculation */ - if (model->BSIM3mobMod == 1) - { T0 = Vgsteff + Vth + Vth; - T2 = pParam->BSIM3ua + pParam->BSIM3uc * Vbseff; - T3 = T0 / model->BSIM3tox; - T5 = T3 * (T2 + pParam->BSIM3ub * T3); - dDenomi_dVg = (T2 + 2.0 * pParam->BSIM3ub * T3) / model->BSIM3tox; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3uc * T3; - } + if (model->BSIM3mobMod == 1) + { + T0 = Vgsteff + Vth + Vth; + T2 = pParam->BSIM3ua + pParam->BSIM3uc * Vbseff; + T3 = T0 / model->BSIM3tox; + T5 = T3 * (T2 + pParam->BSIM3ub * T3); + dDenomi_dVg = + (T2 + 2.0 * pParam->BSIM3ub * T3) / model->BSIM3tox; + dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; + dDenomi_dVb = + dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3uc * T3; + } else if (model->BSIM3mobMod == 2) - { T5 = Vgsteff / model->BSIM3tox * (pParam->BSIM3ua - + pParam->BSIM3uc * Vbseff + pParam->BSIM3ub * Vgsteff - / model->BSIM3tox); - dDenomi_dVg = (pParam->BSIM3ua + pParam->BSIM3uc * Vbseff - + 2.0 * pParam->BSIM3ub * Vgsteff / model->BSIM3tox) - / model->BSIM3tox; - dDenomi_dVd = 0.0; - dDenomi_dVb = Vgsteff * pParam->BSIM3uc / model->BSIM3tox; - } + { + T5 = Vgsteff / model->BSIM3tox * + (pParam->BSIM3ua + + pParam->BSIM3uc * Vbseff + + pParam->BSIM3ub * Vgsteff / model->BSIM3tox); + dDenomi_dVg = + (pParam->BSIM3ua + + pParam->BSIM3uc * Vbseff + + 2.0 * pParam->BSIM3ub * Vgsteff / + model->BSIM3tox) / model->BSIM3tox; + dDenomi_dVd = 0.0; + dDenomi_dVb = Vgsteff * pParam->BSIM3uc / model->BSIM3tox; + } else - { T0 = Vgsteff + Vth + Vth; - T2 = 1.0 + pParam->BSIM3uc * Vbseff; - T3 = T0 / model->BSIM3tox; - T4 = T3 * (pParam->BSIM3ua + pParam->BSIM3ub * T3); + { + T0 = Vgsteff + Vth + Vth; + T2 = 1.0 + pParam->BSIM3uc * Vbseff; + T3 = T0 / model->BSIM3tox; + T4 = T3 * (pParam->BSIM3ua + pParam->BSIM3ub * T3); T5 = T4 * T2; - dDenomi_dVg = (pParam->BSIM3ua + 2.0 * pParam->BSIM3ub * T3) * T2 - / model->BSIM3tox; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3uc * T4; - } + dDenomi_dVg = + (pParam->BSIM3ua + + 2.0 * pParam->BSIM3ub * T3) * T2 / model->BSIM3tox; + dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; + dDenomi_dVb = + dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3uc * T4; + } if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else /* Added to avoid the discontinuity problem caused by ua and ub*/ - { T9 = 1.0 / (7.0 + 10.0 * T5); + { + Denomi = 1.0 + T5; + } + else /* Added to avoid the discontinuity problem caused by ua and ub */ + { + T9 = 1.0 / (7.0 + 10.0 * T5); Denomi = (0.6 + T5) * T9; T9 *= T9; - dDenomi_dVg *= T9; - dDenomi_dVd *= T9; - dDenomi_dVb *= T9; - } + dDenomi_dVg *= T9; + dDenomi_dVd *= T9; + dDenomi_dVb *= T9; + } - here->BSIM3ueff = ueff = pParam->BSIM3u0temp / Denomi; + here->BSIM3ueff = ueff = pParam->BSIM3u0temp / Denomi; T9 = -ueff / Denomi; - dueff_dVg = T9 * dDenomi_dVg; - dueff_dVd = T9 * dDenomi_dVd; - dueff_dVb = T9 * dDenomi_dVb; + dueff_dVg = T9 * dDenomi_dVg; + dueff_dVd = T9 * dDenomi_dVd; + dueff_dVb = T9 * dDenomi_dVb; /* Saturation Drain Voltage Vdsat */ - WVCox = Weff * pParam->BSIM3vsattemp * model->BSIM3cox; - WVCoxRds = WVCox * Rds; - - Esat = 2.0 * pParam->BSIM3vsattemp / ueff; - EsatL = Esat * Leff; - T0 = -EsatL /ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - + WVCox = Weff * pParam->BSIM3vsattemp * model->BSIM3cox; + WVCoxRds = WVCox * Rds; + + Esat = 2.0 * pParam->BSIM3vsattemp / ueff; + EsatL = Esat * Leff; + T0 = -EsatL / ueff; + dEsatL_dVg = T0 * dueff_dVg; + dEsatL_dVd = T0 * dueff_dVd; + dEsatL_dVb = T0 * dueff_dVb; + /* Sqrt() */ - a1 = pParam->BSIM3a1; + a1 = pParam->BSIM3a1; if (a1 == 0.0) - { Lambda = pParam->BSIM3a2; + { + Lambda = pParam->BSIM3a2; dLambda_dVg = 0.0; - } + } else if (a1 > 0.0) /* Added to avoid the discontinuity problem caused by a1 and a2 (Lambda) */ - { T0 = 1.0 - pParam->BSIM3a2; + { + T0 = 1.0 - pParam->BSIM3a2; T1 = T0 - pParam->BSIM3a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); + T2 = sqrt (T1 * T1 + 0.0004 * T0); Lambda = pParam->BSIM3a2 + T0 - 0.5 * (T1 + T2); dLambda_dVg = 0.5 * pParam->BSIM3a1 * (1.0 + T1 / T2); - } + } else - { T1 = pParam->BSIM3a2 + pParam->BSIM3a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM3a2); + { + T1 = pParam->BSIM3a2 + pParam->BSIM3a1 * Vgsteff - 0.0001; + T2 = sqrt (T1 * T1 + 0.0004 * pParam->BSIM3a2); Lambda = 0.5 * (T1 + T2); dLambda_dVg = 0.5 * pParam->BSIM3a1 * (1.0 + T1 / T2); - } - - Vgst2Vtm = Vgsteff + 2.0 * Vtm; - if (Rds > 0) - { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - if ((Rds == 0.0) && (Lambda == 1.0)) - { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); - tmp1 = 0.0; + } + + Vgst2Vtm = Vgsteff + 2.0 * Vtm; + + here->BSIM3AbovVgst2Vtm = Abulk / Vgst2Vtm; + + if (Rds > 0) + { + tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; + tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; + } + else + { + tmp2 = dWeff_dVg / Weff; + tmp3 = dWeff_dVb / Weff; + } + if ((Rds == 0.0) && (Lambda == 1.0)) + { + T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); + tmp1 = 0.0; T1 = T0 * T0; T2 = Vgst2Vtm * T0; - T3 = EsatL * Vgst2Vtm; - Vdsat = T3 * T0; - - dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; - - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; - } - else - { tmp1 = dLambda_dVg / (Lambda * Lambda); - T9 = Abulk * WVCoxRds; + T3 = EsatL * Vgst2Vtm; + Vdsat = T3 * T0; + + dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; + dT0_dVd = -(Abulk * dEsatL_dVd) * T1; + dT0_dVb = -(Abulk * dEsatL_dVb + dAbulk_dVb * EsatL) * T1; + + dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; + dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; + dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; + } + else + { + tmp1 = dLambda_dVg / (Lambda * Lambda); + T9 = Abulk * WVCoxRds; T8 = Abulk * T9; T7 = Vgst2Vtm * T9; - T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); - dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); - - dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; - T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; - - dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 - + T7 * tmp2 + T6 * dAbulk_dVg); - dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb - + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); - dT1_dVd = Abulk * dEsatL_dVd; - - T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); - dT2_dVd = Vgst2Vtm * dEsatL_dVd; - - T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); - Vdsat = (T1 - T3) / T0; - - dT3_dVg = (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) - / T3; - dT3_dVd = (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) - / T3; - dT3_dVb = (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) - / T3; - - dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; - } - here->BSIM3vdsat = Vdsat; + T6 = Vgst2Vtm * WVCoxRds; + T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); + dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 + + (2.0 * T9 + 1.0 / Lambda - + 1.0) * dAbulk_dVg); + + dT0_dVb = + 2.0 * (T8 * + (2.0 / Abulk * dAbulk_dVb + + tmp3) + (1.0 / Lambda - 1.0) * dAbulk_dVb); + dT0_dVd = 0.0; + T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; + + dT1_dVg = + (2.0 / Lambda - 1.0) - + 2.0 * Vgst2Vtm * tmp1 + + Abulk * dEsatL_dVg + + EsatL * dAbulk_dVg + 3.0 * (T9 + T7 * tmp2 + T6 * dAbulk_dVg); + dT1_dVb = + Abulk * dEsatL_dVb + + EsatL * dAbulk_dVb + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); + dT1_dVd = Abulk * dEsatL_dVd; + + T2 = Vgst2Vtm * (EsatL + 2.0 * T6); + dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg + + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); + dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); + dT2_dVd = Vgst2Vtm * dEsatL_dVd; + + T3 = sqrt (T1 * T1 - 2.0 * T0 * T2); + Vdsat = (T1 - T3) / T0; + + dT3_dVg = + (T1 * dT1_dVg - 2.0 * (T0 * dT2_dVg + T2 * dT0_dVg)) / T3; + dT3_dVd = + (T1 * dT1_dVd - 2.0 * (T0 * dT2_dVd + T2 * dT0_dVd)) / T3; + dT3_dVb = + (T1 * dT1_dVb - 2.0 * (T0 * dT2_dVb + T2 * dT0_dVb)) / T3; + + dVdsat_dVg = + (dT1_dVg - + (T1 * dT1_dVg - dT0_dVg * T2 - + T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; + dVdsat_dVb = + (dT1_dVb - + (T1 * dT1_dVb - dT0_dVb * T2 - + T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; + dVdsat_dVd = + (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; + } + here->BSIM3vdsat = Vdsat; /* Effective Vds (Vdseff) Calculation */ - T1 = Vdsat - Vds - pParam->BSIM3delta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; + T1 = Vdsat - Vds - pParam->BSIM3delta; + dT1_dVg = dVdsat_dVg; + dT1_dVd = dVdsat_dVd - 1.0; + dT1_dVb = dVdsat_dVb; - T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM3delta * Vdsat); + T2 = sqrt (T1 * T1 + 4.0 * pParam->BSIM3delta * Vdsat); T0 = T1 / T2; T3 = 2.0 * pParam->BSIM3delta / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - - Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - /* Added to eliminate non-zero Vdseff at Vds=0.0 */ - if (Vds == 0.0) - { Vdseff = 0.0; - dVdseff_dVg = 0.0; - dVdseff_dVb = 0.0; - } + dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; + dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; + dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; + + Vdseff = Vdsat - 0.5 * (T1 + T2); + dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); + dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); + dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + /* Added to eliminate non-zero Vdseff at Vds=0.0 */ + if (Vds == 0.0) + { + Vdseff = 0.0; + dVdseff_dVg = 0.0; + dVdseff_dVb = 0.0; + } + break; + + case BSIM3V32: + default: + /* Do nothing */ + } /* Calculate VAsat */ - tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; - T9 = WVCoxRds * Vgsteff; + tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; + T9 = WVCoxRds * Vgsteff; T8 = T9 / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - - T7 = 2.0 * WVCoxRds * tmp4; - dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - - dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; - - T9 = WVCoxRds * Abulk; - T1 = 2.0 / Lambda - 1.0 + T9; - dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); - dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; - - if (Vdseff > Vds) - Vdseff = Vds; - diffVds = Vds - Vdseff; + T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; + + T7 = 2.0 * WVCoxRds * tmp4; + dT0_dVg = + dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + + tmp2 * + Vgsteff) - + T8 * (Abulk * dVdsat_dVg - + Abulk * Vdsat / Vgst2Vtm + Vdsat * dAbulk_dVg); + + dT0_dVb = + dEsatL_dVb + dVdsat_dVb + + T7 * tmp3 * Vgsteff - + T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); + dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; + + T9 = WVCoxRds * Abulk; + T1 = 2.0 / Lambda - 1.0 + T9; + dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); + dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; + + Vasat = T0 / T1; + dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; + dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; + dVasat_dVd = dT0_dVd / T1; + + if (Vdseff > Vds) + Vdseff = Vds; /* This code is added to fixed the problem + * caused by computer precision when + * Vds is very close to Vdseff. */ + diffVds = Vds - Vdseff; + + here->BSIM3Vdseff = Vdseff; /* Calculate VACLM */ - if ((pParam->BSIM3pclm > 0.0) && (diffVds > 1.0e-10)) - { T0 = 1.0 / (pParam->BSIM3pclm * Abulk * pParam->BSIM3litl); - dT0_dVb = -T0 / Abulk * dAbulk_dVb; - dT0_dVg = -T0 / Abulk * dAbulk_dVg; - + if ((pParam->BSIM3pclm > 0.0) && (diffVds > 1.0e-10)) + { + T0 = 1.0 / (pParam->BSIM3pclm * Abulk * pParam->BSIM3litl); + dT0_dVb = -T0 / Abulk * dAbulk_dVb; + dT0_dVg = -T0 / Abulk * dAbulk_dVg; + T2 = Vgsteff / EsatL; - T1 = Leff * (Abulk + T2); - dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg); - dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); - dT1_dVd = -T2 * dEsatL_dVd / Esat; + T1 = Leff * (Abulk + T2); + dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg); + dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); + dT1_dVd = -T2 * dEsatL_dVd / Esat; T9 = T0 * T1; - VACLM = T9 * diffVds; - dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg - + T1 * diffVds * dT0_dVg; - dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - - T9 * dVdseff_dVb; - dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); - } + VACLM = T9 * diffVds; + dVACLM_dVg = + T0 * dT1_dVg * diffVds - + T9 * dVdseff_dVg + T1 * diffVds * dT0_dVg; + dVACLM_dVb = + (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - T9 * dVdseff_dVb; + dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); + } else - { VACLM = MAX_EXP; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0; - } + { + VACLM = MAX_EXP; + dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = 0.0; + } /* Calculate VADIBL */ - if (pParam->BSIM3thetaRout > 0.0) - { T8 = Abulk * Vdsat; + if (pParam->BSIM3thetaRout > 0.0) + { + T8 = Abulk * Vdsat; T0 = Vgst2Vtm * T8; - dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; - dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; + dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 + + Vgst2Vtm * Vdsat * dAbulk_dVg; + dT0_dVb = Vgst2Vtm * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); + dT0_dVd = Vgst2Vtm * Abulk * dVdsat_dVd; - T1 = Vgst2Vtm + T8; - dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; - dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; - dT1_dVd = Abulk * dVdsat_dVd; + T1 = Vgst2Vtm + T8; + dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; + dT1_dVb = Abulk * dVdsat_dVb + dAbulk_dVb * Vdsat; + dT1_dVd = Abulk * dVdsat_dVd; T9 = T1 * T1; T2 = pParam->BSIM3thetaRout; - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; - dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; + VADIBL = (Vgst2Vtm - T0 / T1) / T2; + dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; + dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; + dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; T7 = pParam->BSIM3pdiblb * Vbseff; if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); - VADIBL *= T3; - dVADIBL_dVg *= T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->BSIM3pdiblb) - * T3; - dVADIBL_dVd *= T3; - } + { + T3 = 1.0 / (1.0 + T7); + VADIBL *= T3; + dVADIBL_dVg *= T3; + dVADIBL_dVb = + (dVADIBL_dVb - VADIBL * pParam->BSIM3pdiblb) * T3; + dVADIBL_dVd *= T3; + } else /* Added to avoid the discontinuity problem caused by pdiblcb */ - { T4 = 1.0 / (0.8 + T7); + { + T4 = 1.0 / (0.8 + T7); T3 = (17.0 + 20.0 * T7) * T4; - dVADIBL_dVg *= T3; - dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->BSIM3pdiblb * T4 * T4; - dVADIBL_dVd *= T3; - VADIBL *= T3; - } - } + dVADIBL_dVg *= T3; + dVADIBL_dVb = dVADIBL_dVb * T3 + - VADIBL * pParam->BSIM3pdiblb * T4 * T4; + dVADIBL_dVd *= T3; + VADIBL *= T3; + } + } else - { VADIBL = MAX_EXP; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; - } + { + VADIBL = MAX_EXP; + dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = 0.0; + } /* Calculate VA */ - + T8 = pParam->BSIM3pvag / EsatL; T9 = T8 * Vgsteff; if (T9 > -0.9) - { T0 = 1.0 + T9; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); - dT0_dVb = -T9 * dEsatL_dVb / EsatL; - dT0_dVd = -T9 * dEsatL_dVd / EsatL; - } - else /* Added to avoid the discontinuity problems caused by pvag */ - { T1 = 1.0 / (17.0 + 20.0 * T9); + { + T0 = 1.0 + T9; + dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); + dT0_dVb = -T9 * dEsatL_dVb / EsatL; + dT0_dVd = -T9 * dEsatL_dVd / EsatL; + } + else /* Added to avoid the discontinuity problems caused by pvag */ + { + T1 = 1.0 / (17.0 + 20.0 * T9); T0 = (0.8 + T9) * T1; T1 *= T1; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; - - T9 *= T1 / EsatL; - dT0_dVb = -T9 * dEsatL_dVb; - dT0_dVd = -T9 * dEsatL_dVd; - } - - tmp1 = VACLM * VACLM; - tmp2 = VADIBL * VADIBL; - tmp3 = VACLM + VADIBL; - - T1 = VACLM * VADIBL / tmp3; - tmp3 *= tmp3; - dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; - dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; - dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; - - Va = Vasat + T0 * T1; - dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; - dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; - dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; + dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; + + T9 *= T1 / EsatL; + dT0_dVb = -T9 * dEsatL_dVb; + dT0_dVd = -T9 * dEsatL_dVd; + } + + tmp1 = VACLM * VACLM; + tmp2 = VADIBL * VADIBL; + tmp3 = VACLM + VADIBL; + + T1 = VACLM * VADIBL / tmp3; + tmp3 *= tmp3; + dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; + dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; + dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; + + Va = Vasat + T0 * T1; + dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; + dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; + dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; /* Calculate VASCBE */ if (pParam->BSIM3pscbe2 > 0.0) - { if (diffVds > pParam->BSIM3pscbe1 * pParam->BSIM3litl - / EXP_THRESHOLD) - { T0 = pParam->BSIM3pscbe1 * pParam->BSIM3litl / diffVds; - VASCBE = Leff * exp(T0) / pParam->BSIM3pscbe2; - T1 = T0 * VASCBE / diffVds; - dVASCBE_dVg = T1 * dVdseff_dVg; - dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); - dVASCBE_dVb = T1 * dVdseff_dVb; - } + { + if (diffVds > + pParam->BSIM3pscbe1 * pParam->BSIM3litl / EXP_THRESHOLD) + { + T0 = pParam->BSIM3pscbe1 * pParam->BSIM3litl / diffVds; + VASCBE = Leff * exp (T0) / pParam->BSIM3pscbe2; + T1 = T0 * VASCBE / diffVds; + dVASCBE_dVg = T1 * dVdseff_dVg; + dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); + dVASCBE_dVb = T1 * dVdseff_dVb; + } else - { VASCBE = MAX_EXP * Leff/pParam->BSIM3pscbe2; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } - } + { + VASCBE = MAX_EXP * Leff / pParam->BSIM3pscbe2; + dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; + } + } else - { VASCBE = MAX_EXP; - dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; - } + { + VASCBE = MAX_EXP; + dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; + } /* Calculate Ids */ - CoxWovL = model->BSIM3cox * Weff / Leff; - beta = ueff * CoxWovL; - dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff; - dbeta_dVd = CoxWovL * dueff_dVd; - dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff; - - T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) - / Vgst2Vtm; - - fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; - - T9 = Vdseff / EsatL; - fgche2 = 1.0 + T9; - dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - - T0 = 1.0 + gche * Rds; - T9 = Vdseff / T0; - Idl = gche * T9; - - dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 - - Idl * gche / T0 * dRds_dVg ; - - dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; - dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb - - Idl * dRds_dVb * gche) / T0; - - T9 = diffVds / Va; - T0 = 1.0 + T9; - Idsa = Idl * T0; - dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; - dIdsa_dVd = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - - T9 * dVa_dVd) / Va; - dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; - - T9 = diffVds / VASCBE; - T0 = 1.0 + T9; - Ids = Idsa * T0; - - Gm = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + T9 * dVASCBE_dVg) / VASCBE; - Gds = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd - - T9 * dVASCBE_dVd) / VASCBE; - Gmb = T0 * dIdsa_dVb - Idsa * (dVdseff_dVb - + T9 * dVASCBE_dVb) / VASCBE; - - Gds += Gm * dVgsteff_dVd; + CoxWovL = model->BSIM3cox * Weff / Leff; + beta = ueff * CoxWovL; + dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff; + dbeta_dVd = CoxWovL * dueff_dVd; + dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff; + + T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; + dT0_dVg = -0.5 * (Abulk * dVdseff_dVg + - Abulk * Vdseff / Vgst2Vtm + + Vdseff * dAbulk_dVg) / Vgst2Vtm; + dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; + dT0_dVb = + -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) / Vgst2Vtm; + + fgche1 = Vgsteff * T0; + dfgche1_dVg = Vgsteff * dT0_dVg + T0; + dfgche1_dVd = Vgsteff * dT0_dVd; + dfgche1_dVb = Vgsteff * dT0_dVb; + + T9 = Vdseff / EsatL; + fgche2 = 1.0 + T9; + dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; + dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; + dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; + + gche = beta * fgche1 / fgche2; + dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg + - gche * dfgche2_dVg) / fgche2; + dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd + - gche * dfgche2_dVd) / fgche2; + dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb + - gche * dfgche2_dVb) / fgche2; + + T0 = 1.0 + gche * Rds; + T9 = Vdseff / T0; + Idl = gche * T9; + + dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 + - Idl * gche / T0 * dRds_dVg; + + dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; + dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb + - Idl * dRds_dVb * gche) / T0; + + T9 = diffVds / Va; + T0 = 1.0 + T9; + Idsa = Idl * T0; + dIdsa_dVg = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; + dIdsa_dVd = + T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - T9 * dVa_dVd) / Va; + dIdsa_dVb = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; + + T9 = diffVds / VASCBE; + T0 = 1.0 + T9; + Ids = Idsa * T0; + + Gm = T0 * dIdsa_dVg - Idsa * (dVdseff_dVg + + T9 * dVASCBE_dVg) / VASCBE; + Gds = T0 * dIdsa_dVd + Idsa * (1.0 - dVdseff_dVd - + T9 * dVASCBE_dVd) / VASCBE; + Gmb = T0 * dIdsa_dVb - Idsa * (dVdseff_dVb + + T9 * dVASCBE_dVb) / VASCBE; + + Gds += Gm * dVgsteff_dVd; Gmb += Gm * dVgsteff_dVb; Gm *= dVgsteff_dVg; Gmb *= dVbseff_dVb; - /* Substrate current begins */ - tmp = pParam->BSIM3alpha0 + pParam->BSIM3alpha1 * Leff; - if ((tmp <= 0.0) || (pParam->BSIM3beta0 <= 0.0)) - { Isub = Gbd = Gbb = Gbg = 0.0; - } + /* Substrate current begins */ + tmp = pParam->BSIM3alpha0 + pParam->BSIM3alpha1 * Leff; + if ((tmp <= 0.0) || (pParam->BSIM3beta0 <= 0.0)) + { + Isub = Gbd = Gbb = Gbg = 0.0; + } else - { T2 = tmp / Leff; + { + T2 = tmp / Leff; if (diffVds > pParam->BSIM3beta0 / EXP_THRESHOLD) - { T0 = -pParam->BSIM3beta0 / diffVds; - T1 = T2 * diffVds * exp(T0); + { + T0 = -pParam->BSIM3beta0 / diffVds; + T1 = T2 * diffVds * exp (T0); T3 = T1 / diffVds * (T0 - 1.0); - dT1_dVg = T3 * dVdseff_dVg; - dT1_dVd = T3 * (dVdseff_dVd - 1.0); - dT1_dVb = T3 * dVdseff_dVb; - } + dT1_dVg = T3 * dVdseff_dVg; + dT1_dVd = T3 * (dVdseff_dVd - 1.0); + dT1_dVb = T3 * dVdseff_dVb; + } else - { T3 = T2 * MIN_EXP; + { + T3 = T2 * MIN_EXP; T1 = T3 * diffVds; - dT1_dVg = -T3 * dVdseff_dVg; - dT1_dVd = T3 * (1.0 - dVdseff_dVd); - dT1_dVb = -T3 * dVdseff_dVb; - } - Isub = T1 * Idsa; - Gbg = T1 * dIdsa_dVg + Idsa * dT1_dVg; - Gbd = T1 * dIdsa_dVd + Idsa * dT1_dVd; - Gbb = T1 * dIdsa_dVb + Idsa * dT1_dVb; - - Gbd += Gbg * dVgsteff_dVd; + dT1_dVg = -T3 * dVdseff_dVg; + dT1_dVd = T3 * (1.0 - dVdseff_dVd); + dT1_dVb = -T3 * dVdseff_dVb; + } + Isub = T1 * Idsa; + Gbg = T1 * dIdsa_dVg + Idsa * dT1_dVg; + Gbd = T1 * dIdsa_dVd + Idsa * dT1_dVd; + Gbb = T1 * dIdsa_dVb + Idsa * dT1_dVb; + + Gbd += Gbg * dVgsteff_dVd; Gbb += Gbg * dVgsteff_dVb; Gbg *= dVgsteff_dVg; - Gbb *= dVbseff_dVb; /* bug fixing */ - } - - cdrain = Ids; - here->BSIM3gds = Gds; - here->BSIM3gm = Gm; - here->BSIM3gmbs = Gmb; - - here->BSIM3gbbs = Gbb; - here->BSIM3gbgs = Gbg; - here->BSIM3gbds = Gbd; - - here->BSIM3csub = Isub; - - /* BSIM3 thermal noise Qinv calculated from all capMod - * 0, 1, 2 & 3 stored in here->BSIM3qinv 1/1998 */ - - if ((model->BSIM3xpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbulk = 0.0; - here->BSIM3cggb = here->BSIM3cgsb = here->BSIM3cgdb = 0.0; - here->BSIM3cdgb = here->BSIM3cdsb = here->BSIM3cddb = 0.0; - here->BSIM3cbgb = here->BSIM3cbsb = here->BSIM3cbdb = 0.0; - here->BSIM3cqdb = here->BSIM3cqsb = here->BSIM3cqgb - = here->BSIM3cqbb = 0.0; - here->BSIM3gtau = 0.0; - goto finished; - } + Gbb *= dVbseff_dVb; /* bug fixing */ + } + + cdrain = Ids; + here->BSIM3gds = Gds; + here->BSIM3gm = Gm; + here->BSIM3gmbs = Gmb; + + here->BSIM3gbbs = Gbb; + here->BSIM3gbgs = Gbg; + here->BSIM3gbds = Gbd; + + here->BSIM3csub = Isub; + + /* BSIM3 thermal noise Qinv calculated from all capMod + * 0, 1, 2 & 3 stored in here->BSIM3qinv 1/1998 */ + + if ((model->BSIM3xpart < 0) || (!ChargeComputationNeeded)) + { + qgate = qdrn = qsrc = qbulk = 0.0; + here->BSIM3cggb = here->BSIM3cgsb = here->BSIM3cgdb = 0.0; + here->BSIM3cdgb = here->BSIM3cdsb = here->BSIM3cddb = 0.0; + here->BSIM3cbgb = here->BSIM3cbsb = here->BSIM3cbdb = 0.0; + here->BSIM3cqdb = here->BSIM3cqsb = + here->BSIM3cqgb = here->BSIM3cqbb = 0.0; + here->BSIM3gtau = 0.0; + goto finished; + } else if (model->BSIM3capMod == 0) - { - if (Vbseff < 0.0) - { Vbseff = Vbs; - dVbseff_dVb = 1.0; - } + { + if (Vbseff < 0.0) + { + Vbseff = Vbs; + dVbseff_dVb = 1.0; + } else - { Vbseff = pParam->BSIM3phi - Phis; - dVbseff_dVb = -dPhis_dVb; - } - - Vfb = pParam->BSIM3vfbcv; - Vth = Vfb + pParam->BSIM3phi + pParam->BSIM3k1ox * sqrtPhis; - Vgst = Vgs_eff - Vth; - dVth_dVb = pParam->BSIM3k1ox * dsqrtPhis_dVb; - dVgst_dVb = -dVth_dVb; - dVgst_dVg = dVgs_eff_dVg; - - CoxWL = model->BSIM3cox * pParam->BSIM3weffCV - * pParam->BSIM3leffCV; - Arg1 = Vgs_eff - Vbseff - Vfb; - - if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; - qbulk = -qgate; - qdrn = 0.0; - - here->BSIM3cggb = CoxWL * dVgs_eff_dVg; - here->BSIM3cgdb = 0.0; - here->BSIM3cgsb = CoxWL * (dVbseff_dVb - dVgs_eff_dVg); - - here->BSIM3cdgb = 0.0; - here->BSIM3cddb = 0.0; - here->BSIM3cdsb = 0.0; - - here->BSIM3cbgb = -CoxWL * dVgs_eff_dVg; - here->BSIM3cbdb = 0.0; - here->BSIM3cbsb = -here->BSIM3cgsb; - here->BSIM3qinv = 0.0; - } + { + Vbseff = pParam->BSIM3phi - Phis; + dVbseff_dVb = -dPhis_dVb; + } + + Vfb = pParam->BSIM3vfbcv; + Vth = Vfb + pParam->BSIM3phi + pParam->BSIM3k1ox * sqrtPhis; + Vgst = Vgs_eff - Vth; + dVth_dVb = pParam->BSIM3k1ox * dsqrtPhis_dVb; + dVgst_dVb = -dVth_dVb; + dVgst_dVg = dVgs_eff_dVg; + + CoxWL = model->BSIM3cox * pParam->BSIM3weffCV + * pParam->BSIM3leffCV; + Arg1 = Vgs_eff - Vbseff - Vfb; + + if (Arg1 <= 0.0) + { + qgate = CoxWL * Arg1; + qbulk = -qgate; + qdrn = 0.0; + + here->BSIM3cggb = CoxWL * dVgs_eff_dVg; + here->BSIM3cgdb = 0.0; + here->BSIM3cgsb = CoxWL * (dVbseff_dVb - dVgs_eff_dVg); + + here->BSIM3cdgb = 0.0; + here->BSIM3cddb = 0.0; + here->BSIM3cdsb = 0.0; + + here->BSIM3cbgb = -CoxWL * dVgs_eff_dVg; + here->BSIM3cbdb = 0.0; + here->BSIM3cbsb = -here->BSIM3cgsb; + here->BSIM3qinv = 0.0; + } else if (Vgst <= 0.0) - { T1 = 0.5 * pParam->BSIM3k1ox; - T2 = sqrt(T1 * T1 + Arg1); - qgate = CoxWL * pParam->BSIM3k1ox * (T2 - T1); - qbulk = -qgate; - qdrn = 0.0; - - T0 = CoxWL * T1 / T2; - here->BSIM3cggb = T0 * dVgs_eff_dVg; - here->BSIM3cgdb = 0.0; - here->BSIM3cgsb = T0 * (dVbseff_dVb - dVgs_eff_dVg); - - here->BSIM3cdgb = 0.0; - here->BSIM3cddb = 0.0; - here->BSIM3cdsb = 0.0; - - here->BSIM3cbgb = -here->BSIM3cggb; - here->BSIM3cbdb = 0.0; - here->BSIM3cbsb = -here->BSIM3cgsb; - here->BSIM3qinv = 0.0; - } + { + T1 = 0.5 * pParam->BSIM3k1ox; + T2 = sqrt (T1 * T1 + Arg1); + qgate = CoxWL * pParam->BSIM3k1ox * (T2 - T1); + qbulk = -qgate; + qdrn = 0.0; + + T0 = CoxWL * T1 / T2; + here->BSIM3cggb = T0 * dVgs_eff_dVg; + here->BSIM3cgdb = 0.0; + here->BSIM3cgsb = T0 * (dVbseff_dVb - dVgs_eff_dVg); + + here->BSIM3cdgb = 0.0; + here->BSIM3cddb = 0.0; + here->BSIM3cdsb = 0.0; + + here->BSIM3cbgb = -here->BSIM3cggb; + here->BSIM3cbdb = 0.0; + here->BSIM3cbsb = -here->BSIM3cgsb; + here->BSIM3qinv = 0.0; + } else - { One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; + { + One_Third_CoxWL = CoxWL / 3.0; + Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; - Vdsat = Vgst / AbulkCV; - dVdsat_dVg = dVgs_eff_dVg / AbulkCV; - dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV; + AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; + dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; + Vdsat = Vgst / AbulkCV; + dVdsat_dVg = dVgs_eff_dVg / AbulkCV; + dVdsat_dVb = -(Vdsat * dAbulkCV_dVb + dVth_dVb) / AbulkCV; - if (model->BSIM3xpart > 0.5) - { /* 0/100 Charge partition model */ + if (model->BSIM3xpart > 0.5) + { /* 0/100 Charge partition model */ if (Vdsat <= Vds) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.0; - - here->BSIM3cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3cgsb = -(here->BSIM3cggb + T2); - here->BSIM3cgdb = 0.0; - - here->BSIM3cdgb = 0.0; - here->BSIM3cddb = 0.0; - here->BSIM3cdsb = 0.0; - - here->BSIM3cbgb = -(here->BSIM3cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3cbsb = -(here->BSIM3cbgb + T3); - here->BSIM3cbdb = 0.0; - here->BSIM3qinv = -(qgate + qbulk); - } + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * + (Vgs_eff - Vfb - pParam->BSIM3phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.0; + + here->BSIM3cggb = + One_Third_CoxWL + * (3.0 - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM3cgsb = -(here->BSIM3cggb + T2); + here->BSIM3cgdb = 0.0; + + here->BSIM3cdgb = 0.0; + here->BSIM3cddb = 0.0; + here->BSIM3cdsb = 0.0; + + here->BSIM3cbgb = + -(here-> + BSIM3cggb - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM3cbsb = -(here->BSIM3cbgb + T3); + here->BSIM3cbdb = 0.0; + here->BSIM3qinv = -(qgate + qbulk); + } else - { /* linear region */ + { /* linear region */ Alphaz = Vgst / Vdsat; - T1 = 2.0 * Vdsat - Vds; - T2 = Vds / (3.0 * T1); - T3 = T2 * Vds; - T9 = 0.25 * CoxWL; - T4 = T9 * Alphaz; - T7 = 2.0 * Vds - T1 - 3.0 * T3; - T8 = T3 - T1 - 2.0 * Vds; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3phi - 0.5 * (Vds - T3)); - T10 = T4 * T8; - qdrn = T4 * T7; - qbulk = -(qgate + qdrn + T10); - - T5 = T3 / T1; - here->BSIM3cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3cgsb = -(here->BSIM3cggb + T11 - + here->BSIM3cgdb); - T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T7 = T9 * T7; - T8 = T9 * T8; - T9 = 2.0 * T4 * (1.0 - 3.0 * T5); - here->BSIM3cdgb = (T7 * dAlphaz_dVg - T9 - * dVdsat_dVg) * dVgs_eff_dVg; - T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; - here->BSIM3cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); - here->BSIM3cdsb = -(here->BSIM3cdgb + T12 - + here->BSIM3cddb); - - T9 = 2.0 * T4 * (1.0 + T5); - T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) - * dVgs_eff_dVg; - T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb; - T12 = T4 * (2.0 * T2 + T5 - 1.0); - T0 = -(T10 + T11 + T12); - - here->BSIM3cbgb = -(here->BSIM3cggb - + here->BSIM3cdgb + T10); - here->BSIM3cbdb = -(here->BSIM3cgdb - + here->BSIM3cddb + T12); - here->BSIM3cbsb = -(here->BSIM3cgsb - + here->BSIM3cdsb + T0); - here->BSIM3qinv = -(qgate + qbulk); - } - } + T1 = 2.0 * Vdsat - Vds; + T2 = Vds / (3.0 * T1); + T3 = T2 * Vds; + T9 = 0.25 * CoxWL; + T4 = T9 * Alphaz; + T7 = 2.0 * Vds - T1 - 3.0 * T3; + T8 = T3 - T1 - 2.0 * Vds; + qgate = CoxWL * + (Vgs_eff - + Vfb - pParam->BSIM3phi - 0.5 * (Vds - T3)); + T10 = T4 * T8; + qdrn = T4 * T7; + qbulk = -(qgate + qdrn + T10); + + T5 = T3 / T1; + here->BSIM3cggb = + CoxWL * (1.0 - T5 * dVdsat_dVg) * dVgs_eff_dVg; + T11 = -CoxWL * T5 * dVdsat_dVb; + here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); + here->BSIM3cgsb = + -(here->BSIM3cggb + T11 + here->BSIM3cgdb); + T6 = 1.0 / Vdsat; + dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); + dAlphaz_dVb = + -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); + T7 = T9 * T7; + T8 = T9 * T8; + T9 = 2.0 * T4 * (1.0 - 3.0 * T5); + here->BSIM3cdgb = + (T7 * + dAlphaz_dVg - T9 * dVdsat_dVg) * dVgs_eff_dVg; + T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; + here->BSIM3cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); + here->BSIM3cdsb = + -(here->BSIM3cdgb + T12 + here->BSIM3cddb); + + T9 = 2.0 * T4 * (1.0 + T5); + T10 = (T8 * + dAlphaz_dVg - + T9 * dVdsat_dVg) * dVgs_eff_dVg; + T11 = T8 * dAlphaz_dVb - T9 * dVdsat_dVb; + T12 = T4 * (2.0 * T2 + T5 - 1.0); + T0 = -(T10 + T11 + T12); + + here->BSIM3cbgb = + -(here->BSIM3cggb + here->BSIM3cdgb + T10); + here->BSIM3cbdb = + -(here->BSIM3cgdb + here->BSIM3cddb + T12); + here->BSIM3cbsb = + -(here->BSIM3cgsb + here->BSIM3cdsb + T0); + here->BSIM3qinv = -(qgate + qbulk); + } + } else if (model->BSIM3xpart < 0.5) - { /* 40/60 Charge partition model */ + { /* 40/60 Charge partition model */ if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.4 * T2; - - here->BSIM3cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3cgsb = -(here->BSIM3cggb + T2); - here->BSIM3cgdb = 0.0; - + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * + (Vgs_eff - Vfb - pParam->BSIM3phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.4 * T2; + + here->BSIM3cggb = + One_Third_CoxWL + * (3.0 - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM3cgsb = -(here->BSIM3cggb + T2); + here->BSIM3cgdb = 0.0; + T3 = 0.4 * Two_Third_CoxWL; - here->BSIM3cdgb = -T3 * dVgs_eff_dVg; - here->BSIM3cddb = 0.0; + here->BSIM3cdgb = -T3 * dVgs_eff_dVg; + here->BSIM3cddb = 0.0; T4 = T3 * dVth_dVb; - here->BSIM3cdsb = -(T4 + here->BSIM3cdgb); - - here->BSIM3cbgb = -(here->BSIM3cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3cbsb = -(here->BSIM3cbgb + T3); - here->BSIM3cbdb = 0.0; - here->BSIM3qinv = -(qgate + qbulk); - } + here->BSIM3cdsb = -(T4 + here->BSIM3cdgb); + + here->BSIM3cbgb = + -(here-> + BSIM3cggb - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM3cbsb = -(here->BSIM3cbgb + T3); + here->BSIM3cbdb = 0.0; + here->BSIM3qinv = -(qgate + qbulk); + } else - { /* linear region */ + { /* linear region */ Alphaz = Vgst / Vdsat; T1 = 2.0 * Vdsat - Vds; T2 = Vds / (3.0 * T1); T3 = T2 * Vds; T9 = 0.25 * CoxWL; T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3phi - - 0.5 * (Vds - T3)); + qgate = CoxWL * + (Vgs_eff - + Vfb - pParam->BSIM3phi - 0.5 * (Vds - T3)); T5 = T3 / T1; - here->BSIM3cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3cgsb = -(here->BSIM3cggb - + here->BSIM3cgdb + tmp); + here->BSIM3cggb = + CoxWL * (1.0 - T5 * dVdsat_dVg) * dVgs_eff_dVg; + tmp = -CoxWL * T5 * dVdsat_dVb; + here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); + here->BSIM3cgsb = + -(here->BSIM3cggb + here->BSIM3cgdb + tmp); T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); + dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); + dAlphaz_dVb = + -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); - T6 = 8.0 * Vdsat * Vdsat - 6.0 * Vdsat * Vds - + 1.2 * Vds * Vds; + T6 = 8.0 * Vdsat * + Vdsat - 6.0 * Vdsat * Vds + 1.2 * Vds * Vds; T8 = T2 / T1; T7 = Vds - T1 - T8 * T6; qdrn = T4 * T7; T7 *= T9; tmp = T8 / T1; - tmp1 = T4 * (2.0 - 4.0 * tmp * T6 - + T8 * (16.0 * Vdsat - 6.0 * Vds)); - - here->BSIM3cdgb = (T7 * dAlphaz_dVg - tmp1 - * dVdsat_dVg) * dVgs_eff_dVg; - T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; - here->BSIM3cddb = T4 * (2.0 - (1.0 / (3.0 * T1 - * T1) + 2.0 * tmp) * T6 + T8 - * (6.0 * Vdsat - 2.4 * Vds)); - here->BSIM3cdsb = -(here->BSIM3cdgb - + T10 + here->BSIM3cddb); + tmp1 = T4 * (2.0 - + 4.0 * + tmp * + T6 + T8 * (16.0 * Vdsat - 6.0 * Vds)); + + here->BSIM3cdgb = + (T7 * + dAlphaz_dVg - tmp1 * dVdsat_dVg) * dVgs_eff_dVg; + T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; + here->BSIM3cddb = + T4 * (2.0 - + (1.0 / + (3.0 * + T1 * + T1) + + 2.0 * + tmp) * + T6 + T8 * (6.0 * Vdsat - 2.4 * Vds)); + here->BSIM3cdsb = + -(here->BSIM3cdgb + T10 + here->BSIM3cddb); T7 = 2.0 * (T1 + T3); qbulk = -(qgate - T4 * T7); T7 *= T9; T0 = 4.0 * T4 * (1.0 - T5); - T12 = (-T7 * dAlphaz_dVg - here->BSIM3cdgb - - T0 * dVdsat_dVg) * dVgs_eff_dVg; + T12 = (-T7 * + dAlphaz_dVg - + here-> + BSIM3cdgb - T0 * dVdsat_dVg) * dVgs_eff_dVg; T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; - T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) - - here->BSIM3cddb; - tmp = -(T10 + T11 + T12); - - here->BSIM3cbgb = -(here->BSIM3cggb - + here->BSIM3cdgb + T12); - here->BSIM3cbdb = -(here->BSIM3cgdb - + here->BSIM3cddb + T11); - here->BSIM3cbsb = -(here->BSIM3cgsb - + here->BSIM3cdsb + tmp); - here->BSIM3qinv = -(qgate + qbulk); - } - } + T10 = -4.0 * T4 * + (T2 - 0.5 + 0.5 * T5) - here->BSIM3cddb; + tmp = -(T10 + T11 + T12); + + here->BSIM3cbgb = + -(here->BSIM3cggb + here->BSIM3cdgb + T12); + + here->BSIM3cbdb = -(here->BSIM3cgdb + here->BSIM3cddb + T10); /* bug fix */ + + here->BSIM3cbsb = + -(here->BSIM3cgsb + here->BSIM3cdsb + tmp); + here->BSIM3qinv = -(qgate + qbulk); + } + } else - { /* 50/50 partitioning */ + { /* 50/50 partitioning */ if (Vds >= Vdsat) - { /* saturation region */ - T1 = Vdsat / 3.0; - qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3phi - T1); - T2 = -Two_Third_CoxWL * Vgst; - qbulk = -(qgate + T2); - qdrn = 0.5 * T2; - - here->BSIM3cggb = One_Third_CoxWL * (3.0 - - dVdsat_dVg) * dVgs_eff_dVg; - T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3cgsb = -(here->BSIM3cggb + T2); - here->BSIM3cgdb = 0.0; - - here->BSIM3cdgb = -One_Third_CoxWL * dVgs_eff_dVg; - here->BSIM3cddb = 0.0; + { /* saturation region */ + T1 = Vdsat / 3.0; + qgate = CoxWL * + (Vgs_eff - Vfb - pParam->BSIM3phi - T1); + T2 = -Two_Third_CoxWL * Vgst; + qbulk = -(qgate + T2); + qdrn = 0.5 * T2; + + here->BSIM3cggb = + One_Third_CoxWL + * (3.0 - dVdsat_dVg) * dVgs_eff_dVg; + T2 = -One_Third_CoxWL * dVdsat_dVb; + here->BSIM3cgsb = -(here->BSIM3cggb + T2); + here->BSIM3cgdb = 0.0; + + here->BSIM3cdgb = -One_Third_CoxWL * dVgs_eff_dVg; + here->BSIM3cddb = 0.0; T4 = One_Third_CoxWL * dVth_dVb; - here->BSIM3cdsb = -(T4 + here->BSIM3cdgb); - - here->BSIM3cbgb = -(here->BSIM3cggb - - Two_Third_CoxWL * dVgs_eff_dVg); - T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3cbsb = -(here->BSIM3cbgb + T3); - here->BSIM3cbdb = 0.0; - here->BSIM3qinv = -(qgate + qbulk); - } + here->BSIM3cdsb = -(T4 + here->BSIM3cdgb); + + here->BSIM3cbgb = + -(here-> + BSIM3cggb - Two_Third_CoxWL * dVgs_eff_dVg); + T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); + here->BSIM3cbsb = -(here->BSIM3cbgb + T3); + here->BSIM3cbdb = 0.0; + here->BSIM3qinv = -(qgate + qbulk); + } else - { /* linear region */ + { /* linear region */ Alphaz = Vgst / Vdsat; T1 = 2.0 * Vdsat - Vds; T2 = Vds / (3.0 * T1); T3 = T2 * Vds; T9 = 0.25 * CoxWL; T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3phi - - 0.5 * (Vds - T3)); + qgate = CoxWL * + (Vgs_eff - + Vfb - pParam->BSIM3phi - 0.5 * (Vds - T3)); T5 = T3 / T1; - here->BSIM3cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) - * dVgs_eff_dVg; - tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3cgsb = -(here->BSIM3cggb - + here->BSIM3cgdb + tmp); + here->BSIM3cggb = + CoxWL * (1.0 - T5 * dVdsat_dVg) * dVgs_eff_dVg; + tmp = -CoxWL * T5 * dVdsat_dVb; + here->BSIM3cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); + here->BSIM3cgsb = + -(here->BSIM3cggb + here->BSIM3cgdb + tmp); T6 = 1.0 / Vdsat; - dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); - dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); + dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); + dAlphaz_dVb = + -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); T7 = T1 + T3; qdrn = -T4 * T7; - qbulk = - (qgate + qdrn + qdrn); + qbulk = -(qgate + qdrn + qdrn); T7 *= T9; T0 = T4 * (2.0 * T5 - 2.0); - here->BSIM3cdgb = (T0 * dVdsat_dVg - T7 - * dAlphaz_dVg) * dVgs_eff_dVg; + here->BSIM3cdgb = + (T0 * + dVdsat_dVg - T7 * dAlphaz_dVg) * dVgs_eff_dVg; T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; - here->BSIM3cddb = T4 * (1.0 - 2.0 * T2 - T5); - here->BSIM3cdsb = -(here->BSIM3cdgb + T12 - + here->BSIM3cddb); - - here->BSIM3cbgb = -(here->BSIM3cggb - + 2.0 * here->BSIM3cdgb); - here->BSIM3cbdb = -(here->BSIM3cgdb - + 2.0 * here->BSIM3cddb); - here->BSIM3cbsb = -(here->BSIM3cgsb - + 2.0 * here->BSIM3cdsb); - here->BSIM3qinv = -(qgate + qbulk); - } - } - } - } + here->BSIM3cddb = T4 * (1.0 - 2.0 * T2 - T5); + here->BSIM3cdsb = + -(here->BSIM3cdgb + T12 + here->BSIM3cddb); + + here->BSIM3cbgb = + -(here->BSIM3cggb + 2.0 * here->BSIM3cdgb); + here->BSIM3cbdb = + -(here->BSIM3cgdb + 2.0 * here->BSIM3cddb); + here->BSIM3cbsb = + -(here->BSIM3cgsb + 2.0 * here->BSIM3cdsb); + here->BSIM3qinv = -(qgate + qbulk); + } + } + } + } else - { if (Vbseff < 0.0) - { VbseffCV = Vbseff; - dVbseffCV_dVb = 1.0; - } + { + if (Vbseff < 0.0) + { + VbseffCV = Vbseff; + dVbseffCV_dVb = 1.0; + } + else + { + VbseffCV = pParam->BSIM3phi - Phis; + dVbseffCV_dVb = -dPhis_dVb; + } + + CoxWL = model->BSIM3cox * pParam->BSIM3weffCV + * pParam->BSIM3leffCV; + + /* Seperate VgsteffCV with noff and voffcv */ + noff = n * pParam->BSIM3noff; + dnoff_dVd = pParam->BSIM3noff * dn_dVd; + dnoff_dVb = pParam->BSIM3noff * dn_dVb; + T0 = Vtm * noff; + voffcv = pParam->BSIM3voffcv; + VgstNVt = (Vgst - voffcv) / T0; + + if (VgstNVt > EXP_THRESHOLD) + { + Vgsteff = Vgst - voffcv; + dVgsteff_dVg = dVgs_eff_dVg; + dVgsteff_dVd = -dVth_dVd; + dVgsteff_dVb = -dVth_dVb; + } + else if (VgstNVt < -EXP_THRESHOLD) + { + Vgsteff = T0 * log (1.0 + MIN_EXP); + dVgsteff_dVg = 0.0; + dVgsteff_dVd = Vgsteff / noff; + dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb; + dVgsteff_dVd *= dnoff_dVd; + } else - { VbseffCV = pParam->BSIM3phi - Phis; - dVbseffCV_dVb = -dPhis_dVb; - } - - CoxWL = model->BSIM3cox * pParam->BSIM3weffCV - * pParam->BSIM3leffCV; - - /* Seperate VgsteffCV with noff and voffcv */ - noff = n * pParam->BSIM3noff; - dnoff_dVd = pParam->BSIM3noff * dn_dVd; - dnoff_dVb = pParam->BSIM3noff * dn_dVb; - T0 = Vtm * noff; - voffcv = pParam->BSIM3voffcv; - VgstNVt = (Vgst - voffcv) / T0; - - if (VgstNVt > EXP_THRESHOLD) - { Vgsteff = Vgst - voffcv; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = -dVth_dVb; - } - else if (VgstNVt < -EXP_THRESHOLD) - { Vgsteff = T0 * log(1.0 + MIN_EXP); - dVgsteff_dVg = 0.0; - dVgsteff_dVd = Vgsteff / noff; - dVgsteff_dVb = dVgsteff_dVd * dnoff_dVb; - dVgsteff_dVd *= dnoff_dVd; - } - else - { ExpVgst = exp(VgstNVt); - Vgsteff = T0 * log(1.0 + ExpVgst); - dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst); - dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgst - voffcv) - / noff * dnoff_dVd) + Vgsteff / noff * dnoff_dVd; - dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgst - voffcv) - / noff * dnoff_dVb) + Vgsteff / noff * dnoff_dVb; - dVgsteff_dVg *= dVgs_eff_dVg; - } /* End of VgsteffCV */ + { + ExpVgst = exp (VgstNVt); + Vgsteff = T0 * log (1.0 + ExpVgst); + dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst); + dVgsteff_dVd = + -dVgsteff_dVg * (dVth_dVd + + (Vgst - + voffcv) / + noff * + dnoff_dVd) + Vgsteff / noff * dnoff_dVd; + dVgsteff_dVb = + -dVgsteff_dVg * (dVth_dVb + + (Vgst - + voffcv) / + noff * + dnoff_dVb) + Vgsteff / noff * dnoff_dVb; + dVgsteff_dVg *= dVgs_eff_dVg; + } /* End of VgsteffCV */ if (model->BSIM3capMod == 1) - { Vfb = pParam->BSIM3vfbzb; - Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff; - - if (Arg1 <= 0.0) - { qgate = CoxWL * Arg1; - Cgg = CoxWL * (dVgs_eff_dVg - dVgsteff_dVg); - Cgd = -CoxWL * dVgsteff_dVd; - Cgb = -CoxWL * (dVbseffCV_dVb + dVgsteff_dVb); - } - else - { T0 = 0.5 * pParam->BSIM3k1ox; - T1 = sqrt(T0 * T0 + Arg1); - T2 = CoxWL * T0 / T1; - - qgate = CoxWL * pParam->BSIM3k1ox * (T1 - T0); - - Cgg = T2 * (dVgs_eff_dVg - dVgsteff_dVg); - Cgd = -T2 * dVgsteff_dVd; - Cgb = -T2 * (dVbseffCV_dVb + dVgsteff_dVb); - } - qbulk = -qgate; - Cbg = -Cgg; - Cbd = -Cgd; - Cbb = -Cgb; - - One_Third_CoxWL = CoxWL / 3.0; - Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; - if (VdsatCV < Vds) - { dVdsatCV_dVg = 1.0 / AbulkCV; - dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; + { + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + Vfb = pParam->BSIM3vfbzb; + break; + + case BSIM3V32: + Vfb = pParam->BSIM3vfbzb; + dVfb_dVb = dVfb_dVd = 0.0; + break; + + default: + Vfb = Vth - pParam->BSIM3phi - + pParam->BSIM3k1ox * sqrtPhis; + dVfb_dVb = dVth_dVb - pParam->BSIM3k1ox * dsqrtPhis_dVb; + dVfb_dVd = dVth_dVd; + } + + Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff; + + if (Arg1 <= 0.0) + { + qgate = CoxWL * Arg1; + Cgg = CoxWL * (dVgs_eff_dVg - dVgsteff_dVg); + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + + Cgd = -CoxWL * dVgsteff_dVd; + Cgb = -CoxWL * (dVbseffCV_dVb + dVgsteff_dVb); + break; + + case BSIM3V32: + default: + + Cgd = -CoxWL * (dVfb_dVd + dVgsteff_dVd); + Cgb = -CoxWL * + (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); + } + + } + else + { + T0 = 0.5 * pParam->BSIM3k1ox; + T1 = sqrt (T0 * T0 + Arg1); + T2 = CoxWL * T0 / T1; + + qgate = CoxWL * pParam->BSIM3k1ox * (T1 - T0); + + Cgg = T2 * (dVgs_eff_dVg - dVgsteff_dVg); + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + + Cgd = -T2 * dVgsteff_dVd; + Cgb = -T2 * (dVbseffCV_dVb + dVgsteff_dVb); + break; + + case BSIM3V32: + default: + + Cgd = -T2 * (dVfb_dVd + dVgsteff_dVd); + Cgb = -T2 * + (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); + } + + } + qbulk = -qgate; + Cbg = -Cgg; + Cbd = -Cgd; + Cbb = -Cgb; + + One_Third_CoxWL = CoxWL / 3.0; + Two_Third_CoxWL = 2.0 * One_Third_CoxWL; + AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; + dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; + VdsatCV = Vgsteff / AbulkCV; + if (VdsatCV < Vds) + { + dVdsatCV_dVg = 1.0 / AbulkCV; + dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; T0 = Vgsteff - VdsatCV / 3.0; - dT0_dVg = 1.0 - dVdsatCV_dVg / 3.0; - dT0_dVb = -dVdsatCV_dVb / 3.0; - qgate += CoxWL * T0; - Cgg1 = CoxWL * dT0_dVg; - Cgb1 = CoxWL * dT0_dVb + Cgg1 * dVgsteff_dVb; - Cgd1 = Cgg1 * dVgsteff_dVd; + dT0_dVg = 1.0 - dVdsatCV_dVg / 3.0; + dT0_dVb = -dVdsatCV_dVb / 3.0; + qgate += CoxWL * T0; + Cgg1 = CoxWL * dT0_dVg; + Cgb1 = CoxWL * dT0_dVb + Cgg1 * dVgsteff_dVb; + Cgd1 = Cgg1 * dVgsteff_dVd; Cgg1 *= dVgsteff_dVg; Cgg += Cgg1; Cgb += Cgb1; @@ -1589,167 +1984,306 @@ for (; model != NULL; model = model->BSIM3nextModel) T0 = VdsatCV - Vgsteff; dT0_dVg = dVdsatCV_dVg - 1.0; dT0_dVb = dVdsatCV_dVb; - qbulk += One_Third_CoxWL * T0; - Cbg1 = One_Third_CoxWL * dT0_dVg; + qbulk += One_Third_CoxWL * T0; + Cbg1 = One_Third_CoxWL * dT0_dVg; Cbb1 = One_Third_CoxWL * dT0_dVb + Cbg1 * dVgsteff_dVb; Cbd1 = Cbg1 * dVgsteff_dVd; Cbg1 *= dVgsteff_dVg; Cbg += Cbg1; Cbb += Cbb1; - Cbd += Cbd1; - - if (model->BSIM3xpart > 0.5) - T0 = -Two_Third_CoxWL; - else if (model->BSIM3xpart < 0.5) - T0 = -0.4 * CoxWL; - else - T0 = -One_Third_CoxWL; - - qsrc = T0 * Vgsteff; - Csg = T0 * dVgsteff_dVg; - Csb = T0 * dVgsteff_dVb; - Csd = T0 * dVgsteff_dVd; + Cbd += Cbd1; + + if (model->BSIM3xpart > 0.5) + T0 = -Two_Third_CoxWL; + else if (model->BSIM3xpart < 0.5) + T0 = -0.4 * CoxWL; + else + T0 = -One_Third_CoxWL; + + qsrc = T0 * Vgsteff; + Csg = T0 * dVgsteff_dVg; + Csb = T0 * dVgsteff_dVb; + Csd = T0 * dVgsteff_dVd; Cgb *= dVbseff_dVb; Cbb *= dVbseff_dVb; Csb *= dVbseff_dVb; - } - else - { T0 = AbulkCV * Vds; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.e-20); + } + else + { + T0 = AbulkCV * Vds; + T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.e-20); T2 = Vds / T1; T3 = T0 * T2; - dT3_dVg = -12.0 * T2 * T2 * AbulkCV; - dT3_dVd = 6.0 * T0 * (4.0 * Vgsteff - T0) / T1 / T1 - 0.5; - dT3_dVb = 12.0 * T2 * T2 * dAbulkCV_dVb * Vgsteff; - - qgate += CoxWL * (Vgsteff - 0.5 * Vds + T3); - Cgg1 = CoxWL * (1.0 + dT3_dVg); - Cgb1 = CoxWL * dT3_dVb + Cgg1 * dVgsteff_dVb; - Cgd1 = CoxWL * dT3_dVd + Cgg1 * dVgsteff_dVd; + dT3_dVg = -12.0 * T2 * T2 * AbulkCV; + dT3_dVd = + 6.0 * T0 * (4.0 * Vgsteff - T0) / T1 / T1 - 0.5; + dT3_dVb = 12.0 * T2 * T2 * dAbulkCV_dVb * Vgsteff; + + qgate += CoxWL * (Vgsteff - 0.5 * Vds + T3); + Cgg1 = CoxWL * (1.0 + dT3_dVg); + Cgb1 = CoxWL * dT3_dVb + Cgg1 * dVgsteff_dVb; + Cgd1 = CoxWL * dT3_dVd + Cgg1 * dVgsteff_dVd; Cgg1 *= dVgsteff_dVg; Cgg += Cgg1; Cgb += Cgb1; Cgd += Cgd1; - qbulk += CoxWL * (1.0 - AbulkCV) * (0.5 * Vds - T3); + qbulk += CoxWL * (1.0 - AbulkCV) * (0.5 * Vds - T3); Cbg1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVg); - Cbb1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVb - + (0.5 * Vds - T3) * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; - Cbd1 = -CoxWL * (1.0 - AbulkCV) * dT3_dVd - + Cbg1 * dVgsteff_dVd; + Cbb1 = -CoxWL * + ((1.0 - + AbulkCV) * dT3_dVb + + (0.5 * Vds - + T3) * dAbulkCV_dVb) + Cbg1 * dVgsteff_dVb; + Cbd1 = -CoxWL * (1.0 - + AbulkCV) * + dT3_dVd + Cbg1 * dVgsteff_dVd; Cbg1 *= dVgsteff_dVg; Cbg += Cbg1; Cbb += Cbb1; Cbd += Cbd1; - if (model->BSIM3xpart > 0.5) - { /* 0/100 Charge petition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - Csg = -CoxWL * (0.5 + 24.0 * T0 * Vds / T1 / T1 - * AbulkCV); - Csb = -CoxWL * (0.25 * Vds * dAbulkCV_dVb - - 12.0 * T0 * Vds / T1 / T1 * (4.0 * Vgsteff - T0) - * dAbulkCV_dVb) + Csg * dVgsteff_dVb; - Csd = -CoxWL * (0.25 * AbulkCV - 12.0 * AbulkCV * T0 - / T1 / T1 * (4.0 * Vgsteff - T0)) - + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; - } + if (model->BSIM3xpart > 0.5) + { /* 0/100 Charge petition model */ + T1 = T1 + T1; + qsrc = -CoxWL * (0.5 * + Vgsteff + + 0.25 * T0 - T0 * T0 / T1); + Csg = -CoxWL * (0.5 + + 24.0 * + T0 * Vds / T1 / T1 * AbulkCV); + Csb = -CoxWL * (0.25 * + Vds * + dAbulkCV_dVb + - + 12.0 * + T0 * + Vds / + T1 / + T1 * + (4.0 * + Vgsteff + - + T0) * + dAbulkCV_dVb) + Csg * dVgsteff_dVb; + Csd = -CoxWL * (0.25 * + AbulkCV + - + 12.0 * + AbulkCV + * T0 / + T1 / + T1 * + (4.0 * + Vgsteff + - T0)) + Csg * dVgsteff_dVd; + Csg *= dVgsteff_dVg; + } else if (model->BSIM3xpart < 0.5) - { /* 40/60 Charge petition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T4 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - Csg = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - Csb = (qsrc / T1 * Vds + T2 * T4 * Vds) * dAbulkCV_dVb - + Csg * dVgsteff_dVb; - Csd = (qsrc / T1 + T2 * T4) * AbulkCV - + Csg * dVgsteff_dVd; - Csg *= dVgsteff_dVg; - } + { /* 40/60 Charge petition model */ + T1 = T1 / 12.0; + T2 = 0.5 * CoxWL / (T1 * T1); + T3 = Vgsteff * (2.0 * + T0 * + T0 / + 3.0 + + Vgsteff + * + (Vgsteff + - + 4.0 * + T0 / + 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; + qsrc = -T2 * T3; + T4 = 4.0 / 3.0 * + Vgsteff * (Vgsteff - T0) + 0.4 * T0 * T0; + Csg = -2.0 * qsrc / + T1 - + T2 * + (Vgsteff * + (3.0 * + Vgsteff - + 8.0 * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); + Csb = (qsrc / T1 * + Vds + + T2 * T4 * + Vds) * dAbulkCV_dVb + Csg * dVgsteff_dVb; + Csd = (qsrc / T1 + + T2 * T4) * AbulkCV + Csg * dVgsteff_dVd; + Csg *= dVgsteff_dVg; + } else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } + { /* 50/50 Charge petition model */ + qsrc = -0.5 * (qgate + qbulk); + Csg = -0.5 * (Cgg1 + Cbg1); + Csb = -0.5 * (Cgb1 + Cbb1); + Csd = -0.5 * (Cgd1 + Cbd1); + } Cgb *= dVbseff_dVb; Cbb *= dVbseff_dVb; Csb *= dVbseff_dVb; - } - qdrn = -(qgate + qbulk + qsrc); - here->BSIM3cggb = Cgg; - here->BSIM3cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3cgdb = Cgd; - here->BSIM3cdgb = -(Cgg + Cbg + Csg); - here->BSIM3cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3cddb = -(Cgd + Cbd + Csd); - here->BSIM3cbgb = Cbg; - here->BSIM3cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3cbdb = Cbd; - here->BSIM3qinv = -(qgate + qbulk); - } + } + qdrn = -(qgate + qbulk + qsrc); + here->BSIM3cggb = Cgg; + here->BSIM3cgsb = -(Cgg + Cgd + Cgb); + here->BSIM3cgdb = Cgd; + here->BSIM3cdgb = -(Cgg + Cbg + Csg); + here->BSIM3cdsb = + (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + Csg + Csd + Csb); + here->BSIM3cddb = -(Cgd + Cbd + Csd); + here->BSIM3cbgb = Cbg; + here->BSIM3cbsb = -(Cbg + Cbd + Cbb); + here->BSIM3cbdb = Cbd; + here->BSIM3qinv = -(qgate + qbulk); + } else if (model->BSIM3capMod == 2) - { Vfb = pParam->BSIM3vfbzb; - V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; + { + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + + Vfb = pParam->BSIM3vfbzb; + break; + + case BSIM3V32: + Vfb = pParam->BSIM3vfbzb; + dVfb_dVb = dVfb_dVd = 0.0; + break; + + default: /* old code prior to v3.2 */ + Vfb = Vth - pParam->BSIM3phi - + pParam->BSIM3k1ox * sqrtPhis; + dVfb_dVb = dVth_dVb - pParam->BSIM3k1ox * dsqrtPhis_dVb; + dVfb_dVd = dVth_dVd; + } + + V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; if (Vfb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); + { + T0 = sqrt (V3 * V3 - 4.0 * DELTA_3 * Vfb); T2 = -DELTA_3 / T0; - } + } else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb); + { + T0 = sqrt (V3 * V3 + 4.0 * DELTA_3 * Vfb); T2 = DELTA_3 / T0; - } + } T1 = 0.5 * (1.0 + V3 / T0); Vfbeff = Vfb - 0.5 * (V3 + T0); + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + /* Do nothing */ + break; + + case BSIM3V32: + default: + dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; + } + dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1 * dVbseffCV_dVb; + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + dVfbeff_dVb = -T1 * dVbseffCV_dVb; + break; + + case BSIM3V32: + default: + dVfbeff_dVb = + (1.0 - T1 - T2) * dVfb_dVb - T1 * dVbseffCV_dVb; + } + Qac0 = CoxWL * (Vfbeff - Vfb); dQac0_dVg = CoxWL * dVfbeff_dVg; - dQac0_dVb = CoxWL * dVfbeff_dVb; - T0 = 0.5 * pParam->BSIM3k1ox; + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + /* Do nothing */ + break; + + case BSIM3V32: + default: + dQac0_dVd = CoxWL * (dVfbeff_dVd - dVfb_dVd); + } + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + dQac0_dVb = CoxWL * dVfbeff_dVb; + break; + case BSIM3V32: + default: + dQac0_dVb = CoxWL * (dVfbeff_dVb - dVfb_dVb); + } + + T0 = 0.5 * pParam->BSIM3k1ox; T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM3k1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } + if (pParam->BSIM3k1ox == 0.0) + { + T1 = 0.0; + T2 = 0.0; + } else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM3k1ox; - T2 = CoxWL; - } + { + T1 = T0 + T3 / pParam->BSIM3k1ox; + T2 = CoxWL; + } else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWL * T0 / T1; - } + { + T1 = sqrt (T0 * T0 + T3); + T2 = CoxWL * T0 / T1; + } Qsub0 = CoxWL * pParam->BSIM3k1ox * (T1 - T0); - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb - + dVgsteff_dVb); + dQsub0_dVg = + T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); - AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; - VdsatCV = Vgsteff / AbulkCV; + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + + dQsub0_dVd = -T2 * dVgsteff_dVd; + break; + + case BSIM3V32: + default: + dQsub0_dVd = -T2 * (dVfbeff_dVd + dVgsteff_dVd); + } + + dQsub0_dVb = + -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb); + + AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; + dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; + VdsatCV = Vgsteff / AbulkCV; V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); + T0 = sqrt (V4 * V4 + 4.0 * DELTA_4 * VdsatCV); VdseffCV = VdsatCV - 0.5 * (V4 + T0); T1 = 0.5 * (1.0 + V4 / T0); T2 = DELTA_4 / T0; @@ -1757,239 +2291,353 @@ for (; model != NULL; model = model->BSIM3nextModel) dVdseffCV_dVg = T3; dVdseffCV_dVd = T1; dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ - if (Vds == 0.0) - { VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ + if (Vds == 0.0) + { + VdseffCV = 0.0; + dVdseffCV_dVg = 0.0; + dVdseffCV_dVb = 0.0; + } + break; + + case BSIM3V32: + default: + /* Do nothing */ + } + + T0 = AbulkCV * VdseffCV; + T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); T2 = VdseffCV / T1; T3 = T0 * T2; - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; + T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); + T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); + T6 = 12.0 * T2 * T2 * Vgsteff; - qinoi = -CoxWL * (Vgsteff - 0.5 * T0 + AbulkCV * T3); - qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb; + qinoi = -CoxWL * (Vgsteff - 0.5 * T0 + AbulkCV * T3); + qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); + Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd; + Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + + T6 * dAbulkCV_dVb) + Cgg1 * dVgsteff_dVb; Cgg1 *= dVgsteff_dVg; T7 = 1.0 - AbulkCV; - qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); + qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3); T4 = -T7 * (T4 - 1.0); T5 = -T7 * T5; T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; - Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb; + Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd; + Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + + T6 * dAbulkCV_dVb) + Cbg1 * dVgsteff_dVb; Cbg1 *= dVgsteff_dVg; - if (model->BSIM3xpart > 0.5) - { /* 0/100 Charge petition model */ + if (model->BSIM3xpart > 0.5) + { /* 0/100 Charge petition model */ T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); + qsrc = -CoxWL * (0.5 * + Vgsteff + 0.25 * T0 - T0 * T0 / T1); T7 = (4.0 * Vgsteff - T0) / (T1 * T1); T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; + T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); + Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; + Csb = CoxWL * (T5 * + dVdseffCV_dVb + + T6 * dAbulkCV_dVb) + Csg * dVgsteff_dVb; Csg *= dVgsteff_dVg; - } + } else if (model->BSIM3xpart < 0.5) - { /* 40/60 Charge petition model */ + { /* 40/60 Charge petition model */ T1 = T1 / 12.0; T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; + T3 = Vgsteff * (2.0 * T0 * + T0 / 3.0 + + Vgsteff * + (Vgsteff - + 4.0 * T0 / + 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); + T7 = 4.0 / 3.0 * Vgsteff * + (Vgsteff - T0) + 0.4 * T0 * T0; + T4 = -2.0 * qsrc / T1 - + T2 * (Vgsteff * + (3.0 * Vgsteff - + 8.0 * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); T5 = (qsrc / T1 + T2 * T7) * AbulkCV; T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg = (T4 + T5 * dVdseffCV_dVg); - Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; - Csb = (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb; + Csg = (T4 + T5 * dVdseffCV_dVg); + Csd = T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd; + Csb = (T5 * dVdseffCV_dVb + + T6 * dAbulkCV_dVb) + Csg * dVgsteff_dVb; Csg *= dVgsteff_dVg; - } + } else - { /* 50/50 Charge petition model */ - qsrc = -0.5 * (qgate + qbulk); - Csg = -0.5 * (Cgg1 + Cbg1); - Csb = -0.5 * (Cgb1 + Cbb1); - Csd = -0.5 * (Cgd1 + Cbd1); - } + { /* 50/50 Charge petition model */ + qsrc = -0.5 * (qgate + qbulk); + Csg = -0.5 * (Cgg1 + Cbg1); + Csb = -0.5 * (Cgb1 + Cbb1); + Csd = -0.5 * (Cgd1 + Cbd1); + } qgate += Qac0 + Qsub0; qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); + qdrn = -(qgate + qbulk + qsrc); Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; - Cgd = dQsub0_dVd + Cgd1; + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + Cgd = dQsub0_dVd + Cgd1; + break; + + case BSIM3V32: + default: + Cgd = dQac0_dVd + dQsub0_dVd + Cgd1; + } + Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + Cbd = Cbd1 - dQsub0_dVd; + break; + + case BSIM3V32: + default: + Cbd = Cbd1 - dQac0_dVd - dQsub0_dVd; + } + Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; Cgb *= dVbseff_dVb; Cbb *= dVbseff_dVb; Csb *= dVbseff_dVb; - here->BSIM3cggb = Cgg; - here->BSIM3cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3cgdb = Cgd; - here->BSIM3cdgb = -(Cgg + Cbg + Csg); - here->BSIM3cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3cddb = -(Cgd + Cbd + Csd); - here->BSIM3cbgb = Cbg; - here->BSIM3cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3cbdb = Cbd; - here->BSIM3qinv = qinoi; - } - - /* New Charge-Thickness capMod (CTM) begins */ + here->BSIM3cggb = Cgg; + here->BSIM3cgsb = -(Cgg + Cgd + Cgb); + here->BSIM3cgdb = Cgd; + here->BSIM3cdgb = -(Cgg + Cbg + Csg); + here->BSIM3cdsb = + (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + Csg + Csd + Csb); + here->BSIM3cddb = -(Cgd + Cbd + Csd); + here->BSIM3cbgb = Cbg; + here->BSIM3cbsb = -(Cbg + Cbd + Cbb); + here->BSIM3cbdb = Cbd; + here->BSIM3qinv = qinoi; + } + + /* New Charge-Thickness capMod (CTM) begins */ else if (model->BSIM3capMod == 3) - { V3 = pParam->BSIM3vfbzb - Vgs_eff + VbseffCV - DELTA_3; + { + V3 = pParam->BSIM3vfbzb - Vgs_eff + VbseffCV - DELTA_3; if (pParam->BSIM3vfbzb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * pParam->BSIM3vfbzb); + { + T0 = sqrt (V3 * V3 - + 4.0 * DELTA_3 * pParam->BSIM3vfbzb); T2 = -DELTA_3 / T0; - } + } else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * pParam->BSIM3vfbzb); + { + T0 = sqrt (V3 * V3 + + 4.0 * DELTA_3 * pParam->BSIM3vfbzb); T2 = DELTA_3 / T0; - } + } T1 = 0.5 * (1.0 + V3 / T0); Vfbeff = pParam->BSIM3vfbzb - 0.5 * (V3 + T0); dVfbeff_dVg = T1 * dVgs_eff_dVg; dVfbeff_dVb = -T1 * dVbseffCV_dVb; - Cox = model->BSIM3cox; - Tox = 1.0e8 * model->BSIM3tox; - T0 = (Vgs_eff - VbseffCV - pParam->BSIM3vfbzb) / Tox; - dT0_dVg = dVgs_eff_dVg / Tox; - dT0_dVb = -dVbseffCV_dVb / Tox; - - tmp = T0 * pParam->BSIM3acde; - if ((-EXP_THRESHOLD < tmp) && (tmp < EXP_THRESHOLD)) - { Tcen = pParam->BSIM3ldeb * exp(tmp); - dTcen_dVg = pParam->BSIM3acde * Tcen; - dTcen_dVb = dTcen_dVg * dT0_dVb; - dTcen_dVg *= dT0_dVg; - } - else if (tmp <= -EXP_THRESHOLD) - { Tcen = pParam->BSIM3ldeb * MIN_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - else - { Tcen = pParam->BSIM3ldeb * MAX_EXP; - dTcen_dVg = dTcen_dVb = 0.0; - } - - LINK = 1.0e-3 * model->BSIM3tox; - V3 = pParam->BSIM3ldeb - Tcen - LINK; - V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->BSIM3ldeb); - Tcen = pParam->BSIM3ldeb - 0.5 * (V3 + V4); - T1 = 0.5 * (1.0 + V3 / V4); - dTcen_dVg *= T1; - dTcen_dVb *= T1; - - Ccen = EPSSI / Tcen; - T2 = Cox / (Cox + Ccen); - Coxeff = T2 * Ccen; - T3 = -Ccen / Tcen; - dCoxeff_dVg = T2 * T2 * T3; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - CoxWLcen = CoxWL * Coxeff / Cox; - - Qac0 = CoxWLcen * (Vfbeff - pParam->BSIM3vfbzb); - QovCox = Qac0 / Coxeff; - dQac0_dVg = CoxWLcen * dVfbeff_dVg - + QovCox * dCoxeff_dVg; - dQac0_dVb = CoxWLcen * dVfbeff_dVb - + QovCox * dCoxeff_dVb; - - T0 = 0.5 * pParam->BSIM3k1ox; - T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM3k1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM3k1ox; - T2 = CoxWLcen; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLcen * T0 / T1; - } - - Qsub0 = CoxWLcen * pParam->BSIM3k1ox * (T1 - T0); - QovCox = Qsub0 / Coxeff; - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg) - + QovCox * dCoxeff_dVg; - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb) - + QovCox * dCoxeff_dVb; + Cox = model->BSIM3cox; + Tox = 1.0e8 * model->BSIM3tox; + T0 = (Vgs_eff - VbseffCV - pParam->BSIM3vfbzb) / Tox; + dT0_dVg = dVgs_eff_dVg / Tox; + dT0_dVb = -dVbseffCV_dVb / Tox; + + tmp = T0 * pParam->BSIM3acde; + if ((-EXP_THRESHOLD < tmp) && (tmp < EXP_THRESHOLD)) + { + Tcen = pParam->BSIM3ldeb * exp (tmp); + dTcen_dVg = pParam->BSIM3acde * Tcen; + dTcen_dVb = dTcen_dVg * dT0_dVb; + dTcen_dVg *= dT0_dVg; + } + else if (tmp <= -EXP_THRESHOLD) + { + Tcen = pParam->BSIM3ldeb * MIN_EXP; + dTcen_dVg = dTcen_dVb = 0.0; + } + else + { + Tcen = pParam->BSIM3ldeb * MAX_EXP; + dTcen_dVg = dTcen_dVb = 0.0; + } + + LINK = 1.0e-3 * model->BSIM3tox; + V3 = pParam->BSIM3ldeb - Tcen - LINK; + V4 = sqrt (V3 * V3 + 4.0 * LINK * pParam->BSIM3ldeb); + Tcen = pParam->BSIM3ldeb - 0.5 * (V3 + V4); + T1 = 0.5 * (1.0 + V3 / V4); + dTcen_dVg *= T1; + dTcen_dVb *= T1; + + Ccen = EPSSI / Tcen; + T2 = Cox / (Cox + Ccen); + Coxeff = T2 * Ccen; + T3 = -Ccen / Tcen; + dCoxeff_dVg = T2 * T2 * T3; + dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; + dCoxeff_dVg *= dTcen_dVg; + CoxWLcen = CoxWL * Coxeff / Cox; + + Qac0 = CoxWLcen * (Vfbeff - pParam->BSIM3vfbzb); + QovCox = Qac0 / Coxeff; + dQac0_dVg = CoxWLcen * dVfbeff_dVg + QovCox * dCoxeff_dVg; + dQac0_dVb = CoxWLcen * dVfbeff_dVb + QovCox * dCoxeff_dVb; + + T0 = 0.5 * pParam->BSIM3k1ox; + T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; + if (pParam->BSIM3k1ox == 0.0) + { + T1 = 0.0; + T2 = 0.0; + } + else if (T3 < 0.0) + { + T1 = T0 + T3 / pParam->BSIM3k1ox; + T2 = CoxWLcen; + } + else + { + T1 = sqrt (T0 * T0 + T3); + T2 = CoxWLcen * T0 / T1; + } + + Qsub0 = CoxWLcen * pParam->BSIM3k1ox * (T1 - T0); + QovCox = Qsub0 / Coxeff; + dQsub0_dVg = + T2 * (dVgs_eff_dVg - + dVfbeff_dVg - dVgsteff_dVg) + QovCox * dCoxeff_dVg; + dQsub0_dVd = -T2 * dVgsteff_dVd; + dQsub0_dVb = + -T2 * (dVfbeff_dVb + + dVbseffCV_dVb + + dVgsteff_dVb) + QovCox * dCoxeff_dVb; /* Gate-bias dependent delta Phis begins */ if (pParam->BSIM3k1ox <= 0.0) - { Denomi = 0.25 * pParam->BSIM3moin * Vtm; - T0 = 0.5 * pParam->BSIM3sqrtPhi; - } + { + Denomi = 0.25 * pParam->BSIM3moin * Vtm; + T0 = 0.5 * pParam->BSIM3sqrtPhi; + } else - { Denomi = pParam->BSIM3moin * Vtm - * pParam->BSIM3k1ox * pParam->BSIM3k1ox; - T0 = pParam->BSIM3k1ox * pParam->BSIM3sqrtPhi; - } - T1 = 2.0 * T0 + Vgsteff; - - DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); - dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); + { + Denomi = pParam->BSIM3moin * + Vtm * pParam->BSIM3k1ox * pParam->BSIM3k1ox; + T0 = pParam->BSIM3k1ox * pParam->BSIM3sqrtPhi; + } + T1 = 2.0 * T0 + Vgsteff; + + DeltaPhi = Vtm * log (1.0 + T1 * Vgsteff / Denomi); + dDeltaPhi_dVg = + 2.0 * Vtm * (T1 - T0) / (Denomi + T1 * Vgsteff); dDeltaPhi_dVd = dDeltaPhi_dVg * dVgsteff_dVd; dDeltaPhi_dVb = dDeltaPhi_dVg * dVgsteff_dVb; /* End of delta Phis */ - T3 = 4.0 * (Vth - pParam->BSIM3vfbzb - pParam->BSIM3phi); - Tox += Tox; - if (T3 >= 0.0) - { T0 = (Vgsteff + T3) / Tox; - dT0_dVd = (dVgsteff_dVd + 4.0 * dVth_dVd) / Tox; - dT0_dVb = (dVgsteff_dVb + 4.0 * dVth_dVb) / Tox; - } - else - { T0 = (Vgsteff + 1.0e-20) / Tox; - dT0_dVd = dVgsteff_dVd / Tox; - dT0_dVb = dVgsteff_dVb / Tox; - } - tmp = exp(0.7 * log(T0)); - T1 = 1.0 + tmp; - T2 = 0.7 * tmp / (T0 * Tox); - Tcen = 1.9e-9 / T1; - dTcen_dVg = -1.9e-9 * T2 / T1 /T1; - dTcen_dVd = Tox * dTcen_dVg; - dTcen_dVb = dTcen_dVd * dT0_dVb; - dTcen_dVd *= dT0_dVd; - dTcen_dVg *= dVgsteff_dVg; + T3 = 4.0 * (Vth - pParam->BSIM3vfbzb - pParam->BSIM3phi); + Tox += Tox; + if (T3 >= 0.0) + { + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + + T0 = (Vgsteff + T3) / Tox; + dT0_dVd = (dVgsteff_dVd + 4.0 * dVth_dVd) / Tox; + dT0_dVb = (dVgsteff_dVb + 4.0 * dVth_dVb) / Tox; + break; + + case BSIM3V32: + default: + + T0 = (Vgsteff + T3) / Tox; + + } + + } + else + { + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + + T0 = (Vgsteff + 1.0e-20) / Tox; + dT0_dVd = dVgsteff_dVd / Tox; + dT0_dVb = dVgsteff_dVb / Tox; + break; + + case BSIM3V32: + default: + T0 = (Vgsteff + 1.0e-20) / Tox; + } + } + + tmp = exp (0.7 * log (T0)); + T1 = 1.0 + tmp; + T2 = 0.7 * tmp / (T0 * Tox); + Tcen = 1.9e-9 / T1; + dTcen_dVg = -1.9e-9 * T2 / T1 / T1; + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + + dTcen_dVd = Tox * dTcen_dVg; + dTcen_dVb = dTcen_dVd * dT0_dVb; + dTcen_dVd *= dT0_dVd; + break; + + case BSIM3V32: + default: + + dTcen_dVd = dTcen_dVg * (4.0 * dVth_dVd + dVgsteff_dVd); + dTcen_dVb = dTcen_dVg * (4.0 * dVth_dVb + dVgsteff_dVb); + + } + + dTcen_dVg *= dVgsteff_dVg; Ccen = EPSSI / Tcen; T0 = Cox / (Cox + Ccen); @@ -2005,909 +2653,1180 @@ for (; model != NULL; model = model->BSIM3nextModel) dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); + T0 = sqrt (V4 * V4 + 4.0 * DELTA_4 * VdsatCV); VdseffCV = VdsatCV - 0.5 * (V4 + T0); T1 = 0.5 * (1.0 + V4 / T0); T2 = DELTA_4 / T0; T3 = (1.0 - T1 - T2) / AbulkCV; - T4 = T3 * ( 1.0 - dDeltaPhi_dVg); + T4 = T3 * (1.0 - dDeltaPhi_dVg); dVdseffCV_dVg = T4; dVdseffCV_dVd = T1; dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ - if (Vds == 0.0) - { VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - - T0 = AbulkCV * VdseffCV; + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ + if (Vds == 0.0) + { + VdseffCV = 0.0; + dVdseffCV_dVg = 0.0; + dVdseffCV_dVb = 0.0; + } + break; + case BSIM3V32: + default: + /* Do nothing */ + } + + T0 = AbulkCV * VdseffCV; T1 = Vgsteff - DeltaPhi; - T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); - T3 = T0 / T2; - T4 = 1.0 - 12.0 * T3 * T3; - T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); + T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); + T3 = T0 / T2; + T4 = 1.0 - 12.0 * T3 * T3; + T5 = AbulkCV * (6.0 * T0 * + (4.0 * T1 - T0) / (T2 * T2) - 0.5); T6 = T5 * VdseffCV / AbulkCV; - qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); + qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * (1.0 - dDeltaPhi_dVg) - + T5 * dVdseffCV_dVg); - Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cgg1 = CoxWLcen * (T4 * + (1.0 - + dDeltaPhi_dVg) + T5 * dVdseffCV_dVg); + Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + + Cgg1 * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cgb1 = CoxWLcen * (T5 * + dVdseffCV_dVb + + T6 * + dAbulkCV_dVb) + + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - T7 = 1.0 - AbulkCV; - T8 = T2 * T2; - T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); - T10 = T9 * (1.0 - dDeltaPhi_dVg); - T11 = -T7 * T5 / AbulkCV; - T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); - - qbulk = CoxWLcen * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); + T7 = 1.0 - AbulkCV; + T8 = T2 * T2; + T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); + T10 = T9 * (1.0 - dDeltaPhi_dVg); + T11 = -T7 * T5 / AbulkCV; + T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); + + qbulk = CoxWLcen * T7 * (0.5 * + VdseffCV - T0 * VdseffCV / T2); QovCox = qbulk / Coxeff; Cbg1 = CoxWLcen * (T10 + T11 * dVdseffCV_dVg); - Cbd1 = CoxWLcen * T11 * dVdseffCV_dVd + Cbg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cbb1 = CoxWLcen * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cbd1 = CoxWLcen * T11 * + dVdseffCV_dVd + + Cbg1 * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cbb1 = CoxWLcen * (T11 * + dVdseffCV_dVb + + T12 * + dAbulkCV_dVb) + + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - if (model->BSIM3xpart > 0.5) - { /* 0/100 partition */ - qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - - 0.5 * T0 * T0 / T2); + if (model->BSIM3xpart > 0.5) + { /* 0/100 partition */ + qsrc = -CoxWLcen * (T1 / 2.0 + + T0 / 4.0 - 0.5 * T0 * T0 / T2); QovCox = qsrc / Coxeff; T2 += T2; T3 = T2 * T2; T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg); + T4 = -(0.5 + + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg); T5 = T7 * AbulkCV; T6 = T7 * VdseffCV; Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd - + QovCox * dCoxeff_dVd; - Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Csd = CoxWLcen * T5 * + dVdseffCV_dVd + + Csg * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Csb = CoxWLcen * (T5 * + dVdseffCV_dVb + + + T6 * + dAbulkCV_dVb) + + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } + } else if (model->BSIM3xpart < 0.5) - { /* 40/60 partition */ + { /* 40/60 partition */ T2 = T2 / 12.0; T3 = 0.5 * CoxWLcen / (T2 * T2); - T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 - * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; + T4 = T1 * (2.0 * T0 * T0 / + 3.0 + T1 * (T1 - + 4.0 * + T0 / + 3.0)) - + 2.0 * T0 * T0 * T0 / 15.0; qsrc = -T3 * T4; QovCox = qsrc / Coxeff; T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; - T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 - * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); + T5 = -2.0 * qsrc / T2 - + T3 * (T1 * + (3.0 * T1 - + 8.0 * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); T6 = AbulkCV * (qsrc / T2 + T3 * T8); - T7 = T6 * VdseffCV / AbulkCV; - - Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg; - Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd - + QovCox * dCoxeff_dVd; - Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb - + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; + T7 = T6 * VdseffCV / AbulkCV; + + Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg; + Csd = Csg * dVgsteff_dVd + + T6 * dVdseffCV_dVd + QovCox * dCoxeff_dVd; + Csb = Csg * dVgsteff_dVb + + T6 * dVdseffCV_dVb + + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } + } else - { /* 50/50 partition */ - qsrc = -0.5 * qgate; - Csg = -0.5 * Cgg1; - Csd = -0.5 * Cgd1; - Csb = -0.5 * Cgb1; - } + { /* 50/50 partition */ + qsrc = -0.5 * qgate; + Csg = -0.5 * Cgg1; + Csd = -0.5 * Cgd1; + Csb = -0.5 * Cgb1; + } qgate += Qac0 + Qsub0 - qbulk; qbulk -= (Qac0 + Qsub0); - qdrn = -(qgate + qbulk + qsrc); + qdrn = -(qgate + qbulk + qsrc); Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; Cbd = Cbd1 - dQsub0_dVd; Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; - Cgg = Cgg1 - Cbg; - Cgd = Cgd1 - Cbd; - Cgb = Cgb1 - Cbb; + Cgg = Cgg1 - Cbg; + Cgd = Cgd1 - Cbd; + Cgb = Cgb1 - Cbb; Cgb *= dVbseff_dVb; Cbb *= dVbseff_dVb; Csb *= dVbseff_dVb; - here->BSIM3cggb = Cgg; - here->BSIM3cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3cgdb = Cgd; - here->BSIM3cdgb = -(Cgg + Cbg + Csg); - here->BSIM3cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb); - here->BSIM3cddb = -(Cgd + Cbd + Csd); - here->BSIM3cbgb = Cbg; - here->BSIM3cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3cbdb = Cbd; - here->BSIM3qinv = -qinoi; - } /* End of CTM */ - } - -finished: + here->BSIM3cggb = Cgg; + here->BSIM3cgsb = -(Cgg + Cgd + Cgb); + here->BSIM3cgdb = Cgd; + here->BSIM3cdgb = -(Cgg + Cbg + Csg); + here->BSIM3cdsb = + (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + Csg + Csd + Csb); + here->BSIM3cddb = -(Cgd + Cbd + Csd); + here->BSIM3cbgb = Cbg; + here->BSIM3cbsb = -(Cbg + Cbd + Cbb); + here->BSIM3cbdb = Cbd; + here->BSIM3qinv = -qinoi; + } /* End of CTM */ + } + + finished: /* Returning Values to Calling Routine */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - - here->BSIM3qgate = qgate; - here->BSIM3qbulk = qbulk; - here->BSIM3qdrn = qdrn; - here->BSIM3cd = cdrain; - - if (ChargeComputationNeeded) - { /* charge storage elements - * bulk-drain and bulk-source depletion capacitances - * czbd : zero bias drain junction capacitance - * czbs : zero bias source junction capacitance - * czbdsw: zero bias drain junction sidewall capacitance - along field oxide - * czbssw: zero bias source junction sidewall capacitance - along field oxide - * czbdswg: zero bias drain junction sidewall capacitance - along gate side - * czbsswg: zero bias source junction sidewall capacitance - along gate side - */ - - czbd = model->BSIM3unitAreaJctCap * here->BSIM3drainArea; - czbs = model->BSIM3unitAreaJctCap * here->BSIM3sourceArea; - if (here->BSIM3drainPerimeter < pParam->BSIM3weff) - { - czbdswg = model->BSIM3unitLengthGateSidewallJctCap - * here->BSIM3drainPerimeter; - czbdsw = 0.0; - } - else - { - czbdsw = model->BSIM3unitLengthSidewallJctCap - * (here->BSIM3drainPerimeter - pParam->BSIM3weff); - czbdswg = model->BSIM3unitLengthGateSidewallJctCap - * pParam->BSIM3weff; - } - if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) - { - czbssw = 0.0; - czbsswg = model->BSIM3unitLengthGateSidewallJctCap - * here->BSIM3sourcePerimeter; - } - else - { - czbssw = model->BSIM3unitLengthSidewallJctCap - * (here->BSIM3sourcePerimeter - pParam->BSIM3weff); - czbsswg = model->BSIM3unitLengthGateSidewallJctCap - * pParam->BSIM3weff; - } - - MJ = model->BSIM3bulkJctBotGradingCoeff; - MJSW = model->BSIM3bulkJctSideGradingCoeff; + /* + * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE + */ + + here->BSIM3qgate = qgate; + here->BSIM3qbulk = qbulk; + here->BSIM3qdrn = qdrn; + here->BSIM3cd = cdrain; + + if (ChargeComputationNeeded) + { /* charge storage elements + * bulk-drain and bulk-source depletion capacitances + * czbd : zero bias drain junction capacitance + * czbs : zero bias source junction capacitance + * czbdsw: zero bias drain junction sidewall capacitance + along field oxide + * czbssw: zero bias source junction sidewall capacitance + along field oxide + * czbdswg: zero bias drain junction sidewall capacitance + along gate side + * czbsswg: zero bias source junction sidewall capacitance + along gate side + */ + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + + czbd = model->BSIM3unitAreaTempJctCap * here->BSIM3drainArea; /*bug fix */ + czbs = model-> + BSIM3unitAreaTempJctCap * here->BSIM3sourceArea; + break; + + case BSIM3V322: + case BSIM3V32: + default: + + czbd = model->BSIM3unitAreaJctCap * here->BSIM3drainArea; + czbs = model->BSIM3unitAreaJctCap * here->BSIM3sourceArea; + + } + + if (here->BSIM3drainPerimeter < pParam->BSIM3weff) + { + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + + czbdswg = + model-> + BSIM3unitLengthGateSidewallTempJctCap + * here->BSIM3drainPerimeter; + break; + case BSIM3V322: + case BSIM3V32: + default: + + czbdswg = + model-> + BSIM3unitLengthGateSidewallJctCap + * here->BSIM3drainPerimeter; + } + + czbdsw = 0.0; + } + else + { + + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + + czbdsw = model-> + BSIM3unitLengthSidewallTempJctCap + * (here->BSIM3drainPerimeter - pParam->BSIM3weff); + czbdswg = + model-> + BSIM3unitLengthGateSidewallTempJctCap + * pParam->BSIM3weff; + break; + + case BSIM3V322: + case BSIM3V32: + default: + + czbdsw = model-> + BSIM3unitLengthSidewallJctCap + * (here->BSIM3drainPerimeter - pParam->BSIM3weff); + czbdswg = + model-> + BSIM3unitLengthGateSidewallJctCap * pParam->BSIM3weff; + } + + } + if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) + { + czbssw = 0.0; + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + + czbsswg = + model-> + BSIM3unitLengthGateSidewallTempJctCap + * here->BSIM3sourcePerimeter; + break; + case BSIM3V322: + case BSIM3V32: + default: + czbsswg = + model-> + BSIM3unitLengthGateSidewallJctCap + * here->BSIM3sourcePerimeter; + } + + } + else + { + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + + czbssw = model-> + BSIM3unitLengthSidewallTempJctCap + * (here->BSIM3sourcePerimeter - pParam->BSIM3weff); + czbsswg = + model-> + BSIM3unitLengthGateSidewallTempJctCap + * pParam->BSIM3weff; + break; + + case BSIM3V322: + case BSIM3V32: + default: + + czbssw = model-> + BSIM3unitLengthSidewallJctCap + * (here->BSIM3sourcePerimeter - pParam->BSIM3weff); + czbsswg = + model-> + BSIM3unitLengthGateSidewallJctCap * pParam->BSIM3weff; + } + + } + + MJ = model->BSIM3bulkJctBotGradingCoeff; + MJSW = model->BSIM3bulkJctSideGradingCoeff; MJSWG = model->BSIM3bulkJctGateSideGradingCoeff; - /* Source Bulk Junction */ + /* Source Bulk Junction */ if (vbs == 0.0) - { *(ckt->CKTstate0 + here->BSIM3qbs) = 0.0; - here->BSIM3capbs = czbs + czbssw + czbsswg; - } + { + *(ckt->CKTstate0 + here->BSIM3qbs) = 0.0; + here->BSIM3capbs = czbs + czbssw + czbsswg; + } else if (vbs < 0.0) - { if (czbs > 0.0) - { arg = 1.0 - vbs / model->BSIM3PhiB; + { + if (czbs > 0.0) + { + arg = 1.0 - vbs / model->BSIM3PhiB; if (MJ == 0.5) - sarg = 1.0 / sqrt(arg); + sarg = 1.0 / sqrt (arg); else - sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3qbs) = model->BSIM3PhiB * czbs - * (1.0 - arg * sarg) / (1.0 - MJ); + sarg = exp (-MJ * log (arg)); + *(ckt->CKTstate0 + + here->BSIM3qbs) = + model->BSIM3PhiB * czbs * (1.0 - + arg * sarg) / (1.0 - MJ); here->BSIM3capbs = czbs * sarg; - } + } else - { *(ckt->CKTstate0 + here->BSIM3qbs) = 0.0; + { + *(ckt->CKTstate0 + here->BSIM3qbs) = 0.0; here->BSIM3capbs = 0.0; - } + } if (czbssw > 0.0) - { arg = 1.0 - vbs / model->BSIM3PhiBSW; + { + arg = 1.0 - vbs / model->BSIM3PhiBSW; if (MJSW == 0.5) - sarg = 1.0 / sqrt(arg); + sarg = 1.0 / sqrt (arg); else - sarg = exp(-MJSW * log(arg)); - *(ckt->CKTstate0 + here->BSIM3qbs) += model->BSIM3PhiBSW * czbssw - * (1.0 - arg * sarg) / (1.0 - MJSW); - here->BSIM3capbs += czbssw * sarg; - } + sarg = exp (-MJSW * log (arg)); + *(ckt->CKTstate0 + + here->BSIM3qbs) += + model->BSIM3PhiBSW * czbssw * (1.0 - + arg * + sarg) / (1.0 - MJSW); + here->BSIM3capbs += czbssw * sarg; + } if (czbsswg > 0.0) - { arg = 1.0 - vbs / model->BSIM3PhiBSWG; + { + arg = 1.0 - vbs / model->BSIM3PhiBSWG; if (MJSWG == 0.5) - sarg = 1.0 / sqrt(arg); + sarg = 1.0 / sqrt (arg); else - sarg = exp(-MJSWG * log(arg)); - *(ckt->CKTstate0 + here->BSIM3qbs) += model->BSIM3PhiBSWG * czbsswg - * (1.0 - arg * sarg) / (1.0 - MJSWG); - here->BSIM3capbs += czbsswg * sarg; - } - - } + sarg = exp (-MJSWG * log (arg)); + *(ckt->CKTstate0 + + here->BSIM3qbs) += + model->BSIM3PhiBSWG * czbsswg * (1.0 - + arg * + sarg) + / (1.0 - MJSWG); + here->BSIM3capbs += czbsswg * sarg; + } + + } else - { T0 = czbs + czbssw + czbsswg; - T1 = vbs * (czbs * MJ / model->BSIM3PhiB + czbssw * MJSW - / model->BSIM3PhiBSW + czbsswg * MJSWG / model->BSIM3PhiBSWG); - *(ckt->CKTstate0 + here->BSIM3qbs) = vbs * (T0 + 0.5 * T1); - here->BSIM3capbs = T0 + T1; - } - - /* Drain Bulk Junction */ + { + T0 = czbs + czbssw + czbsswg; + T1 = vbs * (czbs * MJ / + model->BSIM3PhiB + + czbssw * MJSW / + model->BSIM3PhiBSW + + czbsswg * MJSWG / model->BSIM3PhiBSWG); + *(ckt->CKTstate0 + here->BSIM3qbs) = vbs * (T0 + 0.5 * T1); + here->BSIM3capbs = T0 + T1; + } + + /* Drain Bulk Junction */ if (vbd == 0.0) - { *(ckt->CKTstate0 + here->BSIM3qbd) = 0.0; - here->BSIM3capbd = czbd + czbdsw + czbdswg; - } + { + *(ckt->CKTstate0 + here->BSIM3qbd) = 0.0; + here->BSIM3capbd = czbd + czbdsw + czbdswg; + } else if (vbd < 0.0) - { if (czbd > 0.0) - { arg = 1.0 - vbd / model->BSIM3PhiB; + { + if (czbd > 0.0) + { + arg = 1.0 - vbd / model->BSIM3PhiB; if (MJ == 0.5) - sarg = 1.0 / sqrt(arg); + sarg = 1.0 / sqrt (arg); else - sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3qbd) = model->BSIM3PhiB * czbd - * (1.0 - arg * sarg) / (1.0 - MJ); - here->BSIM3capbd = czbd * sarg; - } + sarg = exp (-MJ * log (arg)); + *(ckt->CKTstate0 + + here->BSIM3qbd) = + model->BSIM3PhiB * czbd * (1.0 - + arg * sarg) / (1.0 - MJ); + here->BSIM3capbd = czbd * sarg; + } else - { *(ckt->CKTstate0 + here->BSIM3qbd) = 0.0; - here->BSIM3capbd = 0.0; - } + { + *(ckt->CKTstate0 + here->BSIM3qbd) = 0.0; + here->BSIM3capbd = 0.0; + } if (czbdsw > 0.0) - { arg = 1.0 - vbd / model->BSIM3PhiBSW; + { + arg = 1.0 - vbd / model->BSIM3PhiBSW; if (MJSW == 0.5) - sarg = 1.0 / sqrt(arg); + sarg = 1.0 / sqrt (arg); else - sarg = exp(-MJSW * log(arg)); - *(ckt->CKTstate0 + here->BSIM3qbd) += model->BSIM3PhiBSW * czbdsw - * (1.0 - arg * sarg) / (1.0 - MJSW); - here->BSIM3capbd += czbdsw * sarg; - } + sarg = exp (-MJSW * log (arg)); + *(ckt->CKTstate0 + + here->BSIM3qbd) += + model->BSIM3PhiBSW * czbdsw * (1.0 - + arg * + sarg) / (1.0 - MJSW); + here->BSIM3capbd += czbdsw * sarg; + } if (czbdswg > 0.0) - { arg = 1.0 - vbd / model->BSIM3PhiBSWG; + { + arg = 1.0 - vbd / model->BSIM3PhiBSWG; if (MJSWG == 0.5) - sarg = 1.0 / sqrt(arg); + sarg = 1.0 / sqrt (arg); else - sarg = exp(-MJSWG * log(arg)); - *(ckt->CKTstate0 + here->BSIM3qbd) += model->BSIM3PhiBSWG * czbdswg - * (1.0 - arg * sarg) / (1.0 - MJSWG); - here->BSIM3capbd += czbdswg * sarg; - } - } + sarg = exp (-MJSWG * log (arg)); + *(ckt->CKTstate0 + + here->BSIM3qbd) += + model->BSIM3PhiBSWG * czbdswg * (1.0 - + arg * + sarg) + / (1.0 - MJSWG); + here->BSIM3capbd += czbdswg * sarg; + } + } else - { T0 = czbd + czbdsw + czbdswg; - T1 = vbd * (czbd * MJ / model->BSIM3PhiB + czbdsw * MJSW - / model->BSIM3PhiBSW + czbdswg * MJSWG / model->BSIM3PhiBSWG); - *(ckt->CKTstate0 + here->BSIM3qbd) = vbd * (T0 + 0.5 * T1); - here->BSIM3capbd = T0 + T1; - } - } - - /* - * check convergence - */ - if ((here->BSIM3off == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; - } - } - *(ckt->CKTstate0 + here->BSIM3vbs) = vbs; - *(ckt->CKTstate0 + here->BSIM3vbd) = vbd; - *(ckt->CKTstate0 + here->BSIM3vgs) = vgs; - *(ckt->CKTstate0 + here->BSIM3vds) = vds; - *(ckt->CKTstate0 + here->BSIM3qdef) = qdef; - - /* bulk and channel charge plus overlaps */ - - if (!ChargeComputationNeeded) - goto line850; - -line755: - /* NQS begins */ - if (here->BSIM3nqsMod) - { qcheq = -(qbulk + qgate); - - here->BSIM3cqgb = -(here->BSIM3cggb + here->BSIM3cbgb); - here->BSIM3cqdb = -(here->BSIM3cgdb + here->BSIM3cbdb); - here->BSIM3cqsb = -(here->BSIM3cgsb + here->BSIM3cbsb); - here->BSIM3cqbb = -(here->BSIM3cqgb + here->BSIM3cqdb - + here->BSIM3cqsb); - - gtau_drift = fabs(pParam->BSIM3tconst * qcheq) * ScalingFactor; - T0 = pParam->BSIM3leffCV * pParam->BSIM3leffCV; - gtau_diff = 16.0 * pParam->BSIM3u0temp * model->BSIM3vtm / T0 - * ScalingFactor; - here->BSIM3gtau = gtau_drift + gtau_diff; - } + { + T0 = czbd + czbdsw + czbdswg; + T1 = vbd * (czbd * MJ / + model->BSIM3PhiB + + czbdsw * MJSW / + model->BSIM3PhiBSW + + czbdswg * MJSWG / model->BSIM3PhiBSWG); + *(ckt->CKTstate0 + here->BSIM3qbd) = vbd * (T0 + 0.5 * T1); + here->BSIM3capbd = T0 + T1; + } + } + + /* + * check convergence + */ + if ((here->BSIM3off == 0) || (!(ckt->CKTmode & MODEINITFIX))) + { + if (Check == 1) + { + ckt->CKTnoncon++; + } + } + *(ckt->CKTstate0 + here->BSIM3vbs) = vbs; + *(ckt->CKTstate0 + here->BSIM3vbd) = vbd; + *(ckt->CKTstate0 + here->BSIM3vgs) = vgs; + *(ckt->CKTstate0 + here->BSIM3vds) = vds; + *(ckt->CKTstate0 + here->BSIM3qdef) = qdef; + + /* bulk and channel charge plus overlaps */ + + if (!ChargeComputationNeeded) + goto line850; + + line755: + /* NQS begins */ + if (here->BSIM3nqsMod) + { + qcheq = -(qbulk + qgate); + + here->BSIM3cqgb = -(here->BSIM3cggb + here->BSIM3cbgb); + here->BSIM3cqdb = -(here->BSIM3cgdb + here->BSIM3cbdb); + here->BSIM3cqsb = -(here->BSIM3cgsb + here->BSIM3cbsb); + here->BSIM3cqbb = + -(here->BSIM3cqgb + here->BSIM3cqdb + here->BSIM3cqsb); + + gtau_drift = fabs (pParam->BSIM3tconst * qcheq) * ScalingFactor; + T0 = pParam->BSIM3leffCV * pParam->BSIM3leffCV; + gtau_diff = + 16.0 * pParam->BSIM3u0temp * + model->BSIM3vtm / T0 * ScalingFactor; + here->BSIM3gtau = gtau_drift + gtau_diff; + } if (model->BSIM3capMod == 0) - { if (vgd < 0.0) - { - cgdo = pParam->BSIM3cgdo; - qgdo = pParam->BSIM3cgdo * vgd; - } - else - { cgdo = pParam->BSIM3cgdo; - qgdo = pParam->BSIM3cgdo * vgd; - } + { + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + + /* code merge -JX */ + cgdo = pParam->BSIM3cgdo; + qgdo = pParam->BSIM3cgdo * vgd; + cgso = pParam->BSIM3cgso; + qgso = pParam->BSIM3cgso * vgs; + break; + + case BSIM3V322: + case BSIM3V32: + default: + + if (vgd < 0.0) + { + cgdo = pParam->BSIM3cgdo; + qgdo = pParam->BSIM3cgdo * vgd; + } + else + { + cgdo = pParam->BSIM3cgdo; + qgdo = pParam->BSIM3cgdo * vgd; + } + + if (vgs < 0.0) + { + cgso = pParam->BSIM3cgso; + qgso = pParam->BSIM3cgso * vgs; + } + else + { + cgso = pParam->BSIM3cgso; + qgso = pParam->BSIM3cgso * vgs; + } + } - if (vgs < 0.0) - { - cgso = pParam->BSIM3cgso; - qgso = pParam->BSIM3cgso * vgs; - } - else - { cgso = pParam->BSIM3cgso; - qgso = pParam->BSIM3cgso * vgs; - } - } + } else if (model->BSIM3capMod == 1) - { if (vgd < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgd / pParam->BSIM3ckappa); - cgdo = pParam->BSIM3cgdo + pParam->BSIM3weffCV - * pParam->BSIM3cgdl / T1; - qgdo = pParam->BSIM3cgdo * vgd - pParam->BSIM3weffCV * 0.5 - * pParam->BSIM3cgdl * pParam->BSIM3ckappa * (T1 - 1.0); - } + { + if (vgd < 0.0) + { + T1 = sqrt (1.0 - 4.0 * vgd / pParam->BSIM3ckappa); + cgdo = pParam->BSIM3cgdo + + pParam->BSIM3weffCV * pParam->BSIM3cgdl / T1; + qgdo = pParam->BSIM3cgdo * vgd - + pParam->BSIM3weffCV * 0.5 * + pParam->BSIM3cgdl * pParam->BSIM3ckappa * (T1 - 1.0); + } else - { cgdo = pParam->BSIM3cgdo + pParam->BSIM3weffCV - * pParam->BSIM3cgdl; - qgdo = (pParam->BSIM3weffCV * pParam->BSIM3cgdl - + pParam->BSIM3cgdo) * vgd; - } + { + cgdo = pParam->BSIM3cgdo + + pParam->BSIM3weffCV * pParam->BSIM3cgdl; + qgdo = (pParam->BSIM3weffCV * + pParam->BSIM3cgdl + pParam->BSIM3cgdo) * vgd; + } if (vgs < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgs / pParam->BSIM3ckappa); - cgso = pParam->BSIM3cgso + pParam->BSIM3weffCV - * pParam->BSIM3cgsl / T1; - qgso = pParam->BSIM3cgso * vgs - pParam->BSIM3weffCV * 0.5 - * pParam->BSIM3cgsl * pParam->BSIM3ckappa * (T1 - 1.0); - } + { + T1 = sqrt (1.0 - 4.0 * vgs / pParam->BSIM3ckappa); + cgso = pParam->BSIM3cgso + + pParam->BSIM3weffCV * pParam->BSIM3cgsl / T1; + qgso = pParam->BSIM3cgso * vgs - + pParam->BSIM3weffCV * 0.5 * + pParam->BSIM3cgsl * pParam->BSIM3ckappa * (T1 - 1.0); + } else - { cgso = pParam->BSIM3cgso + pParam->BSIM3weffCV - * pParam->BSIM3cgsl; - qgso = (pParam->BSIM3weffCV * pParam->BSIM3cgsl - + pParam->BSIM3cgso) * vgs; - } - } + { + cgso = pParam->BSIM3cgso + + pParam->BSIM3weffCV * pParam->BSIM3cgsl; + qgso = (pParam->BSIM3weffCV * + pParam->BSIM3cgsl + pParam->BSIM3cgso) * vgs; + } + } else - { T0 = vgd + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); + { + T0 = vgd + DELTA_1; + T1 = sqrt (T0 * T0 + 4.0 * DELTA_1); T2 = 0.5 * (T0 - T1); T3 = pParam->BSIM3weffCV * pParam->BSIM3cgdl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3ckappa); - cgdo = pParam->BSIM3cgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->BSIM3cgdo + T3) * vgd - T3 * (T2 - + 0.5 * pParam->BSIM3ckappa * (T4 - 1.0)); + T4 = sqrt (1.0 - 4.0 * T2 / pParam->BSIM3ckappa); + cgdo = pParam->BSIM3cgdo + T3 - T3 * (1.0 - + 1.0 / + T4) * + (0.5 - 0.5 * T0 / T1); + qgdo = (pParam->BSIM3cgdo + T3) * vgd - + T3 * (T2 + 0.5 * pParam->BSIM3ckappa * (T4 - 1.0)); T0 = vgs + DELTA_1; - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); + T1 = sqrt (T0 * T0 + 4.0 * DELTA_1); T2 = 0.5 * (T0 - T1); T3 = pParam->BSIM3weffCV * pParam->BSIM3cgsl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3ckappa); - cgso = pParam->BSIM3cgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->BSIM3cgso + T3) * vgs - T3 * (T2 - + 0.5 * pParam->BSIM3ckappa * (T4 - 1.0)); - } - - here->BSIM3cgdo = cgdo; - here->BSIM3cgso = cgso; - - ag0 = ckt->CKTag[0]; - if (here->BSIM3mode > 0) - { if (here->BSIM3nqsMod == 0) - { gcggb = (here->BSIM3cggb + cgdo + cgso - + pParam->BSIM3cgbo ) * ag0; - gcgdb = (here->BSIM3cgdb - cgdo) * ag0; - gcgsb = (here->BSIM3cgsb - cgso) * ag0; - - gcdgb = (here->BSIM3cdgb - cgdo) * ag0; - gcddb = (here->BSIM3cddb + here->BSIM3capbd + cgdo) * ag0; - gcdsb = here->BSIM3cdsb * ag0; - - gcsgb = -(here->BSIM3cggb + here->BSIM3cbgb - + here->BSIM3cdgb + cgso) * ag0; - gcsdb = -(here->BSIM3cgdb + here->BSIM3cbdb - + here->BSIM3cddb) * ag0; - gcssb = (here->BSIM3capbs + cgso - (here->BSIM3cgsb - + here->BSIM3cbsb + here->BSIM3cdsb)) * ag0; - - gcbgb = (here->BSIM3cbgb - pParam->BSIM3cgbo) * ag0; - gcbdb = (here->BSIM3cbdb - here->BSIM3capbd) * ag0; - gcbsb = (here->BSIM3cbsb - here->BSIM3capbs) * ag0; - - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3cgbo * vgb; - qgate += qgd + qgs + qgb; - qbulk -= qgb; - qdrn -= qgd; - qsrc = -(qgate + qbulk + qdrn); - - ggtg = ggtd = ggtb = ggts = 0.0; + T4 = sqrt (1.0 - 4.0 * T2 / pParam->BSIM3ckappa); + cgso = pParam->BSIM3cgso + T3 - T3 * (1.0 - + 1.0 / + T4) * + (0.5 - 0.5 * T0 / T1); + qgso = (pParam->BSIM3cgso + T3) * vgs - + T3 * (T2 + 0.5 * pParam->BSIM3ckappa * (T4 - 1.0)); + } + + here->BSIM3cgdo = cgdo; + here->BSIM3cgso = cgso; + + ag0 = ckt->CKTag[0]; + if (here->BSIM3mode > 0) + { + if (here->BSIM3nqsMod == 0) + { + gcggb = (here->BSIM3cggb + cgdo + cgso + + pParam->BSIM3cgbo) * ag0; + gcgdb = (here->BSIM3cgdb - cgdo) * ag0; + gcgsb = (here->BSIM3cgsb - cgso) * ag0; + + gcdgb = (here->BSIM3cdgb - cgdo) * ag0; + gcddb = (here->BSIM3cddb + here->BSIM3capbd + cgdo) * ag0; + gcdsb = here->BSIM3cdsb * ag0; + + gcsgb = -(here->BSIM3cggb + + here->BSIM3cbgb + here->BSIM3cdgb + cgso) * ag0; + gcsdb = -(here->BSIM3cgdb + + here->BSIM3cbdb + here->BSIM3cddb) * ag0; + gcssb = (here->BSIM3capbs + cgso - + (here->BSIM3cgsb + + here->BSIM3cbsb + here->BSIM3cdsb)) * ag0; + + gcbgb = (here->BSIM3cbgb - pParam->BSIM3cgbo) * ag0; + gcbdb = (here->BSIM3cbdb - here->BSIM3capbd) * ag0; + gcbsb = (here->BSIM3cbsb - here->BSIM3capbs) * ag0; + + qgd = qgdo; + qgs = qgso; + qgb = pParam->BSIM3cgbo * vgb; + qgate += qgd + qgs + qgb; + qbulk -= qgb; + qdrn -= qgd; + qsrc = -(qgate + qbulk + qdrn); + + ggtg = ggtd = ggtb = ggts = 0.0; sxpart = 0.6; - dxpart = 0.4; + dxpart = 0.4; ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { if (qcheq > 0.0) - T0 = pParam->BSIM3tconst * qdef * ScalingFactor; - else - T0 = -pParam->BSIM3tconst * qdef * ScalingFactor; - ggtg = here->BSIM3gtg = T0 * here->BSIM3cqgb; - ggtd = here->BSIM3gtd = T0 * here->BSIM3cqdb; - ggts = here->BSIM3gts = T0 * here->BSIM3cqsb; - ggtb = here->BSIM3gtb = T0 * here->BSIM3cqbb; + } + else + { + if (qcheq > 0.0) + T0 = pParam->BSIM3tconst * qdef * ScalingFactor; + else + T0 = -pParam->BSIM3tconst * qdef * ScalingFactor; + ggtg = here->BSIM3gtg = T0 * here->BSIM3cqgb; + ggtd = here->BSIM3gtd = T0 * here->BSIM3cqdb; + ggts = here->BSIM3gts = T0 * here->BSIM3cqsb; + ggtb = here->BSIM3gtb = T0 * here->BSIM3cqbb; gqdef = ScalingFactor * ag0; - gcqgb = here->BSIM3cqgb * ag0; - gcqdb = here->BSIM3cqdb * ag0; - gcqsb = here->BSIM3cqsb * ag0; - gcqbb = here->BSIM3cqbb * ag0; - - gcggb = (cgdo + cgso + pParam->BSIM3cgbo ) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - - gcdgb = -cgdo * ag0; - gcddb = (here->BSIM3capbd + cgdo) * ag0; - gcdsb = 0.0; - - gcsgb = -cgso * ag0; - gcsdb = 0.0; - gcssb = (here->BSIM3capbs + cgso) * ag0; - - gcbgb = -pParam->BSIM3cgbo * ag0; - gcbdb = -here->BSIM3capbd * ag0; - gcbsb = -here->BSIM3capbs * ag0; - - CoxWL = model->BSIM3cox * pParam->BSIM3weffCV - * pParam->BSIM3leffCV; - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3xpart < 0.5) - { dxpart = 0.4; - } + gcqgb = here->BSIM3cqgb * ag0; + gcqdb = here->BSIM3cqdb * ag0; + gcqsb = here->BSIM3cqsb * ag0; + gcqbb = here->BSIM3cqbb * ag0; + + gcggb = (cgdo + cgso + pParam->BSIM3cgbo) * ag0; + gcgdb = -cgdo * ag0; + gcgsb = -cgso * ag0; + + gcdgb = -cgdo * ag0; + gcddb = (here->BSIM3capbd + cgdo) * ag0; + gcdsb = 0.0; + + gcsgb = -cgso * ag0; + gcsdb = 0.0; + gcssb = (here->BSIM3capbs + cgso) * ag0; + + gcbgb = -pParam->BSIM3cgbo * ag0; + gcbdb = -here->BSIM3capbd * ag0; + gcbsb = -here->BSIM3capbs * ag0; + + CoxWL = model->BSIM3cox * + pParam->BSIM3weffCV * pParam->BSIM3leffCV; + if (fabs (qcheq) <= 1.0e-5 * CoxWL) + { + if (model->BSIM3xpart < 0.5) + { + dxpart = 0.4; + } else if (model->BSIM3xpart > 0.5) - { dxpart = 0.0; - } + { + dxpart = 0.0; + } else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } + { + dxpart = 0.5; + } + ddxpart_dVd = ddxpart_dVg = + ddxpart_dVb = ddxpart_dVs = 0.0; + } else - { dxpart = qdrn / qcheq; + { + dxpart = qdrn / qcheq; Cdd = here->BSIM3cddb; - Csd = -(here->BSIM3cgdb + here->BSIM3cddb - + here->BSIM3cbdb); + Csd = -(here->BSIM3cgdb + + here->BSIM3cddb + here->BSIM3cbdb); ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; Cdg = here->BSIM3cdgb; - Csg = -(here->BSIM3cggb + here->BSIM3cdgb - + here->BSIM3cbgb); + Csg = -(here->BSIM3cggb + + here->BSIM3cdgb + here->BSIM3cbgb); ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; Cds = here->BSIM3cdsb; - Css = -(here->BSIM3cgsb + here->BSIM3cdsb - + here->BSIM3cbsb); + Css = -(here->BSIM3cgsb + + here->BSIM3cdsb + here->BSIM3cbsb); ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } + ddxpart_dVb = + -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); + } sxpart = 1.0 - dxpart; dsxpart_dVd = -ddxpart_dVd; dsxpart_dVg = -ddxpart_dVg; dsxpart_dVs = -ddxpart_dVs; dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3cgbo * vgb; - qgate = qgd + qgs + qgb; - qbulk = -qgb; - qdrn = -qgd; - qsrc = -(qgate + qbulk + qdrn); - } - } - else - { if (here->BSIM3nqsMod == 0) - { gcggb = (here->BSIM3cggb + cgdo + cgso - + pParam->BSIM3cgbo ) * ag0; - gcgdb = (here->BSIM3cgsb - cgdo) * ag0; - gcgsb = (here->BSIM3cgdb - cgso) * ag0; - - gcdgb = -(here->BSIM3cggb + here->BSIM3cbgb - + here->BSIM3cdgb + cgdo) * ag0; - gcddb = (here->BSIM3capbd + cgdo - (here->BSIM3cgsb - + here->BSIM3cbsb + here->BSIM3cdsb)) * ag0; - gcdsb = -(here->BSIM3cgdb + here->BSIM3cbdb - + here->BSIM3cddb) * ag0; - - gcsgb = (here->BSIM3cdgb - cgso) * ag0; - gcsdb = here->BSIM3cdsb * ag0; - gcssb = (here->BSIM3cddb + here->BSIM3capbs + cgso) * ag0; - - gcbgb = (here->BSIM3cbgb - pParam->BSIM3cgbo) * ag0; - gcbdb = (here->BSIM3cbsb - here->BSIM3capbd) * ag0; - gcbsb = (here->BSIM3cbdb - here->BSIM3capbs) * ag0; - - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3cgbo * vgb; - qgate += qgd + qgs + qgb; - qbulk -= qgb; - qsrc = qdrn - qgs; - qdrn = -(qgate + qbulk + qsrc); - - ggtg = ggtd = ggtb = ggts = 0.0; + qgd = qgdo; + qgs = qgso; + qgb = pParam->BSIM3cgbo * vgb; + qgate = qgd + qgs + qgb; + qbulk = -qgb; + qdrn = -qgd; + qsrc = -(qgate + qbulk + qdrn); + } + } + else + { + if (here->BSIM3nqsMod == 0) + { + gcggb = (here->BSIM3cggb + cgdo + cgso + + pParam->BSIM3cgbo) * ag0; + gcgdb = (here->BSIM3cgsb - cgdo) * ag0; + gcgsb = (here->BSIM3cgdb - cgso) * ag0; + + gcdgb = -(here->BSIM3cggb + + here->BSIM3cbgb + here->BSIM3cdgb + cgdo) * ag0; + gcddb = (here->BSIM3capbd + cgdo - + (here->BSIM3cgsb + + here->BSIM3cbsb + here->BSIM3cdsb)) * ag0; + gcdsb = -(here->BSIM3cgdb + + here->BSIM3cbdb + here->BSIM3cddb) * ag0; + + gcsgb = (here->BSIM3cdgb - cgso) * ag0; + gcsdb = here->BSIM3cdsb * ag0; + gcssb = (here->BSIM3cddb + here->BSIM3capbs + cgso) * ag0; + + gcbgb = (here->BSIM3cbgb - pParam->BSIM3cgbo) * ag0; + gcbdb = (here->BSIM3cbsb - here->BSIM3capbd) * ag0; + gcbsb = (here->BSIM3cbdb - here->BSIM3capbs) * ag0; + + qgd = qgdo; + qgs = qgso; + qgb = pParam->BSIM3cgbo * vgb; + qgate += qgd + qgs + qgb; + qbulk -= qgb; + qsrc = qdrn - qgs; + qdrn = -(qgate + qbulk + qsrc); + + ggtg = ggtd = ggtb = ggts = 0.0; sxpart = 0.4; - dxpart = 0.6; + dxpart = 0.6; ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - } - else - { if (qcheq > 0.0) - T0 = pParam->BSIM3tconst * qdef * ScalingFactor; - else - T0 = -pParam->BSIM3tconst * qdef * ScalingFactor; - ggtg = here->BSIM3gtg = T0 * here->BSIM3cqgb; - ggts = here->BSIM3gtd = T0 * here->BSIM3cqdb; - ggtd = here->BSIM3gts = T0 * here->BSIM3cqsb; - ggtb = here->BSIM3gtb = T0 * here->BSIM3cqbb; + } + else + { + if (qcheq > 0.0) + T0 = pParam->BSIM3tconst * qdef * ScalingFactor; + else + T0 = -pParam->BSIM3tconst * qdef * ScalingFactor; + ggtg = here->BSIM3gtg = T0 * here->BSIM3cqgb; + ggts = here->BSIM3gtd = T0 * here->BSIM3cqdb; + ggtd = here->BSIM3gts = T0 * here->BSIM3cqsb; + ggtb = here->BSIM3gtb = T0 * here->BSIM3cqbb; gqdef = ScalingFactor * ag0; - gcqgb = here->BSIM3cqgb * ag0; - gcqdb = here->BSIM3cqsb * ag0; - gcqsb = here->BSIM3cqdb * ag0; - gcqbb = here->BSIM3cqbb * ag0; - - gcggb = (cgdo + cgso + pParam->BSIM3cgbo) * ag0; - gcgdb = -cgdo * ag0; - gcgsb = -cgso * ag0; - - gcdgb = -cgdo * ag0; - gcddb = (here->BSIM3capbd + cgdo) * ag0; - gcdsb = 0.0; - - gcsgb = -cgso * ag0; - gcsdb = 0.0; - gcssb = (here->BSIM3capbs + cgso) * ag0; - - gcbgb = -pParam->BSIM3cgbo * ag0; - gcbdb = -here->BSIM3capbd * ag0; - gcbsb = -here->BSIM3capbs * ag0; - - CoxWL = model->BSIM3cox * pParam->BSIM3weffCV - * pParam->BSIM3leffCV; - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3xpart < 0.5) - { sxpart = 0.4; - } + gcqgb = here->BSIM3cqgb * ag0; + gcqdb = here->BSIM3cqsb * ag0; + gcqsb = here->BSIM3cqdb * ag0; + gcqbb = here->BSIM3cqbb * ag0; + + gcggb = (cgdo + cgso + pParam->BSIM3cgbo) * ag0; + gcgdb = -cgdo * ag0; + gcgsb = -cgso * ag0; + + gcdgb = -cgdo * ag0; + gcddb = (here->BSIM3capbd + cgdo) * ag0; + gcdsb = 0.0; + + gcsgb = -cgso * ag0; + gcsdb = 0.0; + gcssb = (here->BSIM3capbs + cgso) * ag0; + + gcbgb = -pParam->BSIM3cgbo * ag0; + gcbdb = -here->BSIM3capbd * ag0; + gcbsb = -here->BSIM3capbs * ag0; + + CoxWL = model->BSIM3cox * + pParam->BSIM3weffCV * pParam->BSIM3leffCV; + if (fabs (qcheq) <= 1.0e-5 * CoxWL) + { + if (model->BSIM3xpart < 0.5) + { + sxpart = 0.4; + } else if (model->BSIM3xpart > 0.5) - { sxpart = 0.0; - } + { + sxpart = 0.0; + } else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } + { + sxpart = 0.5; + } + dsxpart_dVd = dsxpart_dVg = + dsxpart_dVb = dsxpart_dVs = 0.0; + } else - { sxpart = qdrn / qcheq; + { + sxpart = qdrn / qcheq; Css = here->BSIM3cddb; - Cds = -(here->BSIM3cgdb + here->BSIM3cddb - + here->BSIM3cbdb); + Cds = -(here->BSIM3cgdb + + here->BSIM3cddb + here->BSIM3cbdb); dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; Csg = here->BSIM3cdgb; - Cdg = -(here->BSIM3cggb + here->BSIM3cdgb - + here->BSIM3cbgb); + Cdg = -(here->BSIM3cggb + + here->BSIM3cdgb + here->BSIM3cbgb); dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; Csd = here->BSIM3cdsb; - Cdd = -(here->BSIM3cgsb + here->BSIM3cdsb - + here->BSIM3cbsb); + Cdd = -(here->BSIM3cgsb + + here->BSIM3cdsb + here->BSIM3cbsb); dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } + dsxpart_dVb = + -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); + } dxpart = 1.0 - sxpart; ddxpart_dVd = -dsxpart_dVd; ddxpart_dVg = -dsxpart_dVg; ddxpart_dVs = -dsxpart_dVs; ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - qgd = qgdo; - qgs = qgso; - qgb = pParam->BSIM3cgbo * vgb; - qgate = qgd + qgs + qgb; - qbulk = -qgb; - qsrc = -qgs; - qdrn = -(qgate + qbulk + qsrc); - } - } + qgd = qgdo; + qgs = qgso; + qgb = pParam->BSIM3cgbo * vgb; + qgate = qgd + qgs + qgb; + qbulk = -qgb; + qsrc = -qgs; + qdrn = -(qgate + qbulk + qsrc); + } + } cqdef = cqcheq = 0.0; - if (ByPass) goto line860; - - *(ckt->CKTstate0 + here->BSIM3qg) = qgate; - *(ckt->CKTstate0 + here->BSIM3qd) = qdrn - - *(ckt->CKTstate0 + here->BSIM3qbd); - *(ckt->CKTstate0 + here->BSIM3qb) = qbulk - + *(ckt->CKTstate0 + here->BSIM3qbd) - + *(ckt->CKTstate0 + here->BSIM3qbs); - - if (here->BSIM3nqsMod) - { *(ckt->CKTstate0 + here->BSIM3qcdump) = qdef * ScalingFactor; - *(ckt->CKTstate0 + here->BSIM3qcheq) = qcheq; - } - - /* store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { goto line1000; - } - if (!ChargeComputationNeeded) - goto line850; - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM3qb) = - *(ckt->CKTstate0 + here->BSIM3qb); - *(ckt->CKTstate1 + here->BSIM3qg) = - *(ckt->CKTstate0 + here->BSIM3qg); - *(ckt->CKTstate1 + here->BSIM3qd) = - *(ckt->CKTstate0 + here->BSIM3qd); - if (here->BSIM3nqsMod) - { *(ckt->CKTstate1 + here->BSIM3qcheq) = - *(ckt->CKTstate0 + here->BSIM3qcheq); - *(ckt->CKTstate1 + here->BSIM3qcdump) = - *(ckt->CKTstate0 + here->BSIM3qcdump); - } - } - - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3qb); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3qg); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3qd); - if (error) - return(error); - if (here->BSIM3nqsMod) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3qcdump); - if (error) - return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3qcheq); - if (error) - return(error); - } - - goto line860; - -line850: - /* initialize to zero charge conductance and current */ - ceqqg = ceqqb = ceqqd = 0.0; - cqcheq = cqdef = 0.0; - - gcdgb = gcddb = gcdsb = 0.0; - gcsgb = gcsdb = gcssb = 0.0; - gcggb = gcgdb = gcgsb = 0.0; - gcbgb = gcbdb = gcbsb = 0.0; + if (ByPass) + goto line860; + + *(ckt->CKTstate0 + here->BSIM3qg) = qgate; + *(ckt->CKTstate0 + here->BSIM3qd) = qdrn + - *(ckt->CKTstate0 + here->BSIM3qbd); + *(ckt->CKTstate0 + here->BSIM3qb) = qbulk + + *(ckt->CKTstate0 + here->BSIM3qbd) + + *(ckt->CKTstate0 + here->BSIM3qbs); + + if (here->BSIM3nqsMod) + { + *(ckt->CKTstate0 + here->BSIM3qcdump) = qdef * ScalingFactor; + *(ckt->CKTstate0 + here->BSIM3qcheq) = qcheq; + } + + /* store small signal parameters */ + if (ckt->CKTmode & MODEINITSMSIG) + { + goto line1000; + } + if (!ChargeComputationNeeded) + goto line850; + + if (ckt->CKTmode & MODEINITTRAN) + { + *(ckt->CKTstate1 + here->BSIM3qb) = + *(ckt->CKTstate0 + here->BSIM3qb); + *(ckt->CKTstate1 + here->BSIM3qg) = + *(ckt->CKTstate0 + here->BSIM3qg); + *(ckt->CKTstate1 + here->BSIM3qd) = + *(ckt->CKTstate0 + here->BSIM3qd); + if (here->BSIM3nqsMod) + { + *(ckt->CKTstate1 + here->BSIM3qcheq) = + *(ckt->CKTstate0 + here->BSIM3qcheq); + *(ckt->CKTstate1 + + here->BSIM3qcdump) = + *(ckt->CKTstate0 + here->BSIM3qcdump); + } + } + + error = NIintegrate (ckt, &geq, &ceq, 0.0, here->BSIM3qb); + if (error) + return (error); + error = NIintegrate (ckt, &geq, &ceq, 0.0, here->BSIM3qg); + if (error) + return (error); + error = NIintegrate (ckt, &geq, &ceq, 0.0, here->BSIM3qd); + if (error) + return (error); + if (here->BSIM3nqsMod) + { + error = NIintegrate (ckt, &geq, &ceq, 0.0, here->BSIM3qcdump); + if (error) + return (error); + error = NIintegrate (ckt, &geq, &ceq, 0.0, here->BSIM3qcheq); + if (error) + return (error); + } + + goto line860; + + line850: + /* initialize to zero charge conductance and current */ + ceqqg = ceqqb = ceqqd = 0.0; + cqcheq = cqdef = 0.0; + + gcdgb = gcddb = gcdsb = 0.0; + gcsgb = gcsdb = gcssb = 0.0; + gcggb = gcgdb = gcgsb = 0.0; + gcbgb = gcbdb = gcbsb = 0.0; gqdef = gcqgb = gcqdb = gcqsb = gcqbb = 0.0; - ggtg = ggtd = ggtb = ggts = 0.0; - sxpart = (1.0 - (dxpart = (here->BSIM3mode > 0) ? 0.4 : 0.6)); + ggtg = ggtd = ggtb = ggts = 0.0; + sxpart = (1.0 - (dxpart = (here->BSIM3mode > 0) ? 0.4 : 0.6)); ddxpart_dVd = ddxpart_dVg = ddxpart_dVb = ddxpart_dVs = 0.0; dsxpart_dVd = dsxpart_dVg = dsxpart_dVb = dsxpart_dVs = 0.0; - if (here->BSIM3nqsMod) - here->BSIM3gtau = 16.0 * pParam->BSIM3u0temp * model->BSIM3vtm - / pParam->BSIM3leffCV / pParam->BSIM3leffCV - * ScalingFactor; + if (here->BSIM3nqsMod) + here->BSIM3gtau = + 16.0 * pParam->BSIM3u0temp * + model->BSIM3vtm / + pParam->BSIM3leffCV / pParam->BSIM3leffCV * ScalingFactor; else - here->BSIM3gtau = 0.0; + here->BSIM3gtau = 0.0; - goto line900; - -line860: - /* evaluate equivalent charge current */ + goto line900; - cqgate = *(ckt->CKTstate0 + here->BSIM3cqg); - cqbulk = *(ckt->CKTstate0 + here->BSIM3cqb); - cqdrn = *(ckt->CKTstate0 + here->BSIM3cqd); + line860: + /* evaluate equivalent charge current */ - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; - ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs; - ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs; + cqgate = *(ckt->CKTstate0 + here->BSIM3cqg); + cqbulk = *(ckt->CKTstate0 + here->BSIM3cqb); + cqdrn = *(ckt->CKTstate0 + here->BSIM3cqd); - if (here->BSIM3nqsMod) - { T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; - ceqqg += T0; + ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs; + ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs; + ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs; + + if (here->BSIM3nqsMod) + { + T0 = ggtg * vgb - ggtd * vbd - ggts * vbs; + ceqqg += T0; T1 = qdef * here->BSIM3gtau; - ceqqd -= dxpart * T0 + T1 * (ddxpart_dVg * vgb - ddxpart_dVd - * vbd - ddxpart_dVs * vbs); - cqdef = *(ckt->CKTstate0 + here->BSIM3cqcdump) - gqdef * qdef; - cqcheq = *(ckt->CKTstate0 + here->BSIM3cqcheq) - - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) + T0; - } - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM3cqb) = - *(ckt->CKTstate0 + here->BSIM3cqb); - *(ckt->CKTstate1 + here->BSIM3cqg) = - *(ckt->CKTstate0 + here->BSIM3cqg); - *(ckt->CKTstate1 + here->BSIM3cqd) = - *(ckt->CKTstate0 + here->BSIM3cqd); - - if (here->BSIM3nqsMod) - { *(ckt->CKTstate1 + here->BSIM3cqcheq) = - *(ckt->CKTstate0 + here->BSIM3cqcheq); - *(ckt->CKTstate1 + here->BSIM3cqcdump) = - *(ckt->CKTstate0 + here->BSIM3cqcdump); - } - } - - /* - * load current vector - */ -line900: - - if (here->BSIM3mode >= 0) - { Gm = here->BSIM3gm; - Gmbs = here->BSIM3gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cdreq = model->BSIM3type * (cdrain - here->BSIM3gds * vds - - Gm * vgs - Gmbs * vbs); - - ceqbd = -model->BSIM3type * (here->BSIM3csub - - here->BSIM3gbds * vds - here->BSIM3gbgs * vgs - - here->BSIM3gbbs * vbs); - ceqbs = 0.0; - - gbbdp = -here->BSIM3gbds; - gbbsp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs); - - gbdpg = here->BSIM3gbgs; - gbdpdp = here->BSIM3gbds; - gbdpb = here->BSIM3gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspg = 0.0; - gbspdp = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - } + ceqqd -= dxpart * T0 + + T1 * (ddxpart_dVg * vgb - + ddxpart_dVd * vbd - ddxpart_dVs * vbs); + cqdef = *(ckt->CKTstate0 + here->BSIM3cqcdump) - gqdef * qdef; + cqcheq = *(ckt->CKTstate0 + + here->BSIM3cqcheq) - (gcqgb * vgb - + gcqdb * vbd - + gcqsb * vbs) + T0; + } + + if (ckt->CKTmode & MODEINITTRAN) + { + *(ckt->CKTstate1 + here->BSIM3cqb) = + *(ckt->CKTstate0 + here->BSIM3cqb); + *(ckt->CKTstate1 + here->BSIM3cqg) = + *(ckt->CKTstate0 + here->BSIM3cqg); + *(ckt->CKTstate1 + here->BSIM3cqd) = + *(ckt->CKTstate0 + here->BSIM3cqd); + + if (here->BSIM3nqsMod) + { + *(ckt->CKTstate1 + + here->BSIM3cqcheq) = + *(ckt->CKTstate0 + here->BSIM3cqcheq); + *(ckt->CKTstate1 + + here->BSIM3cqcdump) = + *(ckt->CKTstate0 + here->BSIM3cqcdump); + } + } + + /* + * load current vector + */ + line900: + + if (here->BSIM3mode >= 0) + { + Gm = here->BSIM3gm; + Gmbs = here->BSIM3gmbs; + FwdSum = Gm + Gmbs; + RevSum = 0.0; + cdreq = model->BSIM3type * (cdrain - + here->BSIM3gds * + vds - Gm * vgs - Gmbs * vbs); + + ceqbd = -model->BSIM3type * (here->BSIM3csub + - + here->BSIM3gbds * + vds - + here->BSIM3gbgs * + vgs - here->BSIM3gbbs * vbs); + ceqbs = 0.0; + + gbbdp = -here->BSIM3gbds; + gbbsp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs); + + gbdpg = here->BSIM3gbgs; + gbdpdp = here->BSIM3gbds; + gbdpb = here->BSIM3gbbs; + gbdpsp = -(gbdpg + gbdpdp + gbdpb); + + gbspg = 0.0; + gbspdp = 0.0; + gbspb = 0.0; + gbspsp = 0.0; + } else - { Gm = -here->BSIM3gm; - Gmbs = -here->BSIM3gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - cdreq = -model->BSIM3type * (cdrain + here->BSIM3gds * vds - + Gm * vgd + Gmbs * vbd); - - ceqbs = -model->BSIM3type * (here->BSIM3csub - + here->BSIM3gbds * vds - here->BSIM3gbgs * vgd - - here->BSIM3gbbs * vbd); - ceqbd = 0.0; - - gbbsp = -here->BSIM3gbds; - gbbdp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs); - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM3gbgs; - gbspsp = here->BSIM3gbds; - gbspb = here->BSIM3gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - } - - if (model->BSIM3type > 0) - { ceqbs += (here->BSIM3cbs - here->BSIM3gbs * vbs); - ceqbd += (here->BSIM3cbd - here->BSIM3gbd * vbd); - /* - ceqqg = ceqqg; - ceqqb = ceqqb; - ceqqd = ceqqd; - cqdef = cqdef; - cqcheq = cqcheq; + { + Gm = -here->BSIM3gm; + Gmbs = -here->BSIM3gmbs; + FwdSum = 0.0; + RevSum = -(Gm + Gmbs); + cdreq = -model->BSIM3type * (cdrain + + here->BSIM3gds * + vds + Gm * vgd + Gmbs * vbd); + + ceqbs = -model->BSIM3type * (here->BSIM3csub + + + here->BSIM3gbds * + vds - + here->BSIM3gbgs * + vgd - here->BSIM3gbbs * vbd); + ceqbd = 0.0; + + gbbsp = -here->BSIM3gbds; + gbbdp = (here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs); + + gbdpg = 0.0; + gbdpsp = 0.0; + gbdpb = 0.0; + gbdpdp = 0.0; + + gbspg = here->BSIM3gbgs; + gbspsp = here->BSIM3gbds; + gbspb = here->BSIM3gbbs; + gbspdp = -(gbspg + gbspsp + gbspb); + } + + if (model->BSIM3type > 0) + { + ceqbs += (here->BSIM3cbs - here->BSIM3gbs * vbs); + ceqbd += (here->BSIM3cbd - here->BSIM3gbd * vbd); + /* + * ceqqg = ceqqg; + * ceqqb = ceqqb; + * ceqqd = ceqqd; + * cqdef = cqdef; + * cqcheq = cqcheq; */ - } - else - { ceqbs -= (here->BSIM3cbs - here->BSIM3gbs * vbs); - ceqbd -= (here->BSIM3cbd - here->BSIM3gbd * vbd); - ceqqg = -ceqqg; - ceqqb = -ceqqb; - ceqqd = -ceqqd; - cqdef = -cqdef; - cqcheq = -cqcheq; - } - - (*(ckt->CKTrhs + here->BSIM3gNode) -= m*ceqqg); - (*(ckt->CKTrhs + here->BSIM3bNode) -= m*(ceqbs + ceqbd + ceqqb)); - (*(ckt->CKTrhs + here->BSIM3dNodePrime) +=m*(ceqbd - cdreq - ceqqd)); - (*(ckt->CKTrhs + here->BSIM3sNodePrime) += m*(cdreq + ceqbs + ceqqg - + ceqqb + ceqqd)); - if (here->BSIM3nqsMod) - *(ckt->CKTrhs + here->BSIM3qNode) += m*(cqcheq - cqdef); - - /* - * load y matrix - */ - - T1 = qdef * here->BSIM3gtau; - (*(here->BSIM3DdPtr) += m*here->BSIM3drainConductance); - (*(here->BSIM3GgPtr) += m*(gcggb - ggtg)); - (*(here->BSIM3SsPtr) += m*here->BSIM3sourceConductance); - (*(here->BSIM3BbPtr) += m*(here->BSIM3gbd + here->BSIM3gbs - - gcbgb - gcbdb - gcbsb - here->BSIM3gbbs)); - (*(here->BSIM3DPdpPtr) += m*(here->BSIM3drainConductance - + here->BSIM3gds + here->BSIM3gbd - + RevSum + gcddb + dxpart * ggtd - + T1 * ddxpart_dVd + gbdpdp)); - (*(here->BSIM3SPspPtr) += m*(here->BSIM3sourceConductance - + here->BSIM3gds + here->BSIM3gbs - + FwdSum + gcssb + sxpart * ggts - + T1 * dsxpart_dVs + gbspsp)); - (*(here->BSIM3DdpPtr) -= m*here->BSIM3drainConductance); - (*(here->BSIM3GbPtr) -= m*(gcggb + gcgdb + gcgsb + ggtb)); - (*(here->BSIM3GdpPtr) += m*(gcgdb - ggtd)); - (*(here->BSIM3GspPtr) += m*(gcgsb - ggts)); - (*(here->BSIM3SspPtr) -= m*here->BSIM3sourceConductance); - (*(here->BSIM3BgPtr) += m*(gcbgb - here->BSIM3gbgs)); - (*(here->BSIM3BdpPtr) += m*(gcbdb - here->BSIM3gbd + gbbdp)); - (*(here->BSIM3BspPtr) += m*(gcbsb - here->BSIM3gbs + gbbsp)); - (*(here->BSIM3DPdPtr) -= m*here->BSIM3drainConductance); - (*(here->BSIM3DPgPtr) += m*(Gm + gcdgb + dxpart * ggtg - + T1 * ddxpart_dVg + gbdpg)); - (*(here->BSIM3DPbPtr) -= m*(here->BSIM3gbd - Gmbs + gcdgb + gcddb - + gcdsb - dxpart * ggtb - - T1 * ddxpart_dVb - gbdpb)); - (*(here->BSIM3DPspPtr) -= m*(here->BSIM3gds + FwdSum - gcdsb - - dxpart * ggts - T1 * ddxpart_dVs - gbdpsp)); - (*(here->BSIM3SPgPtr) += m*(gcsgb - Gm + sxpart * ggtg - + T1 * dsxpart_dVg + gbspg)); - (*(here->BSIM3SPsPtr) -= m*here->BSIM3sourceConductance); - (*(here->BSIM3SPbPtr) -= m*(here->BSIM3gbs + Gmbs + gcsgb + gcsdb - + gcssb - sxpart * ggtb - - T1 * dsxpart_dVb - gbspb)); - (*(here->BSIM3SPdpPtr) -= m*(here->BSIM3gds + RevSum - gcsdb - - sxpart * ggtd - T1 * dsxpart_dVd - gbspdp)); - - if (here->BSIM3nqsMod) - { *(here->BSIM3QqPtr) += m*(gqdef + here->BSIM3gtau); - - *(here->BSIM3DPqPtr) += m*(dxpart * here->BSIM3gtau); - *(here->BSIM3SPqPtr) += m*(sxpart * here->BSIM3gtau); - *(here->BSIM3GqPtr) -= m*here->BSIM3gtau; - - *(here->BSIM3QgPtr) += m*(ggtg - gcqgb); - *(here->BSIM3QdpPtr) += m*(ggtd - gcqdb); - *(here->BSIM3QspPtr) += m*(ggts - gcqsb); - *(here->BSIM3QbPtr) += m*(ggtb - gcqbb); - } - -line1000: ; - - } /* End of Mosfet Instance */ -} /* End of Model Instance */ - -return(OK); + } + else + { + ceqbs -= (here->BSIM3cbs - here->BSIM3gbs * vbs); + ceqbd -= (here->BSIM3cbd - here->BSIM3gbd * vbd); + ceqqg = -ceqqg; + ceqqb = -ceqqb; + ceqqd = -ceqqd; + cqdef = -cqdef; + cqcheq = -cqcheq; + } + + + (*(ckt->CKTrhs + here->BSIM3gNode) -= m * ceqqg); + (*(ckt->CKTrhs + here->BSIM3bNode) -= m * (ceqbs + ceqbd + ceqqb)); + (*(ckt->CKTrhs + here->BSIM3dNodePrime) += + m * (ceqbd - cdreq - ceqqd)); + (*(ckt->CKTrhs + here->BSIM3sNodePrime) += + m * (cdreq + ceqbs + ceqqg + ceqqb + ceqqd)); + if (here->BSIM3nqsMod) + *(ckt->CKTrhs + here->BSIM3qNode) += m * (cqcheq - cqdef); + + /* + * load y matrix + */ + + T1 = qdef * here->BSIM3gtau; + (*(here->BSIM3DdPtr) += m * here->BSIM3drainConductance); + (*(here->BSIM3GgPtr) += m * (gcggb - ggtg)); + (*(here->BSIM3SsPtr) += m * here->BSIM3sourceConductance); + (*(here->BSIM3BbPtr) += + m * (here->BSIM3gbd + here->BSIM3gbs - gcbgb - + gcbdb - gcbsb - here->BSIM3gbbs)); + (*(here->BSIM3DPdpPtr) += + m * (here->BSIM3drainConductance + here->BSIM3gds + + here->BSIM3gbd + RevSum + gcddb + + dxpart * ggtd + T1 * ddxpart_dVd + gbdpdp)); + (*(here->BSIM3SPspPtr) += + m * (here->BSIM3sourceConductance + here->BSIM3gds + + here->BSIM3gbs + FwdSum + gcssb + + sxpart * ggts + T1 * dsxpart_dVs + gbspsp)); + (*(here->BSIM3DdpPtr) -= m * here->BSIM3drainConductance); + (*(here->BSIM3GbPtr) -= m * (gcggb + gcgdb + gcgsb + ggtb)); + (*(here->BSIM3GdpPtr) += m * (gcgdb - ggtd)); + (*(here->BSIM3GspPtr) += m * (gcgsb - ggts)); + (*(here->BSIM3SspPtr) -= m * here->BSIM3sourceConductance); + (*(here->BSIM3BgPtr) += m * (gcbgb - here->BSIM3gbgs)); + (*(here->BSIM3BdpPtr) += m * (gcbdb - here->BSIM3gbd + gbbdp)); + (*(here->BSIM3BspPtr) += m * (gcbsb - here->BSIM3gbs + gbbsp)); + (*(here->BSIM3DPdPtr) -= m * here->BSIM3drainConductance); + (*(here->BSIM3DPgPtr) += + m * (Gm + gcdgb + dxpart * ggtg + T1 * ddxpart_dVg + gbdpg)); + (*(here->BSIM3DPbPtr) -= + m * (here->BSIM3gbd - Gmbs + gcdgb + gcddb + gcdsb - + dxpart * ggtb - T1 * ddxpart_dVb - gbdpb)); + (*(here->BSIM3DPspPtr) -= + m * (here->BSIM3gds + FwdSum - gcdsb - + dxpart * ggts - T1 * ddxpart_dVs - gbdpsp)); + (*(here->BSIM3SPgPtr) += + m * (gcsgb - Gm + sxpart * ggtg + T1 * dsxpart_dVg + gbspg)); + (*(here->BSIM3SPsPtr) -= m * here->BSIM3sourceConductance); + (*(here->BSIM3SPbPtr) -= + m * (here->BSIM3gbs + Gmbs + gcsgb + gcsdb + gcssb - + sxpart * ggtb - T1 * dsxpart_dVb - gbspb)); + (*(here->BSIM3SPdpPtr) -= + m * (here->BSIM3gds + RevSum - gcsdb - + sxpart * ggtd - T1 * dsxpart_dVd - gbspdp)); + + if (here->BSIM3nqsMod) + { + *(here->BSIM3QqPtr) += m * (gqdef + here->BSIM3gtau); + + *(here->BSIM3DPqPtr) += m * (dxpart * here->BSIM3gtau); + *(here->BSIM3SPqPtr) += m * (sxpart * here->BSIM3gtau); + *(here->BSIM3GqPtr) -= m * here->BSIM3gtau; + + *(here->BSIM3QgPtr) += m * (ggtg - gcqgb); + *(here->BSIM3QdpPtr) += m * (ggtd - gcqdb); + *(here->BSIM3QspPtr) += m * (ggts - gcqsb); + *(here->BSIM3QbPtr) += m * (ggtb - gcqbb); + } + + + line1000:; + + } /* End of Mosfet Instance */ + } /* End of Model Instance */ + + return (OK); } - diff --git a/src/spicelib/devices/bsim3/b3mask.c b/src/spicelib/devices/bsim3/b3mask.c index f2c41aea1..530d53846 100644 --- a/src/spicelib/devices/bsim3/b3mask.c +++ b/src/spicelib/devices/bsim3/b3mask.c @@ -1,12 +1,24 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -File: b3mask.c -**********/ + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3mask.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + + +/*************************************/ #include "ngspice.h" -#include #include "ifsim.h" #include "cktdefs.h" #include "devdefs.h" @@ -15,1225 +27,1219 @@ File: b3mask.c #include "suffix.h" int -BSIM3mAsk(ckt,inst,which,value) -CKTcircuit *ckt; -GENmodel *inst; -int which; -IFvalue *value; +BSIM3mAsk (CKTcircuit * ckt, GENmodel * inst, int which, IFvalue * value) { - BSIM3model *model = (BSIM3model *)inst; - switch(which) - { case BSIM3_MOD_MOBMOD: - value->iValue = model->BSIM3mobMod; - return(OK); - case BSIM3_MOD_PARAMCHK: - value->iValue = model->BSIM3paramChk; - return(OK); - case BSIM3_MOD_BINUNIT: - value->iValue = model->BSIM3binUnit; - return(OK); - case BSIM3_MOD_CAPMOD: - value->iValue = model->BSIM3capMod; - return(OK); - case BSIM3_MOD_NOIMOD: - value->iValue = model->BSIM3noiMod; - return(OK); - case BSIM3_MOD_VERSION : - value->sValue = model->BSIM3version; - return(OK); - case BSIM3_MOD_TOX : - value->rValue = model->BSIM3tox; - return(OK); - case BSIM3_MOD_TOXM : - value->rValue = model->BSIM3toxm; - return(OK); - case BSIM3_MOD_CDSC : - value->rValue = model->BSIM3cdsc; - return(OK); - case BSIM3_MOD_CDSCB : - value->rValue = model->BSIM3cdscb; - return(OK); + BSIM3model *model = (BSIM3model *) inst; + switch (which) + { + case BSIM3_MOD_MOBMOD: + value->iValue = model->BSIM3mobMod; + return (OK); + case BSIM3_MOD_PARAMCHK: + value->iValue = model->BSIM3paramChk; + return (OK); + case BSIM3_MOD_BINUNIT: + value->iValue = model->BSIM3binUnit; + return (OK); + case BSIM3_MOD_CAPMOD: + value->iValue = model->BSIM3capMod; + return (OK); + case BSIM3_MOD_NOIMOD: + value->iValue = model->BSIM3noiMod; + return (OK); + case BSIM3_MOD_VERSION: + value->sValue = model->BSIM3version; + return (OK); + case BSIM3_MOD_TOX: + value->rValue = model->BSIM3tox; + return (OK); + case BSIM3_MOD_TOXM: + value->rValue = model->BSIM3toxm; + return (OK); + case BSIM3_MOD_CDSC: + value->rValue = model->BSIM3cdsc; + return (OK); + case BSIM3_MOD_CDSCB: + value->rValue = model->BSIM3cdscb; + return (OK); - case BSIM3_MOD_CDSCD : - value->rValue = model->BSIM3cdscd; - return(OK); + case BSIM3_MOD_CDSCD: + value->rValue = model->BSIM3cdscd; + return (OK); - case BSIM3_MOD_CIT : - value->rValue = model->BSIM3cit; - return(OK); - case BSIM3_MOD_NFACTOR : - value->rValue = model->BSIM3nfactor; - return(OK); - case BSIM3_MOD_XJ: - value->rValue = model->BSIM3xj; - return(OK); - case BSIM3_MOD_VSAT: - value->rValue = model->BSIM3vsat; - return(OK); - case BSIM3_MOD_AT: - value->rValue = model->BSIM3at; - return(OK); - case BSIM3_MOD_A0: - value->rValue = model->BSIM3a0; - return(OK); + case BSIM3_MOD_CIT: + value->rValue = model->BSIM3cit; + return (OK); + case BSIM3_MOD_NFACTOR: + value->rValue = model->BSIM3nfactor; + return (OK); + case BSIM3_MOD_XJ: + value->rValue = model->BSIM3xj; + return (OK); + case BSIM3_MOD_VSAT: + value->rValue = model->BSIM3vsat; + return (OK); + case BSIM3_MOD_AT: + value->rValue = model->BSIM3at; + return (OK); + case BSIM3_MOD_A0: + value->rValue = model->BSIM3a0; + return (OK); - case BSIM3_MOD_AGS: - value->rValue = model->BSIM3ags; - return(OK); + case BSIM3_MOD_AGS: + value->rValue = model->BSIM3ags; + return (OK); - case BSIM3_MOD_A1: - value->rValue = model->BSIM3a1; - return(OK); - case BSIM3_MOD_A2: - value->rValue = model->BSIM3a2; - return(OK); - case BSIM3_MOD_KETA: - value->rValue = model->BSIM3keta; - return(OK); - case BSIM3_MOD_NSUB: - value->rValue = model->BSIM3nsub; - return(OK); - case BSIM3_MOD_NPEAK: - value->rValue = model->BSIM3npeak; - return(OK); - case BSIM3_MOD_NGATE: - value->rValue = model->BSIM3ngate; - return(OK); - case BSIM3_MOD_GAMMA1: - value->rValue = model->BSIM3gamma1; - return(OK); - case BSIM3_MOD_GAMMA2: - value->rValue = model->BSIM3gamma2; - return(OK); - case BSIM3_MOD_VBX: - value->rValue = model->BSIM3vbx; - return(OK); - case BSIM3_MOD_VBM: - value->rValue = model->BSIM3vbm; - return(OK); - case BSIM3_MOD_XT: - value->rValue = model->BSIM3xt; - return(OK); - case BSIM3_MOD_K1: - value->rValue = model->BSIM3k1; - return(OK); - case BSIM3_MOD_KT1: - value->rValue = model->BSIM3kt1; - return(OK); - case BSIM3_MOD_KT1L: - value->rValue = model->BSIM3kt1l; - return(OK); - case BSIM3_MOD_KT2 : - value->rValue = model->BSIM3kt2; - return(OK); - case BSIM3_MOD_K2 : - value->rValue = model->BSIM3k2; - return(OK); - case BSIM3_MOD_K3: - value->rValue = model->BSIM3k3; - return(OK); - case BSIM3_MOD_K3B: - value->rValue = model->BSIM3k3b; - return(OK); - case BSIM3_MOD_W0: - value->rValue = model->BSIM3w0; - return(OK); - case BSIM3_MOD_NLX: - value->rValue = model->BSIM3nlx; - return(OK); - case BSIM3_MOD_DVT0 : - value->rValue = model->BSIM3dvt0; - return(OK); - case BSIM3_MOD_DVT1 : - value->rValue = model->BSIM3dvt1; - return(OK); - case BSIM3_MOD_DVT2 : - value->rValue = model->BSIM3dvt2; - return(OK); - case BSIM3_MOD_DVT0W : - value->rValue = model->BSIM3dvt0w; - return(OK); - case BSIM3_MOD_DVT1W : - value->rValue = model->BSIM3dvt1w; - return(OK); - case BSIM3_MOD_DVT2W : - value->rValue = model->BSIM3dvt2w; - return(OK); - case BSIM3_MOD_DROUT : - value->rValue = model->BSIM3drout; - return(OK); - case BSIM3_MOD_DSUB : - value->rValue = model->BSIM3dsub; - return(OK); - case BSIM3_MOD_VTH0: - value->rValue = model->BSIM3vth0; - return(OK); - case BSIM3_MOD_UA: - value->rValue = model->BSIM3ua; - return(OK); - case BSIM3_MOD_UA1: - value->rValue = model->BSIM3ua1; - return(OK); - case BSIM3_MOD_UB: - value->rValue = model->BSIM3ub; - return(OK); - case BSIM3_MOD_UB1: - value->rValue = model->BSIM3ub1; - return(OK); - case BSIM3_MOD_UC: - value->rValue = model->BSIM3uc; - return(OK); - case BSIM3_MOD_UC1: - value->rValue = model->BSIM3uc1; - return(OK); - case BSIM3_MOD_U0: - value->rValue = model->BSIM3u0; - return(OK); - case BSIM3_MOD_UTE: - value->rValue = model->BSIM3ute; - return(OK); - case BSIM3_MOD_VOFF: - value->rValue = model->BSIM3voff; - return(OK); - case BSIM3_MOD_DELTA: - value->rValue = model->BSIM3delta; - return(OK); - case BSIM3_MOD_RDSW: - value->rValue = model->BSIM3rdsw; - return(OK); - case BSIM3_MOD_PRWG: - value->rValue = model->BSIM3prwg; - return(OK); - case BSIM3_MOD_PRWB: - value->rValue = model->BSIM3prwb; - return(OK); - case BSIM3_MOD_PRT: - value->rValue = model->BSIM3prt; - return(OK); - case BSIM3_MOD_ETA0: - value->rValue = model->BSIM3eta0; - return(OK); - case BSIM3_MOD_ETAB: - value->rValue = model->BSIM3etab; - return(OK); - case BSIM3_MOD_PCLM: - value->rValue = model->BSIM3pclm; - return(OK); - case BSIM3_MOD_PDIBL1: - value->rValue = model->BSIM3pdibl1; - return(OK); - case BSIM3_MOD_PDIBL2: - value->rValue = model->BSIM3pdibl2; - return(OK); - case BSIM3_MOD_PDIBLB: - value->rValue = model->BSIM3pdiblb; - return(OK); - case BSIM3_MOD_PSCBE1: - value->rValue = model->BSIM3pscbe1; - return(OK); - case BSIM3_MOD_PSCBE2: - value->rValue = model->BSIM3pscbe2; - return(OK); - case BSIM3_MOD_PVAG: - value->rValue = model->BSIM3pvag; - return(OK); - case BSIM3_MOD_WR: - value->rValue = model->BSIM3wr; - return(OK); - case BSIM3_MOD_DWG: - value->rValue = model->BSIM3dwg; - return(OK); - case BSIM3_MOD_DWB: - value->rValue = model->BSIM3dwb; - return(OK); - case BSIM3_MOD_B0: - value->rValue = model->BSIM3b0; - return(OK); - case BSIM3_MOD_B1: - value->rValue = model->BSIM3b1; - return(OK); - case BSIM3_MOD_ALPHA0: - value->rValue = model->BSIM3alpha0; - return(OK); - case BSIM3_MOD_ALPHA1: - value->rValue = model->BSIM3alpha1; - return(OK); - case BSIM3_MOD_BETA0: - value->rValue = model->BSIM3beta0; - return(OK); - case BSIM3_MOD_IJTH: - value->rValue = model->BSIM3ijth; - return(OK); - case BSIM3_MOD_VFB: - value->rValue = model->BSIM3vfb; - return(OK); + case BSIM3_MOD_A1: + value->rValue = model->BSIM3a1; + return (OK); + case BSIM3_MOD_A2: + value->rValue = model->BSIM3a2; + return (OK); + case BSIM3_MOD_KETA: + value->rValue = model->BSIM3keta; + return (OK); + case BSIM3_MOD_NSUB: + value->rValue = model->BSIM3nsub; + return (OK); + case BSIM3_MOD_NPEAK: + value->rValue = model->BSIM3npeak; + return (OK); + case BSIM3_MOD_NGATE: + value->rValue = model->BSIM3ngate; + return (OK); + case BSIM3_MOD_GAMMA1: + value->rValue = model->BSIM3gamma1; + return (OK); + case BSIM3_MOD_GAMMA2: + value->rValue = model->BSIM3gamma2; + return (OK); + case BSIM3_MOD_VBX: + value->rValue = model->BSIM3vbx; + return (OK); + case BSIM3_MOD_VBM: + value->rValue = model->BSIM3vbm; + return (OK); + case BSIM3_MOD_XT: + value->rValue = model->BSIM3xt; + return (OK); + case BSIM3_MOD_K1: + value->rValue = model->BSIM3k1; + return (OK); + case BSIM3_MOD_KT1: + value->rValue = model->BSIM3kt1; + return (OK); + case BSIM3_MOD_KT1L: + value->rValue = model->BSIM3kt1l; + return (OK); + case BSIM3_MOD_KT2: + value->rValue = model->BSIM3kt2; + return (OK); + case BSIM3_MOD_K2: + value->rValue = model->BSIM3k2; + return (OK); + case BSIM3_MOD_K3: + value->rValue = model->BSIM3k3; + return (OK); + case BSIM3_MOD_K3B: + value->rValue = model->BSIM3k3b; + return (OK); + case BSIM3_MOD_W0: + value->rValue = model->BSIM3w0; + return (OK); + case BSIM3_MOD_NLX: + value->rValue = model->BSIM3nlx; + return (OK); + case BSIM3_MOD_DVT0: + value->rValue = model->BSIM3dvt0; + return (OK); + case BSIM3_MOD_DVT1: + value->rValue = model->BSIM3dvt1; + return (OK); + case BSIM3_MOD_DVT2: + value->rValue = model->BSIM3dvt2; + return (OK); + case BSIM3_MOD_DVT0W: + value->rValue = model->BSIM3dvt0w; + return (OK); + case BSIM3_MOD_DVT1W: + value->rValue = model->BSIM3dvt1w; + return (OK); + case BSIM3_MOD_DVT2W: + value->rValue = model->BSIM3dvt2w; + return (OK); + case BSIM3_MOD_DROUT: + value->rValue = model->BSIM3drout; + return (OK); + case BSIM3_MOD_DSUB: + value->rValue = model->BSIM3dsub; + return (OK); + case BSIM3_MOD_VTH0: + value->rValue = model->BSIM3vth0; + return (OK); + case BSIM3_MOD_UA: + value->rValue = model->BSIM3ua; + return (OK); + case BSIM3_MOD_UA1: + value->rValue = model->BSIM3ua1; + return (OK); + case BSIM3_MOD_UB: + value->rValue = model->BSIM3ub; + return (OK); + case BSIM3_MOD_UB1: + value->rValue = model->BSIM3ub1; + return (OK); + case BSIM3_MOD_UC: + value->rValue = model->BSIM3uc; + return (OK); + case BSIM3_MOD_UC1: + value->rValue = model->BSIM3uc1; + return (OK); + case BSIM3_MOD_U0: + value->rValue = model->BSIM3u0; + return (OK); + case BSIM3_MOD_UTE: + value->rValue = model->BSIM3ute; + return (OK); + case BSIM3_MOD_VOFF: + value->rValue = model->BSIM3voff; + return (OK); + case BSIM3_MOD_DELTA: + value->rValue = model->BSIM3delta; + return (OK); + case BSIM3_MOD_RDSW: + value->rValue = model->BSIM3rdsw; + return (OK); + case BSIM3_MOD_PRWG: + value->rValue = model->BSIM3prwg; + return (OK); + case BSIM3_MOD_PRWB: + value->rValue = model->BSIM3prwb; + return (OK); + case BSIM3_MOD_PRT: + value->rValue = model->BSIM3prt; + return (OK); + case BSIM3_MOD_ETA0: + value->rValue = model->BSIM3eta0; + return (OK); + case BSIM3_MOD_ETAB: + value->rValue = model->BSIM3etab; + return (OK); + case BSIM3_MOD_PCLM: + value->rValue = model->BSIM3pclm; + return (OK); + case BSIM3_MOD_PDIBL1: + value->rValue = model->BSIM3pdibl1; + return (OK); + case BSIM3_MOD_PDIBL2: + value->rValue = model->BSIM3pdibl2; + return (OK); + case BSIM3_MOD_PDIBLB: + value->rValue = model->BSIM3pdiblb; + return (OK); + case BSIM3_MOD_PSCBE1: + value->rValue = model->BSIM3pscbe1; + return (OK); + case BSIM3_MOD_PSCBE2: + value->rValue = model->BSIM3pscbe2; + return (OK); + case BSIM3_MOD_PVAG: + value->rValue = model->BSIM3pvag; + return (OK); + case BSIM3_MOD_WR: + value->rValue = model->BSIM3wr; + return (OK); + case BSIM3_MOD_DWG: + value->rValue = model->BSIM3dwg; + return (OK); + case BSIM3_MOD_DWB: + value->rValue = model->BSIM3dwb; + return (OK); + case BSIM3_MOD_B0: + value->rValue = model->BSIM3b0; + return (OK); + case BSIM3_MOD_B1: + value->rValue = model->BSIM3b1; + return (OK); + case BSIM3_MOD_ALPHA0: + value->rValue = model->BSIM3alpha0; + return (OK); + case BSIM3_MOD_ALPHA1: + value->rValue = model->BSIM3alpha1; + return (OK); + case BSIM3_MOD_BETA0: + value->rValue = model->BSIM3beta0; + return (OK); + case BSIM3_MOD_IJTH: + value->rValue = model->BSIM3ijth; + return (OK); + case BSIM3_MOD_VFB: + value->rValue = model->BSIM3vfb; + return (OK); - case BSIM3_MOD_ELM: - value->rValue = model->BSIM3elm; - return(OK); - case BSIM3_MOD_CGSL: - value->rValue = model->BSIM3cgsl; - return(OK); - case BSIM3_MOD_CGDL: - value->rValue = model->BSIM3cgdl; - return(OK); - case BSIM3_MOD_CKAPPA: - value->rValue = model->BSIM3ckappa; - return(OK); - case BSIM3_MOD_CF: - value->rValue = model->BSIM3cf; - return(OK); - case BSIM3_MOD_CLC: - value->rValue = model->BSIM3clc; - return(OK); - case BSIM3_MOD_CLE: - value->rValue = model->BSIM3cle; - return(OK); - case BSIM3_MOD_DWC: - value->rValue = model->BSIM3dwc; - return(OK); - case BSIM3_MOD_DLC: - value->rValue = model->BSIM3dlc; - return(OK); - case BSIM3_MOD_VFBCV: - value->rValue = model->BSIM3vfbcv; - return(OK); - case BSIM3_MOD_ACDE: - value->rValue = model->BSIM3acde; - return(OK); - case BSIM3_MOD_MOIN: - value->rValue = model->BSIM3moin; - return(OK); - case BSIM3_MOD_NOFF: - value->rValue = model->BSIM3noff; - return(OK); - case BSIM3_MOD_VOFFCV: - value->rValue = model->BSIM3voffcv; - return(OK); - case BSIM3_MOD_TCJ: - value->rValue = model->BSIM3tcj; - return(OK); - case BSIM3_MOD_TPB: - value->rValue = model->BSIM3tpb; - return(OK); - case BSIM3_MOD_TCJSW: - value->rValue = model->BSIM3tcjsw; - return(OK); - case BSIM3_MOD_TPBSW: - value->rValue = model->BSIM3tpbsw; - return(OK); - case BSIM3_MOD_TCJSWG: - value->rValue = model->BSIM3tcjswg; - return(OK); - case BSIM3_MOD_TPBSWG: - value->rValue = model->BSIM3tpbswg; - return(OK); + case BSIM3_MOD_ELM: + value->rValue = model->BSIM3elm; + return (OK); + case BSIM3_MOD_CGSL: + value->rValue = model->BSIM3cgsl; + return (OK); + case BSIM3_MOD_CGDL: + value->rValue = model->BSIM3cgdl; + return (OK); + case BSIM3_MOD_CKAPPA: + value->rValue = model->BSIM3ckappa; + return (OK); + case BSIM3_MOD_CF: + value->rValue = model->BSIM3cf; + return (OK); + case BSIM3_MOD_CLC: + value->rValue = model->BSIM3clc; + return (OK); + case BSIM3_MOD_CLE: + value->rValue = model->BSIM3cle; + return (OK); + case BSIM3_MOD_DWC: + value->rValue = model->BSIM3dwc; + return (OK); + case BSIM3_MOD_DLC: + value->rValue = model->BSIM3dlc; + return (OK); + case BSIM3_MOD_VFBCV: + value->rValue = model->BSIM3vfbcv; + return (OK); + case BSIM3_MOD_ACDE: + value->rValue = model->BSIM3acde; + return (OK); + case BSIM3_MOD_MOIN: + value->rValue = model->BSIM3moin; + return (OK); + case BSIM3_MOD_NOFF: + value->rValue = model->BSIM3noff; + return (OK); + case BSIM3_MOD_VOFFCV: + value->rValue = model->BSIM3voffcv; + return (OK); + case BSIM3_MOD_TCJ: + value->rValue = model->BSIM3tcj; + return (OK); + case BSIM3_MOD_TPB: + value->rValue = model->BSIM3tpb; + return (OK); + case BSIM3_MOD_TCJSW: + value->rValue = model->BSIM3tcjsw; + return (OK); + case BSIM3_MOD_TPBSW: + value->rValue = model->BSIM3tpbsw; + return (OK); + case BSIM3_MOD_TCJSWG: + value->rValue = model->BSIM3tcjswg; + return (OK); + case BSIM3_MOD_TPBSWG: + value->rValue = model->BSIM3tpbswg; + return (OK); - /* Length dependence */ - case BSIM3_MOD_LCDSC : - value->rValue = model->BSIM3lcdsc; - return(OK); - case BSIM3_MOD_LCDSCB : - value->rValue = model->BSIM3lcdscb; - return(OK); - case BSIM3_MOD_LCDSCD : - value->rValue = model->BSIM3lcdscd; - return(OK); - case BSIM3_MOD_LCIT : - value->rValue = model->BSIM3lcit; - return(OK); - case BSIM3_MOD_LNFACTOR : - value->rValue = model->BSIM3lnfactor; - return(OK); - case BSIM3_MOD_LXJ: - value->rValue = model->BSIM3lxj; - return(OK); - case BSIM3_MOD_LVSAT: - value->rValue = model->BSIM3lvsat; - return(OK); - case BSIM3_MOD_LAT: - value->rValue = model->BSIM3lat; - return(OK); - case BSIM3_MOD_LA0: - value->rValue = model->BSIM3la0; - return(OK); - case BSIM3_MOD_LAGS: - value->rValue = model->BSIM3lags; - return(OK); - case BSIM3_MOD_LA1: - value->rValue = model->BSIM3la1; - return(OK); - case BSIM3_MOD_LA2: - value->rValue = model->BSIM3la2; - return(OK); - case BSIM3_MOD_LKETA: - value->rValue = model->BSIM3lketa; - return(OK); - case BSIM3_MOD_LNSUB: - value->rValue = model->BSIM3lnsub; - return(OK); - case BSIM3_MOD_LNPEAK: - value->rValue = model->BSIM3lnpeak; - return(OK); - case BSIM3_MOD_LNGATE: - value->rValue = model->BSIM3lngate; - return(OK); - case BSIM3_MOD_LGAMMA1: - value->rValue = model->BSIM3lgamma1; - return(OK); - case BSIM3_MOD_LGAMMA2: - value->rValue = model->BSIM3lgamma2; - return(OK); - case BSIM3_MOD_LVBX: - value->rValue = model->BSIM3lvbx; - return(OK); - case BSIM3_MOD_LVBM: - value->rValue = model->BSIM3lvbm; - return(OK); - case BSIM3_MOD_LXT: - value->rValue = model->BSIM3lxt; - return(OK); - case BSIM3_MOD_LK1: - value->rValue = model->BSIM3lk1; - return(OK); - case BSIM3_MOD_LKT1: - value->rValue = model->BSIM3lkt1; - return(OK); - case BSIM3_MOD_LKT1L: - value->rValue = model->BSIM3lkt1l; - return(OK); - case BSIM3_MOD_LKT2 : - value->rValue = model->BSIM3lkt2; - return(OK); - case BSIM3_MOD_LK2 : - value->rValue = model->BSIM3lk2; - return(OK); - case BSIM3_MOD_LK3: - value->rValue = model->BSIM3lk3; - return(OK); - case BSIM3_MOD_LK3B: - value->rValue = model->BSIM3lk3b; - return(OK); - case BSIM3_MOD_LW0: - value->rValue = model->BSIM3lw0; - return(OK); - case BSIM3_MOD_LNLX: - value->rValue = model->BSIM3lnlx; - return(OK); - case BSIM3_MOD_LDVT0: - value->rValue = model->BSIM3ldvt0; - return(OK); - case BSIM3_MOD_LDVT1 : - value->rValue = model->BSIM3ldvt1; - return(OK); - case BSIM3_MOD_LDVT2 : - value->rValue = model->BSIM3ldvt2; - return(OK); - case BSIM3_MOD_LDVT0W : - value->rValue = model->BSIM3ldvt0w; - return(OK); - case BSIM3_MOD_LDVT1W : - value->rValue = model->BSIM3ldvt1w; - return(OK); - case BSIM3_MOD_LDVT2W : - value->rValue = model->BSIM3ldvt2w; - return(OK); - case BSIM3_MOD_LDROUT : - value->rValue = model->BSIM3ldrout; - return(OK); - case BSIM3_MOD_LDSUB : - value->rValue = model->BSIM3ldsub; - return(OK); - case BSIM3_MOD_LVTH0: - value->rValue = model->BSIM3lvth0; - return(OK); - case BSIM3_MOD_LUA: - value->rValue = model->BSIM3lua; - return(OK); - case BSIM3_MOD_LUA1: - value->rValue = model->BSIM3lua1; - return(OK); - case BSIM3_MOD_LUB: - value->rValue = model->BSIM3lub; - return(OK); - case BSIM3_MOD_LUB1: - value->rValue = model->BSIM3lub1; - return(OK); - case BSIM3_MOD_LUC: - value->rValue = model->BSIM3luc; - return(OK); - case BSIM3_MOD_LUC1: - value->rValue = model->BSIM3luc1; - return(OK); - case BSIM3_MOD_LU0: - value->rValue = model->BSIM3lu0; - return(OK); - case BSIM3_MOD_LUTE: - value->rValue = model->BSIM3lute; - return(OK); - case BSIM3_MOD_LVOFF: - value->rValue = model->BSIM3lvoff; - return(OK); - case BSIM3_MOD_LDELTA: - value->rValue = model->BSIM3ldelta; - return(OK); - case BSIM3_MOD_LRDSW: - value->rValue = model->BSIM3lrdsw; - return(OK); - case BSIM3_MOD_LPRWB: - value->rValue = model->BSIM3lprwb; - return(OK); - case BSIM3_MOD_LPRWG: - value->rValue = model->BSIM3lprwg; - return(OK); - case BSIM3_MOD_LPRT: - value->rValue = model->BSIM3lprt; - return(OK); - case BSIM3_MOD_LETA0: - value->rValue = model->BSIM3leta0; - return(OK); - case BSIM3_MOD_LETAB: - value->rValue = model->BSIM3letab; - return(OK); - case BSIM3_MOD_LPCLM: - value->rValue = model->BSIM3lpclm; - return(OK); - case BSIM3_MOD_LPDIBL1: - value->rValue = model->BSIM3lpdibl1; - return(OK); - case BSIM3_MOD_LPDIBL2: - value->rValue = model->BSIM3lpdibl2; - return(OK); - case BSIM3_MOD_LPDIBLB: - value->rValue = model->BSIM3lpdiblb; - return(OK); - case BSIM3_MOD_LPSCBE1: - value->rValue = model->BSIM3lpscbe1; - return(OK); - case BSIM3_MOD_LPSCBE2: - value->rValue = model->BSIM3lpscbe2; - return(OK); - case BSIM3_MOD_LPVAG: - value->rValue = model->BSIM3lpvag; - return(OK); - case BSIM3_MOD_LWR: - value->rValue = model->BSIM3lwr; - return(OK); - case BSIM3_MOD_LDWG: - value->rValue = model->BSIM3ldwg; - return(OK); - case BSIM3_MOD_LDWB: - value->rValue = model->BSIM3ldwb; - return(OK); - case BSIM3_MOD_LB0: - value->rValue = model->BSIM3lb0; - return(OK); - case BSIM3_MOD_LB1: - value->rValue = model->BSIM3lb1; - return(OK); - case BSIM3_MOD_LALPHA0: - value->rValue = model->BSIM3lalpha0; - return(OK); - case BSIM3_MOD_LALPHA1: - value->rValue = model->BSIM3lalpha1; - return(OK); - case BSIM3_MOD_LBETA0: - value->rValue = model->BSIM3lbeta0; - return(OK); - case BSIM3_MOD_LVFB: - value->rValue = model->BSIM3lvfb; - return(OK); + /* Length dependence */ + case BSIM3_MOD_LCDSC: + value->rValue = model->BSIM3lcdsc; + return (OK); + case BSIM3_MOD_LCDSCB: + value->rValue = model->BSIM3lcdscb; + return (OK); + case BSIM3_MOD_LCDSCD: + value->rValue = model->BSIM3lcdscd; + return (OK); + case BSIM3_MOD_LCIT: + value->rValue = model->BSIM3lcit; + return (OK); + case BSIM3_MOD_LNFACTOR: + value->rValue = model->BSIM3lnfactor; + return (OK); + case BSIM3_MOD_LXJ: + value->rValue = model->BSIM3lxj; + return (OK); + case BSIM3_MOD_LVSAT: + value->rValue = model->BSIM3lvsat; + return (OK); + case BSIM3_MOD_LAT: + value->rValue = model->BSIM3lat; + return (OK); + case BSIM3_MOD_LA0: + value->rValue = model->BSIM3la0; + return (OK); + case BSIM3_MOD_LAGS: + value->rValue = model->BSIM3lags; + return (OK); + case BSIM3_MOD_LA1: + value->rValue = model->BSIM3la1; + return (OK); + case BSIM3_MOD_LA2: + value->rValue = model->BSIM3la2; + return (OK); + case BSIM3_MOD_LKETA: + value->rValue = model->BSIM3lketa; + return (OK); + case BSIM3_MOD_LNSUB: + value->rValue = model->BSIM3lnsub; + return (OK); + case BSIM3_MOD_LNPEAK: + value->rValue = model->BSIM3lnpeak; + return (OK); + case BSIM3_MOD_LNGATE: + value->rValue = model->BSIM3lngate; + return (OK); + case BSIM3_MOD_LGAMMA1: + value->rValue = model->BSIM3lgamma1; + return (OK); + case BSIM3_MOD_LGAMMA2: + value->rValue = model->BSIM3lgamma2; + return (OK); + case BSIM3_MOD_LVBX: + value->rValue = model->BSIM3lvbx; + return (OK); + case BSIM3_MOD_LVBM: + value->rValue = model->BSIM3lvbm; + return (OK); + case BSIM3_MOD_LXT: + value->rValue = model->BSIM3lxt; + return (OK); + case BSIM3_MOD_LK1: + value->rValue = model->BSIM3lk1; + return (OK); + case BSIM3_MOD_LKT1: + value->rValue = model->BSIM3lkt1; + return (OK); + case BSIM3_MOD_LKT1L: + value->rValue = model->BSIM3lkt1l; + return (OK); + case BSIM3_MOD_LKT2: + value->rValue = model->BSIM3lkt2; + return (OK); + case BSIM3_MOD_LK2: + value->rValue = model->BSIM3lk2; + return (OK); + case BSIM3_MOD_LK3: + value->rValue = model->BSIM3lk3; + return (OK); + case BSIM3_MOD_LK3B: + value->rValue = model->BSIM3lk3b; + return (OK); + case BSIM3_MOD_LW0: + value->rValue = model->BSIM3lw0; + return (OK); + case BSIM3_MOD_LNLX: + value->rValue = model->BSIM3lnlx; + return (OK); + case BSIM3_MOD_LDVT0: + value->rValue = model->BSIM3ldvt0; + return (OK); + case BSIM3_MOD_LDVT1: + value->rValue = model->BSIM3ldvt1; + return (OK); + case BSIM3_MOD_LDVT2: + value->rValue = model->BSIM3ldvt2; + return (OK); + case BSIM3_MOD_LDVT0W: + value->rValue = model->BSIM3ldvt0w; + return (OK); + case BSIM3_MOD_LDVT1W: + value->rValue = model->BSIM3ldvt1w; + return (OK); + case BSIM3_MOD_LDVT2W: + value->rValue = model->BSIM3ldvt2w; + return (OK); + case BSIM3_MOD_LDROUT: + value->rValue = model->BSIM3ldrout; + return (OK); + case BSIM3_MOD_LDSUB: + value->rValue = model->BSIM3ldsub; + return (OK); + case BSIM3_MOD_LVTH0: + value->rValue = model->BSIM3lvth0; + return (OK); + case BSIM3_MOD_LUA: + value->rValue = model->BSIM3lua; + return (OK); + case BSIM3_MOD_LUA1: + value->rValue = model->BSIM3lua1; + return (OK); + case BSIM3_MOD_LUB: + value->rValue = model->BSIM3lub; + return (OK); + case BSIM3_MOD_LUB1: + value->rValue = model->BSIM3lub1; + return (OK); + case BSIM3_MOD_LUC: + value->rValue = model->BSIM3luc; + return (OK); + case BSIM3_MOD_LUC1: + value->rValue = model->BSIM3luc1; + return (OK); + case BSIM3_MOD_LU0: + value->rValue = model->BSIM3lu0; + return (OK); + case BSIM3_MOD_LUTE: + value->rValue = model->BSIM3lute; + return (OK); + case BSIM3_MOD_LVOFF: + value->rValue = model->BSIM3lvoff; + return (OK); + case BSIM3_MOD_LDELTA: + value->rValue = model->BSIM3ldelta; + return (OK); + case BSIM3_MOD_LRDSW: + value->rValue = model->BSIM3lrdsw; + return (OK); + case BSIM3_MOD_LPRWB: + value->rValue = model->BSIM3lprwb; + return (OK); + case BSIM3_MOD_LPRWG: + value->rValue = model->BSIM3lprwg; + return (OK); + case BSIM3_MOD_LPRT: + value->rValue = model->BSIM3lprt; + return (OK); + case BSIM3_MOD_LETA0: + value->rValue = model->BSIM3leta0; + return (OK); + case BSIM3_MOD_LETAB: + value->rValue = model->BSIM3letab; + return (OK); + case BSIM3_MOD_LPCLM: + value->rValue = model->BSIM3lpclm; + return (OK); + case BSIM3_MOD_LPDIBL1: + value->rValue = model->BSIM3lpdibl1; + return (OK); + case BSIM3_MOD_LPDIBL2: + value->rValue = model->BSIM3lpdibl2; + return (OK); + case BSIM3_MOD_LPDIBLB: + value->rValue = model->BSIM3lpdiblb; + return (OK); + case BSIM3_MOD_LPSCBE1: + value->rValue = model->BSIM3lpscbe1; + return (OK); + case BSIM3_MOD_LPSCBE2: + value->rValue = model->BSIM3lpscbe2; + return (OK); + case BSIM3_MOD_LPVAG: + value->rValue = model->BSIM3lpvag; + return (OK); + case BSIM3_MOD_LWR: + value->rValue = model->BSIM3lwr; + return (OK); + case BSIM3_MOD_LDWG: + value->rValue = model->BSIM3ldwg; + return (OK); + case BSIM3_MOD_LDWB: + value->rValue = model->BSIM3ldwb; + return (OK); + case BSIM3_MOD_LB0: + value->rValue = model->BSIM3lb0; + return (OK); + case BSIM3_MOD_LB1: + value->rValue = model->BSIM3lb1; + return (OK); + case BSIM3_MOD_LALPHA0: + value->rValue = model->BSIM3lalpha0; + return (OK); + case BSIM3_MOD_LALPHA1: + value->rValue = model->BSIM3lalpha1; + return (OK); + case BSIM3_MOD_LBETA0: + value->rValue = model->BSIM3lbeta0; + return (OK); + case BSIM3_MOD_LVFB: + value->rValue = model->BSIM3lvfb; + return (OK); - case BSIM3_MOD_LELM: - value->rValue = model->BSIM3lelm; - return(OK); - case BSIM3_MOD_LCGSL: - value->rValue = model->BSIM3lcgsl; - return(OK); - case BSIM3_MOD_LCGDL: - value->rValue = model->BSIM3lcgdl; - return(OK); - case BSIM3_MOD_LCKAPPA: - value->rValue = model->BSIM3lckappa; - return(OK); - case BSIM3_MOD_LCF: - value->rValue = model->BSIM3lcf; - return(OK); - case BSIM3_MOD_LCLC: - value->rValue = model->BSIM3lclc; - return(OK); - case BSIM3_MOD_LCLE: - value->rValue = model->BSIM3lcle; - return(OK); - case BSIM3_MOD_LVFBCV: - value->rValue = model->BSIM3lvfbcv; - return(OK); - case BSIM3_MOD_LACDE: - value->rValue = model->BSIM3lacde; - return(OK); - case BSIM3_MOD_LMOIN: - value->rValue = model->BSIM3lmoin; - return(OK); - case BSIM3_MOD_LNOFF: - value->rValue = model->BSIM3lnoff; - return(OK); - case BSIM3_MOD_LVOFFCV: - value->rValue = model->BSIM3lvoffcv; - return(OK); + case BSIM3_MOD_LELM: + value->rValue = model->BSIM3lelm; + return (OK); + case BSIM3_MOD_LCGSL: + value->rValue = model->BSIM3lcgsl; + return (OK); + case BSIM3_MOD_LCGDL: + value->rValue = model->BSIM3lcgdl; + return (OK); + case BSIM3_MOD_LCKAPPA: + value->rValue = model->BSIM3lckappa; + return (OK); + case BSIM3_MOD_LCF: + value->rValue = model->BSIM3lcf; + return (OK); + case BSIM3_MOD_LCLC: + value->rValue = model->BSIM3lclc; + return (OK); + case BSIM3_MOD_LCLE: + value->rValue = model->BSIM3lcle; + return (OK); + case BSIM3_MOD_LVFBCV: + value->rValue = model->BSIM3lvfbcv; + return (OK); + case BSIM3_MOD_LACDE: + value->rValue = model->BSIM3lacde; + return (OK); + case BSIM3_MOD_LMOIN: + value->rValue = model->BSIM3lmoin; + return (OK); + case BSIM3_MOD_LNOFF: + value->rValue = model->BSIM3lnoff; + return (OK); + case BSIM3_MOD_LVOFFCV: + value->rValue = model->BSIM3lvoffcv; + return (OK); - /* Width dependence */ - case BSIM3_MOD_WCDSC : - value->rValue = model->BSIM3wcdsc; - return(OK); - case BSIM3_MOD_WCDSCB : - value->rValue = model->BSIM3wcdscb; - return(OK); - case BSIM3_MOD_WCDSCD : - value->rValue = model->BSIM3wcdscd; - return(OK); - case BSIM3_MOD_WCIT : - value->rValue = model->BSIM3wcit; - return(OK); - case BSIM3_MOD_WNFACTOR : - value->rValue = model->BSIM3wnfactor; - return(OK); - case BSIM3_MOD_WXJ: - value->rValue = model->BSIM3wxj; - return(OK); - case BSIM3_MOD_WVSAT: - value->rValue = model->BSIM3wvsat; - return(OK); - case BSIM3_MOD_WAT: - value->rValue = model->BSIM3wat; - return(OK); - case BSIM3_MOD_WA0: - value->rValue = model->BSIM3wa0; - return(OK); - case BSIM3_MOD_WAGS: - value->rValue = model->BSIM3wags; - return(OK); - case BSIM3_MOD_WA1: - value->rValue = model->BSIM3wa1; - return(OK); - case BSIM3_MOD_WA2: - value->rValue = model->BSIM3wa2; - return(OK); - case BSIM3_MOD_WKETA: - value->rValue = model->BSIM3wketa; - return(OK); - case BSIM3_MOD_WNSUB: - value->rValue = model->BSIM3wnsub; - return(OK); - case BSIM3_MOD_WNPEAK: - value->rValue = model->BSIM3wnpeak; - return(OK); - case BSIM3_MOD_WNGATE: - value->rValue = model->BSIM3wngate; - return(OK); - case BSIM3_MOD_WGAMMA1: - value->rValue = model->BSIM3wgamma1; - return(OK); - case BSIM3_MOD_WGAMMA2: - value->rValue = model->BSIM3wgamma2; - return(OK); - case BSIM3_MOD_WVBX: - value->rValue = model->BSIM3wvbx; - return(OK); - case BSIM3_MOD_WVBM: - value->rValue = model->BSIM3wvbm; - return(OK); - case BSIM3_MOD_WXT: - value->rValue = model->BSIM3wxt; - return(OK); - case BSIM3_MOD_WK1: - value->rValue = model->BSIM3wk1; - return(OK); - case BSIM3_MOD_WKT1: - value->rValue = model->BSIM3wkt1; - return(OK); - case BSIM3_MOD_WKT1L: - value->rValue = model->BSIM3wkt1l; - return(OK); - case BSIM3_MOD_WKT2 : - value->rValue = model->BSIM3wkt2; - return(OK); - case BSIM3_MOD_WK2 : - value->rValue = model->BSIM3wk2; - return(OK); - case BSIM3_MOD_WK3: - value->rValue = model->BSIM3wk3; - return(OK); - case BSIM3_MOD_WK3B: - value->rValue = model->BSIM3wk3b; - return(OK); - case BSIM3_MOD_WW0: - value->rValue = model->BSIM3ww0; - return(OK); - case BSIM3_MOD_WNLX: - value->rValue = model->BSIM3wnlx; - return(OK); - case BSIM3_MOD_WDVT0: - value->rValue = model->BSIM3wdvt0; - return(OK); - case BSIM3_MOD_WDVT1 : - value->rValue = model->BSIM3wdvt1; - return(OK); - case BSIM3_MOD_WDVT2 : - value->rValue = model->BSIM3wdvt2; - return(OK); - case BSIM3_MOD_WDVT0W : - value->rValue = model->BSIM3wdvt0w; - return(OK); - case BSIM3_MOD_WDVT1W : - value->rValue = model->BSIM3wdvt1w; - return(OK); - case BSIM3_MOD_WDVT2W : - value->rValue = model->BSIM3wdvt2w; - return(OK); - case BSIM3_MOD_WDROUT : - value->rValue = model->BSIM3wdrout; - return(OK); - case BSIM3_MOD_WDSUB : - value->rValue = model->BSIM3wdsub; - return(OK); - case BSIM3_MOD_WVTH0: - value->rValue = model->BSIM3wvth0; - return(OK); - case BSIM3_MOD_WUA: - value->rValue = model->BSIM3wua; - return(OK); - case BSIM3_MOD_WUA1: - value->rValue = model->BSIM3wua1; - return(OK); - case BSIM3_MOD_WUB: - value->rValue = model->BSIM3wub; - return(OK); - case BSIM3_MOD_WUB1: - value->rValue = model->BSIM3wub1; - return(OK); - case BSIM3_MOD_WUC: - value->rValue = model->BSIM3wuc; - return(OK); - case BSIM3_MOD_WUC1: - value->rValue = model->BSIM3wuc1; - return(OK); - case BSIM3_MOD_WU0: - value->rValue = model->BSIM3wu0; - return(OK); - case BSIM3_MOD_WUTE: - value->rValue = model->BSIM3wute; - return(OK); - case BSIM3_MOD_WVOFF: - value->rValue = model->BSIM3wvoff; - return(OK); - case BSIM3_MOD_WDELTA: - value->rValue = model->BSIM3wdelta; - return(OK); - case BSIM3_MOD_WRDSW: - value->rValue = model->BSIM3wrdsw; - return(OK); - case BSIM3_MOD_WPRWB: - value->rValue = model->BSIM3wprwb; - return(OK); - case BSIM3_MOD_WPRWG: - value->rValue = model->BSIM3wprwg; - return(OK); - case BSIM3_MOD_WPRT: - value->rValue = model->BSIM3wprt; - return(OK); - case BSIM3_MOD_WETA0: - value->rValue = model->BSIM3weta0; - return(OK); - case BSIM3_MOD_WETAB: - value->rValue = model->BSIM3wetab; - return(OK); - case BSIM3_MOD_WPCLM: - value->rValue = model->BSIM3wpclm; - return(OK); - case BSIM3_MOD_WPDIBL1: - value->rValue = model->BSIM3wpdibl1; - return(OK); - case BSIM3_MOD_WPDIBL2: - value->rValue = model->BSIM3wpdibl2; - return(OK); - case BSIM3_MOD_WPDIBLB: - value->rValue = model->BSIM3wpdiblb; - return(OK); - case BSIM3_MOD_WPSCBE1: - value->rValue = model->BSIM3wpscbe1; - return(OK); - case BSIM3_MOD_WPSCBE2: - value->rValue = model->BSIM3wpscbe2; - return(OK); - case BSIM3_MOD_WPVAG: - value->rValue = model->BSIM3wpvag; - return(OK); - case BSIM3_MOD_WWR: - value->rValue = model->BSIM3wwr; - return(OK); - case BSIM3_MOD_WDWG: - value->rValue = model->BSIM3wdwg; - return(OK); - case BSIM3_MOD_WDWB: - value->rValue = model->BSIM3wdwb; - return(OK); - case BSIM3_MOD_WB0: - value->rValue = model->BSIM3wb0; - return(OK); - case BSIM3_MOD_WB1: - value->rValue = model->BSIM3wb1; - return(OK); - case BSIM3_MOD_WALPHA0: - value->rValue = model->BSIM3walpha0; - return(OK); - case BSIM3_MOD_WALPHA1: - value->rValue = model->BSIM3walpha1; - return(OK); - case BSIM3_MOD_WBETA0: - value->rValue = model->BSIM3wbeta0; - return(OK); - case BSIM3_MOD_WVFB: - value->rValue = model->BSIM3wvfb; - return(OK); + /* Width dependence */ + case BSIM3_MOD_WCDSC: + value->rValue = model->BSIM3wcdsc; + return (OK); + case BSIM3_MOD_WCDSCB: + value->rValue = model->BSIM3wcdscb; + return (OK); + case BSIM3_MOD_WCDSCD: + value->rValue = model->BSIM3wcdscd; + return (OK); + case BSIM3_MOD_WCIT: + value->rValue = model->BSIM3wcit; + return (OK); + case BSIM3_MOD_WNFACTOR: + value->rValue = model->BSIM3wnfactor; + return (OK); + case BSIM3_MOD_WXJ: + value->rValue = model->BSIM3wxj; + return (OK); + case BSIM3_MOD_WVSAT: + value->rValue = model->BSIM3wvsat; + return (OK); + case BSIM3_MOD_WAT: + value->rValue = model->BSIM3wat; + return (OK); + case BSIM3_MOD_WA0: + value->rValue = model->BSIM3wa0; + return (OK); + case BSIM3_MOD_WAGS: + value->rValue = model->BSIM3wags; + return (OK); + case BSIM3_MOD_WA1: + value->rValue = model->BSIM3wa1; + return (OK); + case BSIM3_MOD_WA2: + value->rValue = model->BSIM3wa2; + return (OK); + case BSIM3_MOD_WKETA: + value->rValue = model->BSIM3wketa; + return (OK); + case BSIM3_MOD_WNSUB: + value->rValue = model->BSIM3wnsub; + return (OK); + case BSIM3_MOD_WNPEAK: + value->rValue = model->BSIM3wnpeak; + return (OK); + case BSIM3_MOD_WNGATE: + value->rValue = model->BSIM3wngate; + return (OK); + case BSIM3_MOD_WGAMMA1: + value->rValue = model->BSIM3wgamma1; + return (OK); + case BSIM3_MOD_WGAMMA2: + value->rValue = model->BSIM3wgamma2; + return (OK); + case BSIM3_MOD_WVBX: + value->rValue = model->BSIM3wvbx; + return (OK); + case BSIM3_MOD_WVBM: + value->rValue = model->BSIM3wvbm; + return (OK); + case BSIM3_MOD_WXT: + value->rValue = model->BSIM3wxt; + return (OK); + case BSIM3_MOD_WK1: + value->rValue = model->BSIM3wk1; + return (OK); + case BSIM3_MOD_WKT1: + value->rValue = model->BSIM3wkt1; + return (OK); + case BSIM3_MOD_WKT1L: + value->rValue = model->BSIM3wkt1l; + return (OK); + case BSIM3_MOD_WKT2: + value->rValue = model->BSIM3wkt2; + return (OK); + case BSIM3_MOD_WK2: + value->rValue = model->BSIM3wk2; + return (OK); + case BSIM3_MOD_WK3: + value->rValue = model->BSIM3wk3; + return (OK); + case BSIM3_MOD_WK3B: + value->rValue = model->BSIM3wk3b; + return (OK); + case BSIM3_MOD_WW0: + value->rValue = model->BSIM3ww0; + return (OK); + case BSIM3_MOD_WNLX: + value->rValue = model->BSIM3wnlx; + return (OK); + case BSIM3_MOD_WDVT0: + value->rValue = model->BSIM3wdvt0; + return (OK); + case BSIM3_MOD_WDVT1: + value->rValue = model->BSIM3wdvt1; + return (OK); + case BSIM3_MOD_WDVT2: + value->rValue = model->BSIM3wdvt2; + return (OK); + case BSIM3_MOD_WDVT0W: + value->rValue = model->BSIM3wdvt0w; + return (OK); + case BSIM3_MOD_WDVT1W: + value->rValue = model->BSIM3wdvt1w; + return (OK); + case BSIM3_MOD_WDVT2W: + value->rValue = model->BSIM3wdvt2w; + return (OK); + case BSIM3_MOD_WDROUT: + value->rValue = model->BSIM3wdrout; + return (OK); + case BSIM3_MOD_WDSUB: + value->rValue = model->BSIM3wdsub; + return (OK); + case BSIM3_MOD_WVTH0: + value->rValue = model->BSIM3wvth0; + return (OK); + case BSIM3_MOD_WUA: + value->rValue = model->BSIM3wua; + return (OK); + case BSIM3_MOD_WUA1: + value->rValue = model->BSIM3wua1; + return (OK); + case BSIM3_MOD_WUB: + value->rValue = model->BSIM3wub; + return (OK); + case BSIM3_MOD_WUB1: + value->rValue = model->BSIM3wub1; + return (OK); + case BSIM3_MOD_WUC: + value->rValue = model->BSIM3wuc; + return (OK); + case BSIM3_MOD_WUC1: + value->rValue = model->BSIM3wuc1; + return (OK); + case BSIM3_MOD_WU0: + value->rValue = model->BSIM3wu0; + return (OK); + case BSIM3_MOD_WUTE: + value->rValue = model->BSIM3wute; + return (OK); + case BSIM3_MOD_WVOFF: + value->rValue = model->BSIM3wvoff; + return (OK); + case BSIM3_MOD_WDELTA: + value->rValue = model->BSIM3wdelta; + return (OK); + case BSIM3_MOD_WRDSW: + value->rValue = model->BSIM3wrdsw; + return (OK); + case BSIM3_MOD_WPRWB: + value->rValue = model->BSIM3wprwb; + return (OK); + case BSIM3_MOD_WPRWG: + value->rValue = model->BSIM3wprwg; + return (OK); + case BSIM3_MOD_WPRT: + value->rValue = model->BSIM3wprt; + return (OK); + case BSIM3_MOD_WETA0: + value->rValue = model->BSIM3weta0; + return (OK); + case BSIM3_MOD_WETAB: + value->rValue = model->BSIM3wetab; + return (OK); + case BSIM3_MOD_WPCLM: + value->rValue = model->BSIM3wpclm; + return (OK); + case BSIM3_MOD_WPDIBL1: + value->rValue = model->BSIM3wpdibl1; + return (OK); + case BSIM3_MOD_WPDIBL2: + value->rValue = model->BSIM3wpdibl2; + return (OK); + case BSIM3_MOD_WPDIBLB: + value->rValue = model->BSIM3wpdiblb; + return (OK); + case BSIM3_MOD_WPSCBE1: + value->rValue = model->BSIM3wpscbe1; + return (OK); + case BSIM3_MOD_WPSCBE2: + value->rValue = model->BSIM3wpscbe2; + return (OK); + case BSIM3_MOD_WPVAG: + value->rValue = model->BSIM3wpvag; + return (OK); + case BSIM3_MOD_WWR: + value->rValue = model->BSIM3wwr; + return (OK); + case BSIM3_MOD_WDWG: + value->rValue = model->BSIM3wdwg; + return (OK); + case BSIM3_MOD_WDWB: + value->rValue = model->BSIM3wdwb; + return (OK); + case BSIM3_MOD_WB0: + value->rValue = model->BSIM3wb0; + return (OK); + case BSIM3_MOD_WB1: + value->rValue = model->BSIM3wb1; + return (OK); + case BSIM3_MOD_WALPHA0: + value->rValue = model->BSIM3walpha0; + return (OK); + case BSIM3_MOD_WALPHA1: + value->rValue = model->BSIM3walpha1; + return (OK); + case BSIM3_MOD_WBETA0: + value->rValue = model->BSIM3wbeta0; + return (OK); + case BSIM3_MOD_WVFB: + value->rValue = model->BSIM3wvfb; + return (OK); - case BSIM3_MOD_WELM: - value->rValue = model->BSIM3welm; - return(OK); - case BSIM3_MOD_WCGSL: - value->rValue = model->BSIM3wcgsl; - return(OK); - case BSIM3_MOD_WCGDL: - value->rValue = model->BSIM3wcgdl; - return(OK); - case BSIM3_MOD_WCKAPPA: - value->rValue = model->BSIM3wckappa; - return(OK); - case BSIM3_MOD_WCF: - value->rValue = model->BSIM3wcf; - return(OK); - case BSIM3_MOD_WCLC: - value->rValue = model->BSIM3wclc; - return(OK); - case BSIM3_MOD_WCLE: - value->rValue = model->BSIM3wcle; - return(OK); - case BSIM3_MOD_WVFBCV: - value->rValue = model->BSIM3wvfbcv; - return(OK); - case BSIM3_MOD_WACDE: - value->rValue = model->BSIM3wacde; - return(OK); - case BSIM3_MOD_WMOIN: - value->rValue = model->BSIM3wmoin; - return(OK); - case BSIM3_MOD_WNOFF: - value->rValue = model->BSIM3wnoff; - return(OK); - case BSIM3_MOD_WVOFFCV: - value->rValue = model->BSIM3wvoffcv; - return(OK); + case BSIM3_MOD_WELM: + value->rValue = model->BSIM3welm; + return (OK); + case BSIM3_MOD_WCGSL: + value->rValue = model->BSIM3wcgsl; + return (OK); + case BSIM3_MOD_WCGDL: + value->rValue = model->BSIM3wcgdl; + return (OK); + case BSIM3_MOD_WCKAPPA: + value->rValue = model->BSIM3wckappa; + return (OK); + case BSIM3_MOD_WCF: + value->rValue = model->BSIM3wcf; + return (OK); + case BSIM3_MOD_WCLC: + value->rValue = model->BSIM3wclc; + return (OK); + case BSIM3_MOD_WCLE: + value->rValue = model->BSIM3wcle; + return (OK); + case BSIM3_MOD_WVFBCV: + value->rValue = model->BSIM3wvfbcv; + return (OK); + case BSIM3_MOD_WACDE: + value->rValue = model->BSIM3wacde; + return (OK); + case BSIM3_MOD_WMOIN: + value->rValue = model->BSIM3wmoin; + return (OK); + case BSIM3_MOD_WNOFF: + value->rValue = model->BSIM3wnoff; + return (OK); + case BSIM3_MOD_WVOFFCV: + value->rValue = model->BSIM3wvoffcv; + return (OK); - /* Cross-term dependence */ - case BSIM3_MOD_PCDSC : - value->rValue = model->BSIM3pcdsc; - return(OK); - case BSIM3_MOD_PCDSCB : - value->rValue = model->BSIM3pcdscb; - return(OK); - case BSIM3_MOD_PCDSCD : - value->rValue = model->BSIM3pcdscd; - return(OK); - case BSIM3_MOD_PCIT : - value->rValue = model->BSIM3pcit; - return(OK); - case BSIM3_MOD_PNFACTOR : - value->rValue = model->BSIM3pnfactor; - return(OK); - case BSIM3_MOD_PXJ: - value->rValue = model->BSIM3pxj; - return(OK); - case BSIM3_MOD_PVSAT: - value->rValue = model->BSIM3pvsat; - return(OK); - case BSIM3_MOD_PAT: - value->rValue = model->BSIM3pat; - return(OK); - case BSIM3_MOD_PA0: - value->rValue = model->BSIM3pa0; - return(OK); - case BSIM3_MOD_PAGS: - value->rValue = model->BSIM3pags; - return(OK); - case BSIM3_MOD_PA1: - value->rValue = model->BSIM3pa1; - return(OK); - case BSIM3_MOD_PA2: - value->rValue = model->BSIM3pa2; - return(OK); - case BSIM3_MOD_PKETA: - value->rValue = model->BSIM3pketa; - return(OK); - case BSIM3_MOD_PNSUB: - value->rValue = model->BSIM3pnsub; - return(OK); - case BSIM3_MOD_PNPEAK: - value->rValue = model->BSIM3pnpeak; - return(OK); - case BSIM3_MOD_PNGATE: - value->rValue = model->BSIM3pngate; - return(OK); - case BSIM3_MOD_PGAMMA1: - value->rValue = model->BSIM3pgamma1; - return(OK); - case BSIM3_MOD_PGAMMA2: - value->rValue = model->BSIM3pgamma2; - return(OK); - case BSIM3_MOD_PVBX: - value->rValue = model->BSIM3pvbx; - return(OK); - case BSIM3_MOD_PVBM: - value->rValue = model->BSIM3pvbm; - return(OK); - case BSIM3_MOD_PXT: - value->rValue = model->BSIM3pxt; - return(OK); - case BSIM3_MOD_PK1: - value->rValue = model->BSIM3pk1; - return(OK); - case BSIM3_MOD_PKT1: - value->rValue = model->BSIM3pkt1; - return(OK); - case BSIM3_MOD_PKT1L: - value->rValue = model->BSIM3pkt1l; - return(OK); - case BSIM3_MOD_PKT2 : - value->rValue = model->BSIM3pkt2; - return(OK); - case BSIM3_MOD_PK2 : - value->rValue = model->BSIM3pk2; - return(OK); - case BSIM3_MOD_PK3: - value->rValue = model->BSIM3pk3; - return(OK); - case BSIM3_MOD_PK3B: - value->rValue = model->BSIM3pk3b; - return(OK); - case BSIM3_MOD_PW0: - value->rValue = model->BSIM3pw0; - return(OK); - case BSIM3_MOD_PNLX: - value->rValue = model->BSIM3pnlx; - return(OK); - case BSIM3_MOD_PDVT0 : - value->rValue = model->BSIM3pdvt0; - return(OK); - case BSIM3_MOD_PDVT1 : - value->rValue = model->BSIM3pdvt1; - return(OK); - case BSIM3_MOD_PDVT2 : - value->rValue = model->BSIM3pdvt2; - return(OK); - case BSIM3_MOD_PDVT0W : - value->rValue = model->BSIM3pdvt0w; - return(OK); - case BSIM3_MOD_PDVT1W : - value->rValue = model->BSIM3pdvt1w; - return(OK); - case BSIM3_MOD_PDVT2W : - value->rValue = model->BSIM3pdvt2w; - return(OK); - case BSIM3_MOD_PDROUT : - value->rValue = model->BSIM3pdrout; - return(OK); - case BSIM3_MOD_PDSUB : - value->rValue = model->BSIM3pdsub; - return(OK); - case BSIM3_MOD_PVTH0: - value->rValue = model->BSIM3pvth0; - return(OK); - case BSIM3_MOD_PUA: - value->rValue = model->BSIM3pua; - return(OK); - case BSIM3_MOD_PUA1: - value->rValue = model->BSIM3pua1; - return(OK); - case BSIM3_MOD_PUB: - value->rValue = model->BSIM3pub; - return(OK); - case BSIM3_MOD_PUB1: - value->rValue = model->BSIM3pub1; - return(OK); - case BSIM3_MOD_PUC: - value->rValue = model->BSIM3puc; - return(OK); - case BSIM3_MOD_PUC1: - value->rValue = model->BSIM3puc1; - return(OK); - case BSIM3_MOD_PU0: - value->rValue = model->BSIM3pu0; - return(OK); - case BSIM3_MOD_PUTE: - value->rValue = model->BSIM3pute; - return(OK); - case BSIM3_MOD_PVOFF: - value->rValue = model->BSIM3pvoff; - return(OK); - case BSIM3_MOD_PDELTA: - value->rValue = model->BSIM3pdelta; - return(OK); - case BSIM3_MOD_PRDSW: - value->rValue = model->BSIM3prdsw; - return(OK); - case BSIM3_MOD_PPRWB: - value->rValue = model->BSIM3pprwb; - return(OK); - case BSIM3_MOD_PPRWG: - value->rValue = model->BSIM3pprwg; - return(OK); - case BSIM3_MOD_PPRT: - value->rValue = model->BSIM3pprt; - return(OK); - case BSIM3_MOD_PETA0: - value->rValue = model->BSIM3peta0; - return(OK); - case BSIM3_MOD_PETAB: - value->rValue = model->BSIM3petab; - return(OK); - case BSIM3_MOD_PPCLM: - value->rValue = model->BSIM3ppclm; - return(OK); - case BSIM3_MOD_PPDIBL1: - value->rValue = model->BSIM3ppdibl1; - return(OK); - case BSIM3_MOD_PPDIBL2: - value->rValue = model->BSIM3ppdibl2; - return(OK); - case BSIM3_MOD_PPDIBLB: - value->rValue = model->BSIM3ppdiblb; - return(OK); - case BSIM3_MOD_PPSCBE1: - value->rValue = model->BSIM3ppscbe1; - return(OK); - case BSIM3_MOD_PPSCBE2: - value->rValue = model->BSIM3ppscbe2; - return(OK); - case BSIM3_MOD_PPVAG: - value->rValue = model->BSIM3ppvag; - return(OK); - case BSIM3_MOD_PWR: - value->rValue = model->BSIM3pwr; - return(OK); - case BSIM3_MOD_PDWG: - value->rValue = model->BSIM3pdwg; - return(OK); - case BSIM3_MOD_PDWB: - value->rValue = model->BSIM3pdwb; - return(OK); - case BSIM3_MOD_PB0: - value->rValue = model->BSIM3pb0; - return(OK); - case BSIM3_MOD_PB1: - value->rValue = model->BSIM3pb1; - return(OK); - case BSIM3_MOD_PALPHA0: - value->rValue = model->BSIM3palpha0; - return(OK); - case BSIM3_MOD_PALPHA1: - value->rValue = model->BSIM3palpha1; - return(OK); - case BSIM3_MOD_PBETA0: - value->rValue = model->BSIM3pbeta0; - return(OK); - case BSIM3_MOD_PVFB: - value->rValue = model->BSIM3pvfb; - return(OK); + /* Cross-term dependence */ + case BSIM3_MOD_PCDSC: + value->rValue = model->BSIM3pcdsc; + return (OK); + case BSIM3_MOD_PCDSCB: + value->rValue = model->BSIM3pcdscb; + return (OK); + case BSIM3_MOD_PCDSCD: + value->rValue = model->BSIM3pcdscd; + return (OK); + case BSIM3_MOD_PCIT: + value->rValue = model->BSIM3pcit; + return (OK); + case BSIM3_MOD_PNFACTOR: + value->rValue = model->BSIM3pnfactor; + return (OK); + case BSIM3_MOD_PXJ: + value->rValue = model->BSIM3pxj; + return (OK); + case BSIM3_MOD_PVSAT: + value->rValue = model->BSIM3pvsat; + return (OK); + case BSIM3_MOD_PAT: + value->rValue = model->BSIM3pat; + return (OK); + case BSIM3_MOD_PA0: + value->rValue = model->BSIM3pa0; + return (OK); + case BSIM3_MOD_PAGS: + value->rValue = model->BSIM3pags; + return (OK); + case BSIM3_MOD_PA1: + value->rValue = model->BSIM3pa1; + return (OK); + case BSIM3_MOD_PA2: + value->rValue = model->BSIM3pa2; + return (OK); + case BSIM3_MOD_PKETA: + value->rValue = model->BSIM3pketa; + return (OK); + case BSIM3_MOD_PNSUB: + value->rValue = model->BSIM3pnsub; + return (OK); + case BSIM3_MOD_PNPEAK: + value->rValue = model->BSIM3pnpeak; + return (OK); + case BSIM3_MOD_PNGATE: + value->rValue = model->BSIM3pngate; + return (OK); + case BSIM3_MOD_PGAMMA1: + value->rValue = model->BSIM3pgamma1; + return (OK); + case BSIM3_MOD_PGAMMA2: + value->rValue = model->BSIM3pgamma2; + return (OK); + case BSIM3_MOD_PVBX: + value->rValue = model->BSIM3pvbx; + return (OK); + case BSIM3_MOD_PVBM: + value->rValue = model->BSIM3pvbm; + return (OK); + case BSIM3_MOD_PXT: + value->rValue = model->BSIM3pxt; + return (OK); + case BSIM3_MOD_PK1: + value->rValue = model->BSIM3pk1; + return (OK); + case BSIM3_MOD_PKT1: + value->rValue = model->BSIM3pkt1; + return (OK); + case BSIM3_MOD_PKT1L: + value->rValue = model->BSIM3pkt1l; + return (OK); + case BSIM3_MOD_PKT2: + value->rValue = model->BSIM3pkt2; + return (OK); + case BSIM3_MOD_PK2: + value->rValue = model->BSIM3pk2; + return (OK); + case BSIM3_MOD_PK3: + value->rValue = model->BSIM3pk3; + return (OK); + case BSIM3_MOD_PK3B: + value->rValue = model->BSIM3pk3b; + return (OK); + case BSIM3_MOD_PW0: + value->rValue = model->BSIM3pw0; + return (OK); + case BSIM3_MOD_PNLX: + value->rValue = model->BSIM3pnlx; + return (OK); + case BSIM3_MOD_PDVT0: + value->rValue = model->BSIM3pdvt0; + return (OK); + case BSIM3_MOD_PDVT1: + value->rValue = model->BSIM3pdvt1; + return (OK); + case BSIM3_MOD_PDVT2: + value->rValue = model->BSIM3pdvt2; + return (OK); + case BSIM3_MOD_PDVT0W: + value->rValue = model->BSIM3pdvt0w; + return (OK); + case BSIM3_MOD_PDVT1W: + value->rValue = model->BSIM3pdvt1w; + return (OK); + case BSIM3_MOD_PDVT2W: + value->rValue = model->BSIM3pdvt2w; + return (OK); + case BSIM3_MOD_PDROUT: + value->rValue = model->BSIM3pdrout; + return (OK); + case BSIM3_MOD_PDSUB: + value->rValue = model->BSIM3pdsub; + return (OK); + case BSIM3_MOD_PVTH0: + value->rValue = model->BSIM3pvth0; + return (OK); + case BSIM3_MOD_PUA: + value->rValue = model->BSIM3pua; + return (OK); + case BSIM3_MOD_PUA1: + value->rValue = model->BSIM3pua1; + return (OK); + case BSIM3_MOD_PUB: + value->rValue = model->BSIM3pub; + return (OK); + case BSIM3_MOD_PUB1: + value->rValue = model->BSIM3pub1; + return (OK); + case BSIM3_MOD_PUC: + value->rValue = model->BSIM3puc; + return (OK); + case BSIM3_MOD_PUC1: + value->rValue = model->BSIM3puc1; + return (OK); + case BSIM3_MOD_PU0: + value->rValue = model->BSIM3pu0; + return (OK); + case BSIM3_MOD_PUTE: + value->rValue = model->BSIM3pute; + return (OK); + case BSIM3_MOD_PVOFF: + value->rValue = model->BSIM3pvoff; + return (OK); + case BSIM3_MOD_PDELTA: + value->rValue = model->BSIM3pdelta; + return (OK); + case BSIM3_MOD_PRDSW: + value->rValue = model->BSIM3prdsw; + return (OK); + case BSIM3_MOD_PPRWB: + value->rValue = model->BSIM3pprwb; + return (OK); + case BSIM3_MOD_PPRWG: + value->rValue = model->BSIM3pprwg; + return (OK); + case BSIM3_MOD_PPRT: + value->rValue = model->BSIM3pprt; + return (OK); + case BSIM3_MOD_PETA0: + value->rValue = model->BSIM3peta0; + return (OK); + case BSIM3_MOD_PETAB: + value->rValue = model->BSIM3petab; + return (OK); + case BSIM3_MOD_PPCLM: + value->rValue = model->BSIM3ppclm; + return (OK); + case BSIM3_MOD_PPDIBL1: + value->rValue = model->BSIM3ppdibl1; + return (OK); + case BSIM3_MOD_PPDIBL2: + value->rValue = model->BSIM3ppdibl2; + return (OK); + case BSIM3_MOD_PPDIBLB: + value->rValue = model->BSIM3ppdiblb; + return (OK); + case BSIM3_MOD_PPSCBE1: + value->rValue = model->BSIM3ppscbe1; + return (OK); + case BSIM3_MOD_PPSCBE2: + value->rValue = model->BSIM3ppscbe2; + return (OK); + case BSIM3_MOD_PPVAG: + value->rValue = model->BSIM3ppvag; + return (OK); + case BSIM3_MOD_PWR: + value->rValue = model->BSIM3pwr; + return (OK); + case BSIM3_MOD_PDWG: + value->rValue = model->BSIM3pdwg; + return (OK); + case BSIM3_MOD_PDWB: + value->rValue = model->BSIM3pdwb; + return (OK); + case BSIM3_MOD_PB0: + value->rValue = model->BSIM3pb0; + return (OK); + case BSIM3_MOD_PB1: + value->rValue = model->BSIM3pb1; + return (OK); + case BSIM3_MOD_PALPHA0: + value->rValue = model->BSIM3palpha0; + return (OK); + case BSIM3_MOD_PALPHA1: + value->rValue = model->BSIM3palpha1; + return (OK); + case BSIM3_MOD_PBETA0: + value->rValue = model->BSIM3pbeta0; + return (OK); + case BSIM3_MOD_PVFB: + value->rValue = model->BSIM3pvfb; + return (OK); - case BSIM3_MOD_PELM: - value->rValue = model->BSIM3pelm; - return(OK); - case BSIM3_MOD_PCGSL: - value->rValue = model->BSIM3pcgsl; - return(OK); - case BSIM3_MOD_PCGDL: - value->rValue = model->BSIM3pcgdl; - return(OK); - case BSIM3_MOD_PCKAPPA: - value->rValue = model->BSIM3pckappa; - return(OK); - case BSIM3_MOD_PCF: - value->rValue = model->BSIM3pcf; - return(OK); - case BSIM3_MOD_PCLC: - value->rValue = model->BSIM3pclc; - return(OK); - case BSIM3_MOD_PCLE: - value->rValue = model->BSIM3pcle; - return(OK); - case BSIM3_MOD_PVFBCV: - value->rValue = model->BSIM3pvfbcv; - return(OK); - case BSIM3_MOD_PACDE: - value->rValue = model->BSIM3pacde; - return(OK); - case BSIM3_MOD_PMOIN: - value->rValue = model->BSIM3pmoin; - return(OK); - case BSIM3_MOD_PNOFF: - value->rValue = model->BSIM3pnoff; - return(OK); - case BSIM3_MOD_PVOFFCV: - value->rValue = model->BSIM3pvoffcv; - return(OK); + case BSIM3_MOD_PELM: + value->rValue = model->BSIM3pelm; + return (OK); + case BSIM3_MOD_PCGSL: + value->rValue = model->BSIM3pcgsl; + return (OK); + case BSIM3_MOD_PCGDL: + value->rValue = model->BSIM3pcgdl; + return (OK); + case BSIM3_MOD_PCKAPPA: + value->rValue = model->BSIM3pckappa; + return (OK); + case BSIM3_MOD_PCF: + value->rValue = model->BSIM3pcf; + return (OK); + case BSIM3_MOD_PCLC: + value->rValue = model->BSIM3pclc; + return (OK); + case BSIM3_MOD_PCLE: + value->rValue = model->BSIM3pcle; + return (OK); + case BSIM3_MOD_PVFBCV: + value->rValue = model->BSIM3pvfbcv; + return (OK); + case BSIM3_MOD_PACDE: + value->rValue = model->BSIM3pacde; + return (OK); + case BSIM3_MOD_PMOIN: + value->rValue = model->BSIM3pmoin; + return (OK); + case BSIM3_MOD_PNOFF: + value->rValue = model->BSIM3pnoff; + return (OK); + case BSIM3_MOD_PVOFFCV: + value->rValue = model->BSIM3pvoffcv; + return (OK); - case BSIM3_MOD_TNOM : - value->rValue = model->BSIM3tnom; - return(OK); - case BSIM3_MOD_CGSO: - value->rValue = model->BSIM3cgso; - return(OK); - case BSIM3_MOD_CGDO: - value->rValue = model->BSIM3cgdo; - return(OK); - case BSIM3_MOD_CGBO: - value->rValue = model->BSIM3cgbo; - return(OK); - case BSIM3_MOD_XPART: - value->rValue = model->BSIM3xpart; - return(OK); - case BSIM3_MOD_RSH: - value->rValue = model->BSIM3sheetResistance; - return(OK); - case BSIM3_MOD_JS: - value->rValue = model->BSIM3jctSatCurDensity; - return(OK); - case BSIM3_MOD_JSW: - value->rValue = model->BSIM3jctSidewallSatCurDensity; - return(OK); - case BSIM3_MOD_PB: - value->rValue = model->BSIM3bulkJctPotential; - return(OK); - case BSIM3_MOD_MJ: - value->rValue = model->BSIM3bulkJctBotGradingCoeff; - return(OK); - case BSIM3_MOD_PBSW: - value->rValue = model->BSIM3sidewallJctPotential; - return(OK); - case BSIM3_MOD_MJSW: - value->rValue = model->BSIM3bulkJctSideGradingCoeff; - return(OK); - case BSIM3_MOD_CJ: - value->rValue = model->BSIM3unitAreaJctCap; - return(OK); - case BSIM3_MOD_CJSW: - value->rValue = model->BSIM3unitLengthSidewallJctCap; - return(OK); - case BSIM3_MOD_PBSWG: - value->rValue = model->BSIM3GatesidewallJctPotential; - return(OK); - case BSIM3_MOD_MJSWG: - value->rValue = model->BSIM3bulkJctGateSideGradingCoeff; - return(OK); - case BSIM3_MOD_CJSWG: - value->rValue = model->BSIM3unitLengthGateSidewallJctCap; - return(OK); - case BSIM3_MOD_NJ: - value->rValue = model->BSIM3jctEmissionCoeff; - return(OK); - case BSIM3_MOD_XTI: - value->rValue = model->BSIM3jctTempExponent; - return(OK); - case BSIM3_MOD_LINT: - value->rValue = model->BSIM3Lint; - return(OK); - case BSIM3_MOD_LL: - value->rValue = model->BSIM3Ll; - return(OK); - case BSIM3_MOD_LLC: - value->rValue = model->BSIM3Llc; - return(OK); - case BSIM3_MOD_LLN: - value->rValue = model->BSIM3Lln; - return(OK); - case BSIM3_MOD_LW: - value->rValue = model->BSIM3Lw; - return(OK); - case BSIM3_MOD_LWC: - value->rValue = model->BSIM3Lwc; - return(OK); - case BSIM3_MOD_LWN: - value->rValue = model->BSIM3Lwn; - return(OK); - case BSIM3_MOD_LWL: - value->rValue = model->BSIM3Lwl; - return(OK); - case BSIM3_MOD_LWLC: - value->rValue = model->BSIM3Lwlc; - return(OK); - case BSIM3_MOD_LMIN: - value->rValue = model->BSIM3Lmin; - return(OK); - case BSIM3_MOD_LMAX: - value->rValue = model->BSIM3Lmax; - return(OK); - case BSIM3_MOD_WINT: - value->rValue = model->BSIM3Wint; - return(OK); - case BSIM3_MOD_WL: - value->rValue = model->BSIM3Wl; - return(OK); - case BSIM3_MOD_WLC: - value->rValue = model->BSIM3Wlc; - return(OK); - case BSIM3_MOD_WLN: - value->rValue = model->BSIM3Wln; - return(OK); - case BSIM3_MOD_WW: - value->rValue = model->BSIM3Ww; - return(OK); - case BSIM3_MOD_WWC: - value->rValue = model->BSIM3Wwc; - return(OK); - case BSIM3_MOD_WWN: - value->rValue = model->BSIM3Wwn; - return(OK); - case BSIM3_MOD_WWL: - value->rValue = model->BSIM3Wwl; - return(OK); - case BSIM3_MOD_WWLC: - value->rValue = model->BSIM3Wwlc; - return(OK); - case BSIM3_MOD_WMIN: - value->rValue = model->BSIM3Wmin; - return(OK); - case BSIM3_MOD_WMAX: - value->rValue = model->BSIM3Wmax; - return(OK); - case BSIM3_MOD_NOIA: - value->rValue = model->BSIM3oxideTrapDensityA; - return(OK); - case BSIM3_MOD_NOIB: - value->rValue = model->BSIM3oxideTrapDensityB; - return(OK); - case BSIM3_MOD_NOIC: - value->rValue = model->BSIM3oxideTrapDensityC; - return(OK); - case BSIM3_MOD_EM: - value->rValue = model->BSIM3em; - return(OK); - case BSIM3_MOD_EF: - value->rValue = model->BSIM3ef; - return(OK); - case BSIM3_MOD_AF: - value->rValue = model->BSIM3af; - return(OK); - case BSIM3_MOD_KF: - value->rValue = model->BSIM3kf; - return(OK); - default: - return(E_BADPARM); - } - /* NOTREACHED */ + case BSIM3_MOD_TNOM: + value->rValue = model->BSIM3tnom; + return (OK); + case BSIM3_MOD_CGSO: + value->rValue = model->BSIM3cgso; + return (OK); + case BSIM3_MOD_CGDO: + value->rValue = model->BSIM3cgdo; + return (OK); + case BSIM3_MOD_CGBO: + value->rValue = model->BSIM3cgbo; + return (OK); + case BSIM3_MOD_XPART: + value->rValue = model->BSIM3xpart; + return (OK); + case BSIM3_MOD_RSH: + value->rValue = model->BSIM3sheetResistance; + return (OK); + case BSIM3_MOD_JS: + value->rValue = model->BSIM3jctSatCurDensity; + return (OK); + case BSIM3_MOD_JSW: + value->rValue = model->BSIM3jctSidewallSatCurDensity; + return (OK); + case BSIM3_MOD_PB: + value->rValue = model->BSIM3bulkJctPotential; + return (OK); + case BSIM3_MOD_MJ: + value->rValue = model->BSIM3bulkJctBotGradingCoeff; + return (OK); + case BSIM3_MOD_PBSW: + value->rValue = model->BSIM3sidewallJctPotential; + return (OK); + case BSIM3_MOD_MJSW: + value->rValue = model->BSIM3bulkJctSideGradingCoeff; + return (OK); + case BSIM3_MOD_CJ: + value->rValue = model->BSIM3unitAreaJctCap; + return (OK); + case BSIM3_MOD_CJSW: + value->rValue = model->BSIM3unitLengthSidewallJctCap; + return (OK); + case BSIM3_MOD_PBSWG: + value->rValue = model->BSIM3GatesidewallJctPotential; + return (OK); + case BSIM3_MOD_MJSWG: + value->rValue = model->BSIM3bulkJctGateSideGradingCoeff; + return (OK); + case BSIM3_MOD_CJSWG: + value->rValue = model->BSIM3unitLengthGateSidewallJctCap; + return (OK); + case BSIM3_MOD_NJ: + value->rValue = model->BSIM3jctEmissionCoeff; + return (OK); + case BSIM3_MOD_XTI: + value->rValue = model->BSIM3jctTempExponent; + return (OK); + case BSIM3_MOD_LINT: + value->rValue = model->BSIM3Lint; + return (OK); + case BSIM3_MOD_LL: + value->rValue = model->BSIM3Ll; + return (OK); + case BSIM3_MOD_LLC: + value->rValue = model->BSIM3Llc; + return (OK); + case BSIM3_MOD_LLN: + value->rValue = model->BSIM3Lln; + return (OK); + case BSIM3_MOD_LW: + value->rValue = model->BSIM3Lw; + return (OK); + case BSIM3_MOD_LWC: + value->rValue = model->BSIM3Lwc; + return (OK); + case BSIM3_MOD_LWN: + value->rValue = model->BSIM3Lwn; + return (OK); + case BSIM3_MOD_LWL: + value->rValue = model->BSIM3Lwl; + return (OK); + case BSIM3_MOD_LWLC: + value->rValue = model->BSIM3Lwlc; + return (OK); + case BSIM3_MOD_LMIN: + value->rValue = model->BSIM3Lmin; + return (OK); + case BSIM3_MOD_LMAX: + value->rValue = model->BSIM3Lmax; + return (OK); + case BSIM3_MOD_WINT: + value->rValue = model->BSIM3Wint; + return (OK); + case BSIM3_MOD_WL: + value->rValue = model->BSIM3Wl; + return (OK); + case BSIM3_MOD_WLC: + value->rValue = model->BSIM3Wlc; + return (OK); + case BSIM3_MOD_WLN: + value->rValue = model->BSIM3Wln; + return (OK); + case BSIM3_MOD_WW: + value->rValue = model->BSIM3Ww; + return (OK); + case BSIM3_MOD_WWC: + value->rValue = model->BSIM3Wwc; + return (OK); + case BSIM3_MOD_WWN: + value->rValue = model->BSIM3Wwn; + return (OK); + case BSIM3_MOD_WWL: + value->rValue = model->BSIM3Wwl; + return (OK); + case BSIM3_MOD_WWLC: + value->rValue = model->BSIM3Wwlc; + return (OK); + case BSIM3_MOD_WMIN: + value->rValue = model->BSIM3Wmin; + return (OK); + case BSIM3_MOD_WMAX: + value->rValue = model->BSIM3Wmax; + return (OK); + case BSIM3_MOD_NOIA: + value->rValue = model->BSIM3oxideTrapDensityA; + return (OK); + case BSIM3_MOD_NOIB: + value->rValue = model->BSIM3oxideTrapDensityB; + return (OK); + case BSIM3_MOD_NOIC: + value->rValue = model->BSIM3oxideTrapDensityC; + return (OK); + case BSIM3_MOD_EM: + value->rValue = model->BSIM3em; + return (OK); + case BSIM3_MOD_EF: + value->rValue = model->BSIM3ef; + return (OK); + case BSIM3_MOD_AF: + value->rValue = model->BSIM3af; + return (OK); + case BSIM3_MOD_KF: + value->rValue = model->BSIM3kf; + return (OK); + default: + return (E_BADPARM); + } + /* NOTREACHED */ } - - - diff --git a/src/spicelib/devices/bsim3/b3mdel.c b/src/spicelib/devices/bsim3/b3mdel.c index 7836f349b..190a3533d 100644 --- a/src/spicelib/devices/bsim3/b3mdel.c +++ b/src/spicelib/devices/bsim3/b3mdel.c @@ -1,47 +1,58 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -File: b3mdel.c -**********/ + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3mdel.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + + +/*************************************/ #include "ngspice.h" -#include #include "bsim3def.h" #include "sperror.h" #include "suffix.h" int -BSIM3mDelete(inModel,modname,kill) -GENmodel **inModel; -IFuid modname; -GENmodel *kill; +BSIM3mDelete (GENmodel ** inModel, IFuid modname, GENmodel * kill) { -BSIM3model **model = (BSIM3model**)inModel; -BSIM3model *modfast = (BSIM3model*)kill; -BSIM3instance *here; -BSIM3instance *prev = NULL; -BSIM3model **oldmod; + BSIM3model **model = (BSIM3model **) inModel; + BSIM3model *modfast = (BSIM3model *) kill; + BSIM3instance *here; + BSIM3instance *prev = NULL; + BSIM3model **oldmod; - oldmod = model; - for (; *model ; model = &((*model)->BSIM3nextModel)) - { if ((*model)->BSIM3modName == modname || - (modfast && *model == modfast)) - goto delgot; - oldmod = model; - } - return(E_NOMOD); + oldmod = model; + for (; *model; model = &((*model)->BSIM3nextModel)) + { + if ((*model)->BSIM3modName == modname || + (modfast && *model == modfast)) + goto delgot; + oldmod = model; + } + return (E_NOMOD); -delgot: - *oldmod = (*model)->BSIM3nextModel; /* cut deleted device out of list */ - for (here = (*model)->BSIM3instances; here; here = here->BSIM3nextInstance) - { if(prev) FREE(prev); - prev = here; - } - if(prev) FREE(prev); - FREE(*model); - return(OK); + delgot: + *oldmod = (*model)->BSIM3nextModel; /* cut deleted device out of list */ + for (here = (*model)->BSIM3instances; here; + here = here->BSIM3nextInstance) + { + if (prev) + FREE (prev); + prev = here; + } + if (prev) + FREE (prev); + FREE (*model); + return (OK); } - - - diff --git a/src/spicelib/devices/bsim3/b3mpar.c b/src/spicelib/devices/bsim3/b3mpar.c index 7ba57a744..caf5fb77a 100644 --- a/src/spicelib/devices/bsim3/b3mpar.c +++ b/src/spicelib/devices/bsim3/b3mpar.c @@ -1,12 +1,24 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -File: b3mpar.c -**********/ + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3mpar.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + + +/*************************************/ #include "ngspice.h" -#include #include "bsim3def.h" #include "ifsim.h" #include "sperror.h" @@ -14,1663 +26,1659 @@ File: b3mpar.c int -BSIM3mParam (param, value, inMod) - int param; - IFvalue *value; - GENmodel *inMod; +BSIM3mParam(int param, IFvalue *value, GENmodel *inMod) { - BSIM3model *mod = (BSIM3model *) inMod; - switch (param) - { - case BSIM3_MOD_MOBMOD: - mod->BSIM3mobMod = value->iValue; - mod->BSIM3mobModGiven = TRUE; - break; - case BSIM3_MOD_BINUNIT: - mod->BSIM3binUnit = value->iValue; - mod->BSIM3binUnitGiven = TRUE; - break; - case BSIM3_MOD_PARAMCHK: - mod->BSIM3paramChk = value->iValue; - mod->BSIM3paramChkGiven = TRUE; - break; - case BSIM3_MOD_CAPMOD: - mod->BSIM3capMod = value->iValue; - mod->BSIM3capModGiven = TRUE; - break; - case BSIM3_MOD_NOIMOD: - mod->BSIM3noiMod = value->iValue; - mod->BSIM3noiModGiven = TRUE; - break; - case BSIM3_MOD_VERSION: - mod->BSIM3version = value->sValue; - mod->BSIM3versionGiven = TRUE; - break; - case BSIM3_MOD_TOX: - mod->BSIM3tox = value->rValue; - mod->BSIM3toxGiven = TRUE; - break; - case BSIM3_MOD_TOXM: - mod->BSIM3toxm = value->rValue; - mod->BSIM3toxmGiven = TRUE; - break; - - case BSIM3_MOD_CDSC: - mod->BSIM3cdsc = value->rValue; - mod->BSIM3cdscGiven = TRUE; - break; - case BSIM3_MOD_CDSCB: - mod->BSIM3cdscb = value->rValue; - mod->BSIM3cdscbGiven = TRUE; - break; - - case BSIM3_MOD_CDSCD: - mod->BSIM3cdscd = value->rValue; - mod->BSIM3cdscdGiven = TRUE; - break; - - case BSIM3_MOD_CIT: - mod->BSIM3cit = value->rValue; - mod->BSIM3citGiven = TRUE; - break; - case BSIM3_MOD_NFACTOR: - mod->BSIM3nfactor = value->rValue; - mod->BSIM3nfactorGiven = TRUE; - break; - case BSIM3_MOD_XJ: - mod->BSIM3xj = value->rValue; - mod->BSIM3xjGiven = TRUE; - break; - case BSIM3_MOD_VSAT: - mod->BSIM3vsat = value->rValue; - mod->BSIM3vsatGiven = TRUE; - break; - case BSIM3_MOD_A0: - mod->BSIM3a0 = value->rValue; - mod->BSIM3a0Given = TRUE; - break; + BSIM3model *mod = (BSIM3model*)inMod; + switch(param) + { case BSIM3_MOD_MOBMOD : + mod->BSIM3mobMod = value->iValue; + mod->BSIM3mobModGiven = TRUE; + break; + case BSIM3_MOD_BINUNIT : + mod->BSIM3binUnit = value->iValue; + mod->BSIM3binUnitGiven = TRUE; + break; + case BSIM3_MOD_PARAMCHK : + mod->BSIM3paramChk = value->iValue; + mod->BSIM3paramChkGiven = TRUE; + break; + case BSIM3_MOD_CAPMOD : + mod->BSIM3capMod = value->iValue; + mod->BSIM3capModGiven = TRUE; + break; + case BSIM3_MOD_NOIMOD : + mod->BSIM3noiMod = value->iValue; + mod->BSIM3noiModGiven = TRUE; + break; + case BSIM3_MOD_VERSION : + mod->BSIM3version = value->sValue; + mod->BSIM3versionGiven = TRUE; + break; + case BSIM3_MOD_TOX : + mod->BSIM3tox = value->rValue; + mod->BSIM3toxGiven = TRUE; + break; + case BSIM3_MOD_TOXM : + mod->BSIM3toxm = value->rValue; + mod->BSIM3toxmGiven = TRUE; + break; - case BSIM3_MOD_AGS: - mod->BSIM3ags = value->rValue; - mod->BSIM3agsGiven = TRUE; - break; + case BSIM3_MOD_CDSC : + mod->BSIM3cdsc = value->rValue; + mod->BSIM3cdscGiven = TRUE; + break; + case BSIM3_MOD_CDSCB : + mod->BSIM3cdscb = value->rValue; + mod->BSIM3cdscbGiven = TRUE; + break; - case BSIM3_MOD_A1: - mod->BSIM3a1 = value->rValue; - mod->BSIM3a1Given = TRUE; - break; - case BSIM3_MOD_A2: - mod->BSIM3a2 = value->rValue; - mod->BSIM3a2Given = TRUE; - break; - case BSIM3_MOD_AT: - mod->BSIM3at = value->rValue; - mod->BSIM3atGiven = TRUE; - break; - case BSIM3_MOD_KETA: - mod->BSIM3keta = value->rValue; - mod->BSIM3ketaGiven = TRUE; - break; - case BSIM3_MOD_NSUB: - mod->BSIM3nsub = value->rValue; - mod->BSIM3nsubGiven = TRUE; - break; - case BSIM3_MOD_NPEAK: - mod->BSIM3npeak = value->rValue; - mod->BSIM3npeakGiven = TRUE; - if (mod->BSIM3npeak > 1.0e20) - mod->BSIM3npeak *= 1.0e-6; - break; - case BSIM3_MOD_NGATE: - mod->BSIM3ngate = value->rValue; - mod->BSIM3ngateGiven = TRUE; - if (mod->BSIM3ngate > 1.0e23) - mod->BSIM3ngate *= 1.0e-6; - break; - case BSIM3_MOD_GAMMA1: - mod->BSIM3gamma1 = value->rValue; - mod->BSIM3gamma1Given = TRUE; - break; - case BSIM3_MOD_GAMMA2: - mod->BSIM3gamma2 = value->rValue; - mod->BSIM3gamma2Given = TRUE; - break; - case BSIM3_MOD_VBX: - mod->BSIM3vbx = value->rValue; - mod->BSIM3vbxGiven = TRUE; - break; - case BSIM3_MOD_VBM: - mod->BSIM3vbm = value->rValue; - mod->BSIM3vbmGiven = TRUE; - break; - case BSIM3_MOD_XT: - mod->BSIM3xt = value->rValue; - mod->BSIM3xtGiven = TRUE; - break; - case BSIM3_MOD_K1: - mod->BSIM3k1 = value->rValue; - mod->BSIM3k1Given = TRUE; - break; - case BSIM3_MOD_KT1: - mod->BSIM3kt1 = value->rValue; - mod->BSIM3kt1Given = TRUE; - break; - case BSIM3_MOD_KT1L: - mod->BSIM3kt1l = value->rValue; - mod->BSIM3kt1lGiven = TRUE; - break; - case BSIM3_MOD_KT2: - mod->BSIM3kt2 = value->rValue; - mod->BSIM3kt2Given = TRUE; - break; - case BSIM3_MOD_K2: - mod->BSIM3k2 = value->rValue; - mod->BSIM3k2Given = TRUE; - break; - case BSIM3_MOD_K3: - mod->BSIM3k3 = value->rValue; - mod->BSIM3k3Given = TRUE; - break; - case BSIM3_MOD_K3B: - mod->BSIM3k3b = value->rValue; - mod->BSIM3k3bGiven = TRUE; - break; - case BSIM3_MOD_NLX: - mod->BSIM3nlx = value->rValue; - mod->BSIM3nlxGiven = TRUE; - break; - case BSIM3_MOD_W0: - mod->BSIM3w0 = value->rValue; - mod->BSIM3w0Given = TRUE; - break; - case BSIM3_MOD_DVT0: - mod->BSIM3dvt0 = value->rValue; - mod->BSIM3dvt0Given = TRUE; - break; - case BSIM3_MOD_DVT1: - mod->BSIM3dvt1 = value->rValue; - mod->BSIM3dvt1Given = TRUE; - break; - case BSIM3_MOD_DVT2: - mod->BSIM3dvt2 = value->rValue; - mod->BSIM3dvt2Given = TRUE; - break; - case BSIM3_MOD_DVT0W: - mod->BSIM3dvt0w = value->rValue; - mod->BSIM3dvt0wGiven = TRUE; - break; - case BSIM3_MOD_DVT1W: - mod->BSIM3dvt1w = value->rValue; - mod->BSIM3dvt1wGiven = TRUE; - break; - case BSIM3_MOD_DVT2W: - mod->BSIM3dvt2w = value->rValue; - mod->BSIM3dvt2wGiven = TRUE; - break; - case BSIM3_MOD_DROUT: - mod->BSIM3drout = value->rValue; - mod->BSIM3droutGiven = TRUE; - break; - case BSIM3_MOD_DSUB: - mod->BSIM3dsub = value->rValue; - mod->BSIM3dsubGiven = TRUE; - break; - case BSIM3_MOD_VTH0: - mod->BSIM3vth0 = value->rValue; - mod->BSIM3vth0Given = TRUE; - break; - case BSIM3_MOD_UA: - mod->BSIM3ua = value->rValue; - mod->BSIM3uaGiven = TRUE; - break; - case BSIM3_MOD_UA1: - mod->BSIM3ua1 = value->rValue; - mod->BSIM3ua1Given = TRUE; - break; - case BSIM3_MOD_UB: - mod->BSIM3ub = value->rValue; - mod->BSIM3ubGiven = TRUE; - break; - case BSIM3_MOD_UB1: - mod->BSIM3ub1 = value->rValue; - mod->BSIM3ub1Given = TRUE; - break; - case BSIM3_MOD_UC: - mod->BSIM3uc = value->rValue; - mod->BSIM3ucGiven = TRUE; - break; - case BSIM3_MOD_UC1: - mod->BSIM3uc1 = value->rValue; - mod->BSIM3uc1Given = TRUE; - break; - case BSIM3_MOD_U0: - mod->BSIM3u0 = value->rValue; - mod->BSIM3u0Given = TRUE; - break; - case BSIM3_MOD_UTE: - mod->BSIM3ute = value->rValue; - mod->BSIM3uteGiven = TRUE; - break; - case BSIM3_MOD_VOFF: - mod->BSIM3voff = value->rValue; - mod->BSIM3voffGiven = TRUE; - break; - case BSIM3_MOD_DELTA: - mod->BSIM3delta = value->rValue; - mod->BSIM3deltaGiven = TRUE; - break; - case BSIM3_MOD_RDSW: - mod->BSIM3rdsw = value->rValue; - mod->BSIM3rdswGiven = TRUE; - break; - case BSIM3_MOD_PRWG: - mod->BSIM3prwg = value->rValue; - mod->BSIM3prwgGiven = TRUE; - break; - case BSIM3_MOD_PRWB: - mod->BSIM3prwb = value->rValue; - mod->BSIM3prwbGiven = TRUE; - break; - case BSIM3_MOD_PRT: - mod->BSIM3prt = value->rValue; - mod->BSIM3prtGiven = TRUE; - break; - case BSIM3_MOD_ETA0: - mod->BSIM3eta0 = value->rValue; - mod->BSIM3eta0Given = TRUE; - break; - case BSIM3_MOD_ETAB: - mod->BSIM3etab = value->rValue; - mod->BSIM3etabGiven = TRUE; - break; - case BSIM3_MOD_PCLM: - mod->BSIM3pclm = value->rValue; - mod->BSIM3pclmGiven = TRUE; - break; - case BSIM3_MOD_PDIBL1: - mod->BSIM3pdibl1 = value->rValue; - mod->BSIM3pdibl1Given = TRUE; - break; - case BSIM3_MOD_PDIBL2: - mod->BSIM3pdibl2 = value->rValue; - mod->BSIM3pdibl2Given = TRUE; - break; - case BSIM3_MOD_PDIBLB: - mod->BSIM3pdiblb = value->rValue; - mod->BSIM3pdiblbGiven = TRUE; - break; - case BSIM3_MOD_PSCBE1: - mod->BSIM3pscbe1 = value->rValue; - mod->BSIM3pscbe1Given = TRUE; - break; - case BSIM3_MOD_PSCBE2: - mod->BSIM3pscbe2 = value->rValue; - mod->BSIM3pscbe2Given = TRUE; - break; - case BSIM3_MOD_PVAG: - mod->BSIM3pvag = value->rValue; - mod->BSIM3pvagGiven = TRUE; - break; - case BSIM3_MOD_WR: - mod->BSIM3wr = value->rValue; - mod->BSIM3wrGiven = TRUE; - break; - case BSIM3_MOD_DWG: - mod->BSIM3dwg = value->rValue; - mod->BSIM3dwgGiven = TRUE; - break; - case BSIM3_MOD_DWB: - mod->BSIM3dwb = value->rValue; - mod->BSIM3dwbGiven = TRUE; - break; - case BSIM3_MOD_B0: - mod->BSIM3b0 = value->rValue; - mod->BSIM3b0Given = TRUE; - break; - case BSIM3_MOD_B1: - mod->BSIM3b1 = value->rValue; - mod->BSIM3b1Given = TRUE; - break; - case BSIM3_MOD_ALPHA0: - mod->BSIM3alpha0 = value->rValue; - mod->BSIM3alpha0Given = TRUE; - break; - case BSIM3_MOD_ALPHA1: - mod->BSIM3alpha1 = value->rValue; - mod->BSIM3alpha1Given = TRUE; - break; - case BSIM3_MOD_BETA0: - mod->BSIM3beta0 = value->rValue; - mod->BSIM3beta0Given = TRUE; - break; - case BSIM3_MOD_IJTH: - mod->BSIM3ijth = value->rValue; - mod->BSIM3ijthGiven = TRUE; - break; - case BSIM3_MOD_VFB: - mod->BSIM3vfb = value->rValue; - mod->BSIM3vfbGiven = TRUE; - break; + case BSIM3_MOD_CDSCD : + mod->BSIM3cdscd = value->rValue; + mod->BSIM3cdscdGiven = TRUE; + break; - case BSIM3_MOD_ELM: - mod->BSIM3elm = value->rValue; - mod->BSIM3elmGiven = TRUE; - break; - case BSIM3_MOD_CGSL: - mod->BSIM3cgsl = value->rValue; - mod->BSIM3cgslGiven = TRUE; - break; - case BSIM3_MOD_CGDL: - mod->BSIM3cgdl = value->rValue; - mod->BSIM3cgdlGiven = TRUE; - break; - case BSIM3_MOD_CKAPPA: - mod->BSIM3ckappa = value->rValue; - mod->BSIM3ckappaGiven = TRUE; - break; - case BSIM3_MOD_CF: - mod->BSIM3cf = value->rValue; - mod->BSIM3cfGiven = TRUE; - break; - case BSIM3_MOD_CLC: - mod->BSIM3clc = value->rValue; - mod->BSIM3clcGiven = TRUE; - break; - case BSIM3_MOD_CLE: - mod->BSIM3cle = value->rValue; - mod->BSIM3cleGiven = TRUE; - break; - case BSIM3_MOD_DWC: - mod->BSIM3dwc = value->rValue; - mod->BSIM3dwcGiven = TRUE; - break; - case BSIM3_MOD_DLC: - mod->BSIM3dlc = value->rValue; - mod->BSIM3dlcGiven = TRUE; - break; - case BSIM3_MOD_VFBCV: - mod->BSIM3vfbcv = value->rValue; - mod->BSIM3vfbcvGiven = TRUE; - break; - case BSIM3_MOD_ACDE: - mod->BSIM3acde = value->rValue; - mod->BSIM3acdeGiven = TRUE; - break; - case BSIM3_MOD_MOIN: - mod->BSIM3moin = value->rValue; - mod->BSIM3moinGiven = TRUE; - break; - case BSIM3_MOD_NOFF: - mod->BSIM3noff = value->rValue; - mod->BSIM3noffGiven = TRUE; - break; - case BSIM3_MOD_VOFFCV: - mod->BSIM3voffcv = value->rValue; - mod->BSIM3voffcvGiven = TRUE; - break; - case BSIM3_MOD_TCJ: - mod->BSIM3tcj = value->rValue; - mod->BSIM3tcjGiven = TRUE; - break; - case BSIM3_MOD_TPB: - mod->BSIM3tpb = value->rValue; - mod->BSIM3tpbGiven = TRUE; - break; - case BSIM3_MOD_TCJSW: - mod->BSIM3tcjsw = value->rValue; - mod->BSIM3tcjswGiven = TRUE; - break; - case BSIM3_MOD_TPBSW: - mod->BSIM3tpbsw = value->rValue; - mod->BSIM3tpbswGiven = TRUE; - break; - case BSIM3_MOD_TCJSWG: - mod->BSIM3tcjswg = value->rValue; - mod->BSIM3tcjswgGiven = TRUE; - break; - case BSIM3_MOD_TPBSWG: - mod->BSIM3tpbswg = value->rValue; - mod->BSIM3tpbswgGiven = TRUE; - break; + case BSIM3_MOD_CIT : + mod->BSIM3cit = value->rValue; + mod->BSIM3citGiven = TRUE; + break; + case BSIM3_MOD_NFACTOR : + mod->BSIM3nfactor = value->rValue; + mod->BSIM3nfactorGiven = TRUE; + break; + case BSIM3_MOD_XJ: + mod->BSIM3xj = value->rValue; + mod->BSIM3xjGiven = TRUE; + break; + case BSIM3_MOD_VSAT: + mod->BSIM3vsat = value->rValue; + mod->BSIM3vsatGiven = TRUE; + break; + case BSIM3_MOD_A0: + mod->BSIM3a0 = value->rValue; + mod->BSIM3a0Given = TRUE; + break; + + case BSIM3_MOD_AGS: + mod->BSIM3ags= value->rValue; + mod->BSIM3agsGiven = TRUE; + break; + + case BSIM3_MOD_A1: + mod->BSIM3a1 = value->rValue; + mod->BSIM3a1Given = TRUE; + break; + case BSIM3_MOD_A2: + mod->BSIM3a2 = value->rValue; + mod->BSIM3a2Given = TRUE; + break; + case BSIM3_MOD_AT: + mod->BSIM3at = value->rValue; + mod->BSIM3atGiven = TRUE; + break; + case BSIM3_MOD_KETA: + mod->BSIM3keta = value->rValue; + mod->BSIM3ketaGiven = TRUE; + break; + case BSIM3_MOD_NSUB: + mod->BSIM3nsub = value->rValue; + mod->BSIM3nsubGiven = TRUE; + break; + case BSIM3_MOD_NPEAK: + mod->BSIM3npeak = value->rValue; + mod->BSIM3npeakGiven = TRUE; + if (mod->BSIM3npeak > 1.0e20) + mod->BSIM3npeak *= 1.0e-6; + break; + case BSIM3_MOD_NGATE: + mod->BSIM3ngate = value->rValue; + mod->BSIM3ngateGiven = TRUE; + if (mod->BSIM3ngate > 1.0e23) + mod->BSIM3ngate *= 1.0e-6; + break; + case BSIM3_MOD_GAMMA1: + mod->BSIM3gamma1 = value->rValue; + mod->BSIM3gamma1Given = TRUE; + break; + case BSIM3_MOD_GAMMA2: + mod->BSIM3gamma2 = value->rValue; + mod->BSIM3gamma2Given = TRUE; + break; + case BSIM3_MOD_VBX: + mod->BSIM3vbx = value->rValue; + mod->BSIM3vbxGiven = TRUE; + break; + case BSIM3_MOD_VBM: + mod->BSIM3vbm = value->rValue; + mod->BSIM3vbmGiven = TRUE; + break; + case BSIM3_MOD_XT: + mod->BSIM3xt = value->rValue; + mod->BSIM3xtGiven = TRUE; + break; + case BSIM3_MOD_K1: + mod->BSIM3k1 = value->rValue; + mod->BSIM3k1Given = TRUE; + break; + case BSIM3_MOD_KT1: + mod->BSIM3kt1 = value->rValue; + mod->BSIM3kt1Given = TRUE; + break; + case BSIM3_MOD_KT1L: + mod->BSIM3kt1l = value->rValue; + mod->BSIM3kt1lGiven = TRUE; + break; + case BSIM3_MOD_KT2: + mod->BSIM3kt2 = value->rValue; + mod->BSIM3kt2Given = TRUE; + break; + case BSIM3_MOD_K2: + mod->BSIM3k2 = value->rValue; + mod->BSIM3k2Given = TRUE; + break; + case BSIM3_MOD_K3: + mod->BSIM3k3 = value->rValue; + mod->BSIM3k3Given = TRUE; + break; + case BSIM3_MOD_K3B: + mod->BSIM3k3b = value->rValue; + mod->BSIM3k3bGiven = TRUE; + break; + case BSIM3_MOD_NLX: + mod->BSIM3nlx = value->rValue; + mod->BSIM3nlxGiven = TRUE; + break; + case BSIM3_MOD_W0: + mod->BSIM3w0 = value->rValue; + mod->BSIM3w0Given = TRUE; + break; + case BSIM3_MOD_DVT0: + mod->BSIM3dvt0 = value->rValue; + mod->BSIM3dvt0Given = TRUE; + break; + case BSIM3_MOD_DVT1: + mod->BSIM3dvt1 = value->rValue; + mod->BSIM3dvt1Given = TRUE; + break; + case BSIM3_MOD_DVT2: + mod->BSIM3dvt2 = value->rValue; + mod->BSIM3dvt2Given = TRUE; + break; + case BSIM3_MOD_DVT0W: + mod->BSIM3dvt0w = value->rValue; + mod->BSIM3dvt0wGiven = TRUE; + break; + case BSIM3_MOD_DVT1W: + mod->BSIM3dvt1w = value->rValue; + mod->BSIM3dvt1wGiven = TRUE; + break; + case BSIM3_MOD_DVT2W: + mod->BSIM3dvt2w = value->rValue; + mod->BSIM3dvt2wGiven = TRUE; + break; + case BSIM3_MOD_DROUT: + mod->BSIM3drout = value->rValue; + mod->BSIM3droutGiven = TRUE; + break; + case BSIM3_MOD_DSUB: + mod->BSIM3dsub = value->rValue; + mod->BSIM3dsubGiven = TRUE; + break; + case BSIM3_MOD_VTH0: + mod->BSIM3vth0 = value->rValue; + mod->BSIM3vth0Given = TRUE; + break; + case BSIM3_MOD_UA: + mod->BSIM3ua = value->rValue; + mod->BSIM3uaGiven = TRUE; + break; + case BSIM3_MOD_UA1: + mod->BSIM3ua1 = value->rValue; + mod->BSIM3ua1Given = TRUE; + break; + case BSIM3_MOD_UB: + mod->BSIM3ub = value->rValue; + mod->BSIM3ubGiven = TRUE; + break; + case BSIM3_MOD_UB1: + mod->BSIM3ub1 = value->rValue; + mod->BSIM3ub1Given = TRUE; + break; + case BSIM3_MOD_UC: + mod->BSIM3uc = value->rValue; + mod->BSIM3ucGiven = TRUE; + break; + case BSIM3_MOD_UC1: + mod->BSIM3uc1 = value->rValue; + mod->BSIM3uc1Given = TRUE; + break; + case BSIM3_MOD_U0 : + mod->BSIM3u0 = value->rValue; + mod->BSIM3u0Given = TRUE; + break; + case BSIM3_MOD_UTE : + mod->BSIM3ute = value->rValue; + mod->BSIM3uteGiven = TRUE; + break; + case BSIM3_MOD_VOFF: + mod->BSIM3voff = value->rValue; + mod->BSIM3voffGiven = TRUE; + break; + case BSIM3_MOD_DELTA : + mod->BSIM3delta = value->rValue; + mod->BSIM3deltaGiven = TRUE; + break; + case BSIM3_MOD_RDSW: + mod->BSIM3rdsw = value->rValue; + mod->BSIM3rdswGiven = TRUE; + break; + case BSIM3_MOD_PRWG: + mod->BSIM3prwg = value->rValue; + mod->BSIM3prwgGiven = TRUE; + break; + case BSIM3_MOD_PRWB: + mod->BSIM3prwb = value->rValue; + mod->BSIM3prwbGiven = TRUE; + break; + case BSIM3_MOD_PRT: + mod->BSIM3prt = value->rValue; + mod->BSIM3prtGiven = TRUE; + break; + case BSIM3_MOD_ETA0: + mod->BSIM3eta0 = value->rValue; + mod->BSIM3eta0Given = TRUE; + break; + case BSIM3_MOD_ETAB: + mod->BSIM3etab = value->rValue; + mod->BSIM3etabGiven = TRUE; + break; + case BSIM3_MOD_PCLM: + mod->BSIM3pclm = value->rValue; + mod->BSIM3pclmGiven = TRUE; + break; + case BSIM3_MOD_PDIBL1: + mod->BSIM3pdibl1 = value->rValue; + mod->BSIM3pdibl1Given = TRUE; + break; + case BSIM3_MOD_PDIBL2: + mod->BSIM3pdibl2 = value->rValue; + mod->BSIM3pdibl2Given = TRUE; + break; + case BSIM3_MOD_PDIBLB: + mod->BSIM3pdiblb = value->rValue; + mod->BSIM3pdiblbGiven = TRUE; + break; + case BSIM3_MOD_PSCBE1: + mod->BSIM3pscbe1 = value->rValue; + mod->BSIM3pscbe1Given = TRUE; + break; + case BSIM3_MOD_PSCBE2: + mod->BSIM3pscbe2 = value->rValue; + mod->BSIM3pscbe2Given = TRUE; + break; + case BSIM3_MOD_PVAG: + mod->BSIM3pvag = value->rValue; + mod->BSIM3pvagGiven = TRUE; + break; + case BSIM3_MOD_WR : + mod->BSIM3wr = value->rValue; + mod->BSIM3wrGiven = TRUE; + break; + case BSIM3_MOD_DWG : + mod->BSIM3dwg = value->rValue; + mod->BSIM3dwgGiven = TRUE; + break; + case BSIM3_MOD_DWB : + mod->BSIM3dwb = value->rValue; + mod->BSIM3dwbGiven = TRUE; + break; + case BSIM3_MOD_B0 : + mod->BSIM3b0 = value->rValue; + mod->BSIM3b0Given = TRUE; + break; + case BSIM3_MOD_B1 : + mod->BSIM3b1 = value->rValue; + mod->BSIM3b1Given = TRUE; + break; + case BSIM3_MOD_ALPHA0 : + mod->BSIM3alpha0 = value->rValue; + mod->BSIM3alpha0Given = TRUE; + break; + case BSIM3_MOD_ALPHA1 : + mod->BSIM3alpha1 = value->rValue; + mod->BSIM3alpha1Given = TRUE; + break; + case BSIM3_MOD_BETA0 : + mod->BSIM3beta0 = value->rValue; + mod->BSIM3beta0Given = TRUE; + break; + case BSIM3_MOD_IJTH : + mod->BSIM3ijth = value->rValue; + mod->BSIM3ijthGiven = TRUE; + break; + case BSIM3_MOD_VFB : + mod->BSIM3vfb = value->rValue; + mod->BSIM3vfbGiven = TRUE; + break; - /* Length dependence */ - case BSIM3_MOD_LCDSC: - mod->BSIM3lcdsc = value->rValue; - mod->BSIM3lcdscGiven = TRUE; - break; + case BSIM3_MOD_ELM : + mod->BSIM3elm = value->rValue; + mod->BSIM3elmGiven = TRUE; + break; + case BSIM3_MOD_CGSL : + mod->BSIM3cgsl = value->rValue; + mod->BSIM3cgslGiven = TRUE; + break; + case BSIM3_MOD_CGDL : + mod->BSIM3cgdl = value->rValue; + mod->BSIM3cgdlGiven = TRUE; + break; + case BSIM3_MOD_CKAPPA : + mod->BSIM3ckappa = value->rValue; + mod->BSIM3ckappaGiven = TRUE; + break; + case BSIM3_MOD_CF : + mod->BSIM3cf = value->rValue; + mod->BSIM3cfGiven = TRUE; + break; + case BSIM3_MOD_CLC : + mod->BSIM3clc = value->rValue; + mod->BSIM3clcGiven = TRUE; + break; + case BSIM3_MOD_CLE : + mod->BSIM3cle = value->rValue; + mod->BSIM3cleGiven = TRUE; + break; + case BSIM3_MOD_DWC : + mod->BSIM3dwc = value->rValue; + mod->BSIM3dwcGiven = TRUE; + break; + case BSIM3_MOD_DLC : + mod->BSIM3dlc = value->rValue; + mod->BSIM3dlcGiven = TRUE; + break; + case BSIM3_MOD_VFBCV : + mod->BSIM3vfbcv = value->rValue; + mod->BSIM3vfbcvGiven = TRUE; + break; + case BSIM3_MOD_ACDE : + mod->BSIM3acde = value->rValue; + mod->BSIM3acdeGiven = TRUE; + break; + case BSIM3_MOD_MOIN : + mod->BSIM3moin = value->rValue; + mod->BSIM3moinGiven = TRUE; + break; + case BSIM3_MOD_NOFF : + mod->BSIM3noff = value->rValue; + mod->BSIM3noffGiven = TRUE; + break; + case BSIM3_MOD_VOFFCV : + mod->BSIM3voffcv = value->rValue; + mod->BSIM3voffcvGiven = TRUE; + break; + case BSIM3_MOD_TCJ : + mod->BSIM3tcj = value->rValue; + mod->BSIM3tcjGiven = TRUE; + break; + case BSIM3_MOD_TPB : + mod->BSIM3tpb = value->rValue; + mod->BSIM3tpbGiven = TRUE; + break; + case BSIM3_MOD_TCJSW : + mod->BSIM3tcjsw = value->rValue; + mod->BSIM3tcjswGiven = TRUE; + break; + case BSIM3_MOD_TPBSW : + mod->BSIM3tpbsw = value->rValue; + mod->BSIM3tpbswGiven = TRUE; + break; + case BSIM3_MOD_TCJSWG : + mod->BSIM3tcjswg = value->rValue; + mod->BSIM3tcjswgGiven = TRUE; + break; + case BSIM3_MOD_TPBSWG : + mod->BSIM3tpbswg = value->rValue; + mod->BSIM3tpbswgGiven = TRUE; + break; + /* Length dependence */ + case BSIM3_MOD_LCDSC : + mod->BSIM3lcdsc = value->rValue; + mod->BSIM3lcdscGiven = TRUE; + break; - case BSIM3_MOD_LCDSCB: - mod->BSIM3lcdscb = value->rValue; - mod->BSIM3lcdscbGiven = TRUE; - break; - case BSIM3_MOD_LCDSCD: - mod->BSIM3lcdscd = value->rValue; - mod->BSIM3lcdscdGiven = TRUE; - break; - case BSIM3_MOD_LCIT: - mod->BSIM3lcit = value->rValue; - mod->BSIM3lcitGiven = TRUE; - break; - case BSIM3_MOD_LNFACTOR: - mod->BSIM3lnfactor = value->rValue; - mod->BSIM3lnfactorGiven = TRUE; - break; - case BSIM3_MOD_LXJ: - mod->BSIM3lxj = value->rValue; - mod->BSIM3lxjGiven = TRUE; - break; - case BSIM3_MOD_LVSAT: - mod->BSIM3lvsat = value->rValue; - mod->BSIM3lvsatGiven = TRUE; - break; + case BSIM3_MOD_LCDSCB : + mod->BSIM3lcdscb = value->rValue; + mod->BSIM3lcdscbGiven = TRUE; + break; + case BSIM3_MOD_LCDSCD : + mod->BSIM3lcdscd = value->rValue; + mod->BSIM3lcdscdGiven = TRUE; + break; + case BSIM3_MOD_LCIT : + mod->BSIM3lcit = value->rValue; + mod->BSIM3lcitGiven = TRUE; + break; + case BSIM3_MOD_LNFACTOR : + mod->BSIM3lnfactor = value->rValue; + mod->BSIM3lnfactorGiven = TRUE; + break; + case BSIM3_MOD_LXJ: + mod->BSIM3lxj = value->rValue; + mod->BSIM3lxjGiven = TRUE; + break; + case BSIM3_MOD_LVSAT: + mod->BSIM3lvsat = value->rValue; + mod->BSIM3lvsatGiven = TRUE; + break; + + + case BSIM3_MOD_LA0: + mod->BSIM3la0 = value->rValue; + mod->BSIM3la0Given = TRUE; + break; + case BSIM3_MOD_LAGS: + mod->BSIM3lags = value->rValue; + mod->BSIM3lagsGiven = TRUE; + break; + case BSIM3_MOD_LA1: + mod->BSIM3la1 = value->rValue; + mod->BSIM3la1Given = TRUE; + break; + case BSIM3_MOD_LA2: + mod->BSIM3la2 = value->rValue; + mod->BSIM3la2Given = TRUE; + break; + case BSIM3_MOD_LAT: + mod->BSIM3lat = value->rValue; + mod->BSIM3latGiven = TRUE; + break; + case BSIM3_MOD_LKETA: + mod->BSIM3lketa = value->rValue; + mod->BSIM3lketaGiven = TRUE; + break; + case BSIM3_MOD_LNSUB: + mod->BSIM3lnsub = value->rValue; + mod->BSIM3lnsubGiven = TRUE; + break; + case BSIM3_MOD_LNPEAK: + mod->BSIM3lnpeak = value->rValue; + mod->BSIM3lnpeakGiven = TRUE; + if (mod->BSIM3lnpeak > 1.0e20) + mod->BSIM3lnpeak *= 1.0e-6; + break; + case BSIM3_MOD_LNGATE: + mod->BSIM3lngate = value->rValue; + mod->BSIM3lngateGiven = TRUE; + if (mod->BSIM3lngate > 1.0e23) + mod->BSIM3lngate *= 1.0e-6; + break; + case BSIM3_MOD_LGAMMA1: + mod->BSIM3lgamma1 = value->rValue; + mod->BSIM3lgamma1Given = TRUE; + break; + case BSIM3_MOD_LGAMMA2: + mod->BSIM3lgamma2 = value->rValue; + mod->BSIM3lgamma2Given = TRUE; + break; + case BSIM3_MOD_LVBX: + mod->BSIM3lvbx = value->rValue; + mod->BSIM3lvbxGiven = TRUE; + break; + case BSIM3_MOD_LVBM: + mod->BSIM3lvbm = value->rValue; + mod->BSIM3lvbmGiven = TRUE; + break; + case BSIM3_MOD_LXT: + mod->BSIM3lxt = value->rValue; + mod->BSIM3lxtGiven = TRUE; + break; + case BSIM3_MOD_LK1: + mod->BSIM3lk1 = value->rValue; + mod->BSIM3lk1Given = TRUE; + break; + case BSIM3_MOD_LKT1: + mod->BSIM3lkt1 = value->rValue; + mod->BSIM3lkt1Given = TRUE; + break; + case BSIM3_MOD_LKT1L: + mod->BSIM3lkt1l = value->rValue; + mod->BSIM3lkt1lGiven = TRUE; + break; + case BSIM3_MOD_LKT2: + mod->BSIM3lkt2 = value->rValue; + mod->BSIM3lkt2Given = TRUE; + break; + case BSIM3_MOD_LK2: + mod->BSIM3lk2 = value->rValue; + mod->BSIM3lk2Given = TRUE; + break; + case BSIM3_MOD_LK3: + mod->BSIM3lk3 = value->rValue; + mod->BSIM3lk3Given = TRUE; + break; + case BSIM3_MOD_LK3B: + mod->BSIM3lk3b = value->rValue; + mod->BSIM3lk3bGiven = TRUE; + break; + case BSIM3_MOD_LNLX: + mod->BSIM3lnlx = value->rValue; + mod->BSIM3lnlxGiven = TRUE; + break; + case BSIM3_MOD_LW0: + mod->BSIM3lw0 = value->rValue; + mod->BSIM3lw0Given = TRUE; + break; + case BSIM3_MOD_LDVT0: + mod->BSIM3ldvt0 = value->rValue; + mod->BSIM3ldvt0Given = TRUE; + break; + case BSIM3_MOD_LDVT1: + mod->BSIM3ldvt1 = value->rValue; + mod->BSIM3ldvt1Given = TRUE; + break; + case BSIM3_MOD_LDVT2: + mod->BSIM3ldvt2 = value->rValue; + mod->BSIM3ldvt2Given = TRUE; + break; + case BSIM3_MOD_LDVT0W: + mod->BSIM3ldvt0w = value->rValue; + mod->BSIM3ldvt0wGiven = TRUE; + break; + case BSIM3_MOD_LDVT1W: + mod->BSIM3ldvt1w = value->rValue; + mod->BSIM3ldvt1wGiven = TRUE; + break; + case BSIM3_MOD_LDVT2W: + mod->BSIM3ldvt2w = value->rValue; + mod->BSIM3ldvt2wGiven = TRUE; + break; + case BSIM3_MOD_LDROUT: + mod->BSIM3ldrout = value->rValue; + mod->BSIM3ldroutGiven = TRUE; + break; + case BSIM3_MOD_LDSUB: + mod->BSIM3ldsub = value->rValue; + mod->BSIM3ldsubGiven = TRUE; + break; + case BSIM3_MOD_LVTH0: + mod->BSIM3lvth0 = value->rValue; + mod->BSIM3lvth0Given = TRUE; + break; + case BSIM3_MOD_LUA: + mod->BSIM3lua = value->rValue; + mod->BSIM3luaGiven = TRUE; + break; + case BSIM3_MOD_LUA1: + mod->BSIM3lua1 = value->rValue; + mod->BSIM3lua1Given = TRUE; + break; + case BSIM3_MOD_LUB: + mod->BSIM3lub = value->rValue; + mod->BSIM3lubGiven = TRUE; + break; + case BSIM3_MOD_LUB1: + mod->BSIM3lub1 = value->rValue; + mod->BSIM3lub1Given = TRUE; + break; + case BSIM3_MOD_LUC: + mod->BSIM3luc = value->rValue; + mod->BSIM3lucGiven = TRUE; + break; + case BSIM3_MOD_LUC1: + mod->BSIM3luc1 = value->rValue; + mod->BSIM3luc1Given = TRUE; + break; + case BSIM3_MOD_LU0 : + mod->BSIM3lu0 = value->rValue; + mod->BSIM3lu0Given = TRUE; + break; + case BSIM3_MOD_LUTE : + mod->BSIM3lute = value->rValue; + mod->BSIM3luteGiven = TRUE; + break; + case BSIM3_MOD_LVOFF: + mod->BSIM3lvoff = value->rValue; + mod->BSIM3lvoffGiven = TRUE; + break; + case BSIM3_MOD_LDELTA : + mod->BSIM3ldelta = value->rValue; + mod->BSIM3ldeltaGiven = TRUE; + break; + case BSIM3_MOD_LRDSW: + mod->BSIM3lrdsw = value->rValue; + mod->BSIM3lrdswGiven = TRUE; + break; + case BSIM3_MOD_LPRWB: + mod->BSIM3lprwb = value->rValue; + mod->BSIM3lprwbGiven = TRUE; + break; + case BSIM3_MOD_LPRWG: + mod->BSIM3lprwg = value->rValue; + mod->BSIM3lprwgGiven = TRUE; + break; + case BSIM3_MOD_LPRT: + mod->BSIM3lprt = value->rValue; + mod->BSIM3lprtGiven = TRUE; + break; + case BSIM3_MOD_LETA0: + mod->BSIM3leta0 = value->rValue; + mod->BSIM3leta0Given = TRUE; + break; + case BSIM3_MOD_LETAB: + mod->BSIM3letab = value->rValue; + mod->BSIM3letabGiven = TRUE; + break; + case BSIM3_MOD_LPCLM: + mod->BSIM3lpclm = value->rValue; + mod->BSIM3lpclmGiven = TRUE; + break; + case BSIM3_MOD_LPDIBL1: + mod->BSIM3lpdibl1 = value->rValue; + mod->BSIM3lpdibl1Given = TRUE; + break; + case BSIM3_MOD_LPDIBL2: + mod->BSIM3lpdibl2 = value->rValue; + mod->BSIM3lpdibl2Given = TRUE; + break; + case BSIM3_MOD_LPDIBLB: + mod->BSIM3lpdiblb = value->rValue; + mod->BSIM3lpdiblbGiven = TRUE; + break; + case BSIM3_MOD_LPSCBE1: + mod->BSIM3lpscbe1 = value->rValue; + mod->BSIM3lpscbe1Given = TRUE; + break; + case BSIM3_MOD_LPSCBE2: + mod->BSIM3lpscbe2 = value->rValue; + mod->BSIM3lpscbe2Given = TRUE; + break; + case BSIM3_MOD_LPVAG: + mod->BSIM3lpvag = value->rValue; + mod->BSIM3lpvagGiven = TRUE; + break; + case BSIM3_MOD_LWR : + mod->BSIM3lwr = value->rValue; + mod->BSIM3lwrGiven = TRUE; + break; + case BSIM3_MOD_LDWG : + mod->BSIM3ldwg = value->rValue; + mod->BSIM3ldwgGiven = TRUE; + break; + case BSIM3_MOD_LDWB : + mod->BSIM3ldwb = value->rValue; + mod->BSIM3ldwbGiven = TRUE; + break; + case BSIM3_MOD_LB0 : + mod->BSIM3lb0 = value->rValue; + mod->BSIM3lb0Given = TRUE; + break; + case BSIM3_MOD_LB1 : + mod->BSIM3lb1 = value->rValue; + mod->BSIM3lb1Given = TRUE; + break; + case BSIM3_MOD_LALPHA0 : + mod->BSIM3lalpha0 = value->rValue; + mod->BSIM3lalpha0Given = TRUE; + break; + case BSIM3_MOD_LALPHA1 : + mod->BSIM3lalpha1 = value->rValue; + mod->BSIM3lalpha1Given = TRUE; + break; + case BSIM3_MOD_LBETA0 : + mod->BSIM3lbeta0 = value->rValue; + mod->BSIM3lbeta0Given = TRUE; + break; + case BSIM3_MOD_LVFB : + mod->BSIM3lvfb = value->rValue; + mod->BSIM3lvfbGiven = TRUE; + break; - case BSIM3_MOD_LA0: - mod->BSIM3la0 = value->rValue; - mod->BSIM3la0Given = TRUE; - break; - case BSIM3_MOD_LAGS: - mod->BSIM3lags = value->rValue; - mod->BSIM3lagsGiven = TRUE; - break; - case BSIM3_MOD_LA1: - mod->BSIM3la1 = value->rValue; - mod->BSIM3la1Given = TRUE; - break; - case BSIM3_MOD_LA2: - mod->BSIM3la2 = value->rValue; - mod->BSIM3la2Given = TRUE; - break; - case BSIM3_MOD_LAT: - mod->BSIM3lat = value->rValue; - mod->BSIM3latGiven = TRUE; - break; - case BSIM3_MOD_LKETA: - mod->BSIM3lketa = value->rValue; - mod->BSIM3lketaGiven = TRUE; - break; - case BSIM3_MOD_LNSUB: - mod->BSIM3lnsub = value->rValue; - mod->BSIM3lnsubGiven = TRUE; - break; - case BSIM3_MOD_LNPEAK: - mod->BSIM3lnpeak = value->rValue; - mod->BSIM3lnpeakGiven = TRUE; - if (mod->BSIM3lnpeak > 1.0e20) - mod->BSIM3lnpeak *= 1.0e-6; - break; - case BSIM3_MOD_LNGATE: - mod->BSIM3lngate = value->rValue; - mod->BSIM3lngateGiven = TRUE; - if (mod->BSIM3lngate > 1.0e23) - mod->BSIM3lngate *= 1.0e-6; - break; - case BSIM3_MOD_LGAMMA1: - mod->BSIM3lgamma1 = value->rValue; - mod->BSIM3lgamma1Given = TRUE; - break; - case BSIM3_MOD_LGAMMA2: - mod->BSIM3lgamma2 = value->rValue; - mod->BSIM3lgamma2Given = TRUE; - break; - case BSIM3_MOD_LVBX: - mod->BSIM3lvbx = value->rValue; - mod->BSIM3lvbxGiven = TRUE; - break; - case BSIM3_MOD_LVBM: - mod->BSIM3lvbm = value->rValue; - mod->BSIM3lvbmGiven = TRUE; - break; - case BSIM3_MOD_LXT: - mod->BSIM3lxt = value->rValue; - mod->BSIM3lxtGiven = TRUE; - break; - case BSIM3_MOD_LK1: - mod->BSIM3lk1 = value->rValue; - mod->BSIM3lk1Given = TRUE; - break; - case BSIM3_MOD_LKT1: - mod->BSIM3lkt1 = value->rValue; - mod->BSIM3lkt1Given = TRUE; - break; - case BSIM3_MOD_LKT1L: - mod->BSIM3lkt1l = value->rValue; - mod->BSIM3lkt1lGiven = TRUE; - break; - case BSIM3_MOD_LKT2: - mod->BSIM3lkt2 = value->rValue; - mod->BSIM3lkt2Given = TRUE; - break; - case BSIM3_MOD_LK2: - mod->BSIM3lk2 = value->rValue; - mod->BSIM3lk2Given = TRUE; - break; - case BSIM3_MOD_LK3: - mod->BSIM3lk3 = value->rValue; - mod->BSIM3lk3Given = TRUE; - break; - case BSIM3_MOD_LK3B: - mod->BSIM3lk3b = value->rValue; - mod->BSIM3lk3bGiven = TRUE; - break; - case BSIM3_MOD_LNLX: - mod->BSIM3lnlx = value->rValue; - mod->BSIM3lnlxGiven = TRUE; - break; - case BSIM3_MOD_LW0: - mod->BSIM3lw0 = value->rValue; - mod->BSIM3lw0Given = TRUE; - break; - case BSIM3_MOD_LDVT0: - mod->BSIM3ldvt0 = value->rValue; - mod->BSIM3ldvt0Given = TRUE; - break; - case BSIM3_MOD_LDVT1: - mod->BSIM3ldvt1 = value->rValue; - mod->BSIM3ldvt1Given = TRUE; - break; - case BSIM3_MOD_LDVT2: - mod->BSIM3ldvt2 = value->rValue; - mod->BSIM3ldvt2Given = TRUE; - break; - case BSIM3_MOD_LDVT0W: - mod->BSIM3ldvt0w = value->rValue; - mod->BSIM3ldvt0wGiven = TRUE; - break; - case BSIM3_MOD_LDVT1W: - mod->BSIM3ldvt1w = value->rValue; - mod->BSIM3ldvt1wGiven = TRUE; - break; - case BSIM3_MOD_LDVT2W: - mod->BSIM3ldvt2w = value->rValue; - mod->BSIM3ldvt2wGiven = TRUE; - break; - case BSIM3_MOD_LDROUT: - mod->BSIM3ldrout = value->rValue; - mod->BSIM3ldroutGiven = TRUE; - break; - case BSIM3_MOD_LDSUB: - mod->BSIM3ldsub = value->rValue; - mod->BSIM3ldsubGiven = TRUE; - break; - case BSIM3_MOD_LVTH0: - mod->BSIM3lvth0 = value->rValue; - mod->BSIM3lvth0Given = TRUE; - break; - case BSIM3_MOD_LUA: - mod->BSIM3lua = value->rValue; - mod->BSIM3luaGiven = TRUE; - break; - case BSIM3_MOD_LUA1: - mod->BSIM3lua1 = value->rValue; - mod->BSIM3lua1Given = TRUE; - break; - case BSIM3_MOD_LUB: - mod->BSIM3lub = value->rValue; - mod->BSIM3lubGiven = TRUE; - break; - case BSIM3_MOD_LUB1: - mod->BSIM3lub1 = value->rValue; - mod->BSIM3lub1Given = TRUE; - break; - case BSIM3_MOD_LUC: - mod->BSIM3luc = value->rValue; - mod->BSIM3lucGiven = TRUE; - break; - case BSIM3_MOD_LUC1: - mod->BSIM3luc1 = value->rValue; - mod->BSIM3luc1Given = TRUE; - break; - case BSIM3_MOD_LU0: - mod->BSIM3lu0 = value->rValue; - mod->BSIM3lu0Given = TRUE; - break; - case BSIM3_MOD_LUTE: - mod->BSIM3lute = value->rValue; - mod->BSIM3luteGiven = TRUE; - break; - case BSIM3_MOD_LVOFF: - mod->BSIM3lvoff = value->rValue; - mod->BSIM3lvoffGiven = TRUE; - break; - case BSIM3_MOD_LDELTA: - mod->BSIM3ldelta = value->rValue; - mod->BSIM3ldeltaGiven = TRUE; - break; - case BSIM3_MOD_LRDSW: - mod->BSIM3lrdsw = value->rValue; - mod->BSIM3lrdswGiven = TRUE; - break; - case BSIM3_MOD_LPRWB: - mod->BSIM3lprwb = value->rValue; - mod->BSIM3lprwbGiven = TRUE; - break; - case BSIM3_MOD_LPRWG: - mod->BSIM3lprwg = value->rValue; - mod->BSIM3lprwgGiven = TRUE; - break; - case BSIM3_MOD_LPRT: - mod->BSIM3lprt = value->rValue; - mod->BSIM3lprtGiven = TRUE; - break; - case BSIM3_MOD_LETA0: - mod->BSIM3leta0 = value->rValue; - mod->BSIM3leta0Given = TRUE; - break; - case BSIM3_MOD_LETAB: - mod->BSIM3letab = value->rValue; - mod->BSIM3letabGiven = TRUE; - break; - case BSIM3_MOD_LPCLM: - mod->BSIM3lpclm = value->rValue; - mod->BSIM3lpclmGiven = TRUE; - break; - case BSIM3_MOD_LPDIBL1: - mod->BSIM3lpdibl1 = value->rValue; - mod->BSIM3lpdibl1Given = TRUE; - break; - case BSIM3_MOD_LPDIBL2: - mod->BSIM3lpdibl2 = value->rValue; - mod->BSIM3lpdibl2Given = TRUE; - break; - case BSIM3_MOD_LPDIBLB: - mod->BSIM3lpdiblb = value->rValue; - mod->BSIM3lpdiblbGiven = TRUE; - break; - case BSIM3_MOD_LPSCBE1: - mod->BSIM3lpscbe1 = value->rValue; - mod->BSIM3lpscbe1Given = TRUE; - break; - case BSIM3_MOD_LPSCBE2: - mod->BSIM3lpscbe2 = value->rValue; - mod->BSIM3lpscbe2Given = TRUE; - break; - case BSIM3_MOD_LPVAG: - mod->BSIM3lpvag = value->rValue; - mod->BSIM3lpvagGiven = TRUE; - break; - case BSIM3_MOD_LWR: - mod->BSIM3lwr = value->rValue; - mod->BSIM3lwrGiven = TRUE; - break; - case BSIM3_MOD_LDWG: - mod->BSIM3ldwg = value->rValue; - mod->BSIM3ldwgGiven = TRUE; - break; - case BSIM3_MOD_LDWB: - mod->BSIM3ldwb = value->rValue; - mod->BSIM3ldwbGiven = TRUE; - break; - case BSIM3_MOD_LB0: - mod->BSIM3lb0 = value->rValue; - mod->BSIM3lb0Given = TRUE; - break; - case BSIM3_MOD_LB1: - mod->BSIM3lb1 = value->rValue; - mod->BSIM3lb1Given = TRUE; - break; - case BSIM3_MOD_LALPHA0: - mod->BSIM3lalpha0 = value->rValue; - mod->BSIM3lalpha0Given = TRUE; - break; - case BSIM3_MOD_LALPHA1: - mod->BSIM3lalpha1 = value->rValue; - mod->BSIM3lalpha1Given = TRUE; - break; - case BSIM3_MOD_LBETA0: - mod->BSIM3lbeta0 = value->rValue; - mod->BSIM3lbeta0Given = TRUE; - break; - case BSIM3_MOD_LVFB: - mod->BSIM3lvfb = value->rValue; - mod->BSIM3lvfbGiven = TRUE; - break; + case BSIM3_MOD_LELM : + mod->BSIM3lelm = value->rValue; + mod->BSIM3lelmGiven = TRUE; + break; + case BSIM3_MOD_LCGSL : + mod->BSIM3lcgsl = value->rValue; + mod->BSIM3lcgslGiven = TRUE; + break; + case BSIM3_MOD_LCGDL : + mod->BSIM3lcgdl = value->rValue; + mod->BSIM3lcgdlGiven = TRUE; + break; + case BSIM3_MOD_LCKAPPA : + mod->BSIM3lckappa = value->rValue; + mod->BSIM3lckappaGiven = TRUE; + break; + case BSIM3_MOD_LCF : + mod->BSIM3lcf = value->rValue; + mod->BSIM3lcfGiven = TRUE; + break; + case BSIM3_MOD_LCLC : + mod->BSIM3lclc = value->rValue; + mod->BSIM3lclcGiven = TRUE; + break; + case BSIM3_MOD_LCLE : + mod->BSIM3lcle = value->rValue; + mod->BSIM3lcleGiven = TRUE; + break; + case BSIM3_MOD_LVFBCV : + mod->BSIM3lvfbcv = value->rValue; + mod->BSIM3lvfbcvGiven = TRUE; + break; + case BSIM3_MOD_LACDE : + mod->BSIM3lacde = value->rValue; + mod->BSIM3lacdeGiven = TRUE; + break; + case BSIM3_MOD_LMOIN : + mod->BSIM3lmoin = value->rValue; + mod->BSIM3lmoinGiven = TRUE; + break; + case BSIM3_MOD_LNOFF : + mod->BSIM3lnoff = value->rValue; + mod->BSIM3lnoffGiven = TRUE; + break; + case BSIM3_MOD_LVOFFCV : + mod->BSIM3lvoffcv = value->rValue; + mod->BSIM3lvoffcvGiven = TRUE; + break; - case BSIM3_MOD_LELM: - mod->BSIM3lelm = value->rValue; - mod->BSIM3lelmGiven = TRUE; - break; - case BSIM3_MOD_LCGSL: - mod->BSIM3lcgsl = value->rValue; - mod->BSIM3lcgslGiven = TRUE; - break; - case BSIM3_MOD_LCGDL: - mod->BSIM3lcgdl = value->rValue; - mod->BSIM3lcgdlGiven = TRUE; - break; - case BSIM3_MOD_LCKAPPA: - mod->BSIM3lckappa = value->rValue; - mod->BSIM3lckappaGiven = TRUE; - break; - case BSIM3_MOD_LCF: - mod->BSIM3lcf = value->rValue; - mod->BSIM3lcfGiven = TRUE; - break; - case BSIM3_MOD_LCLC: - mod->BSIM3lclc = value->rValue; - mod->BSIM3lclcGiven = TRUE; - break; - case BSIM3_MOD_LCLE: - mod->BSIM3lcle = value->rValue; - mod->BSIM3lcleGiven = TRUE; - break; - case BSIM3_MOD_LVFBCV: - mod->BSIM3lvfbcv = value->rValue; - mod->BSIM3lvfbcvGiven = TRUE; - break; - case BSIM3_MOD_LACDE: - mod->BSIM3lacde = value->rValue; - mod->BSIM3lacdeGiven = TRUE; - break; - case BSIM3_MOD_LMOIN: - mod->BSIM3lmoin = value->rValue; - mod->BSIM3lmoinGiven = TRUE; - break; - case BSIM3_MOD_LNOFF: - mod->BSIM3lnoff = value->rValue; - mod->BSIM3lnoffGiven = TRUE; - break; - case BSIM3_MOD_LVOFFCV: - mod->BSIM3lvoffcv = value->rValue; - mod->BSIM3lvoffcvGiven = TRUE; - break; + /* Width dependence */ + case BSIM3_MOD_WCDSC : + mod->BSIM3wcdsc = value->rValue; + mod->BSIM3wcdscGiven = TRUE; + break; + + + case BSIM3_MOD_WCDSCB : + mod->BSIM3wcdscb = value->rValue; + mod->BSIM3wcdscbGiven = TRUE; + break; + case BSIM3_MOD_WCDSCD : + mod->BSIM3wcdscd = value->rValue; + mod->BSIM3wcdscdGiven = TRUE; + break; + case BSIM3_MOD_WCIT : + mod->BSIM3wcit = value->rValue; + mod->BSIM3wcitGiven = TRUE; + break; + case BSIM3_MOD_WNFACTOR : + mod->BSIM3wnfactor = value->rValue; + mod->BSIM3wnfactorGiven = TRUE; + break; + case BSIM3_MOD_WXJ: + mod->BSIM3wxj = value->rValue; + mod->BSIM3wxjGiven = TRUE; + break; + case BSIM3_MOD_WVSAT: + mod->BSIM3wvsat = value->rValue; + mod->BSIM3wvsatGiven = TRUE; + break; - /* Width dependence */ - case BSIM3_MOD_WCDSC: - mod->BSIM3wcdsc = value->rValue; - mod->BSIM3wcdscGiven = TRUE; - break; + case BSIM3_MOD_WA0: + mod->BSIM3wa0 = value->rValue; + mod->BSIM3wa0Given = TRUE; + break; + case BSIM3_MOD_WAGS: + mod->BSIM3wags = value->rValue; + mod->BSIM3wagsGiven = TRUE; + break; + case BSIM3_MOD_WA1: + mod->BSIM3wa1 = value->rValue; + mod->BSIM3wa1Given = TRUE; + break; + case BSIM3_MOD_WA2: + mod->BSIM3wa2 = value->rValue; + mod->BSIM3wa2Given = TRUE; + break; + case BSIM3_MOD_WAT: + mod->BSIM3wat = value->rValue; + mod->BSIM3watGiven = TRUE; + break; + case BSIM3_MOD_WKETA: + mod->BSIM3wketa = value->rValue; + mod->BSIM3wketaGiven = TRUE; + break; + case BSIM3_MOD_WNSUB: + mod->BSIM3wnsub = value->rValue; + mod->BSIM3wnsubGiven = TRUE; + break; + case BSIM3_MOD_WNPEAK: + mod->BSIM3wnpeak = value->rValue; + mod->BSIM3wnpeakGiven = TRUE; + if (mod->BSIM3wnpeak > 1.0e20) + mod->BSIM3wnpeak *= 1.0e-6; + break; + case BSIM3_MOD_WNGATE: + mod->BSIM3wngate = value->rValue; + mod->BSIM3wngateGiven = TRUE; + if (mod->BSIM3wngate > 1.0e23) + mod->BSIM3wngate *= 1.0e-6; + break; + case BSIM3_MOD_WGAMMA1: + mod->BSIM3wgamma1 = value->rValue; + mod->BSIM3wgamma1Given = TRUE; + break; + case BSIM3_MOD_WGAMMA2: + mod->BSIM3wgamma2 = value->rValue; + mod->BSIM3wgamma2Given = TRUE; + break; + case BSIM3_MOD_WVBX: + mod->BSIM3wvbx = value->rValue; + mod->BSIM3wvbxGiven = TRUE; + break; + case BSIM3_MOD_WVBM: + mod->BSIM3wvbm = value->rValue; + mod->BSIM3wvbmGiven = TRUE; + break; + case BSIM3_MOD_WXT: + mod->BSIM3wxt = value->rValue; + mod->BSIM3wxtGiven = TRUE; + break; + case BSIM3_MOD_WK1: + mod->BSIM3wk1 = value->rValue; + mod->BSIM3wk1Given = TRUE; + break; + case BSIM3_MOD_WKT1: + mod->BSIM3wkt1 = value->rValue; + mod->BSIM3wkt1Given = TRUE; + break; + case BSIM3_MOD_WKT1L: + mod->BSIM3wkt1l = value->rValue; + mod->BSIM3wkt1lGiven = TRUE; + break; + case BSIM3_MOD_WKT2: + mod->BSIM3wkt2 = value->rValue; + mod->BSIM3wkt2Given = TRUE; + break; + case BSIM3_MOD_WK2: + mod->BSIM3wk2 = value->rValue; + mod->BSIM3wk2Given = TRUE; + break; + case BSIM3_MOD_WK3: + mod->BSIM3wk3 = value->rValue; + mod->BSIM3wk3Given = TRUE; + break; + case BSIM3_MOD_WK3B: + mod->BSIM3wk3b = value->rValue; + mod->BSIM3wk3bGiven = TRUE; + break; + case BSIM3_MOD_WNLX: + mod->BSIM3wnlx = value->rValue; + mod->BSIM3wnlxGiven = TRUE; + break; + case BSIM3_MOD_WW0: + mod->BSIM3ww0 = value->rValue; + mod->BSIM3ww0Given = TRUE; + break; + case BSIM3_MOD_WDVT0: + mod->BSIM3wdvt0 = value->rValue; + mod->BSIM3wdvt0Given = TRUE; + break; + case BSIM3_MOD_WDVT1: + mod->BSIM3wdvt1 = value->rValue; + mod->BSIM3wdvt1Given = TRUE; + break; + case BSIM3_MOD_WDVT2: + mod->BSIM3wdvt2 = value->rValue; + mod->BSIM3wdvt2Given = TRUE; + break; + case BSIM3_MOD_WDVT0W: + mod->BSIM3wdvt0w = value->rValue; + mod->BSIM3wdvt0wGiven = TRUE; + break; + case BSIM3_MOD_WDVT1W: + mod->BSIM3wdvt1w = value->rValue; + mod->BSIM3wdvt1wGiven = TRUE; + break; + case BSIM3_MOD_WDVT2W: + mod->BSIM3wdvt2w = value->rValue; + mod->BSIM3wdvt2wGiven = TRUE; + break; + case BSIM3_MOD_WDROUT: + mod->BSIM3wdrout = value->rValue; + mod->BSIM3wdroutGiven = TRUE; + break; + case BSIM3_MOD_WDSUB: + mod->BSIM3wdsub = value->rValue; + mod->BSIM3wdsubGiven = TRUE; + break; + case BSIM3_MOD_WVTH0: + mod->BSIM3wvth0 = value->rValue; + mod->BSIM3wvth0Given = TRUE; + break; + case BSIM3_MOD_WUA: + mod->BSIM3wua = value->rValue; + mod->BSIM3wuaGiven = TRUE; + break; + case BSIM3_MOD_WUA1: + mod->BSIM3wua1 = value->rValue; + mod->BSIM3wua1Given = TRUE; + break; + case BSIM3_MOD_WUB: + mod->BSIM3wub = value->rValue; + mod->BSIM3wubGiven = TRUE; + break; + case BSIM3_MOD_WUB1: + mod->BSIM3wub1 = value->rValue; + mod->BSIM3wub1Given = TRUE; + break; + case BSIM3_MOD_WUC: + mod->BSIM3wuc = value->rValue; + mod->BSIM3wucGiven = TRUE; + break; + case BSIM3_MOD_WUC1: + mod->BSIM3wuc1 = value->rValue; + mod->BSIM3wuc1Given = TRUE; + break; + case BSIM3_MOD_WU0 : + mod->BSIM3wu0 = value->rValue; + mod->BSIM3wu0Given = TRUE; + break; + case BSIM3_MOD_WUTE : + mod->BSIM3wute = value->rValue; + mod->BSIM3wuteGiven = TRUE; + break; + case BSIM3_MOD_WVOFF: + mod->BSIM3wvoff = value->rValue; + mod->BSIM3wvoffGiven = TRUE; + break; + case BSIM3_MOD_WDELTA : + mod->BSIM3wdelta = value->rValue; + mod->BSIM3wdeltaGiven = TRUE; + break; + case BSIM3_MOD_WRDSW: + mod->BSIM3wrdsw = value->rValue; + mod->BSIM3wrdswGiven = TRUE; + break; + case BSIM3_MOD_WPRWB: + mod->BSIM3wprwb = value->rValue; + mod->BSIM3wprwbGiven = TRUE; + break; + case BSIM3_MOD_WPRWG: + mod->BSIM3wprwg = value->rValue; + mod->BSIM3wprwgGiven = TRUE; + break; + case BSIM3_MOD_WPRT: + mod->BSIM3wprt = value->rValue; + mod->BSIM3wprtGiven = TRUE; + break; + case BSIM3_MOD_WETA0: + mod->BSIM3weta0 = value->rValue; + mod->BSIM3weta0Given = TRUE; + break; + case BSIM3_MOD_WETAB: + mod->BSIM3wetab = value->rValue; + mod->BSIM3wetabGiven = TRUE; + break; + case BSIM3_MOD_WPCLM: + mod->BSIM3wpclm = value->rValue; + mod->BSIM3wpclmGiven = TRUE; + break; + case BSIM3_MOD_WPDIBL1: + mod->BSIM3wpdibl1 = value->rValue; + mod->BSIM3wpdibl1Given = TRUE; + break; + case BSIM3_MOD_WPDIBL2: + mod->BSIM3wpdibl2 = value->rValue; + mod->BSIM3wpdibl2Given = TRUE; + break; + case BSIM3_MOD_WPDIBLB: + mod->BSIM3wpdiblb = value->rValue; + mod->BSIM3wpdiblbGiven = TRUE; + break; + case BSIM3_MOD_WPSCBE1: + mod->BSIM3wpscbe1 = value->rValue; + mod->BSIM3wpscbe1Given = TRUE; + break; + case BSIM3_MOD_WPSCBE2: + mod->BSIM3wpscbe2 = value->rValue; + mod->BSIM3wpscbe2Given = TRUE; + break; + case BSIM3_MOD_WPVAG: + mod->BSIM3wpvag = value->rValue; + mod->BSIM3wpvagGiven = TRUE; + break; + case BSIM3_MOD_WWR : + mod->BSIM3wwr = value->rValue; + mod->BSIM3wwrGiven = TRUE; + break; + case BSIM3_MOD_WDWG : + mod->BSIM3wdwg = value->rValue; + mod->BSIM3wdwgGiven = TRUE; + break; + case BSIM3_MOD_WDWB : + mod->BSIM3wdwb = value->rValue; + mod->BSIM3wdwbGiven = TRUE; + break; + case BSIM3_MOD_WB0 : + mod->BSIM3wb0 = value->rValue; + mod->BSIM3wb0Given = TRUE; + break; + case BSIM3_MOD_WB1 : + mod->BSIM3wb1 = value->rValue; + mod->BSIM3wb1Given = TRUE; + break; + case BSIM3_MOD_WALPHA0 : + mod->BSIM3walpha0 = value->rValue; + mod->BSIM3walpha0Given = TRUE; + break; + case BSIM3_MOD_WALPHA1 : + mod->BSIM3walpha1 = value->rValue; + mod->BSIM3walpha1Given = TRUE; + break; + case BSIM3_MOD_WBETA0 : + mod->BSIM3wbeta0 = value->rValue; + mod->BSIM3wbeta0Given = TRUE; + break; + case BSIM3_MOD_WVFB : + mod->BSIM3wvfb = value->rValue; + mod->BSIM3wvfbGiven = TRUE; + break; - case BSIM3_MOD_WCDSCB: - mod->BSIM3wcdscb = value->rValue; - mod->BSIM3wcdscbGiven = TRUE; - break; - case BSIM3_MOD_WCDSCD: - mod->BSIM3wcdscd = value->rValue; - mod->BSIM3wcdscdGiven = TRUE; - break; - case BSIM3_MOD_WCIT: - mod->BSIM3wcit = value->rValue; - mod->BSIM3wcitGiven = TRUE; - break; - case BSIM3_MOD_WNFACTOR: - mod->BSIM3wnfactor = value->rValue; - mod->BSIM3wnfactorGiven = TRUE; - break; - case BSIM3_MOD_WXJ: - mod->BSIM3wxj = value->rValue; - mod->BSIM3wxjGiven = TRUE; - break; - case BSIM3_MOD_WVSAT: - mod->BSIM3wvsat = value->rValue; - mod->BSIM3wvsatGiven = TRUE; - break; + case BSIM3_MOD_WELM : + mod->BSIM3welm = value->rValue; + mod->BSIM3welmGiven = TRUE; + break; + case BSIM3_MOD_WCGSL : + mod->BSIM3wcgsl = value->rValue; + mod->BSIM3wcgslGiven = TRUE; + break; + case BSIM3_MOD_WCGDL : + mod->BSIM3wcgdl = value->rValue; + mod->BSIM3wcgdlGiven = TRUE; + break; + case BSIM3_MOD_WCKAPPA : + mod->BSIM3wckappa = value->rValue; + mod->BSIM3wckappaGiven = TRUE; + break; + case BSIM3_MOD_WCF : + mod->BSIM3wcf = value->rValue; + mod->BSIM3wcfGiven = TRUE; + break; + case BSIM3_MOD_WCLC : + mod->BSIM3wclc = value->rValue; + mod->BSIM3wclcGiven = TRUE; + break; + case BSIM3_MOD_WCLE : + mod->BSIM3wcle = value->rValue; + mod->BSIM3wcleGiven = TRUE; + break; + case BSIM3_MOD_WVFBCV : + mod->BSIM3wvfbcv = value->rValue; + mod->BSIM3wvfbcvGiven = TRUE; + break; + case BSIM3_MOD_WACDE : + mod->BSIM3wacde = value->rValue; + mod->BSIM3wacdeGiven = TRUE; + break; + case BSIM3_MOD_WMOIN : + mod->BSIM3wmoin = value->rValue; + mod->BSIM3wmoinGiven = TRUE; + break; + case BSIM3_MOD_WNOFF : + mod->BSIM3wnoff = value->rValue; + mod->BSIM3wnoffGiven = TRUE; + break; + case BSIM3_MOD_WVOFFCV : + mod->BSIM3wvoffcv = value->rValue; + mod->BSIM3wvoffcvGiven = TRUE; + break; + /* Cross-term dependence */ + case BSIM3_MOD_PCDSC : + mod->BSIM3pcdsc = value->rValue; + mod->BSIM3pcdscGiven = TRUE; + break; - case BSIM3_MOD_WA0: - mod->BSIM3wa0 = value->rValue; - mod->BSIM3wa0Given = TRUE; - break; - case BSIM3_MOD_WAGS: - mod->BSIM3wags = value->rValue; - mod->BSIM3wagsGiven = TRUE; - break; - case BSIM3_MOD_WA1: - mod->BSIM3wa1 = value->rValue; - mod->BSIM3wa1Given = TRUE; - break; - case BSIM3_MOD_WA2: - mod->BSIM3wa2 = value->rValue; - mod->BSIM3wa2Given = TRUE; - break; - case BSIM3_MOD_WAT: - mod->BSIM3wat = value->rValue; - mod->BSIM3watGiven = TRUE; - break; - case BSIM3_MOD_WKETA: - mod->BSIM3wketa = value->rValue; - mod->BSIM3wketaGiven = TRUE; - break; - case BSIM3_MOD_WNSUB: - mod->BSIM3wnsub = value->rValue; - mod->BSIM3wnsubGiven = TRUE; - break; - case BSIM3_MOD_WNPEAK: - mod->BSIM3wnpeak = value->rValue; - mod->BSIM3wnpeakGiven = TRUE; - if (mod->BSIM3wnpeak > 1.0e20) - mod->BSIM3wnpeak *= 1.0e-6; - break; - case BSIM3_MOD_WNGATE: - mod->BSIM3wngate = value->rValue; - mod->BSIM3wngateGiven = TRUE; - if (mod->BSIM3wngate > 1.0e23) - mod->BSIM3wngate *= 1.0e-6; - break; - case BSIM3_MOD_WGAMMA1: - mod->BSIM3wgamma1 = value->rValue; - mod->BSIM3wgamma1Given = TRUE; - break; - case BSIM3_MOD_WGAMMA2: - mod->BSIM3wgamma2 = value->rValue; - mod->BSIM3wgamma2Given = TRUE; - break; - case BSIM3_MOD_WVBX: - mod->BSIM3wvbx = value->rValue; - mod->BSIM3wvbxGiven = TRUE; - break; - case BSIM3_MOD_WVBM: - mod->BSIM3wvbm = value->rValue; - mod->BSIM3wvbmGiven = TRUE; - break; - case BSIM3_MOD_WXT: - mod->BSIM3wxt = value->rValue; - mod->BSIM3wxtGiven = TRUE; - break; - case BSIM3_MOD_WK1: - mod->BSIM3wk1 = value->rValue; - mod->BSIM3wk1Given = TRUE; - break; - case BSIM3_MOD_WKT1: - mod->BSIM3wkt1 = value->rValue; - mod->BSIM3wkt1Given = TRUE; - break; - case BSIM3_MOD_WKT1L: - mod->BSIM3wkt1l = value->rValue; - mod->BSIM3wkt1lGiven = TRUE; - break; - case BSIM3_MOD_WKT2: - mod->BSIM3wkt2 = value->rValue; - mod->BSIM3wkt2Given = TRUE; - break; - case BSIM3_MOD_WK2: - mod->BSIM3wk2 = value->rValue; - mod->BSIM3wk2Given = TRUE; - break; - case BSIM3_MOD_WK3: - mod->BSIM3wk3 = value->rValue; - mod->BSIM3wk3Given = TRUE; - break; - case BSIM3_MOD_WK3B: - mod->BSIM3wk3b = value->rValue; - mod->BSIM3wk3bGiven = TRUE; - break; - case BSIM3_MOD_WNLX: - mod->BSIM3wnlx = value->rValue; - mod->BSIM3wnlxGiven = TRUE; - break; - case BSIM3_MOD_WW0: - mod->BSIM3ww0 = value->rValue; - mod->BSIM3ww0Given = TRUE; - break; - case BSIM3_MOD_WDVT0: - mod->BSIM3wdvt0 = value->rValue; - mod->BSIM3wdvt0Given = TRUE; - break; - case BSIM3_MOD_WDVT1: - mod->BSIM3wdvt1 = value->rValue; - mod->BSIM3wdvt1Given = TRUE; - break; - case BSIM3_MOD_WDVT2: - mod->BSIM3wdvt2 = value->rValue; - mod->BSIM3wdvt2Given = TRUE; - break; - case BSIM3_MOD_WDVT0W: - mod->BSIM3wdvt0w = value->rValue; - mod->BSIM3wdvt0wGiven = TRUE; - break; - case BSIM3_MOD_WDVT1W: - mod->BSIM3wdvt1w = value->rValue; - mod->BSIM3wdvt1wGiven = TRUE; - break; - case BSIM3_MOD_WDVT2W: - mod->BSIM3wdvt2w = value->rValue; - mod->BSIM3wdvt2wGiven = TRUE; - break; - case BSIM3_MOD_WDROUT: - mod->BSIM3wdrout = value->rValue; - mod->BSIM3wdroutGiven = TRUE; - break; - case BSIM3_MOD_WDSUB: - mod->BSIM3wdsub = value->rValue; - mod->BSIM3wdsubGiven = TRUE; - break; - case BSIM3_MOD_WVTH0: - mod->BSIM3wvth0 = value->rValue; - mod->BSIM3wvth0Given = TRUE; - break; - case BSIM3_MOD_WUA: - mod->BSIM3wua = value->rValue; - mod->BSIM3wuaGiven = TRUE; - break; - case BSIM3_MOD_WUA1: - mod->BSIM3wua1 = value->rValue; - mod->BSIM3wua1Given = TRUE; - break; - case BSIM3_MOD_WUB: - mod->BSIM3wub = value->rValue; - mod->BSIM3wubGiven = TRUE; - break; - case BSIM3_MOD_WUB1: - mod->BSIM3wub1 = value->rValue; - mod->BSIM3wub1Given = TRUE; - break; - case BSIM3_MOD_WUC: - mod->BSIM3wuc = value->rValue; - mod->BSIM3wucGiven = TRUE; - break; - case BSIM3_MOD_WUC1: - mod->BSIM3wuc1 = value->rValue; - mod->BSIM3wuc1Given = TRUE; - break; - case BSIM3_MOD_WU0: - mod->BSIM3wu0 = value->rValue; - mod->BSIM3wu0Given = TRUE; - break; - case BSIM3_MOD_WUTE: - mod->BSIM3wute = value->rValue; - mod->BSIM3wuteGiven = TRUE; - break; - case BSIM3_MOD_WVOFF: - mod->BSIM3wvoff = value->rValue; - mod->BSIM3wvoffGiven = TRUE; - break; - case BSIM3_MOD_WDELTA: - mod->BSIM3wdelta = value->rValue; - mod->BSIM3wdeltaGiven = TRUE; - break; - case BSIM3_MOD_WRDSW: - mod->BSIM3wrdsw = value->rValue; - mod->BSIM3wrdswGiven = TRUE; - break; - case BSIM3_MOD_WPRWB: - mod->BSIM3wprwb = value->rValue; - mod->BSIM3wprwbGiven = TRUE; - break; - case BSIM3_MOD_WPRWG: - mod->BSIM3wprwg = value->rValue; - mod->BSIM3wprwgGiven = TRUE; - break; - case BSIM3_MOD_WPRT: - mod->BSIM3wprt = value->rValue; - mod->BSIM3wprtGiven = TRUE; - break; - case BSIM3_MOD_WETA0: - mod->BSIM3weta0 = value->rValue; - mod->BSIM3weta0Given = TRUE; - break; - case BSIM3_MOD_WETAB: - mod->BSIM3wetab = value->rValue; - mod->BSIM3wetabGiven = TRUE; - break; - case BSIM3_MOD_WPCLM: - mod->BSIM3wpclm = value->rValue; - mod->BSIM3wpclmGiven = TRUE; - break; - case BSIM3_MOD_WPDIBL1: - mod->BSIM3wpdibl1 = value->rValue; - mod->BSIM3wpdibl1Given = TRUE; - break; - case BSIM3_MOD_WPDIBL2: - mod->BSIM3wpdibl2 = value->rValue; - mod->BSIM3wpdibl2Given = TRUE; - break; - case BSIM3_MOD_WPDIBLB: - mod->BSIM3wpdiblb = value->rValue; - mod->BSIM3wpdiblbGiven = TRUE; - break; - case BSIM3_MOD_WPSCBE1: - mod->BSIM3wpscbe1 = value->rValue; - mod->BSIM3wpscbe1Given = TRUE; - break; - case BSIM3_MOD_WPSCBE2: - mod->BSIM3wpscbe2 = value->rValue; - mod->BSIM3wpscbe2Given = TRUE; - break; - case BSIM3_MOD_WPVAG: - mod->BSIM3wpvag = value->rValue; - mod->BSIM3wpvagGiven = TRUE; - break; - case BSIM3_MOD_WWR: - mod->BSIM3wwr = value->rValue; - mod->BSIM3wwrGiven = TRUE; - break; - case BSIM3_MOD_WDWG: - mod->BSIM3wdwg = value->rValue; - mod->BSIM3wdwgGiven = TRUE; - break; - case BSIM3_MOD_WDWB: - mod->BSIM3wdwb = value->rValue; - mod->BSIM3wdwbGiven = TRUE; - break; - case BSIM3_MOD_WB0: - mod->BSIM3wb0 = value->rValue; - mod->BSIM3wb0Given = TRUE; - break; - case BSIM3_MOD_WB1: - mod->BSIM3wb1 = value->rValue; - mod->BSIM3wb1Given = TRUE; - break; - case BSIM3_MOD_WALPHA0: - mod->BSIM3walpha0 = value->rValue; - mod->BSIM3walpha0Given = TRUE; - break; - case BSIM3_MOD_WALPHA1: - mod->BSIM3walpha1 = value->rValue; - mod->BSIM3walpha1Given = TRUE; - break; - case BSIM3_MOD_WBETA0: - mod->BSIM3wbeta0 = value->rValue; - mod->BSIM3wbeta0Given = TRUE; - break; - case BSIM3_MOD_WVFB: - mod->BSIM3wvfb = value->rValue; - mod->BSIM3wvfbGiven = TRUE; - break; - case BSIM3_MOD_WELM: - mod->BSIM3welm = value->rValue; - mod->BSIM3welmGiven = TRUE; - break; - case BSIM3_MOD_WCGSL: - mod->BSIM3wcgsl = value->rValue; - mod->BSIM3wcgslGiven = TRUE; - break; - case BSIM3_MOD_WCGDL: - mod->BSIM3wcgdl = value->rValue; - mod->BSIM3wcgdlGiven = TRUE; - break; - case BSIM3_MOD_WCKAPPA: - mod->BSIM3wckappa = value->rValue; - mod->BSIM3wckappaGiven = TRUE; - break; - case BSIM3_MOD_WCF: - mod->BSIM3wcf = value->rValue; - mod->BSIM3wcfGiven = TRUE; - break; - case BSIM3_MOD_WCLC: - mod->BSIM3wclc = value->rValue; - mod->BSIM3wclcGiven = TRUE; - break; - case BSIM3_MOD_WCLE: - mod->BSIM3wcle = value->rValue; - mod->BSIM3wcleGiven = TRUE; - break; - case BSIM3_MOD_WVFBCV: - mod->BSIM3wvfbcv = value->rValue; - mod->BSIM3wvfbcvGiven = TRUE; - break; - case BSIM3_MOD_WACDE: - mod->BSIM3wacde = value->rValue; - mod->BSIM3wacdeGiven = TRUE; - break; - case BSIM3_MOD_WMOIN: - mod->BSIM3wmoin = value->rValue; - mod->BSIM3wmoinGiven = TRUE; - break; - case BSIM3_MOD_WNOFF: - mod->BSIM3wnoff = value->rValue; - mod->BSIM3wnoffGiven = TRUE; - break; - case BSIM3_MOD_WVOFFCV: - mod->BSIM3wvoffcv = value->rValue; - mod->BSIM3wvoffcvGiven = TRUE; - break; + case BSIM3_MOD_PCDSCB : + mod->BSIM3pcdscb = value->rValue; + mod->BSIM3pcdscbGiven = TRUE; + break; + case BSIM3_MOD_PCDSCD : + mod->BSIM3pcdscd = value->rValue; + mod->BSIM3pcdscdGiven = TRUE; + break; + case BSIM3_MOD_PCIT : + mod->BSIM3pcit = value->rValue; + mod->BSIM3pcitGiven = TRUE; + break; + case BSIM3_MOD_PNFACTOR : + mod->BSIM3pnfactor = value->rValue; + mod->BSIM3pnfactorGiven = TRUE; + break; + case BSIM3_MOD_PXJ: + mod->BSIM3pxj = value->rValue; + mod->BSIM3pxjGiven = TRUE; + break; + case BSIM3_MOD_PVSAT: + mod->BSIM3pvsat = value->rValue; + mod->BSIM3pvsatGiven = TRUE; + break; - /* Cross-term dependence */ - case BSIM3_MOD_PCDSC: - mod->BSIM3pcdsc = value->rValue; - mod->BSIM3pcdscGiven = TRUE; - break; + case BSIM3_MOD_PA0: + mod->BSIM3pa0 = value->rValue; + mod->BSIM3pa0Given = TRUE; + break; + case BSIM3_MOD_PAGS: + mod->BSIM3pags = value->rValue; + mod->BSIM3pagsGiven = TRUE; + break; + case BSIM3_MOD_PA1: + mod->BSIM3pa1 = value->rValue; + mod->BSIM3pa1Given = TRUE; + break; + case BSIM3_MOD_PA2: + mod->BSIM3pa2 = value->rValue; + mod->BSIM3pa2Given = TRUE; + break; + case BSIM3_MOD_PAT: + mod->BSIM3pat = value->rValue; + mod->BSIM3patGiven = TRUE; + break; + case BSIM3_MOD_PKETA: + mod->BSIM3pketa = value->rValue; + mod->BSIM3pketaGiven = TRUE; + break; + case BSIM3_MOD_PNSUB: + mod->BSIM3pnsub = value->rValue; + mod->BSIM3pnsubGiven = TRUE; + break; + case BSIM3_MOD_PNPEAK: + mod->BSIM3pnpeak = value->rValue; + mod->BSIM3pnpeakGiven = TRUE; + if (mod->BSIM3pnpeak > 1.0e20) + mod->BSIM3pnpeak *= 1.0e-6; + break; + case BSIM3_MOD_PNGATE: + mod->BSIM3pngate = value->rValue; + mod->BSIM3pngateGiven = TRUE; + if (mod->BSIM3pngate > 1.0e23) + mod->BSIM3pngate *= 1.0e-6; + break; + case BSIM3_MOD_PGAMMA1: + mod->BSIM3pgamma1 = value->rValue; + mod->BSIM3pgamma1Given = TRUE; + break; + case BSIM3_MOD_PGAMMA2: + mod->BSIM3pgamma2 = value->rValue; + mod->BSIM3pgamma2Given = TRUE; + break; + case BSIM3_MOD_PVBX: + mod->BSIM3pvbx = value->rValue; + mod->BSIM3pvbxGiven = TRUE; + break; + case BSIM3_MOD_PVBM: + mod->BSIM3pvbm = value->rValue; + mod->BSIM3pvbmGiven = TRUE; + break; + case BSIM3_MOD_PXT: + mod->BSIM3pxt = value->rValue; + mod->BSIM3pxtGiven = TRUE; + break; + case BSIM3_MOD_PK1: + mod->BSIM3pk1 = value->rValue; + mod->BSIM3pk1Given = TRUE; + break; + case BSIM3_MOD_PKT1: + mod->BSIM3pkt1 = value->rValue; + mod->BSIM3pkt1Given = TRUE; + break; + case BSIM3_MOD_PKT1L: + mod->BSIM3pkt1l = value->rValue; + mod->BSIM3pkt1lGiven = TRUE; + break; + case BSIM3_MOD_PKT2: + mod->BSIM3pkt2 = value->rValue; + mod->BSIM3pkt2Given = TRUE; + break; + case BSIM3_MOD_PK2: + mod->BSIM3pk2 = value->rValue; + mod->BSIM3pk2Given = TRUE; + break; + case BSIM3_MOD_PK3: + mod->BSIM3pk3 = value->rValue; + mod->BSIM3pk3Given = TRUE; + break; + case BSIM3_MOD_PK3B: + mod->BSIM3pk3b = value->rValue; + mod->BSIM3pk3bGiven = TRUE; + break; + case BSIM3_MOD_PNLX: + mod->BSIM3pnlx = value->rValue; + mod->BSIM3pnlxGiven = TRUE; + break; + case BSIM3_MOD_PW0: + mod->BSIM3pw0 = value->rValue; + mod->BSIM3pw0Given = TRUE; + break; + case BSIM3_MOD_PDVT0: + mod->BSIM3pdvt0 = value->rValue; + mod->BSIM3pdvt0Given = TRUE; + break; + case BSIM3_MOD_PDVT1: + mod->BSIM3pdvt1 = value->rValue; + mod->BSIM3pdvt1Given = TRUE; + break; + case BSIM3_MOD_PDVT2: + mod->BSIM3pdvt2 = value->rValue; + mod->BSIM3pdvt2Given = TRUE; + break; + case BSIM3_MOD_PDVT0W: + mod->BSIM3pdvt0w = value->rValue; + mod->BSIM3pdvt0wGiven = TRUE; + break; + case BSIM3_MOD_PDVT1W: + mod->BSIM3pdvt1w = value->rValue; + mod->BSIM3pdvt1wGiven = TRUE; + break; + case BSIM3_MOD_PDVT2W: + mod->BSIM3pdvt2w = value->rValue; + mod->BSIM3pdvt2wGiven = TRUE; + break; + case BSIM3_MOD_PDROUT: + mod->BSIM3pdrout = value->rValue; + mod->BSIM3pdroutGiven = TRUE; + break; + case BSIM3_MOD_PDSUB: + mod->BSIM3pdsub = value->rValue; + mod->BSIM3pdsubGiven = TRUE; + break; + case BSIM3_MOD_PVTH0: + mod->BSIM3pvth0 = value->rValue; + mod->BSIM3pvth0Given = TRUE; + break; + case BSIM3_MOD_PUA: + mod->BSIM3pua = value->rValue; + mod->BSIM3puaGiven = TRUE; + break; + case BSIM3_MOD_PUA1: + mod->BSIM3pua1 = value->rValue; + mod->BSIM3pua1Given = TRUE; + break; + case BSIM3_MOD_PUB: + mod->BSIM3pub = value->rValue; + mod->BSIM3pubGiven = TRUE; + break; + case BSIM3_MOD_PUB1: + mod->BSIM3pub1 = value->rValue; + mod->BSIM3pub1Given = TRUE; + break; + case BSIM3_MOD_PUC: + mod->BSIM3puc = value->rValue; + mod->BSIM3pucGiven = TRUE; + break; + case BSIM3_MOD_PUC1: + mod->BSIM3puc1 = value->rValue; + mod->BSIM3puc1Given = TRUE; + break; + case BSIM3_MOD_PU0 : + mod->BSIM3pu0 = value->rValue; + mod->BSIM3pu0Given = TRUE; + break; + case BSIM3_MOD_PUTE : + mod->BSIM3pute = value->rValue; + mod->BSIM3puteGiven = TRUE; + break; + case BSIM3_MOD_PVOFF: + mod->BSIM3pvoff = value->rValue; + mod->BSIM3pvoffGiven = TRUE; + break; + case BSIM3_MOD_PDELTA : + mod->BSIM3pdelta = value->rValue; + mod->BSIM3pdeltaGiven = TRUE; + break; + case BSIM3_MOD_PRDSW: + mod->BSIM3prdsw = value->rValue; + mod->BSIM3prdswGiven = TRUE; + break; + case BSIM3_MOD_PPRWB: + mod->BSIM3pprwb = value->rValue; + mod->BSIM3pprwbGiven = TRUE; + break; + case BSIM3_MOD_PPRWG: + mod->BSIM3pprwg = value->rValue; + mod->BSIM3pprwgGiven = TRUE; + break; + case BSIM3_MOD_PPRT: + mod->BSIM3pprt = value->rValue; + mod->BSIM3pprtGiven = TRUE; + break; + case BSIM3_MOD_PETA0: + mod->BSIM3peta0 = value->rValue; + mod->BSIM3peta0Given = TRUE; + break; + case BSIM3_MOD_PETAB: + mod->BSIM3petab = value->rValue; + mod->BSIM3petabGiven = TRUE; + break; + case BSIM3_MOD_PPCLM: + mod->BSIM3ppclm = value->rValue; + mod->BSIM3ppclmGiven = TRUE; + break; + case BSIM3_MOD_PPDIBL1: + mod->BSIM3ppdibl1 = value->rValue; + mod->BSIM3ppdibl1Given = TRUE; + break; + case BSIM3_MOD_PPDIBL2: + mod->BSIM3ppdibl2 = value->rValue; + mod->BSIM3ppdibl2Given = TRUE; + break; + case BSIM3_MOD_PPDIBLB: + mod->BSIM3ppdiblb = value->rValue; + mod->BSIM3ppdiblbGiven = TRUE; + break; + case BSIM3_MOD_PPSCBE1: + mod->BSIM3ppscbe1 = value->rValue; + mod->BSIM3ppscbe1Given = TRUE; + break; + case BSIM3_MOD_PPSCBE2: + mod->BSIM3ppscbe2 = value->rValue; + mod->BSIM3ppscbe2Given = TRUE; + break; + case BSIM3_MOD_PPVAG: + mod->BSIM3ppvag = value->rValue; + mod->BSIM3ppvagGiven = TRUE; + break; + case BSIM3_MOD_PWR : + mod->BSIM3pwr = value->rValue; + mod->BSIM3pwrGiven = TRUE; + break; + case BSIM3_MOD_PDWG : + mod->BSIM3pdwg = value->rValue; + mod->BSIM3pdwgGiven = TRUE; + break; + case BSIM3_MOD_PDWB : + mod->BSIM3pdwb = value->rValue; + mod->BSIM3pdwbGiven = TRUE; + break; + case BSIM3_MOD_PB0 : + mod->BSIM3pb0 = value->rValue; + mod->BSIM3pb0Given = TRUE; + break; + case BSIM3_MOD_PB1 : + mod->BSIM3pb1 = value->rValue; + mod->BSIM3pb1Given = TRUE; + break; + case BSIM3_MOD_PALPHA0 : + mod->BSIM3palpha0 = value->rValue; + mod->BSIM3palpha0Given = TRUE; + break; + case BSIM3_MOD_PALPHA1 : + mod->BSIM3palpha1 = value->rValue; + mod->BSIM3palpha1Given = TRUE; + break; + case BSIM3_MOD_PBETA0 : + mod->BSIM3pbeta0 = value->rValue; + mod->BSIM3pbeta0Given = TRUE; + break; + case BSIM3_MOD_PVFB : + mod->BSIM3pvfb = value->rValue; + mod->BSIM3pvfbGiven = TRUE; + break; - case BSIM3_MOD_PCDSCB: - mod->BSIM3pcdscb = value->rValue; - mod->BSIM3pcdscbGiven = TRUE; - break; - case BSIM3_MOD_PCDSCD: - mod->BSIM3pcdscd = value->rValue; - mod->BSIM3pcdscdGiven = TRUE; - break; - case BSIM3_MOD_PCIT: - mod->BSIM3pcit = value->rValue; - mod->BSIM3pcitGiven = TRUE; - break; - case BSIM3_MOD_PNFACTOR: - mod->BSIM3pnfactor = value->rValue; - mod->BSIM3pnfactorGiven = TRUE; - break; - case BSIM3_MOD_PXJ: - mod->BSIM3pxj = value->rValue; - mod->BSIM3pxjGiven = TRUE; - break; - case BSIM3_MOD_PVSAT: - mod->BSIM3pvsat = value->rValue; - mod->BSIM3pvsatGiven = TRUE; - break; + case BSIM3_MOD_PELM : + mod->BSIM3pelm = value->rValue; + mod->BSIM3pelmGiven = TRUE; + break; + case BSIM3_MOD_PCGSL : + mod->BSIM3pcgsl = value->rValue; + mod->BSIM3pcgslGiven = TRUE; + break; + case BSIM3_MOD_PCGDL : + mod->BSIM3pcgdl = value->rValue; + mod->BSIM3pcgdlGiven = TRUE; + break; + case BSIM3_MOD_PCKAPPA : + mod->BSIM3pckappa = value->rValue; + mod->BSIM3pckappaGiven = TRUE; + break; + case BSIM3_MOD_PCF : + mod->BSIM3pcf = value->rValue; + mod->BSIM3pcfGiven = TRUE; + break; + case BSIM3_MOD_PCLC : + mod->BSIM3pclc = value->rValue; + mod->BSIM3pclcGiven = TRUE; + break; + case BSIM3_MOD_PCLE : + mod->BSIM3pcle = value->rValue; + mod->BSIM3pcleGiven = TRUE; + break; + case BSIM3_MOD_PVFBCV : + mod->BSIM3pvfbcv = value->rValue; + mod->BSIM3pvfbcvGiven = TRUE; + break; + case BSIM3_MOD_PACDE : + mod->BSIM3pacde = value->rValue; + mod->BSIM3pacdeGiven = TRUE; + break; + case BSIM3_MOD_PMOIN : + mod->BSIM3pmoin = value->rValue; + mod->BSIM3pmoinGiven = TRUE; + break; + case BSIM3_MOD_PNOFF : + mod->BSIM3pnoff = value->rValue; + mod->BSIM3pnoffGiven = TRUE; + break; + case BSIM3_MOD_PVOFFCV : + mod->BSIM3pvoffcv = value->rValue; + mod->BSIM3pvoffcvGiven = TRUE; + break; + case BSIM3_MOD_TNOM : + mod->BSIM3tnom = value->rValue + 273.15; + mod->BSIM3tnomGiven = TRUE; + break; + case BSIM3_MOD_CGSO : + mod->BSIM3cgso = value->rValue; + mod->BSIM3cgsoGiven = TRUE; + break; + case BSIM3_MOD_CGDO : + mod->BSIM3cgdo = value->rValue; + mod->BSIM3cgdoGiven = TRUE; + break; + case BSIM3_MOD_CGBO : + mod->BSIM3cgbo = value->rValue; + mod->BSIM3cgboGiven = TRUE; + break; + case BSIM3_MOD_XPART : + mod->BSIM3xpart = value->rValue; + mod->BSIM3xpartGiven = TRUE; + break; + case BSIM3_MOD_RSH : + mod->BSIM3sheetResistance = value->rValue; + mod->BSIM3sheetResistanceGiven = TRUE; + break; + case BSIM3_MOD_JS : + mod->BSIM3jctSatCurDensity = value->rValue; + mod->BSIM3jctSatCurDensityGiven = TRUE; + break; + case BSIM3_MOD_JSW : + mod->BSIM3jctSidewallSatCurDensity = value->rValue; + mod->BSIM3jctSidewallSatCurDensityGiven = TRUE; + break; + case BSIM3_MOD_PB : + mod->BSIM3bulkJctPotential = value->rValue; + mod->BSIM3bulkJctPotentialGiven = TRUE; + break; + case BSIM3_MOD_MJ : + mod->BSIM3bulkJctBotGradingCoeff = value->rValue; + mod->BSIM3bulkJctBotGradingCoeffGiven = TRUE; + break; + case BSIM3_MOD_PBSW : + mod->BSIM3sidewallJctPotential = value->rValue; + mod->BSIM3sidewallJctPotentialGiven = TRUE; + break; + case BSIM3_MOD_MJSW : + mod->BSIM3bulkJctSideGradingCoeff = value->rValue; + mod->BSIM3bulkJctSideGradingCoeffGiven = TRUE; + break; + case BSIM3_MOD_CJ : + mod->BSIM3unitAreaJctCap = value->rValue; + mod->BSIM3unitAreaJctCapGiven = TRUE; + break; + case BSIM3_MOD_CJSW : + mod->BSIM3unitLengthSidewallJctCap = value->rValue; + mod->BSIM3unitLengthSidewallJctCapGiven = TRUE; + break; + case BSIM3_MOD_NJ : + mod->BSIM3jctEmissionCoeff = value->rValue; + mod->BSIM3jctEmissionCoeffGiven = TRUE; + break; + case BSIM3_MOD_PBSWG : + mod->BSIM3GatesidewallJctPotential = value->rValue; + mod->BSIM3GatesidewallJctPotentialGiven = TRUE; + break; + case BSIM3_MOD_MJSWG : + mod->BSIM3bulkJctGateSideGradingCoeff = value->rValue; + mod->BSIM3bulkJctGateSideGradingCoeffGiven = TRUE; + break; + case BSIM3_MOD_CJSWG : + mod->BSIM3unitLengthGateSidewallJctCap = value->rValue; + mod->BSIM3unitLengthGateSidewallJctCapGiven = TRUE; + break; + case BSIM3_MOD_XTI : + mod->BSIM3jctTempExponent = value->rValue; + mod->BSIM3jctTempExponentGiven = TRUE; + break; + case BSIM3_MOD_LINT : + mod->BSIM3Lint = value->rValue; + mod->BSIM3LintGiven = TRUE; + break; + case BSIM3_MOD_LL : + mod->BSIM3Ll = value->rValue; + mod->BSIM3LlGiven = TRUE; + break; + case BSIM3_MOD_LLC : + mod->BSIM3Llc = value->rValue; + mod->BSIM3LlcGiven = TRUE; + break; + case BSIM3_MOD_LLN : + mod->BSIM3Lln = value->rValue; + mod->BSIM3LlnGiven = TRUE; + break; + case BSIM3_MOD_LW : + mod->BSIM3Lw = value->rValue; + mod->BSIM3LwGiven = TRUE; + break; + case BSIM3_MOD_LWC : + mod->BSIM3Lwc = value->rValue; + mod->BSIM3LwcGiven = TRUE; + break; + case BSIM3_MOD_LWN : + mod->BSIM3Lwn = value->rValue; + mod->BSIM3LwnGiven = TRUE; + break; + case BSIM3_MOD_LWL : + mod->BSIM3Lwl = value->rValue; + mod->BSIM3LwlGiven = TRUE; + break; + case BSIM3_MOD_LWLC : + mod->BSIM3Lwlc = value->rValue; + mod->BSIM3LwlcGiven = TRUE; + break; + case BSIM3_MOD_LMIN : + mod->BSIM3Lmin = value->rValue; + mod->BSIM3LminGiven = TRUE; + break; + case BSIM3_MOD_LMAX : + mod->BSIM3Lmax = value->rValue; + mod->BSIM3LmaxGiven = TRUE; + break; + case BSIM3_MOD_WINT : + mod->BSIM3Wint = value->rValue; + mod->BSIM3WintGiven = TRUE; + break; + case BSIM3_MOD_WL : + mod->BSIM3Wl = value->rValue; + mod->BSIM3WlGiven = TRUE; + break; + case BSIM3_MOD_WLC : + mod->BSIM3Wlc = value->rValue; + mod->BSIM3WlcGiven = TRUE; + break; + case BSIM3_MOD_WLN : + mod->BSIM3Wln = value->rValue; + mod->BSIM3WlnGiven = TRUE; + break; + case BSIM3_MOD_WW : + mod->BSIM3Ww = value->rValue; + mod->BSIM3WwGiven = TRUE; + break; + case BSIM3_MOD_WWC : + mod->BSIM3Wwc = value->rValue; + mod->BSIM3WwcGiven = TRUE; + break; + case BSIM3_MOD_WWN : + mod->BSIM3Wwn = value->rValue; + mod->BSIM3WwnGiven = TRUE; + break; + case BSIM3_MOD_WWL : + mod->BSIM3Wwl = value->rValue; + mod->BSIM3WwlGiven = TRUE; + break; + case BSIM3_MOD_WWLC : + mod->BSIM3Wwlc = value->rValue; + mod->BSIM3WwlcGiven = TRUE; + break; + case BSIM3_MOD_WMIN : + mod->BSIM3Wmin = value->rValue; + mod->BSIM3WminGiven = TRUE; + break; + case BSIM3_MOD_WMAX : + mod->BSIM3Wmax = value->rValue; + mod->BSIM3WmaxGiven = TRUE; + break; - case BSIM3_MOD_PA0: - mod->BSIM3pa0 = value->rValue; - mod->BSIM3pa0Given = TRUE; - break; - case BSIM3_MOD_PAGS: - mod->BSIM3pags = value->rValue; - mod->BSIM3pagsGiven = TRUE; - break; - case BSIM3_MOD_PA1: - mod->BSIM3pa1 = value->rValue; - mod->BSIM3pa1Given = TRUE; - break; - case BSIM3_MOD_PA2: - mod->BSIM3pa2 = value->rValue; - mod->BSIM3pa2Given = TRUE; - break; - case BSIM3_MOD_PAT: - mod->BSIM3pat = value->rValue; - mod->BSIM3patGiven = TRUE; - break; - case BSIM3_MOD_PKETA: - mod->BSIM3pketa = value->rValue; - mod->BSIM3pketaGiven = TRUE; - break; - case BSIM3_MOD_PNSUB: - mod->BSIM3pnsub = value->rValue; - mod->BSIM3pnsubGiven = TRUE; - break; - case BSIM3_MOD_PNPEAK: - mod->BSIM3pnpeak = value->rValue; - mod->BSIM3pnpeakGiven = TRUE; - if (mod->BSIM3pnpeak > 1.0e20) - mod->BSIM3pnpeak *= 1.0e-6; - break; - case BSIM3_MOD_PNGATE: - mod->BSIM3pngate = value->rValue; - mod->BSIM3pngateGiven = TRUE; - if (mod->BSIM3pngate > 1.0e23) - mod->BSIM3pngate *= 1.0e-6; - break; - case BSIM3_MOD_PGAMMA1: - mod->BSIM3pgamma1 = value->rValue; - mod->BSIM3pgamma1Given = TRUE; - break; - case BSIM3_MOD_PGAMMA2: - mod->BSIM3pgamma2 = value->rValue; - mod->BSIM3pgamma2Given = TRUE; - break; - case BSIM3_MOD_PVBX: - mod->BSIM3pvbx = value->rValue; - mod->BSIM3pvbxGiven = TRUE; - break; - case BSIM3_MOD_PVBM: - mod->BSIM3pvbm = value->rValue; - mod->BSIM3pvbmGiven = TRUE; - break; - case BSIM3_MOD_PXT: - mod->BSIM3pxt = value->rValue; - mod->BSIM3pxtGiven = TRUE; - break; - case BSIM3_MOD_PK1: - mod->BSIM3pk1 = value->rValue; - mod->BSIM3pk1Given = TRUE; - break; - case BSIM3_MOD_PKT1: - mod->BSIM3pkt1 = value->rValue; - mod->BSIM3pkt1Given = TRUE; - break; - case BSIM3_MOD_PKT1L: - mod->BSIM3pkt1l = value->rValue; - mod->BSIM3pkt1lGiven = TRUE; - break; - case BSIM3_MOD_PKT2: - mod->BSIM3pkt2 = value->rValue; - mod->BSIM3pkt2Given = TRUE; - break; - case BSIM3_MOD_PK2: - mod->BSIM3pk2 = value->rValue; - mod->BSIM3pk2Given = TRUE; - break; - case BSIM3_MOD_PK3: - mod->BSIM3pk3 = value->rValue; - mod->BSIM3pk3Given = TRUE; - break; - case BSIM3_MOD_PK3B: - mod->BSIM3pk3b = value->rValue; - mod->BSIM3pk3bGiven = TRUE; - break; - case BSIM3_MOD_PNLX: - mod->BSIM3pnlx = value->rValue; - mod->BSIM3pnlxGiven = TRUE; - break; - case BSIM3_MOD_PW0: - mod->BSIM3pw0 = value->rValue; - mod->BSIM3pw0Given = TRUE; - break; - case BSIM3_MOD_PDVT0: - mod->BSIM3pdvt0 = value->rValue; - mod->BSIM3pdvt0Given = TRUE; - break; - case BSIM3_MOD_PDVT1: - mod->BSIM3pdvt1 = value->rValue; - mod->BSIM3pdvt1Given = TRUE; - break; - case BSIM3_MOD_PDVT2: - mod->BSIM3pdvt2 = value->rValue; - mod->BSIM3pdvt2Given = TRUE; - break; - case BSIM3_MOD_PDVT0W: - mod->BSIM3pdvt0w = value->rValue; - mod->BSIM3pdvt0wGiven = TRUE; - break; - case BSIM3_MOD_PDVT1W: - mod->BSIM3pdvt1w = value->rValue; - mod->BSIM3pdvt1wGiven = TRUE; - break; - case BSIM3_MOD_PDVT2W: - mod->BSIM3pdvt2w = value->rValue; - mod->BSIM3pdvt2wGiven = TRUE; - break; - case BSIM3_MOD_PDROUT: - mod->BSIM3pdrout = value->rValue; - mod->BSIM3pdroutGiven = TRUE; - break; - case BSIM3_MOD_PDSUB: - mod->BSIM3pdsub = value->rValue; - mod->BSIM3pdsubGiven = TRUE; - break; - case BSIM3_MOD_PVTH0: - mod->BSIM3pvth0 = value->rValue; - mod->BSIM3pvth0Given = TRUE; - break; - case BSIM3_MOD_PUA: - mod->BSIM3pua = value->rValue; - mod->BSIM3puaGiven = TRUE; - break; - case BSIM3_MOD_PUA1: - mod->BSIM3pua1 = value->rValue; - mod->BSIM3pua1Given = TRUE; - break; - case BSIM3_MOD_PUB: - mod->BSIM3pub = value->rValue; - mod->BSIM3pubGiven = TRUE; - break; - case BSIM3_MOD_PUB1: - mod->BSIM3pub1 = value->rValue; - mod->BSIM3pub1Given = TRUE; - break; - case BSIM3_MOD_PUC: - mod->BSIM3puc = value->rValue; - mod->BSIM3pucGiven = TRUE; - break; - case BSIM3_MOD_PUC1: - mod->BSIM3puc1 = value->rValue; - mod->BSIM3puc1Given = TRUE; - break; - case BSIM3_MOD_PU0: - mod->BSIM3pu0 = value->rValue; - mod->BSIM3pu0Given = TRUE; - break; - case BSIM3_MOD_PUTE: - mod->BSIM3pute = value->rValue; - mod->BSIM3puteGiven = TRUE; - break; - case BSIM3_MOD_PVOFF: - mod->BSIM3pvoff = value->rValue; - mod->BSIM3pvoffGiven = TRUE; - break; - case BSIM3_MOD_PDELTA: - mod->BSIM3pdelta = value->rValue; - mod->BSIM3pdeltaGiven = TRUE; - break; - case BSIM3_MOD_PRDSW: - mod->BSIM3prdsw = value->rValue; - mod->BSIM3prdswGiven = TRUE; - break; - case BSIM3_MOD_PPRWB: - mod->BSIM3pprwb = value->rValue; - mod->BSIM3pprwbGiven = TRUE; - break; - case BSIM3_MOD_PPRWG: - mod->BSIM3pprwg = value->rValue; - mod->BSIM3pprwgGiven = TRUE; - break; - case BSIM3_MOD_PPRT: - mod->BSIM3pprt = value->rValue; - mod->BSIM3pprtGiven = TRUE; - break; - case BSIM3_MOD_PETA0: - mod->BSIM3peta0 = value->rValue; - mod->BSIM3peta0Given = TRUE; - break; - case BSIM3_MOD_PETAB: - mod->BSIM3petab = value->rValue; - mod->BSIM3petabGiven = TRUE; - break; - case BSIM3_MOD_PPCLM: - mod->BSIM3ppclm = value->rValue; - mod->BSIM3ppclmGiven = TRUE; - break; - case BSIM3_MOD_PPDIBL1: - mod->BSIM3ppdibl1 = value->rValue; - mod->BSIM3ppdibl1Given = TRUE; - break; - case BSIM3_MOD_PPDIBL2: - mod->BSIM3ppdibl2 = value->rValue; - mod->BSIM3ppdibl2Given = TRUE; - break; - case BSIM3_MOD_PPDIBLB: - mod->BSIM3ppdiblb = value->rValue; - mod->BSIM3ppdiblbGiven = TRUE; - break; - case BSIM3_MOD_PPSCBE1: - mod->BSIM3ppscbe1 = value->rValue; - mod->BSIM3ppscbe1Given = TRUE; - break; - case BSIM3_MOD_PPSCBE2: - mod->BSIM3ppscbe2 = value->rValue; - mod->BSIM3ppscbe2Given = TRUE; - break; - case BSIM3_MOD_PPVAG: - mod->BSIM3ppvag = value->rValue; - mod->BSIM3ppvagGiven = TRUE; - break; - case BSIM3_MOD_PWR: - mod->BSIM3pwr = value->rValue; - mod->BSIM3pwrGiven = TRUE; - break; - case BSIM3_MOD_PDWG: - mod->BSIM3pdwg = value->rValue; - mod->BSIM3pdwgGiven = TRUE; - break; - case BSIM3_MOD_PDWB: - mod->BSIM3pdwb = value->rValue; - mod->BSIM3pdwbGiven = TRUE; - break; - case BSIM3_MOD_PB0: - mod->BSIM3pb0 = value->rValue; - mod->BSIM3pb0Given = TRUE; - break; - case BSIM3_MOD_PB1: - mod->BSIM3pb1 = value->rValue; - mod->BSIM3pb1Given = TRUE; - break; - case BSIM3_MOD_PALPHA0: - mod->BSIM3palpha0 = value->rValue; - mod->BSIM3palpha0Given = TRUE; - break; - case BSIM3_MOD_PALPHA1: - mod->BSIM3palpha1 = value->rValue; - mod->BSIM3palpha1Given = TRUE; - break; - case BSIM3_MOD_PBETA0: - mod->BSIM3pbeta0 = value->rValue; - mod->BSIM3pbeta0Given = TRUE; - break; - case BSIM3_MOD_PVFB: - mod->BSIM3pvfb = value->rValue; - mod->BSIM3pvfbGiven = TRUE; - break; - - case BSIM3_MOD_PELM: - mod->BSIM3pelm = value->rValue; - mod->BSIM3pelmGiven = TRUE; - break; - case BSIM3_MOD_PCGSL: - mod->BSIM3pcgsl = value->rValue; - mod->BSIM3pcgslGiven = TRUE; - break; - case BSIM3_MOD_PCGDL: - mod->BSIM3pcgdl = value->rValue; - mod->BSIM3pcgdlGiven = TRUE; - break; - case BSIM3_MOD_PCKAPPA: - mod->BSIM3pckappa = value->rValue; - mod->BSIM3pckappaGiven = TRUE; - break; - case BSIM3_MOD_PCF: - mod->BSIM3pcf = value->rValue; - mod->BSIM3pcfGiven = TRUE; - break; - case BSIM3_MOD_PCLC: - mod->BSIM3pclc = value->rValue; - mod->BSIM3pclcGiven = TRUE; - break; - case BSIM3_MOD_PCLE: - mod->BSIM3pcle = value->rValue; - mod->BSIM3pcleGiven = TRUE; - break; - case BSIM3_MOD_PVFBCV: - mod->BSIM3pvfbcv = value->rValue; - mod->BSIM3pvfbcvGiven = TRUE; - break; - case BSIM3_MOD_PACDE: - mod->BSIM3pacde = value->rValue; - mod->BSIM3pacdeGiven = TRUE; - break; - case BSIM3_MOD_PMOIN: - mod->BSIM3pmoin = value->rValue; - mod->BSIM3pmoinGiven = TRUE; - break; - case BSIM3_MOD_PNOFF: - mod->BSIM3pnoff = value->rValue; - mod->BSIM3pnoffGiven = TRUE; - break; - case BSIM3_MOD_PVOFFCV: - mod->BSIM3pvoffcv = value->rValue; - mod->BSIM3pvoffcvGiven = TRUE; - break; - - case BSIM3_MOD_TNOM: - mod->BSIM3tnom = value->rValue + 273.15; - mod->BSIM3tnomGiven = TRUE; - break; - case BSIM3_MOD_CGSO: - mod->BSIM3cgso = value->rValue; - mod->BSIM3cgsoGiven = TRUE; - break; - case BSIM3_MOD_CGDO: - mod->BSIM3cgdo = value->rValue; - mod->BSIM3cgdoGiven = TRUE; - break; - case BSIM3_MOD_CGBO: - mod->BSIM3cgbo = value->rValue; - mod->BSIM3cgboGiven = TRUE; - break; - case BSIM3_MOD_XPART: - mod->BSIM3xpart = value->rValue; - mod->BSIM3xpartGiven = TRUE; - break; - case BSIM3_MOD_RSH: - mod->BSIM3sheetResistance = value->rValue; - mod->BSIM3sheetResistanceGiven = TRUE; - break; - case BSIM3_MOD_JS: - mod->BSIM3jctSatCurDensity = value->rValue; - mod->BSIM3jctSatCurDensityGiven = TRUE; - break; - case BSIM3_MOD_JSW: - mod->BSIM3jctSidewallSatCurDensity = value->rValue; - mod->BSIM3jctSidewallSatCurDensityGiven = TRUE; - break; - case BSIM3_MOD_PB: - mod->BSIM3bulkJctPotential = value->rValue; - mod->BSIM3bulkJctPotentialGiven = TRUE; - break; - case BSIM3_MOD_MJ: - mod->BSIM3bulkJctBotGradingCoeff = value->rValue; - mod->BSIM3bulkJctBotGradingCoeffGiven = TRUE; - break; - case BSIM3_MOD_PBSW: - mod->BSIM3sidewallJctPotential = value->rValue; - mod->BSIM3sidewallJctPotentialGiven = TRUE; - break; - case BSIM3_MOD_MJSW: - mod->BSIM3bulkJctSideGradingCoeff = value->rValue; - mod->BSIM3bulkJctSideGradingCoeffGiven = TRUE; - break; - case BSIM3_MOD_CJ: - mod->BSIM3unitAreaJctCap = value->rValue; - mod->BSIM3unitAreaJctCapGiven = TRUE; - break; - case BSIM3_MOD_CJSW: - mod->BSIM3unitLengthSidewallJctCap = value->rValue; - mod->BSIM3unitLengthSidewallJctCapGiven = TRUE; - break; - case BSIM3_MOD_NJ: - mod->BSIM3jctEmissionCoeff = value->rValue; - mod->BSIM3jctEmissionCoeffGiven = TRUE; - break; - case BSIM3_MOD_PBSWG: - mod->BSIM3GatesidewallJctPotential = value->rValue; - mod->BSIM3GatesidewallJctPotentialGiven = TRUE; - break; - case BSIM3_MOD_MJSWG: - mod->BSIM3bulkJctGateSideGradingCoeff = value->rValue; - mod->BSIM3bulkJctGateSideGradingCoeffGiven = TRUE; - break; - case BSIM3_MOD_CJSWG: - mod->BSIM3unitLengthGateSidewallJctCap = value->rValue; - mod->BSIM3unitLengthGateSidewallJctCapGiven = TRUE; - break; - case BSIM3_MOD_XTI: - mod->BSIM3jctTempExponent = value->rValue; - mod->BSIM3jctTempExponentGiven = TRUE; - break; - case BSIM3_MOD_LINT: - mod->BSIM3Lint = value->rValue; - mod->BSIM3LintGiven = TRUE; - break; - case BSIM3_MOD_LL: - mod->BSIM3Ll = value->rValue; - mod->BSIM3LlGiven = TRUE; - break; - case BSIM3_MOD_LLC: - mod->BSIM3Llc = value->rValue; - mod->BSIM3LlcGiven = TRUE; - break; - case BSIM3_MOD_LLN: - mod->BSIM3Lln = value->rValue; - mod->BSIM3LlnGiven = TRUE; - break; - case BSIM3_MOD_LW: - mod->BSIM3Lw = value->rValue; - mod->BSIM3LwGiven = TRUE; - break; - case BSIM3_MOD_LWC: - mod->BSIM3Lwc = value->rValue; - mod->BSIM3LwcGiven = TRUE; - break; - case BSIM3_MOD_LWN: - mod->BSIM3Lwn = value->rValue; - mod->BSIM3LwnGiven = TRUE; - break; - case BSIM3_MOD_LWL: - mod->BSIM3Lwl = value->rValue; - mod->BSIM3LwlGiven = TRUE; - break; - case BSIM3_MOD_LWLC: - mod->BSIM3Lwlc = value->rValue; - mod->BSIM3LwlcGiven = TRUE; - break; - case BSIM3_MOD_LMIN: - mod->BSIM3Lmin = value->rValue; - mod->BSIM3LminGiven = TRUE; - break; - case BSIM3_MOD_LMAX: - mod->BSIM3Lmax = value->rValue; - mod->BSIM3LmaxGiven = TRUE; - break; - case BSIM3_MOD_WINT: - mod->BSIM3Wint = value->rValue; - mod->BSIM3WintGiven = TRUE; - break; - case BSIM3_MOD_WL: - mod->BSIM3Wl = value->rValue; - mod->BSIM3WlGiven = TRUE; - break; - case BSIM3_MOD_WLC: - mod->BSIM3Wlc = value->rValue; - mod->BSIM3WlcGiven = TRUE; - break; - case BSIM3_MOD_WLN: - mod->BSIM3Wln = value->rValue; - mod->BSIM3WlnGiven = TRUE; - break; - case BSIM3_MOD_WW: - mod->BSIM3Ww = value->rValue; - mod->BSIM3WwGiven = TRUE; - break; - case BSIM3_MOD_WWC: - mod->BSIM3Wwc = value->rValue; - mod->BSIM3WwcGiven = TRUE; - break; - case BSIM3_MOD_WWN: - mod->BSIM3Wwn = value->rValue; - mod->BSIM3WwnGiven = TRUE; - break; - case BSIM3_MOD_WWL: - mod->BSIM3Wwl = value->rValue; - mod->BSIM3WwlGiven = TRUE; - break; - case BSIM3_MOD_WWLC: - mod->BSIM3Wwlc = value->rValue; - mod->BSIM3WwlcGiven = TRUE; - break; - case BSIM3_MOD_WMIN: - mod->BSIM3Wmin = value->rValue; - mod->BSIM3WminGiven = TRUE; - break; - case BSIM3_MOD_WMAX: - mod->BSIM3Wmax = value->rValue; - mod->BSIM3WmaxGiven = TRUE; - break; - - case BSIM3_MOD_NOIA: - mod->BSIM3oxideTrapDensityA = value->rValue; - mod->BSIM3oxideTrapDensityAGiven = TRUE; - break; - case BSIM3_MOD_NOIB: - mod->BSIM3oxideTrapDensityB = value->rValue; - mod->BSIM3oxideTrapDensityBGiven = TRUE; - break; - case BSIM3_MOD_NOIC: - mod->BSIM3oxideTrapDensityC = value->rValue; - mod->BSIM3oxideTrapDensityCGiven = TRUE; - break; - case BSIM3_MOD_EM: - mod->BSIM3em = value->rValue; - mod->BSIM3emGiven = TRUE; - break; - case BSIM3_MOD_EF: - mod->BSIM3ef = value->rValue; - mod->BSIM3efGiven = TRUE; - break; - case BSIM3_MOD_AF: - mod->BSIM3af = value->rValue; - mod->BSIM3afGiven = TRUE; - break; - case BSIM3_MOD_KF: - mod->BSIM3kf = value->rValue; - mod->BSIM3kfGiven = TRUE; - break; - case BSIM3_MOD_NMOS: - if (value->iValue) - { - mod->BSIM3type = 1; - mod->BSIM3typeGiven = TRUE; - } - break; - case BSIM3_MOD_PMOS: - if (value->iValue) - { - mod->BSIM3type = -1; - mod->BSIM3typeGiven = TRUE; - } - break; - default: - return (E_BADPARM); + case BSIM3_MOD_NOIA : + mod->BSIM3oxideTrapDensityA = value->rValue; + mod->BSIM3oxideTrapDensityAGiven = TRUE; + break; + case BSIM3_MOD_NOIB : + mod->BSIM3oxideTrapDensityB = value->rValue; + mod->BSIM3oxideTrapDensityBGiven = TRUE; + break; + case BSIM3_MOD_NOIC : + mod->BSIM3oxideTrapDensityC = value->rValue; + mod->BSIM3oxideTrapDensityCGiven = TRUE; + break; + case BSIM3_MOD_EM : + mod->BSIM3em = value->rValue; + mod->BSIM3emGiven = TRUE; + break; + case BSIM3_MOD_EF : + mod->BSIM3ef = value->rValue; + mod->BSIM3efGiven = TRUE; + break; + case BSIM3_MOD_AF : + mod->BSIM3af = value->rValue; + mod->BSIM3afGiven = TRUE; + break; + case BSIM3_MOD_KF : + mod->BSIM3kf = value->rValue; + mod->BSIM3kfGiven = TRUE; + break; + case BSIM3_MOD_NMOS : + if(value->iValue) { + mod->BSIM3type = 1; + mod->BSIM3typeGiven = TRUE; + } + break; + case BSIM3_MOD_PMOS : + if(value->iValue) { + mod->BSIM3type = - 1; + mod->BSIM3typeGiven = TRUE; + } + break; + default: + return(E_BADPARM); } - return (OK); + return(OK); } + + diff --git a/src/spicelib/devices/bsim3/b3noi.c b/src/spicelib/devices/bsim3/b3noi.c index 425dfc6dc..7263c79f7 100644 --- a/src/spicelib/devices/bsim3/b3noi.c +++ b/src/spicelib/devices/bsim3/b3noi.c @@ -1,19 +1,30 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Gary W. Ng and Min-Chie Jeng. -Author: 1997-1999 Weidong Liu. -File: b3noi.c -**********/ + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3noi.c of BSIM3v3.2.4 + * Author: 1995 Gary W. Ng and Min-Chie Jeng. + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Xuemei Xi, 10/05, 12/21, 2001. + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + + +/*************************************/ #include "ngspice.h" -#include -#include #include "bsim3def.h" #include "cktdefs.h" #include "iferrmsg.h" #include "noisedef.h" #include "suffix.h" -#include "const.h" /* jwan */ +#include "const.h" /* jwan */ /* * BSIM3noise (mode, operation, firstModel, ckt, data, OnDens) @@ -41,344 +52,513 @@ File: b3noi.c Flicker noise = SPICE2 model */ -extern void NevalSrc(); -extern double Nintegrate(); +extern void NevalSrc (); +extern double Nintegrate (); + + +/* + * The StrongInversionNoiseEval function has been modified in + * the release 3.2.4 of BSIM3 model. To accomodate both the old + * and the new code, I have renamed according to the following: + * + * + * BSIM3v3.2.4 -> StrongInversionNoiseEvalNew + * Previous -> StrongInversionNoiseEvalOld + * + * 2002 Paolo Nenzi + */ + + +/* + * JX: 1/f noise model is smoothed out 12/18/01. + */ double -StrongInversionNoiseEval(vgs, vds, model, here, freq, temp) -double vgs, vds, freq, temp; -BSIM3model *model; -BSIM3instance *here; +StrongInversionNoiseEvalNew (double Vds, BSIM3model * model, + BSIM3instance * here, double freq, double temp) { -struct bsim3SizeDependParam *pParam; -double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; - - pParam = here->pParam; - cd = fabs(here->BSIM3cd); - if (vds > here->BSIM3vdsat) - { esat = 2.0 * pParam->BSIM3vsattemp / here->BSIM3ueff; - T0 = ((((vds - here->BSIM3vdsat) / pParam->BSIM3litl) + model->BSIM3em) - / esat); - DelClm = pParam->BSIM3litl * log (MAX(T0, N_MINLOG)); + struct bsim3SizeDependParam *pParam; + double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; + double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi; + + pParam = here->pParam; + cd = fabs (here->BSIM3cd) * here->BSIM3m; + esat = 2.0 * pParam->BSIM3vsattemp / here->BSIM3ueff; + if (model->BSIM3em <= 0.0) + DelClm = 0.0; + else + { + T0 = ((((Vds - here->BSIM3Vdseff) / pParam->BSIM3litl) + + model->BSIM3em) / esat); + DelClm = pParam->BSIM3litl * log (MAX (T0, N_MINLOG)); } - else - DelClm = 0.0; - EffFreq = pow(freq, model->BSIM3ef); - T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->BSIM3ueff; - T2 = 1.0e8 * EffFreq * model->BSIM3cox - * pParam->BSIM3leff * pParam->BSIM3leff; - Vgst = vgs - here->BSIM3von; - N0 = model->BSIM3cox * Vgst / CHARGE; - if (N0 < 0.0) - N0 = 0.0; - Nl = model->BSIM3cox * (Vgst - MIN(vds, here->BSIM3vdsat)) / CHARGE; - if (Nl < 0.0) - Nl = 0.0; - - T3 = model->BSIM3oxideTrapDensityA - * log(MAX(((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); - T4 = model->BSIM3oxideTrapDensityB * (N0 - Nl); - T5 = model->BSIM3oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = 8.62e-5 * temp * cd * cd; - T7 = 1.0e8 * EffFreq * pParam->BSIM3leff - * pParam->BSIM3leff * pParam->BSIM3weff; - T8 = model->BSIM3oxideTrapDensityA + model->BSIM3oxideTrapDensityB * Nl - + model->BSIM3oxideTrapDensityC * Nl * Nl; - T9 = (Nl + 2.0e14) * (Nl + 2.0e14); - - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - return Ssi; + EffFreq = pow (freq, model->BSIM3ef); + T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->BSIM3ueff; + T2 = 1.0e8 * EffFreq * here->BSIM3Abulk * model->BSIM3cox + * pParam->BSIM3leff * pParam->BSIM3leff; + N0 = model->BSIM3cox * here->BSIM3Vgsteff / CHARGE; + Nl = model->BSIM3cox * here->BSIM3Vgsteff + * (1.0 - here->BSIM3AbovVgst2Vtm * here->BSIM3Vdseff) / CHARGE; + + T3 = model->BSIM3oxideTrapDensityA + * log (MAX (((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); + T4 = model->BSIM3oxideTrapDensityB * (N0 - Nl); + T5 = model->BSIM3oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); + + T6 = 8.62e-5 * temp * cd * cd; + T7 = 1.0e8 * EffFreq * pParam->BSIM3leff + * pParam->BSIM3leff * pParam->BSIM3weff * here->BSIM3m; + T8 = model->BSIM3oxideTrapDensityA + + model->BSIM3oxideTrapDensityB * Nl + + model->BSIM3oxideTrapDensityC * Nl * Nl; + T9 = (Nl + 2.0e14) * (Nl + 2.0e14); + + Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; + return Ssi; +} + + + +/* + * The code for releases: BSIM3V32, BSIM3V322, BSIM3V323 + * follows + */ + +double +StrongInversionNoiseEvalOld (double vgs, double vds, BSIM3model * model, + BSIM3instance * here, double freq, double temp) +{ + struct bsim3SizeDependParam *pParam; + double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; + double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi; + + pParam = here->pParam; + cd = fabs (here->BSIM3cd) * here->BSIM3m; + if (model->BSIM3em <= 0.0) /* flicker noise modified -JX */ + DelClm = 0.0; + else if (vds > here->BSIM3vdsat) + { + esat = 2.0 * pParam->BSIM3vsattemp / here->BSIM3ueff; + T0 = ((((vds - here->BSIM3vdsat) / pParam->BSIM3litl) + + model->BSIM3em) / esat); + DelClm = pParam->BSIM3litl * log (MAX (T0, N_MINLOG)); + } + else + DelClm = 0.0; + EffFreq = pow (freq, model->BSIM3ef); + T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->BSIM3ueff; + T2 = 1.0e8 * EffFreq * model->BSIM3cox + * pParam->BSIM3leff * pParam->BSIM3leff; + Vgst = vgs - here->BSIM3von; + N0 = model->BSIM3cox * Vgst / CHARGE; + if (N0 < 0.0) + N0 = 0.0; + Nl = model->BSIM3cox * (Vgst - MIN (vds, here->BSIM3vdsat)) / CHARGE; + if (Nl < 0.0) + Nl = 0.0; + + T3 = model->BSIM3oxideTrapDensityA + * log (MAX (((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); + T4 = model->BSIM3oxideTrapDensityB * (N0 - Nl); + T5 = model->BSIM3oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); + + T6 = 8.62e-5 * temp * cd * cd; + T7 = 1.0e8 * EffFreq * pParam->BSIM3leff + * pParam->BSIM3leff * pParam->BSIM3weff * here->BSIM3m; + T8 = model->BSIM3oxideTrapDensityA + + model->BSIM3oxideTrapDensityB * Nl + + model->BSIM3oxideTrapDensityC * Nl * Nl; + T9 = (Nl + 2.0e14) * (Nl + 2.0e14); + + Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; + return Ssi; } + + int -BSIM3noise (mode, operation, inModel, ckt, data, OnDens) -int mode, operation; -GENmodel *inModel; -CKTcircuit *ckt; -Ndata *data; -double *OnDens; +BSIM3noise (int mode, int operation, GENmodel * inModel, CKTcircuit * ckt, + Ndata * data, double *OnDens) { -BSIM3model *model = (BSIM3model *)inModel; -BSIM3instance *here; -struct bsim3SizeDependParam *pParam; -char name[N_MXVLNTH]; -double tempOnoise; -double tempInoise; -double noizDens[BSIM3NSRCS]; -double lnNdens[BSIM3NSRCS]; - -double vgs, vds, Slimit; - double T1, T10, T11; -double Ssi, Swi; - -int i; - - /* define the names of the noise sources */ - static char *BSIM3nNames[BSIM3NSRCS] = - { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - /* consistent with thestrchr definitions */ - ".rs", /* noise due to rs */ - /* in BSIM3defs.h */ - ".id", /* noise due to id */ - ".1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ - }; - - for (; model != NULL; model = model->BSIM3nextModel) - { for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) - { 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 < BSIM3NSRCS; i++) - { (void) sprintf(name, "onoise.%s%s", - here->BSIM3name, - BSIM3nNames[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 < BSIM3NSRCS; i++) - { (void) sprintf(name, "onoise_total.%s%s", - here->BSIM3name, - BSIM3nNames[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->BSIM3name, - BSIM3nNames[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; - } - } + BSIM3model *model = (BSIM3model *) inModel; + BSIM3instance *here; + struct bsim3SizeDependParam *pParam; + char name[N_MXVLNTH]; + double tempOnoise; + double tempInoise; + double noizDens[BSIM3NSRCS]; + double lnNdens[BSIM3NSRCS]; + + double vgs, vds, Slimit; + double N0, Nl; + double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13; + double n, ExpArg, Ssi, Swi; + + int error, i; + + /* define the names of the noise sources */ + static char *BSIM3nNames[BSIM3NSRCS] = { /* Note that we have to keep the order */ + ".rd", /* noise due to rd */ + /* consistent with the index definitions */ + ".rs", /* noise due to rs */ + /* in BSIM3defs.h */ + ".id", /* noise due to id */ + ".1overf", /* flicker (1/f) noise */ + "" /* total transistor noise */ + }; + + for (; model != NULL; model = model->BSIM3nextModel) + { + for (here = model->BSIM3instances; here != NULL; + here = here->BSIM3nextInstance) + { + if (here->BSIM3owner != ARCHme) + continue; + 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 < BSIM3NSRCS; i++) + { + (void) sprintf (name, + "onoise.%s%s", + here->BSIM3name, BSIM3nNames[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 < BSIM3NSRCS; i++) + { + (void) sprintf (name, + "onoise_total.%s%s", + here->BSIM3name, BSIM3nNames[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->BSIM3name, BSIM3nNames[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: + NevalSrc (&noizDens[BSIM3RDNOIZ], + &lnNdens[BSIM3RDNOIZ], ckt, + THERMNOISE, + here->BSIM3dNodePrime, + here->BSIM3dNode, + here->BSIM3drainConductance * here->BSIM3m); + NevalSrc (&noizDens[BSIM3RSNOIZ], + &lnNdens[BSIM3RSNOIZ], ckt, + THERMNOISE, + here->BSIM3sNodePrime, + here->BSIM3sNode, + here->BSIM3sourceConductance * here->BSIM3m); + + switch (model->BSIM3noiMod) + { + case 1: + case 3: + NevalSrc (&noizDens + [BSIM3IDNOIZ], + &lnNdens + [BSIM3IDNOIZ], ckt, + THERMNOISE, + here-> + BSIM3dNodePrime, + here-> + BSIM3sNodePrime, + (2.0 / 3.0 * + fabs (here-> + BSIM3gm + + here-> + BSIM3gds + + here->BSIM3gmbs)) * here->BSIM3m); + + break; + case 2: + case 4: + NevalSrc (&noizDens[BSIM3IDNOIZ], &lnNdens[BSIM3IDNOIZ], ckt, + THERMNOISE, here->BSIM3dNodePrime, here->BSIM3sNodePrime, + (here->BSIM3ueff * fabs (here->BSIM3qinv) * here->BSIM3m / + (pParam->BSIM3leff * pParam->BSIM3leff + here->BSIM3ueff * + fabs (here->BSIM3qinv) * here->BSIM3m * + (here->BSIM3rds / here->BSIM3m)))); /* bugfix */ + + break; - case N_CALC: - switch (mode) - { case N_DENS: - NevalSrc(&noizDens[BSIM3RDNOIZ], - &lnNdens[BSIM3RDNOIZ], ckt, THERMNOISE, - here->BSIM3dNodePrime, here->BSIM3dNode, - here->BSIM3drainConductance); - - NevalSrc(&noizDens[BSIM3RSNOIZ], - &lnNdens[BSIM3RSNOIZ], ckt, THERMNOISE, - here->BSIM3sNodePrime, here->BSIM3sNode, - here->BSIM3sourceConductance); - - switch( model->BSIM3noiMod ) - { case 1: - case 3: - NevalSrc(&noizDens[BSIM3IDNOIZ], - &lnNdens[BSIM3IDNOIZ], ckt, - THERMNOISE, here->BSIM3dNodePrime, - here->BSIM3sNodePrime, - (2.0 / 3.0 * fabs(here->BSIM3gm - + here->BSIM3gds - + here->BSIM3gmbs))); - break; - case 2: - case 4: - NevalSrc(&noizDens[BSIM3IDNOIZ], - &lnNdens[BSIM3IDNOIZ], ckt, - THERMNOISE, here->BSIM3dNodePrime, - here->BSIM3sNodePrime, - (here->BSIM3ueff - * fabs(here->BSIM3qinv - / (pParam->BSIM3leff - * pParam->BSIM3leff)))); - break; - } - NevalSrc(&noizDens[BSIM3FLNOIZ], (double*) NULL, - ckt, N_GAIN, here->BSIM3dNodePrime, - here->BSIM3sNodePrime, (double) 0.0); - - switch( model->BSIM3noiMod ) - { case 1: - case 4: - noizDens[BSIM3FLNOIZ] *= model->BSIM3kf - * exp(model->BSIM3af - * log(MAX(fabs(here->BSIM3cd), - N_MINLOG))) - / (pow(data->freq, model->BSIM3ef) - * pParam->BSIM3leff - * pParam->BSIM3leff - * model->BSIM3cox); - break; - case 2: - case 3: - vgs = *(ckt->CKTstates[0] + here->BSIM3vgs); - vds = *(ckt->CKTstates[0] + here->BSIM3vds); - if (vds < 0.0) - { vds = -vds; - vgs = vgs + vds; - } - if (vgs >= here->BSIM3von + 0.1) - { Ssi = StrongInversionNoiseEval(vgs, - vds, model, here, data->freq, - ckt->CKTtemp); - noizDens[BSIM3FLNOIZ] *= Ssi; - } - else - { pParam = here->pParam; - T10 = model->BSIM3oxideTrapDensityA - * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->BSIM3weff - * pParam->BSIM3leff - * pow(data->freq, model->BSIM3ef) - * 4.0e36; - Swi = T10 / T11 * here->BSIM3cd - * here->BSIM3cd; - Slimit = StrongInversionNoiseEval( - here->BSIM3von + 0.1, vds, model, - here, data->freq, ckt->CKTtemp); - T1 = Swi + Slimit; - if (T1 > 0.0) - noizDens[BSIM3FLNOIZ] *= (Slimit - * Swi) / T1; - else - noizDens[BSIM3FLNOIZ] *= 0.0; - } - break; - } - - lnNdens[BSIM3FLNOIZ] = - log(MAX(noizDens[BSIM3FLNOIZ], N_MINLOG)); - - noizDens[BSIM3TOTNOIZ] = noizDens[BSIM3RDNOIZ] - + noizDens[BSIM3RSNOIZ] - + noizDens[BSIM3IDNOIZ] - + noizDens[BSIM3FLNOIZ]; - lnNdens[BSIM3TOTNOIZ] = - log(MAX(noizDens[BSIM3TOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[BSIM3TOTNOIZ]; - - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for (i = 0; i < BSIM3NSRCS; i++) - { here->BSIM3nVar[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 < BSIM3NSRCS; i++) - { here->BSIM3nVar[OUTNOIZ][i] = 0.0; - here->BSIM3nVar[INNOIZ][i] = 0.0; - } - } - } + } + NevalSrc (&noizDens[BSIM3FLNOIZ], + (double *) NULL, ckt, + N_GAIN, + here->BSIM3dNodePrime, + here->BSIM3sNodePrime, (double) 0.0); + + + + switch (model->BSIM3noiMod) + { + case 1: + case 4: + noizDens[BSIM3FLNOIZ] *= + model->BSIM3kf * + exp (model->BSIM3af * + log (MAX + (fabs + (here-> + BSIM3cd * + here-> + BSIM3m), + N_MINLOG))) + / + (pow + (data->freq, + model->BSIM3ef) * + pParam->BSIM3leff * + pParam->BSIM3leff * model->BSIM3cox); + + + break; + case 2: + case 3: + vgs = *(ckt->CKTstates[0] + here->BSIM3vgs); + vds = *(ckt->CKTstates[0] + here->BSIM3vds); + if (vds < 0.0) + { + vds = -vds; + vgs = vgs + vds; + } + /* Added revision dependent code */ + if (model->BSIM3intVersion == BSIM3V324) + { + Ssi = + StrongInversionNoiseEvalNew (vds, model, here, + data->freq, + ckt->CKTtemp); + T10 = + model->BSIM3oxideTrapDensityA * 8.62e-5 * + ckt->CKTtemp; + T11 = + pParam->BSIM3weff * here->BSIM3m * + pParam->BSIM3leff * pow (data->freq, + model->BSIM3ef) * 4.0e36; + Swi = + T10 / T11 * here->BSIM3cd * here->BSIM3m * + here->BSIM3cd * here->BSIM3m; + T1 = Swi + Ssi; + if (T1 > 0.0) + noizDens[BSIM3FLNOIZ] *= (Ssi * Swi) / T1; + else + noizDens[BSIM3FLNOIZ] *= 0.0; + } + else + { /*BSIM3V32 || BSIM3V322 || BSIM3V323 */ + if (vgs >= here->BSIM3von + 0.1) + { + Ssi = + StrongInversionNoiseEvalOld (vgs, vds, model, + here, data->freq, + ckt->CKTtemp); + noizDens[BSIM3FLNOIZ] *= Ssi; + } + else + { + pParam = here->pParam; + T10 = model-> + BSIM3oxideTrapDensityA + * 8.62e-5 * ckt->CKTtemp; + T11 = pParam->BSIM3weff * + here->BSIM3m * pParam-> BSIM3leff * + pow (data->freq, model->BSIM3ef) * 4.0e36; + Swi = T10 / T11 * (here->BSIM3cd * here->BSIM3m) * (here->BSIM3cd * here->BSIM3m); + + Slimit = + StrongInversionNoiseEvalOld (here->BSIM3von + + 0.1, vds, model, + here, data->freq, + ckt->CKTtemp); + T1 = Swi + Slimit; + if (T1 > 0.0) + noizDens[BSIM3FLNOIZ] *= (Slimit * Swi) / T1; else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < BSIM3NSRCS; i++) - { if (i != BSIM3TOTNOIZ) - { tempOnoise = Nintegrate(noizDens[i], - lnNdens[i], - here->BSIM3nVar[LNLSTDENS][i], - data); - tempInoise = Nintegrate(noizDens[i] - * data->GainSqInv, lnNdens[i] - + data->lnGainInv, - here->BSIM3nVar[LNLSTDENS][i] - + data->lnGainInv, data); - here->BSIM3nVar[LNLSTDENS][i] = - lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (((NOISEAN*) - ckt->CKTcurJob)->NStpsSm != 0) - { here->BSIM3nVar[OUTNOIZ][i] - += tempOnoise; - here->BSIM3nVar[OUTNOIZ][BSIM3TOTNOIZ] - += tempOnoise; - here->BSIM3nVar[INNOIZ][i] - += tempInoise; - here->BSIM3nVar[INNOIZ][BSIM3TOTNOIZ] - += tempInoise; - } - } - } - } - if (data->prtSummary) - { for (i = 0; i < BSIM3NSRCS; 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 < BSIM3NSRCS; i++) - { data->outpVector[data->outNumber++] - = here->BSIM3nVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->BSIM3nVar[INNOIZ][i]; - } - } - break; - } + noizDens[BSIM3FLNOIZ] *= 0.0; + } + } 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); -} + } + + lnNdens[BSIM3FLNOIZ] = + log (MAX (noizDens[BSIM3FLNOIZ], N_MINLOG)); + noizDens[BSIM3TOTNOIZ] = + noizDens[BSIM3RDNOIZ] + + noizDens[BSIM3RSNOIZ] + + noizDens[BSIM3IDNOIZ] + noizDens[BSIM3FLNOIZ]; + + lnNdens[BSIM3TOTNOIZ] = + log (MAX (noizDens[BSIM3TOTNOIZ], N_MINLOG)); + + *OnDens += noizDens[BSIM3TOTNOIZ]; + + if (data->delFreq == 0.0) + { /* if we haven't done any previous + * integration, we need to initialize our + * "history" variables. + */ + + for (i = 0; i < BSIM3NSRCS; i++) + { + here->BSIM3nVar[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 < BSIM3NSRCS; i++) + { + here->BSIM3nVar[OUTNOIZ][i] = 0.0; + here->BSIM3nVar[INNOIZ][i] = 0.0; + } + } + } + else + { /* data->delFreq != 0.0, + * we have to integrate. + */ + for (i = 0; i < BSIM3NSRCS; i++) + { + if (i != BSIM3TOTNOIZ) + { + tempOnoise = + Nintegrate + (noizDens + [i], + lnNdens + [i], here->BSIM3nVar[LNLSTDENS][i], data); + tempInoise = + Nintegrate + (noizDens + [i] * + data-> + GainSqInv, + lnNdens + [i] + + data-> + lnGainInv, + here-> + BSIM3nVar + [LNLSTDENS][i] + data->lnGainInv, data); + here->BSIM3nVar[LNLSTDENS][i] = lnNdens[i]; + data->outNoiz += tempOnoise; + data->inNoise += tempInoise; + if (((NOISEAN *) ckt->CKTcurJob)->NStpsSm != 0) + { + here->BSIM3nVar[OUTNOIZ][i] += tempOnoise; + here->BSIM3nVar[OUTNOIZ][BSIM3TOTNOIZ] += + tempOnoise; + here->BSIM3nVar[INNOIZ][i] += tempInoise; + here->BSIM3nVar[INNOIZ][BSIM3TOTNOIZ] += + tempInoise; + } + } + } + } + if (data->prtSummary) + { + for (i = 0; i < BSIM3NSRCS; 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 < BSIM3NSRCS; i++) + { + data->outpVector + [data->outNumber++] = here->BSIM3nVar[OUTNOIZ][i]; + data->outpVector + [data->outNumber++] = here->BSIM3nVar[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); +} diff --git a/src/spicelib/devices/bsim3/b3par.c b/src/spicelib/devices/bsim3/b3par.c index 7761ebfcb..bc2b3fe1b 100644 --- a/src/spicelib/devices/bsim3/b3par.c +++ b/src/spicelib/devices/bsim3/b3par.c @@ -1,103 +1,109 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -Modified: 2000 AlansFixes -File: b3par.c -**********/ + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3par.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng and Mansun Chan + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + + +/*************************************/ #include "ngspice.h" -#include #include "ifsim.h" #include "bsim3def.h" #include "sperror.h" #include "suffix.h" int -BSIM3param(param,value,inst,select) -int param; -IFvalue *value; -GENinstance *inst; -IFvalue *select; +BSIM3param (int param, IFvalue * value, GENinstance * inst, IFvalue * select) { - BSIM3instance *here = (BSIM3instance*)inst; - switch(param) - { case BSIM3_W: - here->BSIM3w = value->rValue; - here->BSIM3wGiven = TRUE; - break; - case BSIM3_L: - here->BSIM3l = value->rValue; - here->BSIM3lGiven = TRUE; - break; - case BSIM3_M: - here->BSIM3m = value->rValue; - here->BSIM3mGiven = TRUE; - break; - case BSIM3_AS: - here->BSIM3sourceArea = value->rValue; - here->BSIM3sourceAreaGiven = TRUE; - break; - case BSIM3_AD: - here->BSIM3drainArea = value->rValue; - here->BSIM3drainAreaGiven = TRUE; - break; - case BSIM3_PS: - here->BSIM3sourcePerimeter = value->rValue; - here->BSIM3sourcePerimeterGiven = TRUE; - break; - case BSIM3_PD: - here->BSIM3drainPerimeter = value->rValue; - here->BSIM3drainPerimeterGiven = TRUE; - break; - case BSIM3_NRS: - here->BSIM3sourceSquares = value->rValue; - here->BSIM3sourceSquaresGiven = TRUE; - break; - case BSIM3_NRD: - here->BSIM3drainSquares = value->rValue; - here->BSIM3drainSquaresGiven = TRUE; - break; - case BSIM3_OFF: - here->BSIM3off = value->iValue; - break; - case BSIM3_IC_VBS: - here->BSIM3icVBS = value->rValue; - here->BSIM3icVBSGiven = TRUE; - break; - case BSIM3_IC_VDS: - here->BSIM3icVDS = value->rValue; - here->BSIM3icVDSGiven = TRUE; - break; - case BSIM3_IC_VGS: - here->BSIM3icVGS = value->rValue; - here->BSIM3icVGSGiven = TRUE; - break; - case BSIM3_NQSMOD: - here->BSIM3nqsMod = value->iValue; - here->BSIM3nqsModGiven = TRUE; - break; - case BSIM3_IC: - switch(value->v.numValue){ - case 3: - here->BSIM3icVBS = *(value->v.vec.rVec+2); - here->BSIM3icVBSGiven = TRUE; - case 2: - here->BSIM3icVGS = *(value->v.vec.rVec+1); - here->BSIM3icVGSGiven = TRUE; - case 1: - here->BSIM3icVDS = *(value->v.vec.rVec); - here->BSIM3icVDSGiven = TRUE; - break; - default: - return(E_BADPARM); - } - break; - default: - return(E_BADPARM); - } - return(OK); + BSIM3instance *here = (BSIM3instance *) inst; + switch (param) + { + case BSIM3_W: + here->BSIM3w = value->rValue; + here->BSIM3wGiven = TRUE; + break; + case BSIM3_L: + here->BSIM3l = value->rValue; + here->BSIM3lGiven = TRUE; + break; + case BSIM3_M: + here->BSIM3m = value->rValue; + here->BSIM3mGiven = TRUE; + break; + case BSIM3_AS: + here->BSIM3sourceArea = value->rValue; + here->BSIM3sourceAreaGiven = TRUE; + break; + case BSIM3_AD: + here->BSIM3drainArea = value->rValue; + here->BSIM3drainAreaGiven = TRUE; + break; + case BSIM3_PS: + here->BSIM3sourcePerimeter = value->rValue; + here->BSIM3sourcePerimeterGiven = TRUE; + break; + case BSIM3_PD: + here->BSIM3drainPerimeter = value->rValue; + here->BSIM3drainPerimeterGiven = TRUE; + break; + case BSIM3_NRS: + here->BSIM3sourceSquares = value->rValue; + here->BSIM3sourceSquaresGiven = TRUE; + break; + case BSIM3_NRD: + here->BSIM3drainSquares = value->rValue; + here->BSIM3drainSquaresGiven = TRUE; + break; + case BSIM3_OFF: + here->BSIM3off = value->iValue; + break; + case BSIM3_IC_VBS: + here->BSIM3icVBS = value->rValue; + here->BSIM3icVBSGiven = TRUE; + break; + case BSIM3_IC_VDS: + here->BSIM3icVDS = value->rValue; + here->BSIM3icVDSGiven = TRUE; + break; + case BSIM3_IC_VGS: + here->BSIM3icVGS = value->rValue; + here->BSIM3icVGSGiven = TRUE; + break; + case BSIM3_NQSMOD: + here->BSIM3nqsMod = value->iValue; + here->BSIM3nqsModGiven = TRUE; + break; + case BSIM3_IC: + switch (value->v.numValue) + { + case 3: + here->BSIM3icVBS = *(value->v.vec.rVec + 2); + here->BSIM3icVBSGiven = TRUE; + case 2: + here->BSIM3icVGS = *(value->v.vec.rVec + 1); + here->BSIM3icVGSGiven = TRUE; + case 1: + here->BSIM3icVDS = *(value->v.vec.rVec); + here->BSIM3icVDSGiven = TRUE; + break; + default: + return (E_BADPARM); + } + break; + default: + return (E_BADPARM); + } + return (OK); } - - - diff --git a/src/spicelib/devices/bsim3/b3pzld.c b/src/spicelib/devices/bsim3/b3pzld.c index 18247e726..a6d54de4c 100644 --- a/src/spicelib/devices/bsim3/b3pzld.c +++ b/src/spicelib/devices/bsim3/b3pzld.c @@ -1,12 +1,24 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -File: b3pzld.c -**********/ + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3pzld.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + + +/*************************************/ #include "ngspice.h" -#include #include "cktdefs.h" #include "complex.h" #include "sperror.h" @@ -14,354 +26,453 @@ File: b3pzld.c #include "suffix.h" int -BSIM3pzLoad(inModel,ckt,s) -GENmodel *inModel; -CKTcircuit *ckt; -SPcomplex *s; +BSIM3pzLoad (GENmodel * inModel, CKTcircuit * ckt, SPcomplex * s) { -BSIM3model *model = (BSIM3model*)inModel; -BSIM3instance *here; -double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb; -double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb; -double gdpr, gspr, gds, gbd, gbs, capbd, capbs, FwdSum, RevSum, Gm, Gmbs; -double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb; -double GSoverlapCap, GDoverlapCap, GBoverlapCap; -double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb, xcqdb, xcqsb, xcqbb; -double gbspsp, gbbdp, gbbsp, gbspg, gbspb; -double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; -double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; -double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; -double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; -double ScalingFactor = 1.0e-9; - - for (; model != NULL; model = model->BSIM3nextModel) - { for (here = model->BSIM3instances; here!= NULL; - here = here->BSIM3nextInstance) - { - if (here->BSIM3owner != ARCHme) continue; - if (here->BSIM3mode >= 0) - { Gm = here->BSIM3gm; - Gmbs = here->BSIM3gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - gbbdp = -here->BSIM3gbds; - gbbsp = here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs; - - gbdpg = here->BSIM3gbgs; - gbdpdp = here->BSIM3gbds; - gbdpb = here->BSIM3gbbs; - gbdpsp = -(gbdpg + gbdpdp + gbdpb); - - gbspg = 0.0; - gbspdp = 0.0; - gbspb = 0.0; - gbspsp = 0.0; - - if (here->BSIM3nqsMod == 0) - { cggb = here->BSIM3cggb; - cgsb = here->BSIM3cgsb; - cgdb = here->BSIM3cgdb; - - cbgb = here->BSIM3cbgb; - cbsb = here->BSIM3cbsb; - cbdb = here->BSIM3cbdb; - - cdgb = here->BSIM3cdgb; - cdsb = here->BSIM3cdsb; - cddb = here->BSIM3cddb; - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.6; - dxpart = 0.4; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3gtg; - xgtd = here->BSIM3gtd; - xgts = here->BSIM3gts; - xgtb = here->BSIM3gtb; - - xcqgb = here->BSIM3cqgb; - xcqdb = here->BSIM3cqdb; - xcqsb = here->BSIM3cqsb; - xcqbb = here->BSIM3cqbb; - - CoxWL = model->BSIM3cox * here->pParam->BSIM3weffCV - * here->pParam->BSIM3leffCV; - qcheq = -(here->BSIM3qgate + here->BSIM3qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3xpart < 0.5) - { dxpart = 0.4; - } - else if (model->BSIM3xpart > 0.5) - { dxpart = 0.0; - } - else - { dxpart = 0.5; - } - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - } - else - { dxpart = here->BSIM3qdrn / qcheq; - Cdd = here->BSIM3cddb; - Csd = -(here->BSIM3cgdb + here->BSIM3cddb - + here->BSIM3cbdb); - ddxpart_dVd = (Cdd - dxpart * (Cdd + Csd)) / qcheq; - Cdg = here->BSIM3cdgb; - Csg = -(here->BSIM3cggb + here->BSIM3cdgb - + here->BSIM3cbgb); - ddxpart_dVg = (Cdg - dxpart * (Cdg + Csg)) / qcheq; - - Cds = here->BSIM3cdsb; - Css = -(here->BSIM3cgsb + here->BSIM3cdsb - + here->BSIM3cbsb); - ddxpart_dVs = (Cds - dxpart * (Cds + Css)) / qcheq; - - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg - + ddxpart_dVs); - } - sxpart = 1.0 - dxpart; - dsxpart_dVd = -ddxpart_dVd; - dsxpart_dVg = -ddxpart_dVg; - dsxpart_dVs = -ddxpart_dVs; - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); - } - } - else - { Gm = -here->BSIM3gm; - Gmbs = -here->BSIM3gmbs; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - - gbbsp = -here->BSIM3gbds; - gbbdp = here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs; - - gbdpg = 0.0; - gbdpsp = 0.0; - gbdpb = 0.0; - gbdpdp = 0.0; - - gbspg = here->BSIM3gbgs; - gbspsp = here->BSIM3gbds; - gbspb = here->BSIM3gbbs; - gbspdp = -(gbspg + gbspsp + gbspb); - - if (here->BSIM3nqsMod == 0) - { cggb = here->BSIM3cggb; - cgsb = here->BSIM3cgdb; - cgdb = here->BSIM3cgsb; - - cbgb = here->BSIM3cbgb; - cbsb = here->BSIM3cbdb; - cbdb = here->BSIM3cbsb; - - cdgb = -(here->BSIM3cdgb + cggb + cbgb); - cdsb = -(here->BSIM3cddb + cgsb + cbsb); - cddb = -(here->BSIM3cdsb + cgdb + cbdb); - - xgtg = xgtd = xgts = xgtb = 0.0; - sxpart = 0.4; - dxpart = 0.6; - ddxpart_dVd = ddxpart_dVg = ddxpart_dVb - = ddxpart_dVs = 0.0; - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { cggb = cgdb = cgsb = 0.0; - cbgb = cbdb = cbsb = 0.0; - cdgb = cddb = cdsb = 0.0; - - xgtg = here->BSIM3gtg; - xgtd = here->BSIM3gts; - xgts = here->BSIM3gtd; - xgtb = here->BSIM3gtb; - - xcqgb = here->BSIM3cqgb; - xcqdb = here->BSIM3cqsb; - xcqsb = here->BSIM3cqdb; - xcqbb = here->BSIM3cqbb; - - CoxWL = model->BSIM3cox * here->pParam->BSIM3weffCV - * here->pParam->BSIM3leffCV; - qcheq = -(here->BSIM3qgate + here->BSIM3qbulk); - if (fabs(qcheq) <= 1.0e-5 * CoxWL) - { if (model->BSIM3xpart < 0.5) - { sxpart = 0.4; - } - else if (model->BSIM3xpart > 0.5) - { sxpart = 0.0; - } - else - { sxpart = 0.5; - } - dsxpart_dVd = dsxpart_dVg = dsxpart_dVb - = dsxpart_dVs = 0.0; - } - else - { sxpart = here->BSIM3qdrn / qcheq; - Css = here->BSIM3cddb; - Cds = -(here->BSIM3cgdb + here->BSIM3cddb - + here->BSIM3cbdb); - dsxpart_dVs = (Css - sxpart * (Css + Cds)) / qcheq; - Csg = here->BSIM3cdgb; - Cdg = -(here->BSIM3cggb + here->BSIM3cdgb - + here->BSIM3cbgb); - dsxpart_dVg = (Csg - sxpart * (Csg + Cdg)) / qcheq; - - Csd = here->BSIM3cdsb; - Cdd = -(here->BSIM3cgsb + here->BSIM3cdsb - + here->BSIM3cbsb); - dsxpart_dVd = (Csd - sxpart * (Csd + Cdd)) / qcheq; - - dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg - + dsxpart_dVs); - } - dxpart = 1.0 - sxpart; - ddxpart_dVd = -dsxpart_dVd; - ddxpart_dVg = -dsxpart_dVg; - ddxpart_dVs = -dsxpart_dVs; - ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); - } - } - - - T1 = *(ckt->CKTstate0 + here->BSIM3qdef) * here->BSIM3gtau; - gdpr = here->BSIM3drainConductance; - gspr = here->BSIM3sourceConductance; - gds = here->BSIM3gds; - gbd = here->BSIM3gbd; - gbs = here->BSIM3gbs; - capbd = here->BSIM3capbd; - capbs = here->BSIM3capbs; - - GSoverlapCap = here->BSIM3cgso; - GDoverlapCap = here->BSIM3cgdo; - GBoverlapCap = here->pParam->BSIM3cgbo; - - xcdgb = (cdgb - GDoverlapCap); - xcddb = (cddb + capbd + GDoverlapCap); - xcdsb = cdsb; - xcdbb = -(xcdgb + xcddb + xcdsb); - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap); - xcsdb = -(cgdb + cbdb + cddb); - xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)); - xcsbb = -(xcsgb + xcsdb + xcssb); - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap); - xcgdb = (cgdb - GDoverlapCap); - xcgsb = (cgsb - GSoverlapCap); - xcgbb = -(xcggb + xcgdb + xcgsb); - xcbgb = (cbgb - GBoverlapCap); - xcbdb = (cbdb - capbd); - xcbsb = (cbsb - capbs); - xcbbb = -(xcbgb + xcbdb + xcbsb); - - *(here->BSIM3GgPtr ) += xcggb * s->real; - *(here->BSIM3GgPtr +1) += xcggb * s->imag; - *(here->BSIM3BbPtr ) += xcbbb * s->real; - *(here->BSIM3BbPtr +1) += xcbbb * s->imag; - *(here->BSIM3DPdpPtr ) += xcddb * s->real; - *(here->BSIM3DPdpPtr +1) += xcddb * s->imag; - *(here->BSIM3SPspPtr ) += xcssb * s->real; - *(here->BSIM3SPspPtr +1) += xcssb * s->imag; - - *(here->BSIM3GbPtr ) += xcgbb * s->real; - *(here->BSIM3GbPtr +1) += xcgbb * s->imag; - *(here->BSIM3GdpPtr ) += xcgdb * s->real; - *(here->BSIM3GdpPtr +1) += xcgdb * s->imag; - *(here->BSIM3GspPtr ) += xcgsb * s->real; - *(here->BSIM3GspPtr +1) += xcgsb * s->imag; - - *(here->BSIM3BgPtr ) += xcbgb * s->real; - *(here->BSIM3BgPtr +1) += xcbgb * s->imag; - *(here->BSIM3BdpPtr ) += xcbdb * s->real; - *(here->BSIM3BdpPtr +1) += xcbdb * s->imag; - *(here->BSIM3BspPtr ) += xcbsb * s->real; - *(here->BSIM3BspPtr +1) += xcbsb * s->imag; - - *(here->BSIM3DPgPtr ) += xcdgb * s->real; - *(here->BSIM3DPgPtr +1) += xcdgb * s->imag; - *(here->BSIM3DPbPtr ) += xcdbb * s->real; - *(here->BSIM3DPbPtr +1) += xcdbb * s->imag; - *(here->BSIM3DPspPtr ) += xcdsb * s->real; - *(here->BSIM3DPspPtr +1) += xcdsb * s->imag; - - *(here->BSIM3SPgPtr ) += xcsgb * s->real; - *(here->BSIM3SPgPtr +1) += xcsgb * s->imag; - *(here->BSIM3SPbPtr ) += xcsbb * s->real; - *(here->BSIM3SPbPtr +1) += xcsbb * s->imag; - *(here->BSIM3SPdpPtr ) += xcsdb * s->real; - *(here->BSIM3SPdpPtr +1) += xcsdb * s->imag; - - *(here->BSIM3DdPtr) += gdpr; - *(here->BSIM3DdpPtr) -= gdpr; - *(here->BSIM3DPdPtr) -= gdpr; - - *(here->BSIM3SsPtr) += gspr; - *(here->BSIM3SspPtr) -= gspr; - *(here->BSIM3SPsPtr) -= gspr; - - *(here->BSIM3BgPtr) -= here->BSIM3gbgs; - *(here->BSIM3BbPtr) += gbd + gbs - here->BSIM3gbbs; - *(here->BSIM3BdpPtr) -= gbd - gbbdp; - *(here->BSIM3BspPtr) -= gbs - gbbsp; - - *(here->BSIM3DPgPtr) += Gm + dxpart * xgtg - + T1 * ddxpart_dVg + gbdpg; - *(here->BSIM3DPdpPtr) += gdpr + gds + gbd + RevSum - + dxpart * xgtd + T1 * ddxpart_dVd + gbdpdp; - *(here->BSIM3DPspPtr) -= gds + FwdSum - dxpart * xgts - - T1 * ddxpart_dVs - gbdpsp; - *(here->BSIM3DPbPtr) -= gbd - Gmbs - dxpart * xgtb - - T1 * ddxpart_dVb - gbdpb; - - *(here->BSIM3SPgPtr) -= Gm - sxpart * xgtg - - T1 * dsxpart_dVg - gbspg; - *(here->BSIM3SPspPtr) += gspr + gds + gbs + FwdSum - + sxpart * xgts + T1 * dsxpart_dVs + gbspsp; - *(here->BSIM3SPbPtr) -= gbs + Gmbs - sxpart * xgtb - - T1 * dsxpart_dVb - gbspb; - *(here->BSIM3SPdpPtr) -= gds + RevSum - sxpart * xgtd - - T1 * dsxpart_dVd - gbspdp; - - *(here->BSIM3GgPtr) -= xgtg; - *(here->BSIM3GbPtr) -= xgtb; - *(here->BSIM3GdpPtr) -= xgtd; - *(here->BSIM3GspPtr) -= xgts; - - if (here->BSIM3nqsMod) - { *(here->BSIM3QqPtr ) += s->real * ScalingFactor; - *(here->BSIM3QqPtr +1) += s->imag * ScalingFactor; - *(here->BSIM3QgPtr ) -= xcqgb * s->real; - *(here->BSIM3QgPtr +1) -= xcqgb * s->imag; - *(here->BSIM3QdpPtr ) -= xcqdb * s->real; - *(here->BSIM3QdpPtr +1) -= xcqdb * s->imag; - *(here->BSIM3QbPtr ) -= xcqbb * s->real; - *(here->BSIM3QbPtr +1) -= xcqbb * s->imag; - *(here->BSIM3QspPtr ) -= xcqsb * s->real; - *(here->BSIM3QspPtr +1) -= xcqsb * s->imag; - - *(here->BSIM3GqPtr) -= here->BSIM3gtau; - *(here->BSIM3DPqPtr) += dxpart * here->BSIM3gtau; - *(here->BSIM3SPqPtr) += sxpart * here->BSIM3gtau; - - *(here->BSIM3QqPtr) += here->BSIM3gtau; - *(here->BSIM3QgPtr) += xgtg; - *(here->BSIM3QdpPtr) += xgtd; - *(here->BSIM3QbPtr) += xgtb; - *(here->BSIM3QspPtr) += xgts; - } - } - } - return(OK); + BSIM3model *model = (BSIM3model *) inModel; + BSIM3instance *here; + double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb; + double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb; + double gdpr, gspr, gds, gbd, gbs, capbd, capbs, FwdSum, RevSum, Gm, + Gmbs; + double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb; + double GSoverlapCap, GDoverlapCap, GBoverlapCap; + double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb, xcqdb, xcqsb, + xcqbb; + double gbspsp, gbbdp, gbbsp, gbspg, gbspb; + double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; + double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; + double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; + double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Cdb, Csg, Csd, Css, Csb; + double ScalingFactor = 1.0e-9; + double m; + + for (; model != NULL; model = model->BSIM3nextModel) + { + for (here = model->BSIM3instances; here != NULL; + here = here->BSIM3nextInstance) + { + if (here->BSIM3owner != ARCHme) + continue; + if (here->BSIM3mode >= 0) + { + Gm = here->BSIM3gm; + Gmbs = here->BSIM3gmbs; + FwdSum = Gm + Gmbs; + RevSum = 0.0; + + gbbdp = -here->BSIM3gbds; + gbbsp = here->BSIM3gbds + here->BSIM3gbgs + + here->BSIM3gbbs; + + gbdpg = here->BSIM3gbgs; + gbdpdp = here->BSIM3gbds; + gbdpb = here->BSIM3gbbs; + gbdpsp = -(gbdpg + gbdpdp + gbdpb); + + gbspg = 0.0; + gbspdp = 0.0; + gbspb = 0.0; + gbspsp = 0.0; + + if (here->BSIM3nqsMod == 0) + { + cggb = here->BSIM3cggb; + cgsb = here->BSIM3cgsb; + cgdb = here->BSIM3cgdb; + + cbgb = here->BSIM3cbgb; + cbsb = here->BSIM3cbsb; + cbdb = here->BSIM3cbdb; + + cdgb = here->BSIM3cdgb; + cdsb = here->BSIM3cdsb; + cddb = here->BSIM3cddb; + + xgtg = xgtd = xgts = xgtb = 0.0; + sxpart = 0.6; + dxpart = 0.4; + ddxpart_dVd = ddxpart_dVg = + ddxpart_dVb = ddxpart_dVs = + 0.0; + dsxpart_dVd = dsxpart_dVg = + dsxpart_dVb = dsxpart_dVs = + 0.0; + } + else + { + cggb = cgdb = cgsb = 0.0; + cbgb = cbdb = cbsb = 0.0; + cdgb = cddb = cdsb = 0.0; + + xgtg = here->BSIM3gtg; + xgtd = here->BSIM3gtd; + xgts = here->BSIM3gts; + xgtb = here->BSIM3gtb; + + xcqgb = here->BSIM3cqgb; + xcqdb = here->BSIM3cqdb; + xcqsb = here->BSIM3cqsb; + xcqbb = here->BSIM3cqbb; + + CoxWL = model->BSIM3cox * + here->pParam->BSIM3weffCV * + here->pParam->BSIM3leffCV; + qcheq = -(here->BSIM3qgate + + here->BSIM3qbulk); + if (fabs (qcheq) <= 1.0e-5 * CoxWL) + { + if (model->BSIM3xpart < 0.5) + { + dxpart = 0.4; + } + else if (model->BSIM3xpart > + 0.5) + { + dxpart = 0.0; + } + else + { + dxpart = 0.5; + } + ddxpart_dVd = ddxpart_dVg = + ddxpart_dVb = + ddxpart_dVs = 0.0; + } + else + { + dxpart = here->BSIM3qdrn / + qcheq; + Cdd = here->BSIM3cddb; + Csd = -(here->BSIM3cgdb + + here->BSIM3cddb + + here->BSIM3cbdb); + ddxpart_dVd = + (Cdd - + dxpart * (Cdd + + Csd)) / + qcheq; + Cdg = here->BSIM3cdgb; + Csg = -(here->BSIM3cggb + + here->BSIM3cdgb + + here->BSIM3cbgb); + ddxpart_dVg = + (Cdg - + dxpart * (Cdg + + Csg)) / + qcheq; + + Cds = here->BSIM3cdsb; + Css = -(here->BSIM3cgsb + + here->BSIM3cdsb + + here->BSIM3cbsb); + ddxpart_dVs = + (Cds - + dxpart * (Cds + + Css)) / + qcheq; + + ddxpart_dVb = + -(ddxpart_dVd + + ddxpart_dVg + + ddxpart_dVs); + } + sxpart = 1.0 - dxpart; + dsxpart_dVd = -ddxpart_dVd; + dsxpart_dVg = -ddxpart_dVg; + dsxpart_dVs = -ddxpart_dVs; + dsxpart_dVb = + -(dsxpart_dVd + dsxpart_dVg + + dsxpart_dVs); + } + } + else + { + Gm = -here->BSIM3gm; + Gmbs = -here->BSIM3gmbs; + FwdSum = 0.0; + RevSum = -(Gm + Gmbs); + + gbbsp = -here->BSIM3gbds; + gbbdp = here->BSIM3gbds + here->BSIM3gbgs + + here->BSIM3gbbs; + + gbdpg = 0.0; + gbdpsp = 0.0; + gbdpb = 0.0; + gbdpdp = 0.0; + + gbspg = here->BSIM3gbgs; + gbspsp = here->BSIM3gbds; + gbspb = here->BSIM3gbbs; + gbspdp = -(gbspg + gbspsp + gbspb); + + if (here->BSIM3nqsMod == 0) + { + cggb = here->BSIM3cggb; + cgsb = here->BSIM3cgdb; + cgdb = here->BSIM3cgsb; + + cbgb = here->BSIM3cbgb; + cbsb = here->BSIM3cbdb; + cbdb = here->BSIM3cbsb; + + cdgb = -(here->BSIM3cdgb + cggb + + cbgb); + cdsb = -(here->BSIM3cddb + cgsb + + cbsb); + cddb = -(here->BSIM3cdsb + cgdb + + cbdb); + + xgtg = xgtd = xgts = xgtb = 0.0; + sxpart = 0.4; + dxpart = 0.6; + ddxpart_dVd = ddxpart_dVg = + ddxpart_dVb = ddxpart_dVs = + 0.0; + dsxpart_dVd = dsxpart_dVg = + dsxpart_dVb = dsxpart_dVs = + 0.0; + } + else + { + cggb = cgdb = cgsb = 0.0; + cbgb = cbdb = cbsb = 0.0; + cdgb = cddb = cdsb = 0.0; + + xgtg = here->BSIM3gtg; + xgtd = here->BSIM3gts; + xgts = here->BSIM3gtd; + xgtb = here->BSIM3gtb; + + xcqgb = here->BSIM3cqgb; + xcqdb = here->BSIM3cqsb; + xcqsb = here->BSIM3cqdb; + xcqbb = here->BSIM3cqbb; + + CoxWL = model->BSIM3cox * + here->pParam->BSIM3weffCV * + here->pParam->BSIM3leffCV; + qcheq = -(here->BSIM3qgate + + here->BSIM3qbulk); + if (fabs (qcheq) <= 1.0e-5 * CoxWL) + { + if (model->BSIM3xpart < 0.5) + { + sxpart = 0.4; + } + else if (model->BSIM3xpart > + 0.5) + { + sxpart = 0.0; + } + else + { + sxpart = 0.5; + } + dsxpart_dVd = dsxpart_dVg = + dsxpart_dVb = + dsxpart_dVs = 0.0; + } + else + { + sxpart = here->BSIM3qdrn / + qcheq; + Css = here->BSIM3cddb; + Cds = -(here->BSIM3cgdb + + here->BSIM3cddb + + here->BSIM3cbdb); + dsxpart_dVs = + (Css - + sxpart * (Css + + Cds)) / + qcheq; + Csg = here->BSIM3cdgb; + Cdg = -(here->BSIM3cggb + + here->BSIM3cdgb + + here->BSIM3cbgb); + dsxpart_dVg = + (Csg - + sxpart * (Csg + + Cdg)) / + qcheq; + + Csd = here->BSIM3cdsb; + Cdd = -(here->BSIM3cgsb + + here->BSIM3cdsb + + here->BSIM3cbsb); + dsxpart_dVd = + (Csd - + sxpart * (Csd + + Cdd)) / + qcheq; + + dsxpart_dVb = + -(dsxpart_dVd + + dsxpart_dVg + + dsxpart_dVs); + } + dxpart = 1.0 - sxpart; + ddxpart_dVd = -dsxpart_dVd; + ddxpart_dVg = -dsxpart_dVg; + ddxpart_dVs = -dsxpart_dVs; + ddxpart_dVb = + -(ddxpart_dVd + ddxpart_dVg + + ddxpart_dVs); + } + } + + + T1 = *(ckt->CKTstate0 + + here->BSIM3qdef) * here->BSIM3gtau; + gdpr = here->BSIM3drainConductance; + gspr = here->BSIM3sourceConductance; + gds = here->BSIM3gds; + gbd = here->BSIM3gbd; + gbs = here->BSIM3gbs; + capbd = here->BSIM3capbd; + capbs = here->BSIM3capbs; + + GSoverlapCap = here->BSIM3cgso; + GDoverlapCap = here->BSIM3cgdo; + GBoverlapCap = here->pParam->BSIM3cgbo; + + xcdgb = (cdgb - GDoverlapCap); + xcddb = (cddb + capbd + GDoverlapCap); + xcdsb = cdsb; + xcdbb = -(xcdgb + xcddb + xcdsb); + xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap); + xcsdb = -(cgdb + cbdb + cddb); + xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)); + xcsbb = -(xcsgb + xcsdb + xcssb); + xcggb = (cggb + GDoverlapCap + GSoverlapCap + + GBoverlapCap); + xcgdb = (cgdb - GDoverlapCap); + xcgsb = (cgsb - GSoverlapCap); + xcgbb = -(xcggb + xcgdb + xcgsb); + xcbgb = (cbgb - GBoverlapCap); + xcbdb = (cbdb - capbd); + xcbsb = (cbsb - capbs); + xcbbb = -(xcbgb + xcbdb + xcbsb); + + + m = here->BSIM3m; + + *(here->BSIM3GgPtr) += m * (xcggb * s->real); + *(here->BSIM3GgPtr + 1) += m * (xcggb * s->imag); + *(here->BSIM3BbPtr) += m * (xcbbb * s->real); + *(here->BSIM3BbPtr + 1) += m * (xcbbb * s->imag); + *(here->BSIM3DPdpPtr) += m * (xcddb * s->real); + *(here->BSIM3DPdpPtr + 1) += m * (xcddb * s->imag); + *(here->BSIM3SPspPtr) += m * (xcssb * s->real); + *(here->BSIM3SPspPtr + 1) += m * (xcssb * s->imag); + + *(here->BSIM3GbPtr) += m * (xcgbb * s->real); + *(here->BSIM3GbPtr + 1) += m * (xcgbb * s->imag); + *(here->BSIM3GdpPtr) += m * (xcgdb * s->real); + *(here->BSIM3GdpPtr + 1) += m * (xcgdb * s->imag); + *(here->BSIM3GspPtr) += m * (xcgsb * s->real); + *(here->BSIM3GspPtr + 1) += m * (xcgsb * s->imag); + + *(here->BSIM3BgPtr) += m * (xcbgb * s->real); + *(here->BSIM3BgPtr + 1) += m * (xcbgb * s->imag); + *(here->BSIM3BdpPtr) += m * (xcbdb * s->real); + *(here->BSIM3BdpPtr + 1) += m * (xcbdb * s->imag); + *(here->BSIM3BspPtr) += m * (xcbsb * s->real); + *(here->BSIM3BspPtr + 1) += m * (xcbsb * s->imag); + + *(here->BSIM3DPgPtr) += m * (xcdgb * s->real); + *(here->BSIM3DPgPtr + 1) += m * (xcdgb * s->imag); + *(here->BSIM3DPbPtr) += m * (xcdbb * s->real); + *(here->BSIM3DPbPtr + 1) += m * (xcdbb * s->imag); + *(here->BSIM3DPspPtr) += m * (xcdsb * s->real); + *(here->BSIM3DPspPtr + 1) += m * (xcdsb * s->imag); + + *(here->BSIM3SPgPtr) += m * (xcsgb * s->real); + *(here->BSIM3SPgPtr + 1) += m * (xcsgb * s->imag); + *(here->BSIM3SPbPtr) += m * (xcsbb * s->real); + *(here->BSIM3SPbPtr + 1) += m * (xcsbb * s->imag); + *(here->BSIM3SPdpPtr) += m * (xcsdb * s->real); + *(here->BSIM3SPdpPtr + 1) += m * (xcsdb * s->imag); + + *(here->BSIM3DdPtr) += m * gdpr; + *(here->BSIM3DdpPtr) -= m * gdpr; + *(here->BSIM3DPdPtr) -= m * gdpr; + + *(here->BSIM3SsPtr) += m * gspr; + *(here->BSIM3SspPtr) -= m * gspr; + *(here->BSIM3SPsPtr) -= m * gspr; + + *(here->BSIM3BgPtr) -= m * here->BSIM3gbgs; + *(here->BSIM3BbPtr) += + m * (gbd + gbs - here->BSIM3gbbs); + *(here->BSIM3BdpPtr) -= m * (gbd - gbbdp); + *(here->BSIM3BspPtr) -= m * (gbs - gbbsp); + + *(here->BSIM3DPgPtr) += m * (Gm + dxpart * xgtg + + T1 * ddxpart_dVg + + gbdpg); + *(here->BSIM3DPdpPtr) += + m * (gdpr + gds + gbd + RevSum + + dxpart * xgtd + T1 * ddxpart_dVd + + gbdpdp); + *(here->BSIM3DPspPtr) -= + m * (gds + FwdSum - dxpart * xgts - + T1 * ddxpart_dVs - gbdpsp); + *(here->BSIM3DPbPtr) -= + m * (gbd - Gmbs - dxpart * xgtb - + T1 * ddxpart_dVb - gbdpb); + + *(here->BSIM3SPgPtr) -= m * (Gm - sxpart * xgtg + - T1 * dsxpart_dVg - + gbspg); + *(here->BSIM3SPspPtr) += + m * (gspr + gds + gbs + FwdSum + + sxpart * xgts + T1 * dsxpart_dVs + + gbspsp); + *(here->BSIM3SPbPtr) -= + m * (gbs + Gmbs - sxpart * xgtb - + T1 * dsxpart_dVb - gbspb); + *(here->BSIM3SPdpPtr) -= + m * (gds + RevSum - sxpart * xgtd - + T1 * dsxpart_dVd - gbspdp); + + *(here->BSIM3GgPtr) -= m * xgtg; + *(here->BSIM3GbPtr) -= m * xgtb; + *(here->BSIM3GdpPtr) -= m * xgtd; + *(here->BSIM3GspPtr) -= m * xgts; + + if (here->BSIM3nqsMod) + { + *(here->BSIM3QqPtr) += + m * (s->real * ScalingFactor); + *(here->BSIM3QqPtr + 1) += + m * (s->imag * ScalingFactor); + *(here->BSIM3QgPtr) -= m * (xcqgb * s->real); + *(here->BSIM3QgPtr + 1) -= + m * (xcqgb * s->imag); + *(here->BSIM3QdpPtr) -= m * (xcqdb * s->real); + *(here->BSIM3QdpPtr + 1) -= + m * (xcqdb * s->imag); + *(here->BSIM3QbPtr) -= m * (xcqbb * s->real); + *(here->BSIM3QbPtr + 1) -= + m * (xcqbb * s->imag); + *(here->BSIM3QspPtr) -= m * (xcqsb * s->real); + *(here->BSIM3QspPtr + 1) -= + m * (xcqsb * s->imag); + + *(here->BSIM3GqPtr) -= m * here->BSIM3gtau; + *(here->BSIM3DPqPtr) += + m * (dxpart * here->BSIM3gtau); + *(here->BSIM3SPqPtr) += + m * (sxpart * here->BSIM3gtau); + + *(here->BSIM3QqPtr) += m * (here->BSIM3gtau); + *(here->BSIM3QgPtr) += m * xgtg; + *(here->BSIM3QdpPtr) += m * xgtd; + *(here->BSIM3QbPtr) += m * xgtb; + *(here->BSIM3QspPtr) += m * xgts; + } + } + } + return (OK); } - diff --git a/src/spicelib/devices/bsim3/b3set.c b/src/spicelib/devices/bsim3/b3set.c index 51db6987b..cf1085927 100644 --- a/src/spicelib/devices/bsim3/b3set.c +++ b/src/spicelib/devices/bsim3/b3set.c @@ -1,15 +1,24 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3set.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Paolo Nenzi 2002 + **********/ -Modified: 2000 AlansFixes -File: b3set.c -**********/ +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + + +/*************************************/ #include "ngspice.h" -#include -#include #include "smpdefs.h" #include "cktdefs.h" #include "bsim3def.h" @@ -23,951 +32,995 @@ File: b3set.c #define SMOOTHFACTOR 0.1 #define EPSOX 3.453133e-11 #define EPSSI 1.03594e-10 +#define PI 3.141592654 #define Charge_q 1.60219e-19 #define Meter2Micron 1.0e6 int -BSIM3setup (matrix, inModel, ckt, states) - SMPmatrix *matrix; - GENmodel *inModel; - CKTcircuit *ckt; - int *states; +BSIM3setup (SMPmatrix * matrix, GENmodel * inModel, CKTcircuit * ckt, + int *states) { - BSIM3model *model = (BSIM3model *) inModel; - BSIM3instance *here; - int error; - CKTnode *tmp; + BSIM3model *model = (BSIM3model *) inModel; + BSIM3instance *here; + int error; + CKTnode *tmp; - /* loop through all the BSIM3 device models */ - for (; model != NULL; model = model->BSIM3nextModel) - { + /* NodesetFix */ + CKTnode *tmpNode; + IFuid tmpName; + + double tmp1, tmp2; + + /* loop through all the BSIM3 device models */ + for (; model != NULL; model = model->BSIM3nextModel) + { /* Default value Processing for BSIM3 MOSFET Models */ - if (!model->BSIM3typeGiven) - model->BSIM3type = NMOS; - if (!model->BSIM3mobModGiven) - model->BSIM3mobMod = 1; - if (!model->BSIM3binUnitGiven) - model->BSIM3binUnit = 1; - if (!model->BSIM3paramChkGiven) - model->BSIM3paramChk = 0; - if (!model->BSIM3capModGiven) - model->BSIM3capMod = 3; - if (!model->BSIM3noiModGiven) - model->BSIM3noiMod = 1; - if (!model->BSIM3versionGiven) - model->BSIM3version = "3.2.2"; - if (!model->BSIM3toxGiven) - model->BSIM3tox = 150.0e-10; - model->BSIM3cox = 3.453133e-11 / model->BSIM3tox; - if (!model->BSIM3toxmGiven) - model->BSIM3toxm = model->BSIM3tox; + if (!model->BSIM3typeGiven) + model->BSIM3type = NMOS; + if (!model->BSIM3mobModGiven) + model->BSIM3mobMod = 1; + if (!model->BSIM3binUnitGiven) + model->BSIM3binUnit = 1; + if (!model->BSIM3paramChkGiven) + model->BSIM3paramChk = 0; + if (!model->BSIM3capModGiven) + model->BSIM3capMod = 3; + if (!model->BSIM3noiModGiven) + model->BSIM3noiMod = 1; - if (!model->BSIM3cdscGiven) - model->BSIM3cdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->BSIM3cdscbGiven) - model->BSIM3cdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3cdscdGiven) - model->BSIM3cdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3citGiven) - model->BSIM3cit = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3nfactorGiven) - model->BSIM3nfactor = 1; - if (!model->BSIM3xjGiven) - model->BSIM3xj = .15e-6; - if (!model->BSIM3vsatGiven) - model->BSIM3vsat = 8.0e4; /* unit m/s */ - if (!model->BSIM3atGiven) - model->BSIM3at = 3.3e4; /* unit m/s */ - if (!model->BSIM3a0Given) - model->BSIM3a0 = 1.0; - if (!model->BSIM3agsGiven) - model->BSIM3ags = 0.0; - if (!model->BSIM3a1Given) - model->BSIM3a1 = 0.0; - if (!model->BSIM3a2Given) - model->BSIM3a2 = 1.0; - if (!model->BSIM3ketaGiven) - model->BSIM3keta = -0.047; /* unit / V */ - if (!model->BSIM3nsubGiven) - model->BSIM3nsub = 6.0e16; /* unit 1/cm3 */ - if (!model->BSIM3npeakGiven) - model->BSIM3npeak = 1.7e17; /* unit 1/cm3 */ - if (!model->BSIM3ngateGiven) - model->BSIM3ngate = 0; /* unit 1/cm3 */ - if (!model->BSIM3vbmGiven) - model->BSIM3vbm = -3.0; - if (!model->BSIM3xtGiven) - model->BSIM3xt = 1.55e-7; - if (!model->BSIM3kt1Given) - model->BSIM3kt1 = -0.11; /* unit V */ - if (!model->BSIM3kt1lGiven) - model->BSIM3kt1l = 0.0; /* unit V*m */ - if (!model->BSIM3kt2Given) - model->BSIM3kt2 = 0.022; /* No unit */ - if (!model->BSIM3k3Given) - model->BSIM3k3 = 80.0; - if (!model->BSIM3k3bGiven) - model->BSIM3k3b = 0.0; - if (!model->BSIM3w0Given) - model->BSIM3w0 = 2.5e-6; - if (!model->BSIM3nlxGiven) - model->BSIM3nlx = 1.74e-7; - if (!model->BSIM3dvt0Given) - model->BSIM3dvt0 = 2.2; - if (!model->BSIM3dvt1Given) - model->BSIM3dvt1 = 0.53; - if (!model->BSIM3dvt2Given) - model->BSIM3dvt2 = -0.032; /* unit 1 / V */ + /* If the user does not provide the model revision, + * we always choose the most recent. + */ + if (!model->BSIM3versionGiven) + model->BSIM3version = "3.2.4"; - if (!model->BSIM3dvt0wGiven) - model->BSIM3dvt0w = 0.0; - if (!model->BSIM3dvt1wGiven) - model->BSIM3dvt1w = 5.3e6; - if (!model->BSIM3dvt2wGiven) - model->BSIM3dvt2w = -0.032; + /* I have added below the code that translate model string + * into an integer. This trick is meant to speed up the + * revision testing instruction, since comparing integer + * is faster than comparing strings. + * Paolo Nenzi 2002 + */ + if (!strcmp (model->BSIM3version, "3.2.4")) + model->BSIM3intVersion = BSIM3V324; + else if (!strcmp (model->BSIM3version, "3.2.3")) + model->BSIM3intVersion = BSIM3V323; + else if (!strcmp (model->BSIM3version, "3.2.2")) + model->BSIM3intVersion = BSIM3V322; + else if (!strcmp (model->BSIM3version, "3.2")) + model->BSIM3intVersion = BSIM3V32; + else + model->BSIM3intVersion = BSIM3V3OLD; + /* BSIM3V3OLD is a placeholder for pre 3.2 revision + * This model should not be used for pre 3.2 models. + */ - if (!model->BSIM3droutGiven) - model->BSIM3drout = 0.56; - if (!model->BSIM3dsubGiven) - model->BSIM3dsub = model->BSIM3drout; - if (!model->BSIM3vth0Given) - model->BSIM3vth0 = (model->BSIM3type == NMOS) ? 0.7 : -0.7; - if (!model->BSIM3uaGiven) - model->BSIM3ua = 2.25e-9; /* unit m/V */ - if (!model->BSIM3ua1Given) - model->BSIM3ua1 = 4.31e-9; /* unit m/V */ - if (!model->BSIM3ubGiven) - model->BSIM3ub = 5.87e-19; /* unit (m/V)**2 */ - if (!model->BSIM3ub1Given) - model->BSIM3ub1 = -7.61e-18; /* unit (m/V)**2 */ - if (!model->BSIM3ucGiven) - model->BSIM3uc = (model->BSIM3mobMod == 3) ? -0.0465 : -0.0465e-9; - if (!model->BSIM3uc1Given) - model->BSIM3uc1 = (model->BSIM3mobMod == 3) ? -0.056 : -0.056e-9; - if (!model->BSIM3u0Given) - model->BSIM3u0 = (model->BSIM3type == NMOS) ? 0.067 : 0.025; - if (!model->BSIM3uteGiven) - model->BSIM3ute = -1.5; - if (!model->BSIM3voffGiven) - model->BSIM3voff = -0.08; - if (!model->BSIM3deltaGiven) - model->BSIM3delta = 0.01; - if (!model->BSIM3rdswGiven) - model->BSIM3rdsw = 0; - if (!model->BSIM3prwgGiven) - model->BSIM3prwg = 0.0; /* unit 1/V */ - if (!model->BSIM3prwbGiven) - model->BSIM3prwb = 0.0; - if (!model->BSIM3prtGiven) - if (!model->BSIM3prtGiven) - model->BSIM3prt = 0.0; - if (!model->BSIM3eta0Given) - model->BSIM3eta0 = 0.08; /* no unit */ - if (!model->BSIM3etabGiven) - model->BSIM3etab = -0.07; /* unit 1/V */ - if (!model->BSIM3pclmGiven) - model->BSIM3pclm = 1.3; /* no unit */ - if (!model->BSIM3pdibl1Given) - model->BSIM3pdibl1 = .39; /* no unit */ - if (!model->BSIM3pdibl2Given) - model->BSIM3pdibl2 = 0.0086; /* no unit */ - if (!model->BSIM3pdiblbGiven) - model->BSIM3pdiblb = 0.0; /* 1/V */ - if (!model->BSIM3pscbe1Given) - model->BSIM3pscbe1 = 4.24e8; - if (!model->BSIM3pscbe2Given) - model->BSIM3pscbe2 = 1.0e-5; - if (!model->BSIM3pvagGiven) - model->BSIM3pvag = 0.0; - if (!model->BSIM3wrGiven) - model->BSIM3wr = 1.0; - if (!model->BSIM3dwgGiven) - model->BSIM3dwg = 0.0; - if (!model->BSIM3dwbGiven) - model->BSIM3dwb = 0.0; - if (!model->BSIM3b0Given) - model->BSIM3b0 = 0.0; - if (!model->BSIM3b1Given) - model->BSIM3b1 = 0.0; - if (!model->BSIM3alpha0Given) - model->BSIM3alpha0 = 0.0; - if (!model->BSIM3alpha1Given) - model->BSIM3alpha1 = 0.0; - if (!model->BSIM3beta0Given) - model->BSIM3beta0 = 30.0; - if (!model->BSIM3ijthGiven) - model->BSIM3ijth = 0.1; /* unit A */ - if (!model->BSIM3elmGiven) - model->BSIM3elm = 5.0; - if (!model->BSIM3cgslGiven) - model->BSIM3cgsl = 0.0; - if (!model->BSIM3cgdlGiven) - model->BSIM3cgdl = 0.0; - if (!model->BSIM3ckappaGiven) - model->BSIM3ckappa = 0.6; - if (!model->BSIM3clcGiven) - model->BSIM3clc = 0.1e-6; - if (!model->BSIM3cleGiven) - model->BSIM3cle = 0.6; - if (!model->BSIM3vfbcvGiven) - model->BSIM3vfbcv = -1.0; - if (!model->BSIM3acdeGiven) - model->BSIM3acde = 1.0; - if (!model->BSIM3moinGiven) - model->BSIM3moin = 15.0; - if (!model->BSIM3noffGiven) - model->BSIM3noff = 1.0; - if (!model->BSIM3voffcvGiven) - model->BSIM3voffcv = 0.0; - if (!model->BSIM3tcjGiven) - model->BSIM3tcj = 0.0; - if (!model->BSIM3tpbGiven) - model->BSIM3tpb = 0.0; - if (!model->BSIM3tcjswGiven) - model->BSIM3tcjsw = 0.0; - if (!model->BSIM3tpbswGiven) - model->BSIM3tpbsw = 0.0; - if (!model->BSIM3tcjswgGiven) - model->BSIM3tcjswg = 0.0; - if (!model->BSIM3tpbswgGiven) - model->BSIM3tpbswg = 0.0; - /* Length dependence */ - if (!model->BSIM3lcdscGiven) - model->BSIM3lcdsc = 0.0; - if (!model->BSIM3lcdscbGiven) - model->BSIM3lcdscb = 0.0; - if (!model->BSIM3lcdscdGiven) - model->BSIM3lcdscd = 0.0; - if (!model->BSIM3lcitGiven) - model->BSIM3lcit = 0.0; - if (!model->BSIM3lnfactorGiven) - model->BSIM3lnfactor = 0.0; - if (!model->BSIM3lxjGiven) - model->BSIM3lxj = 0.0; - if (!model->BSIM3lvsatGiven) - model->BSIM3lvsat = 0.0; - if (!model->BSIM3latGiven) - model->BSIM3lat = 0.0; - if (!model->BSIM3la0Given) - model->BSIM3la0 = 0.0; - if (!model->BSIM3lagsGiven) - model->BSIM3lags = 0.0; - if (!model->BSIM3la1Given) - model->BSIM3la1 = 0.0; - if (!model->BSIM3la2Given) - model->BSIM3la2 = 0.0; - if (!model->BSIM3lketaGiven) - model->BSIM3lketa = 0.0; - if (!model->BSIM3lnsubGiven) - model->BSIM3lnsub = 0.0; - if (!model->BSIM3lnpeakGiven) - model->BSIM3lnpeak = 0.0; - if (!model->BSIM3lngateGiven) - model->BSIM3lngate = 0.0; - if (!model->BSIM3lvbmGiven) - model->BSIM3lvbm = 0.0; - if (!model->BSIM3lxtGiven) - model->BSIM3lxt = 0.0; - if (!model->BSIM3lkt1Given) - model->BSIM3lkt1 = 0.0; - if (!model->BSIM3lkt1lGiven) - model->BSIM3lkt1l = 0.0; - if (!model->BSIM3lkt2Given) - model->BSIM3lkt2 = 0.0; - if (!model->BSIM3lk3Given) - model->BSIM3lk3 = 0.0; - if (!model->BSIM3lk3bGiven) - model->BSIM3lk3b = 0.0; - if (!model->BSIM3lw0Given) - model->BSIM3lw0 = 0.0; - if (!model->BSIM3lnlxGiven) - model->BSIM3lnlx = 0.0; - if (!model->BSIM3ldvt0Given) - model->BSIM3ldvt0 = 0.0; - if (!model->BSIM3ldvt1Given) - model->BSIM3ldvt1 = 0.0; - if (!model->BSIM3ldvt2Given) - model->BSIM3ldvt2 = 0.0; - if (!model->BSIM3ldvt0wGiven) - model->BSIM3ldvt0w = 0.0; - if (!model->BSIM3ldvt1wGiven) - model->BSIM3ldvt1w = 0.0; - if (!model->BSIM3ldvt2wGiven) - model->BSIM3ldvt2w = 0.0; - if (!model->BSIM3ldroutGiven) - model->BSIM3ldrout = 0.0; - if (!model->BSIM3ldsubGiven) - model->BSIM3ldsub = 0.0; - if (!model->BSIM3lvth0Given) - model->BSIM3lvth0 = 0.0; - if (!model->BSIM3luaGiven) - model->BSIM3lua = 0.0; - if (!model->BSIM3lua1Given) - model->BSIM3lua1 = 0.0; - if (!model->BSIM3lubGiven) - model->BSIM3lub = 0.0; - if (!model->BSIM3lub1Given) - model->BSIM3lub1 = 0.0; - if (!model->BSIM3lucGiven) - model->BSIM3luc = 0.0; - if (!model->BSIM3luc1Given) - model->BSIM3luc1 = 0.0; - if (!model->BSIM3lu0Given) - model->BSIM3lu0 = 0.0; - if (!model->BSIM3luteGiven) - model->BSIM3lute = 0.0; - if (!model->BSIM3lvoffGiven) - model->BSIM3lvoff = 0.0; - if (!model->BSIM3ldeltaGiven) - model->BSIM3ldelta = 0.0; - if (!model->BSIM3lrdswGiven) - model->BSIM3lrdsw = 0.0; - if (!model->BSIM3lprwbGiven) - model->BSIM3lprwb = 0.0; - if (!model->BSIM3lprwgGiven) - model->BSIM3lprwg = 0.0; - if (!model->BSIM3lprtGiven) - model->BSIM3lprt = 0.0; - if (!model->BSIM3leta0Given) - model->BSIM3leta0 = 0.0; - if (!model->BSIM3letabGiven) - model->BSIM3letab = -0.0; - if (!model->BSIM3lpclmGiven) - model->BSIM3lpclm = 0.0; - if (!model->BSIM3lpdibl1Given) - model->BSIM3lpdibl1 = 0.0; - if (!model->BSIM3lpdibl2Given) - model->BSIM3lpdibl2 = 0.0; - if (!model->BSIM3lpdiblbGiven) - model->BSIM3lpdiblb = 0.0; - if (!model->BSIM3lpscbe1Given) - model->BSIM3lpscbe1 = 0.0; - if (!model->BSIM3lpscbe2Given) - model->BSIM3lpscbe2 = 0.0; - if (!model->BSIM3lpvagGiven) - model->BSIM3lpvag = 0.0; - if (!model->BSIM3lwrGiven) - model->BSIM3lwr = 0.0; - if (!model->BSIM3ldwgGiven) - model->BSIM3ldwg = 0.0; - if (!model->BSIM3ldwbGiven) - model->BSIM3ldwb = 0.0; - if (!model->BSIM3lb0Given) - model->BSIM3lb0 = 0.0; - if (!model->BSIM3lb1Given) - model->BSIM3lb1 = 0.0; - if (!model->BSIM3lalpha0Given) - model->BSIM3lalpha0 = 0.0; - if (!model->BSIM3lalpha1Given) - model->BSIM3lalpha1 = 0.0; - if (!model->BSIM3lbeta0Given) - model->BSIM3lbeta0 = 0.0; - if (!model->BSIM3lvfbGiven) - model->BSIM3lvfb = 0.0; + if (!model->BSIM3toxGiven) + model->BSIM3tox = 150.0e-10; + model->BSIM3cox = 3.453133e-11 / model->BSIM3tox; + if (!model->BSIM3toxmGiven) + model->BSIM3toxm = model->BSIM3tox; - if (!model->BSIM3lelmGiven) - model->BSIM3lelm = 0.0; - if (!model->BSIM3lcgslGiven) - model->BSIM3lcgsl = 0.0; - if (!model->BSIM3lcgdlGiven) - model->BSIM3lcgdl = 0.0; - if (!model->BSIM3lckappaGiven) - model->BSIM3lckappa = 0.0; - if (!model->BSIM3lclcGiven) - model->BSIM3lclc = 0.0; - if (!model->BSIM3lcleGiven) - model->BSIM3lcle = 0.0; - if (!model->BSIM3lcfGiven) - model->BSIM3lcf = 0.0; - if (!model->BSIM3lvfbcvGiven) - model->BSIM3lvfbcv = 0.0; - if (!model->BSIM3lacdeGiven) - model->BSIM3lacde = 0.0; - if (!model->BSIM3lmoinGiven) - model->BSIM3lmoin = 0.0; - if (!model->BSIM3lnoffGiven) - model->BSIM3lnoff = 0.0; - if (!model->BSIM3lvoffcvGiven) - model->BSIM3lvoffcv = 0.0; + if (!model->BSIM3cdscGiven) + model->BSIM3cdsc = 2.4e-4; /* unit Q/V/m^2 */ + if (!model->BSIM3cdscbGiven) + model->BSIM3cdscb = 0.0; /* unit Q/V/m^2 */ + if (!model->BSIM3cdscdGiven) + model->BSIM3cdscd = 0.0; /* unit Q/V/m^2 */ + if (!model->BSIM3citGiven) + model->BSIM3cit = 0.0; /* unit Q/V/m^2 */ + if (!model->BSIM3nfactorGiven) + model->BSIM3nfactor = 1; + if (!model->BSIM3xjGiven) + model->BSIM3xj = .15e-6; + if (!model->BSIM3vsatGiven) + model->BSIM3vsat = 8.0e4; /* unit m/s */ + if (!model->BSIM3atGiven) + model->BSIM3at = 3.3e4; /* unit m/s */ + if (!model->BSIM3a0Given) + model->BSIM3a0 = 1.0; + if (!model->BSIM3agsGiven) + model->BSIM3ags = 0.0; + if (!model->BSIM3a1Given) + model->BSIM3a1 = 0.0; + if (!model->BSIM3a2Given) + model->BSIM3a2 = 1.0; + if (!model->BSIM3ketaGiven) + model->BSIM3keta = -0.047; /* unit / V */ + if (!model->BSIM3nsubGiven) + model->BSIM3nsub = 6.0e16; /* unit 1/cm3 */ + if (!model->BSIM3npeakGiven) + model->BSIM3npeak = 1.7e17; /* unit 1/cm3 */ + if (!model->BSIM3ngateGiven) + model->BSIM3ngate = 0; /* unit 1/cm3 */ + if (!model->BSIM3vbmGiven) + model->BSIM3vbm = -3.0; + if (!model->BSIM3xtGiven) + model->BSIM3xt = 1.55e-7; + if (!model->BSIM3kt1Given) + model->BSIM3kt1 = -0.11; /* unit V */ + if (!model->BSIM3kt1lGiven) + model->BSIM3kt1l = 0.0; /* unit V*m */ + if (!model->BSIM3kt2Given) + model->BSIM3kt2 = 0.022; /* No unit */ + if (!model->BSIM3k3Given) + model->BSIM3k3 = 80.0; + if (!model->BSIM3k3bGiven) + model->BSIM3k3b = 0.0; + if (!model->BSIM3w0Given) + model->BSIM3w0 = 2.5e-6; + if (!model->BSIM3nlxGiven) + model->BSIM3nlx = 1.74e-7; + if (!model->BSIM3dvt0Given) + model->BSIM3dvt0 = 2.2; + if (!model->BSIM3dvt1Given) + model->BSIM3dvt1 = 0.53; + if (!model->BSIM3dvt2Given) + model->BSIM3dvt2 = -0.032; /* unit 1 / V */ - /* Width dependence */ - if (!model->BSIM3wcdscGiven) - model->BSIM3wcdsc = 0.0; - if (!model->BSIM3wcdscbGiven) - model->BSIM3wcdscb = 0.0; - if (!model->BSIM3wcdscdGiven) - model->BSIM3wcdscd = 0.0; - if (!model->BSIM3wcitGiven) - model->BSIM3wcit = 0.0; - if (!model->BSIM3wnfactorGiven) - model->BSIM3wnfactor = 0.0; - if (!model->BSIM3wxjGiven) - model->BSIM3wxj = 0.0; - if (!model->BSIM3wvsatGiven) - model->BSIM3wvsat = 0.0; - if (!model->BSIM3watGiven) - model->BSIM3wat = 0.0; - if (!model->BSIM3wa0Given) - model->BSIM3wa0 = 0.0; - if (!model->BSIM3wagsGiven) - model->BSIM3wags = 0.0; - if (!model->BSIM3wa1Given) - model->BSIM3wa1 = 0.0; - if (!model->BSIM3wa2Given) - model->BSIM3wa2 = 0.0; - if (!model->BSIM3wketaGiven) - model->BSIM3wketa = 0.0; - if (!model->BSIM3wnsubGiven) - model->BSIM3wnsub = 0.0; - if (!model->BSIM3wnpeakGiven) - model->BSIM3wnpeak = 0.0; - if (!model->BSIM3wngateGiven) - model->BSIM3wngate = 0.0; - if (!model->BSIM3wvbmGiven) - model->BSIM3wvbm = 0.0; - if (!model->BSIM3wxtGiven) - model->BSIM3wxt = 0.0; - if (!model->BSIM3wkt1Given) - model->BSIM3wkt1 = 0.0; - if (!model->BSIM3wkt1lGiven) - model->BSIM3wkt1l = 0.0; - if (!model->BSIM3wkt2Given) - model->BSIM3wkt2 = 0.0; - if (!model->BSIM3wk3Given) - model->BSIM3wk3 = 0.0; - if (!model->BSIM3wk3bGiven) - model->BSIM3wk3b = 0.0; - if (!model->BSIM3ww0Given) - model->BSIM3ww0 = 0.0; - if (!model->BSIM3wnlxGiven) - model->BSIM3wnlx = 0.0; - if (!model->BSIM3wdvt0Given) - model->BSIM3wdvt0 = 0.0; - if (!model->BSIM3wdvt1Given) - model->BSIM3wdvt1 = 0.0; - if (!model->BSIM3wdvt2Given) - model->BSIM3wdvt2 = 0.0; - if (!model->BSIM3wdvt0wGiven) - model->BSIM3wdvt0w = 0.0; - if (!model->BSIM3wdvt1wGiven) - model->BSIM3wdvt1w = 0.0; - if (!model->BSIM3wdvt2wGiven) - model->BSIM3wdvt2w = 0.0; - if (!model->BSIM3wdroutGiven) - model->BSIM3wdrout = 0.0; - if (!model->BSIM3wdsubGiven) - model->BSIM3wdsub = 0.0; - if (!model->BSIM3wvth0Given) - model->BSIM3wvth0 = 0.0; - if (!model->BSIM3wuaGiven) - model->BSIM3wua = 0.0; - if (!model->BSIM3wua1Given) - model->BSIM3wua1 = 0.0; - if (!model->BSIM3wubGiven) - model->BSIM3wub = 0.0; - if (!model->BSIM3wub1Given) - model->BSIM3wub1 = 0.0; - if (!model->BSIM3wucGiven) - model->BSIM3wuc = 0.0; - if (!model->BSIM3wuc1Given) - model->BSIM3wuc1 = 0.0; - if (!model->BSIM3wu0Given) - model->BSIM3wu0 = 0.0; - if (!model->BSIM3wuteGiven) - model->BSIM3wute = 0.0; - if (!model->BSIM3wvoffGiven) - model->BSIM3wvoff = 0.0; - if (!model->BSIM3wdeltaGiven) - model->BSIM3wdelta = 0.0; - if (!model->BSIM3wrdswGiven) - model->BSIM3wrdsw = 0.0; - if (!model->BSIM3wprwbGiven) - model->BSIM3wprwb = 0.0; - if (!model->BSIM3wprwgGiven) - model->BSIM3wprwg = 0.0; - if (!model->BSIM3wprtGiven) - model->BSIM3wprt = 0.0; - if (!model->BSIM3weta0Given) - model->BSIM3weta0 = 0.0; - if (!model->BSIM3wetabGiven) - model->BSIM3wetab = 0.0; - if (!model->BSIM3wpclmGiven) - model->BSIM3wpclm = 0.0; - if (!model->BSIM3wpdibl1Given) - model->BSIM3wpdibl1 = 0.0; - if (!model->BSIM3wpdibl2Given) - model->BSIM3wpdibl2 = 0.0; - if (!model->BSIM3wpdiblbGiven) - model->BSIM3wpdiblb = 0.0; - if (!model->BSIM3wpscbe1Given) - model->BSIM3wpscbe1 = 0.0; - if (!model->BSIM3wpscbe2Given) - model->BSIM3wpscbe2 = 0.0; - if (!model->BSIM3wpvagGiven) - model->BSIM3wpvag = 0.0; - if (!model->BSIM3wwrGiven) - model->BSIM3wwr = 0.0; - if (!model->BSIM3wdwgGiven) - model->BSIM3wdwg = 0.0; - if (!model->BSIM3wdwbGiven) - model->BSIM3wdwb = 0.0; - if (!model->BSIM3wb0Given) - model->BSIM3wb0 = 0.0; - if (!model->BSIM3wb1Given) - model->BSIM3wb1 = 0.0; - if (!model->BSIM3walpha0Given) - model->BSIM3walpha0 = 0.0; - if (!model->BSIM3walpha1Given) - model->BSIM3walpha1 = 0.0; - if (!model->BSIM3wbeta0Given) - model->BSIM3wbeta0 = 0.0; - if (!model->BSIM3wvfbGiven) - model->BSIM3wvfb = 0.0; + if (!model->BSIM3dvt0wGiven) + model->BSIM3dvt0w = 0.0; + if (!model->BSIM3dvt1wGiven) + model->BSIM3dvt1w = 5.3e6; + if (!model->BSIM3dvt2wGiven) + model->BSIM3dvt2w = -0.032; - if (!model->BSIM3welmGiven) - model->BSIM3welm = 0.0; - if (!model->BSIM3wcgslGiven) - model->BSIM3wcgsl = 0.0; - if (!model->BSIM3wcgdlGiven) - model->BSIM3wcgdl = 0.0; - if (!model->BSIM3wckappaGiven) - model->BSIM3wckappa = 0.0; - if (!model->BSIM3wcfGiven) - model->BSIM3wcf = 0.0; - if (!model->BSIM3wclcGiven) - model->BSIM3wclc = 0.0; - if (!model->BSIM3wcleGiven) - model->BSIM3wcle = 0.0; - if (!model->BSIM3wvfbcvGiven) - model->BSIM3wvfbcv = 0.0; - if (!model->BSIM3wacdeGiven) - model->BSIM3wacde = 0.0; - if (!model->BSIM3wmoinGiven) - model->BSIM3wmoin = 0.0; - if (!model->BSIM3wnoffGiven) - model->BSIM3wnoff = 0.0; - if (!model->BSIM3wvoffcvGiven) - model->BSIM3wvoffcv = 0.0; + if (!model->BSIM3droutGiven) + model->BSIM3drout = 0.56; + if (!model->BSIM3dsubGiven) + model->BSIM3dsub = model->BSIM3drout; + if (!model->BSIM3vth0Given) + model->BSIM3vth0 = + (model->BSIM3type == NMOS) ? 0.7 : -0.7; + if (!model->BSIM3uaGiven) + model->BSIM3ua = 2.25e-9; /* unit m/V */ + if (!model->BSIM3ua1Given) + model->BSIM3ua1 = 4.31e-9; /* unit m/V */ + if (!model->BSIM3ubGiven) + model->BSIM3ub = 5.87e-19; /* unit (m/V)**2 */ + if (!model->BSIM3ub1Given) + model->BSIM3ub1 = -7.61e-18; /* unit (m/V)**2 */ + if (!model->BSIM3ucGiven) + model->BSIM3uc = + (model->BSIM3mobMod == + 3) ? -0.0465 : -0.0465e-9; + if (!model->BSIM3uc1Given) + model->BSIM3uc1 = + (model->BSIM3mobMod == + 3) ? -0.056 : -0.056e-9; + if (!model->BSIM3u0Given) + model->BSIM3u0 = + (model->BSIM3type == NMOS) ? 0.067 : 0.025; + if (!model->BSIM3uteGiven) + model->BSIM3ute = -1.5; + if (!model->BSIM3voffGiven) + model->BSIM3voff = -0.08; + if (!model->BSIM3deltaGiven) + model->BSIM3delta = 0.01; + if (!model->BSIM3rdswGiven) + model->BSIM3rdsw = 0; + if (!model->BSIM3prwgGiven) + model->BSIM3prwg = 0.0; /* unit 1/V */ + if (!model->BSIM3prwbGiven) + model->BSIM3prwb = 0.0; + if (!model->BSIM3prtGiven) + if (!model->BSIM3prtGiven) + model->BSIM3prt = 0.0; + if (!model->BSIM3eta0Given) + model->BSIM3eta0 = 0.08; /* no unit */ + if (!model->BSIM3etabGiven) + model->BSIM3etab = -0.07; /* unit 1/V */ + if (!model->BSIM3pclmGiven) + model->BSIM3pclm = 1.3; /* no unit */ + if (!model->BSIM3pdibl1Given) + model->BSIM3pdibl1 = .39; /* no unit */ + if (!model->BSIM3pdibl2Given) + model->BSIM3pdibl2 = 0.0086; /* no unit */ + if (!model->BSIM3pdiblbGiven) + model->BSIM3pdiblb = 0.0; /* 1/V */ + if (!model->BSIM3pscbe1Given) + model->BSIM3pscbe1 = 4.24e8; + if (!model->BSIM3pscbe2Given) + model->BSIM3pscbe2 = 1.0e-5; + if (!model->BSIM3pvagGiven) + model->BSIM3pvag = 0.0; + if (!model->BSIM3wrGiven) + model->BSIM3wr = 1.0; + if (!model->BSIM3dwgGiven) + model->BSIM3dwg = 0.0; + if (!model->BSIM3dwbGiven) + model->BSIM3dwb = 0.0; + if (!model->BSIM3b0Given) + model->BSIM3b0 = 0.0; + if (!model->BSIM3b1Given) + model->BSIM3b1 = 0.0; + if (!model->BSIM3alpha0Given) + model->BSIM3alpha0 = 0.0; + if (!model->BSIM3alpha1Given) + model->BSIM3alpha1 = 0.0; + if (!model->BSIM3beta0Given) + model->BSIM3beta0 = 30.0; + if (!model->BSIM3ijthGiven) + model->BSIM3ijth = 0.1; /* unit A */ - /* Cross-term dependence */ - if (!model->BSIM3pcdscGiven) - model->BSIM3pcdsc = 0.0; - if (!model->BSIM3pcdscbGiven) - model->BSIM3pcdscb = 0.0; - if (!model->BSIM3pcdscdGiven) - model->BSIM3pcdscd = 0.0; - if (!model->BSIM3pcitGiven) - model->BSIM3pcit = 0.0; - if (!model->BSIM3pnfactorGiven) - model->BSIM3pnfactor = 0.0; - if (!model->BSIM3pxjGiven) - model->BSIM3pxj = 0.0; - if (!model->BSIM3pvsatGiven) - model->BSIM3pvsat = 0.0; - if (!model->BSIM3patGiven) - model->BSIM3pat = 0.0; - if (!model->BSIM3pa0Given) - model->BSIM3pa0 = 0.0; + if (!model->BSIM3elmGiven) + model->BSIM3elm = 5.0; + if (!model->BSIM3cgslGiven) + model->BSIM3cgsl = 0.0; + if (!model->BSIM3cgdlGiven) + model->BSIM3cgdl = 0.0; + if (!model->BSIM3ckappaGiven) + model->BSIM3ckappa = 0.6; + if (!model->BSIM3clcGiven) + model->BSIM3clc = 0.1e-6; + if (!model->BSIM3cleGiven) + model->BSIM3cle = 0.6; + if (!model->BSIM3vfbcvGiven) + model->BSIM3vfbcv = -1.0; + if (!model->BSIM3acdeGiven) + model->BSIM3acde = 1.0; + if (!model->BSIM3moinGiven) + model->BSIM3moin = 15.0; + if (!model->BSIM3noffGiven) + model->BSIM3noff = 1.0; + if (!model->BSIM3voffcvGiven) + model->BSIM3voffcv = 0.0; + if (!model->BSIM3tcjGiven) + model->BSIM3tcj = 0.0; + if (!model->BSIM3tpbGiven) + model->BSIM3tpb = 0.0; + if (!model->BSIM3tcjswGiven) + model->BSIM3tcjsw = 0.0; + if (!model->BSIM3tpbswGiven) + model->BSIM3tpbsw = 0.0; + if (!model->BSIM3tcjswgGiven) + model->BSIM3tcjswg = 0.0; + if (!model->BSIM3tpbswgGiven) + model->BSIM3tpbswg = 0.0; - if (!model->BSIM3pagsGiven) - model->BSIM3pags = 0.0; - if (!model->BSIM3pa1Given) - model->BSIM3pa1 = 0.0; - if (!model->BSIM3pa2Given) - model->BSIM3pa2 = 0.0; - if (!model->BSIM3pketaGiven) - model->BSIM3pketa = 0.0; - if (!model->BSIM3pnsubGiven) - model->BSIM3pnsub = 0.0; - if (!model->BSIM3pnpeakGiven) - model->BSIM3pnpeak = 0.0; - if (!model->BSIM3pngateGiven) - model->BSIM3pngate = 0.0; - if (!model->BSIM3pvbmGiven) - model->BSIM3pvbm = 0.0; - if (!model->BSIM3pxtGiven) - model->BSIM3pxt = 0.0; - if (!model->BSIM3pkt1Given) - model->BSIM3pkt1 = 0.0; - if (!model->BSIM3pkt1lGiven) - model->BSIM3pkt1l = 0.0; - if (!model->BSIM3pkt2Given) - model->BSIM3pkt2 = 0.0; - if (!model->BSIM3pk3Given) - model->BSIM3pk3 = 0.0; - if (!model->BSIM3pk3bGiven) - model->BSIM3pk3b = 0.0; - if (!model->BSIM3pw0Given) - model->BSIM3pw0 = 0.0; - if (!model->BSIM3pnlxGiven) - model->BSIM3pnlx = 0.0; - if (!model->BSIM3pdvt0Given) - model->BSIM3pdvt0 = 0.0; - if (!model->BSIM3pdvt1Given) - model->BSIM3pdvt1 = 0.0; - if (!model->BSIM3pdvt2Given) - model->BSIM3pdvt2 = 0.0; - if (!model->BSIM3pdvt0wGiven) - model->BSIM3pdvt0w = 0.0; - if (!model->BSIM3pdvt1wGiven) - model->BSIM3pdvt1w = 0.0; - if (!model->BSIM3pdvt2wGiven) - model->BSIM3pdvt2w = 0.0; - if (!model->BSIM3pdroutGiven) - model->BSIM3pdrout = 0.0; - if (!model->BSIM3pdsubGiven) - model->BSIM3pdsub = 0.0; - if (!model->BSIM3pvth0Given) - model->BSIM3pvth0 = 0.0; - if (!model->BSIM3puaGiven) - model->BSIM3pua = 0.0; - if (!model->BSIM3pua1Given) - model->BSIM3pua1 = 0.0; - if (!model->BSIM3pubGiven) - model->BSIM3pub = 0.0; - if (!model->BSIM3pub1Given) - model->BSIM3pub1 = 0.0; - if (!model->BSIM3pucGiven) - model->BSIM3puc = 0.0; - if (!model->BSIM3puc1Given) - model->BSIM3puc1 = 0.0; - if (!model->BSIM3pu0Given) - model->BSIM3pu0 = 0.0; - if (!model->BSIM3puteGiven) - model->BSIM3pute = 0.0; - if (!model->BSIM3pvoffGiven) - model->BSIM3pvoff = 0.0; - if (!model->BSIM3pdeltaGiven) - model->BSIM3pdelta = 0.0; - if (!model->BSIM3prdswGiven) - model->BSIM3prdsw = 0.0; - if (!model->BSIM3pprwbGiven) - model->BSIM3pprwb = 0.0; - if (!model->BSIM3pprwgGiven) - model->BSIM3pprwg = 0.0; - if (!model->BSIM3pprtGiven) - model->BSIM3pprt = 0.0; - if (!model->BSIM3peta0Given) - model->BSIM3peta0 = 0.0; - if (!model->BSIM3petabGiven) - model->BSIM3petab = 0.0; - if (!model->BSIM3ppclmGiven) - model->BSIM3ppclm = 0.0; - if (!model->BSIM3ppdibl1Given) - model->BSIM3ppdibl1 = 0.0; - if (!model->BSIM3ppdibl2Given) - model->BSIM3ppdibl2 = 0.0; - if (!model->BSIM3ppdiblbGiven) - model->BSIM3ppdiblb = 0.0; - if (!model->BSIM3ppscbe1Given) - model->BSIM3ppscbe1 = 0.0; - if (!model->BSIM3ppscbe2Given) - model->BSIM3ppscbe2 = 0.0; - if (!model->BSIM3ppvagGiven) - model->BSIM3ppvag = 0.0; - if (!model->BSIM3pwrGiven) - model->BSIM3pwr = 0.0; - if (!model->BSIM3pdwgGiven) - model->BSIM3pdwg = 0.0; - if (!model->BSIM3pdwbGiven) - model->BSIM3pdwb = 0.0; - if (!model->BSIM3pb0Given) - model->BSIM3pb0 = 0.0; - if (!model->BSIM3pb1Given) - model->BSIM3pb1 = 0.0; - if (!model->BSIM3palpha0Given) - model->BSIM3palpha0 = 0.0; - if (!model->BSIM3palpha1Given) - model->BSIM3palpha1 = 0.0; - if (!model->BSIM3pbeta0Given) - model->BSIM3pbeta0 = 0.0; - if (!model->BSIM3pvfbGiven) - model->BSIM3pvfb = 0.0; + /* Length dependence */ + if (!model->BSIM3lcdscGiven) + model->BSIM3lcdsc = 0.0; + if (!model->BSIM3lcdscbGiven) + model->BSIM3lcdscb = 0.0; + if (!model->BSIM3lcdscdGiven) + model->BSIM3lcdscd = 0.0; + if (!model->BSIM3lcitGiven) + model->BSIM3lcit = 0.0; + if (!model->BSIM3lnfactorGiven) + model->BSIM3lnfactor = 0.0; + if (!model->BSIM3lxjGiven) + model->BSIM3lxj = 0.0; + if (!model->BSIM3lvsatGiven) + model->BSIM3lvsat = 0.0; + if (!model->BSIM3latGiven) + model->BSIM3lat = 0.0; + if (!model->BSIM3la0Given) + model->BSIM3la0 = 0.0; + if (!model->BSIM3lagsGiven) + model->BSIM3lags = 0.0; + if (!model->BSIM3la1Given) + model->BSIM3la1 = 0.0; + if (!model->BSIM3la2Given) + model->BSIM3la2 = 0.0; + if (!model->BSIM3lketaGiven) + model->BSIM3lketa = 0.0; + if (!model->BSIM3lnsubGiven) + model->BSIM3lnsub = 0.0; + if (!model->BSIM3lnpeakGiven) + model->BSIM3lnpeak = 0.0; + if (!model->BSIM3lngateGiven) + model->BSIM3lngate = 0.0; + if (!model->BSIM3lvbmGiven) + model->BSIM3lvbm = 0.0; + if (!model->BSIM3lxtGiven) + model->BSIM3lxt = 0.0; + if (!model->BSIM3lkt1Given) + model->BSIM3lkt1 = 0.0; + if (!model->BSIM3lkt1lGiven) + model->BSIM3lkt1l = 0.0; + if (!model->BSIM3lkt2Given) + model->BSIM3lkt2 = 0.0; + if (!model->BSIM3lk3Given) + model->BSIM3lk3 = 0.0; + if (!model->BSIM3lk3bGiven) + model->BSIM3lk3b = 0.0; + if (!model->BSIM3lw0Given) + model->BSIM3lw0 = 0.0; + if (!model->BSIM3lnlxGiven) + model->BSIM3lnlx = 0.0; + if (!model->BSIM3ldvt0Given) + model->BSIM3ldvt0 = 0.0; + if (!model->BSIM3ldvt1Given) + model->BSIM3ldvt1 = 0.0; + if (!model->BSIM3ldvt2Given) + model->BSIM3ldvt2 = 0.0; + if (!model->BSIM3ldvt0wGiven) + model->BSIM3ldvt0w = 0.0; + if (!model->BSIM3ldvt1wGiven) + model->BSIM3ldvt1w = 0.0; + if (!model->BSIM3ldvt2wGiven) + model->BSIM3ldvt2w = 0.0; + if (!model->BSIM3ldroutGiven) + model->BSIM3ldrout = 0.0; + if (!model->BSIM3ldsubGiven) + model->BSIM3ldsub = 0.0; + if (!model->BSIM3lvth0Given) + model->BSIM3lvth0 = 0.0; + if (!model->BSIM3luaGiven) + model->BSIM3lua = 0.0; + if (!model->BSIM3lua1Given) + model->BSIM3lua1 = 0.0; + if (!model->BSIM3lubGiven) + model->BSIM3lub = 0.0; + if (!model->BSIM3lub1Given) + model->BSIM3lub1 = 0.0; + if (!model->BSIM3lucGiven) + model->BSIM3luc = 0.0; + if (!model->BSIM3luc1Given) + model->BSIM3luc1 = 0.0; + if (!model->BSIM3lu0Given) + model->BSIM3lu0 = 0.0; + if (!model->BSIM3luteGiven) + model->BSIM3lute = 0.0; + if (!model->BSIM3lvoffGiven) + model->BSIM3lvoff = 0.0; + if (!model->BSIM3ldeltaGiven) + model->BSIM3ldelta = 0.0; + if (!model->BSIM3lrdswGiven) + model->BSIM3lrdsw = 0.0; + if (!model->BSIM3lprwbGiven) + model->BSIM3lprwb = 0.0; + if (!model->BSIM3lprwgGiven) + model->BSIM3lprwg = 0.0; + if (!model->BSIM3lprtGiven) + model->BSIM3lprt = 0.0; + if (!model->BSIM3leta0Given) + model->BSIM3leta0 = 0.0; + if (!model->BSIM3letabGiven) + model->BSIM3letab = -0.0; + if (!model->BSIM3lpclmGiven) + model->BSIM3lpclm = 0.0; + if (!model->BSIM3lpdibl1Given) + model->BSIM3lpdibl1 = 0.0; + if (!model->BSIM3lpdibl2Given) + model->BSIM3lpdibl2 = 0.0; + if (!model->BSIM3lpdiblbGiven) + model->BSIM3lpdiblb = 0.0; + if (!model->BSIM3lpscbe1Given) + model->BSIM3lpscbe1 = 0.0; + if (!model->BSIM3lpscbe2Given) + model->BSIM3lpscbe2 = 0.0; + if (!model->BSIM3lpvagGiven) + model->BSIM3lpvag = 0.0; + if (!model->BSIM3lwrGiven) + model->BSIM3lwr = 0.0; + if (!model->BSIM3ldwgGiven) + model->BSIM3ldwg = 0.0; + if (!model->BSIM3ldwbGiven) + model->BSIM3ldwb = 0.0; + if (!model->BSIM3lb0Given) + model->BSIM3lb0 = 0.0; + if (!model->BSIM3lb1Given) + model->BSIM3lb1 = 0.0; + if (!model->BSIM3lalpha0Given) + model->BSIM3lalpha0 = 0.0; + if (!model->BSIM3lalpha1Given) + model->BSIM3lalpha1 = 0.0; + if (!model->BSIM3lbeta0Given) + model->BSIM3lbeta0 = 0.0; + if (!model->BSIM3lvfbGiven) + model->BSIM3lvfb = 0.0; - if (!model->BSIM3pelmGiven) - model->BSIM3pelm = 0.0; - if (!model->BSIM3pcgslGiven) - model->BSIM3pcgsl = 0.0; - if (!model->BSIM3pcgdlGiven) - model->BSIM3pcgdl = 0.0; - if (!model->BSIM3pckappaGiven) - model->BSIM3pckappa = 0.0; - if (!model->BSIM3pcfGiven) - model->BSIM3pcf = 0.0; - if (!model->BSIM3pclcGiven) - model->BSIM3pclc = 0.0; - if (!model->BSIM3pcleGiven) - model->BSIM3pcle = 0.0; - if (!model->BSIM3pvfbcvGiven) - model->BSIM3pvfbcv = 0.0; - if (!model->BSIM3pacdeGiven) - model->BSIM3pacde = 0.0; - if (!model->BSIM3pmoinGiven) - model->BSIM3pmoin = 0.0; - if (!model->BSIM3pnoffGiven) - model->BSIM3pnoff = 0.0; - if (!model->BSIM3pvoffcvGiven) - model->BSIM3pvoffcv = 0.0; + if (!model->BSIM3lelmGiven) + model->BSIM3lelm = 0.0; + if (!model->BSIM3lcgslGiven) + model->BSIM3lcgsl = 0.0; + if (!model->BSIM3lcgdlGiven) + model->BSIM3lcgdl = 0.0; + if (!model->BSIM3lckappaGiven) + model->BSIM3lckappa = 0.0; + if (!model->BSIM3lclcGiven) + model->BSIM3lclc = 0.0; + if (!model->BSIM3lcleGiven) + model->BSIM3lcle = 0.0; + if (!model->BSIM3lcfGiven) + model->BSIM3lcf = 0.0; + if (!model->BSIM3lvfbcvGiven) + model->BSIM3lvfbcv = 0.0; + if (!model->BSIM3lacdeGiven) + model->BSIM3lacde = 0.0; + if (!model->BSIM3lmoinGiven) + model->BSIM3lmoin = 0.0; + if (!model->BSIM3lnoffGiven) + model->BSIM3lnoff = 0.0; + if (!model->BSIM3lvoffcvGiven) + model->BSIM3lvoffcv = 0.0; - /* unit degree celcius */ - if (!model->BSIM3tnomGiven) - model->BSIM3tnom = ckt->CKTnomTemp; - /* else - model->BSIM3tnom = model->BSIM3tnom + 273.15; */ - if (!model->BSIM3LintGiven) - model->BSIM3Lint = 0.0; - if (!model->BSIM3LlGiven) - model->BSIM3Ll = 0.0; - if (!model->BSIM3LlcGiven) - model->BSIM3Llc = model->BSIM3Ll; - if (!model->BSIM3LlnGiven) - model->BSIM3Lln = 1.0; - if (!model->BSIM3LwGiven) - model->BSIM3Lw = 0.0; - if (!model->BSIM3LwcGiven) - model->BSIM3Lwc = model->BSIM3Lw; - if (!model->BSIM3LwnGiven) - model->BSIM3Lwn = 1.0; - if (!model->BSIM3LwlGiven) - model->BSIM3Lwl = 0.0; - if (!model->BSIM3LwlcGiven) - model->BSIM3Lwlc = model->BSIM3Lwl; - if (!model->BSIM3LminGiven) - model->BSIM3Lmin = 0.0; - if (!model->BSIM3LmaxGiven) - model->BSIM3Lmax = 1.0; - if (!model->BSIM3WintGiven) - model->BSIM3Wint = 0.0; - if (!model->BSIM3WlGiven) - model->BSIM3Wl = 0.0; - if (!model->BSIM3WlcGiven) - model->BSIM3Wlc = model->BSIM3Wl; - if (!model->BSIM3WlnGiven) - model->BSIM3Wln = 1.0; - if (!model->BSIM3WwGiven) - model->BSIM3Ww = 0.0; - if (!model->BSIM3WwcGiven) - model->BSIM3Wwc = model->BSIM3Ww; - if (!model->BSIM3WwnGiven) - model->BSIM3Wwn = 1.0; - if (!model->BSIM3WwlGiven) - model->BSIM3Wwl = 0.0; - if (!model->BSIM3WwlcGiven) - model->BSIM3Wwlc = model->BSIM3Wwl; - if (!model->BSIM3WminGiven) - model->BSIM3Wmin = 0.0; - if (!model->BSIM3WmaxGiven) - model->BSIM3Wmax = 1.0; - if (!model->BSIM3dwcGiven) - model->BSIM3dwc = model->BSIM3Wint; - if (!model->BSIM3dlcGiven) - model->BSIM3dlc = model->BSIM3Lint; - if (!model->BSIM3cfGiven) - model->BSIM3cf = 2.0 * EPSOX / M_PI - * log (1.0 + 0.4e-6 / model->BSIM3tox); - if (!model->BSIM3cgdoGiven) - { - if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) - { - model->BSIM3cgdo = model->BSIM3dlc * model->BSIM3cox - - model->BSIM3cgdl; - } - else - model->BSIM3cgdo = 0.6 * model->BSIM3xj * model->BSIM3cox; - } - if (!model->BSIM3cgsoGiven) - { - if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) - { - model->BSIM3cgso = model->BSIM3dlc * model->BSIM3cox - - model->BSIM3cgsl; - } - else - model->BSIM3cgso = 0.6 * model->BSIM3xj * model->BSIM3cox; - } + /* Width dependence */ + if (!model->BSIM3wcdscGiven) + model->BSIM3wcdsc = 0.0; + if (!model->BSIM3wcdscbGiven) + model->BSIM3wcdscb = 0.0; + if (!model->BSIM3wcdscdGiven) + model->BSIM3wcdscd = 0.0; + if (!model->BSIM3wcitGiven) + model->BSIM3wcit = 0.0; + if (!model->BSIM3wnfactorGiven) + model->BSIM3wnfactor = 0.0; + if (!model->BSIM3wxjGiven) + model->BSIM3wxj = 0.0; + if (!model->BSIM3wvsatGiven) + model->BSIM3wvsat = 0.0; + if (!model->BSIM3watGiven) + model->BSIM3wat = 0.0; + if (!model->BSIM3wa0Given) + model->BSIM3wa0 = 0.0; + if (!model->BSIM3wagsGiven) + model->BSIM3wags = 0.0; + if (!model->BSIM3wa1Given) + model->BSIM3wa1 = 0.0; + if (!model->BSIM3wa2Given) + model->BSIM3wa2 = 0.0; + if (!model->BSIM3wketaGiven) + model->BSIM3wketa = 0.0; + if (!model->BSIM3wnsubGiven) + model->BSIM3wnsub = 0.0; + if (!model->BSIM3wnpeakGiven) + model->BSIM3wnpeak = 0.0; + if (!model->BSIM3wngateGiven) + model->BSIM3wngate = 0.0; + if (!model->BSIM3wvbmGiven) + model->BSIM3wvbm = 0.0; + if (!model->BSIM3wxtGiven) + model->BSIM3wxt = 0.0; + if (!model->BSIM3wkt1Given) + model->BSIM3wkt1 = 0.0; + if (!model->BSIM3wkt1lGiven) + model->BSIM3wkt1l = 0.0; + if (!model->BSIM3wkt2Given) + model->BSIM3wkt2 = 0.0; + if (!model->BSIM3wk3Given) + model->BSIM3wk3 = 0.0; + if (!model->BSIM3wk3bGiven) + model->BSIM3wk3b = 0.0; + if (!model->BSIM3ww0Given) + model->BSIM3ww0 = 0.0; + if (!model->BSIM3wnlxGiven) + model->BSIM3wnlx = 0.0; + if (!model->BSIM3wdvt0Given) + model->BSIM3wdvt0 = 0.0; + if (!model->BSIM3wdvt1Given) + model->BSIM3wdvt1 = 0.0; + if (!model->BSIM3wdvt2Given) + model->BSIM3wdvt2 = 0.0; + if (!model->BSIM3wdvt0wGiven) + model->BSIM3wdvt0w = 0.0; + if (!model->BSIM3wdvt1wGiven) + model->BSIM3wdvt1w = 0.0; + if (!model->BSIM3wdvt2wGiven) + model->BSIM3wdvt2w = 0.0; + if (!model->BSIM3wdroutGiven) + model->BSIM3wdrout = 0.0; + if (!model->BSIM3wdsubGiven) + model->BSIM3wdsub = 0.0; + if (!model->BSIM3wvth0Given) + model->BSIM3wvth0 = 0.0; + if (!model->BSIM3wuaGiven) + model->BSIM3wua = 0.0; + if (!model->BSIM3wua1Given) + model->BSIM3wua1 = 0.0; + if (!model->BSIM3wubGiven) + model->BSIM3wub = 0.0; + if (!model->BSIM3wub1Given) + model->BSIM3wub1 = 0.0; + if (!model->BSIM3wucGiven) + model->BSIM3wuc = 0.0; + if (!model->BSIM3wuc1Given) + model->BSIM3wuc1 = 0.0; + if (!model->BSIM3wu0Given) + model->BSIM3wu0 = 0.0; + if (!model->BSIM3wuteGiven) + model->BSIM3wute = 0.0; + if (!model->BSIM3wvoffGiven) + model->BSIM3wvoff = 0.0; + if (!model->BSIM3wdeltaGiven) + model->BSIM3wdelta = 0.0; + if (!model->BSIM3wrdswGiven) + model->BSIM3wrdsw = 0.0; + if (!model->BSIM3wprwbGiven) + model->BSIM3wprwb = 0.0; + if (!model->BSIM3wprwgGiven) + model->BSIM3wprwg = 0.0; + if (!model->BSIM3wprtGiven) + model->BSIM3wprt = 0.0; + if (!model->BSIM3weta0Given) + model->BSIM3weta0 = 0.0; + if (!model->BSIM3wetabGiven) + model->BSIM3wetab = 0.0; + if (!model->BSIM3wpclmGiven) + model->BSIM3wpclm = 0.0; + if (!model->BSIM3wpdibl1Given) + model->BSIM3wpdibl1 = 0.0; + if (!model->BSIM3wpdibl2Given) + model->BSIM3wpdibl2 = 0.0; + if (!model->BSIM3wpdiblbGiven) + model->BSIM3wpdiblb = 0.0; + if (!model->BSIM3wpscbe1Given) + model->BSIM3wpscbe1 = 0.0; + if (!model->BSIM3wpscbe2Given) + model->BSIM3wpscbe2 = 0.0; + if (!model->BSIM3wpvagGiven) + model->BSIM3wpvag = 0.0; + if (!model->BSIM3wwrGiven) + model->BSIM3wwr = 0.0; + if (!model->BSIM3wdwgGiven) + model->BSIM3wdwg = 0.0; + if (!model->BSIM3wdwbGiven) + model->BSIM3wdwb = 0.0; + if (!model->BSIM3wb0Given) + model->BSIM3wb0 = 0.0; + if (!model->BSIM3wb1Given) + model->BSIM3wb1 = 0.0; + if (!model->BSIM3walpha0Given) + model->BSIM3walpha0 = 0.0; + if (!model->BSIM3walpha1Given) + model->BSIM3walpha1 = 0.0; + if (!model->BSIM3wbeta0Given) + model->BSIM3wbeta0 = 0.0; + if (!model->BSIM3wvfbGiven) + model->BSIM3wvfb = 0.0; - if (!model->BSIM3cgboGiven) - { - model->BSIM3cgbo = 2.0 * model->BSIM3dwc * model->BSIM3cox; - } - if (!model->BSIM3xpartGiven) - model->BSIM3xpart = 0.0; - if (!model->BSIM3sheetResistanceGiven) - model->BSIM3sheetResistance = 0.0; - if (!model->BSIM3unitAreaJctCapGiven) - model->BSIM3unitAreaJctCap = 5.0E-4; - if (!model->BSIM3unitLengthSidewallJctCapGiven) - model->BSIM3unitLengthSidewallJctCap = 5.0E-10; - if (!model->BSIM3unitLengthGateSidewallJctCapGiven) - model->BSIM3unitLengthGateSidewallJctCap = - model->BSIM3unitLengthSidewallJctCap; - if (!model->BSIM3jctSatCurDensityGiven) - model->BSIM3jctSatCurDensity = 1.0E-4; - if (!model->BSIM3jctSidewallSatCurDensityGiven) - model->BSIM3jctSidewallSatCurDensity = 0.0; - if (!model->BSIM3bulkJctPotentialGiven) - model->BSIM3bulkJctPotential = 1.0; - if (!model->BSIM3sidewallJctPotentialGiven) - model->BSIM3sidewallJctPotential = 1.0; - if (!model->BSIM3GatesidewallJctPotentialGiven) - model->BSIM3GatesidewallJctPotential = - model->BSIM3sidewallJctPotential; - if (!model->BSIM3bulkJctBotGradingCoeffGiven) - model->BSIM3bulkJctBotGradingCoeff = 0.5; - if (!model->BSIM3bulkJctSideGradingCoeffGiven) - model->BSIM3bulkJctSideGradingCoeff = 0.33; - if (!model->BSIM3bulkJctGateSideGradingCoeffGiven) - model->BSIM3bulkJctGateSideGradingCoeff = - model->BSIM3bulkJctSideGradingCoeff; - if (!model->BSIM3jctEmissionCoeffGiven) - model->BSIM3jctEmissionCoeff = 1.0; - if (!model->BSIM3jctTempExponentGiven) - model->BSIM3jctTempExponent = 3.0; - if (!model->BSIM3oxideTrapDensityAGiven) - { - if (model->BSIM3type == NMOS) - model->BSIM3oxideTrapDensityA = 1e20; - else - model->BSIM3oxideTrapDensityA = 9.9e18; - } - if (!model->BSIM3oxideTrapDensityBGiven) - { - if (model->BSIM3type == NMOS) - model->BSIM3oxideTrapDensityB = 5e4; - else - model->BSIM3oxideTrapDensityB = 2.4e3; - } - if (!model->BSIM3oxideTrapDensityCGiven) - { - if (model->BSIM3type == NMOS) - model->BSIM3oxideTrapDensityC = -1.4e-12; - else - model->BSIM3oxideTrapDensityC = 1.4e-12; - - } - if (!model->BSIM3emGiven) - model->BSIM3em = 4.1e7; /* V/m */ - if (!model->BSIM3efGiven) - model->BSIM3ef = 1.0; - if (!model->BSIM3afGiven) - model->BSIM3af = 1.0; - if (!model->BSIM3kfGiven) - model->BSIM3kf = 0.0; - /* loop through all the instances of the model */ - for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) - { - if (here->BSIM3owner == ARCHme) - { - /* allocate a chunk of the state vector */ + if (!model->BSIM3welmGiven) + model->BSIM3welm = 0.0; + if (!model->BSIM3wcgslGiven) + model->BSIM3wcgsl = 0.0; + if (!model->BSIM3wcgdlGiven) + model->BSIM3wcgdl = 0.0; + if (!model->BSIM3wckappaGiven) + model->BSIM3wckappa = 0.0; + if (!model->BSIM3wcfGiven) + model->BSIM3wcf = 0.0; + if (!model->BSIM3wclcGiven) + model->BSIM3wclc = 0.0; + if (!model->BSIM3wcleGiven) + model->BSIM3wcle = 0.0; + if (!model->BSIM3wvfbcvGiven) + model->BSIM3wvfbcv = 0.0; + if (!model->BSIM3wacdeGiven) + model->BSIM3wacde = 0.0; + if (!model->BSIM3wmoinGiven) + model->BSIM3wmoin = 0.0; + if (!model->BSIM3wnoffGiven) + model->BSIM3wnoff = 0.0; + if (!model->BSIM3wvoffcvGiven) + model->BSIM3wvoffcv = 0.0; - here->BSIM3states = *states; - *states += BSIM3numStates; - } + /* Cross-term dependence */ + if (!model->BSIM3pcdscGiven) + model->BSIM3pcdsc = 0.0; + if (!model->BSIM3pcdscbGiven) + model->BSIM3pcdscb = 0.0; + if (!model->BSIM3pcdscdGiven) + model->BSIM3pcdscd = 0.0; + if (!model->BSIM3pcitGiven) + model->BSIM3pcit = 0.0; + if (!model->BSIM3pnfactorGiven) + model->BSIM3pnfactor = 0.0; + if (!model->BSIM3pxjGiven) + model->BSIM3pxj = 0.0; + if (!model->BSIM3pvsatGiven) + model->BSIM3pvsat = 0.0; + if (!model->BSIM3patGiven) + model->BSIM3pat = 0.0; + if (!model->BSIM3pa0Given) + model->BSIM3pa0 = 0.0; - /* perform the parameter defaulting */ - if (!here->BSIM3drainAreaGiven) - here->BSIM3drainArea = 0.0; - if (!here->BSIM3drainPerimeterGiven) - here->BSIM3drainPerimeter = 0.0; - if (!here->BSIM3drainSquaresGiven) - here->BSIM3drainSquares = 1.0; - if (!here->BSIM3icVBSGiven) - here->BSIM3icVBS = 0.0; - if (!here->BSIM3icVDSGiven) - here->BSIM3icVDS = 0.0; - if (!here->BSIM3icVGSGiven) - here->BSIM3icVGS = 0.0; - if (!here->BSIM3lGiven) - here->BSIM3l = 5.0e-6; - if (!here->BSIM3sourceAreaGiven) - here->BSIM3sourceArea = 0.0; - if (!here->BSIM3sourcePerimeterGiven) - here->BSIM3sourcePerimeter = 0.0; - if (!here->BSIM3sourceSquaresGiven) - here->BSIM3sourceSquares = 1.0; - if (!here->BSIM3wGiven) - here->BSIM3w = 5.0e-6; - if (!here->BSIM3nqsModGiven) - here->BSIM3nqsMod = 0; + if (!model->BSIM3pagsGiven) + model->BSIM3pags = 0.0; + if (!model->BSIM3pa1Given) + model->BSIM3pa1 = 0.0; + if (!model->BSIM3pa2Given) + model->BSIM3pa2 = 0.0; + if (!model->BSIM3pketaGiven) + model->BSIM3pketa = 0.0; + if (!model->BSIM3pnsubGiven) + model->BSIM3pnsub = 0.0; + if (!model->BSIM3pnpeakGiven) + model->BSIM3pnpeak = 0.0; + if (!model->BSIM3pngateGiven) + model->BSIM3pngate = 0.0; + if (!model->BSIM3pvbmGiven) + model->BSIM3pvbm = 0.0; + if (!model->BSIM3pxtGiven) + model->BSIM3pxt = 0.0; + if (!model->BSIM3pkt1Given) + model->BSIM3pkt1 = 0.0; + if (!model->BSIM3pkt1lGiven) + model->BSIM3pkt1l = 0.0; + if (!model->BSIM3pkt2Given) + model->BSIM3pkt2 = 0.0; + if (!model->BSIM3pk3Given) + model->BSIM3pk3 = 0.0; + if (!model->BSIM3pk3bGiven) + model->BSIM3pk3b = 0.0; + if (!model->BSIM3pw0Given) + model->BSIM3pw0 = 0.0; + if (!model->BSIM3pnlxGiven) + model->BSIM3pnlx = 0.0; + if (!model->BSIM3pdvt0Given) + model->BSIM3pdvt0 = 0.0; + if (!model->BSIM3pdvt1Given) + model->BSIM3pdvt1 = 0.0; + if (!model->BSIM3pdvt2Given) + model->BSIM3pdvt2 = 0.0; + if (!model->BSIM3pdvt0wGiven) + model->BSIM3pdvt0w = 0.0; + if (!model->BSIM3pdvt1wGiven) + model->BSIM3pdvt1w = 0.0; + if (!model->BSIM3pdvt2wGiven) + model->BSIM3pdvt2w = 0.0; + if (!model->BSIM3pdroutGiven) + model->BSIM3pdrout = 0.0; + if (!model->BSIM3pdsubGiven) + model->BSIM3pdsub = 0.0; + if (!model->BSIM3pvth0Given) + model->BSIM3pvth0 = 0.0; + if (!model->BSIM3puaGiven) + model->BSIM3pua = 0.0; + if (!model->BSIM3pua1Given) + model->BSIM3pua1 = 0.0; + if (!model->BSIM3pubGiven) + model->BSIM3pub = 0.0; + if (!model->BSIM3pub1Given) + model->BSIM3pub1 = 0.0; + if (!model->BSIM3pucGiven) + model->BSIM3puc = 0.0; + if (!model->BSIM3puc1Given) + model->BSIM3puc1 = 0.0; + if (!model->BSIM3pu0Given) + model->BSIM3pu0 = 0.0; + if (!model->BSIM3puteGiven) + model->BSIM3pute = 0.0; + if (!model->BSIM3pvoffGiven) + model->BSIM3pvoff = 0.0; + if (!model->BSIM3pdeltaGiven) + model->BSIM3pdelta = 0.0; + if (!model->BSIM3prdswGiven) + model->BSIM3prdsw = 0.0; + if (!model->BSIM3pprwbGiven) + model->BSIM3pprwb = 0.0; + if (!model->BSIM3pprwgGiven) + model->BSIM3pprwg = 0.0; + if (!model->BSIM3pprtGiven) + model->BSIM3pprt = 0.0; + if (!model->BSIM3peta0Given) + model->BSIM3peta0 = 0.0; + if (!model->BSIM3petabGiven) + model->BSIM3petab = 0.0; + if (!model->BSIM3ppclmGiven) + model->BSIM3ppclm = 0.0; + if (!model->BSIM3ppdibl1Given) + model->BSIM3ppdibl1 = 0.0; + if (!model->BSIM3ppdibl2Given) + model->BSIM3ppdibl2 = 0.0; + if (!model->BSIM3ppdiblbGiven) + model->BSIM3ppdiblb = 0.0; + if (!model->BSIM3ppscbe1Given) + model->BSIM3ppscbe1 = 0.0; + if (!model->BSIM3ppscbe2Given) + model->BSIM3ppscbe2 = 0.0; + if (!model->BSIM3ppvagGiven) + model->BSIM3ppvag = 0.0; + if (!model->BSIM3pwrGiven) + model->BSIM3pwr = 0.0; + if (!model->BSIM3pdwgGiven) + model->BSIM3pdwg = 0.0; + if (!model->BSIM3pdwbGiven) + model->BSIM3pdwb = 0.0; + if (!model->BSIM3pb0Given) + model->BSIM3pb0 = 0.0; + if (!model->BSIM3pb1Given) + model->BSIM3pb1 = 0.0; + if (!model->BSIM3palpha0Given) + model->BSIM3palpha0 = 0.0; + if (!model->BSIM3palpha1Given) + model->BSIM3palpha1 = 0.0; + if (!model->BSIM3pbeta0Given) + model->BSIM3pbeta0 = 0.0; + if (!model->BSIM3pvfbGiven) + model->BSIM3pvfb = 0.0; - if (!here->BSIM3mGiven) - here->BSIM3m = 1; + if (!model->BSIM3pelmGiven) + model->BSIM3pelm = 0.0; + if (!model->BSIM3pcgslGiven) + model->BSIM3pcgsl = 0.0; + if (!model->BSIM3pcgdlGiven) + model->BSIM3pcgdl = 0.0; + if (!model->BSIM3pckappaGiven) + model->BSIM3pckappa = 0.0; + if (!model->BSIM3pcfGiven) + model->BSIM3pcf = 0.0; + if (!model->BSIM3pclcGiven) + model->BSIM3pclc = 0.0; + if (!model->BSIM3pcleGiven) + model->BSIM3pcle = 0.0; + if (!model->BSIM3pvfbcvGiven) + model->BSIM3pvfbcv = 0.0; + if (!model->BSIM3pacdeGiven) + model->BSIM3pacde = 0.0; + if (!model->BSIM3pmoinGiven) + model->BSIM3pmoin = 0.0; + if (!model->BSIM3pnoffGiven) + model->BSIM3pnoff = 0.0; + if (!model->BSIM3pvoffcvGiven) + model->BSIM3pvoffcv = 0.0; - /* process drain series resistance */ - if ((model->BSIM3sheetResistance > 0.0) && - (here->BSIM3drainSquares > 0.0) && (here->BSIM3dNodePrime == 0)) - { - error = CKTmkVolt (ckt, &tmp, here->BSIM3name, "drain"); - if (error) - return (error); - here->BSIM3dNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) + /* unit degree celcius */ + if (!model->BSIM3tnomGiven) + model->BSIM3tnom = ckt->CKTnomTemp; + if (!model->BSIM3LintGiven) + model->BSIM3Lint = 0.0; + if (!model->BSIM3LlGiven) + model->BSIM3Ll = 0.0; + if (!model->BSIM3LlcGiven) + model->BSIM3Llc = model->BSIM3Ll; + if (!model->BSIM3LlnGiven) + model->BSIM3Lln = 1.0; + if (!model->BSIM3LwGiven) + model->BSIM3Lw = 0.0; + if (!model->BSIM3LwcGiven) + model->BSIM3Lwc = model->BSIM3Lw; + if (!model->BSIM3LwnGiven) + model->BSIM3Lwn = 1.0; + if (!model->BSIM3LwlGiven) + model->BSIM3Lwl = 0.0; + if (!model->BSIM3LwlcGiven) + model->BSIM3Lwlc = model->BSIM3Lwl; + if (!model->BSIM3LminGiven) + model->BSIM3Lmin = 0.0; + if (!model->BSIM3LmaxGiven) + model->BSIM3Lmax = 1.0; + if (!model->BSIM3WintGiven) + model->BSIM3Wint = 0.0; + if (!model->BSIM3WlGiven) + model->BSIM3Wl = 0.0; + if (!model->BSIM3WlcGiven) + model->BSIM3Wlc = model->BSIM3Wl; + if (!model->BSIM3WlnGiven) + model->BSIM3Wln = 1.0; + if (!model->BSIM3WwGiven) + model->BSIM3Ww = 0.0; + if (!model->BSIM3WwcGiven) + model->BSIM3Wwc = model->BSIM3Ww; + if (!model->BSIM3WwnGiven) + model->BSIM3Wwn = 1.0; + if (!model->BSIM3WwlGiven) + model->BSIM3Wwl = 0.0; + if (!model->BSIM3WwlcGiven) + model->BSIM3Wwlc = model->BSIM3Wwl; + if (!model->BSIM3WminGiven) + model->BSIM3Wmin = 0.0; + if (!model->BSIM3WmaxGiven) + model->BSIM3Wmax = 1.0; + if (!model->BSIM3dwcGiven) + model->BSIM3dwc = model->BSIM3Wint; + if (!model->BSIM3dlcGiven) + model->BSIM3dlc = model->BSIM3Lint; + if (!model->BSIM3cfGiven) + model->BSIM3cf = 2.0 * EPSOX / PI + * log (1.0 + 0.4e-6 / model->BSIM3tox); + if (!model->BSIM3cgdoGiven) { - CKTnode *tmpNode; - IFuid tmpName; - - if (CKTinst2Node (ckt, here, 1, &tmpNode, &tmpName) == OK) - { - if (tmpNode->nsGiven) + if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) { - tmp->nodeset = tmpNode->nodeset; - tmp->nsGiven = tmpNode->nsGiven; + model->BSIM3cgdo = + model->BSIM3dlc * model->BSIM3cox - + model->BSIM3cgdl; } - } + else + model->BSIM3cgdo = + 0.6 * model->BSIM3xj * + model->BSIM3cox; + } + if (!model->BSIM3cgsoGiven) + { + if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) + { + model->BSIM3cgso = + model->BSIM3dlc * model->BSIM3cox - + model->BSIM3cgsl; + } + else + model->BSIM3cgso = + 0.6 * model->BSIM3xj * + model->BSIM3cox; } - } - else - { - here->BSIM3dNodePrime = here->BSIM3dNode; - } - /* process source series resistance */ - if ((model->BSIM3sheetResistance > 0.0) && - (here->BSIM3sourceSquares > 0.0) && - (here->BSIM3sNodePrime == 0)) - { - error = CKTmkVolt (ckt, &tmp, here->BSIM3name, "source"); - if (error) - return (error); - here->BSIM3sNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) + if (!model->BSIM3cgboGiven) + { + model->BSIM3cgbo = + 2.0 * model->BSIM3dwc * model->BSIM3cox; + } + if (!model->BSIM3xpartGiven) + model->BSIM3xpart = 0.0; + if (!model->BSIM3sheetResistanceGiven) + model->BSIM3sheetResistance = 0.0; + if (!model->BSIM3unitAreaJctCapGiven) + model->BSIM3unitAreaJctCap = 5.0E-4; + if (!model->BSIM3unitLengthSidewallJctCapGiven) + model->BSIM3unitLengthSidewallJctCap = 5.0E-10; + if (!model->BSIM3unitLengthGateSidewallJctCapGiven) + model->BSIM3unitLengthGateSidewallJctCap = + model->BSIM3unitLengthSidewallJctCap; + if (!model->BSIM3jctSatCurDensityGiven) + model->BSIM3jctSatCurDensity = 1.0E-4; + if (!model->BSIM3jctSidewallSatCurDensityGiven) + model->BSIM3jctSidewallSatCurDensity = 0.0; + if (!model->BSIM3bulkJctPotentialGiven) + model->BSIM3bulkJctPotential = 1.0; + if (!model->BSIM3sidewallJctPotentialGiven) + model->BSIM3sidewallJctPotential = 1.0; + if (!model->BSIM3GatesidewallJctPotentialGiven) + model->BSIM3GatesidewallJctPotential = + model->BSIM3sidewallJctPotential; + if (!model->BSIM3bulkJctBotGradingCoeffGiven) + model->BSIM3bulkJctBotGradingCoeff = 0.5; + if (!model->BSIM3bulkJctSideGradingCoeffGiven) + model->BSIM3bulkJctSideGradingCoeff = 0.33; + if (!model->BSIM3bulkJctGateSideGradingCoeffGiven) + model->BSIM3bulkJctGateSideGradingCoeff = + model->BSIM3bulkJctSideGradingCoeff; + if (!model->BSIM3jctEmissionCoeffGiven) + model->BSIM3jctEmissionCoeff = 1.0; + if (!model->BSIM3jctTempExponentGiven) + model->BSIM3jctTempExponent = 3.0; + if (!model->BSIM3oxideTrapDensityAGiven) + { + if (model->BSIM3type == NMOS) + model->BSIM3oxideTrapDensityA = 1e20; + else + model->BSIM3oxideTrapDensityA = 9.9e18; + } + if (!model->BSIM3oxideTrapDensityBGiven) + { + if (model->BSIM3type == NMOS) + model->BSIM3oxideTrapDensityB = 5e4; + else + model->BSIM3oxideTrapDensityB = 2.4e3; + } + if (!model->BSIM3oxideTrapDensityCGiven) { - CKTnode *tmpNode; - IFuid tmpName; + if (model->BSIM3type == NMOS) + model->BSIM3oxideTrapDensityC = -1.4e-12; + else + model->BSIM3oxideTrapDensityC = 1.4e-12; - if (CKTinst2Node (ckt, here, 3, &tmpNode, &tmpName) == OK) - { - if (tmpNode->nsGiven) + } + if (!model->BSIM3emGiven) + model->BSIM3em = 4.1e7; /* V/m */ + if (!model->BSIM3efGiven) + model->BSIM3ef = 1.0; + if (!model->BSIM3afGiven) + model->BSIM3af = 1.0; + if (!model->BSIM3kfGiven) + model->BSIM3kf = 0.0; + /* loop through all the instances of the model */ + for (here = model->BSIM3instances; here != NULL; + here = here->BSIM3nextInstance) + { + + if (here->BSIM3owner == ARCHme) { - tmp->nodeset = tmpNode->nodeset; - tmp->nsGiven = tmpNode->nsGiven; + /* allocate a chunk of the state vector */ + + here->BSIM3states = *states; + *states += BSIM3numStates; + } + + /* perform the parameter defaulting */ + if (!here->BSIM3drainAreaGiven) + here->BSIM3drainArea = 0.0; + if (!here->BSIM3drainPerimeterGiven) + here->BSIM3drainPerimeter = 0.0; + if (!here->BSIM3drainSquaresGiven) + here->BSIM3drainSquares = 1.0; + if (!here->BSIM3icVBSGiven) + here->BSIM3icVBS = 0.0; + if (!here->BSIM3icVDSGiven) + here->BSIM3icVDS = 0.0; + if (!here->BSIM3icVGSGiven) + here->BSIM3icVGS = 0.0; + if (!here->BSIM3lGiven) + here->BSIM3l = 5.0e-6; + if (!here->BSIM3sourceAreaGiven) + here->BSIM3sourceArea = 0.0; + if (!here->BSIM3sourcePerimeterGiven) + here->BSIM3sourcePerimeter = 0.0; + if (!here->BSIM3sourceSquaresGiven) + here->BSIM3sourceSquares = 1.0; + if (!here->BSIM3wGiven) + here->BSIM3w = 5.0e-6; + + if (!here->BSIM3mGiven) + here->BSIM3m = 1; + + if (!here->BSIM3nqsModGiven) + here->BSIM3nqsMod = 0; + + /* process drain series resistance */ + if ((model->BSIM3sheetResistance > 0.0) && + (here->BSIM3drainSquares > 0.0) && + (here->BSIM3dNodePrime == 0)) + { + error = CKTmkVolt (ckt, &tmp, here->BSIM3name, + "drain"); + if (error) + return (error); + here->BSIM3dNodePrime = tmp->number; + if (ckt->CKTcopyNodesets) + { + if (CKTinst2Node(ckt, here, 1, &tmpNode, &tmpName) == OK) + { + if (tmpNode->nsGiven) + { + tmp->nodeset = tmpNode->nodeset; + tmp->nsGiven = tmpNode->nsGiven; + } + } + } + } + else + { + here->BSIM3dNodePrime = here->BSIM3dNode; + } + + /* process source series resistance */ + if ((model->BSIM3sheetResistance > 0.0) && + (here->BSIM3sourceSquares > 0.0) && + (here->BSIM3sNodePrime == 0)) + { + error = CKTmkVolt (ckt, &tmp, here->BSIM3name, + "source"); + if (error) + return (error); + here->BSIM3sNodePrime = tmp->number; + if (ckt->CKTcopyNodesets) + { + if (CKTinst2Node + (ckt, here, 3, &tmpNode, + &tmpName) == OK) + { + if (tmpNode->nsGiven) + { + tmp->nodeset = tmpNode->nodeset; + tmp->nsGiven = tmpNode->nsGiven; + } + } + } + } + else + { + here->BSIM3sNodePrime = here->BSIM3sNode; } - } - } - } - else - { - here->BSIM3sNodePrime = here->BSIM3sNode; - } - /* internal charge node */ + /* internal charge node */ - if ((here->BSIM3nqsMod) && (here->BSIM3qNode == 0)) - { - error = CKTmkVolt (ckt, &tmp, here->BSIM3name, "charge"); - if (error) - return (error); - here->BSIM3qNode = tmp->number; - } - else - { - here->BSIM3qNode = 0; - } + if ((here->BSIM3nqsMod) && (here->BSIM3qNode == 0)) + { + error = CKTmkVolt (ckt, &tmp, here->BSIM3name, + "charge"); + if (error) + return (error); + here->BSIM3qNode = tmp->number; + } + else + { + here->BSIM3qNode = 0; + } - /* set Sparse Matrix Pointers */ + /* set Sparse Matrix Pointers */ /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ @@ -975,70 +1028,70 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ return(E_NOMEM);\ } - TSTALLOC (BSIM3DdPtr, BSIM3dNode, BSIM3dNode) - TSTALLOC (BSIM3GgPtr, BSIM3gNode, BSIM3gNode) - TSTALLOC (BSIM3SsPtr, BSIM3sNode, BSIM3sNode) - TSTALLOC (BSIM3BbPtr, BSIM3bNode, BSIM3bNode) - TSTALLOC (BSIM3DPdpPtr, BSIM3dNodePrime, BSIM3dNodePrime) - TSTALLOC (BSIM3SPspPtr, BSIM3sNodePrime, BSIM3sNodePrime) - TSTALLOC (BSIM3DdpPtr, BSIM3dNode, BSIM3dNodePrime) - TSTALLOC (BSIM3GbPtr, BSIM3gNode, BSIM3bNode) - TSTALLOC (BSIM3GdpPtr, BSIM3gNode, BSIM3dNodePrime) - TSTALLOC (BSIM3GspPtr, BSIM3gNode, BSIM3sNodePrime) - TSTALLOC (BSIM3SspPtr, BSIM3sNode, BSIM3sNodePrime) - TSTALLOC (BSIM3BdpPtr, BSIM3bNode, BSIM3dNodePrime) - TSTALLOC (BSIM3BspPtr, BSIM3bNode, BSIM3sNodePrime) - TSTALLOC (BSIM3DPspPtr, BSIM3dNodePrime, BSIM3sNodePrime) - TSTALLOC (BSIM3DPdPtr, BSIM3dNodePrime, BSIM3dNode) - TSTALLOC (BSIM3BgPtr, BSIM3bNode, BSIM3gNode) - TSTALLOC (BSIM3DPgPtr, BSIM3dNodePrime, BSIM3gNode) - TSTALLOC (BSIM3SPgPtr, BSIM3sNodePrime, BSIM3gNode) - TSTALLOC (BSIM3SPsPtr, BSIM3sNodePrime, BSIM3sNode) - TSTALLOC (BSIM3DPbPtr, BSIM3dNodePrime, BSIM3bNode) - TSTALLOC (BSIM3SPbPtr, BSIM3sNodePrime, BSIM3bNode) - TSTALLOC (BSIM3SPdpPtr, BSIM3sNodePrime, BSIM3dNodePrime) - TSTALLOC (BSIM3QqPtr, BSIM3qNode, BSIM3qNode) - TSTALLOC (BSIM3QdpPtr, BSIM3qNode, BSIM3dNodePrime) - TSTALLOC (BSIM3QspPtr, BSIM3qNode, BSIM3sNodePrime) - TSTALLOC (BSIM3QgPtr, BSIM3qNode, BSIM3gNode) - TSTALLOC (BSIM3QbPtr, BSIM3qNode, BSIM3bNode) - TSTALLOC (BSIM3DPqPtr, BSIM3dNodePrime, BSIM3qNode) - TSTALLOC (BSIM3SPqPtr, BSIM3sNodePrime, BSIM3qNode) - TSTALLOC (BSIM3GqPtr, BSIM3gNode, BSIM3qNode) - TSTALLOC (BSIM3BqPtr, BSIM3bNode, BSIM3qNode)} - } - return (OK); + TSTALLOC (BSIM3DdPtr, BSIM3dNode, BSIM3dNode) + TSTALLOC (BSIM3GgPtr, BSIM3gNode, BSIM3gNode) + TSTALLOC (BSIM3SsPtr, BSIM3sNode, BSIM3sNode) + TSTALLOC (BSIM3BbPtr, BSIM3bNode, BSIM3bNode) + TSTALLOC (BSIM3DPdpPtr, BSIM3dNodePrime, BSIM3dNodePrime) + TSTALLOC (BSIM3SPspPtr, BSIM3sNodePrime, BSIM3sNodePrime) + TSTALLOC (BSIM3DdpPtr, BSIM3dNode, BSIM3dNodePrime) + TSTALLOC (BSIM3GbPtr, BSIM3gNode, BSIM3bNode) + TSTALLOC (BSIM3GdpPtr, BSIM3gNode, BSIM3dNodePrime) + TSTALLOC (BSIM3GspPtr, BSIM3gNode, BSIM3sNodePrime) + TSTALLOC (BSIM3SspPtr, BSIM3sNode, BSIM3sNodePrime) + TSTALLOC (BSIM3BdpPtr, BSIM3bNode, BSIM3dNodePrime) + TSTALLOC (BSIM3BspPtr, BSIM3bNode, BSIM3sNodePrime) + TSTALLOC (BSIM3DPspPtr, BSIM3dNodePrime, BSIM3sNodePrime) + TSTALLOC (BSIM3DPdPtr, BSIM3dNodePrime, BSIM3dNode) + TSTALLOC (BSIM3BgPtr, BSIM3bNode, BSIM3gNode) + TSTALLOC (BSIM3DPgPtr, BSIM3dNodePrime, BSIM3gNode) + TSTALLOC (BSIM3SPgPtr, BSIM3sNodePrime, BSIM3gNode) + TSTALLOC (BSIM3SPsPtr, BSIM3sNodePrime, BSIM3sNode) + TSTALLOC (BSIM3DPbPtr, BSIM3dNodePrime, BSIM3bNode) + TSTALLOC (BSIM3SPbPtr, BSIM3sNodePrime, BSIM3bNode) + TSTALLOC (BSIM3SPdpPtr, BSIM3sNodePrime, BSIM3dNodePrime) + TSTALLOC (BSIM3QqPtr, BSIM3qNode, BSIM3qNode) + TSTALLOC (BSIM3QdpPtr, BSIM3qNode, BSIM3dNodePrime) + TSTALLOC (BSIM3QspPtr, BSIM3qNode, BSIM3sNodePrime) + TSTALLOC (BSIM3QgPtr, BSIM3qNode, BSIM3gNode) + TSTALLOC (BSIM3QbPtr, BSIM3qNode, BSIM3bNode) + TSTALLOC (BSIM3DPqPtr, BSIM3dNodePrime, BSIM3qNode) + TSTALLOC (BSIM3SPqPtr, BSIM3sNodePrime, BSIM3qNode) + TSTALLOC (BSIM3GqPtr, BSIM3gNode, BSIM3qNode) + TSTALLOC (BSIM3BqPtr, BSIM3bNode, BSIM3qNode) + } + } + return (OK); } - int BSIM3unsetup (inModel, ckt) GENmodel *inModel; CKTcircuit *ckt; { - BSIM3model *model; - BSIM3instance *here; + BSIM3model *model; + BSIM3instance *here; - for (model = (BSIM3model *) inModel; model != NULL; - model = model->BSIM3nextModel) - { - for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) + for (model = (BSIM3model *) inModel; model != NULL; + model = model->BSIM3nextModel) { - if (here->BSIM3dNodePrime - && here->BSIM3dNodePrime != here->BSIM3dNode) - { - CKTdltNNum (ckt, here->BSIM3dNodePrime); - here->BSIM3dNodePrime = 0; - } - if (here->BSIM3sNodePrime - && here->BSIM3sNodePrime != here->BSIM3sNode) - { - CKTdltNNum (ckt, here->BSIM3sNodePrime); - here->BSIM3sNodePrime = 0; - } + for (here = model->BSIM3instances; here != NULL; + here = here->BSIM3nextInstance) + { + if (here->BSIM3dNodePrime + && here->BSIM3dNodePrime != here->BSIM3dNode) + { + CKTdltNNum (ckt, here->BSIM3dNodePrime); + here->BSIM3dNodePrime = 0; + } + if (here->BSIM3sNodePrime + && here->BSIM3sNodePrime != here->BSIM3sNode) + { + CKTdltNNum (ckt, here->BSIM3sNodePrime); + here->BSIM3sNodePrime = 0; + } + } } - } - return OK; + return OK; } diff --git a/src/spicelib/devices/bsim3/b3temp.c b/src/spicelib/devices/bsim3/b3temp.c index 077066e46..94b8c9132 100644 --- a/src/spicelib/devices/bsim3/b3temp.c +++ b/src/spicelib/devices/bsim3/b3temp.c @@ -1,14 +1,25 @@ -/*********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -File: b3temp.c -**********/ +/********** + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3temp.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + +/*************************************/ + /* Lmin, Lmax, Wmin, Wmax */ #include "ngspice.h" -#include -#include #include "smpdefs.h" #include "cktdefs.h" #include "bsim3def.h" @@ -17,10 +28,10 @@ File: b3temp.c #include "suffix.h" #define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */ +#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */ #define EPSOX 3.453133e-11 #define EPSSI 1.03594e-10 -/* #define PI 3.141592654 */ +#define PI 3.141592654 #define MAX_EXP 5.834617425e14 #define MIN_EXP 1.713908431e-15 #define EXP_THRESHOLD 34.0 @@ -29,828 +40,1130 @@ File: b3temp.c /* ARGSUSED */ int -BSIM3temp(inModel,ckt) -GENmodel *inModel; -CKTcircuit *ckt; +BSIM3temp (GENmodel * inModel, CKTcircuit * ckt) { -BSIM3model *model = (BSIM3model*) inModel; -BSIM3instance *here; -struct bsim3SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam; -double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn; -double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; -double Nvtm, SourceSatCurrent, DrainSatCurrent; -int Size_Not_Found; - - /* loop through all the BSIM3 device models */ - for (; model != NULL; model = model->BSIM3nextModel) - { Temp = ckt->CKTtemp; - if (model->BSIM3bulkJctPotential < 0.1) - { model->BSIM3bulkJctPotential = 0.1; - fprintf(stderr, "Given pb is less than 0.1. Pb is set to 0.1.\n"); - } - if (model->BSIM3sidewallJctPotential < 0.1) - { model->BSIM3sidewallJctPotential = 0.1; - fprintf(stderr, "Given pbsw is less than 0.1. Pbsw is set to 0.1.\n"); - } - if (model->BSIM3GatesidewallJctPotential < 0.1) - { model->BSIM3GatesidewallJctPotential = 0.1; - fprintf(stderr, "Given pbswg is less than 0.1. Pbswg is set to 0.1.\n"); - } - /* va: was memory leakage - free old node, (or better use again?) */ - FREE(model->pSizeDependParamKnot); - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->BSIM3tnom; - TRatio = Temp / Tnom; - - model->BSIM3vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - model->BSIM3factor1 = sqrt(EPSSI / EPSOX * model->BSIM3tox); - - Vtm0 = KboQ * Tnom; - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) - * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); - - model->BSIM3vtm = KboQ * Temp; - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - if (Temp != Tnom) - { T0 = Eg0 / Vtm0 - Eg / model->BSIM3vtm + model->BSIM3jctTempExponent - * log(Temp / Tnom); - T1 = exp(T0 / model->BSIM3jctEmissionCoeff); - model->BSIM3jctTempSatCurDensity = model->BSIM3jctSatCurDensity - * T1; - model->BSIM3jctSidewallTempSatCurDensity - = model->BSIM3jctSidewallSatCurDensity * T1; - } - else - { model->BSIM3jctTempSatCurDensity = model->BSIM3jctSatCurDensity; - model->BSIM3jctSidewallTempSatCurDensity - = model->BSIM3jctSidewallSatCurDensity; - } - - if (model->BSIM3jctTempSatCurDensity < 0.0) - model->BSIM3jctTempSatCurDensity = 0.0; - if (model->BSIM3jctSidewallTempSatCurDensity < 0.0) - model->BSIM3jctSidewallTempSatCurDensity = 0.0; - - /* Temperature dependence of D/B and S/B diode capacitance begins */ - delTemp = ckt->CKTtemp - model->BSIM3tnom; - T0 = model->BSIM3tcj * delTemp; - if (T0 >= -1.0) - { model->BSIM3unitAreaJctCap *= 1.0 + T0; - } - else if (model->BSIM3unitAreaJctCap > 0.0) - { model->BSIM3unitAreaJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cj to be negative. Cj is clamped to zero.\n"); - } - T0 = model->BSIM3tcjsw * delTemp; - if (T0 >= -1.0) - { model->BSIM3unitLengthSidewallJctCap *= 1.0 + T0; - } - else if (model->BSIM3unitLengthSidewallJctCap > 0.0) - { model->BSIM3unitLengthSidewallJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjsw to be negative. Cjsw is clamped to zero.\n"); - } - T0 = model->BSIM3tcjswg * delTemp; - if (T0 >= -1.0) - { model->BSIM3unitLengthGateSidewallJctCap *= 1.0 + T0; - } - else if (model->BSIM3unitLengthGateSidewallJctCap > 0.0) - { model->BSIM3unitLengthGateSidewallJctCap = 0.0; - fprintf(stderr, "Temperature effect has caused cjswg to be negative. Cjswg is clamped to zero.\n"); - } - - model->BSIM3PhiB = model->BSIM3bulkJctPotential - - model->BSIM3tpb * delTemp; - if (model->BSIM3PhiB < 0.01) - { model->BSIM3PhiB = 0.01; - fprintf(stderr, "Temperature effect has caused pb to be less than 0.01. Pb is clamped to 0.01.\n"); - } - model->BSIM3PhiBSW = model->BSIM3sidewallJctPotential - - model->BSIM3tpbsw * delTemp; - if (model->BSIM3PhiBSW <= 0.01) - { model->BSIM3PhiBSW = 0.01; - fprintf(stderr, "Temperature effect has caused pbsw to be less than 0.01. Pbsw is clamped to 0.01.\n"); - } - model->BSIM3PhiBSWG = model->BSIM3GatesidewallJctPotential - - model->BSIM3tpbswg * delTemp; - if (model->BSIM3PhiBSWG <= 0.01) - { model->BSIM3PhiBSWG = 0.01; - fprintf(stderr, "Temperature effect has caused pbswg to be less than 0.01. Pbswg is clamped to 0.01.\n"); - } - /* End of junction capacitance */ - - /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ - for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) - { - if (here->BSIM3owner != ARCHme) continue; - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM3l == pSizeDependParamKnot->Length) - && (here->BSIM3w == pSizeDependParamKnot->Width)) - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - if (Size_Not_Found) - { pParam = (struct bsim3SizeDependParam *)tmalloc( - sizeof(struct bsim3SizeDependParam)); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - Ldrn = here->BSIM3l; - Wdrn = here->BSIM3w; - pParam->Length = Ldrn; - pParam->Width = Wdrn; - - T0 = pow(Ldrn, model->BSIM3Lln); - T1 = pow(Wdrn, model->BSIM3Lwn); - tmp1 = model->BSIM3Ll / T0 + model->BSIM3Lw / T1 - + model->BSIM3Lwl / (T0 * T1); - pParam->BSIM3dl = model->BSIM3Lint + tmp1; - tmp2 = model->BSIM3Llc / T0 + model->BSIM3Lwc / T1 - + model->BSIM3Lwlc / (T0 * T1); - pParam->BSIM3dlc = model->BSIM3dlc + tmp2; - - T2 = pow(Ldrn, model->BSIM3Wln); - T3 = pow(Wdrn, model->BSIM3Wwn); - tmp1 = model->BSIM3Wl / T2 + model->BSIM3Ww / T3 - + model->BSIM3Wwl / (T2 * T3); - pParam->BSIM3dw = model->BSIM3Wint + tmp1; - tmp2 = model->BSIM3Wlc / T2 + model->BSIM3Wwc / T3 - + model->BSIM3Wwlc / (T2 * T3); - pParam->BSIM3dwc = model->BSIM3dwc + tmp2; - - pParam->BSIM3leff = here->BSIM3l - 2.0 * pParam->BSIM3dl; - if (pParam->BSIM3leff <= 0.0) - { IFuid namarray[2]; - namarray[0] = model->BSIM3modName; - namarray[1] = here->BSIM3name; - (*(SPfrontEnd->IFerror))(ERR_FATAL, - "BSIM3: mosfet %s, model %s: Effective channel length <= 0", - namarray); - return(E_BADPARM); - } - - pParam->BSIM3weff = here->BSIM3w - 2.0 * pParam->BSIM3dw; - if (pParam->BSIM3weff <= 0.0) - { IFuid namarray[2]; - namarray[0] = model->BSIM3modName; - namarray[1] = here->BSIM3name; - (*(SPfrontEnd->IFerror))(ERR_FATAL, - "BSIM3: mosfet %s, model %s: Effective channel width <= 0", - namarray); - return(E_BADPARM); - } - - pParam->BSIM3leffCV = here->BSIM3l - 2.0 * pParam->BSIM3dlc; - if (pParam->BSIM3leffCV <= 0.0) - { IFuid namarray[2]; - namarray[0] = model->BSIM3modName; - namarray[1] = here->BSIM3name; - (*(SPfrontEnd->IFerror))(ERR_FATAL, - "BSIM3: mosfet %s, model %s: Effective channel length for C-V <= 0", - namarray); - return(E_BADPARM); - } - - pParam->BSIM3weffCV = here->BSIM3w - 2.0 * pParam->BSIM3dwc; - if (pParam->BSIM3weffCV <= 0.0) - { IFuid namarray[2]; - namarray[0] = model->BSIM3modName; - namarray[1] = here->BSIM3name; - (*(SPfrontEnd->IFerror))(ERR_FATAL, - "BSIM3: mosfet %s, model %s: Effective channel width for C-V <= 0", - namarray); - return(E_BADPARM); - } - - - if (model->BSIM3binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM3leff; - Inv_W = 1.0e-6 / pParam->BSIM3weff; - Inv_LW = 1.0e-12 / (pParam->BSIM3leff - * pParam->BSIM3weff); - } - else - { Inv_L = 1.0 / pParam->BSIM3leff; - Inv_W = 1.0 / pParam->BSIM3weff; - Inv_LW = 1.0 / (pParam->BSIM3leff - * pParam->BSIM3weff); - } - pParam->BSIM3cdsc = model->BSIM3cdsc - + model->BSIM3lcdsc * Inv_L - + model->BSIM3wcdsc * Inv_W - + model->BSIM3pcdsc * Inv_LW; - pParam->BSIM3cdscb = model->BSIM3cdscb - + model->BSIM3lcdscb * Inv_L - + model->BSIM3wcdscb * Inv_W - + model->BSIM3pcdscb * Inv_LW; - - pParam->BSIM3cdscd = model->BSIM3cdscd - + model->BSIM3lcdscd * Inv_L - + model->BSIM3wcdscd * Inv_W - + model->BSIM3pcdscd * Inv_LW; - - pParam->BSIM3cit = model->BSIM3cit - + model->BSIM3lcit * Inv_L - + model->BSIM3wcit * Inv_W - + model->BSIM3pcit * Inv_LW; - pParam->BSIM3nfactor = model->BSIM3nfactor - + model->BSIM3lnfactor * Inv_L - + model->BSIM3wnfactor * Inv_W - + model->BSIM3pnfactor * Inv_LW; - pParam->BSIM3xj = model->BSIM3xj - + model->BSIM3lxj * Inv_L - + model->BSIM3wxj * Inv_W - + model->BSIM3pxj * Inv_LW; - pParam->BSIM3vsat = model->BSIM3vsat - + model->BSIM3lvsat * Inv_L - + model->BSIM3wvsat * Inv_W - + model->BSIM3pvsat * Inv_LW; - pParam->BSIM3at = model->BSIM3at - + model->BSIM3lat * Inv_L - + model->BSIM3wat * Inv_W - + model->BSIM3pat * Inv_LW; - pParam->BSIM3a0 = model->BSIM3a0 - + model->BSIM3la0 * Inv_L - + model->BSIM3wa0 * Inv_W - + model->BSIM3pa0 * Inv_LW; - - pParam->BSIM3ags = model->BSIM3ags - + model->BSIM3lags * Inv_L - + model->BSIM3wags * Inv_W - + model->BSIM3pags * Inv_LW; - - pParam->BSIM3a1 = model->BSIM3a1 - + model->BSIM3la1 * Inv_L - + model->BSIM3wa1 * Inv_W - + model->BSIM3pa1 * Inv_LW; - pParam->BSIM3a2 = model->BSIM3a2 - + model->BSIM3la2 * Inv_L - + model->BSIM3wa2 * Inv_W - + model->BSIM3pa2 * Inv_LW; - pParam->BSIM3keta = model->BSIM3keta - + model->BSIM3lketa * Inv_L - + model->BSIM3wketa * Inv_W - + model->BSIM3pketa * Inv_LW; - pParam->BSIM3nsub = model->BSIM3nsub - + model->BSIM3lnsub * Inv_L - + model->BSIM3wnsub * Inv_W - + model->BSIM3pnsub * Inv_LW; - pParam->BSIM3npeak = model->BSIM3npeak - + model->BSIM3lnpeak * Inv_L - + model->BSIM3wnpeak * Inv_W - + model->BSIM3pnpeak * Inv_LW; - pParam->BSIM3ngate = model->BSIM3ngate - + model->BSIM3lngate * Inv_L - + model->BSIM3wngate * Inv_W - + model->BSIM3pngate * Inv_LW; - pParam->BSIM3gamma1 = model->BSIM3gamma1 - + model->BSIM3lgamma1 * Inv_L - + model->BSIM3wgamma1 * Inv_W - + model->BSIM3pgamma1 * Inv_LW; - pParam->BSIM3gamma2 = model->BSIM3gamma2 - + model->BSIM3lgamma2 * Inv_L - + model->BSIM3wgamma2 * Inv_W - + model->BSIM3pgamma2 * Inv_LW; - pParam->BSIM3vbx = model->BSIM3vbx - + model->BSIM3lvbx * Inv_L - + model->BSIM3wvbx * Inv_W - + model->BSIM3pvbx * Inv_LW; - pParam->BSIM3vbm = model->BSIM3vbm - + model->BSIM3lvbm * Inv_L - + model->BSIM3wvbm * Inv_W - + model->BSIM3pvbm * Inv_LW; - pParam->BSIM3xt = model->BSIM3xt - + model->BSIM3lxt * Inv_L - + model->BSIM3wxt * Inv_W - + model->BSIM3pxt * Inv_LW; - pParam->BSIM3vfb = model->BSIM3vfb - + model->BSIM3lvfb * Inv_L - + model->BSIM3wvfb * Inv_W - + model->BSIM3pvfb * Inv_LW; - pParam->BSIM3k1 = model->BSIM3k1 - + model->BSIM3lk1 * Inv_L - + model->BSIM3wk1 * Inv_W - + model->BSIM3pk1 * Inv_LW; - pParam->BSIM3kt1 = model->BSIM3kt1 - + model->BSIM3lkt1 * Inv_L - + model->BSIM3wkt1 * Inv_W - + model->BSIM3pkt1 * Inv_LW; - pParam->BSIM3kt1l = model->BSIM3kt1l - + model->BSIM3lkt1l * Inv_L - + model->BSIM3wkt1l * Inv_W - + model->BSIM3pkt1l * Inv_LW; - pParam->BSIM3k2 = model->BSIM3k2 - + model->BSIM3lk2 * Inv_L - + model->BSIM3wk2 * Inv_W - + model->BSIM3pk2 * Inv_LW; - pParam->BSIM3kt2 = model->BSIM3kt2 - + model->BSIM3lkt2 * Inv_L - + model->BSIM3wkt2 * Inv_W - + model->BSIM3pkt2 * Inv_LW; - pParam->BSIM3k3 = model->BSIM3k3 - + model->BSIM3lk3 * Inv_L - + model->BSIM3wk3 * Inv_W - + model->BSIM3pk3 * Inv_LW; - pParam->BSIM3k3b = model->BSIM3k3b - + model->BSIM3lk3b * Inv_L - + model->BSIM3wk3b * Inv_W - + model->BSIM3pk3b * Inv_LW; - pParam->BSIM3w0 = model->BSIM3w0 - + model->BSIM3lw0 * Inv_L - + model->BSIM3ww0 * Inv_W - + model->BSIM3pw0 * Inv_LW; - pParam->BSIM3nlx = model->BSIM3nlx - + model->BSIM3lnlx * Inv_L - + model->BSIM3wnlx * Inv_W - + model->BSIM3pnlx * Inv_LW; - pParam->BSIM3dvt0 = model->BSIM3dvt0 - + model->BSIM3ldvt0 * Inv_L - + model->BSIM3wdvt0 * Inv_W - + model->BSIM3pdvt0 * Inv_LW; - pParam->BSIM3dvt1 = model->BSIM3dvt1 - + model->BSIM3ldvt1 * Inv_L - + model->BSIM3wdvt1 * Inv_W - + model->BSIM3pdvt1 * Inv_LW; - pParam->BSIM3dvt2 = model->BSIM3dvt2 - + model->BSIM3ldvt2 * Inv_L - + model->BSIM3wdvt2 * Inv_W - + model->BSIM3pdvt2 * Inv_LW; - pParam->BSIM3dvt0w = model->BSIM3dvt0w - + model->BSIM3ldvt0w * Inv_L - + model->BSIM3wdvt0w * Inv_W - + model->BSIM3pdvt0w * Inv_LW; - pParam->BSIM3dvt1w = model->BSIM3dvt1w - + model->BSIM3ldvt1w * Inv_L - + model->BSIM3wdvt1w * Inv_W - + model->BSIM3pdvt1w * Inv_LW; - pParam->BSIM3dvt2w = model->BSIM3dvt2w - + model->BSIM3ldvt2w * Inv_L - + model->BSIM3wdvt2w * Inv_W - + model->BSIM3pdvt2w * Inv_LW; - pParam->BSIM3drout = model->BSIM3drout - + model->BSIM3ldrout * Inv_L - + model->BSIM3wdrout * Inv_W - + model->BSIM3pdrout * Inv_LW; - pParam->BSIM3dsub = model->BSIM3dsub - + model->BSIM3ldsub * Inv_L - + model->BSIM3wdsub * Inv_W - + model->BSIM3pdsub * Inv_LW; - pParam->BSIM3vth0 = model->BSIM3vth0 - + model->BSIM3lvth0 * Inv_L - + model->BSIM3wvth0 * Inv_W - + model->BSIM3pvth0 * Inv_LW; - pParam->BSIM3ua = model->BSIM3ua - + model->BSIM3lua * Inv_L - + model->BSIM3wua * Inv_W - + model->BSIM3pua * Inv_LW; - pParam->BSIM3ua1 = model->BSIM3ua1 - + model->BSIM3lua1 * Inv_L - + model->BSIM3wua1 * Inv_W - + model->BSIM3pua1 * Inv_LW; - pParam->BSIM3ub = model->BSIM3ub - + model->BSIM3lub * Inv_L - + model->BSIM3wub * Inv_W - + model->BSIM3pub * Inv_LW; - pParam->BSIM3ub1 = model->BSIM3ub1 - + model->BSIM3lub1 * Inv_L - + model->BSIM3wub1 * Inv_W - + model->BSIM3pub1 * Inv_LW; - pParam->BSIM3uc = model->BSIM3uc - + model->BSIM3luc * Inv_L - + model->BSIM3wuc * Inv_W - + model->BSIM3puc * Inv_LW; - pParam->BSIM3uc1 = model->BSIM3uc1 - + model->BSIM3luc1 * Inv_L - + model->BSIM3wuc1 * Inv_W - + model->BSIM3puc1 * Inv_LW; - pParam->BSIM3u0 = model->BSIM3u0 - + model->BSIM3lu0 * Inv_L - + model->BSIM3wu0 * Inv_W - + model->BSIM3pu0 * Inv_LW; - pParam->BSIM3ute = model->BSIM3ute - + model->BSIM3lute * Inv_L - + model->BSIM3wute * Inv_W - + model->BSIM3pute * Inv_LW; - pParam->BSIM3voff = model->BSIM3voff - + model->BSIM3lvoff * Inv_L - + model->BSIM3wvoff * Inv_W - + model->BSIM3pvoff * Inv_LW; - pParam->BSIM3delta = model->BSIM3delta - + model->BSIM3ldelta * Inv_L - + model->BSIM3wdelta * Inv_W - + model->BSIM3pdelta * Inv_LW; - pParam->BSIM3rdsw = model->BSIM3rdsw - + model->BSIM3lrdsw * Inv_L - + model->BSIM3wrdsw * Inv_W - + model->BSIM3prdsw * Inv_LW; - pParam->BSIM3prwg = model->BSIM3prwg - + model->BSIM3lprwg * Inv_L - + model->BSIM3wprwg * Inv_W - + model->BSIM3pprwg * Inv_LW; - pParam->BSIM3prwb = model->BSIM3prwb - + model->BSIM3lprwb * Inv_L - + model->BSIM3wprwb * Inv_W - + model->BSIM3pprwb * Inv_LW; - pParam->BSIM3prt = model->BSIM3prt - + model->BSIM3lprt * Inv_L - + model->BSIM3wprt * Inv_W - + model->BSIM3pprt * Inv_LW; - pParam->BSIM3eta0 = model->BSIM3eta0 - + model->BSIM3leta0 * Inv_L - + model->BSIM3weta0 * Inv_W - + model->BSIM3peta0 * Inv_LW; - pParam->BSIM3etab = model->BSIM3etab - + model->BSIM3letab * Inv_L - + model->BSIM3wetab * Inv_W - + model->BSIM3petab * Inv_LW; - pParam->BSIM3pclm = model->BSIM3pclm - + model->BSIM3lpclm * Inv_L - + model->BSIM3wpclm * Inv_W - + model->BSIM3ppclm * Inv_LW; - pParam->BSIM3pdibl1 = model->BSIM3pdibl1 - + model->BSIM3lpdibl1 * Inv_L - + model->BSIM3wpdibl1 * Inv_W - + model->BSIM3ppdibl1 * Inv_LW; - pParam->BSIM3pdibl2 = model->BSIM3pdibl2 - + model->BSIM3lpdibl2 * Inv_L - + model->BSIM3wpdibl2 * Inv_W - + model->BSIM3ppdibl2 * Inv_LW; - pParam->BSIM3pdiblb = model->BSIM3pdiblb - + model->BSIM3lpdiblb * Inv_L - + model->BSIM3wpdiblb * Inv_W - + model->BSIM3ppdiblb * Inv_LW; - pParam->BSIM3pscbe1 = model->BSIM3pscbe1 - + model->BSIM3lpscbe1 * Inv_L - + model->BSIM3wpscbe1 * Inv_W - + model->BSIM3ppscbe1 * Inv_LW; - pParam->BSIM3pscbe2 = model->BSIM3pscbe2 - + model->BSIM3lpscbe2 * Inv_L - + model->BSIM3wpscbe2 * Inv_W - + model->BSIM3ppscbe2 * Inv_LW; - pParam->BSIM3pvag = model->BSIM3pvag - + model->BSIM3lpvag * Inv_L - + model->BSIM3wpvag * Inv_W - + model->BSIM3ppvag * Inv_LW; - pParam->BSIM3wr = model->BSIM3wr - + model->BSIM3lwr * Inv_L - + model->BSIM3wwr * Inv_W - + model->BSIM3pwr * Inv_LW; - pParam->BSIM3dwg = model->BSIM3dwg - + model->BSIM3ldwg * Inv_L - + model->BSIM3wdwg * Inv_W - + model->BSIM3pdwg * Inv_LW; - pParam->BSIM3dwb = model->BSIM3dwb - + model->BSIM3ldwb * Inv_L - + model->BSIM3wdwb * Inv_W - + model->BSIM3pdwb * Inv_LW; - pParam->BSIM3b0 = model->BSIM3b0 - + model->BSIM3lb0 * Inv_L - + model->BSIM3wb0 * Inv_W - + model->BSIM3pb0 * Inv_LW; - pParam->BSIM3b1 = model->BSIM3b1 - + model->BSIM3lb1 * Inv_L - + model->BSIM3wb1 * Inv_W - + model->BSIM3pb1 * Inv_LW; - pParam->BSIM3alpha0 = model->BSIM3alpha0 - + model->BSIM3lalpha0 * Inv_L - + model->BSIM3walpha0 * Inv_W - + model->BSIM3palpha0 * Inv_LW; - pParam->BSIM3alpha1 = model->BSIM3alpha1 - + model->BSIM3lalpha1 * Inv_L - + model->BSIM3walpha1 * Inv_W - + model->BSIM3palpha1 * Inv_LW; - pParam->BSIM3beta0 = model->BSIM3beta0 - + model->BSIM3lbeta0 * Inv_L - + model->BSIM3wbeta0 * Inv_W - + model->BSIM3pbeta0 * Inv_LW; - /* CV model */ - pParam->BSIM3elm = model->BSIM3elm - + model->BSIM3lelm * Inv_L - + model->BSIM3welm * Inv_W - + model->BSIM3pelm * Inv_LW; - pParam->BSIM3cgsl = model->BSIM3cgsl - + model->BSIM3lcgsl * Inv_L - + model->BSIM3wcgsl * Inv_W - + model->BSIM3pcgsl * Inv_LW; - pParam->BSIM3cgdl = model->BSIM3cgdl - + model->BSIM3lcgdl * Inv_L - + model->BSIM3wcgdl * Inv_W - + model->BSIM3pcgdl * Inv_LW; - pParam->BSIM3ckappa = model->BSIM3ckappa - + model->BSIM3lckappa * Inv_L - + model->BSIM3wckappa * Inv_W - + model->BSIM3pckappa * Inv_LW; - pParam->BSIM3cf = model->BSIM3cf - + model->BSIM3lcf * Inv_L - + model->BSIM3wcf * Inv_W - + model->BSIM3pcf * Inv_LW; - pParam->BSIM3clc = model->BSIM3clc - + model->BSIM3lclc * Inv_L - + model->BSIM3wclc * Inv_W - + model->BSIM3pclc * Inv_LW; - pParam->BSIM3cle = model->BSIM3cle - + model->BSIM3lcle * Inv_L - + model->BSIM3wcle * Inv_W - + model->BSIM3pcle * Inv_LW; - pParam->BSIM3vfbcv = model->BSIM3vfbcv - + model->BSIM3lvfbcv * Inv_L - + model->BSIM3wvfbcv * Inv_W - + model->BSIM3pvfbcv * Inv_LW; - pParam->BSIM3acde = model->BSIM3acde - + model->BSIM3lacde * Inv_L - + model->BSIM3wacde * Inv_W - + model->BSIM3pacde * Inv_LW; - pParam->BSIM3moin = model->BSIM3moin - + model->BSIM3lmoin * Inv_L - + model->BSIM3wmoin * Inv_W - + model->BSIM3pmoin * Inv_LW; - pParam->BSIM3noff = model->BSIM3noff - + model->BSIM3lnoff * Inv_L - + model->BSIM3wnoff * Inv_W - + model->BSIM3pnoff * Inv_LW; - pParam->BSIM3voffcv = model->BSIM3voffcv - + model->BSIM3lvoffcv * Inv_L - + model->BSIM3wvoffcv * Inv_W - + model->BSIM3pvoffcv * Inv_LW; - - pParam->BSIM3abulkCVfactor = 1.0 + pow((pParam->BSIM3clc - / pParam->BSIM3leffCV), + BSIM3model *model = (BSIM3model *) inModel; + BSIM3instance *here; + struct bsim3SizeDependParam *pSizeDependParamKnot, *pLastKnot, + *pParam; + double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, + Ldrn, Wdrn; + double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, + Tnom; + double Nvtm, SourceSatCurrent, DrainSatCurrent; + int Size_Not_Found; + + /* loop through all the BSIM3 device models */ + for (; model != NULL; model = model->BSIM3nextModel) + { + Temp = ckt->CKTtemp; + if (model->BSIM3bulkJctPotential < 0.1) + { + model->BSIM3bulkJctPotential = 0.1; + fprintf (stderr, + "Given pb is less than 0.1. Pb is set to 0.1.\n"); + } + if (model->BSIM3sidewallJctPotential < 0.1) + { + model->BSIM3sidewallJctPotential = 0.1; + fprintf (stderr, + "Given pbsw is less than 0.1. Pbsw is set to 0.1.\n"); + } + if (model->BSIM3GatesidewallJctPotential < 0.1) + { + model->BSIM3GatesidewallJctPotential = 0.1; + fprintf (stderr, + "Given pbswg is less than 0.1. Pbswg is set to 0.1.\n"); + } + model->pSizeDependParamKnot = NULL; + pLastKnot = NULL; + + Tnom = model->BSIM3tnom; + TRatio = Temp / Tnom; + + model->BSIM3vcrit = + CONSTvt0 * log (CONSTvt0 / (CONSTroot2 * 1.0e-14)); + model->BSIM3factor1 = sqrt (EPSSI / EPSOX * model->BSIM3tox); + + Vtm0 = KboQ * Tnom; + Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); + ni = 1.45e10 * (Tnom / 300.15) * sqrt (Tnom / 300.15) + * exp (21.5565981 - Eg0 / (2.0 * Vtm0)); + + model->BSIM3vtm = KboQ * Temp; + Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); + if (Temp != Tnom) + { + T0 = Eg0 / Vtm0 - Eg / model->BSIM3vtm + + model->BSIM3jctTempExponent * log (Temp / + Tnom); + T1 = exp (T0 / model->BSIM3jctEmissionCoeff); + model->BSIM3jctTempSatCurDensity = + model->BSIM3jctSatCurDensity * T1; + model->BSIM3jctSidewallTempSatCurDensity = + model->BSIM3jctSidewallSatCurDensity * T1; + } + else + { + model->BSIM3jctTempSatCurDensity = + model->BSIM3jctSatCurDensity; + model->BSIM3jctSidewallTempSatCurDensity = + model->BSIM3jctSidewallSatCurDensity; + } + + if (model->BSIM3jctTempSatCurDensity < 0.0) + model->BSIM3jctTempSatCurDensity = 0.0; + if (model->BSIM3jctSidewallTempSatCurDensity < 0.0) + model->BSIM3jctSidewallTempSatCurDensity = 0.0; + + /* Temperature dependence of D/B and S/B diode capacitance begins */ + delTemp = ckt->CKTtemp - model->BSIM3tnom; + T0 = model->BSIM3tcj * delTemp; + if (T0 >= -1.0) + { + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + model->BSIM3unitAreaTempJctCap = + model->BSIM3unitAreaJctCap * (1.0 + + T0); + break; + case BSIM3V322: + case BSIM3V32: + default: + model->BSIM3unitAreaJctCap *= 1.0 + T0; + } + + } + else if (model->BSIM3unitAreaJctCap > 0.0) + { + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + model->BSIM3unitAreaTempJctCap = 0.0; + break; + case BSIM3V322: + case BSIM3V32: + default: + model->BSIM3unitAreaJctCap = 0.0; + } + + fprintf (stderr, + "Temperature effect has caused cj to be negative. Cj is clamped to zero.\n"); + } + T0 = model->BSIM3tcjsw * delTemp; + if (T0 >= -1.0) + { + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + model->BSIM3unitLengthSidewallTempJctCap = + model->BSIM3unitLengthSidewallJctCap * + (1.0 + T0); + break; + case BSIM3V322: + case BSIM3V32: + default: + model->BSIM3unitLengthSidewallJctCap *= + 1.0 + T0; + } + + } + else if (model->BSIM3unitLengthSidewallJctCap > 0.0) + { + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + model->BSIM3unitLengthSidewallTempJctCap = + 0.0; + break; + case BSIM3V322: + case BSIM3V32: + default: + model->BSIM3unitLengthSidewallJctCap = 0.0; + } + + fprintf (stderr, + "Temperature effect has caused cjsw to be negative. Cjsw is clamped to zero.\n"); + } + T0 = model->BSIM3tcjswg * delTemp; + if (T0 >= -1.0) + { + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + + model->BSIM3unitLengthGateSidewallTempJctCap = + model-> + BSIM3unitLengthGateSidewallJctCap * + (1.0 + T0); + break; + + case BSIM3V322: + case BSIM3V32: + default: + model->BSIM3unitLengthGateSidewallJctCap *= + 1.0 + T0; + } + + } + else if (model->BSIM3unitLengthGateSidewallJctCap > 0.0) + { + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + + model->BSIM3unitLengthGateSidewallTempJctCap = + 0.0; + break; + + case BSIM3V322: + case BSIM3V32: + default: + + model->BSIM3unitLengthGateSidewallJctCap = + 0.0; + } + + fprintf (stderr, + "Temperature effect has caused cjswg to be negative. Cjswg is clamped to zero.\n"); + } + + model->BSIM3PhiB = model->BSIM3bulkJctPotential + - model->BSIM3tpb * delTemp; + if (model->BSIM3PhiB < 0.01) + { + model->BSIM3PhiB = 0.01; + fprintf (stderr, + "Temperature effect has caused pb to be less than 0.01. Pb is clamped to 0.01.\n"); + } + model->BSIM3PhiBSW = model->BSIM3sidewallJctPotential + - model->BSIM3tpbsw * delTemp; + if (model->BSIM3PhiBSW <= 0.01) + { + model->BSIM3PhiBSW = 0.01; + fprintf (stderr, + "Temperature effect has caused pbsw to be less than 0.01. Pbsw is clamped to 0.01.\n"); + } + model->BSIM3PhiBSWG = model->BSIM3GatesidewallJctPotential + - model->BSIM3tpbswg * delTemp; + if (model->BSIM3PhiBSWG <= 0.01) + { + model->BSIM3PhiBSWG = 0.01; + fprintf (stderr, + "Temperature effect has caused pbswg to be less than 0.01. Pbswg is clamped to 0.01.\n"); + } + /* End of junction capacitance */ + + /* loop through all the instances of the model */ + /* MCJ: Length and Width not initialized */ + for (here = model->BSIM3instances; here != NULL; + here = here->BSIM3nextInstance) + { + if (here->BSIM3owner != ARCHme) + continue; + + pSizeDependParamKnot = model->pSizeDependParamKnot; + Size_Not_Found = 1; + while ((pSizeDependParamKnot != NULL) + && Size_Not_Found) + { + if ((here->BSIM3l == + pSizeDependParamKnot->Length) + && (here->BSIM3w == + pSizeDependParamKnot->Width)) + { + Size_Not_Found = 0; + here->pParam = pSizeDependParamKnot; + pParam = here->pParam; /*bug-fix */ + } + else + { + pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = + pSizeDependParamKnot->pNext; + } + } + + if (Size_Not_Found) + { + pParam = (struct bsim3SizeDependParam *) + tmalloc (sizeof + (struct + bsim3SizeDependParam)); + if (pLastKnot == NULL) + model->pSizeDependParamKnot = pParam; + else + pLastKnot->pNext = pParam; + pParam->pNext = NULL; + here->pParam = pParam; + + Ldrn = here->BSIM3l; + Wdrn = here->BSIM3w; + pParam->Length = Ldrn; + pParam->Width = Wdrn; + + T0 = pow (Ldrn, model->BSIM3Lln); + T1 = pow (Wdrn, model->BSIM3Lwn); + tmp1 = model->BSIM3Ll / T0 + + model->BSIM3Lw / T1 + + model->BSIM3Lwl / (T0 * T1); + pParam->BSIM3dl = model->BSIM3Lint + tmp1; + tmp2 = model->BSIM3Llc / T0 + + model->BSIM3Lwc / T1 + + model->BSIM3Lwlc / (T0 * T1); + pParam->BSIM3dlc = model->BSIM3dlc + tmp2; + + T2 = pow (Ldrn, model->BSIM3Wln); + T3 = pow (Wdrn, model->BSIM3Wwn); + tmp1 = model->BSIM3Wl / T2 + + model->BSIM3Ww / T3 + + model->BSIM3Wwl / (T2 * T3); + pParam->BSIM3dw = model->BSIM3Wint + tmp1; + tmp2 = model->BSIM3Wlc / T2 + + model->BSIM3Wwc / T3 + + model->BSIM3Wwlc / (T2 * T3); + pParam->BSIM3dwc = model->BSIM3dwc + tmp2; + + pParam->BSIM3leff = + here->BSIM3l - 2.0 * pParam->BSIM3dl; + if (pParam->BSIM3leff <= 0.0) + { + IFuid namarray[2]; + namarray[0] = model->BSIM3modName; + namarray[1] = here->BSIM3name; + (*(SPfrontEnd->IFerror)) (ERR_FATAL, + "BSIM3: mosfet %s, model %s: Effective channel length <= 0", + namarray); + return (E_BADPARM); + } + + pParam->BSIM3weff = + here->BSIM3w - 2.0 * pParam->BSIM3dw; + if (pParam->BSIM3weff <= 0.0) + { + IFuid namarray[2]; + namarray[0] = model->BSIM3modName; + namarray[1] = here->BSIM3name; + (*(SPfrontEnd->IFerror)) (ERR_FATAL, + "BSIM3: mosfet %s, model %s: Effective channel width <= 0", + namarray); + return (E_BADPARM); + } + + pParam->BSIM3leffCV = + here->BSIM3l - 2.0 * pParam->BSIM3dlc; + if (pParam->BSIM3leffCV <= 0.0) + { + IFuid namarray[2]; + namarray[0] = model->BSIM3modName; + namarray[1] = here->BSIM3name; + (*(SPfrontEnd->IFerror)) (ERR_FATAL, + "BSIM3: mosfet %s, model %s: Effective channel length for C-V <= 0", + namarray); + return (E_BADPARM); + } + + pParam->BSIM3weffCV = + here->BSIM3w - 2.0 * pParam->BSIM3dwc; + if (pParam->BSIM3weffCV <= 0.0) + { + IFuid namarray[2]; + namarray[0] = model->BSIM3modName; + namarray[1] = here->BSIM3name; + (*(SPfrontEnd->IFerror)) (ERR_FATAL, + "BSIM3: mosfet %s, model %s: Effective channel width for C-V <= 0", + namarray); + return (E_BADPARM); + } + + + if (model->BSIM3binUnit == 1) + { + Inv_L = 1.0e-6 / pParam->BSIM3leff; + Inv_W = 1.0e-6 / pParam->BSIM3weff; + Inv_LW = 1.0e-12 / (pParam->BSIM3leff + * + pParam-> + BSIM3weff); + } + else + { + Inv_L = 1.0 / pParam->BSIM3leff; + Inv_W = 1.0 / pParam->BSIM3weff; + Inv_LW = 1.0 / (pParam->BSIM3leff + * pParam->BSIM3weff); + } + pParam->BSIM3cdsc = model->BSIM3cdsc + + model->BSIM3lcdsc * Inv_L + + model->BSIM3wcdsc * Inv_W + + model->BSIM3pcdsc * Inv_LW; + pParam->BSIM3cdscb = model->BSIM3cdscb + + model->BSIM3lcdscb * Inv_L + + model->BSIM3wcdscb * Inv_W + + model->BSIM3pcdscb * Inv_LW; + + pParam->BSIM3cdscd = model->BSIM3cdscd + + model->BSIM3lcdscd * Inv_L + + model->BSIM3wcdscd * Inv_W + + model->BSIM3pcdscd * Inv_LW; + + pParam->BSIM3cit = model->BSIM3cit + + model->BSIM3lcit * Inv_L + + model->BSIM3wcit * Inv_W + + model->BSIM3pcit * Inv_LW; + pParam->BSIM3nfactor = model->BSIM3nfactor + + model->BSIM3lnfactor * Inv_L + + model->BSIM3wnfactor * Inv_W + + model->BSIM3pnfactor * Inv_LW; + pParam->BSIM3xj = model->BSIM3xj + + model->BSIM3lxj * Inv_L + + model->BSIM3wxj * Inv_W + + model->BSIM3pxj * Inv_LW; + pParam->BSIM3vsat = model->BSIM3vsat + + model->BSIM3lvsat * Inv_L + + model->BSIM3wvsat * Inv_W + + model->BSIM3pvsat * Inv_LW; + pParam->BSIM3at = model->BSIM3at + + model->BSIM3lat * Inv_L + + model->BSIM3wat * Inv_W + + model->BSIM3pat * Inv_LW; + pParam->BSIM3a0 = model->BSIM3a0 + + model->BSIM3la0 * Inv_L + + model->BSIM3wa0 * Inv_W + + model->BSIM3pa0 * Inv_LW; + + pParam->BSIM3ags = model->BSIM3ags + + model->BSIM3lags * Inv_L + + model->BSIM3wags * Inv_W + + model->BSIM3pags * Inv_LW; + + pParam->BSIM3a1 = model->BSIM3a1 + + model->BSIM3la1 * Inv_L + + model->BSIM3wa1 * Inv_W + + model->BSIM3pa1 * Inv_LW; + pParam->BSIM3a2 = model->BSIM3a2 + + model->BSIM3la2 * Inv_L + + model->BSIM3wa2 * Inv_W + + model->BSIM3pa2 * Inv_LW; + pParam->BSIM3keta = model->BSIM3keta + + model->BSIM3lketa * Inv_L + + model->BSIM3wketa * Inv_W + + model->BSIM3pketa * Inv_LW; + pParam->BSIM3nsub = model->BSIM3nsub + + model->BSIM3lnsub * Inv_L + + model->BSIM3wnsub * Inv_W + + model->BSIM3pnsub * Inv_LW; + pParam->BSIM3npeak = model->BSIM3npeak + + model->BSIM3lnpeak * Inv_L + + model->BSIM3wnpeak * Inv_W + + model->BSIM3pnpeak * Inv_LW; + pParam->BSIM3ngate = model->BSIM3ngate + + model->BSIM3lngate * Inv_L + + model->BSIM3wngate * Inv_W + + model->BSIM3pngate * Inv_LW; + pParam->BSIM3gamma1 = model->BSIM3gamma1 + + model->BSIM3lgamma1 * Inv_L + + model->BSIM3wgamma1 * Inv_W + + model->BSIM3pgamma1 * Inv_LW; + pParam->BSIM3gamma2 = model->BSIM3gamma2 + + model->BSIM3lgamma2 * Inv_L + + model->BSIM3wgamma2 * Inv_W + + model->BSIM3pgamma2 * Inv_LW; + pParam->BSIM3vbx = model->BSIM3vbx + + model->BSIM3lvbx * Inv_L + + model->BSIM3wvbx * Inv_W + + model->BSIM3pvbx * Inv_LW; + pParam->BSIM3vbm = model->BSIM3vbm + + model->BSIM3lvbm * Inv_L + + model->BSIM3wvbm * Inv_W + + model->BSIM3pvbm * Inv_LW; + pParam->BSIM3xt = model->BSIM3xt + + model->BSIM3lxt * Inv_L + + model->BSIM3wxt * Inv_W + + model->BSIM3pxt * Inv_LW; + pParam->BSIM3vfb = model->BSIM3vfb + + model->BSIM3lvfb * Inv_L + + model->BSIM3wvfb * Inv_W + + model->BSIM3pvfb * Inv_LW; + pParam->BSIM3k1 = model->BSIM3k1 + + model->BSIM3lk1 * Inv_L + + model->BSIM3wk1 * Inv_W + + model->BSIM3pk1 * Inv_LW; + pParam->BSIM3kt1 = model->BSIM3kt1 + + model->BSIM3lkt1 * Inv_L + + model->BSIM3wkt1 * Inv_W + + model->BSIM3pkt1 * Inv_LW; + pParam->BSIM3kt1l = model->BSIM3kt1l + + model->BSIM3lkt1l * Inv_L + + model->BSIM3wkt1l * Inv_W + + model->BSIM3pkt1l * Inv_LW; + pParam->BSIM3k2 = model->BSIM3k2 + + model->BSIM3lk2 * Inv_L + + model->BSIM3wk2 * Inv_W + + model->BSIM3pk2 * Inv_LW; + pParam->BSIM3kt2 = model->BSIM3kt2 + + model->BSIM3lkt2 * Inv_L + + model->BSIM3wkt2 * Inv_W + + model->BSIM3pkt2 * Inv_LW; + pParam->BSIM3k3 = model->BSIM3k3 + + model->BSIM3lk3 * Inv_L + + model->BSIM3wk3 * Inv_W + + model->BSIM3pk3 * Inv_LW; + pParam->BSIM3k3b = model->BSIM3k3b + + model->BSIM3lk3b * Inv_L + + model->BSIM3wk3b * Inv_W + + model->BSIM3pk3b * Inv_LW; + pParam->BSIM3w0 = model->BSIM3w0 + + model->BSIM3lw0 * Inv_L + + model->BSIM3ww0 * Inv_W + + model->BSIM3pw0 * Inv_LW; + pParam->BSIM3nlx = model->BSIM3nlx + + model->BSIM3lnlx * Inv_L + + model->BSIM3wnlx * Inv_W + + model->BSIM3pnlx * Inv_LW; + pParam->BSIM3dvt0 = model->BSIM3dvt0 + + model->BSIM3ldvt0 * Inv_L + + model->BSIM3wdvt0 * Inv_W + + model->BSIM3pdvt0 * Inv_LW; + pParam->BSIM3dvt1 = model->BSIM3dvt1 + + model->BSIM3ldvt1 * Inv_L + + model->BSIM3wdvt1 * Inv_W + + model->BSIM3pdvt1 * Inv_LW; + pParam->BSIM3dvt2 = model->BSIM3dvt2 + + model->BSIM3ldvt2 * Inv_L + + model->BSIM3wdvt2 * Inv_W + + model->BSIM3pdvt2 * Inv_LW; + pParam->BSIM3dvt0w = model->BSIM3dvt0w + + model->BSIM3ldvt0w * Inv_L + + model->BSIM3wdvt0w * Inv_W + + model->BSIM3pdvt0w * Inv_LW; + pParam->BSIM3dvt1w = model->BSIM3dvt1w + + model->BSIM3ldvt1w * Inv_L + + model->BSIM3wdvt1w * Inv_W + + model->BSIM3pdvt1w * Inv_LW; + pParam->BSIM3dvt2w = model->BSIM3dvt2w + + model->BSIM3ldvt2w * Inv_L + + model->BSIM3wdvt2w * Inv_W + + model->BSIM3pdvt2w * Inv_LW; + pParam->BSIM3drout = model->BSIM3drout + + model->BSIM3ldrout * Inv_L + + model->BSIM3wdrout * Inv_W + + model->BSIM3pdrout * Inv_LW; + pParam->BSIM3dsub = model->BSIM3dsub + + model->BSIM3ldsub * Inv_L + + model->BSIM3wdsub * Inv_W + + model->BSIM3pdsub * Inv_LW; + pParam->BSIM3vth0 = model->BSIM3vth0 + + model->BSIM3lvth0 * Inv_L + + model->BSIM3wvth0 * Inv_W + + model->BSIM3pvth0 * Inv_LW; + pParam->BSIM3ua = model->BSIM3ua + + model->BSIM3lua * Inv_L + + model->BSIM3wua * Inv_W + + model->BSIM3pua * Inv_LW; + pParam->BSIM3ua1 = model->BSIM3ua1 + + model->BSIM3lua1 * Inv_L + + model->BSIM3wua1 * Inv_W + + model->BSIM3pua1 * Inv_LW; + pParam->BSIM3ub = model->BSIM3ub + + model->BSIM3lub * Inv_L + + model->BSIM3wub * Inv_W + + model->BSIM3pub * Inv_LW; + pParam->BSIM3ub1 = model->BSIM3ub1 + + model->BSIM3lub1 * Inv_L + + model->BSIM3wub1 * Inv_W + + model->BSIM3pub1 * Inv_LW; + pParam->BSIM3uc = model->BSIM3uc + + model->BSIM3luc * Inv_L + + model->BSIM3wuc * Inv_W + + model->BSIM3puc * Inv_LW; + pParam->BSIM3uc1 = model->BSIM3uc1 + + model->BSIM3luc1 * Inv_L + + model->BSIM3wuc1 * Inv_W + + model->BSIM3puc1 * Inv_LW; + pParam->BSIM3u0 = model->BSIM3u0 + + model->BSIM3lu0 * Inv_L + + model->BSIM3wu0 * Inv_W + + model->BSIM3pu0 * Inv_LW; + pParam->BSIM3ute = model->BSIM3ute + + model->BSIM3lute * Inv_L + + model->BSIM3wute * Inv_W + + model->BSIM3pute * Inv_LW; + pParam->BSIM3voff = model->BSIM3voff + + model->BSIM3lvoff * Inv_L + + model->BSIM3wvoff * Inv_W + + model->BSIM3pvoff * Inv_LW; + pParam->BSIM3delta = model->BSIM3delta + + model->BSIM3ldelta * Inv_L + + model->BSIM3wdelta * Inv_W + + model->BSIM3pdelta * Inv_LW; + pParam->BSIM3rdsw = model->BSIM3rdsw + + model->BSIM3lrdsw * Inv_L + + model->BSIM3wrdsw * Inv_W + + model->BSIM3prdsw * Inv_LW; + pParam->BSIM3prwg = model->BSIM3prwg + + model->BSIM3lprwg * Inv_L + + model->BSIM3wprwg * Inv_W + + model->BSIM3pprwg * Inv_LW; + pParam->BSIM3prwb = model->BSIM3prwb + + model->BSIM3lprwb * Inv_L + + model->BSIM3wprwb * Inv_W + + model->BSIM3pprwb * Inv_LW; + pParam->BSIM3prt = model->BSIM3prt + + model->BSIM3lprt * Inv_L + + model->BSIM3wprt * Inv_W + + model->BSIM3pprt * Inv_LW; + pParam->BSIM3eta0 = model->BSIM3eta0 + + model->BSIM3leta0 * Inv_L + + model->BSIM3weta0 * Inv_W + + model->BSIM3peta0 * Inv_LW; + pParam->BSIM3etab = model->BSIM3etab + + model->BSIM3letab * Inv_L + + model->BSIM3wetab * Inv_W + + model->BSIM3petab * Inv_LW; + pParam->BSIM3pclm = model->BSIM3pclm + + model->BSIM3lpclm * Inv_L + + model->BSIM3wpclm * Inv_W + + model->BSIM3ppclm * Inv_LW; + pParam->BSIM3pdibl1 = model->BSIM3pdibl1 + + model->BSIM3lpdibl1 * Inv_L + + model->BSIM3wpdibl1 * Inv_W + + model->BSIM3ppdibl1 * Inv_LW; + pParam->BSIM3pdibl2 = model->BSIM3pdibl2 + + model->BSIM3lpdibl2 * Inv_L + + model->BSIM3wpdibl2 * Inv_W + + model->BSIM3ppdibl2 * Inv_LW; + pParam->BSIM3pdiblb = model->BSIM3pdiblb + + model->BSIM3lpdiblb * Inv_L + + model->BSIM3wpdiblb * Inv_W + + model->BSIM3ppdiblb * Inv_LW; + pParam->BSIM3pscbe1 = model->BSIM3pscbe1 + + model->BSIM3lpscbe1 * Inv_L + + model->BSIM3wpscbe1 * Inv_W + + model->BSIM3ppscbe1 * Inv_LW; + pParam->BSIM3pscbe2 = model->BSIM3pscbe2 + + model->BSIM3lpscbe2 * Inv_L + + model->BSIM3wpscbe2 * Inv_W + + model->BSIM3ppscbe2 * Inv_LW; + pParam->BSIM3pvag = model->BSIM3pvag + + model->BSIM3lpvag * Inv_L + + model->BSIM3wpvag * Inv_W + + model->BSIM3ppvag * Inv_LW; + pParam->BSIM3wr = model->BSIM3wr + + model->BSIM3lwr * Inv_L + + model->BSIM3wwr * Inv_W + + model->BSIM3pwr * Inv_LW; + pParam->BSIM3dwg = model->BSIM3dwg + + model->BSIM3ldwg * Inv_L + + model->BSIM3wdwg * Inv_W + + model->BSIM3pdwg * Inv_LW; + pParam->BSIM3dwb = model->BSIM3dwb + + model->BSIM3ldwb * Inv_L + + model->BSIM3wdwb * Inv_W + + model->BSIM3pdwb * Inv_LW; + pParam->BSIM3b0 = model->BSIM3b0 + + model->BSIM3lb0 * Inv_L + + model->BSIM3wb0 * Inv_W + + model->BSIM3pb0 * Inv_LW; + pParam->BSIM3b1 = model->BSIM3b1 + + model->BSIM3lb1 * Inv_L + + model->BSIM3wb1 * Inv_W + + model->BSIM3pb1 * Inv_LW; + pParam->BSIM3alpha0 = model->BSIM3alpha0 + + model->BSIM3lalpha0 * Inv_L + + model->BSIM3walpha0 * Inv_W + + model->BSIM3palpha0 * Inv_LW; + pParam->BSIM3alpha1 = model->BSIM3alpha1 + + model->BSIM3lalpha1 * Inv_L + + model->BSIM3walpha1 * Inv_W + + model->BSIM3palpha1 * Inv_LW; + pParam->BSIM3beta0 = model->BSIM3beta0 + + model->BSIM3lbeta0 * Inv_L + + model->BSIM3wbeta0 * Inv_W + + model->BSIM3pbeta0 * Inv_LW; + /* CV model */ + pParam->BSIM3elm = model->BSIM3elm + + model->BSIM3lelm * Inv_L + + model->BSIM3welm * Inv_W + + model->BSIM3pelm * Inv_LW; + pParam->BSIM3cgsl = model->BSIM3cgsl + + model->BSIM3lcgsl * Inv_L + + model->BSIM3wcgsl * Inv_W + + model->BSIM3pcgsl * Inv_LW; + pParam->BSIM3cgdl = model->BSIM3cgdl + + model->BSIM3lcgdl * Inv_L + + model->BSIM3wcgdl * Inv_W + + model->BSIM3pcgdl * Inv_LW; + pParam->BSIM3ckappa = model->BSIM3ckappa + + model->BSIM3lckappa * Inv_L + + model->BSIM3wckappa * Inv_W + + model->BSIM3pckappa * Inv_LW; + pParam->BSIM3cf = model->BSIM3cf + + model->BSIM3lcf * Inv_L + + model->BSIM3wcf * Inv_W + + model->BSIM3pcf * Inv_LW; + pParam->BSIM3clc = model->BSIM3clc + + model->BSIM3lclc * Inv_L + + model->BSIM3wclc * Inv_W + + model->BSIM3pclc * Inv_LW; + pParam->BSIM3cle = model->BSIM3cle + + model->BSIM3lcle * Inv_L + + model->BSIM3wcle * Inv_W + + model->BSIM3pcle * Inv_LW; + pParam->BSIM3vfbcv = model->BSIM3vfbcv + + model->BSIM3lvfbcv * Inv_L + + model->BSIM3wvfbcv * Inv_W + + model->BSIM3pvfbcv * Inv_LW; + pParam->BSIM3acde = model->BSIM3acde + + model->BSIM3lacde * Inv_L + + model->BSIM3wacde * Inv_W + + model->BSIM3pacde * Inv_LW; + pParam->BSIM3moin = model->BSIM3moin + + model->BSIM3lmoin * Inv_L + + model->BSIM3wmoin * Inv_W + + model->BSIM3pmoin * Inv_LW; + pParam->BSIM3noff = model->BSIM3noff + + model->BSIM3lnoff * Inv_L + + model->BSIM3wnoff * Inv_W + + model->BSIM3pnoff * Inv_LW; + pParam->BSIM3voffcv = model->BSIM3voffcv + + model->BSIM3lvoffcv * Inv_L + + model->BSIM3wvoffcv * Inv_W + + model->BSIM3pvoffcv * Inv_LW; + + pParam->BSIM3abulkCVfactor = + 1.0 + + pow ((pParam->BSIM3clc / + pParam->BSIM3leffCV), pParam->BSIM3cle); - T0 = (TRatio - 1.0); - pParam->BSIM3ua = pParam->BSIM3ua + pParam->BSIM3ua1 * T0; - pParam->BSIM3ub = pParam->BSIM3ub + pParam->BSIM3ub1 * T0; - pParam->BSIM3uc = pParam->BSIM3uc + pParam->BSIM3uc1 * T0; - if (pParam->BSIM3u0 > 1.0) - pParam->BSIM3u0 = pParam->BSIM3u0 / 1.0e4; - - pParam->BSIM3u0temp = pParam->BSIM3u0 - * pow(TRatio, pParam->BSIM3ute); - pParam->BSIM3vsattemp = pParam->BSIM3vsat - pParam->BSIM3at - * T0; - pParam->BSIM3rds0 = (pParam->BSIM3rdsw + pParam->BSIM3prt * T0) - / pow(pParam->BSIM3weff * 1E6, pParam->BSIM3wr); - - if (BSIM3checkModel(model, here, ckt)) - { IFuid namarray[2]; - namarray[0] = model->BSIM3modName; - namarray[1] = here->BSIM3name; - (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during BSIM3V3.2 parameter checking for %s in model %s", namarray); - return(E_BADPARM); - } - - pParam->BSIM3cgdo = (model->BSIM3cgdo + pParam->BSIM3cf) - * pParam->BSIM3weffCV; - pParam->BSIM3cgso = (model->BSIM3cgso + pParam->BSIM3cf) - * pParam->BSIM3weffCV; - pParam->BSIM3cgbo = model->BSIM3cgbo * pParam->BSIM3leffCV; - - T0 = pParam->BSIM3leffCV * pParam->BSIM3leffCV; - pParam->BSIM3tconst = pParam->BSIM3u0temp * pParam->BSIM3elm / (model->BSIM3cox - * pParam->BSIM3weffCV * pParam->BSIM3leffCV * T0); - - if (!model->BSIM3npeakGiven && model->BSIM3gamma1Given) - { T0 = pParam->BSIM3gamma1 * model->BSIM3cox; - pParam->BSIM3npeak = 3.021E22 * T0 * T0; - } - - pParam->BSIM3phi = 2.0 * Vtm0 - * log(pParam->BSIM3npeak / ni); - - pParam->BSIM3sqrtPhi = sqrt(pParam->BSIM3phi); - pParam->BSIM3phis3 = pParam->BSIM3sqrtPhi * pParam->BSIM3phi; - - pParam->BSIM3Xdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->BSIM3npeak * 1.0e6)) - * pParam->BSIM3sqrtPhi; - pParam->BSIM3sqrtXdep0 = sqrt(pParam->BSIM3Xdep0); - pParam->BSIM3litl = sqrt(3.0 * pParam->BSIM3xj - * model->BSIM3tox); - pParam->BSIM3vbi = Vtm0 * log(1.0e20 - * pParam->BSIM3npeak / (ni * ni)); - pParam->BSIM3cdep0 = sqrt(Charge_q * EPSSI - * pParam->BSIM3npeak * 1.0e6 / 2.0 - / pParam->BSIM3phi); - - pParam->BSIM3ldeb = sqrt(EPSSI * Vtm0 / (Charge_q - * pParam->BSIM3npeak * 1.0e6)) / 3.0; - pParam->BSIM3acde *= pow((pParam->BSIM3npeak / 2.0e16), -0.25); - - - if (model->BSIM3k1Given || model->BSIM3k2Given) - { if (!model->BSIM3k1Given) - { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->BSIM3k1 = 0.53; - } - if (!model->BSIM3k2Given) - { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->BSIM3k2 = -0.0186; - } - if (model->BSIM3nsubGiven) - fprintf(stdout, "Warning: nsub is ignored because k1 or k2 is given.\n"); - if (model->BSIM3xtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->BSIM3vbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->BSIM3gamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->BSIM3gamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - else - { if (!model->BSIM3vbxGiven) - pParam->BSIM3vbx = pParam->BSIM3phi - 7.7348e-4 - * pParam->BSIM3npeak - * pParam->BSIM3xt * pParam->BSIM3xt; - if (pParam->BSIM3vbx > 0.0) - pParam->BSIM3vbx = -pParam->BSIM3vbx; - if (pParam->BSIM3vbm > 0.0) - pParam->BSIM3vbm = -pParam->BSIM3vbm; - - if (!model->BSIM3gamma1Given) - pParam->BSIM3gamma1 = 5.753e-12 - * sqrt(pParam->BSIM3npeak) - / model->BSIM3cox; - if (!model->BSIM3gamma2Given) - pParam->BSIM3gamma2 = 5.753e-12 - * sqrt(pParam->BSIM3nsub) - / model->BSIM3cox; - - T0 = pParam->BSIM3gamma1 - pParam->BSIM3gamma2; - T1 = sqrt(pParam->BSIM3phi - pParam->BSIM3vbx) - - pParam->BSIM3sqrtPhi; - T2 = sqrt(pParam->BSIM3phi * (pParam->BSIM3phi - - pParam->BSIM3vbm)) - pParam->BSIM3phi; - pParam->BSIM3k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM3vbm); - pParam->BSIM3k1 = pParam->BSIM3gamma2 - 2.0 - * pParam->BSIM3k2 * sqrt(pParam->BSIM3phi - - pParam->BSIM3vbm); - } - - if (pParam->BSIM3k2 < 0.0) - { T0 = 0.5 * pParam->BSIM3k1 / pParam->BSIM3k2; - pParam->BSIM3vbsc = 0.9 * (pParam->BSIM3phi - T0 * T0); - if (pParam->BSIM3vbsc > -3.0) - pParam->BSIM3vbsc = -3.0; - else if (pParam->BSIM3vbsc < -30.0) - pParam->BSIM3vbsc = -30.0; - } - else - { pParam->BSIM3vbsc = -30.0; - } - if (pParam->BSIM3vbsc > pParam->BSIM3vbm) - pParam->BSIM3vbsc = pParam->BSIM3vbm; - - if (!model->BSIM3vfbGiven) - { if (model->BSIM3vth0Given) - { pParam->BSIM3vfb = model->BSIM3type * pParam->BSIM3vth0 - - pParam->BSIM3phi - pParam->BSIM3k1 - * pParam->BSIM3sqrtPhi; - } - else - { pParam->BSIM3vfb = -1.0; - } - } - if (!model->BSIM3vth0Given) - { pParam->BSIM3vth0 = model->BSIM3type * (pParam->BSIM3vfb - + pParam->BSIM3phi + pParam->BSIM3k1 - * pParam->BSIM3sqrtPhi); - } - - pParam->BSIM3k1ox = pParam->BSIM3k1 * model->BSIM3tox - / model->BSIM3toxm; - pParam->BSIM3k2ox = pParam->BSIM3k2 * model->BSIM3tox - / model->BSIM3toxm; - - T1 = sqrt(EPSSI / EPSOX * model->BSIM3tox - * pParam->BSIM3Xdep0); - T0 = exp(-0.5 * pParam->BSIM3dsub * pParam->BSIM3leff / T1); - pParam->BSIM3theta0vb0 = (T0 + 2.0 * T0 * T0); - - T0 = exp(-0.5 * pParam->BSIM3drout * pParam->BSIM3leff / T1); - T2 = (T0 + 2.0 * T0 * T0); - pParam->BSIM3thetaRout = pParam->BSIM3pdibl1 * T2 - + pParam->BSIM3pdibl2; - - tmp = sqrt(pParam->BSIM3Xdep0); - tmp1 = pParam->BSIM3vbi - pParam->BSIM3phi; - tmp2 = model->BSIM3factor1 * tmp; - - T0 = -0.5 * pParam->BSIM3dvt1w * pParam->BSIM3weff - * pParam->BSIM3leff / tmp2; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXP; - T2 = T1 * (1.0 + 2.0 * T1); - } - T0 = pParam->BSIM3dvt0w * T2; - T2 = T0 * tmp1; - - T0 = -0.5 * pParam->BSIM3dvt1 * pParam->BSIM3leff / tmp2; - if (T0 > -EXP_THRESHOLD) - { T1 = exp(T0); - T3 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXP; - T3 = T1 * (1.0 + 2.0 * T1); - } - T3 = pParam->BSIM3dvt0 * T3 * tmp1; - - T4 = model->BSIM3tox * pParam->BSIM3phi - / (pParam->BSIM3weff + pParam->BSIM3w0); - - T0 = sqrt(1.0 + pParam->BSIM3nlx / pParam->BSIM3leff); - T5 = pParam->BSIM3k1ox * (T0 - 1.0) * pParam->BSIM3sqrtPhi - + (pParam->BSIM3kt1 + pParam->BSIM3kt1l / pParam->BSIM3leff) - * (TRatio - 1.0); - - tmp3 = model->BSIM3type * pParam->BSIM3vth0 - - T2 - T3 + pParam->BSIM3k3 * T4 + T5; - pParam->BSIM3vfbzb = tmp3 - pParam->BSIM3phi - pParam->BSIM3k1 - * pParam->BSIM3sqrtPhi; - /* End of vfbzb */ - } - else /* !Size_Not_Found */ - { - /* va: pParam might be uninitialized, if !Size_Not_Found */ - pParam = here->pParam; - } - - /* process source/drain series resistance */ - here->BSIM3drainConductance = model->BSIM3sheetResistance - * here->BSIM3drainSquares; - if (here->BSIM3drainConductance > 0.0) - here->BSIM3drainConductance = 1.0 - / here->BSIM3drainConductance; - else - here->BSIM3drainConductance = 0.0; - - here->BSIM3sourceConductance = model->BSIM3sheetResistance - * here->BSIM3sourceSquares; - if (here->BSIM3sourceConductance > 0.0) - here->BSIM3sourceConductance = 1.0 - / here->BSIM3sourceConductance; - else - here->BSIM3sourceConductance = 0.0; - here->BSIM3cgso = pParam->BSIM3cgso; - here->BSIM3cgdo = pParam->BSIM3cgdo; - - Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; - if ((here->BSIM3sourceArea <= 0.0) && - (here->BSIM3sourcePerimeter <= 0.0)) - { SourceSatCurrent = 1.0e-14; - } - else - { SourceSatCurrent = here->BSIM3sourceArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3sourcePerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } - if ((SourceSatCurrent > 0.0) && (model->BSIM3ijth > 0.0)) - { here->BSIM3vjsm = Nvtm * log(model->BSIM3ijth - / SourceSatCurrent + 1.0); - here->BSIM3IsEvjsm = SourceSatCurrent * exp(here->BSIM3vjsm - / Nvtm); - } - - if ((here->BSIM3drainArea <= 0.0) && - (here->BSIM3drainPerimeter <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } - else - { DrainSatCurrent = here->BSIM3drainArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3drainPerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } - if ((DrainSatCurrent > 0.0) && (model->BSIM3ijth > 0.0)) - { here->BSIM3vjdm = Nvtm * log(model->BSIM3ijth - / DrainSatCurrent + 1.0); - here->BSIM3IsEvjdm = DrainSatCurrent * exp(here->BSIM3vjdm - / Nvtm); - } - } - } - return(OK); -} + T0 = (TRatio - 1.0); + pParam->BSIM3ua = + pParam->BSIM3ua + + pParam->BSIM3ua1 * T0; + pParam->BSIM3ub = + pParam->BSIM3ub + + pParam->BSIM3ub1 * T0; + pParam->BSIM3uc = + pParam->BSIM3uc + + pParam->BSIM3uc1 * T0; + if (pParam->BSIM3u0 > 1.0) + pParam->BSIM3u0 = + pParam->BSIM3u0 / 1.0e4; + + pParam->BSIM3u0temp = pParam->BSIM3u0 + * pow (TRatio, pParam->BSIM3ute); + pParam->BSIM3vsattemp = + pParam->BSIM3vsat - + pParam->BSIM3at * T0; + pParam->BSIM3rds0 = + (pParam->BSIM3rdsw + + pParam->BSIM3prt * T0) / + pow (pParam->BSIM3weff * 1E6, + pParam->BSIM3wr); + + if (BSIM3checkModel (model, here, ckt)) + { + IFuid namarray[2]; + namarray[0] = model->BSIM3modName; + namarray[1] = here->BSIM3name; + (*(SPfrontEnd->IFerror)) (ERR_FATAL, + "Fatal error(s) detected during BSIM3V3.2 parameter checking for %s in model %s", + namarray); + return (E_BADPARM); + } + + pParam->BSIM3cgdo = + (model->BSIM3cgdo + + pParam->BSIM3cf) * + pParam->BSIM3weffCV; + pParam->BSIM3cgso = + (model->BSIM3cgso + + pParam->BSIM3cf) * + pParam->BSIM3weffCV; + pParam->BSIM3cgbo = + model->BSIM3cgbo * + pParam->BSIM3leffCV; + + T0 = pParam->BSIM3leffCV * + pParam->BSIM3leffCV; + pParam->BSIM3tconst = + pParam->BSIM3u0temp * + pParam->BSIM3elm / (model->BSIM3cox * + pParam-> + BSIM3weffCV * + pParam-> + BSIM3leffCV * T0); + + if (!model->BSIM3npeakGiven + && model->BSIM3gamma1Given) + { + T0 = pParam->BSIM3gamma1 * + model->BSIM3cox; + pParam->BSIM3npeak = + 3.021E22 * T0 * T0; + } + + pParam->BSIM3phi = 2.0 * Vtm0 + * log (pParam->BSIM3npeak / ni); + + pParam->BSIM3sqrtPhi = + sqrt (pParam->BSIM3phi); + pParam->BSIM3phis3 = + pParam->BSIM3sqrtPhi * + pParam->BSIM3phi; + + pParam->BSIM3Xdep0 = + sqrt (2.0 * EPSSI / + (Charge_q * pParam->BSIM3npeak * + 1.0e6)) * pParam->BSIM3sqrtPhi; + pParam->BSIM3sqrtXdep0 = + sqrt (pParam->BSIM3Xdep0); + pParam->BSIM3litl = + sqrt (3.0 * pParam->BSIM3xj * + model->BSIM3tox); + pParam->BSIM3vbi = + Vtm0 * log (1.0e20 * + pParam->BSIM3npeak / (ni * + ni)); + pParam->BSIM3cdep0 = + sqrt (Charge_q * EPSSI * + pParam->BSIM3npeak * 1.0e6 / + 2.0 / pParam->BSIM3phi); + + pParam->BSIM3ldeb = + sqrt (EPSSI * Vtm0 / + (Charge_q * pParam->BSIM3npeak * + 1.0e6)) / 3.0; + pParam->BSIM3acde *= + pow ((pParam->BSIM3npeak / 2.0e16), + -0.25); + + + if (model->BSIM3k1Given + || model->BSIM3k2Given) + { + if (!model->BSIM3k1Given) + { + fprintf (stdout, + "Warning: k1 should be specified with k2.\n"); + pParam->BSIM3k1 = 0.53; + } + if (!model->BSIM3k2Given) + { + fprintf (stdout, + "Warning: k2 should be specified with k1.\n"); + pParam->BSIM3k2 = -0.0186; + } + if (model->BSIM3nsubGiven) + fprintf (stdout, + "Warning: nsub is ignored because k1 or k2 is given.\n"); + if (model->BSIM3xtGiven) + fprintf (stdout, + "Warning: xt is ignored because k1 or k2 is given.\n"); + if (model->BSIM3vbxGiven) + fprintf (stdout, + "Warning: vbx is ignored because k1 or k2 is given.\n"); + if (model->BSIM3gamma1Given) + fprintf (stdout, + "Warning: gamma1 is ignored because k1 or k2 is given.\n"); + if (model->BSIM3gamma2Given) + fprintf (stdout, + "Warning: gamma2 is ignored because k1 or k2 is given.\n"); + } + else + { + if (!model->BSIM3vbxGiven) + pParam->BSIM3vbx = + pParam->BSIM3phi - + 7.7348e-4 * + pParam->BSIM3npeak * + pParam->BSIM3xt * + pParam->BSIM3xt; + if (pParam->BSIM3vbx > 0.0) + pParam->BSIM3vbx = + -pParam->BSIM3vbx; + if (pParam->BSIM3vbm > 0.0) + pParam->BSIM3vbm = + -pParam->BSIM3vbm; + + if (!model->BSIM3gamma1Given) + pParam->BSIM3gamma1 = + 5.753e-12 * + sqrt (pParam-> + BSIM3npeak) / + model->BSIM3cox; + if (!model->BSIM3gamma2Given) + pParam->BSIM3gamma2 = + 5.753e-12 * + sqrt (pParam-> + BSIM3nsub) / + model->BSIM3cox; + + T0 = pParam->BSIM3gamma1 - + pParam->BSIM3gamma2; + T1 = sqrt (pParam->BSIM3phi - + pParam->BSIM3vbx) - + pParam->BSIM3sqrtPhi; + T2 = sqrt (pParam->BSIM3phi * + (pParam->BSIM3phi - + pParam->BSIM3vbm)) - + pParam->BSIM3phi; + pParam->BSIM3k2 = + T0 * T1 / (2.0 * T2 + + pParam->BSIM3vbm); + pParam->BSIM3k1 = + pParam->BSIM3gamma2 - + 2.0 * pParam->BSIM3k2 * + sqrt (pParam->BSIM3phi - + pParam->BSIM3vbm); + } + + if (pParam->BSIM3k2 < 0.0) + { + T0 = 0.5 * pParam->BSIM3k1 / + pParam->BSIM3k2; + pParam->BSIM3vbsc = + 0.9 * (pParam->BSIM3phi - + T0 * T0); + if (pParam->BSIM3vbsc > -3.0) + pParam->BSIM3vbsc = -3.0; + else if (pParam->BSIM3vbsc < -30.0) + pParam->BSIM3vbsc = -30.0; + } + else + { + pParam->BSIM3vbsc = -30.0; + } + if (pParam->BSIM3vbsc > pParam->BSIM3vbm) + pParam->BSIM3vbsc = pParam->BSIM3vbm; + + if (!model->BSIM3vfbGiven) + { + if (model->BSIM3vth0Given) + { + pParam->BSIM3vfb = + model->BSIM3type * + pParam->BSIM3vth0 - + pParam->BSIM3phi - + pParam->BSIM3k1 * + pParam->BSIM3sqrtPhi; + } + else + { + pParam->BSIM3vfb = -1.0; + } + } + if (!model->BSIM3vth0Given) + { + pParam->BSIM3vth0 = + model->BSIM3type * + (pParam->BSIM3vfb + + pParam->BSIM3phi + + pParam->BSIM3k1 * + pParam->BSIM3sqrtPhi); + } + pParam->BSIM3k1ox = + pParam->BSIM3k1 * model->BSIM3tox / + model->BSIM3toxm; + pParam->BSIM3k2ox = + pParam->BSIM3k2 * model->BSIM3tox / + model->BSIM3toxm; + + T1 = sqrt (EPSSI / EPSOX * model->BSIM3tox + * pParam->BSIM3Xdep0); + T0 = exp (-0.5 * pParam->BSIM3dsub * + pParam->BSIM3leff / T1); + pParam->BSIM3theta0vb0 = (T0 + 2.0 * T0 * T0); + + T0 = exp (-0.5 * pParam->BSIM3drout * + pParam->BSIM3leff / T1); + T2 = (T0 + 2.0 * T0 * T0); + pParam->BSIM3thetaRout = + pParam->BSIM3pdibl1 * T2 + + pParam->BSIM3pdibl2; + + /* vfbzb for capMod 1, 2 & 3 - Weidong 4/1997 */ + tmp = sqrt (pParam->BSIM3Xdep0); + tmp1 = pParam->BSIM3vbi - pParam->BSIM3phi; + tmp2 = model->BSIM3factor1 * tmp; + + T0 = -0.5 * pParam->BSIM3dvt1w * + pParam->BSIM3weff * + pParam->BSIM3leff / tmp2; + if (T0 > -EXP_THRESHOLD) + { + T1 = exp (T0); + T2 = T1 * (1.0 + 2.0 * T1); + } + else + { + T1 = MIN_EXP; + T2 = T1 * (1.0 + 2.0 * T1); + } + T0 = pParam->BSIM3dvt0w * T2; + T2 = T0 * tmp1; + + T0 = -0.5 * pParam->BSIM3dvt1 * + pParam->BSIM3leff / tmp2; + if (T0 > -EXP_THRESHOLD) + { + T1 = exp (T0); + T3 = T1 * (1.0 + 2.0 * T1); + } + else + { + T1 = MIN_EXP; + T3 = T1 * (1.0 + 2.0 * T1); + } + T3 = pParam->BSIM3dvt0 * T3 * tmp1; + + T4 = model->BSIM3tox * pParam->BSIM3phi + / (pParam->BSIM3weff + + pParam->BSIM3w0); + + T0 = sqrt (1.0 + + pParam->BSIM3nlx / + pParam->BSIM3leff); + T5 = pParam->BSIM3k1ox * (T0 - + 1.0) * + pParam->BSIM3sqrtPhi + + (pParam->BSIM3kt1 + + pParam->BSIM3kt1l / + pParam->BSIM3leff) * (TRatio - 1.0); + + tmp3 = model->BSIM3type * pParam->BSIM3vth0 + - T2 - T3 + pParam->BSIM3k3 * T4 + T5; + pParam->BSIM3vfbzb = + tmp3 - pParam->BSIM3phi - + pParam->BSIM3k1 * + pParam->BSIM3sqrtPhi; + /* End of vfbzb */ + } + + /* process source/drain series resistance */ + here->BSIM3drainConductance = + model->BSIM3sheetResistance * + here->BSIM3drainSquares; + if (here->BSIM3drainConductance > 0.0) + here->BSIM3drainConductance = 1.0 + / here->BSIM3drainConductance; + else + here->BSIM3drainConductance = 0.0; + + here->BSIM3sourceConductance = + model->BSIM3sheetResistance * + here->BSIM3sourceSquares; + if (here->BSIM3sourceConductance > 0.0) + here->BSIM3sourceConductance = 1.0 + / here->BSIM3sourceConductance; + else + here->BSIM3sourceConductance = 0.0; + here->BSIM3cgso = pParam->BSIM3cgso; + here->BSIM3cgdo = pParam->BSIM3cgdo; + + Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; + if ((here->BSIM3sourceArea <= 0.0) && + (here->BSIM3sourcePerimeter <= 0.0)) + { + SourceSatCurrent = 1.0e-14; + } + else + { + SourceSatCurrent = here->BSIM3sourceArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3sourcePerimeter + * + model-> + BSIM3jctSidewallTempSatCurDensity; + } + if ((SourceSatCurrent > 0.0) + && (model->BSIM3ijth > 0.0)) + { + here->BSIM3vjsm = Nvtm * log (model->BSIM3ijth + / + SourceSatCurrent + + 1.0); + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + here->BSIM3IsEvjsm = + SourceSatCurrent * + exp (here->BSIM3vjsm / Nvtm); + break; + case BSIM3V32: + default: + /* Do nothing */ + } + + } + + if ((here->BSIM3drainArea <= 0.0) && + (here->BSIM3drainPerimeter <= 0.0)) + { + DrainSatCurrent = 1.0e-14; + } + else + { + DrainSatCurrent = here->BSIM3drainArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3drainPerimeter + * + model-> + BSIM3jctSidewallTempSatCurDensity; + } + if ((DrainSatCurrent > 0.0) + && (model->BSIM3ijth > 0.0)) + { + here->BSIM3vjdm = Nvtm * log (model->BSIM3ijth + / + DrainSatCurrent + + 1.0); + + /* Added revision dependent code */ + switch (model->BSIM3intVersion) + { + case BSIM3V324: + case BSIM3V323: + case BSIM3V322: + + here->BSIM3IsEvjdm = + DrainSatCurrent * + exp (here->BSIM3vjdm / Nvtm); + break; + + case BSIM3V32: + default: + /* Do nothing */ + + } + + } + } + } + return (OK); +} diff --git a/src/spicelib/devices/bsim3/b3trunc.c b/src/spicelib/devices/bsim3/b3trunc.c index e856cdc84..b9fbd5db3 100644 --- a/src/spicelib/devices/bsim3/b3trunc.c +++ b/src/spicelib/devices/bsim3/b3trunc.c @@ -1,13 +1,24 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -Author: 1997-1999 Weidong Liu. -File: b3trunc.c -**********/ + * Copyright 2001 Regents of the University of California. All rights reserved. + * File: b3trunc.c of BSIM3v3.2.4 + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Author: 1997-1999 Weidong Liu. + * Author: 2001 Xuemei Xi + * Modified by Poalo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 + * BSIM3v3.2.3, Released by Xuemei Xi 10/05/2001 + * BSIM3v3.2.2, Released by Weidong Liu 04/20/1999 + * BSIM3v3.2, Released by Weidong Liu 06/16/1998 + */ + + +/*************************************/ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "bsim3def.h" #include "sperror.h" @@ -15,39 +26,35 @@ File: b3trunc.c int -BSIM3trunc(inModel,ckt,timeStep) -GENmodel *inModel; -CKTcircuit *ckt; -double *timeStep; +BSIM3trunc (GENmodel * inModel, CKTcircuit * ckt, double *timeStep) { -BSIM3model *model = (BSIM3model*)inModel; -BSIM3instance *here; + BSIM3model *model = (BSIM3model *) inModel; + BSIM3instance *here; #ifdef STEPDEBUG - double debugtemp; + double debugtemp; #endif /* STEPDEBUG */ - for (; model != NULL; model = model->BSIM3nextModel) - { for (here = model->BSIM3instances; here != NULL; - here = here->BSIM3nextInstance) - { - if (here->BSIM3owner != ARCHme) continue; + for (; model != NULL; model = model->BSIM3nextModel) + { + for (here = model->BSIM3instances; here != NULL; + here = here->BSIM3nextInstance) + { + if (here->BSIM3owner != ARCHme) + continue; #ifdef STEPDEBUG - debugtemp = *timeStep; + debugtemp = *timeStep; #endif /* STEPDEBUG */ - CKTterr(here->BSIM3qb,ckt,timeStep); - CKTterr(here->BSIM3qg,ckt,timeStep); - CKTterr(here->BSIM3qd,ckt,timeStep); + CKTterr (here->BSIM3qb, ckt, timeStep); + CKTterr (here->BSIM3qg, ckt, timeStep); + CKTterr (here->BSIM3qd, ckt, timeStep); #ifdef STEPDEBUG - if(debugtemp != *timeStep) - { printf("device %s reduces step from %g to %g\n", - here->BSIM3name,debugtemp,*timeStep); - } + if (debugtemp != *timeStep) + { + printf ("device %s reduces step from %g to %g\n", here->BSIM3name, debugtemp, *timeStep); + } #endif /* STEPDEBUG */ - } - } - return(OK); + } + } + return (OK); } - - - diff --git a/src/spicelib/devices/bsim3/bsim3def.h b/src/spicelib/devices/bsim3/bsim3def.h index 0ec5a05f4..4dedb56be 100644 --- a/src/spicelib/devices/bsim3/bsim3def.h +++ b/src/spicelib/devices/bsim3/bsim3def.h @@ -1,8 +1,9 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. +Copyright 2001 Regents of the University of California. All rights reserved. Author: 1995 Min-Chie Jeng and Mansun Chan. Author: 1997-1999 Weidong Liu. -Modified: 2000 AlansFixes +Author: 2001 Xuemei Xi +Modified by Paolo Nenzi 2002 File: bsim3def.h **********/ @@ -20,9 +21,8 @@ typedef struct sBSIM3instance struct sBSIM3model *BSIM3modPtr; struct sBSIM3instance *BSIM3nextInstance; IFuid BSIM3name; - int BSIM3owner; /* number of owner process */ + int BSIM3owner; /* number of owner process */ int BSIM3states; /* index into state table for this device */ - int BSIM3dNode; int BSIM3gNode; int BSIM3sNode; @@ -39,13 +39,13 @@ typedef struct sBSIM3instance double BSIM3cgdo; double BSIM3cgso; double BSIM3vjsm; - double BSIM3IsEvjsm; + double BSIM3IsEvjsm; double BSIM3vjdm; - double BSIM3IsEvjdm; + double BSIM3IsEvjdm; double BSIM3l; double BSIM3w; - double BSIM3m; + double BSIM3m; double BSIM3drainArea; double BSIM3sourceArea; double BSIM3drainSquares; @@ -104,12 +104,17 @@ typedef struct sBSIM3instance double BSIM3gtd; double BSIM3gts; double BSIM3gtb; + double BSIM3rds; /* Noise bugfix */ + double BSIM3Vgsteff; + double BSIM3Vdseff; + double BSIM3Abulk; + double BSIM3AbovVgst2Vtm; struct bsim3SizeDependParam *pParam; unsigned BSIM3lGiven :1; unsigned BSIM3wGiven :1; - unsigned BSIM3mGiven :1; + unsigned BSIM3mGiven :1; unsigned BSIM3drainAreaGiven :1; unsigned BSIM3sourceAreaGiven :1; unsigned BSIM3drainSquaresGiven :1; @@ -351,7 +356,17 @@ typedef struct sBSIM3model int BSIM3noiMod; int BSIM3binUnit; int BSIM3paramChk; - char *BSIM3version; + char *BSIM3version; + + /* The following field is an integer coding + * of BSIM3version. + */ + int BSIM3intVersion; +#define BSIM3V324 324 /* BSIM3 V3.2.4 */ +#define BSIM3V323 323 /* BSIM3 V3.2.3 */ +#define BSIM3V322 322 /* BSIM3 V3.2.2 */ +#define BSIM3V32 32 /* BSIM3 V3.2 */ +#define BSIM3V3OLD 0 /* Old model */ double BSIM3tox; double BSIM3toxm; double BSIM3cdsc; @@ -773,6 +788,9 @@ typedef struct sBSIM3model double BSIM3PhiBSWG; double BSIM3jctTempSatCurDensity; double BSIM3jctSidewallTempSatCurDensity; + double BSIM3unitAreaTempJctCap; + double BSIM3unitLengthSidewallTempJctCap; + double BSIM3unitLengthGateSidewallTempJctCap; double BSIM3oxideTrapDensityA; double BSIM3oxideTrapDensityB; @@ -1745,18 +1763,13 @@ typedef struct sBSIM3model #include "bsim3ext.h" -#ifdef __STDC__ extern void BSIM3evaluate(double,double,double,BSIM3instance*,BSIM3model*, double*,double*,double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, CKTcircuit*); extern int BSIM3debug(BSIM3model*, BSIM3instance*, CKTcircuit*, int); extern int BSIM3checkModel(BSIM3model*, BSIM3instance*, CKTcircuit*); -#else /* stdc */ -extern void BSIM3evaluate(); -extern int BSIM3debug(); -extern int BSIM3checkModel(); -#endif /* stdc */ + #endif /*BSIM3*/ diff --git a/src/spicelib/devices/bsim3/bsim3ext.h b/src/spicelib/devices/bsim3/bsim3ext.h index aa97f642b..27b6730c0 100644 --- a/src/spicelib/devices/bsim3/bsim3ext.h +++ b/src/spicelib/devices/bsim3/bsim3ext.h @@ -1,10 +1,11 @@ /********** Copyright 1999 Regents of the University of California. All rights reserved. Author: 1991 JianHui Huang and Min-Chie Jeng. +Modified by Yuhua Cheng to use BSIM3v3 in Spice3f5 (Jan. 1997) +Modified by Paolo Nenzi 2002 File: bsim3ext.h **********/ -#ifdef __STDC__ extern int BSIM3acLoad(GENmodel *,CKTcircuit*); extern int BSIM3ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); extern int BSIM3convTest(GENmodel *,CKTcircuit*); @@ -24,30 +25,10 @@ extern void BSIM3mosCap(CKTcircuit*, double, double, double, double, extern int BSIM3param(int,IFvalue*,GENinstance*,IFvalue*); extern int BSIM3pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); extern int BSIM3setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int BSIM3unsetup(GENmodel*, CKTcircuit*); extern int BSIM3temp(GENmodel*,CKTcircuit*); extern int BSIM3trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); +extern int BSIM3unsetup(GENmodel*,CKTcircuit*); -#else /* stdc */ -extern int BSIM3acLoad(); -extern int BSIM3delete(); -extern void BSIM3destroy(); -extern int BSIM3getic(); -extern int BSIM3load(); -extern int BSIM3mDelete(); -extern int BSIM3ask(); -extern int BSIM3mAsk(); -extern int BSIM3convTest(); -extern int BSIM3temp(); -extern int BSIM3mParam(); -extern void BSIM3mosCap(); -extern int BSIM3param(); -extern int BSIM3pzLoad(); -extern int BSIM3setup(); -extern int BSIM3unsetup(); -extern int BSIM3trunc(); -extern int BSIM3noise(); -#endif /* stdc */ diff --git a/src/spicelib/devices/bsim3/bsim3init.c b/src/spicelib/devices/bsim3/bsim3init.c index 5efbcbcb1..8a82bebb3 100644 --- a/src/spicelib/devices/bsim3/bsim3init.c +++ b/src/spicelib/devices/bsim3/bsim3init.c @@ -7,7 +7,7 @@ #include "bsim3init.h" -SPICEdev BSIM3info = { +SPICEdev B3info = { { "BSIM3", "Berkeley Short Channel IGFET Model Version-3", @@ -66,7 +66,10 @@ SPICEdev BSIM3info = { DEVsenTrunc : NULL, DEVdisto : NULL, DEVnoise : BSIM3noise, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &BSIM3iSize, DEVmodSize : &BSIM3mSize @@ -76,5 +79,5 @@ SPICEdev BSIM3info = { SPICEdev * get_bsim3_info(void) { - return &BSIM3info; + return &B3info; } diff --git a/src/spicelib/devices/bsim3/bsim3itf.h b/src/spicelib/devices/bsim3/bsim3itf.h index a9cac28c2..514289b76 100644 --- a/src/spicelib/devices/bsim3/bsim3itf.h +++ b/src/spicelib/devices/bsim3/bsim3itf.h @@ -1,8 +1,10 @@ /********** Copyright 1999 Regents of the University of California. All rights reserved. Author: 1991 JianHui Huang and Min-Chie Jeng. +Modified by Paolo Nenzi 2002 File: bsim3itf.h **********/ + #ifndef DEV_BSIM3 #define DEV_BSIM3 diff --git a/src/spicelib/devices/bsim3soi_dd/b3soidd.c b/src/spicelib/devices/bsim3soi_dd/b3soidd.c index 9b064a70a..af754d867 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soidd.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soidd.c @@ -4,11 +4,15 @@ Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soidd.c 98/5/01 Modified by Wei Jin 99/9/27 +Modified by Paolo Nenzi 2001 **********/ - +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ + #include "ngspice.h" -#include #include "devdefs.h" #include "b3soidddef.h" #include "suffix.h" @@ -16,6 +20,7 @@ Modified by Wei Jin 99/9/27 IFparm B3SOIDDpTable[] = { /* parameters */ IOP( "l", B3SOIDD_L, IF_REAL , "Length"), IOP( "w", B3SOIDD_W, IF_REAL , "Width"), +IOP( "m", B3SOIDD_M, IF_REAL , "Parallel Multiplier"), IOP( "ad", B3SOIDD_AD, IF_REAL , "Drain area"), IOP( "as", B3SOIDD_AS, IF_REAL , "Source area"), IOP( "pd", B3SOIDD_PD, IF_REAL , "Drain perimeter"), diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddacld.c b/src/spicelib/devices/bsim3soi_dd/b3soiddacld.c index 6b18858e1..b5d272390 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddacld.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddacld.c @@ -3,10 +3,15 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soiddacld.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ + #include "ngspice.h" -#include #include "cktdefs.h" #include "b3soidddef.h" #include "sperror.h" @@ -14,13 +19,11 @@ File: b3soiddacld.c 98/5/01 int -B3SOIDDacLoad(inModel,ckt) -GENmodel *inModel; -register CKTcircuit *ckt; +B3SOIDDacLoad(GENmodel *inModel, CKTcircuit *ckt) { -register B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; -register B3SOIDDinstance *here; -register int selfheat; +B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; +B3SOIDDinstance *here; +int selfheat; double xcggb, xcgdb, xcgsb, xcgeb, xcgT; double xcdgb, xcddb, xcdsb, xcdeb, xcdT; double xcsgb, xcsdb, xcssb, xcseb, xcsT; @@ -43,6 +46,8 @@ double xcTt, cTt, gcTt, gTtt, gTtg, gTtb, gTte, gTtdp, gTtsp; double Dum1, Dum2, Dum3, Dum4, Dum5; FILE *fpdebug; +double m; + omega = ckt->CKTomega; for (; model != NULL; model = model->B3SOIDDnextModel) { @@ -50,10 +55,14 @@ FILE *fpdebug; for (here = model->B3SOIDDinstances; here!= NULL; here = here->B3SOIDDnextInstance) { - selfheat = (model->B3SOIDDshMod == 1) && (here->B3SOIDDrth0 != 0.0); + if (here->B3SOIDDowner != ARCHme) + continue; + + + selfheat = (model->B3SOIDDshMod == 1) && (here->B3SOIDDrth0 != 0.0); if (here->B3SOIDDdebugMod > 2) { - fpdebug = fopen("b3soiDDac.log", "a"); + fpdebug = fopen("b3soiddac.log", "a"); fprintf(fpdebug, ".......omega=%.5e\n", omega); } if (here->B3SOIDDmode >= 0) @@ -257,49 +266,51 @@ FILE *fpdebug; xcbsb = cbsb * omega; xcbeb = cbeb * omega; xcbT = cbT * omega; - + xcTt = cTt * omega; - *(here->B3SOIDDEgPtr +1) += xcegb; - *(here->B3SOIDDEdpPtr +1) += xcedb; - *(here->B3SOIDDEspPtr +1) += xcesb; - *(here->B3SOIDDGePtr +1) += xcgeb; - *(here->B3SOIDDDPePtr +1) += xcdeb; - *(here->B3SOIDDSPePtr +1) += xcseb; + m = here->B3SOIDDm; + + *(here->B3SOIDDEgPtr +1) += m * xcegb; + *(here->B3SOIDDEdpPtr +1) += m * xcedb; + *(here->B3SOIDDEspPtr +1) += m * xcesb; + *(here->B3SOIDDGePtr +1) += m * xcgeb; + *(here->B3SOIDDDPePtr +1) += m * xcdeb; + *(here->B3SOIDDSPePtr +1) += m * xcseb; - *(here->B3SOIDDEePtr +1) += xceeb; + *(here->B3SOIDDEePtr +1) += m * xceeb; - *(here->B3SOIDDGgPtr +1) += xcggb; - *(here->B3SOIDDGdpPtr +1) += xcgdb; - *(here->B3SOIDDGspPtr +1) += xcgsb; + *(here->B3SOIDDGgPtr +1) += m * xcggb; + *(here->B3SOIDDGdpPtr +1) += m * xcgdb; + *(here->B3SOIDDGspPtr +1) += m * xcgsb; - *(here->B3SOIDDDPgPtr +1) += xcdgb; - *(here->B3SOIDDDPdpPtr +1) += xcddb; - *(here->B3SOIDDDPspPtr +1) += xcdsb; + *(here->B3SOIDDDPgPtr +1) += m * xcdgb; + *(here->B3SOIDDDPdpPtr +1) += m * xcddb; + *(here->B3SOIDDDPspPtr +1) += m * xcdsb; - *(here->B3SOIDDSPgPtr +1) += xcsgb; - *(here->B3SOIDDSPdpPtr +1) += xcsdb; - *(here->B3SOIDDSPspPtr +1) += xcssb; + *(here->B3SOIDDSPgPtr +1) += m * xcsgb; + *(here->B3SOIDDSPdpPtr +1) += m * xcsdb; + *(here->B3SOIDDSPspPtr +1) += m * xcssb; - *(here->B3SOIDDBePtr +1) += xcbeb; - *(here->B3SOIDDBgPtr +1) += xcbgb; - *(here->B3SOIDDBdpPtr +1) += xcbdb; - *(here->B3SOIDDBspPtr +1) += xcbsb; + *(here->B3SOIDDBePtr +1) += m * xcbeb; + *(here->B3SOIDDBgPtr +1) += m * xcbgb; + *(here->B3SOIDDBdpPtr +1) += m * xcbdb; + *(here->B3SOIDDBspPtr +1) += m * xcbsb; - *(here->B3SOIDDEbPtr +1) -= xcegb + xcedb + xcesb + xceeb; - *(here->B3SOIDDGbPtr +1) -= xcggb + xcgdb + xcgsb + xcgeb; - *(here->B3SOIDDDPbPtr +1) -= xcdgb + xcddb + xcdsb + xcdeb; - *(here->B3SOIDDSPbPtr +1) -= xcsgb + xcsdb + xcssb + xcseb; - *(here->B3SOIDDBbPtr +1) -= xcbgb + xcbdb + xcbsb + xcbeb; + *(here->B3SOIDDEbPtr +1) -= m * (xcegb + xcedb + xcesb + xceeb); + *(here->B3SOIDDGbPtr +1) -= m * (xcggb + xcgdb + xcgsb + xcgeb); + *(here->B3SOIDDDPbPtr +1) -= m * (xcdgb + xcddb + xcdsb + xcdeb); + *(here->B3SOIDDSPbPtr +1) -= m * (xcsgb + xcsdb + xcssb + xcseb); + *(here->B3SOIDDBbPtr +1) -= m * (xcbgb + xcbdb + xcbsb + xcbeb); if (selfheat) { - *(here->B3SOIDDTemptempPtr + 1) += xcTt; - *(here->B3SOIDDDPtempPtr + 1) += xcdT; - *(here->B3SOIDDSPtempPtr + 1) += xcsT; - *(here->B3SOIDDBtempPtr + 1) += xcbT; - *(here->B3SOIDDEtempPtr + 1) += xceT; - *(here->B3SOIDDGtempPtr + 1) += xcgT; + *(here->B3SOIDDTemptempPtr + 1) += m * xcTt; + *(here->B3SOIDDDPtempPtr + 1) += m * xcdT; + *(here->B3SOIDDSPtempPtr + 1) += m * xcsT; + *(here->B3SOIDDBtempPtr + 1) += m * xcbT; + *(here->B3SOIDDEtempPtr + 1) += m * xceT; + *(here->B3SOIDDGtempPtr + 1) += m * xcgT; } @@ -329,45 +340,45 @@ xcsgb, xcsdb, xcssb, -(xcsgb+xcsdb+xcssb+xcseb), xcseb); *(here->B3SOIDDEdpPtr) += 0.0; *(here->B3SOIDDEspPtr) += 0.0; *(here->B3SOIDDGePtr) -= 0.0; - *(here->B3SOIDDDPePtr) += Gme + gddpe; - *(here->B3SOIDDSPePtr) += gsspe - Gme; + *(here->B3SOIDDDPePtr) += m * (Gme + gddpe); + *(here->B3SOIDDSPePtr) += m * (gsspe - Gme); *(here->B3SOIDDEePtr) += 0.0; - *(here->B3SOIDDDPgPtr) += Gm + gddpg; - *(here->B3SOIDDDPdpPtr) += gdpr + gds + gddpdp + RevSum ; - *(here->B3SOIDDDPspPtr) -= gds + FwdSum - gddpsp; - *(here->B3SOIDDDPdPtr) -= gdpr; - - *(here->B3SOIDDSPgPtr) -= Gm - gsspg; - *(here->B3SOIDDSPdpPtr) -= gds + RevSum - gsspdp; - *(here->B3SOIDDSPspPtr) += gspr + gds + FwdSum + gsspsp; - *(here->B3SOIDDSPsPtr) -= gspr; - - *(here->B3SOIDDBePtr) += gbbe; - *(here->B3SOIDDBgPtr) += gbbg; - *(here->B3SOIDDBdpPtr) += gbbdp; - *(here->B3SOIDDBspPtr) += gbbsp; - *(here->B3SOIDDBbPtr) += gbbb; + *(here->B3SOIDDDPgPtr) += m * (Gm + gddpg); + *(here->B3SOIDDDPdpPtr) += m * (gdpr + gds + gddpdp + RevSum); + *(here->B3SOIDDDPspPtr) -= m * (gds + FwdSum - gddpsp); + *(here->B3SOIDDDPdPtr) -= m * gdpr; + + *(here->B3SOIDDSPgPtr) -= m * (Gm - gsspg); + *(here->B3SOIDDSPdpPtr) -= m * (gds + RevSum - gsspdp); + *(here->B3SOIDDSPspPtr) += m * (gspr + gds + FwdSum + gsspsp); + *(here->B3SOIDDSPsPtr) -= m * gspr; + + *(here->B3SOIDDBePtr) += m * gbbe; + *(here->B3SOIDDBgPtr) += m * gbbg; + *(here->B3SOIDDBdpPtr) += m * gbbdp; + *(here->B3SOIDDBspPtr) += m * gbbsp; + *(here->B3SOIDDBbPtr) += m * gbbb; *(here->B3SOIDDEbPtr) += 0.0; - *(here->B3SOIDDSPbPtr) -= Gmbs - gsspb; - *(here->B3SOIDDDPbPtr) -= (-gddpb - Gmbs); + *(here->B3SOIDDSPbPtr) -= m * (Gmbs - gsspb); + *(here->B3SOIDDDPbPtr) -= m * (-gddpb - Gmbs); if (selfheat) { - *(here->B3SOIDDDPtempPtr) += GmT + gddpT; - *(here->B3SOIDDSPtempPtr) += -GmT + gsspT; - *(here->B3SOIDDBtempPtr) += gbbT; + *(here->B3SOIDDDPtempPtr) += m * (GmT + gddpT); + *(here->B3SOIDDSPtempPtr) += m * (-GmT + gsspT); + *(here->B3SOIDDBtempPtr) += m * gbbT; if (here->B3SOIDDbodyMod == 1) { - (*(here->B3SOIDDPtempPtr) += gppT); + (*(here->B3SOIDDPtempPtr) += m * gppT); } - *(here->B3SOIDDTemptempPtr) += gTtt + 1/here->pParam->B3SOIDDrth; - *(here->B3SOIDDTempgPtr) += gTtg; - *(here->B3SOIDDTempbPtr) += gTtb; - *(here->B3SOIDDTempePtr) += gTte; - *(here->B3SOIDDTempdpPtr) += gTtdp; - *(here->B3SOIDDTempspPtr) += gTtsp; + *(here->B3SOIDDTemptempPtr) += m * (gTtt + 1/here->pParam->B3SOIDDrth); + *(here->B3SOIDDTempgPtr) += m * gTtg; + *(here->B3SOIDDTempbPtr) += m * gTtb; + *(here->B3SOIDDTempePtr) += m * gTte; + *(here->B3SOIDDTempdpPtr) += m * gTtdp; + *(here->B3SOIDDTempspPtr) += m * gTtsp; } if (here->B3SOIDDdebugMod > 3) @@ -389,68 +400,68 @@ if (here->B3SOIDDdebugMod > 3) gbbg, gbbdp, gbbsp, gbbb, gbbe); } - *(here->B3SOIDDDdPtr) += gdpr; - *(here->B3SOIDDDdpPtr) -= gdpr; - *(here->B3SOIDDSsPtr) += gspr; - *(here->B3SOIDDSspPtr) -= gspr; + *(here->B3SOIDDDdPtr) += m * gdpr; + *(here->B3SOIDDDdpPtr) -= m * gdpr; + *(here->B3SOIDDSsPtr) += m * gspr; + *(here->B3SOIDDSspPtr) -= m * gspr; if (here->B3SOIDDbodyMod == 1) { - (*(here->B3SOIDDBpPtr) -= gppp); - (*(here->B3SOIDDPbPtr) += gppb); - (*(here->B3SOIDDPpPtr) += gppp); - (*(here->B3SOIDDPgPtr) += gppg); - (*(here->B3SOIDDPdpPtr) += gppdp); - (*(here->B3SOIDDPspPtr) += gppsp); - (*(here->B3SOIDDPePtr) += gppe); + (*(here->B3SOIDDBpPtr) -= m * gppp); + (*(here->B3SOIDDPbPtr) += m * gppb); + (*(here->B3SOIDDPpPtr) += m * gppp); + (*(here->B3SOIDDPgPtr) += m * gppg); + (*(here->B3SOIDDPdpPtr) += m * gppdp); + (*(here->B3SOIDDPspPtr) += m * gppsp); + (*(here->B3SOIDDPePtr) += m * gppe); } if (here->B3SOIDDdebugMod > 1) { - *(here->B3SOIDDVbsPtr) += 1; - *(here->B3SOIDDIdsPtr) += 1; - *(here->B3SOIDDIcPtr) += 1; - *(here->B3SOIDDIbsPtr) += 1; - *(here->B3SOIDDIbdPtr) += 1; - *(here->B3SOIDDIiiPtr) += 1; - *(here->B3SOIDDIgidlPtr) += 1; - *(here->B3SOIDDItunPtr) += 1; - *(here->B3SOIDDIbpPtr) += 1; - *(here->B3SOIDDAbeffPtr) += 1; - *(here->B3SOIDDVbs0effPtr) += 1; + *(here->B3SOIDDVbsPtr) += m * 1; + *(here->B3SOIDDIdsPtr) += m * 1; + *(here->B3SOIDDIcPtr) += m * 1; + *(here->B3SOIDDIbsPtr) += m * 1; + *(here->B3SOIDDIbdPtr) += m * 1; + *(here->B3SOIDDIiiPtr) += m * 1; + *(here->B3SOIDDIgidlPtr) += m * 1; + *(here->B3SOIDDItunPtr) += m * 1; + *(here->B3SOIDDIbpPtr) += m * 1; + *(here->B3SOIDDAbeffPtr) += m * 1; + *(here->B3SOIDDVbs0effPtr) += m * 1; *(here->B3SOIDDVbseffPtr) += 1; - *(here->B3SOIDDXcPtr) += 1; - *(here->B3SOIDDCbgPtr) += 1; - *(here->B3SOIDDCbbPtr) += 1; - *(here->B3SOIDDCbdPtr) += 1; - *(here->B3SOIDDqbPtr) += 1; - *(here->B3SOIDDQbfPtr) += 1; - *(here->B3SOIDDQjsPtr) += 1; - *(here->B3SOIDDQjdPtr) += 1; + *(here->B3SOIDDXcPtr) += m * 1; + *(here->B3SOIDDCbgPtr) += m * 1; + *(here->B3SOIDDCbbPtr) += m * 1; + *(here->B3SOIDDCbdPtr) += m * 1; + *(here->B3SOIDDqbPtr) += m * 1; + *(here->B3SOIDDQbfPtr) += m * 1; + *(here->B3SOIDDQjsPtr) += m * 1; + *(here->B3SOIDDQjdPtr) += m * 1; /* clean up last */ - *(here->B3SOIDDGmPtr) += 1; - *(here->B3SOIDDGmbsPtr) += 1; - *(here->B3SOIDDGdsPtr) += 1; - *(here->B3SOIDDGmePtr) += 1; - *(here->B3SOIDDVbs0teffPtr) += 1; - *(here->B3SOIDDVgsteffPtr) += 1; - *(here->B3SOIDDCbePtr) += 1; - *(here->B3SOIDDVthPtr) += 1; - *(here->B3SOIDDXcsatPtr) += 1; - *(here->B3SOIDDVdscvPtr) += 1; - *(here->B3SOIDDVcscvPtr) += 1; - *(here->B3SOIDDQaccPtr) += 1; - *(here->B3SOIDDQsub0Ptr) += 1; - *(here->B3SOIDDQsubs1Ptr) += 1; - *(here->B3SOIDDQsubs2Ptr) += 1; - *(here->B3SOIDDqgPtr) += 1; - *(here->B3SOIDDqdPtr) += 1; - *(here->B3SOIDDqePtr) += 1; - *(here->B3SOIDDDum1Ptr) += 1; - *(here->B3SOIDDDum2Ptr) += 1; - *(here->B3SOIDDDum3Ptr) += 1; - *(here->B3SOIDDDum4Ptr) += 1; - *(here->B3SOIDDDum5Ptr) += 1; + *(here->B3SOIDDGmPtr) += m * 1; + *(here->B3SOIDDGmbsPtr) += m * 1; + *(here->B3SOIDDGdsPtr) += m * 1; + *(here->B3SOIDDGmePtr) += m * 1; + *(here->B3SOIDDVbs0teffPtr) += m * 1; + *(here->B3SOIDDVgsteffPtr) += m * 1; + *(here->B3SOIDDCbePtr) += m * 1; + *(here->B3SOIDDVthPtr) += m * 1; + *(here->B3SOIDDXcsatPtr) += m * 1; + *(here->B3SOIDDVdscvPtr) += m * 1; + *(here->B3SOIDDVcscvPtr) += m * 1; + *(here->B3SOIDDQaccPtr) += m * 1; + *(here->B3SOIDDQsub0Ptr) += m * 1; + *(here->B3SOIDDQsubs1Ptr) += m * 1; + *(here->B3SOIDDQsubs2Ptr) += m * 1; + *(here->B3SOIDDqgPtr) += m * 1; + *(here->B3SOIDDqdPtr) += m * 1; + *(here->B3SOIDDqePtr) += m * 1; + *(here->B3SOIDDDum1Ptr) += m * 1; + *(here->B3SOIDDDum2Ptr) += m * 1; + *(here->B3SOIDDDum3Ptr) += m * 1; + *(here->B3SOIDDDum4Ptr) += m * 1; + *(here->B3SOIDDDum5Ptr) += m * 1; } if (here->B3SOIDDdebugMod > 2) diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddask.c b/src/spicelib/devices/bsim3soi_dd/b3soiddask.c index b3bd25047..512e7f42e 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddask.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddask.c @@ -2,13 +2,16 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soiask.c 98/5/01 +File: b3soiddask.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ #include "ngspice.h" -#include -#include #include "ifsim.h" #include "cktdefs.h" #include "devdefs.h" @@ -17,12 +20,8 @@ File: b3soiask.c 98/5/01 #include "suffix.h" int -B3SOIDDask(ckt,inst,which,value,select) -CKTcircuit *ckt; -GENinstance *inst; -int which; -IFvalue *value; -IFvalue *select; +B3SOIDDask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, + IFvalue *select) { B3SOIDDinstance *here = (B3SOIDDinstance*)inst; @@ -59,9 +58,11 @@ B3SOIDDinstance *here = (B3SOIDDinstance*)inst; return(OK); case B3SOIDD_RTH0: value->rValue = here->B3SOIDDrth0; + value->rValue /= here->B3SOIDDm; return(OK); case B3SOIDD_CTH0: value->rValue = here->B3SOIDDcth0; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_NRB: value->rValue = here->B3SOIDDbodySquares; @@ -104,9 +105,11 @@ B3SOIDDinstance *here = (B3SOIDDinstance*)inst; return(OK); case B3SOIDD_SOURCECONDUCT: value->rValue = here->B3SOIDDsourceConductance; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_DRAINCONDUCT: value->rValue = here->B3SOIDDdrainConductance; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_VBD: value->rValue = *(ckt->CKTstate0 + here->B3SOIDDvbd); @@ -125,75 +128,98 @@ B3SOIDDinstance *here = (B3SOIDDinstance*)inst; return(OK); case B3SOIDD_CD: value->rValue = here->B3SOIDDcd; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_CBS: value->rValue = here->B3SOIDDcjs; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_CBD: - value->rValue = here->B3SOIDDcjd; + value->rValue = here->B3SOIDDcjd; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_GM: value->rValue = here->B3SOIDDgm; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_GMID: value->rValue = here->B3SOIDDgm/here->B3SOIDDcd; return(OK); case B3SOIDD_GDS: value->rValue = here->B3SOIDDgds; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_GMBS: value->rValue = here->B3SOIDDgmbs; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_GBD: value->rValue = here->B3SOIDDgjdb; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_GBS: value->rValue = here->B3SOIDDgjsb; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_QB: value->rValue = *(ckt->CKTstate0 + here->B3SOIDDqb); + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_CQB: value->rValue = *(ckt->CKTstate0 + here->B3SOIDDcqb); + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_QG: value->rValue = *(ckt->CKTstate0 + here->B3SOIDDqg); + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_CQG: - value->rValue = *(ckt->CKTstate0 + here->B3SOIDDcqg); + value->rValue = *(ckt->CKTstate0 + here->B3SOIDDcqg); + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_QD: value->rValue = *(ckt->CKTstate0 + here->B3SOIDDqd); + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_CQD: value->rValue = *(ckt->CKTstate0 + here->B3SOIDDcqd); + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_CGG: - value->rValue = here->B3SOIDDcggb; + value->rValue = here->B3SOIDDcggb; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_CGD: value->rValue = here->B3SOIDDcgdb; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_CGS: value->rValue = here->B3SOIDDcgsb; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_CDG: value->rValue = here->B3SOIDDcdgb; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_CDD: value->rValue = here->B3SOIDDcddb; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_CDS: value->rValue = here->B3SOIDDcdsb; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_CBG: value->rValue = here->B3SOIDDcbgb; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_CBDB: value->rValue = here->B3SOIDDcbdb; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_CBSB: value->rValue = here->B3SOIDDcbsb; + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_VON: value->rValue = here->B3SOIDDvon; @@ -203,9 +229,11 @@ B3SOIDDinstance *here = (B3SOIDDinstance*)inst; return(OK); case B3SOIDD_QBS: value->rValue = *(ckt->CKTstate0 + here->B3SOIDDqbs); + value->rValue *= here->B3SOIDDm; return(OK); case B3SOIDD_QBD: value->rValue = *(ckt->CKTstate0 + here->B3SOIDDqbd); + value->rValue *= here->B3SOIDDm; return(OK); default: return(E_BADPARM); diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddcheck.c b/src/spicelib/devices/bsim3soi_dd/b3soiddcheck.c index 74c5b7099..260a591ea 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddcheck.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddcheck.c @@ -2,12 +2,15 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soiddcheck.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "b3soidddef.h" #include "trandefs.h" @@ -17,20 +20,18 @@ File: b3soiddcheck.c 98/5/01 #include "suffix.h" int -B3SOIDDcheckModel(model, here, ckt) -register B3SOIDDmodel *model; -register B3SOIDDinstance *here; -CKTcircuit *ckt; +B3SOIDDcheckModel(B3SOIDDmodel *model, B3SOIDDinstance *here, CKTcircuit *ckt) { struct b3soiddSizeDependParam *pParam; int Fatal_Flag = 0; FILE *fplog; - if ((fplog = fopen("b3soiddv1check.log", "w")) != NULL) + if ((fplog = fopen("b3soiddv2check.log", "w")) != NULL) { pParam = here->pParam; - fprintf(fplog, "B3SOIDDV3 Parameter Check\n"); + fprintf(fplog, "B3SOI(DD)V2.1 Parameter Check\n"); fprintf(fplog, "Model = %s\n", model->B3SOIDDmodName); - fprintf(fplog, "W = %g, L = %g\n", here->B3SOIDDw, here->B3SOIDDl); + fprintf(fplog, "W = %g, L = %g\n, M = %g\n", here->B3SOIDDw, + here->B3SOIDDl, here->B3SOIDDm); if (pParam->B3SOIDDnlx < -pParam->B3SOIDDleff) diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddcvtest.c b/src/spicelib/devices/bsim3soi_dd/b3soiddcvtest.c index 7fc6e818c..7bd8c8c26 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddcvtest.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddcvtest.c @@ -2,12 +2,15 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soiddcvtest.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "b3soidddef.h" #include "trandefs.h" @@ -18,12 +21,10 @@ File: b3soiddcvtest.c 98/5/01 int -B3SOIDDconvTest(inModel,ckt) -GENmodel *inModel; -register CKTcircuit *ckt; +B3SOIDDconvTest(GENmodel *inModel, CKTcircuit *ckt) { -register B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; -register B3SOIDDinstance *here; +B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; +B3SOIDDinstance *here; double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; @@ -32,7 +33,12 @@ double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; { /* loop through all the instances of the model */ for (here = model->B3SOIDDinstances; here != NULL ; here=here->B3SOIDDnextInstance) - { vbs = model->B3SOIDDtype + { + + if (here->B3SOIDDowner != ARCHme) + continue; + + vbs = model->B3SOIDDtype * (*(ckt->CKTrhsOld+here->B3SOIDDbNode) - *(ckt->CKTrhsOld+here->B3SOIDDsNodePrime)); vgs = model->B3SOIDDtype diff --git a/src/spicelib/devices/bsim3soi_dd/b3soidddef.h b/src/spicelib/devices/bsim3soi_dd/b3soidddef.h index 10f3d9362..f3eff5687 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soidddef.h +++ b/src/spicelib/devices/bsim3soi_dd/b3soidddef.h @@ -4,6 +4,7 @@ Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung Modified by Pin Su, Wei Jin 99/9/27 File: b3soidddef.h +Modified by Paolo Nenzi 2002 **********/ #ifndef B3SOIDD @@ -22,9 +23,10 @@ typedef struct sB3SOIDDinstance { struct sB3SOIDDmodel *B3SOIDDmodPtr; struct sB3SOIDDinstance *B3SOIDDnextInstance; - IFuid B3SOIDDname; - int B3SOIFDowner; + IFuid B3SOIDDname; + int B3SOIDDowner; /* number of owner process */ int B3SOIDDstates; /* index into state table for this device */ + int B3SOIDDdNode; int B3SOIDDgNode; int B3SOIDDsNode; @@ -128,6 +130,7 @@ typedef struct sB3SOIDDinstance double B3SOIDDl; double B3SOIDDw; + double B3SOIDDm; double B3SOIDDdrainArea; double B3SOIDDsourceArea; double B3SOIDDdrainSquares; @@ -211,7 +214,6 @@ typedef struct sB3SOIDDinstance double B3SOIDDcggb; double B3SOIDDcgdb; - double B3SOIDDcbs; /* XXX PN */ double B3SOIDDcgsb; double B3SOIDDcgeb; double B3SOIDDcgT; @@ -243,6 +245,7 @@ typedef struct sB3SOIDDinstance unsigned B3SOIDDlGiven :1; unsigned B3SOIDDwGiven :1; + unsigned B3SOIDDmGiven :1; unsigned B3SOIDDdrainAreaGiven :1; unsigned B3SOIDDsourceAreaGiven :1; unsigned B3SOIDDdrainSquaresGiven :1; @@ -1470,6 +1473,7 @@ typedef struct sB3SOIDDmodel /* device parameters */ #define B3SOIDD_W 1 #define B3SOIDD_L 2 +#define B3SOIDD_M 22 #define B3SOIDD_AS 3 #define B3SOIDD_AD 4 #define B3SOIDD_PS 5 @@ -1610,7 +1614,7 @@ typedef struct sB3SOIDDmodel #define B3SOIDD_MOD_BII 211 #define B3SOIDD_MOD_CII 212 #define B3SOIDD_MOD_DII 213 -#define B3SOIDD_MOD_ALPHA1 214 +#define B3SOIDD_MOD_ALPHA1 214 #define B3SOIDD_MOD_NGIDL 215 #define B3SOIDD_MOD_AGIDL 216 #define B3SOIDD_MOD_BGIDL 217 @@ -1974,18 +1978,12 @@ typedef struct sB3SOIDDmodel #include "b3soiddext.h" -#ifdef __STDC__ extern void B3SOIDDevaluate(double,double,double,B3SOIDDinstance*,B3SOIDDmodel*, double*,double*,double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, CKTcircuit*); extern int B3SOIDDdebug(B3SOIDDmodel*, B3SOIDDinstance*, CKTcircuit*, int); extern int B3SOIDDcheckModel(B3SOIDDmodel*, B3SOIDDinstance*, CKTcircuit*); -#else /* stdc */ -extern void B3SOIDDevaluate(); -extern int B3SOIDDdebug(); -extern int B3SOIDDcheckModel(); -#endif /* stdc */ #endif /*B3SOIDD*/ diff --git a/src/spicelib/devices/bsim3soi_dd/b3soidddel.c b/src/spicelib/devices/bsim3soi_dd/b3soidddel.c index d002acaf8..8e4a9f2b0 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soidddel.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soidddel.c @@ -2,11 +2,15 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soidddel.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ #include "ngspice.h" -#include #include "b3soidddef.h" #include "sperror.h" #include "gendefs.h" @@ -14,10 +18,7 @@ File: b3soidddel.c 98/5/01 int -B3SOIDDdelete(inModel,name,inInst) -GENmodel *inModel; -IFuid name; -GENinstance **inInst; +B3SOIDDdelete(GENmodel *inModel, IFuid name, GENinstance **inInst) { B3SOIDDinstance **fast = (B3SOIDDinstance**)inInst; B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; diff --git a/src/spicelib/devices/bsim3soi_dd/b3soidddest.c b/src/spicelib/devices/bsim3soi_dd/b3soidddest.c index 107d9107d..4914ab1e6 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soidddest.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soidddest.c @@ -2,17 +2,20 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soidddest.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ #include "ngspice.h" -#include #include "b3soidddef.h" #include "suffix.h" void -B3SOIDDdestroy(inModel) -GENmodel **inModel; +B3SOIDDdestroy(GENmodel **inModel) { B3SOIDDmodel **model = (B3SOIDDmodel**)inModel; B3SOIDDinstance *here; diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddext.h b/src/spicelib/devices/bsim3soi_dd/b3soiddext.h index 915515f73..1d5d90695 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddext.h +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddext.h @@ -2,10 +2,9 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung File: b3soiddext.h +Modifed by Paolo Nenzi 2002 **********/ - -#ifdef __STDC__ extern int B3SOIDDacLoad(GENmodel *,CKTcircuit*); extern int B3SOIDDask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); extern int B3SOIDDconvTest(GENmodel *,CKTcircuit*); @@ -29,26 +28,3 @@ extern int B3SOIDDtemp(GENmodel*,CKTcircuit*); extern int B3SOIDDtrunc(GENmodel*,CKTcircuit*,double*); extern int B3SOIDDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int B3SOIDDunsetup(GENmodel*,CKTcircuit*); - -#else /* stdc */ -extern int B3SOIDDacLoad(); -extern int B3SOIDDdelete(); -extern void B3SOIDDdestroy(); -extern int B3SOIDDgetic(); -extern int B3SOIDDload(); -extern int B3SOIDDmDelete(); -extern int B3SOIDDask(); -extern int B3SOIDDmAsk(); -extern int B3SOIDDconvTest(); -extern int B3SOIDDtemp(); -extern int B3SOIDDmParam(); -extern void B3SOIDDmosCap(); -extern int B3SOIDDparam(); -extern int B3SOIDDpzLoad(); -extern int B3SOIDDsetup(); -extern int B3SOIDDtrunc(); -extern int B3SOIDDnoise(); -extern int B3SOIDDunsetup(); - -#endif /* stdc */ - diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddgetic.c b/src/spicelib/devices/bsim3soi_dd/b3soiddgetic.c index d3b549910..f573b66c5 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddgetic.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddgetic.c @@ -2,11 +2,15 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soiddgetic.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ - +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ + #include "ngspice.h" -#include #include "cktdefs.h" #include "b3soidddef.h" #include "sperror.h" @@ -14,16 +18,19 @@ File: b3soiddgetic.c 98/5/01 int -B3SOIDDgetic(inModel,ckt) -GENmodel *inModel; -CKTcircuit *ckt; +B3SOIDDgetic(GENmodel *inModel, CKTcircuit *ckt) { B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; B3SOIDDinstance *here; for (; model ; model = model->B3SOIDDnextModel) { for (here = model->B3SOIDDinstances; here; here = here->B3SOIDDnextInstance) - { if(!here->B3SOIDDicVBSGiven) + { + + if (here->B3SOIDDowner != ARCHme) + continue; + + if(!here->B3SOIDDicVBSGiven) { here->B3SOIDDicVBS = *(ckt->CKTrhs + here->B3SOIDDbNode) - *(ckt->CKTrhs + here->B3SOIDDsNode); } diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c b/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c index e84560ab1..60bd119f2 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddinit.c @@ -8,7 +8,7 @@ SPICEdev B3SOIDDinfo = { { "B3SOIDD", - "Berkeley SOI MOSFET (DD) model version 1.0", + "Berkeley SOI MOSFET (DD) model version 2.1", &B3SOIDDnSize, &B3SOIDDnSize, @@ -19,7 +19,7 @@ SPICEdev B3SOIDDinfo = { &B3SOIDDmPTSize, B3SOIDDmPTable, - + #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 */ @@ -33,44 +33,48 @@ SPICEdev B3SOIDDinfo = { 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 +#endif + DEV_DEFAULT + + }, - DEV_DEFAULT} - , - -DEVparam: B3SOIDDparam, -DEVmodParam: B3SOIDDmParam, -DEVload: B3SOIDDload, -DEVsetup: B3SOIDDsetup, -DEVunsetup: B3SOIDDunsetup, -DEVpzSetup: B3SOIDDsetup, -DEVtemperature:B3SOIDDtemp, -DEVtrunc: B3SOIDDtrunc, -DEVfindBranch: NULL, -DEVacLoad: B3SOIDDacLoad, -DEVaccept: NULL, -DEVdestroy: B3SOIDDdestroy, -DEVmodDelete: B3SOIDDmDelete, -DEVdelete: B3SOIDDdelete, -DEVsetic: B3SOIDDgetic, -DEVask: B3SOIDDask, -DEVmodAsk: B3SOIDDmAsk, -DEVpzLoad: B3SOIDDpzLoad, -DEVconvTest: B3SOIDDconvTest, -DEVsenSetup: NULL, -DEVsenLoad: NULL, -DEVsenUpdate: NULL, -DEVsenAcLoad: NULL, -DEVsenPrint: NULL, -DEVsenTrunc: NULL, -DEVdisto: NULL, -DEVnoise: B3SOIDDnoise, -DEVinstSize: &B3SOIDDiSize, -DEVmodSize: &B3SOIDDmSize + DEVparam : B3SOIDDparam, + DEVmodParam : B3SOIDDmParam, + DEVload : B3SOIDDload, + DEVsetup : B3SOIDDsetup, + DEVunsetup : B3SOIDDunsetup, + DEVpzSetup : B3SOIDDsetup, + DEVtemperature: B3SOIDDtemp, + DEVtrunc : B3SOIDDtrunc, + DEVfindBranch : NULL, + DEVacLoad : B3SOIDDacLoad, + DEVaccept : NULL, + DEVdestroy : B3SOIDDdestroy, + DEVmodDelete : B3SOIDDmDelete, + DEVdelete : B3SOIDDdelete, + DEVsetic : B3SOIDDgetic, + DEVask : B3SOIDDask, + DEVmodAsk : B3SOIDDmAsk, + DEVpzLoad : B3SOIDDpzLoad, + DEVconvTest : B3SOIDDconvTest, + DEVsenSetup : NULL, + DEVsenLoad : NULL, + DEVsenUpdate : NULL, + DEVsenAcLoad : NULL, + DEVsenPrint : NULL, + DEVsenTrunc : NULL, + DEVdisto : NULL, + DEVnoise : B3SOIDDnoise, +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif + DEVinstSize : &B3SOIDDiSize, + DEVmodSize : &B3SOIDDmSize }; SPICEdev * -get_bsim3soidd_info (void) +get_b3soidd_info (void) { return &B3SOIDDinfo; } diff --git a/src/spicelib/devices/bsim3soi_dd/b3soidditf.h b/src/spicelib/devices/bsim3soi_dd/b3soidditf.h index cb7ee9faf..f2adf8593 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soidditf.h +++ b/src/spicelib/devices/bsim3soi_dd/b3soidditf.h @@ -9,6 +9,6 @@ File: b3soidditf.h #include "b3soiddext.h" -SPICEdev *get_bsim3soidd_info (void); +SPICEdev *get_b3soidd_info (void); #endif diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddld.c b/src/spicelib/devices/bsim3soi_dd/b3soiddld.c index f121e3abc..bfaa6fe42 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddld.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddld.c @@ -3,13 +3,16 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang Modified by Pin Su, Wei Jin 99/9/27 +Modified by Paolo Nenzi 2002 File: b3soiddld.c 98/5/01 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "b3soidddef.h" #include "trandefs.h" @@ -49,11 +52,8 @@ File: b3soiddld.c 98/5/01 */ double -B3SOIDDSmartVbs(New, Old, here, ckt, check) - double New, Old; - B3SOIDDinstance *here; - CKTcircuit *ckt; - int *check; +B3SOIDDSmartVbs(double New, double Old, B3SOIDDinstance *here, + CKTcircuit *ckt, int *check) { double T0, T1, del; @@ -72,11 +72,7 @@ B3SOIDDSmartVbs(New, Old, here, ckt, check) */ double -B3SOIDDlimit(vnew, vold, limit, check) - double vnew; - double vold; - double limit; - int *check; +B3SOIDDlimit(double vnew, double vold, double limit, int *check) { double T0, T1; @@ -102,13 +98,11 @@ B3SOIDDlimit(vnew, vold, limit, check) int -B3SOIDDload(inModel,ckt) -GENmodel *inModel; -register CKTcircuit *ckt; +B3SOIDDload(GENmodel *inModel, CKTcircuit *ckt) { -register B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; -register B3SOIDDinstance *here; -register int selfheat; +B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; +B3SOIDDinstance *here; +int selfheat; double SourceSatCurrent, DrainSatCurrent, Gmin; double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst; @@ -297,12 +291,18 @@ int nandetect; static int nanfound = 0; char nanmessage [12]; +double m; for (; model != NULL; model = model->B3SOIDDnextModel) { for (here = model->B3SOIDDinstances; here != NULL; here = here->B3SOIDDnextInstance) - { Check = 0; + { + + if (here->B3SOIDDowner != ARCHme) + continue; + + Check = 0; ByPass = 0; selfheat = (model->B3SOIDDshMod == 1) && (here->B3SOIDDrth0 != 0.0); pParam = here->pParam; @@ -339,7 +339,8 @@ for (; model != NULL; model = model->B3SOIDDnextModel) } if (here->B3SOIDDdebugMod > 0) { - fprintf(stderr,"DC op. point converge with %d iterations\n"); + fprintf(stderr,"DC op. point converge with %d iterations\n", + here->B3SOIDDiterations); } } else if ((ckt->CKTmode & MODEINITTRAN)) @@ -3877,6 +3878,8 @@ if (here->B3SOIDDdebugMod > 2) */ line900: + m = here->B3SOIDDm; + if (here->B3SOIDDmode >= 0) { Gm = here->B3SOIDDgm; Gmbs = here->B3SOIDDgmbs; @@ -4005,20 +4008,20 @@ if (here->B3SOIDDdebugMod > 2) ceqqe = -ceqqe; } - (*(ckt->CKTrhs + here->B3SOIDDbNode) -=(ceqbody+ceqqb)); + (*(ckt->CKTrhs + here->B3SOIDDbNode) -= m * (ceqbody+ceqqb)); - (*(ckt->CKTrhs + here->B3SOIDDgNode) -= ceqqg); - (*(ckt->CKTrhs + here->B3SOIDDdNodePrime) += (ceqbd - cdreq - ceqqd)); - (*(ckt->CKTrhs + here->B3SOIDDsNodePrime) += (cdreq + ceqbs + ceqqg - + ceqqb + ceqqd + ceqqe)); - (*(ckt->CKTrhs + here->B3SOIDDeNode) -= ceqqe); + (*(ckt->CKTrhs + here->B3SOIDDgNode) -= m * ceqqg); + (*(ckt->CKTrhs + here->B3SOIDDdNodePrime) += m * (ceqbd - cdreq - ceqqd)); + (*(ckt->CKTrhs + here->B3SOIDDsNodePrime) += m * ((cdreq + ceqbs + ceqqg + + ceqqb + ceqqd + ceqqe))); + (*(ckt->CKTrhs + here->B3SOIDDeNode) -= m * ceqqe); if (here->B3SOIDDbodyMod == 1) { - (*(ckt->CKTrhs + here->B3SOIDDpNode) += ceqbodcon); + (*(ckt->CKTrhs + here->B3SOIDDpNode) += m * ceqbodcon); } if (selfheat) { - (*(ckt->CKTrhs + here->B3SOIDDtempNode) -= ceqth + ceqqth); + (*(ckt->CKTrhs + here->B3SOIDDtempNode) -= m * (ceqth + ceqqth)); } @@ -4077,128 +4080,128 @@ if (here->B3SOIDDdebugMod > 2) /* * load y matrix */ - (*(here->B3SOIDDEgPtr) += gcegb); - (*(here->B3SOIDDEdpPtr) += gcedb); - (*(here->B3SOIDDEspPtr) += gcesb); - (*(here->B3SOIDDGePtr) += gcgeb); - (*(here->B3SOIDDDPePtr) += Gme + gddpe + gcdeb); - (*(here->B3SOIDDSPePtr) += gsspe - Gme + gcseb); + (*(here->B3SOIDDEgPtr) += m * gcegb); + (*(here->B3SOIDDEdpPtr) += m * gcedb); + (*(here->B3SOIDDEspPtr) += m * gcesb); + (*(here->B3SOIDDGePtr) += m * gcgeb); + (*(here->B3SOIDDDPePtr) += m * (Gme + gddpe + gcdeb)); + (*(here->B3SOIDDSPePtr) += m * (gsspe - Gme + gcseb)); Gmin = ckt->CKTgmin * 1e-6; - (*(here->B3SOIDDEbPtr) -= gcegb + gcedb + gcesb + gceeb); - (*(here->B3SOIDDGbPtr) -= gcggb + gcgdb + gcgsb + gcgeb); - (*(here->B3SOIDDDPbPtr) -= (-gddpb - Gmbs + gcdgb + gcddb + gcdeb + gcdsb)); - (*(here->B3SOIDDSPbPtr) -= (-gsspb + Gmbs + gcsgb + gcsdb + gcseb + gcssb)); - (*(here->B3SOIDDBePtr) += gbbe + gcbeb); - (*(here->B3SOIDDBgPtr) += gcbgb + gbbg); - (*(here->B3SOIDDBdpPtr) += gcbdb + gbbdp ); - (*(here->B3SOIDDBspPtr) += gcbsb + gbbsp - Gmin); - (*(here->B3SOIDDBbPtr) += gbbb - gcbgb - gcbdb - gcbsb - gcbeb + Gmin) ; + (*(here->B3SOIDDEbPtr) -= m * (gcegb + gcedb + gcesb + gceeb)); + (*(here->B3SOIDDGbPtr) -= m * (gcggb + gcgdb + gcgsb + gcgeb)); + (*(here->B3SOIDDDPbPtr) -= m * (-gddpb - Gmbs + gcdgb + gcddb + gcdeb + gcdsb)); + (*(here->B3SOIDDSPbPtr) -= m * (-gsspb + Gmbs + gcsgb + gcsdb + gcseb + gcssb)); + (*(here->B3SOIDDBePtr) += m * (gbbe + gcbeb)); + (*(here->B3SOIDDBgPtr) += m * (gcbgb + gbbg)); + (*(here->B3SOIDDBdpPtr) += m * (gcbdb + gbbdp)); + (*(here->B3SOIDDBspPtr) += m * (gcbsb + gbbsp - Gmin)); + (*(here->B3SOIDDBbPtr) += m * (gbbb - gcbgb - gcbdb - gcbsb - gcbeb + Gmin)) ; - (*(here->B3SOIDDEePtr) += gceeb); + (*(here->B3SOIDDEePtr) += m * gceeb); - (*(here->B3SOIDDGgPtr) += gcggb + ckt->CKTgmin); - (*(here->B3SOIDDGdpPtr) += gcgdb - ckt->CKTgmin); - (*(here->B3SOIDDGspPtr) += gcgsb ); + (*(here->B3SOIDDGgPtr) += m * (gcggb + ckt->CKTgmin)); + (*(here->B3SOIDDGdpPtr) += m * (gcgdb - ckt->CKTgmin)); + (*(here->B3SOIDDGspPtr) += m * gcgsb ); - (*(here->B3SOIDDDPgPtr) += (Gm + gcdgb) + gddpg - ckt->CKTgmin); - (*(here->B3SOIDDDPdpPtr) += (here->B3SOIDDdrainConductance + (*(here->B3SOIDDDPgPtr) += m * ((Gm + gcdgb) + gddpg - ckt->CKTgmin)); + (*(here->B3SOIDDDPdpPtr) += m * ((here->B3SOIDDdrainConductance + here->B3SOIDDgds + gddpdp - + RevSum + gcddb) + ckt->CKTgmin); - (*(here->B3SOIDDDPspPtr) -= (-gddpsp + here->B3SOIDDgds + FwdSum - gcdsb)); + + RevSum + gcddb) + ckt->CKTgmin)); + (*(here->B3SOIDDDPspPtr) -= m * (-gddpsp + here->B3SOIDDgds + FwdSum - gcdsb)); - (*(here->B3SOIDDDPdPtr) -= here->B3SOIDDdrainConductance); + (*(here->B3SOIDDDPdPtr) -= m * here->B3SOIDDdrainConductance); - (*(here->B3SOIDDSPgPtr) += gcsgb - Gm + gsspg ); - (*(here->B3SOIDDSPdpPtr) -= (here->B3SOIDDgds - gsspdp + RevSum - gcsdb)); - (*(here->B3SOIDDSPspPtr) += (here->B3SOIDDsourceConductance + (*(here->B3SOIDDSPgPtr) += m * (gcsgb - Gm + gsspg)); + (*(here->B3SOIDDSPdpPtr) -= m * (here->B3SOIDDgds - gsspdp + RevSum - gcsdb)); + (*(here->B3SOIDDSPspPtr) += m * (here->B3SOIDDsourceConductance + here->B3SOIDDgds + gsspsp + FwdSum + gcssb)); - (*(here->B3SOIDDSPsPtr) -= here->B3SOIDDsourceConductance); + (*(here->B3SOIDDSPsPtr) -= m * here->B3SOIDDsourceConductance); - (*(here->B3SOIDDDdPtr) += here->B3SOIDDdrainConductance); - (*(here->B3SOIDDDdpPtr) -= here->B3SOIDDdrainConductance); + (*(here->B3SOIDDDdPtr) += m * here->B3SOIDDdrainConductance); + (*(here->B3SOIDDDdpPtr) -= m * here->B3SOIDDdrainConductance); - (*(here->B3SOIDDSsPtr) += here->B3SOIDDsourceConductance); - (*(here->B3SOIDDSspPtr) -= here->B3SOIDDsourceConductance); + (*(here->B3SOIDDSsPtr) += m * here->B3SOIDDsourceConductance); + (*(here->B3SOIDDSspPtr) -= m * here->B3SOIDDsourceConductance); if (here->B3SOIDDbodyMod == 1) { - (*(here->B3SOIDDBpPtr) -= gppp); - (*(here->B3SOIDDPbPtr) += gppb); - (*(here->B3SOIDDPpPtr) += gppp); - (*(here->B3SOIDDPgPtr) += gppg); - (*(here->B3SOIDDPdpPtr) += gppdp); - (*(here->B3SOIDDPspPtr) += gppsp); - (*(here->B3SOIDDPePtr) += gppe); + (*(here->B3SOIDDBpPtr) -= m * gppp); + (*(here->B3SOIDDPbPtr) += m * gppb); + (*(here->B3SOIDDPpPtr) += m * gppp); + (*(here->B3SOIDDPgPtr) += m * gppg); + (*(here->B3SOIDDPdpPtr) += m * gppdp); + (*(here->B3SOIDDPspPtr) += m * gppsp); + (*(here->B3SOIDDPePtr) += m * gppe); } if (selfheat) { - (*(here->B3SOIDDDPtempPtr) += GmT + gddpT + gcdT); - (*(here->B3SOIDDSPtempPtr) += -GmT + gsspT + gcsT); - (*(here->B3SOIDDBtempPtr) += gbbT + gcbT); - (*(here->B3SOIDDEtempPtr) += gceT); - (*(here->B3SOIDDGtempPtr) += gcgT); + (*(here->B3SOIDDDPtempPtr) += m * (GmT + gddpT + gcdT)); + (*(here->B3SOIDDSPtempPtr) += m * (-GmT + gsspT + gcsT)); + (*(here->B3SOIDDBtempPtr) += m * (gbbT + gcbT)); + (*(here->B3SOIDDEtempPtr) += m * (gceT)); + (*(here->B3SOIDDGtempPtr) += m * (gcgT)); if (here->B3SOIDDbodyMod == 1) { - (*(here->B3SOIDDPtempPtr) += gppT); + (*(here->B3SOIDDPtempPtr) += m * gppT); } - (*(here->B3SOIDDTemptempPtr) += gTtt + 1/pParam->B3SOIDDrth + gcTt); - (*(here->B3SOIDDTempgPtr) += gTtg); - (*(here->B3SOIDDTempbPtr) += gTtb); - (*(here->B3SOIDDTempePtr) += gTte); - (*(here->B3SOIDDTempdpPtr) += gTtdp); - (*(here->B3SOIDDTempspPtr) += gTtsp); + (*(here->B3SOIDDTemptempPtr) += m * (gTtt + 1/pParam->B3SOIDDrth + gcTt)); + (*(here->B3SOIDDTempgPtr) += m * gTtg); + (*(here->B3SOIDDTempbPtr) += m * gTtb); + (*(here->B3SOIDDTempePtr) += m * gTte); + (*(here->B3SOIDDTempdpPtr) += m * gTtdp); + (*(here->B3SOIDDTempspPtr) += m * gTtsp); } if ((here->B3SOIDDdebugMod > 1) || (here->B3SOIDDdebugMod == -1)) { - *(here->B3SOIDDVbsPtr) += 1; - *(here->B3SOIDDIdsPtr) += 1; - *(here->B3SOIDDIcPtr) += 1; - *(here->B3SOIDDIbsPtr) += 1; - *(here->B3SOIDDIbdPtr) += 1; - *(here->B3SOIDDIiiPtr) += 1; - *(here->B3SOIDDIgidlPtr) += 1; - *(here->B3SOIDDItunPtr) += 1; - *(here->B3SOIDDIbpPtr) += 1; - *(here->B3SOIDDAbeffPtr) += 1; - *(here->B3SOIDDVbs0effPtr) += 1; - *(here->B3SOIDDVbseffPtr) += 1; - *(here->B3SOIDDXcPtr) += 1; - *(here->B3SOIDDCbgPtr) += 1; - *(here->B3SOIDDCbbPtr) += 1; - *(here->B3SOIDDCbdPtr) += 1; - *(here->B3SOIDDqbPtr) += 1; - *(here->B3SOIDDQbfPtr) += 1; - *(here->B3SOIDDQjsPtr) += 1; - *(here->B3SOIDDQjdPtr) += 1; + *(here->B3SOIDDVbsPtr) += m * 1; + *(here->B3SOIDDIdsPtr) += m * 1; + *(here->B3SOIDDIcPtr) += m * 1; + *(here->B3SOIDDIbsPtr) += m * 1; + *(here->B3SOIDDIbdPtr) += m * 1; + *(here->B3SOIDDIiiPtr) += m * 1; + *(here->B3SOIDDIgidlPtr) += m * 1; + *(here->B3SOIDDItunPtr) += m * 1; + *(here->B3SOIDDIbpPtr) += m * 1; + *(here->B3SOIDDAbeffPtr) += m * 1; + *(here->B3SOIDDVbs0effPtr) += m * 1; + *(here->B3SOIDDVbseffPtr) += m * 1; + *(here->B3SOIDDXcPtr) += m * 1; + *(here->B3SOIDDCbgPtr) += m * 1; + *(here->B3SOIDDCbbPtr) += m * 1; + *(here->B3SOIDDCbdPtr) += m * 1; + *(here->B3SOIDDqbPtr) += m * 1; + *(here->B3SOIDDQbfPtr) += m * 1; + *(here->B3SOIDDQjsPtr) += m * 1; + *(here->B3SOIDDQjdPtr) += m * 1; /* clean up last */ - *(here->B3SOIDDGmPtr) += 1; - *(here->B3SOIDDGmbsPtr) += 1; - *(here->B3SOIDDGdsPtr) += 1; - *(here->B3SOIDDGmePtr) += 1; - *(here->B3SOIDDVbs0teffPtr) += 1; - *(here->B3SOIDDVgsteffPtr) += 1; - *(here->B3SOIDDCbePtr) += 1; - *(here->B3SOIDDVthPtr) += 1; - *(here->B3SOIDDXcsatPtr) += 1; - *(here->B3SOIDDVdscvPtr) += 1; - *(here->B3SOIDDVcscvPtr) += 1; - *(here->B3SOIDDQaccPtr) += 1; - *(here->B3SOIDDQsub0Ptr) += 1; - *(here->B3SOIDDQsubs1Ptr) += 1; - *(here->B3SOIDDQsubs2Ptr) += 1; - *(here->B3SOIDDqgPtr) += 1; - *(here->B3SOIDDqdPtr) += 1; - *(here->B3SOIDDqePtr) += 1; - *(here->B3SOIDDDum1Ptr) += 1; - *(here->B3SOIDDDum2Ptr) += 1; - *(here->B3SOIDDDum3Ptr) += 1; - *(here->B3SOIDDDum4Ptr) += 1; - *(here->B3SOIDDDum5Ptr) += 1; + *(here->B3SOIDDGmPtr) += m * 1; + *(here->B3SOIDDGmbsPtr) += m * 1; + *(here->B3SOIDDGdsPtr) += m * 1; + *(here->B3SOIDDGmePtr) += m * 1; + *(here->B3SOIDDVbs0teffPtr) += m * 1; + *(here->B3SOIDDVgsteffPtr) += m * 1; + *(here->B3SOIDDCbePtr) += m * 1; + *(here->B3SOIDDVthPtr) += m * 1; + *(here->B3SOIDDXcsatPtr) += m * 1; + *(here->B3SOIDDVdscvPtr) += m * 1; + *(here->B3SOIDDVcscvPtr) += m * 1; + *(here->B3SOIDDQaccPtr) += m * 1; + *(here->B3SOIDDQsub0Ptr) += m * 1; + *(here->B3SOIDDQsubs1Ptr) += m * 1; + *(here->B3SOIDDQsubs2Ptr) += m * 1; + *(here->B3SOIDDqgPtr) += m * 1; + *(here->B3SOIDDqdPtr) += m * 1; + *(here->B3SOIDDqePtr) += m * 1; + *(here->B3SOIDDDum1Ptr) += m * 1; + *(here->B3SOIDDDum2Ptr) += m * 1; + *(here->B3SOIDDDum3Ptr) += m * 1; + *(here->B3SOIDDDum4Ptr) += m * 1; + *(here->B3SOIDDDum5Ptr) += m * 1; /* end clean up last */ } diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddmask.c b/src/spicelib/devices/bsim3soi_dd/b3soiddmask.c index 840895396..33c55f4f2 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddmask.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddmask.c @@ -4,11 +4,11 @@ Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang Modified by Wei Jin 99/9/27 File: b3soiddmask.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ #include "ngspice.h" -#include #include "ifsim.h" #include "cktdefs.h" #include "devdefs.h" @@ -17,11 +17,7 @@ File: b3soiddmask.c 98/5/01 #include "suffix.h" int -B3SOIDDmAsk(ckt,inst,which,value) -CKTcircuit *ckt; -GENmodel *inst; -int which; -IFvalue *value; +B3SOIDDmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) { B3SOIDDmodel *model = (B3SOIDDmodel *)inst; switch(which) diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddmdel.c b/src/spicelib/devices/bsim3soi_dd/b3soiddmdel.c index 7cd06dbe6..43aafab45 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddmdel.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddmdel.c @@ -3,20 +3,21 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soiddmdel.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ #include "ngspice.h" -#include #include "b3soidddef.h" #include "sperror.h" #include "suffix.h" int -B3SOIDDmDelete(inModel,modname,kill) -GENmodel **inModel; -IFuid modname; -GENmodel *kill; +B3SOIDDmDelete(GENmodel **inModel, IFuid modname, GENmodel *kill) { B3SOIDDmodel **model = (B3SOIDDmodel**)inModel; B3SOIDDmodel *modfast = (B3SOIDDmodel*)kill; diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddmpar.c b/src/spicelib/devices/bsim3soi_dd/b3soiddmpar.c index 85f4b6797..5e3be16d0 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddmpar.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddmpar.c @@ -4,11 +4,15 @@ Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang Modified by Wei Jin 99/9/27 File: b3soiddmpar.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ #include "ngspice.h" -#include #include "b3soidddef.h" #include "ifsim.h" #include "sperror.h" @@ -16,10 +20,7 @@ File: b3soiddmpar.c 98/5/01 int -B3SOIDDmParam(param,value,inMod) -int param; -IFvalue *value; -GENmodel *inMod; +B3SOIDDmParam(int param, IFvalue *value, GENmodel *inMod) { B3SOIDDmodel *mod = (B3SOIDDmodel*)inMod; switch(param) diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddnoi.c b/src/spicelib/devices/bsim3soi_dd/b3soiddnoi.c index 6e4826bb1..5d4924d7b 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddnoi.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddnoi.c @@ -3,11 +3,15 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soiddnoi.c 98/5/01 +Modofied by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ + #include "ngspice.h" -#include -#include #include "b3soidddef.h" #include "cktdefs.h" #include "iferrmsg.h" @@ -45,10 +49,9 @@ extern void NevalSrc(); extern double Nintegrate(); double -B3SOIDDStrongInversionNoiseEval(vgs, vds, model, here, freq, temp) -double vgs, vds, freq, temp; -B3SOIDDmodel *model; -B3SOIDDinstance *here; +B3SOIDDStrongInversionNoiseEval(double vgs, double vds, B3SOIDDmodel *model, + B3SOIDDinstance *here, double freq, + double temp) { struct b3soiddSizeDependParam *pParam; double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; @@ -56,7 +59,7 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi; double req, ceq; pParam = here->pParam; - cd = fabs(here->B3SOIDDcd); + cd = fabs(here->B3SOIDDcd) * here->B3SOIDDm; if (vds > here->B3SOIDDvdsat) { esat = 2.0 * pParam->B3SOIDDvsattemp / here->B3SOIDDueff; T0 = ((((vds - here->B3SOIDDvdsat) / pParam->B3SOIDDlitl) + model->B3SOIDDem) @@ -84,7 +87,7 @@ double req, ceq; T6 = 8.62e-5 * temp * cd * cd; T7 = 1.0e8 * EffFreq * pParam->B3SOIDDleff - * pParam->B3SOIDDleff * pParam->B3SOIDDweff; + * pParam->B3SOIDDleff * pParam->B3SOIDDweff * here->B3SOIDDm; T8 = model->B3SOIDDoxideTrapDensityA + model->B3SOIDDoxideTrapDensityB * Nl + model->B3SOIDDoxideTrapDensityC * Nl * Nl; T9 = (Nl + 2.0e14) * (Nl + 2.0e14); @@ -95,15 +98,11 @@ double req, ceq; } int -B3SOIDDnoise (mode, operation, inModel, ckt, data, OnDens) -int mode, operation; -GENmodel *inModel; -CKTcircuit *ckt; -register Ndata *data; -double *OnDens; +B3SOIDDnoise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt, + Ndata *data, double *OnDens) { -register B3SOIDDmodel *model = (B3SOIDDmodel *)inModel; -register B3SOIDDinstance *here; +B3SOIDDmodel *model = (B3SOIDDmodel *)inModel; +B3SOIDDinstance *here; struct b3soiddSizeDependParam *pParam; char name[N_MXVLNTH]; double tempOnoise; @@ -134,7 +133,12 @@ int error, i; for (; model != NULL; model = model->B3SOIDDnextModel) { for (here = model->B3SOIDDinstances; here != NULL; here = here->B3SOIDDnextInstance) - { pParam = here->pParam; + { + + if (here->B3SOIDDowner != ARCHme) + continue; + + pParam = here->pParam; switch (operation) { case N_OPEN: /* see if we have to to produce a summary report */ @@ -202,12 +206,12 @@ int error, i; NevalSrc(&noizDens[B3SOIDDRDNOIZ], &lnNdens[B3SOIDDRDNOIZ], ckt, THERMNOISE, here->B3SOIDDdNodePrime, here->B3SOIDDdNode, - here->B3SOIDDdrainConductance); + here->B3SOIDDdrainConductance * here->B3SOIDDm); NevalSrc(&noizDens[B3SOIDDRSNOIZ], &lnNdens[B3SOIDDRSNOIZ], ckt, THERMNOISE, here->B3SOIDDsNodePrime, here->B3SOIDDsNode, - here->B3SOIDDsourceConductance); + here->B3SOIDDsourceConductance * here->B3SOIDDm); switch( model->B3SOIDDnoiMod ) { case 1: @@ -216,9 +220,9 @@ int error, i; &lnNdens[B3SOIDDIDNOIZ], ckt, THERMNOISE, here->B3SOIDDdNodePrime, here->B3SOIDDsNodePrime, - (2.0 / 3.0 * fabs(here->B3SOIDDgm + (2.0 / 3.0 * fabs(here->B3SOIDDm * (here->B3SOIDDgm + here->B3SOIDDgds - + here->B3SOIDDgmbs))); + + here->B3SOIDDgmbs)))); break; case 2: case 4: @@ -227,7 +231,7 @@ int error, i; THERMNOISE, here->B3SOIDDdNodePrime, here->B3SOIDDsNodePrime, (here->B3SOIDDueff - * fabs(here->B3SOIDDqinv + * fabs((here->B3SOIDDqinv * here->B3SOIDDm) / (pParam->B3SOIDDleff * pParam->B3SOIDDleff)))); break; @@ -241,7 +245,7 @@ int error, i; case 4: noizDens[B3SOIDDFLNOIZ] *= model->B3SOIDDkf * exp(model->B3SOIDDaf - * log(MAX(fabs(here->B3SOIDDcd), + * log(MAX(fabs(here->B3SOIDDcd * here->B3SOIDDm), N_MINLOG))) / (pow(data->freq, model->B3SOIDDef) * pParam->B3SOIDDleff @@ -266,12 +270,12 @@ int error, i; { pParam = here->pParam; T10 = model->B3SOIDDoxideTrapDensityA * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->B3SOIDDweff + T11 = pParam->B3SOIDDweff * here->B3SOIDDm * pParam->B3SOIDDleff * pow(data->freq, model->B3SOIDDef) * 4.0e36; - Swi = T10 / T11 * here->B3SOIDDcd - * here->B3SOIDDcd; + Swi = T10 / T11 * here->B3SOIDDcd * here->B3SOIDDm + * here->B3SOIDDcd * here->B3SOIDDm; Slimit = B3SOIDDStrongInversionNoiseEval( here->B3SOIDDvon + 0.1, vds, model, here, data->freq, ckt->CKTtemp); @@ -292,7 +296,8 @@ int error, i; NevalSrc(&noizDens[B3SOIDDFBNOIZ], &lnNdens[B3SOIDDFBNOIZ], ckt, SHOTNOISE, here->B3SOIDDsNodePrime, here->B3SOIDDbNode, - 2.0 * model->B3SOIDDnoif * here->B3SOIDDibs); + 2.0 * model->B3SOIDDnoif * here->B3SOIDDibs * + here->B3SOIDDm); noizDens[B3SOIDDTOTNOIZ] = noizDens[B3SOIDDRDNOIZ] + noizDens[B3SOIDDRSNOIZ] diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddpar.c b/src/spicelib/devices/bsim3soi_dd/b3soiddpar.c index cf514fca5..2d9b9706b 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddpar.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddpar.c @@ -2,22 +2,22 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soiddpar.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ #include "ngspice.h" -#include #include "ifsim.h" #include "b3soidddef.h" #include "sperror.h" #include "suffix.h" int -B3SOIDDparam(param,value,inst,select) -int param; -IFvalue *value; -GENinstance *inst; -IFvalue *select; +B3SOIDDparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) { B3SOIDDinstance *here = (B3SOIDDinstance*)inst; switch(param) @@ -29,6 +29,10 @@ IFvalue *select; here->B3SOIDDl = value->rValue; here->B3SOIDDlGiven = TRUE; break; + case B3SOIDD_M: + here->B3SOIDDm = value->rValue; + here->B3SOIDDmGiven = TRUE; + break; case B3SOIDD_AS: here->B3SOIDDsourceArea = value->rValue; here->B3SOIDDsourceAreaGiven = TRUE; diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddpzld.c b/src/spicelib/devices/bsim3soi_dd/b3soiddpzld.c index a545828ed..49cfd40d3 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddpzld.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddpzld.c @@ -3,11 +3,15 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soiddpzld.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ #include "ngspice.h" -#include #include "cktdefs.h" #include "complex.h" #include "sperror.h" @@ -15,23 +19,26 @@ File: b3soiddpzld.c 98/5/01 #include "suffix.h" int -B3SOIDDpzLoad(inModel,ckt,s) -GENmodel *inModel; -register CKTcircuit *ckt; -register SPcomplex *s; +B3SOIDDpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) { -register B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; -register B3SOIDDinstance *here; +B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; +B3SOIDDinstance *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; double GSoverlapCap, GDoverlapCap, GBoverlapCap; double FwdSum, RevSum, Gm, Gmbs; +double m; + for (; model != NULL; model = model->B3SOIDDnextModel) { for (here = model->B3SOIDDinstances; here!= NULL; here = here->B3SOIDDnextInstance) { + + if (here->B3SOIDDowner != ARCHme) + continue; + if (here->B3SOIDDmode >= 0) { Gm = here->B3SOIDDgm; Gmbs = here->B3SOIDDgmbs; @@ -94,56 +101,57 @@ double FwdSum, RevSum, Gm, Gmbs; xcbdb = (cbdb - capbd); xcbsb = (cbsb - capbs); + m = here->B3SOIDDm; - *(here->B3SOIDDGgPtr ) += xcggb * s->real; - *(here->B3SOIDDGgPtr +1) += xcggb * s->imag; - *(here->B3SOIDDBbPtr ) += (-xcbgb-xcbdb-xcbsb) * s->real; - *(here->B3SOIDDBbPtr +1) += (-xcbgb-xcbdb-xcbsb) * s->imag; - *(here->B3SOIDDDPdpPtr ) += xcddb * s->real; - *(here->B3SOIDDDPdpPtr +1) += xcddb * s->imag; - *(here->B3SOIDDSPspPtr ) += xcssb * s->real; - *(here->B3SOIDDSPspPtr +1) += xcssb * s->imag; - *(here->B3SOIDDGbPtr ) += (-xcggb-xcgdb-xcgsb) * s->real; - *(here->B3SOIDDGbPtr +1) += (-xcggb-xcgdb-xcgsb) * s->imag; - *(here->B3SOIDDGdpPtr ) += xcgdb * s->real; - *(here->B3SOIDDGdpPtr +1) += xcgdb * s->imag; - *(here->B3SOIDDGspPtr ) += xcgsb * s->real; - *(here->B3SOIDDGspPtr +1) += xcgsb * s->imag; - *(here->B3SOIDDBgPtr ) += xcbgb * s->real; - *(here->B3SOIDDBgPtr +1) += xcbgb * s->imag; - *(here->B3SOIDDBdpPtr ) += xcbdb * s->real; - *(here->B3SOIDDBdpPtr +1) += xcbdb * s->imag; - *(here->B3SOIDDBspPtr ) += xcbsb * s->real; - *(here->B3SOIDDBspPtr +1) += xcbsb * s->imag; - *(here->B3SOIDDDPgPtr ) += xcdgb * s->real; - *(here->B3SOIDDDPgPtr +1) += xcdgb * s->imag; - *(here->B3SOIDDDPbPtr ) += (-xcdgb-xcddb-xcdsb) * s->real; - *(here->B3SOIDDDPbPtr +1) += (-xcdgb-xcddb-xcdsb) * s->imag; - *(here->B3SOIDDDPspPtr ) += xcdsb * s->real; - *(here->B3SOIDDDPspPtr +1) += xcdsb * s->imag; - *(here->B3SOIDDSPgPtr ) += xcsgb * s->real; - *(here->B3SOIDDSPgPtr +1) += xcsgb * s->imag; - *(here->B3SOIDDSPbPtr ) += (-xcsgb-xcsdb-xcssb) * s->real; - *(here->B3SOIDDSPbPtr +1) += (-xcsgb-xcsdb-xcssb) * s->imag; - *(here->B3SOIDDSPdpPtr ) += xcsdb * s->real; - *(here->B3SOIDDSPdpPtr +1) += xcsdb * s->imag; - *(here->B3SOIDDDdPtr) += gdpr; - *(here->B3SOIDDSsPtr) += gspr; - *(here->B3SOIDDBbPtr) += gbd+gbs; - *(here->B3SOIDDDPdpPtr) += gdpr+gds+gbd+RevSum; - *(here->B3SOIDDSPspPtr) += gspr+gds+gbs+FwdSum; - *(here->B3SOIDDDdpPtr) -= gdpr; - *(here->B3SOIDDSspPtr) -= gspr; - *(here->B3SOIDDBdpPtr) -= gbd; - *(here->B3SOIDDBspPtr) -= gbs; - *(here->B3SOIDDDPdPtr) -= gdpr; - *(here->B3SOIDDDPgPtr) += Gm; - *(here->B3SOIDDDPbPtr) -= gbd - Gmbs; - *(here->B3SOIDDDPspPtr) -= gds + FwdSum; - *(here->B3SOIDDSPgPtr) -= Gm; - *(here->B3SOIDDSPsPtr) -= gspr; - *(here->B3SOIDDSPbPtr) -= gbs + Gmbs; - *(here->B3SOIDDSPdpPtr) -= gds + RevSum; + *(here->B3SOIDDGgPtr ) += m * (xcggb * s->real); + *(here->B3SOIDDGgPtr +1) += m * (xcggb * s->imag); + *(here->B3SOIDDBbPtr ) += m * ((-xcbgb-xcbdb-xcbsb) * s->real); + *(here->B3SOIDDBbPtr +1) += m * ((-xcbgb-xcbdb-xcbsb) * s->imag); + *(here->B3SOIDDDPdpPtr ) += m * (xcddb * s->real); + *(here->B3SOIDDDPdpPtr +1) += m * (xcddb * s->imag); + *(here->B3SOIDDSPspPtr ) += m * (xcssb * s->real); + *(here->B3SOIDDSPspPtr +1) += m * (xcssb * s->imag); + *(here->B3SOIDDGbPtr ) += m * ((-xcggb-xcgdb-xcgsb) * s->real); + *(here->B3SOIDDGbPtr +1) += m * ((-xcggb-xcgdb-xcgsb) * s->imag); + *(here->B3SOIDDGdpPtr ) += m * (xcgdb * s->real); + *(here->B3SOIDDGdpPtr +1) += m * (xcgdb * s->imag); + *(here->B3SOIDDGspPtr ) += m * (xcgsb * s->real); + *(here->B3SOIDDGspPtr +1) += m * (xcgsb * s->imag); + *(here->B3SOIDDBgPtr ) += m * (xcbgb * s->real); + *(here->B3SOIDDBgPtr +1) += m * (xcbgb * s->imag); + *(here->B3SOIDDBdpPtr ) += m * (xcbdb * s->real); + *(here->B3SOIDDBdpPtr +1) += m * (xcbdb * s->imag); + *(here->B3SOIDDBspPtr ) += m * (xcbsb * s->real); + *(here->B3SOIDDBspPtr +1) += (xcbsb * s->imag); + *(here->B3SOIDDDPgPtr ) += m * (xcdgb * s->real); + *(here->B3SOIDDDPgPtr +1) += m * (xcdgb * s->imag); + *(here->B3SOIDDDPbPtr ) += m * ((-xcdgb-xcddb-xcdsb) * s->real); + *(here->B3SOIDDDPbPtr +1) += m * ((-xcdgb-xcddb-xcdsb) * s->imag); + *(here->B3SOIDDDPspPtr ) += m * (xcdsb * s->real); + *(here->B3SOIDDDPspPtr +1) += m * (xcdsb * s->imag); + *(here->B3SOIDDSPgPtr ) += m * (xcsgb * s->real); + *(here->B3SOIDDSPgPtr +1) += m * (xcsgb * s->imag); + *(here->B3SOIDDSPbPtr ) += m * ((-xcsgb-xcsdb-xcssb) * s->real); + *(here->B3SOIDDSPbPtr +1) += m * ((-xcsgb-xcsdb-xcssb) * s->imag); + *(here->B3SOIDDSPdpPtr ) += m * (xcsdb * s->real); + *(here->B3SOIDDSPdpPtr +1) += m * (xcsdb * s->imag); + *(here->B3SOIDDDdPtr) += m * gdpr; + *(here->B3SOIDDSsPtr) += m * gspr; + *(here->B3SOIDDBbPtr) += m * (gbd + gbs); + *(here->B3SOIDDDPdpPtr) += m * (gdpr + gds + gbd + RevSum); + *(here->B3SOIDDSPspPtr) += m * (gspr + gds + gbs + FwdSum); + *(here->B3SOIDDDdpPtr) -= m * gdpr; + *(here->B3SOIDDSspPtr) -= m * gspr; + *(here->B3SOIDDBdpPtr) -= m * gbd; + *(here->B3SOIDDBspPtr) -= m * gbs; + *(here->B3SOIDDDPdPtr) -= m * gdpr; + *(here->B3SOIDDDPgPtr) += m * Gm; + *(here->B3SOIDDDPbPtr) -= m * (gbd - Gmbs); + *(here->B3SOIDDDPspPtr) -= m * (gds + FwdSum); + *(here->B3SOIDDSPgPtr) -= m * Gm; + *(here->B3SOIDDSPsPtr) -= m * gspr; + *(here->B3SOIDDSPbPtr) -= m * (gbs + Gmbs); + *(here->B3SOIDDSPdpPtr) -= m * (gds + RevSum); } } diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddset.c b/src/spicelib/devices/bsim3soi_dd/b3soiddset.c index 5e032490d..727f603f5 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddset.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddset.c @@ -4,12 +4,15 @@ Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang Modified by Pin Su, Wei Jin 99/9/27 File: b3soiddset.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ #include "ngspice.h" -#include -#include #include "smpdefs.h" #include "cktdefs.h" #include "b3soidddef.h" @@ -28,14 +31,11 @@ File: b3soiddset.c 98/5/01 #define Meter2Micron 1.0e6 int -B3SOIDDsetup(matrix,inModel,ckt,states) -register SMPmatrix *matrix; -register GENmodel *inModel; -register CKTcircuit *ckt; -int *states; +B3SOIDDsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, + int *states) { -register B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; -register B3SOIDDinstance *here; +B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; +B3SOIDDinstance *here; int error; CKTnode *tmp; @@ -43,6 +43,10 @@ double tmp1, tmp2; double nfb0, Cboxt; int itmp1; +CKTnode *tmpNode; +IFuid tmpName; + + /* loop through all the B3SOIDD device models */ for( ; model != NULL; model = model->B3SOIDDnextModel ) { @@ -873,10 +877,16 @@ int itmp1; /* loop through all the instances of the model */ for (here = model->B3SOIDDinstances; here != NULL ; here=here->B3SOIDDnextInstance) - { /* allocate a chunk of the state vector */ - here->B3SOIDDstates = *states; - *states += B3SOIDDnumStates; - /* perform the parameter defaulting */ + { + + if (here->B3SOIDDowner == ARCHme) + { + /* allocate a chunk of the state vector */ + here->B3SOIDDstates = *states; + *states += B3SOIDDnumStates; + } + + /* perform the parameter defaulting */ if (!here->B3SOIDDdrainAreaGiven) here->B3SOIDDdrainArea = 0.0; if (!here->B3SOIDDdrainPerimeterGiven) @@ -913,7 +923,11 @@ int itmp1; here->B3SOIDDsourceSquares = 1; if (!here->B3SOIDDwGiven) here->B3SOIDDw = 5e-6; - if (!here->B3SOIDDoffGiven) + + if (!here->B3SOIDDmGiven) + here->B3SOIDDm = 1; + + if (!here->B3SOIDDoffGiven) here->B3SOIDDoff = 0; /* process drain series resistance */ @@ -923,6 +937,15 @@ int itmp1; { error = CKTmkVolt(ckt,&tmp,here->B3SOIDDname,"drain"); if(error) return(error); here->B3SOIDDdNodePrime = tmp->number; + if (ckt->CKTcopyNodesets) { + if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } + } + } else { here->B3SOIDDdNodePrime = here->B3SOIDDdNode; @@ -935,6 +958,16 @@ int itmp1; { error = CKTmkVolt(ckt,&tmp,here->B3SOIDDname,"source"); if(error) return(error); here->B3SOIDDsNodePrime = tmp->number; + + if (ckt->CKTcopyNodesets) { + if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } + } + } else { here->B3SOIDDsNodePrime = here->B3SOIDDsNode; @@ -1319,11 +1352,8 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ } int -B3SOIDDunsetup(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +B3SOIDDunsetup(GENmodel *inModel, CKTcircuit *ckt) { -#ifndef HAS_BATCHSIM B3SOIDDmodel *model; B3SOIDDinstance *here; @@ -1347,7 +1377,6 @@ B3SOIDDunsetup(inModel,ckt) } } } -#endif return OK; } diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddtemp.c b/src/spicelib/devices/bsim3soi_dd/b3soiddtemp.c index c197af59d..17c465a64 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddtemp.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddtemp.c @@ -4,13 +4,17 @@ Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang Modified by Pin Su, Wei Jin 99/9/27 File: b3soiddtemp.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ + /* Lmin, Lmax, Wmin, Wmax */ #include "ngspice.h" -#include -#include #include "smpdefs.h" #include "cktdefs.h" #include "b3soidddef.h" @@ -31,12 +35,10 @@ File: b3soiddtemp.c 98/5/01 /* ARGSUSED */ int -B3SOIDDtemp(inModel,ckt) -GENmodel *inModel; -CKTcircuit *ckt; +B3SOIDDtemp(GENmodel *inModel, CKTcircuit *ckt) { -register B3SOIDDmodel *model = (B3SOIDDmodel*) inModel; -register B3SOIDDinstance *here; +B3SOIDDmodel *model = (B3SOIDDmodel*) inModel; +B3SOIDDinstance *here; struct b3soiddSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam; double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6, Ldrn, Wdrn; double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, Tnom; @@ -73,7 +75,11 @@ int Size_Not_Found; for (here = model->B3SOIDDinstances; here != NULL; here = here->B3SOIDDnextInstance) { - here->B3SOIDDrbodyext = here->B3SOIDDbodySquares * + + if (here->B3SOIDDowner != ARCHme) + continue; + + here->B3SOIDDrbodyext = here->B3SOIDDbodySquares * model->B3SOIDDrbsh; pSizeDependParamKnot = model->pSizeDependParamKnot; Size_Not_Found = 1; @@ -92,7 +98,7 @@ int Size_Not_Found; } if (Size_Not_Found) - { pParam = (struct b3soiddSizeDependParam *)malloc( + { pParam = (struct b3soiddSizeDependParam *)tmalloc( sizeof(struct b3soiddSizeDependParam)); if (pLastKnot == NULL) model->pSizeDependParamKnot = pParam; @@ -529,7 +535,7 @@ int Size_Not_Found; T0 = (TRatio - 1.0); - pParam->B3SOIDDuatemp = pParam->B3SOIDDua; /* save ua, ub, and uc for b3soild.c */ + pParam->B3SOIDDuatemp = pParam->B3SOIDDua; /* save ua, ub, and uc for b3soiddld.c */ pParam->B3SOIDDubtemp = pParam->B3SOIDDub; pParam->B3SOIDDuctemp = pParam->B3SOIDDuc; pParam->B3SOIDDrds0denom = pow(pParam->B3SOIDDweff * 1E6, pParam->B3SOIDDwr); diff --git a/src/spicelib/devices/bsim3soi_dd/b3soiddtrunc.c b/src/spicelib/devices/bsim3soi_dd/b3soiddtrunc.c index 916cdedf5..4b536d364 100644 --- a/src/spicelib/devices/bsim3soi_dd/b3soiddtrunc.c +++ b/src/spicelib/devices/bsim3soi_dd/b3soiddtrunc.c @@ -2,12 +2,15 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soiddtrunc.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMDD2.1 release + */ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "b3soidddef.h" #include "sperror.h" @@ -15,13 +18,10 @@ File: b3soiddtrunc.c 98/5/01 int -B3SOIDDtrunc(inModel,ckt,timeStep) -GENmodel *inModel; -register CKTcircuit *ckt; -double *timeStep; +B3SOIDDtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) { -register B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; -register B3SOIDDinstance *here; +B3SOIDDmodel *model = (B3SOIDDmodel*)inModel; +B3SOIDDinstance *here; #ifdef STEPDEBUG double debugtemp; @@ -31,6 +31,9 @@ register B3SOIDDinstance *here; { for (here = model->B3SOIDDinstances; here != NULL; here = here->B3SOIDDnextInstance) { + if (here->B3SOIDDowner != ARCHme) + continue; + #ifdef STEPDEBUG debugtemp = *timeStep; #endif /* STEPDEBUG */ diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifd.c b/src/spicelib/devices/bsim3soi_fd/b3soifd.c index f8af18ce3..faeb81110 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifd.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifd.c @@ -3,12 +3,16 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang Modified by Wei Jin 99/9/27 +Modified by Paolo Nenzi 2002 File: b3soifd.c 98/5/01 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ #include "ngspice.h" -#include #include "devdefs.h" #include "b3soifddef.h" #include "suffix.h" @@ -16,6 +20,7 @@ File: b3soifd.c 98/5/01 IFparm B3SOIFDpTable[] = { /* parameters */ IOP( "l", B3SOIFD_L, IF_REAL , "Length"), IOP( "w", B3SOIFD_W, IF_REAL , "Width"), +IOP( "m", B3SOIFD_M, IF_REAL , "Parallel Multiplier"), IOP( "ad", B3SOIFD_AD, IF_REAL , "Drain area"), IOP( "as", B3SOIFD_AS, IF_REAL , "Source area"), IOP( "pd", B3SOIFD_PD, IF_REAL , "Drain perimeter"), diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdacld.c b/src/spicelib/devices/bsim3soi_fd/b3soifdacld.c index 789353247..173064860 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdacld.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdacld.c @@ -3,11 +3,16 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang Modified by Pin Su 99/9/27 +Modified by Paolo Nenzi 2002 File: b3soifdacld.c 98/5/01 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ + #include "ngspice.h" -#include #include "cktdefs.h" #include "b3soifddef.h" #include "sperror.h" @@ -15,13 +20,11 @@ File: b3soifdacld.c 98/5/01 int -B3SOIFDacLoad(inModel,ckt) -GENmodel *inModel; - CKTcircuit *ckt; +B3SOIFDacLoad(GENmodel *inModel, CKTcircuit *ckt) { - B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; - B3SOIFDinstance *here; - int selfheat; +B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; +B3SOIFDinstance *here; +int selfheat; double xcggb, xcgdb, xcgsb, xcgeb, xcgT; double xcdgb, xcddb, xcdsb, xcdeb, xcdT; double xcsgb, xcsdb, xcssb, xcseb, xcsT; @@ -44,6 +47,8 @@ double xcTt, cTt, gcTt, gTtt, gTtg, gTtb, gTte, gTtdp, gTtsp; double Dum1, Dum2, Dum3, Dum4, Dum5; FILE *fpdebug; +double m; + omega = ckt->CKTomega; for (; model != NULL; model = model->B3SOIFDnextModel) { @@ -51,7 +56,11 @@ FILE *fpdebug; for (here = model->B3SOIFDinstances; here!= NULL; here = here->B3SOIFDnextInstance) { - selfheat = (model->B3SOIFDshMod == 1) && (here->B3SOIFDrth0 != 0.0); + + if (here->B3SOIFDowner != ARCHme) + continue; + + selfheat = (model->B3SOIFDshMod == 1) && (here->B3SOIFDrth0 != 0.0); if (here->B3SOIFDdebugMod > 2) { fpdebug = fopen("b3soifdac.log", "a"); @@ -261,35 +270,37 @@ FILE *fpdebug; xcTt = cTt * omega; - *(here->B3SOIFDEgPtr +1) += xcegb; - *(here->B3SOIFDEdpPtr +1) += xcedb; - *(here->B3SOIFDEspPtr +1) += xcesb; - *(here->B3SOIFDGePtr +1) += xcgeb; - *(here->B3SOIFDDPePtr +1) += xcdeb; - *(here->B3SOIFDSPePtr +1) += xcseb; + m = here->B3SOIFDm; + + *(here->B3SOIFDEgPtr +1) += m * xcegb; + *(here->B3SOIFDEdpPtr +1) += m * xcedb; + *(here->B3SOIFDEspPtr +1) += m * xcesb; + *(here->B3SOIFDGePtr +1) += m * xcgeb; + *(here->B3SOIFDDPePtr +1) += m * xcdeb; + *(here->B3SOIFDSPePtr +1) += m * xcseb; - *(here->B3SOIFDEePtr +1) += xceeb; + *(here->B3SOIFDEePtr +1) += m * xceeb; - *(here->B3SOIFDGgPtr +1) += xcggb; - *(here->B3SOIFDGdpPtr +1) += xcgdb; - *(here->B3SOIFDGspPtr +1) += xcgsb; + *(here->B3SOIFDGgPtr +1) += m * xcggb; + *(here->B3SOIFDGdpPtr +1) += m * xcgdb; + *(here->B3SOIFDGspPtr +1) += m * xcgsb; - *(here->B3SOIFDDPgPtr +1) += xcdgb; - *(here->B3SOIFDDPdpPtr +1) += xcddb; - *(here->B3SOIFDDPspPtr +1) += xcdsb; + *(here->B3SOIFDDPgPtr +1) += m * xcdgb; + *(here->B3SOIFDDPdpPtr +1) += m * xcddb; + *(here->B3SOIFDDPspPtr +1) += m * xcdsb; - *(here->B3SOIFDSPgPtr +1) += xcsgb; - *(here->B3SOIFDSPdpPtr +1) += xcsdb; - *(here->B3SOIFDSPspPtr +1) += xcssb; + *(here->B3SOIFDSPgPtr +1) += m * xcsgb; + *(here->B3SOIFDSPdpPtr +1) += m * xcsdb; + *(here->B3SOIFDSPspPtr +1) += m * xcssb; if (selfheat) { - *(here->B3SOIFDTemptempPtr + 1) += xcTt; - *(here->B3SOIFDDPtempPtr + 1) += xcdT; - *(here->B3SOIFDSPtempPtr + 1) += xcsT; - *(here->B3SOIFDBtempPtr + 1) += xcbT; - *(here->B3SOIFDEtempPtr + 1) += xceT; - *(here->B3SOIFDGtempPtr + 1) += xcgT; + *(here->B3SOIFDTemptempPtr + 1) += m * xcTt; + *(here->B3SOIFDDPtempPtr + 1) += m * xcdT; + *(here->B3SOIFDSPtempPtr + 1) += m * xcsT; + *(here->B3SOIFDBtempPtr + 1) += m * xcbT; + *(here->B3SOIFDEtempPtr + 1) += m * xceT; + *(here->B3SOIFDGtempPtr + 1) += m * xcgT; } @@ -319,36 +330,36 @@ xcsgb, xcsdb, xcssb, -(xcsgb+xcsdb+xcssb+xcseb), xcseb); *(here->B3SOIFDEdpPtr) += 0.0; *(here->B3SOIFDEspPtr) += 0.0; *(here->B3SOIFDGePtr) -= 0.0; - *(here->B3SOIFDDPePtr) += Gme + gddpe; - *(here->B3SOIFDSPePtr) += gsspe - Gme; + *(here->B3SOIFDDPePtr) += m * (Gme + gddpe); + *(here->B3SOIFDSPePtr) += m * (gsspe - Gme); *(here->B3SOIFDEePtr) += 0.0; - *(here->B3SOIFDDPgPtr) += Gm + gddpg; - *(here->B3SOIFDDPdpPtr) += gdpr + gds + gddpdp + RevSum ; - *(here->B3SOIFDDPspPtr) -= gds + FwdSum - gddpsp; - *(here->B3SOIFDDPdPtr) -= gdpr; + *(here->B3SOIFDDPgPtr) += m * (Gm + gddpg); + *(here->B3SOIFDDPdpPtr) += m * (gdpr + gds + gddpdp + RevSum); + *(here->B3SOIFDDPspPtr) -= m * (gds + FwdSum - gddpsp); + *(here->B3SOIFDDPdPtr) -= m * gdpr; - *(here->B3SOIFDSPgPtr) -= Gm - gsspg; - *(here->B3SOIFDSPdpPtr) -= gds + RevSum - gsspdp; - *(here->B3SOIFDSPspPtr) += gspr + gds + FwdSum + gsspsp; - *(here->B3SOIFDSPsPtr) -= gspr; + *(here->B3SOIFDSPgPtr) -= m * (Gm - gsspg); + *(here->B3SOIFDSPdpPtr) -= m * (gds + RevSum - gsspdp); + *(here->B3SOIFDSPspPtr) += m * (gspr + gds + FwdSum + gsspsp); + *(here->B3SOIFDSPsPtr) -= m * gspr; if (selfheat) { - *(here->B3SOIFDDPtempPtr) += GmT + gddpT; - *(here->B3SOIFDSPtempPtr) += -GmT + gsspT; - *(here->B3SOIFDBtempPtr) += gbbT; + *(here->B3SOIFDDPtempPtr) += m * (GmT + gddpT); + *(here->B3SOIFDSPtempPtr) += m * (-GmT + gsspT); + *(here->B3SOIFDBtempPtr) += m * gbbT; if (here->B3SOIFDbodyMod == 1) { - (*(here->B3SOIFDPtempPtr) += gppT); + (*(here->B3SOIFDPtempPtr) += m * gppT); } - *(here->B3SOIFDTemptempPtr) += gTtt + 1/here->pParam->B3SOIFDrth; - *(here->B3SOIFDTempgPtr) += gTtg; - *(here->B3SOIFDTempbPtr) += gTtb; - *(here->B3SOIFDTempePtr) += gTte; - *(here->B3SOIFDTempdpPtr) += gTtdp; - *(here->B3SOIFDTempspPtr) += gTtsp; + *(here->B3SOIFDTemptempPtr) += m * (gTtt + 1/here->pParam->B3SOIFDrth); + *(here->B3SOIFDTempgPtr) += m * gTtg; + *(here->B3SOIFDTempbPtr) += m * gTtb; + *(here->B3SOIFDTempePtr) += m * gTte; + *(here->B3SOIFDTempdpPtr) += m * gTtdp; + *(here->B3SOIFDTempspPtr) += m * gTtsp; } if (here->B3SOIFDdebugMod > 3) @@ -370,68 +381,68 @@ if (here->B3SOIFDdebugMod > 3) gbbg, gbbdp, gbbsp, gbbb, gbbe); } - *(here->B3SOIFDDdPtr) += gdpr; - *(here->B3SOIFDDdpPtr) -= gdpr; - *(here->B3SOIFDSsPtr) += gspr; - *(here->B3SOIFDSspPtr) -= gspr; + *(here->B3SOIFDDdPtr) += m * gdpr; + *(here->B3SOIFDDdpPtr) -= m * gdpr; + *(here->B3SOIFDSsPtr) += m * gspr; + *(here->B3SOIFDSspPtr) -= m * gspr; if (here->B3SOIFDbodyMod == 1) { - (*(here->B3SOIFDBpPtr) -= gppp); - (*(here->B3SOIFDPbPtr) += gppb); - (*(here->B3SOIFDPpPtr) += gppp); - (*(here->B3SOIFDPgPtr) += gppg); - (*(here->B3SOIFDPdpPtr) += gppdp); - (*(here->B3SOIFDPspPtr) += gppsp); - (*(here->B3SOIFDPePtr) += gppe); + (*(here->B3SOIFDBpPtr) -= m * gppp); + (*(here->B3SOIFDPbPtr) += m * gppb); + (*(here->B3SOIFDPpPtr) += m * gppp); + (*(here->B3SOIFDPgPtr) += m * gppg); + (*(here->B3SOIFDPdpPtr) += m * gppdp); + (*(here->B3SOIFDPspPtr) += m * gppsp); + (*(here->B3SOIFDPePtr) += m * gppe); } if (here->B3SOIFDdebugMod > 1) { - *(here->B3SOIFDVbsPtr) += 1; - *(here->B3SOIFDIdsPtr) += 1; - *(here->B3SOIFDIcPtr) += 1; - *(here->B3SOIFDIbsPtr) += 1; - *(here->B3SOIFDIbdPtr) += 1; - *(here->B3SOIFDIiiPtr) += 1; - *(here->B3SOIFDIgidlPtr) += 1; - *(here->B3SOIFDItunPtr) += 1; - *(here->B3SOIFDIbpPtr) += 1; - *(here->B3SOIFDAbeffPtr) += 1; - *(here->B3SOIFDVbs0effPtr) += 1; - *(here->B3SOIFDVbseffPtr) += 1; - *(here->B3SOIFDXcPtr) += 1; - *(here->B3SOIFDCbgPtr) += 1; - *(here->B3SOIFDCbbPtr) += 1; - *(here->B3SOIFDCbdPtr) += 1; - *(here->B3SOIFDqbPtr) += 1; - *(here->B3SOIFDQbfPtr) += 1; - *(here->B3SOIFDQjsPtr) += 1; - *(here->B3SOIFDQjdPtr) += 1; + *(here->B3SOIFDVbsPtr) += m * 1; + *(here->B3SOIFDIdsPtr) += m * 1; + *(here->B3SOIFDIcPtr) += m * 1; + *(here->B3SOIFDIbsPtr) += m * 1; + *(here->B3SOIFDIbdPtr) += m * 1; + *(here->B3SOIFDIiiPtr) += m * 1; + *(here->B3SOIFDIgidlPtr) += m * 1; + *(here->B3SOIFDItunPtr) += m * 1; + *(here->B3SOIFDIbpPtr) += m * 1; + *(here->B3SOIFDAbeffPtr) += m * 1; + *(here->B3SOIFDVbs0effPtr) += m * 1; + *(here->B3SOIFDVbseffPtr) += m * 1; + *(here->B3SOIFDXcPtr) += m * 1; + *(here->B3SOIFDCbgPtr) += m * 1; + *(here->B3SOIFDCbbPtr) += m * 1; + *(here->B3SOIFDCbdPtr) += m * 1; + *(here->B3SOIFDqbPtr) += m * 1; + *(here->B3SOIFDQbfPtr) += m * 1; + *(here->B3SOIFDQjsPtr) += m * 1; + *(here->B3SOIFDQjdPtr) += m * 1; /* clean up last */ - *(here->B3SOIFDGmPtr) += 1; - *(here->B3SOIFDGmbsPtr) += 1; - *(here->B3SOIFDGdsPtr) += 1; - *(here->B3SOIFDGmePtr) += 1; - *(here->B3SOIFDVbs0teffPtr) += 1; - *(here->B3SOIFDVgsteffPtr) += 1; - *(here->B3SOIFDCbePtr) += 1; - *(here->B3SOIFDVthPtr) += 1; - *(here->B3SOIFDXcsatPtr) += 1; - *(here->B3SOIFDVdscvPtr) += 1; - *(here->B3SOIFDVcscvPtr) += 1; - *(here->B3SOIFDQaccPtr) += 1; - *(here->B3SOIFDQsub0Ptr) += 1; - *(here->B3SOIFDQsubs1Ptr) += 1; - *(here->B3SOIFDQsubs2Ptr) += 1; - *(here->B3SOIFDqgPtr) += 1; - *(here->B3SOIFDqdPtr) += 1; - *(here->B3SOIFDqePtr) += 1; - *(here->B3SOIFDDum1Ptr) += 1; - *(here->B3SOIFDDum2Ptr) += 1; - *(here->B3SOIFDDum3Ptr) += 1; - *(here->B3SOIFDDum4Ptr) += 1; - *(here->B3SOIFDDum5Ptr) += 1; + *(here->B3SOIFDGmPtr) += m * 1; + *(here->B3SOIFDGmbsPtr) += m * 1; + *(here->B3SOIFDGdsPtr) += m * 1; + *(here->B3SOIFDGmePtr) += m * 1; + *(here->B3SOIFDVbs0teffPtr) += m * 1; + *(here->B3SOIFDVgsteffPtr) += m * 1; + *(here->B3SOIFDCbePtr) += m * 1; + *(here->B3SOIFDVthPtr) += m * 1; + *(here->B3SOIFDXcsatPtr) += m * 1; + *(here->B3SOIFDVdscvPtr) += m * 1; + *(here->B3SOIFDVcscvPtr) += m * 1; + *(here->B3SOIFDQaccPtr) += m * 1; + *(here->B3SOIFDQsub0Ptr) += m * 1; + *(here->B3SOIFDQsubs1Ptr) += m * 1; + *(here->B3SOIFDQsubs2Ptr) += m * 1; + *(here->B3SOIFDqgPtr) += m * 1; + *(here->B3SOIFDqdPtr) += m * 1; + *(here->B3SOIFDqePtr) += m * 1; + *(here->B3SOIFDDum1Ptr) += m * 1; + *(here->B3SOIFDDum2Ptr) += m * 1; + *(here->B3SOIFDDum3Ptr) += m * 1; + *(here->B3SOIFDDum4Ptr) += m * 1; + *(here->B3SOIFDDum5Ptr) += m * 1; } if (here->B3SOIFDdebugMod > 2) diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdask.c b/src/spicelib/devices/bsim3soi_fd/b3soifdask.c index 7434cb37c..efb640d33 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdask.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdask.c @@ -1,13 +1,16 @@ /********** Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang +Modified by Paolo Nenzi 2002 File: b3soifdask.c 98/5/01 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ #include "ngspice.h" -#include -#include #include "ifsim.h" #include "cktdefs.h" #include "devdefs.h" @@ -16,12 +19,8 @@ File: b3soifdask.c 98/5/01 #include "suffix.h" int -B3SOIFDask(ckt,inst,which,value,select) -CKTcircuit *ckt; -GENinstance *inst; -int which; -IFvalue *value; -IFvalue *select; +B3SOIFDask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, + IFvalue *select) { B3SOIFDinstance *here = (B3SOIFDinstance*)inst; @@ -32,6 +31,9 @@ B3SOIFDinstance *here = (B3SOIFDinstance*)inst; case B3SOIFD_W: value->rValue = here->B3SOIFDw; return(OK); + case B3SOIFD_M: + value->rValue = here->B3SOIFDm; + return(OK); case B3SOIFD_AS: value->rValue = here->B3SOIFDsourceArea; return(OK); @@ -58,9 +60,11 @@ B3SOIFDinstance *here = (B3SOIFDinstance*)inst; return(OK); case B3SOIFD_RTH0: value->rValue = here->B3SOIFDrth0; + value->rValue /= here->B3SOIFDm; return(OK); case B3SOIFD_CTH0: value->rValue = here->B3SOIFDcth0; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_NRB: value->rValue = here->B3SOIFDbodySquares; @@ -103,9 +107,11 @@ B3SOIFDinstance *here = (B3SOIFDinstance*)inst; return(OK); case B3SOIFD_SOURCECONDUCT: value->rValue = here->B3SOIFDsourceConductance; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_DRAINCONDUCT: value->rValue = here->B3SOIFDdrainConductance; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_VBD: value->rValue = *(ckt->CKTstate0 + here->B3SOIFDvbd); @@ -123,76 +129,99 @@ B3SOIFDinstance *here = (B3SOIFDinstance*)inst; value->rValue = *(ckt->CKTstate0 + here->B3SOIFDvds); return(OK); case B3SOIFD_CD: - value->rValue = here->B3SOIFDcd; + value->rValue = here->B3SOIFDcd; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_CBS: - value->rValue = here->B3SOIFDcjs; + value->rValue = here->B3SOIFDcjs; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_CBD: - value->rValue = here->B3SOIFDcjd; + value->rValue = here->B3SOIFDcjd; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_GM: value->rValue = here->B3SOIFDgm; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_GMID: value->rValue = here->B3SOIFDgm/here->B3SOIFDcd; return(OK); case B3SOIFD_GDS: value->rValue = here->B3SOIFDgds; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_GMBS: - value->rValue = here->B3SOIFDgmbs; + value->rValue = here->B3SOIFDgmbs; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_GBD: value->rValue = here->B3SOIFDgjdb; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_GBS: - value->rValue = here->B3SOIFDgjsb; + value->rValue = here->B3SOIFDgjsb; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_QB: value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqb); + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_CQB: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDcqb); + value->rValue = *(ckt->CKTstate0 + here->B3SOIFDcqb); + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_QG: value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqg); + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_CQG: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDcqg); + value->rValue = *(ckt->CKTstate0 + here->B3SOIFDcqg); + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_QD: value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqd); + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_CQD: value->rValue = *(ckt->CKTstate0 + here->B3SOIFDcqd); + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_CGG: value->rValue = here->B3SOIFDcggb; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_CGD: value->rValue = here->B3SOIFDcgdb; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_CGS: value->rValue = here->B3SOIFDcgsb; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_CDG: - value->rValue = here->B3SOIFDcdgb; + value->rValue = here->B3SOIFDcdgb; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_CDD: - value->rValue = here->B3SOIFDcddb; + value->rValue = here->B3SOIFDcddb; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_CDS: value->rValue = here->B3SOIFDcdsb; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_CBG: value->rValue = here->B3SOIFDcbgb; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_CBDB: value->rValue = here->B3SOIFDcbdb; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_CBSB: value->rValue = here->B3SOIFDcbsb; + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_VON: value->rValue = here->B3SOIFDvon; @@ -201,10 +230,12 @@ B3SOIFDinstance *here = (B3SOIFDinstance*)inst; value->rValue = here->B3SOIFDvdsat; return(OK); case B3SOIFD_QBS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqbs); + value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqbs); + value->rValue *= here->B3SOIFDm; return(OK); case B3SOIFD_QBD: value->rValue = *(ckt->CKTstate0 + here->B3SOIFDqbd); + value->rValue *= here->B3SOIFDm; return(OK); default: return(E_BADPARM); diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdcheck.c b/src/spicelib/devices/bsim3soi_fd/b3soifdcheck.c index c0e1a2a4f..398db80a4 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdcheck.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdcheck.c @@ -1,13 +1,16 @@ /********** Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang +Modified by Paolo Nenzi 2002 File: b3soifdcheck.c 98/5/01 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "b3soifddef.h" #include "trandefs.h" @@ -17,20 +20,18 @@ File: b3soifdcheck.c 98/5/01 #include "suffix.h" int -B3SOIFDcheckModel(model, here, ckt) - B3SOIFDmodel *model; - B3SOIFDinstance *here; -CKTcircuit *ckt; +B3SOIFDcheckModel(B3SOIFDmodel *model, B3SOIFDinstance *here, CKTcircuit *ckt) { struct b3soifdSizeDependParam *pParam; int Fatal_Flag = 0; FILE *fplog; - if ((fplog = fopen("b3soifdv1check.log", "w")) != NULL) + if ((fplog = fopen("b3soifdv2check.log", "w")) != NULL) { pParam = here->pParam; - fprintf(fplog, "B3SOIFDV3 Parameter Check\n"); + fprintf(fplog, "B3SOI (FD) Version 2.1 Parameter Check\n"); fprintf(fplog, "Model = %s\n", model->B3SOIFDmodName); - fprintf(fplog, "W = %g, L = %g\n", here->B3SOIFDw, here->B3SOIFDl); + fprintf(fplog, "W = %g, L = %g M = %g\n", here->B3SOIFDw, + here->B3SOIFDl, here->B3SOIFDm); if (pParam->B3SOIFDnlx < -pParam->B3SOIFDleff) diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdcvtest.c b/src/spicelib/devices/bsim3soi_fd/b3soifdcvtest.c index a815ad015..0ac076709 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdcvtest.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdcvtest.c @@ -1,13 +1,16 @@ /********** Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang +Modified by Paolo Nenzi 2002 File: b3soifdcvtest.c 98/5/01 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "b3soifddef.h" #include "trandefs.h" @@ -18,12 +21,10 @@ File: b3soifdcvtest.c 98/5/01 int -B3SOIFDconvTest(inModel,ckt) -GENmodel *inModel; - CKTcircuit *ckt; +B3SOIFDconvTest(GENmodel *inModel, CKTcircuit *ckt) { - B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; - B3SOIFDinstance *here; +B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; +B3SOIFDinstance *here; double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; @@ -32,7 +33,12 @@ double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; { /* loop through all the instances of the model */ for (here = model->B3SOIFDinstances; here != NULL ; here=here->B3SOIFDnextInstance) - { vbs = model->B3SOIFDtype + { + + if (here->B3SOIFDowner != ARCHme) + continue; + + vbs = model->B3SOIFDtype * (*(ckt->CKTrhsOld+here->B3SOIFDbNode) - *(ckt->CKTrhsOld+here->B3SOIFDsNodePrime)); vgs = model->B3SOIFDtype diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifddef.h b/src/spicelib/devices/bsim3soi_fd/b3soifddef.h index 708051049..689948ab1 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifddef.h +++ b/src/spicelib/devices/bsim3soi_fd/b3soifddef.h @@ -3,6 +3,7 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung Modified by Pin Su, Wei Jin 99/9/27 +Modified by Paolo Nenzi 2002 File: b3soifddef.h **********/ @@ -23,8 +24,9 @@ typedef struct sB3SOIFDinstance struct sB3SOIFDmodel *B3SOIFDmodPtr; struct sB3SOIFDinstance *B3SOIFDnextInstance; IFuid B3SOIFDname; - int B3SOIPDowner; - int B3SOIFDstates; /* index into state table for this device */ + int B3SOIFDowner; /* number of owner process */ + int B3SOIFDstates; /* index into state table for this device */ + int B3SOIFDdNode; int B3SOIFDgNode; int B3SOIFDsNode; @@ -128,6 +130,7 @@ typedef struct sB3SOIFDinstance double B3SOIFDl; double B3SOIFDw; + double B3SOIFDm; double B3SOIFDdrainArea; double B3SOIFDsourceArea; double B3SOIFDdrainSquares; @@ -217,7 +220,6 @@ typedef struct sB3SOIFDinstance double B3SOIFDcbgb; double B3SOIFDcbdb; - double B3SOIFDcbs; /* XXX PN */ double B3SOIFDcbsb; double B3SOIFDcbeb; double B3SOIFDcbT; @@ -243,6 +245,7 @@ typedef struct sB3SOIFDinstance unsigned B3SOIFDlGiven :1; unsigned B3SOIFDwGiven :1; + unsigned B3SOIFDmGiven :1; unsigned B3SOIFDdrainAreaGiven :1; unsigned B3SOIFDsourceAreaGiven :1; unsigned B3SOIFDdrainSquaresGiven :1; @@ -1469,6 +1472,7 @@ typedef struct sB3SOIFDmodel /* device parameters */ #define B3SOIFD_W 1 #define B3SOIFD_L 2 +#define B3SOIFD_M 22 #define B3SOIFD_AS 3 #define B3SOIFD_AD 4 #define B3SOIFD_PS 5 @@ -1973,18 +1977,12 @@ typedef struct sB3SOIFDmodel #include "b3soifdext.h" -#ifdef __STDC__ extern void B3SOIFDevaluate(double,double,double,B3SOIFDinstance*,B3SOIFDmodel*, double*,double*,double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, CKTcircuit*); extern int B3SOIFDdebug(B3SOIFDmodel*, B3SOIFDinstance*, CKTcircuit*, int); extern int B3SOIFDcheckModel(B3SOIFDmodel*, B3SOIFDinstance*, CKTcircuit*); -#else /* stdc */ -extern void B3SOIFDevaluate(); -extern int B3SOIFDdebug(); -extern int B3SOIFDcheckModel(); -#endif /* stdc */ #endif /*B3SOIFD*/ diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifddel.c b/src/spicelib/devices/bsim3soi_fd/b3soifddel.c index 1bd685757..d2671b1c4 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifddel.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifddel.c @@ -1,12 +1,16 @@ /********** Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang +Modified by Paolo Nenzi 2002 File: b3soifddel.c 98/5/01 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ #include "ngspice.h" -#include #include "b3soifddef.h" #include "sperror.h" #include "gendefs.h" @@ -14,10 +18,7 @@ File: b3soifddel.c 98/5/01 int -B3SOIFDdelete(inModel,name,inInst) -GENmodel *inModel; -IFuid name; -GENinstance **inInst; +B3SOIFDdelete(GENmodel *inModel, IFuid name, GENinstance **inInst) { B3SOIFDinstance **fast = (B3SOIFDinstance**)inInst; B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifddest.c b/src/spicelib/devices/bsim3soi_fd/b3soifddest.c index 5e70e5c36..1bae0b873 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifddest.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifddest.c @@ -1,18 +1,21 @@ /********** Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang +Modified by Paolo Nenzi 2002 File: b3soifddest.c 98/5/01 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ #include "ngspice.h" -#include #include "b3soifddef.h" #include "suffix.h" void -B3SOIFDdestroy(inModel) -GENmodel **inModel; +B3SOIFDdestroy(GENmodel **inModel) { B3SOIFDmodel **model = (B3SOIFDmodel**)inModel; B3SOIFDinstance *here; diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdext.h b/src/spicelib/devices/bsim3soi_fd/b3soifdext.h index 14c807421..1c6ed33dd 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdext.h +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdext.h @@ -1,10 +1,10 @@ /********** Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung +Modified by Paolo Nenzi 2002 File: b3soifdext.h **********/ -#ifdef __STDC__ extern int B3SOIFDacLoad(GENmodel *,CKTcircuit*); extern int B3SOIFDask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); extern int B3SOIFDconvTest(GENmodel *,CKTcircuit*); @@ -29,25 +29,3 @@ extern int B3SOIFDtrunc(GENmodel*,CKTcircuit*,double*); extern int B3SOIFDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int B3SOIFDunsetup(GENmodel*,CKTcircuit*); -#else /* stdc */ -extern int B3SOIFDacLoad(); -extern int B3SOIFDdelete(); -extern void B3SOIFDdestroy(); -extern int B3SOIFDgetic(); -extern int B3SOIFDload(); -extern int B3SOIFDmDelete(); -extern int B3SOIFDask(); -extern int B3SOIFDmAsk(); -extern int B3SOIFDconvTest(); -extern int B3SOIFDtemp(); -extern int B3SOIFDmParam(); -extern void B3SOIFDmosCap(); -extern int B3SOIFDparam(); -extern int B3SOIFDpzLoad(); -extern int B3SOIFDsetup(); -extern int B3SOIFDtrunc(); -extern int B3SOIFDnoise(); -extern int B3SOIFDunsetup(); - -#endif /* stdc */ - diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdgetic.c b/src/spicelib/devices/bsim3soi_fd/b3soifdgetic.c index 34214f86e..b3172641c 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdgetic.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdgetic.c @@ -1,12 +1,16 @@ /********** Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang +Modified by Paolo Nenzi 2002 File: b3soifdgetic.c 98/5/01 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ #include "ngspice.h" -#include #include "cktdefs.h" #include "b3soifddef.h" #include "sperror.h" @@ -14,16 +18,20 @@ File: b3soifdgetic.c 98/5/01 int -B3SOIFDgetic(inModel,ckt) -GENmodel *inModel; -CKTcircuit *ckt; +B3SOIFDgetic(GENmodel *inModel, CKTcircuit *ckt) { B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; B3SOIFDinstance *here; for (; model ; model = model->B3SOIFDnextModel) { for (here = model->B3SOIFDinstances; here; here = here->B3SOIFDnextInstance) - { if(!here->B3SOIFDicVBSGiven) + { + + if (here->B3SOIFDowner != ARCHme) + continue; + + + if(!here->B3SOIFDicVBSGiven) { here->B3SOIFDicVBS = *(ckt->CKTrhs + here->B3SOIFDbNode) - *(ckt->CKTrhs + here->B3SOIFDsNode); } diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c b/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c index 67211c731..30a794b2f 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdinit.c @@ -8,7 +8,7 @@ SPICEdev B3SOIFDinfo = { { "B3SOIFD", - "Berkeley SOI MOSFET (FD) model version 1.0", + "Berkeley SOI MOSFET (FD) model version 2.1", &B3SOIFDnSize, &B3SOIFDnSize, @@ -19,7 +19,7 @@ SPICEdev B3SOIFDinfo = { &B3SOIFDmPTSize, B3SOIFDmPTable, - + #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 */ @@ -33,40 +33,45 @@ SPICEdev B3SOIFDinfo = { 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: B3SOIFDparam, -DEVmodParam: B3SOIFDmParam, -DEVload: B3SOIFDload, -DEVsetup: B3SOIFDsetup, -DEVunsetup: B3SOIFDunsetup, -DEVpzSetup: B3SOIFDsetup, -DEVtemperature:B3SOIFDtemp, -DEVtrunc: B3SOIFDtrunc, -DEVfindBranch: NULL, -DEVacLoad: B3SOIFDacLoad, -DEVaccept: NULL, -DEVdestroy: B3SOIFDdestroy, -DEVmodDelete: B3SOIFDmDelete, -DEVdelete: B3SOIFDdelete, -DEVsetic: B3SOIFDgetic, -DEVask: B3SOIFDask, -DEVmodAsk: B3SOIFDmAsk, -DEVpzLoad: B3SOIFDpzLoad, -DEVconvTest: B3SOIFDconvTest, -DEVsenSetup: NULL, -DEVsenLoad: NULL, -DEVsenUpdate: NULL, -DEVsenAcLoad: NULL, -DEVsenPrint: NULL, -DEVsenTrunc: NULL, -DEVdisto: NULL, -DEVnoise: B3SOIFDnoise, -DEVinstSize: &B3SOIFDiSize, -DEVmodSize: &B3SOIFDmSize +#endif + + DEV_DEFAULT + + }, + + DEVparam : B3SOIFDparam, + DEVmodParam : B3SOIFDmParam, + DEVload : B3SOIFDload, + DEVsetup : B3SOIFDsetup, + DEVunsetup : B3SOIFDunsetup, + DEVpzSetup : B3SOIFDsetup, + DEVtemperature: B3SOIFDtemp, + DEVtrunc : B3SOIFDtrunc, + DEVfindBranch : NULL, + DEVacLoad : B3SOIFDacLoad, + DEVaccept : NULL, + DEVdestroy : B3SOIFDdestroy, + DEVmodDelete : B3SOIFDmDelete, + DEVdelete : B3SOIFDdelete, + DEVsetic : B3SOIFDgetic, + DEVask : B3SOIFDask, + DEVmodAsk : B3SOIFDmAsk, + DEVpzLoad : B3SOIFDpzLoad, + DEVconvTest : B3SOIFDconvTest, + DEVsenSetup : NULL, + DEVsenLoad : NULL, + DEVsenUpdate : NULL, + DEVsenAcLoad : NULL, + DEVsenPrint : NULL, + DEVsenTrunc : NULL, + DEVdisto : NULL, + DEVnoise : B3SOIFDnoise, +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif + DEVinstSize: &B3SOIFDiSize, + DEVmodSize: &B3SOIFDmSize }; @@ -75,7 +80,7 @@ DEVmodSize: &B3SOIFDmSize SPICEdev * -get_bsim3soifd_info (void) +get_b3soifd_info (void) { return &B3SOIFDinfo; } diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifditf.h b/src/spicelib/devices/bsim3soi_fd/b3soifditf.h index 5c4f4f2d0..1228aff59 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifditf.h +++ b/src/spicelib/devices/bsim3soi_fd/b3soifditf.h @@ -8,7 +8,7 @@ File: b3soifditf.h #include "b3soifdext.h" -SPICEdev *get_bsim3soifd_info (void); +SPICEdev *get_b3soifd_info (void); #endif diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdld.c b/src/spicelib/devices/bsim3soi_fd/b3soifdld.c index 886ccb629..1cf68791a 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdld.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdld.c @@ -3,13 +3,16 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang Modified by Pin Su, Wei Jin 99/9/27 +Modified by Paolo Nenzi 2002 File: b3soifdld.c 98/5/01 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "b3soifddef.h" #include "trandefs.h" @@ -49,11 +52,8 @@ File: b3soifdld.c 98/5/01 */ double -B3SOIFDSmartVbs(New, Old, here, ckt, check) - double New, Old; - B3SOIFDinstance *here; - CKTcircuit *ckt; - int *check; +B3SOIFDSmartVbs(double New, double Old, B3SOIFDinstance *here, + CKTcircuit *ckt, int *check) { double T0, T1, del; @@ -72,11 +72,7 @@ B3SOIFDSmartVbs(New, Old, here, ckt, check) */ double -B3SOIFDlimit(vnew, vold, limit, check) - double vnew; - double vold; - double limit; - int *check; +B3SOIFDlimit(double vnew, double vold, double limit, int *check) { double T0, T1; @@ -102,13 +98,11 @@ B3SOIFDlimit(vnew, vold, limit, check) int -B3SOIFDload(inModel,ckt) -GENmodel *inModel; - CKTcircuit *ckt; +B3SOIFDload(GENmodel *inModel, CKTcircuit *ckt) { - B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; - B3SOIFDinstance *here; - int selfheat; +B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; +B3SOIFDinstance *here; +int selfheat; double SourceSatCurrent, DrainSatCurrent, Gmin; double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst; @@ -297,12 +291,17 @@ int nandetect; static int nanfound = 0; char nanmessage [12]; - +double m; for (; model != NULL; model = model->B3SOIFDnextModel) { for (here = model->B3SOIFDinstances; here != NULL; here = here->B3SOIFDnextInstance) - { Check = 0; + { + + if (here->B3SOIFDowner != ARCHme) + continue; + + Check = 0; ByPass = 0; selfheat = (model->B3SOIFDshMod == 1) && (here->B3SOIFDrth0 != 0.0); pParam = here->pParam; @@ -2769,6 +2768,7 @@ fprintf(stderr, "Bypass for %s...\n", here->B3SOIFDname); { ckt->CKTnoncon++; if (here->B3SOIFDdebugMod > 2) fprintf(fpdebug, "Check is on, noncon=%d\n", ckt->CKTnoncon++); + } } @@ -3025,6 +3025,8 @@ if (here->B3SOIFDdebugMod > 2) */ line900: + m = here->B3SOIFDm; + if (here->B3SOIFDmode >= 0) { Gm = here->B3SOIFDgm; Gmbs = here->B3SOIFDgmbs; @@ -3153,18 +3155,18 @@ if (here->B3SOIFDdebugMod > 2) ceqqe = -ceqqe; } - (*(ckt->CKTrhs + here->B3SOIFDgNode) -= ceqqg); - (*(ckt->CKTrhs + here->B3SOIFDdNodePrime) += (ceqbd - cdreq - ceqqd)); - (*(ckt->CKTrhs + here->B3SOIFDsNodePrime) += (cdreq + ceqbs + ceqqg + (*(ckt->CKTrhs + here->B3SOIFDgNode) -= m * ceqqg); + (*(ckt->CKTrhs + here->B3SOIFDdNodePrime) += m * (ceqbd - cdreq - ceqqd)); + (*(ckt->CKTrhs + here->B3SOIFDsNodePrime) += m * (cdreq + ceqbs + ceqqg + ceqqb + ceqqd + ceqqe)); - (*(ckt->CKTrhs + here->B3SOIFDeNode) -= ceqqe); + (*(ckt->CKTrhs + here->B3SOIFDeNode) -= m * ceqqe); if (here->B3SOIFDbodyMod == 1) { - (*(ckt->CKTrhs + here->B3SOIFDpNode) += ceqbodcon); + (*(ckt->CKTrhs + here->B3SOIFDpNode) += m * ceqbodcon); } if (selfheat) { - (*(ckt->CKTrhs + here->B3SOIFDtempNode) -= ceqth + ceqqth); + (*(ckt->CKTrhs + here->B3SOIFDtempNode) -= m * (ceqth + ceqqth)); } @@ -3223,117 +3225,117 @@ if (here->B3SOIFDdebugMod > 2) /* * load y matrix */ - (*(here->B3SOIFDEgPtr) += gcegb); - (*(here->B3SOIFDEdpPtr) += gcedb); - (*(here->B3SOIFDEspPtr) += gcesb); - (*(here->B3SOIFDGePtr) += gcgeb); - (*(here->B3SOIFDDPePtr) += Gme + gddpe + gcdeb); - (*(here->B3SOIFDSPePtr) += gsspe - Gme + gcseb); + (*(here->B3SOIFDEgPtr) += m * gcegb); + (*(here->B3SOIFDEdpPtr) += m * gcedb); + (*(here->B3SOIFDEspPtr) += m * gcesb); + (*(here->B3SOIFDGePtr) += m * gcgeb); + (*(here->B3SOIFDDPePtr) += m * (Gme + gddpe + gcdeb)); + (*(here->B3SOIFDSPePtr) += m * (gsspe - Gme + gcseb)); - (*(here->B3SOIFDEePtr) += gceeb); + (*(here->B3SOIFDEePtr) += m * gceeb); - (*(here->B3SOIFDGgPtr) += gcggb + ckt->CKTgmin); - (*(here->B3SOIFDGdpPtr) += gcgdb - ckt->CKTgmin); - (*(here->B3SOIFDGspPtr) += gcgsb ); + (*(here->B3SOIFDGgPtr) += m * (gcggb + ckt->CKTgmin)); + (*(here->B3SOIFDGdpPtr) += m * (gcgdb - ckt->CKTgmin)); + (*(here->B3SOIFDGspPtr) += m * gcgsb ); - (*(here->B3SOIFDDPgPtr) += (Gm + gcdgb) + gddpg - ckt->CKTgmin); - (*(here->B3SOIFDDPdpPtr) += (here->B3SOIFDdrainConductance + (*(here->B3SOIFDDPgPtr) += m * ((Gm + gcdgb) + gddpg - ckt->CKTgmin)); + (*(here->B3SOIFDDPdpPtr) += m * ((here->B3SOIFDdrainConductance + here->B3SOIFDgds + gddpdp - + RevSum + gcddb) + ckt->CKTgmin); - (*(here->B3SOIFDDPspPtr) -= (-gddpsp + here->B3SOIFDgds + FwdSum - gcdsb)); + + RevSum + gcddb) + ckt->CKTgmin)); + (*(here->B3SOIFDDPspPtr) -= m * (-gddpsp + here->B3SOIFDgds + FwdSum - gcdsb)); - (*(here->B3SOIFDDPdPtr) -= here->B3SOIFDdrainConductance); + (*(here->B3SOIFDDPdPtr) -= m * here->B3SOIFDdrainConductance); - (*(here->B3SOIFDSPgPtr) += gcsgb - Gm + gsspg ); - (*(here->B3SOIFDSPdpPtr) -= (here->B3SOIFDgds - gsspdp + RevSum - gcsdb)); - (*(here->B3SOIFDSPspPtr) += (here->B3SOIFDsourceConductance + (*(here->B3SOIFDSPgPtr) += m * (gcsgb - Gm + gsspg)); + (*(here->B3SOIFDSPdpPtr) -= m * (here->B3SOIFDgds - gsspdp + RevSum - gcsdb)); + (*(here->B3SOIFDSPspPtr) += m * (here->B3SOIFDsourceConductance + here->B3SOIFDgds + gsspsp + FwdSum + gcssb)); - (*(here->B3SOIFDSPsPtr) -= here->B3SOIFDsourceConductance); + (*(here->B3SOIFDSPsPtr) -= m * here->B3SOIFDsourceConductance); - (*(here->B3SOIFDDdPtr) += here->B3SOIFDdrainConductance); - (*(here->B3SOIFDDdpPtr) -= here->B3SOIFDdrainConductance); + (*(here->B3SOIFDDdPtr) += m * here->B3SOIFDdrainConductance); + (*(here->B3SOIFDDdpPtr) -= m * here->B3SOIFDdrainConductance); - (*(here->B3SOIFDSsPtr) += here->B3SOIFDsourceConductance); - (*(here->B3SOIFDSspPtr) -= here->B3SOIFDsourceConductance); + (*(here->B3SOIFDSsPtr) += m * here->B3SOIFDsourceConductance); + (*(here->B3SOIFDSspPtr) -= m * here->B3SOIFDsourceConductance); if (here->B3SOIFDbodyMod == 1) { - (*(here->B3SOIFDBpPtr) -= gppp); - (*(here->B3SOIFDPbPtr) += gppb); - (*(here->B3SOIFDPpPtr) += gppp); - (*(here->B3SOIFDPgPtr) += gppg); - (*(here->B3SOIFDPdpPtr) += gppdp); - (*(here->B3SOIFDPspPtr) += gppsp); - (*(here->B3SOIFDPePtr) += gppe); + (*(here->B3SOIFDBpPtr) -= m * gppp); + (*(here->B3SOIFDPbPtr) += m * gppb); + (*(here->B3SOIFDPpPtr) += m * gppp); + (*(here->B3SOIFDPgPtr) += m * gppg); + (*(here->B3SOIFDPdpPtr) += m * gppdp); + (*(here->B3SOIFDPspPtr) += m * gppsp); + (*(here->B3SOIFDPePtr) += m * gppe); } if (selfheat) { - (*(here->B3SOIFDDPtempPtr) += GmT + gddpT + gcdT); - (*(here->B3SOIFDSPtempPtr) += -GmT + gsspT + gcsT); - (*(here->B3SOIFDBtempPtr) += gbbT + gcbT); - (*(here->B3SOIFDEtempPtr) += gceT); - (*(here->B3SOIFDGtempPtr) += gcgT); + (*(here->B3SOIFDDPtempPtr) += m * (GmT + gddpT + gcdT)); + (*(here->B3SOIFDSPtempPtr) += m * (-GmT + gsspT + gcsT)); + (*(here->B3SOIFDBtempPtr) += m * (gbbT + gcbT)); + (*(here->B3SOIFDEtempPtr) += m * gceT); + (*(here->B3SOIFDGtempPtr) += m * gcgT); if (here->B3SOIFDbodyMod == 1) { - (*(here->B3SOIFDPtempPtr) += gppT); + (*(here->B3SOIFDPtempPtr) += m * gppT); } - (*(here->B3SOIFDTemptempPtr) += gTtt + 1/pParam->B3SOIFDrth + gcTt); - (*(here->B3SOIFDTempgPtr) += gTtg); - (*(here->B3SOIFDTempbPtr) += gTtb); - (*(here->B3SOIFDTempePtr) += gTte); - (*(here->B3SOIFDTempdpPtr) += gTtdp); - (*(here->B3SOIFDTempspPtr) += gTtsp); + (*(here->B3SOIFDTemptempPtr) += m * (gTtt + 1/pParam->B3SOIFDrth + gcTt)); + (*(here->B3SOIFDTempgPtr) += m * gTtg); + (*(here->B3SOIFDTempbPtr) += m * gTtb); + (*(here->B3SOIFDTempePtr) += m * gTte); + (*(here->B3SOIFDTempdpPtr) += m * gTtdp); + (*(here->B3SOIFDTempspPtr) += m * gTtsp); } if ((here->B3SOIFDdebugMod > 1) || (here->B3SOIFDdebugMod == -1)) { - *(here->B3SOIFDVbsPtr) += 1; - *(here->B3SOIFDIdsPtr) += 1; - *(here->B3SOIFDIcPtr) += 1; - *(here->B3SOIFDIbsPtr) += 1; - *(here->B3SOIFDIbdPtr) += 1; - *(here->B3SOIFDIiiPtr) += 1; - *(here->B3SOIFDIgidlPtr) += 1; - *(here->B3SOIFDItunPtr) += 1; - *(here->B3SOIFDIbpPtr) += 1; - *(here->B3SOIFDAbeffPtr) += 1; - *(here->B3SOIFDVbs0effPtr) += 1; - *(here->B3SOIFDVbseffPtr) += 1; - *(here->B3SOIFDXcPtr) += 1; - *(here->B3SOIFDCbgPtr) += 1; - *(here->B3SOIFDCbbPtr) += 1; - *(here->B3SOIFDCbdPtr) += 1; - *(here->B3SOIFDqbPtr) += 1; - *(here->B3SOIFDQbfPtr) += 1; - *(here->B3SOIFDQjsPtr) += 1; - *(here->B3SOIFDQjdPtr) += 1; + *(here->B3SOIFDVbsPtr) += m * 1; + *(here->B3SOIFDIdsPtr) += m * 1; + *(here->B3SOIFDIcPtr) += m * 1; + *(here->B3SOIFDIbsPtr) += m * 1; + *(here->B3SOIFDIbdPtr) += m * 1; + *(here->B3SOIFDIiiPtr) += m * 1; + *(here->B3SOIFDIgidlPtr) += m * 1; + *(here->B3SOIFDItunPtr) += m * 1; + *(here->B3SOIFDIbpPtr) += m * 1; + *(here->B3SOIFDAbeffPtr) += m * 1; + *(here->B3SOIFDVbs0effPtr) += m * 1; + *(here->B3SOIFDVbseffPtr) += m * 1; + *(here->B3SOIFDXcPtr) += m * 1; + *(here->B3SOIFDCbgPtr) += m * 1; + *(here->B3SOIFDCbbPtr) += m * 1; + *(here->B3SOIFDCbdPtr) += m * 1; + *(here->B3SOIFDqbPtr) += m * 1; + *(here->B3SOIFDQbfPtr) += m * 1; + *(here->B3SOIFDQjsPtr) += m * 1; + *(here->B3SOIFDQjdPtr) += m * 1; /* clean up last */ - *(here->B3SOIFDGmPtr) += 1; - *(here->B3SOIFDGmbsPtr) += 1; - *(here->B3SOIFDGdsPtr) += 1; - *(here->B3SOIFDGmePtr) += 1; - *(here->B3SOIFDVbs0teffPtr) += 1; - *(here->B3SOIFDVgsteffPtr) += 1; - *(here->B3SOIFDCbePtr) += 1; - *(here->B3SOIFDVthPtr) += 1; - *(here->B3SOIFDXcsatPtr) += 1; - *(here->B3SOIFDVdscvPtr) += 1; - *(here->B3SOIFDVcscvPtr) += 1; - *(here->B3SOIFDQaccPtr) += 1; - *(here->B3SOIFDQsub0Ptr) += 1; - *(here->B3SOIFDQsubs1Ptr) += 1; - *(here->B3SOIFDQsubs2Ptr) += 1; - *(here->B3SOIFDqgPtr) += 1; - *(here->B3SOIFDqdPtr) += 1; - *(here->B3SOIFDqePtr) += 1; - *(here->B3SOIFDDum1Ptr) += 1; - *(here->B3SOIFDDum2Ptr) += 1; - *(here->B3SOIFDDum3Ptr) += 1; - *(here->B3SOIFDDum4Ptr) += 1; - *(here->B3SOIFDDum5Ptr) += 1; + *(here->B3SOIFDGmPtr) += m * 1; + *(here->B3SOIFDGmbsPtr) += m * 1; + *(here->B3SOIFDGdsPtr) += m * 1; + *(here->B3SOIFDGmePtr) += m * 1; + *(here->B3SOIFDVbs0teffPtr) += m * 1; + *(here->B3SOIFDVgsteffPtr) += m * 1; + *(here->B3SOIFDCbePtr) += m * 1; + *(here->B3SOIFDVthPtr) += m * 1; + *(here->B3SOIFDXcsatPtr) += m * 1; + *(here->B3SOIFDVdscvPtr) += m * 1; + *(here->B3SOIFDVcscvPtr) += m * 1; + *(here->B3SOIFDQaccPtr) += m * 1; + *(here->B3SOIFDQsub0Ptr) += m * 1; + *(here->B3SOIFDQsubs1Ptr) += m * 1; + *(here->B3SOIFDQsubs2Ptr) += m * 1; + *(here->B3SOIFDqgPtr) += m * 1; + *(here->B3SOIFDqdPtr) += m * 1; + *(here->B3SOIFDqePtr) += m * 1; + *(here->B3SOIFDDum1Ptr) += m * 1; + *(here->B3SOIFDDum2Ptr) += m * 1; + *(here->B3SOIFDDum3Ptr) += m * 1; + *(here->B3SOIFDDum4Ptr) += m * 1; + *(here->B3SOIFDDum5Ptr) += m * 1; /* end clean up last */ } diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdmask.c b/src/spicelib/devices/bsim3soi_fd/b3soifdmask.c index c88d7b159..c9dc7ca1a 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdmask.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdmask.c @@ -4,11 +4,15 @@ Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soifdmask.c 98/5/01 Modified by Wei Jin 99/9/27 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ #include "ngspice.h" -#include #include "ifsim.h" #include "cktdefs.h" #include "devdefs.h" @@ -17,11 +21,7 @@ Modified by Wei Jin 99/9/27 #include "suffix.h" int -B3SOIFDmAsk(ckt,inst,which,value) -CKTcircuit *ckt; -GENmodel *inst; -int which; -IFvalue *value; +B3SOIFDmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) { B3SOIFDmodel *model = (B3SOIFDmodel *)inst; switch(which) diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdmdel.c b/src/spicelib/devices/bsim3soi_fd/b3soifdmdel.c index d22d884d9..461b1b938 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdmdel.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdmdel.c @@ -1,21 +1,22 @@ /********** Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang +Modified by Paolo Nenzi 2002 File: b3soifdmdel.c 98/5/01 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ #include "ngspice.h" -#include #include "b3soifddef.h" #include "sperror.h" #include "suffix.h" int -B3SOIFDmDelete(inModel,modname,kill) -GENmodel **inModel; -IFuid modname; -GENmodel *kill; +B3SOIFDmDelete(GENmodel **inModel, IFuid modname, GENmodel *kill) { B3SOIFDmodel **model = (B3SOIFDmodel**)inModel; B3SOIFDmodel *modfast = (B3SOIFDmodel*)kill; diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdmpar.c b/src/spicelib/devices/bsim3soi_fd/b3soifdmpar.c index f195aefe2..78e27cc67 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdmpar.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdmpar.c @@ -4,11 +4,15 @@ Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soifdmpar.c 98/5/01 Modified by Wei Jin 99/9/27 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ #include "ngspice.h" -#include #include "b3soifddef.h" #include "ifsim.h" #include "sperror.h" @@ -16,10 +20,7 @@ Modified by Wei Jin 99/9/27 int -B3SOIFDmParam(param,value,inMod) -int param; -IFvalue *value; -GENmodel *inMod; +B3SOIFDmParam(int param, IFvalue *value, GENmodel *inMod) { B3SOIFDmodel *mod = (B3SOIFDmodel*)inMod; switch(param) diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdnoi.c b/src/spicelib/devices/bsim3soi_fd/b3soifdnoi.c index a9ab768fa..e93873b94 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdnoi.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdnoi.c @@ -3,11 +3,15 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soifdnoi.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ + #include "ngspice.h" -#include -#include #include "b3soifddef.h" #include "cktdefs.h" #include "iferrmsg.h" @@ -45,10 +49,9 @@ extern void NevalSrc(); extern double Nintegrate(); double -B3SOIFDStrongInversionNoiseEval(vgs, vds, model, here, freq, temp) -double vgs, vds, freq, temp; -B3SOIFDmodel *model; -B3SOIFDinstance *here; +B3SOIFDStrongInversionNoiseEval(double vgs, double vds, B3SOIFDmodel *model, + B3SOIFDinstance *here, double freq, + double temp) { struct b3soifdSizeDependParam *pParam; double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; @@ -56,7 +59,7 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi; double req, ceq; pParam = here->pParam; - cd = fabs(here->B3SOIFDcd); + cd = fabs(here->B3SOIFDcd) * here->B3SOIFDm; if (vds > here->B3SOIFDvdsat) { esat = 2.0 * pParam->B3SOIFDvsattemp / here->B3SOIFDueff; T0 = ((((vds - here->B3SOIFDvdsat) / pParam->B3SOIFDlitl) + model->B3SOIFDem) @@ -84,7 +87,7 @@ double req, ceq; T6 = 8.62e-5 * temp * cd * cd; T7 = 1.0e8 * EffFreq * pParam->B3SOIFDleff - * pParam->B3SOIFDleff * pParam->B3SOIFDweff; + * pParam->B3SOIFDleff * pParam->B3SOIFDweff * here->B3SOIFDm; T8 = model->B3SOIFDoxideTrapDensityA + model->B3SOIFDoxideTrapDensityB * Nl + model->B3SOIFDoxideTrapDensityC * Nl * Nl; T9 = (Nl + 2.0e14) * (Nl + 2.0e14); @@ -95,15 +98,11 @@ double req, ceq; } int -B3SOIFDnoise (mode, operation, inModel, ckt, data, OnDens) -int mode, operation; -GENmodel *inModel; -CKTcircuit *ckt; - Ndata *data; -double *OnDens; +B3SOIFDnoise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt, + Ndata *data, double *OnDens) { - B3SOIFDmodel *model = (B3SOIFDmodel *)inModel; - B3SOIFDinstance *here; +B3SOIFDmodel *model = (B3SOIFDmodel *)inModel; +B3SOIFDinstance *here; struct b3soifdSizeDependParam *pParam; char name[N_MXVLNTH]; double tempOnoise; @@ -134,7 +133,12 @@ int error, i; for (; model != NULL; model = model->B3SOIFDnextModel) { for (here = model->B3SOIFDinstances; here != NULL; here = here->B3SOIFDnextInstance) - { pParam = here->pParam; + { + + if (here->B3SOIFDowner != ARCHme) + continue; + + pParam = here->pParam; switch (operation) { case N_OPEN: /* see if we have to to produce a summary report */ @@ -202,12 +206,12 @@ int error, i; NevalSrc(&noizDens[B3SOIFDRDNOIZ], &lnNdens[B3SOIFDRDNOIZ], ckt, THERMNOISE, here->B3SOIFDdNodePrime, here->B3SOIFDdNode, - here->B3SOIFDdrainConductance); + here->B3SOIFDdrainConductance * here->B3SOIFDm); NevalSrc(&noizDens[B3SOIFDRSNOIZ], &lnNdens[B3SOIFDRSNOIZ], ckt, THERMNOISE, here->B3SOIFDsNodePrime, here->B3SOIFDsNode, - here->B3SOIFDsourceConductance); + here->B3SOIFDsourceConductance * here->B3SOIFDm); switch( model->B3SOIFDnoiMod ) { case 1: @@ -216,9 +220,10 @@ int error, i; &lnNdens[B3SOIFDIDNOIZ], ckt, THERMNOISE, here->B3SOIFDdNodePrime, here->B3SOIFDsNodePrime, - (2.0 / 3.0 * fabs(here->B3SOIFDgm + (2.0 / 3.0 * fabs(here->B3SOIFDm * + (here->B3SOIFDgm + here->B3SOIFDgds - + here->B3SOIFDgmbs))); + + here->B3SOIFDgmbs)))); break; case 2: case 4: @@ -227,7 +232,7 @@ int error, i; THERMNOISE, here->B3SOIFDdNodePrime, here->B3SOIFDsNodePrime, (here->B3SOIFDueff - * fabs(here->B3SOIFDqinv + * fabs((here->B3SOIFDqinv * here->B3SOIFDm) / (pParam->B3SOIFDleff * pParam->B3SOIFDleff)))); break; @@ -241,7 +246,7 @@ int error, i; case 4: noizDens[B3SOIFDFLNOIZ] *= model->B3SOIFDkf * exp(model->B3SOIFDaf - * log(MAX(fabs(here->B3SOIFDcd), + * log(MAX(fabs(here->B3SOIFDcd * here->B3SOIFDm), N_MINLOG))) / (pow(data->freq, model->B3SOIFDef) * pParam->B3SOIFDleff @@ -266,12 +271,12 @@ int error, i; { pParam = here->pParam; T10 = model->B3SOIFDoxideTrapDensityA * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->B3SOIFDweff + T11 = pParam->B3SOIFDweff * here->B3SOIFDm * pParam->B3SOIFDleff * pow(data->freq, model->B3SOIFDef) * 4.0e36; - Swi = T10 / T11 * here->B3SOIFDcd - * here->B3SOIFDcd; + Swi = T10 / T11 * here->B3SOIFDcd * here->B3SOIFDm + * here->B3SOIFDcd * here->B3SOIFDm; Slimit = B3SOIFDStrongInversionNoiseEval( here->B3SOIFDvon + 0.1, vds, model, here, data->freq, ckt->CKTtemp); diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdpar.c b/src/spicelib/devices/bsim3soi_fd/b3soifdpar.c index e6e7fd743..2e345387e 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdpar.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdpar.c @@ -1,23 +1,24 @@ /********** Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang +Modified by Paolo Nenzi 2002 File: b3soifdpar.c 98/5/01 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ #include "ngspice.h" -#include #include "ifsim.h" #include "b3soifddef.h" #include "sperror.h" #include "suffix.h" int -B3SOIFDparam(param,value,inst,select) -int param; -IFvalue *value; -GENinstance *inst; -IFvalue *select; +B3SOIFDparam(int param, IFvalue *value, GENinstance *inst, + IFvalue *select) { B3SOIFDinstance *here = (B3SOIFDinstance*)inst; switch(param) @@ -29,6 +30,10 @@ IFvalue *select; here->B3SOIFDl = value->rValue; here->B3SOIFDlGiven = TRUE; break; + case B3SOIFD_M: + here->B3SOIFDm = value->rValue; + here->B3SOIFDmGiven = TRUE; + break; case B3SOIFD_AS: here->B3SOIFDsourceArea = value->rValue; here->B3SOIFDsourceAreaGiven = TRUE; diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdpzld.c b/src/spicelib/devices/bsim3soi_fd/b3soifdpzld.c index adb51620a..00896d7a9 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdpzld.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdpzld.c @@ -1,12 +1,16 @@ /********** Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang +Modified by Paolo Nenzi 2002 File: b3soifdpzld.c 98/5/01 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ #include "ngspice.h" -#include #include "cktdefs.h" #include "complex.h" #include "sperror.h" @@ -14,24 +18,27 @@ File: b3soifdpzld.c 98/5/01 #include "suffix.h" int -B3SOIFDpzLoad(inModel,ckt,s) -GENmodel *inModel; - CKTcircuit *ckt; - SPcomplex *s; +B3SOIFDpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) { - B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; - B3SOIFDinstance *here; +B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; +B3SOIFDinstance *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; double GSoverlapCap, GDoverlapCap, GBoverlapCap; double FwdSum, RevSum, Gm, Gmbs; +double m; + for (; model != NULL; model = model->B3SOIFDnextModel) { for (here = model->B3SOIFDinstances; here!= NULL; here = here->B3SOIFDnextInstance) { - if (here->B3SOIFDmode >= 0) + + if (here->B3SOIFDowner != ARCHme) + continue; + + if (here->B3SOIFDmode >= 0) { Gm = here->B3SOIFDgm; Gmbs = here->B3SOIFDgmbs; FwdSum = Gm + Gmbs; @@ -93,56 +100,57 @@ double FwdSum, RevSum, Gm, Gmbs; xcbdb = (cbdb - capbd); xcbsb = (cbsb - capbs); + m = here->B3SOIFDm; - *(here->B3SOIFDGgPtr ) += xcggb * s->real; - *(here->B3SOIFDGgPtr +1) += xcggb * s->imag; - *(here->B3SOIFDBbPtr ) += (-xcbgb-xcbdb-xcbsb) * s->real; - *(here->B3SOIFDBbPtr +1) += (-xcbgb-xcbdb-xcbsb) * s->imag; - *(here->B3SOIFDDPdpPtr ) += xcddb * s->real; - *(here->B3SOIFDDPdpPtr +1) += xcddb * s->imag; - *(here->B3SOIFDSPspPtr ) += xcssb * s->real; - *(here->B3SOIFDSPspPtr +1) += xcssb * s->imag; - *(here->B3SOIFDGbPtr ) += (-xcggb-xcgdb-xcgsb) * s->real; - *(here->B3SOIFDGbPtr +1) += (-xcggb-xcgdb-xcgsb) * s->imag; - *(here->B3SOIFDGdpPtr ) += xcgdb * s->real; - *(here->B3SOIFDGdpPtr +1) += xcgdb * s->imag; - *(here->B3SOIFDGspPtr ) += xcgsb * s->real; - *(here->B3SOIFDGspPtr +1) += xcgsb * s->imag; - *(here->B3SOIFDBgPtr ) += xcbgb * s->real; - *(here->B3SOIFDBgPtr +1) += xcbgb * s->imag; - *(here->B3SOIFDBdpPtr ) += xcbdb * s->real; - *(here->B3SOIFDBdpPtr +1) += xcbdb * s->imag; - *(here->B3SOIFDBspPtr ) += xcbsb * s->real; - *(here->B3SOIFDBspPtr +1) += xcbsb * s->imag; - *(here->B3SOIFDDPgPtr ) += xcdgb * s->real; - *(here->B3SOIFDDPgPtr +1) += xcdgb * s->imag; - *(here->B3SOIFDDPbPtr ) += (-xcdgb-xcddb-xcdsb) * s->real; - *(here->B3SOIFDDPbPtr +1) += (-xcdgb-xcddb-xcdsb) * s->imag; - *(here->B3SOIFDDPspPtr ) += xcdsb * s->real; - *(here->B3SOIFDDPspPtr +1) += xcdsb * s->imag; - *(here->B3SOIFDSPgPtr ) += xcsgb * s->real; - *(here->B3SOIFDSPgPtr +1) += xcsgb * s->imag; - *(here->B3SOIFDSPbPtr ) += (-xcsgb-xcsdb-xcssb) * s->real; - *(here->B3SOIFDSPbPtr +1) += (-xcsgb-xcsdb-xcssb) * s->imag; - *(here->B3SOIFDSPdpPtr ) += xcsdb * s->real; - *(here->B3SOIFDSPdpPtr +1) += xcsdb * s->imag; - *(here->B3SOIFDDdPtr) += gdpr; - *(here->B3SOIFDSsPtr) += gspr; - *(here->B3SOIFDBbPtr) += gbd+gbs; - *(here->B3SOIFDDPdpPtr) += gdpr+gds+gbd+RevSum; - *(here->B3SOIFDSPspPtr) += gspr+gds+gbs+FwdSum; - *(here->B3SOIFDDdpPtr) -= gdpr; - *(here->B3SOIFDSspPtr) -= gspr; - *(here->B3SOIFDBdpPtr) -= gbd; - *(here->B3SOIFDBspPtr) -= gbs; - *(here->B3SOIFDDPdPtr) -= gdpr; - *(here->B3SOIFDDPgPtr) += Gm; - *(here->B3SOIFDDPbPtr) -= gbd - Gmbs; - *(here->B3SOIFDDPspPtr) -= gds + FwdSum; - *(here->B3SOIFDSPgPtr) -= Gm; - *(here->B3SOIFDSPsPtr) -= gspr; - *(here->B3SOIFDSPbPtr) -= gbs + Gmbs; - *(here->B3SOIFDSPdpPtr) -= gds + RevSum; + *(here->B3SOIFDGgPtr ) += m * (xcggb * s->real); + *(here->B3SOIFDGgPtr +1) += m * (xcggb * s->imag); + *(here->B3SOIFDBbPtr ) += m * ((-xcbgb-xcbdb-xcbsb) * s->real); + *(here->B3SOIFDBbPtr +1) += m * ((-xcbgb-xcbdb-xcbsb) * s->imag); + *(here->B3SOIFDDPdpPtr ) += m * (xcddb * s->real); + *(here->B3SOIFDDPdpPtr +1) += m * (xcddb * s->imag); + *(here->B3SOIFDSPspPtr ) += m * (xcssb * s->real); + *(here->B3SOIFDSPspPtr +1) += m * (xcssb * s->imag); + *(here->B3SOIFDGbPtr ) += m * ((-xcggb-xcgdb-xcgsb) * s->real); + *(here->B3SOIFDGbPtr +1) += m * ((-xcggb-xcgdb-xcgsb) * s->imag); + *(here->B3SOIFDGdpPtr ) += m * (xcgdb * s->real); + *(here->B3SOIFDGdpPtr +1) += m * (xcgdb * s->imag); + *(here->B3SOIFDGspPtr ) += m * (xcgsb * s->real); + *(here->B3SOIFDGspPtr +1) += m * (xcgsb * s->imag); + *(here->B3SOIFDBgPtr ) += m * (xcbgb * s->real); + *(here->B3SOIFDBgPtr +1) += m * (xcbgb * s->imag); + *(here->B3SOIFDBdpPtr ) += m * (xcbdb * s->real); + *(here->B3SOIFDBdpPtr +1) += m * (xcbdb * s->imag); + *(here->B3SOIFDBspPtr ) += m * (xcbsb * s->real); + *(here->B3SOIFDBspPtr +1) += m * (xcbsb * s->imag); + *(here->B3SOIFDDPgPtr ) += m * (xcdgb * s->real); + *(here->B3SOIFDDPgPtr +1) += m * (xcdgb * s->imag); + *(here->B3SOIFDDPbPtr ) += m * ((-xcdgb-xcddb-xcdsb) * s->real); + *(here->B3SOIFDDPbPtr +1) += m * ((-xcdgb-xcddb-xcdsb) * s->imag); + *(here->B3SOIFDDPspPtr ) += m * (xcdsb * s->real); + *(here->B3SOIFDDPspPtr +1) += m * (xcdsb * s->imag); + *(here->B3SOIFDSPgPtr ) += m * (xcsgb * s->real); + *(here->B3SOIFDSPgPtr +1) += m * (xcsgb * s->imag); + *(here->B3SOIFDSPbPtr ) += m * ((-xcsgb-xcsdb-xcssb) * s->real); + *(here->B3SOIFDSPbPtr +1) += m * ((-xcsgb-xcsdb-xcssb) * s->imag); + *(here->B3SOIFDSPdpPtr ) += m * (xcsdb * s->real); + *(here->B3SOIFDSPdpPtr +1) += m * (xcsdb * s->imag); + *(here->B3SOIFDDdPtr) += m * gdpr; + *(here->B3SOIFDSsPtr) += m * gspr; + *(here->B3SOIFDBbPtr) += m * (gbd + gbs); + *(here->B3SOIFDDPdpPtr) += m * (gdpr + gds + gbd + RevSum); + *(here->B3SOIFDSPspPtr) += m * (gspr + gds + gbs + FwdSum); + *(here->B3SOIFDDdpPtr) -= m * gdpr; + *(here->B3SOIFDSspPtr) -= m * gspr; + *(here->B3SOIFDBdpPtr) -= m * gbd; + *(here->B3SOIFDBspPtr) -= m * gbs; + *(here->B3SOIFDDPdPtr) -= m * gdpr; + *(here->B3SOIFDDPgPtr) += m * Gm; + *(here->B3SOIFDDPbPtr) -= m * (gbd - Gmbs); + *(here->B3SOIFDDPspPtr) -= m * (gds + FwdSum); + *(here->B3SOIFDSPgPtr) -= m * Gm; + *(here->B3SOIFDSPsPtr) -= m * gspr; + *(here->B3SOIFDSPbPtr) -= m * (gbs + Gmbs); + *(here->B3SOIFDSPdpPtr) -= m * (gds + RevSum); } } diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdset.c b/src/spicelib/devices/bsim3soi_fd/b3soifdset.c index 24343abb5..a7215b9c8 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdset.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdset.c @@ -4,12 +4,15 @@ Author: Weidong Liu and Pin Su Feb 1999 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soifdset.c 98/5/01 Modified by Pin Su, Wei Jin 99/9/27 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ #include "ngspice.h" -#include -#include #include "smpdefs.h" #include "cktdefs.h" #include "b3soifddef.h" @@ -28,14 +31,11 @@ Modified by Pin Su, Wei Jin 99/9/27 #define Meter2Micron 1.0e6 int -B3SOIFDsetup(matrix,inModel,ckt,states) - SMPmatrix *matrix; - GENmodel *inModel; - CKTcircuit *ckt; -int *states; +B3SOIFDsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, + int *states) { - B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; - B3SOIFDinstance *here; +B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; +B3SOIFDinstance *here; int error; CKTnode *tmp; @@ -43,6 +43,10 @@ double tmp1, tmp2; double nfb0, Cboxt; int itmp1; +CKTnode *tmpNode; +IFuid tmpName; + + /* loop through all the B3SOIFD device models */ for( ; model != NULL; model = model->B3SOIFDnextModel ) { @@ -874,10 +878,16 @@ int itmp1; /* loop through all the instances of the model */ for (here = model->B3SOIFDinstances; here != NULL ; here=here->B3SOIFDnextInstance) - { /* allocate a chunk of the state vector */ - here->B3SOIFDstates = *states; - *states += B3SOIFDnumStates; - /* perform the parameter defaulting */ + { + + if (here->B3SOIFDowner == ARCHme) + { + /* allocate a chunk of the state vector */ + here->B3SOIFDstates = *states; + *states += B3SOIFDnumStates; + } + + /* perform the parameter defaulting */ if (!here->B3SOIFDdrainAreaGiven) here->B3SOIFDdrainArea = 0.0; if (!here->B3SOIFDdrainPerimeterGiven) @@ -915,6 +925,9 @@ int itmp1; if (!here->B3SOIFDwGiven) here->B3SOIFDw = 5e-6; + if (!here->B3SOIFDmGiven) + here->B3SOIFDm = 1; + if (!here->B3SOIFDoffGiven) here->B3SOIFDoff = 0; @@ -926,6 +939,16 @@ int itmp1; { error = CKTmkVolt(ckt,&tmp,here->B3SOIFDname,"drain"); if(error) return(error); here->B3SOIFDdNodePrime = tmp->number; + + if (ckt->CKTcopyNodesets) { + if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } + } + } else { here->B3SOIFDdNodePrime = here->B3SOIFDdNode; @@ -938,6 +961,16 @@ int itmp1; { error = CKTmkVolt(ckt,&tmp,here->B3SOIFDname,"source"); if(error) return(error); here->B3SOIFDsNodePrime = tmp->number; + + if (ckt->CKTcopyNodesets) { + if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } + } + } else { here->B3SOIFDsNodePrime = here->B3SOIFDsNode; @@ -1307,11 +1340,8 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ } int -B3SOIFDunsetup(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +B3SOIFDunsetup(GENmodel *inModel, CKTcircuit *ckt) { -#ifndef HAS_BATCHSIM B3SOIFDmodel *model; B3SOIFDinstance *here; @@ -1335,7 +1365,6 @@ B3SOIFDunsetup(inModel,ckt) } } } -#endif return OK; } diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdtemp.c b/src/spicelib/devices/bsim3soi_fd/b3soifdtemp.c index e055ba8c1..642e52682 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdtemp.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdtemp.c @@ -3,13 +3,17 @@ Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soifdtemp.c 98/5/01 Modified by Pin Su, Wei Jin 99/9/27 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ + /* Lmin, Lmax, Wmin, Wmax */ #include "ngspice.h" -#include -#include #include "smpdefs.h" #include "cktdefs.h" #include "b3soifddef.h" @@ -30,12 +34,10 @@ Modified by Pin Su, Wei Jin 99/9/27 /* ARGSUSED */ int -B3SOIFDtemp(inModel,ckt) -GENmodel *inModel; -CKTcircuit *ckt; +B3SOIFDtemp(GENmodel *inModel, CKTcircuit *ckt) { - B3SOIFDmodel *model = (B3SOIFDmodel*) inModel; - B3SOIFDinstance *here; +B3SOIFDmodel *model = (B3SOIFDmodel*) inModel; +B3SOIFDinstance *here; struct b3soifdSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam; double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6, Ldrn, Wdrn; double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, Tnom; @@ -72,7 +74,11 @@ int Size_Not_Found; for (here = model->B3SOIFDinstances; here != NULL; here = here->B3SOIFDnextInstance) { - here->B3SOIFDrbodyext = here->B3SOIFDbodySquares * + + if (here->B3SOIFDowner != ARCHme) + continue; + + here->B3SOIFDrbodyext = here->B3SOIFDbodySquares * model->B3SOIFDrbsh; pSizeDependParamKnot = model->pSizeDependParamKnot; Size_Not_Found = 1; @@ -91,7 +97,7 @@ int Size_Not_Found; } if (Size_Not_Found) - { pParam = (struct b3soifdSizeDependParam *)malloc( + { pParam = (struct b3soifdSizeDependParam *)tmalloc( sizeof(struct b3soifdSizeDependParam)); if (pLastKnot == NULL) model->pSizeDependParamKnot = pParam; diff --git a/src/spicelib/devices/bsim3soi_fd/b3soifdtrunc.c b/src/spicelib/devices/bsim3soi_fd/b3soifdtrunc.c index a357f97e5..c53eb2bba 100644 --- a/src/spicelib/devices/bsim3soi_fd/b3soifdtrunc.c +++ b/src/spicelib/devices/bsim3soi_fd/b3soifdtrunc.c @@ -1,13 +1,16 @@ /********** Copyright 1999 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang +Modified by Paolo Nenzi 2002 File: b3soifdtrunc.c 98/5/01 **********/ +/* + * Revision 2.1 99/9/27 Pin Su + * BSIMFD2.1 release + */ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "b3soifddef.h" #include "sperror.h" @@ -15,13 +18,10 @@ File: b3soifdtrunc.c 98/5/01 int -B3SOIFDtrunc(inModel,ckt,timeStep) -GENmodel *inModel; - CKTcircuit *ckt; -double *timeStep; +B3SOIFDtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) { - B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; - B3SOIFDinstance *here; +B3SOIFDmodel *model = (B3SOIFDmodel*)inModel; +B3SOIFDinstance *here; #ifdef STEPDEBUG double debugtemp; @@ -31,6 +31,10 @@ double *timeStep; { for (here = model->B3SOIFDinstances; here != NULL; here = here->B3SOIFDnextInstance) { + + if (here->B3SOIFDowner != ARCHme) + continue; + #ifdef STEPDEBUG debugtemp = *timeStep; #endif /* STEPDEBUG */ diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipd.c b/src/spicelib/devices/bsim3soi_pd/b3soipd.c index 7fef7faa8..bf676d8d6 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipd.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipd.c @@ -6,725 +6,582 @@ Modified by Pin Su and Jan Feng 99/2/15 Modified by Pin Su 99/4/30 Modified by Wei Jin 99/9/27 Modified by Pin Su 00/3/1 +Modified by Pin Su 01/2/15 +Modified by Pin Su 02/3/5 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ #include "ngspice.h" -#include #include "devdefs.h" #include "b3soipddef.h" #include "suffix.h" -IFparm B3SOIPDpTable[] = { /* parameters */ - IOP ("l", B3SOIPD_L, IF_REAL, "Length"), - IOP ("w", B3SOIPD_W, IF_REAL, "Width"), - IOP ("ad", B3SOIPD_AD, IF_REAL, "Drain area"), - IOP ("as", B3SOIPD_AS, IF_REAL, "Source area"), - IOP ("pd", B3SOIPD_PD, IF_REAL, "Drain perimeter"), - IOP ("ps", B3SOIPD_PS, IF_REAL, "Source perimeter"), - IOP ("nrd", B3SOIPD_NRD, IF_REAL, "Number of squares in drain"), - IOP ("nrs", B3SOIPD_NRS, IF_REAL, "Number of squares in source"), - IOP ("off", B3SOIPD_OFF, IF_FLAG, "Device is initially off"), - IP ("ic", B3SOIPD_IC, IF_REALVEC, "Vector of DS,GS,BS initial voltages"), - OP ("gmbs", B3SOIPD_GMBS, IF_REAL, "Gmb"), - OP ("gm", B3SOIPD_GM, IF_REAL, "Gm"), - OP ("gm/ids", B3SOIPD_GMID, IF_REAL, "Gm/Ids"), - OP ("gds", B3SOIPD_GDS, IF_REAL, "Gds"), - OP ("vdsat", B3SOIPD_VDSAT, IF_REAL, "Vdsat"), - OP ("vth", B3SOIPD_VON, IF_REAL, "Vth"), - OP ("ids", B3SOIPD_CD, IF_REAL, "Ids"), - OP ("vbs", B3SOIPD_VBS, IF_REAL, "Vbs"), - OP ("vgs", B3SOIPD_VGS, IF_REAL, "Vgs"), - OP ("vds", B3SOIPD_VDS, IF_REAL, "Vds"), - OP ("ves", B3SOIPD_VES, IF_REAL, "Ves"), - IOP ("bjtoff", B3SOIPD_BJTOFF, IF_INTEGER, "BJT on/off flag"), - IOP ("debug", B3SOIPD_DEBUG, IF_INTEGER, "BJT on/off flag"), - IOP ("rth0", B3SOIPD_RTH0, IF_REAL, "Instance Thermal Resistance"), - IOP ("cth0", B3SOIPD_CTH0, IF_REAL, "Instance Thermal Capacitance"), - IOP ("nrb", B3SOIPD_NRB, IF_REAL, "Number of squares in body"), +IFparm B3SOIPDpTable[] = { /* parameters */ +IOP( "l", B3SOIPD_L, IF_REAL , "Length"), +IOP( "w", B3SOIPD_W, IF_REAL , "Width"), +IOP( "m", B3SOIPD_M, IF_REAL , "Parallel Multiplier"), +IOP( "ad", B3SOIPD_AD, IF_REAL , "Drain area"), +IOP( "as", B3SOIPD_AS, IF_REAL , "Source area"), +IOP( "pd", B3SOIPD_PD, IF_REAL , "Drain perimeter"), +IOP( "ps", B3SOIPD_PS, IF_REAL , "Source perimeter"), +IOP( "nrd", B3SOIPD_NRD, IF_REAL , "Number of squares in drain"), +IOP( "nrs", B3SOIPD_NRS, IF_REAL , "Number of squares in source"), +IOP( "off", B3SOIPD_OFF, IF_FLAG , "Device is initially off"), +IP( "ic", B3SOIPD_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), +OP( "gmbs", B3SOIPD_GMBS, IF_REAL, "Gmb"), +OP( "gm", B3SOIPD_GM, IF_REAL, "Gm"), +OP( "gm/ids", B3SOIPD_GMID, IF_REAL, "Gm/Ids"), +OP( "gds", B3SOIPD_GDS, IF_REAL, "Gds"), +OP( "vdsat", B3SOIPD_VDSAT, IF_REAL, "Vdsat"), +OP( "vth", B3SOIPD_VON, IF_REAL, "Vth"), +OP( "ids", B3SOIPD_CD, IF_REAL, "Ids"), +OP( "vbs", B3SOIPD_VBS, IF_REAL, "Vbs"), +OP( "vgs", B3SOIPD_VGS, IF_REAL, "Vgs"), +OP( "vds", B3SOIPD_VDS, IF_REAL, "Vds"), +OP( "ves", B3SOIPD_VES, IF_REAL, "Ves"), +IOP( "bjtoff", B3SOIPD_BJTOFF, IF_INTEGER, "BJT on/off flag"), +IOP( "debug", B3SOIPD_DEBUG, IF_INTEGER, "BJT on/off flag"), +IOP( "rth0", B3SOIPD_RTH0, IF_REAL, "Instance Thermal Resistance"), +IOP( "cth0", B3SOIPD_CTH0, IF_REAL, "Instance Thermal Capacitance"), +IOP( "nrb", B3SOIPD_NRB, IF_REAL, "Number of squares in body"), +IOP( "frbody", B3SOIPD_FRBODY, IF_REAL, "layout dependent body-resistance coefficient"), /* v2.0 release */ - IOP ("nbc", B3SOIPD_NBC, IF_REAL, "Number of body contact isolation edge"), - IOP ("nseg", B3SOIPD_NSEG, IF_REAL, - "Number segments for width partitioning"), - IOP ("pdbcp", B3SOIPD_PDBCP, IF_REAL, - "Perimeter length for bc parasitics at drain side"), - IOP ("psbcp", B3SOIPD_PSBCP, IF_REAL, - "Perimeter length for bc parasitics at source side"), - IOP ("agbcp", B3SOIPD_AGBCP, IF_REAL, - "Gate to body overlap area for bc parasitics"), - IOP ("aebcp", B3SOIPD_AEBCP, IF_REAL, - "Substrate to body overlap area for bc prasitics"), - IOP ("vbsusr", B3SOIPD_VBSUSR, IF_REAL, "Vbs specified by user"), - IOP ("tnodeout", B3SOIPD_TNODEOUT, IF_FLAG, - "Flag indicating external temp node") +IOP( "nbc", B3SOIPD_NBC, IF_REAL, "Number of body contact isolation edge"), +IOP( "nseg", B3SOIPD_NSEG, IF_REAL, "Number segments for width partitioning"), +IOP( "pdbcp", B3SOIPD_PDBCP, IF_REAL, "Perimeter length for bc parasitics at drain side"), +IOP( "psbcp", B3SOIPD_PSBCP, IF_REAL, "Perimeter length for bc parasitics at source side"), +IOP( "agbcp", B3SOIPD_AGBCP, IF_REAL, "Gate to body overlap area for bc parasitics"), +IOP( "aebcp", B3SOIPD_AEBCP, IF_REAL, "Substrate to body overlap area for bc prasitics"), +IOP( "vbsusr", B3SOIPD_VBSUSR, IF_REAL, "Vbs specified by user"), +IOP( "tnodeout", B3SOIPD_TNODEOUT, IF_FLAG, "Flag indicating external temp node") + }; -IFparm B3SOIPDmPTable[] = { /* model parameters */ - IOP ("capmod", B3SOIPD_MOD_CAPMOD, IF_INTEGER, - "Capacitance model selector"), - IOP ("mobmod", B3SOIPD_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), - IOP ("noimod", B3SOIPD_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), - IOP ("paramchk", B3SOIPD_MOD_PARAMCHK, IF_INTEGER, - "Model parameter checking selector"), - IOP ("binunit", B3SOIPD_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), - IOP ("version", B3SOIPD_MOD_VERSION, IF_REAL, - " parameter for model version"), - IOP ("tox", B3SOIPD_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), - - IOP ("cdsc", B3SOIPD_MOD_CDSC, IF_REAL, - "Drain/Source and channel coupling capacitance"), - IOP ("cdscb", B3SOIPD_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), - IOP ("cdscd", B3SOIPD_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), - IOP ("cit", B3SOIPD_MOD_CIT, IF_REAL, "Interface state capacitance"), - IOP ("nfactor", B3SOIPD_MOD_NFACTOR, IF_REAL, - "Subthreshold swing Coefficient"), - IOP ("vsat", B3SOIPD_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), - IOP ("at", B3SOIPD_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), - IOP ("a0", B3SOIPD_MOD_A0, IF_REAL, - "Non-uniform depletion width effect coefficient."), - IOP ("ags", B3SOIPD_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), - IOP ("a1", B3SOIPD_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), - IOP ("a2", B3SOIPD_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), - IOP ("keta", B3SOIPD_MOD_KETA, IF_REAL, - "Body-bias coefficient of non-uniform depletion width effect."), - IOP ("nsub", B3SOIPD_MOD_NSUB, IF_REAL, - "Substrate doping concentration with polarity"), - IOP ("nch", B3SOIPD_MOD_NPEAK, IF_REAL, "Channel doping concentration"), - IOP ("ngate", B3SOIPD_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), - IOP ("gamma1", B3SOIPD_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), - IOP ("gamma2", B3SOIPD_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), - IOP ("vbx", B3SOIPD_MOD_VBX, IF_REAL, "Vth transition body Voltage"), - IOP ("vbm", B3SOIPD_MOD_VBM, IF_REAL, "Maximum body voltage"), - - IOP ("xt", B3SOIPD_MOD_XT, IF_REAL, "Doping depth"), - IOP ("k1", B3SOIPD_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), - IOP ("kt1", B3SOIPD_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), - IOP ("kt1l", B3SOIPD_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), - IOP ("kt2", B3SOIPD_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), - IOP ("k2", B3SOIPD_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), - IOP ("k3", B3SOIPD_MOD_K3, IF_REAL, "Narrow width effect coefficient"), - IOP ("k3b", B3SOIPD_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), - IOP ("w0", B3SOIPD_MOD_W0, IF_REAL, "Narrow width effect parameter"), - IOP ("nlx", B3SOIPD_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"), - IOP ("dvt0", B3SOIPD_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), - IOP ("dvt1", B3SOIPD_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), - IOP ("dvt2", B3SOIPD_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), - IOP ("dvt0w", B3SOIPD_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), - IOP ("dvt1w", B3SOIPD_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), - IOP ("dvt2w", B3SOIPD_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), - IOP ("drout", B3SOIPD_MOD_DROUT, IF_REAL, - "DIBL coefficient of output resistance"), - IOP ("dsub", B3SOIPD_MOD_DSUB, IF_REAL, - "DIBL coefficient in the subthreshold region"), - IOP ("vth0", B3SOIPD_MOD_VTH0, IF_REAL, "Threshold voltage"), - IOP ("vtho", B3SOIPD_MOD_VTH0, IF_REAL, "Threshold voltage"), - IOP ("ua", B3SOIPD_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), - IOP ("ua1", B3SOIPD_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), - IOP ("ub", B3SOIPD_MOD_UB, IF_REAL, - "Quadratic gate dependence of mobility"), - IOP ("ub1", B3SOIPD_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), - IOP ("uc", B3SOIPD_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), - IOP ("uc1", B3SOIPD_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), - IOP ("u0", B3SOIPD_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), - IOP ("ute", B3SOIPD_MOD_UTE, IF_REAL, - "Temperature coefficient of mobility"), - IOP ("voff", B3SOIPD_MOD_VOFF, IF_REAL, "Threshold voltage offset"), - IOP ("tnom", B3SOIPD_MOD_TNOM, IF_REAL, - "Parameter measurement temperature"), - IOP ("cgso", B3SOIPD_MOD_CGSO, IF_REAL, - "Gate-source overlap capacitance per width"), - IOP ("cgdo", B3SOIPD_MOD_CGDO, IF_REAL, - "Gate-drain overlap capacitance per width"), - IOP ("xpart", B3SOIPD_MOD_XPART, IF_REAL, "Channel charge partitioning"), - IOP ("delta", B3SOIPD_MOD_DELTA, IF_REAL, "Effective Vds parameter"), - IOP ("rsh", B3SOIPD_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), - IOP ("rdsw", B3SOIPD_MOD_RDSW, IF_REAL, - "Source-drain resistance per width"), - - IOP ("prwg", B3SOIPD_MOD_PRWG, IF_REAL, - "Gate-bias effect on parasitic resistance "), - IOP ("prwb", B3SOIPD_MOD_PRWB, IF_REAL, - "Body-effect on parasitic resistance "), - - IOP ("prt", B3SOIPD_MOD_PRT, IF_REAL, - "Temperature coefficient of parasitic resistance "), - IOP ("eta0", B3SOIPD_MOD_ETA0, IF_REAL, - "Subthreshold region DIBL coefficient"), - IOP ("etab", B3SOIPD_MOD_ETAB, IF_REAL, - "Subthreshold region DIBL coefficient"), - IOP ("pclm", B3SOIPD_MOD_PCLM, IF_REAL, - "Channel length modulation Coefficient"), - IOP ("pdiblc1", B3SOIPD_MOD_PDIBL1, IF_REAL, - "Drain-induced barrier lowering coefficient"), - IOP ("pdiblc2", B3SOIPD_MOD_PDIBL2, IF_REAL, - "Drain-induced barrier lowering coefficient"), - IOP ("pdiblcb", B3SOIPD_MOD_PDIBLB, IF_REAL, - "Body-effect on drain-induced barrier lowering"), - - IOP ("pvag", B3SOIPD_MOD_PVAG, IF_REAL, - "Gate dependence of output resistance parameter"), - - IOP ("shmod", B3SOIPD_MOD_SHMOD, IF_INTEGER, "Self heating mode selector"), - IOP ("ddmod", B3SOIPD_MOD_DDMOD, IF_INTEGER, - "Dynamic depletion mode selector"), - IOP ("tbox", B3SOIPD_MOD_TBOX, IF_REAL, - "Back gate oxide thickness in meters"), - IOP ("tsi", B3SOIPD_MOD_TSI, IF_REAL, - "Silicon-on-insulator thickness in meters"), - IOP ("xj", B3SOIPD_MOD_XJ, IF_REAL, "Junction Depth"), - IOP ("rth0", B3SOIPD_MOD_RTH0, IF_REAL, "Self-heating thermal resistance"), - IOP ("cth0", B3SOIPD_MOD_CTH0, IF_REAL, "Self-heating thermal capacitance"), - IOP ("ngidl", B3SOIPD_MOD_NGIDL, IF_REAL, "GIDL first parameter"), - IOP ("agidl", B3SOIPD_MOD_AGIDL, IF_REAL, "GIDL second parameter"), - IOP ("bgidl", B3SOIPD_MOD_BGIDL, IF_REAL, "GIDL third parameter"), - IOP ("ndiode", B3SOIPD_MOD_NDIODE, IF_REAL, "Diode non-ideality factor"), - IOP ("xbjt", B3SOIPD_MOD_XBJT, IF_REAL, - "Temperature coefficient for Isbjt"), - - IOP ("xdif", B3SOIPD_MOD_XDIF, IF_REAL, - "Temperature coefficient for Isdif"), - - IOP ("xrec", B3SOIPD_MOD_XREC, IF_REAL, - "Temperature coefficient for Isrec"), - IOP ("xtun", B3SOIPD_MOD_XTUN, IF_REAL, - "Temperature coefficient for Istun"), - - IOP ("pbswg", B3SOIPD_MOD_PBSWG, IF_REAL, - "Source/drain (gate side) sidewall junction capacitance built in potential"), - IOP ("mjswg", B3SOIPD_MOD_MJSWG, IF_REAL, - "Source/drain (gate side) sidewall junction capacitance grading coefficient"), - - IOP ("cjswg", B3SOIPD_MOD_CJSWG, IF_REAL, - "Source/drain (gate side) sidewall junction capacitance per unit width"), - IOP ("lint", B3SOIPD_MOD_LINT, IF_REAL, "Length reduction parameter"), - IOP ("ll", B3SOIPD_MOD_LL, IF_REAL, "Length reduction parameter"), - IOP ("lln", B3SOIPD_MOD_LLN, IF_REAL, "Length reduction parameter"), - IOP ("lw", B3SOIPD_MOD_LW, IF_REAL, "Length reduction parameter"), - IOP ("lwn", B3SOIPD_MOD_LWN, IF_REAL, "Length reduction parameter"), - IOP ("lwl", B3SOIPD_MOD_LWL, IF_REAL, "Length reduction parameter"), - - IOP ("wr", B3SOIPD_MOD_WR, IF_REAL, "Width dependence of rds"), - IOP ("wint", B3SOIPD_MOD_WINT, IF_REAL, "Width reduction parameter"), - IOP ("dwg", B3SOIPD_MOD_DWG, IF_REAL, "Width reduction parameter"), - IOP ("dwb", B3SOIPD_MOD_DWB, IF_REAL, "Width reduction parameter"), - - IOP ("wl", B3SOIPD_MOD_WL, IF_REAL, "Width reduction parameter"), - IOP ("wln", B3SOIPD_MOD_WLN, IF_REAL, "Width reduction parameter"), - IOP ("ww", B3SOIPD_MOD_WW, IF_REAL, "Width reduction parameter"), - IOP ("wwn", B3SOIPD_MOD_WWN, IF_REAL, "Width reduction parameter"), - IOP ("wwl", B3SOIPD_MOD_WWL, IF_REAL, "Width reduction parameter"), - - IOP ("b0", B3SOIPD_MOD_B0, IF_REAL, "Abulk narrow width parameter"), - IOP ("b1", B3SOIPD_MOD_B1, IF_REAL, "Abulk narrow width parameter"), - - IOP ("cgsl", B3SOIPD_MOD_CGSL, IF_REAL, "New C-V model parameter"), - IOP ("cgdl", B3SOIPD_MOD_CGDL, IF_REAL, "New C-V model parameter"), - IOP ("ckappa", B3SOIPD_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), - IOP ("cf", B3SOIPD_MOD_CF, IF_REAL, "Fringe capacitance parameter"), - IOP ("clc", B3SOIPD_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), - IOP ("cle", B3SOIPD_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), - IOP ("dwc", B3SOIPD_MOD_DWC, IF_REAL, "Delta W for C-V model"), - IOP ("dlc", B3SOIPD_MOD_DLC, IF_REAL, "Delta L for C-V model"), - - IOP ("alpha0", B3SOIPD_MOD_ALPHA0, IF_REAL, - "substrate current model parameter"), - - IOP ("noia", B3SOIPD_MOD_NOIA, IF_REAL, "Flicker noise parameter"), - IOP ("noib", B3SOIPD_MOD_NOIB, IF_REAL, "Flicker noise parameter"), - IOP ("noic", B3SOIPD_MOD_NOIC, IF_REAL, "Flicker noise parameter"), - IOP ("em", B3SOIPD_MOD_EM, IF_REAL, "Flicker noise parameter"), - IOP ("ef", B3SOIPD_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), - IOP ("af", B3SOIPD_MOD_AF, IF_REAL, "Flicker noise exponent"), - IOP ("kf", B3SOIPD_MOD_KF, IF_REAL, "Flicker noise coefficient"), - IOP ("noif", B3SOIPD_MOD_NOIF, IF_REAL, - "Floating body excess noise ideality factor"), +IFparm B3SOIPDmPTable[] = { /* model parameters */ +IOP( "capmod", B3SOIPD_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), +IOP( "mobmod", B3SOIPD_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), +IOP( "noimod", B3SOIPD_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), +IOP( "paramchk", B3SOIPD_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), +IOP( "binunit", B3SOIPD_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), +IOP( "version", B3SOIPD_MOD_VERSION, IF_REAL, " parameter for model version"), +IOP( "tox", B3SOIPD_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), +IOP( "dtoxcv", B3SOIPD_MOD_DTOXCV, IF_REAL, "Delta oxide thickness in meters in CapMod3"), /* v2.2.3 */ + +IOP( "cdsc", B3SOIPD_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), +IOP( "cdscb", B3SOIPD_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), +IOP( "cdscd", B3SOIPD_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), +IOP( "cit", B3SOIPD_MOD_CIT, IF_REAL, "Interface state capacitance"), +IOP( "nfactor", B3SOIPD_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), +IOP( "vsat", B3SOIPD_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), +IOP( "at", B3SOIPD_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), +IOP( "a0", B3SOIPD_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), +IOP( "ags", B3SOIPD_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), +IOP( "a1", B3SOIPD_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), +IOP( "a2", B3SOIPD_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), +IOP( "keta", B3SOIPD_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), +IOP( "nsub", B3SOIPD_MOD_NSUB, IF_REAL, "Substrate doping concentration with polarity"), +IOP( "nch", B3SOIPD_MOD_NPEAK, IF_REAL, "Channel doping concentration"), +IOP( "ngate", B3SOIPD_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), +IOP( "gamma1", B3SOIPD_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), +IOP( "gamma2", B3SOIPD_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), +IOP( "vbx", B3SOIPD_MOD_VBX, IF_REAL, "Vth transition body Voltage"), +IOP( "vbm", B3SOIPD_MOD_VBM, IF_REAL, "Maximum body voltage"), + +IOP( "xt", B3SOIPD_MOD_XT, IF_REAL, "Doping depth"), +IOP( "k1", B3SOIPD_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), +IOP( "kt1", B3SOIPD_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), +IOP( "kt1l", B3SOIPD_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), +IOP( "kt2", B3SOIPD_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), +IOP( "k2", B3SOIPD_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), +IOP( "k3", B3SOIPD_MOD_K3, IF_REAL, "Narrow width effect coefficient"), +IOP( "k3b", B3SOIPD_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), +IOP( "w0", B3SOIPD_MOD_W0, IF_REAL, "Narrow width effect parameter"), +IOP( "nlx", B3SOIPD_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"), +IOP( "dvt0", B3SOIPD_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), +IOP( "dvt1", B3SOIPD_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), +IOP( "dvt2", B3SOIPD_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), +IOP( "dvt0w", B3SOIPD_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), +IOP( "dvt1w", B3SOIPD_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), +IOP( "dvt2w", B3SOIPD_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), +IOP( "drout", B3SOIPD_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), +IOP( "dsub", B3SOIPD_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), +IOP( "vth0", B3SOIPD_MOD_VTH0, IF_REAL,"Threshold voltage"), +IOP( "vtho", B3SOIPD_MOD_VTH0, IF_REAL,"Threshold voltage"), +IOP( "ua", B3SOIPD_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), +IOP( "ua1", B3SOIPD_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), +IOP( "ub", B3SOIPD_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), +IOP( "ub1", B3SOIPD_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), +IOP( "uc", B3SOIPD_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), +IOP( "uc1", B3SOIPD_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), +IOP( "u0", B3SOIPD_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), +IOP( "ute", B3SOIPD_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), +IOP( "voff", B3SOIPD_MOD_VOFF, IF_REAL, "Threshold voltage offset"), +IOP( "tnom", B3SOIPD_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), +IOP( "cgso", B3SOIPD_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), +IOP( "cgdo", B3SOIPD_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), +IOP( "xpart", B3SOIPD_MOD_XPART, IF_REAL, "Channel charge partitioning"), +IOP( "delta", B3SOIPD_MOD_DELTA, IF_REAL, "Effective Vds parameter"), +IOP( "rsh", B3SOIPD_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), +IOP( "rdsw", B3SOIPD_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), + +IOP( "prwg", B3SOIPD_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), +IOP( "prwb", B3SOIPD_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), + +IOP( "prt", B3SOIPD_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), +IOP( "eta0", B3SOIPD_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), +IOP( "etab", B3SOIPD_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), +IOP( "pclm", B3SOIPD_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), +IOP( "pdiblc1", B3SOIPD_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), +IOP( "pdiblc2", B3SOIPD_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), +IOP( "pdiblcb", B3SOIPD_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), + +IOP( "pvag", B3SOIPD_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), + +IOP( "shmod", B3SOIPD_MOD_SHMOD, IF_INTEGER, "Self heating mode selector"), +IOP( "ddmod", B3SOIPD_MOD_DDMOD, IF_INTEGER, "Dynamic depletion mode selector"), +IOP( "tbox", B3SOIPD_MOD_TBOX, IF_REAL, "Back gate oxide thickness in meters"), +IOP( "tsi", B3SOIPD_MOD_TSI, IF_REAL, "Silicon-on-insulator thickness in meters"), +IOP( "xj", B3SOIPD_MOD_XJ, IF_REAL, "Junction Depth"), +IOP( "rth0", B3SOIPD_MOD_RTH0, IF_REAL, "Self-heating thermal resistance"), +IOP( "cth0", B3SOIPD_MOD_CTH0, IF_REAL, "Self-heating thermal capacitance"), +IOP( "ngidl", B3SOIPD_MOD_NGIDL, IF_REAL, "GIDL first parameter"), +IOP( "agidl", B3SOIPD_MOD_AGIDL, IF_REAL, "GIDL second parameter"), +IOP( "bgidl", B3SOIPD_MOD_BGIDL, IF_REAL, "GIDL third parameter"), +IOP( "ndiode", B3SOIPD_MOD_NDIODE, IF_REAL, "Diode non-ideality factor"), +IOP( "xbjt", B3SOIPD_MOD_XBJT, IF_REAL, "Temperature coefficient for Isbjt"), + +IOP( "xdif", B3SOIPD_MOD_XDIF, IF_REAL, "Temperature coefficient for Isdif"), + +IOP( "xrec", B3SOIPD_MOD_XREC, IF_REAL, "Temperature coefficient for Isrec"), +IOP( "xtun", B3SOIPD_MOD_XTUN, IF_REAL, "Temperature coefficient for Istun"), + +IOP( "pbswg", B3SOIPD_MOD_PBSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance built in potential"), +IOP( "mjswg", B3SOIPD_MOD_MJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance grading coefficient"), + +IOP( "cjswg", B3SOIPD_MOD_CJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance per unit width"), +IOP( "lint", B3SOIPD_MOD_LINT, IF_REAL, "Length reduction parameter"), +IOP( "ll", B3SOIPD_MOD_LL, IF_REAL, "Length reduction parameter"), +IOP( "llc", B3SOIPD_MOD_LLC, IF_REAL, "Length reduction parameter"), /* v2.2.3 */ +IOP( "lln", B3SOIPD_MOD_LLN, IF_REAL, "Length reduction parameter"), +IOP( "lw", B3SOIPD_MOD_LW, IF_REAL, "Length reduction parameter"), +IOP( "lwc", B3SOIPD_MOD_LWC, IF_REAL, "Length reduction parameter"), /* v2.2.3 */ +IOP( "lwn", B3SOIPD_MOD_LWN, IF_REAL, "Length reduction parameter"), +IOP( "lwl", B3SOIPD_MOD_LWL, IF_REAL, "Length reduction parameter"), +IOP( "lwlc", B3SOIPD_MOD_LWLC, IF_REAL, "Length reduction parameter"), /* v2.2.3 */ + +IOP( "wr", B3SOIPD_MOD_WR, IF_REAL, "Width dependence of rds"), +IOP( "wint", B3SOIPD_MOD_WINT, IF_REAL, "Width reduction parameter"), +IOP( "dwg", B3SOIPD_MOD_DWG, IF_REAL, "Width reduction parameter"), +IOP( "dwb", B3SOIPD_MOD_DWB, IF_REAL, "Width reduction parameter"), + +IOP( "wl", B3SOIPD_MOD_WL, IF_REAL, "Width reduction parameter"), +IOP( "wlc", B3SOIPD_MOD_WLC, IF_REAL, "Width reduction parameter"), /* v2.2.3 */ +IOP( "wln", B3SOIPD_MOD_WLN, IF_REAL, "Width reduction parameter"), +IOP( "ww", B3SOIPD_MOD_WW, IF_REAL, "Width reduction parameter"), +IOP( "wwc", B3SOIPD_MOD_WWC, IF_REAL, "Width reduction parameter"), /* v2.2.3 */ +IOP( "wwn", B3SOIPD_MOD_WWN, IF_REAL, "Width reduction parameter"), +IOP( "wwl", B3SOIPD_MOD_WWL, IF_REAL, "Width reduction parameter"), +IOP( "wwlc", B3SOIPD_MOD_WWLC, IF_REAL, "Width reduction parameter"), /* v2.2.3 */ + +IOP( "b0", B3SOIPD_MOD_B0, IF_REAL, "Abulk narrow width parameter"), +IOP( "b1", B3SOIPD_MOD_B1, IF_REAL, "Abulk narrow width parameter"), + +IOP( "cgsl", B3SOIPD_MOD_CGSL, IF_REAL, "New C-V model parameter"), +IOP( "cgdl", B3SOIPD_MOD_CGDL, IF_REAL, "New C-V model parameter"), +IOP( "ckappa", B3SOIPD_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), +IOP( "cf", B3SOIPD_MOD_CF, IF_REAL, "Fringe capacitance parameter"), +IOP( "clc", B3SOIPD_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), +IOP( "cle", B3SOIPD_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), +IOP( "dwc", B3SOIPD_MOD_DWC, IF_REAL, "Delta W for C-V model"), +IOP( "dlc", B3SOIPD_MOD_DLC, IF_REAL, "Delta L for C-V model"), + +IOP( "alpha0", B3SOIPD_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), + +IOP( "noia", B3SOIPD_MOD_NOIA, IF_REAL, "Flicker noise parameter"), +IOP( "noib", B3SOIPD_MOD_NOIB, IF_REAL, "Flicker noise parameter"), +IOP( "noic", B3SOIPD_MOD_NOIC, IF_REAL, "Flicker noise parameter"), +IOP( "em", B3SOIPD_MOD_EM, IF_REAL, "Flicker noise parameter"), +IOP( "ef", B3SOIPD_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), +IOP( "af", B3SOIPD_MOD_AF, IF_REAL, "Flicker noise exponent"), +IOP( "kf", B3SOIPD_MOD_KF, IF_REAL, "Flicker noise coefficient"), +IOP( "noif", B3SOIPD_MOD_NOIF, IF_REAL, "Floating body excess noise ideality factor"), /* v2.0 release */ - IOP ("k1w1", B3SOIPD_MOD_K1W1, IF_REAL, - "First Body effect width dependent parameter"), - IOP ("k1w2", B3SOIPD_MOD_K1W2, IF_REAL, - "Second Boby effect width dependent parameter"), - IOP ("ketas", B3SOIPD_MOD_KETAS, IF_REAL, - "Surface potential adjustment for bulk charge effect"), - IOP ("dwbc", B3SOIPD_MOD_DWBC, IF_REAL, - "Width offset for body contact isolation edge"), - IOP ("beta0", B3SOIPD_MOD_BETA0, IF_REAL, - "First Vds dependent parameter of impact ionizition current"), - IOP ("beta1", B3SOIPD_MOD_BETA1, IF_REAL, - "Second Vds dependent parameter of impact ionizition current"), - IOP ("beta2", B3SOIPD_MOD_BETA2, IF_REAL, - "Third Vds dependent parameter of impact ionizition current"), - IOP ("vdsatii0", B3SOIPD_MOD_VDSATII0, IF_REAL, - "Nominal drain saturation voltage at threshold for impact ionizition current"), - IOP ("tii", B3SOIPD_MOD_TII, IF_REAL, - "Temperature dependent parameter for impact ionizition"), - IOP ("lii", B3SOIPD_MOD_LII, IF_REAL, - "Channel length dependent parameter at threshold for impact ionizition current"), - IOP ("sii0", B3SOIPD_MOD_SII0, IF_REAL, - "First Vgs dependent parameter for impact ionizition current"), - IOP ("sii1", B3SOIPD_MOD_SII1, IF_REAL, - "Second Vgs dependent parameter for impact ionizition current"), - IOP ("sii2", B3SOIPD_MOD_SII2, IF_REAL, - "Third Vgs dependent parameter for impact ionizition current"), - IOP ("siid", B3SOIPD_MOD_SIID, IF_REAL, - "Vds dependent parameter of drain saturation voltage for impact ionizition current"), - IOP ("fbjtii", B3SOIPD_MOD_FBJTII, IF_REAL, - "Fraction of bipolar current affecting the impact ionization"), - IOP ("esatii", B3SOIPD_MOD_ESATII, IF_REAL, - "Saturation electric field for impact ionization"), - IOP ("ntun", B3SOIPD_MOD_NTUN, IF_REAL, - "Reverse tunneling non-ideality factor"), - IOP ("nrecf0", B3SOIPD_MOD_NRECF0, IF_REAL, - "Recombination non-ideality factor at forward bias"), - IOP ("nrecr0", B3SOIPD_MOD_NRECR0, IF_REAL, - "Recombination non-ideality factor at reversed bias"), - IOP ("isbjt", B3SOIPD_MOD_ISBJT, IF_REAL, - "BJT injection saturation current"), - IOP ("isdif", B3SOIPD_MOD_ISDIF, IF_REAL, - "Body to source/drain injection saturation current"), - IOP ("isrec", B3SOIPD_MOD_ISREC, IF_REAL, - "Recombination in depletion saturation current"), - IOP ("istun", B3SOIPD_MOD_ISTUN, IF_REAL, - "Reverse tunneling saturation current"), - IOP ("ln", B3SOIPD_MOD_LN, IF_REAL, "Electron/hole diffusion length"), - IOP ("vrec0", B3SOIPD_MOD_VREC0, IF_REAL, - "Voltage dependent parameter for recombination current"), - IOP ("vtun0", B3SOIPD_MOD_VTUN0, IF_REAL, - "Voltage dependent parameter for tunneling current"), - IOP ("nbjt", B3SOIPD_MOD_NBJT, IF_REAL, - "Power coefficient of channel length dependency for bipolar current"), - IOP ("lbjt0", B3SOIPD_MOD_LBJT0, IF_REAL, - "Refferenc channel length for bipolar cuurent"), - IOP ("ldif0", B3SOIPD_MOD_LDIF0, IF_REAL, - "Channel-length dependency coefficient of diffusion cap"), - IOP ("vabjt", B3SOIPD_MOD_VABJT, IF_REAL, - "Early voltage for bipolar current"), - IOP ("aely", B3SOIPD_MOD_AELY, IF_REAL, - "Channel length dependency of early voltage for bipolar cuurent"), - IOP ("ahli", B3SOIPD_MOD_AHLI, IF_REAL, - "High level injection parameter for bipolar current"), - IOP ("rbody", B3SOIPD_MOD_RBODY, IF_REAL, - "Intrinsic body contact sheet resistance"), - IOP ("rbsh", B3SOIPD_MOD_RBSH, IF_REAL, - "Extrinsic body contact sheet resistance"), - IOP ("cgeo", B3SOIPD_MOD_CGEO, IF_REAL, - "Gate substrate overlap capacitance per unit channel length"), - IOP ("tt", B3SOIPD_MOD_TT, IF_REAL, - "Diffusion capacitance transit time coefficient"), - IOP ("ndif", B3SOIPD_MOD_NDIF, IF_REAL, - "Power coefficient of channel length dependency for diffusion capacitance"), - IOP ("vsdfb", B3SOIPD_MOD_VSDFB, IF_REAL, - "Source/drain bottom diffusion capacitance flatband voltage"), - IOP ("vsdth", B3SOIPD_MOD_VSDTH, IF_REAL, - "Source/drain bottom diffusion capacitance threshold voltage"), - IOP ("csdmin", B3SOIPD_MOD_CSDMIN, IF_REAL, - "Source/drain bottom diffusion minimum capacitance"), - IOP ("asd", B3SOIPD_MOD_ASD, IF_REAL, - "Source/drain bottom diffusion smoothing parameter"), - IOP ("csdesw", B3SOIPD_MOD_CSDESW, IF_REAL, - "Source/drain sidewall fringing capacitance per unit length"), - IOP ("ntrecf", B3SOIPD_MOD_NTRECF, IF_REAL, - "Temperature coefficient for Nrecf"), - IOP ("ntrecr", B3SOIPD_MOD_NTRECR, IF_REAL, - "Temperature coefficient for Nrecr"), - IOP ("dlcb", B3SOIPD_MOD_DLCB, IF_REAL, - "Length offset fitting parameter for body charge"), - IOP ("fbody", B3SOIPD_MOD_FBODY, IF_REAL, "Scaling factor for body charge"), - IOP ("tcjswg", B3SOIPD_MOD_TCJSWG, IF_REAL, - "Temperature coefficient of Cjswg"), - IOP ("tpbswg", B3SOIPD_MOD_TPBSWG, IF_REAL, - "Temperature coefficient of Pbswg"), - IOP ("acde", B3SOIPD_MOD_ACDE, IF_REAL, - "Exponential coefficient for charge thickness in capMod=3 for accumulation and depletion regions"), - IOP ("moin", B3SOIPD_MOD_MOIN, IF_REAL, - "Coefficient for the gate-bias dependent surface potential"), - IOP ("delvt", B3SOIPD_MOD_DELVT, IF_REAL, - "Threshold voltage adjust for CV"), - IOP ("kb1", B3SOIPD_MOD_KB1, IF_REAL, - "Coefficient of Vbs0 dependency on Ves"), - IOP ("dlbg", B3SOIPD_MOD_DLBG, IF_REAL, - "Length offset fitting parameter for backgate charge"), +IOP( "k1w1", B3SOIPD_MOD_K1W1, IF_REAL, "First Body effect width dependent parameter"), +IOP( "k1w2", B3SOIPD_MOD_K1W2, IF_REAL, "Second Boby effect width dependent parameter"), +IOP( "ketas", B3SOIPD_MOD_KETAS, IF_REAL, "Surface potential adjustment for bulk charge effect"), +IOP( "dwbc", B3SOIPD_MOD_DWBC, IF_REAL, "Width offset for body contact isolation edge"), +IOP( "beta0", B3SOIPD_MOD_BETA0, IF_REAL, "First Vds dependent parameter of impact ionizition current"), +IOP( "beta1", B3SOIPD_MOD_BETA1, IF_REAL, "Second Vds dependent parameter of impact ionizition current"), +IOP( "beta2", B3SOIPD_MOD_BETA2, IF_REAL, "Third Vds dependent parameter of impact ionizition current"), +IOP( "vdsatii0", B3SOIPD_MOD_VDSATII0, IF_REAL, "Nominal drain saturation voltage at threshold for impact ionizition current"), +IOP( "tii", B3SOIPD_MOD_TII, IF_REAL, "Temperature dependent parameter for impact ionizition"), +IOP( "lii", B3SOIPD_MOD_LII, IF_REAL, "Channel length dependent parameter at threshold for impact ionizition current"), +IOP( "sii0", B3SOIPD_MOD_SII0, IF_REAL, "First Vgs dependent parameter for impact ionizition current"), +IOP( "sii1", B3SOIPD_MOD_SII1, IF_REAL, "Second Vgs dependent parameter for impact ionizition current"), +IOP( "sii2", B3SOIPD_MOD_SII2, IF_REAL, "Third Vgs dependent parameter for impact ionizition current"), +IOP( "siid", B3SOIPD_MOD_SIID, IF_REAL, "Vds dependent parameter of drain saturation voltage for impact ionizition current"), +IOP( "fbjtii", B3SOIPD_MOD_FBJTII, IF_REAL, "Fraction of bipolar current affecting the impact ionization"), +IOP( "esatii", B3SOIPD_MOD_ESATII, IF_REAL, "Saturation electric field for impact ionization"), +IOP( "ntun", B3SOIPD_MOD_NTUN, IF_REAL, "Reverse tunneling non-ideality factor"), +IOP( "nrecf0", B3SOIPD_MOD_NRECF0, IF_REAL, "Recombination non-ideality factor at forward bias"), +IOP( "nrecr0", B3SOIPD_MOD_NRECR0, IF_REAL, "Recombination non-ideality factor at reversed bias"), +IOP( "isbjt", B3SOIPD_MOD_ISBJT, IF_REAL, "BJT injection saturation current"), +IOP( "isdif", B3SOIPD_MOD_ISDIF, IF_REAL, "Body to source/drain injection saturation current"), +IOP( "isrec", B3SOIPD_MOD_ISREC, IF_REAL, "Recombination in depletion saturation current"), +IOP( "istun", B3SOIPD_MOD_ISTUN, IF_REAL, "Reverse tunneling saturation current"), +IOP( "ln", B3SOIPD_MOD_LN, IF_REAL, "Electron/hole diffusion length"), +IOP( "vrec0", B3SOIPD_MOD_VREC0, IF_REAL, "Voltage dependent parameter for recombination current"), +IOP( "vtun0", B3SOIPD_MOD_VTUN0, IF_REAL, "Voltage dependent parameter for tunneling current"), +IOP( "nbjt", B3SOIPD_MOD_NBJT, IF_REAL, "Power coefficient of channel length dependency for bipolar current"), +IOP( "lbjt0", B3SOIPD_MOD_LBJT0, IF_REAL, "Refferenc channel length for bipolar cuurent"), +IOP( "ldif0", B3SOIPD_MOD_LDIF0, IF_REAL, "Channel-length dependency coefficient of diffusion cap"), +IOP( "vabjt", B3SOIPD_MOD_VABJT, IF_REAL, "Early voltage for bipolar current"), +IOP( "aely", B3SOIPD_MOD_AELY, IF_REAL, "Channel length dependency of early voltage for bipolar cuurent"), +IOP( "ahli", B3SOIPD_MOD_AHLI, IF_REAL, "High level injection parameter for bipolar current"), +IOP( "rbody", B3SOIPD_MOD_RBODY, IF_REAL, "Intrinsic body contact sheet resistance"), +IOP( "rbsh", B3SOIPD_MOD_RBSH, IF_REAL, "Extrinsic body contact sheet resistance"), +IOP( "cgeo", B3SOIPD_MOD_CGEO, IF_REAL, "Gate substrate overlap capacitance per unit channel length"), +IOP( "tt", B3SOIPD_MOD_TT, IF_REAL, "Diffusion capacitance transit time coefficient"), +IOP( "ndif", B3SOIPD_MOD_NDIF, IF_REAL, "Power coefficient of channel length dependency for diffusion capacitance"), +IOP( "vsdfb", B3SOIPD_MOD_VSDFB, IF_REAL, "Source/drain bottom diffusion capacitance flatband voltage"), +IOP( "vsdth", B3SOIPD_MOD_VSDTH, IF_REAL, "Source/drain bottom diffusion capacitance threshold voltage"), +IOP( "csdmin", B3SOIPD_MOD_CSDMIN, IF_REAL, "Source/drain bottom diffusion minimum capacitance"), +IOP( "asd", B3SOIPD_MOD_ASD, IF_REAL, "Source/drain bottom diffusion smoothing parameter"), +IOP( "csdesw", B3SOIPD_MOD_CSDESW, IF_REAL, "Source/drain sidewall fringing capacitance per unit length"), +IOP( "ntrecf", B3SOIPD_MOD_NTRECF, IF_REAL, "Temperature coefficient for Nrecf"), +IOP( "ntrecr", B3SOIPD_MOD_NTRECR, IF_REAL, "Temperature coefficient for Nrecr"), +IOP( "dlcb", B3SOIPD_MOD_DLCB, IF_REAL, "Length offset fitting parameter for body charge"), +IOP( "fbody", B3SOIPD_MOD_FBODY, IF_REAL, "Scaling factor for body charge"), +IOP( "tcjswg", B3SOIPD_MOD_TCJSWG, IF_REAL, "Temperature coefficient of Cjswg"), +IOP( "tpbswg", B3SOIPD_MOD_TPBSWG, IF_REAL, "Temperature coefficient of Pbswg"), +IOP( "acde", B3SOIPD_MOD_ACDE, IF_REAL, "Exponential coefficient for charge thickness in capMod=3 for accumulation and depletion regions"), +IOP( "moin", B3SOIPD_MOD_MOIN, IF_REAL, "Coefficient for the gate-bias dependent surface potential"), +IOP( "delvt", B3SOIPD_MOD_DELVT, IF_REAL, "Threshold voltage adjust for CV"), +IOP( "kb1", B3SOIPD_MOD_KB1, IF_REAL, "Scaling factor for backgate charge"), +IOP( "dlbg", B3SOIPD_MOD_DLBG, IF_REAL, "Length offset fitting parameter for backgate charge"), /* v2.2 release */ - IOP ("igmod", B3SOIPD_MOD_IGMOD, IF_INTEGER, "gate current model selector"), - IOP ("toxqm", B3SOIPD_MOD_TOXQM, IF_REAL, - "effective oxide thickness considering quantum effect"), - IOP ("wth0", B3SOIPD_MOD_WTH0, IF_REAL, - "Minimum width for thermal resistance calculation"), - IOP ("rhalo", B3SOIPD_MOD_RHALO, IF_REAL, "body halo sheet resistance"), - IOP ("ntox", B3SOIPD_MOD_NTOX, IF_REAL, "power term of gate current"), - IOP ("toxref", B3SOIPD_MOD_TOXREF, IF_REAL, "target oxide thickness"), - IOP ("ebg", B3SOIPD_MOD_EBG, IF_REAL, - "effective bandgap in gate current calcula."), - IOP ("nevb", B3SOIPD_MOD_NEVB, IF_REAL, - "valence-band electron non-ideality factor"), - IOP ("alphagb1", B3SOIPD_MOD_ALPHAGB1, IF_REAL, - "First Vox dependent parameter for gate curent in inversion"), - IOP ("betagb1", B3SOIPD_MOD_BETAGB1, IF_REAL, - "Second Vox dependent parameter for gate currnt in inversion"), - IOP ("vgb1", B3SOIPD_MOD_VGB1, IF_REAL, - "Third Vox dependent parameter for gate current in inversion"), - IOP ("necb", B3SOIPD_MOD_NECB, IF_REAL, - "conduction-band electron non-ideality factor"), - IOP ("alphagb2", B3SOIPD_MOD_ALPHAGB2, IF_REAL, - "First Vox dependent parameter for gate current in accumulation"), - IOP ("betagb2", B3SOIPD_MOD_BETAGB2, IF_REAL, - "Second Vox dependent parameter for gate current in accumulation"), - IOP ("vgb2", B3SOIPD_MOD_VGB2, IF_REAL, - "Third Vox dependent parameter for gate current in accumulation"), - IOP ("voxh", B3SOIPD_MOD_VOXH, IF_REAL, - "the limit of Vox in gate current calculation"), - IOP ("deltavox", B3SOIPD_MOD_DELTAVOX, IF_REAL, - "the smoothing parameter in the Vox smoothing function"), +IOP( "igmod", B3SOIPD_MOD_IGMOD, IF_INTEGER, "gate current model selector"), +IOP( "toxqm", B3SOIPD_MOD_TOXQM, IF_REAL, "effective oxide thickness considering quantum effect"), +IOP( "wth0", B3SOIPD_MOD_WTH0, IF_REAL, "Minimum width for thermal resistance calculation"), +IOP( "rhalo", B3SOIPD_MOD_RHALO, IF_REAL, "body halo sheet resistance"), +IOP( "ntox", B3SOIPD_MOD_NTOX, IF_REAL, "power term of gate current"), +IOP( "toxref", B3SOIPD_MOD_TOXREF, IF_REAL, "target oxide thickness"), +IOP( "ebg", B3SOIPD_MOD_EBG, IF_REAL, "effective bandgap in gate current calcula."), +IOP( "vevb", B3SOIPD_MOD_VEVB, IF_REAL, "Vaux parameter for valence-band electron tunneling"), +IOP( "alphagb1", B3SOIPD_MOD_ALPHAGB1, IF_REAL, "First Vox dependent parameter for gate curent in inversion"), +IOP( "betagb1", B3SOIPD_MOD_BETAGB1, IF_REAL, "Second Vox dependent parameter for gate currnt in inversion"), +IOP( "vgb1", B3SOIPD_MOD_VGB1, IF_REAL, "Third Vox dependent parameter for gate current in inversion"), +IOP( "vecb", B3SOIPD_MOD_VECB, IF_REAL, "Vaux parameter for conduction-band electron tunneling"), +IOP( "alphagb2", B3SOIPD_MOD_ALPHAGB2, IF_REAL, "First Vox dependent parameter for gate current in accumulation"), +IOP( "betagb2", B3SOIPD_MOD_BETAGB2, IF_REAL, "Second Vox dependent parameter for gate current in accumulation"), +IOP( "vgb2", B3SOIPD_MOD_VGB2, IF_REAL, "Third Vox dependent parameter for gate current in accumulation"), +IOP( "voxh", B3SOIPD_MOD_VOXH, IF_REAL, "the limit of Vox in gate current calculation"), +IOP( "deltavox", B3SOIPD_MOD_DELTAVOX, IF_REAL, "the smoothing parameter in the Vox smoothing function"), /* Added for binning - START */ /* Length Dependence */ - IOP ("lnch", B3SOIPD_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), - IOP ("lnsub", B3SOIPD_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), - IOP ("lngate", B3SOIPD_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), - IOP ("lvth0", B3SOIPD_MOD_LVTH0, IF_REAL, "Length dependence of vto"), - IOP ("lk1", B3SOIPD_MOD_LK1, IF_REAL, "Length dependence of k1"), - IOP ("lk1w1", B3SOIPD_MOD_LK1W1, IF_REAL, "Length dependence of k1w1"), - IOP ("lk1w2", B3SOIPD_MOD_LK1W2, IF_REAL, "Length dependence of k1w2"), - IOP ("lk2", B3SOIPD_MOD_LK2, IF_REAL, "Length dependence of k2"), - IOP ("lk3", B3SOIPD_MOD_LK3, IF_REAL, "Length dependence of k3"), - IOP ("lk3b", B3SOIPD_MOD_LK3B, IF_REAL, "Length dependence of k3b"), - IOP ("lkb1", B3SOIPD_MOD_LKB1, IF_REAL, "Length dependence of kb1"), - IOP ("lw0", B3SOIPD_MOD_LW0, IF_REAL, "Length dependence of w0"), - IOP ("lnlx", B3SOIPD_MOD_LNLX, IF_REAL, "Length dependence of nlx"), - IOP ("ldvt0", B3SOIPD_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), - IOP ("ldvt1", B3SOIPD_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), - IOP ("ldvt2", B3SOIPD_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), - IOP ("ldvt0w", B3SOIPD_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), - IOP ("ldvt1w", B3SOIPD_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), - IOP ("ldvt2w", B3SOIPD_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), - IOP ("lu0", B3SOIPD_MOD_LU0, IF_REAL, "Length dependence of u0"), - IOP ("lua", B3SOIPD_MOD_LUA, IF_REAL, "Length dependence of ua"), - IOP ("lub", B3SOIPD_MOD_LUB, IF_REAL, "Length dependence of ub"), - IOP ("luc", B3SOIPD_MOD_LUC, IF_REAL, "Length dependence of uc"), - IOP ("lvsat", B3SOIPD_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), - IOP ("la0", B3SOIPD_MOD_LA0, IF_REAL, "Length dependence of a0"), - IOP ("lags", B3SOIPD_MOD_LAGS, IF_REAL, "Length dependence of ags"), - IOP ("lb0", B3SOIPD_MOD_LB0, IF_REAL, "Length dependence of b0"), - IOP ("lb1", B3SOIPD_MOD_LB1, IF_REAL, "Length dependence of b1"), - IOP ("lketa", B3SOIPD_MOD_LKETA, IF_REAL, "Length dependence of keta"), - IOP ("lketas", B3SOIPD_MOD_LKETAS, IF_REAL, "Length dependence of ketas"), - IOP ("la1", B3SOIPD_MOD_LA1, IF_REAL, "Length dependence of a1"), - IOP ("la2", B3SOIPD_MOD_LA2, IF_REAL, "Length dependence of a2"), - IOP ("lrdsw", B3SOIPD_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), - IOP ("lprwb", B3SOIPD_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), - IOP ("lprwg", B3SOIPD_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), - IOP ("lwr", B3SOIPD_MOD_LWR, IF_REAL, "Length dependence of wr"), - IOP ("lnfactor", B3SOIPD_MOD_LNFACTOR, IF_REAL, - "Length dependence of nfactor"), - IOP ("ldwg", B3SOIPD_MOD_LDWG, IF_REAL, "Length dependence of dwg"), - IOP ("ldwb", B3SOIPD_MOD_LDWB, IF_REAL, "Length dependence of dwb"), - IOP ("lvoff", B3SOIPD_MOD_LVOFF, IF_REAL, "Length dependence of voff"), - IOP ("leta0", B3SOIPD_MOD_LETA0, IF_REAL, "Length dependence of eta0"), - IOP ("letab", B3SOIPD_MOD_LETAB, IF_REAL, "Length dependence of etab"), - IOP ("ldsub", B3SOIPD_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), - IOP ("lcit", B3SOIPD_MOD_LCIT, IF_REAL, "Length dependence of cit"), - IOP ("lcdsc", B3SOIPD_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), - IOP ("lcdscb", B3SOIPD_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), - IOP ("lcdscd", B3SOIPD_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), - IOP ("lpclm", B3SOIPD_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), - IOP ("lpdiblc1", B3SOIPD_MOD_LPDIBL1, IF_REAL, - "Length dependence of pdiblc1"), - IOP ("lpdiblc2", B3SOIPD_MOD_LPDIBL2, IF_REAL, - "Length dependence of pdiblc2"), - IOP ("lpdiblcb", B3SOIPD_MOD_LPDIBLB, IF_REAL, - "Length dependence of pdiblcb"), - IOP ("ldrout", B3SOIPD_MOD_LDROUT, IF_REAL, "Length dependence of drout"), - IOP ("lpvag", B3SOIPD_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), - IOP ("ldelta", B3SOIPD_MOD_LDELTA, IF_REAL, "Length dependence of delta"), - IOP ("lalpha0", B3SOIPD_MOD_LALPHA0, IF_REAL, - "Length dependence of alpha0"), - IOP ("lfbjtii", B3SOIPD_MOD_LFBJTII, IF_REAL, - "Length dependence of fbjtii"), - IOP ("lbeta0", B3SOIPD_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), - IOP ("lbeta1", B3SOIPD_MOD_LBETA1, IF_REAL, "Length dependence of beta1"), - IOP ("lbeta2", B3SOIPD_MOD_LBETA2, IF_REAL, "Length dependence of beta2"), - IOP ("lvdsatii0", B3SOIPD_MOD_LVDSATII0, IF_REAL, - "Length dependence of vdsatii0"), - IOP ("llii", B3SOIPD_MOD_LLII, IF_REAL, "Length dependence of lii"), - IOP ("lesatii", B3SOIPD_MOD_LESATII, IF_REAL, - "Length dependence of esatii"), - IOP ("lsii0", B3SOIPD_MOD_LSII0, IF_REAL, "Length dependence of sii0"), - IOP ("lsii1", B3SOIPD_MOD_LSII1, IF_REAL, "Length dependence of sii1"), - IOP ("lsii2", B3SOIPD_MOD_LSII2, IF_REAL, "Length dependence of sii2"), - IOP ("lsiid", B3SOIPD_MOD_LSIID, IF_REAL, "Length dependence of siid"), - IOP ("lagidl", B3SOIPD_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"), - IOP ("lbgidl", B3SOIPD_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"), - IOP ("lngidl", B3SOIPD_MOD_LNGIDL, IF_REAL, "Length dependence of ngidl"), - IOP ("lntun", B3SOIPD_MOD_LNTUN, IF_REAL, "Length dependence of ntun"), - IOP ("lndiode", B3SOIPD_MOD_LNDIODE, IF_REAL, - "Length dependence of ndiode"), - IOP ("lnrecf0", B3SOIPD_MOD_LNRECF0, IF_REAL, - "Length dependence of nrecf0"), - IOP ("lnrecr0", B3SOIPD_MOD_LNRECR0, IF_REAL, - "Length dependence of nrecr0"), - IOP ("lisbjt", B3SOIPD_MOD_LISBJT, IF_REAL, "Length dependence of isbjt"), - IOP ("lisdif", B3SOIPD_MOD_LISDIF, IF_REAL, "Length dependence of isdif"), - IOP ("lisrec", B3SOIPD_MOD_LISREC, IF_REAL, "Length dependence of isrec"), - IOP ("listun", B3SOIPD_MOD_LISTUN, IF_REAL, "Length dependence of istun"), - IOP ("lvrec0", B3SOIPD_MOD_LVREC0, IF_REAL, "Length dependence of vrec0"), - IOP ("lvtun0", B3SOIPD_MOD_LVTUN0, IF_REAL, "Length dependence of vtun0"), - IOP ("lnbjt", B3SOIPD_MOD_LNBJT, IF_REAL, "Length dependence of nbjt"), - IOP ("llbjt0", B3SOIPD_MOD_LLBJT0, IF_REAL, "Length dependence of lbjt0"), - IOP ("lvabjt", B3SOIPD_MOD_LVABJT, IF_REAL, "Length dependence of vabjt"), - IOP ("laely", B3SOIPD_MOD_LAELY, IF_REAL, "Length dependence of aely"), - IOP ("lahli", B3SOIPD_MOD_LAHLI, IF_REAL, "Length dependence of ahli"), - IOP ("lvsdfb", B3SOIPD_MOD_LVSDFB, IF_REAL, "Length dependence of vsdfb"), - IOP ("lvsdth", B3SOIPD_MOD_LVSDTH, IF_REAL, "Length dependence of vsdth"), - IOP ("ldelvt", B3SOIPD_MOD_LDELVT, IF_REAL, "Length dependence of delvt"), - IOP ("lacde", B3SOIPD_MOD_LACDE, IF_REAL, "Length dependence of acde"), - IOP ("lmoin", B3SOIPD_MOD_LMOIN, IF_REAL, "Length dependence of amoin"), +IOP( "lnch", B3SOIPD_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), +IOP( "lnsub", B3SOIPD_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), +IOP( "lngate", B3SOIPD_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), +IOP( "lvth0", B3SOIPD_MOD_LVTH0, IF_REAL,"Length dependence of vto"), +IOP( "lk1", B3SOIPD_MOD_LK1, IF_REAL, "Length dependence of k1"), +IOP( "lk1w1", B3SOIPD_MOD_LK1W1, IF_REAL, "Length dependence of k1w1"), +IOP( "lk1w2", B3SOIPD_MOD_LK1W2, IF_REAL, "Length dependence of k1w2"), +IOP( "lk2", B3SOIPD_MOD_LK2, IF_REAL, "Length dependence of k2"), +IOP( "lk3", B3SOIPD_MOD_LK3, IF_REAL, "Length dependence of k3"), +IOP( "lk3b", B3SOIPD_MOD_LK3B, IF_REAL, "Length dependence of k3b"), +IOP( "lkb1", B3SOIPD_MOD_LKB1, IF_REAL, "Length dependence of kb1"), +IOP( "lw0", B3SOIPD_MOD_LW0, IF_REAL, "Length dependence of w0"), +IOP( "lnlx", B3SOIPD_MOD_LNLX, IF_REAL, "Length dependence of nlx"), +IOP( "ldvt0", B3SOIPD_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), +IOP( "ldvt1", B3SOIPD_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), +IOP( "ldvt2", B3SOIPD_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), +IOP( "ldvt0w", B3SOIPD_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), +IOP( "ldvt1w", B3SOIPD_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), +IOP( "ldvt2w", B3SOIPD_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), +IOP( "lu0", B3SOIPD_MOD_LU0, IF_REAL, "Length dependence of u0"), +IOP( "lua", B3SOIPD_MOD_LUA, IF_REAL, "Length dependence of ua"), +IOP( "lub", B3SOIPD_MOD_LUB, IF_REAL, "Length dependence of ub"), +IOP( "luc", B3SOIPD_MOD_LUC, IF_REAL, "Length dependence of uc"), +IOP( "lvsat", B3SOIPD_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), +IOP( "la0", B3SOIPD_MOD_LA0, IF_REAL, "Length dependence of a0"), +IOP( "lags", B3SOIPD_MOD_LAGS, IF_REAL, "Length dependence of ags"), +IOP( "lb0", B3SOIPD_MOD_LB0, IF_REAL, "Length dependence of b0"), +IOP( "lb1", B3SOIPD_MOD_LB1, IF_REAL, "Length dependence of b1"), +IOP( "lketa", B3SOIPD_MOD_LKETA, IF_REAL, "Length dependence of keta"), +IOP( "lketas", B3SOIPD_MOD_LKETAS, IF_REAL, "Length dependence of ketas"), +IOP( "la1", B3SOIPD_MOD_LA1, IF_REAL, "Length dependence of a1"), +IOP( "la2", B3SOIPD_MOD_LA2, IF_REAL, "Length dependence of a2"), +IOP( "lrdsw", B3SOIPD_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), +IOP( "lprwb", B3SOIPD_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), +IOP( "lprwg", B3SOIPD_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), +IOP( "lwr", B3SOIPD_MOD_LWR, IF_REAL, "Length dependence of wr"), +IOP( "lnfactor", B3SOIPD_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), +IOP( "ldwg", B3SOIPD_MOD_LDWG, IF_REAL, "Length dependence of dwg"), +IOP( "ldwb", B3SOIPD_MOD_LDWB, IF_REAL, "Length dependence of dwb"), +IOP( "lvoff", B3SOIPD_MOD_LVOFF, IF_REAL, "Length dependence of voff"), +IOP( "leta0", B3SOIPD_MOD_LETA0, IF_REAL, "Length dependence of eta0"), +IOP( "letab", B3SOIPD_MOD_LETAB, IF_REAL, "Length dependence of etab"), +IOP( "ldsub", B3SOIPD_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), +IOP( "lcit", B3SOIPD_MOD_LCIT, IF_REAL, "Length dependence of cit"), +IOP( "lcdsc", B3SOIPD_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), +IOP( "lcdscb", B3SOIPD_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), +IOP( "lcdscd", B3SOIPD_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), +IOP( "lpclm", B3SOIPD_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), +IOP( "lpdiblc1", B3SOIPD_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), +IOP( "lpdiblc2", B3SOIPD_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), +IOP( "lpdiblcb", B3SOIPD_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), +IOP( "ldrout", B3SOIPD_MOD_LDROUT, IF_REAL, "Length dependence of drout"), +IOP( "lpvag", B3SOIPD_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), +IOP( "ldelta", B3SOIPD_MOD_LDELTA, IF_REAL, "Length dependence of delta"), +IOP( "lalpha0", B3SOIPD_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), +IOP( "lfbjtii", B3SOIPD_MOD_LFBJTII, IF_REAL, "Length dependence of fbjtii"), +IOP( "lbeta0", B3SOIPD_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), +IOP( "lbeta1", B3SOIPD_MOD_LBETA1, IF_REAL, "Length dependence of beta1"), +IOP( "lbeta2", B3SOIPD_MOD_LBETA2, IF_REAL, "Length dependence of beta2"), +IOP( "lvdsatii0", B3SOIPD_MOD_LVDSATII0, IF_REAL, "Length dependence of vdsatii0"), +IOP( "llii", B3SOIPD_MOD_LLII, IF_REAL, "Length dependence of lii"), +IOP( "lesatii", B3SOIPD_MOD_LESATII, IF_REAL, "Length dependence of esatii"), +IOP( "lsii0", B3SOIPD_MOD_LSII0, IF_REAL, "Length dependence of sii0"), +IOP( "lsii1", B3SOIPD_MOD_LSII1, IF_REAL, "Length dependence of sii1"), +IOP( "lsii2", B3SOIPD_MOD_LSII2, IF_REAL, "Length dependence of sii2"), +IOP( "lsiid", B3SOIPD_MOD_LSIID, IF_REAL, "Length dependence of siid"), +IOP( "lagidl", B3SOIPD_MOD_LAGIDL, IF_REAL, "Length dependence of agidl"), +IOP( "lbgidl", B3SOIPD_MOD_LBGIDL, IF_REAL, "Length dependence of bgidl"), +IOP( "lngidl", B3SOIPD_MOD_LNGIDL, IF_REAL, "Length dependence of ngidl"), +IOP( "lntun", B3SOIPD_MOD_LNTUN, IF_REAL, "Length dependence of ntun"), +IOP( "lndiode", B3SOIPD_MOD_LNDIODE, IF_REAL, "Length dependence of ndiode"), +IOP( "lnrecf0", B3SOIPD_MOD_LNRECF0, IF_REAL, "Length dependence of nrecf0"), +IOP( "lnrecr0", B3SOIPD_MOD_LNRECR0, IF_REAL, "Length dependence of nrecr0"), +IOP( "lisbjt", B3SOIPD_MOD_LISBJT, IF_REAL, "Length dependence of isbjt"), +IOP( "lisdif", B3SOIPD_MOD_LISDIF, IF_REAL, "Length dependence of isdif"), +IOP( "lisrec", B3SOIPD_MOD_LISREC, IF_REAL, "Length dependence of isrec"), +IOP( "listun", B3SOIPD_MOD_LISTUN, IF_REAL, "Length dependence of istun"), +IOP( "lvrec0", B3SOIPD_MOD_LVREC0, IF_REAL, "Length dependence of vrec0"), +IOP( "lvtun0", B3SOIPD_MOD_LVTUN0, IF_REAL, "Length dependence of vtun0"), +IOP( "lnbjt", B3SOIPD_MOD_LNBJT, IF_REAL, "Length dependence of nbjt"), +IOP( "llbjt0", B3SOIPD_MOD_LLBJT0, IF_REAL, "Length dependence of lbjt0"), +IOP( "lvabjt", B3SOIPD_MOD_LVABJT, IF_REAL, "Length dependence of vabjt"), +IOP( "laely", B3SOIPD_MOD_LAELY, IF_REAL, "Length dependence of aely"), +IOP( "lahli", B3SOIPD_MOD_LAHLI, IF_REAL, "Length dependence of ahli"), +IOP( "lvsdfb", B3SOIPD_MOD_LVSDFB, IF_REAL, "Length dependence of vsdfb"), +IOP( "lvsdth", B3SOIPD_MOD_LVSDTH, IF_REAL, "Length dependence of vsdth"), +IOP( "ldelvt", B3SOIPD_MOD_LDELVT, IF_REAL, "Length dependence of delvt"), +IOP( "lacde", B3SOIPD_MOD_LACDE, IF_REAL, "Length dependence of acde"), +IOP( "lmoin", B3SOIPD_MOD_LMOIN, IF_REAL, "Length dependence of amoin"), /* Width Dependence */ - IOP ("wnch", B3SOIPD_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), - IOP ("wnsub", B3SOIPD_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), - IOP ("wngate", B3SOIPD_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), - IOP ("wvth0", B3SOIPD_MOD_WVTH0, IF_REAL, "Width dependence of vto"), - IOP ("wk1", B3SOIPD_MOD_WK1, IF_REAL, "Width dependence of k1"), - IOP ("wk1w1", B3SOIPD_MOD_WK1W1, IF_REAL, "Width dependence of k1w1"), - IOP ("wk1w2", B3SOIPD_MOD_WK1W2, IF_REAL, "Width dependence of k1w2"), - IOP ("wk2", B3SOIPD_MOD_WK2, IF_REAL, "Width dependence of k2"), - IOP ("wk3", B3SOIPD_MOD_WK3, IF_REAL, "Width dependence of k3"), - IOP ("wk3b", B3SOIPD_MOD_WK3B, IF_REAL, "Width dependence of k3b"), - IOP ("wkb1", B3SOIPD_MOD_WKB1, IF_REAL, "Width dependence of kb1"), - IOP ("ww0", B3SOIPD_MOD_WW0, IF_REAL, "Width dependence of w0"), - IOP ("wnlx", B3SOIPD_MOD_WNLX, IF_REAL, "Width dependence of nlx"), - IOP ("wdvt0", B3SOIPD_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), - IOP ("wdvt1", B3SOIPD_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), - IOP ("wdvt2", B3SOIPD_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), - IOP ("wdvt0w", B3SOIPD_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), - IOP ("wdvt1w", B3SOIPD_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), - IOP ("wdvt2w", B3SOIPD_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), - IOP ("wu0", B3SOIPD_MOD_WU0, IF_REAL, "Width dependence of u0"), - IOP ("wua", B3SOIPD_MOD_WUA, IF_REAL, "Width dependence of ua"), - IOP ("wub", B3SOIPD_MOD_WUB, IF_REAL, "Width dependence of ub"), - IOP ("wuc", B3SOIPD_MOD_WUC, IF_REAL, "Width dependence of uc"), - IOP ("wvsat", B3SOIPD_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), - IOP ("wa0", B3SOIPD_MOD_WA0, IF_REAL, "Width dependence of a0"), - IOP ("wags", B3SOIPD_MOD_WAGS, IF_REAL, "Width dependence of ags"), - IOP ("wb0", B3SOIPD_MOD_WB0, IF_REAL, "Width dependence of b0"), - IOP ("wb1", B3SOIPD_MOD_WB1, IF_REAL, "Width dependence of b1"), - IOP ("wketa", B3SOIPD_MOD_WKETA, IF_REAL, "Width dependence of keta"), - IOP ("wketas", B3SOIPD_MOD_WKETAS, IF_REAL, "Width dependence of ketas"), - IOP ("wa1", B3SOIPD_MOD_WA1, IF_REAL, "Width dependence of a1"), - IOP ("wa2", B3SOIPD_MOD_WA2, IF_REAL, "Width dependence of a2"), - IOP ("wrdsw", B3SOIPD_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), - IOP ("wprwb", B3SOIPD_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), - IOP ("wprwg", B3SOIPD_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), - IOP ("wwr", B3SOIPD_MOD_WWR, IF_REAL, "Width dependence of wr"), - IOP ("wnfactor", B3SOIPD_MOD_WNFACTOR, IF_REAL, - "Width dependence of nfactor"), - IOP ("wdwg", B3SOIPD_MOD_WDWG, IF_REAL, "Width dependence of dwg"), - IOP ("wdwb", B3SOIPD_MOD_WDWB, IF_REAL, "Width dependence of dwb"), - IOP ("wvoff", B3SOIPD_MOD_WVOFF, IF_REAL, "Width dependence of voff"), - IOP ("weta0", B3SOIPD_MOD_WETA0, IF_REAL, "Width dependence of eta0"), - IOP ("wetab", B3SOIPD_MOD_WETAB, IF_REAL, "Width dependence of etab"), - IOP ("wdsub", B3SOIPD_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), - IOP ("wcit", B3SOIPD_MOD_WCIT, IF_REAL, "Width dependence of cit"), - IOP ("wcdsc", B3SOIPD_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), - IOP ("wcdscb", B3SOIPD_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), - IOP ("wcdscd", B3SOIPD_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), - IOP ("wpclm", B3SOIPD_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), - IOP ("wpdiblc1", B3SOIPD_MOD_WPDIBL1, IF_REAL, - "Width dependence of pdiblc1"), - IOP ("wpdiblc2", B3SOIPD_MOD_WPDIBL2, IF_REAL, - "Width dependence of pdiblc2"), - IOP ("wpdiblcb", B3SOIPD_MOD_WPDIBLB, IF_REAL, - "Width dependence of pdiblcb"), - IOP ("wdrout", B3SOIPD_MOD_WDROUT, IF_REAL, "Width dependence of drout"), - IOP ("wpvag", B3SOIPD_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), - IOP ("wdelta", B3SOIPD_MOD_WDELTA, IF_REAL, "Width dependence of delta"), - IOP ("walpha0", B3SOIPD_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), - IOP ("wfbjtii", B3SOIPD_MOD_WFBJTII, IF_REAL, "Width dependence of fbjtii"), - IOP ("wbeta0", B3SOIPD_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), - IOP ("wbeta1", B3SOIPD_MOD_WBETA1, IF_REAL, "Width dependence of beta1"), - IOP ("wbeta2", B3SOIPD_MOD_WBETA2, IF_REAL, "Width dependence of beta2"), - IOP ("wvdsatii0", B3SOIPD_MOD_WVDSATII0, IF_REAL, - "Width dependence of vdsatii0"), - IOP ("wlii", B3SOIPD_MOD_WLII, IF_REAL, "Width dependence of lii"), - IOP ("wesatii", B3SOIPD_MOD_WESATII, IF_REAL, "Width dependence of esatii"), - IOP ("wsii0", B3SOIPD_MOD_WSII0, IF_REAL, "Width dependence of sii0"), - IOP ("wsii1", B3SOIPD_MOD_WSII1, IF_REAL, "Width dependence of sii1"), - IOP ("wsii2", B3SOIPD_MOD_WSII2, IF_REAL, "Width dependence of sii2"), - IOP ("wsiid", B3SOIPD_MOD_WSIID, IF_REAL, "Width dependence of siid"), - IOP ("wagidl", B3SOIPD_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"), - IOP ("wbgidl", B3SOIPD_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"), - IOP ("wngidl", B3SOIPD_MOD_WNGIDL, IF_REAL, "Width dependence of ngidl"), - IOP ("wntun", B3SOIPD_MOD_WNTUN, IF_REAL, "Width dependence of ntun"), - IOP ("wndiode", B3SOIPD_MOD_WNDIODE, IF_REAL, "Width dependence of ndiode"), - IOP ("wnrecf0", B3SOIPD_MOD_WNRECF0, IF_REAL, "Width dependence of nrecf0"), - IOP ("wnrecr0", B3SOIPD_MOD_WNRECR0, IF_REAL, "Width dependence of nrecr0"), - IOP ("wisbjt", B3SOIPD_MOD_WISBJT, IF_REAL, "Width dependence of isbjt"), - IOP ("wisdif", B3SOIPD_MOD_WISDIF, IF_REAL, "Width dependence of isdif"), - IOP ("wisrec", B3SOIPD_MOD_WISREC, IF_REAL, "Width dependence of isrec"), - IOP ("wistun", B3SOIPD_MOD_WISTUN, IF_REAL, "Width dependence of istun"), - IOP ("wvrec0", B3SOIPD_MOD_WVREC0, IF_REAL, "Width dependence of vrec0"), - IOP ("wvtun0", B3SOIPD_MOD_WVTUN0, IF_REAL, "Width dependence of vtun0"), - IOP ("wnbjt", B3SOIPD_MOD_WNBJT, IF_REAL, "Width dependence of nbjt"), - IOP ("wlbjt0", B3SOIPD_MOD_WLBJT0, IF_REAL, "Width dependence of lbjt0"), - IOP ("wvabjt", B3SOIPD_MOD_WVABJT, IF_REAL, "Width dependence of vabjt"), - IOP ("waely", B3SOIPD_MOD_WAELY, IF_REAL, "Width dependence of aely"), - IOP ("wahli", B3SOIPD_MOD_WAHLI, IF_REAL, "Width dependence of ahli"), - IOP ("wvsdfb", B3SOIPD_MOD_WVSDFB, IF_REAL, "Width dependence of vsdfb"), - IOP ("wvsdth", B3SOIPD_MOD_WVSDTH, IF_REAL, "Width dependence of vsdth"), - IOP ("wdelvt", B3SOIPD_MOD_WDELVT, IF_REAL, "Width dependence of delvt"), - IOP ("wacde", B3SOIPD_MOD_WACDE, IF_REAL, "Width dependence of acde"), - IOP ("wmoin", B3SOIPD_MOD_WMOIN, IF_REAL, "Width dependence of amoin"), +IOP( "wnch", B3SOIPD_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), +IOP( "wnsub", B3SOIPD_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), +IOP( "wngate", B3SOIPD_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), +IOP( "wvth0", B3SOIPD_MOD_WVTH0, IF_REAL,"Width dependence of vto"), +IOP( "wk1", B3SOIPD_MOD_WK1, IF_REAL, "Width dependence of k1"), +IOP( "wk1w1", B3SOIPD_MOD_WK1W1, IF_REAL, "Width dependence of k1w1"), +IOP( "wk1w2", B3SOIPD_MOD_WK1W2, IF_REAL, "Width dependence of k1w2"), +IOP( "wk2", B3SOIPD_MOD_WK2, IF_REAL, "Width dependence of k2"), +IOP( "wk3", B3SOIPD_MOD_WK3, IF_REAL, "Width dependence of k3"), +IOP( "wk3b", B3SOIPD_MOD_WK3B, IF_REAL, "Width dependence of k3b"), +IOP( "wkb1", B3SOIPD_MOD_WKB1, IF_REAL, "Width dependence of kb1"), +IOP( "ww0", B3SOIPD_MOD_WW0, IF_REAL, "Width dependence of w0"), +IOP( "wnlx", B3SOIPD_MOD_WNLX, IF_REAL, "Width dependence of nlx"), +IOP( "wdvt0", B3SOIPD_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), +IOP( "wdvt1", B3SOIPD_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), +IOP( "wdvt2", B3SOIPD_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), +IOP( "wdvt0w", B3SOIPD_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), +IOP( "wdvt1w", B3SOIPD_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), +IOP( "wdvt2w", B3SOIPD_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), +IOP( "wu0", B3SOIPD_MOD_WU0, IF_REAL, "Width dependence of u0"), +IOP( "wua", B3SOIPD_MOD_WUA, IF_REAL, "Width dependence of ua"), +IOP( "wub", B3SOIPD_MOD_WUB, IF_REAL, "Width dependence of ub"), +IOP( "wuc", B3SOIPD_MOD_WUC, IF_REAL, "Width dependence of uc"), +IOP( "wvsat", B3SOIPD_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), +IOP( "wa0", B3SOIPD_MOD_WA0, IF_REAL, "Width dependence of a0"), +IOP( "wags", B3SOIPD_MOD_WAGS, IF_REAL, "Width dependence of ags"), +IOP( "wb0", B3SOIPD_MOD_WB0, IF_REAL, "Width dependence of b0"), +IOP( "wb1", B3SOIPD_MOD_WB1, IF_REAL, "Width dependence of b1"), +IOP( "wketa", B3SOIPD_MOD_WKETA, IF_REAL, "Width dependence of keta"), +IOP( "wketas", B3SOIPD_MOD_WKETAS, IF_REAL, "Width dependence of ketas"), +IOP( "wa1", B3SOIPD_MOD_WA1, IF_REAL, "Width dependence of a1"), +IOP( "wa2", B3SOIPD_MOD_WA2, IF_REAL, "Width dependence of a2"), +IOP( "wrdsw", B3SOIPD_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), +IOP( "wprwb", B3SOIPD_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), +IOP( "wprwg", B3SOIPD_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), +IOP( "wwr", B3SOIPD_MOD_WWR, IF_REAL, "Width dependence of wr"), +IOP( "wnfactor", B3SOIPD_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), +IOP( "wdwg", B3SOIPD_MOD_WDWG, IF_REAL, "Width dependence of dwg"), +IOP( "wdwb", B3SOIPD_MOD_WDWB, IF_REAL, "Width dependence of dwb"), +IOP( "wvoff", B3SOIPD_MOD_WVOFF, IF_REAL, "Width dependence of voff"), +IOP( "weta0", B3SOIPD_MOD_WETA0, IF_REAL, "Width dependence of eta0"), +IOP( "wetab", B3SOIPD_MOD_WETAB, IF_REAL, "Width dependence of etab"), +IOP( "wdsub", B3SOIPD_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), +IOP( "wcit", B3SOIPD_MOD_WCIT, IF_REAL, "Width dependence of cit"), +IOP( "wcdsc", B3SOIPD_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), +IOP( "wcdscb", B3SOIPD_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), +IOP( "wcdscd", B3SOIPD_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), +IOP( "wpclm", B3SOIPD_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), +IOP( "wpdiblc1", B3SOIPD_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), +IOP( "wpdiblc2", B3SOIPD_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), +IOP( "wpdiblcb", B3SOIPD_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), +IOP( "wdrout", B3SOIPD_MOD_WDROUT, IF_REAL, "Width dependence of drout"), +IOP( "wpvag", B3SOIPD_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), +IOP( "wdelta", B3SOIPD_MOD_WDELTA, IF_REAL, "Width dependence of delta"), +IOP( "walpha0", B3SOIPD_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), +IOP( "wfbjtii", B3SOIPD_MOD_WFBJTII, IF_REAL, "Width dependence of fbjtii"), +IOP( "wbeta0", B3SOIPD_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), +IOP( "wbeta1", B3SOIPD_MOD_WBETA1, IF_REAL, "Width dependence of beta1"), +IOP( "wbeta2", B3SOIPD_MOD_WBETA2, IF_REAL, "Width dependence of beta2"), +IOP( "wvdsatii0", B3SOIPD_MOD_WVDSATII0, IF_REAL, "Width dependence of vdsatii0"), +IOP( "wlii", B3SOIPD_MOD_WLII, IF_REAL, "Width dependence of lii"), +IOP( "wesatii", B3SOIPD_MOD_WESATII, IF_REAL, "Width dependence of esatii"), +IOP( "wsii0", B3SOIPD_MOD_WSII0, IF_REAL, "Width dependence of sii0"), +IOP( "wsii1", B3SOIPD_MOD_WSII1, IF_REAL, "Width dependence of sii1"), +IOP( "wsii2", B3SOIPD_MOD_WSII2, IF_REAL, "Width dependence of sii2"), +IOP( "wsiid", B3SOIPD_MOD_WSIID, IF_REAL, "Width dependence of siid"), +IOP( "wagidl", B3SOIPD_MOD_WAGIDL, IF_REAL, "Width dependence of agidl"), +IOP( "wbgidl", B3SOIPD_MOD_WBGIDL, IF_REAL, "Width dependence of bgidl"), +IOP( "wngidl", B3SOIPD_MOD_WNGIDL, IF_REAL, "Width dependence of ngidl"), +IOP( "wntun", B3SOIPD_MOD_WNTUN, IF_REAL, "Width dependence of ntun"), +IOP( "wndiode", B3SOIPD_MOD_WNDIODE, IF_REAL, "Width dependence of ndiode"), +IOP( "wnrecf0", B3SOIPD_MOD_WNRECF0, IF_REAL, "Width dependence of nrecf0"), +IOP( "wnrecr0", B3SOIPD_MOD_WNRECR0, IF_REAL, "Width dependence of nrecr0"), +IOP( "wisbjt", B3SOIPD_MOD_WISBJT, IF_REAL, "Width dependence of isbjt"), +IOP( "wisdif", B3SOIPD_MOD_WISDIF, IF_REAL, "Width dependence of isdif"), +IOP( "wisrec", B3SOIPD_MOD_WISREC, IF_REAL, "Width dependence of isrec"), +IOP( "wistun", B3SOIPD_MOD_WISTUN, IF_REAL, "Width dependence of istun"), +IOP( "wvrec0", B3SOIPD_MOD_WVREC0, IF_REAL, "Width dependence of vrec0"), +IOP( "wvtun0", B3SOIPD_MOD_WVTUN0, IF_REAL, "Width dependence of vtun0"), +IOP( "wnbjt", B3SOIPD_MOD_WNBJT, IF_REAL, "Width dependence of nbjt"), +IOP( "wlbjt0", B3SOIPD_MOD_WLBJT0, IF_REAL, "Width dependence of lbjt0"), +IOP( "wvabjt", B3SOIPD_MOD_WVABJT, IF_REAL, "Width dependence of vabjt"), +IOP( "waely", B3SOIPD_MOD_WAELY, IF_REAL, "Width dependence of aely"), +IOP( "wahli", B3SOIPD_MOD_WAHLI, IF_REAL, "Width dependence of ahli"), +IOP( "wvsdfb", B3SOIPD_MOD_WVSDFB, IF_REAL, "Width dependence of vsdfb"), +IOP( "wvsdth", B3SOIPD_MOD_WVSDTH, IF_REAL, "Width dependence of vsdth"), +IOP( "wdelvt", B3SOIPD_MOD_WDELVT, IF_REAL, "Width dependence of delvt"), +IOP( "wacde", B3SOIPD_MOD_WACDE, IF_REAL, "Width dependence of acde"), +IOP( "wmoin", B3SOIPD_MOD_WMOIN, IF_REAL, "Width dependence of amoin"), /* Cross-term Dependence */ - IOP ("pnch", B3SOIPD_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), - IOP ("pnsub", B3SOIPD_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), - IOP ("pngate", B3SOIPD_MOD_PNGATE, IF_REAL, - "Cross-term dependence of ngate"), - IOP ("pvth0", B3SOIPD_MOD_PVTH0, IF_REAL, "Cross-term dependence of vto"), - IOP ("pk1", B3SOIPD_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), - IOP ("pk1w1", B3SOIPD_MOD_PK1W1, IF_REAL, "Cross-term dependence of k1w1"), - IOP ("pk1w2", B3SOIPD_MOD_PK1W2, IF_REAL, "Cross-term dependence of k1w2"), - IOP ("pk2", B3SOIPD_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), - IOP ("pk3", B3SOIPD_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), - IOP ("pk3b", B3SOIPD_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), - IOP ("pkb1", B3SOIPD_MOD_PKB1, IF_REAL, "Cross-term dependence of kb1"), - IOP ("pw0", B3SOIPD_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), - IOP ("pnlx", B3SOIPD_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), - IOP ("pdvt0", B3SOIPD_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), - IOP ("pdvt1", B3SOIPD_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), - IOP ("pdvt2", B3SOIPD_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), - IOP ("pdvt0w", B3SOIPD_MOD_PDVT0W, IF_REAL, - "Cross-term dependence of dvt0w"), - IOP ("pdvt1w", B3SOIPD_MOD_PDVT1W, IF_REAL, - "Cross-term dependence of dvt1w"), - IOP ("pdvt2w", B3SOIPD_MOD_PDVT2W, IF_REAL, - "Cross-term dependence of dvt2w"), - IOP ("pu0", B3SOIPD_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), - IOP ("pua", B3SOIPD_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), - IOP ("pub", B3SOIPD_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), - IOP ("puc", B3SOIPD_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), - IOP ("pvsat", B3SOIPD_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), - IOP ("pa0", B3SOIPD_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), - IOP ("pags", B3SOIPD_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), - IOP ("pb0", B3SOIPD_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), - IOP ("pb1", B3SOIPD_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), - IOP ("pketa", B3SOIPD_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), - IOP ("pketas", B3SOIPD_MOD_PKETAS, IF_REAL, - "Cross-term dependence of ketas"), - IOP ("pa1", B3SOIPD_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), - IOP ("pa2", B3SOIPD_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), - IOP ("prdsw", B3SOIPD_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), - IOP ("pprwb", B3SOIPD_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), - IOP ("pprwg", B3SOIPD_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), - IOP ("pwr", B3SOIPD_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), - IOP ("pnfactor", B3SOIPD_MOD_PNFACTOR, IF_REAL, - "Cross-term dependence of nfactor"), - IOP ("pdwg", B3SOIPD_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), - IOP ("pdwb", B3SOIPD_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), - IOP ("pvoff", B3SOIPD_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), - IOP ("peta0", B3SOIPD_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), - IOP ("petab", B3SOIPD_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), - IOP ("pdsub", B3SOIPD_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), - IOP ("pcit", B3SOIPD_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), - IOP ("pcdsc", B3SOIPD_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), - IOP ("pcdscb", B3SOIPD_MOD_PCDSCB, IF_REAL, - "Cross-term dependence of cdscb"), - IOP ("pcdscd", B3SOIPD_MOD_PCDSCD, IF_REAL, - "Cross-term dependence of cdscd"), - IOP ("ppclm", B3SOIPD_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), - IOP ("ppdiblc1", B3SOIPD_MOD_PPDIBL1, IF_REAL, - "Cross-term dependence of pdiblc1"), - IOP ("ppdiblc2", B3SOIPD_MOD_PPDIBL2, IF_REAL, - "Cross-term dependence of pdiblc2"), - IOP ("ppdiblcb", B3SOIPD_MOD_PPDIBLB, IF_REAL, - "Cross-term dependence of pdiblcb"), - IOP ("pdrout", B3SOIPD_MOD_PDROUT, IF_REAL, - "Cross-term dependence of drout"), - IOP ("ppvag", B3SOIPD_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), - IOP ("pdelta", B3SOIPD_MOD_PDELTA, IF_REAL, - "Cross-term dependence of delta"), - IOP ("palpha0", B3SOIPD_MOD_PALPHA0, IF_REAL, - "Cross-term dependence of alpha0"), - IOP ("pfbjtii", B3SOIPD_MOD_PFBJTII, IF_REAL, - "Cross-term dependence of fbjtii"), - IOP ("pbeta0", B3SOIPD_MOD_PBETA0, IF_REAL, - "Cross-term dependence of beta0"), - IOP ("pbeta1", B3SOIPD_MOD_PBETA1, IF_REAL, - "Cross-term dependence of beta1"), - IOP ("pbeta2", B3SOIPD_MOD_PBETA2, IF_REAL, - "Cross-term dependence of beta2"), - IOP ("pvdsatii0", B3SOIPD_MOD_PVDSATII0, IF_REAL, - "Cross-term dependence of vdsatii0"), - IOP ("plii", B3SOIPD_MOD_PLII, IF_REAL, "Cross-term dependence of lii"), - IOP ("pesatii", B3SOIPD_MOD_PESATII, IF_REAL, - "Cross-term dependence of esatii"), - IOP ("psii0", B3SOIPD_MOD_PSII0, IF_REAL, "Cross-term dependence of sii0"), - IOP ("psii1", B3SOIPD_MOD_PSII1, IF_REAL, "Cross-term dependence of sii1"), - IOP ("psii2", B3SOIPD_MOD_PSII2, IF_REAL, "Cross-term dependence of sii2"), - IOP ("psiid", B3SOIPD_MOD_PSIID, IF_REAL, "Cross-term dependence of siid"), - IOP ("pagidl", B3SOIPD_MOD_PAGIDL, IF_REAL, - "Cross-term dependence of agidl"), - IOP ("pbgidl", B3SOIPD_MOD_PBGIDL, IF_REAL, - "Cross-term dependence of bgidl"), - IOP ("pngidl", B3SOIPD_MOD_PNGIDL, IF_REAL, - "Cross-term dependence of ngidl"), - IOP ("pntun", B3SOIPD_MOD_PNTUN, IF_REAL, "Cross-term dependence of ntun"), - IOP ("pndiode", B3SOIPD_MOD_PNDIODE, IF_REAL, - "Cross-term dependence of ndiode"), - IOP ("pnrecf0", B3SOIPD_MOD_PNRECF0, IF_REAL, - "Cross-term dependence of nrecf0"), - IOP ("pnrecr0", B3SOIPD_MOD_PNRECR0, IF_REAL, - "Cross-term dependence of nrecr0"), - IOP ("pisbjt", B3SOIPD_MOD_PISBJT, IF_REAL, - "Cross-term dependence of isbjt"), - IOP ("pisdif", B3SOIPD_MOD_PISDIF, IF_REAL, - "Cross-term dependence of isdif"), - IOP ("pisrec", B3SOIPD_MOD_PISREC, IF_REAL, - "Cross-term dependence of isrec"), - IOP ("pistun", B3SOIPD_MOD_PISTUN, IF_REAL, - "Cross-term dependence of istun"), - IOP ("pvrec0", B3SOIPD_MOD_PVREC0, IF_REAL, - "Cross-term dependence of vrec0"), - IOP ("pvtun0", B3SOIPD_MOD_PVTUN0, IF_REAL, - "Cross-term dependence of vtun0"), - IOP ("pnbjt", B3SOIPD_MOD_PNBJT, IF_REAL, "Cross-term dependence of nbjt"), - IOP ("plbjt0", B3SOIPD_MOD_PLBJT0, IF_REAL, - "Cross-term dependence of lbjt0"), - IOP ("pvabjt", B3SOIPD_MOD_PVABJT, IF_REAL, - "Cross-term dependence of vabjt"), - IOP ("paely", B3SOIPD_MOD_PAELY, IF_REAL, "Cross-term dependence of aely"), - IOP ("pahli", B3SOIPD_MOD_PAHLI, IF_REAL, "Cross-term dependence of ahli"), - IOP ("pvsdfb", B3SOIPD_MOD_PVSDFB, IF_REAL, - "Cross-term dependence of vsdfb"), - IOP ("pvsdth", B3SOIPD_MOD_PVSDTH, IF_REAL, - "Cross-term dependence of vsdth"), - IOP ("pdelvt", B3SOIPD_MOD_PDELVT, IF_REAL, - "Cross-term dependence of delvt"), - IOP ("pacde", B3SOIPD_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), - IOP ("pmoin", B3SOIPD_MOD_PMOIN, IF_REAL, "Cross-term dependence of amoin"), +IOP( "pnch", B3SOIPD_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), +IOP( "pnsub", B3SOIPD_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), +IOP( "pngate", B3SOIPD_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), +IOP( "pvth0", B3SOIPD_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"), +IOP( "pk1", B3SOIPD_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), +IOP( "pk1w1", B3SOIPD_MOD_PK1W1, IF_REAL, "Cross-term dependence of k1w1"), +IOP( "pk1w2", B3SOIPD_MOD_PK1W2, IF_REAL, "Cross-term dependence of k1w2"), +IOP( "pk2", B3SOIPD_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), +IOP( "pk3", B3SOIPD_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), +IOP( "pk3b", B3SOIPD_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), +IOP( "pkb1", B3SOIPD_MOD_PKB1, IF_REAL, "Cross-term dependence of kb1"), +IOP( "pw0", B3SOIPD_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), +IOP( "pnlx", B3SOIPD_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), +IOP( "pdvt0", B3SOIPD_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), +IOP( "pdvt1", B3SOIPD_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), +IOP( "pdvt2", B3SOIPD_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), +IOP( "pdvt0w", B3SOIPD_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), +IOP( "pdvt1w", B3SOIPD_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), +IOP( "pdvt2w", B3SOIPD_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), +IOP( "pu0", B3SOIPD_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), +IOP( "pua", B3SOIPD_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), +IOP( "pub", B3SOIPD_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), +IOP( "puc", B3SOIPD_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), +IOP( "pvsat", B3SOIPD_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), +IOP( "pa0", B3SOIPD_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), +IOP( "pags", B3SOIPD_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), +IOP( "pb0", B3SOIPD_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), +IOP( "pb1", B3SOIPD_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), +IOP( "pketa", B3SOIPD_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), +IOP( "pketas", B3SOIPD_MOD_PKETAS, IF_REAL, "Cross-term dependence of ketas"), +IOP( "pa1", B3SOIPD_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), +IOP( "pa2", B3SOIPD_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), +IOP( "prdsw", B3SOIPD_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), +IOP( "pprwb", B3SOIPD_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), +IOP( "pprwg", B3SOIPD_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), +IOP( "pwr", B3SOIPD_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), +IOP( "pnfactor", B3SOIPD_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), +IOP( "pdwg", B3SOIPD_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), +IOP( "pdwb", B3SOIPD_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), +IOP( "pvoff", B3SOIPD_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), +IOP( "peta0", B3SOIPD_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), +IOP( "petab", B3SOIPD_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), +IOP( "pdsub", B3SOIPD_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), +IOP( "pcit", B3SOIPD_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), +IOP( "pcdsc", B3SOIPD_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), +IOP( "pcdscb", B3SOIPD_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), +IOP( "pcdscd", B3SOIPD_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), +IOP( "ppclm", B3SOIPD_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), +IOP( "ppdiblc1", B3SOIPD_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), +IOP( "ppdiblc2", B3SOIPD_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), +IOP( "ppdiblcb", B3SOIPD_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), +IOP( "pdrout", B3SOIPD_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), +IOP( "ppvag", B3SOIPD_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), +IOP( "pdelta", B3SOIPD_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), +IOP( "palpha0", B3SOIPD_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), +IOP( "pfbjtii", B3SOIPD_MOD_PFBJTII, IF_REAL, "Cross-term dependence of fbjtii"), +IOP( "pbeta0", B3SOIPD_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), +IOP( "pbeta1", B3SOIPD_MOD_PBETA1, IF_REAL, "Cross-term dependence of beta1"), +IOP( "pbeta2", B3SOIPD_MOD_PBETA2, IF_REAL, "Cross-term dependence of beta2"), +IOP( "pvdsatii0", B3SOIPD_MOD_PVDSATII0, IF_REAL, "Cross-term dependence of vdsatii0"), +IOP( "plii", B3SOIPD_MOD_PLII, IF_REAL, "Cross-term dependence of lii"), +IOP( "pesatii", B3SOIPD_MOD_PESATII, IF_REAL, "Cross-term dependence of esatii"), +IOP( "psii0", B3SOIPD_MOD_PSII0, IF_REAL, "Cross-term dependence of sii0"), +IOP( "psii1", B3SOIPD_MOD_PSII1, IF_REAL, "Cross-term dependence of sii1"), +IOP( "psii2", B3SOIPD_MOD_PSII2, IF_REAL, "Cross-term dependence of sii2"), +IOP( "psiid", B3SOIPD_MOD_PSIID, IF_REAL, "Cross-term dependence of siid"), +IOP( "pagidl", B3SOIPD_MOD_PAGIDL, IF_REAL, "Cross-term dependence of agidl"), +IOP( "pbgidl", B3SOIPD_MOD_PBGIDL, IF_REAL, "Cross-term dependence of bgidl"), +IOP( "pngidl", B3SOIPD_MOD_PNGIDL, IF_REAL, "Cross-term dependence of ngidl"), +IOP( "pntun", B3SOIPD_MOD_PNTUN, IF_REAL, "Cross-term dependence of ntun"), +IOP( "pndiode", B3SOIPD_MOD_PNDIODE, IF_REAL, "Cross-term dependence of ndiode"), +IOP( "pnrecf0", B3SOIPD_MOD_PNRECF0, IF_REAL, "Cross-term dependence of nrecf0"), +IOP( "pnrecr0", B3SOIPD_MOD_PNRECR0, IF_REAL, "Cross-term dependence of nrecr0"), +IOP( "pisbjt", B3SOIPD_MOD_PISBJT, IF_REAL, "Cross-term dependence of isbjt"), +IOP( "pisdif", B3SOIPD_MOD_PISDIF, IF_REAL, "Cross-term dependence of isdif"), +IOP( "pisrec", B3SOIPD_MOD_PISREC, IF_REAL, "Cross-term dependence of isrec"), +IOP( "pistun", B3SOIPD_MOD_PISTUN, IF_REAL, "Cross-term dependence of istun"), +IOP( "pvrec0", B3SOIPD_MOD_PVREC0, IF_REAL, "Cross-term dependence of vrec0"), +IOP( "pvtun0", B3SOIPD_MOD_PVTUN0, IF_REAL, "Cross-term dependence of vtun0"), +IOP( "pnbjt", B3SOIPD_MOD_PNBJT, IF_REAL, "Cross-term dependence of nbjt"), +IOP( "plbjt0", B3SOIPD_MOD_PLBJT0, IF_REAL, "Cross-term dependence of lbjt0"), +IOP( "pvabjt", B3SOIPD_MOD_PVABJT, IF_REAL, "Cross-term dependence of vabjt"), +IOP( "paely", B3SOIPD_MOD_PAELY, IF_REAL, "Cross-term dependence of aely"), +IOP( "pahli", B3SOIPD_MOD_PAHLI, IF_REAL, "Cross-term dependence of ahli"), +IOP( "pvsdfb", B3SOIPD_MOD_PVSDFB, IF_REAL, "Cross-term dependence of vsdfb"), +IOP( "pvsdth", B3SOIPD_MOD_PVSDTH, IF_REAL, "Cross-term dependence of vsdth"), +IOP( "pdelvt", B3SOIPD_MOD_PDELVT, IF_REAL, "Cross-term dependence of delvt"), +IOP( "pacde", B3SOIPD_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), +IOP( "pmoin", B3SOIPD_MOD_PMOIN, IF_REAL, "Cross-term dependence of amoin"), /* Added for binning - END */ - IP ("nmos", B3SOIPD_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), - IP ("pmos", B3SOIPD_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), +IP( "nmos", B3SOIPD_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), +IP( "pmos", B3SOIPD_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), }; char *B3SOIPDnames[] = { - "Drain", - "Gate", - "Source", - "Backgate", - "", - "Body", - "Temp", - "Charge", + "Drain", + "Gate", + "Source", + "Backgate", + "", + "Body", + "Temp", + "Charge", }; -int B3SOIPDnSize = NUMELEMS (B3SOIPDnames); -int B3SOIPDpTSize = NUMELEMS (B3SOIPDpTable); -int B3SOIPDmPTSize = NUMELEMS (B3SOIPDmPTable); -int B3SOIPDiSize = sizeof (B3SOIPDinstance); -int B3SOIPDmSize = sizeof (B3SOIPDmodel); +int B3SOIPDnSize = NUMELEMS(B3SOIPDnames); +int B3SOIPDpTSize = NUMELEMS(B3SOIPDpTable); +int B3SOIPDmPTSize = NUMELEMS(B3SOIPDmPTable); +int B3SOIPDiSize = sizeof(B3SOIPDinstance); +int B3SOIPDmSize = sizeof(B3SOIPDmodel); + + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdacld.c b/src/spicelib/devices/bsim3soi_pd/b3soipdacld.c index 35c78ab62..866ca15b8 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdacld.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdacld.c @@ -4,10 +4,15 @@ Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soipdacld.c 98/5/01 Modified by Pin Su 99/4/30 Modified by Pin Su 99/9/27 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ + #include "ngspice.h" -#include #include "cktdefs.h" #include "b3soipddef.h" #include "sperror.h" @@ -15,344 +20,339 @@ Modified by Pin Su 99/9/27 int -B3SOIPDacLoad (inModel, ckt) - GENmodel *inModel; - CKTcircuit *ckt; +B3SOIPDacLoad(GENmodel *inModel, CKTcircuit *ckt) { - 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; - double xcbgb, xcbdb, xcbsb, xcbeb, xcbT; - double xcegb, xceeb, xceT; - double gdpr, gspr, gds; - double cggb, cgdb, cgsb, cgT; - double cdgb, cddb, cdsb, cdeb, cdT; - double cbgb, cbdb, cbsb, cbeb, cbT; - double ceeb, ceT; - double GSoverlapCap, GDoverlapCap, GEoverlapCap, FwdSum, RevSum, Gm, Gmbs, - GmT; - double omega; - double dxpart, sxpart; - double gbbg, gbbdp, gbbb, gbbp, gbbsp, gbbT; - double gddpg, gddpdp, gddpsp, gddpb, gddpT; - double gsspg, gsspdp, gsspsp, gsspb, gsspT; - double gppdp, gppb, gppp, gppT; - double xcTt, cTt, gcTt, gTtt, gTtg, gTtb, gTtdp, gTtsp; - double EDextrinsicCap, ESextrinsicCap; - double xcedb, xcesb; - - - omega = ckt->CKTomega; - for (; model != NULL; model = model->B3SOIPDnextModel) - { - - for (here = model->B3SOIPDinstances; here != NULL; - here = here->B3SOIPDnextInstance) - { - selfheat = (model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0 != 0.0); - if (here->B3SOIPDmode >= 0) - { - Gm = here->B3SOIPDgm; - Gmbs = here->B3SOIPDgmbs; - GmT = model->B3SOIPDtype * here->B3SOIPDgmT; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - - cbgb = here->B3SOIPDcbgb; - cbsb = here->B3SOIPDcbsb; - cbdb = here->B3SOIPDcbdb; - cbeb = here->B3SOIPDcbeb; - cbT = model->B3SOIPDtype * here->B3SOIPDcbT; - - ceeb = here->B3SOIPDceeb; - ceT = model->B3SOIPDtype * here->B3SOIPDceT; - - cggb = here->B3SOIPDcggb; - cgsb = here->B3SOIPDcgsb; - cgdb = here->B3SOIPDcgdb; - cgT = model->B3SOIPDtype * here->B3SOIPDcgT; - - cdgb = here->B3SOIPDcdgb; - cdsb = here->B3SOIPDcdsb; - cddb = here->B3SOIPDcddb; - cdeb = here->B3SOIPDcdeb; - cdT = model->B3SOIPDtype * here->B3SOIPDcdT; - - cTt = here->pParam->B3SOIPDcth; - - gbbg = -here->B3SOIPDgbgs; - gbbdp = -here->B3SOIPDgbds; - gbbb = -here->B3SOIPDgbbs; - gbbp = -here->B3SOIPDgbps; - gbbT = -model->B3SOIPDtype * here->B3SOIPDgbT; - gbbsp = -(gbbg + gbbdp + gbbb + gbbp); - - gddpg = -here->B3SOIPDgjdg; - gddpdp = -here->B3SOIPDgjdd; - gddpb = -here->B3SOIPDgjdb; - gddpT = -model->B3SOIPDtype * here->B3SOIPDgjdT; - gddpsp = -(gddpg + gddpdp + gddpb); - - gsspg = -here->B3SOIPDgjsg; - gsspdp = -here->B3SOIPDgjsd; - gsspb = -here->B3SOIPDgjsb; - gsspT = -model->B3SOIPDtype * here->B3SOIPDgjsT; - gsspsp = -(gsspg + gsspdp + gsspb); - - gppdp = 0; - gppb = -here->B3SOIPDgbpbs; - gppp = -here->B3SOIPDgbpps; - gppT = -model->B3SOIPDtype * here->B3SOIPDgbpT; - - gTtg = here->B3SOIPDgtempg; - gTtb = here->B3SOIPDgtempb; - gTtdp = here->B3SOIPDgtempd; - gTtt = here->B3SOIPDgtempT; - gTtsp = -(gTtg + gTtb + gTtdp); - - sxpart = 0.6; - dxpart = 0.4; - - } - else - { - Gm = -here->B3SOIPDgm; - Gmbs = -here->B3SOIPDgmbs; - GmT = -model->B3SOIPDtype * here->B3SOIPDgmT; - FwdSum = 0.0; - RevSum = -Gm - Gmbs; - - cdgb = - -(here->B3SOIPDcdgb + here->B3SOIPDcggb + here->B3SOIPDcbgb); - cdsb = - -(here->B3SOIPDcddb + here->B3SOIPDcgdb + here->B3SOIPDcbdb); - cddb = - -(here->B3SOIPDcdsb + here->B3SOIPDcgsb + here->B3SOIPDcbsb); - cdeb = - -(here->B3SOIPDcdeb + here->B3SOIPDcbeb + here->B3SOIPDceeb); - cdT = - -model->B3SOIPDtype * (here->B3SOIPDcgT + here->B3SOIPDcbT + - here->B3SOIPDcdT + here->B3SOIPDceT); - - ceeb = here->B3SOIPDceeb; - ceT = model->B3SOIPDtype * here->B3SOIPDceT; - - cggb = here->B3SOIPDcggb; - cgsb = here->B3SOIPDcgdb; - cgdb = here->B3SOIPDcgsb; - cgT = model->B3SOIPDtype * here->B3SOIPDcgT; - - cbgb = here->B3SOIPDcbgb; - cbsb = here->B3SOIPDcbdb; - cbdb = here->B3SOIPDcbsb; - cbeb = here->B3SOIPDcbeb; - cbT = model->B3SOIPDtype * here->B3SOIPDcbT; - - cTt = here->pParam->B3SOIPDcth; - - gbbg = -here->B3SOIPDgbgs; - gbbb = -here->B3SOIPDgbbs; - gbbp = -here->B3SOIPDgbps; - gbbsp = -here->B3SOIPDgbds; - gbbT = -model->B3SOIPDtype * here->B3SOIPDgbT; - gbbdp = -(gbbg + gbbsp + gbbb + gbbp); - - gddpg = -here->B3SOIPDgjsg; - gddpsp = -here->B3SOIPDgjsd; - gddpb = -here->B3SOIPDgjsb; - gddpT = -model->B3SOIPDtype * here->B3SOIPDgjsT; - gddpdp = -(gddpg + gddpsp + gddpb); - - gsspg = -here->B3SOIPDgjdg; - gsspsp = -here->B3SOIPDgjdd; - gsspb = -here->B3SOIPDgjdb; - gsspT = -model->B3SOIPDtype * here->B3SOIPDgjdT; - gsspdp = -(gsspg + gsspsp + gsspb); - - gppb = -here->B3SOIPDgbpbs; - gppp = -here->B3SOIPDgbpps; - gppT = -model->B3SOIPDtype * here->B3SOIPDgbpT; - gppdp = -(gppb + gppp); - - gTtt = here->B3SOIPDgtempT; - gTtg = here->B3SOIPDgtempg; - gTtb = here->B3SOIPDgtempb; - gTtdp = here->B3SOIPDgtempd; - gTtsp = -(gTtt + gTtg + gTtb + gTtdp); - - gTtg = here->B3SOIPDgtempg; - gTtb = here->B3SOIPDgtempb; - gTtsp = here->B3SOIPDgtempd; - gTtt = here->B3SOIPDgtempT; - gTtdp = -(gTtg + gTtb + gTtsp); - - sxpart = 0.6; - sxpart = 0.4; - dxpart = 0.6; - } - - gdpr = here->B3SOIPDdrainConductance; - gspr = here->B3SOIPDsourceConductance; - gds = here->B3SOIPDgds; - - GSoverlapCap = here->B3SOIPDcgso; - GDoverlapCap = here->B3SOIPDcgdo; - GEoverlapCap = here->pParam->B3SOIPDcgeo; - - EDextrinsicCap = here->B3SOIPDgcde; - ESextrinsicCap = here->B3SOIPDgcse; - xcedb = -EDextrinsicCap * omega; - xcdeb = (cdeb - EDextrinsicCap) * omega; - xcddb = (cddb + GDoverlapCap + EDextrinsicCap) * omega; - xceeb = - (ceeb + GEoverlapCap + EDextrinsicCap + ESextrinsicCap) * omega; - xcesb = -ESextrinsicCap * omega; - xcssb = - (GSoverlapCap + ESextrinsicCap - (cgsb + cbsb + cdsb)) * omega; - - xcseb = -(cbeb + cdeb + ceeb + ESextrinsicCap) * omega; - - xcegb = (-GEoverlapCap) * omega; - xceT = ceT * omega; - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GEoverlapCap) * omega; - xcgdb = (cgdb - GDoverlapCap) * omega; - xcgsb = (cgsb - GSoverlapCap) * omega; - xcgeb = (-GEoverlapCap) * omega; - xcgT = cgT * omega; - - xcdgb = (cdgb - GDoverlapCap) * omega; - xcdsb = cdsb * omega; - xcdT = cdT * omega; - - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega; - xcsdb = -(cgdb + cbdb + cddb) * omega; - xcsT = -(cgT + cbT + cdT + ceT) * omega; - - xcbgb = cbgb * omega; - xcbdb = cbdb * omega; - xcbsb = cbsb * omega; - xcbeb = cbeb * omega; - xcbT = cbT * omega; - - xcTt = cTt * omega; - - *(here->B3SOIPDEdpPtr + 1) += xcedb; - *(here->B3SOIPDEspPtr + 1) += xcesb; - *(here->B3SOIPDDPePtr + 1) += xcdeb; - *(here->B3SOIPDSPePtr + 1) += xcseb; - *(here->B3SOIPDEgPtr + 1) += xcegb; - *(here->B3SOIPDGePtr + 1) += xcgeb; - - *(here->B3SOIPDEePtr + 1) += xceeb; - - *(here->B3SOIPDGgPtr + 1) += xcggb; - *(here->B3SOIPDGdpPtr + 1) += xcgdb; - *(here->B3SOIPDGspPtr + 1) += xcgsb; - - *(here->B3SOIPDDPgPtr + 1) += xcdgb; - *(here->B3SOIPDDPdpPtr + 1) += xcddb; - *(here->B3SOIPDDPspPtr + 1) += xcdsb; - - *(here->B3SOIPDSPgPtr + 1) += xcsgb; - *(here->B3SOIPDSPdpPtr + 1) += xcsdb; - *(here->B3SOIPDSPspPtr + 1) += xcssb; - - *(here->B3SOIPDBePtr + 1) += xcbeb; - *(here->B3SOIPDBgPtr + 1) += xcbgb; - *(here->B3SOIPDBdpPtr + 1) += xcbdb; - *(here->B3SOIPDBspPtr + 1) += xcbsb; - - *(here->B3SOIPDEbPtr + 1) -= xcegb + xceeb + xcedb + xcesb; - - *(here->B3SOIPDGbPtr + 1) -= xcggb + xcgdb + xcgsb + xcgeb; - *(here->B3SOIPDDPbPtr + 1) -= xcdgb + xcddb + xcdsb + xcdeb; - *(here->B3SOIPDSPbPtr + 1) -= xcsgb + xcsdb + xcssb + xcseb; - *(here->B3SOIPDBbPtr + 1) -= xcbgb + xcbdb + xcbsb + xcbeb; - - if (selfheat) - { - *(here->B3SOIPDTemptempPtr + 1) += xcTt; - *(here->B3SOIPDDPtempPtr + 1) += xcdT; - *(here->B3SOIPDSPtempPtr + 1) += xcsT; - *(here->B3SOIPDBtempPtr + 1) += xcbT; - *(here->B3SOIPDEtempPtr + 1) += xceT; - *(here->B3SOIPDGtempPtr + 1) += xcgT; - } - - - - *(here->B3SOIPDEePtr) += 0.0; - - *(here->B3SOIPDDPgPtr) += Gm + gddpg; - *(here->B3SOIPDDPdpPtr) += gdpr + gds + gddpdp + RevSum; - *(here->B3SOIPDDPspPtr) -= gds + FwdSum - gddpsp; - *(here->B3SOIPDDPdPtr) -= gdpr; - - *(here->B3SOIPDSPgPtr) -= Gm - gsspg; - *(here->B3SOIPDSPdpPtr) -= gds + RevSum - gsspdp; - *(here->B3SOIPDSPspPtr) += gspr + gds + FwdSum + gsspsp; - *(here->B3SOIPDSPsPtr) -= gspr; - - *(here->B3SOIPDBePtr) += 0; - *(here->B3SOIPDBgPtr) += gbbg; - *(here->B3SOIPDBdpPtr) += gbbdp; - *(here->B3SOIPDBspPtr) += gbbsp; - *(here->B3SOIPDBbPtr) += gbbb; - *(here->B3SOIPDEbPtr) += 0.0; - *(here->B3SOIPDSPbPtr) -= Gmbs - gsspb; - *(here->B3SOIPDDPbPtr) -= (-gddpb - Gmbs); - - if (selfheat) - { - *(here->B3SOIPDDPtempPtr) += GmT + gddpT; - *(here->B3SOIPDSPtempPtr) += -GmT + gsspT; - *(here->B3SOIPDBtempPtr) += gbbT; - - *(here->B3SOIPDTemptempPtr) += - gTtt + 1 / here->pParam->B3SOIPDrth; - *(here->B3SOIPDTempgPtr) += gTtg; - *(here->B3SOIPDTempbPtr) += gTtb; - *(here->B3SOIPDTempdpPtr) += gTtdp; - *(here->B3SOIPDTempspPtr) += gTtsp; - } - - - *(here->B3SOIPDDdPtr) += gdpr; - *(here->B3SOIPDDdpPtr) -= gdpr; - *(here->B3SOIPDSsPtr) += gspr; - *(here->B3SOIPDSspPtr) -= gspr; - - - if (here->B3SOIPDbodyMod == 1) - { - (*(here->B3SOIPDBpPtr) -= gppp); - (*(here->B3SOIPDPbPtr) += gppb); - (*(here->B3SOIPDPpPtr) += gppp); - } - if (here->B3SOIPDdebugMod != 0) - { - *(here->B3SOIPDVbsPtr) += 1; - *(here->B3SOIPDIdsPtr) += 1; - *(here->B3SOIPDIcPtr) += 1; - *(here->B3SOIPDIbsPtr) += 1; - *(here->B3SOIPDIbdPtr) += 1; - *(here->B3SOIPDIiiPtr) += 1; - *(here->B3SOIPDIgidlPtr) += 1; - *(here->B3SOIPDItunPtr) += 1; - *(here->B3SOIPDIbpPtr) += 1; - *(here->B3SOIPDCbgPtr) += 1; - *(here->B3SOIPDCbbPtr) += 1; - *(here->B3SOIPDCbdPtr) += 1; - *(here->B3SOIPDQbfPtr) += 1; - *(here->B3SOIPDQjsPtr) += 1; - *(here->B3SOIPDQjdPtr) += 1; - - } - - } +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; +double xcbgb, xcbdb, xcbsb, xcbeb, xcbT; +double xcegb, xceeb, xceT; +double gdpr, gspr, gds; +double cggb, cgdb, cgsb, cgT; +double cdgb, cddb, cdsb, cdeb, cdT; +double cbgb, cbdb, cbsb, cbeb, cbT; +double ceeb, ceT; +double GSoverlapCap, GDoverlapCap, GEoverlapCap, FwdSum, RevSum, Gm, Gmbs, GmT; +double omega; +double dxpart, sxpart; +double gbbg, gbbdp, gbbb, gbbp, gbbsp, gbbT; +double gddpg, gddpdp, gddpsp, gddpb, gddpT; +double gsspg, gsspdp, gsspsp, gsspb, gsspT; +double gppdp, gppb, gppp, gppT; +double xcTt, cTt, gcTt, gTtt, gTtg, gTtb, gTtdp, gTtsp; +double EDextrinsicCap, ESextrinsicCap; +double xcedb, xcesb; + +double m; + + omega = ckt->CKTomega; + for (; model != NULL; model = model->B3SOIPDnextModel) + { + + for (here = model->B3SOIPDinstances; here!= NULL; + here = here->B3SOIPDnextInstance) + { + + if (here->B3SOIPDowner != ARCHme) + continue; + + selfheat = (model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0 != 0.0); + if (here->B3SOIPDmode >= 0) + { Gm = here->B3SOIPDgm; + Gmbs = here->B3SOIPDgmbs; + GmT = model->B3SOIPDtype * here->B3SOIPDgmT; + FwdSum = Gm + Gmbs; + RevSum = 0.0; + + cbgb = here->B3SOIPDcbgb; + cbsb = here->B3SOIPDcbsb; + cbdb = here->B3SOIPDcbdb; + cbeb = here->B3SOIPDcbeb; + cbT = model->B3SOIPDtype * here->B3SOIPDcbT; + + ceeb = here->B3SOIPDceeb; + ceT = model->B3SOIPDtype * here->B3SOIPDceT; + + cggb = here->B3SOIPDcggb; + cgsb = here->B3SOIPDcgsb; + cgdb = here->B3SOIPDcgdb; + cgT = model->B3SOIPDtype * here->B3SOIPDcgT; + + cdgb = here->B3SOIPDcdgb; + cdsb = here->B3SOIPDcdsb; + cddb = here->B3SOIPDcddb; + cdeb = here->B3SOIPDcdeb; + cdT = model->B3SOIPDtype * here->B3SOIPDcdT; + + cTt = here->pParam->B3SOIPDcth; + + gbbg = -here->B3SOIPDgbgs; + gbbdp = -here->B3SOIPDgbds; + gbbb = -here->B3SOIPDgbbs; + gbbp = -here->B3SOIPDgbps; + gbbT = -model->B3SOIPDtype * here->B3SOIPDgbT; + gbbsp = - ( gbbg + gbbdp + gbbb + gbbp); + + gddpg = -here->B3SOIPDgjdg; + gddpdp = -here->B3SOIPDgjdd; + gddpb = -here->B3SOIPDgjdb; + gddpT = -model->B3SOIPDtype * here->B3SOIPDgjdT; + gddpsp = - ( gddpg + gddpdp + gddpb ); + + gsspg = -here->B3SOIPDgjsg; + gsspdp = -here->B3SOIPDgjsd; + gsspb = -here->B3SOIPDgjsb; + gsspT = -model->B3SOIPDtype * here->B3SOIPDgjsT; + gsspsp = - (gsspg + gsspdp + gsspb ); + + gppdp = 0; + gppb = -here->B3SOIPDgbpbs; + gppp = -here->B3SOIPDgbpps; + gppT = -model->B3SOIPDtype * here->B3SOIPDgbpT; + + gTtg = here->B3SOIPDgtempg; + gTtb = here->B3SOIPDgtempb; + gTtdp = here->B3SOIPDgtempd; + gTtt = here->B3SOIPDgtempT; + gTtsp = - (gTtg + gTtb + gTtdp); + + sxpart = 0.6; + dxpart = 0.4; + + } + else + { Gm = -here->B3SOIPDgm; + Gmbs = -here->B3SOIPDgmbs; + GmT = -model->B3SOIPDtype * here->B3SOIPDgmT; + FwdSum = 0.0; + RevSum = -Gm - Gmbs ; + + cdgb = - (here->B3SOIPDcdgb + here->B3SOIPDcggb + here->B3SOIPDcbgb); + cdsb = - (here->B3SOIPDcddb + here->B3SOIPDcgdb + here->B3SOIPDcbdb); + cddb = - (here->B3SOIPDcdsb + here->B3SOIPDcgsb + here->B3SOIPDcbsb); + cdeb = - (here->B3SOIPDcdeb + here->B3SOIPDcbeb + here->B3SOIPDceeb); + cdT = - model->B3SOIPDtype * (here->B3SOIPDcgT + here->B3SOIPDcbT + + here->B3SOIPDcdT + here->B3SOIPDceT); + + ceeb = here->B3SOIPDceeb; + ceT = model->B3SOIPDtype * here->B3SOIPDceT; + + cggb = here->B3SOIPDcggb; + cgsb = here->B3SOIPDcgdb; + cgdb = here->B3SOIPDcgsb; + cgT = model->B3SOIPDtype * here->B3SOIPDcgT; + + cbgb = here->B3SOIPDcbgb; + cbsb = here->B3SOIPDcbdb; + cbdb = here->B3SOIPDcbsb; + cbeb = here->B3SOIPDcbeb; + cbT = model->B3SOIPDtype * here->B3SOIPDcbT; + + cTt = here->pParam->B3SOIPDcth; + + gbbg = -here->B3SOIPDgbgs; + gbbb = -here->B3SOIPDgbbs; + gbbp = -here->B3SOIPDgbps; + gbbsp = -here->B3SOIPDgbds; + gbbT = -model->B3SOIPDtype * here->B3SOIPDgbT; + gbbdp = - ( gbbg + gbbsp + gbbb + gbbp); + + gddpg = -here->B3SOIPDgjsg; + gddpsp = -here->B3SOIPDgjsd; + gddpb = -here->B3SOIPDgjsb; + gddpT = -model->B3SOIPDtype * here->B3SOIPDgjsT; + gddpdp = - (gddpg + gddpsp + gddpb ); + + gsspg = -here->B3SOIPDgjdg; + gsspsp = -here->B3SOIPDgjdd; + gsspb = -here->B3SOIPDgjdb; + gsspT = -model->B3SOIPDtype * here->B3SOIPDgjdT; + gsspdp = - ( gsspg + gsspsp + gsspb ); + + gppb = -here->B3SOIPDgbpbs; + gppp = -here->B3SOIPDgbpps; + gppT = -model->B3SOIPDtype * here->B3SOIPDgbpT; + gppdp = - (gppb + gppp); + + gTtt = here->B3SOIPDgtempT; + gTtg = here->B3SOIPDgtempg; + gTtb = here->B3SOIPDgtempb; + gTtdp = here->B3SOIPDgtempd; + gTtsp = - (gTtt + gTtg + gTtb + gTtdp); + + gTtg = here->B3SOIPDgtempg; + gTtb = here->B3SOIPDgtempb; + gTtsp = here->B3SOIPDgtempd; + gTtt = here->B3SOIPDgtempT; + gTtdp = - (gTtg + gTtb + gTtsp); + + sxpart = 0.6; + sxpart = 0.4; + dxpart = 0.6; + } + + gdpr=here->B3SOIPDdrainConductance; + gspr=here->B3SOIPDsourceConductance; + gds= here->B3SOIPDgds; + + GSoverlapCap = here->B3SOIPDcgso; + GDoverlapCap = here->B3SOIPDcgdo; + GEoverlapCap = here->pParam->B3SOIPDcgeo; + + EDextrinsicCap = here->B3SOIPDgcde; + ESextrinsicCap = here->B3SOIPDgcse; + xcedb = -EDextrinsicCap * omega; + xcdeb = (cdeb - EDextrinsicCap) * omega; + xcddb = (cddb + GDoverlapCap + EDextrinsicCap) * omega; + xceeb = (ceeb + GEoverlapCap + EDextrinsicCap + ESextrinsicCap) * omega; + xcesb = -ESextrinsicCap * omega; + xcssb = (GSoverlapCap + ESextrinsicCap - (cgsb + cbsb + cdsb)) * omega; + + xcseb = -(cbeb + cdeb + ceeb + ESextrinsicCap) * omega; + + xcegb = (- GEoverlapCap) * omega; + xceT = ceT * omega; + xcggb = (cggb + GDoverlapCap + GSoverlapCap + GEoverlapCap) + * omega; + xcgdb = (cgdb - GDoverlapCap ) * omega; + xcgsb = (cgsb - GSoverlapCap) * omega; + xcgeb = (- GEoverlapCap) * omega; + xcgT = cgT * omega; + + xcdgb = (cdgb - GDoverlapCap) * omega; + xcdsb = cdsb * omega; + xcdT = cdT * omega; + + xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega; + xcsdb = -(cgdb + cbdb + cddb) * omega; + xcsT = -(cgT + cbT + cdT + ceT) * omega; + + xcbgb = cbgb * omega; + xcbdb = cbdb * omega; + xcbsb = cbsb * omega; + xcbeb = cbeb * omega; + xcbT = cbT * omega; + + xcTt = cTt * omega; + + m = here->B3SOIPDm; + + *(here->B3SOIPDEdpPtr +1) += m * xcedb; + *(here->B3SOIPDEspPtr +1) += m * xcesb; + *(here->B3SOIPDDPePtr +1) += m * xcdeb; + *(here->B3SOIPDSPePtr +1) += m * xcseb; + *(here->B3SOIPDEgPtr +1) += m * xcegb; + *(here->B3SOIPDGePtr +1) += m * xcgeb; + + *(here->B3SOIPDEePtr +1) += m * xceeb; + + *(here->B3SOIPDGgPtr +1) += m * xcggb; + *(here->B3SOIPDGdpPtr +1) += m * xcgdb; + *(here->B3SOIPDGspPtr +1) += m * xcgsb; + + *(here->B3SOIPDDPgPtr +1) += m * xcdgb; + *(here->B3SOIPDDPdpPtr +1) += m * xcddb; + *(here->B3SOIPDDPspPtr +1) += m * xcdsb; + + *(here->B3SOIPDSPgPtr +1) += m * xcsgb; + *(here->B3SOIPDSPdpPtr +1) += m * xcsdb; + *(here->B3SOIPDSPspPtr +1) += m * xcssb; + + *(here->B3SOIPDBePtr +1) += m * xcbeb; + *(here->B3SOIPDBgPtr +1) += m * xcbgb; + *(here->B3SOIPDBdpPtr +1) += m * xcbdb; + *(here->B3SOIPDBspPtr +1) += m * xcbsb; + + *(here->B3SOIPDEbPtr +1) -= m * (xcegb + xceeb + xcedb + xcesb); + + *(here->B3SOIPDGbPtr +1) -= m * (xcggb + xcgdb + xcgsb + xcgeb); + *(here->B3SOIPDDPbPtr +1) -= m * (xcdgb + xcddb + xcdsb + xcdeb); + *(here->B3SOIPDSPbPtr +1) -= m * (xcsgb + xcsdb + xcssb + xcseb); + *(here->B3SOIPDBbPtr +1) -= m * (xcbgb + xcbdb + xcbsb + xcbeb); + + if (selfheat) + { + *(here->B3SOIPDTemptempPtr + 1) += m * xcTt; + *(here->B3SOIPDDPtempPtr + 1) += m * xcdT; + *(here->B3SOIPDSPtempPtr + 1) += m * xcsT; + *(here->B3SOIPDBtempPtr + 1) += m * xcbT; + *(here->B3SOIPDEtempPtr + 1) += m * xceT; + *(here->B3SOIPDGtempPtr + 1) += m * xcgT; + } + + + + *(here->B3SOIPDEePtr) += 0.0; + + *(here->B3SOIPDDPgPtr) += m * (Gm + gddpg); + *(here->B3SOIPDDPdpPtr) += m * (gdpr + gds + gddpdp + RevSum); + *(here->B3SOIPDDPspPtr) -= m * (gds + FwdSum - gddpsp); + *(here->B3SOIPDDPdPtr) -= m * gdpr; + + *(here->B3SOIPDSPgPtr) -= m * (Gm - gsspg); + *(here->B3SOIPDSPdpPtr) -= m * (gds + RevSum - gsspdp); + *(here->B3SOIPDSPspPtr) += m * (gspr + gds + FwdSum + gsspsp); + *(here->B3SOIPDSPsPtr) -= m * gspr; + + *(here->B3SOIPDBePtr) += 0; + *(here->B3SOIPDBgPtr) += m * gbbg; + *(here->B3SOIPDBdpPtr) += m * gbbdp; + *(here->B3SOIPDBspPtr) += m * gbbsp; + *(here->B3SOIPDBbPtr) += m * gbbb; + *(here->B3SOIPDEbPtr) += 0.0; + *(here->B3SOIPDSPbPtr) -= m * Gmbs - gsspb; + *(here->B3SOIPDDPbPtr) -= m * (-gddpb - Gmbs); + + if (selfheat) + { + *(here->B3SOIPDDPtempPtr) += m * (GmT + gddpT); + *(here->B3SOIPDSPtempPtr) += m * (-GmT + gsspT); + *(here->B3SOIPDBtempPtr) += m * gbbT; + + *(here->B3SOIPDTemptempPtr) += m * (gTtt + 1/here->pParam->B3SOIPDrth); + *(here->B3SOIPDTempgPtr) += m * gTtg; + *(here->B3SOIPDTempbPtr) += m * gTtb; + *(here->B3SOIPDTempdpPtr) += m * gTtdp; + *(here->B3SOIPDTempspPtr) += m * gTtsp; + } + + + *(here->B3SOIPDDdPtr) += m * gdpr; + *(here->B3SOIPDDdpPtr) -= m * gdpr; + *(here->B3SOIPDSsPtr) += m * gspr; + *(here->B3SOIPDSspPtr) -= m * gspr; + + + if (here->B3SOIPDbodyMod == 1) { + (*(here->B3SOIPDBpPtr) -= m * gppp); + (*(here->B3SOIPDPbPtr) += m * gppb); + (*(here->B3SOIPDPpPtr) += m * gppp); + } + if (here->B3SOIPDdebugMod != 0) + { + *(here->B3SOIPDVbsPtr) += m * 1; + *(here->B3SOIPDIdsPtr) += m * 1; + *(here->B3SOIPDIcPtr) += m * 1; + *(here->B3SOIPDIbsPtr) += m * 1; + *(here->B3SOIPDIbdPtr) += m * 1; + *(here->B3SOIPDIiiPtr) += m * 1; + *(here->B3SOIPDIgidlPtr) += m * 1; + *(here->B3SOIPDItunPtr) += m * 1; + *(here->B3SOIPDIbpPtr) += m * 1; + *(here->B3SOIPDCbgPtr) += m * 1; + *(here->B3SOIPDCbbPtr) += m * 1; + *(here->B3SOIPDCbdPtr) += m * 1; + *(here->B3SOIPDQbfPtr) += m * 1; + *(here->B3SOIPDQjsPtr) += m * 1; + *(here->B3SOIPDQjdPtr) += m * 1; + + } + + } } - return (OK); + return(OK); } + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdask.c b/src/spicelib/devices/bsim3soi_pd/b3soipdask.c index 21e466787..aa17af94f 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdask.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdask.c @@ -3,12 +3,16 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soipdask.c 98/5/01 Modified by Pin Su 99/4/30 +Modified by Pin Su 01/2/15 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ #include "ngspice.h" -#include -#include #include "ifsim.h" #include "cktdefs.h" #include "devdefs.h" @@ -17,228 +21,259 @@ Modified by Pin Su 99/4/30 #include "suffix.h" int -B3SOIPDask (ckt, inst, which, value, select) - CKTcircuit *ckt; - GENinstance *inst; - int which; - IFvalue *value; - IFvalue *select; +B3SOIPDask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, + IFvalue *select) { - B3SOIPDinstance *here = (B3SOIPDinstance *) inst; +B3SOIPDinstance *here = (B3SOIPDinstance*)inst; - switch (which) - { - case B3SOIPD_L: - value->rValue = here->B3SOIPDl; - return (OK); - case B3SOIPD_W: - value->rValue = here->B3SOIPDw; - return (OK); - case B3SOIPD_AS: - value->rValue = here->B3SOIPDsourceArea; - return (OK); - case B3SOIPD_AD: - value->rValue = here->B3SOIPDdrainArea; - return (OK); - case B3SOIPD_PS: - value->rValue = here->B3SOIPDsourcePerimeter; - return (OK); - case B3SOIPD_PD: - value->rValue = here->B3SOIPDdrainPerimeter; - return (OK); - case B3SOIPD_NRS: - value->rValue = here->B3SOIPDsourceSquares; - return (OK); - case B3SOIPD_NRD: - value->rValue = here->B3SOIPDdrainSquares; - return (OK); - case B3SOIPD_OFF: - value->iValue = here->B3SOIPDoff; - return (OK); - case B3SOIPD_BJTOFF: - value->iValue = here->B3SOIPDbjtoff; - return (OK); - case B3SOIPD_RTH0: - value->rValue = here->B3SOIPDrth0; - return (OK); - case B3SOIPD_CTH0: - value->rValue = here->B3SOIPDcth0; - return (OK); - case B3SOIPD_NRB: - value->rValue = here->B3SOIPDbodySquares; - return (OK); + switch(which) + { case B3SOIPD_L: + value->rValue = here->B3SOIPDl; + return(OK); + case B3SOIPD_W: + value->rValue = here->B3SOIPDw; + return(OK); + case B3SOIPD_M: + value->rValue = here->B3SOIPDm; + return(OK); + case B3SOIPD_AS: + value->rValue = here->B3SOIPDsourceArea; + return(OK); + case B3SOIPD_AD: + value->rValue = here->B3SOIPDdrainArea; + return(OK); + case B3SOIPD_PS: + value->rValue = here->B3SOIPDsourcePerimeter; + return(OK); + case B3SOIPD_PD: + value->rValue = here->B3SOIPDdrainPerimeter; + return(OK); + case B3SOIPD_NRS: + value->rValue = here->B3SOIPDsourceSquares; + return(OK); + case B3SOIPD_NRD: + value->rValue = here->B3SOIPDdrainSquares; + return(OK); + case B3SOIPD_OFF: + value->iValue = here->B3SOIPDoff; + return(OK); + case B3SOIPD_BJTOFF: + value->iValue = here->B3SOIPDbjtoff; + return(OK); + case B3SOIPD_RTH0: + value->rValue = here->B3SOIPDrth0; + value->rValue /= here->B3SOIPDm; + return(OK); + case B3SOIPD_CTH0: + value->rValue = here->B3SOIPDcth0; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_NRB: + value->rValue = here->B3SOIPDbodySquares; + return(OK); + case B3SOIPD_FRBODY: + value->rValue = here->B3SOIPDfrbody; + return(OK); /* v2.0 release */ - case B3SOIPD_NBC: - value->rValue = here->B3SOIPDnbc; - return (OK); - case B3SOIPD_NSEG: - value->rValue = here->B3SOIPDnseg; - return (OK); - case B3SOIPD_PDBCP: - value->rValue = here->B3SOIPDpdbcp; - return (OK); - case B3SOIPD_PSBCP: - value->rValue = here->B3SOIPDpsbcp; - return (OK); - case B3SOIPD_AGBCP: - value->rValue = here->B3SOIPDagbcp; - return (OK); - case B3SOIPD_AEBCP: - value->rValue = here->B3SOIPDaebcp; - return (OK); - case B3SOIPD_VBSUSR: - value->rValue = here->B3SOIPDvbsusr; - return (OK); - case B3SOIPD_TNODEOUT: - value->iValue = here->B3SOIPDtnodeout; - return (OK); + case B3SOIPD_NBC: + value->rValue = here->B3SOIPDnbc; + return(OK); + case B3SOIPD_NSEG: + value->rValue = here->B3SOIPDnseg; + return(OK); + case B3SOIPD_PDBCP: + value->rValue = here->B3SOIPDpdbcp; + return(OK); + case B3SOIPD_PSBCP: + value->rValue = here->B3SOIPDpsbcp; + return(OK); + case B3SOIPD_AGBCP: + value->rValue = here->B3SOIPDagbcp; + return(OK); + case B3SOIPD_AEBCP: + value->rValue = here->B3SOIPDaebcp; + return(OK); + case B3SOIPD_VBSUSR: + value->rValue = here->B3SOIPDvbsusr; + return(OK); + case B3SOIPD_TNODEOUT: + value->iValue = here->B3SOIPDtnodeout; + return(OK); - case B3SOIPD_IC_VBS: - value->rValue = here->B3SOIPDicVBS; - return (OK); - case B3SOIPD_IC_VDS: - value->rValue = here->B3SOIPDicVDS; - return (OK); - case B3SOIPD_IC_VGS: - value->rValue = here->B3SOIPDicVGS; - return (OK); - case B3SOIPD_IC_VES: - value->rValue = here->B3SOIPDicVES; - return (OK); - case B3SOIPD_IC_VPS: - value->rValue = here->B3SOIPDicVPS; - return (OK); - case B3SOIPD_DNODE: - value->iValue = here->B3SOIPDdNode; - return (OK); - case B3SOIPD_GNODE: - value->iValue = here->B3SOIPDgNode; - return (OK); - case B3SOIPD_SNODE: - value->iValue = here->B3SOIPDsNode; - return (OK); - case B3SOIPD_BNODE: - value->iValue = here->B3SOIPDbNode; - return (OK); - case B3SOIPD_ENODE: - value->iValue = here->B3SOIPDeNode; - return (OK); - case B3SOIPD_DNODEPRIME: - value->iValue = here->B3SOIPDdNodePrime; - return (OK); - case B3SOIPD_SNODEPRIME: - value->iValue = here->B3SOIPDsNodePrime; - return (OK); - case B3SOIPD_SOURCECONDUCT: - value->rValue = here->B3SOIPDsourceConductance; - return (OK); - case B3SOIPD_DRAINCONDUCT: - value->rValue = here->B3SOIPDdrainConductance; - return (OK); - case B3SOIPD_VBD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvbd); - return (OK); - case B3SOIPD_VBS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvbs); - return (OK); - case B3SOIPD_VGS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvgs); - return (OK); - case B3SOIPD_VES: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDves); - return (OK); - case B3SOIPD_VDS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvds); - return (OK); - case B3SOIPD_CD: - value->rValue = here->B3SOIPDcd; - return (OK); - case B3SOIPD_CBS: - value->rValue = here->B3SOIPDcjs; - return (OK); - case B3SOIPD_CBD: - value->rValue = here->B3SOIPDcjd; - return (OK); - case B3SOIPD_GM: - value->rValue = here->B3SOIPDgm; - return (OK); - case B3SOIPD_GMID: - value->rValue = here->B3SOIPDgm / here->B3SOIPDcd; - return (OK); - case B3SOIPD_GDS: - value->rValue = here->B3SOIPDgds; - return (OK); - case B3SOIPD_GMBS: - value->rValue = here->B3SOIPDgmbs; - return (OK); - case B3SOIPD_GBD: - value->rValue = here->B3SOIPDgjdb; - return (OK); - case B3SOIPD_GBS: - value->rValue = here->B3SOIPDgjsb; - return (OK); - case B3SOIPD_QB: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqb); - return (OK); - case B3SOIPD_CQB: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDcqb); - return (OK); - case B3SOIPD_QG: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqg); - return (OK); - case B3SOIPD_CQG: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDcqg); - return (OK); - case B3SOIPD_QD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqd); - return (OK); - case B3SOIPD_CQD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDcqd); - return (OK); - case B3SOIPD_CGG: - value->rValue = here->B3SOIPDcggb; - return (OK); - case B3SOIPD_CGD: - value->rValue = here->B3SOIPDcgdb; - return (OK); - case B3SOIPD_CGS: - value->rValue = here->B3SOIPDcgsb; - return (OK); - case B3SOIPD_CDG: - value->rValue = here->B3SOIPDcdgb; - return (OK); - case B3SOIPD_CDD: - value->rValue = here->B3SOIPDcddb; - return (OK); - case B3SOIPD_CDS: - value->rValue = here->B3SOIPDcdsb; - return (OK); - case B3SOIPD_CBG: - value->rValue = here->B3SOIPDcbgb; - return (OK); - case B3SOIPD_CBDB: - value->rValue = here->B3SOIPDcbdb; - return (OK); - case B3SOIPD_CBSB: - value->rValue = here->B3SOIPDcbsb; - return (OK); - case B3SOIPD_VON: - value->rValue = here->B3SOIPDvon; - return (OK); - case B3SOIPD_VDSAT: - value->rValue = here->B3SOIPDvdsat; - return (OK); - case B3SOIPD_QBS: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqbs); - return (OK); - case B3SOIPD_QBD: - value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqbd); - return (OK); - default: - return (E_BADPARM); + case B3SOIPD_IC_VBS: + value->rValue = here->B3SOIPDicVBS; + return(OK); + case B3SOIPD_IC_VDS: + value->rValue = here->B3SOIPDicVDS; + return(OK); + case B3SOIPD_IC_VGS: + value->rValue = here->B3SOIPDicVGS; + return(OK); + case B3SOIPD_IC_VES: + value->rValue = here->B3SOIPDicVES; + return(OK); + case B3SOIPD_IC_VPS: + value->rValue = here->B3SOIPDicVPS; + return(OK); + case B3SOIPD_DNODE: + value->iValue = here->B3SOIPDdNode; + return(OK); + case B3SOIPD_GNODE: + value->iValue = here->B3SOIPDgNode; + return(OK); + case B3SOIPD_SNODE: + value->iValue = here->B3SOIPDsNode; + return(OK); + case B3SOIPD_BNODE: + value->iValue = here->B3SOIPDbNode; + return(OK); + case B3SOIPD_ENODE: + value->iValue = here->B3SOIPDeNode; + return(OK); + case B3SOIPD_DNODEPRIME: + value->iValue = here->B3SOIPDdNodePrime; + return(OK); + case B3SOIPD_SNODEPRIME: + value->iValue = here->B3SOIPDsNodePrime; + return(OK); + case B3SOIPD_SOURCECONDUCT: + value->rValue = here->B3SOIPDsourceConductance; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_DRAINCONDUCT: + value->rValue = here->B3SOIPDdrainConductance; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_VBD: + value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvbd); + return(OK); + case B3SOIPD_VBS: + value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvbs); + return(OK); + case B3SOIPD_VGS: + value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvgs); + return(OK); + case B3SOIPD_VES: + value->rValue = *(ckt->CKTstate0 + here->B3SOIPDves); + return(OK); + case B3SOIPD_VDS: + value->rValue = *(ckt->CKTstate0 + here->B3SOIPDvds); + return(OK); + case B3SOIPD_CD: + value->rValue = here->B3SOIPDcd; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_CBS: + value->rValue = here->B3SOIPDcjs; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_CBD: + value->rValue = here->B3SOIPDcjd; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_GM: + value->rValue = here->B3SOIPDgm; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_GMID: + value->rValue = here->B3SOIPDgm/here->B3SOIPDcd; + return(OK); + case B3SOIPD_GDS: + value->rValue = here->B3SOIPDgds; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_GMBS: + value->rValue = here->B3SOIPDgmbs; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_GBD: + value->rValue = here->B3SOIPDgjdb; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_GBS: + value->rValue = here->B3SOIPDgjsb; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_QB: + value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqb); + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_CQB: + value->rValue = *(ckt->CKTstate0 + here->B3SOIPDcqb); + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_QG: + value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqg); + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_CQG: + value->rValue = *(ckt->CKTstate0 + here->B3SOIPDcqg); + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_QD: + value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqd); + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_CQD: + value->rValue = *(ckt->CKTstate0 + here->B3SOIPDcqd); + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_CGG: + value->rValue = here->B3SOIPDcggb; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_CGD: + value->rValue = here->B3SOIPDcgdb; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_CGS: + value->rValue = here->B3SOIPDcgsb; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_CDG: + value->rValue = here->B3SOIPDcdgb; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_CDD: + value->rValue = here->B3SOIPDcddb; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_CDS: + value->rValue = here->B3SOIPDcdsb; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_CBG: + value->rValue = here->B3SOIPDcbgb; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_CBDB: + value->rValue = here->B3SOIPDcbdb; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_CBSB: + value->rValue = here->B3SOIPDcbsb; + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_VON: + value->rValue = here->B3SOIPDvon; + return(OK); + case B3SOIPD_VDSAT: + value->rValue = here->B3SOIPDvdsat; + return(OK); + case B3SOIPD_QBS: + value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqbs); + value->rValue *= here->B3SOIPDm; + return(OK); + case B3SOIPD_QBD: + value->rValue = *(ckt->CKTstate0 + here->B3SOIPDqbd); + value->rValue *= here->B3SOIPDm; + return(OK); + default: + return(E_BADPARM); } - /* NOTREACHED */ + /* NOTREACHED */ } + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdcheck.c b/src/spicelib/devices/bsim3soi_pd/b3soipdcheck.c index 2681ad40a..0a00efd25 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdcheck.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdcheck.c @@ -5,12 +5,16 @@ File: b3soipdcheck.c 98/5/01 Modified by Pin Su and Jan Feng 99/2/15 Modified by Pin Su 99/4/30 Modified by Pin Su 00/3/1 +Modified by Pin Su and Hui Wan 02/3/5 +Modifies by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "b3soipddef.h" #include "trandefs.h" @@ -20,894 +24,717 @@ Modified by Pin Su 00/3/1 #include "suffix.h" int -B3SOIPDcheckModel (model, here, ckt) - B3SOIPDmodel *model; - B3SOIPDinstance *here; - CKTcircuit *ckt; +B3SOIPDcheckModel(B3SOIPDmodel *model, B3SOIPDinstance *here, CKTcircuit *ckt) { - struct b3soipdSizeDependParam *pParam; - int Fatal_Flag = 0; - FILE *fplog; - - if ((fplog = fopen ("b3soipdv1check.log", "w")) != NULL) - { - pParam = here->pParam; - fprintf (fplog, "B3SOIPDV3 Parameter Check\n"); - fprintf (fplog, "Model = %s\n", model->B3SOIPDmodName); - fprintf (fplog, "W = %g, L = %g\n", here->B3SOIPDw, here->B3SOIPDl); - - - if (pParam->B3SOIPDnlx < -pParam->B3SOIPDleff) - { - fprintf (fplog, "Fatal: Nlx = %g is less than -Leff.\n", - pParam->B3SOIPDnlx); - printf ("Fatal: Nlx = %g is less than -Leff.\n", - pParam->B3SOIPDnlx); - Fatal_Flag = 1; - } - - if (model->B3SOIPDtox <= 0.0) - { - fprintf (fplog, "Fatal: Tox = %g is not positive.\n", - model->B3SOIPDtox); - printf ("Fatal: Tox = %g is not positive.\n", model->B3SOIPDtox); - Fatal_Flag = 1; - } - - if (model->B3SOIPDtbox <= 0.0) - { - fprintf (fplog, "Fatal: Tbox = %g is not positive.\n", - model->B3SOIPDtbox); - printf ("Fatal: Tbox = %g is not positive.\n", model->B3SOIPDtbox); - Fatal_Flag = 1; - } - - if (pParam->B3SOIPDnpeak <= 0.0) - { - fprintf (fplog, "Fatal: Nch = %g is not positive.\n", +struct b3soipdSizeDependParam *pParam; +int Fatal_Flag = 0; +FILE *fplog; + + if ((fplog = fopen("b3soipdv223check.log", "w")) != NULL) + { pParam = here->pParam; + fprintf(fplog, "B3SOIPDV223 Parameter Check\n"); + fprintf(fplog, "Model = %s\n", model->B3SOIPDmodName); + fprintf(fplog, "W = %g, L = %g, M = %g\n", here->B3SOIPDw, + here->B3SOIPDl, here->B3SOIPDm); + + + if (pParam->B3SOIPDnlx < -pParam->B3SOIPDleff) + { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", + pParam->B3SOIPDnlx); + printf("Fatal: Nlx = %g is less than -Leff.\n", + pParam->B3SOIPDnlx); + Fatal_Flag = 1; + } + + if (model->B3SOIPDtox <= 0.0) + { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", + model->B3SOIPDtox); + printf("Fatal: Tox = %g is not positive.\n", model->B3SOIPDtox); + Fatal_Flag = 1; + } + +/* v2.2.3 */ + if (model->B3SOIPDtox - model->B3SOIPDdtoxcv <= 0.0) + { fprintf(fplog, "Fatal: Tox - dtoxcv = %g is not positive.\n", + model->B3SOIPDtox - model->B3SOIPDdtoxcv); + printf("Fatal: Tox - dtoxcv = %g is not positive.\n", model->B3SOIPDtox - model->B3SOIPDdtoxcv); + Fatal_Flag = 1; + } + + + if (model->B3SOIPDtbox <= 0.0) + { fprintf(fplog, "Fatal: Tbox = %g is not positive.\n", + model->B3SOIPDtbox); + printf("Fatal: Tbox = %g is not positive.\n", model->B3SOIPDtbox); + Fatal_Flag = 1; + } + + if (pParam->B3SOIPDnpeak <= 0.0) + { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", + pParam->B3SOIPDnpeak); + printf("Fatal: Nch = %g is not positive.\n", pParam->B3SOIPDnpeak); - printf ("Fatal: Nch = %g is not positive.\n", pParam->B3SOIPDnpeak); - Fatal_Flag = 1; + Fatal_Flag = 1; } - if (pParam->B3SOIPDngate < 0.0) - { - fprintf (fplog, "Fatal: Ngate = %g is not positive.\n", + if (pParam->B3SOIPDngate < 0.0) + { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", + pParam->B3SOIPDngate); + printf("Fatal: Ngate = %g Ngate is not positive.\n", pParam->B3SOIPDngate); - printf ("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->B3SOIPDngate); - Fatal_Flag = 1; + Fatal_Flag = 1; } - if (pParam->B3SOIPDngate > 1.e25) - { - fprintf (fplog, "Fatal: Ngate = %g is too high.\n", + if (pParam->B3SOIPDngate > 1.e25) + { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", + pParam->B3SOIPDngate); + printf("Fatal: Ngate = %g Ngate is too high\n", pParam->B3SOIPDngate); - printf ("Fatal: Ngate = %g Ngate is too high\n", - pParam->B3SOIPDngate); - Fatal_Flag = 1; - } - - if (pParam->B3SOIPDdvt1 < 0.0) - { - fprintf (fplog, "Fatal: Dvt1 = %g is negative.\n", - pParam->B3SOIPDdvt1); - printf ("Fatal: Dvt1 = %g is negative.\n", pParam->B3SOIPDdvt1); - Fatal_Flag = 1; - } - - if (pParam->B3SOIPDdvt1w < 0.0) - { - fprintf (fplog, "Fatal: Dvt1w = %g is negative.\n", - pParam->B3SOIPDdvt1w); - printf ("Fatal: Dvt1w = %g is negative.\n", pParam->B3SOIPDdvt1w); - Fatal_Flag = 1; - } - - if (pParam->B3SOIPDw0 == -pParam->B3SOIPDweff) - { - fprintf (fplog, "Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); - printf ("Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); - Fatal_Flag = 1; - } - - if (pParam->B3SOIPDdsub < 0.0) - { - fprintf (fplog, "Fatal: Dsub = %g is negative.\n", - pParam->B3SOIPDdsub); - printf ("Fatal: Dsub = %g is negative.\n", pParam->B3SOIPDdsub); - Fatal_Flag = 1; - } - if (pParam->B3SOIPDb1 == -pParam->B3SOIPDweff) - { - fprintf (fplog, - "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - printf ("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); - Fatal_Flag = 1; - } - if (pParam->B3SOIPDu0temp <= 0.0) - { - fprintf (fplog, - "Fatal: u0 at current temperature = %g is not positive.\n", - pParam->B3SOIPDu0temp); - printf ("Fatal: u0 at current temperature = %g is not positive.\n", - pParam->B3SOIPDu0temp); - Fatal_Flag = 1; + Fatal_Flag = 1; } -/* Check delta parameter */ - if (pParam->B3SOIPDdelta < 0.0) - { - fprintf (fplog, "Fatal: Delta = %g is less than zero.\n", - pParam->B3SOIPDdelta); - printf ("Fatal: Delta = %g is less than zero.\n", - pParam->B3SOIPDdelta); - Fatal_Flag = 1; + if (pParam->B3SOIPDdvt1 < 0.0) + { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", + pParam->B3SOIPDdvt1); + printf("Fatal: Dvt1 = %g is negative.\n", pParam->B3SOIPDdvt1); + Fatal_Flag = 1; } - - if (pParam->B3SOIPDvsattemp <= 0.0) - { - fprintf (fplog, - "Fatal: Vsat at current temperature = %g is not positive.\n", + + if (pParam->B3SOIPDdvt1w < 0.0) + { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", + pParam->B3SOIPDdvt1w); + printf("Fatal: Dvt1w = %g is negative.\n", pParam->B3SOIPDdvt1w); + Fatal_Flag = 1; + } + + if (pParam->B3SOIPDw0 == -pParam->B3SOIPDweff) + { fprintf(fplog, "Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); + printf("Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); + Fatal_Flag = 1; + } + + if (pParam->B3SOIPDdsub < 0.0) + { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->B3SOIPDdsub); + printf("Fatal: Dsub = %g is negative.\n", pParam->B3SOIPDdsub); + Fatal_Flag = 1; + } + if (pParam->B3SOIPDb1 == -pParam->B3SOIPDweff) + { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); + Fatal_Flag = 1; + } + if (pParam->B3SOIPDu0temp <= 0.0) + { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->B3SOIPDu0temp); + printf("Fatal: u0 at current temperature = %g is not positive.\n", + pParam->B3SOIPDu0temp); + Fatal_Flag = 1; + } + +/* Check delta parameter */ + if (pParam->B3SOIPDdelta < 0.0) + { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", + pParam->B3SOIPDdelta); + printf("Fatal: Delta = %g is less than zero.\n", pParam->B3SOIPDdelta); + Fatal_Flag = 1; + } + + if (pParam->B3SOIPDvsattemp <= 0.0) + { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->B3SOIPDvsattemp); + printf("Fatal: Vsat at current temperature = %g is not positive.\n", pParam->B3SOIPDvsattemp); - printf - ("Fatal: Vsat at current temperature = %g is not positive.\n", - pParam->B3SOIPDvsattemp); - Fatal_Flag = 1; + Fatal_Flag = 1; } /* Check Rout parameters */ - if (pParam->B3SOIPDpclm <= 0.0) - { - fprintf (fplog, "Fatal: Pclm = %g is not positive.\n", - pParam->B3SOIPDpclm); - printf ("Fatal: Pclm = %g is not positive.\n", pParam->B3SOIPDpclm); - Fatal_Flag = 1; - } - - if (pParam->B3SOIPDdrout < 0.0) - { - fprintf (fplog, "Fatal: Drout = %g is negative.\n", - pParam->B3SOIPDdrout); - printf ("Fatal: Drout = %g is negative.\n", pParam->B3SOIPDdrout); - Fatal_Flag = 1; - } - if (model->B3SOIPDunitLengthGateSidewallJctCap > 0.0) - { - if (here->B3SOIPDdrainPerimeter < pParam->B3SOIPDweff) - { - fprintf (fplog, "Warning: Pd = %g is less than W.\n", - here->B3SOIPDdrainPerimeter); - printf ("Warning: Pd = %g is less than W.\n", - here->B3SOIPDdrainPerimeter); - here->B3SOIPDdrainPerimeter = pParam->B3SOIPDweff; - } - if (here->B3SOIPDsourcePerimeter < pParam->B3SOIPDweff) - { - fprintf (fplog, "Warning: Ps = %g is less than W.\n", - here->B3SOIPDsourcePerimeter); - printf ("Warning: Ps = %g is less than W.\n", - here->B3SOIPDsourcePerimeter); - here->B3SOIPDsourcePerimeter = pParam->B3SOIPDweff; - } + if (pParam->B3SOIPDpclm <= 0.0) + { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->B3SOIPDpclm); + printf("Fatal: Pclm = %g is not positive.\n", pParam->B3SOIPDpclm); + Fatal_Flag = 1; } -/* Check capacitance parameters */ - if (pParam->B3SOIPDclc < 0.0) - { - fprintf (fplog, "Fatal: Clc = %g is negative.\n", - pParam->B3SOIPDclc); - printf ("Fatal: Clc = %g is negative.\n", pParam->B3SOIPDclc); - Fatal_Flag = 1; - } - if (model->B3SOIPDparamChk == 1) - { -/* Check L and W parameters */ - if (pParam->B3SOIPDleff <= 5.0e-8) - { - fprintf (fplog, "Warning: Leff = %g may be too small.\n", - pParam->B3SOIPDleff); - printf ("Warning: Leff = %g may be too small.\n", - pParam->B3SOIPDleff); - } - - if (pParam->B3SOIPDleffCV <= 5.0e-8) - { - fprintf (fplog, "Warning: Leff for CV = %g may be too small.\n", - pParam->B3SOIPDleffCV); - printf ("Warning: Leff for CV = %g may be too small.\n", - pParam->B3SOIPDleffCV); - } - - if (pParam->B3SOIPDweff <= 1.0e-7) - { - fprintf (fplog, "Warning: Weff = %g may be too small.\n", - pParam->B3SOIPDweff); - printf ("Warning: Weff = %g may be too small.\n", - pParam->B3SOIPDweff); - } - - if (pParam->B3SOIPDweffCV <= 1.0e-7) - { - fprintf (fplog, "Warning: Weff for CV = %g may be too small.\n", - pParam->B3SOIPDweffCV); - printf ("Warning: Weff for CV = %g may be too small.\n", - pParam->B3SOIPDweffCV); - } + if (pParam->B3SOIPDdrout < 0.0) + { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->B3SOIPDdrout); + printf("Fatal: Drout = %g is negative.\n", pParam->B3SOIPDdrout); + Fatal_Flag = 1; + } + if ( model->B3SOIPDunitLengthGateSidewallJctCap > 0.0) + { + if (here->B3SOIPDdrainPerimeter < pParam->B3SOIPDweff) + { fprintf(fplog, "Warning: Pd = %g is less than W.\n", + here->B3SOIPDdrainPerimeter); + printf("Warning: Pd = %g is less than W.\n", + here->B3SOIPDdrainPerimeter); + here->B3SOIPDdrainPerimeter =pParam->B3SOIPDweff; + } + if (here->B3SOIPDsourcePerimeter < pParam->B3SOIPDweff) + { fprintf(fplog, "Warning: Ps = %g is less than W.\n", + here->B3SOIPDsourcePerimeter); + printf("Warning: Ps = %g is less than W.\n", + here->B3SOIPDsourcePerimeter); + here->B3SOIPDsourcePerimeter =pParam->B3SOIPDweff; + } + } +/* Check capacitance parameters */ + if (pParam->B3SOIPDclc < 0.0) + { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->B3SOIPDclc); + printf("Fatal: Clc = %g is negative.\n", pParam->B3SOIPDclc); + Fatal_Flag = 1; + } + +/* v2.2.3 */ + if (pParam->B3SOIPDmoin < 5.0) + { fprintf(fplog, "Warning: Moin = %g is too small.\n", + pParam->B3SOIPDmoin); + printf("Warning: Moin = %g is too small.\n", pParam->B3SOIPDmoin); + } + if (pParam->B3SOIPDmoin > 25.0) + { fprintf(fplog, "Warning: Moin = %g is too large.\n", + pParam->B3SOIPDmoin); + printf("Warning: Moin = %g is too large.\n", pParam->B3SOIPDmoin); + } + + + if (model->B3SOIPDcapMod == 3) { + if (pParam->B3SOIPDacde < 0.4) + { fprintf (fplog, "Warning: Acde = %g is too small.\n", + pParam->B3SOIPDacde); + printf ("Warning: Acde = %g is too small.\n", + pParam->B3SOIPDacde); + } + if (pParam->B3SOIPDacde > 1.6) + { fprintf (fplog, "Warning: Acde = %g is too large.\n", + pParam->B3SOIPDacde); + printf ("Warning: Acde = %g is too large.\n", + pParam->B3SOIPDacde); + } + } +/* v2.2.3 */ + + if (model->B3SOIPDparamChk ==1) + { +/* Check L and W parameters */ + if (pParam->B3SOIPDleff <= 5.0e-8) + { fprintf(fplog, "Warning: Leff = %g may be too small.\n", + pParam->B3SOIPDleff); + printf("Warning: Leff = %g may be too small.\n", + pParam->B3SOIPDleff); + } + + if (pParam->B3SOIPDleffCV <= 5.0e-8) + { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", + pParam->B3SOIPDleffCV); + printf("Warning: Leff for CV = %g may be too small.\n", + pParam->B3SOIPDleffCV); + } + + if (pParam->B3SOIPDweff <= 1.0e-7) + { fprintf(fplog, "Warning: Weff = %g may be too small.\n", + pParam->B3SOIPDweff); + printf("Warning: Weff = %g may be too small.\n", + pParam->B3SOIPDweff); + } + + if (pParam->B3SOIPDweffCV <= 1.0e-7) + { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", + pParam->B3SOIPDweffCV); + printf("Warning: Weff for CV = %g may be too small.\n", + pParam->B3SOIPDweffCV); + } + /* Check threshold voltage parameters */ - if (pParam->B3SOIPDnlx < 0.0) - { - fprintf (fplog, "Warning: Nlx = %g is negative.\n", - pParam->B3SOIPDnlx); - printf ("Warning: Nlx = %g is negative.\n", pParam->B3SOIPDnlx); - } - if (model->B3SOIPDtox < 1.0e-9) - { - fprintf (fplog, "Warning: Tox = %g is less than 10A.\n", - model->B3SOIPDtox); - printf ("Warning: Tox = %g is less than 10A.\n", - model->B3SOIPDtox); - } - - if (pParam->B3SOIPDnpeak <= 1.0e15) - { - fprintf (fplog, "Warning: Nch = %g may be too small.\n", - pParam->B3SOIPDnpeak); - printf ("Warning: Nch = %g may be too small.\n", - pParam->B3SOIPDnpeak); - } - else if (pParam->B3SOIPDnpeak >= 1.0e21) - { - fprintf (fplog, "Warning: Nch = %g may be too large.\n", - pParam->B3SOIPDnpeak); - printf ("Warning: Nch = %g may be too large.\n", - pParam->B3SOIPDnpeak); - } - - if (fabs (pParam->B3SOIPDnsub) >= 1.0e21) - { - fprintf (fplog, "Warning: Nsub = %g may be too large.\n", - pParam->B3SOIPDnsub); - printf ("Warning: Nsub = %g may be too large.\n", - pParam->B3SOIPDnsub); - } - - if ((pParam->B3SOIPDngate > 0.0) && (pParam->B3SOIPDngate <= 1.e18)) - { - fprintf (fplog, - "Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->B3SOIPDngate); - printf ("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->B3SOIPDngate); - } - - if (pParam->B3SOIPDdvt0 < 0.0) - { - fprintf (fplog, "Warning: Dvt0 = %g is negative.\n", - pParam->B3SOIPDdvt0); - printf ("Warning: Dvt0 = %g is negative.\n", - pParam->B3SOIPDdvt0); - } - - if (fabs (1.0e-6 / (pParam->B3SOIPDw0 + pParam->B3SOIPDweff)) > - 10.0) - { - fprintf (fplog, "Warning: (W0 + Weff) may be too small.\n"); - printf ("Warning: (W0 + Weff) may be too small.\n"); - } + if (pParam->B3SOIPDnlx < 0.0) + { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->B3SOIPDnlx); + printf("Warning: Nlx = %g is negative.\n", pParam->B3SOIPDnlx); + } + if (model->B3SOIPDtox < 1.0e-9) + { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", + model->B3SOIPDtox); + printf("Warning: Tox = %g is less than 10A.\n", model->B3SOIPDtox); + } + + if (pParam->B3SOIPDnpeak <= 1.0e15) + { fprintf(fplog, "Warning: Nch = %g may be too small.\n", + pParam->B3SOIPDnpeak); + printf("Warning: Nch = %g may be too small.\n", + pParam->B3SOIPDnpeak); + } + else if (pParam->B3SOIPDnpeak >= 1.0e21) + { fprintf(fplog, "Warning: Nch = %g may be too large.\n", + pParam->B3SOIPDnpeak); + printf("Warning: Nch = %g may be too large.\n", + pParam->B3SOIPDnpeak); + } + + if (fabs(pParam->B3SOIPDnsub) >= 1.0e21) + { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", + pParam->B3SOIPDnsub); + printf("Warning: Nsub = %g may be too large.\n", + pParam->B3SOIPDnsub); + } + + if ((pParam->B3SOIPDngate > 0.0) && + (pParam->B3SOIPDngate <= 1.e18)) + { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->B3SOIPDngate); + printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", + pParam->B3SOIPDngate); + } + + if (pParam->B3SOIPDdvt0 < 0.0) + { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", + pParam->B3SOIPDdvt0); + printf("Warning: Dvt0 = %g is negative.\n", pParam->B3SOIPDdvt0); + } + + if (fabs(1.0e-6 / (pParam->B3SOIPDw0 + pParam->B3SOIPDweff)) > 10.0) + { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); + printf("Warning: (W0 + Weff) may be too small.\n"); + } /* Check subthreshold parameters */ - if (pParam->B3SOIPDnfactor < 0.0) - { - fprintf (fplog, "Warning: Nfactor = %g is negative.\n", - pParam->B3SOIPDnfactor); - printf ("Warning: Nfactor = %g is negative.\n", - pParam->B3SOIPDnfactor); - } - if (pParam->B3SOIPDcdsc < 0.0) - { - fprintf (fplog, "Warning: Cdsc = %g is negative.\n", - pParam->B3SOIPDcdsc); - printf ("Warning: Cdsc = %g is negative.\n", - pParam->B3SOIPDcdsc); - } - if (pParam->B3SOIPDcdscd < 0.0) - { - fprintf (fplog, "Warning: Cdscd = %g is negative.\n", - pParam->B3SOIPDcdscd); - printf ("Warning: Cdscd = %g is negative.\n", - pParam->B3SOIPDcdscd); - } + if (pParam->B3SOIPDnfactor < 0.0) + { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", + pParam->B3SOIPDnfactor); + printf("Warning: Nfactor = %g is negative.\n", pParam->B3SOIPDnfactor); + } + if (pParam->B3SOIPDcdsc < 0.0) + { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", + pParam->B3SOIPDcdsc); + printf("Warning: Cdsc = %g is negative.\n", pParam->B3SOIPDcdsc); + } + if (pParam->B3SOIPDcdscd < 0.0) + { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", + pParam->B3SOIPDcdscd); + printf("Warning: Cdscd = %g is negative.\n", pParam->B3SOIPDcdscd); + } /* Check DIBL parameters */ - if (pParam->B3SOIPDeta0 < 0.0) - { - fprintf (fplog, "Warning: Eta0 = %g is negative.\n", - pParam->B3SOIPDeta0); - printf ("Warning: Eta0 = %g is negative.\n", - pParam->B3SOIPDeta0); - } - -/* Check Abulk parameters */ - if (fabs (1.0e-6 / (pParam->B3SOIPDb1 + pParam->B3SOIPDweff)) > - 10.0) - { - fprintf (fplog, "Warning: (B1 + Weff) may be too small.\n"); - printf ("Warning: (B1 + Weff) may be too small.\n"); - } + if (pParam->B3SOIPDeta0 < 0.0) + { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", + pParam->B3SOIPDeta0); + printf("Warning: Eta0 = %g is negative.\n", pParam->B3SOIPDeta0); + } + +/* Check Abulk parameters */ + if (fabs(1.0e-6 / (pParam->B3SOIPDb1 + pParam->B3SOIPDweff)) > 10.0) + { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); + printf("Warning: (B1 + Weff) may be too small.\n"); + } /* Check Saturation parameters */ - if (pParam->B3SOIPDa2 < 0.01) - { - fprintf (fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->B3SOIPDa2); - printf ("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->B3SOIPDa2); - pParam->B3SOIPDa2 = 0.01; - } - else if (pParam->B3SOIPDa2 > 1.0) - { - fprintf (fplog, - "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->B3SOIPDa2); - printf - ("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->B3SOIPDa2); - pParam->B3SOIPDa2 = 1.0; - pParam->B3SOIPDa1 = 0.0; - - } - - if (pParam->B3SOIPDrdsw < 0.0) - { - fprintf (fplog, - "Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->B3SOIPDrdsw); - printf ("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->B3SOIPDrdsw); - pParam->B3SOIPDrdsw = 0.0; - pParam->B3SOIPDrds0 = 0.0; - } - else if ((pParam->B3SOIPDrds0 > 0.0) - && (pParam->B3SOIPDrds0 < 0.001)) - { - fprintf (fplog, - "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->B3SOIPDrds0); - printf - ("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->B3SOIPDrds0); - pParam->B3SOIPDrds0 = 0.0; - } - if (pParam->B3SOIPDvsattemp < 1.0e3) - { - fprintf (fplog, - "Warning: Vsat at current temperature = %g may be too small.\n", - pParam->B3SOIPDvsattemp); - printf - ("Warning: Vsat at current temperature = %g may be too small.\n", - pParam->B3SOIPDvsattemp); - } - - if (pParam->B3SOIPDpdibl1 < 0.0) - { - fprintf (fplog, "Warning: Pdibl1 = %g is negative.\n", - pParam->B3SOIPDpdibl1); - printf ("Warning: Pdibl1 = %g is negative.\n", - pParam->B3SOIPDpdibl1); - } - if (pParam->B3SOIPDpdibl2 < 0.0) - { - fprintf (fplog, "Warning: Pdibl2 = %g is negative.\n", - pParam->B3SOIPDpdibl2); - printf ("Warning: Pdibl2 = %g is negative.\n", - pParam->B3SOIPDpdibl2); - } + if (pParam->B3SOIPDa2 < 0.01) + { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->B3SOIPDa2); + printf("Warning: A2 = %g is too small. Set to 0.01.\n", + pParam->B3SOIPDa2); + pParam->B3SOIPDa2 = 0.01; + } + else if (pParam->B3SOIPDa2 > 1.0) + { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->B3SOIPDa2); + printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", + pParam->B3SOIPDa2); + pParam->B3SOIPDa2 = 1.0; + pParam->B3SOIPDa1 = 0.0; + + } + + if (pParam->B3SOIPDrdsw < 0.0) + { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->B3SOIPDrdsw); + printf("Warning: Rdsw = %g is negative. Set to zero.\n", + pParam->B3SOIPDrdsw); + pParam->B3SOIPDrdsw = 0.0; + pParam->B3SOIPDrds0 = 0.0; + } + else if ((pParam->B3SOIPDrds0 > 0.0) && (pParam->B3SOIPDrds0 < 0.001)) + { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", + pParam->B3SOIPDrds0); + printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", + pParam->B3SOIPDrds0); + pParam->B3SOIPDrds0 = 0.0; + } + if (pParam->B3SOIPDvsattemp < 1.0e3) + { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->B3SOIPDvsattemp); + printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->B3SOIPDvsattemp); + } + + if (pParam->B3SOIPDpdibl1 < 0.0) + { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", + pParam->B3SOIPDpdibl1); + printf("Warning: Pdibl1 = %g is negative.\n", pParam->B3SOIPDpdibl1); + } + if (pParam->B3SOIPDpdibl2 < 0.0) + { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", + pParam->B3SOIPDpdibl2); + printf("Warning: Pdibl2 = %g is negative.\n", pParam->B3SOIPDpdibl2); + } /* Check overlap capacitance parameters */ - if (model->B3SOIPDcgdo < 0.0) - { - fprintf (fplog, - "Warning: cgdo = %g is negative. Set to zero.\n", - model->B3SOIPDcgdo); - printf ("Warning: cgdo = %g is negative. Set to zero.\n", - model->B3SOIPDcgdo); - model->B3SOIPDcgdo = 0.0; - } - if (model->B3SOIPDcgso < 0.0) - { - fprintf (fplog, - "Warning: cgso = %g is negative. Set to zero.\n", - model->B3SOIPDcgso); - printf ("Warning: cgso = %g is negative. Set to zero.\n", - model->B3SOIPDcgso); - model->B3SOIPDcgso = 0.0; - } - if (model->B3SOIPDcgeo < 0.0) - { - fprintf (fplog, - "Warning: cgeo = %g is negative. Set to zero.\n", - model->B3SOIPDcgeo); - printf ("Warning: cgeo = %g is negative. Set to zero.\n", - model->B3SOIPDcgeo); - model->B3SOIPDcgeo = 0.0; - } - - if (model->B3SOIPDntun < 0.0) - { - fprintf (fplog, "Warning: Ntun = %g is negative.\n", - model->B3SOIPDntun); - printf ("Warning: Ntun = %g is negative.\n", - model->B3SOIPDntun); - } - - if (model->B3SOIPDndiode < 0.0) - { - fprintf (fplog, "Warning: Ndiode = %g is negative.\n", - model->B3SOIPDndiode); - printf ("Warning: Ndiode = %g is negative.\n", - model->B3SOIPDndiode); - } - - if (model->B3SOIPDisbjt < 0.0) - { - fprintf (fplog, "Warning: Isbjt = %g is negative.\n", - model->B3SOIPDisbjt); - printf ("Warning: Isbjt = %g is negative.\n", - model->B3SOIPDisbjt); - } - - if (model->B3SOIPDisdif < 0.0) - { - fprintf (fplog, "Warning: Isdif = %g is negative.\n", - model->B3SOIPDisdif); - printf ("Warning: Isdif = %g is negative.\n", - model->B3SOIPDisdif); - } - - if (model->B3SOIPDisrec < 0.0) - { - fprintf (fplog, "Warning: Isrec = %g is negative.\n", - model->B3SOIPDisrec); - printf ("Warning: Isrec = %g is negative.\n", - model->B3SOIPDisrec); - } - - if (model->B3SOIPDistun < 0.0) - { - fprintf (fplog, "Warning: Istun = %g is negative.\n", - model->B3SOIPDistun); - printf ("Warning: Istun = %g is negative.\n", - model->B3SOIPDistun); - } - - if (model->B3SOIPDtt < 0.0) - { - fprintf (fplog, "Warning: Tt = %g is negative.\n", - model->B3SOIPDtt); - printf ("Warning: Tt = %g is negative.\n", model->B3SOIPDtt); - } - - if (model->B3SOIPDcsdmin < 0.0) - { - fprintf (fplog, "Warning: Csdmin = %g is negative.\n", - model->B3SOIPDcsdmin); - printf ("Warning: Csdmin = %g is negative.\n", - model->B3SOIPDcsdmin); - } - - if (model->B3SOIPDcsdesw < 0.0) - { - fprintf (fplog, "Warning: Csdesw = %g is negative.\n", - model->B3SOIPDcsdesw); - printf ("Warning: Csdesw = %g is negative.\n", - model->B3SOIPDcsdesw); - } - - if (model->B3SOIPDasd < 0.0) - { - fprintf (fplog, "Warning: Asd = %g should be within (0, 1).\n", - model->B3SOIPDasd); - printf ("Warning: Asd = %g should be within (0, 1).\n", - model->B3SOIPDasd); - } - - if (model->B3SOIPDrth0 < 0.0) - { - fprintf (fplog, "Warning: Rth0 = %g is negative.\n", - model->B3SOIPDrth0); - printf ("Warning: Rth0 = %g is negative.\n", - model->B3SOIPDrth0); - } - - if (model->B3SOIPDcth0 < 0.0) - { - fprintf (fplog, "Warning: Cth0 = %g is negative.\n", - model->B3SOIPDcth0); - printf ("Warning: Cth0 = %g is negative.\n", - model->B3SOIPDcth0); - } - - if (model->B3SOIPDrbody < 0.0) - { - fprintf (fplog, "Warning: Rbody = %g is negative.\n", - model->B3SOIPDrbody); - printf ("Warning: Rbody = %g is negative.\n", - model->B3SOIPDrbody); - } - - if (model->B3SOIPDrbsh < 0.0) - { - fprintf (fplog, "Warning: Rbsh = %g is negative.\n", - model->B3SOIPDrbsh); - printf ("Warning: Rbsh = %g is negative.\n", - model->B3SOIPDrbsh); - } + if (model->B3SOIPDcgdo < 0.0) + { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->B3SOIPDcgdo); + printf("Warning: cgdo = %g is negative. Set to zero.\n", model->B3SOIPDcgdo); + model->B3SOIPDcgdo = 0.0; + } + if (model->B3SOIPDcgso < 0.0) + { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->B3SOIPDcgso); + printf("Warning: cgso = %g is negative. Set to zero.\n", model->B3SOIPDcgso); + model->B3SOIPDcgso = 0.0; + } + if (model->B3SOIPDcgeo < 0.0) + { fprintf(fplog, "Warning: cgeo = %g is negative. Set to zero.\n", model->B3SOIPDcgeo); + printf("Warning: cgeo = %g is negative. Set to zero.\n", model->B3SOIPDcgeo); + model->B3SOIPDcgeo = 0.0; + } + + if (model->B3SOIPDntun < 0.0) + { fprintf(fplog, "Warning: Ntun = %g is negative.\n", + model->B3SOIPDntun); + printf("Warning: Ntun = %g is negative.\n", model->B3SOIPDntun); + } + + if (model->B3SOIPDndiode < 0.0) + { fprintf(fplog, "Warning: Ndiode = %g is negative.\n", + model->B3SOIPDndiode); + printf("Warning: Ndiode = %g is negative.\n", model->B3SOIPDndiode); + } + + if (model->B3SOIPDisbjt < 0.0) + { fprintf(fplog, "Warning: Isbjt = %g is negative.\n", + model->B3SOIPDisbjt); + printf("Warning: Isbjt = %g is negative.\n", model->B3SOIPDisbjt); + } + + if (model->B3SOIPDisdif < 0.0) + { fprintf(fplog, "Warning: Isdif = %g is negative.\n", + model->B3SOIPDisdif); + printf("Warning: Isdif = %g is negative.\n", model->B3SOIPDisdif); + } + + if (model->B3SOIPDisrec < 0.0) + { fprintf(fplog, "Warning: Isrec = %g is negative.\n", + model->B3SOIPDisrec); + printf("Warning: Isrec = %g is negative.\n", model->B3SOIPDisrec); + } + + if (model->B3SOIPDistun < 0.0) + { fprintf(fplog, "Warning: Istun = %g is negative.\n", + model->B3SOIPDistun); + printf("Warning: Istun = %g is negative.\n", model->B3SOIPDistun); + } + + if (model->B3SOIPDtt < 0.0) + { fprintf(fplog, "Warning: Tt = %g is negative.\n", + model->B3SOIPDtt); + printf("Warning: Tt = %g is negative.\n", model->B3SOIPDtt); + } + + if (model->B3SOIPDcsdmin < 0.0) + { fprintf(fplog, "Warning: Csdmin = %g is negative.\n", + model->B3SOIPDcsdmin); + printf("Warning: Csdmin = %g is negative.\n", model->B3SOIPDcsdmin); + } + + if (model->B3SOIPDcsdesw < 0.0) + { fprintf(fplog, "Warning: Csdesw = %g is negative.\n", + model->B3SOIPDcsdesw); + printf("Warning: Csdesw = %g is negative.\n", model->B3SOIPDcsdesw); + } + + if (model->B3SOIPDasd < 0.0) + { fprintf(fplog, "Warning: Asd = %g should be within (0, 1).\n", + model->B3SOIPDasd); + printf("Warning: Asd = %g should be within (0, 1).\n", model->B3SOIPDasd); + } + + if (model->B3SOIPDrth0 < 0.0) + { fprintf(fplog, "Warning: Rth0 = %g is negative.\n", + model->B3SOIPDrth0); + printf("Warning: Rth0 = %g is negative.\n", model->B3SOIPDrth0); + } + + if (model->B3SOIPDcth0 < 0.0) + { fprintf(fplog, "Warning: Cth0 = %g is negative.\n", + model->B3SOIPDcth0); + printf("Warning: Cth0 = %g is negative.\n", model->B3SOIPDcth0); + } + + if (model->B3SOIPDrbody < 0.0) + { fprintf(fplog, "Warning: Rbody = %g is negative.\n", + model->B3SOIPDrbody); + printf("Warning: Rbody = %g is negative.\n", model->B3SOIPDrbody); + } + + if (model->B3SOIPDrbsh < 0.0) + { fprintf(fplog, "Warning: Rbsh = %g is negative.\n", + model->B3SOIPDrbsh); + printf("Warning: Rbsh = %g is negative.\n", model->B3SOIPDrbsh); + } /* v2.2 release */ - if (model->B3SOIPDwth0 < 0.0) - { - fprintf (fplog, "Warning: WTH0 = %g is negative.\n", - model->B3SOIPDwth0); - printf ("Warning: Wth0 = %g is negative.\n", - model->B3SOIPDwth0); - } - if (model->B3SOIPDrhalo < 0.0) - { - fprintf (fplog, "Warning: RHALO = %g is negative.\n", - model->B3SOIPDrhalo); - printf ("Warning: Rhalo = %g is negative.\n", - model->B3SOIPDrhalo); - } - if (model->B3SOIPDntox < 0.0) - { - fprintf (fplog, "Warning: NTOX = %g is negative.\n", - model->B3SOIPDntox); - printf ("Warning: Ntox = %g is negative.\n", - model->B3SOIPDntox); - } - if (model->B3SOIPDtoxref < 0.0) - { - fprintf (fplog, "Warning: TOXREF = %g is negative.\n", - model->B3SOIPDtoxref); - printf ("Warning: Toxref = %g is negative.\n", - model->B3SOIPDtoxref); - Fatal_Flag = 1; - } - if (model->B3SOIPDebg < 0.0) - { - fprintf (fplog, "Warning: EBG = %g is negative.\n", - model->B3SOIPDebg); - printf ("Warning: Ebg = %g is negative.\n", model->B3SOIPDebg); - } - if (model->B3SOIPDnevb < 0.0) - { - fprintf (fplog, "Warning: NEVB = %g is negative.\n", - model->B3SOIPDnevb); - printf ("Warning: Nevb = %g is negative.\n", - model->B3SOIPDnevb); - } - if (model->B3SOIPDalphaGB1 < 0.0) - { - fprintf (fplog, "Warning: ALPHAGB1 = %g is negative.\n", - model->B3SOIPDalphaGB1); - printf ("Warning: AlphaGB1 = %g is negative.\n", - model->B3SOIPDalphaGB1); - } - if (model->B3SOIPDbetaGB1 < 0.0) - { - fprintf (fplog, "Warning: BETAGB1 = %g is negative.\n", - model->B3SOIPDbetaGB1); - printf ("Warning: BetaGB1 = %g is negative.\n", - model->B3SOIPDbetaGB1); - } - if (model->B3SOIPDvgb1 < 0.0) - { - fprintf (fplog, "Warning: VGB1 = %g is negative.\n", - model->B3SOIPDvgb1); - printf ("Warning: Vgb1 = %g is negative.\n", - model->B3SOIPDvgb1); - } - if (model->B3SOIPDnecb < 0.0) - { - fprintf (fplog, "Warning: NECB = %g is negative.\n", - model->B3SOIPDnecb); - printf ("Warning: Necb = %g is negative.\n", - model->B3SOIPDnecb); - } - if (model->B3SOIPDalphaGB2 < 0.0) - { - fprintf (fplog, "Warning: ALPHAGB2 = %g is negative.\n", - model->B3SOIPDalphaGB2); - printf ("Warning: AlphaGB2 = %g is negative.\n", - model->B3SOIPDalphaGB2); - } - if (model->B3SOIPDbetaGB2 < 0.0) - { - fprintf (fplog, "Warning: BETAGB2 = %g is negative.\n", - model->B3SOIPDbetaGB2); - printf ("Warning: BetaGB2 = %g is negative.\n", - model->B3SOIPDbetaGB2); - } - if (model->B3SOIPDvgb2 < 0.0) - { - fprintf (fplog, "Warning: VGB2 = %g is negative.\n", - model->B3SOIPDvgb2); - printf ("Warning: Vgb2 = %g is negative.\n", - model->B3SOIPDvgb2); - } - if (model->B3SOIPDtoxqm <= 0.0) - { - fprintf (fplog, "Fatal: Toxqm = %g is not positive.\n", - model->B3SOIPDtoxqm); - printf ("Fatal: Toxqm = %g is not positive.\n", - model->B3SOIPDtoxqm); - Fatal_Flag = 1; - } - if (model->B3SOIPDvoxh < 0.0) - { - fprintf (fplog, "Warning: Voxh = %g is negative.\n", - model->B3SOIPDvoxh); - printf ("Warning: Voxh = %g is negative.\n", - model->B3SOIPDvoxh); - } - if (model->B3SOIPDdeltavox <= 0.0) - { - fprintf (fplog, "Fatal: Deltavox = %g is not positive.\n", - model->B3SOIPDdeltavox); - printf ("Fatal: Deltavox = %g is not positive.\n", - model->B3SOIPDdeltavox); - } + if (model->B3SOIPDwth0 < 0.0) + { fprintf(fplog, "Warning: WTH0 = %g is negative.\n", + model->B3SOIPDwth0); + printf("Warning: Wth0 = %g is negative.\n", model->B3SOIPDwth0); + } + if (model->B3SOIPDrhalo < 0.0) + { fprintf(fplog, "Warning: RHALO = %g is negative.\n", + model->B3SOIPDrhalo); + printf("Warning: Rhalo = %g is negative.\n", model->B3SOIPDrhalo); + } + if (model->B3SOIPDntox < 0.0) + { fprintf(fplog, "Warning: NTOX = %g is negative.\n", + model->B3SOIPDntox); + printf("Warning: Ntox = %g is negative.\n", model->B3SOIPDntox); + } + if (model->B3SOIPDtoxref < 0.0) + { fprintf(fplog, "Warning: TOXREF = %g is negative.\n", + model->B3SOIPDtoxref); + printf("Warning: Toxref = %g is negative.\n", model->B3SOIPDtoxref); + Fatal_Flag = 1; + } + if (model->B3SOIPDebg < 0.0) + { fprintf(fplog, "Warning: EBG = %g is negative.\n", + model->B3SOIPDebg); + printf("Warning: Ebg = %g is negative.\n", model->B3SOIPDebg); + } + if (model->B3SOIPDvevb < 0.0) + { fprintf(fplog, "Warning: VEVB = %g is negative.\n", + model->B3SOIPDvevb); + printf("Warning: Vevb = %g is negative.\n", model->B3SOIPDvevb); + } + if (model->B3SOIPDalphaGB1 < 0.0) + { fprintf(fplog, "Warning: ALPHAGB1 = %g is negative.\n", + model->B3SOIPDalphaGB1); + printf("Warning: AlphaGB1 = %g is negative.\n", model->B3SOIPDalphaGB1); + } + if (model->B3SOIPDbetaGB1 < 0.0) + { fprintf(fplog, "Warning: BETAGB1 = %g is negative.\n", + model->B3SOIPDbetaGB1); + printf("Warning: BetaGB1 = %g is negative.\n", model->B3SOIPDbetaGB1); + } + if (model->B3SOIPDvgb1 < 0.0) + { fprintf(fplog, "Warning: VGB1 = %g is negative.\n", + model->B3SOIPDvgb1); + printf("Warning: Vgb1 = %g is negative.\n", model->B3SOIPDvgb1); + } + if (model->B3SOIPDvecb < 0.0) + { fprintf(fplog, "Warning: VECB = %g is negative.\n", + model->B3SOIPDvecb); + printf("Warning: Vecb = %g is negative.\n", model->B3SOIPDvecb); + } + if (model->B3SOIPDalphaGB2 < 0.0) + { fprintf(fplog, "Warning: ALPHAGB2 = %g is negative.\n", + model->B3SOIPDalphaGB2); + printf("Warning: AlphaGB2 = %g is negative.\n", model->B3SOIPDalphaGB2); + } + if (model->B3SOIPDbetaGB2 < 0.0) + { fprintf(fplog, "Warning: BETAGB2 = %g is negative.\n", + model->B3SOIPDbetaGB2); + printf("Warning: BetaGB2 = %g is negative.\n", model->B3SOIPDbetaGB2); + } + if (model->B3SOIPDvgb2 < 0.0) + { fprintf(fplog, "Warning: VGB2 = %g is negative.\n", + model->B3SOIPDvgb2); + printf("Warning: Vgb2 = %g is negative.\n", model->B3SOIPDvgb2); + } + if (model->B3SOIPDtoxqm <= 0.0) + { fprintf(fplog, "Fatal: Toxqm = %g is not positive.\n", + model->B3SOIPDtoxqm); + printf("Fatal: Toxqm = %g is not positive.\n", model->B3SOIPDtoxqm); + Fatal_Flag = 1; + } + if (model->B3SOIPDvoxh < 0.0) + { fprintf(fplog, "Warning: Voxh = %g is negative.\n", + model->B3SOIPDvoxh); + printf("Warning: Voxh = %g is negative.\n", model->B3SOIPDvoxh); + } + if (model->B3SOIPDdeltavox <= 0.0) + { fprintf(fplog, "Fatal: Deltavox = %g is not positive.\n", + model->B3SOIPDdeltavox); + printf("Fatal: Deltavox = %g is not positive.\n", model->B3SOIPDdeltavox); + } /* v2.0 release */ - if (model->B3SOIPDk1w1 < 0.0) - { - fprintf (fplog, "Warning: K1W1 = %g is negative.\n", - model->B3SOIPDk1w1); - printf ("Warning: K1w1 = %g is negative.\n", - model->B3SOIPDk1w1); - } - if (model->B3SOIPDk1w2 < 0.0) - { - fprintf (fplog, "Warning: K1W2 = %g is negative.\n", - model->B3SOIPDk1w2); - printf ("Warning: K1w2 = %g is negative.\n", - model->B3SOIPDk1w2); - } - if (model->B3SOIPDketas < 0.0) - { - fprintf (fplog, "Warning: KETAS = %g is negative.\n", - model->B3SOIPDketas); - printf ("Warning: Ketas = %g is negative.\n", - model->B3SOIPDketas); - } - if (model->B3SOIPDdwbc < 0.0) - { - fprintf (fplog, "Warning: DWBC = %g is negative.\n", - model->B3SOIPDdwbc); - printf ("Warning: Dwbc = %g is negative.\n", - model->B3SOIPDdwbc); - } - if (model->B3SOIPDbeta0 < 0.0) - { - fprintf (fplog, "Warning: BETA0 = %g is negative.\n", - model->B3SOIPDbeta0); - printf ("Warning: Beta0 = %g is negative.\n", - model->B3SOIPDbeta0); - } - if (model->B3SOIPDbeta1 < 0.0) - { - fprintf (fplog, "Warning: BETA1 = %g is negative.\n", - model->B3SOIPDbeta1); - printf ("Warning: Beta1 = %g is negative.\n", - model->B3SOIPDbeta1); - } - if (model->B3SOIPDbeta2 < 0.0) - { - fprintf (fplog, "Warning: BETA2 = %g is negative.\n", - model->B3SOIPDbeta2); - printf ("Warning: Beta2 = %g is negative.\n", - model->B3SOIPDbeta2); - } - if (model->B3SOIPDtii < 0.0) - { - fprintf (fplog, "Warning: TII = %g is negative.\n", - model->B3SOIPDtii); - printf ("Warning: Tii = %g is negative.\n", model->B3SOIPDtii); - } - if (model->B3SOIPDlii < 0.0) - { - fprintf (fplog, "Warning: LII = %g is negative.\n", - model->B3SOIPDlii); - printf ("Warning: Lii = %g is negative.\n", model->B3SOIPDlii); - } - if (model->B3SOIPDsii1 < 0.0) - { - fprintf (fplog, "Warning: SII1 = %g is negative.\n", - model->B3SOIPDsii1); - printf ("Warning: Sii1 = %g is negative.\n", - model->B3SOIPDsii1); - } - if (model->B3SOIPDsii2 < 0.0) - { - fprintf (fplog, "Warning: SII2 = %g is negative.\n", - model->B3SOIPDsii2); - printf ("Warning: Sii2 = %g is negative.\n", - model->B3SOIPDsii1); - } - if (model->B3SOIPDsiid < 0.0) - { - fprintf (fplog, "Warning: SIID = %g is negative.\n", - model->B3SOIPDsiid); - printf ("Warning: Siid = %g is negative.\n", - model->B3SOIPDsiid); - } - if (model->B3SOIPDfbjtii < 0.0) - { - fprintf (fplog, "Warning: FBJTII = %g is negative.\n", - model->B3SOIPDfbjtii); - printf ("Warning: fbjtii = %g is negative.\n", - model->B3SOIPDfbjtii); - } - if (model->B3SOIPDvrec0 < 0.0) - { - fprintf (fplog, "Warning: VREC0 = %g is negative.\n", - model->B3SOIPDvrec0); - printf ("Warning: Vrec0 = %g is negative.\n", - model->B3SOIPDvrec0); - } - if (model->B3SOIPDvtun0 < 0.0) - { - fprintf (fplog, "Warning: VTUN0 = %g is negative.\n", - model->B3SOIPDvtun0); - printf ("Warning: Vtun0 = %g is negative.\n", - model->B3SOIPDvtun0); - } - if (model->B3SOIPDnbjt < 0.0) - { - fprintf (fplog, "Warning: NBJT = %g is negative.\n", - model->B3SOIPDnbjt); - printf ("Warning: Nbjt = %g is negative.\n", - model->B3SOIPDnbjt); - } - if (model->B3SOIPDaely < 0.0) - { - fprintf (fplog, "Warning: AELY = %g is negative.\n", - model->B3SOIPDaely); - printf ("Warning: Aely = %g is negative.\n", - model->B3SOIPDaely); - } - if (model->B3SOIPDahli < 0.0) - { - fprintf (fplog, "Warning: AHLI = %g is negative.\n", - model->B3SOIPDahli); - printf ("Warning: Ahli = %g is negative.\n", - model->B3SOIPDahli); - } - if (model->B3SOIPDrbody < 0.0) - { - fprintf (fplog, "Warning: RBODY = %g is negative.\n", - model->B3SOIPDrbody); - printf ("Warning: Rbody = %g is negative.\n", - model->B3SOIPDrbody); - } - if (model->B3SOIPDrbsh < 0.0) - { - fprintf (fplog, "Warning: RBSH = %g is negative.\n", - model->B3SOIPDrbsh); - printf ("Warning: Rbsh = %g is negative.\n", - model->B3SOIPDrbsh); - } - if (model->B3SOIPDntrecf < 0.0) - { - fprintf (fplog, "Warning: NTRECF = %g is negative.\n", - model->B3SOIPDntrecf); - printf ("Warning: Ntrecf = %g is negative.\n", - model->B3SOIPDntrecf); - } - if (model->B3SOIPDntrecr < 0.0) - { - fprintf (fplog, "Warning: NTRECR = %g is negative.\n", - model->B3SOIPDntrecr); - printf ("Warning: Ntrecr = %g is negative.\n", - model->B3SOIPDntrecr); - } - if (model->B3SOIPDndif < 0.0) - { - fprintf (fplog, "Warning: NDIF = %g is negative.\n", - model->B3SOIPDndif); - printf ("Warning: Ndif = %g is negative.\n", - model->B3SOIPDndif); - } - if (model->B3SOIPDtcjswg < 0.0) - { - fprintf (fplog, "Warning: TCJSWG = %g is negative.\n", - model->B3SOIPDtcjswg); - printf ("Warning: Tcjswg = %g is negative.\n", - model->B3SOIPDtcjswg); - } - if (model->B3SOIPDtpbswg < 0.0) - { - fprintf (fplog, "Warning: TPBSWG = %g is negative.\n", - model->B3SOIPDtpbswg); - printf ("Warning: Tpbswg = %g is negative.\n", - model->B3SOIPDtpbswg); - } - if ((model->B3SOIPDacde < 0.4) || (model->B3SOIPDacde > 1.6)) - { - fprintf (fplog, "Warning: ACDE = %g is out of range.\n", - model->B3SOIPDacde); - printf ("Warning: Acde = %g is out of range.\n", - model->B3SOIPDacde); - } - if ((model->B3SOIPDmoin < 5.0) || (model->B3SOIPDmoin > 25.0)) - { - fprintf (fplog, "Warning: MOIN = %g is out of range.\n", - model->B3SOIPDmoin); - printf ("Warning: Moin = %g is out of range.\n", - model->B3SOIPDmoin); - } - if (model->B3SOIPDdlbg < 0.0) - { - fprintf (fplog, "Warning: DLBG = %g is negative.\n", - model->B3SOIPDdlbg); - printf ("Warning: dlbg = %g is negative.\n", - model->B3SOIPDdlbg); - } - - - if (model->B3SOIPDagidl < 0.0) - { - fprintf (fplog, "Warning: AGIDL = %g is negative.\n", - model->B3SOIPDagidl); - printf ("Warning: Agidl = %g is negative.\n", - model->B3SOIPDagidl); - } - if (model->B3SOIPDbgidl < 0.0) - { - fprintf (fplog, "Warning: BGIDL = %g is negative.\n", - model->B3SOIPDbgidl); - printf ("Warning: Bgidl = %g is negative.\n", - model->B3SOIPDbgidl); - } - if (model->B3SOIPDngidl < 0.0) - { - fprintf (fplog, "Warning: NGIDL = %g is negative.\n", - model->B3SOIPDngidl); - printf ("Warning: Ngidl = %g is negative.\n", - model->B3SOIPDngidl); - } - if (model->B3SOIPDesatii < 0.0) - { - fprintf (fplog, - "Warning: Esatii = %g should be within positive.\n", - model->B3SOIPDesatii); - printf ("Warning: Esatii = %g should be within (0, 1).\n", - model->B3SOIPDesatii); - } - - - if (model->B3SOIPDxj > model->B3SOIPDtsi) - { - fprintf (fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n", - model->B3SOIPDxj, model->B3SOIPDtsi); - printf ("Warning: Xj = %g is thicker than Tsi = %g.\n", - model->B3SOIPDxj, model->B3SOIPDtsi); - } - - if (model->B3SOIPDcapMod < 2) - { - fprintf (fplog, - "Warning: capMod < 2 is not supported by BSIM3SOI.\n"); - printf - ("Warning: Warning: capMod < 2 is not supported by BSIM3SOI.\n"); - } - - } /* loop for the parameter check for warning messages */ - fclose (fplog); + if (model->B3SOIPDk1w1 < 0.0) + { fprintf(fplog, "Warning: K1W1 = %g is negative.\n", + model->B3SOIPDk1w1); + printf("Warning: K1w1 = %g is negative.\n", model->B3SOIPDk1w1); + } + if (model->B3SOIPDk1w2 < 0.0) + { fprintf(fplog, "Warning: K1W2 = %g is negative.\n", + model->B3SOIPDk1w2); + printf("Warning: K1w2 = %g is negative.\n", model->B3SOIPDk1w2); + } + if (model->B3SOIPDketas < 0.0) + { fprintf(fplog, "Warning: KETAS = %g is negative.\n", + model->B3SOIPDketas); + printf("Warning: Ketas = %g is negative.\n", model->B3SOIPDketas); + } + if (model->B3SOIPDdwbc < 0.0) + { fprintf(fplog, "Warning: DWBC = %g is negative.\n", + model->B3SOIPDdwbc); + printf("Warning: Dwbc = %g is negative.\n", model->B3SOIPDdwbc); + } + if (model->B3SOIPDbeta0 < 0.0) + { fprintf(fplog, "Warning: BETA0 = %g is negative.\n", + model->B3SOIPDbeta0); + printf("Warning: Beta0 = %g is negative.\n", model->B3SOIPDbeta0); + } + if (model->B3SOIPDbeta1 < 0.0) + { fprintf(fplog, "Warning: BETA1 = %g is negative.\n", + model->B3SOIPDbeta1); + printf("Warning: Beta1 = %g is negative.\n", model->B3SOIPDbeta1); + } + if (model->B3SOIPDbeta2 < 0.0) + { fprintf(fplog, "Warning: BETA2 = %g is negative.\n", + model->B3SOIPDbeta2); + printf("Warning: Beta2 = %g is negative.\n", model->B3SOIPDbeta2); + } + if (model->B3SOIPDtii < 0.0) + { fprintf(fplog, "Warning: TII = %g is negative.\n", + model->B3SOIPDtii); + printf("Warning: Tii = %g is negative.\n", model->B3SOIPDtii); + } + if (model->B3SOIPDlii < 0.0) + { fprintf(fplog, "Warning: LII = %g is negative.\n", + model->B3SOIPDlii); + printf("Warning: Lii = %g is negative.\n", model->B3SOIPDlii); + } + if (model->B3SOIPDsii1 < 0.0) + { fprintf(fplog, "Warning: SII1 = %g is negative.\n", + model->B3SOIPDsii1); + printf("Warning: Sii1 = %g is negative.\n", model->B3SOIPDsii1); + } + if (model->B3SOIPDsii2 < 0.0) + { fprintf(fplog, "Warning: SII2 = %g is negative.\n", + model->B3SOIPDsii2); + printf("Warning: Sii2 = %g is negative.\n", model->B3SOIPDsii1); + } + if (model->B3SOIPDsiid < 0.0) + { fprintf(fplog, "Warning: SIID = %g is negative.\n", + model->B3SOIPDsiid); + printf("Warning: Siid = %g is negative.\n", model->B3SOIPDsiid); + } + if (model->B3SOIPDfbjtii < 0.0) + { fprintf(fplog, "Warning: FBJTII = %g is negative.\n", + model->B3SOIPDfbjtii); + printf("Warning: fbjtii = %g is negative.\n", model->B3SOIPDfbjtii); + } + if (model->B3SOIPDvrec0 < 0.0) + { fprintf(fplog, "Warning: VREC0 = %g is negative.\n", + model->B3SOIPDvrec0); + printf("Warning: Vrec0 = %g is negative.\n", model->B3SOIPDvrec0); + } + if (model->B3SOIPDvtun0 < 0.0) + { fprintf(fplog, "Warning: VTUN0 = %g is negative.\n", + model->B3SOIPDvtun0); + printf("Warning: Vtun0 = %g is negative.\n", model->B3SOIPDvtun0); + } + if (model->B3SOIPDnbjt < 0.0) + { fprintf(fplog, "Warning: NBJT = %g is negative.\n", + model->B3SOIPDnbjt); + printf("Warning: Nbjt = %g is negative.\n", model->B3SOIPDnbjt); + } + if (model->B3SOIPDaely < 0.0) + { fprintf(fplog, "Warning: AELY = %g is negative.\n", + model->B3SOIPDaely); + printf("Warning: Aely = %g is negative.\n", model->B3SOIPDaely); + } + if (model->B3SOIPDahli < 0.0) + { fprintf(fplog, "Warning: AHLI = %g is negative.\n", + model->B3SOIPDahli); + printf("Warning: Ahli = %g is negative.\n", model->B3SOIPDahli); + } + if (model->B3SOIPDrbody < 0.0) + { fprintf(fplog, "Warning: RBODY = %g is negative.\n", + model->B3SOIPDrbody); + printf("Warning: Rbody = %g is negative.\n", model->B3SOIPDrbody); + } + if (model->B3SOIPDrbsh < 0.0) + { fprintf(fplog, "Warning: RBSH = %g is negative.\n", + model->B3SOIPDrbsh); + printf("Warning: Rbsh = %g is negative.\n", model->B3SOIPDrbsh); + } + if (model->B3SOIPDntrecf < 0.0) + { fprintf(fplog, "Warning: NTRECF = %g is negative.\n", + model->B3SOIPDntrecf); + printf("Warning: Ntrecf = %g is negative.\n", model->B3SOIPDntrecf); + } + if (model->B3SOIPDntrecr < 0.0) + { fprintf(fplog, "Warning: NTRECR = %g is negative.\n", + model->B3SOIPDntrecr); + printf("Warning: Ntrecr = %g is negative.\n", model->B3SOIPDntrecr); + } + if (model->B3SOIPDndif < 0.0) + { fprintf(fplog, "Warning: NDIF = %g is negative.\n", + model->B3SOIPDndif); + printf("Warning: Ndif = %g is negative.\n", model->B3SOIPDndif); + } + if (model->B3SOIPDtcjswg < 0.0) + { fprintf(fplog, "Warning: TCJSWG = %g is negative.\n", + model->B3SOIPDtcjswg); + printf("Warning: Tcjswg = %g is negative.\n", model->B3SOIPDtcjswg); + } + if (model->B3SOIPDtpbswg < 0.0) + { fprintf(fplog, "Warning: TPBSWG = %g is negative.\n", + model->B3SOIPDtpbswg); + printf("Warning: Tpbswg = %g is negative.\n", model->B3SOIPDtpbswg); + } + if ((model->B3SOIPDacde < 0.4) || (model->B3SOIPDacde > 1.6)) + { fprintf(fplog, "Warning: ACDE = %g is out of range.\n", + model->B3SOIPDacde); + printf("Warning: Acde = %g is out of range.\n", model->B3SOIPDacde); + } + if ((model->B3SOIPDmoin < 5.0)||(model->B3SOIPDmoin > 25.0)) + { fprintf(fplog, "Warning: MOIN = %g is out of range.\n", + model->B3SOIPDmoin); + printf("Warning: Moin = %g is out of range.\n", model->B3SOIPDmoin); + } + if (model->B3SOIPDdlbg < 0.0) + { fprintf(fplog, "Warning: DLBG = %g is negative.\n", + model->B3SOIPDdlbg); + printf("Warning: dlbg = %g is negative.\n", model->B3SOIPDdlbg); + } + + + if (model->B3SOIPDagidl < 0.0) + { fprintf(fplog, "Warning: AGIDL = %g is negative.\n", + model->B3SOIPDagidl); + printf("Warning: Agidl = %g is negative.\n", model->B3SOIPDagidl); + } + if (model->B3SOIPDbgidl < 0.0) + { fprintf(fplog, "Warning: BGIDL = %g is negative.\n", + model->B3SOIPDbgidl); + printf("Warning: Bgidl = %g is negative.\n", model->B3SOIPDbgidl); + } + if (model->B3SOIPDngidl < 0.0) + { fprintf(fplog, "Warning: NGIDL = %g is negative.\n", + model->B3SOIPDngidl); + printf("Warning: Ngidl = %g is negative.\n", model->B3SOIPDngidl); + } + if (model->B3SOIPDesatii < 0.0) + { fprintf(fplog, "Warning: Esatii = %g should be within positive.\n", + model->B3SOIPDesatii); + printf("Warning: Esatii = %g should be within (0, 1).\n", model->B3SOIPDesatii); + } + + + if (model->B3SOIPDxj > model->B3SOIPDtsi) + { fprintf(fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n", + model->B3SOIPDxj, model->B3SOIPDtsi); + printf("Warning: Xj = %g is thicker than Tsi = %g.\n", + model->B3SOIPDxj, model->B3SOIPDtsi); + } + + if (model->B3SOIPDcapMod < 2) + { fprintf(fplog, "Warning: capMod < 2 is not supported by BSIM3SOI.\n"); + printf("Warning: Warning: capMod < 2 is not supported by BSIM3SOI.\n"); + } + + }/* loop for the parameter check for warning messages */ + fclose(fplog); } - else - { - fprintf (stderr, - "Warning: Can't open log file. Parameter checking skipped.\n"); + else + { fprintf(stderr, "Warning: Can't open log file. Parameter checking skipped.\n"); } - return (Fatal_Flag); + return(Fatal_Flag); } + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdcvtest.c b/src/spicelib/devices/bsim3soi_pd/b3soipdcvtest.c index c07ea73f0..789a39b0d 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdcvtest.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdcvtest.c @@ -2,12 +2,15 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soipdcvtest.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "b3soipddef.h" #include "trandefs.h" @@ -18,78 +21,76 @@ File: b3soipdcvtest.c 98/5/01 int -B3SOIPDconvTest (inModel, ckt) - GENmodel *inModel; - CKTcircuit *ckt; +B3SOIPDconvTest(GENmodel *inModel, CKTcircuit *ckt) { - 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; +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; - /* loop through all the B3SOIPD device models */ - for (; model != NULL; model = model->B3SOIPDnextModel) - { /* loop through all the instances of the model */ - for (here = model->B3SOIPDinstances; here != NULL; - here = here->B3SOIPDnextInstance) - { - vbs = model->B3SOIPDtype - * (*(ckt->CKTrhsOld + here->B3SOIPDbNode) - - *(ckt->CKTrhsOld + here->B3SOIPDsNodePrime)); - vgs = model->B3SOIPDtype - * (*(ckt->CKTrhsOld + here->B3SOIPDgNode) - - *(ckt->CKTrhsOld + here->B3SOIPDsNodePrime)); - vds = model->B3SOIPDtype - * (*(ckt->CKTrhsOld + here->B3SOIPDdNodePrime) - - *(ckt->CKTrhsOld + here->B3SOIPDsNodePrime)); - vbd = vbs - vds; - vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->B3SOIPDvgs) - - *(ckt->CKTstate0 + here->B3SOIPDvds); - delvbs = vbs - *(ckt->CKTstate0 + here->B3SOIPDvbs); - delvbd = vbd - *(ckt->CKTstate0 + here->B3SOIPDvbd); - delvgs = vgs - *(ckt->CKTstate0 + here->B3SOIPDvgs); - delvds = vds - *(ckt->CKTstate0 + here->B3SOIPDvds); - delvgd = vgd - vgdo; + /* loop through all the B3SOIPD device models */ + for (; model != NULL; model = model->B3SOIPDnextModel) + { /* loop through all the instances of the model */ + for (here = model->B3SOIPDinstances; here != NULL ; + here=here->B3SOIPDnextInstance) + { + + if (here->B3SOIPDowner != ARCHme) + continue; + + vbs = model->B3SOIPDtype + * (*(ckt->CKTrhsOld+here->B3SOIPDbNode) + - *(ckt->CKTrhsOld+here->B3SOIPDsNodePrime)); + vgs = model->B3SOIPDtype + * (*(ckt->CKTrhsOld+here->B3SOIPDgNode) + - *(ckt->CKTrhsOld+here->B3SOIPDsNodePrime)); + vds = model->B3SOIPDtype + * (*(ckt->CKTrhsOld+here->B3SOIPDdNodePrime) + - *(ckt->CKTrhsOld+here->B3SOIPDsNodePrime)); + vbd = vbs - vds; + vgd = vgs - vds; + vgdo = *(ckt->CKTstate0 + here->B3SOIPDvgs) + - *(ckt->CKTstate0 + here->B3SOIPDvds); + delvbs = vbs - *(ckt->CKTstate0 + here->B3SOIPDvbs); + delvbd = vbd - *(ckt->CKTstate0 + here->B3SOIPDvbd); + delvgs = vgs - *(ckt->CKTstate0 + here->B3SOIPDvgs); + delvds = vds - *(ckt->CKTstate0 + here->B3SOIPDvds); + delvgd = vgd-vgdo; - cd = here->B3SOIPDcd; - if (here->B3SOIPDmode >= 0) - { - cdhat = cd - here->B3SOIPDgjdb * delvbd - + here->B3SOIPDgmbs * delvbs + here->B3SOIPDgm * delvgs - + here->B3SOIPDgds * delvds; - } - else - { - cdhat = cd - (here->B3SOIPDgjdb - here->B3SOIPDgmbs) * delvbd - - here->B3SOIPDgm * delvgd + here->B3SOIPDgds * delvds; - } + cd = here->B3SOIPDcd; + if (here->B3SOIPDmode >= 0) + { cdhat = cd - here->B3SOIPDgjdb * delvbd + + here->B3SOIPDgmbs * delvbs + here->B3SOIPDgm * delvgs + + here->B3SOIPDgds * delvds; + } + else + { cdhat = cd - (here->B3SOIPDgjdb - here->B3SOIPDgmbs) * delvbd + - here->B3SOIPDgm * delvgd + here->B3SOIPDgds * delvds; + } - /* - * check convergence - */ - if ((here->B3SOIPDoff == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { - tol = ckt->CKTreltol * MAX (fabs (cdhat), fabs (cd)) - + ckt->CKTabstol; - if (fabs (cdhat - cd) >= tol) - { - ckt->CKTnoncon++; - return (OK); - } - cbs = here->B3SOIPDcjs; - cbd = here->B3SOIPDcjd; - cbhat = cbs + cbd + here->B3SOIPDgjdb * delvbd - + here->B3SOIPDgjsb * delvbs; - tol = ckt->CKTreltol * MAX (fabs (cbhat), fabs (cbs + cbd)) - + ckt->CKTabstol; - if (fabs (cbhat - (cbs + cbd)) > tol) - { - ckt->CKTnoncon++; - return (OK); - } - } - } + /* + * check convergence + */ + if ((here->B3SOIPDoff == 0) || (!(ckt->CKTmode & MODEINITFIX))) + { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) + + ckt->CKTabstol; + if (fabs(cdhat - cd) >= tol) + { ckt->CKTnoncon++; + return(OK); + } + cbs = here->B3SOIPDcjs; + cbd = here->B3SOIPDcjd; + cbhat = cbs + cbd + here->B3SOIPDgjdb * delvbd + + here->B3SOIPDgjsb * delvbs; + tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(cbs + cbd)) + + ckt->CKTabstol; + if (fabs(cbhat - (cbs + cbd)) > tol) + { ckt->CKTnoncon++; + return(OK); + } + } + } } - return (OK); + return(OK); } + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipddef.h b/src/spicelib/devices/bsim3soi_pd/b3soipddef.h index 610eb386d..ee931ba47 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipddef.h +++ b/src/spicelib/devices/bsim3soi_pd/b3soipddef.h @@ -6,6 +6,9 @@ Modified by Pin Su and Jan Feng 99/2/15 Modified by Pin Su 99/4/30 Modified by Pin Su and Wei Jin 99/9/27 Modified by Pin Su 00/3/1 +Modified by Pin Su 01/2/15 +Modified by Pin Su and Hui Wan 02/3/5 +Modified by Paolo Nenzi 2002 **********/ #ifndef B3SOIPD @@ -18,306 +21,313 @@ Modified by Pin Su 00/3/1 #include "gendefs.h" #include "cktdefs.h" #include "complex.h" -#include "noisedef.h" +#include "noisedef.h" typedef struct sB3SOIPDinstance { - struct sB3SOIPDmodel *B3SOIPDmodPtr; - struct sB3SOIPDinstance *B3SOIPDnextInstance; - IFuid B3SOIPDname; - int B3SOIPDowner; - int B3SOIPDstates; /* index into state table for this device */ - int B3SOIPDdNode; - int B3SOIPDgNode; - int B3SOIPDsNode; - int B3SOIPDeNode; - int B3SOIPDpNode; - int B3SOIPDbNode; - int B3SOIPDtempNode; - int B3SOIPDdNodePrime; - int B3SOIPDsNodePrime; - - int B3SOIPDvbsNode; - /* for Debug */ - int B3SOIPDidsNode; - int B3SOIPDicNode; - int B3SOIPDibsNode; - int B3SOIPDibdNode; - int B3SOIPDiiiNode; - int B3SOIPDigNode; - int B3SOIPDgiggNode; - int B3SOIPDgigdNode; - int B3SOIPDgigbNode; - int B3SOIPDigidlNode; - int B3SOIPDitunNode; - int B3SOIPDibpNode; - int B3SOIPDcbbNode; - int B3SOIPDcbdNode; - int B3SOIPDcbgNode; - - int B3SOIPDqbfNode; - int B3SOIPDqjsNode; - int B3SOIPDqjdNode; - - - double B3SOIPDphi; - double B3SOIPDvtm; - double B3SOIPDni; - double B3SOIPDueff; - double B3SOIPDthetavth; - double B3SOIPDvon; - double B3SOIPDvdsat; - double B3SOIPDcgdo; - double B3SOIPDcgso; - double B3SOIPDcgeo; - - double B3SOIPDids; - double B3SOIPDic; - double B3SOIPDibs; - double B3SOIPDibd; - double B3SOIPDiii; - double B3SOIPDig; - double B3SOIPDgigg; - double B3SOIPDgigd; - double B3SOIPDgigb; - double B3SOIPDigidl; - double B3SOIPDitun; - double B3SOIPDibp; - double B3SOIPDabeff; - double B3SOIPDvbseff; - double B3SOIPDcbg; - double B3SOIPDcbb; - double B3SOIPDcbs; /* XXX PN */ - double B3SOIPDcbd; - double B3SOIPDqb; - double B3SOIPDqbf; - double B3SOIPDqjs; - double B3SOIPDqjd; - int B3SOIPDfloat; - - - double B3SOIPDl; - double B3SOIPDw; - double B3SOIPDdrainArea; - double B3SOIPDsourceArea; - double B3SOIPDdrainSquares; - double B3SOIPDsourceSquares; - double B3SOIPDdrainPerimeter; - double B3SOIPDsourcePerimeter; - double B3SOIPDsourceConductance; - double B3SOIPDdrainConductance; - - double B3SOIPDicVBS; - double B3SOIPDicVDS; - double B3SOIPDicVGS; - double B3SOIPDicVES; - double B3SOIPDicVPS; - int B3SOIPDbjtoff; - int B3SOIPDbodyMod; - int B3SOIPDdebugMod; - double B3SOIPDrth0; - double B3SOIPDcth0; - double B3SOIPDbodySquares; - double B3SOIPDrbodyext; + struct sB3SOIPDmodel *B3SOIPDmodPtr; + struct sB3SOIPDinstance *B3SOIPDnextInstance; + IFuid B3SOIPDname; + int B3SOIPDowner; /* number of owner process */ + int B3SOIPDstates; /* index into state table for this device */ + + int B3SOIPDdNode; + int B3SOIPDgNode; + int B3SOIPDsNode; + int B3SOIPDeNode; + int B3SOIPDpNode; + int B3SOIPDbNode; + int B3SOIPDtempNode; + int B3SOIPDdNodePrime; + int B3SOIPDsNodePrime; + + int B3SOIPDvbsNode; + /* for Debug */ + int B3SOIPDidsNode; + int B3SOIPDicNode; + int B3SOIPDibsNode; + int B3SOIPDibdNode; + int B3SOIPDiiiNode; + int B3SOIPDigNode; + int B3SOIPDgiggNode; + int B3SOIPDgigdNode; + int B3SOIPDgigbNode; + int B3SOIPDigidlNode; + int B3SOIPDitunNode; + int B3SOIPDibpNode; + int B3SOIPDcbbNode; + int B3SOIPDcbdNode; + int B3SOIPDcbgNode; + + int B3SOIPDqbfNode; + int B3SOIPDqjsNode; + int B3SOIPDqjdNode; + + + double B3SOIPDphi; + double B3SOIPDvtm; + double B3SOIPDni; + double B3SOIPDueff; + double B3SOIPDthetavth; + double B3SOIPDvon; + double B3SOIPDvdsat; + double B3SOIPDcgdo; + double B3SOIPDcgso; + double B3SOIPDcgeo; + + double B3SOIPDids; + double B3SOIPDic; + double B3SOIPDibs; + double B3SOIPDibd; + double B3SOIPDiii; + double B3SOIPDig; + double B3SOIPDgigg; + double B3SOIPDgigd; + double B3SOIPDgigb; + double B3SOIPDigidl; + double B3SOIPDitun; + double B3SOIPDibp; + double B3SOIPDabeff; + double B3SOIPDvbseff; + double B3SOIPDcbg; + double B3SOIPDcbb; + double B3SOIPDcbd; + double B3SOIPDqb; + double B3SOIPDqbf; + double B3SOIPDqjs; + double B3SOIPDqjd; + int B3SOIPDfloat; + + double B3SOIPDl; + double B3SOIPDw; + double B3SOIPDm; + double B3SOIPDdrainArea; + double B3SOIPDsourceArea; + double B3SOIPDdrainSquares; + double B3SOIPDsourceSquares; + double B3SOIPDdrainPerimeter; + double B3SOIPDsourcePerimeter; + double B3SOIPDsourceConductance; + double B3SOIPDdrainConductance; + + double B3SOIPDicVBS; + double B3SOIPDicVDS; + double B3SOIPDicVGS; + double B3SOIPDicVES; + double B3SOIPDicVPS; + int B3SOIPDbjtoff; + int B3SOIPDbodyMod; + int B3SOIPDdebugMod; + double B3SOIPDrth0; + double B3SOIPDcth0; + double B3SOIPDbodySquares; + double B3SOIPDrbodyext; + double B3SOIPDfrbody; /* v2.0 release */ - double B3SOIPDnbc; - double B3SOIPDnseg; - double B3SOIPDpdbcp; - double B3SOIPDpsbcp; - double B3SOIPDagbcp; - double B3SOIPDaebcp; - double B3SOIPDvbsusr; - int B3SOIPDtnodeout; + double B3SOIPDnbc; + double B3SOIPDnseg; + double B3SOIPDpdbcp; + double B3SOIPDpsbcp; + double B3SOIPDagbcp; + double B3SOIPDaebcp; + double B3SOIPDvbsusr; + int B3SOIPDtnodeout; /* Deleted from pParam and moved to here */ - double B3SOIPDcsbox; - double B3SOIPDcdbox; - double B3SOIPDcsmin; - double B3SOIPDcdmin; - double B3SOIPDst4; - double B3SOIPDdt4; - - int B3SOIPDoff; - int B3SOIPDmode; - - /* OP point */ - double B3SOIPDqinv; - double B3SOIPDcd; - double B3SOIPDcjs; - double B3SOIPDcjd; - double B3SOIPDcbody; + double B3SOIPDcsesw; + double B3SOIPDcdesw; + double B3SOIPDcsbox; + double B3SOIPDcdbox; + double B3SOIPDcsmin; + double B3SOIPDcdmin; + double B3SOIPDst4; + double B3SOIPDdt4; + + int B3SOIPDoff; + int B3SOIPDmode; + + /* OP point */ + double B3SOIPDqinv; + double B3SOIPDcd; + double B3SOIPDcjs; + double B3SOIPDcjd; + double B3SOIPDcbody; /* v2.2 release */ - double B3SOIPDcgate; - double B3SOIPDgigs; - double B3SOIPDgigT; - - double B3SOIPDcbodcon; - double B3SOIPDcth; - double B3SOIPDcsubstrate; - - double B3SOIPDgm; - double B3SOIPDcb; - double B3SOIPDcdrain; - double B3SOIPDgds; - double B3SOIPDgmbs; - double B3SOIPDgmT; - - double B3SOIPDgbbs; - double B3SOIPDgbgs; - double B3SOIPDgbds; - double B3SOIPDgbps; - double B3SOIPDgbT; - - double B3SOIPDgjsd; - double B3SOIPDgjsb; - double B3SOIPDgjsg; - double B3SOIPDgjsT; - - double B3SOIPDgjdb; - double B3SOIPDgjdd; - double B3SOIPDgjdg; - double B3SOIPDgjdT; - - double B3SOIPDgbpbs; - double B3SOIPDgbpps; - double B3SOIPDgbpT; - - double B3SOIPDgtempb; - double B3SOIPDgtempg; - double B3SOIPDgtempd; - double B3SOIPDgtempT; - - double B3SOIPDcggb; - double B3SOIPDcgdb; - double B3SOIPDcgsb; - double B3SOIPDcgT; - - double B3SOIPDcbgb; - double B3SOIPDcbdb; - double B3SOIPDcbsb; - double B3SOIPDcbeb; - double B3SOIPDcbT; - - double B3SOIPDcdgb; - double B3SOIPDcddb; - double B3SOIPDcdsb; - double B3SOIPDcdeb; - double B3SOIPDcdT; - - double B3SOIPDceeb; - double B3SOIPDceT; - - double B3SOIPDqse; - double B3SOIPDgcse; - double B3SOIPDqde; - double B3SOIPDgcde; - - struct b3soipdSizeDependParam *pParam; - - unsigned B3SOIPDlGiven:1; - unsigned B3SOIPDwGiven:1; - unsigned B3SOIPDdrainAreaGiven:1; - unsigned B3SOIPDsourceAreaGiven:1; - unsigned B3SOIPDdrainSquaresGiven:1; - unsigned B3SOIPDsourceSquaresGiven:1; - unsigned B3SOIPDdrainPerimeterGiven:1; - unsigned B3SOIPDsourcePerimeterGiven:1; - unsigned B3SOIPDdNodePrimeSet:1; - unsigned B3SOIPDsNodePrimeSet:1; - unsigned B3SOIPDicVBSGiven:1; - unsigned B3SOIPDicVDSGiven:1; - unsigned B3SOIPDicVGSGiven:1; - unsigned B3SOIPDicVESGiven:1; - unsigned B3SOIPDicVPSGiven:1; - unsigned B3SOIPDbjtoffGiven:1; - unsigned B3SOIPDdebugModGiven:1; - unsigned B3SOIPDrth0Given:1; - unsigned B3SOIPDcth0Given:1; - unsigned B3SOIPDbodySquaresGiven:1; - + double B3SOIPDcgate; + double B3SOIPDgigs; + double B3SOIPDgigT; + + double B3SOIPDcbodcon; + double B3SOIPDcth; + double B3SOIPDcsubstrate; + + double B3SOIPDgm; + double B3SOIPDcb; + double B3SOIPDcdrain; + double B3SOIPDgds; + double B3SOIPDgmbs; + double B3SOIPDgmT; + + double B3SOIPDgbbs; + double B3SOIPDgbgs; + double B3SOIPDgbds; + double B3SOIPDgbps; + double B3SOIPDgbT; + + double B3SOIPDgjsd; + double B3SOIPDgjsb; + double B3SOIPDgjsg; + double B3SOIPDgjsT; + + double B3SOIPDgjdb; + double B3SOIPDgjdd; + double B3SOIPDgjdg; + double B3SOIPDgjdT; + + double B3SOIPDgbpbs; + double B3SOIPDgbpps; + double B3SOIPDgbpT; + + double B3SOIPDgtempb; + double B3SOIPDgtempg; + double B3SOIPDgtempd; + double B3SOIPDgtempT; + + double B3SOIPDcggb; + double B3SOIPDcgdb; + double B3SOIPDcgsb; + double B3SOIPDcgT; + + double B3SOIPDcbgb; + double B3SOIPDcbdb; + double B3SOIPDcbsb; + double B3SOIPDcbeb; + double B3SOIPDcbT; + + double B3SOIPDcdgb; + double B3SOIPDcddb; + double B3SOIPDcdsb; + double B3SOIPDcdeb; + double B3SOIPDcdT; + + double B3SOIPDceeb; + double B3SOIPDceT; + + double B3SOIPDqse; + double B3SOIPDgcse; + double B3SOIPDqde; + double B3SOIPDgcde; + double B3SOIPDrds; /* v2.2.3 */ + double B3SOIPDVgsteff; /* v2.2.3 */ + double B3SOIPDVdseff; /* v2.2.3 */ + double B3SOIPDAbovVgst2Vtm; /* v2.2.3 */ + + struct b3soipdSizeDependParam *pParam; + + unsigned B3SOIPDlGiven :1; + unsigned B3SOIPDwGiven :1; + unsigned B3SOIPDmGiven :1; + unsigned B3SOIPDdrainAreaGiven :1; + unsigned B3SOIPDsourceAreaGiven :1; + unsigned B3SOIPDdrainSquaresGiven :1; + unsigned B3SOIPDsourceSquaresGiven :1; + unsigned B3SOIPDdrainPerimeterGiven :1; + unsigned B3SOIPDsourcePerimeterGiven :1; + unsigned B3SOIPDdNodePrimeSet :1; + unsigned B3SOIPDsNodePrimeSet :1; + unsigned B3SOIPDicVBSGiven :1; + unsigned B3SOIPDicVDSGiven :1; + unsigned B3SOIPDicVGSGiven :1; + unsigned B3SOIPDicVESGiven :1; + unsigned B3SOIPDicVPSGiven :1; + unsigned B3SOIPDbjtoffGiven :1; + unsigned B3SOIPDdebugModGiven :1; + unsigned B3SOIPDrth0Given :1; + unsigned B3SOIPDcth0Given :1; + unsigned B3SOIPDbodySquaresGiven :1; + unsigned B3SOIPDfrbodyGiven: 1; /* v2.0 release */ - unsigned B3SOIPDnbcGiven:1; - unsigned B3SOIPDnsegGiven:1; - unsigned B3SOIPDpdbcpGiven:1; - unsigned B3SOIPDpsbcpGiven:1; - unsigned B3SOIPDagbcpGiven:1; - unsigned B3SOIPDaebcpGiven:1; - unsigned B3SOIPDvbsusrGiven:1; - unsigned B3SOIPDtnodeoutGiven:1; - unsigned B3SOIPDoffGiven:1; - - double *B3SOIPDGePtr; - double *B3SOIPDDPePtr; - double *B3SOIPDSPePtr; - - double *B3SOIPDEePtr; - double *B3SOIPDEbPtr; - double *B3SOIPDBePtr; - double *B3SOIPDEgPtr; - double *B3SOIPDEdpPtr; - double *B3SOIPDEspPtr; - double *B3SOIPDTemptempPtr; - double *B3SOIPDTempdpPtr; - double *B3SOIPDTempspPtr; - double *B3SOIPDTempgPtr; - double *B3SOIPDTempbPtr; - double *B3SOIPDGtempPtr; - double *B3SOIPDDPtempPtr; - double *B3SOIPDSPtempPtr; - double *B3SOIPDEtempPtr; - double *B3SOIPDBtempPtr; - double *B3SOIPDPtempPtr; - double *B3SOIPDBpPtr; - double *B3SOIPDPbPtr; - double *B3SOIPDPpPtr; - double *B3SOIPDDdPtr; - double *B3SOIPDGgPtr; - double *B3SOIPDSsPtr; - double *B3SOIPDBbPtr; - double *B3SOIPDDPdpPtr; - double *B3SOIPDSPspPtr; - double *B3SOIPDDdpPtr; - double *B3SOIPDGbPtr; - double *B3SOIPDGdpPtr; - double *B3SOIPDGspPtr; - double *B3SOIPDSspPtr; - double *B3SOIPDBdpPtr; - double *B3SOIPDBspPtr; - double *B3SOIPDDPspPtr; - double *B3SOIPDDPdPtr; - double *B3SOIPDBgPtr; - double *B3SOIPDDPgPtr; - double *B3SOIPDSPgPtr; - double *B3SOIPDSPsPtr; - double *B3SOIPDDPbPtr; - double *B3SOIPDSPbPtr; - double *B3SOIPDSPdpPtr; - - double *B3SOIPDVbsPtr; - /* Debug */ - double *B3SOIPDIdsPtr; - double *B3SOIPDIcPtr; - double *B3SOIPDIbsPtr; - double *B3SOIPDIbdPtr; - double *B3SOIPDIiiPtr; - double *B3SOIPDIgPtr; - double *B3SOIPDGiggPtr; - double *B3SOIPDGigdPtr; - double *B3SOIPDGigbPtr; - double *B3SOIPDIgidlPtr; - double *B3SOIPDItunPtr; - double *B3SOIPDIbpPtr; - double *B3SOIPDCbbPtr; - double *B3SOIPDCbdPtr; - double *B3SOIPDCbgPtr; - double *B3SOIPDqbPtr; - double *B3SOIPDQbfPtr; - double *B3SOIPDQjsPtr; - double *B3SOIPDQjdPtr; - + unsigned B3SOIPDnbcGiven :1; + unsigned B3SOIPDnsegGiven :1; + unsigned B3SOIPDpdbcpGiven :1; + unsigned B3SOIPDpsbcpGiven :1; + unsigned B3SOIPDagbcpGiven :1; + unsigned B3SOIPDaebcpGiven :1; + unsigned B3SOIPDvbsusrGiven :1; + unsigned B3SOIPDtnodeoutGiven :1; + unsigned B3SOIPDoffGiven :1; + + double *B3SOIPDGePtr; + double *B3SOIPDDPePtr; + double *B3SOIPDSPePtr; + + double *B3SOIPDEePtr; + double *B3SOIPDEbPtr; + double *B3SOIPDBePtr; + double *B3SOIPDEgPtr; + double *B3SOIPDEdpPtr; + double *B3SOIPDEspPtr; + double *B3SOIPDTemptempPtr; + double *B3SOIPDTempdpPtr; + double *B3SOIPDTempspPtr; + double *B3SOIPDTempgPtr; + double *B3SOIPDTempbPtr; + double *B3SOIPDGtempPtr; + double *B3SOIPDDPtempPtr; + double *B3SOIPDSPtempPtr; + double *B3SOIPDEtempPtr; + double *B3SOIPDBtempPtr; + double *B3SOIPDPtempPtr; + double *B3SOIPDBpPtr; + double *B3SOIPDPbPtr; + double *B3SOIPDPpPtr; + double *B3SOIPDDdPtr; + double *B3SOIPDGgPtr; + double *B3SOIPDSsPtr; + double *B3SOIPDBbPtr; + double *B3SOIPDDPdpPtr; + double *B3SOIPDSPspPtr; + double *B3SOIPDDdpPtr; + double *B3SOIPDGbPtr; + double *B3SOIPDGdpPtr; + double *B3SOIPDGspPtr; + double *B3SOIPDSspPtr; + double *B3SOIPDBdpPtr; + double *B3SOIPDBspPtr; + double *B3SOIPDDPspPtr; + double *B3SOIPDDPdPtr; + double *B3SOIPDBgPtr; + double *B3SOIPDDPgPtr; + double *B3SOIPDSPgPtr; + double *B3SOIPDSPsPtr; + double *B3SOIPDDPbPtr; + double *B3SOIPDSPbPtr; + double *B3SOIPDSPdpPtr; + + double *B3SOIPDVbsPtr; + /* Debug */ + double *B3SOIPDIdsPtr; + double *B3SOIPDIcPtr; + double *B3SOIPDIbsPtr; + double *B3SOIPDIbdPtr; + double *B3SOIPDIiiPtr; + double *B3SOIPDIgPtr; + double *B3SOIPDGiggPtr; + double *B3SOIPDGigdPtr; + double *B3SOIPDGigbPtr; + double *B3SOIPDIgidlPtr; + double *B3SOIPDItunPtr; + double *B3SOIPDIbpPtr; + double *B3SOIPDCbbPtr; + double *B3SOIPDCbdPtr; + double *B3SOIPDCbgPtr; + double *B3SOIPDqbPtr; + double *B3SOIPDQbfPtr; + double *B3SOIPDQjsPtr; + double *B3SOIPDQjdPtr; #define B3SOIPDvbd B3SOIPDstates+ 0 @@ -362,1246 +372,1260 @@ typedef struct sB3SOIPDinstance #define B3SOIPDFBNOIZ 4 #define B3SOIPDTOTNOIZ 5 -#define B3SOIPDNSRCS 6 /* the number of MOSFET(3) noise sources */ +#define B3SOIPDNSRCS 6 /* the number of MOSFET(3) noise sources */ #ifndef NONOISE - double B3SOIPDnVar[NSTATVARS][B3SOIPDNSRCS]; -#else /* NONOISE */ - double **B3SOIPDnVar; -#endif /* NONOISE */ + double B3SOIPDnVar[NSTATVARS][B3SOIPDNSRCS]; +#else /* NONOISE */ + double **B3SOIPDnVar; +#endif /* NONOISE */ -} -B3SOIPDinstance; +} B3SOIPDinstance ; struct b3soipdSizeDependParam { - double Width; - double Length; - double Rth0; - double Cth0; - - double B3SOIPDcdsc; - double B3SOIPDcdscb; - double B3SOIPDcdscd; - double B3SOIPDcit; - double B3SOIPDnfactor; - double B3SOIPDvsat; - double B3SOIPDat; - double B3SOIPDa0; - double B3SOIPDags; - double B3SOIPDa1; - double B3SOIPDa2; - double B3SOIPDketa; - double B3SOIPDnpeak; - double B3SOIPDnsub; - double B3SOIPDngate; - double B3SOIPDgamma1; - double B3SOIPDgamma2; - double B3SOIPDvbx; - double B3SOIPDvbi; - double B3SOIPDvbm; - double B3SOIPDvbsc; - double B3SOIPDxt; - double B3SOIPDphi; - double B3SOIPDlitl; - double B3SOIPDk1; - double B3SOIPDkt1; - double B3SOIPDkt1l; - double B3SOIPDkt2; - double B3SOIPDk2; - double B3SOIPDk3; - double B3SOIPDk3b; - double B3SOIPDw0; - double B3SOIPDnlx; - double B3SOIPDdvt0; - double B3SOIPDdvt1; - double B3SOIPDdvt2; - double B3SOIPDdvt0w; - double B3SOIPDdvt1w; - double B3SOIPDdvt2w; - double B3SOIPDdrout; - double B3SOIPDdsub; - double B3SOIPDvth0; - double B3SOIPDua; - double B3SOIPDua1; - double B3SOIPDub; - double B3SOIPDub1; - double B3SOIPDuc; - double B3SOIPDuc1; - double B3SOIPDu0; - double B3SOIPDute; - double B3SOIPDvoff; - double B3SOIPDvfb; - double B3SOIPDuatemp; - double B3SOIPDubtemp; - double B3SOIPDuctemp; - double B3SOIPDrbody; - double B3SOIPDrth; - double B3SOIPDcth; - double B3SOIPDrds0denom; - double B3SOIPDvfbb; - double B3SOIPDjbjt; - double B3SOIPDjdif; - double B3SOIPDjrec; - double B3SOIPDjtun; - double B3SOIPDcsesw; - double B3SOIPDcdesw; - double B3SOIPDsdt1; - double B3SOIPDst2; - double B3SOIPDst3; - double B3SOIPDdt2; - double B3SOIPDdt3; - double B3SOIPDdelta; - double B3SOIPDrdsw; - double B3SOIPDrds0; - double B3SOIPDprwg; - double B3SOIPDprwb; - double B3SOIPDprt; - double B3SOIPDeta0; - double B3SOIPDetab; - double B3SOIPDpclm; - double B3SOIPDpdibl1; - double B3SOIPDpdibl2; - double B3SOIPDpdiblb; - double B3SOIPDpvag; - double B3SOIPDwr; - double B3SOIPDdwg; - double B3SOIPDdwb; - double B3SOIPDb0; - double B3SOIPDb1; - double B3SOIPDalpha0; - double B3SOIPDbeta0; - - - /* CV model */ - double B3SOIPDcgsl; - double B3SOIPDcgdl; - double B3SOIPDckappa; - double B3SOIPDcf; - double B3SOIPDclc; - double B3SOIPDcle; + double Width; + double Length; + double Rth0; + double Cth0; + + double B3SOIPDcdsc; + double B3SOIPDcdscb; + double B3SOIPDcdscd; + double B3SOIPDcit; + double B3SOIPDnfactor; + double B3SOIPDvsat; + double B3SOIPDat; + double B3SOIPDa0; + double B3SOIPDags; + double B3SOIPDa1; + double B3SOIPDa2; + double B3SOIPDketa; + double B3SOIPDnpeak; + double B3SOIPDnsub; + double B3SOIPDngate; + double B3SOIPDgamma1; + double B3SOIPDgamma2; + double B3SOIPDvbx; + double B3SOIPDvbi; + double B3SOIPDvbm; + double B3SOIPDvbsc; + double B3SOIPDxt; + double B3SOIPDphi; + double B3SOIPDlitl; + double B3SOIPDk1; + double B3SOIPDkt1; + double B3SOIPDkt1l; + double B3SOIPDkt2; + double B3SOIPDk2; + double B3SOIPDk3; + double B3SOIPDk3b; + double B3SOIPDw0; + double B3SOIPDnlx; + double B3SOIPDdvt0; + double B3SOIPDdvt1; + double B3SOIPDdvt2; + double B3SOIPDdvt0w; + double B3SOIPDdvt1w; + double B3SOIPDdvt2w; + double B3SOIPDdrout; + double B3SOIPDdsub; + double B3SOIPDvth0; + double B3SOIPDua; + double B3SOIPDua1; + double B3SOIPDub; + double B3SOIPDub1; + double B3SOIPDuc; + double B3SOIPDuc1; + double B3SOIPDu0; + double B3SOIPDute; + double B3SOIPDvoff; + double B3SOIPDvfb; + double B3SOIPDuatemp; + double B3SOIPDubtemp; + double B3SOIPDuctemp; + double B3SOIPDrbody; + double B3SOIPDrth; + double B3SOIPDcth; + double B3SOIPDrds0denom; + double B3SOIPDvfbb; + double B3SOIPDjbjt; + double B3SOIPDjdif; + double B3SOIPDjrec; + double B3SOIPDjtun; + double B3SOIPDsdt1; + double B3SOIPDst2; + double B3SOIPDst3; + double B3SOIPDdt2; + double B3SOIPDdt3; + double B3SOIPDdelta; + double B3SOIPDrdsw; + double B3SOIPDrds0; + double B3SOIPDprwg; + double B3SOIPDprwb; + double B3SOIPDprt; + double B3SOIPDeta0; + double B3SOIPDetab; + double B3SOIPDpclm; + double B3SOIPDpdibl1; + double B3SOIPDpdibl2; + double B3SOIPDpdiblb; + double B3SOIPDpvag; + double B3SOIPDwr; + double B3SOIPDdwg; + double B3SOIPDdwb; + double B3SOIPDb0; + double B3SOIPDb1; + double B3SOIPDalpha0; + double B3SOIPDbeta0; + + + /* CV model */ + double B3SOIPDcgsl; + double B3SOIPDcgdl; + double B3SOIPDckappa; + double B3SOIPDcf; + double B3SOIPDclc; + double B3SOIPDcle; /* Added for binning - START0 */ - double B3SOIPDkb1; - double B3SOIPDk1w1; - double B3SOIPDk1w2; - double B3SOIPDketas; - double B3SOIPDfbjtii; - double B3SOIPDbeta1; - double B3SOIPDbeta2; - double B3SOIPDvdsatii0; - double B3SOIPDlii; - double B3SOIPDesatii; - double B3SOIPDsii0; - double B3SOIPDsii1; - double B3SOIPDsii2; - double B3SOIPDsiid; - double B3SOIPDagidl; - double B3SOIPDbgidl; - double B3SOIPDngidl; - double B3SOIPDntun; - double B3SOIPDndiode; - double B3SOIPDnrecf0; - double B3SOIPDnrecr0; - double B3SOIPDisbjt; - double B3SOIPDisdif; - double B3SOIPDisrec; - double B3SOIPDistun; - double B3SOIPDvrec0; - double B3SOIPDvtun0; - double B3SOIPDnbjt; - double B3SOIPDlbjt0; - double B3SOIPDvabjt; - double B3SOIPDaely; - double B3SOIPDvsdfb; - double B3SOIPDvsdth; - double B3SOIPDdelvt; + double B3SOIPDkb1; + double B3SOIPDk1w1; + double B3SOIPDk1w2; + double B3SOIPDketas; + double B3SOIPDfbjtii; + double B3SOIPDbeta1; + double B3SOIPDbeta2; + double B3SOIPDvdsatii0; + double B3SOIPDlii; + double B3SOIPDesatii; + double B3SOIPDsii0; + double B3SOIPDsii1; + double B3SOIPDsii2; + double B3SOIPDsiid; + double B3SOIPDagidl; + double B3SOIPDbgidl; + double B3SOIPDngidl; + double B3SOIPDntun; + double B3SOIPDndiode; + double B3SOIPDnrecf0; + double B3SOIPDnrecr0; + double B3SOIPDisbjt; + double B3SOIPDisdif; + double B3SOIPDisrec; + double B3SOIPDistun; + double B3SOIPDvrec0; + double B3SOIPDvtun0; + double B3SOIPDnbjt; + double B3SOIPDlbjt0; + double B3SOIPDvabjt; + double B3SOIPDaely; + double B3SOIPDvsdfb; + double B3SOIPDvsdth; + double B3SOIPDdelvt; /* Added by binning - END0 */ /* Pre-calculated constants */ - double B3SOIPDdw; - double B3SOIPDdl; - double B3SOIPDleff; - double B3SOIPDweff; - - double B3SOIPDdwc; - double B3SOIPDdlc; - double B3SOIPDleffCV; - double B3SOIPDweffCV; - double B3SOIPDabulkCVfactor; - double B3SOIPDcgso; - double B3SOIPDcgdo; - double B3SOIPDcgeo; - - double B3SOIPDu0temp; - double B3SOIPDvsattemp; - double B3SOIPDsqrtPhi; - double B3SOIPDphis3; - double B3SOIPDXdep0; - double B3SOIPDsqrtXdep0; - double B3SOIPDtheta0vb0; - double B3SOIPDthetaRout; + double B3SOIPDdw; + double B3SOIPDdl; + double B3SOIPDleff; + double B3SOIPDweff; + + double B3SOIPDdwc; + double B3SOIPDdlc; + double B3SOIPDleffCV; + double B3SOIPDweffCV; + double B3SOIPDabulkCVfactor; + double B3SOIPDcgso; + double B3SOIPDcgdo; + double B3SOIPDcgeo; + + double B3SOIPDu0temp; + double B3SOIPDvsattemp; + double B3SOIPDsqrtPhi; + double B3SOIPDphis3; + double B3SOIPDXdep0; + double B3SOIPDsqrtXdep0; + double B3SOIPDtheta0vb0; + double B3SOIPDthetaRout; /* v2.2 release */ - double B3SOIPDoxideRatio; + double B3SOIPDoxideRatio; /* v2.0 release */ - double B3SOIPDk1eff; - double B3SOIPDwdios; - double B3SOIPDwdiod; - double B3SOIPDwdiodCV; - double B3SOIPDwdiosCV; - double B3SOIPDarfabjt; - double B3SOIPDlratio; - double B3SOIPDlratiodif; - double B3SOIPDvearly; - double B3SOIPDahli; - double B3SOIPDvfbzb; - double B3SOIPDldeb; - double B3SOIPDacde; - double B3SOIPDmoin; - double B3SOIPDleffCVb; - double B3SOIPDleffCVbg; - - double B3SOIPDcof1; - double B3SOIPDcof2; - double B3SOIPDcof3; - double B3SOIPDcof4; - double B3SOIPDcdep0; - struct b3soipdSizeDependParam *pNext; + double B3SOIPDk1eff; + double B3SOIPDwdios; + double B3SOIPDwdiod; + double B3SOIPDwdiodCV; + double B3SOIPDwdiosCV; + double B3SOIPDarfabjt; + double B3SOIPDlratio; + double B3SOIPDlratiodif; + double B3SOIPDvearly; + double B3SOIPDahli; + double B3SOIPDahli0; + double B3SOIPDvfbzb; + double B3SOIPDldeb; + double B3SOIPDacde; + double B3SOIPDmoin; + double B3SOIPDleffCVb; + double B3SOIPDleffCVbg; + + double B3SOIPDcof1; + double B3SOIPDcof2; + double B3SOIPDcof3; + double B3SOIPDcof4; + double B3SOIPDcdep0; + struct b3soipdSizeDependParam *pNext; }; -typedef struct sB3SOIPDmodel +typedef struct sB3SOIPDmodel { - int B3SOIPDmodType; - struct sB3SOIPDmodel *B3SOIPDnextModel; - B3SOIPDinstance *B3SOIPDinstances; - IFuid B3SOIPDmodName; - int B3SOIPDtype; - - int B3SOIPDmobMod; - int B3SOIPDcapMod; - int B3SOIPDnoiMod; - int B3SOIPDshMod; - int B3SOIPDbinUnit; - int B3SOIPDparamChk; - double B3SOIPDversion; - double B3SOIPDtox; - double B3SOIPDcdsc; - double B3SOIPDcdscb; - double B3SOIPDcdscd; - double B3SOIPDcit; - double B3SOIPDnfactor; - double B3SOIPDvsat; - double B3SOIPDat; - double B3SOIPDa0; - double B3SOIPDags; - double B3SOIPDa1; - double B3SOIPDa2; - double B3SOIPDketa; - double B3SOIPDnsub; - double B3SOIPDnpeak; - double B3SOIPDngate; - double B3SOIPDgamma1; - double B3SOIPDgamma2; - double B3SOIPDvbx; - double B3SOIPDvbm; - double B3SOIPDxt; - double B3SOIPDk1; - double B3SOIPDkt1; - double B3SOIPDkt1l; - double B3SOIPDkt2; - double B3SOIPDk2; - double B3SOIPDk3; - double B3SOIPDk3b; - double B3SOIPDw0; - double B3SOIPDnlx; - double B3SOIPDdvt0; - double B3SOIPDdvt1; - double B3SOIPDdvt2; - double B3SOIPDdvt0w; - double B3SOIPDdvt1w; - double B3SOIPDdvt2w; - double B3SOIPDdrout; - double B3SOIPDdsub; - double B3SOIPDvth0; - double B3SOIPDua; - double B3SOIPDua1; - double B3SOIPDub; - double B3SOIPDub1; - double B3SOIPDuc; - double B3SOIPDuc1; - double B3SOIPDu0; - double B3SOIPDute; - double B3SOIPDvoff; - double B3SOIPDdelta; - double B3SOIPDrdsw; - double B3SOIPDprwg; - double B3SOIPDprwb; - double B3SOIPDprt; - double B3SOIPDeta0; - double B3SOIPDetab; - double B3SOIPDpclm; - double B3SOIPDpdibl1; - double B3SOIPDpdibl2; - double B3SOIPDpdiblb; - double B3SOIPDpvag; - double B3SOIPDwr; - double B3SOIPDdwg; - double B3SOIPDdwb; - double B3SOIPDb0; - double B3SOIPDb1; - double B3SOIPDalpha0; - double B3SOIPDtbox; - double B3SOIPDtsi; - double B3SOIPDxj; - double B3SOIPDkb1; - double B3SOIPDrth0; - double B3SOIPDcth0; - double B3SOIPDngidl; - double B3SOIPDagidl; - double B3SOIPDbgidl; - double B3SOIPDndiode; - double B3SOIPDistun; - double B3SOIPDxbjt; - double B3SOIPDxdif; - double B3SOIPDxrec; - double B3SOIPDxtun; + int B3SOIPDmodType; + struct sB3SOIPDmodel *B3SOIPDnextModel; + B3SOIPDinstance *B3SOIPDinstances; + IFuid B3SOIPDmodName; + int B3SOIPDtype; + + int B3SOIPDmobMod; + int B3SOIPDcapMod; + int B3SOIPDnoiMod; + int B3SOIPDshMod; + int B3SOIPDbinUnit; + int B3SOIPDparamChk; + double B3SOIPDversion; + double B3SOIPDtox; + double B3SOIPDdtoxcv; /* v2.2.3 */ + double B3SOIPDcdsc; + double B3SOIPDcdscb; + double B3SOIPDcdscd; + double B3SOIPDcit; + double B3SOIPDnfactor; + double B3SOIPDvsat; + double B3SOIPDat; + double B3SOIPDa0; + double B3SOIPDags; + double B3SOIPDa1; + double B3SOIPDa2; + double B3SOIPDketa; + double B3SOIPDnsub; + double B3SOIPDnpeak; + double B3SOIPDngate; + double B3SOIPDgamma1; + double B3SOIPDgamma2; + double B3SOIPDvbx; + double B3SOIPDvbm; + double B3SOIPDxt; + double B3SOIPDk1; + double B3SOIPDkt1; + double B3SOIPDkt1l; + double B3SOIPDkt2; + double B3SOIPDk2; + double B3SOIPDk3; + double B3SOIPDk3b; + double B3SOIPDw0; + double B3SOIPDnlx; + double B3SOIPDdvt0; + double B3SOIPDdvt1; + double B3SOIPDdvt2; + double B3SOIPDdvt0w; + double B3SOIPDdvt1w; + double B3SOIPDdvt2w; + double B3SOIPDdrout; + double B3SOIPDdsub; + double B3SOIPDvth0; + double B3SOIPDua; + double B3SOIPDua1; + double B3SOIPDub; + double B3SOIPDub1; + double B3SOIPDuc; + double B3SOIPDuc1; + double B3SOIPDu0; + double B3SOIPDute; + double B3SOIPDvoff; + double B3SOIPDdelta; + double B3SOIPDrdsw; + double B3SOIPDprwg; + double B3SOIPDprwb; + double B3SOIPDprt; + double B3SOIPDeta0; + double B3SOIPDetab; + double B3SOIPDpclm; + double B3SOIPDpdibl1; + double B3SOIPDpdibl2; + double B3SOIPDpdiblb; + double B3SOIPDpvag; + double B3SOIPDwr; + double B3SOIPDdwg; + double B3SOIPDdwb; + double B3SOIPDb0; + double B3SOIPDb1; + double B3SOIPDalpha0; + double B3SOIPDtbox; + double B3SOIPDtsi; + double B3SOIPDxj; + double B3SOIPDkb1; + double B3SOIPDrth0; + double B3SOIPDcth0; + double B3SOIPDngidl; + double B3SOIPDagidl; + double B3SOIPDbgidl; + double B3SOIPDndiode; + double B3SOIPDistun; + double B3SOIPDxbjt; + double B3SOIPDxdif; + double B3SOIPDxrec; + double B3SOIPDxtun; /* v2.2 release */ - double B3SOIPDwth0; - double B3SOIPDrhalo; - double B3SOIPDntox; - double B3SOIPDtoxref; - double B3SOIPDebg; - double B3SOIPDnevb; - double B3SOIPDalphaGB1; - double B3SOIPDbetaGB1; - double B3SOIPDvgb1; - double B3SOIPDnecb; - double B3SOIPDalphaGB2; - double B3SOIPDbetaGB2; - double B3SOIPDvgb2; - double B3SOIPDtoxqm; - double B3SOIPDvoxh; - double B3SOIPDdeltavox; - int B3SOIPDigMod; + double B3SOIPDwth0; + double B3SOIPDrhalo; + double B3SOIPDntox; + double B3SOIPDtoxref; + double B3SOIPDebg; + double B3SOIPDvevb; + double B3SOIPDalphaGB1; + double B3SOIPDbetaGB1; + double B3SOIPDvgb1; + double B3SOIPDvecb; + double B3SOIPDalphaGB2; + double B3SOIPDbetaGB2; + double B3SOIPDvgb2; + double B3SOIPDtoxqm; + double B3SOIPDvoxh; + double B3SOIPDdeltavox; + int B3SOIPDigMod; /* v2.0 release */ - double B3SOIPDk1w1; - double B3SOIPDk1w2; - double B3SOIPDketas; - double B3SOIPDdwbc; - double B3SOIPDbeta0; - double B3SOIPDbeta1; - double B3SOIPDbeta2; - double B3SOIPDvdsatii0; - double B3SOIPDtii; - double B3SOIPDlii; - double B3SOIPDsii0; - double B3SOIPDsii1; - double B3SOIPDsii2; - double B3SOIPDsiid; - double B3SOIPDfbjtii; - double B3SOIPDesatii; - double B3SOIPDntun; - double B3SOIPDnrecf0; - double B3SOIPDnrecr0; - double B3SOIPDisbjt; - double B3SOIPDisdif; - double B3SOIPDisrec; - double B3SOIPDln; - double B3SOIPDvrec0; - double B3SOIPDvtun0; - double B3SOIPDnbjt; - double B3SOIPDlbjt0; - double B3SOIPDldif0; - double B3SOIPDvabjt; - double B3SOIPDaely; - double B3SOIPDahli; - double B3SOIPDrbody; - double B3SOIPDrbsh; - double B3SOIPDtt; - double B3SOIPDndif; - double B3SOIPDvsdfb; - double B3SOIPDvsdth; - double B3SOIPDcsdmin; - double B3SOIPDasd; - double B3SOIPDntrecf; - double B3SOIPDntrecr; - double B3SOIPDdlcb; - double B3SOIPDfbody; - double B3SOIPDtcjswg; - double B3SOIPDtpbswg; - double B3SOIPDacde; - double B3SOIPDmoin; - double B3SOIPDdelvt; - double B3SOIPDdlbg; - - /* CV model */ - double B3SOIPDcgsl; - double B3SOIPDcgdl; - double B3SOIPDckappa; - double B3SOIPDcf; - double B3SOIPDclc; - double B3SOIPDcle; - double B3SOIPDdwc; - double B3SOIPDdlc; - - double B3SOIPDtnom; - double B3SOIPDcgso; - double B3SOIPDcgdo; - double B3SOIPDcgeo; - double B3SOIPDxpart; - double B3SOIPDcFringOut; - double B3SOIPDcFringMax; - - double B3SOIPDsheetResistance; - double B3SOIPDbodyJctGateSideGradingCoeff; - double B3SOIPDGatesidewallJctPotential; - double B3SOIPDunitLengthGateSidewallJctCap; - double B3SOIPDcsdesw; - - double B3SOIPDLint; - double B3SOIPDLl; - double B3SOIPDLln; - double B3SOIPDLw; - double B3SOIPDLwn; - double B3SOIPDLwl; - double B3SOIPDLmin; - double B3SOIPDLmax; - - double B3SOIPDWint; - double B3SOIPDWl; - double B3SOIPDWln; - double B3SOIPDWw; - double B3SOIPDWwn; - double B3SOIPDWwl; - double B3SOIPDWmin; - double B3SOIPDWmax; + double B3SOIPDk1w1; + double B3SOIPDk1w2; + double B3SOIPDketas; + double B3SOIPDdwbc; + double B3SOIPDbeta0; + double B3SOIPDbeta1; + double B3SOIPDbeta2; + double B3SOIPDvdsatii0; + double B3SOIPDtii; + double B3SOIPDlii; + double B3SOIPDsii0; + double B3SOIPDsii1; + double B3SOIPDsii2; + double B3SOIPDsiid; + double B3SOIPDfbjtii; + double B3SOIPDesatii; + double B3SOIPDntun; + double B3SOIPDnrecf0; + double B3SOIPDnrecr0; + double B3SOIPDisbjt; + double B3SOIPDisdif; + double B3SOIPDisrec; + double B3SOIPDln; + double B3SOIPDvrec0; + double B3SOIPDvtun0; + double B3SOIPDnbjt; + double B3SOIPDlbjt0; + double B3SOIPDldif0; + double B3SOIPDvabjt; + double B3SOIPDaely; + double B3SOIPDahli; + double B3SOIPDrbody; + double B3SOIPDrbsh; + double B3SOIPDtt; + double B3SOIPDndif; + double B3SOIPDvsdfb; + double B3SOIPDvsdth; + double B3SOIPDcsdmin; + double B3SOIPDasd; + double B3SOIPDntrecf; + double B3SOIPDntrecr; + double B3SOIPDdlcb; + double B3SOIPDfbody; + double B3SOIPDtcjswg; + double B3SOIPDtpbswg; + double B3SOIPDacde; + double B3SOIPDmoin; + double B3SOIPDdelvt; + double B3SOIPDdlbg; + + /* CV model */ + double B3SOIPDcgsl; + double B3SOIPDcgdl; + double B3SOIPDckappa; + double B3SOIPDcf; + double B3SOIPDclc; + double B3SOIPDcle; + double B3SOIPDdwc; + double B3SOIPDdlc; + + double B3SOIPDtnom; + double B3SOIPDcgso; + double B3SOIPDcgdo; + double B3SOIPDcgeo; + double B3SOIPDxpart; + double B3SOIPDcFringOut; + double B3SOIPDcFringMax; + + double B3SOIPDsheetResistance; + double B3SOIPDbodyJctGateSideGradingCoeff; + double B3SOIPDGatesidewallJctPotential; + double B3SOIPDunitLengthGateSidewallJctCap; + double B3SOIPDcsdesw; + + double B3SOIPDLint; + double B3SOIPDLl; + double B3SOIPDLlc; /* v2.2.3 */ + double B3SOIPDLln; + double B3SOIPDLw; + double B3SOIPDLwc; /* v2.2.3 */ + double B3SOIPDLwn; + double B3SOIPDLwl; + double B3SOIPDLwlc; /* v2.2.3 */ + double B3SOIPDLmin; + double B3SOIPDLmax; + + double B3SOIPDWint; + double B3SOIPDWl; + double B3SOIPDWlc; /* v2.2.3 */ + double B3SOIPDWln; + double B3SOIPDWw; + double B3SOIPDWwc; /* v2.2.3 */ + double B3SOIPDWwn; + double B3SOIPDWwl; + double B3SOIPDWwlc; /* v2.2.3 */ + double B3SOIPDWmin; + double B3SOIPDWmax; /* Added for binning - START1 */ - /* Length Dependence */ - double B3SOIPDlnpeak; - double B3SOIPDlnsub; - double B3SOIPDlngate; - double B3SOIPDlvth0; - double B3SOIPDlk1; - double B3SOIPDlk1w1; - double B3SOIPDlk1w2; - double B3SOIPDlk2; - double B3SOIPDlk3; - double B3SOIPDlk3b; - double B3SOIPDlkb1; - double B3SOIPDlw0; - double B3SOIPDlnlx; - double B3SOIPDldvt0; - double B3SOIPDldvt1; - double B3SOIPDldvt2; - double B3SOIPDldvt0w; - double B3SOIPDldvt1w; - double B3SOIPDldvt2w; - double B3SOIPDlu0; - double B3SOIPDlua; - double B3SOIPDlub; - double B3SOIPDluc; - double B3SOIPDlvsat; - double B3SOIPDla0; - double B3SOIPDlags; - double B3SOIPDlb0; - double B3SOIPDlb1; - double B3SOIPDlketa; - double B3SOIPDlketas; - double B3SOIPDla1; - double B3SOIPDla2; - double B3SOIPDlrdsw; - double B3SOIPDlprwb; - double B3SOIPDlprwg; - double B3SOIPDlwr; - double B3SOIPDlnfactor; - double B3SOIPDldwg; - double B3SOIPDldwb; - double B3SOIPDlvoff; - double B3SOIPDleta0; - double B3SOIPDletab; - double B3SOIPDldsub; - double B3SOIPDlcit; - double B3SOIPDlcdsc; - double B3SOIPDlcdscb; - double B3SOIPDlcdscd; - double B3SOIPDlpclm; - double B3SOIPDlpdibl1; - double B3SOIPDlpdibl2; - double B3SOIPDlpdiblb; - double B3SOIPDldrout; - double B3SOIPDlpvag; - double B3SOIPDldelta; - double B3SOIPDlalpha0; - double B3SOIPDlfbjtii; - double B3SOIPDlbeta0; - double B3SOIPDlbeta1; - double B3SOIPDlbeta2; - double B3SOIPDlvdsatii0; - double B3SOIPDllii; - double B3SOIPDlesatii; - double B3SOIPDlsii0; - double B3SOIPDlsii1; - double B3SOIPDlsii2; - double B3SOIPDlsiid; - double B3SOIPDlagidl; - double B3SOIPDlbgidl; - double B3SOIPDlngidl; - double B3SOIPDlntun; - double B3SOIPDlndiode; - double B3SOIPDlnrecf0; - double B3SOIPDlnrecr0; - double B3SOIPDlisbjt; - double B3SOIPDlisdif; - double B3SOIPDlisrec; - double B3SOIPDlistun; - double B3SOIPDlvrec0; - double B3SOIPDlvtun0; - double B3SOIPDlnbjt; - double B3SOIPDllbjt0; - double B3SOIPDlvabjt; - double B3SOIPDlaely; - double B3SOIPDlahli; - /* CV model */ - double B3SOIPDlvsdfb; - double B3SOIPDlvsdth; - double B3SOIPDldelvt; - double B3SOIPDlacde; - double B3SOIPDlmoin; - - /* Width Dependence */ - double B3SOIPDwnpeak; - double B3SOIPDwnsub; - double B3SOIPDwngate; - double B3SOIPDwvth0; - double B3SOIPDwk1; - double B3SOIPDwk1w1; - double B3SOIPDwk1w2; - double B3SOIPDwk2; - double B3SOIPDwk3; - double B3SOIPDwk3b; - double B3SOIPDwkb1; - double B3SOIPDww0; - double B3SOIPDwnlx; - double B3SOIPDwdvt0; - double B3SOIPDwdvt1; - double B3SOIPDwdvt2; - double B3SOIPDwdvt0w; - double B3SOIPDwdvt1w; - double B3SOIPDwdvt2w; - double B3SOIPDwu0; - double B3SOIPDwua; - double B3SOIPDwub; - double B3SOIPDwuc; - double B3SOIPDwvsat; - double B3SOIPDwa0; - double B3SOIPDwags; - double B3SOIPDwb0; - double B3SOIPDwb1; - double B3SOIPDwketa; - double B3SOIPDwketas; - double B3SOIPDwa1; - double B3SOIPDwa2; - double B3SOIPDwrdsw; - double B3SOIPDwprwb; - double B3SOIPDwprwg; - double B3SOIPDwwr; - double B3SOIPDwnfactor; - double B3SOIPDwdwg; - double B3SOIPDwdwb; - double B3SOIPDwvoff; - double B3SOIPDweta0; - double B3SOIPDwetab; - double B3SOIPDwdsub; - double B3SOIPDwcit; - double B3SOIPDwcdsc; - double B3SOIPDwcdscb; - double B3SOIPDwcdscd; - double B3SOIPDwpclm; - double B3SOIPDwpdibl1; - double B3SOIPDwpdibl2; - double B3SOIPDwpdiblb; - double B3SOIPDwdrout; - double B3SOIPDwpvag; - double B3SOIPDwdelta; - double B3SOIPDwalpha0; - double B3SOIPDwfbjtii; - double B3SOIPDwbeta0; - double B3SOIPDwbeta1; - double B3SOIPDwbeta2; - double B3SOIPDwvdsatii0; - double B3SOIPDwlii; - double B3SOIPDwesatii; - double B3SOIPDwsii0; - double B3SOIPDwsii1; - double B3SOIPDwsii2; - double B3SOIPDwsiid; - double B3SOIPDwagidl; - double B3SOIPDwbgidl; - double B3SOIPDwngidl; - double B3SOIPDwntun; - double B3SOIPDwndiode; - double B3SOIPDwnrecf0; - double B3SOIPDwnrecr0; - double B3SOIPDwisbjt; - double B3SOIPDwisdif; - double B3SOIPDwisrec; - double B3SOIPDwistun; - double B3SOIPDwvrec0; - double B3SOIPDwvtun0; - double B3SOIPDwnbjt; - double B3SOIPDwlbjt0; - double B3SOIPDwvabjt; - double B3SOIPDwaely; - double B3SOIPDwahli; - /* CV model */ - double B3SOIPDwvsdfb; - double B3SOIPDwvsdth; - double B3SOIPDwdelvt; - double B3SOIPDwacde; - double B3SOIPDwmoin; - - /* Cross-term Dependence */ - double B3SOIPDpnpeak; - double B3SOIPDpnsub; - double B3SOIPDpngate; - double B3SOIPDpvth0; - double B3SOIPDpk1; - double B3SOIPDpk1w1; - double B3SOIPDpk1w2; - double B3SOIPDpk2; - double B3SOIPDpk3; - double B3SOIPDpk3b; - double B3SOIPDpkb1; - double B3SOIPDpw0; - double B3SOIPDpnlx; - double B3SOIPDpdvt0; - double B3SOIPDpdvt1; - double B3SOIPDpdvt2; - double B3SOIPDpdvt0w; - double B3SOIPDpdvt1w; - double B3SOIPDpdvt2w; - double B3SOIPDpu0; - double B3SOIPDpua; - double B3SOIPDpub; - double B3SOIPDpuc; - double B3SOIPDpvsat; - double B3SOIPDpa0; - double B3SOIPDpags; - double B3SOIPDpb0; - double B3SOIPDpb1; - double B3SOIPDpketa; - double B3SOIPDpketas; - double B3SOIPDpa1; - double B3SOIPDpa2; - double B3SOIPDprdsw; - double B3SOIPDpprwb; - double B3SOIPDpprwg; - double B3SOIPDpwr; - double B3SOIPDpnfactor; - double B3SOIPDpdwg; - double B3SOIPDpdwb; - double B3SOIPDpvoff; - double B3SOIPDpeta0; - double B3SOIPDpetab; - double B3SOIPDpdsub; - double B3SOIPDpcit; - double B3SOIPDpcdsc; - double B3SOIPDpcdscb; - double B3SOIPDpcdscd; - double B3SOIPDppclm; - double B3SOIPDppdibl1; - double B3SOIPDppdibl2; - double B3SOIPDppdiblb; - double B3SOIPDpdrout; - double B3SOIPDppvag; - double B3SOIPDpdelta; - double B3SOIPDpalpha0; - double B3SOIPDpfbjtii; - double B3SOIPDpbeta0; - double B3SOIPDpbeta1; - double B3SOIPDpbeta2; - double B3SOIPDpvdsatii0; - double B3SOIPDplii; - double B3SOIPDpesatii; - double B3SOIPDpsii0; - double B3SOIPDpsii1; - double B3SOIPDpsii2; - double B3SOIPDpsiid; - double B3SOIPDpagidl; - double B3SOIPDpbgidl; - double B3SOIPDpngidl; - double B3SOIPDpntun; - double B3SOIPDpndiode; - double B3SOIPDpnrecf0; - double B3SOIPDpnrecr0; - double B3SOIPDpisbjt; - double B3SOIPDpisdif; - double B3SOIPDpisrec; - double B3SOIPDpistun; - double B3SOIPDpvrec0; - double B3SOIPDpvtun0; - double B3SOIPDpnbjt; - double B3SOIPDplbjt0; - double B3SOIPDpvabjt; - double B3SOIPDpaely; - double B3SOIPDpahli; - /* CV model */ - double B3SOIPDpvsdfb; - double B3SOIPDpvsdth; - double B3SOIPDpdelvt; - double B3SOIPDpacde; - double B3SOIPDpmoin; + /* Length Dependence */ + double B3SOIPDlnpeak; + double B3SOIPDlnsub; + double B3SOIPDlngate; + double B3SOIPDlvth0; + double B3SOIPDlk1; + double B3SOIPDlk1w1; + double B3SOIPDlk1w2; + double B3SOIPDlk2; + double B3SOIPDlk3; + double B3SOIPDlk3b; + double B3SOIPDlkb1; + double B3SOIPDlw0; + double B3SOIPDlnlx; + double B3SOIPDldvt0; + double B3SOIPDldvt1; + double B3SOIPDldvt2; + double B3SOIPDldvt0w; + double B3SOIPDldvt1w; + double B3SOIPDldvt2w; + double B3SOIPDlu0; + double B3SOIPDlua; + double B3SOIPDlub; + double B3SOIPDluc; + double B3SOIPDlvsat; + double B3SOIPDla0; + double B3SOIPDlags; + double B3SOIPDlb0; + double B3SOIPDlb1; + double B3SOIPDlketa; + double B3SOIPDlketas; + double B3SOIPDla1; + double B3SOIPDla2; + double B3SOIPDlrdsw; + double B3SOIPDlprwb; + double B3SOIPDlprwg; + double B3SOIPDlwr; + double B3SOIPDlnfactor; + double B3SOIPDldwg; + double B3SOIPDldwb; + double B3SOIPDlvoff; + double B3SOIPDleta0; + double B3SOIPDletab; + double B3SOIPDldsub; + double B3SOIPDlcit; + double B3SOIPDlcdsc; + double B3SOIPDlcdscb; + double B3SOIPDlcdscd; + double B3SOIPDlpclm; + double B3SOIPDlpdibl1; + double B3SOIPDlpdibl2; + double B3SOIPDlpdiblb; + double B3SOIPDldrout; + double B3SOIPDlpvag; + double B3SOIPDldelta; + double B3SOIPDlalpha0; + double B3SOIPDlfbjtii; + double B3SOIPDlbeta0; + double B3SOIPDlbeta1; + double B3SOIPDlbeta2; + double B3SOIPDlvdsatii0; + double B3SOIPDllii; + double B3SOIPDlesatii; + double B3SOIPDlsii0; + double B3SOIPDlsii1; + double B3SOIPDlsii2; + double B3SOIPDlsiid; + double B3SOIPDlagidl; + double B3SOIPDlbgidl; + double B3SOIPDlngidl; + double B3SOIPDlntun; + double B3SOIPDlndiode; + double B3SOIPDlnrecf0; + double B3SOIPDlnrecr0; + double B3SOIPDlisbjt; + double B3SOIPDlisdif; + double B3SOIPDlisrec; + double B3SOIPDlistun; + double B3SOIPDlvrec0; + double B3SOIPDlvtun0; + double B3SOIPDlnbjt; + double B3SOIPDllbjt0; + double B3SOIPDlvabjt; + double B3SOIPDlaely; + double B3SOIPDlahli; + /* CV model */ + double B3SOIPDlvsdfb; + double B3SOIPDlvsdth; + double B3SOIPDldelvt; + double B3SOIPDlacde; + double B3SOIPDlmoin; + + /* Width Dependence */ + double B3SOIPDwnpeak; + double B3SOIPDwnsub; + double B3SOIPDwngate; + double B3SOIPDwvth0; + double B3SOIPDwk1; + double B3SOIPDwk1w1; + double B3SOIPDwk1w2; + double B3SOIPDwk2; + double B3SOIPDwk3; + double B3SOIPDwk3b; + double B3SOIPDwkb1; + double B3SOIPDww0; + double B3SOIPDwnlx; + double B3SOIPDwdvt0; + double B3SOIPDwdvt1; + double B3SOIPDwdvt2; + double B3SOIPDwdvt0w; + double B3SOIPDwdvt1w; + double B3SOIPDwdvt2w; + double B3SOIPDwu0; + double B3SOIPDwua; + double B3SOIPDwub; + double B3SOIPDwuc; + double B3SOIPDwvsat; + double B3SOIPDwa0; + double B3SOIPDwags; + double B3SOIPDwb0; + double B3SOIPDwb1; + double B3SOIPDwketa; + double B3SOIPDwketas; + double B3SOIPDwa1; + double B3SOIPDwa2; + double B3SOIPDwrdsw; + double B3SOIPDwprwb; + double B3SOIPDwprwg; + double B3SOIPDwwr; + double B3SOIPDwnfactor; + double B3SOIPDwdwg; + double B3SOIPDwdwb; + double B3SOIPDwvoff; + double B3SOIPDweta0; + double B3SOIPDwetab; + double B3SOIPDwdsub; + double B3SOIPDwcit; + double B3SOIPDwcdsc; + double B3SOIPDwcdscb; + double B3SOIPDwcdscd; + double B3SOIPDwpclm; + double B3SOIPDwpdibl1; + double B3SOIPDwpdibl2; + double B3SOIPDwpdiblb; + double B3SOIPDwdrout; + double B3SOIPDwpvag; + double B3SOIPDwdelta; + double B3SOIPDwalpha0; + double B3SOIPDwfbjtii; + double B3SOIPDwbeta0; + double B3SOIPDwbeta1; + double B3SOIPDwbeta2; + double B3SOIPDwvdsatii0; + double B3SOIPDwlii; + double B3SOIPDwesatii; + double B3SOIPDwsii0; + double B3SOIPDwsii1; + double B3SOIPDwsii2; + double B3SOIPDwsiid; + double B3SOIPDwagidl; + double B3SOIPDwbgidl; + double B3SOIPDwngidl; + double B3SOIPDwntun; + double B3SOIPDwndiode; + double B3SOIPDwnrecf0; + double B3SOIPDwnrecr0; + double B3SOIPDwisbjt; + double B3SOIPDwisdif; + double B3SOIPDwisrec; + double B3SOIPDwistun; + double B3SOIPDwvrec0; + double B3SOIPDwvtun0; + double B3SOIPDwnbjt; + double B3SOIPDwlbjt0; + double B3SOIPDwvabjt; + double B3SOIPDwaely; + double B3SOIPDwahli; + /* CV model */ + double B3SOIPDwvsdfb; + double B3SOIPDwvsdth; + double B3SOIPDwdelvt; + double B3SOIPDwacde; + double B3SOIPDwmoin; + + /* Cross-term Dependence */ + double B3SOIPDpnpeak; + double B3SOIPDpnsub; + double B3SOIPDpngate; + double B3SOIPDpvth0; + double B3SOIPDpk1; + double B3SOIPDpk1w1; + double B3SOIPDpk1w2; + double B3SOIPDpk2; + double B3SOIPDpk3; + double B3SOIPDpk3b; + double B3SOIPDpkb1; + double B3SOIPDpw0; + double B3SOIPDpnlx; + double B3SOIPDpdvt0; + double B3SOIPDpdvt1; + double B3SOIPDpdvt2; + double B3SOIPDpdvt0w; + double B3SOIPDpdvt1w; + double B3SOIPDpdvt2w; + double B3SOIPDpu0; + double B3SOIPDpua; + double B3SOIPDpub; + double B3SOIPDpuc; + double B3SOIPDpvsat; + double B3SOIPDpa0; + double B3SOIPDpags; + double B3SOIPDpb0; + double B3SOIPDpb1; + double B3SOIPDpketa; + double B3SOIPDpketas; + double B3SOIPDpa1; + double B3SOIPDpa2; + double B3SOIPDprdsw; + double B3SOIPDpprwb; + double B3SOIPDpprwg; + double B3SOIPDpwr; + double B3SOIPDpnfactor; + double B3SOIPDpdwg; + double B3SOIPDpdwb; + double B3SOIPDpvoff; + double B3SOIPDpeta0; + double B3SOIPDpetab; + double B3SOIPDpdsub; + double B3SOIPDpcit; + double B3SOIPDpcdsc; + double B3SOIPDpcdscb; + double B3SOIPDpcdscd; + double B3SOIPDppclm; + double B3SOIPDppdibl1; + double B3SOIPDppdibl2; + double B3SOIPDppdiblb; + double B3SOIPDpdrout; + double B3SOIPDppvag; + double B3SOIPDpdelta; + double B3SOIPDpalpha0; + double B3SOIPDpfbjtii; + double B3SOIPDpbeta0; + double B3SOIPDpbeta1; + double B3SOIPDpbeta2; + double B3SOIPDpvdsatii0; + double B3SOIPDplii; + double B3SOIPDpesatii; + double B3SOIPDpsii0; + double B3SOIPDpsii1; + double B3SOIPDpsii2; + double B3SOIPDpsiid; + double B3SOIPDpagidl; + double B3SOIPDpbgidl; + double B3SOIPDpngidl; + double B3SOIPDpntun; + double B3SOIPDpndiode; + double B3SOIPDpnrecf0; + double B3SOIPDpnrecr0; + double B3SOIPDpisbjt; + double B3SOIPDpisdif; + double B3SOIPDpisrec; + double B3SOIPDpistun; + double B3SOIPDpvrec0; + double B3SOIPDpvtun0; + double B3SOIPDpnbjt; + double B3SOIPDplbjt0; + double B3SOIPDpvabjt; + double B3SOIPDpaely; + double B3SOIPDpahli; + /* CV model */ + double B3SOIPDpvsdfb; + double B3SOIPDpvsdth; + double B3SOIPDpdelvt; + double B3SOIPDpacde; + double B3SOIPDpmoin; /* Added for binning - END1 */ /* Pre-calculated constants */ - double B3SOIPDcbox; - double B3SOIPDcsi; - double B3SOIPDcsieff; - double B3SOIPDcoxt; - double B3SOIPDnfb; - double B3SOIPDadice; - double B3SOIPDqsi; - double B3SOIPDqsieff; - double B3SOIPDeg0; - - /* MCJ: move to size-dependent param. */ - double B3SOIPDvtm; - double B3SOIPDcox; - double B3SOIPDcof1; - double B3SOIPDcof2; - double B3SOIPDcof3; - double B3SOIPDcof4; - double B3SOIPDvcrit; - double B3SOIPDfactor1; - - double B3SOIPDoxideTrapDensityA; - double B3SOIPDoxideTrapDensityB; - double B3SOIPDoxideTrapDensityC; - double B3SOIPDem; - double B3SOIPDef; - double B3SOIPDaf; - double B3SOIPDkf; - double B3SOIPDnoif; - - struct b3soipdSizeDependParam *pSizeDependParamKnot; - - /* Flags */ - - unsigned B3SOIPDtboxGiven:1; - unsigned B3SOIPDtsiGiven:1; - unsigned B3SOIPDxjGiven:1; - unsigned B3SOIPDkb1Given:1; - unsigned B3SOIPDrth0Given:1; - unsigned B3SOIPDcth0Given:1; - unsigned B3SOIPDngidlGiven:1; - unsigned B3SOIPDagidlGiven:1; - unsigned B3SOIPDbgidlGiven:1; - unsigned B3SOIPDndiodeGiven:1; - unsigned B3SOIPDxbjtGiven:1; - unsigned B3SOIPDxdifGiven:1; - unsigned B3SOIPDxrecGiven:1; - unsigned B3SOIPDxtunGiven:1; - unsigned B3SOIPDttGiven:1; - unsigned B3SOIPDvsdfbGiven:1; - unsigned B3SOIPDvsdthGiven:1; - unsigned B3SOIPDasdGiven:1; - unsigned B3SOIPDcsdminGiven:1; - - unsigned B3SOIPDmobModGiven:1; - unsigned B3SOIPDbinUnitGiven:1; - unsigned B3SOIPDcapModGiven:1; - unsigned B3SOIPDparamChkGiven:1; - unsigned B3SOIPDnoiModGiven:1; - unsigned B3SOIPDshModGiven:1; - unsigned B3SOIPDtypeGiven:1; - unsigned B3SOIPDtoxGiven:1; - unsigned B3SOIPDversionGiven:1; - - unsigned B3SOIPDcdscGiven:1; - unsigned B3SOIPDcdscbGiven:1; - unsigned B3SOIPDcdscdGiven:1; - unsigned B3SOIPDcitGiven:1; - unsigned B3SOIPDnfactorGiven:1; - unsigned B3SOIPDvsatGiven:1; - unsigned B3SOIPDatGiven:1; - unsigned B3SOIPDa0Given:1; - unsigned B3SOIPDagsGiven:1; - unsigned B3SOIPDa1Given:1; - unsigned B3SOIPDa2Given:1; - unsigned B3SOIPDketaGiven:1; - unsigned B3SOIPDnsubGiven:1; - unsigned B3SOIPDnpeakGiven:1; - unsigned B3SOIPDngateGiven:1; - unsigned B3SOIPDgamma1Given:1; - unsigned B3SOIPDgamma2Given:1; - unsigned B3SOIPDvbxGiven:1; - unsigned B3SOIPDvbmGiven:1; - unsigned B3SOIPDxtGiven:1; - unsigned B3SOIPDk1Given:1; - unsigned B3SOIPDkt1Given:1; - unsigned B3SOIPDkt1lGiven:1; - unsigned B3SOIPDkt2Given:1; - unsigned B3SOIPDk2Given:1; - unsigned B3SOIPDk3Given:1; - unsigned B3SOIPDk3bGiven:1; - unsigned B3SOIPDw0Given:1; - unsigned B3SOIPDnlxGiven:1; - unsigned B3SOIPDdvt0Given:1; - unsigned B3SOIPDdvt1Given:1; - unsigned B3SOIPDdvt2Given:1; - unsigned B3SOIPDdvt0wGiven:1; - unsigned B3SOIPDdvt1wGiven:1; - unsigned B3SOIPDdvt2wGiven:1; - unsigned B3SOIPDdroutGiven:1; - unsigned B3SOIPDdsubGiven:1; - unsigned B3SOIPDvth0Given:1; - unsigned B3SOIPDuaGiven:1; - unsigned B3SOIPDua1Given:1; - unsigned B3SOIPDubGiven:1; - unsigned B3SOIPDub1Given:1; - unsigned B3SOIPDucGiven:1; - unsigned B3SOIPDuc1Given:1; - unsigned B3SOIPDu0Given:1; - unsigned B3SOIPDuteGiven:1; - unsigned B3SOIPDvoffGiven:1; - unsigned B3SOIPDrdswGiven:1; - unsigned B3SOIPDprwgGiven:1; - unsigned B3SOIPDprwbGiven:1; - unsigned B3SOIPDprtGiven:1; - unsigned B3SOIPDeta0Given:1; - unsigned B3SOIPDetabGiven:1; - unsigned B3SOIPDpclmGiven:1; - unsigned B3SOIPDpdibl1Given:1; - unsigned B3SOIPDpdibl2Given:1; - unsigned B3SOIPDpdiblbGiven:1; - unsigned B3SOIPDpvagGiven:1; - unsigned B3SOIPDdeltaGiven:1; - unsigned B3SOIPDwrGiven:1; - unsigned B3SOIPDdwgGiven:1; - unsigned B3SOIPDdwbGiven:1; - unsigned B3SOIPDb0Given:1; - unsigned B3SOIPDb1Given:1; - unsigned B3SOIPDalpha0Given:1; + double B3SOIPDcbox; + double B3SOIPDcsi; + double B3SOIPDcsieff; + double B3SOIPDcoxt; + double B3SOIPDnfb; + double B3SOIPDadice; + double B3SOIPDqsi; + double B3SOIPDqsieff; + double B3SOIPDeg0; + + /* MCJ: move to size-dependent param. */ + double B3SOIPDvtm; + double B3SOIPDcox; + double B3SOIPDcof1; + double B3SOIPDcof2; + double B3SOIPDcof3; + double B3SOIPDcof4; + double B3SOIPDvcrit; + double B3SOIPDfactor1; + + double B3SOIPDoxideTrapDensityA; + double B3SOIPDoxideTrapDensityB; + double B3SOIPDoxideTrapDensityC; + double B3SOIPDem; + double B3SOIPDef; + double B3SOIPDaf; + double B3SOIPDkf; + double B3SOIPDnoif; + + struct b3soipdSizeDependParam *pSizeDependParamKnot; + + /* Flags */ + + unsigned B3SOIPDtboxGiven:1; + unsigned B3SOIPDtsiGiven :1; + unsigned B3SOIPDxjGiven :1; + unsigned B3SOIPDkb1Given :1; + unsigned B3SOIPDrth0Given :1; + unsigned B3SOIPDcth0Given :1; + unsigned B3SOIPDngidlGiven :1; + unsigned B3SOIPDagidlGiven :1; + unsigned B3SOIPDbgidlGiven :1; + unsigned B3SOIPDndiodeGiven :1; + unsigned B3SOIPDxbjtGiven :1; + unsigned B3SOIPDxdifGiven :1; + unsigned B3SOIPDxrecGiven :1; + unsigned B3SOIPDxtunGiven :1; + unsigned B3SOIPDttGiven :1; + unsigned B3SOIPDvsdfbGiven :1; + unsigned B3SOIPDvsdthGiven :1; + unsigned B3SOIPDasdGiven :1; + unsigned B3SOIPDcsdminGiven :1; + + unsigned B3SOIPDmobModGiven :1; + unsigned B3SOIPDbinUnitGiven :1; + unsigned B3SOIPDcapModGiven :1; + unsigned B3SOIPDparamChkGiven :1; + unsigned B3SOIPDnoiModGiven :1; + unsigned B3SOIPDshModGiven :1; + unsigned B3SOIPDtypeGiven :1; + unsigned B3SOIPDtoxGiven :1; + unsigned B3SOIPDdtoxcvGiven :1; /* v2.2.3 */ + unsigned B3SOIPDversionGiven :1; + + unsigned B3SOIPDcdscGiven :1; + unsigned B3SOIPDcdscbGiven :1; + unsigned B3SOIPDcdscdGiven :1; + unsigned B3SOIPDcitGiven :1; + unsigned B3SOIPDnfactorGiven :1; + unsigned B3SOIPDvsatGiven :1; + unsigned B3SOIPDatGiven :1; + unsigned B3SOIPDa0Given :1; + unsigned B3SOIPDagsGiven :1; + unsigned B3SOIPDa1Given :1; + unsigned B3SOIPDa2Given :1; + unsigned B3SOIPDketaGiven :1; + unsigned B3SOIPDnsubGiven :1; + unsigned B3SOIPDnpeakGiven :1; + unsigned B3SOIPDngateGiven :1; + unsigned B3SOIPDgamma1Given :1; + unsigned B3SOIPDgamma2Given :1; + unsigned B3SOIPDvbxGiven :1; + unsigned B3SOIPDvbmGiven :1; + unsigned B3SOIPDxtGiven :1; + unsigned B3SOIPDk1Given :1; + unsigned B3SOIPDkt1Given :1; + unsigned B3SOIPDkt1lGiven :1; + unsigned B3SOIPDkt2Given :1; + unsigned B3SOIPDk2Given :1; + unsigned B3SOIPDk3Given :1; + unsigned B3SOIPDk3bGiven :1; + unsigned B3SOIPDw0Given :1; + unsigned B3SOIPDnlxGiven :1; + unsigned B3SOIPDdvt0Given :1; + unsigned B3SOIPDdvt1Given :1; + unsigned B3SOIPDdvt2Given :1; + unsigned B3SOIPDdvt0wGiven :1; + unsigned B3SOIPDdvt1wGiven :1; + unsigned B3SOIPDdvt2wGiven :1; + unsigned B3SOIPDdroutGiven :1; + unsigned B3SOIPDdsubGiven :1; + unsigned B3SOIPDvth0Given :1; + unsigned B3SOIPDuaGiven :1; + unsigned B3SOIPDua1Given :1; + unsigned B3SOIPDubGiven :1; + unsigned B3SOIPDub1Given :1; + unsigned B3SOIPDucGiven :1; + unsigned B3SOIPDuc1Given :1; + unsigned B3SOIPDu0Given :1; + unsigned B3SOIPDuteGiven :1; + unsigned B3SOIPDvoffGiven :1; + unsigned B3SOIPDrdswGiven :1; + unsigned B3SOIPDprwgGiven :1; + unsigned B3SOIPDprwbGiven :1; + unsigned B3SOIPDprtGiven :1; + unsigned B3SOIPDeta0Given :1; + unsigned B3SOIPDetabGiven :1; + unsigned B3SOIPDpclmGiven :1; + unsigned B3SOIPDpdibl1Given :1; + unsigned B3SOIPDpdibl2Given :1; + unsigned B3SOIPDpdiblbGiven :1; + unsigned B3SOIPDpvagGiven :1; + unsigned B3SOIPDdeltaGiven :1; + unsigned B3SOIPDwrGiven :1; + unsigned B3SOIPDdwgGiven :1; + unsigned B3SOIPDdwbGiven :1; + unsigned B3SOIPDb0Given :1; + unsigned B3SOIPDb1Given :1; + unsigned B3SOIPDalpha0Given :1; /* v2.2 release */ - unsigned B3SOIPDwth0Given:1; - unsigned B3SOIPDrhaloGiven:1; - unsigned B3SOIPDntoxGiven:1; - unsigned B3SOIPDtoxrefGiven:1; - unsigned B3SOIPDebgGiven:1; - unsigned B3SOIPDnevbGiven:1; - unsigned B3SOIPDalphaGB1Given:1; - unsigned B3SOIPDbetaGB1Given:1; - unsigned B3SOIPDvgb1Given:1; - unsigned B3SOIPDnecbGiven:1; - unsigned B3SOIPDalphaGB2Given:1; - unsigned B3SOIPDbetaGB2Given:1; - unsigned B3SOIPDvgb2Given:1; - unsigned B3SOIPDtoxqmGiven:1; - unsigned B3SOIPDigModGiven:1; - unsigned B3SOIPDvoxhGiven:1; - unsigned B3SOIPDdeltavoxGiven:1; + unsigned B3SOIPDwth0Given :1; + unsigned B3SOIPDrhaloGiven :1; + unsigned B3SOIPDntoxGiven :1; + unsigned B3SOIPDtoxrefGiven :1; + unsigned B3SOIPDebgGiven :1; + unsigned B3SOIPDvevbGiven :1; + unsigned B3SOIPDalphaGB1Given :1; + unsigned B3SOIPDbetaGB1Given :1; + unsigned B3SOIPDvgb1Given :1; + unsigned B3SOIPDvecbGiven :1; + unsigned B3SOIPDalphaGB2Given :1; + unsigned B3SOIPDbetaGB2Given :1; + unsigned B3SOIPDvgb2Given :1; + unsigned B3SOIPDtoxqmGiven :1; + unsigned B3SOIPDigModGiven :1; + unsigned B3SOIPDvoxhGiven :1; + unsigned B3SOIPDdeltavoxGiven :1; /* v2.0 release */ - unsigned B3SOIPDk1w1Given:1; - unsigned B3SOIPDk1w2Given:1; - unsigned B3SOIPDketasGiven:1; - unsigned B3SOIPDdwbcGiven:1; - unsigned B3SOIPDbeta0Given:1; - unsigned B3SOIPDbeta1Given:1; - unsigned B3SOIPDbeta2Given:1; - unsigned B3SOIPDvdsatii0Given:1; - unsigned B3SOIPDtiiGiven:1; - unsigned B3SOIPDliiGiven:1; - unsigned B3SOIPDsii0Given:1; - unsigned B3SOIPDsii1Given:1; - unsigned B3SOIPDsii2Given:1; - unsigned B3SOIPDsiidGiven:1; - unsigned B3SOIPDfbjtiiGiven:1; - unsigned B3SOIPDesatiiGiven:1; - unsigned B3SOIPDntunGiven:1; - unsigned B3SOIPDnrecf0Given:1; - unsigned B3SOIPDnrecr0Given:1; - unsigned B3SOIPDisbjtGiven:1; - unsigned B3SOIPDisdifGiven:1; - unsigned B3SOIPDisrecGiven:1; - unsigned B3SOIPDistunGiven:1; - unsigned B3SOIPDlnGiven:1; - unsigned B3SOIPDvrec0Given:1; - unsigned B3SOIPDvtun0Given:1; - unsigned B3SOIPDnbjtGiven:1; - unsigned B3SOIPDlbjt0Given:1; - unsigned B3SOIPDldif0Given:1; - unsigned B3SOIPDvabjtGiven:1; - unsigned B3SOIPDaelyGiven:1; - unsigned B3SOIPDahliGiven:1; - unsigned B3SOIPDrbodyGiven:1; - unsigned B3SOIPDrbshGiven:1; - unsigned B3SOIPDndifGiven:1; - unsigned B3SOIPDntrecfGiven:1; - unsigned B3SOIPDntrecrGiven:1; - unsigned B3SOIPDdlcbGiven:1; - unsigned B3SOIPDfbodyGiven:1; - unsigned B3SOIPDtcjswgGiven:1; - unsigned B3SOIPDtpbswgGiven:1; - unsigned B3SOIPDacdeGiven:1; - unsigned B3SOIPDmoinGiven:1; - unsigned B3SOIPDdelvtGiven:1; - unsigned B3SOIPDdlbgGiven:1; - - - /* CV model */ - unsigned B3SOIPDcgslGiven:1; - unsigned B3SOIPDcgdlGiven:1; - unsigned B3SOIPDckappaGiven:1; - unsigned B3SOIPDcfGiven:1; - unsigned B3SOIPDclcGiven:1; - unsigned B3SOIPDcleGiven:1; - unsigned B3SOIPDdwcGiven:1; - unsigned B3SOIPDdlcGiven:1; + unsigned B3SOIPDk1w1Given :1; + unsigned B3SOIPDk1w2Given :1; + unsigned B3SOIPDketasGiven :1; + unsigned B3SOIPDdwbcGiven :1; + unsigned B3SOIPDbeta0Given :1; + unsigned B3SOIPDbeta1Given :1; + unsigned B3SOIPDbeta2Given :1; + unsigned B3SOIPDvdsatii0Given :1; + unsigned B3SOIPDtiiGiven :1; + unsigned B3SOIPDliiGiven :1; + unsigned B3SOIPDsii0Given :1; + unsigned B3SOIPDsii1Given :1; + unsigned B3SOIPDsii2Given :1; + unsigned B3SOIPDsiidGiven :1; + unsigned B3SOIPDfbjtiiGiven :1; + unsigned B3SOIPDesatiiGiven :1; + unsigned B3SOIPDntunGiven :1; + unsigned B3SOIPDnrecf0Given :1; + unsigned B3SOIPDnrecr0Given :1; + unsigned B3SOIPDisbjtGiven :1; + unsigned B3SOIPDisdifGiven :1; + unsigned B3SOIPDisrecGiven :1; + unsigned B3SOIPDistunGiven :1; + unsigned B3SOIPDlnGiven :1; + unsigned B3SOIPDvrec0Given :1; + unsigned B3SOIPDvtun0Given :1; + unsigned B3SOIPDnbjtGiven :1; + unsigned B3SOIPDlbjt0Given :1; + unsigned B3SOIPDldif0Given :1; + unsigned B3SOIPDvabjtGiven :1; + unsigned B3SOIPDaelyGiven :1; + unsigned B3SOIPDahliGiven :1; + unsigned B3SOIPDrbodyGiven :1; + unsigned B3SOIPDrbshGiven :1; + unsigned B3SOIPDndifGiven :1; + unsigned B3SOIPDntrecfGiven :1; + unsigned B3SOIPDntrecrGiven :1; + unsigned B3SOIPDdlcbGiven :1; + unsigned B3SOIPDfbodyGiven :1; + unsigned B3SOIPDtcjswgGiven :1; + unsigned B3SOIPDtpbswgGiven :1; + unsigned B3SOIPDacdeGiven :1; + unsigned B3SOIPDmoinGiven :1; + unsigned B3SOIPDdelvtGiven :1; + unsigned B3SOIPDdlbgGiven :1; + + + /* CV model */ + unsigned B3SOIPDcgslGiven :1; + unsigned B3SOIPDcgdlGiven :1; + unsigned B3SOIPDckappaGiven :1; + unsigned B3SOIPDcfGiven :1; + unsigned B3SOIPDclcGiven :1; + unsigned B3SOIPDcleGiven :1; + unsigned B3SOIPDdwcGiven :1; + unsigned B3SOIPDdlcGiven :1; /* Added for binning - START2 */ - /* Length Dependence */ - unsigned B3SOIPDlnpeakGiven:1; - unsigned B3SOIPDlnsubGiven:1; - unsigned B3SOIPDlngateGiven:1; - unsigned B3SOIPDlvth0Given:1; - unsigned B3SOIPDlk1Given:1; - unsigned B3SOIPDlk1w1Given:1; - unsigned B3SOIPDlk1w2Given:1; - unsigned B3SOIPDlk2Given:1; - unsigned B3SOIPDlk3Given:1; - unsigned B3SOIPDlk3bGiven:1; - unsigned B3SOIPDlkb1Given:1; - unsigned B3SOIPDlw0Given:1; - unsigned B3SOIPDlnlxGiven:1; - unsigned B3SOIPDldvt0Given:1; - unsigned B3SOIPDldvt1Given:1; - unsigned B3SOIPDldvt2Given:1; - unsigned B3SOIPDldvt0wGiven:1; - unsigned B3SOIPDldvt1wGiven:1; - unsigned B3SOIPDldvt2wGiven:1; - unsigned B3SOIPDlu0Given:1; - unsigned B3SOIPDluaGiven:1; - unsigned B3SOIPDlubGiven:1; - unsigned B3SOIPDlucGiven:1; - unsigned B3SOIPDlvsatGiven:1; - unsigned B3SOIPDla0Given:1; - unsigned B3SOIPDlagsGiven:1; - unsigned B3SOIPDlb0Given:1; - unsigned B3SOIPDlb1Given:1; - unsigned B3SOIPDlketaGiven:1; - unsigned B3SOIPDlketasGiven:1; - unsigned B3SOIPDla1Given:1; - unsigned B3SOIPDla2Given:1; - unsigned B3SOIPDlrdswGiven:1; - unsigned B3SOIPDlprwbGiven:1; - unsigned B3SOIPDlprwgGiven:1; - unsigned B3SOIPDlwrGiven:1; - unsigned B3SOIPDlnfactorGiven:1; - unsigned B3SOIPDldwgGiven:1; - unsigned B3SOIPDldwbGiven:1; - unsigned B3SOIPDlvoffGiven:1; - unsigned B3SOIPDleta0Given:1; - unsigned B3SOIPDletabGiven:1; - unsigned B3SOIPDldsubGiven:1; - unsigned B3SOIPDlcitGiven:1; - unsigned B3SOIPDlcdscGiven:1; - unsigned B3SOIPDlcdscbGiven:1; - unsigned B3SOIPDlcdscdGiven:1; - unsigned B3SOIPDlpclmGiven:1; - unsigned B3SOIPDlpdibl1Given:1; - unsigned B3SOIPDlpdibl2Given:1; - unsigned B3SOIPDlpdiblbGiven:1; - unsigned B3SOIPDldroutGiven:1; - unsigned B3SOIPDlpvagGiven:1; - unsigned B3SOIPDldeltaGiven:1; - unsigned B3SOIPDlalpha0Given:1; - unsigned B3SOIPDlfbjtiiGiven:1; - unsigned B3SOIPDlbeta0Given:1; - unsigned B3SOIPDlbeta1Given:1; - unsigned B3SOIPDlbeta2Given:1; - unsigned B3SOIPDlvdsatii0Given:1; - unsigned B3SOIPDlliiGiven:1; - unsigned B3SOIPDlesatiiGiven:1; - unsigned B3SOIPDlsii0Given:1; - unsigned B3SOIPDlsii1Given:1; - unsigned B3SOIPDlsii2Given:1; - unsigned B3SOIPDlsiidGiven:1; - unsigned B3SOIPDlagidlGiven:1; - unsigned B3SOIPDlbgidlGiven:1; - unsigned B3SOIPDlngidlGiven:1; - unsigned B3SOIPDlntunGiven:1; - unsigned B3SOIPDlndiodeGiven:1; - unsigned B3SOIPDlnrecf0Given:1; - unsigned B3SOIPDlnrecr0Given:1; - unsigned B3SOIPDlisbjtGiven:1; - unsigned B3SOIPDlisdifGiven:1; - unsigned B3SOIPDlisrecGiven:1; - unsigned B3SOIPDlistunGiven:1; - unsigned B3SOIPDlvrec0Given:1; - unsigned B3SOIPDlvtun0Given:1; - unsigned B3SOIPDlnbjtGiven:1; - unsigned B3SOIPDllbjt0Given:1; - unsigned B3SOIPDlvabjtGiven:1; - unsigned B3SOIPDlaelyGiven:1; - unsigned B3SOIPDlahliGiven:1; - /* CV model */ - unsigned B3SOIPDlvsdfbGiven:1; - unsigned B3SOIPDlvsdthGiven:1; - unsigned B3SOIPDldelvtGiven:1; - unsigned B3SOIPDlacdeGiven:1; - unsigned B3SOIPDlmoinGiven:1; - - /* Width Dependence */ - unsigned B3SOIPDwnpeakGiven:1; - unsigned B3SOIPDwnsubGiven:1; - unsigned B3SOIPDwngateGiven:1; - unsigned B3SOIPDwvth0Given:1; - unsigned B3SOIPDwk1Given:1; - unsigned B3SOIPDwk1w1Given:1; - unsigned B3SOIPDwk1w2Given:1; - unsigned B3SOIPDwk2Given:1; - unsigned B3SOIPDwk3Given:1; - unsigned B3SOIPDwk3bGiven:1; - unsigned B3SOIPDwkb1Given:1; - unsigned B3SOIPDww0Given:1; - unsigned B3SOIPDwnlxGiven:1; - unsigned B3SOIPDwdvt0Given:1; - unsigned B3SOIPDwdvt1Given:1; - unsigned B3SOIPDwdvt2Given:1; - unsigned B3SOIPDwdvt0wGiven:1; - unsigned B3SOIPDwdvt1wGiven:1; - unsigned B3SOIPDwdvt2wGiven:1; - unsigned B3SOIPDwu0Given:1; - unsigned B3SOIPDwuaGiven:1; - unsigned B3SOIPDwubGiven:1; - unsigned B3SOIPDwucGiven:1; - unsigned B3SOIPDwvsatGiven:1; - unsigned B3SOIPDwa0Given:1; - unsigned B3SOIPDwagsGiven:1; - unsigned B3SOIPDwb0Given:1; - unsigned B3SOIPDwb1Given:1; - unsigned B3SOIPDwketaGiven:1; - unsigned B3SOIPDwketasGiven:1; - unsigned B3SOIPDwa1Given:1; - unsigned B3SOIPDwa2Given:1; - unsigned B3SOIPDwrdswGiven:1; - unsigned B3SOIPDwprwbGiven:1; - unsigned B3SOIPDwprwgGiven:1; - unsigned B3SOIPDwwrGiven:1; - unsigned B3SOIPDwnfactorGiven:1; - unsigned B3SOIPDwdwgGiven:1; - unsigned B3SOIPDwdwbGiven:1; - unsigned B3SOIPDwvoffGiven:1; - unsigned B3SOIPDweta0Given:1; - unsigned B3SOIPDwetabGiven:1; - unsigned B3SOIPDwdsubGiven:1; - unsigned B3SOIPDwcitGiven:1; - unsigned B3SOIPDwcdscGiven:1; - unsigned B3SOIPDwcdscbGiven:1; - unsigned B3SOIPDwcdscdGiven:1; - unsigned B3SOIPDwpclmGiven:1; - unsigned B3SOIPDwpdibl1Given:1; - unsigned B3SOIPDwpdibl2Given:1; - unsigned B3SOIPDwpdiblbGiven:1; - unsigned B3SOIPDwdroutGiven:1; - unsigned B3SOIPDwpvagGiven:1; - unsigned B3SOIPDwdeltaGiven:1; - unsigned B3SOIPDwalpha0Given:1; - unsigned B3SOIPDwfbjtiiGiven:1; - unsigned B3SOIPDwbeta0Given:1; - unsigned B3SOIPDwbeta1Given:1; - unsigned B3SOIPDwbeta2Given:1; - unsigned B3SOIPDwvdsatii0Given:1; - unsigned B3SOIPDwliiGiven:1; - unsigned B3SOIPDwesatiiGiven:1; - unsigned B3SOIPDwsii0Given:1; - unsigned B3SOIPDwsii1Given:1; - unsigned B3SOIPDwsii2Given:1; - unsigned B3SOIPDwsiidGiven:1; - unsigned B3SOIPDwagidlGiven:1; - unsigned B3SOIPDwbgidlGiven:1; - unsigned B3SOIPDwngidlGiven:1; - unsigned B3SOIPDwntunGiven:1; - unsigned B3SOIPDwndiodeGiven:1; - unsigned B3SOIPDwnrecf0Given:1; - unsigned B3SOIPDwnrecr0Given:1; - unsigned B3SOIPDwisbjtGiven:1; - unsigned B3SOIPDwisdifGiven:1; - unsigned B3SOIPDwisrecGiven:1; - unsigned B3SOIPDwistunGiven:1; - unsigned B3SOIPDwvrec0Given:1; - unsigned B3SOIPDwvtun0Given:1; - unsigned B3SOIPDwnbjtGiven:1; - unsigned B3SOIPDwlbjt0Given:1; - unsigned B3SOIPDwvabjtGiven:1; - unsigned B3SOIPDwaelyGiven:1; - unsigned B3SOIPDwahliGiven:1; - /* CV model */ - unsigned B3SOIPDwvsdfbGiven:1; - unsigned B3SOIPDwvsdthGiven:1; - unsigned B3SOIPDwdelvtGiven:1; - unsigned B3SOIPDwacdeGiven:1; - unsigned B3SOIPDwmoinGiven:1; - - /* Cross-term Dependence */ - unsigned B3SOIPDpnpeakGiven:1; - unsigned B3SOIPDpnsubGiven:1; - unsigned B3SOIPDpngateGiven:1; - unsigned B3SOIPDpvth0Given:1; - unsigned B3SOIPDpk1Given:1; - unsigned B3SOIPDpk1w1Given:1; - unsigned B3SOIPDpk1w2Given:1; - unsigned B3SOIPDpk2Given:1; - unsigned B3SOIPDpk3Given:1; - unsigned B3SOIPDpk3bGiven:1; - unsigned B3SOIPDpkb1Given:1; - unsigned B3SOIPDpw0Given:1; - unsigned B3SOIPDpnlxGiven:1; - unsigned B3SOIPDpdvt0Given:1; - unsigned B3SOIPDpdvt1Given:1; - unsigned B3SOIPDpdvt2Given:1; - unsigned B3SOIPDpdvt0wGiven:1; - unsigned B3SOIPDpdvt1wGiven:1; - unsigned B3SOIPDpdvt2wGiven:1; - unsigned B3SOIPDpu0Given:1; - unsigned B3SOIPDpuaGiven:1; - unsigned B3SOIPDpubGiven:1; - unsigned B3SOIPDpucGiven:1; - unsigned B3SOIPDpvsatGiven:1; - unsigned B3SOIPDpa0Given:1; - unsigned B3SOIPDpagsGiven:1; - unsigned B3SOIPDpb0Given:1; - unsigned B3SOIPDpb1Given:1; - unsigned B3SOIPDpketaGiven:1; - unsigned B3SOIPDpketasGiven:1; - unsigned B3SOIPDpa1Given:1; - unsigned B3SOIPDpa2Given:1; - unsigned B3SOIPDprdswGiven:1; - unsigned B3SOIPDpprwbGiven:1; - unsigned B3SOIPDpprwgGiven:1; - unsigned B3SOIPDpwrGiven:1; - unsigned B3SOIPDpnfactorGiven:1; - unsigned B3SOIPDpdwgGiven:1; - unsigned B3SOIPDpdwbGiven:1; - unsigned B3SOIPDpvoffGiven:1; - unsigned B3SOIPDpeta0Given:1; - unsigned B3SOIPDpetabGiven:1; - unsigned B3SOIPDpdsubGiven:1; - unsigned B3SOIPDpcitGiven:1; - unsigned B3SOIPDpcdscGiven:1; - unsigned B3SOIPDpcdscbGiven:1; - unsigned B3SOIPDpcdscdGiven:1; - unsigned B3SOIPDppclmGiven:1; - unsigned B3SOIPDppdibl1Given:1; - unsigned B3SOIPDppdibl2Given:1; - unsigned B3SOIPDppdiblbGiven:1; - unsigned B3SOIPDpdroutGiven:1; - unsigned B3SOIPDppvagGiven:1; - unsigned B3SOIPDpdeltaGiven:1; - unsigned B3SOIPDpalpha0Given:1; - unsigned B3SOIPDpfbjtiiGiven:1; - unsigned B3SOIPDpbeta0Given:1; - unsigned B3SOIPDpbeta1Given:1; - unsigned B3SOIPDpbeta2Given:1; - unsigned B3SOIPDpvdsatii0Given:1; - unsigned B3SOIPDpliiGiven:1; - unsigned B3SOIPDpesatiiGiven:1; - unsigned B3SOIPDpsii0Given:1; - unsigned B3SOIPDpsii1Given:1; - unsigned B3SOIPDpsii2Given:1; - unsigned B3SOIPDpsiidGiven:1; - unsigned B3SOIPDpagidlGiven:1; - unsigned B3SOIPDpbgidlGiven:1; - unsigned B3SOIPDpngidlGiven:1; - unsigned B3SOIPDpntunGiven:1; - unsigned B3SOIPDpndiodeGiven:1; - unsigned B3SOIPDpnrecf0Given:1; - unsigned B3SOIPDpnrecr0Given:1; - unsigned B3SOIPDpisbjtGiven:1; - unsigned B3SOIPDpisdifGiven:1; - unsigned B3SOIPDpisrecGiven:1; - unsigned B3SOIPDpistunGiven:1; - unsigned B3SOIPDpvrec0Given:1; - unsigned B3SOIPDpvtun0Given:1; - unsigned B3SOIPDpnbjtGiven:1; - unsigned B3SOIPDplbjt0Given:1; - unsigned B3SOIPDpvabjtGiven:1; - unsigned B3SOIPDpaelyGiven:1; - unsigned B3SOIPDpahliGiven:1; - /* CV model */ - unsigned B3SOIPDpvsdfbGiven:1; - unsigned B3SOIPDpvsdthGiven:1; - unsigned B3SOIPDpdelvtGiven:1; - unsigned B3SOIPDpacdeGiven:1; - unsigned B3SOIPDpmoinGiven:1; + /* Length Dependence */ + unsigned B3SOIPDlnpeakGiven :1; + unsigned B3SOIPDlnsubGiven :1; + unsigned B3SOIPDlngateGiven :1; + unsigned B3SOIPDlvth0Given :1; + unsigned B3SOIPDlk1Given :1; + unsigned B3SOIPDlk1w1Given :1; + unsigned B3SOIPDlk1w2Given :1; + unsigned B3SOIPDlk2Given :1; + unsigned B3SOIPDlk3Given :1; + unsigned B3SOIPDlk3bGiven :1; + unsigned B3SOIPDlkb1Given :1; + unsigned B3SOIPDlw0Given :1; + unsigned B3SOIPDlnlxGiven :1; + unsigned B3SOIPDldvt0Given :1; + unsigned B3SOIPDldvt1Given :1; + unsigned B3SOIPDldvt2Given :1; + unsigned B3SOIPDldvt0wGiven :1; + unsigned B3SOIPDldvt1wGiven :1; + unsigned B3SOIPDldvt2wGiven :1; + unsigned B3SOIPDlu0Given :1; + unsigned B3SOIPDluaGiven :1; + unsigned B3SOIPDlubGiven :1; + unsigned B3SOIPDlucGiven :1; + unsigned B3SOIPDlvsatGiven :1; + unsigned B3SOIPDla0Given :1; + unsigned B3SOIPDlagsGiven :1; + unsigned B3SOIPDlb0Given :1; + unsigned B3SOIPDlb1Given :1; + unsigned B3SOIPDlketaGiven :1; + unsigned B3SOIPDlketasGiven :1; + unsigned B3SOIPDla1Given :1; + unsigned B3SOIPDla2Given :1; + unsigned B3SOIPDlrdswGiven :1; + unsigned B3SOIPDlprwbGiven :1; + unsigned B3SOIPDlprwgGiven :1; + unsigned B3SOIPDlwrGiven :1; + unsigned B3SOIPDlnfactorGiven :1; + unsigned B3SOIPDldwgGiven :1; + unsigned B3SOIPDldwbGiven :1; + unsigned B3SOIPDlvoffGiven :1; + unsigned B3SOIPDleta0Given :1; + unsigned B3SOIPDletabGiven :1; + unsigned B3SOIPDldsubGiven :1; + unsigned B3SOIPDlcitGiven :1; + unsigned B3SOIPDlcdscGiven :1; + unsigned B3SOIPDlcdscbGiven :1; + unsigned B3SOIPDlcdscdGiven :1; + unsigned B3SOIPDlpclmGiven :1; + unsigned B3SOIPDlpdibl1Given :1; + unsigned B3SOIPDlpdibl2Given :1; + unsigned B3SOIPDlpdiblbGiven :1; + unsigned B3SOIPDldroutGiven :1; + unsigned B3SOIPDlpvagGiven :1; + unsigned B3SOIPDldeltaGiven :1; + unsigned B3SOIPDlalpha0Given :1; + unsigned B3SOIPDlfbjtiiGiven :1; + unsigned B3SOIPDlbeta0Given :1; + unsigned B3SOIPDlbeta1Given :1; + unsigned B3SOIPDlbeta2Given :1; + unsigned B3SOIPDlvdsatii0Given :1; + unsigned B3SOIPDlliiGiven :1; + unsigned B3SOIPDlesatiiGiven :1; + unsigned B3SOIPDlsii0Given :1; + unsigned B3SOIPDlsii1Given :1; + unsigned B3SOIPDlsii2Given :1; + unsigned B3SOIPDlsiidGiven :1; + unsigned B3SOIPDlagidlGiven :1; + unsigned B3SOIPDlbgidlGiven :1; + unsigned B3SOIPDlngidlGiven :1; + unsigned B3SOIPDlntunGiven :1; + unsigned B3SOIPDlndiodeGiven :1; + unsigned B3SOIPDlnrecf0Given :1; + unsigned B3SOIPDlnrecr0Given :1; + unsigned B3SOIPDlisbjtGiven :1; + unsigned B3SOIPDlisdifGiven :1; + unsigned B3SOIPDlisrecGiven :1; + unsigned B3SOIPDlistunGiven :1; + unsigned B3SOIPDlvrec0Given :1; + unsigned B3SOIPDlvtun0Given :1; + unsigned B3SOIPDlnbjtGiven :1; + unsigned B3SOIPDllbjt0Given :1; + unsigned B3SOIPDlvabjtGiven :1; + unsigned B3SOIPDlaelyGiven :1; + unsigned B3SOIPDlahliGiven :1; + /* CV model */ + unsigned B3SOIPDlvsdfbGiven :1; + unsigned B3SOIPDlvsdthGiven :1; + unsigned B3SOIPDldelvtGiven :1; + unsigned B3SOIPDlacdeGiven :1; + unsigned B3SOIPDlmoinGiven :1; + + /* Width Dependence */ + unsigned B3SOIPDwnpeakGiven :1; + unsigned B3SOIPDwnsubGiven :1; + unsigned B3SOIPDwngateGiven :1; + unsigned B3SOIPDwvth0Given :1; + unsigned B3SOIPDwk1Given :1; + unsigned B3SOIPDwk1w1Given :1; + unsigned B3SOIPDwk1w2Given :1; + unsigned B3SOIPDwk2Given :1; + unsigned B3SOIPDwk3Given :1; + unsigned B3SOIPDwk3bGiven :1; + unsigned B3SOIPDwkb1Given :1; + unsigned B3SOIPDww0Given :1; + unsigned B3SOIPDwnlxGiven :1; + unsigned B3SOIPDwdvt0Given :1; + unsigned B3SOIPDwdvt1Given :1; + unsigned B3SOIPDwdvt2Given :1; + unsigned B3SOIPDwdvt0wGiven :1; + unsigned B3SOIPDwdvt1wGiven :1; + unsigned B3SOIPDwdvt2wGiven :1; + unsigned B3SOIPDwu0Given :1; + unsigned B3SOIPDwuaGiven :1; + unsigned B3SOIPDwubGiven :1; + unsigned B3SOIPDwucGiven :1; + unsigned B3SOIPDwvsatGiven :1; + unsigned B3SOIPDwa0Given :1; + unsigned B3SOIPDwagsGiven :1; + unsigned B3SOIPDwb0Given :1; + unsigned B3SOIPDwb1Given :1; + unsigned B3SOIPDwketaGiven :1; + unsigned B3SOIPDwketasGiven :1; + unsigned B3SOIPDwa1Given :1; + unsigned B3SOIPDwa2Given :1; + unsigned B3SOIPDwrdswGiven :1; + unsigned B3SOIPDwprwbGiven :1; + unsigned B3SOIPDwprwgGiven :1; + unsigned B3SOIPDwwrGiven :1; + unsigned B3SOIPDwnfactorGiven :1; + unsigned B3SOIPDwdwgGiven :1; + unsigned B3SOIPDwdwbGiven :1; + unsigned B3SOIPDwvoffGiven :1; + unsigned B3SOIPDweta0Given :1; + unsigned B3SOIPDwetabGiven :1; + unsigned B3SOIPDwdsubGiven :1; + unsigned B3SOIPDwcitGiven :1; + unsigned B3SOIPDwcdscGiven :1; + unsigned B3SOIPDwcdscbGiven :1; + unsigned B3SOIPDwcdscdGiven :1; + unsigned B3SOIPDwpclmGiven :1; + unsigned B3SOIPDwpdibl1Given :1; + unsigned B3SOIPDwpdibl2Given :1; + unsigned B3SOIPDwpdiblbGiven :1; + unsigned B3SOIPDwdroutGiven :1; + unsigned B3SOIPDwpvagGiven :1; + unsigned B3SOIPDwdeltaGiven :1; + unsigned B3SOIPDwalpha0Given :1; + unsigned B3SOIPDwfbjtiiGiven :1; + unsigned B3SOIPDwbeta0Given :1; + unsigned B3SOIPDwbeta1Given :1; + unsigned B3SOIPDwbeta2Given :1; + unsigned B3SOIPDwvdsatii0Given :1; + unsigned B3SOIPDwliiGiven :1; + unsigned B3SOIPDwesatiiGiven :1; + unsigned B3SOIPDwsii0Given :1; + unsigned B3SOIPDwsii1Given :1; + unsigned B3SOIPDwsii2Given :1; + unsigned B3SOIPDwsiidGiven :1; + unsigned B3SOIPDwagidlGiven :1; + unsigned B3SOIPDwbgidlGiven :1; + unsigned B3SOIPDwngidlGiven :1; + unsigned B3SOIPDwntunGiven :1; + unsigned B3SOIPDwndiodeGiven :1; + unsigned B3SOIPDwnrecf0Given :1; + unsigned B3SOIPDwnrecr0Given :1; + unsigned B3SOIPDwisbjtGiven :1; + unsigned B3SOIPDwisdifGiven :1; + unsigned B3SOIPDwisrecGiven :1; + unsigned B3SOIPDwistunGiven :1; + unsigned B3SOIPDwvrec0Given :1; + unsigned B3SOIPDwvtun0Given :1; + unsigned B3SOIPDwnbjtGiven :1; + unsigned B3SOIPDwlbjt0Given :1; + unsigned B3SOIPDwvabjtGiven :1; + unsigned B3SOIPDwaelyGiven :1; + unsigned B3SOIPDwahliGiven :1; + /* CV model */ + unsigned B3SOIPDwvsdfbGiven :1; + unsigned B3SOIPDwvsdthGiven :1; + unsigned B3SOIPDwdelvtGiven :1; + unsigned B3SOIPDwacdeGiven :1; + unsigned B3SOIPDwmoinGiven :1; + + /* Cross-term Dependence */ + unsigned B3SOIPDpnpeakGiven :1; + unsigned B3SOIPDpnsubGiven :1; + unsigned B3SOIPDpngateGiven :1; + unsigned B3SOIPDpvth0Given :1; + unsigned B3SOIPDpk1Given :1; + unsigned B3SOIPDpk1w1Given :1; + unsigned B3SOIPDpk1w2Given :1; + unsigned B3SOIPDpk2Given :1; + unsigned B3SOIPDpk3Given :1; + unsigned B3SOIPDpk3bGiven :1; + unsigned B3SOIPDpkb1Given :1; + unsigned B3SOIPDpw0Given :1; + unsigned B3SOIPDpnlxGiven :1; + unsigned B3SOIPDpdvt0Given :1; + unsigned B3SOIPDpdvt1Given :1; + unsigned B3SOIPDpdvt2Given :1; + unsigned B3SOIPDpdvt0wGiven :1; + unsigned B3SOIPDpdvt1wGiven :1; + unsigned B3SOIPDpdvt2wGiven :1; + unsigned B3SOIPDpu0Given :1; + unsigned B3SOIPDpuaGiven :1; + unsigned B3SOIPDpubGiven :1; + unsigned B3SOIPDpucGiven :1; + unsigned B3SOIPDpvsatGiven :1; + unsigned B3SOIPDpa0Given :1; + unsigned B3SOIPDpagsGiven :1; + unsigned B3SOIPDpb0Given :1; + unsigned B3SOIPDpb1Given :1; + unsigned B3SOIPDpketaGiven :1; + unsigned B3SOIPDpketasGiven :1; + unsigned B3SOIPDpa1Given :1; + unsigned B3SOIPDpa2Given :1; + unsigned B3SOIPDprdswGiven :1; + unsigned B3SOIPDpprwbGiven :1; + unsigned B3SOIPDpprwgGiven :1; + unsigned B3SOIPDpwrGiven :1; + unsigned B3SOIPDpnfactorGiven :1; + unsigned B3SOIPDpdwgGiven :1; + unsigned B3SOIPDpdwbGiven :1; + unsigned B3SOIPDpvoffGiven :1; + unsigned B3SOIPDpeta0Given :1; + unsigned B3SOIPDpetabGiven :1; + unsigned B3SOIPDpdsubGiven :1; + unsigned B3SOIPDpcitGiven :1; + unsigned B3SOIPDpcdscGiven :1; + unsigned B3SOIPDpcdscbGiven :1; + unsigned B3SOIPDpcdscdGiven :1; + unsigned B3SOIPDppclmGiven :1; + unsigned B3SOIPDppdibl1Given :1; + unsigned B3SOIPDppdibl2Given :1; + unsigned B3SOIPDppdiblbGiven :1; + unsigned B3SOIPDpdroutGiven :1; + unsigned B3SOIPDppvagGiven :1; + unsigned B3SOIPDpdeltaGiven :1; + unsigned B3SOIPDpalpha0Given :1; + unsigned B3SOIPDpfbjtiiGiven :1; + unsigned B3SOIPDpbeta0Given :1; + unsigned B3SOIPDpbeta1Given :1; + unsigned B3SOIPDpbeta2Given :1; + unsigned B3SOIPDpvdsatii0Given :1; + unsigned B3SOIPDpliiGiven :1; + unsigned B3SOIPDpesatiiGiven :1; + unsigned B3SOIPDpsii0Given :1; + unsigned B3SOIPDpsii1Given :1; + unsigned B3SOIPDpsii2Given :1; + unsigned B3SOIPDpsiidGiven :1; + unsigned B3SOIPDpagidlGiven :1; + unsigned B3SOIPDpbgidlGiven :1; + unsigned B3SOIPDpngidlGiven :1; + unsigned B3SOIPDpntunGiven :1; + unsigned B3SOIPDpndiodeGiven :1; + unsigned B3SOIPDpnrecf0Given :1; + unsigned B3SOIPDpnrecr0Given :1; + unsigned B3SOIPDpisbjtGiven :1; + unsigned B3SOIPDpisdifGiven :1; + unsigned B3SOIPDpisrecGiven :1; + unsigned B3SOIPDpistunGiven :1; + unsigned B3SOIPDpvrec0Given :1; + unsigned B3SOIPDpvtun0Given :1; + unsigned B3SOIPDpnbjtGiven :1; + unsigned B3SOIPDplbjt0Given :1; + unsigned B3SOIPDpvabjtGiven :1; + unsigned B3SOIPDpaelyGiven :1; + unsigned B3SOIPDpahliGiven :1; + /* CV model */ + unsigned B3SOIPDpvsdfbGiven :1; + unsigned B3SOIPDpvsdthGiven :1; + unsigned B3SOIPDpdelvtGiven :1; + unsigned B3SOIPDpacdeGiven :1; + unsigned B3SOIPDpmoinGiven :1; /* Added for binning - END2 */ - unsigned B3SOIPDuseFringeGiven:1; - - unsigned B3SOIPDtnomGiven:1; - unsigned B3SOIPDcgsoGiven:1; - unsigned B3SOIPDcgdoGiven:1; - unsigned B3SOIPDcgeoGiven:1; - unsigned B3SOIPDxpartGiven:1; - unsigned B3SOIPDsheetResistanceGiven:1; - unsigned B3SOIPDGatesidewallJctPotentialGiven:1; - unsigned B3SOIPDbodyJctGateSideGradingCoeffGiven:1; - unsigned B3SOIPDunitLengthGateSidewallJctCapGiven:1; - unsigned B3SOIPDcsdeswGiven:1; - - unsigned B3SOIPDoxideTrapDensityAGiven:1; - unsigned B3SOIPDoxideTrapDensityBGiven:1; - unsigned B3SOIPDoxideTrapDensityCGiven:1; - unsigned B3SOIPDemGiven:1; - unsigned B3SOIPDefGiven:1; - unsigned B3SOIPDafGiven:1; - unsigned B3SOIPDkfGiven:1; - unsigned B3SOIPDnoifGiven:1; - - unsigned B3SOIPDLintGiven:1; - unsigned B3SOIPDLlGiven:1; - unsigned B3SOIPDLlnGiven:1; - unsigned B3SOIPDLwGiven:1; - unsigned B3SOIPDLwnGiven:1; - unsigned B3SOIPDLwlGiven:1; - unsigned B3SOIPDLminGiven:1; - unsigned B3SOIPDLmaxGiven:1; - - unsigned B3SOIPDWintGiven:1; - unsigned B3SOIPDWlGiven:1; - unsigned B3SOIPDWlnGiven:1; - unsigned B3SOIPDWwGiven:1; - unsigned B3SOIPDWwnGiven:1; - unsigned B3SOIPDWwlGiven:1; - unsigned B3SOIPDWminGiven:1; - unsigned B3SOIPDWmaxGiven:1; - -} -B3SOIPDmodel; + unsigned B3SOIPDuseFringeGiven :1; + + unsigned B3SOIPDtnomGiven :1; + unsigned B3SOIPDcgsoGiven :1; + unsigned B3SOIPDcgdoGiven :1; + unsigned B3SOIPDcgeoGiven :1; + unsigned B3SOIPDxpartGiven :1; + unsigned B3SOIPDsheetResistanceGiven :1; + unsigned B3SOIPDGatesidewallJctPotentialGiven :1; + unsigned B3SOIPDbodyJctGateSideGradingCoeffGiven :1; + unsigned B3SOIPDunitLengthGateSidewallJctCapGiven :1; + unsigned B3SOIPDcsdeswGiven :1; + + unsigned B3SOIPDoxideTrapDensityAGiven :1; + unsigned B3SOIPDoxideTrapDensityBGiven :1; + unsigned B3SOIPDoxideTrapDensityCGiven :1; + unsigned B3SOIPDemGiven :1; + unsigned B3SOIPDefGiven :1; + unsigned B3SOIPDafGiven :1; + unsigned B3SOIPDkfGiven :1; + unsigned B3SOIPDnoifGiven :1; + + unsigned B3SOIPDLintGiven :1; + unsigned B3SOIPDLlGiven :1; + unsigned B3SOIPDLlcGiven :1; /* v2.2.3 */ + unsigned B3SOIPDLlnGiven :1; + unsigned B3SOIPDLwGiven :1; + unsigned B3SOIPDLwcGiven :1; /* v2.2.3 */ + unsigned B3SOIPDLwnGiven :1; + unsigned B3SOIPDLwlGiven :1; + unsigned B3SOIPDLwlcGiven :1; /* v2.2.3 */ + unsigned B3SOIPDLminGiven :1; + unsigned B3SOIPDLmaxGiven :1; + + unsigned B3SOIPDWintGiven :1; + unsigned B3SOIPDWlGiven :1; + unsigned B3SOIPDWlcGiven :1; /* v2.2.3 */ + unsigned B3SOIPDWlnGiven :1; + unsigned B3SOIPDWwGiven :1; + unsigned B3SOIPDWwcGiven :1; /* v2.2.3 */ + unsigned B3SOIPDWwnGiven :1; + unsigned B3SOIPDWwlGiven :1; + unsigned B3SOIPDWwlcGiven :1; /* v2.2.3 */ + unsigned B3SOIPDWminGiven :1; + unsigned B3SOIPDWmaxGiven :1; + +} B3SOIPDmodel; #ifndef NMOS #define NMOS 1 #define PMOS -1 #endif /*NMOS*/ + + /* device parameters */ #define B3SOIPD_W 1 #define B3SOIPD_L 2 +#define B3SOIPD_M 31 #define B3SOIPD_AS 3 #define B3SOIPD_AD 4 #define B3SOIPD_PS 5 @@ -1621,8 +1645,9 @@ B3SOIPDmodel; #define B3SOIPD_IC 19 #define B3SOIPD_NQSMOD 20 #define B3SOIPD_DEBUG 21 + /* v2.0 release */ -#define B3SOIPD_NBC 22 +#define B3SOIPD_NBC 22 #define B3SOIPD_NSEG 23 #define B3SOIPD_PDBCP 24 #define B3SOIPD_PSBCP 25 @@ -1630,14 +1655,21 @@ B3SOIPDmodel; #define B3SOIPD_AEBCP 27 #define B3SOIPD_VBSUSR 28 #define B3SOIPD_TNODEOUT 29 + +/* v2.2.2 */ +#define B3SOIPD_FRBODY 30 + + /* model parameters */ #define B3SOIPD_MOD_CAPMOD 101 #define B3SOIPD_MOD_NQSMOD 102 -#define B3SOIPD_MOD_MOBMOD 103 -#define B3SOIPD_MOD_NOIMOD 104 +#define B3SOIPD_MOD_MOBMOD 103 +#define B3SOIPD_MOD_NOIMOD 104 #define B3SOIPD_MOD_SHMOD 105 #define B3SOIPD_MOD_DDMOD 106 + #define B3SOIPD_MOD_TOX 107 + #define B3SOIPD_MOD_CDSC 108 #define B3SOIPD_MOD_CDSCB 109 #define B3SOIPD_MOD_CIT 110 @@ -1648,15 +1680,17 @@ B3SOIPDmodel; #define B3SOIPD_MOD_A0 115 #define B3SOIPD_MOD_A1 116 #define B3SOIPD_MOD_A2 117 -#define B3SOIPD_MOD_KETA 118 +#define B3SOIPD_MOD_KETA 118 #define B3SOIPD_MOD_NSUB 119 #define B3SOIPD_MOD_NPEAK 120 #define B3SOIPD_MOD_NGATE 121 #define B3SOIPD_MOD_GAMMA1 122 #define B3SOIPD_MOD_GAMMA2 123 #define B3SOIPD_MOD_VBX 124 -#define B3SOIPD_MOD_BINUNIT 125 +#define B3SOIPD_MOD_BINUNIT 125 + #define B3SOIPD_MOD_VBM 126 + #define B3SOIPD_MOD_XT 127 #define B3SOIPD_MOD_K1 129 #define B3SOIPD_MOD_KT1 130 @@ -1667,12 +1701,15 @@ B3SOIPDmodel; #define B3SOIPD_MOD_K3B 135 #define B3SOIPD_MOD_W0 136 #define B3SOIPD_MOD_NLX 137 + #define B3SOIPD_MOD_DVT0 138 #define B3SOIPD_MOD_DVT1 139 #define B3SOIPD_MOD_DVT2 140 + #define B3SOIPD_MOD_DVT0W 141 #define B3SOIPD_MOD_DVT1W 142 #define B3SOIPD_MOD_DVT2W 143 + #define B3SOIPD_MOD_DROUT 144 #define B3SOIPD_MOD_DSUB 145 #define B3SOIPD_MOD_VTH0 146 @@ -1705,10 +1742,13 @@ B3SOIPDmodel; #define B3SOIPD_MOD_B1 173 #define B3SOIPD_MOD_ALPHA0 174 #define B3SOIPD_MOD_PDIBLB 178 + #define B3SOIPD_MOD_PRWG 179 #define B3SOIPD_MOD_PRWB 180 + #define B3SOIPD_MOD_CDSCD 181 #define B3SOIPD_MOD_AGS 182 + #define B3SOIPD_MOD_FRINGE 184 #define B3SOIPD_MOD_CGSL 186 #define B3SOIPD_MOD_CGDL 187 @@ -1718,6 +1758,7 @@ B3SOIPDmodel; #define B3SOIPD_MOD_CLE 191 #define B3SOIPD_MOD_PARAMCHK 192 #define B3SOIPD_MOD_VERSION 193 + #define B3SOIPD_MOD_TBOX 195 #define B3SOIPD_MOD_TSI 196 #define B3SOIPD_MOD_KB1 197 @@ -1755,8 +1796,10 @@ B3SOIPDmodel; #define B3SOIPD_MOD_CSDMIN 236 #define B3SOIPD_MOD_RBSH 237 #define B3SOIPD_MOD_ESATII 238 + + /* v2.0 release */ -#define B3SOIPD_MOD_K1W1 239 +#define B3SOIPD_MOD_K1W1 239 #define B3SOIPD_MOD_K1W2 240 #define B3SOIPD_MOD_KETAS 241 #define B3SOIPD_MOD_DWBC 242 @@ -1793,17 +1836,19 @@ B3SOIPDmodel; #define B3SOIPD_MOD_DELVT 274 #define B3SOIPD_MOD_DLBG 275 #define B3SOIPD_MOD_LDIF0 276 + + /* v2.2 release */ #define B3SOIPD_MOD_WTH0 277 #define B3SOIPD_MOD_RHALO 278 #define B3SOIPD_MOD_NTOX 279 #define B3SOIPD_MOD_TOXREF 280 #define B3SOIPD_MOD_EBG 281 -#define B3SOIPD_MOD_NEVB 282 +#define B3SOIPD_MOD_VEVB 282 #define B3SOIPD_MOD_ALPHAGB1 283 #define B3SOIPD_MOD_BETAGB1 284 #define B3SOIPD_MOD_VGB1 285 -#define B3SOIPD_MOD_NECB 286 +#define B3SOIPD_MOD_VECB 286 #define B3SOIPD_MOD_ALPHAGB2 287 #define B3SOIPD_MOD_BETAGB2 288 #define B3SOIPD_MOD_VGB2 289 @@ -1811,13 +1856,15 @@ B3SOIPDmodel; #define B3SOIPD_MOD_IGMOD 291 #define B3SOIPD_MOD_VOXH 292 #define B3SOIPD_MOD_DELTAVOX 293 + + /* Added for binning - START3 */ /* Length dependence */ #define B3SOIPD_MOD_LNPEAK 301 #define B3SOIPD_MOD_LNSUB 302 #define B3SOIPD_MOD_LNGATE 303 #define B3SOIPD_MOD_LVTH0 304 -#define B3SOIPD_MOD_LK1 305 +#define B3SOIPD_MOD_LK1 305 #define B3SOIPD_MOD_LK1W1 306 #define B3SOIPD_MOD_LK1W2 307 #define B3SOIPD_MOD_LK2 308 @@ -1841,8 +1888,8 @@ B3SOIPDmodel; #define B3SOIPD_MOD_LAGS 326 #define B3SOIPD_MOD_LB0 327 #define B3SOIPD_MOD_LB1 328 -#define B3SOIPD_MOD_LKETA 329 -#define B3SOIPD_MOD_LKETAS 330 +#define B3SOIPD_MOD_LKETA 329 +#define B3SOIPD_MOD_LKETAS 330 #define B3SOIPD_MOD_LA1 331 #define B3SOIPD_MOD_LA2 332 #define B3SOIPD_MOD_LRDSW 333 @@ -1902,12 +1949,13 @@ B3SOIPDmodel; #define B3SOIPD_MOD_LDELVT 387 #define B3SOIPD_MOD_LACDE 388 #define B3SOIPD_MOD_LMOIN 389 + /* Width dependence */ #define B3SOIPD_MOD_WNPEAK 401 #define B3SOIPD_MOD_WNSUB 402 #define B3SOIPD_MOD_WNGATE 403 #define B3SOIPD_MOD_WVTH0 404 -#define B3SOIPD_MOD_WK1 405 +#define B3SOIPD_MOD_WK1 405 #define B3SOIPD_MOD_WK1W1 406 #define B3SOIPD_MOD_WK1W2 407 #define B3SOIPD_MOD_WK2 408 @@ -1931,8 +1979,8 @@ B3SOIPDmodel; #define B3SOIPD_MOD_WAGS 426 #define B3SOIPD_MOD_WB0 427 #define B3SOIPD_MOD_WB1 428 -#define B3SOIPD_MOD_WKETA 429 -#define B3SOIPD_MOD_WKETAS 430 +#define B3SOIPD_MOD_WKETA 429 +#define B3SOIPD_MOD_WKETAS 430 #define B3SOIPD_MOD_WA1 431 #define B3SOIPD_MOD_WA2 432 #define B3SOIPD_MOD_WRDSW 433 @@ -1992,12 +2040,13 @@ B3SOIPDmodel; #define B3SOIPD_MOD_WDELVT 487 #define B3SOIPD_MOD_WACDE 488 #define B3SOIPD_MOD_WMOIN 489 + /* Cross-term dependence */ #define B3SOIPD_MOD_PNPEAK 501 #define B3SOIPD_MOD_PNSUB 502 #define B3SOIPD_MOD_PNGATE 503 #define B3SOIPD_MOD_PVTH0 504 -#define B3SOIPD_MOD_PK1 505 +#define B3SOIPD_MOD_PK1 505 #define B3SOIPD_MOD_PK1W1 506 #define B3SOIPD_MOD_PK1W2 507 #define B3SOIPD_MOD_PK2 508 @@ -2021,8 +2070,8 @@ B3SOIPDmodel; #define B3SOIPD_MOD_PAGS 526 #define B3SOIPD_MOD_PB0 527 #define B3SOIPD_MOD_PB1 528 -#define B3SOIPD_MOD_PKETA 529 -#define B3SOIPD_MOD_PKETAS 530 +#define B3SOIPD_MOD_PKETA 529 +#define B3SOIPD_MOD_PKETAS 530 #define B3SOIPD_MOD_PA1 531 #define B3SOIPD_MOD_PA2 532 #define B3SOIPD_MOD_PRDSW 533 @@ -2083,40 +2132,59 @@ B3SOIPDmodel; #define B3SOIPD_MOD_PACDE 588 #define B3SOIPD_MOD_PMOIN 589 /* Added for binning - END3 */ + #define B3SOIPD_MOD_TNOM 701 #define B3SOIPD_MOD_CGSO 702 #define B3SOIPD_MOD_CGDO 703 #define B3SOIPD_MOD_CGEO 704 #define B3SOIPD_MOD_XPART 705 + #define B3SOIPD_MOD_RSH 706 #define B3SOIPD_MOD_NMOS 814 #define B3SOIPD_MOD_PMOS 815 + #define B3SOIPD_MOD_NOIA 816 #define B3SOIPD_MOD_NOIB 817 #define B3SOIPD_MOD_NOIC 818 + #define B3SOIPD_MOD_LINT 819 #define B3SOIPD_MOD_LL 820 #define B3SOIPD_MOD_LLN 821 #define B3SOIPD_MOD_LW 822 #define B3SOIPD_MOD_LWN 823 #define B3SOIPD_MOD_LWL 824 + #define B3SOIPD_MOD_WINT 827 #define B3SOIPD_MOD_WL 828 #define B3SOIPD_MOD_WLN 829 #define B3SOIPD_MOD_WW 830 #define B3SOIPD_MOD_WWN 831 #define B3SOIPD_MOD_WWL 832 + +/* v2.2.3 */ +#define B3SOIPD_MOD_LWLC 847 +#define B3SOIPD_MOD_LLC 848 +#define B3SOIPD_MOD_LWC 849 +#define B3SOIPD_MOD_WWLC 850 +#define B3SOIPD_MOD_WLC 851 +#define B3SOIPD_MOD_WWC 852 +#define B3SOIPD_MOD_DTOXCV 853 + #define B3SOIPD_MOD_DWC 835 #define B3SOIPD_MOD_DLC 836 + #define B3SOIPD_MOD_EM 837 #define B3SOIPD_MOD_EF 838 #define B3SOIPD_MOD_AF 839 #define B3SOIPD_MOD_KF 840 #define B3SOIPD_MOD_NOIF 841 + + #define B3SOIPD_MOD_PBSWG 843 #define B3SOIPD_MOD_MJSWG 844 #define B3SOIPD_MOD_CJSWG 845 #define B3SOIPD_MOD_CSDESW 846 + /* device questions */ #define B3SOIPD_DNODE 901 #define B3SOIPD_GNODE 902 @@ -2164,22 +2232,15 @@ B3SOIPDmodel; #define B3SOIPD_CBDB 944 #define B3SOIPD_CBSB 945 #define B3SOIPD_GMID 946 + + #include "b3soipdext.h" -#ifdef __STDC__ -extern void B3SOIPDevaluate (double, double, double, B3SOIPDinstance *, - B3SOIPDmodel *, double *, double *, double *, - double *, double *, double *, double *, double *, - double *, double *, double *, double *, double *, - double *, double *, double *, double *, double *, - CKTcircuit *); -extern int B3SOIPDdebug (B3SOIPDmodel *, B3SOIPDinstance *, CKTcircuit *, - int); -extern int B3SOIPDcheckModel (B3SOIPDmodel *, B3SOIPDinstance *, - CKTcircuit *); -#else /* stdc */ -extern void B3SOIPDevaluate (); -extern int B3SOIPDdebug (); -extern int B3SOIPDcheckModel (); -#endif /* stdc */ - -#endif /*B3SOIPD */ + +extern void B3SOIPDevaluate(double,double,double,B3SOIPDinstance*,B3SOIPDmodel*, + double*,double*,double*, double*, double*, double*, double*, + double*, double*, double*, double*, double*, double*, double*, + double*, double*, double*, double*, CKTcircuit*); +extern int B3SOIPDdebug(B3SOIPDmodel*, B3SOIPDinstance*, CKTcircuit*, int); +extern int B3SOIPDcheckModel(B3SOIPDmodel*, B3SOIPDinstance*, CKTcircuit*); +#endif /*B3SOIPD*/ + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipddel.c b/src/spicelib/devices/bsim3soi_pd/b3soipddel.c index 4d646cbc6..125ebaa98 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipddel.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipddel.c @@ -2,11 +2,15 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soipddel.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ #include "ngspice.h" -#include #include "b3soipddef.h" #include "sperror.h" #include "gendefs.h" @@ -14,29 +18,25 @@ File: b3soipddel.c 98/5/01 int -B3SOIPDdelete (inModel, name, inInst) - GENmodel *inModel; - IFuid name; - GENinstance **inInst; +B3SOIPDdelete(GENmodel *inModel, IFuid name, GENinstance **inInst) { - B3SOIPDinstance **fast = (B3SOIPDinstance **) inInst; - B3SOIPDmodel *model = (B3SOIPDmodel *) inModel; - B3SOIPDinstance **prev = NULL; - B3SOIPDinstance *here; +B3SOIPDinstance **fast = (B3SOIPDinstance**)inInst; +B3SOIPDmodel *model = (B3SOIPDmodel*)inModel; +B3SOIPDinstance **prev = NULL; +B3SOIPDinstance *here; - for (; model; model = model->B3SOIPDnextModel) - { - prev = &(model->B3SOIPDinstances); - for (here = *prev; here; here = *prev) - { - if (here->B3SOIPDname == name || (fast && here == *fast)) - { - *prev = here->B3SOIPDnextInstance; - FREE (here); - return (OK); - } - prev = &(here->B3SOIPDnextInstance); - } + for (; model ; model = model->B3SOIPDnextModel) + { prev = &(model->B3SOIPDinstances); + for (here = *prev; here ; here = *prev) + { if (here->B3SOIPDname == name || (fast && here==*fast)) + { *prev= here->B3SOIPDnextInstance; + FREE(here); + return(OK); + } + prev = &(here->B3SOIPDnextInstance); + } } - return (E_NODEV); + return(E_NODEV); } + + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipddest.c b/src/spicelib/devices/bsim3soi_pd/b3soipddest.c index 47ea96a96..1389a55fb 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipddest.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipddest.c @@ -2,42 +2,41 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soipddest.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ #include "ngspice.h" -#include #include "b3soipddef.h" #include "suffix.h" void -B3SOIPDdestroy (inModel) - GENmodel **inModel; +B3SOIPDdestroy(GENmodel **inModel) { - B3SOIPDmodel **model = (B3SOIPDmodel **) inModel; - B3SOIPDinstance *here; - B3SOIPDinstance *prev = NULL; - B3SOIPDmodel *mod = *model; - B3SOIPDmodel *oldmod = NULL; +B3SOIPDmodel **model = (B3SOIPDmodel**)inModel; +B3SOIPDinstance *here; +B3SOIPDinstance *prev = NULL; +B3SOIPDmodel *mod = *model; +B3SOIPDmodel *oldmod = NULL; - for (; mod; mod = mod->B3SOIPDnextModel) - { - if (oldmod) - FREE (oldmod); - oldmod = mod; - prev = (B3SOIPDinstance *) NULL; - for (here = mod->B3SOIPDinstances; here; - here = here->B3SOIPDnextInstance) - { - if (prev) - FREE (prev); - prev = here; - } - if (prev) - FREE (prev); + for (; mod ; mod = mod->B3SOIPDnextModel) + { if(oldmod) FREE(oldmod); + oldmod = mod; + prev = (B3SOIPDinstance *)NULL; + for (here = mod->B3SOIPDinstances; here; here = here->B3SOIPDnextInstance) + { if(prev) FREE(prev); + prev = here; + } + if(prev) FREE(prev); } - if (oldmod) - FREE (oldmod); - *model = NULL; - return; + if(oldmod) FREE(oldmod); + *model = NULL; + return; } + + + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdext.h b/src/spicelib/devices/bsim3soi_pd/b3soipdext.h index 874bff3cf..ea2951794 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdext.h +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdext.h @@ -2,54 +2,29 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung File: b3soipdext.h +Modified by Paolo Nenzi 2002 **********/ -#ifdef __STDC__ -extern int B3SOIPDacLoad (GENmodel *, CKTcircuit *); -extern int B3SOIPDask (CKTcircuit *, GENinstance *, int, IFvalue *, - IFvalue *); -extern int B3SOIPDconvTest (GENmodel *, CKTcircuit *); -extern int B3SOIPDdelete (GENmodel *, IFuid, GENinstance **); -extern void B3SOIPDdestroy (GENmodel **); -extern int B3SOIPDgetic (GENmodel *, CKTcircuit *); -extern int B3SOIPDload (GENmodel *, CKTcircuit *); -extern int B3SOIPDmAsk (CKTcircuit *, GENmodel *, int, IFvalue *); -extern int B3SOIPDmDelete (GENmodel **, IFuid, GENmodel *); -extern int B3SOIPDmParam (int, IFvalue *, GENmodel *); -extern void B3SOIPDmosCap (CKTcircuit *, double, double, double, double, - double, double, double, double, double, double, - double, double, double, double, double, double, - double, double *, double *, double *, double *, - double *, double *, double *, double *, double *, - double *, double *, double *, double *, double *, - double *, double *); -extern int B3SOIPDparam (int, IFvalue *, GENinstance *, IFvalue *); -extern int B3SOIPDpzLoad (GENmodel *, CKTcircuit *, SPcomplex *); -extern int B3SOIPDsetup (SMPmatrix *, GENmodel *, CKTcircuit *, int *); -extern int B3SOIPDtemp (GENmodel *, CKTcircuit *); -extern int B3SOIPDtrunc (GENmodel *, CKTcircuit *, double *); -extern int B3SOIPDnoise (int, int, GENmodel *, CKTcircuit *, Ndata *, - double *); -extern int B3SOIPDunsetup (GENmodel *, CKTcircuit *); - -#else /* stdc */ -extern int B3SOIPDacLoad (); -extern int B3SOIPDdelete (); -extern void B3SOIPDdestroy (); -extern int B3SOIPDgetic (); -extern int B3SOIPDload (); -extern int B3SOIPDmDelete (); -extern int B3SOIPDask (); -extern int B3SOIPDmAsk (); -extern int B3SOIPDconvTest (); -extern int B3SOIPDtemp (); -extern int B3SOIPDmParam (); -extern void B3SOIPDmosCap (); -extern int B3SOIPDparam (); -extern int B3SOIPDpzLoad (); -extern int B3SOIPDsetup (); -extern int B3SOIPDtrunc (); -extern int B3SOIPDnoise (); -extern int B3SOIPDunsetup (); - -#endif /* stdc */ +extern int B3SOIPDacLoad(GENmodel *,CKTcircuit*); +extern int B3SOIPDask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); +extern int B3SOIPDconvTest(GENmodel *,CKTcircuit*); +extern int B3SOIPDdelete(GENmodel*,IFuid,GENinstance**); +extern void B3SOIPDdestroy(GENmodel**); +extern int B3SOIPDgetic(GENmodel*,CKTcircuit*); +extern int B3SOIPDload(GENmodel*,CKTcircuit*); +extern int B3SOIPDmAsk(CKTcircuit*,GENmodel *,int, IFvalue*); +extern int B3SOIPDmDelete(GENmodel**,IFuid,GENmodel*); +extern int B3SOIPDmParam(int,IFvalue*,GENmodel*); +extern void B3SOIPDmosCap(CKTcircuit*, double, double, double, double, + double, double, double, double, double, double, double, + double, double, double, double, double, double, double*, + double*, double*, double*, double*, double*, double*, double*, + double*, double*, double*, double*, double*, double*, double*, + double*); +extern int B3SOIPDparam(int,IFvalue*,GENinstance*,IFvalue*); +extern int B3SOIPDpzLoad(GENmodel*,CKTcircuit*,SPcomplex*); +extern int B3SOIPDsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); +extern int B3SOIPDtemp(GENmodel*,CKTcircuit*); +extern int B3SOIPDtrunc(GENmodel*,CKTcircuit*,double*); +extern int B3SOIPDnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); +extern int B3SOIPDunsetup(GENmodel*,CKTcircuit*); diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdgetic.c b/src/spicelib/devices/bsim3soi_pd/b3soipdgetic.c index 56df0e12f..c054d057b 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdgetic.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdgetic.c @@ -2,11 +2,15 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soipdgetic.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ #include "ngspice.h" -#include #include "cktdefs.h" #include "b3soipddef.h" #include "sperror.h" @@ -14,44 +18,41 @@ File: b3soipdgetic.c 98/5/01 int -B3SOIPDgetic (inModel, ckt) - GENmodel *inModel; - CKTcircuit *ckt; +B3SOIPDgetic(GENmodel *inModel, CKTcircuit *ckt) { - B3SOIPDmodel *model = (B3SOIPDmodel *) inModel; - B3SOIPDinstance *here; +B3SOIPDmodel *model = (B3SOIPDmodel*)inModel; +B3SOIPDinstance *here; - for (; model; model = model->B3SOIPDnextModel) - { - for (here = model->B3SOIPDinstances; here; - here = here->B3SOIPDnextInstance) - { - if (!here->B3SOIPDicVBSGiven) - { - here->B3SOIPDicVBS = *(ckt->CKTrhs + here->B3SOIPDbNode) - - *(ckt->CKTrhs + here->B3SOIPDsNode); - } - if (!here->B3SOIPDicVDSGiven) - { - here->B3SOIPDicVDS = *(ckt->CKTrhs + here->B3SOIPDdNode) - - *(ckt->CKTrhs + here->B3SOIPDsNode); - } - if (!here->B3SOIPDicVGSGiven) - { - here->B3SOIPDicVGS = *(ckt->CKTrhs + here->B3SOIPDgNode) - - *(ckt->CKTrhs + here->B3SOIPDsNode); - } - if (!here->B3SOIPDicVESGiven) - { - here->B3SOIPDicVES = *(ckt->CKTrhs + here->B3SOIPDeNode) - - *(ckt->CKTrhs + here->B3SOIPDsNode); - } - if (!here->B3SOIPDicVPSGiven) - { - here->B3SOIPDicVPS = *(ckt->CKTrhs + here->B3SOIPDpNode) - - *(ckt->CKTrhs + here->B3SOIPDsNode); - } - } + for (; model ; model = model->B3SOIPDnextModel) + { for (here = model->B3SOIPDinstances; here; here = here->B3SOIPDnextInstance) + { + + if (here->B3SOIPDowner != ARCHme) + continue; + + if(!here->B3SOIPDicVBSGiven) + { here->B3SOIPDicVBS = *(ckt->CKTrhs + here->B3SOIPDbNode) + - *(ckt->CKTrhs + here->B3SOIPDsNode); + } + if (!here->B3SOIPDicVDSGiven) + { here->B3SOIPDicVDS = *(ckt->CKTrhs + here->B3SOIPDdNode) + - *(ckt->CKTrhs + here->B3SOIPDsNode); + } + if (!here->B3SOIPDicVGSGiven) + { here->B3SOIPDicVGS = *(ckt->CKTrhs + here->B3SOIPDgNode) + - *(ckt->CKTrhs + here->B3SOIPDsNode); + } + if (!here->B3SOIPDicVESGiven) + { here->B3SOIPDicVES = *(ckt->CKTrhs + here->B3SOIPDeNode) + - *(ckt->CKTrhs + here->B3SOIPDsNode); + } + if (!here->B3SOIPDicVPSGiven) + { here->B3SOIPDicVPS = *(ckt->CKTrhs + here->B3SOIPDpNode) + - *(ckt->CKTrhs + here->B3SOIPDsNode); + } + } } - return (OK); + return(OK); } + + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c b/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c index 58148348b..ccd1c8a76 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdinit.c @@ -9,7 +9,7 @@ SPICEdev B3SOIPDinfo = { {"B3SOIPD", - "Berkeley SOI (PD) MOSFET model version 2.0", + "Berkeley SOI (PD) MOSFET model version 2.2.3", &B3SOIPDnSize, &B3SOIPDnSize, @@ -20,7 +20,7 @@ SPICEdev B3SOIPDinfo = { &B3SOIPDmPTSize, B3SOIPDmPTable, - + #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 */ @@ -34,45 +34,49 @@ SPICEdev B3SOIPDinfo = { 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} - , +#endif + + DEV_DEFAULT + + }, -DEVparam:B3SOIPDparam, -DEVmodParam:B3SOIPDmParam, -DEVload:B3SOIPDload, -DEVsetup:B3SOIPDsetup, -DEVunsetup:B3SOIPDunsetup, -DEVpzSetup:B3SOIPDsetup, -DEVtemperature:B3SOIPDtemp, -DEVtrunc:B3SOIPDtrunc, -DEVfindBranch:NULL, -DEVacLoad:B3SOIPDacLoad, -DEVaccept:NULL, -DEVdestroy:B3SOIPDdestroy, -DEVmodDelete:B3SOIPDmDelete, -DEVdelete:B3SOIPDdelete, -DEVsetic:B3SOIPDgetic, -DEVask:B3SOIPDask, -DEVmodAsk:B3SOIPDmAsk, -DEVpzLoad:B3SOIPDpzLoad, -DEVconvTest:B3SOIPDconvTest, -DEVsenSetup:NULL, -DEVsenLoad:NULL, -DEVsenUpdate:NULL, -DEVsenAcLoad:NULL, -DEVsenPrint:NULL, -DEVsenTrunc:NULL, -DEVdisto:NULL, -DEVnoise:B3SOIPDnoise, - -DEVinstSize:&B3SOIPDiSize, -DEVmodSize:&B3SOIPDmSize + DEVparam: B3SOIPDparam, + DEVmodParam: B3SOIPDmParam, + DEVload: B3SOIPDload, + DEVsetup: B3SOIPDsetup, + DEVunsetup: B3SOIPDunsetup, + DEVpzSetup: B3SOIPDsetup, + DEVtemperature: B3SOIPDtemp, + DEVtrunc: B3SOIPDtrunc, + DEVfindBranch: NULL, + DEVacLoad: B3SOIPDacLoad, + DEVaccept: NULL, + DEVdestroy: B3SOIPDdestroy, + DEVmodDelete: B3SOIPDmDelete, + DEVdelete: B3SOIPDdelete, + DEVsetic: B3SOIPDgetic, + DEVask: B3SOIPDask, + DEVmodAsk: B3SOIPDmAsk, + DEVpzLoad: B3SOIPDpzLoad, + DEVconvTest: B3SOIPDconvTest, + DEVsenSetup: NULL, + DEVsenLoad: NULL, + DEVsenUpdate: NULL, + DEVsenAcLoad: NULL, + DEVsenPrint: NULL, + DEVsenTrunc: NULL, + DEVdisto: NULL, + DEVnoise: B3SOIPDnoise, +#ifdef CIDER + DEVdump: NULL, + DEVacct: NULL, +#endif + DEVinstSize: &B3SOIPDiSize, + DEVmodSize: &B3SOIPDmSize }; SPICEdev * -get_bsim3soipd_info (void) +get_b3soipd_info (void) { return &B3SOIPDinfo; } diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipditf.h b/src/spicelib/devices/bsim3soi_pd/b3soipditf.h index 2d2c6a987..2f5ce892f 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipditf.h +++ b/src/spicelib/devices/bsim3soi_pd/b3soipditf.h @@ -8,6 +8,6 @@ File: b3soipditf.h #include "b3soipdext.h" -SPICEdev *get_bsim3soipd_info (void); +SPICEdev *get_b3soipd_info (void); #endif diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdld.c b/src/spicelib/devices/bsim3soi_pd/b3soipdld.c index d766d2381..495326c1f 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdld.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdld.c @@ -7,12 +7,17 @@ Modified by Pin Su 99/4/30 Modified by Pin Su, Wei Jin 99/9/27 Modified by Pin Su 00/3/1 Modified by Pin Su 00/8/15 +Modified by Pin Su 01/2/15 +Modified by Pin Su and Hui Wan 02/3/5 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "b3soipddef.h" #include "trandefs.h" @@ -24,8 +29,8 @@ Modified by Pin Su 00/8/15 #define EPSOX 3.453133e-11 #define EPSSI 1.03594e-10 #define Charge_q 1.60219e-19 -#define KboQ 8.617087e-5 /* Kb / q */ -#define Eg300 1.115 /* energy gap at 300K */ +#define KboQ 8.617087e-5 /* Kb / q */ +#define Eg300 1.115 /* energy gap at 300K */ #define DELTA_1 0.02 #define DELTA_2 0.02 #define DELTA_3 0.02 @@ -60,4577 +65,4104 @@ Modified by Pin Su 00/8/15 */ double -B3SOIPDlimit (vnew, vold, limit, check) - double vnew; - double vold; - double limit; - int *check; +B3SOIPDlimit(double vnew, double vold, double limit, int *check) { - double T0, T1; + double T0, T1; - if (isnan (vnew) || isnan (vold)) + if (isnan (vnew) || isnan (vold)) { - fprintf (stderr, - "Alberto says: YOU TURKEY! The limiting function received NaN.\n"); - fprintf (stderr, "New prediction returns to 0.0!\n"); - vnew = 0.0; - *check = 1; + fprintf(stderr, "Alberto says: YOU TURKEY! The limiting function received NaN.\n"); + fprintf(stderr, "New prediction returns to 0.0!\n"); + vnew = 0.0; + *check = 1; } - T0 = vnew - vold; - T1 = fabs (T0); - if (T1 > limit) - { - if (T0 > 0.0) - vnew = vold + limit; - else - vnew = vold - limit; - *check = 1; + T0 = vnew - vold; + T1 = fabs(T0); + if (T1 > limit) { + if (T0 > 0.0) + vnew = vold + limit; + else + vnew = vold - limit; + *check = 1; } - return vnew; + return vnew; } int -B3SOIPDload (inModel, ckt) - GENmodel *inModel; - CKTcircuit *ckt; +B3SOIPDload(GENmodel *inModel, CKTcircuit *ckt) { - B3SOIPDmodel *model = (B3SOIPDmodel *) inModel; - B3SOIPDinstance *here; - int selfheat; - - double SourceSatCurrent, DrainSatCurrent, Gmin; - double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst; - double cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; - double evbd, evbs, arg, sarg; - double delvbd, delvbs, delvds, delvgd, delvgs; - double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4; - double tol, PhiB, PhiBSWG, MJSWG; - double gcgdb, gcggb, gcgsb, gcgeb, gcgT; - double gcsdb, gcsgb, gcssb, gcseb, gcsT; - double gcddb, gcdgb, gcdsb, gcdeb, gcdT; - double gcbdb, gcbgb, gcbsb, gcbeb, gcbT; - double gcedb, gcegb, gcesb, gceeb, gceT; - double gcTt, gTtg, gTtb, gTtdp, gTtt, gTtsp; - double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact; - double vg, vd, vs, vp, ve, vb; - double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; - double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVfb_dT; - double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd, - dVth_dT; - double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm; - double Vgdt, Vgsaddvth, Vgsaddvth2, Vgsaddvth1o3, n, dn_dVb, Vtm; - double ExpArg, V0; - double ueff, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT; - double Esat, dEsat_dVg, dEsat_dVd, dEsat_dVb, Vdsat, Vdsat0; - double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT; - double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat, dAlphaz_dVg, - dAlphaz_dVb; - double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT; - double Va, Va2, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT; - double Vbseff, dVbseff_dVb; - double Alphaz, CoxWL; - double dVgdt_dVg, dVgdt_dVd, dVgdt_dVb; - double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dVrg, dT0_dT; - double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dT; - double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dT; - double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dT; - double T4, dT4_dVg, dT4_dVd, dT4_dVb, dT4_dT; - double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT; - double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dT; - double T7, dT7_dVg, dT7_dVd, dT7_dVb; - double T8, dT8_dVg, dT8_dVd, dT8_dVb, dT8_dVrg; - double T9, dT9_dVg, dT9_dVd, dT9_dVb, dT9_dVrg; - double T10, dT10_dVg, dT10_dVb, dT10_dVd; - double T11, T12; - double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; - double T100, T101; - double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT; - double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT; - double VAHCE, dVAHCE_dVg, dVAHCE_dVd, dVAHCE_dVb; - double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb; - double Delt_vth, dDelt_vth_dVb, dDelt_vth_dT; - double Theta0, dTheta0_dVb, Theta1, dTheta1_dVb; - double Thetarout, dThetarout_dVb, TempRatio, tmp1, tmp2, tmp3, tmp4; - double DIBL_Sft, dDIBL_Sft_dVd, DIBL_fact, Lambda, dLambda_dVg; - double Rout_Vgs_factor, dRout_Vgs_factor_dVg, dRout_Vgs_factor_dVb; - double dRout_Vgs_factor_dVd; - double tempv, a1; - - double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb, dVgsteff_dT; - double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT; - double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; - double diffVds, diffVdsCV; - double dAbulk_dVg, dn_dVd; - double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dT; - double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dT; - double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb, dfgche1_dT; - double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb, dfgche2_dT; - double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dT; - double Ids, Gm, Gds, Gmb; - double CoxWovL; - double Rds, dRds_dVg, dRds_dVb, dRds_dT, WVCox, WVCoxRds; - double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVd, dVdsatCV_dVg, - dVdsatCV_dVb; - double Leff, Weff, dWeff_dVg, dWeff_dVb; - double AbulkCV, dAbulkCV_dVb; - double qgdo, qgso, cgdo, cgso; - - double dxpart, sxpart; - - struct b3soipdSizeDependParam *pParam; - int ByPass, Check, ChargeComputationNeeded, J, error, I; - double junk[50]; - - double gbbsp, gbbdp, gbbg, gbbb, gbbp, gbbT; - double gddpsp, gddpdp, gddpg, gddpb, gddpT; - double gsspsp, gsspdp, gsspg, gsspb, gsspT; - double Gbpbs, Gbpps; - double vse, vde, ves, ved, veb, vge, delves, vedo, delved; - double vps, vpd, Vps, delvps; - double Vbd, Ves, Vesfb, sqrtXdep, DeltVthtemp, dDeltVthtemp_dT; - double Vbp, dVbp_dVb; - double DeltVthw, dDeltVthw_dVb, dDeltVthw_dT; - double Gm0, Gds0, Gmb0, GmT0, Gmc, GmT; - double dDIBL_Sft_dVb; - double diffVdsii; - double Idgidl, Gdgidld, Gdgidlg, Isgidl, Gsgidlg; - double Gjsd, Gjss, Gjsb, GjsT, Gjdd, Gjdb, GjdT; - double Ibp, Iii, Giid, Giig, Giib, GiiT, Gcd, Gcb, GcT, ceqbody, ceqbodcon; - double gppb, gppp, gppT; - double delTemp, deldelTemp, Temp; - double ceqth, ceqqth; - double K1, WL; - double qjs, gcjsbs, gcjsT; - double qjd, gcjdbs, gcjdds, gcjdT; - double qge; - double ceqqe; - double ni, Eg, Cbox, Nfb, CboxWL; - double cjsbs; - double dVfbeff_dVrg; - double qinv, qgate, qbody, qdrn, qsrc, qsub, cqgate, cqbody, cqdrn, cqsub, - cqtemp; - double Cgg, Cgd, Cgs, Cgb, Cdg, Cdd, Cds, Cdb, Qg, Qd; - double Csg, Csd, Css, Csb, Cbg, Cbd, Cbs, Cbb, Qs, Qb; - double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1; - double Vbseff0; - double Vdsatii, dVdsatii_dVg, dVdsatii_dVd, dVdsatii_dVb, dVdsatii_dT; - double Ibjt, dIbjt_dVb, dIbjt_dVd, dIbjt_dT; - double Ibs1, dIbs1_dVb, dIbs1_dT; - double Ibs2, dIbs2_dVb, dIbs2_dT; - double Ibs3, dIbs3_dVb, dIbs3_dVd, dIbs3_dT; - double Ibs4, dIbs4_dVb, dIbs4_dT; - double Ibd1, dIbd1_dVb, dIbd1_dVd, dIbd1_dT; - double Ibd2, dIbd2_dVb, dIbd2_dVd, dIbd2_dT; - double Ibd3, dIbd3_dVb, dIbd3_dVd, dIbd3_dT; - double Ibd4, dIbd4_dVb, dIbd4_dVd, dIbd4_dT; - double ExpVbs1, dExpVbs1_dVb, dExpVbs1_dT; - double ExpVbs2, dExpVbs2_dVb, dExpVbs2_dT; - double ExpVbs4, dExpVbs4_dVb, dExpVbs4_dT; - double ExpVbd1, dExpVbd1_dVb, dExpVbd1_dT; - double ExpVbd2, dExpVbd2_dVb, dExpVbd2_dT; - double ExpVbd4, dExpVbd4_dVb, dExpVbd4_dT; - double WTsi, NVtm1, NVtm2; - double Ic, dIc_dVb, dIc_dVd; - double Ibs, dIbs_dVb, dIbs_dVd; - double Ibd, dIbd_dVb; - double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb, dDenomi_dT; - double Qsub0, dQsub0_dVg, dQsub0_dVb, dQsub0_dVd; - double Qac0, dQac0_dVb, dQac0_dVd; - double Qdep0, dQdep0_dVb; - double Qe1, dQe1_dVb, dQe1_dVe, dQe1_dT; - double Ce1b, Ce1e, Ce1T; - double dQac0_dVrg, dQsub0_dVrg; +B3SOIPDmodel *model = (B3SOIPDmodel*)inModel; +B3SOIPDinstance *here; +int selfheat; + +double SourceSatCurrent, DrainSatCurrent, Gmin; +double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst; +double cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; +double evbd, evbs, arg, sarg; +double delvbd, delvbs, delvds, delvgd, delvgs; +double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4; +double tol, PhiB, PhiBSWG, MJSWG; +double gcgdb, gcggb, gcgsb, gcgeb, gcgT; +double gcsdb, gcsgb, gcssb, gcseb, gcsT; +double gcddb, gcdgb, gcdsb, gcdeb, gcdT; +double gcbdb, gcbgb, gcbsb, gcbeb, gcbT; +double gcedb, gcegb, gcesb, gceeb, gceT; +double gcTt, gTtg, gTtb, gTtdp, gTtt, gTtsp; +double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact; +double vg, vd, vs, vp, ve, vb; +double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; +double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVfb_dT; +double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd, dVth_dT; +double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm; +double Vgdt, Vgsaddvth, Vgsaddvth2, Vgsaddvth1o3, n, dn_dVb, Vtm; +double ExpArg, V0; +double ueff, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT; +double Esat, dEsat_dVg, dEsat_dVd, dEsat_dVb, Vdsat, Vdsat0; +double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT; +double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat, dAlphaz_dVg, dAlphaz_dVb; +double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT; +double Va, Va2, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT; +double Vbseff, dVbseff_dVb; +double Alphaz, CoxWL; +double dVgdt_dVg, dVgdt_dVd, dVgdt_dVb; +double T0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dVrg, dT0_dT; +double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dT; +double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dT; +double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dT; +double T4, dT4_dVg, dT4_dVd, dT4_dVb, dT4_dT; +double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT; +double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dT; +double T7, dT7_dVg, dT7_dVd, dT7_dVb; +double T8, dT8_dVg, dT8_dVd, dT8_dVb, dT8_dVrg; +double T9, dT9_dVg, dT9_dVd, dT9_dVb, dT9_dVrg; +double T10, dT10_dVg, dT10_dVb, dT10_dVd; +double T11, T12; +double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; +double T100, T101; +double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT; +double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT; +double VAHCE, dVAHCE_dVg, dVAHCE_dVd, dVAHCE_dVb; +double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb; +double Delt_vth, dDelt_vth_dVb, dDelt_vth_dT; +double Theta0, dTheta0_dVb, Theta1, dTheta1_dVb; +double Thetarout, dThetarout_dVb, TempRatio, tmp1, tmp2, tmp3, tmp4; +double DIBL_Sft, dDIBL_Sft_dVd, DIBL_fact, Lambda, dLambda_dVg; +double Rout_Vgs_factor, dRout_Vgs_factor_dVg, dRout_Vgs_factor_dVb; +double dRout_Vgs_factor_dVd; +double tempv, a1; + +double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb, dVgsteff_dT; +double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT; +double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; +double diffVds, diffVdsCV; +double dAbulk_dVg, dn_dVd ; +double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dT; +double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dT; +double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb, dfgche1_dT; +double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb, dfgche2_dT; +double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dT; +double Ids, Gm, Gds, Gmb; +double CoxWovL; +double Rds, dRds_dVg, dRds_dVb, dRds_dT, WVCox, WVCoxRds; +double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVd, dVdsatCV_dVg, dVdsatCV_dVb; +double Leff, Weff, dWeff_dVg, dWeff_dVb; +double AbulkCV, dAbulkCV_dVb; +double qgdo, qgso, cgdo, cgso; + +double dxpart, sxpart; + +struct b3soipdSizeDependParam *pParam; +int ByPass, Check, ChargeComputationNeeded, J, error, I; +double junk[50]; + +double gbbsp, gbbdp, gbbg, gbbb, gbbp, gbbT; +double gddpsp, gddpdp, gddpg, gddpb, gddpT; +double gsspsp, gsspdp, gsspg, gsspb, gsspT; +double Gbpbs, Gbpps; +double vse, vde, ves, ved, veb, vge, delves, vedo, delved; +double vps, vpd, Vps, delvps; +double Vbd, Ves, Vesfb, sqrtXdep, DeltVthtemp, dDeltVthtemp_dT; +double Vbp, dVbp_dVb; +double DeltVthw, dDeltVthw_dVb, dDeltVthw_dT; +double Gm0, Gds0, Gmb0, GmT0, Gmc, GmT; +double dDIBL_Sft_dVb; +double diffVdsii ; +double Idgidl, Gdgidld, Gdgidlg, Isgidl, Gsgidlg; +double Gjsd, Gjss, Gjsb, GjsT, Gjdd, Gjdb, GjdT; +double Ibp, Iii, Giid, Giig, Giib, GiiT, Gcd, Gcb, GcT, ceqbody, ceqbodcon; +double gppb, gppp, gppT; +double delTemp, deldelTemp, Temp; +double ceqth, ceqqth; +double K1, WL; +double qjs, gcjsbs, gcjsT; +double qjd, gcjdbs, gcjdds, gcjdT; +double qge; +double ceqqe; +double ni, Eg, Cbox, Nfb, CboxWL; +double cjsbs; +double dVfbeff_dVrg; +double qinv, qgate, qbody, qdrn, qsrc, qsub, cqgate, cqbody, cqdrn, cqsub, cqtemp; +double Cgg, Cgd, Cgs, Cgb, Cdg, Cdd, Cds, Cdb, Qg, Qd; +double Csg, Csd, Css, Csb, Cbg, Cbd, Cbs, Cbb, Qs, Qb; +double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1; +double Vbseff0; +double Vdsatii ,dVdsatii_dVg ,dVdsatii_dVd, dVdsatii_dVb, dVdsatii_dT; +double Ibjt ,dIbjt_dVb ,dIbjt_dVd ,dIbjt_dT; +double Ibs1 ,dIbs1_dVb ,dIbs1_dT; +double Ibs2 ,dIbs2_dVb ,dIbs2_dT; +double Ibs3 ,dIbs3_dVb ,dIbs3_dVd, dIbs3_dT; +double Ibs4 ,dIbs4_dVb ,dIbs4_dT; +double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT; +double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT; +double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT; +double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT; +double ExpVbs1, dExpVbs1_dVb, dExpVbs1_dT; +double ExpVbs2, dExpVbs2_dVb, dExpVbs2_dT; +double ExpVbs4, dExpVbs4_dVb, dExpVbs4_dT; +double ExpVbd1, dExpVbd1_dVb, dExpVbd1_dT; +double ExpVbd2, dExpVbd2_dVb, dExpVbd2_dT; +double ExpVbd4, dExpVbd4_dVb, dExpVbd4_dT; +double WTsi, NVtm1, NVtm2; +double Ic ,dIc_dVb ,dIc_dVd; +double Ibs ,dIbs_dVb ,dIbs_dVd ; +double Ibd ,dIbd_dVb; +double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb ,dDenomi_dT; +double Qsub0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd ; +double Qac0 ,dQac0_dVb ,dQac0_dVd; +double Qdep0 ,dQdep0_dVb; +double Qe1 , dQe1_dVb, dQe1_dVe, dQe1_dT; +double Ce1b ,Ce1e, Ce1T; +double dQac0_dVrg, dQsub0_dVrg; /* for self-heating */ - double vbi, vfbb, phi, sqrtPhi, Xdep0, jbjt, jdif, jrec, jtun, u0temp, - vsattemp; - double rds0, ua, ub, uc; - double dvbi_dT, dvfbb_dT, djbjt_dT, djdif_dT, djrec_dT, djtun_dT, - du0temp_dT; - double dvsattemp_dT, drds0_dT, dua_dT, dub_dT, duc_dT, dni_dT, dVtm_dT; - double dVfbeff_dT, dQac0_dT, dQsub0_dT; - double CbT, CsT, CgT, CeT; +double vbi, vfbb, phi, sqrtPhi, Xdep0, jbjt, jdif, jrec, jtun, u0temp, vsattemp; +double rds0, ua, ub, uc; +double dvbi_dT, dvfbb_dT, djbjt_dT, djdif_dT, djrec_dT, djtun_dT, du0temp_dT; +double dvsattemp_dT, drds0_dT, dua_dT, dub_dT, duc_dT, dni_dT, dVtm_dT; +double dVfbeff_dT, dQac0_dT, dQsub0_dT; +double CbT, CsT, CgT, CeT; /* v2.0 release */ - double Vbsh, dVbsh_dVb; - double sqrtPhisExt, dsqrtPhisExt_dVb; - double T13, T14; - double dT11_dVb, dT13_dVb, dT14_dVb; - double dVgst_dVd; - double Vdsatii0, dVdsatii0_dT; - double VgsStep, dVgsStep_dT, Ratio, dRatio_dVg, dRatio_dVb, dRatio_dVd, - dRatio_dT, dTempRatio_dT; - double Vdiff, dVdiff_dVg, dVdiff_dVb, dVdiff_dVd, dVdiff_dT; - double dNVtm1_dT, dNVtm2_dT; - double NVtmf, NVtmr, dNVtmf_dT, dNVtmr_dT; - double TempRatioMinus1; - double Ahli, dAhli_dT; - double WsTsi, WdTsi; - double dPhiBSWG_dT, dcjsbs_dT, darg_dT, ddT3_dVb_dT; - double dT7_dT, dT0_dT7, dT1_dT7, dT2_dT7; - double CoxWLb, CoxWLcenb; - double ExpVbsNVtm, dExpVbsNVtm_dVb, dExpVbsNVtm_dT; - double ExpVbdNVtm, dExpVbdNVtm_dVb, dExpVbdNVtm_dVd, dExpVbdNVtm_dT; - double Ien, dIen_dT, Iendif, dIendif_dT; - double Ibsdif, dIbsdif_dVb, dIbsdif_dT; - double Ibddif, dIbddif_dVb, dIbddif_dVd, dIbddif_dT; - double Ehlis, dEhlis_dVb, dEhlis_dT; - double EhlisFactor, dEhlisFactor_dVb, dEhlisFactor_dT; - double Ehlid, dEhlid_dVb, dEhlid_dVd, dEhlid_dT; - double EhlidFactor, dEhlidFactor_dVb, dEhlidFactor_dVd, dEhlidFactor_dT; - double E2ndFactor, dE2ndFactor_dVb, dE2ndFactor_dVd, dE2ndFactor_dT; - double dT10_dT, dT11_dT, DioMax; - double cjdbs, dcjdbs_dT; - double wdios, wdiod, wdiosCV, wdiodCV; +double Vbsh, dVbsh_dVb; +double sqrtPhisExt, dsqrtPhisExt_dVb; +double T13, T14; +double dT11_dVb, dT13_dVb, dT14_dVb; +double dVgst_dVd; +double Vdsatii0, dVdsatii0_dT; +double VgsStep, dVgsStep_dT, Ratio, dRatio_dVg, dRatio_dVb, dRatio_dVd, dRatio_dT, dTempRatio_dT; +double Vdiff, dVdiff_dVg, dVdiff_dVb, dVdiff_dVd, dVdiff_dT; +double dNVtm1_dT, dNVtm2_dT; +double NVtmf, NVtmr, dNVtmf_dT, dNVtmr_dT; +double TempRatioMinus1; +double Ahli, dAhli_dT; +double WsTsi, WdTsi; +double dPhiBSWG_dT, dcjsbs_dT, darg_dT, ddT3_dVb_dT; +double dT7_dT, dT0_dT7, dT1_dT7, dT2_dT7; +double CoxWLb, CoxWLcenb; +double ExpVbsNVtm, dExpVbsNVtm_dVb, dExpVbsNVtm_dT; +double ExpVbdNVtm, dExpVbdNVtm_dVb, dExpVbdNVtm_dVd, dExpVbdNVtm_dT; +double Ien, dIen_dT, Iendif, dIendif_dT; +double Ibsdif, dIbsdif_dVb, dIbsdif_dT; +double Ibddif, dIbddif_dVb, dIbddif_dVd, dIbddif_dT; +double Ehlis, dEhlis_dVb, dEhlis_dT; +double EhlisFactor, dEhlisFactor_dVb, dEhlisFactor_dT; +double Ehlid, dEhlid_dVb, dEhlid_dVd, dEhlid_dT; +double EhlidFactor, dEhlidFactor_dVb, dEhlidFactor_dVd, dEhlidFactor_dT; +double E2ndFactor, dE2ndFactor_dVb, dE2ndFactor_dVd, dE2ndFactor_dT; +double dT10_dT, dT11_dT, DioMax; +double cjdbs, dcjdbs_dT; +double wdios, wdiod, wdiosCV, wdiodCV; /* for capMod3 */ - double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVb, LINK, Ccen, Coxeff, - dCoxeff_dVg, dCoxeff_dVb; - double CoxWLcen, QovCox, dQac0_dVg, DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dVd, - dDeltaPhi_dVb; - double dTcen_dVd, dTcen_dT, dCoxeff_dVd, dCoxeff_dT, dCoxWLcenb_dT, qinoi, - qbulk; - double T3zb, lt1zb, ltwzb, Theta0zb; - double Delt_vthzb, dDelt_vthzb_dT; - double DeltVthwzb, dDeltVthwzb_dT; - double DeltVthtempzb, dDeltVthtempzb_dT; - double Vthzb, dVthzb_dT, Vfbzb, dVfbzb_dT; +double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVb, LINK, Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVb; +double CoxWLcen, QovCox, dQac0_dVg, DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dVd, dDeltaPhi_dVb; +double dTcen_dVd, dTcen_dT, dCoxeff_dVd, dCoxeff_dT, dCoxWLcenb_dT, qinoi, qbulk; +double T3zb, lt1zb, ltwzb, Theta0zb; +double Delt_vthzb, dDelt_vthzb_dT; +double DeltVthwzb, dDeltVthwzb_dT; +double DeltVthtempzb, dDeltVthtempzb_dT; +double Vthzb, dVthzb_dT, Vfbzb, dVfbzb_dT; /* v2.2 release */ - double Vgb, dVgb_dVg, dVgb_dVb, Vox, dVox_dVg, dVox_dVd, dVox_dVb; - double OxideRatio, Vaux, dVaux_dVg, dVaux_dVd, dVaux_dVb; - double Igb, dIgb_dVg, dIgb_dVd, dIgb_dVb; - double ceqgate; - double dT0_dVox, Voxeff, dVoxeff_dVox; - double dVox_dT, dVaux_dT, dIgb_dT; - double Voxacc, dVoxacc_dVg, dVoxacc_dVd, dVoxacc_dVb, dVoxacc_dT; - double Voxdepinv, dVoxdepinv_dVg, dVoxdepinv_dVb, dVoxdepinv_dVd, - dVoxdepinv_dT; - double Igb1, dIgb1_dVg, dIgb1_dVd, dIgb1_dVb, dIgb1_dT; - double Igb2, dIgb2_dVg, dIgb2_dVd, dIgb2_dVb, dIgb2_dT; - double gigs, gigd, gigb, gigg; - double gigT; - - - for (; model != NULL; model = model->B3SOIPDnextModel) - { - for (here = model->B3SOIPDinstances; here != NULL; - here = here->B3SOIPDnextInstance) - { - Check = 0; - ByPass = 0; - selfheat = (model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0 != 0.0); +double Vgb, dVgb_dVg, dVgb_dVb, Vox, dVox_dVg, dVox_dVd, dVox_dVb; +double OxideRatio, Vaux, dVaux_dVg, dVaux_dVd, dVaux_dVb; +double Igb, dIgb_dVg, dIgb_dVd, dIgb_dVb; +double ceqgate; +double dT0_dVox, Voxeff, dVoxeff_dVox; +double dVox_dT, dVaux_dT, dIgb_dT; +double Voxacc, dVoxacc_dVg, dVoxacc_dVd, dVoxacc_dVb, dVoxacc_dT; +double Voxdepinv, dVoxdepinv_dVg, dVoxdepinv_dVb, dVoxdepinv_dVd, dVoxdepinv_dT; +double Igb1, dIgb1_dVg, dIgb1_dVd, dIgb1_dVb, dIgb1_dT; +double Igb2, dIgb2_dVg, dIgb2_dVd, dIgb2_dVb, dIgb2_dT; +double gigs, gigd, gigb, gigg; +double gigT; + +double m; + +for (; model != NULL; model = model->B3SOIPDnextModel) +{ for (here = model->B3SOIPDinstances; here != NULL; + here = here->B3SOIPDnextInstance) + { + + if (here->B3SOIPDowner != ARCHme) + continue; + + Check = 0; + ByPass = 0; + selfheat = (model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0 != 0.0); pParam = here->pParam; - if ((ckt->CKTmode & MODEINITSMSIG)) - { - vs = *(ckt->CKTrhsOld + here->B3SOIPDsNodePrime); - if (!here->B3SOIPDvbsusrGiven) - { - vbs = *(ckt->CKTstate0 + here->B3SOIPDvbs); - vb = *(ckt->CKTrhsOld + here->B3SOIPDbNode); - } - else - { - vbs = here->B3SOIPDvbsusr; - vb = here->B3SOIPDvbsusr + vs; - } - vgs = *(ckt->CKTstate0 + here->B3SOIPDvgs); - ves = *(ckt->CKTstate0 + here->B3SOIPDves); - vps = *(ckt->CKTstate0 + here->B3SOIPDvps); - vds = *(ckt->CKTstate0 + here->B3SOIPDvds); - delTemp = *(ckt->CKTstate0 + here->B3SOIPDdeltemp); - - vg = *(ckt->CKTrhsOld + here->B3SOIPDgNode); - vd = *(ckt->CKTrhsOld + here->B3SOIPDdNodePrime); - vp = *(ckt->CKTrhsOld + here->B3SOIPDpNode); - ve = *(ckt->CKTrhsOld + here->B3SOIPDeNode); - - } + if ((ckt->CKTmode & MODEINITSMSIG)) + { + vs = *(ckt->CKTrhsOld + here->B3SOIPDsNodePrime); + if (!here->B3SOIPDvbsusrGiven) { + vbs = *(ckt->CKTstate0 + here->B3SOIPDvbs); + vb = *(ckt->CKTrhsOld + here->B3SOIPDbNode); + } + else { + vbs = here->B3SOIPDvbsusr; + vb = here->B3SOIPDvbsusr + vs; + } + vgs = *(ckt->CKTstate0 + here->B3SOIPDvgs); + ves = *(ckt->CKTstate0 + here->B3SOIPDves); + vps = *(ckt->CKTstate0 + here->B3SOIPDvps); + vds = *(ckt->CKTstate0 + here->B3SOIPDvds); + delTemp = *(ckt->CKTstate0 + here->B3SOIPDdeltemp); + + vg = *(ckt->CKTrhsOld + here->B3SOIPDgNode); + vd = *(ckt->CKTrhsOld + here->B3SOIPDdNodePrime); + vp = *(ckt->CKTrhsOld + here->B3SOIPDpNode); + ve = *(ckt->CKTrhsOld + here->B3SOIPDeNode); + + } else if ((ckt->CKTmode & MODEINITTRAN)) - { - vs = *(ckt->CKTrhsOld + here->B3SOIPDsNodePrime); - if (!here->B3SOIPDvbsusrGiven) - { - vbs = *(ckt->CKTstate1 + here->B3SOIPDvbs); - vb = *(ckt->CKTrhsOld + here->B3SOIPDbNode); - } - else - { - vbs = here->B3SOIPDvbsusr; - vb = here->B3SOIPDvbsusr + vs; - } - vgs = *(ckt->CKTstate1 + here->B3SOIPDvgs); - ves = *(ckt->CKTstate1 + here->B3SOIPDves); - vps = *(ckt->CKTstate1 + here->B3SOIPDvps); - vds = *(ckt->CKTstate1 + here->B3SOIPDvds); - delTemp = *(ckt->CKTstate1 + here->B3SOIPDdeltemp); - - vg = *(ckt->CKTrhsOld + here->B3SOIPDgNode); - vd = *(ckt->CKTrhsOld + here->B3SOIPDdNodePrime); - vp = *(ckt->CKTrhsOld + here->B3SOIPDpNode); - ve = *(ckt->CKTrhsOld + here->B3SOIPDeNode); - - } + { + vs = *(ckt->CKTrhsOld + here->B3SOIPDsNodePrime); + if (!here->B3SOIPDvbsusrGiven) { + vbs = *(ckt->CKTstate1 + here->B3SOIPDvbs); + vb = *(ckt->CKTrhsOld + here->B3SOIPDbNode); + } + else { + vbs = here->B3SOIPDvbsusr; + vb = here->B3SOIPDvbsusr + vs; + } + vgs = *(ckt->CKTstate1 + here->B3SOIPDvgs); + ves = *(ckt->CKTstate1 + here->B3SOIPDves); + vps = *(ckt->CKTstate1 + here->B3SOIPDvps); + vds = *(ckt->CKTstate1 + here->B3SOIPDvds); + delTemp = *(ckt->CKTstate1 + here->B3SOIPDdeltemp); + + vg = *(ckt->CKTrhsOld + here->B3SOIPDgNode); + vd = *(ckt->CKTrhsOld + here->B3SOIPDdNodePrime); + vp = *(ckt->CKTrhsOld + here->B3SOIPDpNode); + ve = *(ckt->CKTrhsOld + here->B3SOIPDeNode); + + } else if ((ckt->CKTmode & MODEINITJCT) && !here->B3SOIPDoff) - { - vds = model->B3SOIPDtype * here->B3SOIPDicVDS; - vgs = model->B3SOIPDtype * here->B3SOIPDicVGS; - ves = model->B3SOIPDtype * here->B3SOIPDicVES; - vbs = model->B3SOIPDtype * here->B3SOIPDicVBS; - vps = model->B3SOIPDtype * here->B3SOIPDicVPS; + { vds = model->B3SOIPDtype * here->B3SOIPDicVDS; + vgs = model->B3SOIPDtype * here->B3SOIPDicVGS; + ves = model->B3SOIPDtype * here->B3SOIPDicVES; + vbs = model->B3SOIPDtype * here->B3SOIPDicVBS; + vps = model->B3SOIPDtype * here->B3SOIPDicVPS; vg = vd = vs = vp = ve = 0.0; - delTemp = 0.0; + delTemp = 0.0; here->B3SOIPDphi = pParam->B3SOIPDphi; - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC | MODEDCOP | - MODEDCTRANCURVE)) - || (!(ckt->CKTmode & MODEUIC)))) - { - vbs = 0.0; - vgs = model->B3SOIPDtype * 0.1 + pParam->B3SOIPDvth0; + if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && + ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | + MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) + { vbs = 0.0; + vgs = model->B3SOIPDtype*0.1 + pParam->B3SOIPDvth0; vds = 0.0; ves = 0.0; vps = 0.0; - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->B3SOIPDoff)) - { - delTemp = vps = vbs = vgs = vds = ves = 0.0; - vg = vd = vs = vp = ve = 0.0; - } + } + } + else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && + (here->B3SOIPDoff)) + { delTemp = vps = vbs = vgs = vds = ves = 0.0; + vg = vd = vs = vp = ve = 0.0; + } else - { + { #ifndef PREDICTOR - if ((ckt->CKTmode & MODEINITPRED)) - { - xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->B3SOIPDvbs) = - *(ckt->CKTstate1 + here->B3SOIPDvbs); - vbs = (1.0 + xfact) * (*(ckt->CKTstate1 + here->B3SOIPDvbs)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDvbs))); - *(ckt->CKTstate0 + here->B3SOIPDvgs) = - *(ckt->CKTstate1 + here->B3SOIPDvgs); - vgs = (1.0 + xfact) * (*(ckt->CKTstate1 + here->B3SOIPDvgs)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDvgs))); - *(ckt->CKTstate0 + here->B3SOIPDves) = - *(ckt->CKTstate1 + here->B3SOIPDves); - ves = (1.0 + xfact) * (*(ckt->CKTstate1 + here->B3SOIPDves)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDves))); - *(ckt->CKTstate0 + here->B3SOIPDvps) = - *(ckt->CKTstate1 + here->B3SOIPDvps); - vps = (1.0 + xfact) * (*(ckt->CKTstate1 + here->B3SOIPDvps)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDvps))); - *(ckt->CKTstate0 + here->B3SOIPDvds) = - *(ckt->CKTstate1 + here->B3SOIPDvds); - vds = (1.0 + xfact) * (*(ckt->CKTstate1 + here->B3SOIPDvds)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDvds))); - *(ckt->CKTstate0 + here->B3SOIPDvbd) = - *(ckt->CKTstate0 + here->B3SOIPDvbs) - - *(ckt->CKTstate0 + here->B3SOIPDvds); + if ((ckt->CKTmode & MODEINITPRED)) + { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; + *(ckt->CKTstate0 + here->B3SOIPDvbs) = + *(ckt->CKTstate1 + here->B3SOIPDvbs); + vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIPDvbs)) + - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDvbs))); + *(ckt->CKTstate0 + here->B3SOIPDvgs) = + *(ckt->CKTstate1 + here->B3SOIPDvgs); + vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIPDvgs)) + - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDvgs))); + *(ckt->CKTstate0 + here->B3SOIPDves) = + *(ckt->CKTstate1 + here->B3SOIPDves); + ves = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIPDves)) + - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDves))); + *(ckt->CKTstate0 + here->B3SOIPDvps) = + *(ckt->CKTstate1 + here->B3SOIPDvps); + vps = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIPDvps)) + - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDvps))); + *(ckt->CKTstate0 + here->B3SOIPDvds) = + *(ckt->CKTstate1 + here->B3SOIPDvds); + vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIPDvds)) + - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDvds))); + *(ckt->CKTstate0 + here->B3SOIPDvbd) = + *(ckt->CKTstate0 + here->B3SOIPDvbs) + - *(ckt->CKTstate0 + here->B3SOIPDvds); + + *(ckt->CKTstate0 + here->B3SOIPDvg) = *(ckt->CKTstate1 + here->B3SOIPDvg); + *(ckt->CKTstate0 + here->B3SOIPDvd) = *(ckt->CKTstate1 + here->B3SOIPDvd); + *(ckt->CKTstate0 + here->B3SOIPDvs) = *(ckt->CKTstate1 + here->B3SOIPDvs); + *(ckt->CKTstate0 + here->B3SOIPDvp) = *(ckt->CKTstate1 + here->B3SOIPDvp); + *(ckt->CKTstate0 + here->B3SOIPDve) = *(ckt->CKTstate1 + here->B3SOIPDve); + + /* Only predict ve */ + ve = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B3SOIPDve)) + + - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDve))); + /* Then update vg, vs, vb, vd, vp base on ve */ + vs = ve - model->B3SOIPDtype * ves; + vg = model->B3SOIPDtype * vgs + vs; + vd = model->B3SOIPDtype * vds + vs; + vb = model->B3SOIPDtype * vbs + vs; + vp = model->B3SOIPDtype * vps + vs; + + delTemp = (1.0 + xfact)* (*(ckt->CKTstate1 + + here->B3SOIPDdeltemp))-(xfact * (*(ckt->CKTstate2 + + here->B3SOIPDdeltemp))); + +/* v2.2.3 bug fix */ + *(ckt->CKTstate0 + here->B3SOIPDdeltemp) = + *(ckt->CKTstate1 + here->B3SOIPDdeltemp); + + if (selfheat) + { + here->B3SOIPDphi = 2.0 * here->B3SOIPDvtm + * log(pParam->B3SOIPDnpeak / + here->B3SOIPDni); + } + + } + else + { +#endif /* PREDICTOR */ - *(ckt->CKTstate0 + here->B3SOIPDvg) = - *(ckt->CKTstate1 + here->B3SOIPDvg); - *(ckt->CKTstate0 + here->B3SOIPDvd) = - *(ckt->CKTstate1 + here->B3SOIPDvd); - *(ckt->CKTstate0 + here->B3SOIPDvs) = - *(ckt->CKTstate1 + here->B3SOIPDvs); - *(ckt->CKTstate0 + here->B3SOIPDvp) = - *(ckt->CKTstate1 + here->B3SOIPDvp); - *(ckt->CKTstate0 + here->B3SOIPDve) = - *(ckt->CKTstate1 + here->B3SOIPDve); - - /* Only predict ve */ - ve = (1.0 + xfact) * (*(ckt->CKTstate1 + here->B3SOIPDve)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDve))); - /* Then update vg, vs, vb, vd, vp base on ve */ - vs = ve - model->B3SOIPDtype * ves; - vg = model->B3SOIPDtype * vgs + vs; - vd = model->B3SOIPDtype * vds + vs; - vb = model->B3SOIPDtype * vbs + vs; - vp = model->B3SOIPDtype * vps + vs; - - delTemp = (1.0 + xfact) * (*(ckt->CKTstate1 + - here->B3SOIPDdeltemp)) - - (xfact * (*(ckt->CKTstate2 + here->B3SOIPDdeltemp))); + vg = B3SOIPDlimit(*(ckt->CKTrhsOld + here->B3SOIPDgNode), + *(ckt->CKTstate0 + here->B3SOIPDvg), 3.0, &Check); + vd = B3SOIPDlimit(*(ckt->CKTrhsOld + here->B3SOIPDdNodePrime), + *(ckt->CKTstate0 + here->B3SOIPDvd), 3.0, &Check); + vs = B3SOIPDlimit(*(ckt->CKTrhsOld + here->B3SOIPDsNodePrime), + *(ckt->CKTstate0 + here->B3SOIPDvs), 3.0, &Check); + vp = B3SOIPDlimit(*(ckt->CKTrhsOld + here->B3SOIPDpNode), + *(ckt->CKTstate0 + here->B3SOIPDvp), 3.0, &Check); + ve = B3SOIPDlimit(*(ckt->CKTrhsOld + here->B3SOIPDeNode), + *(ckt->CKTstate0 + here->B3SOIPDve), 3.0, &Check); + delTemp = *(ckt->CKTrhsOld + here->B3SOIPDtempNode); - if (selfheat) - { - here->B3SOIPDphi = 2.0 * here->B3SOIPDvtm - * log (pParam->B3SOIPDnpeak / here->B3SOIPDni); - } - - } - else - { -#endif /* PREDICTOR */ + vbs = model->B3SOIPDtype * (*(ckt->CKTrhsOld+here->B3SOIPDbNode) + - *(ckt->CKTrhsOld+here->B3SOIPDsNodePrime)); - vg = B3SOIPDlimit (*(ckt->CKTrhsOld + here->B3SOIPDgNode), - *(ckt->CKTstate0 + here->B3SOIPDvg), 3.0, - &Check); - vd = - B3SOIPDlimit (*(ckt->CKTrhsOld + here->B3SOIPDdNodePrime), - *(ckt->CKTstate0 + here->B3SOIPDvd), 3.0, - &Check); - vs = - B3SOIPDlimit (*(ckt->CKTrhsOld + here->B3SOIPDsNodePrime), - *(ckt->CKTstate0 + here->B3SOIPDvs), 3.0, - &Check); - vp = - B3SOIPDlimit (*(ckt->CKTrhsOld + here->B3SOIPDpNode), - *(ckt->CKTstate0 + here->B3SOIPDvp), 3.0, - &Check); - ve = - B3SOIPDlimit (*(ckt->CKTrhsOld + here->B3SOIPDeNode), - *(ckt->CKTstate0 + here->B3SOIPDve), 3.0, - &Check); - delTemp = *(ckt->CKTrhsOld + here->B3SOIPDtempNode); - - vbs = - model->B3SOIPDtype * - (*(ckt->CKTrhsOld + here->B3SOIPDbNode) - - *(ckt->CKTrhsOld + here->B3SOIPDsNodePrime)); - - vps = model->B3SOIPDtype * (vp - vs); - vgs = model->B3SOIPDtype * (vg - vs); - ves = model->B3SOIPDtype * (ve - vs); - vds = model->B3SOIPDtype * (vd - vs); + vps = model->B3SOIPDtype * (vp - vs); + vgs = model->B3SOIPDtype * (vg - vs); + ves = model->B3SOIPDtype * (ve - vs); + vds = model->B3SOIPDtype * (vd - vs); #ifndef PREDICTOR - } + } #endif /* PREDICTOR */ - vbd = vbs - vds; - vgd = vgs - vds; - ved = ves - vds; - vgdo = *(ckt->CKTstate0 + here->B3SOIPDvgs) - - *(ckt->CKTstate0 + here->B3SOIPDvds); - vedo = *(ckt->CKTstate0 + here->B3SOIPDves) - - *(ckt->CKTstate0 + here->B3SOIPDvds); - delvbs = vbs - *(ckt->CKTstate0 + here->B3SOIPDvbs); - delvbd = vbd - *(ckt->CKTstate0 + here->B3SOIPDvbd); - delvgs = vgs - *(ckt->CKTstate0 + here->B3SOIPDvgs); - delves = ves - *(ckt->CKTstate0 + here->B3SOIPDves); - delvps = vps - *(ckt->CKTstate0 + here->B3SOIPDvps); - deldelTemp = delTemp - *(ckt->CKTstate0 + here->B3SOIPDdeltemp); - delvds = vds - *(ckt->CKTstate0 + here->B3SOIPDvds); - delvgd = vgd - vgdo; - delved = ved - vedo; - - if (here->B3SOIPDmode >= 0) - { - cdhat = - here->B3SOIPDcd + (here->B3SOIPDgm - - here->B3SOIPDgjdg) * delvgs + - (here->B3SOIPDgds - here->B3SOIPDgjdd) * delvds + - (here->B3SOIPDgmbs - here->B3SOIPDgjdb) * delvbs + - (here->B3SOIPDgmT - here->B3SOIPDgjdT) * deldelTemp; - } - else - { - cdhat = - here->B3SOIPDcd + (here->B3SOIPDgm - - here->B3SOIPDgjdg) * delvgd - - (here->B3SOIPDgds - here->B3SOIPDgjdd) * delvds + - (here->B3SOIPDgmbs - here->B3SOIPDgjdb) * delvbd + - (here->B3SOIPDgmT - here->B3SOIPDgjdT) * deldelTemp; - - } - cbhat = here->B3SOIPDcb + here->B3SOIPDgbgs * delvgs - + here->B3SOIPDgbbs * delvbs - + here->B3SOIPDgbds * delvds - + here->B3SOIPDgbps * delvps + here->B3SOIPDgbT * deldelTemp; + vbd = vbs - vds; + vgd = vgs - vds; + ved = ves - vds; + vgdo = *(ckt->CKTstate0 + here->B3SOIPDvgs) + - *(ckt->CKTstate0 + here->B3SOIPDvds); + vedo = *(ckt->CKTstate0 + here->B3SOIPDves) + - *(ckt->CKTstate0 + here->B3SOIPDvds); + delvbs = vbs - *(ckt->CKTstate0 + here->B3SOIPDvbs); + delvbd = vbd - *(ckt->CKTstate0 + here->B3SOIPDvbd); + delvgs = vgs - *(ckt->CKTstate0 + here->B3SOIPDvgs); + delves = ves - *(ckt->CKTstate0 + here->B3SOIPDves); + delvps = vps - *(ckt->CKTstate0 + here->B3SOIPDvps); + deldelTemp = delTemp - *(ckt->CKTstate0 + here->B3SOIPDdeltemp); + delvds = vds - *(ckt->CKTstate0 + here->B3SOIPDvds); + delvgd = vgd - vgdo; + delved = ved - vedo; + + if (here->B3SOIPDmode >= 0) + { + cdhat = here->B3SOIPDcd + (here->B3SOIPDgm-here->B3SOIPDgjdg) * delvgs + + (here->B3SOIPDgds - here->B3SOIPDgjdd) * delvds + + (here->B3SOIPDgmbs - here->B3SOIPDgjdb) * delvbs + + (here->B3SOIPDgmT - here->B3SOIPDgjdT) * deldelTemp; + } + else + { + cdhat = here->B3SOIPDcd + (here->B3SOIPDgm-here->B3SOIPDgjdg) * delvgd + - (here->B3SOIPDgds - here->B3SOIPDgjdd) * delvds + + (here->B3SOIPDgmbs - here->B3SOIPDgjdb) * delvbd + + (here->B3SOIPDgmT - here->B3SOIPDgjdT) * deldelTemp; + + } + cbhat = here->B3SOIPDcb + here->B3SOIPDgbgs * delvgs + + here->B3SOIPDgbbs * delvbs + + here->B3SOIPDgbds * delvds + + here->B3SOIPDgbps * delvps + + here->B3SOIPDgbT * deldelTemp; #ifndef NOBYPASS - /* following should be one big if connected by && all over - * the place, but some C compilers can't handle that, so - * we split it up here to let them digest it in stages - */ - - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass) - && Check == 0) - if ( - (fabs (delvbs) < - (ckt->CKTreltol * - MAX (fabs (vbs), - fabs (*(ckt->CKTstate0 + here->B3SOIPDvbs))) + - ckt->CKTvoltTol))) - if ( - (fabs (delvbd) < - (ckt->CKTreltol * - MAX (fabs (vbd), - fabs (*(ckt->CKTstate0 + here->B3SOIPDvbd))) + - ckt->CKTvoltTol))) - if ( - (fabs (delvgs) < - (ckt->CKTreltol * - MAX (fabs (vgs), - fabs (*(ckt->CKTstate0 + here->B3SOIPDvgs))) + - ckt->CKTvoltTol))) - if ( - (fabs (delves) < - (ckt->CKTreltol * - MAX (fabs (ves), - fabs (*(ckt->CKTstate0 + here->B3SOIPDves))) - + ckt->CKTvoltTol))) - if ((here->B3SOIPDbodyMod == 0) - || (here->B3SOIPDbodyMod == 2) - || (fabs (delvps) < - (ckt->CKTreltol * - MAX (fabs (vps), - fabs (* - (ckt->CKTstate0 + - here->B3SOIPDvps))) + - ckt->CKTvoltTol))) - if ((here->B3SOIPDtempNode == 0) - || (fabs (deldelTemp) < - (ckt->CKTreltol * - MAX (fabs (delTemp), - fabs (* - (ckt->CKTstate0 + - here->B3SOIPDdeltemp))) + - ckt->CKTvoltTol * 1e4))) - if ( - (fabs (delvds) < - (ckt->CKTreltol * - MAX (fabs (vds), - fabs (* - (ckt->CKTstate0 + - here->B3SOIPDvds))) + - ckt->CKTvoltTol))) - if ( - (fabs (cdhat - here->B3SOIPDcd) < - ckt->CKTreltol * MAX (fabs (cdhat), - fabs (here-> - B3SOIPDcd)) + - ckt->CKTabstol)) - if ( - (fabs (cbhat - here->B3SOIPDcb) < - ckt->CKTreltol * MAX (fabs (cbhat), - fabs (here-> - B3SOIPDcb)) + - ckt->CKTabstol)) - { /* bypass code */ - vbs = - *(ckt->CKTstate0 + here->B3SOIPDvbs); - vbd = - *(ckt->CKTstate0 + here->B3SOIPDvbd); - vgs = - *(ckt->CKTstate0 + here->B3SOIPDvgs); - ves = - *(ckt->CKTstate0 + here->B3SOIPDves); - vps = - *(ckt->CKTstate0 + here->B3SOIPDvps); - vds = - *(ckt->CKTstate0 + here->B3SOIPDvds); - delTemp = - *(ckt->CKTstate0 + - here->B3SOIPDdeltemp); - - /* calculate Vds for temperature conductance calculation - in bypass (used later when filling Temp node matrix) */ - Vds = here->B3SOIPDmode > 0 ? vds : -vds; - - vgd = vgs - vds; - vgb = vgs - vbs; - veb = ves - vbs; - - if ((ckt->CKTmode & (MODETRAN | MODEAC)) - || ((ckt->CKTmode & MODETRANOP) - && (ckt->CKTmode & MODEUIC))) - { - ByPass = 1; - goto line755; - } - else - { - goto line850; - } - } - - -#endif /*NOBYPASS*/ - von = here->B3SOIPDvon; - - - if (*(ckt->CKTstate0 + here->B3SOIPDvds) >= 0.0) - T0 = *(ckt->CKTstate0 + here->B3SOIPDvbs); - else - T0 = *(ckt->CKTstate0 + here->B3SOIPDvbd); - - - if (vds >= 0.0) - { - vbs = B3SOIPDlimit (vbs, T0, 0.2, &Check); - vbd = vbs - vds; - vb = model->B3SOIPDtype * vbs + vs; - } - else - { - vbd = B3SOIPDlimit (vbd, T0, 0.2, &Check); - vbs = vbd + vds; - vb = model->B3SOIPDtype * vbs + vd; - } - - delTemp = - B3SOIPDlimit (delTemp, - *(ckt->CKTstate0 + here->B3SOIPDdeltemp), 5.0, - &Check); - - } + /* following should be one big if connected by && all over + * the place, but some C compilers can't handle that, so + * we split it up here to let them digest it in stages + */ + + if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass) && Check == 0) + if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), + fabs(*(ckt->CKTstate0+here->B3SOIPDvbs))) + ckt->CKTvoltTol)) ) + if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), + fabs(*(ckt->CKTstate0+here->B3SOIPDvbd))) + ckt->CKTvoltTol)) ) + if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), + fabs(*(ckt->CKTstate0+here->B3SOIPDvgs))) + ckt->CKTvoltTol))) + if ((fabs(delves) < (ckt->CKTreltol * MAX(fabs(ves), + fabs(*(ckt->CKTstate0+here->B3SOIPDves))) + ckt->CKTvoltTol))) + if ( (here->B3SOIPDbodyMod == 0) || (here->B3SOIPDbodyMod == 2) || + (fabs(delvps) < (ckt->CKTreltol * MAX(fabs(vps), + fabs(*(ckt->CKTstate0+here->B3SOIPDvps))) + ckt->CKTvoltTol)) ) + if ( (here->B3SOIPDtempNode == 0) || + (fabs(deldelTemp) < (ckt->CKTreltol * MAX(fabs(delTemp), + fabs(*(ckt->CKTstate0+here->B3SOIPDdeltemp))) + + ckt->CKTvoltTol*1e4))) + if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), + fabs(*(ckt->CKTstate0+here->B3SOIPDvds))) + ckt->CKTvoltTol))) + if ((fabs(cdhat - here->B3SOIPDcd) < ckt->CKTreltol + * MAX(fabs(cdhat),fabs(here->B3SOIPDcd)) + ckt->CKTabstol)) + if ((fabs(cbhat - here->B3SOIPDcb) < ckt->CKTreltol + * MAX(fabs(cbhat),fabs(here->B3SOIPDcb)) + ckt->CKTabstol) ) + { /* bypass code */ + vbs = *(ckt->CKTstate0 + here->B3SOIPDvbs); + vbd = *(ckt->CKTstate0 + here->B3SOIPDvbd); + vgs = *(ckt->CKTstate0 + here->B3SOIPDvgs); + ves = *(ckt->CKTstate0 + here->B3SOIPDves); + vps = *(ckt->CKTstate0 + here->B3SOIPDvps); + vds = *(ckt->CKTstate0 + here->B3SOIPDvds); + delTemp = *(ckt->CKTstate0 + here->B3SOIPDdeltemp); + + /* calculate Vds for temperature conductance calculation + in bypass (used later when filling Temp node matrix) */ + Vds = here->B3SOIPDmode > 0 ? vds : -vds; + + vgd = vgs - vds; + vgb = vgs - vbs; + veb = ves - vbs; + + if ((ckt->CKTmode & (MODETRAN | MODEAC)) || + ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) + { ByPass = 1; + goto line755; + } + else + { goto line850; + } + } + + +#endif /*NOBYPASS*/ + von = here->B3SOIPDvon; + + + if (*(ckt->CKTstate0 + here->B3SOIPDvds) >= 0.0) + T0 = *(ckt->CKTstate0 + here->B3SOIPDvbs); + else + T0 = *(ckt->CKTstate0 + here->B3SOIPDvbd); + + + if (vds >= 0.0) + { + vbs = B3SOIPDlimit(vbs, T0, 0.2, &Check); + vbd = vbs - vds; + vb = model->B3SOIPDtype * vbs + vs; + } else + { + vbd = B3SOIPDlimit(vbd, T0, 0.2, &Check); + vbs = vbd + vds; + vb = model->B3SOIPDtype * vbs + vd; + } + + delTemp =B3SOIPDlimit(delTemp, *(ckt->CKTstate0 + here->B3SOIPDdeltemp),5.0,&Check); + + } /* Calculate temperature dependent values for self-heating effect */ - Temp = delTemp + ckt->CKTtemp; - dTempRatio_dT = 1 / model->B3SOIPDtnom; - TempRatio = Temp * dTempRatio_dT; - - if (selfheat) - { - Vtm = KboQ * Temp; - - T0 = 1108.0 + Temp; - T5 = Temp * Temp; - Eg = 1.16 - 7.02e-4 * T5 / T0; - T1 = ((7.02e-4 * T5) - T0 * (14.04e-4 * Temp)) / T0 / T0; - /* T1 = dEg / dT */ - - T2 = 1.9230584e-4; /* T2 = 1 / 300.15^(3/2) */ - T5 = sqrt (Temp); - T3 = 1.45e10 * Temp * T5 * T2; - T4 = exp (21.5565981 - Eg / (2.0 * Vtm)); - ni = T3 * T4; - dni_dT = 2.175e10 * T2 * T5 * T4 + T3 * T4 * - (-Vtm * T1 + Eg * KboQ) / (2.0 * Vtm * Vtm); - - T0 = log (1.0e20 * pParam->B3SOIPDnpeak / (ni * ni)); - vbi = Vtm * T0; - dvbi_dT = KboQ * T0 + Vtm * (-2.0 * dni_dT / ni); - - if (pParam->B3SOIPDnsub > 0) - { - T0 = log (pParam->B3SOIPDnpeak / pParam->B3SOIPDnsub); - vfbb = -model->B3SOIPDtype * Vtm * T0; - dvfbb_dT = -model->B3SOIPDtype * KboQ * T0; - } - else - { - T0 = - log (-pParam->B3SOIPDnpeak * pParam->B3SOIPDnsub / ni / - ni); - vfbb = -model->B3SOIPDtype * Vtm * T0; - dvfbb_dT = -model->B3SOIPDtype * - (KboQ * T0 - Vtm * 2.0 * dni_dT / ni); - } + Temp = delTemp + ckt->CKTtemp; + dTempRatio_dT = 1 / model->B3SOIPDtnom; + TempRatio = Temp * dTempRatio_dT; + + if (selfheat) { + Vtm = KboQ * Temp; + + T0 = 1108.0 + Temp; + T5 = Temp * Temp; + Eg = 1.16 - 7.02e-4 * T5 / T0; + T1 = ((7.02e-4 * T5) - T0 * (14.04e-4 * Temp)) / T0 / T0; + /* T1 = dEg / dT */ + + T2 = 1.9230584e-4; /* T2 = 1 / 300.15^(3/2) */ + T5 = sqrt(Temp); + T3 = 1.45e10 * Temp * T5 * T2; + T4 = exp(21.5565981 - Eg / (2.0 * Vtm)); + ni = T3 * T4; + dni_dT = 2.175e10 * T2 * T5 * T4 + T3 * T4 * + (-Vtm * T1 + Eg * KboQ) / (2.0 * Vtm * Vtm); + + T0 = log(1.0e20 * pParam->B3SOIPDnpeak / (ni * ni)); + vbi = Vtm * T0; + dvbi_dT = KboQ * T0 + Vtm * (-2.0 * dni_dT / ni); + + if (pParam->B3SOIPDnsub > 0) { + T0 = log(pParam->B3SOIPDnpeak / pParam->B3SOIPDnsub); + vfbb = -model->B3SOIPDtype * Vtm * T0; + dvfbb_dT = -model->B3SOIPDtype * KboQ * T0; + } + else { + T0 = log(-pParam->B3SOIPDnpeak * pParam->B3SOIPDnsub / ni / ni); + vfbb = -model->B3SOIPDtype * Vtm * T0; + dvfbb_dT = -model->B3SOIPDtype * + (KboQ * T0 - Vtm * 2.0 * dni_dT / ni); + } /* phi = 2.0 * Vtm * log(pParam->B3SOIPDnpeak / ni); */ - phi = here->B3SOIPDphi; - sqrtPhi = sqrt (phi); - Xdep0 = sqrt (2.0 * EPSSI / (Charge_q - * pParam->B3SOIPDnpeak * 1.0e6)) - * sqrtPhi; - /* Save the values below for phi calculation in B3SOIPDaccept() */ - here->B3SOIPDvtm = Vtm; - here->B3SOIPDni = ni; - - T3 = TempRatio - 1.0; - T8 = 1 / model->B3SOIPDtnom; - T4 = Eg300 / Vtm * T3; - dT4_dT = Eg300 / Vtm / Vtm * (Vtm * T8 - T3 * KboQ); - - T7 = model->B3SOIPDxbjt * T4 / pParam->B3SOIPDndiode; - dT7_dT = model->B3SOIPDxbjt * dT4_dT / pParam->B3SOIPDndiode; - DEXP (T7, T0, dT0_dT7); - dT0_dT = dT0_dT7 * dT7_dT; - - if (model->B3SOIPDxbjt == model->B3SOIPDxdif) - { - T1 = T0; - dT1_dT = dT0_dT; - } - else - { - T7 = model->B3SOIPDxdif * T4 / pParam->B3SOIPDndiode; - dT7_dT = - model->B3SOIPDxdif * dT4_dT / pParam->B3SOIPDndiode; - DEXP (T7, T1, dT1_dT7); - dT1_dT = dT1_dT7 * dT7_dT; - } - - T7 = model->B3SOIPDxrec * T4 / pParam->B3SOIPDnrecf0; - dT7_dT = model->B3SOIPDxrec * dT4_dT / pParam->B3SOIPDnrecf0; - DEXP (T7, T2, dT2_dT7); - dT2_dT = dT2_dT7 * dT7_dT; - - /* high level injection */ - Ahli = pParam->B3SOIPDahli * T0; - dAhli_dT = pParam->B3SOIPDahli * dT0_dT; - - jbjt = pParam->B3SOIPDisbjt * T0; - jdif = pParam->B3SOIPDisdif * T1; - jrec = pParam->B3SOIPDisrec * T2; - djbjt_dT = pParam->B3SOIPDisbjt * dT0_dT; - djdif_dT = pParam->B3SOIPDisdif * dT1_dT; - djrec_dT = pParam->B3SOIPDisrec * dT2_dT; - - T7 = model->B3SOIPDxtun * T3; - dT7_dT = model->B3SOIPDxtun * T8; - DEXP (T7, T0, dT0_dT7); - dT0_dT = dT0_dT7 * dT7_dT; - jtun = pParam->B3SOIPDistun * T0; - djtun_dT = pParam->B3SOIPDistun * dT0_dT; - - u0temp = - pParam->B3SOIPDu0 * pow (TempRatio, pParam->B3SOIPDute); - du0temp_dT = - pParam->B3SOIPDu0 * pParam->B3SOIPDute * pow (TempRatio, - pParam-> - B3SOIPDute - - 1.0) * T8; - - vsattemp = pParam->B3SOIPDvsat - pParam->B3SOIPDat * T3; - dvsattemp_dT = -pParam->B3SOIPDat * T8; - - rds0 = (pParam->B3SOIPDrdsw + pParam->B3SOIPDprt - * T3) / pParam->B3SOIPDrds0denom; - drds0_dT = pParam->B3SOIPDprt / pParam->B3SOIPDrds0denom * T8; - - ua = pParam->B3SOIPDuatemp + pParam->B3SOIPDua1 * T3; - ub = pParam->B3SOIPDubtemp + pParam->B3SOIPDub1 * T3; - uc = pParam->B3SOIPDuctemp + pParam->B3SOIPDuc1 * T3; - dua_dT = pParam->B3SOIPDua1 * T8; - dub_dT = pParam->B3SOIPDub1 * T8; - duc_dT = pParam->B3SOIPDuc1 * T8; - } - else - { - vbi = pParam->B3SOIPDvbi; - vfbb = pParam->B3SOIPDvfbb; - phi = pParam->B3SOIPDphi; - sqrtPhi = pParam->B3SOIPDsqrtPhi; - Xdep0 = pParam->B3SOIPDXdep0; - jbjt = pParam->B3SOIPDjbjt; - jdif = pParam->B3SOIPDjdif; - jrec = pParam->B3SOIPDjrec; - jtun = pParam->B3SOIPDjtun; - Ahli = pParam->B3SOIPDahli; - u0temp = pParam->B3SOIPDu0temp; - vsattemp = pParam->B3SOIPDvsattemp; - rds0 = pParam->B3SOIPDrds0; - ua = pParam->B3SOIPDua; - ub = pParam->B3SOIPDub; - uc = pParam->B3SOIPDuc; - dni_dT = dvbi_dT = dvfbb_dT = djbjt_dT = djdif_dT = 0.0; - djrec_dT = djtun_dT = du0temp_dT = dvsattemp_dT = 0.0; - drds0_dT = dua_dT = dub_dT = duc_dT = 0.0; - dAhli_dT = 0; - } - - /* TempRatio used for Vth and mobility */ - if (selfheat) - { - TempRatioMinus1 = Temp / model->B3SOIPDtnom - 1.0; - } - else - { - TempRatioMinus1 = ckt->CKTtemp / model->B3SOIPDtnom - 1.0; - } - - /* determine DC current and derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - ved = ves - vds; - veb = ves - vbs; - vge = vgs - ves; - vpd = vps - vds; - - - if (vds >= 0.0) - { /* normal mode */ - here->B3SOIPDmode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - Vbd = vbd; - Ves = ves; - Vps = vps; - - wdios = pParam->B3SOIPDwdios; - wdiod = pParam->B3SOIPDwdiod; - wdiosCV = pParam->B3SOIPDwdiosCV; - wdiodCV = pParam->B3SOIPDwdiodCV; - - } - else - { /* inverse mode */ - here->B3SOIPDmode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - Vbd = vbs; - Ves = ved; - Vps = vpd; - - wdios = pParam->B3SOIPDwdiod; - wdiod = pParam->B3SOIPDwdios; - wdiosCV = pParam->B3SOIPDwdiodCV; - wdiodCV = pParam->B3SOIPDwdiosCV; + phi = here->B3SOIPDphi; + sqrtPhi = sqrt(phi); + Xdep0 = sqrt(2.0 * EPSSI / (Charge_q + * pParam->B3SOIPDnpeak * 1.0e6)) + * sqrtPhi; + /* Save the values below for phi calculation in B3SOIPDaccept() */ + here->B3SOIPDvtm = Vtm; + here->B3SOIPDni = ni; + + T3 = TempRatio - 1.0; + T8 = 1/ model->B3SOIPDtnom; + T4 = Eg300 / Vtm * T3; + dT4_dT = Eg300 / Vtm / Vtm * (Vtm * T8 - T3 * KboQ); + + T7 = model->B3SOIPDxbjt * T4 / pParam->B3SOIPDndiode; + dT7_dT = model->B3SOIPDxbjt * dT4_dT / pParam->B3SOIPDndiode; + DEXP(T7, T0, dT0_dT7); + dT0_dT = dT0_dT7 * dT7_dT; + + if (model->B3SOIPDxbjt == model->B3SOIPDxdif) { + T1 = T0; + dT1_dT = dT0_dT; + } + else { + T7 = model->B3SOIPDxdif * T4 / pParam->B3SOIPDndiode; + dT7_dT = model->B3SOIPDxdif * dT4_dT / pParam->B3SOIPDndiode; + DEXP(T7, T1, dT1_dT7); + dT1_dT = dT1_dT7 * dT7_dT; + } + + T7 = model->B3SOIPDxrec * T4 / pParam->B3SOIPDnrecf0; + dT7_dT = model->B3SOIPDxrec * dT4_dT / pParam->B3SOIPDnrecf0; + DEXP(T7, T2, dT2_dT7); + dT2_dT = dT2_dT7 * dT7_dT; + + /* high level injection */ + Ahli = pParam->B3SOIPDahli * T0; + dAhli_dT = pParam->B3SOIPDahli * dT0_dT; + + jbjt = pParam->B3SOIPDisbjt * T0; + jdif = pParam->B3SOIPDisdif * T1; + jrec = pParam->B3SOIPDisrec * T2; + djbjt_dT = pParam->B3SOIPDisbjt * dT0_dT; + djdif_dT = pParam->B3SOIPDisdif * dT1_dT; + djrec_dT = pParam->B3SOIPDisrec * dT2_dT; + + T7 = model->B3SOIPDxtun * T3; + dT7_dT = model->B3SOIPDxtun * T8; + DEXP(T7, T0, dT0_dT7); + dT0_dT = dT0_dT7 * dT7_dT; + jtun = pParam->B3SOIPDistun * T0; + djtun_dT = pParam->B3SOIPDistun * dT0_dT; + + u0temp = pParam->B3SOIPDu0 * pow(TempRatio, pParam->B3SOIPDute); + du0temp_dT = pParam->B3SOIPDu0 * pParam->B3SOIPDute * + pow(TempRatio, pParam->B3SOIPDute - 1.0) * T8; + + vsattemp = pParam->B3SOIPDvsat - pParam->B3SOIPDat * T3; + dvsattemp_dT = -pParam->B3SOIPDat * T8; + + rds0 = (pParam->B3SOIPDrdsw + pParam->B3SOIPDprt + * T3) / pParam->B3SOIPDrds0denom; + drds0_dT = pParam->B3SOIPDprt / pParam->B3SOIPDrds0denom * T8; + + ua = pParam->B3SOIPDuatemp + pParam->B3SOIPDua1 * T3; + ub = pParam->B3SOIPDubtemp + pParam->B3SOIPDub1 * T3; + uc = pParam->B3SOIPDuctemp + pParam->B3SOIPDuc1 * T3; + dua_dT = pParam->B3SOIPDua1 * T8; + dub_dT = pParam->B3SOIPDub1 * T8; + duc_dT = pParam->B3SOIPDuc1 * T8; + } + else { + vbi = pParam->B3SOIPDvbi; + vfbb = pParam->B3SOIPDvfbb; + phi = pParam->B3SOIPDphi; + sqrtPhi = pParam->B3SOIPDsqrtPhi; + Xdep0 = pParam->B3SOIPDXdep0; + jbjt = pParam->B3SOIPDjbjt; + jdif = pParam->B3SOIPDjdif; + jrec = pParam->B3SOIPDjrec; + jtun = pParam->B3SOIPDjtun; + + /* v2.2.2 bug fix */ + Ahli = pParam->B3SOIPDahli0; + + u0temp = pParam->B3SOIPDu0temp; + vsattemp = pParam->B3SOIPDvsattemp; + rds0 = pParam->B3SOIPDrds0; + ua = pParam->B3SOIPDua; + ub = pParam->B3SOIPDub; + uc = pParam->B3SOIPDuc; + dni_dT = dvbi_dT = dvfbb_dT = djbjt_dT = djdif_dT = 0.0; + djrec_dT = djtun_dT = du0temp_dT = dvsattemp_dT = 0.0; + drds0_dT = dua_dT = dub_dT = duc_dT = 0.0; + dAhli_dT = 0; + } + + /* TempRatio used for Vth and mobility */ + if (selfheat) { + TempRatioMinus1 = Temp / model->B3SOIPDtnom - 1.0; + } + else { + TempRatioMinus1 = ckt->CKTtemp / model->B3SOIPDtnom - 1.0; + } + + /* determine DC current and derivatives */ + vbd = vbs - vds; + vgd = vgs - vds; + vgb = vgs - vbs; + ved = ves - vds; + veb = ves - vbs; + vge = vgs - ves; + vpd = vps - vds; + + + if (vds >= 0.0) + { /* normal mode */ + here->B3SOIPDmode = 1; + Vds = vds; + Vgs = vgs; + Vbs = vbs; + Vbd = vbd; + Ves = ves; + Vps = vps; + + wdios = pParam->B3SOIPDwdios; + wdiod = pParam->B3SOIPDwdiod; + wdiosCV = pParam->B3SOIPDwdiosCV; + wdiodCV = pParam->B3SOIPDwdiodCV; + + } + else + { /* inverse mode */ + here->B3SOIPDmode = -1; + Vds = -vds; + Vgs = vgd; + Vbs = vbd; + Vbd = vbs; + Ves = ved; + Vps = vpd; - } + wdios = pParam->B3SOIPDwdiod; + wdiod = pParam->B3SOIPDwdios; + wdiosCV = pParam->B3SOIPDwdiodCV; + wdiodCV = pParam->B3SOIPDwdiosCV; - Vesfb = Ves - vfbb; - Cbox = model->B3SOIPDcbox; - K1 = pParam->B3SOIPDk1eff; + } - ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; + Vesfb = Ves - vfbb; + Cbox = model->B3SOIPDcbox; + K1 = pParam->B3SOIPDk1eff; - if (here->B3SOIPDdebugMod < 0) - ChargeComputationNeeded = 1; + ChargeComputationNeeded = + ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || + ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) + ? 1 : 0; + if (here->B3SOIPDdebugMod <0) + ChargeComputationNeeded = 1; + /* Poly Gate Si Depletion Effect */ - T0 = pParam->B3SOIPDvfb + phi; - if ((pParam->B3SOIPDngate > 1.e18) && (pParam->B3SOIPDngate < 1.e25) - && (Vgs > T0)) - /* added to avoid the problem caused by ngate */ - { - T1 = 1.0e6 * Charge_q * EPSSI * pParam->B3SOIPDngate - / (model->B3SOIPDcox * model->B3SOIPDcox); - T4 = sqrt (1.0 + 2.0 * (Vgs - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - T7 = 1.12 - T3 - 0.05; - T6 = sqrt (T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = Vgs - T5; - dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - } - else - { - Vgs_eff = Vgs; - dVgs_eff_dVg = 1.0; - } - - - Leff = pParam->B3SOIPDleff; - - if (selfheat) - { - Vtm = KboQ * Temp; - dVtm_dT = KboQ; - } - else - { - Vtm = model->B3SOIPDvtm; - dVtm_dT = 0.0; - } - - V0 = vbi - phi; - - Vbp = Vbs - Vps; - dVbp_dVb = 1; - - - /* T2 is Vbs limited above Vbsc=-5 */ - T0 = Vbs + 5 - 0.001; - T1 = sqrt (T0 * T0 - 0.004 * (-5)); - T2 = (-5) + 0.5 * (T0 + T1); - dT2_dVb = 0.5 * (1.0 + T0 / T1); - - /* Vbsh is T2 limited below 1.5 */ - T0 = 1.5; - T1 = T0 - T2 - 0.002; - T3 = sqrt (T1 * T1 + 0.008 * T0); - Vbsh = T0 - 0.5 * (T1 + T3); - dVbsh_dVb = 0.5 * (1.0 + T1 / T3) * dT2_dVb; - - /* Vbseff is Vbsh limited to 0.95*phi */ - T0 = 0.95 * phi; - T1 = T0 - Vbsh - 0.002; - T2 = sqrt (T1 * T1 + 0.008 * T0); - Vbseff = T0 - 0.5 * (T1 + T2); - dVbseff_dVb = 0.5 * (1.0 + T1 / T2) * dVbsh_dVb; - here->B3SOIPDvbseff = Vbs; - - /* Below all the variables refer to Vbseff */ - if (dVbseff_dVb < 1e-20) - { - dVbseff_dVb = 1e-20; - dVbsh_dVb *= 1e20; - } - else - dVbsh_dVb /= dVbseff_dVb; - - Phis = phi - Vbseff; - dPhis_dVb = -1; - sqrtPhis = sqrt (Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - - Xdep = Xdep0 * sqrtPhis / sqrtPhi; - dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb; + T0 = pParam->B3SOIPDvfb + phi; + if ((pParam->B3SOIPDngate > 1.e18) && (pParam->B3SOIPDngate < 1.e25) + && (Vgs > T0)) + /* added to avoid the problem caused by ngate */ + { T1 = 1.0e6 * Charge_q * EPSSI * pParam->B3SOIPDngate + / (model->B3SOIPDcox * model->B3SOIPDcox); + T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); + T2 = T1 * (T4 - 1.0); + T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ + T7 = 1.12 - T3 - 0.05; + T6 = sqrt(T7 * T7 + 0.224); + T5 = 1.12 - 0.5 * (T7 + T6); + Vgs_eff = Vgs - T5; + dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); + } + else + { Vgs_eff = Vgs; + dVgs_eff_dVg = 1.0; + } + + + Leff = pParam->B3SOIPDleff; + + if (selfheat) { + Vtm = KboQ * Temp; + dVtm_dT = KboQ; + } + else { + Vtm = model->B3SOIPDvtm; + dVtm_dT = 0.0; + } + + V0 = vbi - phi; + + Vbp = Vbs - Vps; + dVbp_dVb = 1; + + + /* T2 is Vbs limited above Vbsc=-5 */ + T0 = Vbs + 5 - 0.001; + T1 = sqrt(T0 * T0 - 0.004 * (-5)); + T2 = (-5) + 0.5 * (T0 + T1); + dT2_dVb = 0.5 * (1.0 + T0 / T1); + + /* Vbsh is T2 limited below 1.5 */ + T0 = 1.5; + T1 = T0 - T2 - 0.002; + T3 = sqrt(T1 * T1 + 0.008 * T0); + Vbsh = T0 - 0.5 * (T1 + T3); + dVbsh_dVb = 0.5 * (1.0 + T1 / T3) * dT2_dVb; + + /* Vbseff is Vbsh limited to 0.95*phi */ + T0 = 0.95 * phi; + T1 = T0 - Vbsh - 0.002; + T2 = sqrt(T1 * T1 + 0.008 * T0); + Vbseff = T0 - 0.5 * (T1 + T2); + dVbseff_dVb = 0.5 * (1.0 + T1 / T2) * dVbsh_dVb; + here->B3SOIPDvbseff = Vbs; + + /* Below all the variables refer to Vbseff */ + if (dVbseff_dVb < 1e-20) { + dVbseff_dVb = 1e-20; + dVbsh_dVb *= 1e20; + } + else + dVbsh_dVb /= dVbseff_dVb; + + Phis = phi - Vbseff; + dPhis_dVb = -1; + sqrtPhis = sqrt(Phis); + dsqrtPhis_dVb = -0.5 / sqrtPhis; + + Xdep = Xdep0 * sqrtPhis / sqrtPhi; + dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb; /* Vth Calculation */ - T3 = sqrt (Xdep); - - T0 = pParam->B3SOIPDdvt2 * Vbseff; - if (T0 >= -0.5) - { - T1 = 1.0 + T0; - T2 = pParam->B3SOIPDdvt2; - } - else /* Added to avoid any discontinuity problems caused by dvt2 */ - { - T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B3SOIPDdvt2 * T4 * T4; - } - lt1 = model->B3SOIPDfactor1 * T3 * T1; - dlt1_dVb = - model->B3SOIPDfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->B3SOIPDdvt2w * Vbseff; - if (T0 >= -0.5) - { - T1 = 1.0 + T0; - T2 = pParam->B3SOIPDdvt2w; - } - else /* Added to avoid any discontinuity problems caused by dvt2w */ - { - T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B3SOIPDdvt2w * T4 * T4; - } - ltw = model->B3SOIPDfactor1 * T3 * T1; - dltw_dVb = - model->B3SOIPDfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = -0.5 * pParam->B3SOIPDdvt1 * Leff / lt1; - if (T0 > -EXPL_THRESHOLD) - { - T1 = exp (T0); - Theta0 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { - T1 = MIN_EXPL; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = 0.0; - } - - here->B3SOIPDthetavth = pParam->B3SOIPDdvt0 * Theta0; - Delt_vth = here->B3SOIPDthetavth * V0; - dDelt_vth_dVb = pParam->B3SOIPDdvt0 * dTheta0_dVb * V0; - if (selfheat) - dDelt_vth_dT = here->B3SOIPDthetavth * dvbi_dT; - else - dDelt_vth_dT = 0.0; - - T0 = -0.5 * pParam->B3SOIPDdvt1w * pParam->B3SOIPDweff * Leff / ltw; - if (T0 > -EXPL_THRESHOLD) - { - T1 = exp (T0); - T2 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { - T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dVb = 0.0; - } - - T0 = pParam->B3SOIPDdvt0w * T2; - DeltVthw = T0 * V0; - dDeltVthw_dVb = pParam->B3SOIPDdvt0w * dT2_dVb * V0; - if (selfheat) - dDeltVthw_dT = T0 * dvbi_dT; - else - dDeltVthw_dT = 0.0; - - T0 = sqrt (1.0 + pParam->B3SOIPDnlx / Leff); - T1 = (pParam->B3SOIPDkt1 + pParam->B3SOIPDkt1l / Leff - + pParam->B3SOIPDkt2 * Vbseff); - DeltVthtemp = - pParam->B3SOIPDk1eff * (T0 - 1.0) * sqrtPhi + - T1 * TempRatioMinus1; - if (selfheat) - dDeltVthtemp_dT = T1 / model->B3SOIPDtnom; - else - dDeltVthtemp_dT = 0.0; - - tmp2 = model->B3SOIPDtox * phi - / (pParam->B3SOIPDweff + pParam->B3SOIPDw0); - - T3 = pParam->B3SOIPDeta0 + pParam->B3SOIPDetab * Vbseff; - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { - T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9 * pParam->B3SOIPDetab; - dT3_dVb = T4; - } - else - { - dT3_dVb = pParam->B3SOIPDetab; - } - DIBL_Sft = T3 * pParam->B3SOIPDtheta0vb0 * Vds; - dDIBL_Sft_dVd = pParam->B3SOIPDtheta0vb0 * T3; - dDIBL_Sft_dVb = pParam->B3SOIPDtheta0vb0 * Vds * dT3_dVb; - - T9 = 2.2361 / sqrtPhi; - sqrtPhisExt = sqrtPhis - T9 * (Vbsh - Vbseff); - dsqrtPhisExt_dVb = dsqrtPhis_dVb - T9 * (dVbsh_dVb - 1); - - Vth = - model->B3SOIPDtype * pParam->B3SOIPDvth0 + - pParam->B3SOIPDk1eff * (sqrtPhisExt - sqrtPhi) - - pParam->B3SOIPDk2 * Vbseff - Delt_vth - DeltVthw + - (pParam->B3SOIPDk3 + pParam->B3SOIPDk3b * Vbseff) * tmp2 + - DeltVthtemp - DIBL_Sft; - here->B3SOIPDvon = Vth; - - T6 = pParam->B3SOIPDk3b * tmp2 - pParam->B3SOIPDk2 - + pParam->B3SOIPDkt2 * TempRatioMinus1; - dVth_dVb = pParam->B3SOIPDk1eff * dsqrtPhisExt_dVb - - dDelt_vth_dVb - dDeltVthw_dVb + T6 - dDIBL_Sft_dVb; - /* this is actually dVth_dVbseff */ - - dVth_dVd = -dDIBL_Sft_dVd; - if (selfheat) - dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT; - else - dVth_dT = 0.0; - - /* dVthzb_dT calculation */ - if ((model->B3SOIPDcapMod == 3) && (selfheat == 1)) - { - T3zb = sqrt (Xdep0); - ltwzb = lt1zb = model->B3SOIPDfactor1 * T3zb; - - T0 = -0.5 * pParam->B3SOIPDdvt1 * Leff / lt1zb; - if (T0 > -EXPL_THRESHOLD) - { - T1 = exp (T0); - Theta0zb = T1 * (1.0 + 2.0 * T1); - } - else - { - T1 = MIN_EXPL; - Theta0zb = T1 * (1.0 + 2.0 * T1); - } - Delt_vthzb = pParam->B3SOIPDdvt0 * Theta0zb * V0; - dDelt_vthzb_dT = pParam->B3SOIPDdvt0 * Theta0zb * dvbi_dT; - - T0 = - -0.5 * pParam->B3SOIPDdvt1w * pParam->B3SOIPDweff * Leff / - ltwzb; - if (T0 > -EXPL_THRESHOLD) - { - T1 = exp (T0); - T2 = T1 * (1.0 + 2.0 * T1); - } - else - { - T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - } - T0 = pParam->B3SOIPDdvt0w * T2; - DeltVthwzb = T0 * V0; - dDeltVthwzb_dT = T0 * dvbi_dT; - - T0 = sqrt (1.0 + pParam->B3SOIPDnlx / Leff); - T1 = (pParam->B3SOIPDkt1 + pParam->B3SOIPDkt1l / Leff); - DeltVthtempzb = pParam->B3SOIPDk1eff * (T0 - 1.0) * sqrtPhi - + T1 * TempRatioMinus1; - dDeltVthtempzb_dT = T1 / model->B3SOIPDtnom; - - Vthzb = model->B3SOIPDtype * pParam->B3SOIPDvth0 - - Delt_vthzb - DeltVthwzb + pParam->B3SOIPDk3 * tmp2 - + DeltVthtempzb; - dVthzb_dT = dDeltVthtempzb_dT - dDelt_vthzb_dT - dDeltVthwzb_dT; - } + T3 = sqrt(Xdep); + + T0 = pParam->B3SOIPDdvt2 * Vbseff; + if (T0 >= - 0.5) + { T1 = 1.0 + T0; + T2 = pParam->B3SOIPDdvt2 ; + } + else /* Added to avoid any discontinuity problems caused by dvt2 */ + { T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; + T2 = pParam->B3SOIPDdvt2 * T4 * T4 ; + } + lt1 = model->B3SOIPDfactor1 * T3 * T1; + dlt1_dVb =model->B3SOIPDfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + + T0 = pParam->B3SOIPDdvt2w * Vbseff; + if (T0 >= - 0.5) + { T1 = 1.0 + T0; + T2 = pParam->B3SOIPDdvt2w ; + } + else /* Added to avoid any discontinuity problems caused by dvt2w */ + { T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; + T2 = pParam->B3SOIPDdvt2w * T4 * T4 ; + } + ltw= model->B3SOIPDfactor1 * T3 * T1; + dltw_dVb=model->B3SOIPDfactor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + + T0 = -0.5 * pParam->B3SOIPDdvt1 * Leff / lt1; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + Theta0 = T1 * (1.0 + 2.0 * T1); + dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; + dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; + } + else + { T1 = MIN_EXPL; + Theta0 = T1 * (1.0 + 2.0 * T1); + dTheta0_dVb = 0.0; + } + + here->B3SOIPDthetavth = pParam->B3SOIPDdvt0 * Theta0; + Delt_vth = here->B3SOIPDthetavth * V0; + dDelt_vth_dVb = pParam->B3SOIPDdvt0 * dTheta0_dVb * V0; + if (selfheat) dDelt_vth_dT = here->B3SOIPDthetavth * dvbi_dT; + else dDelt_vth_dT = 0.0; + + T0 = -0.5 * pParam->B3SOIPDdvt1w * pParam->B3SOIPDweff * Leff / ltw; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + T2 = T1 * (1.0 + 2.0 * T1); + dT1_dVb = -T0 / ltw * T1 * dltw_dVb; + dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; + } + else + { T1 = MIN_EXPL; + T2 = T1 * (1.0 + 2.0 * T1); + dT2_dVb = 0.0; + } + + T0 = pParam->B3SOIPDdvt0w * T2; + DeltVthw = T0 * V0; + dDeltVthw_dVb = pParam->B3SOIPDdvt0w * dT2_dVb * V0; + if (selfheat) dDeltVthw_dT = T0 * dvbi_dT; + else dDeltVthw_dT = 0.0; + + T0 = sqrt(1.0 + pParam->B3SOIPDnlx / Leff); + T1 = (pParam->B3SOIPDkt1 + pParam->B3SOIPDkt1l / Leff + + pParam->B3SOIPDkt2 * Vbseff); + DeltVthtemp = pParam->B3SOIPDk1eff * (T0 - 1.0) * sqrtPhi + T1 * TempRatioMinus1; + if (selfheat) + dDeltVthtemp_dT = T1 / model->B3SOIPDtnom; + else + dDeltVthtemp_dT = 0.0; + + tmp2 = model->B3SOIPDtox * phi + / (pParam->B3SOIPDweff + pParam->B3SOIPDw0); + + T3 = pParam->B3SOIPDeta0 + pParam->B3SOIPDetab * Vbseff; + if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ + { T9 = 1.0 / (3.0 - 2.0e4 * T3); + T3 = (2.0e-4 - T3) * T9; + T4 = T9 * T9 * pParam->B3SOIPDetab; + dT3_dVb = T4 ; + } + else + { + dT3_dVb = pParam->B3SOIPDetab ; + } + DIBL_Sft = T3 * pParam->B3SOIPDtheta0vb0 * Vds; + dDIBL_Sft_dVd = pParam->B3SOIPDtheta0vb0 * T3; + dDIBL_Sft_dVb = pParam->B3SOIPDtheta0vb0 * Vds * dT3_dVb; + + T9 = 2.2361 / sqrtPhi; + sqrtPhisExt = sqrtPhis - T9 * (Vbsh - Vbseff); + dsqrtPhisExt_dVb = dsqrtPhis_dVb - T9 * (dVbsh_dVb - 1); + + Vth = model->B3SOIPDtype * pParam->B3SOIPDvth0 + pParam->B3SOIPDk1eff + * (sqrtPhisExt - sqrtPhi) - pParam->B3SOIPDk2 + * Vbseff- Delt_vth - DeltVthw +(pParam->B3SOIPDk3 + pParam->B3SOIPDk3b + * Vbseff) * tmp2 + DeltVthtemp - DIBL_Sft; + here->B3SOIPDvon = Vth; + + T6 = pParam->B3SOIPDk3b * tmp2 - pParam->B3SOIPDk2 + + pParam->B3SOIPDkt2 * TempRatioMinus1; + dVth_dVb = pParam->B3SOIPDk1eff * dsqrtPhisExt_dVb + - dDelt_vth_dVb - dDeltVthw_dVb + + T6 - dDIBL_Sft_dVb; + /* this is actually dVth_dVbseff */ + + dVth_dVd = -dDIBL_Sft_dVd; + if (selfheat) + dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT; + else dVth_dT = 0.0; + + /* dVthzb_dT calculation */ + if ((model->B3SOIPDcapMod == 3) && (selfheat == 1)) { + T3zb = sqrt(Xdep0); + ltwzb = lt1zb = model->B3SOIPDfactor1 * T3zb; + + T0 = -0.5 * pParam->B3SOIPDdvt1 * Leff / lt1zb; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + Theta0zb = T1 * (1.0 + 2.0 * T1); + } + else + { T1 = MIN_EXPL; + Theta0zb = T1 * (1.0 + 2.0 * T1); + } + Delt_vthzb = pParam->B3SOIPDdvt0 * Theta0zb * V0; + dDelt_vthzb_dT = pParam->B3SOIPDdvt0 * Theta0zb * dvbi_dT; + + T0 = -0.5 * pParam->B3SOIPDdvt1w * pParam->B3SOIPDweff * Leff / ltwzb; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + T2 = T1 * (1.0 + 2.0 * T1); + } + else + { T1 = MIN_EXPL; + T2 = T1 * (1.0 + 2.0 * T1); + } + T0 = pParam->B3SOIPDdvt0w * T2; + DeltVthwzb = T0 * V0; + dDeltVthwzb_dT = T0 * dvbi_dT; + + T0 = sqrt(1.0 + pParam->B3SOIPDnlx / Leff); + T1 = (pParam->B3SOIPDkt1 + pParam->B3SOIPDkt1l / Leff); + DeltVthtempzb = pParam->B3SOIPDk1eff * (T0 - 1.0) * sqrtPhi + + T1 * TempRatioMinus1; + dDeltVthtempzb_dT = T1 / model->B3SOIPDtnom; + + Vthzb = model->B3SOIPDtype * pParam->B3SOIPDvth0 + - Delt_vthzb - DeltVthwzb + pParam->B3SOIPDk3 * tmp2 + + DeltVthtempzb; + dVthzb_dT = dDeltVthtempzb_dT - dDelt_vthzb_dT - dDeltVthwzb_dT; + } /* Calculate n */ - T2 = pParam->B3SOIPDnfactor * EPSSI / Xdep; - dT2_dVb = -T2 / Xdep * dXdep_dVb; - - T3 = pParam->B3SOIPDcdsc + pParam->B3SOIPDcdscb * Vbseff - + pParam->B3SOIPDcdscd * Vds; - dT3_dVb = pParam->B3SOIPDcdscb; - dT3_dVd = pParam->B3SOIPDcdscd; - - T4 = (T2 + T3 * Theta0 + pParam->B3SOIPDcit) / model->B3SOIPDcox; - dT4_dVb = (dT2_dVb + Theta0 * dT3_dVb + dTheta0_dVb * T3) - / model->B3SOIPDcox; - dT4_dVd = Theta0 * dT3_dVd / model->B3SOIPDcox; - - if (T4 >= -0.5) - { - n = 1.0 + T4; - dn_dVb = dT4_dVb; - dn_dVd = dT4_dVd; - } - else - /* avoid discontinuity problems caused by T4 */ - { - T0 = 1.0 / (3.0 + 8.0 * T4); - n = (1.0 + 3.0 * T4) * T0; - T0 *= T0; - dn_dVb = T0 * dT4_dVb; - dn_dVd = T0 * dT4_dVd; - } + T2 = pParam->B3SOIPDnfactor * EPSSI / Xdep; + dT2_dVb = - T2 / Xdep * dXdep_dVb; + + T3 = pParam->B3SOIPDcdsc + pParam->B3SOIPDcdscb * Vbseff + + pParam->B3SOIPDcdscd * Vds; + dT3_dVb = pParam->B3SOIPDcdscb; + dT3_dVd = pParam->B3SOIPDcdscd; + + T4 = (T2 + T3 * Theta0 + pParam->B3SOIPDcit) / model->B3SOIPDcox; + dT4_dVb = (dT2_dVb + Theta0 * dT3_dVb + dTheta0_dVb * T3) + / model->B3SOIPDcox; + dT4_dVd = Theta0 * dT3_dVd / model->B3SOIPDcox; + + if (T4 >= -0.5) + { n = 1.0 + T4; + dn_dVb = dT4_dVb; + dn_dVd = dT4_dVd; + } + else + /* avoid discontinuity problems caused by T4 */ + { T0 = 1.0 / (3.0 + 8.0 * T4); + n = (1.0 + 3.0 * T4) * T0; + T0 *= T0; + dn_dVb = T0 * dT4_dVb; + dn_dVd = T0 * dT4_dVd; + } /* Effective Vgst (Vgsteff) Calculation */ - Vgst = Vgs_eff - Vth; - dVgst_dVg = dVgs_eff_dVg; - dVgst_dVd = -dVth_dVd; - dVgst_dVb = -dVth_dVb; - - T10 = 2.0 * n * Vtm; - VgstNVt = Vgst / T10; - ExpArg = (2.0 * pParam->B3SOIPDvoff - Vgst) / T10; - - /* MCJ: Very small Vgst */ - if (VgstNVt > EXPL_THRESHOLD) - { - Vgsteff = Vgst; - /* T0 is dVgsteff_dVbseff */ - T0 = -dVth_dVb; - dVgsteff_dVg = dVgs_eff_dVg; - dVgsteff_dVd = -dVth_dVd; - dVgsteff_dVb = T0 * dVbseff_dVb; - if (selfheat) - dVgsteff_dT = -dVth_dT; - else - dVgsteff_dT = 0.0; - } - else if (ExpArg > EXPL_THRESHOLD) - { - T0 = (Vgst - pParam->B3SOIPDvoff) / (n * Vtm); - ExpVgst = exp (T0); - Vgsteff = - Vtm * pParam->B3SOIPDcdep0 / model->B3SOIPDcox * ExpVgst; - T3 = Vgsteff / (n * Vtm); - /* T1 is dVgsteff_dVbseff */ - T1 = -T3 * (dVth_dVb + T0 * Vtm * dn_dVb); - dVgsteff_dVg = T3 * dVgs_eff_dVg; - dVgsteff_dVd = -T3 * (dVth_dVd + T0 * Vtm * dn_dVd); - dVgsteff_dVb = T1 * dVbseff_dVb; - if (selfheat) - dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * n) - + Vgsteff / Temp; - else - dVgsteff_dT = 0.0; - } - else - { - ExpVgst = exp (VgstNVt); - T1 = T10 * log (1.0 + ExpVgst); - dT1_dVg = ExpVgst / (1.0 + ExpVgst); - dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) - + T1 / n * dn_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) - + T1 / n * dn_dVd; - T3 = (1.0 / Temp); - if (selfheat) - dT1_dT = -dT1_dVg * (dVth_dT + Vgst * T3) + T1 * T3; - else - dT1_dT = 0.0; - - dT2_dVg = -model->B3SOIPDcox / (Vtm * pParam->B3SOIPDcdep0) - * exp (ExpArg); - T2 = 1.0 - T10 * dT2_dVg; - dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd) - + (T2 - 1.0) / n * dn_dVd; - dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb) - + (T2 - 1.0) / n * dn_dVb; - if (selfheat) - dT2_dT = -dT2_dVg * (dVth_dT - ExpArg * T10 * T3); - else - dT2_dT = 0.0; - - Vgsteff = T1 / T2; - T3 = T2 * T2; - /* T4 is dVgsteff_dVbseff */ - T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - dVgsteff_dVb = T4 * dVbseff_dVb; - dVgsteff_dVg = - (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg; - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; - if (selfheat) - dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) / T3; - else - dVgsteff_dT = 0.0; - } - Vgst2Vtm = Vgsteff + 2.0 * Vtm; - if (selfheat) - dVgst2Vtm_dT = 2.0 * dVtm_dT; - else - dVgst2Vtm_dT = 0.0; + Vgst = Vgs_eff - Vth; + dVgst_dVg = dVgs_eff_dVg; + dVgst_dVd = -dVth_dVd; + dVgst_dVb = -dVth_dVb; + + T10 = 2.0 * n * Vtm; + VgstNVt = Vgst / T10; + ExpArg = (2.0 * pParam->B3SOIPDvoff - Vgst) / T10; + + /* MCJ: Very small Vgst */ + if (VgstNVt > EXPL_THRESHOLD) + { Vgsteff = Vgst; + /* T0 is dVgsteff_dVbseff */ + T0 = -dVth_dVb; + dVgsteff_dVg = dVgs_eff_dVg; + dVgsteff_dVd = -dVth_dVd; + dVgsteff_dVb = T0 * dVbseff_dVb; + if (selfheat) + dVgsteff_dT = -dVth_dT; + else + dVgsteff_dT = 0.0; + } + else if (ExpArg > EXPL_THRESHOLD) + { T0 = (Vgst - pParam->B3SOIPDvoff) / (n * Vtm); + ExpVgst = exp(T0); + Vgsteff = Vtm * pParam->B3SOIPDcdep0 / model->B3SOIPDcox * ExpVgst; + T3 = Vgsteff / (n * Vtm) ; + /* T1 is dVgsteff_dVbseff */ + T1 = -T3 * (dVth_dVb + T0 * Vtm * dn_dVb); + dVgsteff_dVg = T3 * dVgs_eff_dVg; + dVgsteff_dVd = -T3 * (dVth_dVd + T0 * Vtm * dn_dVd); + dVgsteff_dVb = T1 * dVbseff_dVb; + if (selfheat) + dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * n) + + Vgsteff / Temp; + else + dVgsteff_dT = 0.0; + } + else + { ExpVgst = exp(VgstNVt); + T1 = T10 * log(1.0 + ExpVgst); + dT1_dVg = ExpVgst / (1.0 + ExpVgst); + dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) + + T1 / n * dn_dVb; + dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) + + T1 / n * dn_dVd; + T3 = (1.0 / Temp); + if (selfheat) + dT1_dT = -dT1_dVg * (dVth_dT + Vgst * T3) + T1 * T3; + else + dT1_dT = 0.0; + + dT2_dVg = -model->B3SOIPDcox / (Vtm * pParam->B3SOIPDcdep0) + * exp(ExpArg); + T2 = 1.0 - T10 * dT2_dVg; + dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd) + + (T2 - 1.0) / n * dn_dVd; + dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb) + + (T2 - 1.0) / n * dn_dVb; + if (selfheat) + dT2_dT = -dT2_dVg * (dVth_dT - ExpArg * T10 * T3); + else + dT2_dT = 0.0; + + Vgsteff = T1 / T2; + T3 = T2 * T2; + /* T4 is dVgsteff_dVbseff */ + T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; + dVgsteff_dVb = T4 * dVbseff_dVb; + dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) / T3 * dVgs_eff_dVg; + dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; + if (selfheat) + dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) / T3; + else + dVgsteff_dT = 0.0; + } + Vgst2Vtm = Vgsteff + 2.0 * Vtm; + if (selfheat) dVgst2Vtm_dT = 2.0 * dVtm_dT; + else dVgst2Vtm_dT = 0.0; + here->B3SOIPDVgsteff = Vgsteff; /* v2.2.3 bug fix */ /* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - sqrtPhi; - Weff = - pParam->B3SOIPDweff - (2.0 - - here->B3SOIPDnbc) * (pParam->B3SOIPDdwg * - Vgsteff + - pParam->B3SOIPDdwb * - T9); - dWeff_dVg = -(2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdwg; - dWeff_dVb = - -(2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdwb * dsqrtPhis_dVb; - - if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff */ - { - T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; - dWeff_dVg *= T0; - dWeff_dVb *= T0; - } - - T0 = pParam->B3SOIPDprwg * Vgsteff + pParam->B3SOIPDprwb * T9; - if (T0 >= -0.9) - { - Rds = rds0 * (1.0 + T0); - dRds_dVg = rds0 * pParam->B3SOIPDprwg; - dRds_dVb = rds0 * pParam->B3SOIPDprwb * dsqrtPhis_dVb; - - if (selfheat && (Rds != 0.0)) - dRds_dT = (1.0 + T0) * drds0_dT; - else - dRds_dT = 0.0; - - } - else - /* to avoid the discontinuity problem due to prwg and prwb */ - { - T1 = 1.0 / (17.0 + 20.0 * T0); - Rds = rds0 * (0.8 + T0) * T1; - T1 *= T1; - dRds_dVg = rds0 * pParam->B3SOIPDprwg * T1; - dRds_dVb = rds0 * pParam->B3SOIPDprwb * dsqrtPhis_dVb * T1; + T9 = sqrtPhis - sqrtPhi; + Weff = pParam->B3SOIPDweff - (2.0 - here->B3SOIPDnbc) * (pParam->B3SOIPDdwg * Vgsteff + + pParam->B3SOIPDdwb * T9); + dWeff_dVg = -(2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdwg; + dWeff_dVb = -(2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdwb * dsqrtPhis_dVb; + + if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ + { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); + Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; + T0 *= T0 * 4.0e-16; + dWeff_dVg *= T0; + dWeff_dVb *= T0; + } + + T0 = pParam->B3SOIPDprwg * Vgsteff + pParam->B3SOIPDprwb * T9; + if (T0 >= -0.9) + { Rds = rds0 * (1.0 + T0); + dRds_dVg = rds0 * pParam->B3SOIPDprwg; + dRds_dVb = rds0 * pParam->B3SOIPDprwb * dsqrtPhis_dVb; + + if (selfheat && (Rds!=0.0)) dRds_dT = (1.0 + T0) * drds0_dT; + else dRds_dT = 0.0; + + } + else + /* to avoid the discontinuity problem due to prwg and prwb*/ + { T1 = 1.0 / (17.0 + 20.0 * T0); + Rds = rds0 * (0.8 + T0) * T1; + T1 *= T1; + dRds_dVg = rds0 * pParam->B3SOIPDprwg * T1; + dRds_dVb = rds0 * pParam->B3SOIPDprwb * dsqrtPhis_dVb + * T1; - if (selfheat && (Rds != 0.0)) - dRds_dT = (0.8 + T0) * T1 * drds0_dT; - else - dRds_dT = 0.0; + if (selfheat && (Rds!=0.0)) dRds_dT = (0.8 + T0) * T1 * drds0_dT; + else dRds_dT = 0.0; - } + } + here->B3SOIPDrds = Rds; /* v2.2.3 bug fix */ /* Calculate Abulk */ - if (pParam->B3SOIPDa0 == 0.0) - { - - Abulk0 = Abulk = 1.0; - - dAbulk0_dVb = dAbulk_dVg = dAbulk_dVb = 0.0; - } - else - { - T10 = pParam->B3SOIPDketa * Vbsh; - if (T10 >= -0.9) - { - T11 = 1.0 / (1.0 + T10); - dT11_dVb = -pParam->B3SOIPDketa * T11 * T11 * dVbsh_dVb; - } - else - { /* added to avoid the problems caused by Keta */ - T12 = 1.0 / (0.8 + T10); - T11 = (17.0 + 20.0 * T10) * T12; - dT11_dVb = -pParam->B3SOIPDketa * T12 * T12 * dVbsh_dVb; - } - - T10 = pParam->B3SOIPDphi + pParam->B3SOIPDketas; - T13 = (Vbsh * T11) / T10; - dT13_dVb = (Vbsh * dT11_dVb + T11 * dVbsh_dVb) / T10; - - /* limit 1/sqrt(1-T13) to 6, starting at T13=0.96 */ - if (T13 < 0.96) - { - T14 = 1 / sqrt (1 - T13); - T10 = 0.5 * T14 / (1 - T13); - dT14_dVb = T10 * dT13_dVb; - } - else - { - T11 = 1.0 / (1.0 - 1.043406 * T13); - T14 = (6.00167 - 6.26044 * T13) * T11; - T10 = 0.001742 * T11 * T11; - dT14_dVb = T10 * dT13_dVb; - } - - T10 = 0.5 * pParam->B3SOIPDk1eff - / sqrt (pParam->B3SOIPDphi + pParam->B3SOIPDketas); - T1 = T10 * T14; - dT1_dVb = T10 * dT14_dVb; - - T9 = sqrt (model->B3SOIPDxj * Xdep); - tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; - tmp2 = pParam->B3SOIPDa0 * T5; - tmp3 = pParam->B3SOIPDweff + pParam->B3SOIPDb1; - tmp4 = pParam->B3SOIPDb0 / tmp3; - T2 = tmp2 + tmp4; - dT2_dVb = -T9 * tmp2 / tmp1 / Xdep * dXdep_dVb; - T6 = T5 * T5; - T7 = T5 * T6; - - Abulk0 = 1 + T1 * T2; - dAbulk0_dVb = T1 * dT2_dVb + T2 * dT1_dVb; - - T8 = pParam->B3SOIPDags * pParam->B3SOIPDa0 * T7; - dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - - dAbulk_dVb = dAbulk0_dVb - - T8 * Vgsteff * (dT1_dVb + 3.0 * T1 * dT2_dVb / tmp2); - } - - if (Abulk0 < 0.01) - { - T9 = 1.0 / (3.0 - 200.0 * Abulk0); - Abulk0 = (0.02 - Abulk0) * T9; - dAbulk0_dVb *= T9 * T9; - } - - if (Abulk < 0.01) - { - T9 = 1.0 / (3.0 - 200.0 * Abulk); - Abulk = (0.02 - Abulk) * T9; - dAbulk_dVb *= T9 * T9; - } + if (pParam->B3SOIPDa0 == 0.0) { + + Abulk0 = Abulk = 1.0; + + dAbulk0_dVb = dAbulk_dVg = dAbulk_dVb = 0.0; + } + else { + T10 = pParam->B3SOIPDketa * Vbsh; + if (T10 >= -0.9) { + T11 = 1.0 / (1.0 + T10); + dT11_dVb = -pParam->B3SOIPDketa * T11 * T11 * dVbsh_dVb; + } + else { /* added to avoid the problems caused by Keta */ + T12 = 1.0 / (0.8 + T10); + T11 = (17.0 + 20.0 * T10) * T12; + dT11_dVb = -pParam->B3SOIPDketa * T12 * T12 * dVbsh_dVb; + } + + T10 = pParam->B3SOIPDphi + pParam->B3SOIPDketas; + T13 = (Vbsh * T11) / T10; + dT13_dVb = (Vbsh * dT11_dVb + T11 * dVbsh_dVb) / T10; + + /* limit 1/sqrt(1-T13) to 6, starting at T13=0.96 */ + if (T13 < 0.96) { + T14 = 1 / sqrt(1-T13); + T10 = 0.5 * T14 / (1-T13); + dT14_dVb = T10 * dT13_dVb; + } + else { + T11 = 1.0 / (1.0 - 1.043406*T13); + T14 = (6.00167 - 6.26044 * T13) * T11; + T10 = 0.001742 * T11 * T11; + dT14_dVb = T10 * dT13_dVb; + } + + T10 = 0.5 * pParam->B3SOIPDk1eff + / sqrt(pParam->B3SOIPDphi + pParam->B3SOIPDketas); + T1 = T10 * T14; + dT1_dVb = T10 * dT14_dVb; + + T9 = sqrt(model->B3SOIPDxj * Xdep); + tmp1 = Leff + 2.0 * T9; + T5 = Leff / tmp1; + tmp2 = pParam->B3SOIPDa0 * T5; + tmp3 = pParam->B3SOIPDweff + pParam->B3SOIPDb1; + tmp4 = pParam->B3SOIPDb0 / tmp3; + T2 = tmp2 + tmp4; + dT2_dVb = -T9 * tmp2 / tmp1 / Xdep * dXdep_dVb; + T6 = T5 * T5; + T7 = T5 * T6; + + Abulk0 = 1 + T1 * T2; + dAbulk0_dVb = T1 * dT2_dVb + T2 * dT1_dVb; + + T8 = pParam->B3SOIPDags * pParam->B3SOIPDa0 * T7; + dAbulk_dVg = -T1 * T8; + Abulk = Abulk0 + dAbulk_dVg * Vgsteff; + + dAbulk_dVb = dAbulk0_dVb + - T8 * Vgsteff * (dT1_dVb + 3.0 * T1 * dT2_dVb / tmp2); + } + + if (Abulk0 < 0.01) + { + T9 = 1.0 / (3.0 - 200.0 * Abulk0); + Abulk0 = (0.02 - Abulk0) * T9; + dAbulk0_dVb *= T9 * T9; + } + + if (Abulk < 0.01) + { + T9 = 1.0 / (3.0 - 200.0 * Abulk); + Abulk = (0.02 - Abulk) * T9; + dAbulk_dVb *= T9 * T9; + } /* Mobility calculation */ - if (model->B3SOIPDmobMod == 1) - { - T0 = Vgsteff + Vth + Vth; - T2 = ua + uc * Vbseff; - T3 = T0 / model->B3SOIPDtox; - T5 = T3 * (T2 + ub * T3); - dDenomi_dVg = (T2 + 2.0 * ub * T3) / model->B3SOIPDtox; - dDenomi_dVd = dDenomi_dVg * 2 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2 * dVth_dVb + uc * T3; - if (selfheat) - dDenomi_dT = dDenomi_dVg * 2 * dVth_dT - + (dua_dT + Vbseff * duc_dT + dub_dT * T3) * T3; - else - dDenomi_dT = 0.0; - } - else if (model->B3SOIPDmobMod == 2) - { - T5 = Vgsteff / model->B3SOIPDtox * (ua - + uc * Vbseff + ub * Vgsteff - / model->B3SOIPDtox); - dDenomi_dVg = (ua + uc * Vbseff - + 2.0 * ub * Vgsteff / model->B3SOIPDtox) - / model->B3SOIPDtox; - dDenomi_dVd = 0.0; - dDenomi_dVb = Vgsteff * uc / model->B3SOIPDtox; - if (selfheat) - dDenomi_dT = Vgsteff / model->B3SOIPDtox - * (dua_dT + Vbseff * duc_dT + dub_dT - * Vgsteff / model->B3SOIPDtox); - else - dDenomi_dT = 0.0; - } - else /* mobMod == 3 */ - { - T0 = Vgsteff + Vth + Vth; - T2 = 1.0 + uc * Vbseff; - T3 = T0 / model->B3SOIPDtox; - T4 = T3 * (ua + ub * T3); - T5 = T4 * T2; - dDenomi_dVg = (ua + 2.0 * ub * T3) * T2 / model->B3SOIPDtox; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + uc * T4; - if (selfheat) - dDenomi_dT = dDenomi_dVg * 2.0 * dVth_dT - + (dua_dT + dub_dT * T3) * T3 * T2 + T4 * Vbseff * duc_dT; - else - dDenomi_dT = 0.0; - } - - if (T5 >= -0.8) - { - Denomi = 1.0 + T5; - } - else /* Added to avoid the discontinuity problem caused by ua and ub */ - { - T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; - dDenomi_dVg *= T9; - dDenomi_dVd *= T9; - dDenomi_dVb *= T9; - if (selfheat) - dDenomi_dT *= T9; - else - dDenomi_dT = 0.0; - } - - here->B3SOIPDueff = ueff = u0temp / Denomi; - T9 = -ueff / Denomi; - dueff_dVg = T9 * dDenomi_dVg; - dueff_dVd = T9 * dDenomi_dVd; - dueff_dVb = T9 * dDenomi_dVb; - if (selfheat) - dueff_dT = T9 * dDenomi_dT + du0temp_dT / Denomi; - else - dueff_dT = 0.0; + if (model->B3SOIPDmobMod == 1) + { T0 = Vgsteff + Vth + Vth; + T2 = ua + uc * Vbseff; + T3 = T0 / model->B3SOIPDtox; + T5 = T3 * (T2 + ub * T3); + dDenomi_dVg = (T2 + 2.0 * ub * T3) / model->B3SOIPDtox; + dDenomi_dVd = dDenomi_dVg * 2 * dVth_dVd; + dDenomi_dVb = dDenomi_dVg * 2 * dVth_dVb + uc * T3 ; + if (selfheat) + dDenomi_dT = dDenomi_dVg * 2 * dVth_dT + + (dua_dT + Vbseff * duc_dT + + dub_dT * T3 ) * T3; + else + dDenomi_dT = 0.0; + } + else if (model->B3SOIPDmobMod == 2) + { T5 = Vgsteff / model->B3SOIPDtox * (ua + + uc * Vbseff + ub * Vgsteff + / model->B3SOIPDtox); + dDenomi_dVg = (ua + uc * Vbseff + + 2.0 * ub * Vgsteff / model->B3SOIPDtox) + / model->B3SOIPDtox; + dDenomi_dVd = 0.0; + dDenomi_dVb = Vgsteff * uc / model->B3SOIPDtox ; + if (selfheat) + dDenomi_dT = Vgsteff / model->B3SOIPDtox + * (dua_dT + Vbseff * duc_dT + dub_dT + * Vgsteff / model->B3SOIPDtox); + else + dDenomi_dT = 0.0; + } + else /* mobMod == 3 */ + { T0 = Vgsteff + Vth + Vth; + T2 = 1.0 + uc * Vbseff; + T3 = T0 / model->B3SOIPDtox; + T4 = T3 * (ua + ub * T3); + T5 = T4 * T2; + dDenomi_dVg = (ua + 2.0 * ub * T3) * T2 + / model->B3SOIPDtox; + dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; + dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + + uc * T4 ; + if (selfheat) + dDenomi_dT = dDenomi_dVg * 2.0 * dVth_dT + + (dua_dT + dub_dT * T3) * T3 * T2 + + T4 * Vbseff * duc_dT; + else + dDenomi_dT = 0.0; + } + + if (T5 >= -0.8) + { Denomi = 1.0 + T5; + } + else /* Added to avoid the discontinuity problem caused by ua and ub*/ + { T9 = 1.0 / (7.0 + 10.0 * T5); + Denomi = (0.6 + T5) * T9; + T9 *= T9; + dDenomi_dVg *= T9; + dDenomi_dVd *= T9; + dDenomi_dVb *= T9; + if (selfheat) dDenomi_dT *= T9; + else dDenomi_dT = 0.0; + } + + here->B3SOIPDueff = ueff = u0temp / Denomi; + T9 = -ueff / Denomi; + dueff_dVg = T9 * dDenomi_dVg; + dueff_dVd = T9 * dDenomi_dVd; + dueff_dVb = T9 * dDenomi_dVb; + if (selfheat) dueff_dT = T9 * dDenomi_dT + du0temp_dT / Denomi; + else dueff_dT = 0.0; /* Saturation Drain Voltage Vdsat */ - WVCox = Weff * vsattemp * model->B3SOIPDcox; - WVCoxRds = WVCox * Rds; + WVCox = Weff * vsattemp * model->B3SOIPDcox; + WVCoxRds = WVCox * Rds; /* dWVCoxRds_dT = WVCox * dRds_dT + Weff * model->B3SOIPDcox * Rds * dvsattemp_dT; */ - Esat = 2.0 * vsattemp / ueff; - EsatL = Esat * Leff; - T0 = -EsatL / ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - if (selfheat) - dEsatL_dT = T0 * dueff_dT + EsatL / vsattemp * dvsattemp_dT; - else - dEsatL_dT = 0.0; - - /* Sqrt() */ - a1 = pParam->B3SOIPDa1; - if (a1 == 0.0) - { - Lambda = pParam->B3SOIPDa2; - dLambda_dVg = 0.0; - } - else if (a1 > 0.0) + Esat = 2.0 * vsattemp / ueff; + EsatL = Esat * Leff; + T0 = -EsatL /ueff; + dEsatL_dVg = T0 * dueff_dVg; + dEsatL_dVd = T0 * dueff_dVd; + dEsatL_dVb = T0 * dueff_dVb; + if (selfheat) + dEsatL_dT = T0 * dueff_dT + EsatL / vsattemp * dvsattemp_dT; + else + dEsatL_dT = 0.0; + + /* Sqrt() */ + a1 = pParam->B3SOIPDa1; + if (a1 == 0.0) + { Lambda = pParam->B3SOIPDa2; + dLambda_dVg = 0.0; + } + else if (a1 > 0.0) /* Added to avoid the discontinuity problem caused by a1 and a2 (Lambda) */ - { - T0 = 1.0 - pParam->B3SOIPDa2; - T1 = T0 - pParam->B3SOIPDa1 * Vgsteff - 0.0001; - T2 = sqrt (T1 * T1 + 0.0004 * T0); - Lambda = pParam->B3SOIPDa2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->B3SOIPDa1 * (1.0 + T1 / T2); - } - else - { - T1 = pParam->B3SOIPDa2 + pParam->B3SOIPDa1 * Vgsteff - 0.0001; - T2 = sqrt (T1 * T1 + 0.0004 * pParam->B3SOIPDa2); - Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->B3SOIPDa1 * (1.0 + T1 / T2); - } - - if (Rds > 0) - { - tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { - tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - if ((Rds == 0.0) && (Lambda == 1.0)) - { - T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); - tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; - T3 = EsatL * Vgst2Vtm; - Vdsat = T3 * T0; - - dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + EsatL * dAbulk_dVb) * T1; - if (selfheat) - dT0_dT = -(Abulk * dEsatL_dT + dVgst2Vtm_dT) * T1; - else - dT0_dT = 0.0; - - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; - if (selfheat) - dVdsat_dT = T3 * dT0_dT + T2 * dEsatL_dT - + EsatL * T0 * dVgst2Vtm_dT; - else - dVdsat_dT = 0.0; - } - else - { - tmp1 = dLambda_dVg / (Lambda * Lambda); - T9 = Abulk * WVCoxRds; - T8 = Abulk * T9; - T7 = Vgst2Vtm * T9; - T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); - dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - - 1.0) * dAbulk_dVg); + { T0 = 1.0 - pParam->B3SOIPDa2; + T1 = T0 - pParam->B3SOIPDa1 * Vgsteff - 0.0001; + T2 = sqrt(T1 * T1 + 0.0004 * T0); + Lambda = pParam->B3SOIPDa2 + T0 - 0.5 * (T1 + T2); + dLambda_dVg = 0.5 * pParam->B3SOIPDa1 * (1.0 + T1 / T2); + } + else + { T1 = pParam->B3SOIPDa2 + pParam->B3SOIPDa1 * Vgsteff - 0.0001; + T2 = sqrt(T1 * T1 + 0.0004 * pParam->B3SOIPDa2); + Lambda = 0.5 * (T1 + T2); + dLambda_dVg = 0.5 * pParam->B3SOIPDa1 * (1.0 + T1 / T2); + } + + here->B3SOIPDAbovVgst2Vtm = Abulk /Vgst2Vtm; /* v2.2.3 bug fix */ + + if (Rds > 0) + { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; + tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; + } + else + { tmp2 = dWeff_dVg / Weff; + tmp3 = dWeff_dVb / Weff; + } + if ((Rds == 0.0) && (Lambda == 1.0)) + { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); + tmp1 = 0.0; + T1 = T0 * T0; + T2 = Vgst2Vtm * T0; + T3 = EsatL * Vgst2Vtm; + Vdsat = T3 * T0; + + dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; + dT0_dVd = -(Abulk * dEsatL_dVd) * T1; + dT0_dVb = -(Abulk * dEsatL_dVb + EsatL * dAbulk_dVb) * T1; + if (selfheat) + dT0_dT = -(Abulk * dEsatL_dT + dVgst2Vtm_dT) * T1; + else dT0_dT = 0.0; + + dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; + dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; + dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; + if (selfheat) + dVdsat_dT = T3 * dT0_dT + T2 * dEsatL_dT + + EsatL * T0 * dVgst2Vtm_dT; + else dVdsat_dT = 0.0; + } + else + { tmp1 = dLambda_dVg / (Lambda * Lambda); + T9 = Abulk * WVCoxRds; + T8 = Abulk * T9; + T7 = Vgst2Vtm * T9; + T6 = Vgst2Vtm * WVCoxRds; + T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); + dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 + + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); /* dT0_dVb = 2.0 * (T8 * tmp3 this is equivalent to one below, but simpler + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); */ - dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; - - if (selfheat) - { - - if (Rds != 0.0) - tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; - else - tmp4 = dvsattemp_dT / vsattemp; - - dT0_dT = 2.0 * T8 * tmp4; - } - else - tmp4 = dT0_dT = 0.0; - - T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; - - dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 - + - T7 * tmp2 + - T6 * - dAbulk_dVg); - dT1_dVb = - Abulk * dEsatL_dVb + EsatL * dAbulk_dVb + - 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); - dT1_dVd = Abulk * dEsatL_dVd; - - - if (selfheat) - { - tmp4 += dVgst2Vtm_dT / Vgst2Vtm; - dT1_dT = (2.0 / Lambda - 1.0) * dVgst2Vtm_dT - + Abulk * dEsatL_dT + 3.0 * T7 * tmp4; - } - else - dT1_dT = 0.0; - - T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); - dT2_dVd = Vgst2Vtm * dEsatL_dVd; - if (selfheat) - dT2_dT = Vgst2Vtm * dEsatL_dT + EsatL * dVgst2Vtm_dT - + 2.0 * T6 * (dVgst2Vtm_dT + Vgst2Vtm * tmp4); - else - dT2_dT = 0.0; - - T3 = sqrt (T1 * T1 - 2.0 * T0 * T2); - Vdsat = (T1 - T3) / T0; - - dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = - (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - T0 * dT2_dVb) / T3 - - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = - (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; - if (selfheat) - dVdsat_dT = (dT1_dT - (T1 * dT1_dT - dT0_dT * T2 - - T0 * dT2_dT) / T3 - - Vdsat * dT0_dT) / T0; - else - dVdsat_dT = 0.0; - } - here->B3SOIPDvdsat = Vdsat; + dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) + + (1.0 / Lambda - 1.0) * dAbulk_dVb); + dT0_dVd = 0.0; + + if (selfheat) + { + + if (Rds!=0.0) + tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; + else + tmp4 = dvsattemp_dT / vsattemp; + + dT0_dT = 2.0 * T8 * tmp4; + } else tmp4 = dT0_dT = 0.0; + + T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7; + + dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 + + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9 + + T7 * tmp2 + T6 * dAbulk_dVg); + dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb + + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); + dT1_dVd = Abulk * dEsatL_dVd; + + + if (selfheat) + { + tmp4 += dVgst2Vtm_dT / Vgst2Vtm; + dT1_dT = (2.0 / Lambda - 1.0) * dVgst2Vtm_dT + + Abulk * dEsatL_dT + 3.0 * T7 * tmp4; + } else dT1_dT = 0.0; + + T2 = Vgst2Vtm * (EsatL + 2.0 * T6); + dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg + + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); + dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); + dT2_dVd = Vgst2Vtm * dEsatL_dVd; + if (selfheat) + dT2_dT = Vgst2Vtm * dEsatL_dT + EsatL * dVgst2Vtm_dT + + 2.0 * T6 * (dVgst2Vtm_dT + Vgst2Vtm * tmp4); + else + dT2_dT = 0.0; + + T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); + Vdsat = (T1 - T3) / T0; + + dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 + - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; + dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 + - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; + dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; + if (selfheat) + dVdsat_dT = (dT1_dT - (T1 * dT1_dT - dT0_dT * T2 + - T0 * dT2_dT) / T3 - Vdsat * dT0_dT) / T0; + else dVdsat_dT = 0.0; + } + here->B3SOIPDvdsat = Vdsat; /* Effective Vds (Vdseff) Calculation */ - T1 = Vdsat - Vds - pParam->B3SOIPDdelta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; - dT1_dT = dVdsat_dT; - - T2 = sqrt (T1 * T1 + 4.0 * pParam->B3SOIPDdelta * Vdsat); - T0 = T1 / T2; - T3 = 2.0 * pParam->B3SOIPDdelta / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - if (selfheat) - dT2_dT = T0 * dT1_dT + T3 * dVdsat_dT; - else - dT2_dT = 0.0; - - Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - if (selfheat) - dVdseff_dT = dVdsat_dT - 0.5 * (dT1_dT + dT2_dT); - else - dVdseff_dT = 0.0; - - if (Vdseff > Vds) - Vdseff = Vds; /* This code is added to fixed the problem - caused by computer precision when - Vds is very close to Vdseff. */ - diffVds = Vds - Vdseff; - + T1 = Vdsat - Vds - pParam->B3SOIPDdelta; + dT1_dVg = dVdsat_dVg; + dT1_dVd = dVdsat_dVd - 1.0; + dT1_dVb = dVdsat_dVb; + dT1_dT = dVdsat_dT; + + T2 = sqrt(T1 * T1 + 4.0 * pParam->B3SOIPDdelta * Vdsat); + T0 = T1 / T2; + T3 = 2.0 * pParam->B3SOIPDdelta / T2; + dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; + dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; + dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; + if (selfheat) + dT2_dT = T0 * dT1_dT + T3 * dVdsat_dT; + else dT2_dT = 0.0; + + Vdseff = Vdsat - 0.5 * (T1 + T2); + dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); + dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); + dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); + if (selfheat) + dVdseff_dT = dVdsat_dT - 0.5 * (dT1_dT + dT2_dT); + else dVdseff_dT = 0.0; + + if (Vdseff > Vds) + Vdseff = Vds; /* This code is added to fixed the problem + caused by computer precision when + Vds is very close to Vdseff. */ + diffVds = Vds - Vdseff; + here->B3SOIPDVdseff = Vdseff; /* v2.2.3 bug fix */ /* Calculate VAsat */ - tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; - T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - - T7 = 2.0 * WVCoxRds * tmp4; - dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - - dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; - - if (selfheat) - { - - if (Rds != 0.0) - tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; - else - tmp4 = dvsattemp_dT / vsattemp; - - dT0_dT = dEsatL_dT + dVdsat_dT + T7 * tmp4 * Vgsteff - - T8 * (Abulk * dVdsat_dT - Abulk * Vdsat * dVgst2Vtm_dT - / Vgst2Vtm); - } - else - dT0_dT = 0.0; - - T9 = WVCoxRds * Abulk; - T1 = 2.0 / Lambda - 1.0 + T9; - dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); - dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; - if (selfheat) - dT1_dT = T9 * tmp4; - else - dT1_dT = 0.0; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; - if (selfheat) - dVasat_dT = (dT0_dT - Vasat * dT1_dT) / T1; - else - dVasat_dT = 0.0; + tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; + T9 = WVCoxRds * Vgsteff; + T8 = T9 / Vgst2Vtm; + T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; + + T7 = 2.0 * WVCoxRds * tmp4; + dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) + - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm + + Vdsat * dAbulk_dVg); + + dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff + - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); + dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; + + if (selfheat) + { + + if (Rds!=0.0) + tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; + else tmp4 = dvsattemp_dT / vsattemp; + + dT0_dT = dEsatL_dT + dVdsat_dT + T7 * tmp4 * Vgsteff + - T8 * (Abulk * dVdsat_dT - Abulk * Vdsat * dVgst2Vtm_dT + / Vgst2Vtm); + } else + dT0_dT = 0.0; + + T9 = WVCoxRds * Abulk; + T1 = 2.0 / Lambda - 1.0 + T9; + dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); + dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; + if (selfheat) + dT1_dT = T9 * tmp4; + else + dT1_dT = 0.0; + + Vasat = T0 / T1; + dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; + dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; + dVasat_dVd = dT0_dVd / T1; + if (selfheat) dVasat_dT = (dT0_dT - Vasat * dT1_dT) / T1; + else dVasat_dT = 0.0; /* Calculate VACLM */ - if ((pParam->B3SOIPDpclm > 0.0) && (diffVds > 1.0e-10)) - { - T0 = 1.0 / (pParam->B3SOIPDpclm * Abulk * pParam->B3SOIPDlitl); - dT0_dVb = -T0 / Abulk * dAbulk_dVb; - dT0_dVg = -T0 / Abulk * dAbulk_dVg; - - T2 = Vgsteff / EsatL; - T1 = Leff * (Abulk + T2); - dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg); - dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); - dT1_dVd = -T2 * dEsatL_dVd / Esat; - if (selfheat) - dT1_dT = -T2 * dEsatL_dT / Esat; - else - dT1_dT = 0.0; - - T9 = T0 * T1; - VACLM = T9 * diffVds; - dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg - + T1 * diffVds * dT0_dVg; - dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - - T9 * dVdseff_dVb; - dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); - if (selfheat) - dVACLM_dT = T0 * dT1_dT * diffVds - T9 * dVdseff_dT; - else - dVACLM_dT = 0.0; - - } - else - { - VACLM = MAX_EXPL; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = dVACLM_dT = 0.0; - } + if ((pParam->B3SOIPDpclm > 0.0) && (diffVds > 1.0e-10)) + { T0 = 1.0 / (pParam->B3SOIPDpclm * Abulk * pParam->B3SOIPDlitl); + dT0_dVb = -T0 / Abulk * dAbulk_dVb; + dT0_dVg = -T0 / Abulk * dAbulk_dVg; + + T2 = Vgsteff / EsatL; + T1 = Leff * (Abulk + T2); + dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg); + dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); + dT1_dVd = -T2 * dEsatL_dVd / Esat; + if (selfheat) dT1_dT = -T2 * dEsatL_dT / Esat; + else dT1_dT = 0.0; + + T9 = T0 * T1; + VACLM = T9 * diffVds; + dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg + + T1 * diffVds * dT0_dVg; + dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds + - T9 * dVdseff_dVb; + dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); + if (selfheat) + dVACLM_dT = T0 * dT1_dT * diffVds - T9 * dVdseff_dT; + else dVACLM_dT = 0.0; + + } + else + { VACLM = MAX_EXPL; + dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = dVACLM_dT = 0.0; + } /* Calculate VADIBL */ - if (pParam->B3SOIPDthetaRout > 0.0) - { - T8 = Abulk * Vdsat; - T0 = Vgst2Vtm * T8; - T1 = Vgst2Vtm + T8; - dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; - dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; - dT1_dVb = dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb; - dT0_dVb = Vgst2Vtm * dT1_dVb; - dT1_dVd = Abulk * dVdsat_dVd; - dT0_dVd = Vgst2Vtm * dT1_dVd; - if (selfheat) - { - dT0_dT = dVgst2Vtm_dT * T8 + Abulk * Vgst2Vtm * dVdsat_dT; - dT1_dT = dVgst2Vtm_dT + Abulk * dVdsat_dT; - } - else - dT0_dT = dT1_dT = 0.0; - - T9 = T1 * T1; - T2 = pParam->B3SOIPDthetaRout; - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; - dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - if (selfheat) - dVADIBL_dT = - (dVgst2Vtm_dT - dT0_dT / T1 + T0 * dT1_dT / T9) / T2; - else - dVADIBL_dT = 0.0; - - T7 = pParam->B3SOIPDpdiblb * Vbseff; - if (T7 >= -0.9) - { - T3 = 1.0 / (1.0 + T7); - VADIBL *= T3; - dVADIBL_dVg *= T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->B3SOIPDpdiblb) - * T3; - dVADIBL_dVd *= T3; - if (selfheat) - dVADIBL_dT *= T3; - else - dVADIBL_dT = 0.0; - } - else + if (pParam->B3SOIPDthetaRout > 0.0) + { T8 = Abulk * Vdsat; + T0 = Vgst2Vtm * T8; + T1 = Vgst2Vtm + T8; + dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 + + Vgst2Vtm * Vdsat * dAbulk_dVg; + dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; + dT1_dVb = dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb; + dT0_dVb = Vgst2Vtm * dT1_dVb; + dT1_dVd = Abulk * dVdsat_dVd; + dT0_dVd = Vgst2Vtm * dT1_dVd; + if (selfheat) + { + dT0_dT = dVgst2Vtm_dT * T8 + Abulk * Vgst2Vtm * dVdsat_dT; + dT1_dT = dVgst2Vtm_dT + Abulk * dVdsat_dT; + } else + dT0_dT = dT1_dT = 0.0; + + T9 = T1 * T1; + T2 = pParam->B3SOIPDthetaRout; + VADIBL = (Vgst2Vtm - T0 / T1) / T2; + dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; + dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; + dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; + if (selfheat) + dVADIBL_dT = (dVgst2Vtm_dT - dT0_dT/T1 + T0*dT1_dT/T9) / T2; + else dVADIBL_dT = 0.0; + + T7 = pParam->B3SOIPDpdiblb * Vbseff; + if (T7 >= -0.9) + { T3 = 1.0 / (1.0 + T7); + VADIBL *= T3; + dVADIBL_dVg *= T3; + dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->B3SOIPDpdiblb) + * T3; + dVADIBL_dVd *= T3; + if (selfheat) dVADIBL_dT *= T3; + else dVADIBL_dT = 0.0; + } + else /* Added to avoid the discontinuity problem caused by pdiblcb */ - { - T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; - dVADIBL_dVg *= T3; - dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->B3SOIPDpdiblb * T4 * T4; - dVADIBL_dVd *= T3; - if (selfheat) - dVADIBL_dT *= T3; + { T4 = 1.0 / (0.8 + T7); + T3 = (17.0 + 20.0 * T7) * T4; + dVADIBL_dVg *= T3; + dVADIBL_dVb = dVADIBL_dVb * T3 + - VADIBL * pParam->B3SOIPDpdiblb * T4 * T4; + dVADIBL_dVd *= T3; + if (selfheat) dVADIBL_dT *= T3; + else dVADIBL_dT = 0.0; + VADIBL *= T3; + } + } else - dVADIBL_dT = 0.0; - VADIBL *= T3; - } - } - else - { - VADIBL = MAX_EXPL; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = dVADIBL_dT = 0.0; - } + { VADIBL = MAX_EXPL; + dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = dVADIBL_dT = 0.0; + } /* Calculate VA */ - - T8 = pParam->B3SOIPDpvag / EsatL; - T9 = T8 * Vgsteff; - if (T9 > -0.9) - { - T0 = 1.0 + T9; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); - dT0_dVb = -T9 * dEsatL_dVb / EsatL; - dT0_dVd = -T9 * dEsatL_dVd / EsatL; - if (selfheat) - dT0_dT = -T9 * dEsatL_dT / EsatL; - else - dT0_dT = 0.0; - } - else /* Added to avoid the discontinuity problems caused by pvag */ - { - T1 = 1.0 / (17.0 + 20.0 * T9); - T0 = (0.8 + T9) * T1; - T1 *= T1; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; - - T9 *= T1 / EsatL; - dT0_dVb = -T9 * dEsatL_dVb; - dT0_dVd = -T9 * dEsatL_dVd; - if (selfheat) - dT0_dT = -T9 * dEsatL_dT; - else - dT0_dT = 0.0; - } - - tmp1 = VACLM * VACLM; - tmp2 = VADIBL * VADIBL; - tmp3 = VACLM + VADIBL; - - T1 = VACLM * VADIBL / tmp3; - tmp3 *= tmp3; - dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; - dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; - dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; - if (selfheat) - dT1_dT = (tmp1 * dVADIBL_dT + tmp2 * dVACLM_dT) / tmp3; - else - dT1_dT = 0.0; - - Va = Vasat + T0 * T1; - dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; - dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; - dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; - if (selfheat) - dVa_dT = dVasat_dT + T1 * dT0_dT + T0 * dT1_dT; - else - dVa_dT = 0.0; + + T8 = pParam->B3SOIPDpvag / EsatL; + T9 = T8 * Vgsteff; + if (T9 > -0.9) + { T0 = 1.0 + T9; + dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); + dT0_dVb = -T9 * dEsatL_dVb / EsatL; + dT0_dVd = -T9 * dEsatL_dVd / EsatL; + if (selfheat) + dT0_dT = -T9 * dEsatL_dT / EsatL; + else + dT0_dT = 0.0; + } + else /* Added to avoid the discontinuity problems caused by pvag */ + { T1 = 1.0 / (17.0 + 20.0 * T9); + T0 = (0.8 + T9) * T1; + T1 *= T1; + dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; + + T9 *= T1 / EsatL; + dT0_dVb = -T9 * dEsatL_dVb; + dT0_dVd = -T9 * dEsatL_dVd; + if (selfheat) + dT0_dT = -T9 * dEsatL_dT; + else + dT0_dT = 0.0; + } + + tmp1 = VACLM * VACLM; + tmp2 = VADIBL * VADIBL; + tmp3 = VACLM + VADIBL; + + T1 = VACLM * VADIBL / tmp3; + tmp3 *= tmp3; + dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; + dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; + dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; + if (selfheat) + dT1_dT = (tmp1 * dVADIBL_dT + tmp2 * dVACLM_dT ) / tmp3; + else dT1_dT = 0.0; + + Va = Vasat + T0 * T1; + dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; + dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; + dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; + if (selfheat) + dVa_dT = dVasat_dT + T1 * dT0_dT + T0 * dT1_dT; + else dVa_dT = 0.0; /* Calculate Ids */ - CoxWovL = model->B3SOIPDcox * Weff / Leff; - beta = ueff * CoxWovL; - dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff; - dbeta_dVd = CoxWovL * dueff_dVd; - dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff; - if (selfheat) - dbeta_dT = CoxWovL * dueff_dT; - else - dbeta_dT = 0.0; - - T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm + - Vdseff * dAbulk_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) - / Vgst2Vtm; - if (selfheat) - dT0_dT = -0.5 * (Abulk * dVdseff_dT - - Abulk * Vdseff / Vgst2Vtm * dVgst2Vtm_dT) - / Vgst2Vtm; - else - dT0_dT = 0.0; - - fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; - if (selfheat) - dfgche1_dT = Vgsteff * dT0_dT; - else - dfgche1_dT = 0.0; - - T9 = Vdseff / EsatL; - fgche2 = 1.0 + T9; - dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - if (selfheat) - dfgche2_dT = (dVdseff_dT - T9 * dEsatL_dT) / EsatL; - else - dfgche2_dT = 0.0; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - if (selfheat) - dgche_dT = (beta * dfgche1_dT + fgche1 * dbeta_dT - - gche * dfgche2_dT) / fgche2; - else - dgche_dT = 0.0; + CoxWovL = model->B3SOIPDcox * Weff / Leff; + beta = ueff * CoxWovL; + dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff ; + dbeta_dVd = CoxWovL * dueff_dVd; + dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff ; + if (selfheat) dbeta_dT = CoxWovL * dueff_dT; + else dbeta_dT = 0.0; + + T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; + dT0_dVg = -0.5 * (Abulk * dVdseff_dVg + - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; + dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; + dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) + / Vgst2Vtm; + if (selfheat) + dT0_dT = -0.5 * (Abulk * dVdseff_dT + - Abulk * Vdseff / Vgst2Vtm * dVgst2Vtm_dT) + / Vgst2Vtm; + else dT0_dT = 0.0; + + fgche1 = Vgsteff * T0; + dfgche1_dVg = Vgsteff * dT0_dVg + T0; + dfgche1_dVd = Vgsteff * dT0_dVd; + dfgche1_dVb = Vgsteff * dT0_dVb; + if (selfheat) dfgche1_dT = Vgsteff * dT0_dT; + else dfgche1_dT = 0.0; + + T9 = Vdseff / EsatL; + fgche2 = 1.0 + T9; + dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; + dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; + dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; + if (selfheat) dfgche2_dT = (dVdseff_dT - T9 * dEsatL_dT) / EsatL; + else dfgche2_dT = 0.0; + + gche = beta * fgche1 / fgche2; + dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg + - gche * dfgche2_dVg) / fgche2; + dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd + - gche * dfgche2_dVd) / fgche2; + dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb + - gche * dfgche2_dVb) / fgche2; + if (selfheat) + dgche_dT = (beta * dfgche1_dT + fgche1 * dbeta_dT + - gche * dfgche2_dT) / fgche2; + else dgche_dT = 0.0; - T0 = 1.0 + gche * Rds; - T9 = Vdseff / T0; - Idl = gche * T9; + T0 = 1.0 + gche * Rds; + T9 = Vdseff / T0; + Idl = gche * T9; /* Whoa, these formulas for the derivatives of Idl are convoluted, but I verified them to be correct */ - dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 - - Idl * gche / T0 * dRds_dVg; - dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; - dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb - - Idl * dRds_dVb * gche) / T0; - if (selfheat) - dIdl_dT = (gche * dVdseff_dT + T9 * dgche_dT - - Idl * dRds_dT * gche) / T0; - else - dIdl_dT = 0.0; - - T9 = diffVds / Va; - T0 = 1.0 + T9; - here->B3SOIPDids = Ids = Idl * T0 / here->B3SOIPDnseg; - - Gm0 = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; - Gds0 = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - - T9 * dVa_dVd) / Va; - Gmb0 = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; - Gmc = 0.0; - if (selfheat) - GmT0 = T0 * dIdl_dT - Idl * (dVdseff_dT + T9 * dVa_dT) / Va; - else - GmT0 = 0.0; - -/* This includes all dependencies from Vgsteff, Vbseff */ - - Gm = Gm0 * dVgsteff_dVg / here->B3SOIPDnseg; - Gmb = (Gm0 * dVgsteff_dVb + Gmb0 * dVbseff_dVb) / here->B3SOIPDnseg; - Gds = (Gm0 * dVgsteff_dVd + Gds0) / here->B3SOIPDnseg; - if (selfheat) - GmT = (Gm0 * dVgsteff_dT + GmT0) / here->B3SOIPDnseg; - else - GmT = 0.0; - -/* calculate GIDL current */ - T0 = 3 * model->B3SOIPDtox; - /* For drain side */ - T1 = (Vds - Vgs_eff - pParam->B3SOIPDngidl) / T0; - if ((pParam->B3SOIPDagidl <= 0.0) || (pParam->B3SOIPDbgidl <= 0.0) - || (T1 <= 0.0)) - { - Idgidl = Gdgidld = Gdgidlg = 0.0; - } - else - { - dT1_dVd = 1 / T0; - dT1_dVg = -dT1_dVd * dVgs_eff_dVg; - T2 = pParam->B3SOIPDbgidl / T1; - if (T2 < EXPL_THRESHOLD) - { - Idgidl = wdiod * pParam->B3SOIPDagidl * T1 * exp (-T2); - T3 = Idgidl / T1 * (T2 + 1); - Gdgidld = T3 * dT1_dVd; - Gdgidlg = T3 * dT1_dVg; - } - else - { - T3 = wdiod * pParam->B3SOIPDagidl * MIN_EXPL; - Idgidl = T3 * T1; - Gdgidld = T3 * dT1_dVd; - Gdgidlg = T3 * dT1_dVg; - } - } - here->B3SOIPDigidl = Idgidl; - - /* For source side */ - T1 = (-Vgs_eff - pParam->B3SOIPDngidl) / T0; - if ((pParam->B3SOIPDagidl <= 0.0) || (pParam->B3SOIPDbgidl <= 0.0) - || (T1 <= 0.0)) - { - Isgidl = Gsgidlg = 0; - } - else - { - dT1_dVg = -dVgs_eff_dVg / T0; - T2 = pParam->B3SOIPDbgidl / T1; - if (T2 < EXPL_THRESHOLD) - { - Isgidl = wdios * pParam->B3SOIPDagidl * T1 * exp (-T2); - T3 = Isgidl / T1 * (T2 + 1); - Gsgidlg = T3 * dT1_dVg; - } - else - { - T3 = wdios * pParam->B3SOIPDagidl * MIN_EXPL; - Isgidl = T3 * T1; - Gsgidlg = T3 * dT1_dVg; - } - } - -/* calculate diode and BJT current */ - WsTsi = wdios * model->B3SOIPDtsi; - WdTsi = wdiod * model->B3SOIPDtsi; - - NVtm1 = Vtm * pParam->B3SOIPDndiode; - if (selfheat) - dNVtm1_dT = pParam->B3SOIPDndiode * dVtm_dT; - else - dNVtm1_dT = 0; - - T0 = Vbs / NVtm1; - dT0_dVb = 1.0 / NVtm1; - if (selfheat) - dT0_dT = -Vbs / NVtm1 / NVtm1 * dNVtm1_dT; - else - dT0_dT = 0; - DEXP (T0, ExpVbsNVtm, T1); - dExpVbsNVtm_dVb = T1 * dT0_dVb; - if (selfheat) - dExpVbsNVtm_dT = T1 * dT0_dT; - else - dExpVbsNVtm_dT = 0; - - T0 = Vbd / NVtm1; - dT0_dVb = 1.0 / NVtm1; - dT0_dVd = -dT0_dVb; - if (selfheat) - dT0_dT = -Vbd / NVtm1 / NVtm1 * dNVtm1_dT; - else - dT0_dT = 0; - DEXP (T0, ExpVbdNVtm, T1); - dExpVbdNVtm_dVb = T1 * dT0_dVb; - dExpVbdNVtm_dVd = -dExpVbdNVtm_dVb; - if (selfheat) - dExpVbdNVtm_dT = T1 * dT0_dT; - else - dExpVbdNVtm_dT = 0; - - /* Ibs1 / Ibd1 : diffusion current */ - if (jdif == 0) - { - Ibs1 = dIbs1_dVb = dIbs1_dT = Ibd1 = dIbd1_dVb = dIbd1_dVd = - dIbd1_dT = 0; - } - else - { - T0 = WsTsi * jdif; - if (selfheat) - dT0_dT = WsTsi * djdif_dT; - else - dT0_dT = 0; - Ibs1 = T0 * (ExpVbsNVtm - 1); - dIbs1_dVb = T0 * dExpVbsNVtm_dVb; - if (selfheat) - dIbs1_dT = T0 * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dT0_dT; - else - dIbs1_dT = 0; - - T0 = WdTsi * jdif; - if (selfheat) - dT0_dT = WdTsi * djdif_dT; - else - dT0_dT = 0; - Ibd1 = T0 * (ExpVbdNVtm - 1); - dIbd1_dVb = T0 * dExpVbdNVtm_dVb; - dIbd1_dVd = -dIbd1_dVb; - if (selfheat) - dIbd1_dT = T0 * dExpVbdNVtm_dT + (ExpVbdNVtm - 1) * dT0_dT; - else - dIbd1_dT = 0; - } - - /* Ibs2:recombination/trap-assisted tunneling current */ - NVtmf = 0.026 * pParam->B3SOIPDnrecf0 - * (1 + model->B3SOIPDntrecf * (TempRatio - 1)); - NVtmr = 0.026 * model->B3SOIPDnrecr0 - * (1 + model->B3SOIPDntrecr * (TempRatio - 1)); - if (selfheat) - { - dNVtmf_dT = pParam->B3SOIPDnrecf0 * 0.026 - * model->B3SOIPDntrecf * dTempRatio_dT; - dNVtmr_dT = model->B3SOIPDnrecr0 * 0.026 - * model->B3SOIPDntrecr * dTempRatio_dT; - } - else - dNVtmf_dT = dNVtmr_dT = 0; - - if (jrec == 0) - { - Ibs2 = dIbs2_dVb = dIbs2_dT = 0; - Ibd2 = dIbd2_dVb = dIbd2_dVd = dIbd2_dT = 0; - } - else - { - /* forward bias */ - T0 = Vbs / NVtmf; - DEXP (T0, T10, T2); - T4 = 1 / NVtmf; - dT10_dVb = T4 * T2; - if (selfheat) - dT10_dT = -T4 * T2 * Vbs / NVtmf * dNVtmf_dT; - else - dT10_dT = 0.0; - - /* reverse bias */ - if ((pParam->B3SOIPDvrec0 - Vbs) < 1e-3) - { - T11 = -1.0; - dT11_dVb = dT11_dT = 0; - } - else - { - T1 = 1 / (pParam->B3SOIPDvrec0 - Vbs); - T0 = -Vbs / NVtmr * pParam->B3SOIPDvrec0 * T1; - dT0_dVb = - -pParam->B3SOIPDvrec0 / NVtmr * (T1 + Vbs * T1 * T1); - if (selfheat) - dT0_dT = -T0 / NVtmr * dNVtmr_dT; - else - dT0_dT = 0; - - DEXP (T0, T11, T2); - T11 = -T11; - dT11_dVb = -T2 * dT0_dVb; - if (selfheat) - dT11_dT = -T2 * dT0_dT; - else - dT11_dT = 0; - } - T3 = WsTsi * jrec; - Ibs2 = T3 * (T10 + T11); - dIbs2_dVb = T3 * (dT10_dVb + dT11_dVb); - if (selfheat) - dIbs2_dT = - T3 * (dT10_dT + dT11_dT) + WsTsi * (T10 + T11) * djrec_dT; - else - dIbs2_dT = 0; - - /* Ibd2 */ - T0 = Vbd / NVtmf; - DEXP (T0, T10, T2); - T4 = 1 / NVtmf; - dT10_dVb = T4 * T2; - if (selfheat) - dT10_dT = -T4 * T2 * Vbd / NVtmf * dNVtmf_dT; - else - dT10_dT = 0.0; - - if ((pParam->B3SOIPDvrec0 - Vbd) < 1e-3) - { - T11 = -1.0; - dT11_dVb = dT11_dT = 0; - } - else - { - T1 = 1 / (pParam->B3SOIPDvrec0 - Vbd); - T0 = -Vbd / NVtmr * pParam->B3SOIPDvrec0 * T1; - dT0_dVb = - -pParam->B3SOIPDvrec0 / NVtmr * (T1 + Vbd * T1 * T1); - if (selfheat) - dT0_dT = -T0 / NVtmr * dNVtmr_dT; - else - dT0_dT = 0; - DEXP (T0, T11, T2); - T11 = -T11; - dT11_dVb = -T2 * dT0_dVb; - if (selfheat) - dT11_dT = -T2 * dT0_dT; - else - dT11_dT = 0; - } - T3 = WdTsi * jrec; - Ibd2 = T3 * (T10 + T11); - dIbd2_dVb = T3 * (dT10_dVb + dT11_dVb); - dIbd2_dVd = -dIbd2_dVb; - if (selfheat) - dIbd2_dT = - T3 * (dT10_dT + dT11_dT) + WdTsi * (T10 + T11) * djrec_dT; - else - dIbd2_dT = 0; - } - - /* Ibs3/Ibd3: recombination current in neutral body */ - WTsi = pParam->B3SOIPDweff / here->B3SOIPDnseg * model->B3SOIPDtsi; - if (jbjt == 0.0) - { - Ibs3 = dIbs3_dVb = dIbs3_dVd = dIbs3_dT = 0.0; - Ibd3 = dIbd3_dVb = dIbd3_dVd = dIbd3_dT = 0.0; - Ibsdif = dIbsdif_dVb = dIbsdif_dT = 0; - Ibddif = dIbddif_dVb = dIbddif_dVd = dIbddif_dT = 0; - here->B3SOIPDic = Ic = Gcd = Gcb = GcT = 0.0; - } - else - { - Ien = WTsi * jbjt * pParam->B3SOIPDlratio; - if (selfheat) - dIen_dT = WTsi * djbjt_dT * pParam->B3SOIPDlratio; - else - dIen_dT = 0; - - /* high level injection of source side */ - if ((Ehlis = Ahli * (ExpVbsNVtm - 1)) < 1e-5) - { - Ehlis = dEhlis_dVb = dEhlis_dT = 0; - EhlisFactor = 1; - dEhlisFactor_dVb = dEhlisFactor_dT = 0; - } - else - { - dEhlis_dVb = Ahli * dExpVbsNVtm_dVb; - if (selfheat) - dEhlis_dT = - Ahli * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dAhli_dT; - else - dEhlis_dT = 0; - EhlisFactor = 1.0 / sqrt (1 + Ehlis); - T0 = -0.5 * EhlisFactor / (1 + Ehlis); - dEhlisFactor_dVb = T0 * dEhlis_dVb; - if (selfheat) - dEhlisFactor_dT = T0 * dEhlis_dT; - else - dEhlisFactor_dT = 0; - } - - /* high level injection of drain side */ - if ((Ehlid = Ahli * (ExpVbdNVtm - 1)) < 1e-5) - { - Ehlid = dEhlid_dVb = dEhlid_dVd = dEhlid_dT = 0; - EhlidFactor = 1; - dEhlidFactor_dVb = dEhlidFactor_dVd = dEhlidFactor_dT = 0; - } - else - { - dEhlid_dVb = Ahli * dExpVbdNVtm_dVb; - dEhlid_dVd = -dEhlid_dVb; - if (selfheat) - dEhlid_dT = - Ahli * dExpVbdNVtm_dT + (ExpVbdNVtm - 1) * dAhli_dT; - else - dEhlid_dT = 0; - EhlidFactor = 1.0 / sqrt (1 + Ehlid); - T0 = -0.5 * EhlidFactor / (1 + Ehlid); - dEhlidFactor_dVb = T0 * dEhlid_dVb; - dEhlidFactor_dVd = -dEhlidFactor_dVb; - if (selfheat) - dEhlidFactor_dT = T0 * dEhlid_dT; - else - dEhlidFactor_dT = 0; - } - - if ((T0 = (1 - pParam->B3SOIPDarfabjt)) < 1e-2) - { - Ibs3 = dIbs3_dVb = dIbs3_dT = 0; - - dIbs3_dVd = 0; - - Ibd3 = dIbd3_dVb = dIbd3_dVd = dIbd3_dT = 0; - } - else - { - T1 = T0 * Ien; - if (selfheat) - dT1_dT = T0 * dIen_dT; - else - dT1_dT = 0; - - Ibs3 = T1 * (ExpVbsNVtm - 1) * EhlisFactor; - dIbs3_dVb = T1 * (dExpVbsNVtm_dVb * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dVb); - dIbs3_dVd = 0; - if (selfheat) - dIbs3_dT = dT1_dT * (ExpVbsNVtm - 1) * EhlisFactor - + T1 * (dExpVbsNVtm_dT * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dT); - else - dIbs3_dT = 0.0; - - Ibd3 = T1 * (ExpVbdNVtm - 1) * EhlidFactor; - dIbd3_dVb = T1 * (dExpVbdNVtm_dVb * EhlidFactor - + (ExpVbdNVtm - 1) * dEhlidFactor_dVb); - dIbd3_dVd = -dIbd3_dVb; + dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 + - Idl * gche / T0 * dRds_dVg ; + dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; + dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb + - Idl * dRds_dVb * gche) / T0; if (selfheat) - dIbd3_dT = dT1_dT * (ExpVbdNVtm - 1) * EhlidFactor - + T1 * (dExpVbdNVtm_dT * EhlidFactor - + (ExpVbdNVtm - 1) * dEhlidFactor_dT); - else - dIbd3_dT = 0.0; - } - - /* effective diffusion current for capacitance calcu. */ - Iendif = WTsi * jbjt * pParam->B3SOIPDlratiodif; - if (selfheat) - dIendif_dT = WTsi * djbjt_dT * pParam->B3SOIPDlratiodif; - else - dIendif_dT = 0; - - Ibsdif = Iendif * (ExpVbsNVtm - 1) * EhlisFactor; - dIbsdif_dVb = Iendif * (dExpVbsNVtm_dVb * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dVb); - if (selfheat) - dIbsdif_dT = dIendif_dT * (ExpVbsNVtm - 1) * EhlisFactor - + Iendif * (dExpVbsNVtm_dT * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dT); - else - dIbsdif_dT = 0; - - Ibddif = Iendif * (ExpVbdNVtm - 1) * EhlidFactor; - dIbddif_dVb = Iendif * (dExpVbdNVtm_dVb * EhlidFactor - + (ExpVbdNVtm - 1) * dEhlidFactor_dVb); - dIbddif_dVd = -dIbddif_dVb; - if (selfheat) - dIbddif_dT = dIendif_dT * (ExpVbdNVtm - 1) * EhlidFactor - + Iendif * (dExpVbdNVtm_dT * EhlidFactor - + (ExpVbdNVtm - 1) * dEhlidFactor_dT); - else - dIbddif_dT = 0; - - /* Ic: Bjt collector current */ - if ((here->B3SOIPDbjtoff == 1) || (Vds == 0.0)) - { - here->B3SOIPDic = Ic = Gcd = Gcb = GcT = 0.0; - } - else - { - /* second order effects */ - T0 = 1 + (Vbs + Vbd) / pParam->B3SOIPDvearly; - dT0_dVb = 2.0 / pParam->B3SOIPDvearly; - dT0_dVd = -1.0 / pParam->B3SOIPDvearly; - - T1 = Ehlis + Ehlid; - dT1_dVb = dEhlis_dVb + dEhlid_dVb; - dT1_dVd = dEhlid_dVd; - if (selfheat) - dT1_dT = dEhlis_dT + dEhlid_dT; - else - dT1_dT = 0; + dIdl_dT = (gche * dVdseff_dT + T9 * dgche_dT + - Idl * dRds_dT * gche) / T0; + else dIdl_dT = 0.0; + + T9 = diffVds / Va; + T0 = 1.0 + T9; + here->B3SOIPDids = Ids = Idl * T0 / here->B3SOIPDnseg; + + Gm0 = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; + Gds0 = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd + - T9 * dVa_dVd) / Va; + Gmb0 = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; + Gmc = 0.0; + if (selfheat) + GmT0 = T0 * dIdl_dT - Idl * (dVdseff_dT + T9 * dVa_dT) / Va; + else GmT0 = 0.0; - T3 = sqrt (T0 * T0 + 4 * T1); - dT3_dVb = 0.5 / T3 * (2 * T0 * dT0_dVb + 4 * dT1_dVb); - dT3_dVd = 0.5 / T3 * (2 * T0 * dT0_dVd + 4 * dT1_dVd); - if (selfheat) - dT3_dT = 2 * dT1_dT / T3; - else - dT3_dT = 0; +/* This includes all dependencies from Vgsteff, Vbseff */ - T2 = (T0 + T3) / 2.0; - dT2_dVb = (dT0_dVb + dT3_dVb) / 2.0; - dT2_dVd = (dT0_dVd + dT3_dVd) / 2.0; + Gm = Gm0 * dVgsteff_dVg / here->B3SOIPDnseg; + Gmb = (Gm0 * dVgsteff_dVb + Gmb0 * dVbseff_dVb) / here->B3SOIPDnseg; + Gds = (Gm0 * dVgsteff_dVd + Gds0) / here->B3SOIPDnseg; if (selfheat) - dT2_dT = dT3_dT / 2.0; - else - dT2_dT = 0; + GmT = (Gm0 * dVgsteff_dT + GmT0) / here->B3SOIPDnseg; + else GmT = 0.0; - if (T2 < .1) - { - E2ndFactor = 10.0; - dE2ndFactor_dVb = dE2ndFactor_dVd = dE2ndFactor_dT = 0; - } - - else - { - E2ndFactor = 1.0 / T2; - dE2ndFactor_dVb = -E2ndFactor / T2 * dT2_dVb; - dE2ndFactor_dVd = -E2ndFactor / T2 * dT2_dVd; - if (selfheat) - dE2ndFactor_dT = -E2ndFactor / T2 * dT2_dT; - else - dE2ndFactor_dT = 0; - } - - T0 = pParam->B3SOIPDarfabjt * Ien; - if (selfheat) - dT0_dT = pParam->B3SOIPDarfabjt * dIen_dT; - else - dT0_dT = 0; - here->B3SOIPDic = Ic - = T0 * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor; - Gcb = dIc_dVb - = T0 * ((dExpVbsNVtm_dVb - dExpVbdNVtm_dVb) * E2ndFactor - + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVb); - Gcd = dIc_dVd - = T0 * (-dExpVbdNVtm_dVd * E2ndFactor - + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVd); - if (selfheat) - GcT = T0 * (dExpVbsNVtm_dT - dExpVbdNVtm_dT) * E2ndFactor - + dT0_dT * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor - + T0 * (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dT; - else - GcT = 0; - } - } - - /* Ibs4/Ibd4 : tunneling */ - NVtm2 = 0.026 * pParam->B3SOIPDntun; - if (jtun == 0) - { - Ibs4 = Ibd4 = dIbs4_dVb = dIbs4_dT = dIbd4_dVb = dIbd4_dVd = - dIbd4_dT = 0; - } - else - { - if ((pParam->B3SOIPDvtun0 - Vbs) < 1e-3) - Ibs4 = dIbs4_dVb = dIbs4_dT = 0; - else - { - T1 = 1 / (pParam->B3SOIPDvtun0 - Vbs); - T0 = -Vbs / NVtm2 * pParam->B3SOIPDvtun0 * T1; - dT0_dVb = - -pParam->B3SOIPDvtun0 / NVtm2 * (T1 + Vbs * T1 * T1); - - DEXP (T0, T1, T2); - T3 = WsTsi * jtun; - Ibs4 = T3 * (1 - T1); - dIbs4_dVb = -T3 * T2 * dT0_dVb; - if (selfheat) - dIbs4_dT = (1 - T1) * WsTsi * djtun_dT; - else - dIbs4_dT = 0; - } - - if ((pParam->B3SOIPDvtun0 - Vbd) < 1e-3) - { - Ibd4 = dIbd4_dVb = dIbd4_dT = 0; - - dIbd4_dVd = 0; - - } - else - { - T1 = 1 / (pParam->B3SOIPDvtun0 - Vbd); - T0 = -Vbd / NVtm2 * pParam->B3SOIPDvtun0 * T1; - dT0_dVb = - -pParam->B3SOIPDvtun0 / NVtm2 * (T1 + Vbd * T1 * T1); - - DEXP (T0, T1, T2); - T3 = WdTsi * jtun; - Ibd4 = T3 * (1 - T1); - dIbd4_dVb = -T3 * T2 * dT0_dVb; - - dIbd4_dVd = -dIbd4_dVb; - - if (selfheat) - dIbd4_dT = (1 - T1) * WdTsi * djtun_dT; +/* calculate GIDL current */ + T0 = 3 * model->B3SOIPDtox; + /* For drain side */ + T1 = (Vds - Vgs_eff - pParam->B3SOIPDngidl) / T0; + if ((pParam->B3SOIPDagidl <= 0.0) || (pParam->B3SOIPDbgidl <= 0.0) || + (T1 <= 0.0)) + { Idgidl = Gdgidld = Gdgidlg = 0.0; + } + else { + dT1_dVd = 1 / T0; + dT1_dVg = - dT1_dVd * dVgs_eff_dVg; + T2 = pParam->B3SOIPDbgidl / T1; + if (T2 < EXPL_THRESHOLD) + { + Idgidl = wdiod * pParam->B3SOIPDagidl * T1 * exp(-T2); + T3 = Idgidl / T1 * (T2 + 1); + Gdgidld = T3 * dT1_dVd; + Gdgidlg = T3 * dT1_dVg; + } else + { + T3 = wdiod * pParam->B3SOIPDagidl * MIN_EXPL; + Idgidl = T3 * T1 ; + Gdgidld = T3 * dT1_dVd; + Gdgidlg = T3 * dT1_dVg; + } + } + here->B3SOIPDigidl = Idgidl; + + /* For source side */ + T1 = (- Vgs_eff - pParam->B3SOIPDngidl) / T0; + if ((pParam->B3SOIPDagidl <= 0.0) || (pParam->B3SOIPDbgidl <= 0.0) + || (T1 <= 0.0)) + { Isgidl = Gsgidlg = 0; + } else - dIbd4_dT = 0; - } - } - - here->B3SOIPDitun = -Ibd3 - Ibd4; - here->B3SOIPDibs = Ibs = Ibs1 + Ibs2 + Ibs3 + Ibs4; - here->B3SOIPDibd = Ibd = Ibd1 + Ibd2 + Ibd3 + Ibd4; - - Gjsb = dIbs1_dVb + dIbs2_dVb + dIbs3_dVb + dIbs4_dVb; - Gjsd = dIbs3_dVd; - if (selfheat) - GjsT = dIbs1_dT + dIbs2_dT + dIbs3_dT + dIbs4_dT; - else - GjsT = 0.0; + { + dT1_dVg = - dVgs_eff_dVg / T0; + T2 = pParam->B3SOIPDbgidl / T1; + if (T2 < EXPL_THRESHOLD) + { + Isgidl = wdios * pParam->B3SOIPDagidl * T1 * exp(-T2); + T3 = Isgidl / T1 * (T2 + 1); + Gsgidlg = T3 * dT1_dVg; + } else + { + T3 = wdios * pParam->B3SOIPDagidl * MIN_EXPL; + Isgidl = T3 * T1 ; + Gsgidlg = T3 * dT1_dVg; + } + } - Gjdb = dIbd1_dVb + dIbd2_dVb + dIbd3_dVb + dIbd4_dVb; - Gjdd = dIbd1_dVd + dIbd2_dVd + dIbd3_dVd + dIbd4_dVd; - if (selfheat) - GjdT = dIbd1_dT + dIbd2_dT + dIbd3_dT + dIbd4_dT; - else - GjdT = 0.0; +/* calculate diode and BJT current */ + WsTsi = wdios * model->B3SOIPDtsi; + WdTsi = wdiod * model->B3SOIPDtsi; + + NVtm1 = Vtm * pParam->B3SOIPDndiode; + if (selfheat) + dNVtm1_dT = pParam->B3SOIPDndiode * dVtm_dT; + else + dNVtm1_dT = 0; + + T0 = Vbs / NVtm1; + dT0_dVb = 1.0 / NVtm1; + if (selfheat) + dT0_dT = -Vbs / NVtm1 / NVtm1 * dNVtm1_dT; + else + dT0_dT = 0; + DEXP(T0, ExpVbsNVtm, T1); + dExpVbsNVtm_dVb = T1 * dT0_dVb; + if (selfheat) + dExpVbsNVtm_dT = T1 * dT0_dT; + else + dExpVbsNVtm_dT = 0; + + T0 = Vbd / NVtm1; + dT0_dVb = 1.0 / NVtm1; + dT0_dVd = -dT0_dVb; + if (selfheat) + dT0_dT = -Vbd / NVtm1 / NVtm1 * dNVtm1_dT; + else + dT0_dT = 0; + DEXP(T0, ExpVbdNVtm, T1); + dExpVbdNVtm_dVb = T1 * dT0_dVb; + dExpVbdNVtm_dVd = -dExpVbdNVtm_dVb; + if (selfheat) + dExpVbdNVtm_dT = T1 * dT0_dT; + else + dExpVbdNVtm_dT = 0; + + /* Ibs1 / Ibd1 : diffusion current */ + if (jdif == 0) { + Ibs1 = dIbs1_dVb = dIbs1_dT = Ibd1 = dIbd1_dVb = dIbd1_dVd = dIbd1_dT = 0; + } + else { + T0 = WsTsi * jdif; + if (selfheat) + dT0_dT = WsTsi * djdif_dT; + else + dT0_dT = 0; + Ibs1 = T0 * (ExpVbsNVtm - 1); + dIbs1_dVb = T0 * dExpVbsNVtm_dVb; + if (selfheat) + dIbs1_dT = T0 * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dT0_dT; + else + dIbs1_dT = 0; + + T0 = WdTsi * jdif; + if (selfheat) + dT0_dT = WdTsi * djdif_dT; + else + dT0_dT = 0; + Ibd1 = T0 * (ExpVbdNVtm - 1); + dIbd1_dVb = T0 * dExpVbdNVtm_dVb; + dIbd1_dVd = -dIbd1_dVb; + if (selfheat) + dIbd1_dT = T0 * dExpVbdNVtm_dT + (ExpVbdNVtm -1) * dT0_dT; + else + dIbd1_dT = 0; + } + + /* Ibs2:recombination/trap-assisted tunneling current */ + NVtmf = 0.026 * pParam->B3SOIPDnrecf0 + * (1 + model->B3SOIPDntrecf * (TempRatio - 1)); + NVtmr = 0.026 * pParam->B3SOIPDnrecr0 /* v2.2.2 bug fix */ + * (1 + model->B3SOIPDntrecr * (TempRatio - 1)); + if (selfheat) { + dNVtmf_dT = pParam->B3SOIPDnrecf0 * 0.026 + * model->B3SOIPDntrecf * dTempRatio_dT; + dNVtmr_dT = pParam->B3SOIPDnrecr0 * 0.026 /* v2.2.2 bug fix */ + * model->B3SOIPDntrecr * dTempRatio_dT; + } + else + dNVtmf_dT = dNVtmr_dT = 0; + + if (jrec == 0) { + Ibs2 = dIbs2_dVb = dIbs2_dT = 0; + Ibd2 = dIbd2_dVb = dIbd2_dVd = dIbd2_dT = 0; + } + else { + /* forward bias */ + T0 = Vbs / NVtmf; + DEXP(T0,T10,T2); + T4 = 1 / NVtmf; + dT10_dVb = T4 * T2; + if (selfheat) + dT10_dT = - T4 * T2 * Vbs / NVtmf * dNVtmf_dT ; + else dT10_dT = 0.0; + + /* reverse bias */ + if ((pParam->B3SOIPDvrec0 - Vbs) < 1e-3) { + + /* v2.2.3 bug fix */ + T1 = 1e3; + T0 = -Vbs / NVtmr * pParam->B3SOIPDvrec0 * T1; + T11 = -exp(T0); + + dT11_dVb = dT11_dT = 0; + } + else { + T1 = 1 / (pParam->B3SOIPDvrec0 - Vbs); + T0 = -Vbs / NVtmr * pParam->B3SOIPDvrec0 * T1; + dT0_dVb = -pParam->B3SOIPDvrec0 / NVtmr * (T1 + Vbs * T1 * T1) ; + if (selfheat) + dT0_dT = -T0 / NVtmr * dNVtmr_dT; + else dT0_dT = 0; + + DEXP(T0, T11, T2); + T11 = -T11; + dT11_dVb = -T2 * dT0_dVb; + if (selfheat) + dT11_dT = -T2 * dT0_dT; + else dT11_dT = 0; + } + T3 = WsTsi * jrec; + Ibs2 = T3 * (T10 + T11); + dIbs2_dVb = T3 * (dT10_dVb + dT11_dVb); + if (selfheat) + dIbs2_dT = T3 * (dT10_dT + dT11_dT) + WsTsi * (T10 + T11) * djrec_dT; + else dIbs2_dT = 0; + + /* Ibd2 */ + T0 = Vbd / NVtmf; + DEXP(T0,T10,T2); + T4 = 1 / NVtmf; + dT10_dVb = T4 * T2; + if (selfheat) + dT10_dT = - T4 * T2 * Vbd / NVtmf * dNVtmf_dT ; + else dT10_dT = 0.0; + + if ((pParam->B3SOIPDvrec0 - Vbd) < 1e-3) { + + /* v2.2.3 bug fix */ + T1 = 1e3; + T0 = -Vbd / NVtmr * pParam->B3SOIPDvrec0 * T1; + T11 = -exp(T0); + + dT11_dVb = dT11_dT = 0; + } + else { + T1 = 1 / (pParam->B3SOIPDvrec0 - Vbd); + T0 = -Vbd / NVtmr * pParam->B3SOIPDvrec0 * T1; + dT0_dVb = -pParam->B3SOIPDvrec0 / NVtmr * (T1 + Vbd * T1 * T1) ; + if (selfheat) + dT0_dT = -T0 / NVtmr * dNVtmr_dT; + else + dT0_dT = 0; + DEXP(T0, T11, T2); + T11 = - T11; + dT11_dVb = -T2 * dT0_dVb; + if (selfheat) + dT11_dT = -T2 * dT0_dT; + else + dT11_dT = 0; + } + T3 = WdTsi * jrec; + Ibd2 = T3 * (T10 + T11); + dIbd2_dVb = T3 * (dT10_dVb + dT11_dVb); + dIbd2_dVd = -dIbd2_dVb; + if (selfheat) + dIbd2_dT = T3 * (dT10_dT + dT11_dT) + WdTsi * (T10 + T11) * djrec_dT; + else + dIbd2_dT = 0; + } + + /* Ibs3/Ibd3: recombination current in neutral body */ + WTsi = pParam->B3SOIPDweff / here->B3SOIPDnseg * model->B3SOIPDtsi; + if (jbjt == 0.0) + { + Ibs3 = dIbs3_dVb = dIbs3_dVd = dIbs3_dT = 0.0; + Ibd3 = dIbd3_dVb = dIbd3_dVd = dIbd3_dT = 0.0; + Ibsdif = dIbsdif_dVb = dIbsdif_dT = 0; + Ibddif = dIbddif_dVb = dIbddif_dVd = dIbddif_dT = 0; + here->B3SOIPDic = Ic = Gcd = Gcb = GcT = 0.0; + } + else { + Ien = WTsi * jbjt * pParam->B3SOIPDlratio; + if (selfheat) + dIen_dT = WTsi * djbjt_dT * pParam->B3SOIPDlratio; + else + dIen_dT = 0; + + /* high level injection of source side */ + if ((Ehlis = Ahli * (ExpVbsNVtm - 1)) < 1e-5) { + Ehlis = dEhlis_dVb = dEhlis_dT = 0; + EhlisFactor = 1; + dEhlisFactor_dVb = dEhlisFactor_dT = 0; + } + else { + dEhlis_dVb = Ahli * dExpVbsNVtm_dVb; + if (selfheat) + dEhlis_dT = Ahli * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dAhli_dT; + else + dEhlis_dT = 0; + EhlisFactor = 1.0 / sqrt(1 + Ehlis); + T0 = -0.5 * EhlisFactor / (1 + Ehlis); + dEhlisFactor_dVb = T0 * dEhlis_dVb; + if (selfheat) + dEhlisFactor_dT = T0 * dEhlis_dT; + else + dEhlisFactor_dT = 0; + } + + /* high level injection of drain side */ + if ((Ehlid = Ahli * (ExpVbdNVtm - 1)) < 1e-5) { + Ehlid = dEhlid_dVb = dEhlid_dVd = dEhlid_dT = 0; + EhlidFactor = 1; + dEhlidFactor_dVb = dEhlidFactor_dVd = dEhlidFactor_dT = 0; + } + else { + dEhlid_dVb = Ahli * dExpVbdNVtm_dVb; + dEhlid_dVd = -dEhlid_dVb; + if (selfheat) + dEhlid_dT = Ahli * dExpVbdNVtm_dT + (ExpVbdNVtm - 1) * dAhli_dT; + else + dEhlid_dT = 0; + EhlidFactor = 1.0 / sqrt(1 + Ehlid); + T0 = -0.5 * EhlidFactor / (1 + Ehlid); + dEhlidFactor_dVb = T0 * dEhlid_dVb; + dEhlidFactor_dVd = -dEhlidFactor_dVb; + if (selfheat) + dEhlidFactor_dT = T0 * dEhlid_dT; + else + dEhlidFactor_dT = 0; + } + + if ((T0 = (1 - pParam->B3SOIPDarfabjt)) < 1e-2) { + Ibs3 = dIbs3_dVb = dIbs3_dT = 0; + + dIbs3_dVd = 0; + + Ibd3 = dIbd3_dVb = dIbd3_dVd = dIbd3_dT = 0; + } + else { + T1 = T0 * Ien; + if (selfheat) + dT1_dT = T0 * dIen_dT; + else + dT1_dT = 0; + + Ibs3 = T1 * (ExpVbsNVtm - 1) * EhlisFactor; + dIbs3_dVb = T1 * (dExpVbsNVtm_dVb * EhlisFactor + + (ExpVbsNVtm - 1) * dEhlisFactor_dVb); + dIbs3_dVd = 0; + if (selfheat) + dIbs3_dT = dT1_dT * (ExpVbsNVtm - 1) * EhlisFactor + + T1 * (dExpVbsNVtm_dT * EhlisFactor + + (ExpVbsNVtm - 1) * dEhlisFactor_dT); + else + dIbs3_dT = 0.0; + + Ibd3 = T1 * (ExpVbdNVtm - 1) * EhlidFactor; + dIbd3_dVb = T1 * (dExpVbdNVtm_dVb * EhlidFactor + + (ExpVbdNVtm - 1) * dEhlidFactor_dVb); + dIbd3_dVd = -dIbd3_dVb; + if (selfheat) + dIbd3_dT = dT1_dT * (ExpVbdNVtm - 1) * EhlidFactor + + T1 * (dExpVbdNVtm_dT * EhlidFactor + + (ExpVbdNVtm - 1) * dEhlidFactor_dT); + else + dIbd3_dT = 0.0; + } + + /* effective diffusion current for capacitance calcu. */ + Iendif = WTsi * jbjt * pParam->B3SOIPDlratiodif; + if (selfheat) + dIendif_dT = WTsi * djbjt_dT * pParam->B3SOIPDlratiodif; + else + dIendif_dT = 0; + + Ibsdif = Iendif * (ExpVbsNVtm - 1) * EhlisFactor; + dIbsdif_dVb = Iendif * (dExpVbsNVtm_dVb * EhlisFactor + + (ExpVbsNVtm - 1) * dEhlisFactor_dVb); + if (selfheat) + dIbsdif_dT = dIendif_dT * (ExpVbsNVtm - 1) * EhlisFactor + + Iendif * (dExpVbsNVtm_dT * EhlisFactor + + (ExpVbsNVtm - 1) * dEhlisFactor_dT); + else + dIbsdif_dT = 0; + + Ibddif = Iendif * (ExpVbdNVtm - 1) * EhlidFactor; + dIbddif_dVb = Iendif * (dExpVbdNVtm_dVb * EhlidFactor + + (ExpVbdNVtm - 1) * dEhlidFactor_dVb); + dIbddif_dVd = -dIbddif_dVb; + if (selfheat) + dIbddif_dT = dIendif_dT * (ExpVbdNVtm - 1) * EhlidFactor + + Iendif * (dExpVbdNVtm_dT * EhlidFactor + + (ExpVbdNVtm - 1) * dEhlidFactor_dT); + else + dIbddif_dT = 0; + + /* Ic: Bjt collector current */ + if ((here->B3SOIPDbjtoff == 1) || (Vds == 0.0)) { + here->B3SOIPDic = Ic = Gcd = Gcb = GcT = 0.0; + } + else { + /* second order effects */ + T0 = 1 + (Vbs + Vbd) / pParam->B3SOIPDvearly; + dT0_dVb = 2.0 / pParam->B3SOIPDvearly; + dT0_dVd = -1.0 / pParam->B3SOIPDvearly; + + T1 = Ehlis + Ehlid; + dT1_dVb = dEhlis_dVb + dEhlid_dVb; + dT1_dVd = dEhlid_dVd; + if (selfheat) + dT1_dT = dEhlis_dT + dEhlid_dT; + else + dT1_dT = 0; + + T3 = sqrt(T0 * T0 + 4 * T1); + dT3_dVb = 0.5 / T3 * (2 * T0 * dT0_dVb + 4 * dT1_dVb); + dT3_dVd = 0.5 / T3 * (2 * T0 * dT0_dVd + 4 * dT1_dVd); + if (selfheat) + dT3_dT = 2 * dT1_dT / T3; + else + dT3_dT = 0; + + T2 = (T0 + T3) / 2.0; + dT2_dVb = (dT0_dVb + dT3_dVb) / 2.0; + dT2_dVd = (dT0_dVd + dT3_dVd) / 2.0; + if (selfheat) + dT2_dT = dT3_dT /2.0; + else + dT2_dT = 0; + + if (T2 < .1) + { + E2ndFactor = 10.0; + dE2ndFactor_dVb = dE2ndFactor_dVd = dE2ndFactor_dT = 0; + } + + else { + E2ndFactor = 1.0 / T2; + dE2ndFactor_dVb = -E2ndFactor / T2 * dT2_dVb; + dE2ndFactor_dVd = -E2ndFactor / T2 * dT2_dVd; + if (selfheat) + dE2ndFactor_dT = -E2ndFactor / T2 * dT2_dT; + else + dE2ndFactor_dT = 0; + } + + T0 = pParam->B3SOIPDarfabjt * Ien; + if (selfheat) + dT0_dT = pParam->B3SOIPDarfabjt * dIen_dT; + else + dT0_dT = 0; + here->B3SOIPDic = Ic + = T0 * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor; + Gcb = dIc_dVb + = T0 * ((dExpVbsNVtm_dVb - dExpVbdNVtm_dVb) * E2ndFactor + + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVb); + Gcd = dIc_dVd + = T0 * (-dExpVbdNVtm_dVd * E2ndFactor + + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVd); + if (selfheat) + GcT = T0 * (dExpVbsNVtm_dT - dExpVbdNVtm_dT) * E2ndFactor + + dT0_dT * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor + + T0 * (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dT; + else + GcT = 0; + } + } + + /* Ibs4/Ibd4 : tunneling */ + NVtm2 = 0.026 * pParam->B3SOIPDntun; + if (jtun == 0) + { Ibs4 = Ibd4 = dIbs4_dVb = dIbs4_dT = dIbd4_dVb = dIbd4_dVd = dIbd4_dT = 0; + } else + { + if ((pParam->B3SOIPDvtun0 - Vbs) < 1e-3) + { + /* v2.2.3 bug fix */ + T1=1e3; + T0 = -Vbs / NVtm2 * pParam->B3SOIPDvtun0 * T1; + T1 = exp(T0); + T3 = WsTsi * jtun; + Ibs4 = T3 * (1- T1); + + dIbs4_dVb = dIbs4_dT = 0; + } + else { + T1 = 1 / (pParam->B3SOIPDvtun0 - Vbs); + T0 = -Vbs / NVtm2 * pParam->B3SOIPDvtun0 * T1; + dT0_dVb = -pParam->B3SOIPDvtun0 / NVtm2 * (T1 + Vbs * T1 * T1) ; + + DEXP(T0, T1, T2); + T3 = WsTsi * jtun; + Ibs4 = T3 * (1- T1); + dIbs4_dVb = -T3 * T2 * dT0_dVb; + if (selfheat) + dIbs4_dT = (1 - T1) * WsTsi * djtun_dT; + else dIbs4_dT = 0; + } + + if ((pParam->B3SOIPDvtun0 - Vbd) < 1e-3) { + + /* v2.2.3 bug fix */ + T1=1e3; + T0 = -Vbd / NVtm2 * pParam->B3SOIPDvtun0 * T1; + T1 = exp(T0); + T3 = WdTsi * jtun; + Ibd4 = T3 * (1- T1); + + dIbd4_dVb = dIbd4_dT = 0; + dIbd4_dVd = 0; + + } + else { + T1 = 1 / (pParam->B3SOIPDvtun0 - Vbd); + T0 = -Vbd / NVtm2 * pParam->B3SOIPDvtun0 * T1; + dT0_dVb = -pParam->B3SOIPDvtun0 / NVtm2 * (T1 + Vbd * T1 * T1) ; + + DEXP(T0, T1, T2); + T3 = WdTsi * jtun; + Ibd4 = T3 * (1- T1); + dIbd4_dVb = -T3 * T2 * dT0_dVb; + + dIbd4_dVd = -dIbd4_dVb; + + if (selfheat) + dIbd4_dT = (1 - T1) * WdTsi * djtun_dT; + else dIbd4_dT = 0; + } + } + + here->B3SOIPDitun = - Ibd3 - Ibd4; + here->B3SOIPDibs = Ibs = Ibs1 + Ibs2 + Ibs3 + Ibs4; + here->B3SOIPDibd = Ibd = Ibd1 + Ibd2 + Ibd3 + Ibd4; + + Gjsb = dIbs1_dVb + dIbs2_dVb + dIbs3_dVb + dIbs4_dVb; + Gjsd = dIbs3_dVd; + if (selfheat) GjsT = dIbs1_dT + dIbs2_dT + dIbs3_dT + dIbs4_dT; + else GjsT = 0.0; + + Gjdb = dIbd1_dVb + dIbd2_dVb + dIbd3_dVb + dIbd4_dVb; + Gjdd = dIbd1_dVd + dIbd2_dVd + dIbd3_dVd + dIbd4_dVd; + if (selfheat) GjdT = dIbd1_dT + dIbd2_dT + dIbd3_dT + dIbd4_dT; + else GjdT = 0.0; /* v2.2: calculate gate-tunneling-to-body current */ - if (model->B3SOIPDigMod >= 1) - { - Vgb = Vgs_eff - Vbs; - dVgb_dVg = dVgs_eff_dVg; - dVgb_dVb = -1; - - /* Calculate Vox first */ - Vfb = - model->B3SOIPDtype * pParam->B3SOIPDvth0 - phi - - pParam->B3SOIPDk1eff * sqrtPhi; - - T3 = Vfb - Vgs_eff + Vbs - DELTA_3; - dT3_dVg = -dVgs_eff_dVg; - dT3_dVd = 0; - dT3_dVb = 1; - - if (Vfb <= 0.0) - { - T0 = sqrt (T3 * T3 - 4.0 * DELTA_3 * Vfb); - dT0_dVg = 1.0 / (2.0 * T0) * 2.0 * T3 * dT3_dVg; - dT0_dVb = 0.5 * (1.0 / T0) * 2.0 * T3 * dT3_dVb; - } - else - { - T0 = sqrt (T3 * T3 + 4.0 * DELTA_3 * Vfb); - dT0_dVg = 1.0 / (2.0 * T0) * 2.0 * T3 * dT3_dVg; - dT0_dVb = 0.5 * (1.0 / T0) * 2.0 * T3 * dT3_dVb; - } - - Vfbeff = Vfb - 0.5 * (T3 + T0); - dVfbeff_dVg = -0.5 * (dT3_dVg + dT0_dVg); - dVfbeff_dVb = -0.5 * (dT3_dVb + dT0_dVb); - - Voxacc = Vfb - Vfbeff; - dVoxacc_dVg = -dVfbeff_dVg; - dVoxacc_dVd = 0.0; - dVoxacc_dVb = -dVfbeff_dVb; - if (Voxacc < 0.0) - Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0; - - T0 = Vgs_eff - Vgsteff - Vfbeff - Vbseff; - dT0_dVg = dVgs_eff_dVg - dVgsteff_dVg - dVfbeff_dVg; - dT0_dVd = -dVgsteff_dVd; - dT0_dVb = -dVgsteff_dVb - dVfbeff_dVb - dVbseff_dVb; - if (selfheat) - dT0_dT = -dVgsteff_dT; - - if (pParam->B3SOIPDk1eff == 0.0) - { - Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd = dVoxdepinv_dVb - = dVoxdepinv_dT = 0.0; - } - else - { - if (T0 < 0.0) - { - T1 = T0 / pParam->B3SOIPDk1eff; - dT1_dVg = dT0_dVg / pParam->B3SOIPDk1eff; - dT1_dVd = dT0_dVd / pParam->B3SOIPDk1eff; - dT1_dVb = dT0_dVb / pParam->B3SOIPDk1eff; - if (selfheat) - dT1_dT = dT0_dT / pParam->B3SOIPDk1eff; - } - else - { - T1 = pParam->B3SOIPDk1eff / 2 * (-1 + sqrt (1 + - 4 * T0 / - pParam-> - B3SOIPDk1eff - / - pParam-> - B3SOIPDk1eff)); - T2 = - pParam->B3SOIPDk1eff / 2 * 0.5 / sqrt (1 + - 4 * T0 / - pParam-> - B3SOIPDk1eff / - pParam-> - B3SOIPDk1eff) * - 4 / pParam->B3SOIPDk1eff / pParam->B3SOIPDk1eff; - dT1_dVg = T2 * dT0_dVg; - dT1_dVd = T2 * dT0_dVd; - dT1_dVb = T2 * dT0_dVb; - if (selfheat) - dT1_dT = T2 * dT0_dT; - } - - Voxdepinv = Vgs_eff - (T1 * T1 + Vbs) - Vfb; - dVoxdepinv_dVg = dVgs_eff_dVg - (2.0 * T1 * dT1_dVg); - dVoxdepinv_dVd = -(2.0 * T1 * dT1_dVd); - dVoxdepinv_dVb = -(2.0 * T1 * dT1_dVb + 1); - if (selfheat) - dVoxdepinv_dT = -(2.0 * T1 * dT1_dT); - } - - - OxideRatio = pParam->B3SOIPDoxideRatio; - - Vox = Voxdepinv; - /* Voxeff is Vox limited below Voxh */ - T0 = model->B3SOIPDvoxh; - T1 = T0 - Vox - model->B3SOIPDdeltavox; - T3 = sqrt (T1 * T1 + 4 * model->B3SOIPDdeltavox * T0); - Voxeff = T0 - 0.5 * (T1 + T3); - dVoxeff_dVox = 0.5 * (1.0 + T1 / T3); - - Vox = Voxeff; - dVox_dVg = dVoxdepinv_dVg * dVoxeff_dVox; - dVox_dVd = dVoxdepinv_dVd * dVoxeff_dVox; - dVox_dVb = dVoxdepinv_dVb * dVoxeff_dVox; - dVox_dT = dVoxdepinv_dT * dVoxeff_dVox; - - - T0 = (Vox - model->B3SOIPDebg) / model->B3SOIPDnevb / Vtm; - if (selfheat) - dT0_dT = - (dVox_dT / Vtm - - (Vox - - model->B3SOIPDebg) / Vtm / Vtm * dVtm_dT) / - model->B3SOIPDnevb; - - DEXP (T0, T1, T2); /* T1=exp(T0), T2=dT1_dT0 */ - if (selfheat) - dT1_dT = T2 * dT0_dT; - - Vaux = model->B3SOIPDnevb * Vtm * log (1 + T1); - dVaux_dVg = T2 / (1 + T1) * dVox_dVg; - dVaux_dVd = T2 / (1 + T1) * dVox_dVd; - dVaux_dVb = T2 / (1 + T1) * dVox_dVb; - if (selfheat) - dVaux_dT = model->B3SOIPDnevb * (dVtm_dT * log (1 + T1) - + Vtm * dT1_dT / (1 + T1)); - - if (model->B3SOIPDvgb1 != 0) - { - T0 = 1 - Vox / model->B3SOIPDvgb1; - dT0_dVox = -1.0 / model->B3SOIPDvgb1; - if (selfheat) - dT0_dT = -dVox_dT / model->B3SOIPDvgb1; - } - else - { - T0 = 1; - dT0_dVox = dT0_dT = 0.0; - } - - if (T0 < 0.01) - { - T0 = 0.01; - dT0_dVox = dT0_dT = 0.0; - } - - T1 = Leff * Weff * 3.7622e-7 * OxideRatio; - T2 = -3.1051e10 * model->B3SOIPDtoxqm; - T3 = model->B3SOIPDalphaGB1; - T4 = model->B3SOIPDbetaGB1; - - T6 = T2 * (T3 - T4 * Vox) / T0; - if (selfheat) - dT6_dT = -T2 * T4 * dVox_dT / T0 - T6 / T0 * dT0_dT; - - DEXP (T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */ - dT5_dVg = - -T7 * dVox_dVg * T2 / T0 * (T4 + - (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVd = - -T7 * dVox_dVd * T2 / T0 * (T4 + - (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVb = - -T7 * dVox_dVb * T2 / T0 * (T4 + - (T3 - T4 * Vox) / T0 * dT0_dVox); - if (selfheat) - dT5_dT = T7 * dT6_dT; - - Igb1 = T1 * Vgb * Vaux * T5; - dIgb1_dVg = T1 * (Vgb * Vaux * dT5_dVg + dVgb_dVg * Vaux * T5 + - Vgb * T5 * dVaux_dVg); - dIgb1_dVd = T1 * (Vgb * Vaux * dT5_dVd + Vgb * T5 * dVaux_dVd); - dIgb1_dVb = T1 * (Vgb * Vaux * dT5_dVb + dVgb_dVb * Vaux * T5 + - Vgb * T5 * dVaux_dVb); - if (selfheat) - dIgb1_dT = T1 * Vgb * (Vaux * dT5_dT + T5 * dVaux_dT); - else - dIgb1_dT = 0.0; - - - Vox = Voxacc; - /* Voxeff is Vox limited below Voxh */ - T0 = model->B3SOIPDvoxh; - T1 = T0 - Vox - model->B3SOIPDdeltavox; - T3 = sqrt (T1 * T1 + 4 * model->B3SOIPDdeltavox * T0); - Voxeff = T0 - 0.5 * (T1 + T3); - dVoxeff_dVox = 0.5 * (1.0 + T1 / T3); - - Vox = Voxeff; - dVox_dVg = dVoxacc_dVg * dVoxeff_dVox; - dVox_dVd = dVoxacc_dVd * dVoxeff_dVox; - dVox_dVb = dVoxacc_dVb * dVoxeff_dVox; - dVox_dT = 0; - - T0 = (-Vgb + (Vfb)) / model->B3SOIPDnecb / Vtm; - if (selfheat) - dT0_dT = -T0 / Vtm * dVtm_dT; - - DEXP (T0, T1, T2); /* T1=exp(T0), T2=dT1_dT0 */ - if (selfheat) - dT1_dT = T2 * dT0_dT; - - Vaux = model->B3SOIPDnecb * Vtm * log (1 + T1); - dVaux_dVg = -T2 / (1 + T1); - dVaux_dVd = 0; - dVaux_dVb = -dVaux_dVg; - if (selfheat) - dVaux_dT = model->B3SOIPDnecb * (dVtm_dT * log (1 + T1) - + Vtm * dT1_dT / (1 + T1)); - - if (model->B3SOIPDvgb2 != 0) - { - T0 = 1 - Vox / model->B3SOIPDvgb2; - dT0_dVox = -1.0 / model->B3SOIPDvgb2; - if (selfheat) - dT0_dT = -dVox_dT / model->B3SOIPDvgb2; - } - else - { - T0 = 1; - dT0_dVox = dT0_dT = 0.0; - } - - if (T0 < 0.01) - { - T0 = 0.01; - dT0_dVox = dT0_dT = 0.0; - } - - T1 = Leff * Weff * 4.9758e-7 * OxideRatio; - T2 = -2.357e10 * model->B3SOIPDtoxqm; - T3 = model->B3SOIPDalphaGB2; - T4 = model->B3SOIPDbetaGB2; - - T6 = T2 * (T3 - T4 * Vox) / T0; - if (selfheat) - dT6_dT = -T2 * T4 * dVox_dT / T0 - T6 / T0 * dT0_dT; - - DEXP (T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */ - dT5_dVg = - -T7 * dVox_dVg * T2 / T0 * (T4 + - (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVd = - -T7 * dVox_dVd * T2 / T0 * (T4 + - (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVb = - -T7 * dVox_dVb * T2 / T0 * (T4 + - (T3 - T4 * Vox) / T0 * dT0_dVox); - if (selfheat) - dT5_dT = T7 * dT6_dT; - - Igb2 = T1 * Vgb * Vaux * T5; - dIgb2_dVg = T1 * (Vgb * Vaux * dT5_dVg + dVgb_dVg * Vaux * T5 + - Vgb * T5 * dVaux_dVg); - dIgb2_dVd = T1 * (Vgb * Vaux * dT5_dVd + Vgb * T5 * dVaux_dVd); - dIgb2_dVb = T1 * (Vgb * Vaux * dT5_dVb + dVgb_dVb * Vaux * T5 + - Vgb * T5 * dVaux_dVb); - if (selfheat) - dIgb2_dT = T1 * Vgb * (Vaux * dT5_dT + T5 * dVaux_dT); - else - dIgb2_dT = 0.0; - - - Igb = Igb1 + Igb2; - /* Igb1 dominates in inversion region, while Igb2 doninates in accumulation */ - dIgb_dVg = dIgb1_dVg + dIgb2_dVg; - dIgb_dVd = dIgb1_dVd + dIgb2_dVd; - dIgb_dVb = dIgb1_dVb + dIgb2_dVb; - dIgb_dT = dIgb1_dT + dIgb2_dT; - - } - else - { - Igb = 0.0; - dIgb_dVg = 0.0; - dIgb_dVd = 0.0; - dIgb_dVb = 0.0; - dIgb_dT = 0.0; - } - - here->B3SOIPDig = Igb; - here->B3SOIPDgigg = dIgb_dVg; - here->B3SOIPDgigd = dIgb_dVd; - here->B3SOIPDgigb = dIgb_dVb; - here->B3SOIPDgigs = -(dIgb_dVg + dIgb_dVd + dIgb_dVb); - here->B3SOIPDgigT = dIgb_dT; + if (model->B3SOIPDigMod >= 1) { + Vgb = Vgs_eff - Vbs; + dVgb_dVg = dVgs_eff_dVg; + dVgb_dVb = -1; + + /* Calculate Vox first */ + Vfb = model->B3SOIPDtype * pParam->B3SOIPDvth0 - phi - pParam->B3SOIPDk1eff * sqrtPhi; + + T3 = Vfb - Vgs_eff + Vbs - DELTA_3; + dT3_dVg = -dVgs_eff_dVg; + dT3_dVd = 0; + dT3_dVb = 1; + + if (Vfb <= 0.0) { + T0 = sqrt(T3 * T3 - 4.0 * DELTA_3 * Vfb); + dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg; + dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb; + } + else { + T0 = sqrt(T3 * T3 + 4.0 * DELTA_3 * Vfb); + dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg; + dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb; + } + + Vfbeff = Vfb - 0.5 * (T3 + T0); + dVfbeff_dVg = -0.5 * (dT3_dVg + dT0_dVg); + dVfbeff_dVb = -0.5 * (dT3_dVb + dT0_dVb); + + Voxacc = Vfb - Vfbeff; + dVoxacc_dVg = -dVfbeff_dVg; + dVoxacc_dVd = 0.0; + dVoxacc_dVb = -dVfbeff_dVb; + if (Voxacc < 0.0) + Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0; + + T0 = Vgs_eff - Vgsteff - Vfbeff - Vbseff; + dT0_dVg = dVgs_eff_dVg - dVgsteff_dVg - dVfbeff_dVg; + dT0_dVd = -dVgsteff_dVd; + dT0_dVb = -dVgsteff_dVb - dVfbeff_dVb - dVbseff_dVb; + if (selfheat) + dT0_dT = -dVgsteff_dT; + + if (pParam->B3SOIPDk1eff == 0.0) { + Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd = dVoxdepinv_dVb + = dVoxdepinv_dT = 0.0; + } else { + if (T0 < 0.0) { + T1 = T0/pParam->B3SOIPDk1eff; + dT1_dVg = dT0_dVg/pParam->B3SOIPDk1eff; + dT1_dVd = dT0_dVd/pParam->B3SOIPDk1eff; + dT1_dVb = dT0_dVb/pParam->B3SOIPDk1eff; + if (selfheat) dT1_dT = dT0_dT/pParam->B3SOIPDk1eff; + } + else { + T1 = pParam->B3SOIPDk1eff/2*(-1 + sqrt(1 + + 4*T0/pParam->B3SOIPDk1eff/pParam->B3SOIPDk1eff)); + T2 = pParam->B3SOIPDk1eff/2 * + 0.5/sqrt(1 + 4*T0/pParam->B3SOIPDk1eff/pParam->B3SOIPDk1eff) * + 4/pParam->B3SOIPDk1eff/pParam->B3SOIPDk1eff; + dT1_dVg = T2 * dT0_dVg; + dT1_dVd = T2 * dT0_dVd; + dT1_dVb = T2 * dT0_dVb; + if (selfheat) + dT1_dT = T2 * dT0_dT; + } + + Voxdepinv = Vgs_eff - (T1*T1 + Vbs) - Vfb; + dVoxdepinv_dVg = dVgs_eff_dVg - (2.0*T1*dT1_dVg); + dVoxdepinv_dVd = -(2.0*T1*dT1_dVd); + dVoxdepinv_dVb = -(2.0*T1*dT1_dVb + 1); + if (selfheat) + dVoxdepinv_dT = -(2.0*T1*dT1_dT); + } + + + OxideRatio = pParam->B3SOIPDoxideRatio; + + Vox = Voxdepinv; + /* Voxeff is Vox limited below Voxh */ + T0 = model->B3SOIPDvoxh; + T1 = T0 - Vox - model->B3SOIPDdeltavox; + T3 = sqrt(T1 * T1 + 4*model->B3SOIPDdeltavox * T0); + Voxeff = T0 - 0.5 * (T1 + T3); + dVoxeff_dVox = 0.5 * (1.0 + T1 / T3); + + Vox = Voxeff; + dVox_dVg = dVoxdepinv_dVg * dVoxeff_dVox; + dVox_dVd = dVoxdepinv_dVd * dVoxeff_dVox; + dVox_dVb = dVoxdepinv_dVb * dVoxeff_dVox; + dVox_dT = dVoxdepinv_dT * dVoxeff_dVox; + + + T0 = (Vox - model->B3SOIPDebg)/model->B3SOIPDvevb; + if (selfheat) + dT0_dT = dVox_dT /model->B3SOIPDvevb; + + DEXP(T0, T1, T2); /* T1=exp(T0), T2=dT1_dT0 */ + if (selfheat) + dT1_dT = T2 * dT0_dT; + + Vaux = model->B3SOIPDvevb * log(1 + T1); + dVaux_dVg = T2 / (1 + T1) * dVox_dVg; + dVaux_dVd = T2 / (1 + T1) * dVox_dVd; + dVaux_dVb = T2 / (1 + T1) * dVox_dVb; + if (selfheat) + dVaux_dT = T2 / (1 + T1) * dVox_dT; + + if (model->B3SOIPDvgb1 != 0) { + T0 = 1 - Vox / model->B3SOIPDvgb1; + dT0_dVox = -1.0/model->B3SOIPDvgb1; + if (selfheat) + dT0_dT = -dVox_dT / model->B3SOIPDvgb1; + } else { + T0 = 1; + dT0_dVox = dT0_dT = 0.0; + } + + if (T0 < 0.01) { + T0 = 0.01; + dT0_dVox = dT0_dT = 0.0; + } + +/* v2.2.3 bug fix */ + T1 = Leff * Weff * 3.7622e-7 * OxideRatio / here->B3SOIPDnseg; + + T2 = -3.1051e10 * model->B3SOIPDtoxqm; + T3 = model->B3SOIPDalphaGB1; + T4 = model->B3SOIPDbetaGB1; + + T6 = T2*(T3 - T4 * Vox) / T0; + if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT; + + DEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */ + dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); + dT5_dVd = -T7 * dVox_dVd * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); + dT5_dVb = -T7 * dVox_dVb * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); + if (selfheat) + dT5_dT = T7 * dT6_dT; + + Igb1 = T1 * Vgb * Vaux * T5; + dIgb1_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 + + Vgb*T5*dVaux_dVg); + dIgb1_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd); + dIgb1_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 + + Vgb*T5*dVaux_dVb); + if (selfheat) + dIgb1_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT); + else dIgb1_dT = 0.0; + + + Vox = Voxacc; + /* Voxeff is Vox limited below Voxh */ + T0 = model->B3SOIPDvoxh; + T1 = T0 - Vox - model->B3SOIPDdeltavox; + T3 = sqrt(T1 * T1 + 4*model->B3SOIPDdeltavox * T0); + Voxeff = T0 - 0.5 * (T1 + T3); + dVoxeff_dVox = 0.5 * (1.0 + T1 / T3); + + Vox = Voxeff; + dVox_dVg = dVoxacc_dVg * dVoxeff_dVox; + dVox_dVd = dVoxacc_dVd * dVoxeff_dVox; + dVox_dVb = dVoxacc_dVb * dVoxeff_dVox; + dVox_dT = 0; + + T0 = (-Vgb+(Vfb))/model->B3SOIPDvecb; + if (selfheat) + dT0_dT = 0; + + DEXP(T0, T1, T2); /* T1=exp(T0), T2=dT1_dT0 */ + if (selfheat) + dT1_dT = 0; + + Vaux = model->B3SOIPDvecb* log(1 + T1); + dVaux_dVg = -T2 / (1 + T1); + dVaux_dVd = 0; + dVaux_dVb = -dVaux_dVg; + if (selfheat) + dVaux_dT = 0; + + if (model->B3SOIPDvgb2 != 0) { + T0 = 1 - Vox / model->B3SOIPDvgb2; + dT0_dVox = -1.0/model->B3SOIPDvgb2; + if (selfheat) dT0_dT = -dVox_dT / model->B3SOIPDvgb2; + } else { + T0 = 1; + dT0_dVox = dT0_dT =0.0; + } + + if (T0 < 0.01) { + T0 = 0.01; + dT0_dVox = dT0_dT =0.0; + } + +/* v2.2.3 bug fix */ + T1 = Leff * Weff * 4.9758e-7 * OxideRatio / here->B3SOIPDnseg; + + T2 = -2.357e10 * model->B3SOIPDtoxqm; + T3 = model->B3SOIPDalphaGB2; + T4 = model->B3SOIPDbetaGB2; + + T6 = T2*(T3 - T4 * Vox) / T0; + if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT; + + DEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */ + dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); + dT5_dVd = -T7 * dVox_dVd * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); + dT5_dVb = -T7 * dVox_dVb * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); + if (selfheat) + dT5_dT = T7 * dT6_dT; + + Igb2 = T1 * Vgb * Vaux * T5; + dIgb2_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 + + Vgb*T5*dVaux_dVg); + dIgb2_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd); + dIgb2_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 + + Vgb*T5*dVaux_dVb); + if (selfheat) + dIgb2_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT); + else dIgb2_dT = 0.0; + + +/* Igb1 dominates in inversion region, while Igb2 doninates in accumulation */ +/* v2.2.3 bug fix for residue at low Vgb */ + if (Vgb >= 0) + { + Igb = Igb1; + dIgb_dVg = dIgb1_dVg; + dIgb_dVd = dIgb1_dVd; + dIgb_dVb = dIgb1_dVb; + dIgb_dT = dIgb1_dT; + } + else + { + Igb = Igb2; + dIgb_dVg = dIgb2_dVg; + dIgb_dVd = dIgb2_dVd; + dIgb_dVb = dIgb2_dVb; + dIgb_dT = dIgb2_dT; + } + + + } + else { + Igb = 0.0; + dIgb_dVg = 0.0; + dIgb_dVd = 0.0; + dIgb_dVb = 0.0; + dIgb_dT = 0.0; + } + + here->B3SOIPDig = Igb; + here->B3SOIPDgigg = dIgb_dVg; + here->B3SOIPDgigd = dIgb_dVd; + here->B3SOIPDgigb = dIgb_dVb; + here->B3SOIPDgigs = -(dIgb_dVg + dIgb_dVd + dIgb_dVb); + here->B3SOIPDgigT = dIgb_dT; /* end of v2.2 gate current */ /* calculate substrate current Iii */ - if (pParam->B3SOIPDalpha0 <= 0.0) - { - Giig = Giib = Giid = GiiT = 0.0; - here->B3SOIPDiii = Iii = 0.0; - } - else - { - Vdsatii0 = - pParam->B3SOIPDvdsatii0 * (1 + - model->B3SOIPDtii * (TempRatio - - 1.0)) - - pParam->B3SOIPDlii / Leff; - if (selfheat) - dVdsatii0_dT = - pParam->B3SOIPDvdsatii0 * model->B3SOIPDtii * dTempRatio_dT; - else - dVdsatii0_dT = 0; - - /* Calculate VgsStep */ - T0 = pParam->B3SOIPDesatii * Leff; - T1 = pParam->B3SOIPDsii0 * T0 / (1.0 + T0); - - T0 = 1 / (1 + pParam->B3SOIPDsii1 * Vgsteff); - if (selfheat) - dT0_dT = -pParam->B3SOIPDsii1 * T0 * T0 * dVgsteff_dT; - else - dT0_dT = 0; - T3 = T0 + pParam->B3SOIPDsii2; - T4 = Vgst * pParam->B3SOIPDsii1 * T0 * T0; - T2 = Vgst * T3; - dT2_dVg = T3 * dVgst_dVg - T4 * dVgsteff_dVg; - dT2_dVb = T3 * dVgst_dVb * dVbseff_dVb - T4 * dVgsteff_dVb; - dT2_dVd = T3 * dVgst_dVd - T4 * dVgsteff_dVd; - if (selfheat) - dT2_dT = -dVth_dT * T3 + Vgst * dT0_dT; - else - dT2_dT = 0; - - T3 = 1 / (1 + pParam->B3SOIPDsiid * Vds); - dT3_dVd = -pParam->B3SOIPDsiid * T3 * T3; - - VgsStep = T1 * T2 * T3; - if (selfheat) - dVgsStep_dT = T1 * T3 * dT2_dT; - else - dVgsStep_dT = 0; - Vdsatii = Vdsatii0 + VgsStep; - Vdiff = Vds - Vdsatii; - dVdiff_dVg = -T1 * T3 * dT2_dVg; - dVdiff_dVb = -T1 * T3 * dT2_dVb; - dVdiff_dVd = 1.0 - T1 * (T3 * dT2_dVd + T2 * dT3_dVd); - if (selfheat) - dVdiff_dT = -(dVdsatii0_dT + dVgsStep_dT); - else - dVdiff_dT = 0; - - T0 = pParam->B3SOIPDbeta2 + pParam->B3SOIPDbeta1 * Vdiff - + pParam->B3SOIPDbeta0 * Vdiff * Vdiff; - if (T0 < 1e-5) - { - T0 = 1e-5; - dT0_dVg = dT0_dVd = dT0_dVb = dT0_dT = 0.0; - } - else - { - T1 = - pParam->B3SOIPDbeta1 + 2 * pParam->B3SOIPDbeta0 * Vdiff; - dT0_dVg = T1 * dVdiff_dVg; - dT0_dVb = T1 * dVdiff_dVb; - dT0_dVd = T1 * dVdiff_dVd; - if (selfheat) - dT0_dT = T1 * dVdiff_dT; - else - dT0_dT = 0; - } - - if ((T0 < Vdiff / EXPL_THRESHOLD) && (Vdiff > 0.0)) - { - Ratio = pParam->B3SOIPDalpha0 * MAX_EXPL; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - } - else if ((T0 < -Vdiff / EXPL_THRESHOLD) && (Vdiff < 0.0)) - { - Ratio = pParam->B3SOIPDalpha0 * MIN_EXPL; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - } - else - { - Ratio = pParam->B3SOIPDalpha0 * exp (Vdiff / T0); - T1 = Ratio / T0 / T0; - dRatio_dVg = T1 * (T0 * dVdiff_dVg - Vdiff * dT0_dVg); - dRatio_dVb = T1 * (T0 * dVdiff_dVb - Vdiff * dT0_dVb); - dRatio_dVd = T1 * (T0 * dVdiff_dVd - Vdiff * dT0_dVd); - if (selfheat) - dRatio_dT = T1 * (T0 * dVdiff_dT - Vdiff * dT0_dT); - else - dRatio_dT = 0; - } - - /* Avoid too high ratio */ - if (Ratio > 10.0) - { - Ratio = 10.0; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - } - - T0 = Ids + pParam->B3SOIPDfbjtii * Ic; - here->B3SOIPDiii = Iii = Ratio * T0; - Giig = Ratio * Gm + T0 * dRatio_dVg; - Giib = Ratio * (Gmb + pParam->B3SOIPDfbjtii * Gcb) - + T0 * dRatio_dVb; - Giid = Ratio * (Gds + pParam->B3SOIPDfbjtii * Gcd) - + T0 * dRatio_dVd; - - if (selfheat) - GiiT = Ratio * (GmT + pParam->B3SOIPDfbjtii * GcT) - + T0 * dRatio_dT; - else - GiiT = 0.0; - - } - - /* Current through body resistor */ - /* Current going out is +ve */ - if ((here->B3SOIPDbodyMod == 0) || (here->B3SOIPDbodyMod == 2)) - { - Ibp = Gbpbs = Gbpps = 0.0; - } - else - { /* here->B3SOIPDbodyMod == 1 */ - if (pParam->B3SOIPDrbody < 1e-30) - { - if (here->B3SOIPDrbodyext <= 1e-30) - T0 = 1.0 / 1e-30; - else - T0 = 1.0 / here->B3SOIPDrbodyext; - Ibp = Vbp * T0; - Gbpbs = T0 * dVbp_dVb; - Gbpps = -T0 * dVbp_dVb; - } - else - { - Gbpbs = - 1.0 / (pParam->B3SOIPDrbody + here->B3SOIPDrbodyext); - Ibp = Vbp * Gbpbs; - Gbpps = -Gbpbs; - } - } - - here->B3SOIPDibp = Ibp; - here->B3SOIPDgbpbs = Gbpbs; - here->B3SOIPDgbpps = Gbpps; - here->B3SOIPDgbpT = 0.0; - here->B3SOIPDcbodcon = Ibp - (Gbpbs * Vbs + Gbpps * Vps); - - - - /* Current going out of drainprime node into the drain of device */ - /* "node" means the SPICE circuit node */ - - here->B3SOIPDcdrain = Ids + Ic; - here->B3SOIPDcd = Ids + Ic - Ibd + Iii + Idgidl; - here->B3SOIPDcb = Ibs + Ibd + Ibp - Iii - Idgidl - Isgidl - Igb; - - here->B3SOIPDgds = Gds + Gcd; - here->B3SOIPDgm = Gm; - here->B3SOIPDgmbs = Gmb + Gcb; - if (selfheat) - here->B3SOIPDgmT = GmT + GcT; - else - here->B3SOIPDgmT = 0.0; - - /* note that sign is switched because power flows out - of device into the temperature node. - Currently ommit self-heating due to bipolar current - because it can cause convergence problem */ - - here->B3SOIPDgtempg = -Gm * Vds; - here->B3SOIPDgtempb = -Gmb * Vds; - here->B3SOIPDgtempT = -GmT * Vds; - here->B3SOIPDgtempd = -Gds * Vds - Ids; - here->B3SOIPDcth = -Ids * Vds - model->B3SOIPDtype * - (here->B3SOIPDgtempg * Vgs + here->B3SOIPDgtempb * Vbs - + here->B3SOIPDgtempd * Vds) - here->B3SOIPDgtempT * delTemp; - - /* Body current which flows into drainprime node from the drain of device */ - - here->B3SOIPDgjdb = Gjdb - Giib; - here->B3SOIPDgjdd = Gjdd - (Giid + Gdgidld); - here->B3SOIPDgjdg = -(Giig + Gdgidlg); - if (selfheat) - here->B3SOIPDgjdT = GjdT - GiiT; - else - here->B3SOIPDgjdT = 0.0; - here->B3SOIPDcjd = Ibd - Iii - Idgidl - - (here->B3SOIPDgjdb * Vbs + here->B3SOIPDgjdd * Vds - + here->B3SOIPDgjdg * Vgs + here->B3SOIPDgjdT * delTemp); - - /* Body current which flows into sourceprime node from the source of device */ - - here->B3SOIPDgjsb = Gjsb; - here->B3SOIPDgjsd = Gjsd; - here->B3SOIPDgjsg = -Gsgidlg; - if (selfheat) - here->B3SOIPDgjsT = GjsT; - else - here->B3SOIPDgjsT = 0.0; - here->B3SOIPDcjs = Ibs - Isgidl - - (here->B3SOIPDgjsb * Vbs + here->B3SOIPDgjsd * Vds - + here->B3SOIPDgjsg * Vgs + here->B3SOIPDgjsT * delTemp); - - /* Current flowing into body node */ - - here->B3SOIPDgbbs = Giib - Gjsb - Gjdb - Gbpbs; - here->B3SOIPDgbgs = Giig + Gdgidlg + Gsgidlg; - here->B3SOIPDgbds = Giid + Gdgidld - Gjsd - Gjdd; - here->B3SOIPDgbps = -Gbpps; - if (selfheat) - here->B3SOIPDgbT = GiiT - GjsT - GjdT; - else - here->B3SOIPDgbT = 0.0; - - - here->B3SOIPDcbody = Iii + Idgidl + Isgidl - Ibs - Ibd - Ibp + Igb - - ((here->B3SOIPDgbbs + dIgb_dVb) * Vbs - + (here->B3SOIPDgbgs + dIgb_dVg) * Vgs - + (here->B3SOIPDgbds + dIgb_dVd) * Vds - + here->B3SOIPDgbps * Vps - + (here->B3SOIPDgbT + dIgb_dT) * delTemp); - - - here->B3SOIPDcgate = Igb - - (dIgb_dVb * Vbs + dIgb_dVg * Vgs + dIgb_dVd * Vds + - dIgb_dT * delTemp); - - - /* Calculate Qinv for Noise analysis */ - - T1 = Vgsteff * (1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm); - here->B3SOIPDqinv = - -model->B3SOIPDcox * pParam->B3SOIPDweff * Leff * T1; - - - /* Begin CV (charge) model */ - - if ((model->B3SOIPDxpart < 0) || (!ChargeComputationNeeded)) - { - qgate = qdrn = qsrc = qbody = 0.0; - here->B3SOIPDcggb = here->B3SOIPDcgsb = here->B3SOIPDcgdb = 0.0; - here->B3SOIPDcdgb = here->B3SOIPDcdsb = here->B3SOIPDcddb = 0.0; - here->B3SOIPDcbgb = here->B3SOIPDcbsb = here->B3SOIPDcbdb = 0.0; - goto finished; - } - else - { - CoxWL = - model->B3SOIPDcox * (pParam->B3SOIPDweffCV / - here->B3SOIPDnseg * - pParam->B3SOIPDleffCV + - here->B3SOIPDagbcp); - CoxWLb = - model->B3SOIPDfbody * model->B3SOIPDcox * - (pParam->B3SOIPDweffCV / here->B3SOIPDnseg * - pParam->B3SOIPDleffCVb + here->B3SOIPDagbcp); - - /* By using this Vgsteff,cv, discontinuity in moderate - inversion charges can be avoid. */ - - if ((VgstNVt > -EXPL_THRESHOLD) && (VgstNVt < EXPL_THRESHOLD)) - { - ExpVgst *= ExpVgst; - ExpVgst *= exp (-(pParam->B3SOIPDdelvt / (n * Vtm))); - Vgsteff = n * Vtm * log (1.0 + ExpVgst); - T0 = ExpVgst / (1.0 + ExpVgst); - T1 = - -T0 * (dVth_dVb + Vgst / n * dn_dVb) + - Vgsteff / n * dn_dVb; - dVgsteff_dVd = - -T0 * (dVth_dVd + Vgst / n * dn_dVd) + - Vgsteff / n * dn_dVd; - dVgsteff_dVg = T0 * dVgs_eff_dVg; - dVgsteff_dVb = T1 * dVbseff_dVb; - if (selfheat) - dVgsteff_dT = - -T0 * (dVth_dT + (Vgst - pParam->B3SOIPDdelvt) / Temp) + - Vgsteff / Temp; - else - dVgsteff_dT = 0.0; - } - - if (model->B3SOIPDcapMod == 2) - { - Vfb = - Vth - phi - pParam->B3SOIPDk1eff * sqrtPhis + - pParam->B3SOIPDdelvt; - dVfb_dVb = dVth_dVb - pParam->B3SOIPDk1eff * dsqrtPhis_dVb; - dVfb_dVd = dVth_dVd; - dVfb_dT = dVth_dT; - - V3 = Vfb - Vgs_eff + Vbseff - DELTA_3_SOI; - if (Vfb <= 0.0) - { - T0 = sqrt (V3 * V3 - 4.0 * DELTA_3_SOI * Vfb); - T2 = -DELTA_3_SOI / T0; - } - else - { - T0 = sqrt (V3 * V3 + 4.0 * DELTA_3_SOI * Vfb); - T2 = DELTA_3_SOI / T0; - } - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; - dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1; - dVfbeff_dVrg = T1 * dVgs_eff_dVg; - if (selfheat) - dVfbeff_dT = (1.0 - T1 - T2) * dVfb_dT; - else - dVfbeff_dT = 0.0; - - Qac0 = CoxWLb * (Vfbeff - Vfb); - dQac0_dVrg = CoxWLb * dVfbeff_dVrg; - dQac0_dVd = CoxWLb * (dVfbeff_dVd - dVfb_dVd); - dQac0_dVb = CoxWLb * (dVfbeff_dVb - dVfb_dVb); - if (selfheat) - dQac0_dT = CoxWLb * (dVfbeff_dT - dVfb_dT); - else - dQac0_dT = 0.0; - - T0 = 0.5 * K1; - T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; - if (pParam->B3SOIPDk1eff == 0.0) - { - T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { - T1 = T0 + T3 / pParam->B3SOIPDk1eff; - T2 = CoxWLb; - } - else - { - T1 = sqrt (T0 * T0 + T3); - T2 = CoxWLb * T0 / T1; - } - - Qsub0 = CoxWLb * K1 * (T1 - T0); - dQsub0_dVrg = T2 * (dVgs_eff_dVg - dVfbeff_dVrg); - dQsub0_dVg = -T2; - dQsub0_dVd = -T2 * dVfbeff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + 1); - if (selfheat) - dQsub0_dT = -T2 * dVfbeff_dT; - else - dQsub0_dT = 0.0; - - AbulkCV = Abulk0 * pParam->B3SOIPDabulkCVfactor; - dAbulkCV_dVb = pParam->B3SOIPDabulkCVfactor * dAbulk0_dVb; - - VdsatCV = Vgsteff / AbulkCV; - dVdsatCV_dVg = 1.0 / AbulkCV; - dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt (V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - dVdseffCV_dVg = T3; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - T7 = 1.0 - AbulkCV; - qbulk = CoxWLb * T7 * (0.5 * VdseffCV - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - - Cbg1 = CoxWLb * (T4 + T5 * dVdseffCV_dVg); - Cbd1 = CoxWLb * T5 * dVdseffCV_dVd; - Cbb1 = CoxWLb * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); - - /* Total inversion charge */ - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - qinv = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); - - /* Inversion charge partitioning into S / D */ - if (model->B3SOIPDxpart > 0.5) - { /* 0/100 Charge partition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd1 = CoxWL * T5 * dVdseffCV_dVd; - Csb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); - - } - else if (model->B3SOIPDxpart < 0.5) - { /* 40/60 Charge partition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - - 8.0 * T0 / - 3.0) + - 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg1 = T4 + T5 * dVdseffCV_dVg; - Csd1 = T5 * dVdseffCV_dVd; - Csb1 = T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb; - } - else - { /* 50/50 Charge partition model */ - qsrc = -0.5 * (qinv + qbulk); - Csg1 = -0.5 * (Cgg1 + Cbg1); - Csb1 = -0.5 * (Cgb1 + Cbb1); - Csd1 = -0.5 * (Cgd1 + Cbd1); - } - - /* Backgate charge */ - CboxWL = pParam->B3SOIPDkb1 * model->B3SOIPDfbody * Cbox - * (pParam->B3SOIPDweffCV / here->B3SOIPDnseg - * pParam->B3SOIPDleffCVbg + here->B3SOIPDaebcp); - Qe1 = CboxWL * (Vesfb - Vbs); - dQe1_dVb = -CboxWL; - dQe1_dVe = CboxWL; - if (selfheat) - dQe1_dT = -CboxWL * dvfbb_dT; - else - dQe1_dT = 0; - - qgate = qinv + Qac0 + Qsub0; - qbody = (qbulk - Qac0 - Qsub0 - Qe1); - qsub = Qe1; - qdrn = -(qgate + qsrc + qbody + qsub); - - /* This transform all the dependency on Vgsteff, Vbseff - into real ones */ - Ce1b = dQe1_dVb; - Ce1e = dQe1_dVe; - - Csg = Csg1 * dVgsteff_dVg; - Csd = Csd1 + Csg1 * dVgsteff_dVd; - Csb = Csg1 * dVgsteff_dVb + Csb1 * dVbseff_dVb; - if (selfheat) - CsT = Csg1 * dVgsteff_dT; - else - CsT = 0.0; - - Cgg = (Cgg1 + dQsub0_dVg) * dVgsteff_dVg - + dQac0_dVrg + dQsub0_dVrg; - Cgd = (Cgg1 + dQsub0_dVg) * dVgsteff_dVd + Cgd1 - + dQac0_dVd + dQsub0_dVd; - Cgb = (Cgg1 + dQsub0_dVg) * dVgsteff_dVb - + (Cgb1 + dQsub0_dVb + dQac0_dVb) * dVbseff_dVb; + if (pParam->B3SOIPDalpha0 <= 0.0) { + Giig = Giib = Giid = GiiT = 0.0; + here->B3SOIPDiii = Iii = 0.0; + } + else { + Vdsatii0 = pParam->B3SOIPDvdsatii0 * (1 + model->B3SOIPDtii * (TempRatio-1.0)) + - pParam->B3SOIPDlii / Leff; + if (selfheat) + dVdsatii0_dT = pParam->B3SOIPDvdsatii0 * model->B3SOIPDtii * dTempRatio_dT; + else + dVdsatii0_dT = 0; + + /* Calculate VgsStep */ + T0 = pParam->B3SOIPDesatii * Leff; + T1 = pParam->B3SOIPDsii0 * T0 / (1.0 + T0); + + T0 = 1 / (1 + pParam->B3SOIPDsii1 * Vgsteff); + if (selfheat) + dT0_dT = - pParam->B3SOIPDsii1 * T0 * T0 *dVgsteff_dT; + else + dT0_dT = 0; + T3 = T0 + pParam->B3SOIPDsii2; + T4 = Vgst * pParam->B3SOIPDsii1 * T0 * T0; + T2 = Vgst * T3; + dT2_dVg = T3 * dVgst_dVg - T4 * dVgsteff_dVg; + dT2_dVb = T3 * dVgst_dVb * dVbseff_dVb - T4 * dVgsteff_dVb; + dT2_dVd = T3 * dVgst_dVd - T4 * dVgsteff_dVd; + if (selfheat) + dT2_dT = -dVth_dT * T3 + Vgst * dT0_dT; + else dT2_dT = 0; + + T3 = 1 / (1 + pParam->B3SOIPDsiid * Vds); + dT3_dVd = - pParam->B3SOIPDsiid * T3 * T3; + + VgsStep = T1 * T2 * T3; + if (selfheat) + dVgsStep_dT = T1 * T3 * dT2_dT; + else dVgsStep_dT = 0; + Vdsatii = Vdsatii0 + VgsStep; + Vdiff = Vds - Vdsatii; + dVdiff_dVg = - T1 * T3 * dT2_dVg; + dVdiff_dVb = - T1 * T3 * dT2_dVb; + dVdiff_dVd = 1.0 - T1 * (T3 * dT2_dVd + T2 * dT3_dVd); + if (selfheat) + dVdiff_dT = -(dVdsatii0_dT + dVgsStep_dT); + else dVdiff_dT = 0; + + T0 = pParam->B3SOIPDbeta2 + pParam->B3SOIPDbeta1 * Vdiff + + pParam->B3SOIPDbeta0 * Vdiff * Vdiff; + if (T0 < 1e-5) + { + T0 = 1e-5; + dT0_dVg = dT0_dVd = dT0_dVb = dT0_dT = 0.0; + } + else + { + T1 = pParam->B3SOIPDbeta1 + 2 * pParam->B3SOIPDbeta0 * Vdiff; + dT0_dVg = T1 * dVdiff_dVg; + dT0_dVb = T1 * dVdiff_dVb; + dT0_dVd = T1 * dVdiff_dVd; + if (selfheat) + dT0_dT = T1 * dVdiff_dT; + else + dT0_dT = 0; + } + + if ((T0 < Vdiff / EXPL_THRESHOLD) && (Vdiff > 0.0)) { + Ratio = pParam->B3SOIPDalpha0 * MAX_EXPL; + dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; + } + else if ((T0 < -Vdiff / EXPL_THRESHOLD) && (Vdiff < 0.0)) { + Ratio = pParam->B3SOIPDalpha0 * MIN_EXPL; + dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; + } + else { + Ratio = pParam->B3SOIPDalpha0 * exp(Vdiff / T0); + T1 = Ratio / T0 / T0; + dRatio_dVg = T1 * (T0 * dVdiff_dVg - Vdiff * dT0_dVg); + dRatio_dVb = T1 * (T0 * dVdiff_dVb - Vdiff * dT0_dVb); + dRatio_dVd = T1 * (T0 * dVdiff_dVd - Vdiff * dT0_dVd); + if (selfheat) + dRatio_dT = T1 * (T0 * dVdiff_dT - Vdiff * dT0_dT); + else + dRatio_dT = 0; + } + + /* Avoid too high ratio */ + if (Ratio > 10.0) { + Ratio = 10.0; + dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; + } + + T0 = Ids + pParam->B3SOIPDfbjtii * Ic; + here->B3SOIPDiii = Iii = Ratio * T0; + Giig = Ratio * Gm + T0 * dRatio_dVg; + Giib = Ratio * (Gmb + pParam->B3SOIPDfbjtii * Gcb) + + T0 * dRatio_dVb; + Giid = Ratio * (Gds + pParam->B3SOIPDfbjtii * Gcd) + + T0 * dRatio_dVd; + + if (selfheat) + GiiT = Ratio * (GmT + pParam->B3SOIPDfbjtii * GcT) + + T0 * dRatio_dT; + else + GiiT = 0.0; + + } + + /* Current through body resistor */ + /* Current going out is +ve */ + if ((here->B3SOIPDbodyMod == 0) || (here->B3SOIPDbodyMod == 2)) + { + Ibp = Gbpbs = Gbpps = 0.0; + } + else { /* here->B3SOIPDbodyMod == 1 */ + if (pParam->B3SOIPDrbody < 1e-30) + { + if (here->B3SOIPDrbodyext <= 1e-30) + T0 = 1.0 / 1e-30; + else + T0 = 1.0 / here->B3SOIPDrbodyext; + Ibp = Vbp * T0; + Gbpbs = T0 * dVbp_dVb; + Gbpps = -T0 * dVbp_dVb; + } else + { + Gbpbs = 1.0 / (pParam->B3SOIPDrbody + here->B3SOIPDrbodyext); + Ibp = Vbp * Gbpbs; + Gbpps = - Gbpbs; + } + } + + here->B3SOIPDibp = Ibp; + here->B3SOIPDgbpbs = Gbpbs; + here->B3SOIPDgbpps = Gbpps; + here->B3SOIPDgbpT = 0.0; + here->B3SOIPDcbodcon = Ibp - (Gbpbs * Vbs + Gbpps * Vps); + + + + /* Current going out of drainprime node into the drain of device */ + /* "node" means the SPICE circuit node */ + + here->B3SOIPDcdrain = Ids + Ic; + here->B3SOIPDcd = Ids + Ic - Ibd + Iii + Idgidl; + here->B3SOIPDcb = Ibs + Ibd + Ibp - Iii - Idgidl - Isgidl - Igb; + + here->B3SOIPDgds = Gds + Gcd; + here->B3SOIPDgm = Gm; + here->B3SOIPDgmbs = Gmb + Gcb; if (selfheat) - CgT = (Cgg1 + dQsub0_dVg) * dVgsteff_dT - + dQac0_dT + dQsub0_dT; + here->B3SOIPDgmT = GmT + GcT; else - CgT = 0.0; - - Cbg = (Cbg1 - dQsub0_dVg) * dVgsteff_dVg - - dQac0_dVrg - dQsub0_dVrg; - Cbd = (Cbg1 - dQsub0_dVg) * dVgsteff_dVd + Cbd1 - - dQac0_dVd - dQsub0_dVd; - Cbb = (Cbg1 - dQsub0_dVg) * dVgsteff_dVb - dQe1_dVb - + (Cbb1 - dQsub0_dVb - dQac0_dVb) * dVbseff_dVb; - if (selfheat) - CbT = (Cbg1 - dQsub0_dVg) * dVgsteff_dT - - dQac0_dT - dQsub0_dT - dQe1_dT; - else - CbT = 0.0; - - here->B3SOIPDcggb = Cgg; - here->B3SOIPDcgsb = -(Cgg + Cgd + Cgb); - here->B3SOIPDcgdb = Cgd; - here->B3SOIPDcgT = CgT; - - here->B3SOIPDcbgb = Cbg; - here->B3SOIPDcbsb = -(Cbg + Cbd + Cbb) + Ce1e; - here->B3SOIPDcbdb = Cbd; - here->B3SOIPDcbeb = -Ce1e; - here->B3SOIPDcbT = CbT; - - here->B3SOIPDceeb = Ce1e; - here->B3SOIPDceT = dQe1_dT; - - here->B3SOIPDcdgb = -(Cgg + Cbg + Csg); - here->B3SOIPDcddb = -(Cgd + Cbd + Csd); - here->B3SOIPDcdeb = 0; - here->B3SOIPDcdT = -(CgT + CbT + CsT) - dQe1_dT; - here->B3SOIPDcdsb = (Cgg + Cgd + Cgb - + Cbg + Cbd + Cbb - + Csg + Csd + Csb) + Ce1b; - } /* End of if capMod == 2 */ - - else if (model->B3SOIPDcapMod == 3) - { - dVgsteff_dVb /= dVbseff_dVb; + here->B3SOIPDgmT = 0.0; - if (selfheat) - { - Vfbzb = Vthzb - phi - pParam->B3SOIPDk1eff * sqrtPhi - + pParam->B3SOIPDdelvt; - dVfbzb_dT = dVthzb_dT; - } - else - { - Vfbzb = pParam->B3SOIPDvfbzb + pParam->B3SOIPDdelvt; - dVfbzb_dT = 0; - } - - V3 = Vfbzb - Vgs_eff + Vbseff - DELTA_3; - if (Vfbzb <= 0.0) - { - T0 = sqrt (V3 * V3 - 4.0 * DELTA_3 * Vfbzb); - T2 = -DELTA_3 / T0; - } - else - { - T0 = sqrt (V3 * V3 + 4.0 * DELTA_3 * Vfbzb); - T2 = DELTA_3 / T0; - } - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfbzb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1; - if (selfheat) - dVfbeff_dT = (1.0 - T1 - T2) * dVfbzb_dT; - else - dVfbeff_dT = 0.0; - - Cox = model->B3SOIPDcox; - Tox = 1.0e8 * model->B3SOIPDtox; - T0 = (Vgs_eff - Vbseff - Vfbzb) / Tox; - dT0_dVg = dVgs_eff_dVg / Tox; - dT0_dVb = -1.0 / Tox; - - tmp = T0 * pParam->B3SOIPDacde; - if ((-EXPL_THRESHOLD < tmp) && (tmp < EXPL_THRESHOLD)) - { - Tcen = pParam->B3SOIPDldeb * exp (tmp); - dTcen_dVg = pParam->B3SOIPDacde * Tcen; - dTcen_dVb = dTcen_dVg * dT0_dVb; - dTcen_dVg *= dT0_dVg; - if (selfheat) - dTcen_dT = - -Tcen * pParam->B3SOIPDacde * dVfbzb_dT / Tox; - else - dTcen_dT = 0; - } - else if (tmp <= -EXPL_THRESHOLD) - { - Tcen = pParam->B3SOIPDldeb * MIN_EXPL; - dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0; - } - else - { - Tcen = pParam->B3SOIPDldeb * MAX_EXPL; - dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0; - } - - LINK = 1.0e-3 * model->B3SOIPDtox; - V3 = pParam->B3SOIPDldeb - Tcen - LINK; - V4 = sqrt (V3 * V3 + 4.0 * LINK * pParam->B3SOIPDldeb); - Tcen = pParam->B3SOIPDldeb - 0.5 * (V3 + V4); - T1 = 0.5 * (1.0 + V3 / V4); - dTcen_dVg *= T1; - dTcen_dVb *= T1; - if (selfheat) - dTcen_dT *= T1; - else - dTcen_dT = 0; - - Ccen = EPSSI / Tcen; - T2 = Cox / (Cox + Ccen); - Coxeff = T2 * Ccen; - T3 = -Ccen / Tcen; - dCoxeff_dVg = T2 * T2 * T3; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - if (selfheat) - dCoxeff_dT = T3 * dTcen_dT * (T2 - Coxeff / (Cox + Ccen)); - else - dCoxeff_dT = 0; - CoxWLcenb = CoxWLb * Coxeff / Cox; - if (selfheat) - dCoxWLcenb_dT = CoxWLb * dCoxeff_dT / Cox; - else - dCoxWLcenb_dT = 0; + /* note that sign is switched because power flows out + of device into the temperature node. + Currently ommit self-heating due to bipolar current + because it can cause convergence problem*/ - Qac0 = CoxWLcenb * (Vfbeff - Vfbzb); - QovCox = Qac0 / Coxeff; - dQac0_dVg = CoxWLcenb * dVfbeff_dVg + QovCox * dCoxeff_dVg; - dQac0_dVb = CoxWLcenb * dVfbeff_dVb + QovCox * dCoxeff_dVb; - if (selfheat) - dQac0_dT = CoxWLcenb * (dVfbeff_dT - dVfbzb_dT) - + dCoxWLcenb_dT * (Vfbeff - Vfbzb); - else - dQac0_dT = 0.0; - - T0 = 0.5 * pParam->B3SOIPDk1eff; - T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; - if (pParam->B3SOIPDk1eff == 0.0) - { - T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { - T1 = T0 + T3 / pParam->B3SOIPDk1eff; - T2 = CoxWLcenb; - } - else - { - T1 = sqrt (T0 * T0 + T3); - T2 = CoxWLcenb * T0 / T1; - } - - Qsub0 = CoxWLcenb * pParam->B3SOIPDk1eff * (T1 - T0); - QovCox = Qsub0 / Coxeff; - dQsub0_dVg = - T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg) + - QovCox * dCoxeff_dVg; - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + 1 + dVgsteff_dVb) - + QovCox * dCoxeff_dVb; - if (selfheat) - dQsub0_dT = -T2 * (dVfbeff_dT + dVgsteff_dT) - + dCoxWLcenb_dT * pParam->B3SOIPDk1eff * (T1 - T0); - else - dQsub0_dT = 0.0; - - /* Gate-bias dependent delta Phis begins */ - if (pParam->B3SOIPDk1eff <= 0.0) - { - Denomi = 0.25 * pParam->B3SOIPDmoin * Vtm; - T0 = 0.5 * pParam->B3SOIPDsqrtPhi; - } - else - { - Denomi = pParam->B3SOIPDmoin * Vtm - * pParam->B3SOIPDk1eff * pParam->B3SOIPDk1eff; - T0 = pParam->B3SOIPDk1eff * pParam->B3SOIPDsqrtPhi; - } - T1 = 2.0 * T0 + Vgsteff; - - DeltaPhi = Vtm * log (1.0 + T1 * Vgsteff / Denomi); - dDeltaPhi_dVg = - 2.0 * Vtm * (T1 - T0) / (Denomi + T1 * Vgsteff); - dDeltaPhi_dVd = dDeltaPhi_dVg * dVgsteff_dVd; - dDeltaPhi_dVb = dDeltaPhi_dVg * dVgsteff_dVb; - /* End of delta Phis */ - - T3 = 4.0 * (Vth - Vfbzb - phi); - Tox += Tox; - if ((T0 = (Vgsteff + T3) / Tox) > 1e-20) - { - tmp = exp (0.7 * log (T0)); - T1 = 1.0 + tmp; - T2 = 0.7 * tmp / (T0 * Tox); - Tcen = 1.9e-9 / T1; - dTcen_dVg = -1.9e-9 * T2 / T1 / T1; - dTcen_dVd = dTcen_dVg * (4.0 * dVth_dVd + dVgsteff_dVd); - dTcen_dVb = dTcen_dVg * (4.0 * dVth_dVb + dVgsteff_dVb); - dTcen_dVg *= dVgsteff_dVg; - if (selfheat) - dTcen_dT = -Tcen * T2 / T1 - * (4.0 * (dVth_dT - dVfbzb_dT) + dVgsteff_dT); - else - dTcen_dT = 0; - } - else - { - T0 = 1e-20; - tmp = exp (0.7 * log (T0)); - T1 = 1.0 + tmp; - T2 = 0.7 * tmp / (T0 * Tox); - Tcen = 1.9e-9 / T1; - dTcen_dVg = 0; - dTcen_dVd = 0; - dTcen_dVb = 0; - dTcen_dT = 0; - } - - Ccen = EPSSI / Tcen; - T0 = Cox / (Cox + Ccen); - Coxeff = T0 * Ccen; - T1 = -Ccen / Tcen; - dCoxeff_dVg = T0 * T0 * T1; - dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - if (selfheat) - dCoxeff_dT = T1 * dTcen_dT * (T0 - Coxeff / (Cox + Ccen)); - else - dCoxeff_dT = 0; - CoxWLcen = CoxWL * Coxeff / Cox; - CoxWLcenb = CoxWLb * Coxeff / Cox; - - AbulkCV = Abulk0 * pParam->B3SOIPDabulkCVfactor; - dAbulkCV_dVb = pParam->B3SOIPDabulkCVfactor * dAbulk0_dVb; - VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt (V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - T4 = T3 * (1.0 - dDeltaPhi_dVg); - dVdseffCV_dVg = T4; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - - T0 = AbulkCV * VdseffCV; - T1 = Vgsteff - DeltaPhi; - T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); - T3 = T0 / T2; - T4 = 1.0 - 12.0 * T3 * T3; - T5 = - AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); - T6 = T5 * VdseffCV / AbulkCV; - - qinv = qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); - QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * (1.0 - dDeltaPhi_dVg) - + T5 * dVdseffCV_dVg); - Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - T7 = 1.0 - AbulkCV; - T8 = T2 * T2; - T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); - T10 = T9 * (1.0 - dDeltaPhi_dVg); - T11 = -T7 * T5 / AbulkCV; - T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); - - qbulk = - CoxWLcenb * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); - QovCox = qbulk / Coxeff; - Cbg1 = CoxWLcenb * (T10 + T11 * dVdseffCV_dVg); - Cbd1 = CoxWLcenb * T11 * dVdseffCV_dVd + Cbg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cbb1 = - CoxWLcenb * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) + - Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - - if (model->B3SOIPDxpart > 0.5) - { /* 0/100 partition */ - qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - - 0.5 * T0 * T0 / T2); - QovCox = qsrc / Coxeff; - T2 += T2; - T3 = T2 * T2; - T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = - -(0.5 + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg); - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV; - - Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd - + QovCox * dCoxeff_dVd; - Csb = - CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + - Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else if (model->B3SOIPDxpart < 0.5) - { /* 40/60 partition */ - T2 = T2 / 12.0; - T3 = 0.5 * CoxWLcen / (T2 * T2); - T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 - * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T3 * T4; - QovCox = qsrc / Coxeff; - T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; - T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 - * T0 / 3.0) + - 2.0 * T0 * T0 / 3.0); - T6 = AbulkCV * (qsrc / T2 + T3 * T8); - T7 = T6 * VdseffCV / AbulkCV; - - Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg; - Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd - + QovCox * dCoxeff_dVd; - Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb - + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - } - else - { /* 50/50 partition */ - qsrc = -0.5 * qgate; - Csg = -0.5 * Cgg1; - Csd = -0.5 * Cgd1; - Csb = -0.5 * Cgb1; - } - - /* Backgate charge */ - CboxWL = pParam->B3SOIPDkb1 * model->B3SOIPDfbody * Cbox - * (pParam->B3SOIPDweffCV / here->B3SOIPDnseg - * pParam->B3SOIPDleffCVbg + here->B3SOIPDaebcp); - Qe1 = CboxWL * (Vesfb - Vbs); - Ce1b = dQe1_dVb = -CboxWL; - Ce1e = dQe1_dVe = CboxWL; - if (selfheat) - Ce1T = dQe1_dT = -CboxWL * dvfbb_dT; - else - Ce1T = dQe1_dT = 0.0; + here->B3SOIPDgtempg = -Gm * Vds; + here->B3SOIPDgtempb = -Gmb * Vds; + here->B3SOIPDgtempT = -GmT * Vds; + here->B3SOIPDgtempd = -Gds * Vds - Ids; + here->B3SOIPDcth = - Ids * Vds - model->B3SOIPDtype * + (here->B3SOIPDgtempg * Vgs + here->B3SOIPDgtempb * Vbs + + here->B3SOIPDgtempd * Vds) + - here->B3SOIPDgtempT * delTemp; - qgate += Qac0 + Qsub0 - qbulk; - qbody = qbulk - Qac0 - Qsub0 - Qe1; - qsub = Qe1; - qdrn = -(qgate + qbody + qsub + qsrc); + /* Body current which flows into drainprime node from the drain of device */ - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb - Ce1b / dVbseff_dVb; - if (selfheat) - CbT = Cbg1 * dVgsteff_dT - dQac0_dT - dQsub0_dT - dQe1_dT; - else - CbT = 0.0; + here->B3SOIPDgjdb = Gjdb - Giib; + here->B3SOIPDgjdd = Gjdd - (Giid + Gdgidld); + here->B3SOIPDgjdg = - (Giig + Gdgidlg); + if (selfheat) here->B3SOIPDgjdT = GjdT - GiiT; + else here->B3SOIPDgjdT = 0.0; + here->B3SOIPDcjd = Ibd - Iii - Idgidl + - (here->B3SOIPDgjdb * Vbs + here->B3SOIPDgjdd * Vds + + here->B3SOIPDgjdg * Vgs + here->B3SOIPDgjdT * delTemp); - Cgg = Cgg1 - Cbg; - Cgd = Cgd1 - Cbd; - Cgb = Cgb1 - Cbb - Ce1b / dVbseff_dVb; - if (selfheat) - CgT = Cgg1 * dVgsteff_dT + dQac0_dT + dQsub0_dT; - else - CgT = 0.0; + /* Body current which flows into sourceprime node from the source of device */ - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - if (selfheat) - CsT = Csg * dVgsteff_dT; - else - CsT = 0.0; - - here->B3SOIPDcggb = Cgg; - here->B3SOIPDcgsb = -(Cgg + Cgd + Cgb); - here->B3SOIPDcgdb = Cgd; - here->B3SOIPDcgT = CgT; - - here->B3SOIPDcbgb = Cbg; - here->B3SOIPDcbsb = -(Cbg + Cbd + Cbb) + Ce1e; - here->B3SOIPDcbdb = Cbd; - here->B3SOIPDcbeb = -Ce1e; - here->B3SOIPDcbT = CbT; - - here->B3SOIPDceT = Ce1T; - here->B3SOIPDceeb = Ce1e; - - here->B3SOIPDcdgb = -(Cgg + Cbg + Csg); - here->B3SOIPDcddb = -(Cgd + Cbd + Csd); - here->B3SOIPDcdeb = 0; - here->B3SOIPDcdT = -(CgT + CbT + CsT) - Ce1T; - here->B3SOIPDcdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb) + Ce1b; - here->B3SOIPDqinv = -qinoi; - - } /* End of if capMod ==3 */ - } - - - finished: /* returning Values to Calling Routine */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - if (ChargeComputationNeeded) - { - /* Intrinsic S/D junction charge */ - PhiBSWG = model->B3SOIPDGatesidewallJctPotential; - dPhiBSWG_dT = -model->B3SOIPDtpbswg; - PhiBSWG += dPhiBSWG_dT * (Temp - model->B3SOIPDtnom); - MJSWG = model->B3SOIPDbodyJctGateSideGradingCoeff; - - cjsbs = model->B3SOIPDunitLengthGateSidewallJctCap - * wdiosCV * model->B3SOIPDtsi / 1e-7; - dcjsbs_dT = cjsbs * model->B3SOIPDtcjswg; - cjsbs += dcjsbs_dT * (Temp - model->B3SOIPDtnom); - - cjdbs = model->B3SOIPDunitLengthGateSidewallJctCap - * wdiodCV * model->B3SOIPDtsi / 1e-7; - dcjdbs_dT = cjdbs * model->B3SOIPDtcjswg; - cjdbs += dcjdbs_dT * (Temp - model->B3SOIPDtnom); - - DioMax = 0.9 * (PhiBSWG); - - arg = 1.0 - (Vbs > DioMax ? DioMax : Vbs) / PhiBSWG; - - if (selfheat) - darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT; - - if (MJSWG == 0.5) - { - dT3_dVb = 1.0 / sqrt (arg); + here->B3SOIPDgjsb = Gjsb; + here->B3SOIPDgjsd = Gjsd; + here->B3SOIPDgjsg = - Gsgidlg; + if (selfheat) here->B3SOIPDgjsT = GjsT; + else here->B3SOIPDgjsT = 0.0; + here->B3SOIPDcjs = Ibs - Isgidl + - (here->B3SOIPDgjsb * Vbs + here->B3SOIPDgjsd * Vds + + here->B3SOIPDgjsg * Vgs + here->B3SOIPDgjsT * delTemp); - if (selfheat) - ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT; - } - else - { - dT3_dVb = exp (-MJSWG * log (arg)); + /* Current flowing into body node */ - if (selfheat) - ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT; - } - T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); + here->B3SOIPDgbbs = Giib - Gjsb - Gjdb - Gbpbs; + here->B3SOIPDgbgs = Giig + Gdgidlg + Gsgidlg; + here->B3SOIPDgbds = Giid + Gdgidld - Gjsd - Gjdd; + here->B3SOIPDgbps = - Gbpps; + if (selfheat) here->B3SOIPDgbT = GiiT - GjsT - GjdT; + else here->B3SOIPDgbT = 0.0; - if (selfheat) - dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG) - - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG / (1.0 - - MJSWG); - if (Vbs > DioMax) - T3 += dT3_dVb * (Vbs - DioMax); + here->B3SOIPDcbody = Iii + Idgidl + Isgidl - Ibs - Ibd - Ibp + Igb + - ( (here->B3SOIPDgbbs + dIgb_dVb) * Vbs + + (here->B3SOIPDgbgs + dIgb_dVg) * Vgs + + (here->B3SOIPDgbds + dIgb_dVd) * Vds + + here->B3SOIPDgbps * Vps + + (here->B3SOIPDgbT + dIgb_dT) * delTemp); - qjs = cjsbs * T3 + model->B3SOIPDtt * Ibsdif; - gcjsbs = cjsbs * dT3_dVb + model->B3SOIPDtt * dIbsdif_dVb; - if (selfheat) - gcjsT = - model->B3SOIPDtt * dIbsdif_dT + dcjsbs_dT * T3 + - dT3_dT * cjsbs; - else - gcjsT = 0.0; + here->B3SOIPDcgate = Igb + - (dIgb_dVb * Vbs + dIgb_dVg * Vgs + dIgb_dVd * Vds + dIgb_dT * delTemp); - arg = 1.0 - (Vbd > DioMax ? DioMax : Vbd) / PhiBSWG; + /* Calculate Qinv for Noise analysis */ - if (selfheat) - darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT; + T1 = Vgsteff * (1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm); + here->B3SOIPDqinv = -model->B3SOIPDcox * pParam->B3SOIPDweff * Leff * T1; - if (MJSWG == 0.5) - { - dT3_dVb = 1.0 / sqrt (arg); - if (selfheat) - ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT; - } - else - { - dT3_dVb = exp (-MJSWG * log (arg)); + /* Begin CV (charge) model */ - if (selfheat) - ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT; - } - T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); - - if (selfheat) - dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG) - - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG / (1.0 - - MJSWG); - - if (Vbd > DioMax) - T3 += dT3_dVb * (Vbd - DioMax); - - dT3_dVd = -dT3_dVb; - - qjd = cjdbs * T3 + model->B3SOIPDtt * Ibddif; - gcjdbs = cjdbs * dT3_dVb + model->B3SOIPDtt * dIbddif_dVb; - gcjdds = cjdbs * dT3_dVd + model->B3SOIPDtt * dIbddif_dVd; - - if (selfheat) - gcjdT = - model->B3SOIPDtt * dIbddif_dT + dcjdbs_dT * T3 + - dT3_dT * cjdbs; - else - gcjdT = 0.0; - - - qdrn -= qjd; - qbody += (qjs + qjd); - qsrc = -(qgate + qbody + qdrn + qsub); - - /* Update the conductance */ - here->B3SOIPDcddb -= gcjdds; - here->B3SOIPDcdT -= gcjdT; - here->B3SOIPDcdsb += gcjdds + gcjdbs; - - here->B3SOIPDcbdb += (gcjdds); - here->B3SOIPDcbT += (gcjdT + gcjsT); - here->B3SOIPDcbsb -= (gcjdds + gcjdbs + gcjsbs); - - - /* Extrinsic Bottom S/D to substrate charge */ - T10 = -model->B3SOIPDtype * ves; - /* T10 is vse without type conversion */ - T11 = model->B3SOIPDtype * (vds - ves); - /* T11 is vde without type conversion */ - - if (model->B3SOIPDcsdmin != 0.0) - { - if (((pParam->B3SOIPDnsub > 0) && (model->B3SOIPDtype > 0)) - || ((pParam->B3SOIPDnsub < 0) - && (model->B3SOIPDtype < 0))) - { - if (T10 < pParam->B3SOIPDvsdfb) - { - here->B3SOIPDqse = - here->B3SOIPDcsbox * (T10 - pParam->B3SOIPDvsdfb); - here->B3SOIPDgcse = here->B3SOIPDcsbox; - } - else if (T10 < pParam->B3SOIPDsdt1) - { - T0 = T10 - pParam->B3SOIPDvsdfb; - T1 = T0 * T0; - here->B3SOIPDqse = T0 * (here->B3SOIPDcsbox - - pParam->B3SOIPDst2 / 3 * - T1); - here->B3SOIPDgcse = - here->B3SOIPDcsbox - pParam->B3SOIPDst2 * T1; - } - else if (T10 < pParam->B3SOIPDvsdth) - { - T0 = T10 - pParam->B3SOIPDvsdth; - T1 = T0 * T0; - here->B3SOIPDqse = - here->B3SOIPDcsmin * T10 + here->B3SOIPDst4 + - pParam->B3SOIPDst3 / 3 * T0 * T1; - here->B3SOIPDgcse = - here->B3SOIPDcsmin + pParam->B3SOIPDst3 * T1; - } - else - { - here->B3SOIPDqse = - here->B3SOIPDcsmin * T10 + here->B3SOIPDst4; - here->B3SOIPDgcse = here->B3SOIPDcsmin; - } - } + if ((model->B3SOIPDxpart < 0) || (!ChargeComputationNeeded)) + { qgate = qdrn = qsrc = qbody = qsub = 0.0; /* v2.2.3 bug fix */ + here->B3SOIPDcggb = here->B3SOIPDcgsb = here->B3SOIPDcgdb = 0.0; + here->B3SOIPDcdgb = here->B3SOIPDcdsb = here->B3SOIPDcddb = 0.0; + here->B3SOIPDcbgb = here->B3SOIPDcbsb = here->B3SOIPDcbdb = 0.0; + goto finished; + } else - { - if (T10 < pParam->B3SOIPDvsdth) - { - here->B3SOIPDqse = - here->B3SOIPDcsmin * (T10 - pParam->B3SOIPDvsdth); - here->B3SOIPDgcse = here->B3SOIPDcsmin; - } - else if (T10 < pParam->B3SOIPDsdt1) - { - T0 = T10 - pParam->B3SOIPDvsdth; - T1 = T0 * T0; - here->B3SOIPDqse = - T0 * (here->B3SOIPDcsmin - - pParam->B3SOIPDst2 / 3 * T1); - here->B3SOIPDgcse = - here->B3SOIPDcsmin - pParam->B3SOIPDst2 * T1; - } - else if (T10 < pParam->B3SOIPDvsdfb) - { - T0 = T10 - pParam->B3SOIPDvsdfb; - T1 = T0 * T0; - here->B3SOIPDqse = - here->B3SOIPDcsbox * T10 + here->B3SOIPDst4 + - pParam->B3SOIPDst3 / 3 * T0 * T1; - here->B3SOIPDgcse = - here->B3SOIPDcsbox + pParam->B3SOIPDst3 * T1; - } - else - { - here->B3SOIPDqse = - here->B3SOIPDcsbox * T10 + here->B3SOIPDst4; - here->B3SOIPDgcse = here->B3SOIPDcsbox; - } - } - - if (((pParam->B3SOIPDnsub > 0) && (model->B3SOIPDtype > 0)) - || ((pParam->B3SOIPDnsub < 0) - && (model->B3SOIPDtype < 0))) - { - if (T11 < pParam->B3SOIPDvsdfb) - { - here->B3SOIPDqde = - here->B3SOIPDcdbox * (T11 - pParam->B3SOIPDvsdfb); - here->B3SOIPDgcde = here->B3SOIPDcdbox; - } - else if (T11 < pParam->B3SOIPDsdt1) - { - T0 = T11 - pParam->B3SOIPDvsdfb; - T1 = T0 * T0; - here->B3SOIPDqde = - T0 * (here->B3SOIPDcdbox - - pParam->B3SOIPDdt2 / 3 * T1); - here->B3SOIPDgcde = - here->B3SOIPDcdbox - pParam->B3SOIPDdt2 * T1; - } - else if (T11 < pParam->B3SOIPDvsdth) - { - T0 = T11 - pParam->B3SOIPDvsdth; - T1 = T0 * T0; - here->B3SOIPDqde = - here->B3SOIPDcdmin * T11 + here->B3SOIPDdt4 + - pParam->B3SOIPDdt3 / 3 * T0 * T1; - here->B3SOIPDgcde = - here->B3SOIPDcdmin + pParam->B3SOIPDdt3 * T1; - } - else - { - here->B3SOIPDqde = - here->B3SOIPDcdmin * T11 + here->B3SOIPDdt4; - here->B3SOIPDgcde = here->B3SOIPDcdmin; - } - } - else - { - if (T11 < pParam->B3SOIPDvsdth) - { - here->B3SOIPDqde = - here->B3SOIPDcdmin * (T11 - pParam->B3SOIPDvsdth); - here->B3SOIPDgcde = here->B3SOIPDcdmin; - } - else if (T11 < pParam->B3SOIPDsdt1) - { - T0 = T11 - pParam->B3SOIPDvsdth; - T1 = T0 * T0; - here->B3SOIPDqde = - T0 * (here->B3SOIPDcdmin - - pParam->B3SOIPDdt2 / 3 * T1); - here->B3SOIPDgcde = - here->B3SOIPDcdmin - pParam->B3SOIPDdt2 * T1; - } - else if (T11 < pParam->B3SOIPDvsdfb) - { - T0 = T11 - pParam->B3SOIPDvsdfb; - T1 = T0 * T0; - here->B3SOIPDqde = - here->B3SOIPDcdbox * T11 + here->B3SOIPDdt4 + - pParam->B3SOIPDdt3 / 3 * T0 * T1; - here->B3SOIPDgcde = - here->B3SOIPDcdbox + pParam->B3SOIPDdt3 * T1; - } - else - { - here->B3SOIPDqde = - here->B3SOIPDcdbox * T11 + here->B3SOIPDdt4; - here->B3SOIPDgcde = here->B3SOIPDcdbox; - } - } - } - else - { - here->B3SOIPDqse = here->B3SOIPDcsbox * T10; - here->B3SOIPDgcse = here->B3SOIPDcsbox; - here->B3SOIPDqde = here->B3SOIPDcdbox * T11; - here->B3SOIPDgcde = here->B3SOIPDcdbox; - } - - /* Extrinsic : Sidewall fringing S/D charge */ - here->B3SOIPDqse += pParam->B3SOIPDcsesw * T10; - here->B3SOIPDgcse += pParam->B3SOIPDcsesw; - here->B3SOIPDqde += pParam->B3SOIPDcdesw * T11; - here->B3SOIPDgcde += pParam->B3SOIPDcdesw; - - /* All charge are mutliplied with type at the end, but qse and qde - have true polarity => so pre-mutliplied with type */ - here->B3SOIPDqse *= model->B3SOIPDtype; - here->B3SOIPDqde *= model->B3SOIPDtype; - } - - - here->B3SOIPDcbb = Cbb; - here->B3SOIPDcbd = Cbd; - here->B3SOIPDcbg = Cbg; - here->B3SOIPDqbf = -Qsub0 - Qac0; - here->B3SOIPDqjs = qjs; - here->B3SOIPDqjd = qjd; - - /* - * check convergence - */ - if ((here->B3SOIPDoff == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { - if (Check == 1) - { - ckt->CKTnoncon++; - } - } - - *(ckt->CKTstate0 + here->B3SOIPDvg) = vg; - *(ckt->CKTstate0 + here->B3SOIPDvd) = vd; - *(ckt->CKTstate0 + here->B3SOIPDvs) = vs; - *(ckt->CKTstate0 + here->B3SOIPDvp) = vp; - *(ckt->CKTstate0 + here->B3SOIPDve) = ve; - - *(ckt->CKTstate0 + here->B3SOIPDvbs) = vbs; - *(ckt->CKTstate0 + here->B3SOIPDvbd) = vbd; - *(ckt->CKTstate0 + here->B3SOIPDvgs) = vgs; - *(ckt->CKTstate0 + here->B3SOIPDvds) = vds; - *(ckt->CKTstate0 + here->B3SOIPDves) = ves; - *(ckt->CKTstate0 + here->B3SOIPDvps) = vps; - *(ckt->CKTstate0 + here->B3SOIPDdeltemp) = delTemp; - - /* bulk and channel charge plus overlaps */ - - if (!ChargeComputationNeeded) - goto line850; - + { + CoxWL = model->B3SOIPDcox * (pParam->B3SOIPDweffCV / here->B3SOIPDnseg + * pParam->B3SOIPDleffCV + here->B3SOIPDagbcp); + CoxWLb = model->B3SOIPDfbody * model->B3SOIPDcox + * (pParam->B3SOIPDweffCV / here->B3SOIPDnseg + * pParam->B3SOIPDleffCVb + here->B3SOIPDagbcp); + + /* By using this Vgsteff,cv, discontinuity in moderate + inversion charges can be avoid. */ + + if ((VgstNVt > -EXPL_THRESHOLD) && (VgstNVt < EXPL_THRESHOLD)) + { ExpVgst *= ExpVgst; + ExpVgst *= exp( -(pParam->B3SOIPDdelvt / (n * Vtm))); + Vgsteff = n * Vtm * log(1.0 + ExpVgst); + T0 = ExpVgst / (1.0 + ExpVgst); + T1 = -T0 * (dVth_dVb + Vgst / n * dn_dVb) + Vgsteff / n * dn_dVb; + dVgsteff_dVd = -T0 * (dVth_dVd + Vgst / n * dn_dVd) + + Vgsteff / n * dn_dVd; + dVgsteff_dVg = T0 * dVgs_eff_dVg; + dVgsteff_dVb = T1 * dVbseff_dVb; + if (selfheat) + dVgsteff_dT = -T0 * (dVth_dT + (Vgst - pParam->B3SOIPDdelvt) / Temp) + + Vgsteff / Temp; + else dVgsteff_dT = 0.0; + } + + if (model->B3SOIPDcapMod == 2) + { + Vfb = Vth - phi - pParam->B3SOIPDk1eff * sqrtPhis + pParam->B3SOIPDdelvt; + dVfb_dVb = dVth_dVb - pParam->B3SOIPDk1eff * dsqrtPhis_dVb; + dVfb_dVd = dVth_dVd; + dVfb_dT = dVth_dT; + + V3 = Vfb - Vgs_eff + Vbseff - DELTA_3_SOI; + if (Vfb <= 0.0) + { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3_SOI * Vfb); + T2 = -DELTA_3_SOI / T0; + } + else + { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3_SOI * Vfb); + T2 = DELTA_3_SOI / T0; + } + + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff = Vfb - 0.5 * (V3 + T0); + dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; + dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1; + dVfbeff_dVrg = T1 * dVgs_eff_dVg; + if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfb_dT; + else dVfbeff_dT = 0.0; + + Qac0 = CoxWLb * (Vfbeff - Vfb); + dQac0_dVrg = CoxWLb * dVfbeff_dVrg; + dQac0_dVd = CoxWLb * (dVfbeff_dVd - dVfb_dVd); + dQac0_dVb = CoxWLb * (dVfbeff_dVb - dVfb_dVb); + if (selfheat) dQac0_dT = CoxWLb * (dVfbeff_dT - dVfb_dT); + else dQac0_dT = 0.0; + + T0 = 0.5 * K1; + T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; + if (pParam->B3SOIPDk1eff == 0.0) + { T1 = 0.0; + T2 = 0.0; + } + else if (T3 < 0.0) + { T1 = T0 + T3 / pParam->B3SOIPDk1eff; + T2 = CoxWLb; + } + else + { T1 = sqrt(T0 * T0 + T3); + T2 = CoxWLb * T0 / T1; + } + + Qsub0 = CoxWLb * K1 * (T1 - T0); + dQsub0_dVrg = T2 * (dVgs_eff_dVg - dVfbeff_dVrg); + dQsub0_dVg = -T2; + dQsub0_dVd = -T2 * dVfbeff_dVd; + dQsub0_dVb = -T2 * (dVfbeff_dVb + 1); + if (selfheat) dQsub0_dT = -T2 * dVfbeff_dT; + else dQsub0_dT = 0.0; + + AbulkCV = Abulk0 * pParam->B3SOIPDabulkCVfactor; + dAbulkCV_dVb = pParam->B3SOIPDabulkCVfactor * dAbulk0_dVb; + + VdsatCV = Vgsteff / AbulkCV; + dVdsatCV_dVg = 1.0 / AbulkCV; + dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; + + V4 = VdsatCV - Vds - DELTA_4; + T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); + VdseffCV = VdsatCV - 0.5 * (V4 + T0); + T1 = 0.5 * (1.0 + V4 / T0); + T2 = DELTA_4 / T0; + T3 = (1.0 - T1 - T2) / AbulkCV; + dVdseffCV_dVg = T3; + dVdseffCV_dVd = T1; + dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; + + T0 = AbulkCV * VdseffCV; + T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); + T2 = VdseffCV / T1; + T3 = T0 * T2; + T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); + T5 = (6.0 * T0 * (4.0 * Vgsteff- T0) / (T1 * T1) - 0.5); + T6 = 12.0 * T2 * T2 * Vgsteff; + + T7 = 1.0 - AbulkCV; + qbulk = CoxWLb * T7 * (0.5 * VdseffCV - T3); + T4 = -T7 * (T4 - 1.0); + T5 = -T7 * T5; + T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); + + Cbg1 = CoxWLb * (T4 + T5 * dVdseffCV_dVg); + Cbd1 = CoxWLb * T5 * dVdseffCV_dVd ; + Cbb1 = CoxWLb * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); + + /* Total inversion charge */ + T0 = AbulkCV * VdseffCV; + T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); + T2 = VdseffCV / T1; + T3 = T0 * T2; + + T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); + T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); + T6 = 12.0 * T2 * T2 * Vgsteff; + + qinv = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); + Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Cgd1 = CoxWL * T5 * dVdseffCV_dVd; + Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); + + /* Inversion charge partitioning into S / D */ + if (model->B3SOIPDxpart > 0.5) + { /* 0/100 Charge partition model */ + T1 = T1 + T1; + qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 + - T0 * T0 / T1); + T7 = (4.0 * Vgsteff - T0) / (T1 * T1); + T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); + T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); + T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); + Csg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Csd1 = CoxWL * T5 * dVdseffCV_dVd; + Csb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); + + } + else if (model->B3SOIPDxpart < 0.5) + { /* 40/60 Charge partition model */ + T1 = T1 / 12.0; + T2 = 0.5 * CoxWL / (T1 * T1); + T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff + * (Vgsteff - 4.0 * T0 / 3.0)) + - 2.0 * T0 * T0 * T0 / 15.0; + qsrc = -T2 * T3; + T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) + + 0.4 * T0 * T0; + T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 + * Vgsteff - 8.0 * T0 / 3.0) + + 2.0 * T0 * T0 / 3.0); + T5 = (qsrc / T1 + T2 * T7) * AbulkCV; + T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); + Csg1 = T4 + T5 * dVdseffCV_dVg; + Csd1 = T5 * dVdseffCV_dVd; + Csb1 = T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb; + } + else + { /* 50/50 Charge partition model */ + qsrc = - 0.5 * (qinv + qbulk); + Csg1 = - 0.5 * (Cgg1 + Cbg1); + Csb1 = - 0.5 * (Cgb1 + Cbb1); + Csd1 = - 0.5 * (Cgd1 + Cbd1); + } + + /* Backgate charge */ + CboxWL = pParam->B3SOIPDkb1 * model->B3SOIPDfbody * Cbox + * (pParam->B3SOIPDweffCV / here->B3SOIPDnseg + * pParam->B3SOIPDleffCVbg + here->B3SOIPDaebcp); + Qe1 = CboxWL * (Vesfb - Vbs); + dQe1_dVb = -CboxWL; + dQe1_dVe = CboxWL; + if (selfheat) dQe1_dT = -CboxWL * dvfbb_dT; + else dQe1_dT = 0; + + qgate = qinv + Qac0 + Qsub0; + qbody = (qbulk - Qac0 - Qsub0 - Qe1); + qsub = Qe1; + qdrn = -(qgate + qsrc + qbody + qsub); + + /* This transform all the dependency on Vgsteff, Vbseff + into real ones */ + Ce1b = dQe1_dVb; + Ce1e = dQe1_dVe; + + Csg = Csg1 * dVgsteff_dVg; + Csd = Csd1 + Csg1 * dVgsteff_dVd; + Csb = Csg1 * dVgsteff_dVb + Csb1 * dVbseff_dVb; + if (selfheat) CsT = Csg1 * dVgsteff_dT; + else CsT = 0.0; + + Cgg = (Cgg1 + dQsub0_dVg) * dVgsteff_dVg + + dQac0_dVrg + dQsub0_dVrg; + Cgd = (Cgg1 + dQsub0_dVg) * dVgsteff_dVd + Cgd1 + + dQac0_dVd + dQsub0_dVd; + Cgb = (Cgg1 + dQsub0_dVg) * dVgsteff_dVb + + (Cgb1 + dQsub0_dVb + dQac0_dVb) * dVbseff_dVb; + if (selfheat) + CgT = (Cgg1 + dQsub0_dVg) * dVgsteff_dT + + dQac0_dT + dQsub0_dT; + else CgT = 0.0; + + Cbg = (Cbg1 - dQsub0_dVg) * dVgsteff_dVg + - dQac0_dVrg - dQsub0_dVrg; + Cbd = (Cbg1 - dQsub0_dVg) * dVgsteff_dVd + Cbd1 + - dQac0_dVd - dQsub0_dVd; + Cbb = (Cbg1 - dQsub0_dVg) * dVgsteff_dVb - dQe1_dVb + + (Cbb1 - dQsub0_dVb - dQac0_dVb) * dVbseff_dVb; + if (selfheat) + CbT = (Cbg1 - dQsub0_dVg) * dVgsteff_dT + - dQac0_dT - dQsub0_dT - dQe1_dT; + else CbT = 0.0; + + here->B3SOIPDcggb = Cgg ; + here->B3SOIPDcgsb = - (Cgg + Cgd + Cgb); + here->B3SOIPDcgdb = Cgd; + here->B3SOIPDcgT = CgT; + + here->B3SOIPDcbgb = Cbg; + here->B3SOIPDcbsb = -(Cbg + Cbd + Cbb) + + Ce1e; + here->B3SOIPDcbdb = Cbd; + here->B3SOIPDcbeb = - Ce1e ; + here->B3SOIPDcbT = CbT; + + here->B3SOIPDceeb = Ce1e ; + here->B3SOIPDceT = dQe1_dT; + + here->B3SOIPDcdgb = -(Cgg + Cbg + Csg); + here->B3SOIPDcddb = -(Cgd + Cbd + Csd); + here->B3SOIPDcdeb = 0; + here->B3SOIPDcdT = -(CgT + CbT + CsT) - dQe1_dT; + here->B3SOIPDcdsb = (Cgg + Cgd + Cgb + + Cbg + Cbd + Cbb + + Csg + Csd + Csb) + Ce1b; + } /* End of if capMod == 2 */ + + else if (model->B3SOIPDcapMod == 3) + { + dVgsteff_dVb /= dVbseff_dVb; + + if (selfheat) { + Vfbzb = Vthzb - phi - pParam->B3SOIPDk1eff * sqrtPhi + + pParam->B3SOIPDdelvt; + dVfbzb_dT = dVthzb_dT; + } + else { + Vfbzb = pParam->B3SOIPDvfbzb + pParam->B3SOIPDdelvt; + dVfbzb_dT = 0; + } + + V3 = Vfbzb - Vgs_eff + Vbseff - DELTA_3; + if (Vfbzb <= 0.0) + { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfbzb); + T2 = -DELTA_3 / T0; + } + else + { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfbzb); + T2 = DELTA_3 / T0; + } + + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff = Vfbzb - 0.5 * (V3 + T0); + dVfbeff_dVg = T1 * dVgs_eff_dVg; + dVfbeff_dVb = -T1; + if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfbzb_dT; + else dVfbeff_dT = 0.0; + +/* v2.2.3 */ + Cox = 3.453133e-11 / (model->B3SOIPDtox - model->B3SOIPDdtoxcv); + CoxWL *= model->B3SOIPDtox/ (model->B3SOIPDtox - model->B3SOIPDdtoxcv); + CoxWLb *= model->B3SOIPDtox/ (model->B3SOIPDtox - model->B3SOIPDdtoxcv); + Tox = 1.0e8 * (model->B3SOIPDtox - model->B3SOIPDdtoxcv); + + T0 = (Vgs_eff - Vbseff - Vfbzb) / Tox; + dT0_dVg = dVgs_eff_dVg / Tox; + dT0_dVb = -1.0 / Tox; + + tmp = T0 * pParam->B3SOIPDacde; + if ((-EXPL_THRESHOLD < tmp) && (tmp < EXPL_THRESHOLD)) + { Tcen = pParam->B3SOIPDldeb * exp(tmp); + dTcen_dVg = pParam->B3SOIPDacde * Tcen; + dTcen_dVb = dTcen_dVg * dT0_dVb; + dTcen_dVg *= dT0_dVg; + if (selfheat) + dTcen_dT = -Tcen * pParam->B3SOIPDacde * dVfbzb_dT / Tox; + else dTcen_dT = 0; + } + else if (tmp <= -EXPL_THRESHOLD) + { Tcen = pParam->B3SOIPDldeb * MIN_EXPL; + dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0; + } + else + { Tcen = pParam->B3SOIPDldeb * MAX_EXPL; + dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0; + } + + LINK = 1.0e-3 * (model->B3SOIPDtox - model->B3SOIPDdtoxcv); /* v2.2.3 */ + V3 = pParam->B3SOIPDldeb - Tcen - LINK; + V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->B3SOIPDldeb); + Tcen = pParam->B3SOIPDldeb - 0.5 * (V3 + V4); + T1 = 0.5 * (1.0 + V3 / V4); + dTcen_dVg *= T1; + dTcen_dVb *= T1; + if (selfheat) + dTcen_dT *= T1; + else dTcen_dT = 0; + + Ccen = EPSSI / Tcen; + T2 = Cox / (Cox + Ccen); + Coxeff = T2 * Ccen; + T3 = -Ccen / Tcen; + dCoxeff_dVg = T2 * T2 * T3; + dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; + dCoxeff_dVg *= dTcen_dVg; + if (selfheat) + dCoxeff_dT = T3 * dTcen_dT * (T2 - Coxeff / (Cox + Ccen)); + else dCoxeff_dT = 0; + CoxWLcenb = CoxWLb * Coxeff / Cox; + if (selfheat) + dCoxWLcenb_dT = CoxWLb * dCoxeff_dT / Cox; + else dCoxWLcenb_dT = 0; + + Qac0 = CoxWLcenb * (Vfbeff - Vfbzb); + QovCox = Qac0 / Coxeff; + dQac0_dVg = CoxWLcenb * dVfbeff_dVg + + QovCox * dCoxeff_dVg; + dQac0_dVb = CoxWLcenb * dVfbeff_dVb + + QovCox * dCoxeff_dVb; + if (selfheat) dQac0_dT = CoxWLcenb * (dVfbeff_dT - dVfbzb_dT) + + dCoxWLcenb_dT * (Vfbeff - Vfbzb); + else dQac0_dT = 0.0; + + T0 = 0.5 * pParam->B3SOIPDk1eff; + T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; + if (pParam->B3SOIPDk1eff == 0.0) + { T1 = 0.0; + T2 = 0.0; + } + else if (T3 < 0.0) + { T1 = T0 + T3 / pParam->B3SOIPDk1eff; + T2 = CoxWLcenb; + } + else + { T1 = sqrt(T0 * T0 + T3); + T2 = CoxWLcenb * T0 / T1; + } + + Qsub0 = CoxWLcenb * pParam->B3SOIPDk1eff * (T1 - T0); + QovCox = Qsub0 / Coxeff; + dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg) + + QovCox * dCoxeff_dVg; + dQsub0_dVd = -T2 * dVgsteff_dVd; + dQsub0_dVb = -T2 * (dVfbeff_dVb + 1 + dVgsteff_dVb) + + QovCox * dCoxeff_dVb; + if (selfheat) + dQsub0_dT = -T2 * (dVfbeff_dT + dVgsteff_dT) + + dCoxWLcenb_dT * pParam->B3SOIPDk1eff * (T1 - T0); + else dQsub0_dT = 0.0; + + /* Gate-bias dependent delta Phis begins */ + if (pParam->B3SOIPDk1eff <= 0.0) + { Denomi = 0.25 * pParam->B3SOIPDmoin * Vtm; + T0 = 0.5 * pParam->B3SOIPDsqrtPhi; + } + else + { Denomi = pParam->B3SOIPDmoin * Vtm + * pParam->B3SOIPDk1eff * pParam->B3SOIPDk1eff; + T0 = pParam->B3SOIPDk1eff * pParam->B3SOIPDsqrtPhi; + } + T1 = 2.0 * T0 + Vgsteff; + + DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); + dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); + dDeltaPhi_dVd = dDeltaPhi_dVg * dVgsteff_dVd; + dDeltaPhi_dVb = dDeltaPhi_dVg * dVgsteff_dVb; + /* End of delta Phis */ + + T3 = 4.0 * (Vth - Vfbzb - phi); + Tox += Tox; + if ((T0 = (Vgsteff + T3) / Tox) > 1e-20) { + tmp = exp(0.7 * log(T0)); + T1 = 1.0 + tmp; + T2 = 0.7 * tmp / (T0 * Tox); + Tcen = 1.9e-9 / T1; + dTcen_dVg = -1.9e-9 * T2 / T1 /T1; + dTcen_dVd = dTcen_dVg * (4.0 * dVth_dVd + dVgsteff_dVd); + dTcen_dVb = dTcen_dVg * (4.0 * dVth_dVb + dVgsteff_dVb); + dTcen_dVg *= dVgsteff_dVg; + if (selfheat) + dTcen_dT = -Tcen * T2 / T1 + * (4.0 * (dVth_dT - dVfbzb_dT) + dVgsteff_dT); + else dTcen_dT = 0; + } + else { + T0 = 1e-20; + tmp = exp(0.7 * log(T0)); + T1 = 1.0 + tmp; + T2 = 0.7 * tmp / (T0 * Tox); + Tcen = 1.9e-9 / T1; + dTcen_dVg = 0; + dTcen_dVd = 0; + dTcen_dVb = 0; + dTcen_dT = 0; + } + + Ccen = EPSSI / Tcen; + T0 = Cox / (Cox + Ccen); + Coxeff = T0 * Ccen; + T1 = -Ccen / Tcen; + dCoxeff_dVg = T0 * T0 * T1; + dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; + dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; + dCoxeff_dVg *= dTcen_dVg; + if (selfheat) + dCoxeff_dT = T1 * dTcen_dT * (T0 - Coxeff / (Cox + Ccen)); + else dCoxeff_dT = 0; + CoxWLcen = CoxWL * Coxeff / Cox; + CoxWLcenb = CoxWLb * Coxeff / Cox; + + AbulkCV = Abulk0 * pParam->B3SOIPDabulkCVfactor; + dAbulkCV_dVb = pParam->B3SOIPDabulkCVfactor * dAbulk0_dVb; + VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; + V4 = VdsatCV - Vds - DELTA_4; + T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); + VdseffCV = VdsatCV - 0.5 * (V4 + T0); + T1 = 0.5 * (1.0 + V4 / T0); + T2 = DELTA_4 / T0; + T3 = (1.0 - T1 - T2) / AbulkCV; + T4 = T3 * ( 1.0 - dDeltaPhi_dVg); + dVdseffCV_dVg = T4; + dVdseffCV_dVd = T1; + dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; + + T0 = AbulkCV * VdseffCV; + T1 = Vgsteff - DeltaPhi; + T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); + T3 = T0 / T2; + T4 = 1.0 - 12.0 * T3 * T3; + T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); + T6 = T5 * VdseffCV / AbulkCV; + + qinv = qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); + QovCox = qgate / Coxeff; + Cgg1 = CoxWLcen * (T4 * (1.0 - dDeltaPhi_dVg) + + T5 * dVdseffCV_dVg); + Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 + * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; + + T7 = 1.0 - AbulkCV; + T8 = T2 * T2; + T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); + T10 = T9 * (1.0 - dDeltaPhi_dVg); + T11 = -T7 * T5 / AbulkCV; + T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); + + qbulk = CoxWLcenb * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); + QovCox = qbulk / Coxeff; + Cbg1 = CoxWLcenb * (T10 + T11 * dVdseffCV_dVg); + Cbd1 = CoxWLcenb * T11 * dVdseffCV_dVd + Cbg1 + * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cbb1 = CoxWLcenb * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) + + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; + + if (model->B3SOIPDxpart > 0.5) + { /* 0/100 partition */ + qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 + - 0.5 * T0 * T0 / T2); + QovCox = qsrc / Coxeff; + T2 += T2; + T3 = T2 * T2; + T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); + T4 = -(0.5 + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg); + T5 = T7 * AbulkCV; + T6 = T7 * VdseffCV; + + Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); + Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd + + QovCox * dCoxeff_dVd; + Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; + } + else if (model->B3SOIPDxpart < 0.5) + { /* 40/60 partition */ + T2 = T2 / 12.0; + T3 = 0.5 * CoxWLcen / (T2 * T2); + T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 + * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; + qsrc = -T3 * T4; + QovCox = qsrc / Coxeff; + T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; + T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 + * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); + T6 = AbulkCV * (qsrc / T2 + T3 * T8); + T7 = T6 * VdseffCV / AbulkCV; + + Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg; + Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd + + QovCox * dCoxeff_dVd; + Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb + + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; + Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; + } + else + { /* 50/50 partition */ + qsrc = -0.5 * qgate; + Csg = -0.5 * Cgg1; + Csd = -0.5 * Cgd1; + Csb = -0.5 * Cgb1; + } + + /* Backgate charge */ + CboxWL = pParam->B3SOIPDkb1 * model->B3SOIPDfbody * Cbox + * (pParam->B3SOIPDweffCV / here->B3SOIPDnseg + * pParam->B3SOIPDleffCVbg + here->B3SOIPDaebcp); + Qe1 = CboxWL * (Vesfb - Vbs); + Ce1b = dQe1_dVb = -CboxWL; + Ce1e = dQe1_dVe = CboxWL; + if (selfheat) Ce1T = dQe1_dT = -CboxWL * dvfbb_dT; + else Ce1T = dQe1_dT = 0.0; + + qgate += Qac0 + Qsub0 - qbulk; + qbody = qbulk - Qac0 - Qsub0 - Qe1; + qsub = Qe1; + qdrn = -(qgate + qbody + qsub + qsrc); + + Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; + Cbd = Cbd1 - dQsub0_dVd; + Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb - Ce1b / dVbseff_dVb; + if (selfheat) + CbT = Cbg1 * dVgsteff_dT - dQac0_dT + - dQsub0_dT - dQe1_dT; + else CbT = 0.0; + + Cgg = Cgg1 - Cbg; + Cgd = Cgd1 - Cbd; + Cgb = Cgb1 - Cbb - Ce1b / dVbseff_dVb; + if (selfheat) + CgT = Cgg1 * dVgsteff_dT + dQac0_dT + + dQsub0_dT; + else CgT = 0.0; + + Cgb *= dVbseff_dVb; + Cbb *= dVbseff_dVb; + Csb *= dVbseff_dVb; + if (selfheat) CsT = Csg * dVgsteff_dT; + else CsT = 0.0; + + here->B3SOIPDcggb = Cgg; + here->B3SOIPDcgsb = -(Cgg + Cgd + Cgb); + here->B3SOIPDcgdb = Cgd; + here->B3SOIPDcgT = CgT; + + here->B3SOIPDcbgb = Cbg; + here->B3SOIPDcbsb = -(Cbg + Cbd + Cbb) + + Ce1e; + here->B3SOIPDcbdb = Cbd; + here->B3SOIPDcbeb = -Ce1e; + here->B3SOIPDcbT = CbT; + + here->B3SOIPDceT = Ce1T; + here->B3SOIPDceeb = Ce1e ; + + here->B3SOIPDcdgb = -(Cgg + Cbg + Csg); + here->B3SOIPDcddb = -(Cgd + Cbd + Csd); + here->B3SOIPDcdeb = 0; + here->B3SOIPDcdT = -(CgT+CbT+CsT) - Ce1T; + here->B3SOIPDcdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + + Csg + Csd + Csb) + Ce1b; + here->B3SOIPDqinv = -qinoi; + + } /* End of if capMod ==3 */ + } + + + finished: /* returning Values to Calling Routine */ + /* + * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE + */ + if (ChargeComputationNeeded) + { + /* Intrinsic S/D junction charge */ + PhiBSWG = model->B3SOIPDGatesidewallJctPotential; + dPhiBSWG_dT = -model->B3SOIPDtpbswg; + PhiBSWG += dPhiBSWG_dT * (Temp - model->B3SOIPDtnom); + MJSWG = model->B3SOIPDbodyJctGateSideGradingCoeff; + + cjsbs = model->B3SOIPDunitLengthGateSidewallJctCap + * wdiosCV * model->B3SOIPDtsi / 1e-7; + dcjsbs_dT = cjsbs * model->B3SOIPDtcjswg; + cjsbs += dcjsbs_dT * (Temp - model->B3SOIPDtnom); + + cjdbs = model->B3SOIPDunitLengthGateSidewallJctCap + * wdiodCV * model->B3SOIPDtsi / 1e-7; + dcjdbs_dT = cjdbs * model->B3SOIPDtcjswg; + cjdbs += dcjdbs_dT * (Temp - model->B3SOIPDtnom); + + DioMax = 0.9 * (PhiBSWG); + + arg = 1.0 - (Vbs > DioMax ? DioMax : Vbs) / PhiBSWG; + + if (selfheat) + darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT; + + if (MJSWG == 0.5) { + dT3_dVb = 1.0 / sqrt(arg); + + if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT; + } + else { + dT3_dVb = exp(-MJSWG * log(arg)); + + if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT; + } + T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); + + if (selfheat) + dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG) + - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); + + if (Vbs > DioMax) + T3 += dT3_dVb * (Vbs - DioMax); + + qjs = cjsbs * T3 + model->B3SOIPDtt * Ibsdif; + gcjsbs = cjsbs * dT3_dVb + model->B3SOIPDtt * dIbsdif_dVb; + + if (selfheat) + gcjsT = model->B3SOIPDtt * dIbsdif_dT + dcjsbs_dT * T3 + dT3_dT * cjsbs; + else gcjsT = 0.0; + + + arg = 1.0 - (Vbd > DioMax ? DioMax : Vbd) / PhiBSWG; + + if (selfheat) + darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT; + + if (MJSWG == 0.5) { + dT3_dVb = 1.0 / sqrt(arg); + + if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT; + } + else { + dT3_dVb = exp(-MJSWG * log(arg)); + + if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT; + } + T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); + + if (selfheat) + dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG) + - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); + + if (Vbd > DioMax) + T3 += dT3_dVb * (Vbd - DioMax); + + dT3_dVd = -dT3_dVb; + + qjd = cjdbs * T3 + model->B3SOIPDtt * Ibddif; + gcjdbs = cjdbs * dT3_dVb + model->B3SOIPDtt * dIbddif_dVb; + gcjdds = cjdbs * dT3_dVd + model->B3SOIPDtt * dIbddif_dVd; + + if (selfheat) + gcjdT = model->B3SOIPDtt * dIbddif_dT + dcjdbs_dT * T3 + dT3_dT * cjdbs; + else gcjdT = 0.0; + + + qdrn -= qjd; + qbody += (qjs + qjd); + qsrc = -(qgate + qbody + qdrn + qsub); + + /* Update the conductance */ + here->B3SOIPDcddb -= gcjdds; + here->B3SOIPDcdT -= gcjdT; + here->B3SOIPDcdsb += gcjdds + gcjdbs; + + here->B3SOIPDcbdb += (gcjdds); + here->B3SOIPDcbT += (gcjdT + gcjsT); + here->B3SOIPDcbsb -= (gcjdds + gcjdbs + gcjsbs); + + + /* Extrinsic Bottom S/D to substrate charge */ + T10 = -model->B3SOIPDtype * ves; + /* T10 is vse without type conversion */ + T11 = model->B3SOIPDtype * (vds - ves); + /* T11 is vde without type conversion */ + + if (model->B3SOIPDcsdmin != 0.0) + { + if ( ((pParam->B3SOIPDnsub > 0) && (model->B3SOIPDtype > 0)) || + ((pParam->B3SOIPDnsub < 0) && (model->B3SOIPDtype < 0)) ) + { + if (T10 < pParam->B3SOIPDvsdfb) + { here->B3SOIPDqse = here->B3SOIPDcsbox * (T10 - pParam->B3SOIPDvsdfb); + here->B3SOIPDgcse = here->B3SOIPDcsbox; + } + else if (T10 < pParam->B3SOIPDsdt1) + { T0 = T10 - pParam->B3SOIPDvsdfb; + T1 = T0 * T0; + here->B3SOIPDqse = T0 * (here->B3SOIPDcsbox - + pParam->B3SOIPDst2 / 3 * T1) ; + here->B3SOIPDgcse = here->B3SOIPDcsbox - pParam->B3SOIPDst2 * T1; + } + else if (T10 < pParam->B3SOIPDvsdth) + { T0 = T10 - pParam->B3SOIPDvsdth; + T1 = T0 * T0; + here->B3SOIPDqse = here->B3SOIPDcsmin * T10 + here->B3SOIPDst4 + + pParam->B3SOIPDst3 / 3 * T0 * T1; + here->B3SOIPDgcse = here->B3SOIPDcsmin + pParam->B3SOIPDst3 * T1; + } + else + { here->B3SOIPDqse = here->B3SOIPDcsmin * T10 + here->B3SOIPDst4; + here->B3SOIPDgcse = here->B3SOIPDcsmin; + } + } else + { + if (T10 < pParam->B3SOIPDvsdth) + { here->B3SOIPDqse = here->B3SOIPDcsmin * (T10 - pParam->B3SOIPDvsdth); + here->B3SOIPDgcse = here->B3SOIPDcsmin; + } + else if (T10 < pParam->B3SOIPDsdt1) + { T0 = T10 - pParam->B3SOIPDvsdth; + T1 = T0 * T0; + here->B3SOIPDqse = T0 * (here->B3SOIPDcsmin - pParam->B3SOIPDst2 / 3 * T1) ; + here->B3SOIPDgcse = here->B3SOIPDcsmin - pParam->B3SOIPDst2 * T1; + } + else if (T10 < pParam->B3SOIPDvsdfb) + { T0 = T10 - pParam->B3SOIPDvsdfb; + T1 = T0 * T0; + here->B3SOIPDqse = here->B3SOIPDcsbox * T10 + here->B3SOIPDst4 + + pParam->B3SOIPDst3 / 3 * T0 * T1; + here->B3SOIPDgcse = here->B3SOIPDcsbox + pParam->B3SOIPDst3 * T1; + } + else + { here->B3SOIPDqse = here->B3SOIPDcsbox * T10 + here->B3SOIPDst4; + here->B3SOIPDgcse = here->B3SOIPDcsbox; + } + } + + if ( ((pParam->B3SOIPDnsub > 0) && (model->B3SOIPDtype > 0)) || + ((pParam->B3SOIPDnsub < 0) && (model->B3SOIPDtype < 0)) ) + { + if (T11 < pParam->B3SOIPDvsdfb) + { here->B3SOIPDqde = here->B3SOIPDcdbox * (T11 - pParam->B3SOIPDvsdfb); + here->B3SOIPDgcde = here->B3SOIPDcdbox; + } + else if (T11 < pParam->B3SOIPDsdt1) + { T0 = T11 - pParam->B3SOIPDvsdfb; + T1 = T0 * T0; + here->B3SOIPDqde = T0 * (here->B3SOIPDcdbox - pParam->B3SOIPDdt2 / 3 * T1) ; + here->B3SOIPDgcde = here->B3SOIPDcdbox - pParam->B3SOIPDdt2 * T1; + } + else if (T11 < pParam->B3SOIPDvsdth) + { T0 = T11 - pParam->B3SOIPDvsdth; + T1 = T0 * T0; + here->B3SOIPDqde = here->B3SOIPDcdmin * T11 + here->B3SOIPDdt4 + + pParam->B3SOIPDdt3 / 3 * T0 * T1; + here->B3SOIPDgcde = here->B3SOIPDcdmin + pParam->B3SOIPDdt3 * T1; + } + else + { here->B3SOIPDqde = here->B3SOIPDcdmin * T11 + here->B3SOIPDdt4; + here->B3SOIPDgcde = here->B3SOIPDcdmin; + } + } else + { + if (T11 < pParam->B3SOIPDvsdth) + { here->B3SOIPDqde = here->B3SOIPDcdmin * (T11 - pParam->B3SOIPDvsdth); + here->B3SOIPDgcde = here->B3SOIPDcdmin; + } + else if (T11 < pParam->B3SOIPDsdt1) + { T0 = T11 - pParam->B3SOIPDvsdth; + T1 = T0 * T0; + here->B3SOIPDqde = T0 * (here->B3SOIPDcdmin - pParam->B3SOIPDdt2 / 3 * T1) ; + here->B3SOIPDgcde = here->B3SOIPDcdmin - pParam->B3SOIPDdt2 * T1; + } + else if (T11 < pParam->B3SOIPDvsdfb) + { T0 = T11 - pParam->B3SOIPDvsdfb; + T1 = T0 * T0; + here->B3SOIPDqde = here->B3SOIPDcdbox * T11 + here->B3SOIPDdt4 + + pParam->B3SOIPDdt3 / 3 * T0 * T1; + here->B3SOIPDgcde = here->B3SOIPDcdbox + pParam->B3SOIPDdt3 * T1; + } + else + { here->B3SOIPDqde = here->B3SOIPDcdbox * T11 + here->B3SOIPDdt4; + here->B3SOIPDgcde = here->B3SOIPDcdbox; + } + } + } + else { + here->B3SOIPDqse = here->B3SOIPDcsbox * T10; + here->B3SOIPDgcse = here->B3SOIPDcsbox; + here->B3SOIPDqde = here->B3SOIPDcdbox * T11; + here->B3SOIPDgcde = here->B3SOIPDcdbox; + } + + /* Extrinsic : Sidewall fringing S/D charge */ + here->B3SOIPDqse += here->B3SOIPDcsesw * T10; + here->B3SOIPDgcse += here->B3SOIPDcsesw; + here->B3SOIPDqde += here->B3SOIPDcdesw * T11; + here->B3SOIPDgcde += here->B3SOIPDcdesw; + + /* All charge are mutliplied with type at the end, but qse and qde + have true polarity => so pre-mutliplied with type */ + here->B3SOIPDqse *= model->B3SOIPDtype; + here->B3SOIPDqde *= model->B3SOIPDtype; + } + + + here->B3SOIPDcbb = Cbb; + here->B3SOIPDcbd = Cbd; + here->B3SOIPDcbg = Cbg; + here->B3SOIPDqbf = -Qsub0 - Qac0; + here->B3SOIPDqjs = qjs; + here->B3SOIPDqjd = qjd; + + /* + * check convergence + */ + if ((here->B3SOIPDoff == 0) || (!(ckt->CKTmode & MODEINITFIX))) + { if (Check == 1) + { ckt->CKTnoncon++; + } + } + + *(ckt->CKTstate0 + here->B3SOIPDvg) = vg; + *(ckt->CKTstate0 + here->B3SOIPDvd) = vd; + *(ckt->CKTstate0 + here->B3SOIPDvs) = vs; + *(ckt->CKTstate0 + here->B3SOIPDvp) = vp; + *(ckt->CKTstate0 + here->B3SOIPDve) = ve; + + *(ckt->CKTstate0 + here->B3SOIPDvbs) = vbs; + *(ckt->CKTstate0 + here->B3SOIPDvbd) = vbd; + *(ckt->CKTstate0 + here->B3SOIPDvgs) = vgs; + *(ckt->CKTstate0 + here->B3SOIPDvds) = vds; + *(ckt->CKTstate0 + here->B3SOIPDves) = ves; + *(ckt->CKTstate0 + here->B3SOIPDvps) = vps; + *(ckt->CKTstate0 + here->B3SOIPDdeltemp) = delTemp; + + /* bulk and channel charge plus overlaps */ + + if (!ChargeComputationNeeded) + goto line850; + line755: - ag0 = ckt->CKTag[0]; - - T0 = vgd + DELTA_1; - T1 = sqrt (T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - - T3 = wdiodCV * pParam->B3SOIPDcgdl; - T4 = sqrt (1.0 - 4.0 * T2 / pParam->B3SOIPDckappa); - cgdo = pParam->B3SOIPDcgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->B3SOIPDcgdo + T3) * vgd - T3 * (T2 - + - 0.5 * - pParam-> - B3SOIPDckappa * - (T4 - 1.0)); - - T0 = vgs + DELTA_1; - T1 = sqrt (T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - T3 = wdiosCV * pParam->B3SOIPDcgsl; - T4 = sqrt (1.0 - 4.0 * T2 / pParam->B3SOIPDckappa); - cgso = pParam->B3SOIPDcgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->B3SOIPDcgso + T3) * vgs - T3 * (T2 - + - 0.5 * - pParam-> - B3SOIPDckappa * - (T4 - 1.0)); - - - - if (here->B3SOIPDdebugMod < 0) - goto line850; - - - if (here->B3SOIPDmode > 0) - { - gcdgb = (here->B3SOIPDcdgb - cgdo) * ag0; - gcddb = (here->B3SOIPDcddb + cgdo + here->B3SOIPDgcde) * ag0; - gcdsb = here->B3SOIPDcdsb * ag0; - gcdeb = (here->B3SOIPDcdeb - here->B3SOIPDgcde) * ag0; - gcdT = model->B3SOIPDtype * here->B3SOIPDcdT * ag0; - - gcsgb = - -(here->B3SOIPDcggb + here->B3SOIPDcbgb + here->B3SOIPDcdgb + - cgso) * ag0; - gcsdb = - -(here->B3SOIPDcgdb + here->B3SOIPDcbdb + - here->B3SOIPDcddb) * ag0; - gcssb = - (cgso + here->B3SOIPDgcse - - (here->B3SOIPDcgsb + here->B3SOIPDcbsb + - here->B3SOIPDcdsb)) * ag0; - gcseb = - -(here->B3SOIPDgcse + here->B3SOIPDcbeb + here->B3SOIPDcdeb + - here->B3SOIPDceeb) * ag0; - gcsT = - -model->B3SOIPDtype * (here->B3SOIPDcgT + here->B3SOIPDcbT + - here->B3SOIPDcdT + - here->B3SOIPDceT) * ag0; - - gcggb = - (here->B3SOIPDcggb + cgdo + cgso + pParam->B3SOIPDcgeo) * ag0; - gcgdb = (here->B3SOIPDcgdb - cgdo) * ag0; - gcgsb = (here->B3SOIPDcgsb - cgso) * ag0; - gcgeb = (-pParam->B3SOIPDcgeo) * ag0; - gcgT = model->B3SOIPDtype * here->B3SOIPDcgT * ag0; - - gcbgb = here->B3SOIPDcbgb * ag0; - gcbdb = here->B3SOIPDcbdb * ag0; - gcbsb = here->B3SOIPDcbsb * ag0; - gcbeb = here->B3SOIPDcbeb * ag0; - gcbT = model->B3SOIPDtype * here->B3SOIPDcbT * ag0; - - gcegb = (-pParam->B3SOIPDcgeo) * ag0; - gcedb = (-here->B3SOIPDgcde) * ag0; - gcesb = (-here->B3SOIPDgcse) * ag0; - gceeb = (here->B3SOIPDgcse + here->B3SOIPDgcde + - here->B3SOIPDceeb + pParam->B3SOIPDcgeo) * ag0; - - gceT = model->B3SOIPDtype * here->B3SOIPDceT * ag0; - - gcTt = pParam->B3SOIPDcth * ag0; - - sxpart = 0.6; - dxpart = 0.4; - - /* Lump the overlap capacitance and S/D parasitics */ - qgd = qgdo; - qgs = qgso; - qge = pParam->B3SOIPDcgeo * vge; - qgate += qgd + qgs + qge; - qdrn += here->B3SOIPDqde - qgd; - qsub -= qge + here->B3SOIPDqse + here->B3SOIPDqde; - qsrc = -(qgate + qbody + qdrn + qsub); - } - else - { - gcsgb = (here->B3SOIPDcdgb - cgso) * ag0; - gcssb = (here->B3SOIPDcddb + cgso + here->B3SOIPDgcse) * ag0; - gcsdb = here->B3SOIPDcdsb * ag0; - gcseb = (here->B3SOIPDcdeb - here->B3SOIPDgcse) * ag0; - gcsT = model->B3SOIPDtype * here->B3SOIPDcdT * ag0; - - gcdgb = - -(here->B3SOIPDcggb + here->B3SOIPDcbgb + here->B3SOIPDcdgb + - cgdo) * ag0; - gcdsb = - -(here->B3SOIPDcgdb + here->B3SOIPDcbdb + - here->B3SOIPDcddb) * ag0; - gcddb = - (cgdo + here->B3SOIPDgcde - - (here->B3SOIPDcgsb + here->B3SOIPDcbsb + - here->B3SOIPDcdsb)) * ag0; - gcdeb = - -(here->B3SOIPDgcde + here->B3SOIPDcbeb + here->B3SOIPDcdeb + - here->B3SOIPDceeb) * ag0; - gcdT = - -model->B3SOIPDtype * (here->B3SOIPDcgT + here->B3SOIPDcbT + - here->B3SOIPDcdT + - here->B3SOIPDceT) * ag0; - - gcggb = - (here->B3SOIPDcggb + cgdo + cgso + pParam->B3SOIPDcgeo) * ag0; - gcgsb = (here->B3SOIPDcgdb - cgso) * ag0; - gcgdb = (here->B3SOIPDcgsb - cgdo) * ag0; - gcgeb = (-pParam->B3SOIPDcgeo) * ag0; - gcgT = model->B3SOIPDtype * here->B3SOIPDcgT * ag0; - - gcbgb = here->B3SOIPDcbgb * ag0; - gcbsb = here->B3SOIPDcbdb * ag0; - gcbdb = here->B3SOIPDcbsb * ag0; - gcbeb = here->B3SOIPDcbeb * ag0; - gcbT = model->B3SOIPDtype * here->B3SOIPDcbT * ag0; - - gcegb = (-pParam->B3SOIPDcgeo) * ag0; - gcesb = (-here->B3SOIPDgcse) * ag0; - gcedb = (-here->B3SOIPDgcde) * ag0; - gceeb = (here->B3SOIPDceeb + pParam->B3SOIPDcgeo + - here->B3SOIPDgcse + here->B3SOIPDgcde) * ag0; - gceT = model->B3SOIPDtype * here->B3SOIPDceT * ag0; - - gcTt = pParam->B3SOIPDcth * ag0; - - dxpart = 0.6; - sxpart = 0.4; - - /* Lump the overlap capacitance */ - qgd = qgdo; - qgs = qgso; - qge = pParam->B3SOIPDcgeo * vge; - qgate += qgd + qgs + qge; - qsrc = qdrn - qgs + here->B3SOIPDqse; - qsub -= qge + here->B3SOIPDqse + here->B3SOIPDqde; - qdrn = -(qgate + qbody + qsrc + qsub); - } - - here->B3SOIPDcgdo = cgdo; - here->B3SOIPDcgso = cgso; - - if (ByPass) - goto line860; - - *(ckt->CKTstate0 + here->B3SOIPDqe) = qsub; - *(ckt->CKTstate0 + here->B3SOIPDqg) = qgate; - *(ckt->CKTstate0 + here->B3SOIPDqd) = qdrn; - *(ckt->CKTstate0 + here->B3SOIPDqb) = qbody; - if ((model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0 != 0.0)) - *(ckt->CKTstate0 + here->B3SOIPDqth) = - pParam->B3SOIPDcth * delTemp; - - - /* store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { - goto line1000; - } - if (!ChargeComputationNeeded) - goto line850; - - - if (ckt->CKTmode & MODEINITTRAN) - { - *(ckt->CKTstate1 + here->B3SOIPDqb) = - *(ckt->CKTstate0 + here->B3SOIPDqb); - *(ckt->CKTstate1 + here->B3SOIPDqg) = - *(ckt->CKTstate0 + here->B3SOIPDqg); - *(ckt->CKTstate1 + here->B3SOIPDqd) = - *(ckt->CKTstate0 + here->B3SOIPDqd); - *(ckt->CKTstate1 + here->B3SOIPDqe) = - *(ckt->CKTstate0 + here->B3SOIPDqe); - *(ckt->CKTstate1 + here->B3SOIPDqth) = - *(ckt->CKTstate0 + here->B3SOIPDqth); - } - - error = NIintegrate (ckt, &geq, &ceq, 0.0, here->B3SOIPDqb); - if (error) - return (error); - error = NIintegrate (ckt, &geq, &ceq, 0.0, here->B3SOIPDqg); - if (error) - return (error); - error = NIintegrate (ckt, &geq, &ceq, 0.0, here->B3SOIPDqd); - if (error) - return (error); - error = NIintegrate (ckt, &geq, &ceq, 0.0, here->B3SOIPDqe); - if (error) - return (error); - if ((model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0 != 0.0)) - { - error = NIintegrate (ckt, &geq, &ceq, 0.0, here->B3SOIPDqth); - if (error) - return (error); - } - - goto line860; + ag0 = ckt->CKTag[0]; + + T0 = vgd + DELTA_1; + T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); + T2 = 0.5 * (T0 - T1); + +/* v2.2.3 bug fix */ + T3 = pParam->B3SOIPDwdiodCV * pParam->B3SOIPDcgdl; + + T4 = sqrt(1.0 - 4.0 * T2 / pParam->B3SOIPDckappa); + cgdo = pParam->B3SOIPDcgdo + T3 - T3 * (1.0 - 1.0 / T4) + * (0.5 - 0.5 * T0 / T1); + qgdo = (pParam->B3SOIPDcgdo + T3) * vgd - T3 * (T2 + + 0.5 * pParam->B3SOIPDckappa * (T4 - 1.0)); + + T0 = vgs + DELTA_1; + T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); + T2 = 0.5 * (T0 - T1); + +/* v2.2.3 bug fix */ + T3 = pParam->B3SOIPDwdiosCV * pParam->B3SOIPDcgsl; + + T4 = sqrt(1.0 - 4.0 * T2 / pParam->B3SOIPDckappa); + cgso = pParam->B3SOIPDcgso + T3 - T3 * (1.0 - 1.0 / T4) + * (0.5 - 0.5 * T0 / T1); + qgso = (pParam->B3SOIPDcgso + T3) * vgs - T3 * (T2 + + 0.5 * pParam->B3SOIPDckappa * (T4 - 1.0)); + + + + if (here->B3SOIPDdebugMod < 0) + goto line850; + + + if (here->B3SOIPDmode > 0) + { gcdgb = (here->B3SOIPDcdgb - cgdo) * ag0; + gcddb = (here->B3SOIPDcddb + cgdo + here->B3SOIPDgcde) * ag0; + gcdsb = here->B3SOIPDcdsb * ag0; + gcdeb = (here->B3SOIPDcdeb - here->B3SOIPDgcde) * ag0; + gcdT = model->B3SOIPDtype * here->B3SOIPDcdT * ag0; + + gcsgb = -(here->B3SOIPDcggb + here->B3SOIPDcbgb + here->B3SOIPDcdgb + + cgso) * ag0; + gcsdb = -(here->B3SOIPDcgdb + here->B3SOIPDcbdb + here->B3SOIPDcddb) * ag0; + gcssb = (cgso + here->B3SOIPDgcse - (here->B3SOIPDcgsb + here->B3SOIPDcbsb + + here->B3SOIPDcdsb)) * ag0; + gcseb = -(here->B3SOIPDgcse + here->B3SOIPDcbeb + here->B3SOIPDcdeb + + here->B3SOIPDceeb) * ag0; + gcsT = - model->B3SOIPDtype * (here->B3SOIPDcgT + here->B3SOIPDcbT + here->B3SOIPDcdT + + here->B3SOIPDceT) * ag0; + + gcggb = (here->B3SOIPDcggb + cgdo + cgso + pParam->B3SOIPDcgeo) * ag0; + gcgdb = (here->B3SOIPDcgdb - cgdo) * ag0; + gcgsb = (here->B3SOIPDcgsb - cgso) * ag0; + gcgeb = (- pParam->B3SOIPDcgeo) * ag0; + gcgT = model->B3SOIPDtype * here->B3SOIPDcgT * ag0; + + gcbgb = here->B3SOIPDcbgb * ag0; + gcbdb = here->B3SOIPDcbdb * ag0; + gcbsb = here->B3SOIPDcbsb * ag0; + gcbeb = here->B3SOIPDcbeb * ag0; + gcbT = model->B3SOIPDtype * here->B3SOIPDcbT * ag0; + + gcegb = (- pParam->B3SOIPDcgeo) * ag0; + gcedb = (- here->B3SOIPDgcde) * ag0; + gcesb = (- here->B3SOIPDgcse) * ag0; + gceeb = (here->B3SOIPDgcse + here->B3SOIPDgcde + + here->B3SOIPDceeb + pParam->B3SOIPDcgeo) * ag0; + + gceT = model->B3SOIPDtype * here->B3SOIPDceT * ag0; + + gcTt = pParam->B3SOIPDcth * ag0; + + sxpart = 0.6; + dxpart = 0.4; + + /* Lump the overlap capacitance and S/D parasitics */ + qgd = qgdo; + qgs = qgso; + qge = pParam->B3SOIPDcgeo * vge; + qgate += qgd + qgs + qge; + qdrn += here->B3SOIPDqde - qgd; + qsub -= qge + here->B3SOIPDqse + here->B3SOIPDqde; + qsrc = -(qgate + qbody + qdrn + qsub); + } + else + { gcsgb = (here->B3SOIPDcdgb - cgso) * ag0; + gcssb = (here->B3SOIPDcddb + cgso + here->B3SOIPDgcse) * ag0; + gcsdb = here->B3SOIPDcdsb * ag0; + gcseb = (here->B3SOIPDcdeb - here->B3SOIPDgcse) * ag0; + gcsT = model->B3SOIPDtype * here->B3SOIPDcdT * ag0; + + gcdgb = -(here->B3SOIPDcggb + here->B3SOIPDcbgb + here->B3SOIPDcdgb + + cgdo) * ag0; + gcdsb = -(here->B3SOIPDcgdb + here->B3SOIPDcbdb + here->B3SOIPDcddb) * ag0; + gcddb = (cgdo + here->B3SOIPDgcde - (here->B3SOIPDcgsb + here->B3SOIPDcbsb + + here->B3SOIPDcdsb)) * ag0; + gcdeb = -(here->B3SOIPDgcde + here->B3SOIPDcbeb + here->B3SOIPDcdeb + + here->B3SOIPDceeb) * ag0; + gcdT = - model->B3SOIPDtype * (here->B3SOIPDcgT + here->B3SOIPDcbT + + here->B3SOIPDcdT + here->B3SOIPDceT) * ag0; + + gcggb = (here->B3SOIPDcggb + cgdo + cgso + pParam->B3SOIPDcgeo) * ag0; + gcgsb = (here->B3SOIPDcgdb - cgso) * ag0; + gcgdb = (here->B3SOIPDcgsb - cgdo) * ag0; + gcgeb = (- pParam->B3SOIPDcgeo) * ag0; + gcgT = model->B3SOIPDtype * here->B3SOIPDcgT * ag0; + + gcbgb = here->B3SOIPDcbgb * ag0; + gcbsb = here->B3SOIPDcbdb * ag0; + gcbdb = here->B3SOIPDcbsb * ag0; + gcbeb = here->B3SOIPDcbeb * ag0; + gcbT = model->B3SOIPDtype * here->B3SOIPDcbT * ag0; + + gcegb = (-pParam->B3SOIPDcgeo) * ag0; + gcesb = (- here->B3SOIPDgcse) * ag0; + gcedb = (- here->B3SOIPDgcde) * ag0; + gceeb = (here->B3SOIPDceeb + pParam->B3SOIPDcgeo + + here->B3SOIPDgcse + here->B3SOIPDgcde) * ag0; + gceT = model->B3SOIPDtype * here->B3SOIPDceT * ag0; + + gcTt = pParam->B3SOIPDcth * ag0; + + dxpart = 0.6; + sxpart = 0.4; + + /* Lump the overlap capacitance */ + qgd = qgdo; + qgs = qgso; + qge = pParam->B3SOIPDcgeo * vge; + qgate += qgd + qgs + qge; + qsrc = qdrn - qgs + here->B3SOIPDqse; + qsub -= qge + here->B3SOIPDqse + here->B3SOIPDqde; + qdrn = -(qgate + qbody + qsrc + qsub); + } + + here->B3SOIPDcgdo = cgdo; + here->B3SOIPDcgso = cgso; + + if (ByPass) goto line860; + + *(ckt->CKTstate0 + here->B3SOIPDqe) = qsub; + *(ckt->CKTstate0 + here->B3SOIPDqg) = qgate; + *(ckt->CKTstate0 + here->B3SOIPDqd) = qdrn; + *(ckt->CKTstate0 + here->B3SOIPDqb) = qbody; + if ((model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0!=0.0)) + *(ckt->CKTstate0 + here->B3SOIPDqth) = pParam->B3SOIPDcth * delTemp; + + + /* store small signal parameters */ + if (ckt->CKTmode & MODEINITSMSIG) + { goto line1000; + } + if (!ChargeComputationNeeded) + goto line850; + + + if (ckt->CKTmode & MODEINITTRAN) + { *(ckt->CKTstate1 + here->B3SOIPDqb) = + *(ckt->CKTstate0 + here->B3SOIPDqb); + *(ckt->CKTstate1 + here->B3SOIPDqg) = + *(ckt->CKTstate0 + here->B3SOIPDqg); + *(ckt->CKTstate1 + here->B3SOIPDqd) = + *(ckt->CKTstate0 + here->B3SOIPDqd); + *(ckt->CKTstate1 + here->B3SOIPDqe) = + *(ckt->CKTstate0 + here->B3SOIPDqe); + *(ckt->CKTstate1 + here->B3SOIPDqth) = + *(ckt->CKTstate0 + here->B3SOIPDqth); + } + + error = NIintegrate(ckt, &geq, &ceq,0.0,here->B3SOIPDqb); + if (error) return(error); + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B3SOIPDqg); + if (error) return(error); + error = NIintegrate(ckt,&geq, &ceq, 0.0, here->B3SOIPDqd); + if (error) return(error); + error = NIintegrate(ckt,&geq, &ceq, 0.0, here->B3SOIPDqe); + if (error) return(error); + if ((model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0!=0.0)) + { + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B3SOIPDqth); + if (error) return (error); + } + + goto line860; line850: - /* initialize to zero charge conductance and current */ - ceqqe = ceqqg = ceqqb = ceqqd = ceqqth = 0.0; + /* initialize to zero charge conductance and current */ + ceqqe = ceqqg = ceqqb = ceqqd = ceqqth= 0.0; - gcdgb = gcddb = gcdsb = gcdeb = gcdT = 0.0; - gcsgb = gcsdb = gcssb = gcseb = gcsT = 0.0; - gcggb = gcgdb = gcgsb = gcgeb = gcgT = 0.0; - gcbgb = gcbdb = gcbsb = gcbeb = gcbT = 0.0; - gcegb = gcedb = gceeb = gcesb = gceT = 0.0; - gcTt = 0.0; + gcdgb = gcddb = gcdsb = gcdeb = gcdT = 0.0; + gcsgb = gcsdb = gcssb = gcseb = gcsT = 0.0; + gcggb = gcgdb = gcgsb = gcgeb = gcgT = 0.0; + gcbgb = gcbdb = gcbsb = gcbeb = gcbT = 0.0; + gcegb = gcedb = gceeb = gcesb = gceT = 0.0; + gcTt = 0.0; - sxpart = (1.0 - (dxpart = (here->B3SOIPDmode > 0) ? 0.4 : 0.6)); - - goto line900; + sxpart = (1.0 - (dxpart = (here->B3SOIPDmode > 0) ? 0.4 : 0.6)); + goto line900; + line860: - /* evaluate equivalent charge current */ - - cqgate = *(ckt->CKTstate0 + here->B3SOIPDcqg); - cqbody = *(ckt->CKTstate0 + here->B3SOIPDcqb); - cqdrn = *(ckt->CKTstate0 + here->B3SOIPDcqd); - cqsub = *(ckt->CKTstate0 + here->B3SOIPDcqe); - cqtemp = *(ckt->CKTstate0 + here->B3SOIPDcqth); - - here->B3SOIPDcb += cqbody; - here->B3SOIPDcd += cqdrn; - - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs - - gcgeb * veb - gcgT * delTemp; - ceqqb = cqbody - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs - - gcbeb * veb - gcbT * delTemp; - ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs - - gcdeb * veb - gcdT * delTemp; - ceqqe = cqsub - gcegb * vgb + gcedb * vbd + gcesb * vbs - - gceeb * veb - gceT * delTemp;; - ceqqth = cqtemp - gcTt * delTemp; - - if (ckt->CKTmode & MODEINITTRAN) - { - *(ckt->CKTstate1 + here->B3SOIPDcqe) = - *(ckt->CKTstate0 + here->B3SOIPDcqe); - *(ckt->CKTstate1 + here->B3SOIPDcqb) = - *(ckt->CKTstate0 + here->B3SOIPDcqb); - *(ckt->CKTstate1 + here->B3SOIPDcqg) = - *(ckt->CKTstate0 + here->B3SOIPDcqg); - *(ckt->CKTstate1 + here->B3SOIPDcqd) = - *(ckt->CKTstate0 + here->B3SOIPDcqd); - *(ckt->CKTstate1 + here->B3SOIPDcqth) = - *(ckt->CKTstate0 + here->B3SOIPDcqth); - } - - /* - * load current vector - */ + /* evaluate equivalent charge current */ + + cqgate = *(ckt->CKTstate0 + here->B3SOIPDcqg); + cqbody = *(ckt->CKTstate0 + here->B3SOIPDcqb); + cqdrn = *(ckt->CKTstate0 + here->B3SOIPDcqd); + cqsub = *(ckt->CKTstate0 + here->B3SOIPDcqe); + cqtemp = *(ckt->CKTstate0 + here->B3SOIPDcqth); + + here->B3SOIPDcb += cqbody; + here->B3SOIPDcd += cqdrn; + + ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs + - gcgeb * veb - gcgT * delTemp; + ceqqb = cqbody - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs + - gcbeb * veb - gcbT * delTemp; + ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs + - gcdeb * veb - gcdT * delTemp; + ceqqe = cqsub - gcegb * vgb + gcedb * vbd + gcesb * vbs + - gceeb * veb - gceT * delTemp;; + ceqqth = cqtemp - gcTt * delTemp; + + if (ckt->CKTmode & MODEINITTRAN) + { *(ckt->CKTstate1 + here->B3SOIPDcqe) = + *(ckt->CKTstate0 + here->B3SOIPDcqe); + *(ckt->CKTstate1 + here->B3SOIPDcqb) = + *(ckt->CKTstate0 + here->B3SOIPDcqb); + *(ckt->CKTstate1 + here->B3SOIPDcqg) = + *(ckt->CKTstate0 + here->B3SOIPDcqg); + *(ckt->CKTstate1 + here->B3SOIPDcqd) = + *(ckt->CKTstate0 + here->B3SOIPDcqd); + *(ckt->CKTstate1 + here->B3SOIPDcqth) = + *(ckt->CKTstate0 + here->B3SOIPDcqth); + } + + /* + * load current vector + */ line900: - if (here->B3SOIPDmode >= 0) - { - Gm = here->B3SOIPDgm; - Gmbs = here->B3SOIPDgmbs; - GmT = model->B3SOIPDtype * here->B3SOIPDgmT; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cdreq = - model->B3SOIPDtype * (here->B3SOIPDcdrain - - here->B3SOIPDgds * vds - Gm * vgs - - Gmbs * vbs - GmT * delTemp); - /* ceqbs now is compatible with cdreq, ie. going in is +ve */ - /* Equivalent current source from the diode */ - ceqbs = here->B3SOIPDcjs; - ceqbd = here->B3SOIPDcjd; - /* Current going in is +ve */ - ceqbody = -here->B3SOIPDcbody; - - - ceqgate = here->B3SOIPDcgate; - gigg = here->B3SOIPDgigg; - gigb = here->B3SOIPDgigb; - gigs = here->B3SOIPDgigs; - gigd = here->B3SOIPDgigd; - gigT = model->B3SOIPDtype * here->B3SOIPDgigT; - - ceqth = here->B3SOIPDcth; - ceqbodcon = here->B3SOIPDcbodcon; - - gbbg = -here->B3SOIPDgbgs; - gbbdp = -here->B3SOIPDgbds; - gbbb = -here->B3SOIPDgbbs; - gbbp = -here->B3SOIPDgbps; - gbbT = -model->B3SOIPDtype * here->B3SOIPDgbT; - gbbsp = -(gbbg + gbbdp + gbbb + gbbp); - - gddpg = -here->B3SOIPDgjdg; - gddpdp = -here->B3SOIPDgjdd; - gddpb = -here->B3SOIPDgjdb; - gddpT = -model->B3SOIPDtype * here->B3SOIPDgjdT; - gddpsp = -(gddpg + gddpdp + gddpb); - - gsspg = -here->B3SOIPDgjsg; - gsspdp = -here->B3SOIPDgjsd; - gsspb = -here->B3SOIPDgjsb; - gsspT = -model->B3SOIPDtype * here->B3SOIPDgjsT; - gsspsp = -(gsspg + gsspdp + gsspb); - - gppb = -here->B3SOIPDgbpbs; - gppp = -here->B3SOIPDgbpps; - gppT = -model->B3SOIPDtype * here->B3SOIPDgbpT; - - gTtg = here->B3SOIPDgtempg; - gTtb = here->B3SOIPDgtempb; - gTtdp = here->B3SOIPDgtempd; - gTtt = here->B3SOIPDgtempT; - gTtsp = -(gTtg + gTtb + gTtdp); - } - else - { - Gm = -here->B3SOIPDgm; - Gmbs = -here->B3SOIPDgmbs; - GmT = -model->B3SOIPDtype * here->B3SOIPDgmT; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs); - cdreq = - -model->B3SOIPDtype * (here->B3SOIPDcdrain + - here->B3SOIPDgds * vds + Gm * vgd + - Gmbs * vbd + GmT * delTemp); - ceqbs = here->B3SOIPDcjd; - ceqbd = here->B3SOIPDcjs; - /* Current going in is +ve */ - ceqbody = -here->B3SOIPDcbody; - - - ceqgate = here->B3SOIPDcgate; - gigg = here->B3SOIPDgigg; - gigb = here->B3SOIPDgigb; - gigs = here->B3SOIPDgigd; - gigd = here->B3SOIPDgigs; - gigT = model->B3SOIPDtype * here->B3SOIPDgigT; - - ceqth = here->B3SOIPDcth; - ceqbodcon = here->B3SOIPDcbodcon; - - gbbg = -here->B3SOIPDgbgs; - gbbb = -here->B3SOIPDgbbs; - gbbp = -here->B3SOIPDgbps; - gbbsp = -here->B3SOIPDgbds; - gbbT = -model->B3SOIPDtype * here->B3SOIPDgbT; - gbbdp = -(gbbg + gbbsp + gbbb + gbbp); - - gddpg = -here->B3SOIPDgjsg; - gddpsp = -here->B3SOIPDgjsd; - gddpb = -here->B3SOIPDgjsb; - gddpT = -model->B3SOIPDtype * here->B3SOIPDgjsT; - gddpdp = -(gddpg + gddpsp + gddpb); - - gsspg = -here->B3SOIPDgjdg; - gsspsp = -here->B3SOIPDgjdd; - gsspb = -here->B3SOIPDgjdb; - gsspT = -model->B3SOIPDtype * here->B3SOIPDgjdT; - gsspdp = -(gsspg + gsspsp + gsspb); - - gppb = -here->B3SOIPDgbpbs; - gppp = -here->B3SOIPDgbpps; - gppT = -model->B3SOIPDtype * here->B3SOIPDgbpT; - - gTtg = here->B3SOIPDgtempg; - gTtb = here->B3SOIPDgtempb; - gTtsp = here->B3SOIPDgtempd; - gTtt = here->B3SOIPDgtempT; - gTtdp = -(gTtg + gTtb + gTtsp); - } - - if (model->B3SOIPDtype > 0) - { - ceqqg = ceqqg; - ceqqb = ceqqb; - ceqqe = ceqqe; - ceqqd = ceqqd; - } - else - { - ceqbodcon = -ceqbodcon; - ceqbody = -ceqbody; - ceqgate = -ceqgate; - ceqbs = -ceqbs; - ceqbd = -ceqbd; - ceqqg = -ceqqg; - ceqqb = -ceqqb; - ceqqd = -ceqqd; - ceqqe = -ceqqe; - } - - (*(ckt->CKTrhs + here->B3SOIPDbNode) -= (ceqbody + ceqqb)); - - (*(ckt->CKTrhs + here->B3SOIPDgNode) -= (ceqgate + ceqqg)); - (*(ckt->CKTrhs + here->B3SOIPDdNodePrime) += (ceqbd - cdreq - ceqqd)); - (*(ckt->CKTrhs + here->B3SOIPDsNodePrime) += (cdreq + ceqbs + ceqqg - + ceqqb + ceqqd + - ceqqe)); - (*(ckt->CKTrhs + here->B3SOIPDeNode) -= ceqqe); - - if (here->B3SOIPDbodyMod == 1) - { - (*(ckt->CKTrhs + here->B3SOIPDpNode) += ceqbodcon); - } - - if (selfheat) - { - (*(ckt->CKTrhs + here->B3SOIPDtempNode) -= ceqth + ceqqth); - } - - - - if (here->B3SOIPDdebugMod != 0) - { - *(ckt->CKTrhs + here->B3SOIPDvbsNode) = here->B3SOIPDvbseff; - *(ckt->CKTrhs + here->B3SOIPDidsNode) = FLOG (here->B3SOIPDids); - *(ckt->CKTrhs + here->B3SOIPDicNode) = FLOG (here->B3SOIPDic); - *(ckt->CKTrhs + here->B3SOIPDibsNode) = FLOG (here->B3SOIPDibs); - *(ckt->CKTrhs + here->B3SOIPDibdNode) = FLOG (here->B3SOIPDibd); - *(ckt->CKTrhs + here->B3SOIPDiiiNode) = FLOG (here->B3SOIPDiii); - *(ckt->CKTrhs + here->B3SOIPDigNode) = here->B3SOIPDig; - *(ckt->CKTrhs + here->B3SOIPDgiggNode) = here->B3SOIPDgigg; - *(ckt->CKTrhs + here->B3SOIPDgigdNode) = here->B3SOIPDgigd; - *(ckt->CKTrhs + here->B3SOIPDgigbNode) = here->B3SOIPDgigb; - *(ckt->CKTrhs + here->B3SOIPDigidlNode) = here->B3SOIPDigidl; - *(ckt->CKTrhs + here->B3SOIPDitunNode) = here->B3SOIPDitun; - *(ckt->CKTrhs + here->B3SOIPDibpNode) = here->B3SOIPDibp; - *(ckt->CKTrhs + here->B3SOIPDcbbNode) = here->B3SOIPDcbb; - *(ckt->CKTrhs + here->B3SOIPDcbdNode) = here->B3SOIPDcbd; - *(ckt->CKTrhs + here->B3SOIPDcbgNode) = here->B3SOIPDcbg; - *(ckt->CKTrhs + here->B3SOIPDqbfNode) = here->B3SOIPDqbf; - *(ckt->CKTrhs + here->B3SOIPDqjsNode) = here->B3SOIPDqjs; - *(ckt->CKTrhs + here->B3SOIPDqjdNode) = here->B3SOIPDqjd; - } - - - /* - * load y matrix - */ - Gmin = ckt->CKTgmin * 1e-6; - - *(here->B3SOIPDEdpPtr) += gcedb; - *(here->B3SOIPDEspPtr) += gcesb; - *(here->B3SOIPDDPePtr) += gcdeb; - *(here->B3SOIPDSPePtr) += gcseb; - *(here->B3SOIPDEgPtr) += gcegb; - *(here->B3SOIPDGePtr) += gcgeb; - - (*(here->B3SOIPDEbPtr) -= gcegb + gcedb + gcesb + gceeb); - (*(here->B3SOIPDGbPtr) -= -gigb + gcggb + gcgdb + gcgsb + gcgeb); - (*(here->B3SOIPDDPbPtr) -= (-gddpb - Gmbs + gcdgb + gcddb + gcdeb + gcdsb)); - - - (*(here->B3SOIPDSPbPtr) -= - (-gsspb + Gmbs + gcsgb + gcsdb + gcseb + gcssb)) + Gmin; - - - (*(here->B3SOIPDBePtr) += gcbeb); - (*(here->B3SOIPDBgPtr) += -gigg + gcbgb + gbbg); - (*(here->B3SOIPDBdpPtr) += -gigd + gcbdb + gbbdp); - (*(here->B3SOIPDBspPtr) += gcbsb + gbbsp - Gmin - gigs); - - (*(here->B3SOIPDBbPtr) += - -gigb + gbbb - gcbgb - gcbdb - gcbsb - gcbeb + Gmin); - (*(here->B3SOIPDEePtr) += gceeb); - - (*(here->B3SOIPDGgPtr) += gigg + gcggb + ckt->CKTgmin); - (*(here->B3SOIPDGdpPtr) += gigd + gcgdb - ckt->CKTgmin); - (*(here->B3SOIPDGspPtr) += gcgsb + gigs); - - (*(here->B3SOIPDDPgPtr) += (Gm + gcdgb) + gddpg - ckt->CKTgmin); - (*(here->B3SOIPDDPdpPtr) += (here->B3SOIPDdrainConductance - + here->B3SOIPDgds + gddpdp - + RevSum + gcddb) + ckt->CKTgmin); - (*(here->B3SOIPDDPspPtr) -= (-gddpsp + here->B3SOIPDgds + FwdSum - gcdsb)); - - (*(here->B3SOIPDDPdPtr) -= here->B3SOIPDdrainConductance); - - (*(here->B3SOIPDSPgPtr) += gcsgb - Gm + gsspg); - (*(here->B3SOIPDSPdpPtr) -= (here->B3SOIPDgds - gsspdp + RevSum - gcsdb)); - - (*(here->B3SOIPDSPspPtr) += (here->B3SOIPDsourceConductance - + here->B3SOIPDgds + gsspsp - + FwdSum + gcssb)) + Gmin; - - - (*(here->B3SOIPDSPsPtr) -= here->B3SOIPDsourceConductance); - - - (*(here->B3SOIPDDdPtr) += here->B3SOIPDdrainConductance); - (*(here->B3SOIPDDdpPtr) -= here->B3SOIPDdrainConductance); - - - (*(here->B3SOIPDSsPtr) += here->B3SOIPDsourceConductance); - (*(here->B3SOIPDSspPtr) -= here->B3SOIPDsourceConductance); - - if (here->B3SOIPDbodyMod == 1) - { - (*(here->B3SOIPDBpPtr) -= gppp); - (*(here->B3SOIPDPbPtr) += gppb); - (*(here->B3SOIPDPpPtr) += gppp); - } - - if (selfheat) - { - (*(here->B3SOIPDDPtempPtr) += GmT + gddpT + gcdT); - (*(here->B3SOIPDSPtempPtr) += -GmT + gsspT + gcsT); - (*(here->B3SOIPDBtempPtr) += gbbT + gcbT - gigT); - (*(here->B3SOIPDEtempPtr) += gceT); - (*(here->B3SOIPDGtempPtr) += gcgT + gigT); - (*(here->B3SOIPDTemptempPtr) += gTtt + 1 / pParam->B3SOIPDrth + gcTt); - (*(here->B3SOIPDTempgPtr) += gTtg); - (*(here->B3SOIPDTempbPtr) += gTtb); - (*(here->B3SOIPDTempdpPtr) += gTtdp); - (*(here->B3SOIPDTempspPtr) += gTtsp); - } - - if (here->B3SOIPDdebugMod != 0) - { - *(here->B3SOIPDVbsPtr) += 1; - *(here->B3SOIPDIdsPtr) += 1; - *(here->B3SOIPDIcPtr) += 1; - *(here->B3SOIPDIbsPtr) += 1; - *(here->B3SOIPDIbdPtr) += 1; - *(here->B3SOIPDIiiPtr) += 1; - *(here->B3SOIPDIgPtr) += 1; - *(here->B3SOIPDGiggPtr) += 1; - *(here->B3SOIPDGigdPtr) += 1; - *(here->B3SOIPDGigbPtr) += 1; - *(here->B3SOIPDIgidlPtr) += 1; - *(here->B3SOIPDItunPtr) += 1; - *(here->B3SOIPDIbpPtr) += 1; - *(here->B3SOIPDCbgPtr) += 1; - *(here->B3SOIPDCbbPtr) += 1; - *(here->B3SOIPDCbdPtr) += 1; - *(here->B3SOIPDQbfPtr) += 1; - *(here->B3SOIPDQjsPtr) += 1; - *(here->B3SOIPDQjdPtr) += 1; - - } - - line1000:; - - - } /* End of Mosfet Instance */ - } /* End of Model Instance */ - - - return (OK); + m = here->B3SOIPDm; + + if (here->B3SOIPDmode >= 0) + { Gm = here->B3SOIPDgm; + Gmbs = here->B3SOIPDgmbs; + GmT = model->B3SOIPDtype * here->B3SOIPDgmT; + FwdSum = Gm + Gmbs; + RevSum = 0.0; + + /* v2.2.2 bug fix */ + cdreq = model->B3SOIPDtype * (here->B3SOIPDcdrain - here->B3SOIPDgds * vds + - Gm * vgs - Gmbs * vbs) - GmT * delTemp; + + /* ceqbs now is compatible with cdreq, ie. going in is +ve */ + /* Equivalent current source from the diode */ + ceqbs = here->B3SOIPDcjs; + ceqbd = here->B3SOIPDcjd; + /* Current going in is +ve */ + ceqbody = -here->B3SOIPDcbody; + + + ceqgate = here->B3SOIPDcgate; + gigg = here->B3SOIPDgigg; + gigb = here->B3SOIPDgigb; + gigs = here->B3SOIPDgigs; + gigd = here->B3SOIPDgigd; + gigT = model->B3SOIPDtype * here->B3SOIPDgigT; + + ceqth = here->B3SOIPDcth; + ceqbodcon = here->B3SOIPDcbodcon; + + gbbg = -here->B3SOIPDgbgs; + gbbdp = -here->B3SOIPDgbds; + gbbb = -here->B3SOIPDgbbs; + gbbp = -here->B3SOIPDgbps; + gbbT = -model->B3SOIPDtype * here->B3SOIPDgbT; + gbbsp = - ( gbbg + gbbdp + gbbb + gbbp); + + gddpg = -here->B3SOIPDgjdg; + gddpdp = -here->B3SOIPDgjdd; + gddpb = -here->B3SOIPDgjdb; + gddpT = -model->B3SOIPDtype * here->B3SOIPDgjdT; + gddpsp = - ( gddpg + gddpdp + gddpb); + + gsspg = -here->B3SOIPDgjsg; + gsspdp = -here->B3SOIPDgjsd; + gsspb = -here->B3SOIPDgjsb; + gsspT = -model->B3SOIPDtype * here->B3SOIPDgjsT; + gsspsp = - (gsspg + gsspdp + gsspb ); + + gppb = -here->B3SOIPDgbpbs; + gppp = -here->B3SOIPDgbpps; + gppT = -model->B3SOIPDtype * here->B3SOIPDgbpT; + + gTtg = here->B3SOIPDgtempg; + gTtb = here->B3SOIPDgtempb; + gTtdp = here->B3SOIPDgtempd; + gTtt = here->B3SOIPDgtempT; + gTtsp = - (gTtg + gTtb + gTtdp); + } + else + { Gm = -here->B3SOIPDgm; + Gmbs = -here->B3SOIPDgmbs; + GmT = -model->B3SOIPDtype * here->B3SOIPDgmT; + FwdSum = 0.0; + RevSum = -(Gm + Gmbs); + + /* v2.2.2 bug fix */ + cdreq = -model->B3SOIPDtype * (here->B3SOIPDcdrain + here->B3SOIPDgds*vds + + Gm * vgd + Gmbs * vbd) + GmT * delTemp; + + ceqbs = here->B3SOIPDcjd; + ceqbd = here->B3SOIPDcjs; + /* Current going in is +ve */ + ceqbody = -here->B3SOIPDcbody; + + + ceqgate = here->B3SOIPDcgate; + gigg = here->B3SOIPDgigg; + gigb = here->B3SOIPDgigb; + gigs = here->B3SOIPDgigd; + gigd = here->B3SOIPDgigs; + gigT = model->B3SOIPDtype * here->B3SOIPDgigT; + + ceqth = here->B3SOIPDcth; + ceqbodcon = here->B3SOIPDcbodcon; + + gbbg = -here->B3SOIPDgbgs; + gbbb = -here->B3SOIPDgbbs; + gbbp = -here->B3SOIPDgbps; + gbbsp = -here->B3SOIPDgbds; + gbbT = -model->B3SOIPDtype * here->B3SOIPDgbT; + gbbdp = - ( gbbg + gbbsp + gbbb + gbbp); + + gddpg = -here->B3SOIPDgjsg; + gddpsp = -here->B3SOIPDgjsd; + gddpb = -here->B3SOIPDgjsb; + gddpT = -model->B3SOIPDtype * here->B3SOIPDgjsT; + gddpdp = - (gddpg + gddpsp + gddpb ); + + gsspg = -here->B3SOIPDgjdg; + gsspsp = -here->B3SOIPDgjdd; + gsspb = -here->B3SOIPDgjdb; + gsspT = -model->B3SOIPDtype * here->B3SOIPDgjdT; + gsspdp = - ( gsspg + gsspsp + gsspb ); + + gppb = -here->B3SOIPDgbpbs; + gppp = -here->B3SOIPDgbpps; + gppT = -model->B3SOIPDtype * here->B3SOIPDgbpT; + + gTtg = here->B3SOIPDgtempg; + gTtb = here->B3SOIPDgtempb; + gTtsp = here->B3SOIPDgtempd; + gTtt = here->B3SOIPDgtempT; + gTtdp = - (gTtg + gTtb + gTtsp); + } + + if (model->B3SOIPDtype > 0) + { + ceqqg = ceqqg; + ceqqb = ceqqb; + ceqqe = ceqqe; + ceqqd = ceqqd; + } + else + { + ceqbodcon = -ceqbodcon; + ceqbody = -ceqbody; + ceqgate = -ceqgate; + ceqbs = -ceqbs; + ceqbd = -ceqbd; + ceqqg = -ceqqg; + ceqqb = -ceqqb; + ceqqd = -ceqqd; + ceqqe = -ceqqe; + } + + (*(ckt->CKTrhs + here->B3SOIPDbNode) -= m * (ceqbody + ceqqb)); + + (*(ckt->CKTrhs + here->B3SOIPDgNode) -= m * (ceqgate + ceqqg)); + (*(ckt->CKTrhs + here->B3SOIPDdNodePrime) += m * (ceqbd - cdreq - ceqqd)); + (*(ckt->CKTrhs + here->B3SOIPDsNodePrime) += m * (cdreq + ceqbs + ceqqg + + ceqqb + ceqqd + ceqqe)); + (*(ckt->CKTrhs + here->B3SOIPDeNode) -= m * ceqqe); + + if (here->B3SOIPDbodyMod == 1) { + (*(ckt->CKTrhs + here->B3SOIPDpNode) += m * ceqbodcon); + } + + if (selfheat) { + (*(ckt->CKTrhs + here->B3SOIPDtempNode) -= m * (ceqth + ceqqth)); + } + + + + if (here->B3SOIPDdebugMod != 0) + { + *(ckt->CKTrhs + here->B3SOIPDvbsNode) = here->B3SOIPDvbseff; + *(ckt->CKTrhs + here->B3SOIPDidsNode) = FLOG(here->B3SOIPDids); + *(ckt->CKTrhs + here->B3SOIPDicNode) = FLOG(here->B3SOIPDic); + *(ckt->CKTrhs + here->B3SOIPDibsNode) = FLOG(here->B3SOIPDibs); + *(ckt->CKTrhs + here->B3SOIPDibdNode) = FLOG(here->B3SOIPDibd); + *(ckt->CKTrhs + here->B3SOIPDiiiNode) = FLOG(here->B3SOIPDiii); + *(ckt->CKTrhs + here->B3SOIPDigNode) = here->B3SOIPDig; + *(ckt->CKTrhs + here->B3SOIPDgiggNode) = here->B3SOIPDgigg; + *(ckt->CKTrhs + here->B3SOIPDgigdNode) = here->B3SOIPDgigd; + *(ckt->CKTrhs + here->B3SOIPDgigbNode) = here->B3SOIPDgigb; + *(ckt->CKTrhs + here->B3SOIPDigidlNode) = here->B3SOIPDigidl; + *(ckt->CKTrhs + here->B3SOIPDitunNode) = here->B3SOIPDitun; + *(ckt->CKTrhs + here->B3SOIPDibpNode) = here->B3SOIPDibp; + *(ckt->CKTrhs + here->B3SOIPDcbbNode) = here->B3SOIPDcbb; + *(ckt->CKTrhs + here->B3SOIPDcbdNode) = here->B3SOIPDcbd; + *(ckt->CKTrhs + here->B3SOIPDcbgNode) = here->B3SOIPDcbg; + *(ckt->CKTrhs + here->B3SOIPDqbfNode) = here->B3SOIPDqbf; + *(ckt->CKTrhs + here->B3SOIPDqjsNode) = here->B3SOIPDqjs; + *(ckt->CKTrhs + here->B3SOIPDqjdNode) = here->B3SOIPDqjd; + } + + + /* + * load y matrix + */ + Gmin = ckt->CKTgmin * 1e-6; + + *(here->B3SOIPDEdpPtr) += m * gcedb; + *(here->B3SOIPDEspPtr) += m * gcesb; + *(here->B3SOIPDDPePtr) += m * gcdeb; + *(here->B3SOIPDSPePtr) += m * gcseb; + *(here->B3SOIPDEgPtr) += m * gcegb; + *(here->B3SOIPDGePtr) += m * gcgeb; + + (*(here->B3SOIPDEbPtr) -= m * (gcegb + gcedb + gcesb + gceeb)); + (*(here->B3SOIPDGbPtr) -= m * (-gigb + gcggb + gcgdb + gcgsb + gcgeb)); + (*(here->B3SOIPDDPbPtr) -= m * (-gddpb - Gmbs + gcdgb + gcddb + gcdeb + gcdsb)); + + (*(here->B3SOIPDSPbPtr) -= m * (-gsspb + Gmbs + gcsgb + gcsdb + gcseb + gcssb + Gmin)); + + + (*(here->B3SOIPDBePtr) += m * gcbeb); + (*(here->B3SOIPDBgPtr) += m * (-gigg + gcbgb + gbbg)); + (*(here->B3SOIPDBdpPtr) += (-gigd + gcbdb + gbbdp)); + (*(here->B3SOIPDBspPtr) += m * (gcbsb + gbbsp - Gmin + - gigs)); + (*(here->B3SOIPDBbPtr) += m * (-gigb + gbbb - gcbgb - gcbdb - gcbsb - gcbeb + Gmin)); + (*(here->B3SOIPDEePtr) += m * gceeb); + + (*(here->B3SOIPDGgPtr) += m * (gigg + gcggb + ckt->CKTgmin)); + (*(here->B3SOIPDGdpPtr) += m * (gigd + gcgdb - ckt->CKTgmin)); + (*(here->B3SOIPDGspPtr) += m * (gcgsb + gigs)); + + (*(here->B3SOIPDDPgPtr) += m * ((Gm + gcdgb) + gddpg - ckt->CKTgmin)); + (*(here->B3SOIPDDPdpPtr) += m * ((here->B3SOIPDdrainConductance + + here->B3SOIPDgds + gddpdp + + RevSum + gcddb) + ckt->CKTgmin)); + (*(here->B3SOIPDDPspPtr) -= m * (-gddpsp + here->B3SOIPDgds + FwdSum - gcdsb)); + + (*(here->B3SOIPDDPdPtr) -= m * here->B3SOIPDdrainConductance); + + (*(here->B3SOIPDSPgPtr) += m * (gcsgb - Gm + gsspg)); + (*(here->B3SOIPDSPdpPtr) -= m * (here->B3SOIPDgds - gsspdp + RevSum - gcsdb)); + + (*(here->B3SOIPDSPspPtr) += m * (here->B3SOIPDsourceConductance + + here->B3SOIPDgds + gsspsp + + FwdSum + gcssb + + Gmin)); + + + (*(here->B3SOIPDSPsPtr) -= m * here->B3SOIPDsourceConductance); + + + (*(here->B3SOIPDDdPtr) += m * here->B3SOIPDdrainConductance); + (*(here->B3SOIPDDdpPtr) -= m * here->B3SOIPDdrainConductance); + + + (*(here->B3SOIPDSsPtr) += m * here->B3SOIPDsourceConductance); + (*(here->B3SOIPDSspPtr) -= m * here->B3SOIPDsourceConductance); + + if (here->B3SOIPDbodyMod == 1) { + (*(here->B3SOIPDBpPtr) -= m * gppp); + (*(here->B3SOIPDPbPtr) += m * gppb); + (*(here->B3SOIPDPpPtr) += m * gppp); + } + + if (selfheat) + { + (*(here->B3SOIPDDPtempPtr) += m * (GmT + gddpT + gcdT)); + (*(here->B3SOIPDSPtempPtr) += m * (-GmT + gsspT + gcsT)); + (*(here->B3SOIPDBtempPtr) += m * (gbbT + gcbT - gigT)); + (*(here->B3SOIPDEtempPtr) += m * gceT); + (*(here->B3SOIPDGtempPtr) += m * (gcgT + gigT)); + (*(here->B3SOIPDTemptempPtr) += m * (gTtt + 1/pParam->B3SOIPDrth + gcTt)); + (*(here->B3SOIPDTempgPtr) += m * gTtg); + (*(here->B3SOIPDTempbPtr) += m * gTtb); + (*(here->B3SOIPDTempdpPtr) += m * gTtdp); + (*(here->B3SOIPDTempspPtr) += m * gTtsp); + } + + if (here->B3SOIPDdebugMod != 0) + { + *(here->B3SOIPDVbsPtr) += m * 1; + *(here->B3SOIPDIdsPtr) += m * 1; + *(here->B3SOIPDIcPtr) += m * 1; + *(here->B3SOIPDIbsPtr) += m * 1; + *(here->B3SOIPDIbdPtr) += m * 1; + *(here->B3SOIPDIiiPtr) += m * 1; + *(here->B3SOIPDIgPtr) += m * 1; + *(here->B3SOIPDGiggPtr) += m * 1; + *(here->B3SOIPDGigdPtr) += m * 1; + *(here->B3SOIPDGigbPtr) += m * 1; + *(here->B3SOIPDIgidlPtr) += m * 1; + *(here->B3SOIPDItunPtr) += m * 1; + *(here->B3SOIPDIbpPtr) += m * 1; + *(here->B3SOIPDCbgPtr) += m * 1; + *(here->B3SOIPDCbbPtr) += m * 1; + *(here->B3SOIPDCbdPtr) += m * 1; + *(here->B3SOIPDQbfPtr) += m * 1; + *(here->B3SOIPDQjsPtr) += m * 1; + *(here->B3SOIPDQjdPtr) += m * 1; + + } + + line1000: ; + + + } /* End of Mosfet Instance */ +} /* End of Model Instance */ + + +return(OK); } + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdmask.c b/src/spicelib/devices/bsim3soi_pd/b3soipdmask.c index 28e9032f0..12bfc6a4b 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdmask.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdmask.c @@ -6,11 +6,17 @@ Modified by Pin Su and Jan Feng 99/2/15 Modified by Pin Su 99/4/30 Modified by Wei Jin 99/9/27 Modified by Pin Su 00/3/1 +Modified by Pin Su 01/2/15 +Modified by Pin Su 02/3/5 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ #include "ngspice.h" -#include #include "ifsim.h" #include "cktdefs.h" #include "devdefs.h" @@ -19,1420 +25,1453 @@ Modified by Pin Su 00/3/1 #include "suffix.h" int -B3SOIPDmAsk (ckt, inst, which, value) - CKTcircuit *ckt; - GENmodel *inst; - int which; - IFvalue *value; +B3SOIPDmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) { - B3SOIPDmodel *model = (B3SOIPDmodel *) inst; - switch (which) - { - case B3SOIPD_MOD_MOBMOD: - value->iValue = model->B3SOIPDmobMod; - return (OK); - case B3SOIPD_MOD_PARAMCHK: - value->iValue = model->B3SOIPDparamChk; - return (OK); - case B3SOIPD_MOD_BINUNIT: - value->iValue = model->B3SOIPDbinUnit; - return (OK); - case B3SOIPD_MOD_CAPMOD: - value->iValue = model->B3SOIPDcapMod; - return (OK); - case B3SOIPD_MOD_SHMOD: - value->iValue = model->B3SOIPDshMod; - return (OK); - case B3SOIPD_MOD_NOIMOD: - value->iValue = model->B3SOIPDnoiMod; - return (OK); - case B3SOIPD_MOD_VERSION: - value->rValue = model->B3SOIPDversion; - return (OK); - case B3SOIPD_MOD_TOX: - value->rValue = model->B3SOIPDtox; - return (OK); - case B3SOIPD_MOD_CDSC: - value->rValue = model->B3SOIPDcdsc; - return (OK); - case B3SOIPD_MOD_CDSCB: - value->rValue = model->B3SOIPDcdscb; - return (OK); + B3SOIPDmodel *model = (B3SOIPDmodel *)inst; + switch(which) + { case B3SOIPD_MOD_MOBMOD: + value->iValue = model->B3SOIPDmobMod; + return(OK); + case B3SOIPD_MOD_PARAMCHK: + value->iValue = model->B3SOIPDparamChk; + return(OK); + case B3SOIPD_MOD_BINUNIT: + value->iValue = model->B3SOIPDbinUnit; + return(OK); + case B3SOIPD_MOD_CAPMOD: + value->iValue = model->B3SOIPDcapMod; + return(OK); + case B3SOIPD_MOD_SHMOD: + value->iValue = model->B3SOIPDshMod; + return(OK); + case B3SOIPD_MOD_NOIMOD: + value->iValue = model->B3SOIPDnoiMod; + return(OK); + case B3SOIPD_MOD_VERSION : + value->rValue = model->B3SOIPDversion; + return(OK); + case B3SOIPD_MOD_TOX : + value->rValue = model->B3SOIPDtox; + return(OK); +/* v2.2.3 */ + case B3SOIPD_MOD_DTOXCV : + value->rValue = model->B3SOIPDdtoxcv; + return(OK); - case B3SOIPD_MOD_CDSCD: - value->rValue = model->B3SOIPDcdscd; - return (OK); + case B3SOIPD_MOD_CDSC : + value->rValue = model->B3SOIPDcdsc; + return(OK); + case B3SOIPD_MOD_CDSCB : + value->rValue = model->B3SOIPDcdscb; + return(OK); - case B3SOIPD_MOD_CIT: - value->rValue = model->B3SOIPDcit; - return (OK); - case B3SOIPD_MOD_NFACTOR: - value->rValue = model->B3SOIPDnfactor; - return (OK); - case B3SOIPD_MOD_VSAT: - value->rValue = model->B3SOIPDvsat; - return (OK); - case B3SOIPD_MOD_AT: - value->rValue = model->B3SOIPDat; - return (OK); - case B3SOIPD_MOD_A0: - value->rValue = model->B3SOIPDa0; - return (OK); + case B3SOIPD_MOD_CDSCD : + value->rValue = model->B3SOIPDcdscd; + return(OK); - case B3SOIPD_MOD_AGS: - value->rValue = model->B3SOIPDags; - return (OK); + case B3SOIPD_MOD_CIT : + value->rValue = model->B3SOIPDcit; + return(OK); + case B3SOIPD_MOD_NFACTOR : + value->rValue = model->B3SOIPDnfactor; + return(OK); + case B3SOIPD_MOD_VSAT: + value->rValue = model->B3SOIPDvsat; + return(OK); + case B3SOIPD_MOD_AT: + value->rValue = model->B3SOIPDat; + return(OK); + case B3SOIPD_MOD_A0: + value->rValue = model->B3SOIPDa0; + return(OK); - case B3SOIPD_MOD_A1: - value->rValue = model->B3SOIPDa1; - return (OK); - case B3SOIPD_MOD_A2: - value->rValue = model->B3SOIPDa2; - return (OK); - case B3SOIPD_MOD_KETA: - value->rValue = model->B3SOIPDketa; - return (OK); - case B3SOIPD_MOD_NSUB: - value->rValue = model->B3SOIPDnsub; - return (OK); - case B3SOIPD_MOD_NPEAK: - value->rValue = model->B3SOIPDnpeak; - return (OK); - case B3SOIPD_MOD_NGATE: - value->rValue = model->B3SOIPDngate; - return (OK); - case B3SOIPD_MOD_GAMMA1: - value->rValue = model->B3SOIPDgamma1; - return (OK); - case B3SOIPD_MOD_GAMMA2: - value->rValue = model->B3SOIPDgamma2; - return (OK); - case B3SOIPD_MOD_VBX: - value->rValue = model->B3SOIPDvbx; - return (OK); - case B3SOIPD_MOD_VBM: - value->rValue = model->B3SOIPDvbm; - return (OK); - case B3SOIPD_MOD_XT: - value->rValue = model->B3SOIPDxt; - return (OK); - case B3SOIPD_MOD_K1: - value->rValue = model->B3SOIPDk1; - return (OK); - case B3SOIPD_MOD_KT1: - value->rValue = model->B3SOIPDkt1; - return (OK); - case B3SOIPD_MOD_KT1L: - value->rValue = model->B3SOIPDkt1l; - return (OK); - case B3SOIPD_MOD_KT2: - value->rValue = model->B3SOIPDkt2; - return (OK); - case B3SOIPD_MOD_K2: - value->rValue = model->B3SOIPDk2; - return (OK); - case B3SOIPD_MOD_K3: - value->rValue = model->B3SOIPDk3; - return (OK); - case B3SOIPD_MOD_K3B: - value->rValue = model->B3SOIPDk3b; - return (OK); - case B3SOIPD_MOD_W0: - value->rValue = model->B3SOIPDw0; - return (OK); - case B3SOIPD_MOD_NLX: - value->rValue = model->B3SOIPDnlx; - return (OK); - case B3SOIPD_MOD_DVT0: - value->rValue = model->B3SOIPDdvt0; - return (OK); - case B3SOIPD_MOD_DVT1: - value->rValue = model->B3SOIPDdvt1; - return (OK); - case B3SOIPD_MOD_DVT2: - value->rValue = model->B3SOIPDdvt2; - return (OK); - case B3SOIPD_MOD_DVT0W: - value->rValue = model->B3SOIPDdvt0w; - return (OK); - case B3SOIPD_MOD_DVT1W: - value->rValue = model->B3SOIPDdvt1w; - return (OK); - case B3SOIPD_MOD_DVT2W: - value->rValue = model->B3SOIPDdvt2w; - return (OK); - case B3SOIPD_MOD_DROUT: - value->rValue = model->B3SOIPDdrout; - return (OK); - case B3SOIPD_MOD_DSUB: - value->rValue = model->B3SOIPDdsub; - return (OK); - case B3SOIPD_MOD_VTH0: - value->rValue = model->B3SOIPDvth0; - return (OK); - case B3SOIPD_MOD_UA: - value->rValue = model->B3SOIPDua; - return (OK); - case B3SOIPD_MOD_UA1: - value->rValue = model->B3SOIPDua1; - return (OK); - case B3SOIPD_MOD_UB: - value->rValue = model->B3SOIPDub; - return (OK); - case B3SOIPD_MOD_UB1: - value->rValue = model->B3SOIPDub1; - return (OK); - case B3SOIPD_MOD_UC: - value->rValue = model->B3SOIPDuc; - return (OK); - case B3SOIPD_MOD_UC1: - value->rValue = model->B3SOIPDuc1; - return (OK); - case B3SOIPD_MOD_U0: - value->rValue = model->B3SOIPDu0; - return (OK); - case B3SOIPD_MOD_UTE: - value->rValue = model->B3SOIPDute; - return (OK); - case B3SOIPD_MOD_VOFF: - value->rValue = model->B3SOIPDvoff; - return (OK); - case B3SOIPD_MOD_DELTA: - value->rValue = model->B3SOIPDdelta; - return (OK); - case B3SOIPD_MOD_RDSW: - value->rValue = model->B3SOIPDrdsw; - return (OK); - case B3SOIPD_MOD_PRWG: - value->rValue = model->B3SOIPDprwg; - return (OK); - case B3SOIPD_MOD_PRWB: - value->rValue = model->B3SOIPDprwb; - return (OK); - case B3SOIPD_MOD_PRT: - value->rValue = model->B3SOIPDprt; - return (OK); - case B3SOIPD_MOD_ETA0: - value->rValue = model->B3SOIPDeta0; - return (OK); - case B3SOIPD_MOD_ETAB: - value->rValue = model->B3SOIPDetab; - return (OK); - case B3SOIPD_MOD_PCLM: - value->rValue = model->B3SOIPDpclm; - return (OK); - case B3SOIPD_MOD_PDIBL1: - value->rValue = model->B3SOIPDpdibl1; - return (OK); - case B3SOIPD_MOD_PDIBL2: - value->rValue = model->B3SOIPDpdibl2; - return (OK); - case B3SOIPD_MOD_PDIBLB: - value->rValue = model->B3SOIPDpdiblb; - return (OK); - case B3SOIPD_MOD_PVAG: - value->rValue = model->B3SOIPDpvag; - return (OK); - case B3SOIPD_MOD_WR: - value->rValue = model->B3SOIPDwr; - return (OK); - case B3SOIPD_MOD_DWG: - value->rValue = model->B3SOIPDdwg; - return (OK); - case B3SOIPD_MOD_DWB: - value->rValue = model->B3SOIPDdwb; - return (OK); - case B3SOIPD_MOD_B0: - value->rValue = model->B3SOIPDb0; - return (OK); - case B3SOIPD_MOD_B1: - value->rValue = model->B3SOIPDb1; - return (OK); - case B3SOIPD_MOD_ALPHA0: - value->rValue = model->B3SOIPDalpha0; - return (OK); + case B3SOIPD_MOD_AGS: + value->rValue = model->B3SOIPDags; + return(OK); - case B3SOIPD_MOD_CGSL: - value->rValue = model->B3SOIPDcgsl; - return (OK); - case B3SOIPD_MOD_CGDL: - value->rValue = model->B3SOIPDcgdl; - return (OK); - case B3SOIPD_MOD_CKAPPA: - value->rValue = model->B3SOIPDckappa; - return (OK); - case B3SOIPD_MOD_CF: - value->rValue = model->B3SOIPDcf; - return (OK); - case B3SOIPD_MOD_CLC: - value->rValue = model->B3SOIPDclc; - return (OK); - case B3SOIPD_MOD_CLE: - value->rValue = model->B3SOIPDcle; - return (OK); - case B3SOIPD_MOD_DWC: - value->rValue = model->B3SOIPDdwc; - return (OK); - case B3SOIPD_MOD_DLC: - value->rValue = model->B3SOIPDdlc; - return (OK); + case B3SOIPD_MOD_A1: + value->rValue = model->B3SOIPDa1; + return(OK); + case B3SOIPD_MOD_A2: + value->rValue = model->B3SOIPDa2; + return(OK); + case B3SOIPD_MOD_KETA: + value->rValue = model->B3SOIPDketa; + return(OK); + case B3SOIPD_MOD_NSUB: + value->rValue = model->B3SOIPDnsub; + return(OK); + case B3SOIPD_MOD_NPEAK: + value->rValue = model->B3SOIPDnpeak; + return(OK); + case B3SOIPD_MOD_NGATE: + value->rValue = model->B3SOIPDngate; + return(OK); + case B3SOIPD_MOD_GAMMA1: + value->rValue = model->B3SOIPDgamma1; + return(OK); + case B3SOIPD_MOD_GAMMA2: + value->rValue = model->B3SOIPDgamma2; + return(OK); + case B3SOIPD_MOD_VBX: + value->rValue = model->B3SOIPDvbx; + return(OK); + case B3SOIPD_MOD_VBM: + value->rValue = model->B3SOIPDvbm; + return(OK); + case B3SOIPD_MOD_XT: + value->rValue = model->B3SOIPDxt; + return(OK); + case B3SOIPD_MOD_K1: + value->rValue = model->B3SOIPDk1; + return(OK); + case B3SOIPD_MOD_KT1: + value->rValue = model->B3SOIPDkt1; + return(OK); + case B3SOIPD_MOD_KT1L: + value->rValue = model->B3SOIPDkt1l; + return(OK); + case B3SOIPD_MOD_KT2 : + value->rValue = model->B3SOIPDkt2; + return(OK); + case B3SOIPD_MOD_K2 : + value->rValue = model->B3SOIPDk2; + return(OK); + case B3SOIPD_MOD_K3: + value->rValue = model->B3SOIPDk3; + return(OK); + case B3SOIPD_MOD_K3B: + value->rValue = model->B3SOIPDk3b; + return(OK); + case B3SOIPD_MOD_W0: + value->rValue = model->B3SOIPDw0; + return(OK); + case B3SOIPD_MOD_NLX: + value->rValue = model->B3SOIPDnlx; + return(OK); + case B3SOIPD_MOD_DVT0 : + value->rValue = model->B3SOIPDdvt0; + return(OK); + case B3SOIPD_MOD_DVT1 : + value->rValue = model->B3SOIPDdvt1; + return(OK); + case B3SOIPD_MOD_DVT2 : + value->rValue = model->B3SOIPDdvt2; + return(OK); + case B3SOIPD_MOD_DVT0W : + value->rValue = model->B3SOIPDdvt0w; + return(OK); + case B3SOIPD_MOD_DVT1W : + value->rValue = model->B3SOIPDdvt1w; + return(OK); + case B3SOIPD_MOD_DVT2W : + value->rValue = model->B3SOIPDdvt2w; + return(OK); + case B3SOIPD_MOD_DROUT : + value->rValue = model->B3SOIPDdrout; + return(OK); + case B3SOIPD_MOD_DSUB : + value->rValue = model->B3SOIPDdsub; + return(OK); + case B3SOIPD_MOD_VTH0: + value->rValue = model->B3SOIPDvth0; + return(OK); + case B3SOIPD_MOD_UA: + value->rValue = model->B3SOIPDua; + return(OK); + case B3SOIPD_MOD_UA1: + value->rValue = model->B3SOIPDua1; + return(OK); + case B3SOIPD_MOD_UB: + value->rValue = model->B3SOIPDub; + return(OK); + case B3SOIPD_MOD_UB1: + value->rValue = model->B3SOIPDub1; + return(OK); + case B3SOIPD_MOD_UC: + value->rValue = model->B3SOIPDuc; + return(OK); + case B3SOIPD_MOD_UC1: + value->rValue = model->B3SOIPDuc1; + return(OK); + case B3SOIPD_MOD_U0: + value->rValue = model->B3SOIPDu0; + return(OK); + case B3SOIPD_MOD_UTE: + value->rValue = model->B3SOIPDute; + return(OK); + case B3SOIPD_MOD_VOFF: + value->rValue = model->B3SOIPDvoff; + return(OK); + case B3SOIPD_MOD_DELTA: + value->rValue = model->B3SOIPDdelta; + return(OK); + case B3SOIPD_MOD_RDSW: + value->rValue = model->B3SOIPDrdsw; + return(OK); + case B3SOIPD_MOD_PRWG: + value->rValue = model->B3SOIPDprwg; + return(OK); + case B3SOIPD_MOD_PRWB: + value->rValue = model->B3SOIPDprwb; + return(OK); + case B3SOIPD_MOD_PRT: + value->rValue = model->B3SOIPDprt; + return(OK); + case B3SOIPD_MOD_ETA0: + value->rValue = model->B3SOIPDeta0; + return(OK); + case B3SOIPD_MOD_ETAB: + value->rValue = model->B3SOIPDetab; + return(OK); + case B3SOIPD_MOD_PCLM: + value->rValue = model->B3SOIPDpclm; + return(OK); + case B3SOIPD_MOD_PDIBL1: + value->rValue = model->B3SOIPDpdibl1; + return(OK); + case B3SOIPD_MOD_PDIBL2: + value->rValue = model->B3SOIPDpdibl2; + return(OK); + case B3SOIPD_MOD_PDIBLB: + value->rValue = model->B3SOIPDpdiblb; + return(OK); + case B3SOIPD_MOD_PVAG: + value->rValue = model->B3SOIPDpvag; + return(OK); + case B3SOIPD_MOD_WR: + value->rValue = model->B3SOIPDwr; + return(OK); + case B3SOIPD_MOD_DWG: + value->rValue = model->B3SOIPDdwg; + return(OK); + case B3SOIPD_MOD_DWB: + value->rValue = model->B3SOIPDdwb; + return(OK); + case B3SOIPD_MOD_B0: + value->rValue = model->B3SOIPDb0; + return(OK); + case B3SOIPD_MOD_B1: + value->rValue = model->B3SOIPDb1; + return(OK); + case B3SOIPD_MOD_ALPHA0: + value->rValue = model->B3SOIPDalpha0; + return(OK); - case B3SOIPD_MOD_TBOX: - value->rValue = model->B3SOIPDtbox; - return (OK); - case B3SOIPD_MOD_TSI: - value->rValue = model->B3SOIPDtsi; - return (OK); - case B3SOIPD_MOD_RTH0: - value->rValue = model->B3SOIPDrth0; - return (OK); - case B3SOIPD_MOD_CTH0: - value->rValue = model->B3SOIPDcth0; - return (OK); - case B3SOIPD_MOD_NDIODE: - value->rValue = model->B3SOIPDndiode; - return (OK); - case B3SOIPD_MOD_XBJT: - value->rValue = model->B3SOIPDxbjt; - return (OK); + case B3SOIPD_MOD_CGSL: + value->rValue = model->B3SOIPDcgsl; + return(OK); + case B3SOIPD_MOD_CGDL: + value->rValue = model->B3SOIPDcgdl; + return(OK); + case B3SOIPD_MOD_CKAPPA: + value->rValue = model->B3SOIPDckappa; + return(OK); + case B3SOIPD_MOD_CF: + value->rValue = model->B3SOIPDcf; + return(OK); + case B3SOIPD_MOD_CLC: + value->rValue = model->B3SOIPDclc; + return(OK); + case B3SOIPD_MOD_CLE: + value->rValue = model->B3SOIPDcle; + return(OK); + case B3SOIPD_MOD_DWC: + value->rValue = model->B3SOIPDdwc; + return(OK); + case B3SOIPD_MOD_DLC: + value->rValue = model->B3SOIPDdlc; + return(OK); - case B3SOIPD_MOD_XDIF: - value->rValue = model->B3SOIPDxdif; - return (OK); + case B3SOIPD_MOD_TBOX: + value->rValue = model->B3SOIPDtbox; + return(OK); + case B3SOIPD_MOD_TSI: + value->rValue = model->B3SOIPDtsi; + return(OK); + case B3SOIPD_MOD_RTH0: + value->rValue = model->B3SOIPDrth0; + return(OK); + case B3SOIPD_MOD_CTH0: + value->rValue = model->B3SOIPDcth0; + return(OK); + case B3SOIPD_MOD_NDIODE: + value->rValue = model->B3SOIPDndiode; + return(OK); + case B3SOIPD_MOD_XBJT: + value->rValue = model->B3SOIPDxbjt; + return(OK); - case B3SOIPD_MOD_XREC: - value->rValue = model->B3SOIPDxrec; - return (OK); - case B3SOIPD_MOD_XTUN: - value->rValue = model->B3SOIPDxtun; - return (OK); - case B3SOIPD_MOD_TT: - value->rValue = model->B3SOIPDtt; - return (OK); - case B3SOIPD_MOD_VSDTH: - value->rValue = model->B3SOIPDvsdth; - return (OK); - case B3SOIPD_MOD_VSDFB: - value->rValue = model->B3SOIPDvsdfb; - return (OK); - case B3SOIPD_MOD_CSDMIN: - value->rValue = model->B3SOIPDcsdmin; - return (OK); - case B3SOIPD_MOD_ASD: - value->rValue = model->B3SOIPDasd; - return (OK); + case B3SOIPD_MOD_XDIF: + value->rValue = model->B3SOIPDxdif; + return(OK); - case B3SOIPD_MOD_TNOM: - value->rValue = model->B3SOIPDtnom; - return (OK); - case B3SOIPD_MOD_CGSO: - value->rValue = model->B3SOIPDcgso; - return (OK); - case B3SOIPD_MOD_CGDO: - value->rValue = model->B3SOIPDcgdo; - return (OK); - case B3SOIPD_MOD_CGEO: - value->rValue = model->B3SOIPDcgeo; - return (OK); - case B3SOIPD_MOD_XPART: - value->rValue = model->B3SOIPDxpart; - return (OK); - case B3SOIPD_MOD_RSH: - value->rValue = model->B3SOIPDsheetResistance; - return (OK); - case B3SOIPD_MOD_PBSWG: - value->rValue = model->B3SOIPDGatesidewallJctPotential; - return (OK); - case B3SOIPD_MOD_MJSWG: - value->rValue = model->B3SOIPDbodyJctGateSideGradingCoeff; - return (OK); - case B3SOIPD_MOD_CJSWG: - value->rValue = model->B3SOIPDunitLengthGateSidewallJctCap; - return (OK); - case B3SOIPD_MOD_CSDESW: - value->rValue = model->B3SOIPDcsdesw; - return (OK); - case B3SOIPD_MOD_LINT: - value->rValue = model->B3SOIPDLint; - return (OK); - case B3SOIPD_MOD_LL: - value->rValue = model->B3SOIPDLl; - return (OK); - case B3SOIPD_MOD_LLN: - value->rValue = model->B3SOIPDLln; - return (OK); - case B3SOIPD_MOD_LW: - value->rValue = model->B3SOIPDLw; - return (OK); - case B3SOIPD_MOD_LWN: - value->rValue = model->B3SOIPDLwn; - return (OK); - case B3SOIPD_MOD_LWL: - value->rValue = model->B3SOIPDLwl; - return (OK); - case B3SOIPD_MOD_WINT: - value->rValue = model->B3SOIPDWint; - return (OK); - case B3SOIPD_MOD_WL: - value->rValue = model->B3SOIPDWl; - return (OK); - case B3SOIPD_MOD_WLN: - value->rValue = model->B3SOIPDWln; - return (OK); - case B3SOIPD_MOD_WW: - value->rValue = model->B3SOIPDWw; - return (OK); - case B3SOIPD_MOD_WWN: - value->rValue = model->B3SOIPDWwn; - return (OK); - case B3SOIPD_MOD_WWL: - value->rValue = model->B3SOIPDWwl; - return (OK); - case B3SOIPD_MOD_NOIA: - value->rValue = model->B3SOIPDoxideTrapDensityA; - return (OK); - case B3SOIPD_MOD_NOIB: - value->rValue = model->B3SOIPDoxideTrapDensityB; - return (OK); - case B3SOIPD_MOD_NOIC: - value->rValue = model->B3SOIPDoxideTrapDensityC; - return (OK); - case B3SOIPD_MOD_NOIF: - value->rValue = model->B3SOIPDnoif; - return (OK); - case B3SOIPD_MOD_EM: - value->rValue = model->B3SOIPDem; - return (OK); - case B3SOIPD_MOD_EF: - value->rValue = model->B3SOIPDef; - return (OK); - case B3SOIPD_MOD_AF: - value->rValue = model->B3SOIPDaf; - return (OK); - case B3SOIPD_MOD_KF: - value->rValue = model->B3SOIPDkf; - return (OK); + case B3SOIPD_MOD_XREC: + value->rValue = model->B3SOIPDxrec; + return(OK); + case B3SOIPD_MOD_XTUN: + value->rValue = model->B3SOIPDxtun; + return(OK); + case B3SOIPD_MOD_TT: + value->rValue = model->B3SOIPDtt; + return(OK); + case B3SOIPD_MOD_VSDTH: + value->rValue = model->B3SOIPDvsdth; + return(OK); + case B3SOIPD_MOD_VSDFB: + value->rValue = model->B3SOIPDvsdfb; + return(OK); + case B3SOIPD_MOD_CSDMIN: + value->rValue = model->B3SOIPDcsdmin; + return(OK); + case B3SOIPD_MOD_ASD: + value->rValue = model->B3SOIPDasd; + return(OK); + + case B3SOIPD_MOD_TNOM : + value->rValue = model->B3SOIPDtnom; + return(OK); + case B3SOIPD_MOD_CGSO: + value->rValue = model->B3SOIPDcgso; + return(OK); + case B3SOIPD_MOD_CGDO: + value->rValue = model->B3SOIPDcgdo; + return(OK); + case B3SOIPD_MOD_CGEO: + value->rValue = model->B3SOIPDcgeo; + return(OK); + case B3SOIPD_MOD_XPART: + value->rValue = model->B3SOIPDxpart; + return(OK); + case B3SOIPD_MOD_RSH: + value->rValue = model->B3SOIPDsheetResistance; + return(OK); + case B3SOIPD_MOD_PBSWG: + value->rValue = model->B3SOIPDGatesidewallJctPotential; + return(OK); + case B3SOIPD_MOD_MJSWG: + value->rValue = model->B3SOIPDbodyJctGateSideGradingCoeff; + return(OK); + case B3SOIPD_MOD_CJSWG: + value->rValue = model->B3SOIPDunitLengthGateSidewallJctCap; + return(OK); + case B3SOIPD_MOD_CSDESW: + value->rValue = model->B3SOIPDcsdesw; + return(OK); + case B3SOIPD_MOD_LINT: + value->rValue = model->B3SOIPDLint; + return(OK); + case B3SOIPD_MOD_LL: + value->rValue = model->B3SOIPDLl; + return(OK); +/* v2.2.3 */ + case B3SOIPD_MOD_LLC: + value->rValue = model->B3SOIPDLlc; + return(OK); + + case B3SOIPD_MOD_LLN: + value->rValue = model->B3SOIPDLln; + return(OK); + case B3SOIPD_MOD_LW: + value->rValue = model->B3SOIPDLw; + return(OK); +/* v2.2.3 */ + case B3SOIPD_MOD_LWC: + value->rValue = model->B3SOIPDLwc; + return(OK); + + case B3SOIPD_MOD_LWN: + value->rValue = model->B3SOIPDLwn; + return(OK); + case B3SOIPD_MOD_LWL: + value->rValue = model->B3SOIPDLwl; + return(OK); +/* v2.2.3 */ + case B3SOIPD_MOD_LWLC: + value->rValue = model->B3SOIPDLwlc; + return(OK); + + case B3SOIPD_MOD_WINT: + value->rValue = model->B3SOIPDWint; + return(OK); + case B3SOIPD_MOD_WL: + value->rValue = model->B3SOIPDWl; + return(OK); +/* v2.2.3 */ + case B3SOIPD_MOD_WLC: + value->rValue = model->B3SOIPDWlc; + return(OK); + + case B3SOIPD_MOD_WLN: + value->rValue = model->B3SOIPDWln; + return(OK); + case B3SOIPD_MOD_WW: + value->rValue = model->B3SOIPDWw; + return(OK); +/* v2.2.3 */ + case B3SOIPD_MOD_WWC: + value->rValue = model->B3SOIPDWwc; + return(OK); + + case B3SOIPD_MOD_WWN: + value->rValue = model->B3SOIPDWwn; + return(OK); + case B3SOIPD_MOD_WWL: + value->rValue = model->B3SOIPDWwl; + return(OK); +/* v2.2.3 */ + case B3SOIPD_MOD_WWLC: + value->rValue = model->B3SOIPDWwlc; + return(OK); + + case B3SOIPD_MOD_NOIA: + value->rValue = model->B3SOIPDoxideTrapDensityA; + return(OK); + case B3SOIPD_MOD_NOIB: + value->rValue = model->B3SOIPDoxideTrapDensityB; + return(OK); + case B3SOIPD_MOD_NOIC: + value->rValue = model->B3SOIPDoxideTrapDensityC; + return(OK); + case B3SOIPD_MOD_NOIF: + value->rValue = model->B3SOIPDnoif; + return(OK); + case B3SOIPD_MOD_EM: + value->rValue = model->B3SOIPDem; + return(OK); + case B3SOIPD_MOD_EF: + value->rValue = model->B3SOIPDef; + return(OK); + case B3SOIPD_MOD_AF: + value->rValue = model->B3SOIPDaf; + return(OK); + case B3SOIPD_MOD_KF: + value->rValue = model->B3SOIPDkf; + return(OK); /* v2.0 release */ - case B3SOIPD_MOD_K1W1: - value->rValue = model->B3SOIPDk1w1; - return (OK); - case B3SOIPD_MOD_K1W2: - value->rValue = model->B3SOIPDk1w2; - return (OK); - case B3SOIPD_MOD_KETAS: - value->rValue = model->B3SOIPDketas; - return (OK); - case B3SOIPD_MOD_DWBC: - value->rValue = model->B3SOIPDdwbc; - return (OK); - case B3SOIPD_MOD_BETA0: - value->rValue = model->B3SOIPDbeta0; - return (OK); - case B3SOIPD_MOD_BETA1: - value->rValue = model->B3SOIPDbeta1; - return (OK); - case B3SOIPD_MOD_BETA2: - value->rValue = model->B3SOIPDbeta2; - return (OK); - case B3SOIPD_MOD_VDSATII0: - value->rValue = model->B3SOIPDvdsatii0; - return (OK); - case B3SOIPD_MOD_TII: - value->rValue = model->B3SOIPDtii; - return (OK); - case B3SOIPD_MOD_LII: - value->rValue = model->B3SOIPDlii; - return (OK); - case B3SOIPD_MOD_SII0: - value->rValue = model->B3SOIPDsii0; - return (OK); - case B3SOIPD_MOD_SII1: - value->rValue = model->B3SOIPDsii1; - return (OK); - case B3SOIPD_MOD_SII2: - value->rValue = model->B3SOIPDsii2; - return (OK); - case B3SOIPD_MOD_SIID: - value->rValue = model->B3SOIPDsiid; - return (OK); - case B3SOIPD_MOD_FBJTII: - value->rValue = model->B3SOIPDfbjtii; - return (OK); - case B3SOIPD_MOD_ESATII: - value->rValue = model->B3SOIPDesatii; - return (OK); - case B3SOIPD_MOD_NTUN: - value->rValue = model->B3SOIPDntun; - return (OK); - case B3SOIPD_MOD_NRECF0: - value->rValue = model->B3SOIPDnrecf0; - return (OK); - case B3SOIPD_MOD_NRECR0: - value->rValue = model->B3SOIPDnrecr0; - return (OK); - case B3SOIPD_MOD_ISBJT: - value->rValue = model->B3SOIPDisbjt; - return (OK); - case B3SOIPD_MOD_ISDIF: - value->rValue = model->B3SOIPDisdif; - return (OK); - case B3SOIPD_MOD_ISREC: - value->rValue = model->B3SOIPDisrec; - return (OK); - case B3SOIPD_MOD_ISTUN: - value->rValue = model->B3SOIPDistun; - return (OK); - case B3SOIPD_MOD_LN: - value->rValue = model->B3SOIPDln; - return (OK); - case B3SOIPD_MOD_VREC0: - value->rValue = model->B3SOIPDvrec0; - return (OK); - case B3SOIPD_MOD_VTUN0: - value->rValue = model->B3SOIPDvtun0; - return (OK); - case B3SOIPD_MOD_NBJT: - value->rValue = model->B3SOIPDnbjt; - return (OK); - case B3SOIPD_MOD_LBJT0: - value->rValue = model->B3SOIPDlbjt0; - return (OK); - case B3SOIPD_MOD_LDIF0: - value->rValue = model->B3SOIPDldif0; - return (OK); - case B3SOIPD_MOD_VABJT: - value->rValue = model->B3SOIPDvabjt; - return (OK); - case B3SOIPD_MOD_AELY: - value->rValue = model->B3SOIPDaely; - return (OK); - case B3SOIPD_MOD_AHLI: - value->rValue = model->B3SOIPDahli; - return (OK); - case B3SOIPD_MOD_RBODY: - value->rValue = model->B3SOIPDrbody; - return (OK); - case B3SOIPD_MOD_RBSH: - value->rValue = model->B3SOIPDrbsh; - return (OK); - case B3SOIPD_MOD_NTRECF: - value->rValue = model->B3SOIPDntrecf; - return (OK); - case B3SOIPD_MOD_NTRECR: - value->rValue = model->B3SOIPDntrecr; - return (OK); - case B3SOIPD_MOD_NDIF: - value->rValue = model->B3SOIPDndif; - return (OK); - case B3SOIPD_MOD_DLCB: - value->rValue = model->B3SOIPDdlcb; - return (OK); - case B3SOIPD_MOD_FBODY: - value->rValue = model->B3SOIPDfbody; - return (OK); - case B3SOIPD_MOD_TCJSWG: - value->rValue = model->B3SOIPDtcjswg; - return (OK); - case B3SOIPD_MOD_TPBSWG: - value->rValue = model->B3SOIPDtpbswg; - return (OK); - case B3SOIPD_MOD_ACDE: - value->rValue = model->B3SOIPDacde; - return (OK); - case B3SOIPD_MOD_MOIN: - value->rValue = model->B3SOIPDmoin; - return (OK); - case B3SOIPD_MOD_DELVT: - value->rValue = model->B3SOIPDdelvt; - return (OK); - case B3SOIPD_MOD_KB1: - value->rValue = model->B3SOIPDkb1; - return (OK); - case B3SOIPD_MOD_DLBG: - value->rValue = model->B3SOIPDdlbg; - return (OK); + case B3SOIPD_MOD_K1W1: + value->rValue = model->B3SOIPDk1w1; + return(OK); + case B3SOIPD_MOD_K1W2: + value->rValue = model->B3SOIPDk1w2; + return(OK); + case B3SOIPD_MOD_KETAS: + value->rValue = model->B3SOIPDketas; + return(OK); + case B3SOIPD_MOD_DWBC: + value->rValue = model->B3SOIPDdwbc; + return(OK); + case B3SOIPD_MOD_BETA0: + value->rValue = model->B3SOIPDbeta0; + return(OK); + case B3SOIPD_MOD_BETA1: + value->rValue = model->B3SOIPDbeta1; + return(OK); + case B3SOIPD_MOD_BETA2: + value->rValue = model->B3SOIPDbeta2; + return(OK); + case B3SOIPD_MOD_VDSATII0: + value->rValue = model->B3SOIPDvdsatii0; + return(OK); + case B3SOIPD_MOD_TII: + value->rValue = model->B3SOIPDtii; + return(OK); + case B3SOIPD_MOD_LII: + value->rValue = model->B3SOIPDlii; + return(OK); + case B3SOIPD_MOD_SII0: + value->rValue = model->B3SOIPDsii0; + return(OK); + case B3SOIPD_MOD_SII1: + value->rValue = model->B3SOIPDsii1; + return(OK); + case B3SOIPD_MOD_SII2: + value->rValue = model->B3SOIPDsii2; + return(OK); + case B3SOIPD_MOD_SIID: + value->rValue = model->B3SOIPDsiid; + return(OK); + case B3SOIPD_MOD_FBJTII: + value->rValue = model->B3SOIPDfbjtii; + return(OK); + case B3SOIPD_MOD_ESATII: + value->rValue = model->B3SOIPDesatii; + return(OK); + case B3SOIPD_MOD_NTUN: + value->rValue = model->B3SOIPDntun; + return(OK); + case B3SOIPD_MOD_NRECF0: + value->rValue = model->B3SOIPDnrecf0; + return(OK); + case B3SOIPD_MOD_NRECR0: + value->rValue = model->B3SOIPDnrecr0; + return(OK); + case B3SOIPD_MOD_ISBJT: + value->rValue = model->B3SOIPDisbjt; + return(OK); + case B3SOIPD_MOD_ISDIF: + value->rValue = model->B3SOIPDisdif; + return(OK); + case B3SOIPD_MOD_ISREC: + value->rValue = model->B3SOIPDisrec; + return(OK); + case B3SOIPD_MOD_ISTUN: + value->rValue = model->B3SOIPDistun; + return(OK); + case B3SOIPD_MOD_LN: + value->rValue = model->B3SOIPDln; + return(OK); + case B3SOIPD_MOD_VREC0: + value->rValue = model->B3SOIPDvrec0; + return(OK); + case B3SOIPD_MOD_VTUN0: + value->rValue = model->B3SOIPDvtun0; + return(OK); + case B3SOIPD_MOD_NBJT: + value->rValue = model->B3SOIPDnbjt; + return(OK); + case B3SOIPD_MOD_LBJT0: + value->rValue = model->B3SOIPDlbjt0; + return(OK); + case B3SOIPD_MOD_LDIF0: + value->rValue = model->B3SOIPDldif0; + return(OK); + case B3SOIPD_MOD_VABJT: + value->rValue = model->B3SOIPDvabjt; + return(OK); + case B3SOIPD_MOD_AELY: + value->rValue = model->B3SOIPDaely; + return(OK); + case B3SOIPD_MOD_AHLI: + value->rValue = model->B3SOIPDahli; + return(OK); + case B3SOIPD_MOD_RBODY: + value->rValue = model->B3SOIPDrbody; + return(OK); + case B3SOIPD_MOD_RBSH: + value->rValue = model->B3SOIPDrbsh; + return(OK); + case B3SOIPD_MOD_NTRECF: + value->rValue = model->B3SOIPDntrecf; + return(OK); + case B3SOIPD_MOD_NTRECR: + value->rValue = model->B3SOIPDntrecr; + return(OK); + case B3SOIPD_MOD_NDIF: + value->rValue = model->B3SOIPDndif; + return(OK); + case B3SOIPD_MOD_DLCB: + value->rValue = model->B3SOIPDdlcb; + return(OK); + case B3SOIPD_MOD_FBODY: + value->rValue = model->B3SOIPDfbody; + return(OK); + case B3SOIPD_MOD_TCJSWG: + value->rValue = model->B3SOIPDtcjswg; + return(OK); + case B3SOIPD_MOD_TPBSWG: + value->rValue = model->B3SOIPDtpbswg; + return(OK); + case B3SOIPD_MOD_ACDE: + value->rValue = model->B3SOIPDacde; + return(OK); + case B3SOIPD_MOD_MOIN: + value->rValue = model->B3SOIPDmoin; + return(OK); + case B3SOIPD_MOD_DELVT: + value->rValue = model->B3SOIPDdelvt; + return(OK); + case B3SOIPD_MOD_KB1: + value->rValue = model->B3SOIPDkb1; + return(OK); + case B3SOIPD_MOD_DLBG: + value->rValue = model->B3SOIPDdlbg; + return(OK); - case B3SOIPD_MOD_NGIDL: - value->rValue = model->B3SOIPDngidl; - return (OK); - case B3SOIPD_MOD_AGIDL: - value->rValue = model->B3SOIPDagidl; - return (OK); - case B3SOIPD_MOD_BGIDL: - value->rValue = model->B3SOIPDbgidl; - return (OK); + case B3SOIPD_MOD_NGIDL: + value->rValue = model->B3SOIPDngidl; + return(OK); + case B3SOIPD_MOD_AGIDL: + value->rValue = model->B3SOIPDagidl; + return(OK); + case B3SOIPD_MOD_BGIDL: + value->rValue = model->B3SOIPDbgidl; + return(OK); /* v2.2 release */ - case B3SOIPD_MOD_WTH0: - value->rValue = model->B3SOIPDwth0; - return (OK); - case B3SOIPD_MOD_RHALO: - value->rValue = model->B3SOIPDrhalo; - return (OK); - case B3SOIPD_MOD_NTOX: - value->rValue = model->B3SOIPDntox; - return (OK); - case B3SOIPD_MOD_TOXREF: - value->rValue = model->B3SOIPDtoxref; - return (OK); - case B3SOIPD_MOD_EBG: - value->rValue = model->B3SOIPDebg; - return (OK); - case B3SOIPD_MOD_NEVB: - value->rValue = model->B3SOIPDnevb; - return (OK); - case B3SOIPD_MOD_ALPHAGB1: - value->rValue = model->B3SOIPDalphaGB1; - return (OK); - case B3SOIPD_MOD_BETAGB1: - value->rValue = model->B3SOIPDbetaGB1; - return (OK); - case B3SOIPD_MOD_VGB1: - value->rValue = model->B3SOIPDvgb1; - return (OK); - case B3SOIPD_MOD_NECB: - value->rValue = model->B3SOIPDnecb; - return (OK); - case B3SOIPD_MOD_ALPHAGB2: - value->rValue = model->B3SOIPDalphaGB2; - return (OK); - case B3SOIPD_MOD_BETAGB2: - value->rValue = model->B3SOIPDbetaGB2; - return (OK); - case B3SOIPD_MOD_VGB2: - value->rValue = model->B3SOIPDvgb2; - return (OK); - case B3SOIPD_MOD_TOXQM: - value->rValue = model->B3SOIPDtoxqm; - return (OK); - case B3SOIPD_MOD_VOXH: - value->rValue = model->B3SOIPDvoxh; - return (OK); - case B3SOIPD_MOD_DELTAVOX: - value->rValue = model->B3SOIPDdeltavox; - return (OK); - case B3SOIPD_MOD_IGMOD: - value->iValue = model->B3SOIPDigMod; - return (OK); + case B3SOIPD_MOD_WTH0: + value->rValue = model->B3SOIPDwth0; + return(OK); + case B3SOIPD_MOD_RHALO: + value->rValue = model->B3SOIPDrhalo; + return(OK); + case B3SOIPD_MOD_NTOX: + value->rValue = model->B3SOIPDntox; + return(OK); + case B3SOIPD_MOD_TOXREF: + value->rValue = model->B3SOIPDtoxref; + return(OK); + case B3SOIPD_MOD_EBG: + value->rValue = model->B3SOIPDebg; + return(OK); + case B3SOIPD_MOD_VEVB: + value->rValue = model->B3SOIPDvevb; + return(OK); + case B3SOIPD_MOD_ALPHAGB1: + value->rValue = model->B3SOIPDalphaGB1; + return(OK); + case B3SOIPD_MOD_BETAGB1: + value->rValue = model->B3SOIPDbetaGB1; + return(OK); + case B3SOIPD_MOD_VGB1: + value->rValue = model->B3SOIPDvgb1; + return(OK); + case B3SOIPD_MOD_VECB: + value->rValue = model->B3SOIPDvecb; + return(OK); + case B3SOIPD_MOD_ALPHAGB2: + value->rValue = model->B3SOIPDalphaGB2; + return(OK); + case B3SOIPD_MOD_BETAGB2: + value->rValue = model->B3SOIPDbetaGB2; + return(OK); + case B3SOIPD_MOD_VGB2: + value->rValue = model->B3SOIPDvgb2; + return(OK); + case B3SOIPD_MOD_TOXQM: + value->rValue = model->B3SOIPDtoxqm; + return(OK); + case B3SOIPD_MOD_VOXH: + value->rValue = model->B3SOIPDvoxh; + return(OK); + case B3SOIPD_MOD_DELTAVOX: + value->rValue = model->B3SOIPDdeltavox; + return(OK); + case B3SOIPD_MOD_IGMOD: + value->iValue = model->B3SOIPDigMod; + return(OK); /* Added for binning - START */ - /* Length Dependence */ - case B3SOIPD_MOD_LNPEAK: - value->rValue = model->B3SOIPDlnpeak; - return (OK); - case B3SOIPD_MOD_LNSUB: - value->rValue = model->B3SOIPDlnsub; - return (OK); - case B3SOIPD_MOD_LNGATE: - value->rValue = model->B3SOIPDlngate; - return (OK); - case B3SOIPD_MOD_LVTH0: - value->rValue = model->B3SOIPDlvth0; - return (OK); - case B3SOIPD_MOD_LK1: - value->rValue = model->B3SOIPDlk1; - return (OK); - case B3SOIPD_MOD_LK1W1: - value->rValue = model->B3SOIPDlk1w1; - return (OK); - case B3SOIPD_MOD_LK1W2: - value->rValue = model->B3SOIPDlk1w2; - return (OK); - case B3SOIPD_MOD_LK2: - value->rValue = model->B3SOIPDlk2; - return (OK); - case B3SOIPD_MOD_LK3: - value->rValue = model->B3SOIPDlk3; - return (OK); - case B3SOIPD_MOD_LK3B: - value->rValue = model->B3SOIPDlk3b; - return (OK); - case B3SOIPD_MOD_LKB1: - value->rValue = model->B3SOIPDlkb1; - return (OK); - case B3SOIPD_MOD_LW0: - value->rValue = model->B3SOIPDlw0; - return (OK); - case B3SOIPD_MOD_LNLX: - value->rValue = model->B3SOIPDlnlx; - return (OK); - case B3SOIPD_MOD_LDVT0: - value->rValue = model->B3SOIPDldvt0; - return (OK); - case B3SOIPD_MOD_LDVT1: - value->rValue = model->B3SOIPDldvt1; - return (OK); - case B3SOIPD_MOD_LDVT2: - value->rValue = model->B3SOIPDldvt2; - return (OK); - case B3SOIPD_MOD_LDVT0W: - value->rValue = model->B3SOIPDldvt0w; - return (OK); - case B3SOIPD_MOD_LDVT1W: - value->rValue = model->B3SOIPDldvt1w; - return (OK); - case B3SOIPD_MOD_LDVT2W: - value->rValue = model->B3SOIPDldvt2w; - return (OK); - case B3SOIPD_MOD_LU0: - value->rValue = model->B3SOIPDlu0; - return (OK); - case B3SOIPD_MOD_LUA: - value->rValue = model->B3SOIPDlua; - return (OK); - case B3SOIPD_MOD_LUB: - value->rValue = model->B3SOIPDlub; - return (OK); - case B3SOIPD_MOD_LUC: - value->rValue = model->B3SOIPDluc; - return (OK); - case B3SOIPD_MOD_LVSAT: - value->rValue = model->B3SOIPDlvsat; - return (OK); - case B3SOIPD_MOD_LA0: - value->rValue = model->B3SOIPDla0; - return (OK); - case B3SOIPD_MOD_LAGS: - value->rValue = model->B3SOIPDlags; - return (OK); - case B3SOIPD_MOD_LB0: - value->rValue = model->B3SOIPDlb0; - return (OK); - case B3SOIPD_MOD_LB1: - value->rValue = model->B3SOIPDlb1; - return (OK); - case B3SOIPD_MOD_LKETA: - value->rValue = model->B3SOIPDlketa; - return (OK); - case B3SOIPD_MOD_LKETAS: - value->rValue = model->B3SOIPDlketas; - return (OK); - case B3SOIPD_MOD_LA1: - value->rValue = model->B3SOIPDla1; - return (OK); - case B3SOIPD_MOD_LA2: - value->rValue = model->B3SOIPDla2; - return (OK); - case B3SOIPD_MOD_LRDSW: - value->rValue = model->B3SOIPDlrdsw; - return (OK); - case B3SOIPD_MOD_LPRWB: - value->rValue = model->B3SOIPDlprwb; - return (OK); - case B3SOIPD_MOD_LPRWG: - value->rValue = model->B3SOIPDlprwg; - return (OK); - case B3SOIPD_MOD_LWR: - value->rValue = model->B3SOIPDlwr; - return (OK); - case B3SOIPD_MOD_LNFACTOR: - value->rValue = model->B3SOIPDlnfactor; - return (OK); - case B3SOIPD_MOD_LDWG: - value->rValue = model->B3SOIPDldwg; - return (OK); - case B3SOIPD_MOD_LDWB: - value->rValue = model->B3SOIPDldwb; - return (OK); - case B3SOIPD_MOD_LVOFF: - value->rValue = model->B3SOIPDlvoff; - return (OK); - case B3SOIPD_MOD_LETA0: - value->rValue = model->B3SOIPDleta0; - return (OK); - case B3SOIPD_MOD_LETAB: - value->rValue = model->B3SOIPDletab; - return (OK); - case B3SOIPD_MOD_LDSUB: - value->rValue = model->B3SOIPDldsub; - return (OK); - case B3SOIPD_MOD_LCIT: - value->rValue = model->B3SOIPDlcit; - return (OK); - case B3SOIPD_MOD_LCDSC: - value->rValue = model->B3SOIPDlcdsc; - return (OK); - case B3SOIPD_MOD_LCDSCB: - value->rValue = model->B3SOIPDlcdscb; - return (OK); - case B3SOIPD_MOD_LCDSCD: - value->rValue = model->B3SOIPDlcdscd; - return (OK); - case B3SOIPD_MOD_LPCLM: - value->rValue = model->B3SOIPDlpclm; - return (OK); - case B3SOIPD_MOD_LPDIBL1: - value->rValue = model->B3SOIPDlpdibl1; - return (OK); - case B3SOIPD_MOD_LPDIBL2: - value->rValue = model->B3SOIPDlpdibl2; - return (OK); - case B3SOIPD_MOD_LPDIBLB: - value->rValue = model->B3SOIPDlpdiblb; - return (OK); - case B3SOIPD_MOD_LDROUT: - value->rValue = model->B3SOIPDldrout; - return (OK); - case B3SOIPD_MOD_LPVAG: - value->rValue = model->B3SOIPDlpvag; - return (OK); - case B3SOIPD_MOD_LDELTA: - value->rValue = model->B3SOIPDldelta; - return (OK); - case B3SOIPD_MOD_LALPHA0: - value->rValue = model->B3SOIPDlalpha0; - return (OK); - case B3SOIPD_MOD_LFBJTII: - value->rValue = model->B3SOIPDlfbjtii; - return (OK); - case B3SOIPD_MOD_LBETA0: - value->rValue = model->B3SOIPDlbeta0; - return (OK); - case B3SOIPD_MOD_LBETA1: - value->rValue = model->B3SOIPDlbeta1; - return (OK); - case B3SOIPD_MOD_LBETA2: - value->rValue = model->B3SOIPDlbeta2; - return (OK); - case B3SOIPD_MOD_LVDSATII0: - value->rValue = model->B3SOIPDlvdsatii0; - return (OK); - case B3SOIPD_MOD_LLII: - value->rValue = model->B3SOIPDllii; - return (OK); - case B3SOIPD_MOD_LESATII: - value->rValue = model->B3SOIPDlesatii; - return (OK); - case B3SOIPD_MOD_LSII0: - value->rValue = model->B3SOIPDlsii0; - return (OK); - case B3SOIPD_MOD_LSII1: - value->rValue = model->B3SOIPDlsii1; - return (OK); - case B3SOIPD_MOD_LSII2: - value->rValue = model->B3SOIPDlsii2; - return (OK); - case B3SOIPD_MOD_LSIID: - value->rValue = model->B3SOIPDlsiid; - return (OK); - case B3SOIPD_MOD_LAGIDL: - value->rValue = model->B3SOIPDlagidl; - return (OK); - case B3SOIPD_MOD_LBGIDL: - value->rValue = model->B3SOIPDlbgidl; - return (OK); - case B3SOIPD_MOD_LNGIDL: - value->rValue = model->B3SOIPDlngidl; - return (OK); - case B3SOIPD_MOD_LNTUN: - value->rValue = model->B3SOIPDlntun; - return (OK); - case B3SOIPD_MOD_LNDIODE: - value->rValue = model->B3SOIPDlndiode; - return (OK); - case B3SOIPD_MOD_LNRECF0: - value->rValue = model->B3SOIPDlnrecf0; - return (OK); - case B3SOIPD_MOD_LNRECR0: - value->rValue = model->B3SOIPDlnrecr0; - return (OK); - case B3SOIPD_MOD_LISBJT: - value->rValue = model->B3SOIPDlisbjt; - return (OK); - case B3SOIPD_MOD_LISDIF: - value->rValue = model->B3SOIPDlisdif; - return (OK); - case B3SOIPD_MOD_LISREC: - value->rValue = model->B3SOIPDlisrec; - return (OK); - case B3SOIPD_MOD_LISTUN: - value->rValue = model->B3SOIPDlistun; - return (OK); - case B3SOIPD_MOD_LVREC0: - value->rValue = model->B3SOIPDlvrec0; - return (OK); - case B3SOIPD_MOD_LVTUN0: - value->rValue = model->B3SOIPDlvtun0; - return (OK); - case B3SOIPD_MOD_LNBJT: - value->rValue = model->B3SOIPDlnbjt; - return (OK); - case B3SOIPD_MOD_LLBJT0: - value->rValue = model->B3SOIPDllbjt0; - return (OK); - case B3SOIPD_MOD_LVABJT: - value->rValue = model->B3SOIPDlvabjt; - return (OK); - case B3SOIPD_MOD_LAELY: - value->rValue = model->B3SOIPDlaely; - return (OK); - case B3SOIPD_MOD_LAHLI: - value->rValue = model->B3SOIPDlahli; - return (OK); - /* CV Model */ - case B3SOIPD_MOD_LVSDFB: - value->rValue = model->B3SOIPDlvsdfb; - return (OK); - case B3SOIPD_MOD_LVSDTH: - value->rValue = model->B3SOIPDlvsdth; - return (OK); - case B3SOIPD_MOD_LDELVT: - value->rValue = model->B3SOIPDldelvt; - return (OK); - case B3SOIPD_MOD_LACDE: - value->rValue = model->B3SOIPDlacde; - return (OK); - case B3SOIPD_MOD_LMOIN: - value->rValue = model->B3SOIPDlmoin; - return (OK); + /* Length Dependence */ + case B3SOIPD_MOD_LNPEAK: + value->rValue = model->B3SOIPDlnpeak; + return(OK); + case B3SOIPD_MOD_LNSUB: + value->rValue = model->B3SOIPDlnsub; + return(OK); + case B3SOIPD_MOD_LNGATE: + value->rValue = model->B3SOIPDlngate; + return(OK); + case B3SOIPD_MOD_LVTH0: + value->rValue = model->B3SOIPDlvth0; + return(OK); + case B3SOIPD_MOD_LK1: + value->rValue = model->B3SOIPDlk1; + return(OK); + case B3SOIPD_MOD_LK1W1: + value->rValue = model->B3SOIPDlk1w1; + return(OK); + case B3SOIPD_MOD_LK1W2: + value->rValue = model->B3SOIPDlk1w2; + return(OK); + case B3SOIPD_MOD_LK2: + value->rValue = model->B3SOIPDlk2; + return(OK); + case B3SOIPD_MOD_LK3: + value->rValue = model->B3SOIPDlk3; + return(OK); + case B3SOIPD_MOD_LK3B: + value->rValue = model->B3SOIPDlk3b; + return(OK); + case B3SOIPD_MOD_LKB1: + value->rValue = model->B3SOIPDlkb1; + return(OK); + case B3SOIPD_MOD_LW0: + value->rValue = model->B3SOIPDlw0; + return(OK); + case B3SOIPD_MOD_LNLX: + value->rValue = model->B3SOIPDlnlx; + return(OK); + case B3SOIPD_MOD_LDVT0 : + value->rValue = model->B3SOIPDldvt0; + return(OK); + case B3SOIPD_MOD_LDVT1 : + value->rValue = model->B3SOIPDldvt1; + return(OK); + case B3SOIPD_MOD_LDVT2 : + value->rValue = model->B3SOIPDldvt2; + return(OK); + case B3SOIPD_MOD_LDVT0W : + value->rValue = model->B3SOIPDldvt0w; + return(OK); + case B3SOIPD_MOD_LDVT1W : + value->rValue = model->B3SOIPDldvt1w; + return(OK); + case B3SOIPD_MOD_LDVT2W : + value->rValue = model->B3SOIPDldvt2w; + return(OK); + case B3SOIPD_MOD_LU0: + value->rValue = model->B3SOIPDlu0; + return(OK); + case B3SOIPD_MOD_LUA: + value->rValue = model->B3SOIPDlua; + return(OK); + case B3SOIPD_MOD_LUB: + value->rValue = model->B3SOIPDlub; + return(OK); + case B3SOIPD_MOD_LUC: + value->rValue = model->B3SOIPDluc; + return(OK); + case B3SOIPD_MOD_LVSAT: + value->rValue = model->B3SOIPDlvsat; + return(OK); + case B3SOIPD_MOD_LA0: + value->rValue = model->B3SOIPDla0; + return(OK); + case B3SOIPD_MOD_LAGS: + value->rValue = model->B3SOIPDlags; + return(OK); + case B3SOIPD_MOD_LB0: + value->rValue = model->B3SOIPDlb0; + return(OK); + case B3SOIPD_MOD_LB1: + value->rValue = model->B3SOIPDlb1; + return(OK); + case B3SOIPD_MOD_LKETA: + value->rValue = model->B3SOIPDlketa; + return(OK); + case B3SOIPD_MOD_LKETAS: + value->rValue = model->B3SOIPDlketas; + return(OK); + case B3SOIPD_MOD_LA1: + value->rValue = model->B3SOIPDla1; + return(OK); + case B3SOIPD_MOD_LA2: + value->rValue = model->B3SOIPDla2; + return(OK); + case B3SOIPD_MOD_LRDSW: + value->rValue = model->B3SOIPDlrdsw; + return(OK); + case B3SOIPD_MOD_LPRWB: + value->rValue = model->B3SOIPDlprwb; + return(OK); + case B3SOIPD_MOD_LPRWG: + value->rValue = model->B3SOIPDlprwg; + return(OK); + case B3SOIPD_MOD_LWR: + value->rValue = model->B3SOIPDlwr; + return(OK); + case B3SOIPD_MOD_LNFACTOR : + value->rValue = model->B3SOIPDlnfactor; + return(OK); + case B3SOIPD_MOD_LDWG: + value->rValue = model->B3SOIPDldwg; + return(OK); + case B3SOIPD_MOD_LDWB: + value->rValue = model->B3SOIPDldwb; + return(OK); + case B3SOIPD_MOD_LVOFF: + value->rValue = model->B3SOIPDlvoff; + return(OK); + case B3SOIPD_MOD_LETA0: + value->rValue = model->B3SOIPDleta0; + return(OK); + case B3SOIPD_MOD_LETAB: + value->rValue = model->B3SOIPDletab; + return(OK); + case B3SOIPD_MOD_LDSUB : + value->rValue = model->B3SOIPDldsub; + return(OK); + case B3SOIPD_MOD_LCIT : + value->rValue = model->B3SOIPDlcit; + return(OK); + case B3SOIPD_MOD_LCDSC : + value->rValue = model->B3SOIPDlcdsc; + return(OK); + case B3SOIPD_MOD_LCDSCB : + value->rValue = model->B3SOIPDlcdscb; + return(OK); + case B3SOIPD_MOD_LCDSCD : + value->rValue = model->B3SOIPDlcdscd; + return(OK); + case B3SOIPD_MOD_LPCLM: + value->rValue = model->B3SOIPDlpclm; + return(OK); + case B3SOIPD_MOD_LPDIBL1: + value->rValue = model->B3SOIPDlpdibl1; + return(OK); + case B3SOIPD_MOD_LPDIBL2: + value->rValue = model->B3SOIPDlpdibl2; + return(OK); + case B3SOIPD_MOD_LPDIBLB: + value->rValue = model->B3SOIPDlpdiblb; + return(OK); + case B3SOIPD_MOD_LDROUT : + value->rValue = model->B3SOIPDldrout; + return(OK); + case B3SOIPD_MOD_LPVAG: + value->rValue = model->B3SOIPDlpvag; + return(OK); + case B3SOIPD_MOD_LDELTA: + value->rValue = model->B3SOIPDldelta; + return(OK); + case B3SOIPD_MOD_LALPHA0: + value->rValue = model->B3SOIPDlalpha0; + return(OK); + case B3SOIPD_MOD_LFBJTII: + value->rValue = model->B3SOIPDlfbjtii; + return(OK); + case B3SOIPD_MOD_LBETA0: + value->rValue = model->B3SOIPDlbeta0; + return(OK); + case B3SOIPD_MOD_LBETA1: + value->rValue = model->B3SOIPDlbeta1; + return(OK); + case B3SOIPD_MOD_LBETA2: + value->rValue = model->B3SOIPDlbeta2; + return(OK); + case B3SOIPD_MOD_LVDSATII0: + value->rValue = model->B3SOIPDlvdsatii0; + return(OK); + case B3SOIPD_MOD_LLII: + value->rValue = model->B3SOIPDllii; + return(OK); + case B3SOIPD_MOD_LESATII: + value->rValue = model->B3SOIPDlesatii; + return(OK); + case B3SOIPD_MOD_LSII0: + value->rValue = model->B3SOIPDlsii0; + return(OK); + case B3SOIPD_MOD_LSII1: + value->rValue = model->B3SOIPDlsii1; + return(OK); + case B3SOIPD_MOD_LSII2: + value->rValue = model->B3SOIPDlsii2; + return(OK); + case B3SOIPD_MOD_LSIID: + value->rValue = model->B3SOIPDlsiid; + return(OK); + case B3SOIPD_MOD_LAGIDL: + value->rValue = model->B3SOIPDlagidl; + return(OK); + case B3SOIPD_MOD_LBGIDL: + value->rValue = model->B3SOIPDlbgidl; + return(OK); + case B3SOIPD_MOD_LNGIDL: + value->rValue = model->B3SOIPDlngidl; + return(OK); + case B3SOIPD_MOD_LNTUN: + value->rValue = model->B3SOIPDlntun; + return(OK); + case B3SOIPD_MOD_LNDIODE: + value->rValue = model->B3SOIPDlndiode; + return(OK); + case B3SOIPD_MOD_LNRECF0: + value->rValue = model->B3SOIPDlnrecf0; + return(OK); + case B3SOIPD_MOD_LNRECR0: + value->rValue = model->B3SOIPDlnrecr0; + return(OK); + case B3SOIPD_MOD_LISBJT: + value->rValue = model->B3SOIPDlisbjt; + return(OK); + case B3SOIPD_MOD_LISDIF: + value->rValue = model->B3SOIPDlisdif; + return(OK); + case B3SOIPD_MOD_LISREC: + value->rValue = model->B3SOIPDlisrec; + return(OK); + case B3SOIPD_MOD_LISTUN: + value->rValue = model->B3SOIPDlistun; + return(OK); + case B3SOIPD_MOD_LVREC0: + value->rValue = model->B3SOIPDlvrec0; + return(OK); + case B3SOIPD_MOD_LVTUN0: + value->rValue = model->B3SOIPDlvtun0; + return(OK); + case B3SOIPD_MOD_LNBJT: + value->rValue = model->B3SOIPDlnbjt; + return(OK); + case B3SOIPD_MOD_LLBJT0: + value->rValue = model->B3SOIPDllbjt0; + return(OK); + case B3SOIPD_MOD_LVABJT: + value->rValue = model->B3SOIPDlvabjt; + return(OK); + case B3SOIPD_MOD_LAELY: + value->rValue = model->B3SOIPDlaely; + return(OK); + case B3SOIPD_MOD_LAHLI: + value->rValue = model->B3SOIPDlahli; + return(OK); + /* CV Model */ + case B3SOIPD_MOD_LVSDFB: + value->rValue = model->B3SOIPDlvsdfb; + return(OK); + case B3SOIPD_MOD_LVSDTH: + value->rValue = model->B3SOIPDlvsdth; + return(OK); + case B3SOIPD_MOD_LDELVT: + value->rValue = model->B3SOIPDldelvt; + return(OK); + case B3SOIPD_MOD_LACDE: + value->rValue = model->B3SOIPDlacde; + return(OK); + case B3SOIPD_MOD_LMOIN: + value->rValue = model->B3SOIPDlmoin; + return(OK); - /* Width Dependence */ - case B3SOIPD_MOD_WNPEAK: - value->rValue = model->B3SOIPDwnpeak; - return (OK); - case B3SOIPD_MOD_WNSUB: - value->rValue = model->B3SOIPDwnsub; - return (OK); - case B3SOIPD_MOD_WNGATE: - value->rValue = model->B3SOIPDwngate; - return (OK); - case B3SOIPD_MOD_WVTH0: - value->rValue = model->B3SOIPDwvth0; - return (OK); - case B3SOIPD_MOD_WK1: - value->rValue = model->B3SOIPDwk1; - return (OK); - case B3SOIPD_MOD_WK1W1: - value->rValue = model->B3SOIPDwk1w1; - return (OK); - case B3SOIPD_MOD_WK1W2: - value->rValue = model->B3SOIPDwk1w2; - return (OK); - case B3SOIPD_MOD_WK2: - value->rValue = model->B3SOIPDwk2; - return (OK); - case B3SOIPD_MOD_WK3: - value->rValue = model->B3SOIPDwk3; - return (OK); - case B3SOIPD_MOD_WK3B: - value->rValue = model->B3SOIPDwk3b; - return (OK); - case B3SOIPD_MOD_WKB1: - value->rValue = model->B3SOIPDwkb1; - return (OK); - case B3SOIPD_MOD_WW0: - value->rValue = model->B3SOIPDww0; - return (OK); - case B3SOIPD_MOD_WNLX: - value->rValue = model->B3SOIPDwnlx; - return (OK); - case B3SOIPD_MOD_WDVT0: - value->rValue = model->B3SOIPDwdvt0; - return (OK); - case B3SOIPD_MOD_WDVT1: - value->rValue = model->B3SOIPDwdvt1; - return (OK); - case B3SOIPD_MOD_WDVT2: - value->rValue = model->B3SOIPDwdvt2; - return (OK); - case B3SOIPD_MOD_WDVT0W: - value->rValue = model->B3SOIPDwdvt0w; - return (OK); - case B3SOIPD_MOD_WDVT1W: - value->rValue = model->B3SOIPDwdvt1w; - return (OK); - case B3SOIPD_MOD_WDVT2W: - value->rValue = model->B3SOIPDwdvt2w; - return (OK); - case B3SOIPD_MOD_WU0: - value->rValue = model->B3SOIPDwu0; - return (OK); - case B3SOIPD_MOD_WUA: - value->rValue = model->B3SOIPDwua; - return (OK); - case B3SOIPD_MOD_WUB: - value->rValue = model->B3SOIPDwub; - return (OK); - case B3SOIPD_MOD_WUC: - value->rValue = model->B3SOIPDwuc; - return (OK); - case B3SOIPD_MOD_WVSAT: - value->rValue = model->B3SOIPDwvsat; - return (OK); - case B3SOIPD_MOD_WA0: - value->rValue = model->B3SOIPDwa0; - return (OK); - case B3SOIPD_MOD_WAGS: - value->rValue = model->B3SOIPDwags; - return (OK); - case B3SOIPD_MOD_WB0: - value->rValue = model->B3SOIPDwb0; - return (OK); - case B3SOIPD_MOD_WB1: - value->rValue = model->B3SOIPDwb1; - return (OK); - case B3SOIPD_MOD_WKETA: - value->rValue = model->B3SOIPDwketa; - return (OK); - case B3SOIPD_MOD_WKETAS: - value->rValue = model->B3SOIPDwketas; - return (OK); - case B3SOIPD_MOD_WA1: - value->rValue = model->B3SOIPDwa1; - return (OK); - case B3SOIPD_MOD_WA2: - value->rValue = model->B3SOIPDwa2; - return (OK); - case B3SOIPD_MOD_WRDSW: - value->rValue = model->B3SOIPDwrdsw; - return (OK); - case B3SOIPD_MOD_WPRWB: - value->rValue = model->B3SOIPDwprwb; - return (OK); - case B3SOIPD_MOD_WPRWG: - value->rValue = model->B3SOIPDwprwg; - return (OK); - case B3SOIPD_MOD_WWR: - value->rValue = model->B3SOIPDwwr; - return (OK); - case B3SOIPD_MOD_WNFACTOR: - value->rValue = model->B3SOIPDwnfactor; - return (OK); - case B3SOIPD_MOD_WDWG: - value->rValue = model->B3SOIPDwdwg; - return (OK); - case B3SOIPD_MOD_WDWB: - value->rValue = model->B3SOIPDwdwb; - return (OK); - case B3SOIPD_MOD_WVOFF: - value->rValue = model->B3SOIPDwvoff; - return (OK); - case B3SOIPD_MOD_WETA0: - value->rValue = model->B3SOIPDweta0; - return (OK); - case B3SOIPD_MOD_WETAB: - value->rValue = model->B3SOIPDwetab; - return (OK); - case B3SOIPD_MOD_WDSUB: - value->rValue = model->B3SOIPDwdsub; - return (OK); - case B3SOIPD_MOD_WCIT: - value->rValue = model->B3SOIPDwcit; - return (OK); - case B3SOIPD_MOD_WCDSC: - value->rValue = model->B3SOIPDwcdsc; - return (OK); - case B3SOIPD_MOD_WCDSCB: - value->rValue = model->B3SOIPDwcdscb; - return (OK); - case B3SOIPD_MOD_WCDSCD: - value->rValue = model->B3SOIPDwcdscd; - return (OK); - case B3SOIPD_MOD_WPCLM: - value->rValue = model->B3SOIPDwpclm; - return (OK); - case B3SOIPD_MOD_WPDIBL1: - value->rValue = model->B3SOIPDwpdibl1; - return (OK); - case B3SOIPD_MOD_WPDIBL2: - value->rValue = model->B3SOIPDwpdibl2; - return (OK); - case B3SOIPD_MOD_WPDIBLB: - value->rValue = model->B3SOIPDwpdiblb; - return (OK); - case B3SOIPD_MOD_WDROUT: - value->rValue = model->B3SOIPDwdrout; - return (OK); - case B3SOIPD_MOD_WPVAG: - value->rValue = model->B3SOIPDwpvag; - return (OK); - case B3SOIPD_MOD_WDELTA: - value->rValue = model->B3SOIPDwdelta; - return (OK); - case B3SOIPD_MOD_WALPHA0: - value->rValue = model->B3SOIPDwalpha0; - return (OK); - case B3SOIPD_MOD_WFBJTII: - value->rValue = model->B3SOIPDwfbjtii; - return (OK); - case B3SOIPD_MOD_WBETA0: - value->rValue = model->B3SOIPDwbeta0; - return (OK); - case B3SOIPD_MOD_WBETA1: - value->rValue = model->B3SOIPDwbeta1; - return (OK); - case B3SOIPD_MOD_WBETA2: - value->rValue = model->B3SOIPDwbeta2; - return (OK); - case B3SOIPD_MOD_WVDSATII0: - value->rValue = model->B3SOIPDwvdsatii0; - return (OK); - case B3SOIPD_MOD_WLII: - value->rValue = model->B3SOIPDwlii; - return (OK); - case B3SOIPD_MOD_WESATII: - value->rValue = model->B3SOIPDwesatii; - return (OK); - case B3SOIPD_MOD_WSII0: - value->rValue = model->B3SOIPDwsii0; - return (OK); - case B3SOIPD_MOD_WSII1: - value->rValue = model->B3SOIPDwsii1; - return (OK); - case B3SOIPD_MOD_WSII2: - value->rValue = model->B3SOIPDwsii2; - return (OK); - case B3SOIPD_MOD_WSIID: - value->rValue = model->B3SOIPDwsiid; - return (OK); - case B3SOIPD_MOD_WAGIDL: - value->rValue = model->B3SOIPDwagidl; - return (OK); - case B3SOIPD_MOD_WBGIDL: - value->rValue = model->B3SOIPDwbgidl; - return (OK); - case B3SOIPD_MOD_WNGIDL: - value->rValue = model->B3SOIPDwngidl; - return (OK); - case B3SOIPD_MOD_WNTUN: - value->rValue = model->B3SOIPDwntun; - return (OK); - case B3SOIPD_MOD_WNDIODE: - value->rValue = model->B3SOIPDwndiode; - return (OK); - case B3SOIPD_MOD_WNRECF0: - value->rValue = model->B3SOIPDwnrecf0; - return (OK); - case B3SOIPD_MOD_WNRECR0: - value->rValue = model->B3SOIPDwnrecr0; - return (OK); - case B3SOIPD_MOD_WISBJT: - value->rValue = model->B3SOIPDwisbjt; - return (OK); - case B3SOIPD_MOD_WISDIF: - value->rValue = model->B3SOIPDwisdif; - return (OK); - case B3SOIPD_MOD_WISREC: - value->rValue = model->B3SOIPDwisrec; - return (OK); - case B3SOIPD_MOD_WISTUN: - value->rValue = model->B3SOIPDwistun; - return (OK); - case B3SOIPD_MOD_WVREC0: - value->rValue = model->B3SOIPDwvrec0; - return (OK); - case B3SOIPD_MOD_WVTUN0: - value->rValue = model->B3SOIPDwvtun0; - return (OK); - case B3SOIPD_MOD_WNBJT: - value->rValue = model->B3SOIPDwnbjt; - return (OK); - case B3SOIPD_MOD_WLBJT0: - value->rValue = model->B3SOIPDwlbjt0; - return (OK); - case B3SOIPD_MOD_WVABJT: - value->rValue = model->B3SOIPDwvabjt; - return (OK); - case B3SOIPD_MOD_WAELY: - value->rValue = model->B3SOIPDwaely; - return (OK); - case B3SOIPD_MOD_WAHLI: - value->rValue = model->B3SOIPDwahli; - return (OK); - /* CV Model */ - case B3SOIPD_MOD_WVSDFB: - value->rValue = model->B3SOIPDwvsdfb; - return (OK); - case B3SOIPD_MOD_WVSDTH: - value->rValue = model->B3SOIPDwvsdth; - return (OK); - case B3SOIPD_MOD_WDELVT: - value->rValue = model->B3SOIPDwdelvt; - return (OK); - case B3SOIPD_MOD_WACDE: - value->rValue = model->B3SOIPDwacde; - return (OK); - case B3SOIPD_MOD_WMOIN: - value->rValue = model->B3SOIPDwmoin; - return (OK); + /* Width Dependence */ + case B3SOIPD_MOD_WNPEAK: + value->rValue = model->B3SOIPDwnpeak; + return(OK); + case B3SOIPD_MOD_WNSUB: + value->rValue = model->B3SOIPDwnsub; + return(OK); + case B3SOIPD_MOD_WNGATE: + value->rValue = model->B3SOIPDwngate; + return(OK); + case B3SOIPD_MOD_WVTH0: + value->rValue = model->B3SOIPDwvth0; + return(OK); + case B3SOIPD_MOD_WK1: + value->rValue = model->B3SOIPDwk1; + return(OK); + case B3SOIPD_MOD_WK1W1: + value->rValue = model->B3SOIPDwk1w1; + return(OK); + case B3SOIPD_MOD_WK1W2: + value->rValue = model->B3SOIPDwk1w2; + return(OK); + case B3SOIPD_MOD_WK2: + value->rValue = model->B3SOIPDwk2; + return(OK); + case B3SOIPD_MOD_WK3: + value->rValue = model->B3SOIPDwk3; + return(OK); + case B3SOIPD_MOD_WK3B: + value->rValue = model->B3SOIPDwk3b; + return(OK); + case B3SOIPD_MOD_WKB1: + value->rValue = model->B3SOIPDwkb1; + return(OK); + case B3SOIPD_MOD_WW0: + value->rValue = model->B3SOIPDww0; + return(OK); + case B3SOIPD_MOD_WNLX: + value->rValue = model->B3SOIPDwnlx; + return(OK); + case B3SOIPD_MOD_WDVT0 : + value->rValue = model->B3SOIPDwdvt0; + return(OK); + case B3SOIPD_MOD_WDVT1 : + value->rValue = model->B3SOIPDwdvt1; + return(OK); + case B3SOIPD_MOD_WDVT2 : + value->rValue = model->B3SOIPDwdvt2; + return(OK); + case B3SOIPD_MOD_WDVT0W : + value->rValue = model->B3SOIPDwdvt0w; + return(OK); + case B3SOIPD_MOD_WDVT1W : + value->rValue = model->B3SOIPDwdvt1w; + return(OK); + case B3SOIPD_MOD_WDVT2W : + value->rValue = model->B3SOIPDwdvt2w; + return(OK); + case B3SOIPD_MOD_WU0: + value->rValue = model->B3SOIPDwu0; + return(OK); + case B3SOIPD_MOD_WUA: + value->rValue = model->B3SOIPDwua; + return(OK); + case B3SOIPD_MOD_WUB: + value->rValue = model->B3SOIPDwub; + return(OK); + case B3SOIPD_MOD_WUC: + value->rValue = model->B3SOIPDwuc; + return(OK); + case B3SOIPD_MOD_WVSAT: + value->rValue = model->B3SOIPDwvsat; + return(OK); + case B3SOIPD_MOD_WA0: + value->rValue = model->B3SOIPDwa0; + return(OK); + case B3SOIPD_MOD_WAGS: + value->rValue = model->B3SOIPDwags; + return(OK); + case B3SOIPD_MOD_WB0: + value->rValue = model->B3SOIPDwb0; + return(OK); + case B3SOIPD_MOD_WB1: + value->rValue = model->B3SOIPDwb1; + return(OK); + case B3SOIPD_MOD_WKETA: + value->rValue = model->B3SOIPDwketa; + return(OK); + case B3SOIPD_MOD_WKETAS: + value->rValue = model->B3SOIPDwketas; + return(OK); + case B3SOIPD_MOD_WA1: + value->rValue = model->B3SOIPDwa1; + return(OK); + case B3SOIPD_MOD_WA2: + value->rValue = model->B3SOIPDwa2; + return(OK); + case B3SOIPD_MOD_WRDSW: + value->rValue = model->B3SOIPDwrdsw; + return(OK); + case B3SOIPD_MOD_WPRWB: + value->rValue = model->B3SOIPDwprwb; + return(OK); + case B3SOIPD_MOD_WPRWG: + value->rValue = model->B3SOIPDwprwg; + return(OK); + case B3SOIPD_MOD_WWR: + value->rValue = model->B3SOIPDwwr; + return(OK); + case B3SOIPD_MOD_WNFACTOR : + value->rValue = model->B3SOIPDwnfactor; + return(OK); + case B3SOIPD_MOD_WDWG: + value->rValue = model->B3SOIPDwdwg; + return(OK); + case B3SOIPD_MOD_WDWB: + value->rValue = model->B3SOIPDwdwb; + return(OK); + case B3SOIPD_MOD_WVOFF: + value->rValue = model->B3SOIPDwvoff; + return(OK); + case B3SOIPD_MOD_WETA0: + value->rValue = model->B3SOIPDweta0; + return(OK); + case B3SOIPD_MOD_WETAB: + value->rValue = model->B3SOIPDwetab; + return(OK); + case B3SOIPD_MOD_WDSUB : + value->rValue = model->B3SOIPDwdsub; + return(OK); + case B3SOIPD_MOD_WCIT : + value->rValue = model->B3SOIPDwcit; + return(OK); + case B3SOIPD_MOD_WCDSC : + value->rValue = model->B3SOIPDwcdsc; + return(OK); + case B3SOIPD_MOD_WCDSCB : + value->rValue = model->B3SOIPDwcdscb; + return(OK); + case B3SOIPD_MOD_WCDSCD : + value->rValue = model->B3SOIPDwcdscd; + return(OK); + case B3SOIPD_MOD_WPCLM: + value->rValue = model->B3SOIPDwpclm; + return(OK); + case B3SOIPD_MOD_WPDIBL1: + value->rValue = model->B3SOIPDwpdibl1; + return(OK); + case B3SOIPD_MOD_WPDIBL2: + value->rValue = model->B3SOIPDwpdibl2; + return(OK); + case B3SOIPD_MOD_WPDIBLB: + value->rValue = model->B3SOIPDwpdiblb; + return(OK); + case B3SOIPD_MOD_WDROUT : + value->rValue = model->B3SOIPDwdrout; + return(OK); + case B3SOIPD_MOD_WPVAG: + value->rValue = model->B3SOIPDwpvag; + return(OK); + case B3SOIPD_MOD_WDELTA: + value->rValue = model->B3SOIPDwdelta; + return(OK); + case B3SOIPD_MOD_WALPHA0: + value->rValue = model->B3SOIPDwalpha0; + return(OK); + case B3SOIPD_MOD_WFBJTII: + value->rValue = model->B3SOIPDwfbjtii; + return(OK); + case B3SOIPD_MOD_WBETA0: + value->rValue = model->B3SOIPDwbeta0; + return(OK); + case B3SOIPD_MOD_WBETA1: + value->rValue = model->B3SOIPDwbeta1; + return(OK); + case B3SOIPD_MOD_WBETA2: + value->rValue = model->B3SOIPDwbeta2; + return(OK); + case B3SOIPD_MOD_WVDSATII0: + value->rValue = model->B3SOIPDwvdsatii0; + return(OK); + case B3SOIPD_MOD_WLII: + value->rValue = model->B3SOIPDwlii; + return(OK); + case B3SOIPD_MOD_WESATII: + value->rValue = model->B3SOIPDwesatii; + return(OK); + case B3SOIPD_MOD_WSII0: + value->rValue = model->B3SOIPDwsii0; + return(OK); + case B3SOIPD_MOD_WSII1: + value->rValue = model->B3SOIPDwsii1; + return(OK); + case B3SOIPD_MOD_WSII2: + value->rValue = model->B3SOIPDwsii2; + return(OK); + case B3SOIPD_MOD_WSIID: + value->rValue = model->B3SOIPDwsiid; + return(OK); + case B3SOIPD_MOD_WAGIDL: + value->rValue = model->B3SOIPDwagidl; + return(OK); + case B3SOIPD_MOD_WBGIDL: + value->rValue = model->B3SOIPDwbgidl; + return(OK); + case B3SOIPD_MOD_WNGIDL: + value->rValue = model->B3SOIPDwngidl; + return(OK); + case B3SOIPD_MOD_WNTUN: + value->rValue = model->B3SOIPDwntun; + return(OK); + case B3SOIPD_MOD_WNDIODE: + value->rValue = model->B3SOIPDwndiode; + return(OK); + case B3SOIPD_MOD_WNRECF0: + value->rValue = model->B3SOIPDwnrecf0; + return(OK); + case B3SOIPD_MOD_WNRECR0: + value->rValue = model->B3SOIPDwnrecr0; + return(OK); + case B3SOIPD_MOD_WISBJT: + value->rValue = model->B3SOIPDwisbjt; + return(OK); + case B3SOIPD_MOD_WISDIF: + value->rValue = model->B3SOIPDwisdif; + return(OK); + case B3SOIPD_MOD_WISREC: + value->rValue = model->B3SOIPDwisrec; + return(OK); + case B3SOIPD_MOD_WISTUN: + value->rValue = model->B3SOIPDwistun; + return(OK); + case B3SOIPD_MOD_WVREC0: + value->rValue = model->B3SOIPDwvrec0; + return(OK); + case B3SOIPD_MOD_WVTUN0: + value->rValue = model->B3SOIPDwvtun0; + return(OK); + case B3SOIPD_MOD_WNBJT: + value->rValue = model->B3SOIPDwnbjt; + return(OK); + case B3SOIPD_MOD_WLBJT0: + value->rValue = model->B3SOIPDwlbjt0; + return(OK); + case B3SOIPD_MOD_WVABJT: + value->rValue = model->B3SOIPDwvabjt; + return(OK); + case B3SOIPD_MOD_WAELY: + value->rValue = model->B3SOIPDwaely; + return(OK); + case B3SOIPD_MOD_WAHLI: + value->rValue = model->B3SOIPDwahli; + return(OK); + /* CV Model */ + case B3SOIPD_MOD_WVSDFB: + value->rValue = model->B3SOIPDwvsdfb; + return(OK); + case B3SOIPD_MOD_WVSDTH: + value->rValue = model->B3SOIPDwvsdth; + return(OK); + case B3SOIPD_MOD_WDELVT: + value->rValue = model->B3SOIPDwdelvt; + return(OK); + case B3SOIPD_MOD_WACDE: + value->rValue = model->B3SOIPDwacde; + return(OK); + case B3SOIPD_MOD_WMOIN: + value->rValue = model->B3SOIPDwmoin; + return(OK); - /* Cross-term Dependence */ - case B3SOIPD_MOD_PNPEAK: - value->rValue = model->B3SOIPDpnpeak; - return (OK); - case B3SOIPD_MOD_PNSUB: - value->rValue = model->B3SOIPDpnsub; - return (OK); - case B3SOIPD_MOD_PNGATE: - value->rValue = model->B3SOIPDpngate; - return (OK); - case B3SOIPD_MOD_PVTH0: - value->rValue = model->B3SOIPDpvth0; - return (OK); - case B3SOIPD_MOD_PK1: - value->rValue = model->B3SOIPDpk1; - return (OK); - case B3SOIPD_MOD_PK1W1: - value->rValue = model->B3SOIPDpk1w1; - return (OK); - case B3SOIPD_MOD_PK1W2: - value->rValue = model->B3SOIPDpk1w2; - return (OK); - case B3SOIPD_MOD_PK2: - value->rValue = model->B3SOIPDpk2; - return (OK); - case B3SOIPD_MOD_PK3: - value->rValue = model->B3SOIPDpk3; - return (OK); - case B3SOIPD_MOD_PK3B: - value->rValue = model->B3SOIPDpk3b; - return (OK); - case B3SOIPD_MOD_PKB1: - value->rValue = model->B3SOIPDpkb1; - return (OK); - case B3SOIPD_MOD_PW0: - value->rValue = model->B3SOIPDpw0; - return (OK); - case B3SOIPD_MOD_PNLX: - value->rValue = model->B3SOIPDpnlx; - return (OK); - case B3SOIPD_MOD_PDVT0: - value->rValue = model->B3SOIPDpdvt0; - return (OK); - case B3SOIPD_MOD_PDVT1: - value->rValue = model->B3SOIPDpdvt1; - return (OK); - case B3SOIPD_MOD_PDVT2: - value->rValue = model->B3SOIPDpdvt2; - return (OK); - case B3SOIPD_MOD_PDVT0W: - value->rValue = model->B3SOIPDpdvt0w; - return (OK); - case B3SOIPD_MOD_PDVT1W: - value->rValue = model->B3SOIPDpdvt1w; - return (OK); - case B3SOIPD_MOD_PDVT2W: - value->rValue = model->B3SOIPDpdvt2w; - return (OK); - case B3SOIPD_MOD_PU0: - value->rValue = model->B3SOIPDpu0; - return (OK); - case B3SOIPD_MOD_PUA: - value->rValue = model->B3SOIPDpua; - return (OK); - case B3SOIPD_MOD_PUB: - value->rValue = model->B3SOIPDpub; - return (OK); - case B3SOIPD_MOD_PUC: - value->rValue = model->B3SOIPDpuc; - return (OK); - case B3SOIPD_MOD_PVSAT: - value->rValue = model->B3SOIPDpvsat; - return (OK); - case B3SOIPD_MOD_PA0: - value->rValue = model->B3SOIPDpa0; - return (OK); - case B3SOIPD_MOD_PAGS: - value->rValue = model->B3SOIPDpags; - return (OK); - case B3SOIPD_MOD_PB0: - value->rValue = model->B3SOIPDpb0; - return (OK); - case B3SOIPD_MOD_PB1: - value->rValue = model->B3SOIPDpb1; - return (OK); - case B3SOIPD_MOD_PKETA: - value->rValue = model->B3SOIPDpketa; - return (OK); - case B3SOIPD_MOD_PKETAS: - value->rValue = model->B3SOIPDpketas; - return (OK); - case B3SOIPD_MOD_PA1: - value->rValue = model->B3SOIPDpa1; - return (OK); - case B3SOIPD_MOD_PA2: - value->rValue = model->B3SOIPDpa2; - return (OK); - case B3SOIPD_MOD_PRDSW: - value->rValue = model->B3SOIPDprdsw; - return (OK); - case B3SOIPD_MOD_PPRWB: - value->rValue = model->B3SOIPDpprwb; - return (OK); - case B3SOIPD_MOD_PPRWG: - value->rValue = model->B3SOIPDpprwg; - return (OK); - case B3SOIPD_MOD_PWR: - value->rValue = model->B3SOIPDpwr; - return (OK); - case B3SOIPD_MOD_PNFACTOR: - value->rValue = model->B3SOIPDpnfactor; - return (OK); - case B3SOIPD_MOD_PDWG: - value->rValue = model->B3SOIPDpdwg; - return (OK); - case B3SOIPD_MOD_PDWB: - value->rValue = model->B3SOIPDpdwb; - return (OK); - case B3SOIPD_MOD_PVOFF: - value->rValue = model->B3SOIPDpvoff; - return (OK); - case B3SOIPD_MOD_PETA0: - value->rValue = model->B3SOIPDpeta0; - return (OK); - case B3SOIPD_MOD_PETAB: - value->rValue = model->B3SOIPDpetab; - return (OK); - case B3SOIPD_MOD_PDSUB: - value->rValue = model->B3SOIPDpdsub; - return (OK); - case B3SOIPD_MOD_PCIT: - value->rValue = model->B3SOIPDpcit; - return (OK); - case B3SOIPD_MOD_PCDSC: - value->rValue = model->B3SOIPDpcdsc; - return (OK); - case B3SOIPD_MOD_PCDSCB: - value->rValue = model->B3SOIPDpcdscb; - return (OK); - case B3SOIPD_MOD_PCDSCD: - value->rValue = model->B3SOIPDpcdscd; - return (OK); - case B3SOIPD_MOD_PPCLM: - value->rValue = model->B3SOIPDppclm; - return (OK); - case B3SOIPD_MOD_PPDIBL1: - value->rValue = model->B3SOIPDppdibl1; - return (OK); - case B3SOIPD_MOD_PPDIBL2: - value->rValue = model->B3SOIPDppdibl2; - return (OK); - case B3SOIPD_MOD_PPDIBLB: - value->rValue = model->B3SOIPDppdiblb; - return (OK); - case B3SOIPD_MOD_PDROUT: - value->rValue = model->B3SOIPDpdrout; - return (OK); - case B3SOIPD_MOD_PPVAG: - value->rValue = model->B3SOIPDppvag; - return (OK); - case B3SOIPD_MOD_PDELTA: - value->rValue = model->B3SOIPDpdelta; - return (OK); - case B3SOIPD_MOD_PALPHA0: - value->rValue = model->B3SOIPDpalpha0; - return (OK); - case B3SOIPD_MOD_PFBJTII: - value->rValue = model->B3SOIPDpfbjtii; - return (OK); - case B3SOIPD_MOD_PBETA0: - value->rValue = model->B3SOIPDpbeta0; - return (OK); - case B3SOIPD_MOD_PBETA1: - value->rValue = model->B3SOIPDpbeta1; - return (OK); - case B3SOIPD_MOD_PBETA2: - value->rValue = model->B3SOIPDpbeta2; - return (OK); - case B3SOIPD_MOD_PVDSATII0: - value->rValue = model->B3SOIPDpvdsatii0; - return (OK); - case B3SOIPD_MOD_PLII: - value->rValue = model->B3SOIPDplii; - return (OK); - case B3SOIPD_MOD_PESATII: - value->rValue = model->B3SOIPDpesatii; - return (OK); - case B3SOIPD_MOD_PSII0: - value->rValue = model->B3SOIPDpsii0; - return (OK); - case B3SOIPD_MOD_PSII1: - value->rValue = model->B3SOIPDpsii1; - return (OK); - case B3SOIPD_MOD_PSII2: - value->rValue = model->B3SOIPDpsii2; - return (OK); - case B3SOIPD_MOD_PSIID: - value->rValue = model->B3SOIPDpsiid; - return (OK); - case B3SOIPD_MOD_PAGIDL: - value->rValue = model->B3SOIPDpagidl; - return (OK); - case B3SOIPD_MOD_PBGIDL: - value->rValue = model->B3SOIPDpbgidl; - return (OK); - case B3SOIPD_MOD_PNGIDL: - value->rValue = model->B3SOIPDpngidl; - return (OK); - case B3SOIPD_MOD_PNTUN: - value->rValue = model->B3SOIPDpntun; - return (OK); - case B3SOIPD_MOD_PNDIODE: - value->rValue = model->B3SOIPDpndiode; - return (OK); - case B3SOIPD_MOD_PNRECF0: - value->rValue = model->B3SOIPDpnrecf0; - return (OK); - case B3SOIPD_MOD_PNRECR0: - value->rValue = model->B3SOIPDpnrecr0; - return (OK); - case B3SOIPD_MOD_PISBJT: - value->rValue = model->B3SOIPDpisbjt; - return (OK); - case B3SOIPD_MOD_PISDIF: - value->rValue = model->B3SOIPDpisdif; - return (OK); - case B3SOIPD_MOD_PISREC: - value->rValue = model->B3SOIPDpisrec; - return (OK); - case B3SOIPD_MOD_PISTUN: - value->rValue = model->B3SOIPDpistun; - return (OK); - case B3SOIPD_MOD_PVREC0: - value->rValue = model->B3SOIPDpvrec0; - return (OK); - case B3SOIPD_MOD_PVTUN0: - value->rValue = model->B3SOIPDpvtun0; - return (OK); - case B3SOIPD_MOD_PNBJT: - value->rValue = model->B3SOIPDpnbjt; - return (OK); - case B3SOIPD_MOD_PLBJT0: - value->rValue = model->B3SOIPDplbjt0; - return (OK); - case B3SOIPD_MOD_PVABJT: - value->rValue = model->B3SOIPDpvabjt; - return (OK); - case B3SOIPD_MOD_PAELY: - value->rValue = model->B3SOIPDpaely; - return (OK); - case B3SOIPD_MOD_PAHLI: - value->rValue = model->B3SOIPDpahli; - return (OK); - /* CV Model */ - case B3SOIPD_MOD_PVSDFB: - value->rValue = model->B3SOIPDpvsdfb; - return (OK); - case B3SOIPD_MOD_PVSDTH: - value->rValue = model->B3SOIPDpvsdth; - return (OK); - case B3SOIPD_MOD_PDELVT: - value->rValue = model->B3SOIPDpdelvt; - return (OK); - case B3SOIPD_MOD_PACDE: - value->rValue = model->B3SOIPDpacde; - return (OK); - case B3SOIPD_MOD_PMOIN: - value->rValue = model->B3SOIPDpmoin; - return (OK); + /* Cross-term Dependence */ + case B3SOIPD_MOD_PNPEAK: + value->rValue = model->B3SOIPDpnpeak; + return(OK); + case B3SOIPD_MOD_PNSUB: + value->rValue = model->B3SOIPDpnsub; + return(OK); + case B3SOIPD_MOD_PNGATE: + value->rValue = model->B3SOIPDpngate; + return(OK); + case B3SOIPD_MOD_PVTH0: + value->rValue = model->B3SOIPDpvth0; + return(OK); + case B3SOIPD_MOD_PK1: + value->rValue = model->B3SOIPDpk1; + return(OK); + case B3SOIPD_MOD_PK1W1: + value->rValue = model->B3SOIPDpk1w1; + return(OK); + case B3SOIPD_MOD_PK1W2: + value->rValue = model->B3SOIPDpk1w2; + return(OK); + case B3SOIPD_MOD_PK2: + value->rValue = model->B3SOIPDpk2; + return(OK); + case B3SOIPD_MOD_PK3: + value->rValue = model->B3SOIPDpk3; + return(OK); + case B3SOIPD_MOD_PK3B: + value->rValue = model->B3SOIPDpk3b; + return(OK); + case B3SOIPD_MOD_PKB1: + value->rValue = model->B3SOIPDpkb1; + return(OK); + case B3SOIPD_MOD_PW0: + value->rValue = model->B3SOIPDpw0; + return(OK); + case B3SOIPD_MOD_PNLX: + value->rValue = model->B3SOIPDpnlx; + return(OK); + case B3SOIPD_MOD_PDVT0 : + value->rValue = model->B3SOIPDpdvt0; + return(OK); + case B3SOIPD_MOD_PDVT1 : + value->rValue = model->B3SOIPDpdvt1; + return(OK); + case B3SOIPD_MOD_PDVT2 : + value->rValue = model->B3SOIPDpdvt2; + return(OK); + case B3SOIPD_MOD_PDVT0W : + value->rValue = model->B3SOIPDpdvt0w; + return(OK); + case B3SOIPD_MOD_PDVT1W : + value->rValue = model->B3SOIPDpdvt1w; + return(OK); + case B3SOIPD_MOD_PDVT2W : + value->rValue = model->B3SOIPDpdvt2w; + return(OK); + case B3SOIPD_MOD_PU0: + value->rValue = model->B3SOIPDpu0; + return(OK); + case B3SOIPD_MOD_PUA: + value->rValue = model->B3SOIPDpua; + return(OK); + case B3SOIPD_MOD_PUB: + value->rValue = model->B3SOIPDpub; + return(OK); + case B3SOIPD_MOD_PUC: + value->rValue = model->B3SOIPDpuc; + return(OK); + case B3SOIPD_MOD_PVSAT: + value->rValue = model->B3SOIPDpvsat; + return(OK); + case B3SOIPD_MOD_PA0: + value->rValue = model->B3SOIPDpa0; + return(OK); + case B3SOIPD_MOD_PAGS: + value->rValue = model->B3SOIPDpags; + return(OK); + case B3SOIPD_MOD_PB0: + value->rValue = model->B3SOIPDpb0; + return(OK); + case B3SOIPD_MOD_PB1: + value->rValue = model->B3SOIPDpb1; + return(OK); + case B3SOIPD_MOD_PKETA: + value->rValue = model->B3SOIPDpketa; + return(OK); + case B3SOIPD_MOD_PKETAS: + value->rValue = model->B3SOIPDpketas; + return(OK); + case B3SOIPD_MOD_PA1: + value->rValue = model->B3SOIPDpa1; + return(OK); + case B3SOIPD_MOD_PA2: + value->rValue = model->B3SOIPDpa2; + return(OK); + case B3SOIPD_MOD_PRDSW: + value->rValue = model->B3SOIPDprdsw; + return(OK); + case B3SOIPD_MOD_PPRWB: + value->rValue = model->B3SOIPDpprwb; + return(OK); + case B3SOIPD_MOD_PPRWG: + value->rValue = model->B3SOIPDpprwg; + return(OK); + case B3SOIPD_MOD_PWR: + value->rValue = model->B3SOIPDpwr; + return(OK); + case B3SOIPD_MOD_PNFACTOR : + value->rValue = model->B3SOIPDpnfactor; + return(OK); + case B3SOIPD_MOD_PDWG: + value->rValue = model->B3SOIPDpdwg; + return(OK); + case B3SOIPD_MOD_PDWB: + value->rValue = model->B3SOIPDpdwb; + return(OK); + case B3SOIPD_MOD_PVOFF: + value->rValue = model->B3SOIPDpvoff; + return(OK); + case B3SOIPD_MOD_PETA0: + value->rValue = model->B3SOIPDpeta0; + return(OK); + case B3SOIPD_MOD_PETAB: + value->rValue = model->B3SOIPDpetab; + return(OK); + case B3SOIPD_MOD_PDSUB : + value->rValue = model->B3SOIPDpdsub; + return(OK); + case B3SOIPD_MOD_PCIT : + value->rValue = model->B3SOIPDpcit; + return(OK); + case B3SOIPD_MOD_PCDSC : + value->rValue = model->B3SOIPDpcdsc; + return(OK); + case B3SOIPD_MOD_PCDSCB : + value->rValue = model->B3SOIPDpcdscb; + return(OK); + case B3SOIPD_MOD_PCDSCD : + value->rValue = model->B3SOIPDpcdscd; + return(OK); + case B3SOIPD_MOD_PPCLM: + value->rValue = model->B3SOIPDppclm; + return(OK); + case B3SOIPD_MOD_PPDIBL1: + value->rValue = model->B3SOIPDppdibl1; + return(OK); + case B3SOIPD_MOD_PPDIBL2: + value->rValue = model->B3SOIPDppdibl2; + return(OK); + case B3SOIPD_MOD_PPDIBLB: + value->rValue = model->B3SOIPDppdiblb; + return(OK); + case B3SOIPD_MOD_PDROUT : + value->rValue = model->B3SOIPDpdrout; + return(OK); + case B3SOIPD_MOD_PPVAG: + value->rValue = model->B3SOIPDppvag; + return(OK); + case B3SOIPD_MOD_PDELTA: + value->rValue = model->B3SOIPDpdelta; + return(OK); + case B3SOIPD_MOD_PALPHA0: + value->rValue = model->B3SOIPDpalpha0; + return(OK); + case B3SOIPD_MOD_PFBJTII: + value->rValue = model->B3SOIPDpfbjtii; + return(OK); + case B3SOIPD_MOD_PBETA0: + value->rValue = model->B3SOIPDpbeta0; + return(OK); + case B3SOIPD_MOD_PBETA1: + value->rValue = model->B3SOIPDpbeta1; + return(OK); + case B3SOIPD_MOD_PBETA2: + value->rValue = model->B3SOIPDpbeta2; + return(OK); + case B3SOIPD_MOD_PVDSATII0: + value->rValue = model->B3SOIPDpvdsatii0; + return(OK); + case B3SOIPD_MOD_PLII: + value->rValue = model->B3SOIPDplii; + return(OK); + case B3SOIPD_MOD_PESATII: + value->rValue = model->B3SOIPDpesatii; + return(OK); + case B3SOIPD_MOD_PSII0: + value->rValue = model->B3SOIPDpsii0; + return(OK); + case B3SOIPD_MOD_PSII1: + value->rValue = model->B3SOIPDpsii1; + return(OK); + case B3SOIPD_MOD_PSII2: + value->rValue = model->B3SOIPDpsii2; + return(OK); + case B3SOIPD_MOD_PSIID: + value->rValue = model->B3SOIPDpsiid; + return(OK); + case B3SOIPD_MOD_PAGIDL: + value->rValue = model->B3SOIPDpagidl; + return(OK); + case B3SOIPD_MOD_PBGIDL: + value->rValue = model->B3SOIPDpbgidl; + return(OK); + case B3SOIPD_MOD_PNGIDL: + value->rValue = model->B3SOIPDpngidl; + return(OK); + case B3SOIPD_MOD_PNTUN: + value->rValue = model->B3SOIPDpntun; + return(OK); + case B3SOIPD_MOD_PNDIODE: + value->rValue = model->B3SOIPDpndiode; + return(OK); + case B3SOIPD_MOD_PNRECF0: + value->rValue = model->B3SOIPDpnrecf0; + return(OK); + case B3SOIPD_MOD_PNRECR0: + value->rValue = model->B3SOIPDpnrecr0; + return(OK); + case B3SOIPD_MOD_PISBJT: + value->rValue = model->B3SOIPDpisbjt; + return(OK); + case B3SOIPD_MOD_PISDIF: + value->rValue = model->B3SOIPDpisdif; + return(OK); + case B3SOIPD_MOD_PISREC: + value->rValue = model->B3SOIPDpisrec; + return(OK); + case B3SOIPD_MOD_PISTUN: + value->rValue = model->B3SOIPDpistun; + return(OK); + case B3SOIPD_MOD_PVREC0: + value->rValue = model->B3SOIPDpvrec0; + return(OK); + case B3SOIPD_MOD_PVTUN0: + value->rValue = model->B3SOIPDpvtun0; + return(OK); + case B3SOIPD_MOD_PNBJT: + value->rValue = model->B3SOIPDpnbjt; + return(OK); + case B3SOIPD_MOD_PLBJT0: + value->rValue = model->B3SOIPDplbjt0; + return(OK); + case B3SOIPD_MOD_PVABJT: + value->rValue = model->B3SOIPDpvabjt; + return(OK); + case B3SOIPD_MOD_PAELY: + value->rValue = model->B3SOIPDpaely; + return(OK); + case B3SOIPD_MOD_PAHLI: + value->rValue = model->B3SOIPDpahli; + return(OK); + /* CV Model */ + case B3SOIPD_MOD_PVSDFB: + value->rValue = model->B3SOIPDpvsdfb; + return(OK); + case B3SOIPD_MOD_PVSDTH: + value->rValue = model->B3SOIPDpvsdth; + return(OK); + case B3SOIPD_MOD_PDELVT: + value->rValue = model->B3SOIPDpdelvt; + return(OK); + case B3SOIPD_MOD_PACDE: + value->rValue = model->B3SOIPDpacde; + return(OK); + case B3SOIPD_MOD_PMOIN: + value->rValue = model->B3SOIPDpmoin; + return(OK); /* Added for binning - END */ - default: - return (E_BADPARM); + default: + return(E_BADPARM); } - /* NOTREACHED */ + /* NOTREACHED */ } + + + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdmdel.c b/src/spicelib/devices/bsim3soi_pd/b3soipdmdel.c index 8e4b62c43..aef381190 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdmdel.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdmdel.c @@ -2,48 +2,47 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soipdmdel.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ #include "ngspice.h" -#include #include "b3soipddef.h" #include "sperror.h" #include "suffix.h" int -B3SOIPDmDelete (inModel, modname, kill) - GENmodel **inModel; - IFuid modname; - GENmodel *kill; +B3SOIPDmDelete(GENmodel **inModel, IFuid modname, GENmodel *kill) { - B3SOIPDmodel **model = (B3SOIPDmodel **) inModel; - B3SOIPDmodel *modfast = (B3SOIPDmodel *) kill; - B3SOIPDinstance *here; - B3SOIPDinstance *prev = NULL; - B3SOIPDmodel **oldmod; - - oldmod = model; - for (; *model; model = &((*model)->B3SOIPDnextModel)) - { - if ((*model)->B3SOIPDmodName == modname || - (modfast && *model == modfast)) - goto delgot; - oldmod = model; +B3SOIPDmodel **model = (B3SOIPDmodel**)inModel; +B3SOIPDmodel *modfast = (B3SOIPDmodel*)kill; +B3SOIPDinstance *here; +B3SOIPDinstance *prev = NULL; +B3SOIPDmodel **oldmod; + + oldmod = model; + for (; *model ; model = &((*model)->B3SOIPDnextModel)) + { if ((*model)->B3SOIPDmodName == modname || + (modfast && *model == modfast)) + goto delgot; + oldmod = model; } - return (E_NOMOD); + return(E_NOMOD); delgot: - *oldmod = (*model)->B3SOIPDnextModel; /* cut deleted device out of list */ - for (here = (*model)->B3SOIPDinstances; here; - here = here->B3SOIPDnextInstance) - { - if (prev) - FREE (prev); - prev = here; + *oldmod = (*model)->B3SOIPDnextModel; /* cut deleted device out of list */ + for (here = (*model)->B3SOIPDinstances; here; here = here->B3SOIPDnextInstance) + { if(prev) FREE(prev); + prev = here; } - if (prev) - FREE (prev); - FREE (*model); - return (OK); + if(prev) FREE(prev); + FREE(*model); + return(OK); } + + + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdmpar.c b/src/spicelib/devices/bsim3soi_pd/b3soipdmpar.c index 6913d7665..1ea450199 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdmpar.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdmpar.c @@ -6,11 +6,17 @@ Modified by Pin Su and Jan Feng 99/2/15 Modified by Pin Su 99/4/30 Modified by Wei Jin 99/9/27 Modified by Pin Su 00/3/1 +Modified by Pin Su 01/2/15 +Modified by Pin Su 02/3/5 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ #include "ngspice.h" -#include #include "b3soipddef.h" #include "ifsim.h" #include "sperror.h" @@ -18,1900 +24,1937 @@ Modified by Pin Su 00/3/1 int -B3SOIPDmParam (param, value, inMod) - int param; - IFvalue *value; - GENmodel *inMod; +B3SOIPDmParam(int param, IFvalue *value, GENmodel *inMod) { - B3SOIPDmodel *mod = (B3SOIPDmodel *) inMod; - switch (param) - { + B3SOIPDmodel *mod = (B3SOIPDmodel*)inMod; + switch(param) + { + + case B3SOIPD_MOD_MOBMOD : + mod->B3SOIPDmobMod = value->iValue; + mod->B3SOIPDmobModGiven = TRUE; + break; + case B3SOIPD_MOD_BINUNIT : + mod->B3SOIPDbinUnit = value->iValue; + mod->B3SOIPDbinUnitGiven = TRUE; + break; + case B3SOIPD_MOD_PARAMCHK : + mod->B3SOIPDparamChk = value->iValue; + mod->B3SOIPDparamChkGiven = TRUE; + break; + case B3SOIPD_MOD_CAPMOD : + mod->B3SOIPDcapMod = value->iValue; + mod->B3SOIPDcapModGiven = TRUE; + break; + case B3SOIPD_MOD_SHMOD : + mod->B3SOIPDshMod = value->iValue; + mod->B3SOIPDshModGiven = TRUE; + break; + case B3SOIPD_MOD_NOIMOD : + mod->B3SOIPDnoiMod = value->iValue; + mod->B3SOIPDnoiModGiven = TRUE; + break; + case B3SOIPD_MOD_VERSION : + mod->B3SOIPDversion = value->rValue; + mod->B3SOIPDversionGiven = TRUE; + break; + case B3SOIPD_MOD_TOX : + mod->B3SOIPDtox = value->rValue; + mod->B3SOIPDtoxGiven = TRUE; + break; +/* v2.2.3 */ + case B3SOIPD_MOD_DTOXCV : + mod->B3SOIPDdtoxcv = value->rValue; + mod->B3SOIPDdtoxcvGiven = TRUE; + break; - case B3SOIPD_MOD_MOBMOD: - mod->B3SOIPDmobMod = value->iValue; - mod->B3SOIPDmobModGiven = TRUE; - break; - case B3SOIPD_MOD_BINUNIT: - mod->B3SOIPDbinUnit = value->iValue; - mod->B3SOIPDbinUnitGiven = TRUE; - break; - case B3SOIPD_MOD_PARAMCHK: - mod->B3SOIPDparamChk = value->iValue; - mod->B3SOIPDparamChkGiven = TRUE; - break; - case B3SOIPD_MOD_CAPMOD: - mod->B3SOIPDcapMod = value->iValue; - mod->B3SOIPDcapModGiven = TRUE; - break; - case B3SOIPD_MOD_SHMOD: - mod->B3SOIPDshMod = value->iValue; - mod->B3SOIPDshModGiven = TRUE; - break; - case B3SOIPD_MOD_NOIMOD: - mod->B3SOIPDnoiMod = value->iValue; - mod->B3SOIPDnoiModGiven = TRUE; - break; - case B3SOIPD_MOD_VERSION: - mod->B3SOIPDversion = value->rValue; - mod->B3SOIPDversionGiven = TRUE; - break; - case B3SOIPD_MOD_TOX: - mod->B3SOIPDtox = value->rValue; - mod->B3SOIPDtoxGiven = TRUE; - break; + case B3SOIPD_MOD_CDSC : + mod->B3SOIPDcdsc = value->rValue; + mod->B3SOIPDcdscGiven = TRUE; + break; + case B3SOIPD_MOD_CDSCB : + mod->B3SOIPDcdscb = value->rValue; + mod->B3SOIPDcdscbGiven = TRUE; + break; - case B3SOIPD_MOD_CDSC: - mod->B3SOIPDcdsc = value->rValue; - mod->B3SOIPDcdscGiven = TRUE; - break; - case B3SOIPD_MOD_CDSCB: - mod->B3SOIPDcdscb = value->rValue; - mod->B3SOIPDcdscbGiven = TRUE; - break; + case B3SOIPD_MOD_CDSCD : + mod->B3SOIPDcdscd = value->rValue; + mod->B3SOIPDcdscdGiven = TRUE; + break; - case B3SOIPD_MOD_CDSCD: - mod->B3SOIPDcdscd = value->rValue; - mod->B3SOIPDcdscdGiven = TRUE; - break; + case B3SOIPD_MOD_CIT : + mod->B3SOIPDcit = value->rValue; + mod->B3SOIPDcitGiven = TRUE; + break; + case B3SOIPD_MOD_NFACTOR : + mod->B3SOIPDnfactor = value->rValue; + mod->B3SOIPDnfactorGiven = TRUE; + break; + case B3SOIPD_MOD_VSAT: + mod->B3SOIPDvsat = value->rValue; + mod->B3SOIPDvsatGiven = TRUE; + break; + case B3SOIPD_MOD_A0: + mod->B3SOIPDa0 = value->rValue; + mod->B3SOIPDa0Given = TRUE; + break; + + case B3SOIPD_MOD_AGS: + mod->B3SOIPDags= value->rValue; + mod->B3SOIPDagsGiven = TRUE; + break; + + case B3SOIPD_MOD_A1: + mod->B3SOIPDa1 = value->rValue; + mod->B3SOIPDa1Given = TRUE; + break; + case B3SOIPD_MOD_A2: + mod->B3SOIPDa2 = value->rValue; + mod->B3SOIPDa2Given = TRUE; + break; + case B3SOIPD_MOD_AT: + mod->B3SOIPDat = value->rValue; + mod->B3SOIPDatGiven = TRUE; + break; + case B3SOIPD_MOD_KETA: + mod->B3SOIPDketa = value->rValue; + mod->B3SOIPDketaGiven = TRUE; + break; + case B3SOIPD_MOD_NSUB: + mod->B3SOIPDnsub = value->rValue; + mod->B3SOIPDnsubGiven = TRUE; + break; + case B3SOIPD_MOD_NPEAK: + mod->B3SOIPDnpeak = value->rValue; + mod->B3SOIPDnpeakGiven = TRUE; + if (mod->B3SOIPDnpeak > 1.0e20) + mod->B3SOIPDnpeak *= 1.0e-6; + break; + case B3SOIPD_MOD_NGATE: + mod->B3SOIPDngate = value->rValue; + mod->B3SOIPDngateGiven = TRUE; + if (mod->B3SOIPDngate > 1.0e23) + mod->B3SOIPDngate *= 1.0e-6; + break; + case B3SOIPD_MOD_GAMMA1: + mod->B3SOIPDgamma1 = value->rValue; + mod->B3SOIPDgamma1Given = TRUE; + break; + case B3SOIPD_MOD_GAMMA2: + mod->B3SOIPDgamma2 = value->rValue; + mod->B3SOIPDgamma2Given = TRUE; + break; + case B3SOIPD_MOD_VBX: + mod->B3SOIPDvbx = value->rValue; + mod->B3SOIPDvbxGiven = TRUE; + break; + case B3SOIPD_MOD_VBM: + mod->B3SOIPDvbm = value->rValue; + mod->B3SOIPDvbmGiven = TRUE; + break; + case B3SOIPD_MOD_XT: + mod->B3SOIPDxt = value->rValue; + mod->B3SOIPDxtGiven = TRUE; + break; + case B3SOIPD_MOD_K1: + mod->B3SOIPDk1 = value->rValue; + mod->B3SOIPDk1Given = TRUE; + break; + case B3SOIPD_MOD_KT1: + mod->B3SOIPDkt1 = value->rValue; + mod->B3SOIPDkt1Given = TRUE; + break; + case B3SOIPD_MOD_KT1L: + mod->B3SOIPDkt1l = value->rValue; + mod->B3SOIPDkt1lGiven = TRUE; + break; + case B3SOIPD_MOD_KT2: + mod->B3SOIPDkt2 = value->rValue; + mod->B3SOIPDkt2Given = TRUE; + break; + case B3SOIPD_MOD_K2: + mod->B3SOIPDk2 = value->rValue; + mod->B3SOIPDk2Given = TRUE; + break; + case B3SOIPD_MOD_K3: + mod->B3SOIPDk3 = value->rValue; + mod->B3SOIPDk3Given = TRUE; + break; + case B3SOIPD_MOD_K3B: + mod->B3SOIPDk3b = value->rValue; + mod->B3SOIPDk3bGiven = TRUE; + break; + case B3SOIPD_MOD_NLX: + mod->B3SOIPDnlx = value->rValue; + mod->B3SOIPDnlxGiven = TRUE; + break; + case B3SOIPD_MOD_W0: + mod->B3SOIPDw0 = value->rValue; + mod->B3SOIPDw0Given = TRUE; + break; + case B3SOIPD_MOD_DVT0: + mod->B3SOIPDdvt0 = value->rValue; + mod->B3SOIPDdvt0Given = TRUE; + break; + case B3SOIPD_MOD_DVT1: + mod->B3SOIPDdvt1 = value->rValue; + mod->B3SOIPDdvt1Given = TRUE; + break; + case B3SOIPD_MOD_DVT2: + mod->B3SOIPDdvt2 = value->rValue; + mod->B3SOIPDdvt2Given = TRUE; + break; + case B3SOIPD_MOD_DVT0W: + mod->B3SOIPDdvt0w = value->rValue; + mod->B3SOIPDdvt0wGiven = TRUE; + break; + case B3SOIPD_MOD_DVT1W: + mod->B3SOIPDdvt1w = value->rValue; + mod->B3SOIPDdvt1wGiven = TRUE; + break; + case B3SOIPD_MOD_DVT2W: + mod->B3SOIPDdvt2w = value->rValue; + mod->B3SOIPDdvt2wGiven = TRUE; + break; + case B3SOIPD_MOD_DROUT: + mod->B3SOIPDdrout = value->rValue; + mod->B3SOIPDdroutGiven = TRUE; + break; + case B3SOIPD_MOD_DSUB: + mod->B3SOIPDdsub = value->rValue; + mod->B3SOIPDdsubGiven = TRUE; + break; + case B3SOIPD_MOD_VTH0: + mod->B3SOIPDvth0 = value->rValue; + mod->B3SOIPDvth0Given = TRUE; + break; + case B3SOIPD_MOD_UA: + mod->B3SOIPDua = value->rValue; + mod->B3SOIPDuaGiven = TRUE; + break; + case B3SOIPD_MOD_UA1: + mod->B3SOIPDua1 = value->rValue; + mod->B3SOIPDua1Given = TRUE; + break; + case B3SOIPD_MOD_UB: + mod->B3SOIPDub = value->rValue; + mod->B3SOIPDubGiven = TRUE; + break; + case B3SOIPD_MOD_UB1: + mod->B3SOIPDub1 = value->rValue; + mod->B3SOIPDub1Given = TRUE; + break; + case B3SOIPD_MOD_UC: + mod->B3SOIPDuc = value->rValue; + mod->B3SOIPDucGiven = TRUE; + break; + case B3SOIPD_MOD_UC1: + mod->B3SOIPDuc1 = value->rValue; + mod->B3SOIPDuc1Given = TRUE; + break; + case B3SOIPD_MOD_U0 : + mod->B3SOIPDu0 = value->rValue; + mod->B3SOIPDu0Given = TRUE; + break; + case B3SOIPD_MOD_UTE : + mod->B3SOIPDute = value->rValue; + mod->B3SOIPDuteGiven = TRUE; + break; + case B3SOIPD_MOD_VOFF: + mod->B3SOIPDvoff = value->rValue; + mod->B3SOIPDvoffGiven = TRUE; + break; + case B3SOIPD_MOD_DELTA : + mod->B3SOIPDdelta = value->rValue; + mod->B3SOIPDdeltaGiven = TRUE; + break; + case B3SOIPD_MOD_RDSW: + mod->B3SOIPDrdsw = value->rValue; + mod->B3SOIPDrdswGiven = TRUE; + break; + case B3SOIPD_MOD_PRWG: + mod->B3SOIPDprwg = value->rValue; + mod->B3SOIPDprwgGiven = TRUE; + break; + case B3SOIPD_MOD_PRWB: + mod->B3SOIPDprwb = value->rValue; + mod->B3SOIPDprwbGiven = TRUE; + break; + case B3SOIPD_MOD_PRT: + mod->B3SOIPDprt = value->rValue; + mod->B3SOIPDprtGiven = TRUE; + break; + case B3SOIPD_MOD_ETA0: + mod->B3SOIPDeta0 = value->rValue; + mod->B3SOIPDeta0Given = TRUE; + break; + case B3SOIPD_MOD_ETAB: + mod->B3SOIPDetab = value->rValue; + mod->B3SOIPDetabGiven = TRUE; + break; + case B3SOIPD_MOD_PCLM: + mod->B3SOIPDpclm = value->rValue; + mod->B3SOIPDpclmGiven = TRUE; + break; + case B3SOIPD_MOD_PDIBL1: + mod->B3SOIPDpdibl1 = value->rValue; + mod->B3SOIPDpdibl1Given = TRUE; + break; + case B3SOIPD_MOD_PDIBL2: + mod->B3SOIPDpdibl2 = value->rValue; + mod->B3SOIPDpdibl2Given = TRUE; + break; + case B3SOIPD_MOD_PDIBLB: + mod->B3SOIPDpdiblb = value->rValue; + mod->B3SOIPDpdiblbGiven = TRUE; + break; + case B3SOIPD_MOD_PVAG: + mod->B3SOIPDpvag = value->rValue; + mod->B3SOIPDpvagGiven = TRUE; + break; + case B3SOIPD_MOD_WR : + mod->B3SOIPDwr = value->rValue; + mod->B3SOIPDwrGiven = TRUE; + break; + case B3SOIPD_MOD_DWG : + mod->B3SOIPDdwg = value->rValue; + mod->B3SOIPDdwgGiven = TRUE; + break; + case B3SOIPD_MOD_DWB : + mod->B3SOIPDdwb = value->rValue; + mod->B3SOIPDdwbGiven = TRUE; + break; + case B3SOIPD_MOD_B0 : + mod->B3SOIPDb0 = value->rValue; + mod->B3SOIPDb0Given = TRUE; + break; + case B3SOIPD_MOD_B1 : + mod->B3SOIPDb1 = value->rValue; + mod->B3SOIPDb1Given = TRUE; + break; + case B3SOIPD_MOD_ALPHA0 : + mod->B3SOIPDalpha0 = value->rValue; + mod->B3SOIPDalpha0Given = TRUE; + break; - case B3SOIPD_MOD_CIT: - mod->B3SOIPDcit = value->rValue; - mod->B3SOIPDcitGiven = TRUE; - break; - case B3SOIPD_MOD_NFACTOR: - mod->B3SOIPDnfactor = value->rValue; - mod->B3SOIPDnfactorGiven = TRUE; - break; - case B3SOIPD_MOD_VSAT: - mod->B3SOIPDvsat = value->rValue; - mod->B3SOIPDvsatGiven = TRUE; - break; - case B3SOIPD_MOD_A0: - mod->B3SOIPDa0 = value->rValue; - mod->B3SOIPDa0Given = TRUE; - break; + case B3SOIPD_MOD_CGSL : + mod->B3SOIPDcgsl = value->rValue; + mod->B3SOIPDcgslGiven = TRUE; + break; + case B3SOIPD_MOD_CGDL : + mod->B3SOIPDcgdl = value->rValue; + mod->B3SOIPDcgdlGiven = TRUE; + break; + case B3SOIPD_MOD_CKAPPA : + mod->B3SOIPDckappa = value->rValue; + mod->B3SOIPDckappaGiven = TRUE; + break; + case B3SOIPD_MOD_CF : + mod->B3SOIPDcf = value->rValue; + mod->B3SOIPDcfGiven = TRUE; + break; + case B3SOIPD_MOD_CLC : + mod->B3SOIPDclc = value->rValue; + mod->B3SOIPDclcGiven = TRUE; + break; + case B3SOIPD_MOD_CLE : + mod->B3SOIPDcle = value->rValue; + mod->B3SOIPDcleGiven = TRUE; + break; + case B3SOIPD_MOD_DWC : + mod->B3SOIPDdwc = value->rValue; + mod->B3SOIPDdwcGiven = TRUE; + break; + case B3SOIPD_MOD_DLC : + mod->B3SOIPDdlc = value->rValue; + mod->B3SOIPDdlcGiven = TRUE; + break; + case B3SOIPD_MOD_TBOX : + mod->B3SOIPDtbox = value->rValue; + mod->B3SOIPDtboxGiven = TRUE; + break; + case B3SOIPD_MOD_TSI : + mod->B3SOIPDtsi = value->rValue; + mod->B3SOIPDtsiGiven = TRUE; + break; + case B3SOIPD_MOD_XJ : + mod->B3SOIPDxj = value->rValue; + mod->B3SOIPDxjGiven = TRUE; + break; + case B3SOIPD_MOD_RBODY : + mod->B3SOIPDrbody = value->rValue; + mod->B3SOIPDrbodyGiven = TRUE; + break; + case B3SOIPD_MOD_RBSH : + mod->B3SOIPDrbsh = value->rValue; + mod->B3SOIPDrbshGiven = TRUE; + break; + case B3SOIPD_MOD_RTH0 : + mod->B3SOIPDrth0 = value->rValue; + mod->B3SOIPDrth0Given = TRUE; + break; + case B3SOIPD_MOD_CTH0 : + mod->B3SOIPDcth0 = value->rValue; + mod->B3SOIPDcth0Given = TRUE; + break; + case B3SOIPD_MOD_NGIDL : + mod->B3SOIPDngidl = value->rValue; + mod->B3SOIPDngidlGiven = TRUE; + break; + case B3SOIPD_MOD_AGIDL : + mod->B3SOIPDagidl = value->rValue; + mod->B3SOIPDagidlGiven = TRUE; + break; + case B3SOIPD_MOD_BGIDL : + mod->B3SOIPDbgidl = value->rValue; + mod->B3SOIPDbgidlGiven = TRUE; + break; + case B3SOIPD_MOD_NDIODE : + mod->B3SOIPDndiode = value->rValue; + mod->B3SOIPDndiodeGiven = TRUE; + break; + case B3SOIPD_MOD_XBJT : + mod->B3SOIPDxbjt = value->rValue; + mod->B3SOIPDxbjtGiven = TRUE; + break; - case B3SOIPD_MOD_AGS: - mod->B3SOIPDags = value->rValue; - mod->B3SOIPDagsGiven = TRUE; - break; + case B3SOIPD_MOD_XDIF : + mod->B3SOIPDxdif = value->rValue; + mod->B3SOIPDxdifGiven = TRUE; + break; - case B3SOIPD_MOD_A1: - mod->B3SOIPDa1 = value->rValue; - mod->B3SOIPDa1Given = TRUE; - break; - case B3SOIPD_MOD_A2: - mod->B3SOIPDa2 = value->rValue; - mod->B3SOIPDa2Given = TRUE; - break; - case B3SOIPD_MOD_AT: - mod->B3SOIPDat = value->rValue; - mod->B3SOIPDatGiven = TRUE; - break; - case B3SOIPD_MOD_KETA: - mod->B3SOIPDketa = value->rValue; - mod->B3SOIPDketaGiven = TRUE; - break; - case B3SOIPD_MOD_NSUB: - mod->B3SOIPDnsub = value->rValue; - mod->B3SOIPDnsubGiven = TRUE; - break; - case B3SOIPD_MOD_NPEAK: - mod->B3SOIPDnpeak = value->rValue; - mod->B3SOIPDnpeakGiven = TRUE; - if (mod->B3SOIPDnpeak > 1.0e20) - mod->B3SOIPDnpeak *= 1.0e-6; - break; - case B3SOIPD_MOD_NGATE: - mod->B3SOIPDngate = value->rValue; - mod->B3SOIPDngateGiven = TRUE; - if (mod->B3SOIPDngate > 1.0e23) - mod->B3SOIPDngate *= 1.0e-6; - break; - case B3SOIPD_MOD_GAMMA1: - mod->B3SOIPDgamma1 = value->rValue; - mod->B3SOIPDgamma1Given = TRUE; - break; - case B3SOIPD_MOD_GAMMA2: - mod->B3SOIPDgamma2 = value->rValue; - mod->B3SOIPDgamma2Given = TRUE; - break; - case B3SOIPD_MOD_VBX: - mod->B3SOIPDvbx = value->rValue; - mod->B3SOIPDvbxGiven = TRUE; - break; - case B3SOIPD_MOD_VBM: - mod->B3SOIPDvbm = value->rValue; - mod->B3SOIPDvbmGiven = TRUE; - break; - case B3SOIPD_MOD_XT: - mod->B3SOIPDxt = value->rValue; - mod->B3SOIPDxtGiven = TRUE; - break; - case B3SOIPD_MOD_K1: - mod->B3SOIPDk1 = value->rValue; - mod->B3SOIPDk1Given = TRUE; - break; - case B3SOIPD_MOD_KT1: - mod->B3SOIPDkt1 = value->rValue; - mod->B3SOIPDkt1Given = TRUE; - break; - case B3SOIPD_MOD_KT1L: - mod->B3SOIPDkt1l = value->rValue; - mod->B3SOIPDkt1lGiven = TRUE; - break; - case B3SOIPD_MOD_KT2: - mod->B3SOIPDkt2 = value->rValue; - mod->B3SOIPDkt2Given = TRUE; - break; - case B3SOIPD_MOD_K2: - mod->B3SOIPDk2 = value->rValue; - mod->B3SOIPDk2Given = TRUE; - break; - case B3SOIPD_MOD_K3: - mod->B3SOIPDk3 = value->rValue; - mod->B3SOIPDk3Given = TRUE; - break; - case B3SOIPD_MOD_K3B: - mod->B3SOIPDk3b = value->rValue; - mod->B3SOIPDk3bGiven = TRUE; - break; - case B3SOIPD_MOD_NLX: - mod->B3SOIPDnlx = value->rValue; - mod->B3SOIPDnlxGiven = TRUE; - break; - case B3SOIPD_MOD_W0: - mod->B3SOIPDw0 = value->rValue; - mod->B3SOIPDw0Given = TRUE; - break; - case B3SOIPD_MOD_DVT0: - mod->B3SOIPDdvt0 = value->rValue; - mod->B3SOIPDdvt0Given = TRUE; - break; - case B3SOIPD_MOD_DVT1: - mod->B3SOIPDdvt1 = value->rValue; - mod->B3SOIPDdvt1Given = TRUE; - break; - case B3SOIPD_MOD_DVT2: - mod->B3SOIPDdvt2 = value->rValue; - mod->B3SOIPDdvt2Given = TRUE; - break; - case B3SOIPD_MOD_DVT0W: - mod->B3SOIPDdvt0w = value->rValue; - mod->B3SOIPDdvt0wGiven = TRUE; - break; - case B3SOIPD_MOD_DVT1W: - mod->B3SOIPDdvt1w = value->rValue; - mod->B3SOIPDdvt1wGiven = TRUE; - break; - case B3SOIPD_MOD_DVT2W: - mod->B3SOIPDdvt2w = value->rValue; - mod->B3SOIPDdvt2wGiven = TRUE; - break; - case B3SOIPD_MOD_DROUT: - mod->B3SOIPDdrout = value->rValue; - mod->B3SOIPDdroutGiven = TRUE; - break; - case B3SOIPD_MOD_DSUB: - mod->B3SOIPDdsub = value->rValue; - mod->B3SOIPDdsubGiven = TRUE; - break; - case B3SOIPD_MOD_VTH0: - mod->B3SOIPDvth0 = value->rValue; - mod->B3SOIPDvth0Given = TRUE; - break; - case B3SOIPD_MOD_UA: - mod->B3SOIPDua = value->rValue; - mod->B3SOIPDuaGiven = TRUE; - break; - case B3SOIPD_MOD_UA1: - mod->B3SOIPDua1 = value->rValue; - mod->B3SOIPDua1Given = TRUE; - break; - case B3SOIPD_MOD_UB: - mod->B3SOIPDub = value->rValue; - mod->B3SOIPDubGiven = TRUE; - break; - case B3SOIPD_MOD_UB1: - mod->B3SOIPDub1 = value->rValue; - mod->B3SOIPDub1Given = TRUE; - break; - case B3SOIPD_MOD_UC: - mod->B3SOIPDuc = value->rValue; - mod->B3SOIPDucGiven = TRUE; - break; - case B3SOIPD_MOD_UC1: - mod->B3SOIPDuc1 = value->rValue; - mod->B3SOIPDuc1Given = TRUE; - break; - case B3SOIPD_MOD_U0: - mod->B3SOIPDu0 = value->rValue; - mod->B3SOIPDu0Given = TRUE; - break; - case B3SOIPD_MOD_UTE: - mod->B3SOIPDute = value->rValue; - mod->B3SOIPDuteGiven = TRUE; - break; - case B3SOIPD_MOD_VOFF: - mod->B3SOIPDvoff = value->rValue; - mod->B3SOIPDvoffGiven = TRUE; - break; - case B3SOIPD_MOD_DELTA: - mod->B3SOIPDdelta = value->rValue; - mod->B3SOIPDdeltaGiven = TRUE; - break; - case B3SOIPD_MOD_RDSW: - mod->B3SOIPDrdsw = value->rValue; - mod->B3SOIPDrdswGiven = TRUE; - break; - case B3SOIPD_MOD_PRWG: - mod->B3SOIPDprwg = value->rValue; - mod->B3SOIPDprwgGiven = TRUE; - break; - case B3SOIPD_MOD_PRWB: - mod->B3SOIPDprwb = value->rValue; - mod->B3SOIPDprwbGiven = TRUE; - break; - case B3SOIPD_MOD_PRT: - mod->B3SOIPDprt = value->rValue; - mod->B3SOIPDprtGiven = TRUE; - break; - case B3SOIPD_MOD_ETA0: - mod->B3SOIPDeta0 = value->rValue; - mod->B3SOIPDeta0Given = TRUE; - break; - case B3SOIPD_MOD_ETAB: - mod->B3SOIPDetab = value->rValue; - mod->B3SOIPDetabGiven = TRUE; - break; - case B3SOIPD_MOD_PCLM: - mod->B3SOIPDpclm = value->rValue; - mod->B3SOIPDpclmGiven = TRUE; - break; - case B3SOIPD_MOD_PDIBL1: - mod->B3SOIPDpdibl1 = value->rValue; - mod->B3SOIPDpdibl1Given = TRUE; - break; - case B3SOIPD_MOD_PDIBL2: - mod->B3SOIPDpdibl2 = value->rValue; - mod->B3SOIPDpdibl2Given = TRUE; - break; - case B3SOIPD_MOD_PDIBLB: - mod->B3SOIPDpdiblb = value->rValue; - mod->B3SOIPDpdiblbGiven = TRUE; - break; - case B3SOIPD_MOD_PVAG: - mod->B3SOIPDpvag = value->rValue; - mod->B3SOIPDpvagGiven = TRUE; - break; - case B3SOIPD_MOD_WR: - mod->B3SOIPDwr = value->rValue; - mod->B3SOIPDwrGiven = TRUE; - break; - case B3SOIPD_MOD_DWG: - mod->B3SOIPDdwg = value->rValue; - mod->B3SOIPDdwgGiven = TRUE; - break; - case B3SOIPD_MOD_DWB: - mod->B3SOIPDdwb = value->rValue; - mod->B3SOIPDdwbGiven = TRUE; - break; - case B3SOIPD_MOD_B0: - mod->B3SOIPDb0 = value->rValue; - mod->B3SOIPDb0Given = TRUE; - break; - case B3SOIPD_MOD_B1: - mod->B3SOIPDb1 = value->rValue; - mod->B3SOIPDb1Given = TRUE; - break; - case B3SOIPD_MOD_ALPHA0: - mod->B3SOIPDalpha0 = value->rValue; - mod->B3SOIPDalpha0Given = TRUE; - break; + case B3SOIPD_MOD_XREC : + mod->B3SOIPDxrec = value->rValue; + mod->B3SOIPDxrecGiven = TRUE; + break; + case B3SOIPD_MOD_XTUN : + mod->B3SOIPDxtun = value->rValue; + mod->B3SOIPDxtunGiven = TRUE; + break; + case B3SOIPD_MOD_TT : + mod->B3SOIPDtt = value->rValue; + mod->B3SOIPDttGiven = TRUE; + break; + case B3SOIPD_MOD_VSDTH : + mod->B3SOIPDvsdth = value->rValue; + mod->B3SOIPDvsdthGiven = TRUE; + break; + case B3SOIPD_MOD_VSDFB : + mod->B3SOIPDvsdfb = value->rValue; + mod->B3SOIPDvsdfbGiven = TRUE; + break; + case B3SOIPD_MOD_CSDMIN : + mod->B3SOIPDcsdmin = value->rValue; + mod->B3SOIPDcsdminGiven = TRUE; + break; + case B3SOIPD_MOD_ASD : + mod->B3SOIPDasd = value->rValue; + mod->B3SOIPDasdGiven = TRUE; + break; - case B3SOIPD_MOD_CGSL: - mod->B3SOIPDcgsl = value->rValue; - mod->B3SOIPDcgslGiven = TRUE; - break; - case B3SOIPD_MOD_CGDL: - mod->B3SOIPDcgdl = value->rValue; - mod->B3SOIPDcgdlGiven = TRUE; - break; - case B3SOIPD_MOD_CKAPPA: - mod->B3SOIPDckappa = value->rValue; - mod->B3SOIPDckappaGiven = TRUE; - break; - case B3SOIPD_MOD_CF: - mod->B3SOIPDcf = value->rValue; - mod->B3SOIPDcfGiven = TRUE; - break; - case B3SOIPD_MOD_CLC: - mod->B3SOIPDclc = value->rValue; - mod->B3SOIPDclcGiven = TRUE; - break; - case B3SOIPD_MOD_CLE: - mod->B3SOIPDcle = value->rValue; - mod->B3SOIPDcleGiven = TRUE; - break; - case B3SOIPD_MOD_DWC: - mod->B3SOIPDdwc = value->rValue; - mod->B3SOIPDdwcGiven = TRUE; - break; - case B3SOIPD_MOD_DLC: - mod->B3SOIPDdlc = value->rValue; - mod->B3SOIPDdlcGiven = TRUE; - break; - case B3SOIPD_MOD_TBOX: - mod->B3SOIPDtbox = value->rValue; - mod->B3SOIPDtboxGiven = TRUE; - break; - case B3SOIPD_MOD_TSI: - mod->B3SOIPDtsi = value->rValue; - mod->B3SOIPDtsiGiven = TRUE; - break; - case B3SOIPD_MOD_XJ: - mod->B3SOIPDxj = value->rValue; - mod->B3SOIPDxjGiven = TRUE; - break; - case B3SOIPD_MOD_RBODY: - mod->B3SOIPDrbody = value->rValue; - mod->B3SOIPDrbodyGiven = TRUE; - break; - case B3SOIPD_MOD_RBSH: - mod->B3SOIPDrbsh = value->rValue; - mod->B3SOIPDrbshGiven = TRUE; - break; - case B3SOIPD_MOD_RTH0: - mod->B3SOIPDrth0 = value->rValue; - mod->B3SOIPDrth0Given = TRUE; - break; - case B3SOIPD_MOD_CTH0: - mod->B3SOIPDcth0 = value->rValue; - mod->B3SOIPDcth0Given = TRUE; - break; - case B3SOIPD_MOD_NGIDL: - mod->B3SOIPDngidl = value->rValue; - mod->B3SOIPDngidlGiven = TRUE; - break; - case B3SOIPD_MOD_AGIDL: - mod->B3SOIPDagidl = value->rValue; - mod->B3SOIPDagidlGiven = TRUE; - break; - case B3SOIPD_MOD_BGIDL: - mod->B3SOIPDbgidl = value->rValue; - mod->B3SOIPDbgidlGiven = TRUE; - break; - case B3SOIPD_MOD_NDIODE: - mod->B3SOIPDndiode = value->rValue; - mod->B3SOIPDndiodeGiven = TRUE; - break; - case B3SOIPD_MOD_XBJT: - mod->B3SOIPDxbjt = value->rValue; - mod->B3SOIPDxbjtGiven = TRUE; - break; - case B3SOIPD_MOD_XDIF: - mod->B3SOIPDxdif = value->rValue; - mod->B3SOIPDxdifGiven = TRUE; - break; + case B3SOIPD_MOD_TNOM : + mod->B3SOIPDtnom = value->rValue + 273.15; + mod->B3SOIPDtnomGiven = TRUE; + break; + case B3SOIPD_MOD_CGSO : + mod->B3SOIPDcgso = value->rValue; + mod->B3SOIPDcgsoGiven = TRUE; + break; + case B3SOIPD_MOD_CGDO : + mod->B3SOIPDcgdo = value->rValue; + mod->B3SOIPDcgdoGiven = TRUE; + break; + case B3SOIPD_MOD_CGEO : + mod->B3SOIPDcgeo = value->rValue; + mod->B3SOIPDcgeoGiven = TRUE; + break; + case B3SOIPD_MOD_XPART : + mod->B3SOIPDxpart = value->rValue; + mod->B3SOIPDxpartGiven = TRUE; + break; + case B3SOIPD_MOD_RSH : + mod->B3SOIPDsheetResistance = value->rValue; + mod->B3SOIPDsheetResistanceGiven = TRUE; + break; + case B3SOIPD_MOD_PBSWG : + mod->B3SOIPDGatesidewallJctPotential = value->rValue; + mod->B3SOIPDGatesidewallJctPotentialGiven = TRUE; + break; + case B3SOIPD_MOD_MJSWG : + mod->B3SOIPDbodyJctGateSideGradingCoeff = value->rValue; + mod->B3SOIPDbodyJctGateSideGradingCoeffGiven = TRUE; + break; + case B3SOIPD_MOD_CJSWG : + mod->B3SOIPDunitLengthGateSidewallJctCap = value->rValue; + mod->B3SOIPDunitLengthGateSidewallJctCapGiven = TRUE; + break; + case B3SOIPD_MOD_CSDESW : + mod->B3SOIPDcsdesw = value->rValue; + mod->B3SOIPDcsdeswGiven = TRUE; + break; + case B3SOIPD_MOD_LINT : + mod->B3SOIPDLint = value->rValue; + mod->B3SOIPDLintGiven = TRUE; + break; + case B3SOIPD_MOD_LL : + mod->B3SOIPDLl = value->rValue; + mod->B3SOIPDLlGiven = TRUE; + break; +/* v2.2.3 */ + case B3SOIPD_MOD_LLC : + mod->B3SOIPDLlc = value->rValue; + mod->B3SOIPDLlcGiven = TRUE; + break; - case B3SOIPD_MOD_XREC: - mod->B3SOIPDxrec = value->rValue; - mod->B3SOIPDxrecGiven = TRUE; - break; - case B3SOIPD_MOD_XTUN: - mod->B3SOIPDxtun = value->rValue; - mod->B3SOIPDxtunGiven = TRUE; - break; - case B3SOIPD_MOD_TT: - mod->B3SOIPDtt = value->rValue; - mod->B3SOIPDttGiven = TRUE; - break; - case B3SOIPD_MOD_VSDTH: - mod->B3SOIPDvsdth = value->rValue; - mod->B3SOIPDvsdthGiven = TRUE; - break; - case B3SOIPD_MOD_VSDFB: - mod->B3SOIPDvsdfb = value->rValue; - mod->B3SOIPDvsdfbGiven = TRUE; - break; - case B3SOIPD_MOD_CSDMIN: - mod->B3SOIPDcsdmin = value->rValue; - mod->B3SOIPDcsdminGiven = TRUE; - break; - case B3SOIPD_MOD_ASD: - mod->B3SOIPDasd = value->rValue; - mod->B3SOIPDasdGiven = TRUE; - break; + case B3SOIPD_MOD_LLN : + mod->B3SOIPDLln = value->rValue; + mod->B3SOIPDLlnGiven = TRUE; + break; + case B3SOIPD_MOD_LW : + mod->B3SOIPDLw = value->rValue; + mod->B3SOIPDLwGiven = TRUE; + break; +/* v2.2.3 */ + case B3SOIPD_MOD_LWC : + mod->B3SOIPDLwc = value->rValue; + mod->B3SOIPDLwcGiven = TRUE; + break; + case B3SOIPD_MOD_LWN : + mod->B3SOIPDLwn = value->rValue; + mod->B3SOIPDLwnGiven = TRUE; + break; + case B3SOIPD_MOD_LWL : + mod->B3SOIPDLwl = value->rValue; + mod->B3SOIPDLwlGiven = TRUE; + break; +/* v2.2.3 */ + case B3SOIPD_MOD_LWLC : + mod->B3SOIPDLwlc = value->rValue; + mod->B3SOIPDLwlcGiven = TRUE; + break; - case B3SOIPD_MOD_TNOM: - mod->B3SOIPDtnom = value->rValue + 273.15; - mod->B3SOIPDtnomGiven = TRUE; - break; - case B3SOIPD_MOD_CGSO: - mod->B3SOIPDcgso = value->rValue; - mod->B3SOIPDcgsoGiven = TRUE; - break; - case B3SOIPD_MOD_CGDO: - mod->B3SOIPDcgdo = value->rValue; - mod->B3SOIPDcgdoGiven = TRUE; - break; - case B3SOIPD_MOD_CGEO: - mod->B3SOIPDcgeo = value->rValue; - mod->B3SOIPDcgeoGiven = TRUE; - break; - case B3SOIPD_MOD_XPART: - mod->B3SOIPDxpart = value->rValue; - mod->B3SOIPDxpartGiven = TRUE; - break; - case B3SOIPD_MOD_RSH: - mod->B3SOIPDsheetResistance = value->rValue; - mod->B3SOIPDsheetResistanceGiven = TRUE; - break; - case B3SOIPD_MOD_PBSWG: - mod->B3SOIPDGatesidewallJctPotential = value->rValue; - mod->B3SOIPDGatesidewallJctPotentialGiven = TRUE; - break; - case B3SOIPD_MOD_MJSWG: - mod->B3SOIPDbodyJctGateSideGradingCoeff = value->rValue; - mod->B3SOIPDbodyJctGateSideGradingCoeffGiven = TRUE; - break; - case B3SOIPD_MOD_CJSWG: - mod->B3SOIPDunitLengthGateSidewallJctCap = value->rValue; - mod->B3SOIPDunitLengthGateSidewallJctCapGiven = TRUE; - break; - case B3SOIPD_MOD_CSDESW: - mod->B3SOIPDcsdesw = value->rValue; - mod->B3SOIPDcsdeswGiven = TRUE; - break; - case B3SOIPD_MOD_LINT: - mod->B3SOIPDLint = value->rValue; - mod->B3SOIPDLintGiven = TRUE; - break; - case B3SOIPD_MOD_LL: - mod->B3SOIPDLl = value->rValue; - mod->B3SOIPDLlGiven = TRUE; - break; - case B3SOIPD_MOD_LLN: - mod->B3SOIPDLln = value->rValue; - mod->B3SOIPDLlnGiven = TRUE; - break; - case B3SOIPD_MOD_LW: - mod->B3SOIPDLw = value->rValue; - mod->B3SOIPDLwGiven = TRUE; - break; - case B3SOIPD_MOD_LWN: - mod->B3SOIPDLwn = value->rValue; - mod->B3SOIPDLwnGiven = TRUE; - break; - case B3SOIPD_MOD_LWL: - mod->B3SOIPDLwl = value->rValue; - mod->B3SOIPDLwlGiven = TRUE; - break; - case B3SOIPD_MOD_WINT: - mod->B3SOIPDWint = value->rValue; - mod->B3SOIPDWintGiven = TRUE; - break; - case B3SOIPD_MOD_WL: - mod->B3SOIPDWl = value->rValue; - mod->B3SOIPDWlGiven = TRUE; - break; - case B3SOIPD_MOD_WLN: - mod->B3SOIPDWln = value->rValue; - mod->B3SOIPDWlnGiven = TRUE; - break; - case B3SOIPD_MOD_WW: - mod->B3SOIPDWw = value->rValue; - mod->B3SOIPDWwGiven = TRUE; - break; - case B3SOIPD_MOD_WWN: - mod->B3SOIPDWwn = value->rValue; - mod->B3SOIPDWwnGiven = TRUE; - break; - case B3SOIPD_MOD_WWL: - mod->B3SOIPDWwl = value->rValue; - mod->B3SOIPDWwlGiven = TRUE; - break; + case B3SOIPD_MOD_WINT : + mod->B3SOIPDWint = value->rValue; + mod->B3SOIPDWintGiven = TRUE; + break; + case B3SOIPD_MOD_WL : + mod->B3SOIPDWl = value->rValue; + mod->B3SOIPDWlGiven = TRUE; + break; +/* v2.2.3 */ + case B3SOIPD_MOD_WLC : + mod->B3SOIPDWlc = value->rValue; + mod->B3SOIPDWlcGiven = TRUE; + break; - case B3SOIPD_MOD_NOIA: - mod->B3SOIPDoxideTrapDensityA = value->rValue; - mod->B3SOIPDoxideTrapDensityAGiven = TRUE; - break; - case B3SOIPD_MOD_NOIB: - mod->B3SOIPDoxideTrapDensityB = value->rValue; - mod->B3SOIPDoxideTrapDensityBGiven = TRUE; - break; - case B3SOIPD_MOD_NOIC: - mod->B3SOIPDoxideTrapDensityC = value->rValue; - mod->B3SOIPDoxideTrapDensityCGiven = TRUE; - break; - case B3SOIPD_MOD_NOIF: - mod->B3SOIPDnoif = value->rValue; - mod->B3SOIPDnoifGiven = TRUE; - break; - case B3SOIPD_MOD_EM: - mod->B3SOIPDem = value->rValue; - mod->B3SOIPDemGiven = TRUE; - break; - case B3SOIPD_MOD_EF: - mod->B3SOIPDef = value->rValue; - mod->B3SOIPDefGiven = TRUE; - break; - case B3SOIPD_MOD_AF: - mod->B3SOIPDaf = value->rValue; - mod->B3SOIPDafGiven = TRUE; - break; - case B3SOIPD_MOD_KF: - mod->B3SOIPDkf = value->rValue; - mod->B3SOIPDkfGiven = TRUE; - break; + case B3SOIPD_MOD_WLN : + mod->B3SOIPDWln = value->rValue; + mod->B3SOIPDWlnGiven = TRUE; + break; + case B3SOIPD_MOD_WW : + mod->B3SOIPDWw = value->rValue; + mod->B3SOIPDWwGiven = TRUE; + break; +/* v2.2.3 */ + case B3SOIPD_MOD_WWC : + mod->B3SOIPDWwc = value->rValue; + mod->B3SOIPDWwcGiven = TRUE; + break; + + case B3SOIPD_MOD_WWN : + mod->B3SOIPDWwn = value->rValue; + mod->B3SOIPDWwnGiven = TRUE; + break; + case B3SOIPD_MOD_WWL : + mod->B3SOIPDWwl = value->rValue; + mod->B3SOIPDWwlGiven = TRUE; + break; +/* v2.2.3 */ + case B3SOIPD_MOD_WWLC : + mod->B3SOIPDWwlc = value->rValue; + mod->B3SOIPDWwlcGiven = TRUE; + break; + + case B3SOIPD_MOD_NOIA : + mod->B3SOIPDoxideTrapDensityA = value->rValue; + mod->B3SOIPDoxideTrapDensityAGiven = TRUE; + break; + case B3SOIPD_MOD_NOIB : + mod->B3SOIPDoxideTrapDensityB = value->rValue; + mod->B3SOIPDoxideTrapDensityBGiven = TRUE; + break; + case B3SOIPD_MOD_NOIC : + mod->B3SOIPDoxideTrapDensityC = value->rValue; + mod->B3SOIPDoxideTrapDensityCGiven = TRUE; + break; + case B3SOIPD_MOD_NOIF : + mod->B3SOIPDnoif = value->rValue; + mod->B3SOIPDnoifGiven = TRUE; + break; + case B3SOIPD_MOD_EM : + mod->B3SOIPDem = value->rValue; + mod->B3SOIPDemGiven = TRUE; + break; + case B3SOIPD_MOD_EF : + mod->B3SOIPDef = value->rValue; + mod->B3SOIPDefGiven = TRUE; + break; + case B3SOIPD_MOD_AF : + mod->B3SOIPDaf = value->rValue; + mod->B3SOIPDafGiven = TRUE; + break; + case B3SOIPD_MOD_KF : + mod->B3SOIPDkf = value->rValue; + mod->B3SOIPDkfGiven = TRUE; + break; /* v2.2 release */ - case B3SOIPD_MOD_WTH0: - mod->B3SOIPDwth0 = value->rValue; - mod->B3SOIPDwth0Given = TRUE; - break; - case B3SOIPD_MOD_RHALO: - mod->B3SOIPDrhalo = value->rValue; - mod->B3SOIPDrhaloGiven = TRUE; - break; - case B3SOIPD_MOD_NTOX: - mod->B3SOIPDntox = value->rValue; - mod->B3SOIPDntoxGiven = TRUE; - break; - case B3SOIPD_MOD_TOXREF: - mod->B3SOIPDtoxref = value->rValue; - mod->B3SOIPDtoxrefGiven = TRUE; - break; - case B3SOIPD_MOD_EBG: - mod->B3SOIPDebg = value->rValue; - mod->B3SOIPDebgGiven = TRUE; - break; - case B3SOIPD_MOD_NEVB: - mod->B3SOIPDnevb = value->rValue; - mod->B3SOIPDnevbGiven = TRUE; - break; - case B3SOIPD_MOD_ALPHAGB1: - mod->B3SOIPDalphaGB1 = value->rValue; - mod->B3SOIPDalphaGB1Given = TRUE; - break; - case B3SOIPD_MOD_BETAGB1: - mod->B3SOIPDbetaGB1 = value->rValue; - mod->B3SOIPDbetaGB1Given = TRUE; - break; - case B3SOIPD_MOD_VGB1: - mod->B3SOIPDvgb1 = value->rValue; - mod->B3SOIPDvgb1Given = TRUE; - break; - case B3SOIPD_MOD_NECB: - mod->B3SOIPDnecb = value->rValue; - mod->B3SOIPDnecbGiven = TRUE; - break; - case B3SOIPD_MOD_ALPHAGB2: - mod->B3SOIPDalphaGB2 = value->rValue; - mod->B3SOIPDalphaGB2Given = TRUE; - break; - case B3SOIPD_MOD_BETAGB2: - mod->B3SOIPDbetaGB2 = value->rValue; - mod->B3SOIPDbetaGB2Given = TRUE; - break; - case B3SOIPD_MOD_VGB2: - mod->B3SOIPDvgb2 = value->rValue; - mod->B3SOIPDvgb2Given = TRUE; - break; - case B3SOIPD_MOD_TOXQM: - mod->B3SOIPDtoxqm = value->rValue; - mod->B3SOIPDtoxqmGiven = TRUE; - break; - case B3SOIPD_MOD_VOXH: - mod->B3SOIPDvoxh = value->rValue; - mod->B3SOIPDvoxhGiven = TRUE; - break; - case B3SOIPD_MOD_DELTAVOX: - mod->B3SOIPDdeltavox = value->rValue; - mod->B3SOIPDdeltavoxGiven = TRUE; - break; - case B3SOIPD_MOD_IGMOD: - mod->B3SOIPDigMod = value->iValue; - mod->B3SOIPDigModGiven = TRUE; - break; + case B3SOIPD_MOD_WTH0 : + mod->B3SOIPDwth0 = value->rValue; + mod->B3SOIPDwth0Given = TRUE; + break; + case B3SOIPD_MOD_RHALO : + mod->B3SOIPDrhalo = value->rValue; + mod->B3SOIPDrhaloGiven = TRUE; + break; + case B3SOIPD_MOD_NTOX : + mod->B3SOIPDntox = value->rValue; + mod->B3SOIPDntoxGiven = TRUE; + break; + case B3SOIPD_MOD_TOXREF : + mod->B3SOIPDtoxref = value->rValue; + mod->B3SOIPDtoxrefGiven = TRUE; + break; + case B3SOIPD_MOD_EBG : + mod->B3SOIPDebg = value->rValue; + mod->B3SOIPDebgGiven = TRUE; + break; + case B3SOIPD_MOD_VEVB : + mod->B3SOIPDvevb = value->rValue; + mod->B3SOIPDvevbGiven = TRUE; + break; + case B3SOIPD_MOD_ALPHAGB1 : + mod->B3SOIPDalphaGB1 = value->rValue; + mod->B3SOIPDalphaGB1Given = TRUE; + break; + case B3SOIPD_MOD_BETAGB1 : + mod->B3SOIPDbetaGB1 = value->rValue; + mod->B3SOIPDbetaGB1Given = TRUE; + break; + case B3SOIPD_MOD_VGB1 : + mod->B3SOIPDvgb1 = value->rValue; + mod->B3SOIPDvgb1Given = TRUE; + break; + case B3SOIPD_MOD_VECB : + mod->B3SOIPDvecb = value->rValue; + mod->B3SOIPDvecbGiven = TRUE; + break; + case B3SOIPD_MOD_ALPHAGB2 : + mod->B3SOIPDalphaGB2 = value->rValue; + mod->B3SOIPDalphaGB2Given = TRUE; + break; + case B3SOIPD_MOD_BETAGB2 : + mod->B3SOIPDbetaGB2 = value->rValue; + mod->B3SOIPDbetaGB2Given = TRUE; + break; + case B3SOIPD_MOD_VGB2 : + mod->B3SOIPDvgb2 = value->rValue; + mod->B3SOIPDvgb2Given = TRUE; + break; + case B3SOIPD_MOD_TOXQM : + mod->B3SOIPDtoxqm = value->rValue; + mod->B3SOIPDtoxqmGiven = TRUE; + break; + case B3SOIPD_MOD_VOXH : + mod->B3SOIPDvoxh = value->rValue; + mod->B3SOIPDvoxhGiven = TRUE; + break; + case B3SOIPD_MOD_DELTAVOX : + mod->B3SOIPDdeltavox = value->rValue; + mod->B3SOIPDdeltavoxGiven = TRUE; + break; + case B3SOIPD_MOD_IGMOD : + mod->B3SOIPDigMod = value->iValue; + mod->B3SOIPDigModGiven = TRUE; + break; /* v2.0 release */ - case B3SOIPD_MOD_K1W1: - mod->B3SOIPDk1w1 = value->rValue; - mod->B3SOIPDk1w1Given = TRUE; - break; - case B3SOIPD_MOD_K1W2: - mod->B3SOIPDk1w2 = value->rValue; - mod->B3SOIPDk1w2Given = TRUE; - break; - case B3SOIPD_MOD_KETAS: - mod->B3SOIPDketas = value->rValue; - mod->B3SOIPDketasGiven = TRUE; - break; - case B3SOIPD_MOD_DWBC: - mod->B3SOIPDdwbc = value->rValue; - mod->B3SOIPDdwbcGiven = TRUE; - break; - case B3SOIPD_MOD_BETA0: - mod->B3SOIPDbeta0 = value->rValue; - mod->B3SOIPDbeta0Given = TRUE; - break; - case B3SOIPD_MOD_BETA1: - mod->B3SOIPDbeta1 = value->rValue; - mod->B3SOIPDbeta1Given = TRUE; - break; - case B3SOIPD_MOD_BETA2: - mod->B3SOIPDbeta2 = value->rValue; - mod->B3SOIPDbeta2Given = TRUE; - break; - case B3SOIPD_MOD_VDSATII0: - mod->B3SOIPDvdsatii0 = value->rValue; - mod->B3SOIPDvdsatii0Given = TRUE; - break; - case B3SOIPD_MOD_TII: - mod->B3SOIPDtii = value->rValue; - mod->B3SOIPDtiiGiven = TRUE; - break; - case B3SOIPD_MOD_LII: - mod->B3SOIPDlii = value->rValue; - mod->B3SOIPDliiGiven = TRUE; - break; - case B3SOIPD_MOD_SII0: - mod->B3SOIPDsii0 = value->rValue; - mod->B3SOIPDsii0Given = TRUE; - break; - case B3SOIPD_MOD_SII1: - mod->B3SOIPDsii1 = value->rValue; - mod->B3SOIPDsii1Given = TRUE; - break; - case B3SOIPD_MOD_SII2: - mod->B3SOIPDsii2 = value->rValue; - mod->B3SOIPDsii2Given = TRUE; - break; - case B3SOIPD_MOD_SIID: - mod->B3SOIPDsiid = value->rValue; - mod->B3SOIPDsiidGiven = TRUE; - break; - case B3SOIPD_MOD_FBJTII: - mod->B3SOIPDfbjtii = value->rValue; - mod->B3SOIPDfbjtiiGiven = TRUE; - break; - case B3SOIPD_MOD_ESATII: - mod->B3SOIPDesatii = value->rValue; - mod->B3SOIPDesatiiGiven = TRUE; - break; - case B3SOIPD_MOD_NTUN: - mod->B3SOIPDntun = value->rValue; - mod->B3SOIPDntunGiven = TRUE; - break; - case B3SOIPD_MOD_NRECF0: - mod->B3SOIPDnrecf0 = value->rValue; - mod->B3SOIPDnrecf0Given = TRUE; - break; - case B3SOIPD_MOD_NRECR0: - mod->B3SOIPDnrecr0 = value->rValue; - mod->B3SOIPDnrecr0Given = TRUE; - break; - case B3SOIPD_MOD_ISBJT: - mod->B3SOIPDisbjt = value->rValue; - mod->B3SOIPDisbjtGiven = TRUE; - break; - case B3SOIPD_MOD_ISDIF: - mod->B3SOIPDisdif = value->rValue; - mod->B3SOIPDisdifGiven = TRUE; - break; - case B3SOIPD_MOD_ISREC: - mod->B3SOIPDisrec = value->rValue; - mod->B3SOIPDisrecGiven = TRUE; - break; - case B3SOIPD_MOD_ISTUN: - mod->B3SOIPDistun = value->rValue; - mod->B3SOIPDistunGiven = TRUE; - break; - case B3SOIPD_MOD_LN: - mod->B3SOIPDln = value->rValue; - mod->B3SOIPDlnGiven = TRUE; - break; - case B3SOIPD_MOD_VREC0: - mod->B3SOIPDvrec0 = value->rValue; - mod->B3SOIPDvrec0Given = TRUE; - break; - case B3SOIPD_MOD_VTUN0: - mod->B3SOIPDvtun0 = value->rValue; - mod->B3SOIPDvtun0Given = TRUE; - break; - case B3SOIPD_MOD_NBJT: - mod->B3SOIPDnbjt = value->rValue; - mod->B3SOIPDnbjtGiven = TRUE; - break; - case B3SOIPD_MOD_LBJT0: - mod->B3SOIPDlbjt0 = value->rValue; - mod->B3SOIPDlbjt0Given = TRUE; - break; - case B3SOIPD_MOD_LDIF0: - mod->B3SOIPDldif0 = value->rValue; - mod->B3SOIPDldif0Given = TRUE; - break; - case B3SOIPD_MOD_VABJT: - mod->B3SOIPDvabjt = value->rValue; - mod->B3SOIPDvabjtGiven = TRUE; - break; - case B3SOIPD_MOD_AELY: - mod->B3SOIPDaely = value->rValue; - mod->B3SOIPDaelyGiven = TRUE; - break; - case B3SOIPD_MOD_AHLI: - mod->B3SOIPDahli = value->rValue; - mod->B3SOIPDahliGiven = TRUE; - break; - case B3SOIPD_MOD_NDIF: - mod->B3SOIPDndif = value->rValue; - mod->B3SOIPDndifGiven = TRUE; - break; - case B3SOIPD_MOD_NTRECF: - mod->B3SOIPDntrecf = value->rValue; - mod->B3SOIPDntrecfGiven = TRUE; - break; - case B3SOIPD_MOD_NTRECR: - mod->B3SOIPDntrecr = value->rValue; - mod->B3SOIPDntrecrGiven = TRUE; - break; - case B3SOIPD_MOD_DLCB: - mod->B3SOIPDdlcb = value->rValue; - mod->B3SOIPDdlcbGiven = TRUE; - break; - case B3SOIPD_MOD_FBODY: - mod->B3SOIPDfbody = value->rValue; - mod->B3SOIPDfbodyGiven = TRUE; - break; - case B3SOIPD_MOD_TCJSWG: - mod->B3SOIPDtcjswg = value->rValue; - mod->B3SOIPDtcjswgGiven = TRUE; - break; - case B3SOIPD_MOD_TPBSWG: - mod->B3SOIPDtpbswg = value->rValue; - mod->B3SOIPDtpbswgGiven = TRUE; - break; - case B3SOIPD_MOD_ACDE: - mod->B3SOIPDacde = value->rValue; - mod->B3SOIPDacdeGiven = TRUE; - break; - case B3SOIPD_MOD_MOIN: - mod->B3SOIPDmoin = value->rValue; - mod->B3SOIPDmoinGiven = TRUE; - break; - case B3SOIPD_MOD_DELVT: - mod->B3SOIPDdelvt = value->rValue; - mod->B3SOIPDdelvtGiven = TRUE; - break; - case B3SOIPD_MOD_KB1: - mod->B3SOIPDkb1 = value->rValue; - mod->B3SOIPDkb1Given = TRUE; - break; - case B3SOIPD_MOD_DLBG: - mod->B3SOIPDdlbg = value->rValue; - mod->B3SOIPDdlbgGiven = TRUE; - break; + case B3SOIPD_MOD_K1W1 : + mod->B3SOIPDk1w1 = value->rValue; + mod->B3SOIPDk1w1Given = TRUE; + break; + case B3SOIPD_MOD_K1W2 : + mod->B3SOIPDk1w2 = value->rValue; + mod->B3SOIPDk1w2Given = TRUE; + break; + case B3SOIPD_MOD_KETAS : + mod->B3SOIPDketas = value->rValue; + mod->B3SOIPDketasGiven = TRUE; + break; + case B3SOIPD_MOD_DWBC : + mod->B3SOIPDdwbc = value->rValue; + mod->B3SOIPDdwbcGiven = TRUE; + break; + case B3SOIPD_MOD_BETA0 : + mod->B3SOIPDbeta0 = value->rValue; + mod->B3SOIPDbeta0Given = TRUE; + break; + case B3SOIPD_MOD_BETA1 : + mod->B3SOIPDbeta1 = value->rValue; + mod->B3SOIPDbeta1Given = TRUE; + break; + case B3SOIPD_MOD_BETA2 : + mod->B3SOIPDbeta2 = value->rValue; + mod->B3SOIPDbeta2Given = TRUE; + break; + case B3SOIPD_MOD_VDSATII0 : + mod->B3SOIPDvdsatii0 = value->rValue; + mod->B3SOIPDvdsatii0Given = TRUE; + break; + case B3SOIPD_MOD_TII : + mod->B3SOIPDtii = value->rValue; + mod->B3SOIPDtiiGiven = TRUE; + break; + case B3SOIPD_MOD_LII : + mod->B3SOIPDlii = value->rValue; + mod->B3SOIPDliiGiven = TRUE; + break; + case B3SOIPD_MOD_SII0 : + mod->B3SOIPDsii0 = value->rValue; + mod->B3SOIPDsii0Given = TRUE; + break; + case B3SOIPD_MOD_SII1 : + mod->B3SOIPDsii1 = value->rValue; + mod->B3SOIPDsii1Given = TRUE; + break; + case B3SOIPD_MOD_SII2 : + mod->B3SOIPDsii2 = value->rValue; + mod->B3SOIPDsii2Given = TRUE; + break; + case B3SOIPD_MOD_SIID : + mod->B3SOIPDsiid = value->rValue; + mod->B3SOIPDsiidGiven = TRUE; + break; + case B3SOIPD_MOD_FBJTII : + mod->B3SOIPDfbjtii = value->rValue; + mod->B3SOIPDfbjtiiGiven = TRUE; + break; + case B3SOIPD_MOD_ESATII : + mod->B3SOIPDesatii = value->rValue; + mod->B3SOIPDesatiiGiven = TRUE; + break; + case B3SOIPD_MOD_NTUN : + mod->B3SOIPDntun = value->rValue; + mod->B3SOIPDntunGiven = TRUE; + break; + case B3SOIPD_MOD_NRECF0 : + mod->B3SOIPDnrecf0 = value->rValue; + mod->B3SOIPDnrecf0Given = TRUE; + break; + case B3SOIPD_MOD_NRECR0 : + mod->B3SOIPDnrecr0 = value->rValue; + mod->B3SOIPDnrecr0Given = TRUE; + break; + case B3SOIPD_MOD_ISBJT : + mod->B3SOIPDisbjt = value->rValue; + mod->B3SOIPDisbjtGiven = TRUE; + break; + case B3SOIPD_MOD_ISDIF : + mod->B3SOIPDisdif = value->rValue; + mod->B3SOIPDisdifGiven = TRUE; + break; + case B3SOIPD_MOD_ISREC : + mod->B3SOIPDisrec = value->rValue; + mod->B3SOIPDisrecGiven = TRUE; + break; + case B3SOIPD_MOD_ISTUN : + mod->B3SOIPDistun = value->rValue; + mod->B3SOIPDistunGiven = TRUE; + break; + case B3SOIPD_MOD_LN : + mod->B3SOIPDln = value->rValue; + mod->B3SOIPDlnGiven = TRUE; + break; + case B3SOIPD_MOD_VREC0 : + mod->B3SOIPDvrec0 = value->rValue; + mod->B3SOIPDvrec0Given = TRUE; + break; + case B3SOIPD_MOD_VTUN0 : + mod->B3SOIPDvtun0 = value->rValue; + mod->B3SOIPDvtun0Given = TRUE; + break; + case B3SOIPD_MOD_NBJT : + mod->B3SOIPDnbjt = value->rValue; + mod->B3SOIPDnbjtGiven = TRUE; + break; + case B3SOIPD_MOD_LBJT0 : + mod->B3SOIPDlbjt0 = value->rValue; + mod->B3SOIPDlbjt0Given = TRUE; + break; + case B3SOIPD_MOD_LDIF0 : + mod->B3SOIPDldif0 = value->rValue; + mod->B3SOIPDldif0Given = TRUE; + break; + case B3SOIPD_MOD_VABJT : + mod->B3SOIPDvabjt = value->rValue; + mod->B3SOIPDvabjtGiven = TRUE; + break; + case B3SOIPD_MOD_AELY : + mod->B3SOIPDaely = value->rValue; + mod->B3SOIPDaelyGiven = TRUE; + break; + case B3SOIPD_MOD_AHLI : + mod->B3SOIPDahli = value->rValue; + mod->B3SOIPDahliGiven = TRUE; + break; + case B3SOIPD_MOD_NDIF : + mod->B3SOIPDndif = value->rValue; + mod->B3SOIPDndifGiven = TRUE; + break; + case B3SOIPD_MOD_NTRECF : + mod->B3SOIPDntrecf = value->rValue; + mod->B3SOIPDntrecfGiven = TRUE; + break; + case B3SOIPD_MOD_NTRECR : + mod->B3SOIPDntrecr = value->rValue; + mod->B3SOIPDntrecrGiven = TRUE; + break; + case B3SOIPD_MOD_DLCB : + mod->B3SOIPDdlcb = value->rValue; + mod->B3SOIPDdlcbGiven = TRUE; + break; + case B3SOIPD_MOD_FBODY : + mod->B3SOIPDfbody = value->rValue; + mod->B3SOIPDfbodyGiven = TRUE; + break; + case B3SOIPD_MOD_TCJSWG : + mod->B3SOIPDtcjswg = value->rValue; + mod->B3SOIPDtcjswgGiven = TRUE; + break; + case B3SOIPD_MOD_TPBSWG : + mod->B3SOIPDtpbswg = value->rValue; + mod->B3SOIPDtpbswgGiven = TRUE; + break; + case B3SOIPD_MOD_ACDE : + mod->B3SOIPDacde = value->rValue; + mod->B3SOIPDacdeGiven = TRUE; + break; + case B3SOIPD_MOD_MOIN : + mod->B3SOIPDmoin = value->rValue; + mod->B3SOIPDmoinGiven = TRUE; + break; + case B3SOIPD_MOD_DELVT : + mod->B3SOIPDdelvt = value->rValue; + mod->B3SOIPDdelvtGiven = TRUE; + break; + case B3SOIPD_MOD_KB1 : + mod->B3SOIPDkb1 = value->rValue; + mod->B3SOIPDkb1Given = TRUE; + break; + case B3SOIPD_MOD_DLBG : + mod->B3SOIPDdlbg = value->rValue; + mod->B3SOIPDdlbgGiven = TRUE; + break; /* Added for binning - START */ - /* Length Dependence */ - case B3SOIPD_MOD_LNPEAK: - mod->B3SOIPDlnpeak = value->rValue; - mod->B3SOIPDlnpeakGiven = TRUE; - break; - case B3SOIPD_MOD_LNSUB: - mod->B3SOIPDlnsub = value->rValue; - mod->B3SOIPDlnsubGiven = TRUE; - break; - case B3SOIPD_MOD_LNGATE: - mod->B3SOIPDlngate = value->rValue; - mod->B3SOIPDlngateGiven = TRUE; - break; - case B3SOIPD_MOD_LVTH0: - mod->B3SOIPDlvth0 = value->rValue; - mod->B3SOIPDlvth0Given = TRUE; - break; - case B3SOIPD_MOD_LK1: - mod->B3SOIPDlk1 = value->rValue; - mod->B3SOIPDlk1Given = TRUE; - break; - case B3SOIPD_MOD_LK1W1: - mod->B3SOIPDlk1w1 = value->rValue; - mod->B3SOIPDlk1w1Given = TRUE; - break; - case B3SOIPD_MOD_LK1W2: - mod->B3SOIPDlk1w2 = value->rValue; - mod->B3SOIPDlk1w2Given = TRUE; - break; - case B3SOIPD_MOD_LK2: - mod->B3SOIPDlk2 = value->rValue; - mod->B3SOIPDlk2Given = TRUE; - break; - case B3SOIPD_MOD_LK3: - mod->B3SOIPDlk3 = value->rValue; - mod->B3SOIPDlk3Given = TRUE; - break; - case B3SOIPD_MOD_LK3B: - mod->B3SOIPDlk3b = value->rValue; - mod->B3SOIPDlk3bGiven = TRUE; - break; - case B3SOIPD_MOD_LKB1: - mod->B3SOIPDlkb1 = value->rValue; - mod->B3SOIPDlkb1Given = TRUE; - break; - case B3SOIPD_MOD_LW0: - mod->B3SOIPDlw0 = value->rValue; - mod->B3SOIPDlw0Given = TRUE; - break; - case B3SOIPD_MOD_LNLX: - mod->B3SOIPDlnlx = value->rValue; - mod->B3SOIPDlnlxGiven = TRUE; - break; - case B3SOIPD_MOD_LDVT0: - mod->B3SOIPDldvt0 = value->rValue; - mod->B3SOIPDldvt0Given = TRUE; - break; - case B3SOIPD_MOD_LDVT1: - mod->B3SOIPDldvt1 = value->rValue; - mod->B3SOIPDldvt1Given = TRUE; - break; - case B3SOIPD_MOD_LDVT2: - mod->B3SOIPDldvt2 = value->rValue; - mod->B3SOIPDldvt2Given = TRUE; - break; - case B3SOIPD_MOD_LDVT0W: - mod->B3SOIPDldvt0w = value->rValue; - mod->B3SOIPDldvt0wGiven = TRUE; - break; - case B3SOIPD_MOD_LDVT1W: - mod->B3SOIPDldvt1w = value->rValue; - mod->B3SOIPDldvt1wGiven = TRUE; - break; - case B3SOIPD_MOD_LDVT2W: - mod->B3SOIPDldvt2w = value->rValue; - mod->B3SOIPDldvt2wGiven = TRUE; - break; - case B3SOIPD_MOD_LU0: - mod->B3SOIPDlu0 = value->rValue; - mod->B3SOIPDlu0Given = TRUE; - break; - case B3SOIPD_MOD_LUA: - mod->B3SOIPDlua = value->rValue; - mod->B3SOIPDluaGiven = TRUE; - break; - case B3SOIPD_MOD_LUB: - mod->B3SOIPDlub = value->rValue; - mod->B3SOIPDlubGiven = TRUE; - break; - case B3SOIPD_MOD_LUC: - mod->B3SOIPDluc = value->rValue; - mod->B3SOIPDlucGiven = TRUE; - break; - case B3SOIPD_MOD_LVSAT: - mod->B3SOIPDlvsat = value->rValue; - mod->B3SOIPDlvsatGiven = TRUE; - break; - case B3SOIPD_MOD_LA0: - mod->B3SOIPDla0 = value->rValue; - mod->B3SOIPDla0Given = TRUE; - break; - case B3SOIPD_MOD_LAGS: - mod->B3SOIPDlags = value->rValue; - mod->B3SOIPDlagsGiven = TRUE; - break; - case B3SOIPD_MOD_LB0: - mod->B3SOIPDlb0 = value->rValue; - mod->B3SOIPDlb0Given = TRUE; - break; - case B3SOIPD_MOD_LB1: - mod->B3SOIPDlb1 = value->rValue; - mod->B3SOIPDlb1Given = TRUE; - break; - case B3SOIPD_MOD_LKETA: - mod->B3SOIPDlketa = value->rValue; - mod->B3SOIPDlketaGiven = TRUE; - break; - case B3SOIPD_MOD_LKETAS: - mod->B3SOIPDlketas = value->rValue; - mod->B3SOIPDlketasGiven = TRUE; - break; - case B3SOIPD_MOD_LA1: - mod->B3SOIPDla1 = value->rValue; - mod->B3SOIPDla1Given = TRUE; - break; - case B3SOIPD_MOD_LA2: - mod->B3SOIPDla2 = value->rValue; - mod->B3SOIPDla2Given = TRUE; - break; - case B3SOIPD_MOD_LRDSW: - mod->B3SOIPDlrdsw = value->rValue; - mod->B3SOIPDlrdswGiven = TRUE; - break; - case B3SOIPD_MOD_LPRWB: - mod->B3SOIPDlprwb = value->rValue; - mod->B3SOIPDlprwbGiven = TRUE; - break; - case B3SOIPD_MOD_LPRWG: - mod->B3SOIPDlprwg = value->rValue; - mod->B3SOIPDlprwgGiven = TRUE; - break; - case B3SOIPD_MOD_LWR: - mod->B3SOIPDlwr = value->rValue; - mod->B3SOIPDlwrGiven = TRUE; - break; - case B3SOIPD_MOD_LNFACTOR: - mod->B3SOIPDlnfactor = value->rValue; - mod->B3SOIPDlnfactorGiven = TRUE; - break; - case B3SOIPD_MOD_LDWG: - mod->B3SOIPDldwg = value->rValue; - mod->B3SOIPDldwgGiven = TRUE; - break; - case B3SOIPD_MOD_LDWB: - mod->B3SOIPDldwb = value->rValue; - mod->B3SOIPDldwbGiven = TRUE; - break; - case B3SOIPD_MOD_LVOFF: - mod->B3SOIPDlvoff = value->rValue; - mod->B3SOIPDlvoffGiven = TRUE; - break; - case B3SOIPD_MOD_LETA0: - mod->B3SOIPDleta0 = value->rValue; - mod->B3SOIPDleta0Given = TRUE; - break; - case B3SOIPD_MOD_LETAB: - mod->B3SOIPDletab = value->rValue; - mod->B3SOIPDletabGiven = TRUE; - break; - case B3SOIPD_MOD_LDSUB: - mod->B3SOIPDldsub = value->rValue; - mod->B3SOIPDldsubGiven = TRUE; - break; - case B3SOIPD_MOD_LCIT: - mod->B3SOIPDlcit = value->rValue; - mod->B3SOIPDlcitGiven = TRUE; - break; - case B3SOIPD_MOD_LCDSC: - mod->B3SOIPDlcdsc = value->rValue; - mod->B3SOIPDlcdscGiven = TRUE; - break; - case B3SOIPD_MOD_LCDSCB: - mod->B3SOIPDlcdscb = value->rValue; - mod->B3SOIPDlcdscbGiven = TRUE; - break; - case B3SOIPD_MOD_LCDSCD: - mod->B3SOIPDlcdscd = value->rValue; - mod->B3SOIPDlcdscdGiven = TRUE; - break; - case B3SOIPD_MOD_LPCLM: - mod->B3SOIPDlpclm = value->rValue; - mod->B3SOIPDlpclmGiven = TRUE; - break; - case B3SOIPD_MOD_LPDIBL1: - mod->B3SOIPDlpdibl1 = value->rValue; - mod->B3SOIPDlpdibl1Given = TRUE; - break; - case B3SOIPD_MOD_LPDIBL2: - mod->B3SOIPDlpdibl2 = value->rValue; - mod->B3SOIPDlpdibl2Given = TRUE; - break; - case B3SOIPD_MOD_LPDIBLB: - mod->B3SOIPDlpdiblb = value->rValue; - mod->B3SOIPDlpdiblbGiven = TRUE; - break; - case B3SOIPD_MOD_LDROUT: - mod->B3SOIPDldrout = value->rValue; - mod->B3SOIPDldroutGiven = TRUE; - break; - case B3SOIPD_MOD_LPVAG: - mod->B3SOIPDlpvag = value->rValue; - mod->B3SOIPDlpvagGiven = TRUE; - break; - case B3SOIPD_MOD_LDELTA: - mod->B3SOIPDldelta = value->rValue; - mod->B3SOIPDldeltaGiven = TRUE; - break; - case B3SOIPD_MOD_LALPHA0: - mod->B3SOIPDlalpha0 = value->rValue; - mod->B3SOIPDlalpha0Given = TRUE; - break; - case B3SOIPD_MOD_LFBJTII: - mod->B3SOIPDlfbjtii = value->rValue; - mod->B3SOIPDlfbjtiiGiven = TRUE; - break; - case B3SOIPD_MOD_LBETA0: - mod->B3SOIPDlbeta0 = value->rValue; - mod->B3SOIPDlbeta0Given = TRUE; - break; - case B3SOIPD_MOD_LBETA1: - mod->B3SOIPDlbeta1 = value->rValue; - mod->B3SOIPDlbeta1Given = TRUE; - break; - case B3SOIPD_MOD_LBETA2: - mod->B3SOIPDlbeta2 = value->rValue; - mod->B3SOIPDlbeta2Given = TRUE; - break; - case B3SOIPD_MOD_LVDSATII0: - mod->B3SOIPDlvdsatii0 = value->rValue; - mod->B3SOIPDlvdsatii0Given = TRUE; - break; - case B3SOIPD_MOD_LLII: - mod->B3SOIPDllii = value->rValue; - mod->B3SOIPDlliiGiven = TRUE; - break; - case B3SOIPD_MOD_LESATII: - mod->B3SOIPDlesatii = value->rValue; - mod->B3SOIPDlesatiiGiven = TRUE; - break; - case B3SOIPD_MOD_LSII0: - mod->B3SOIPDlsii0 = value->rValue; - mod->B3SOIPDlsii0Given = TRUE; - break; - case B3SOIPD_MOD_LSII1: - mod->B3SOIPDlsii1 = value->rValue; - mod->B3SOIPDlsii1Given = TRUE; - break; - case B3SOIPD_MOD_LSII2: - mod->B3SOIPDlsii2 = value->rValue; - mod->B3SOIPDlsii2Given = TRUE; - break; - case B3SOIPD_MOD_LSIID: - mod->B3SOIPDlsiid = value->rValue; - mod->B3SOIPDlsiidGiven = TRUE; - break; - case B3SOIPD_MOD_LAGIDL: - mod->B3SOIPDlagidl = value->rValue; - mod->B3SOIPDlagidlGiven = TRUE; - break; - case B3SOIPD_MOD_LBGIDL: - mod->B3SOIPDlbgidl = value->rValue; - mod->B3SOIPDlbgidlGiven = TRUE; - break; - case B3SOIPD_MOD_LNGIDL: - mod->B3SOIPDlngidl = value->rValue; - mod->B3SOIPDlngidlGiven = TRUE; - break; - case B3SOIPD_MOD_LNTUN: - mod->B3SOIPDlntun = value->rValue; - mod->B3SOIPDlntunGiven = TRUE; - break; - case B3SOIPD_MOD_LNDIODE: - mod->B3SOIPDlndiode = value->rValue; - mod->B3SOIPDlndiodeGiven = TRUE; - break; - case B3SOIPD_MOD_LNRECF0: - mod->B3SOIPDlnrecf0 = value->rValue; - mod->B3SOIPDlnrecf0Given = TRUE; - break; - case B3SOIPD_MOD_LNRECR0: - mod->B3SOIPDlnrecr0 = value->rValue; - mod->B3SOIPDlnrecr0Given = TRUE; - break; - case B3SOIPD_MOD_LISBJT: - mod->B3SOIPDlisbjt = value->rValue; - mod->B3SOIPDlisbjtGiven = TRUE; - break; - case B3SOIPD_MOD_LISDIF: - mod->B3SOIPDlisdif = value->rValue; - mod->B3SOIPDlisdifGiven = TRUE; - break; - case B3SOIPD_MOD_LISREC: - mod->B3SOIPDlisrec = value->rValue; - mod->B3SOIPDlisrecGiven = TRUE; - break; - case B3SOIPD_MOD_LISTUN: - mod->B3SOIPDlistun = value->rValue; - mod->B3SOIPDlistunGiven = TRUE; - break; - case B3SOIPD_MOD_LVREC0: - mod->B3SOIPDlvrec0 = value->rValue; - mod->B3SOIPDlvrec0Given = TRUE; - break; - case B3SOIPD_MOD_LVTUN0: - mod->B3SOIPDlvtun0 = value->rValue; - mod->B3SOIPDlvtun0Given = TRUE; - break; - case B3SOIPD_MOD_LNBJT: - mod->B3SOIPDlnbjt = value->rValue; - mod->B3SOIPDlnbjtGiven = TRUE; - break; - case B3SOIPD_MOD_LLBJT0: - mod->B3SOIPDllbjt0 = value->rValue; - mod->B3SOIPDllbjt0Given = TRUE; - break; - case B3SOIPD_MOD_LVABJT: - mod->B3SOIPDlvabjt = value->rValue; - mod->B3SOIPDlvabjtGiven = TRUE; - break; - case B3SOIPD_MOD_LAELY: - mod->B3SOIPDlaely = value->rValue; - mod->B3SOIPDlaelyGiven = TRUE; - break; - case B3SOIPD_MOD_LAHLI: - mod->B3SOIPDlahli = value->rValue; - mod->B3SOIPDlahliGiven = TRUE; - break; - /* CV Model */ - case B3SOIPD_MOD_LVSDFB: - mod->B3SOIPDlvsdfb = value->rValue; - mod->B3SOIPDlvsdfbGiven = TRUE; - break; - case B3SOIPD_MOD_LVSDTH: - mod->B3SOIPDlvsdth = value->rValue; - mod->B3SOIPDlvsdthGiven = TRUE; - break; - case B3SOIPD_MOD_LDELVT: - mod->B3SOIPDldelvt = value->rValue; - mod->B3SOIPDldelvtGiven = TRUE; - break; - case B3SOIPD_MOD_LACDE: - mod->B3SOIPDlacde = value->rValue; - mod->B3SOIPDlacdeGiven = TRUE; - break; - case B3SOIPD_MOD_LMOIN: - mod->B3SOIPDlmoin = value->rValue; - mod->B3SOIPDlmoinGiven = TRUE; - break; + /* Length Dependence */ + case B3SOIPD_MOD_LNPEAK: + mod->B3SOIPDlnpeak = value->rValue; + mod->B3SOIPDlnpeakGiven = TRUE; + break; + case B3SOIPD_MOD_LNSUB: + mod->B3SOIPDlnsub = value->rValue; + mod->B3SOIPDlnsubGiven = TRUE; + break; + case B3SOIPD_MOD_LNGATE: + mod->B3SOIPDlngate = value->rValue; + mod->B3SOIPDlngateGiven = TRUE; + break; + case B3SOIPD_MOD_LVTH0: + mod->B3SOIPDlvth0 = value->rValue; + mod->B3SOIPDlvth0Given = TRUE; + break; + case B3SOIPD_MOD_LK1: + mod->B3SOIPDlk1 = value->rValue; + mod->B3SOIPDlk1Given = TRUE; + break; + case B3SOIPD_MOD_LK1W1: + mod->B3SOIPDlk1w1 = value->rValue; + mod->B3SOIPDlk1w1Given = TRUE; + break; + case B3SOIPD_MOD_LK1W2: + mod->B3SOIPDlk1w2 = value->rValue; + mod->B3SOIPDlk1w2Given = TRUE; + break; + case B3SOIPD_MOD_LK2: + mod->B3SOIPDlk2 = value->rValue; + mod->B3SOIPDlk2Given = TRUE; + break; + case B3SOIPD_MOD_LK3: + mod->B3SOIPDlk3 = value->rValue; + mod->B3SOIPDlk3Given = TRUE; + break; + case B3SOIPD_MOD_LK3B: + mod->B3SOIPDlk3b = value->rValue; + mod->B3SOIPDlk3bGiven = TRUE; + break; + case B3SOIPD_MOD_LKB1 : + mod->B3SOIPDlkb1 = value->rValue; + mod->B3SOIPDlkb1Given = TRUE; + break; + case B3SOIPD_MOD_LW0: + mod->B3SOIPDlw0 = value->rValue; + mod->B3SOIPDlw0Given = TRUE; + break; + case B3SOIPD_MOD_LNLX: + mod->B3SOIPDlnlx = value->rValue; + mod->B3SOIPDlnlxGiven = TRUE; + break; + case B3SOIPD_MOD_LDVT0: + mod->B3SOIPDldvt0 = value->rValue; + mod->B3SOIPDldvt0Given = TRUE; + break; + case B3SOIPD_MOD_LDVT1: + mod->B3SOIPDldvt1 = value->rValue; + mod->B3SOIPDldvt1Given = TRUE; + break; + case B3SOIPD_MOD_LDVT2: + mod->B3SOIPDldvt2 = value->rValue; + mod->B3SOIPDldvt2Given = TRUE; + break; + case B3SOIPD_MOD_LDVT0W: + mod->B3SOIPDldvt0w = value->rValue; + mod->B3SOIPDldvt0wGiven = TRUE; + break; + case B3SOIPD_MOD_LDVT1W: + mod->B3SOIPDldvt1w = value->rValue; + mod->B3SOIPDldvt1wGiven = TRUE; + break; + case B3SOIPD_MOD_LDVT2W: + mod->B3SOIPDldvt2w = value->rValue; + mod->B3SOIPDldvt2wGiven = TRUE; + break; + case B3SOIPD_MOD_LU0 : + mod->B3SOIPDlu0 = value->rValue; + mod->B3SOIPDlu0Given = TRUE; + break; + case B3SOIPD_MOD_LUA: + mod->B3SOIPDlua = value->rValue; + mod->B3SOIPDluaGiven = TRUE; + break; + case B3SOIPD_MOD_LUB: + mod->B3SOIPDlub = value->rValue; + mod->B3SOIPDlubGiven = TRUE; + break; + case B3SOIPD_MOD_LUC: + mod->B3SOIPDluc = value->rValue; + mod->B3SOIPDlucGiven = TRUE; + break; + case B3SOIPD_MOD_LVSAT: + mod->B3SOIPDlvsat = value->rValue; + mod->B3SOIPDlvsatGiven = TRUE; + break; + case B3SOIPD_MOD_LA0: + mod->B3SOIPDla0 = value->rValue; + mod->B3SOIPDla0Given = TRUE; + break; + case B3SOIPD_MOD_LAGS: + mod->B3SOIPDlags= value->rValue; + mod->B3SOIPDlagsGiven = TRUE; + break; + case B3SOIPD_MOD_LB0 : + mod->B3SOIPDlb0 = value->rValue; + mod->B3SOIPDlb0Given = TRUE; + break; + case B3SOIPD_MOD_LB1 : + mod->B3SOIPDlb1 = value->rValue; + mod->B3SOIPDlb1Given = TRUE; + break; + case B3SOIPD_MOD_LKETA: + mod->B3SOIPDlketa = value->rValue; + mod->B3SOIPDlketaGiven = TRUE; + break; + case B3SOIPD_MOD_LKETAS: + mod->B3SOIPDlketas = value->rValue; + mod->B3SOIPDlketasGiven = TRUE; + break; + case B3SOIPD_MOD_LA1: + mod->B3SOIPDla1 = value->rValue; + mod->B3SOIPDla1Given = TRUE; + break; + case B3SOIPD_MOD_LA2: + mod->B3SOIPDla2 = value->rValue; + mod->B3SOIPDla2Given = TRUE; + break; + case B3SOIPD_MOD_LRDSW: + mod->B3SOIPDlrdsw = value->rValue; + mod->B3SOIPDlrdswGiven = TRUE; + break; + case B3SOIPD_MOD_LPRWB: + mod->B3SOIPDlprwb = value->rValue; + mod->B3SOIPDlprwbGiven = TRUE; + break; + case B3SOIPD_MOD_LPRWG: + mod->B3SOIPDlprwg = value->rValue; + mod->B3SOIPDlprwgGiven = TRUE; + break; + case B3SOIPD_MOD_LWR : + mod->B3SOIPDlwr = value->rValue; + mod->B3SOIPDlwrGiven = TRUE; + break; + case B3SOIPD_MOD_LNFACTOR : + mod->B3SOIPDlnfactor = value->rValue; + mod->B3SOIPDlnfactorGiven = TRUE; + break; + case B3SOIPD_MOD_LDWG : + mod->B3SOIPDldwg = value->rValue; + mod->B3SOIPDldwgGiven = TRUE; + break; + case B3SOIPD_MOD_LDWB : + mod->B3SOIPDldwb = value->rValue; + mod->B3SOIPDldwbGiven = TRUE; + break; + case B3SOIPD_MOD_LVOFF: + mod->B3SOIPDlvoff = value->rValue; + mod->B3SOIPDlvoffGiven = TRUE; + break; + case B3SOIPD_MOD_LETA0: + mod->B3SOIPDleta0 = value->rValue; + mod->B3SOIPDleta0Given = TRUE; + break; + case B3SOIPD_MOD_LETAB: + mod->B3SOIPDletab = value->rValue; + mod->B3SOIPDletabGiven = TRUE; + break; + case B3SOIPD_MOD_LDSUB: + mod->B3SOIPDldsub = value->rValue; + mod->B3SOIPDldsubGiven = TRUE; + break; + case B3SOIPD_MOD_LCIT : + mod->B3SOIPDlcit = value->rValue; + mod->B3SOIPDlcitGiven = TRUE; + break; + case B3SOIPD_MOD_LCDSC : + mod->B3SOIPDlcdsc = value->rValue; + mod->B3SOIPDlcdscGiven = TRUE; + break; + case B3SOIPD_MOD_LCDSCB : + mod->B3SOIPDlcdscb = value->rValue; + mod->B3SOIPDlcdscbGiven = TRUE; + break; + case B3SOIPD_MOD_LCDSCD : + mod->B3SOIPDlcdscd = value->rValue; + mod->B3SOIPDlcdscdGiven = TRUE; + break; + case B3SOIPD_MOD_LPCLM: + mod->B3SOIPDlpclm = value->rValue; + mod->B3SOIPDlpclmGiven = TRUE; + break; + case B3SOIPD_MOD_LPDIBL1: + mod->B3SOIPDlpdibl1 = value->rValue; + mod->B3SOIPDlpdibl1Given = TRUE; + break; + case B3SOIPD_MOD_LPDIBL2: + mod->B3SOIPDlpdibl2 = value->rValue; + mod->B3SOIPDlpdibl2Given = TRUE; + break; + case B3SOIPD_MOD_LPDIBLB: + mod->B3SOIPDlpdiblb = value->rValue; + mod->B3SOIPDlpdiblbGiven = TRUE; + break; + case B3SOIPD_MOD_LDROUT: + mod->B3SOIPDldrout = value->rValue; + mod->B3SOIPDldroutGiven = TRUE; + break; + case B3SOIPD_MOD_LPVAG: + mod->B3SOIPDlpvag = value->rValue; + mod->B3SOIPDlpvagGiven = TRUE; + break; + case B3SOIPD_MOD_LDELTA : + mod->B3SOIPDldelta = value->rValue; + mod->B3SOIPDldeltaGiven = TRUE; + break; + case B3SOIPD_MOD_LALPHA0 : + mod->B3SOIPDlalpha0 = value->rValue; + mod->B3SOIPDlalpha0Given = TRUE; + break; + case B3SOIPD_MOD_LFBJTII : + mod->B3SOIPDlfbjtii = value->rValue; + mod->B3SOIPDlfbjtiiGiven = TRUE; + break; + case B3SOIPD_MOD_LBETA0 : + mod->B3SOIPDlbeta0 = value->rValue; + mod->B3SOIPDlbeta0Given = TRUE; + break; + case B3SOIPD_MOD_LBETA1 : + mod->B3SOIPDlbeta1 = value->rValue; + mod->B3SOIPDlbeta1Given = TRUE; + break; + case B3SOIPD_MOD_LBETA2 : + mod->B3SOIPDlbeta2 = value->rValue; + mod->B3SOIPDlbeta2Given = TRUE; + break; + case B3SOIPD_MOD_LVDSATII0 : + mod->B3SOIPDlvdsatii0 = value->rValue; + mod->B3SOIPDlvdsatii0Given = TRUE; + break; + case B3SOIPD_MOD_LLII : + mod->B3SOIPDllii = value->rValue; + mod->B3SOIPDlliiGiven = TRUE; + break; + case B3SOIPD_MOD_LESATII : + mod->B3SOIPDlesatii = value->rValue; + mod->B3SOIPDlesatiiGiven = TRUE; + break; + case B3SOIPD_MOD_LSII0 : + mod->B3SOIPDlsii0 = value->rValue; + mod->B3SOIPDlsii0Given = TRUE; + break; + case B3SOIPD_MOD_LSII1 : + mod->B3SOIPDlsii1 = value->rValue; + mod->B3SOIPDlsii1Given = TRUE; + break; + case B3SOIPD_MOD_LSII2 : + mod->B3SOIPDlsii2 = value->rValue; + mod->B3SOIPDlsii2Given = TRUE; + break; + case B3SOIPD_MOD_LSIID : + mod->B3SOIPDlsiid = value->rValue; + mod->B3SOIPDlsiidGiven = TRUE; + break; + case B3SOIPD_MOD_LAGIDL : + mod->B3SOIPDlagidl = value->rValue; + mod->B3SOIPDlagidlGiven = TRUE; + break; + case B3SOIPD_MOD_LBGIDL : + mod->B3SOIPDlbgidl = value->rValue; + mod->B3SOIPDlbgidlGiven = TRUE; + break; + case B3SOIPD_MOD_LNGIDL : + mod->B3SOIPDlngidl = value->rValue; + mod->B3SOIPDlngidlGiven = TRUE; + break; + case B3SOIPD_MOD_LNTUN : + mod->B3SOIPDlntun = value->rValue; + mod->B3SOIPDlntunGiven = TRUE; + break; + case B3SOIPD_MOD_LNDIODE : + mod->B3SOIPDlndiode = value->rValue; + mod->B3SOIPDlndiodeGiven = TRUE; + break; + case B3SOIPD_MOD_LNRECF0 : + mod->B3SOIPDlnrecf0 = value->rValue; + mod->B3SOIPDlnrecf0Given = TRUE; + break; + case B3SOIPD_MOD_LNRECR0 : + mod->B3SOIPDlnrecr0 = value->rValue; + mod->B3SOIPDlnrecr0Given = TRUE; + break; + case B3SOIPD_MOD_LISBJT : + mod->B3SOIPDlisbjt = value->rValue; + mod->B3SOIPDlisbjtGiven = TRUE; + break; + case B3SOIPD_MOD_LISDIF : + mod->B3SOIPDlisdif = value->rValue; + mod->B3SOIPDlisdifGiven = TRUE; + break; + case B3SOIPD_MOD_LISREC : + mod->B3SOIPDlisrec = value->rValue; + mod->B3SOIPDlisrecGiven = TRUE; + break; + case B3SOIPD_MOD_LISTUN : + mod->B3SOIPDlistun = value->rValue; + mod->B3SOIPDlistunGiven = TRUE; + break; + case B3SOIPD_MOD_LVREC0 : + mod->B3SOIPDlvrec0 = value->rValue; + mod->B3SOIPDlvrec0Given = TRUE; + break; + case B3SOIPD_MOD_LVTUN0 : + mod->B3SOIPDlvtun0 = value->rValue; + mod->B3SOIPDlvtun0Given = TRUE; + break; + case B3SOIPD_MOD_LNBJT : + mod->B3SOIPDlnbjt = value->rValue; + mod->B3SOIPDlnbjtGiven = TRUE; + break; + case B3SOIPD_MOD_LLBJT0 : + mod->B3SOIPDllbjt0 = value->rValue; + mod->B3SOIPDllbjt0Given = TRUE; + break; + case B3SOIPD_MOD_LVABJT : + mod->B3SOIPDlvabjt = value->rValue; + mod->B3SOIPDlvabjtGiven = TRUE; + break; + case B3SOIPD_MOD_LAELY : + mod->B3SOIPDlaely = value->rValue; + mod->B3SOIPDlaelyGiven = TRUE; + break; + case B3SOIPD_MOD_LAHLI : + mod->B3SOIPDlahli = value->rValue; + mod->B3SOIPDlahliGiven = TRUE; + break; + /* CV Model */ + case B3SOIPD_MOD_LVSDFB : + mod->B3SOIPDlvsdfb = value->rValue; + mod->B3SOIPDlvsdfbGiven = TRUE; + break; + case B3SOIPD_MOD_LVSDTH : + mod->B3SOIPDlvsdth = value->rValue; + mod->B3SOIPDlvsdthGiven = TRUE; + break; + case B3SOIPD_MOD_LDELVT : + mod->B3SOIPDldelvt = value->rValue; + mod->B3SOIPDldelvtGiven = TRUE; + break; + case B3SOIPD_MOD_LACDE : + mod->B3SOIPDlacde = value->rValue; + mod->B3SOIPDlacdeGiven = TRUE; + break; + case B3SOIPD_MOD_LMOIN : + mod->B3SOIPDlmoin = value->rValue; + mod->B3SOIPDlmoinGiven = TRUE; + break; - /* Width Dependence */ - case B3SOIPD_MOD_WNPEAK: - mod->B3SOIPDwnpeak = value->rValue; - mod->B3SOIPDwnpeakGiven = TRUE; - break; - case B3SOIPD_MOD_WNSUB: - mod->B3SOIPDwnsub = value->rValue; - mod->B3SOIPDwnsubGiven = TRUE; - break; - case B3SOIPD_MOD_WNGATE: - mod->B3SOIPDwngate = value->rValue; - mod->B3SOIPDwngateGiven = TRUE; - break; - case B3SOIPD_MOD_WVTH0: - mod->B3SOIPDwvth0 = value->rValue; - mod->B3SOIPDwvth0Given = TRUE; - break; - case B3SOIPD_MOD_WK1: - mod->B3SOIPDwk1 = value->rValue; - mod->B3SOIPDwk1Given = TRUE; - break; - case B3SOIPD_MOD_WK1W1: - mod->B3SOIPDwk1w1 = value->rValue; - mod->B3SOIPDwk1w1Given = TRUE; - break; - case B3SOIPD_MOD_WK1W2: - mod->B3SOIPDwk1w2 = value->rValue; - mod->B3SOIPDwk1w2Given = TRUE; - break; - case B3SOIPD_MOD_WK2: - mod->B3SOIPDwk2 = value->rValue; - mod->B3SOIPDwk2Given = TRUE; - break; - case B3SOIPD_MOD_WK3: - mod->B3SOIPDwk3 = value->rValue; - mod->B3SOIPDwk3Given = TRUE; - break; - case B3SOIPD_MOD_WK3B: - mod->B3SOIPDwk3b = value->rValue; - mod->B3SOIPDwk3bGiven = TRUE; - break; - case B3SOIPD_MOD_WKB1: - mod->B3SOIPDwkb1 = value->rValue; - mod->B3SOIPDwkb1Given = TRUE; - break; - case B3SOIPD_MOD_WW0: - mod->B3SOIPDww0 = value->rValue; - mod->B3SOIPDww0Given = TRUE; - break; - case B3SOIPD_MOD_WNLX: - mod->B3SOIPDwnlx = value->rValue; - mod->B3SOIPDwnlxGiven = TRUE; - break; - case B3SOIPD_MOD_WDVT0: - mod->B3SOIPDwdvt0 = value->rValue; - mod->B3SOIPDwdvt0Given = TRUE; - break; - case B3SOIPD_MOD_WDVT1: - mod->B3SOIPDwdvt1 = value->rValue; - mod->B3SOIPDwdvt1Given = TRUE; - break; - case B3SOIPD_MOD_WDVT2: - mod->B3SOIPDwdvt2 = value->rValue; - mod->B3SOIPDwdvt2Given = TRUE; - break; - case B3SOIPD_MOD_WDVT0W: - mod->B3SOIPDwdvt0w = value->rValue; - mod->B3SOIPDwdvt0wGiven = TRUE; - break; - case B3SOIPD_MOD_WDVT1W: - mod->B3SOIPDwdvt1w = value->rValue; - mod->B3SOIPDwdvt1wGiven = TRUE; - break; - case B3SOIPD_MOD_WDVT2W: - mod->B3SOIPDwdvt2w = value->rValue; - mod->B3SOIPDwdvt2wGiven = TRUE; - break; - case B3SOIPD_MOD_WU0: - mod->B3SOIPDwu0 = value->rValue; - mod->B3SOIPDwu0Given = TRUE; - break; - case B3SOIPD_MOD_WUA: - mod->B3SOIPDwua = value->rValue; - mod->B3SOIPDwuaGiven = TRUE; - break; - case B3SOIPD_MOD_WUB: - mod->B3SOIPDwub = value->rValue; - mod->B3SOIPDwubGiven = TRUE; - break; - case B3SOIPD_MOD_WUC: - mod->B3SOIPDwuc = value->rValue; - mod->B3SOIPDwucGiven = TRUE; - break; - case B3SOIPD_MOD_WVSAT: - mod->B3SOIPDwvsat = value->rValue; - mod->B3SOIPDwvsatGiven = TRUE; - break; - case B3SOIPD_MOD_WA0: - mod->B3SOIPDwa0 = value->rValue; - mod->B3SOIPDwa0Given = TRUE; - break; - case B3SOIPD_MOD_WAGS: - mod->B3SOIPDwags = value->rValue; - mod->B3SOIPDwagsGiven = TRUE; - break; - case B3SOIPD_MOD_WB0: - mod->B3SOIPDwb0 = value->rValue; - mod->B3SOIPDwb0Given = TRUE; - break; - case B3SOIPD_MOD_WB1: - mod->B3SOIPDwb1 = value->rValue; - mod->B3SOIPDwb1Given = TRUE; - break; - case B3SOIPD_MOD_WKETA: - mod->B3SOIPDwketa = value->rValue; - mod->B3SOIPDwketaGiven = TRUE; - break; - case B3SOIPD_MOD_WKETAS: - mod->B3SOIPDwketas = value->rValue; - mod->B3SOIPDwketasGiven = TRUE; - break; - case B3SOIPD_MOD_WA1: - mod->B3SOIPDwa1 = value->rValue; - mod->B3SOIPDwa1Given = TRUE; - break; - case B3SOIPD_MOD_WA2: - mod->B3SOIPDwa2 = value->rValue; - mod->B3SOIPDwa2Given = TRUE; - break; - case B3SOIPD_MOD_WRDSW: - mod->B3SOIPDwrdsw = value->rValue; - mod->B3SOIPDwrdswGiven = TRUE; - break; - case B3SOIPD_MOD_WPRWB: - mod->B3SOIPDwprwb = value->rValue; - mod->B3SOIPDwprwbGiven = TRUE; - break; - case B3SOIPD_MOD_WPRWG: - mod->B3SOIPDwprwg = value->rValue; - mod->B3SOIPDwprwgGiven = TRUE; - break; - case B3SOIPD_MOD_WWR: - mod->B3SOIPDwwr = value->rValue; - mod->B3SOIPDwwrGiven = TRUE; - break; - case B3SOIPD_MOD_WNFACTOR: - mod->B3SOIPDwnfactor = value->rValue; - mod->B3SOIPDwnfactorGiven = TRUE; - break; - case B3SOIPD_MOD_WDWG: - mod->B3SOIPDwdwg = value->rValue; - mod->B3SOIPDwdwgGiven = TRUE; - break; - case B3SOIPD_MOD_WDWB: - mod->B3SOIPDwdwb = value->rValue; - mod->B3SOIPDwdwbGiven = TRUE; - break; - case B3SOIPD_MOD_WVOFF: - mod->B3SOIPDwvoff = value->rValue; - mod->B3SOIPDwvoffGiven = TRUE; - break; - case B3SOIPD_MOD_WETA0: - mod->B3SOIPDweta0 = value->rValue; - mod->B3SOIPDweta0Given = TRUE; - break; - case B3SOIPD_MOD_WETAB: - mod->B3SOIPDwetab = value->rValue; - mod->B3SOIPDwetabGiven = TRUE; - break; - case B3SOIPD_MOD_WDSUB: - mod->B3SOIPDwdsub = value->rValue; - mod->B3SOIPDwdsubGiven = TRUE; - break; - case B3SOIPD_MOD_WCIT: - mod->B3SOIPDwcit = value->rValue; - mod->B3SOIPDwcitGiven = TRUE; - break; - case B3SOIPD_MOD_WCDSC: - mod->B3SOIPDwcdsc = value->rValue; - mod->B3SOIPDwcdscGiven = TRUE; - break; - case B3SOIPD_MOD_WCDSCB: - mod->B3SOIPDwcdscb = value->rValue; - mod->B3SOIPDwcdscbGiven = TRUE; - break; - case B3SOIPD_MOD_WCDSCD: - mod->B3SOIPDwcdscd = value->rValue; - mod->B3SOIPDwcdscdGiven = TRUE; - break; - case B3SOIPD_MOD_WPCLM: - mod->B3SOIPDwpclm = value->rValue; - mod->B3SOIPDwpclmGiven = TRUE; - break; - case B3SOIPD_MOD_WPDIBL1: - mod->B3SOIPDwpdibl1 = value->rValue; - mod->B3SOIPDwpdibl1Given = TRUE; - break; - case B3SOIPD_MOD_WPDIBL2: - mod->B3SOIPDwpdibl2 = value->rValue; - mod->B3SOIPDwpdibl2Given = TRUE; - break; - case B3SOIPD_MOD_WPDIBLB: - mod->B3SOIPDwpdiblb = value->rValue; - mod->B3SOIPDwpdiblbGiven = TRUE; - break; - case B3SOIPD_MOD_WDROUT: - mod->B3SOIPDwdrout = value->rValue; - mod->B3SOIPDwdroutGiven = TRUE; - break; - case B3SOIPD_MOD_WPVAG: - mod->B3SOIPDwpvag = value->rValue; - mod->B3SOIPDwpvagGiven = TRUE; - break; - case B3SOIPD_MOD_WDELTA: - mod->B3SOIPDwdelta = value->rValue; - mod->B3SOIPDwdeltaGiven = TRUE; - break; - case B3SOIPD_MOD_WALPHA0: - mod->B3SOIPDwalpha0 = value->rValue; - mod->B3SOIPDwalpha0Given = TRUE; - break; - case B3SOIPD_MOD_WFBJTII: - mod->B3SOIPDwfbjtii = value->rValue; - mod->B3SOIPDwfbjtiiGiven = TRUE; - break; - case B3SOIPD_MOD_WBETA0: - mod->B3SOIPDwbeta0 = value->rValue; - mod->B3SOIPDwbeta0Given = TRUE; - break; - case B3SOIPD_MOD_WBETA1: - mod->B3SOIPDwbeta1 = value->rValue; - mod->B3SOIPDwbeta1Given = TRUE; - break; - case B3SOIPD_MOD_WBETA2: - mod->B3SOIPDwbeta2 = value->rValue; - mod->B3SOIPDwbeta2Given = TRUE; - break; - case B3SOIPD_MOD_WVDSATII0: - mod->B3SOIPDwvdsatii0 = value->rValue; - mod->B3SOIPDwvdsatii0Given = TRUE; - break; - case B3SOIPD_MOD_WLII: - mod->B3SOIPDwlii = value->rValue; - mod->B3SOIPDwliiGiven = TRUE; - break; - case B3SOIPD_MOD_WESATII: - mod->B3SOIPDwesatii = value->rValue; - mod->B3SOIPDwesatiiGiven = TRUE; - break; - case B3SOIPD_MOD_WSII0: - mod->B3SOIPDwsii0 = value->rValue; - mod->B3SOIPDwsii0Given = TRUE; - break; - case B3SOIPD_MOD_WSII1: - mod->B3SOIPDwsii1 = value->rValue; - mod->B3SOIPDwsii1Given = TRUE; - break; - case B3SOIPD_MOD_WSII2: - mod->B3SOIPDwsii2 = value->rValue; - mod->B3SOIPDwsii2Given = TRUE; - break; - case B3SOIPD_MOD_WSIID: - mod->B3SOIPDwsiid = value->rValue; - mod->B3SOIPDwsiidGiven = TRUE; - break; - case B3SOIPD_MOD_WAGIDL: - mod->B3SOIPDwagidl = value->rValue; - mod->B3SOIPDwagidlGiven = TRUE; - break; - case B3SOIPD_MOD_WBGIDL: - mod->B3SOIPDwbgidl = value->rValue; - mod->B3SOIPDwbgidlGiven = TRUE; - break; - case B3SOIPD_MOD_WNGIDL: - mod->B3SOIPDwngidl = value->rValue; - mod->B3SOIPDwngidlGiven = TRUE; - break; - case B3SOIPD_MOD_WNTUN: - mod->B3SOIPDwntun = value->rValue; - mod->B3SOIPDwntunGiven = TRUE; - break; - case B3SOIPD_MOD_WNDIODE: - mod->B3SOIPDwndiode = value->rValue; - mod->B3SOIPDwndiodeGiven = TRUE; - break; - case B3SOIPD_MOD_WNRECF0: - mod->B3SOIPDwnrecf0 = value->rValue; - mod->B3SOIPDwnrecf0Given = TRUE; - break; - case B3SOIPD_MOD_WNRECR0: - mod->B3SOIPDwnrecr0 = value->rValue; - mod->B3SOIPDwnrecr0Given = TRUE; - break; - case B3SOIPD_MOD_WISBJT: - mod->B3SOIPDwisbjt = value->rValue; - mod->B3SOIPDwisbjtGiven = TRUE; - break; - case B3SOIPD_MOD_WISDIF: - mod->B3SOIPDwisdif = value->rValue; - mod->B3SOIPDwisdifGiven = TRUE; - break; - case B3SOIPD_MOD_WISREC: - mod->B3SOIPDwisrec = value->rValue; - mod->B3SOIPDwisrecGiven = TRUE; - break; - case B3SOIPD_MOD_WISTUN: - mod->B3SOIPDwistun = value->rValue; - mod->B3SOIPDwistunGiven = TRUE; - break; - case B3SOIPD_MOD_WVREC0: - mod->B3SOIPDwvrec0 = value->rValue; - mod->B3SOIPDwvrec0Given = TRUE; - break; - case B3SOIPD_MOD_WVTUN0: - mod->B3SOIPDwvtun0 = value->rValue; - mod->B3SOIPDwvtun0Given = TRUE; - break; - case B3SOIPD_MOD_WNBJT: - mod->B3SOIPDwnbjt = value->rValue; - mod->B3SOIPDwnbjtGiven = TRUE; - break; - case B3SOIPD_MOD_WLBJT0: - mod->B3SOIPDwlbjt0 = value->rValue; - mod->B3SOIPDwlbjt0Given = TRUE; - break; - case B3SOIPD_MOD_WVABJT: - mod->B3SOIPDwvabjt = value->rValue; - mod->B3SOIPDwvabjtGiven = TRUE; - break; - case B3SOIPD_MOD_WAELY: - mod->B3SOIPDwaely = value->rValue; - mod->B3SOIPDwaelyGiven = TRUE; - break; - case B3SOIPD_MOD_WAHLI: - mod->B3SOIPDwahli = value->rValue; - mod->B3SOIPDwahliGiven = TRUE; - break; - /* CV Model */ - case B3SOIPD_MOD_WVSDFB: - mod->B3SOIPDwvsdfb = value->rValue; - mod->B3SOIPDwvsdfbGiven = TRUE; - break; - case B3SOIPD_MOD_WVSDTH: - mod->B3SOIPDwvsdth = value->rValue; - mod->B3SOIPDwvsdthGiven = TRUE; - break; - case B3SOIPD_MOD_WDELVT: - mod->B3SOIPDwdelvt = value->rValue; - mod->B3SOIPDwdelvtGiven = TRUE; - break; - case B3SOIPD_MOD_WACDE: - mod->B3SOIPDwacde = value->rValue; - mod->B3SOIPDwacdeGiven = TRUE; - break; - case B3SOIPD_MOD_WMOIN: - mod->B3SOIPDwmoin = value->rValue; - mod->B3SOIPDwmoinGiven = TRUE; - break; + /* Width Dependence */ + case B3SOIPD_MOD_WNPEAK: + mod->B3SOIPDwnpeak = value->rValue; + mod->B3SOIPDwnpeakGiven = TRUE; + break; + case B3SOIPD_MOD_WNSUB: + mod->B3SOIPDwnsub = value->rValue; + mod->B3SOIPDwnsubGiven = TRUE; + break; + case B3SOIPD_MOD_WNGATE: + mod->B3SOIPDwngate = value->rValue; + mod->B3SOIPDwngateGiven = TRUE; + break; + case B3SOIPD_MOD_WVTH0: + mod->B3SOIPDwvth0 = value->rValue; + mod->B3SOIPDwvth0Given = TRUE; + break; + case B3SOIPD_MOD_WK1: + mod->B3SOIPDwk1 = value->rValue; + mod->B3SOIPDwk1Given = TRUE; + break; + case B3SOIPD_MOD_WK1W1: + mod->B3SOIPDwk1w1 = value->rValue; + mod->B3SOIPDwk1w1Given = TRUE; + break; + case B3SOIPD_MOD_WK1W2: + mod->B3SOIPDwk1w2 = value->rValue; + mod->B3SOIPDwk1w2Given = TRUE; + break; + case B3SOIPD_MOD_WK2: + mod->B3SOIPDwk2 = value->rValue; + mod->B3SOIPDwk2Given = TRUE; + break; + case B3SOIPD_MOD_WK3: + mod->B3SOIPDwk3 = value->rValue; + mod->B3SOIPDwk3Given = TRUE; + break; + case B3SOIPD_MOD_WK3B: + mod->B3SOIPDwk3b = value->rValue; + mod->B3SOIPDwk3bGiven = TRUE; + break; + case B3SOIPD_MOD_WKB1 : + mod->B3SOIPDwkb1 = value->rValue; + mod->B3SOIPDwkb1Given = TRUE; + break; + case B3SOIPD_MOD_WW0: + mod->B3SOIPDww0 = value->rValue; + mod->B3SOIPDww0Given = TRUE; + break; + case B3SOIPD_MOD_WNLX: + mod->B3SOIPDwnlx = value->rValue; + mod->B3SOIPDwnlxGiven = TRUE; + break; + case B3SOIPD_MOD_WDVT0: + mod->B3SOIPDwdvt0 = value->rValue; + mod->B3SOIPDwdvt0Given = TRUE; + break; + case B3SOIPD_MOD_WDVT1: + mod->B3SOIPDwdvt1 = value->rValue; + mod->B3SOIPDwdvt1Given = TRUE; + break; + case B3SOIPD_MOD_WDVT2: + mod->B3SOIPDwdvt2 = value->rValue; + mod->B3SOIPDwdvt2Given = TRUE; + break; + case B3SOIPD_MOD_WDVT0W: + mod->B3SOIPDwdvt0w = value->rValue; + mod->B3SOIPDwdvt0wGiven = TRUE; + break; + case B3SOIPD_MOD_WDVT1W: + mod->B3SOIPDwdvt1w = value->rValue; + mod->B3SOIPDwdvt1wGiven = TRUE; + break; + case B3SOIPD_MOD_WDVT2W: + mod->B3SOIPDwdvt2w = value->rValue; + mod->B3SOIPDwdvt2wGiven = TRUE; + break; + case B3SOIPD_MOD_WU0 : + mod->B3SOIPDwu0 = value->rValue; + mod->B3SOIPDwu0Given = TRUE; + break; + case B3SOIPD_MOD_WUA: + mod->B3SOIPDwua = value->rValue; + mod->B3SOIPDwuaGiven = TRUE; + break; + case B3SOIPD_MOD_WUB: + mod->B3SOIPDwub = value->rValue; + mod->B3SOIPDwubGiven = TRUE; + break; + case B3SOIPD_MOD_WUC: + mod->B3SOIPDwuc = value->rValue; + mod->B3SOIPDwucGiven = TRUE; + break; + case B3SOIPD_MOD_WVSAT: + mod->B3SOIPDwvsat = value->rValue; + mod->B3SOIPDwvsatGiven = TRUE; + break; + case B3SOIPD_MOD_WA0: + mod->B3SOIPDwa0 = value->rValue; + mod->B3SOIPDwa0Given = TRUE; + break; + case B3SOIPD_MOD_WAGS: + mod->B3SOIPDwags= value->rValue; + mod->B3SOIPDwagsGiven = TRUE; + break; + case B3SOIPD_MOD_WB0 : + mod->B3SOIPDwb0 = value->rValue; + mod->B3SOIPDwb0Given = TRUE; + break; + case B3SOIPD_MOD_WB1 : + mod->B3SOIPDwb1 = value->rValue; + mod->B3SOIPDwb1Given = TRUE; + break; + case B3SOIPD_MOD_WKETA: + mod->B3SOIPDwketa = value->rValue; + mod->B3SOIPDwketaGiven = TRUE; + break; + case B3SOIPD_MOD_WKETAS: + mod->B3SOIPDwketas = value->rValue; + mod->B3SOIPDwketasGiven = TRUE; + break; + case B3SOIPD_MOD_WA1: + mod->B3SOIPDwa1 = value->rValue; + mod->B3SOIPDwa1Given = TRUE; + break; + case B3SOIPD_MOD_WA2: + mod->B3SOIPDwa2 = value->rValue; + mod->B3SOIPDwa2Given = TRUE; + break; + case B3SOIPD_MOD_WRDSW: + mod->B3SOIPDwrdsw = value->rValue; + mod->B3SOIPDwrdswGiven = TRUE; + break; + case B3SOIPD_MOD_WPRWB: + mod->B3SOIPDwprwb = value->rValue; + mod->B3SOIPDwprwbGiven = TRUE; + break; + case B3SOIPD_MOD_WPRWG: + mod->B3SOIPDwprwg = value->rValue; + mod->B3SOIPDwprwgGiven = TRUE; + break; + case B3SOIPD_MOD_WWR : + mod->B3SOIPDwwr = value->rValue; + mod->B3SOIPDwwrGiven = TRUE; + break; + case B3SOIPD_MOD_WNFACTOR : + mod->B3SOIPDwnfactor = value->rValue; + mod->B3SOIPDwnfactorGiven = TRUE; + break; + case B3SOIPD_MOD_WDWG : + mod->B3SOIPDwdwg = value->rValue; + mod->B3SOIPDwdwgGiven = TRUE; + break; + case B3SOIPD_MOD_WDWB : + mod->B3SOIPDwdwb = value->rValue; + mod->B3SOIPDwdwbGiven = TRUE; + break; + case B3SOIPD_MOD_WVOFF: + mod->B3SOIPDwvoff = value->rValue; + mod->B3SOIPDwvoffGiven = TRUE; + break; + case B3SOIPD_MOD_WETA0: + mod->B3SOIPDweta0 = value->rValue; + mod->B3SOIPDweta0Given = TRUE; + break; + case B3SOIPD_MOD_WETAB: + mod->B3SOIPDwetab = value->rValue; + mod->B3SOIPDwetabGiven = TRUE; + break; + case B3SOIPD_MOD_WDSUB: + mod->B3SOIPDwdsub = value->rValue; + mod->B3SOIPDwdsubGiven = TRUE; + break; + case B3SOIPD_MOD_WCIT : + mod->B3SOIPDwcit = value->rValue; + mod->B3SOIPDwcitGiven = TRUE; + break; + case B3SOIPD_MOD_WCDSC : + mod->B3SOIPDwcdsc = value->rValue; + mod->B3SOIPDwcdscGiven = TRUE; + break; + case B3SOIPD_MOD_WCDSCB : + mod->B3SOIPDwcdscb = value->rValue; + mod->B3SOIPDwcdscbGiven = TRUE; + break; + case B3SOIPD_MOD_WCDSCD : + mod->B3SOIPDwcdscd = value->rValue; + mod->B3SOIPDwcdscdGiven = TRUE; + break; + case B3SOIPD_MOD_WPCLM: + mod->B3SOIPDwpclm = value->rValue; + mod->B3SOIPDwpclmGiven = TRUE; + break; + case B3SOIPD_MOD_WPDIBL1: + mod->B3SOIPDwpdibl1 = value->rValue; + mod->B3SOIPDwpdibl1Given = TRUE; + break; + case B3SOIPD_MOD_WPDIBL2: + mod->B3SOIPDwpdibl2 = value->rValue; + mod->B3SOIPDwpdibl2Given = TRUE; + break; + case B3SOIPD_MOD_WPDIBLB: + mod->B3SOIPDwpdiblb = value->rValue; + mod->B3SOIPDwpdiblbGiven = TRUE; + break; + case B3SOIPD_MOD_WDROUT: + mod->B3SOIPDwdrout = value->rValue; + mod->B3SOIPDwdroutGiven = TRUE; + break; + case B3SOIPD_MOD_WPVAG: + mod->B3SOIPDwpvag = value->rValue; + mod->B3SOIPDwpvagGiven = TRUE; + break; + case B3SOIPD_MOD_WDELTA : + mod->B3SOIPDwdelta = value->rValue; + mod->B3SOIPDwdeltaGiven = TRUE; + break; + case B3SOIPD_MOD_WALPHA0 : + mod->B3SOIPDwalpha0 = value->rValue; + mod->B3SOIPDwalpha0Given = TRUE; + break; + case B3SOIPD_MOD_WFBJTII : + mod->B3SOIPDwfbjtii = value->rValue; + mod->B3SOIPDwfbjtiiGiven = TRUE; + break; + case B3SOIPD_MOD_WBETA0 : + mod->B3SOIPDwbeta0 = value->rValue; + mod->B3SOIPDwbeta0Given = TRUE; + break; + case B3SOIPD_MOD_WBETA1 : + mod->B3SOIPDwbeta1 = value->rValue; + mod->B3SOIPDwbeta1Given = TRUE; + break; + case B3SOIPD_MOD_WBETA2 : + mod->B3SOIPDwbeta2 = value->rValue; + mod->B3SOIPDwbeta2Given = TRUE; + break; + case B3SOIPD_MOD_WVDSATII0 : + mod->B3SOIPDwvdsatii0 = value->rValue; + mod->B3SOIPDwvdsatii0Given = TRUE; + break; + case B3SOIPD_MOD_WLII : + mod->B3SOIPDwlii = value->rValue; + mod->B3SOIPDwliiGiven = TRUE; + break; + case B3SOIPD_MOD_WESATII : + mod->B3SOIPDwesatii = value->rValue; + mod->B3SOIPDwesatiiGiven = TRUE; + break; + case B3SOIPD_MOD_WSII0 : + mod->B3SOIPDwsii0 = value->rValue; + mod->B3SOIPDwsii0Given = TRUE; + break; + case B3SOIPD_MOD_WSII1 : + mod->B3SOIPDwsii1 = value->rValue; + mod->B3SOIPDwsii1Given = TRUE; + break; + case B3SOIPD_MOD_WSII2 : + mod->B3SOIPDwsii2 = value->rValue; + mod->B3SOIPDwsii2Given = TRUE; + break; + case B3SOIPD_MOD_WSIID : + mod->B3SOIPDwsiid = value->rValue; + mod->B3SOIPDwsiidGiven = TRUE; + break; + case B3SOIPD_MOD_WAGIDL : + mod->B3SOIPDwagidl = value->rValue; + mod->B3SOIPDwagidlGiven = TRUE; + break; + case B3SOIPD_MOD_WBGIDL : + mod->B3SOIPDwbgidl = value->rValue; + mod->B3SOIPDwbgidlGiven = TRUE; + break; + case B3SOIPD_MOD_WNGIDL : + mod->B3SOIPDwngidl = value->rValue; + mod->B3SOIPDwngidlGiven = TRUE; + break; + case B3SOIPD_MOD_WNTUN : + mod->B3SOIPDwntun = value->rValue; + mod->B3SOIPDwntunGiven = TRUE; + break; + case B3SOIPD_MOD_WNDIODE : + mod->B3SOIPDwndiode = value->rValue; + mod->B3SOIPDwndiodeGiven = TRUE; + break; + case B3SOIPD_MOD_WNRECF0 : + mod->B3SOIPDwnrecf0 = value->rValue; + mod->B3SOIPDwnrecf0Given = TRUE; + break; + case B3SOIPD_MOD_WNRECR0 : + mod->B3SOIPDwnrecr0 = value->rValue; + mod->B3SOIPDwnrecr0Given = TRUE; + break; + case B3SOIPD_MOD_WISBJT : + mod->B3SOIPDwisbjt = value->rValue; + mod->B3SOIPDwisbjtGiven = TRUE; + break; + case B3SOIPD_MOD_WISDIF : + mod->B3SOIPDwisdif = value->rValue; + mod->B3SOIPDwisdifGiven = TRUE; + break; + case B3SOIPD_MOD_WISREC : + mod->B3SOIPDwisrec = value->rValue; + mod->B3SOIPDwisrecGiven = TRUE; + break; + case B3SOIPD_MOD_WISTUN : + mod->B3SOIPDwistun = value->rValue; + mod->B3SOIPDwistunGiven = TRUE; + break; + case B3SOIPD_MOD_WVREC0 : + mod->B3SOIPDwvrec0 = value->rValue; + mod->B3SOIPDwvrec0Given = TRUE; + break; + case B3SOIPD_MOD_WVTUN0 : + mod->B3SOIPDwvtun0 = value->rValue; + mod->B3SOIPDwvtun0Given = TRUE; + break; + case B3SOIPD_MOD_WNBJT : + mod->B3SOIPDwnbjt = value->rValue; + mod->B3SOIPDwnbjtGiven = TRUE; + break; + case B3SOIPD_MOD_WLBJT0 : + mod->B3SOIPDwlbjt0 = value->rValue; + mod->B3SOIPDwlbjt0Given = TRUE; + break; + case B3SOIPD_MOD_WVABJT : + mod->B3SOIPDwvabjt = value->rValue; + mod->B3SOIPDwvabjtGiven = TRUE; + break; + case B3SOIPD_MOD_WAELY : + mod->B3SOIPDwaely = value->rValue; + mod->B3SOIPDwaelyGiven = TRUE; + break; + case B3SOIPD_MOD_WAHLI : + mod->B3SOIPDwahli = value->rValue; + mod->B3SOIPDwahliGiven = TRUE; + break; + /* CV Model */ + case B3SOIPD_MOD_WVSDFB : + mod->B3SOIPDwvsdfb = value->rValue; + mod->B3SOIPDwvsdfbGiven = TRUE; + break; + case B3SOIPD_MOD_WVSDTH : + mod->B3SOIPDwvsdth = value->rValue; + mod->B3SOIPDwvsdthGiven = TRUE; + break; + case B3SOIPD_MOD_WDELVT : + mod->B3SOIPDwdelvt = value->rValue; + mod->B3SOIPDwdelvtGiven = TRUE; + break; + case B3SOIPD_MOD_WACDE : + mod->B3SOIPDwacde = value->rValue; + mod->B3SOIPDwacdeGiven = TRUE; + break; + case B3SOIPD_MOD_WMOIN : + mod->B3SOIPDwmoin = value->rValue; + mod->B3SOIPDwmoinGiven = TRUE; + break; - /* Cross-term Dependence */ - case B3SOIPD_MOD_PNPEAK: - mod->B3SOIPDpnpeak = value->rValue; - mod->B3SOIPDpnpeakGiven = TRUE; - break; - case B3SOIPD_MOD_PNSUB: - mod->B3SOIPDpnsub = value->rValue; - mod->B3SOIPDpnsubGiven = TRUE; - break; - case B3SOIPD_MOD_PNGATE: - mod->B3SOIPDpngate = value->rValue; - mod->B3SOIPDpngateGiven = TRUE; - break; - case B3SOIPD_MOD_PVTH0: - mod->B3SOIPDpvth0 = value->rValue; - mod->B3SOIPDpvth0Given = TRUE; - break; - case B3SOIPD_MOD_PK1: - mod->B3SOIPDpk1 = value->rValue; - mod->B3SOIPDpk1Given = TRUE; - break; - case B3SOIPD_MOD_PK1W1: - mod->B3SOIPDpk1w1 = value->rValue; - mod->B3SOIPDpk1w1Given = TRUE; - break; - case B3SOIPD_MOD_PK1W2: - mod->B3SOIPDpk1w2 = value->rValue; - mod->B3SOIPDpk1w2Given = TRUE; - break; - case B3SOIPD_MOD_PK2: - mod->B3SOIPDpk2 = value->rValue; - mod->B3SOIPDpk2Given = TRUE; - break; - case B3SOIPD_MOD_PK3: - mod->B3SOIPDpk3 = value->rValue; - mod->B3SOIPDpk3Given = TRUE; - break; - case B3SOIPD_MOD_PK3B: - mod->B3SOIPDpk3b = value->rValue; - mod->B3SOIPDpk3bGiven = TRUE; - break; - case B3SOIPD_MOD_PKB1: - mod->B3SOIPDpkb1 = value->rValue; - mod->B3SOIPDpkb1Given = TRUE; - break; - case B3SOIPD_MOD_PW0: - mod->B3SOIPDpw0 = value->rValue; - mod->B3SOIPDpw0Given = TRUE; - break; - case B3SOIPD_MOD_PNLX: - mod->B3SOIPDpnlx = value->rValue; - mod->B3SOIPDpnlxGiven = TRUE; - break; - case B3SOIPD_MOD_PDVT0: - mod->B3SOIPDpdvt0 = value->rValue; - mod->B3SOIPDpdvt0Given = TRUE; - break; - case B3SOIPD_MOD_PDVT1: - mod->B3SOIPDpdvt1 = value->rValue; - mod->B3SOIPDpdvt1Given = TRUE; - break; - case B3SOIPD_MOD_PDVT2: - mod->B3SOIPDpdvt2 = value->rValue; - mod->B3SOIPDpdvt2Given = TRUE; - break; - case B3SOIPD_MOD_PDVT0W: - mod->B3SOIPDpdvt0w = value->rValue; - mod->B3SOIPDpdvt0wGiven = TRUE; - break; - case B3SOIPD_MOD_PDVT1W: - mod->B3SOIPDpdvt1w = value->rValue; - mod->B3SOIPDpdvt1wGiven = TRUE; - break; - case B3SOIPD_MOD_PDVT2W: - mod->B3SOIPDpdvt2w = value->rValue; - mod->B3SOIPDpdvt2wGiven = TRUE; - break; - case B3SOIPD_MOD_PU0: - mod->B3SOIPDpu0 = value->rValue; - mod->B3SOIPDpu0Given = TRUE; - break; - case B3SOIPD_MOD_PUA: - mod->B3SOIPDpua = value->rValue; - mod->B3SOIPDpuaGiven = TRUE; - break; - case B3SOIPD_MOD_PUB: - mod->B3SOIPDpub = value->rValue; - mod->B3SOIPDpubGiven = TRUE; - break; - case B3SOIPD_MOD_PUC: - mod->B3SOIPDpuc = value->rValue; - mod->B3SOIPDpucGiven = TRUE; - break; - case B3SOIPD_MOD_PVSAT: - mod->B3SOIPDpvsat = value->rValue; - mod->B3SOIPDpvsatGiven = TRUE; - break; - case B3SOIPD_MOD_PA0: - mod->B3SOIPDpa0 = value->rValue; - mod->B3SOIPDpa0Given = TRUE; - break; - case B3SOIPD_MOD_PAGS: - mod->B3SOIPDpags = value->rValue; - mod->B3SOIPDpagsGiven = TRUE; - break; - case B3SOIPD_MOD_PB0: - mod->B3SOIPDpb0 = value->rValue; - mod->B3SOIPDpb0Given = TRUE; - break; - case B3SOIPD_MOD_PB1: - mod->B3SOIPDpb1 = value->rValue; - mod->B3SOIPDpb1Given = TRUE; - break; - case B3SOIPD_MOD_PKETA: - mod->B3SOIPDpketa = value->rValue; - mod->B3SOIPDpketaGiven = TRUE; - break; - case B3SOIPD_MOD_PKETAS: - mod->B3SOIPDpketas = value->rValue; - mod->B3SOIPDpketasGiven = TRUE; - break; - case B3SOIPD_MOD_PA1: - mod->B3SOIPDpa1 = value->rValue; - mod->B3SOIPDpa1Given = TRUE; - break; - case B3SOIPD_MOD_PA2: - mod->B3SOIPDpa2 = value->rValue; - mod->B3SOIPDpa2Given = TRUE; - break; - case B3SOIPD_MOD_PRDSW: - mod->B3SOIPDprdsw = value->rValue; - mod->B3SOIPDprdswGiven = TRUE; - break; - case B3SOIPD_MOD_PPRWB: - mod->B3SOIPDpprwb = value->rValue; - mod->B3SOIPDpprwbGiven = TRUE; - break; - case B3SOIPD_MOD_PPRWG: - mod->B3SOIPDpprwg = value->rValue; - mod->B3SOIPDpprwgGiven = TRUE; - break; - case B3SOIPD_MOD_PWR: - mod->B3SOIPDpwr = value->rValue; - mod->B3SOIPDpwrGiven = TRUE; - break; - case B3SOIPD_MOD_PNFACTOR: - mod->B3SOIPDpnfactor = value->rValue; - mod->B3SOIPDpnfactorGiven = TRUE; - break; - case B3SOIPD_MOD_PDWG: - mod->B3SOIPDpdwg = value->rValue; - mod->B3SOIPDpdwgGiven = TRUE; - break; - case B3SOIPD_MOD_PDWB: - mod->B3SOIPDpdwb = value->rValue; - mod->B3SOIPDpdwbGiven = TRUE; - break; - case B3SOIPD_MOD_PVOFF: - mod->B3SOIPDpvoff = value->rValue; - mod->B3SOIPDpvoffGiven = TRUE; - break; - case B3SOIPD_MOD_PETA0: - mod->B3SOIPDpeta0 = value->rValue; - mod->B3SOIPDpeta0Given = TRUE; - break; - case B3SOIPD_MOD_PETAB: - mod->B3SOIPDpetab = value->rValue; - mod->B3SOIPDpetabGiven = TRUE; - break; - case B3SOIPD_MOD_PDSUB: - mod->B3SOIPDpdsub = value->rValue; - mod->B3SOIPDpdsubGiven = TRUE; - break; - case B3SOIPD_MOD_PCIT: - mod->B3SOIPDpcit = value->rValue; - mod->B3SOIPDpcitGiven = TRUE; - break; - case B3SOIPD_MOD_PCDSC: - mod->B3SOIPDpcdsc = value->rValue; - mod->B3SOIPDpcdscGiven = TRUE; - break; - case B3SOIPD_MOD_PCDSCB: - mod->B3SOIPDpcdscb = value->rValue; - mod->B3SOIPDpcdscbGiven = TRUE; - break; - case B3SOIPD_MOD_PCDSCD: - mod->B3SOIPDpcdscd = value->rValue; - mod->B3SOIPDpcdscdGiven = TRUE; - break; - case B3SOIPD_MOD_PPCLM: - mod->B3SOIPDppclm = value->rValue; - mod->B3SOIPDppclmGiven = TRUE; - break; - case B3SOIPD_MOD_PPDIBL1: - mod->B3SOIPDppdibl1 = value->rValue; - mod->B3SOIPDppdibl1Given = TRUE; - break; - case B3SOIPD_MOD_PPDIBL2: - mod->B3SOIPDppdibl2 = value->rValue; - mod->B3SOIPDppdibl2Given = TRUE; - break; - case B3SOIPD_MOD_PPDIBLB: - mod->B3SOIPDppdiblb = value->rValue; - mod->B3SOIPDppdiblbGiven = TRUE; - break; - case B3SOIPD_MOD_PDROUT: - mod->B3SOIPDpdrout = value->rValue; - mod->B3SOIPDpdroutGiven = TRUE; - break; - case B3SOIPD_MOD_PPVAG: - mod->B3SOIPDppvag = value->rValue; - mod->B3SOIPDppvagGiven = TRUE; - break; - case B3SOIPD_MOD_PDELTA: - mod->B3SOIPDpdelta = value->rValue; - mod->B3SOIPDpdeltaGiven = TRUE; - break; - case B3SOIPD_MOD_PALPHA0: - mod->B3SOIPDpalpha0 = value->rValue; - mod->B3SOIPDpalpha0Given = TRUE; - break; - case B3SOIPD_MOD_PFBJTII: - mod->B3SOIPDpfbjtii = value->rValue; - mod->B3SOIPDpfbjtiiGiven = TRUE; - break; - case B3SOIPD_MOD_PBETA0: - mod->B3SOIPDpbeta0 = value->rValue; - mod->B3SOIPDpbeta0Given = TRUE; - break; - case B3SOIPD_MOD_PBETA1: - mod->B3SOIPDpbeta1 = value->rValue; - mod->B3SOIPDpbeta1Given = TRUE; - break; - case B3SOIPD_MOD_PBETA2: - mod->B3SOIPDpbeta2 = value->rValue; - mod->B3SOIPDpbeta2Given = TRUE; - break; - case B3SOIPD_MOD_PVDSATII0: - mod->B3SOIPDpvdsatii0 = value->rValue; - mod->B3SOIPDpvdsatii0Given = TRUE; - break; - case B3SOIPD_MOD_PLII: - mod->B3SOIPDplii = value->rValue; - mod->B3SOIPDpliiGiven = TRUE; - break; - case B3SOIPD_MOD_PESATII: - mod->B3SOIPDpesatii = value->rValue; - mod->B3SOIPDpesatiiGiven = TRUE; - break; - case B3SOIPD_MOD_PSII0: - mod->B3SOIPDpsii0 = value->rValue; - mod->B3SOIPDpsii0Given = TRUE; - break; - case B3SOIPD_MOD_PSII1: - mod->B3SOIPDpsii1 = value->rValue; - mod->B3SOIPDpsii1Given = TRUE; - break; - case B3SOIPD_MOD_PSII2: - mod->B3SOIPDpsii2 = value->rValue; - mod->B3SOIPDpsii2Given = TRUE; - break; - case B3SOIPD_MOD_PSIID: - mod->B3SOIPDpsiid = value->rValue; - mod->B3SOIPDpsiidGiven = TRUE; - break; - case B3SOIPD_MOD_PAGIDL: - mod->B3SOIPDpagidl = value->rValue; - mod->B3SOIPDpagidlGiven = TRUE; - break; - case B3SOIPD_MOD_PBGIDL: - mod->B3SOIPDpbgidl = value->rValue; - mod->B3SOIPDpbgidlGiven = TRUE; - break; - case B3SOIPD_MOD_PNGIDL: - mod->B3SOIPDpngidl = value->rValue; - mod->B3SOIPDpngidlGiven = TRUE; - break; - case B3SOIPD_MOD_PNTUN: - mod->B3SOIPDpntun = value->rValue; - mod->B3SOIPDpntunGiven = TRUE; - break; - case B3SOIPD_MOD_PNDIODE: - mod->B3SOIPDpndiode = value->rValue; - mod->B3SOIPDpndiodeGiven = TRUE; - break; - case B3SOIPD_MOD_PNRECF0: - mod->B3SOIPDpnrecf0 = value->rValue; - mod->B3SOIPDpnrecf0Given = TRUE; - break; - case B3SOIPD_MOD_PNRECR0: - mod->B3SOIPDpnrecr0 = value->rValue; - mod->B3SOIPDpnrecr0Given = TRUE; - break; - case B3SOIPD_MOD_PISBJT: - mod->B3SOIPDpisbjt = value->rValue; - mod->B3SOIPDpisbjtGiven = TRUE; - break; - case B3SOIPD_MOD_PISDIF: - mod->B3SOIPDpisdif = value->rValue; - mod->B3SOIPDpisdifGiven = TRUE; - break; - case B3SOIPD_MOD_PISREC: - mod->B3SOIPDpisrec = value->rValue; - mod->B3SOIPDpisrecGiven = TRUE; - break; - case B3SOIPD_MOD_PISTUN: - mod->B3SOIPDpistun = value->rValue; - mod->B3SOIPDpistunGiven = TRUE; - break; - case B3SOIPD_MOD_PVREC0: - mod->B3SOIPDpvrec0 = value->rValue; - mod->B3SOIPDpvrec0Given = TRUE; - break; - case B3SOIPD_MOD_PVTUN0: - mod->B3SOIPDpvtun0 = value->rValue; - mod->B3SOIPDpvtun0Given = TRUE; - break; - case B3SOIPD_MOD_PNBJT: - mod->B3SOIPDpnbjt = value->rValue; - mod->B3SOIPDpnbjtGiven = TRUE; - break; - case B3SOIPD_MOD_PLBJT0: - mod->B3SOIPDplbjt0 = value->rValue; - mod->B3SOIPDplbjt0Given = TRUE; - break; - case B3SOIPD_MOD_PVABJT: - mod->B3SOIPDpvabjt = value->rValue; - mod->B3SOIPDpvabjtGiven = TRUE; - break; - case B3SOIPD_MOD_PAELY: - mod->B3SOIPDpaely = value->rValue; - mod->B3SOIPDpaelyGiven = TRUE; - break; - case B3SOIPD_MOD_PAHLI: - mod->B3SOIPDpahli = value->rValue; - mod->B3SOIPDpahliGiven = TRUE; - break; - /* CV Model */ - case B3SOIPD_MOD_PVSDFB: - mod->B3SOIPDpvsdfb = value->rValue; - mod->B3SOIPDpvsdfbGiven = TRUE; - break; - case B3SOIPD_MOD_PVSDTH: - mod->B3SOIPDpvsdth = value->rValue; - mod->B3SOIPDpvsdthGiven = TRUE; - break; - case B3SOIPD_MOD_PDELVT: - mod->B3SOIPDpdelvt = value->rValue; - mod->B3SOIPDpdelvtGiven = TRUE; - break; - case B3SOIPD_MOD_PACDE: - mod->B3SOIPDpacde = value->rValue; - mod->B3SOIPDpacdeGiven = TRUE; - break; - case B3SOIPD_MOD_PMOIN: - mod->B3SOIPDpmoin = value->rValue; - mod->B3SOIPDpmoinGiven = TRUE; - break; + /* Cross-term Dependence */ + case B3SOIPD_MOD_PNPEAK: + mod->B3SOIPDpnpeak = value->rValue; + mod->B3SOIPDpnpeakGiven = TRUE; + break; + case B3SOIPD_MOD_PNSUB: + mod->B3SOIPDpnsub = value->rValue; + mod->B3SOIPDpnsubGiven = TRUE; + break; + case B3SOIPD_MOD_PNGATE: + mod->B3SOIPDpngate = value->rValue; + mod->B3SOIPDpngateGiven = TRUE; + break; + case B3SOIPD_MOD_PVTH0: + mod->B3SOIPDpvth0 = value->rValue; + mod->B3SOIPDpvth0Given = TRUE; + break; + case B3SOIPD_MOD_PK1: + mod->B3SOIPDpk1 = value->rValue; + mod->B3SOIPDpk1Given = TRUE; + break; + case B3SOIPD_MOD_PK1W1: + mod->B3SOIPDpk1w1 = value->rValue; + mod->B3SOIPDpk1w1Given = TRUE; + break; + case B3SOIPD_MOD_PK1W2: + mod->B3SOIPDpk1w2 = value->rValue; + mod->B3SOIPDpk1w2Given = TRUE; + break; + case B3SOIPD_MOD_PK2: + mod->B3SOIPDpk2 = value->rValue; + mod->B3SOIPDpk2Given = TRUE; + break; + case B3SOIPD_MOD_PK3: + mod->B3SOIPDpk3 = value->rValue; + mod->B3SOIPDpk3Given = TRUE; + break; + case B3SOIPD_MOD_PK3B: + mod->B3SOIPDpk3b = value->rValue; + mod->B3SOIPDpk3bGiven = TRUE; + break; + case B3SOIPD_MOD_PKB1 : + mod->B3SOIPDpkb1 = value->rValue; + mod->B3SOIPDpkb1Given = TRUE; + break; + case B3SOIPD_MOD_PW0: + mod->B3SOIPDpw0 = value->rValue; + mod->B3SOIPDpw0Given = TRUE; + break; + case B3SOIPD_MOD_PNLX: + mod->B3SOIPDpnlx = value->rValue; + mod->B3SOIPDpnlxGiven = TRUE; + break; + case B3SOIPD_MOD_PDVT0: + mod->B3SOIPDpdvt0 = value->rValue; + mod->B3SOIPDpdvt0Given = TRUE; + break; + case B3SOIPD_MOD_PDVT1: + mod->B3SOIPDpdvt1 = value->rValue; + mod->B3SOIPDpdvt1Given = TRUE; + break; + case B3SOIPD_MOD_PDVT2: + mod->B3SOIPDpdvt2 = value->rValue; + mod->B3SOIPDpdvt2Given = TRUE; + break; + case B3SOIPD_MOD_PDVT0W: + mod->B3SOIPDpdvt0w = value->rValue; + mod->B3SOIPDpdvt0wGiven = TRUE; + break; + case B3SOIPD_MOD_PDVT1W: + mod->B3SOIPDpdvt1w = value->rValue; + mod->B3SOIPDpdvt1wGiven = TRUE; + break; + case B3SOIPD_MOD_PDVT2W: + mod->B3SOIPDpdvt2w = value->rValue; + mod->B3SOIPDpdvt2wGiven = TRUE; + break; + case B3SOIPD_MOD_PU0 : + mod->B3SOIPDpu0 = value->rValue; + mod->B3SOIPDpu0Given = TRUE; + break; + case B3SOIPD_MOD_PUA: + mod->B3SOIPDpua = value->rValue; + mod->B3SOIPDpuaGiven = TRUE; + break; + case B3SOIPD_MOD_PUB: + mod->B3SOIPDpub = value->rValue; + mod->B3SOIPDpubGiven = TRUE; + break; + case B3SOIPD_MOD_PUC: + mod->B3SOIPDpuc = value->rValue; + mod->B3SOIPDpucGiven = TRUE; + break; + case B3SOIPD_MOD_PVSAT: + mod->B3SOIPDpvsat = value->rValue; + mod->B3SOIPDpvsatGiven = TRUE; + break; + case B3SOIPD_MOD_PA0: + mod->B3SOIPDpa0 = value->rValue; + mod->B3SOIPDpa0Given = TRUE; + break; + case B3SOIPD_MOD_PAGS: + mod->B3SOIPDpags= value->rValue; + mod->B3SOIPDpagsGiven = TRUE; + break; + case B3SOIPD_MOD_PB0 : + mod->B3SOIPDpb0 = value->rValue; + mod->B3SOIPDpb0Given = TRUE; + break; + case B3SOIPD_MOD_PB1 : + mod->B3SOIPDpb1 = value->rValue; + mod->B3SOIPDpb1Given = TRUE; + break; + case B3SOIPD_MOD_PKETA: + mod->B3SOIPDpketa = value->rValue; + mod->B3SOIPDpketaGiven = TRUE; + break; + case B3SOIPD_MOD_PKETAS: + mod->B3SOIPDpketas = value->rValue; + mod->B3SOIPDpketasGiven = TRUE; + break; + case B3SOIPD_MOD_PA1: + mod->B3SOIPDpa1 = value->rValue; + mod->B3SOIPDpa1Given = TRUE; + break; + case B3SOIPD_MOD_PA2: + mod->B3SOIPDpa2 = value->rValue; + mod->B3SOIPDpa2Given = TRUE; + break; + case B3SOIPD_MOD_PRDSW: + mod->B3SOIPDprdsw = value->rValue; + mod->B3SOIPDprdswGiven = TRUE; + break; + case B3SOIPD_MOD_PPRWB: + mod->B3SOIPDpprwb = value->rValue; + mod->B3SOIPDpprwbGiven = TRUE; + break; + case B3SOIPD_MOD_PPRWG: + mod->B3SOIPDpprwg = value->rValue; + mod->B3SOIPDpprwgGiven = TRUE; + break; + case B3SOIPD_MOD_PWR : + mod->B3SOIPDpwr = value->rValue; + mod->B3SOIPDpwrGiven = TRUE; + break; + case B3SOIPD_MOD_PNFACTOR : + mod->B3SOIPDpnfactor = value->rValue; + mod->B3SOIPDpnfactorGiven = TRUE; + break; + case B3SOIPD_MOD_PDWG : + mod->B3SOIPDpdwg = value->rValue; + mod->B3SOIPDpdwgGiven = TRUE; + break; + case B3SOIPD_MOD_PDWB : + mod->B3SOIPDpdwb = value->rValue; + mod->B3SOIPDpdwbGiven = TRUE; + break; + case B3SOIPD_MOD_PVOFF: + mod->B3SOIPDpvoff = value->rValue; + mod->B3SOIPDpvoffGiven = TRUE; + break; + case B3SOIPD_MOD_PETA0: + mod->B3SOIPDpeta0 = value->rValue; + mod->B3SOIPDpeta0Given = TRUE; + break; + case B3SOIPD_MOD_PETAB: + mod->B3SOIPDpetab = value->rValue; + mod->B3SOIPDpetabGiven = TRUE; + break; + case B3SOIPD_MOD_PDSUB: + mod->B3SOIPDpdsub = value->rValue; + mod->B3SOIPDpdsubGiven = TRUE; + break; + case B3SOIPD_MOD_PCIT : + mod->B3SOIPDpcit = value->rValue; + mod->B3SOIPDpcitGiven = TRUE; + break; + case B3SOIPD_MOD_PCDSC : + mod->B3SOIPDpcdsc = value->rValue; + mod->B3SOIPDpcdscGiven = TRUE; + break; + case B3SOIPD_MOD_PCDSCB : + mod->B3SOIPDpcdscb = value->rValue; + mod->B3SOIPDpcdscbGiven = TRUE; + break; + case B3SOIPD_MOD_PCDSCD : + mod->B3SOIPDpcdscd = value->rValue; + mod->B3SOIPDpcdscdGiven = TRUE; + break; + case B3SOIPD_MOD_PPCLM: + mod->B3SOIPDppclm = value->rValue; + mod->B3SOIPDppclmGiven = TRUE; + break; + case B3SOIPD_MOD_PPDIBL1: + mod->B3SOIPDppdibl1 = value->rValue; + mod->B3SOIPDppdibl1Given = TRUE; + break; + case B3SOIPD_MOD_PPDIBL2: + mod->B3SOIPDppdibl2 = value->rValue; + mod->B3SOIPDppdibl2Given = TRUE; + break; + case B3SOIPD_MOD_PPDIBLB: + mod->B3SOIPDppdiblb = value->rValue; + mod->B3SOIPDppdiblbGiven = TRUE; + break; + case B3SOIPD_MOD_PDROUT: + mod->B3SOIPDpdrout = value->rValue; + mod->B3SOIPDpdroutGiven = TRUE; + break; + case B3SOIPD_MOD_PPVAG: + mod->B3SOIPDppvag = value->rValue; + mod->B3SOIPDppvagGiven = TRUE; + break; + case B3SOIPD_MOD_PDELTA : + mod->B3SOIPDpdelta = value->rValue; + mod->B3SOIPDpdeltaGiven = TRUE; + break; + case B3SOIPD_MOD_PALPHA0 : + mod->B3SOIPDpalpha0 = value->rValue; + mod->B3SOIPDpalpha0Given = TRUE; + break; + case B3SOIPD_MOD_PFBJTII : + mod->B3SOIPDpfbjtii = value->rValue; + mod->B3SOIPDpfbjtiiGiven = TRUE; + break; + case B3SOIPD_MOD_PBETA0 : + mod->B3SOIPDpbeta0 = value->rValue; + mod->B3SOIPDpbeta0Given = TRUE; + break; + case B3SOIPD_MOD_PBETA1 : + mod->B3SOIPDpbeta1 = value->rValue; + mod->B3SOIPDpbeta1Given = TRUE; + break; + case B3SOIPD_MOD_PBETA2 : + mod->B3SOIPDpbeta2 = value->rValue; + mod->B3SOIPDpbeta2Given = TRUE; + break; + case B3SOIPD_MOD_PVDSATII0 : + mod->B3SOIPDpvdsatii0 = value->rValue; + mod->B3SOIPDpvdsatii0Given = TRUE; + break; + case B3SOIPD_MOD_PLII : + mod->B3SOIPDplii = value->rValue; + mod->B3SOIPDpliiGiven = TRUE; + break; + case B3SOIPD_MOD_PESATII : + mod->B3SOIPDpesatii = value->rValue; + mod->B3SOIPDpesatiiGiven = TRUE; + break; + case B3SOIPD_MOD_PSII0 : + mod->B3SOIPDpsii0 = value->rValue; + mod->B3SOIPDpsii0Given = TRUE; + break; + case B3SOIPD_MOD_PSII1 : + mod->B3SOIPDpsii1 = value->rValue; + mod->B3SOIPDpsii1Given = TRUE; + break; + case B3SOIPD_MOD_PSII2 : + mod->B3SOIPDpsii2 = value->rValue; + mod->B3SOIPDpsii2Given = TRUE; + break; + case B3SOIPD_MOD_PSIID : + mod->B3SOIPDpsiid = value->rValue; + mod->B3SOIPDpsiidGiven = TRUE; + break; + case B3SOIPD_MOD_PAGIDL : + mod->B3SOIPDpagidl = value->rValue; + mod->B3SOIPDpagidlGiven = TRUE; + break; + case B3SOIPD_MOD_PBGIDL : + mod->B3SOIPDpbgidl = value->rValue; + mod->B3SOIPDpbgidlGiven = TRUE; + break; + case B3SOIPD_MOD_PNGIDL : + mod->B3SOIPDpngidl = value->rValue; + mod->B3SOIPDpngidlGiven = TRUE; + break; + case B3SOIPD_MOD_PNTUN : + mod->B3SOIPDpntun = value->rValue; + mod->B3SOIPDpntunGiven = TRUE; + break; + case B3SOIPD_MOD_PNDIODE : + mod->B3SOIPDpndiode = value->rValue; + mod->B3SOIPDpndiodeGiven = TRUE; + break; + case B3SOIPD_MOD_PNRECF0 : + mod->B3SOIPDpnrecf0 = value->rValue; + mod->B3SOIPDpnrecf0Given = TRUE; + break; + case B3SOIPD_MOD_PNRECR0 : + mod->B3SOIPDpnrecr0 = value->rValue; + mod->B3SOIPDpnrecr0Given = TRUE; + break; + case B3SOIPD_MOD_PISBJT : + mod->B3SOIPDpisbjt = value->rValue; + mod->B3SOIPDpisbjtGiven = TRUE; + break; + case B3SOIPD_MOD_PISDIF : + mod->B3SOIPDpisdif = value->rValue; + mod->B3SOIPDpisdifGiven = TRUE; + break; + case B3SOIPD_MOD_PISREC : + mod->B3SOIPDpisrec = value->rValue; + mod->B3SOIPDpisrecGiven = TRUE; + break; + case B3SOIPD_MOD_PISTUN : + mod->B3SOIPDpistun = value->rValue; + mod->B3SOIPDpistunGiven = TRUE; + break; + case B3SOIPD_MOD_PVREC0 : + mod->B3SOIPDpvrec0 = value->rValue; + mod->B3SOIPDpvrec0Given = TRUE; + break; + case B3SOIPD_MOD_PVTUN0 : + mod->B3SOIPDpvtun0 = value->rValue; + mod->B3SOIPDpvtun0Given = TRUE; + break; + case B3SOIPD_MOD_PNBJT : + mod->B3SOIPDpnbjt = value->rValue; + mod->B3SOIPDpnbjtGiven = TRUE; + break; + case B3SOIPD_MOD_PLBJT0 : + mod->B3SOIPDplbjt0 = value->rValue; + mod->B3SOIPDplbjt0Given = TRUE; + break; + case B3SOIPD_MOD_PVABJT : + mod->B3SOIPDpvabjt = value->rValue; + mod->B3SOIPDpvabjtGiven = TRUE; + break; + case B3SOIPD_MOD_PAELY : + mod->B3SOIPDpaely = value->rValue; + mod->B3SOIPDpaelyGiven = TRUE; + break; + case B3SOIPD_MOD_PAHLI : + mod->B3SOIPDpahli = value->rValue; + mod->B3SOIPDpahliGiven = TRUE; + break; + /* CV Model */ + case B3SOIPD_MOD_PVSDFB : + mod->B3SOIPDpvsdfb = value->rValue; + mod->B3SOIPDpvsdfbGiven = TRUE; + break; + case B3SOIPD_MOD_PVSDTH : + mod->B3SOIPDpvsdth = value->rValue; + mod->B3SOIPDpvsdthGiven = TRUE; + break; + case B3SOIPD_MOD_PDELVT : + mod->B3SOIPDpdelvt = value->rValue; + mod->B3SOIPDpdelvtGiven = TRUE; + break; + case B3SOIPD_MOD_PACDE : + mod->B3SOIPDpacde = value->rValue; + mod->B3SOIPDpacdeGiven = TRUE; + break; + case B3SOIPD_MOD_PMOIN : + mod->B3SOIPDpmoin = value->rValue; + mod->B3SOIPDpmoinGiven = TRUE; + break; /* Added for binning - END */ - case B3SOIPD_MOD_NMOS: - if (value->iValue) - { - mod->B3SOIPDtype = 1; - mod->B3SOIPDtypeGiven = TRUE; - } - break; - case B3SOIPD_MOD_PMOS: - if (value->iValue) - { - mod->B3SOIPDtype = -1; - mod->B3SOIPDtypeGiven = TRUE; - } - break; - default: - return (E_BADPARM); + case B3SOIPD_MOD_NMOS : + if(value->iValue) { + mod->B3SOIPDtype = 1; + mod->B3SOIPDtypeGiven = TRUE; + } + break; + case B3SOIPD_MOD_PMOS : + if(value->iValue) { + mod->B3SOIPDtype = - 1; + mod->B3SOIPDtypeGiven = TRUE; + } + break; + default: + return(E_BADPARM); } - return (OK); + return(OK); } + + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdnoi.c b/src/spicelib/devices/bsim3soi_pd/b3soipdnoi.c index 244550a03..128459503 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdnoi.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdnoi.c @@ -2,17 +2,22 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soipdnoi.c 98/5/01 +Modified by Hui Wan 02/3/5 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ + #include "ngspice.h" -#include -#include #include "b3soipddef.h" #include "cktdefs.h" #include "iferrmsg.h" #include "noisedef.h" #include "suffix.h" -#include "const.h" /* jwan */ +#include "const.h" /* jwan */ /* * B3SOIPDnoise (mode, operation, firstModel, ckt, data, OnDens) @@ -40,393 +45,363 @@ File: b3soipdnoi.c 98/5/01 Flicker noise = SPICE2 model */ -extern void NevalSrc (); -extern double Nintegrate (); +extern void NevalSrc(); +extern double Nintegrate(); double -B3SOIPDStrongInversionNoiseEval (vgs, vds, model, here, freq, temp) - double vgs, vds, freq, temp; - B3SOIPDmodel *model; - B3SOIPDinstance *here; +B3SOIPDStrongInversionNoiseEval(double vgs, double vds, B3SOIPDmodel *model, + B3SOIPDinstance *here, double freq, + double temp) { - struct b3soipdSizeDependParam *pParam; - double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; - double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi; - double req, ceq; - - pParam = here->pParam; - cd = fabs (here->B3SOIPDcd); - if (vds > here->B3SOIPDvdsat) - { - esat = 2.0 * pParam->B3SOIPDvsattemp / here->B3SOIPDueff; - T0 = - ((((vds - - here->B3SOIPDvdsat) / pParam->B3SOIPDlitl) + - model->B3SOIPDem) / esat); - DelClm = pParam->B3SOIPDlitl * log (MAX (T0, N_MINLOG)); +struct b3soipdSizeDependParam *pParam; +double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; +double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi; +double req, ceq; + + pParam = here->pParam; + cd = fabs(here->B3SOIPDcd) * here->B3SOIPDm; + +/* v2.2.3 bug fix */ + if(model->B3SOIPDem<=0.0) DelClm = 0.0; + else { + esat = 2.0 * pParam->B3SOIPDvsattemp / here->B3SOIPDueff; + T0 = ((((vds - here->B3SOIPDVdseff) / pParam->B3SOIPDlitl) + + model->B3SOIPDem) / esat); + DelClm = pParam->B3SOIPDlitl * log (MAX(T0, N_MINLOG)); } - else - DelClm = 0.0; - EffFreq = pow (freq, model->B3SOIPDef); - T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->B3SOIPDueff; - T2 = 1.0e8 * EffFreq * model->B3SOIPDcox - * pParam->B3SOIPDleff * pParam->B3SOIPDleff; - Vgst = vgs - here->B3SOIPDvon; - N0 = model->B3SOIPDcox * Vgst / CHARGE; - if (N0 < 0.0) - N0 = 0.0; - Nl = model->B3SOIPDcox * (Vgst - MIN (vds, here->B3SOIPDvdsat)) / CHARGE; - if (Nl < 0.0) - Nl = 0.0; - - T3 = model->B3SOIPDoxideTrapDensityA - * log (MAX (((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); - T4 = model->B3SOIPDoxideTrapDensityB * (N0 - Nl); - T5 = model->B3SOIPDoxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = 8.62e-5 * temp * cd * cd; - T7 = 1.0e8 * EffFreq * pParam->B3SOIPDleff - * pParam->B3SOIPDleff * pParam->B3SOIPDweff; - T8 = model->B3SOIPDoxideTrapDensityA + model->B3SOIPDoxideTrapDensityB * Nl - + model->B3SOIPDoxideTrapDensityC * Nl * Nl; - T9 = (Nl + 2.0e14) * (Nl + 2.0e14); - - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - - return Ssi; + + + EffFreq = pow(freq, model->B3SOIPDef); + T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->B3SOIPDueff; + T2 = 1.0e8 * EffFreq * model->B3SOIPDcox + * pParam->B3SOIPDleff * pParam->B3SOIPDleff; + +/* v2.2.3 bug fix */ + N0 = model->B3SOIPDcox * here->B3SOIPDVgsteff / CHARGE; + Nl = model->B3SOIPDcox * here->B3SOIPDVgsteff + * (1.0 - here->B3SOIPDAbovVgst2Vtm * here->B3SOIPDVdseff) / CHARGE; + + + T3 = model->B3SOIPDoxideTrapDensityA + * log(MAX(((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); + T4 = model->B3SOIPDoxideTrapDensityB * (N0 - Nl); + T5 = model->B3SOIPDoxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); + + T6 = 8.62e-5 * temp * cd * cd; + T7 = 1.0e8 * EffFreq * pParam->B3SOIPDleff + * pParam->B3SOIPDleff * pParam->B3SOIPDweff * here->B3SOIPDm; + T8 = model->B3SOIPDoxideTrapDensityA + model->B3SOIPDoxideTrapDensityB * Nl + + model->B3SOIPDoxideTrapDensityC * Nl * Nl; + T9 = (Nl + 2.0e14) * (Nl + 2.0e14); + + Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; + + return Ssi; } int -B3SOIPDnoise (mode, operation, inModel, ckt, data, OnDens) - int mode, operation; - GENmodel *inModel; - CKTcircuit *ckt; - Ndata *data; - double *OnDens; +B3SOIPDnoise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt, + Ndata *data, double *OnDens) { - B3SOIPDmodel *model = (B3SOIPDmodel *) inModel; - B3SOIPDinstance *here; - struct b3soipdSizeDependParam *pParam; - char name[N_MXVLNTH]; - double tempOnoise; - double tempInoise; - double noizDens[B3SOIPDNSRCS]; - double lnNdens[B3SOIPDNSRCS]; - - double vgs, vds, Slimit; - double N0, Nl; - double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13; - double n, ExpArg, Ssi, Swi; - - int error, i; - - /* define the names of the noise sources */ - static char *B3SOIPDnNames[B3SOIPDNSRCS] = { /* Note that we have to keep the order */ - ".rd", /* noise due to rd */ - /* consistent with the index definitions */ - ".rs", /* noise due to rs */ - /* in B3SOIPDdefs.h */ - ".id", /* noise due to id */ - ".1overf", /* flicker (1/f) noise */ - ".fb", /* noise due to floating body */ - "" /* total transistor noise */ - }; - - for (; model != NULL; model = model->B3SOIPDnextModel) - { - for (here = model->B3SOIPDinstances; here != NULL; - here = here->B3SOIPDnextInstance) - { - 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 < B3SOIPDNSRCS; i++) - { - (void) sprintf (name, "onoise.%s%s", - here->B3SOIPDname, - B3SOIPDnNames[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 < B3SOIPDNSRCS; i++) - { - (void) sprintf (name, "onoise_total.%s%s", - here->B3SOIPDname, - B3SOIPDnNames[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->B3SOIPDname, - B3SOIPDnNames[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: - NevalSrc (&noizDens[B3SOIPDRDNOIZ], - &lnNdens[B3SOIPDRDNOIZ], ckt, THERMNOISE, - here->B3SOIPDdNodePrime, here->B3SOIPDdNode, - here->B3SOIPDdrainConductance); - - NevalSrc (&noizDens[B3SOIPDRSNOIZ], - &lnNdens[B3SOIPDRSNOIZ], ckt, THERMNOISE, - here->B3SOIPDsNodePrime, here->B3SOIPDsNode, - here->B3SOIPDsourceConductance); - - switch (model->B3SOIPDnoiMod) - { - case 1: - case 3: - NevalSrc (&noizDens[B3SOIPDIDNOIZ], - &lnNdens[B3SOIPDIDNOIZ], ckt, - THERMNOISE, here->B3SOIPDdNodePrime, - here->B3SOIPDsNodePrime, - (2.0 / 3.0 * fabs (here->B3SOIPDgm - + here->B3SOIPDgds - + here->B3SOIPDgmbs))); - break; - case 2: - case 4: - NevalSrc (&noizDens[B3SOIPDIDNOIZ], - &lnNdens[B3SOIPDIDNOIZ], ckt, - THERMNOISE, here->B3SOIPDdNodePrime, - here->B3SOIPDsNodePrime, - (here->B3SOIPDueff - * fabs (here->B3SOIPDqinv - / (pParam->B3SOIPDleff - * pParam->B3SOIPDleff)))); - break; - } - NevalSrc (&noizDens[B3SOIPDFLNOIZ], (double *) NULL, - ckt, N_GAIN, here->B3SOIPDdNodePrime, - here->B3SOIPDsNodePrime, (double) 0.0); - - switch (model->B3SOIPDnoiMod) - { - case 1: - case 4: - noizDens[B3SOIPDFLNOIZ] *= model->B3SOIPDkf - * exp (model->B3SOIPDaf - * log (MAX (fabs (here->B3SOIPDcd), - N_MINLOG))) - / (pow (data->freq, model->B3SOIPDef) - * pParam->B3SOIPDleff - * pParam->B3SOIPDleff * model->B3SOIPDcox); +B3SOIPDmodel *model = (B3SOIPDmodel *)inModel; +B3SOIPDinstance *here; +struct b3soipdSizeDependParam *pParam; +char name[N_MXVLNTH]; +double tempOnoise; +double tempInoise; +double noizDens[B3SOIPDNSRCS]; +double lnNdens[B3SOIPDNSRCS]; + +double vgs, vds, Slimit; +double N0, Nl; +double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13; +double n, ExpArg, Ssi, Swi; + +int error, i; + + /* define the names of the noise sources */ + static char *B3SOIPDnNames[B3SOIPDNSRCS] = + { /* Note that we have to keep the order */ + ".rd", /* noise due to rd */ + /* consistent with the index definitions */ + ".rs", /* noise due to rs */ + /* in B3SOIPDdefs.h */ + ".id", /* noise due to id */ + ".1overf", /* flicker (1/f) noise */ + ".fb", /* noise due to floating body */ + "" /* total transistor noise */ + }; + + for (; model != NULL; model = model->B3SOIPDnextModel) + { for (here = model->B3SOIPDinstances; here != NULL; + here = here->B3SOIPDnextInstance) + { + + if (here->B3SOIPDowner != ARCHme) + continue; + + 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 < B3SOIPDNSRCS; i++) + { (void) sprintf(name, "onoise.%s%s", + here->B3SOIPDname, + B3SOIPDnNames[i]); + data->namelist = (IFuid *) xrealloc( + (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 < B3SOIPDNSRCS; i++) + { (void) sprintf(name, "onoise_total.%s%s", + here->B3SOIPDname, + B3SOIPDnNames[i]); + data->namelist = (IFuid *) xrealloc( + (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->B3SOIPDname, + B3SOIPDnNames[i]); + data->namelist = (IFuid *) xrealloc( + (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 2: - case 3: - vgs = *(ckt->CKTstates[0] + here->B3SOIPDvgs); - vds = *(ckt->CKTstates[0] + here->B3SOIPDvds); - if (vds < 0.0) - { - vds = -vds; - vgs = vgs + vds; - } - if (vgs >= here->B3SOIPDvon + 0.1) - { - Ssi = B3SOIPDStrongInversionNoiseEval (vgs, - vds, model, - here, - data->freq, - ckt-> - CKTtemp); - noizDens[B3SOIPDFLNOIZ] *= Ssi; - } - else - { - pParam = here->pParam; - T10 = model->B3SOIPDoxideTrapDensityA - * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->B3SOIPDweff - * pParam->B3SOIPDleff - * pow (data->freq, model->B3SOIPDef) * 4.0e36; - Swi = T10 / T11 * here->B3SOIPDcd * here->B3SOIPDcd; - Slimit = - B3SOIPDStrongInversionNoiseEval (here-> - B3SOIPDvon + 0.1, - vds, model, here, - data->freq, - ckt->CKTtemp); - T1 = Swi + Slimit; - if (T1 > 0.0) - noizDens[B3SOIPDFLNOIZ] *= (Slimit * Swi) / T1; - else - noizDens[B3SOIPDFLNOIZ] *= 0.0; - } + case N_CALC: + switch (mode) + { case N_DENS: + NevalSrc(&noizDens[B3SOIPDRDNOIZ], + &lnNdens[B3SOIPDRDNOIZ], ckt, THERMNOISE, + here->B3SOIPDdNodePrime, here->B3SOIPDdNode, + here->B3SOIPDdrainConductance * here->B3SOIPDm); + + NevalSrc(&noizDens[B3SOIPDRSNOIZ], + &lnNdens[B3SOIPDRSNOIZ], ckt, THERMNOISE, + here->B3SOIPDsNodePrime, here->B3SOIPDsNode, + here->B3SOIPDsourceConductance * here->B3SOIPDm); + + switch( model->B3SOIPDnoiMod ) + { case 1: + case 3: + NevalSrc(&noizDens[B3SOIPDIDNOIZ], + &lnNdens[B3SOIPDIDNOIZ], ckt, + THERMNOISE, here->B3SOIPDdNodePrime, + here->B3SOIPDsNodePrime, + (2.0 / 3.0 * fabs(here->B3SOIPDm * + (here->B3SOIPDgm + + here->B3SOIPDgds + + here->B3SOIPDgmbs)))); + break; + case 2: + +/* v2.2.3 bug fix */ + case 4: + NevalSrc(&noizDens[B3SOIPDIDNOIZ], + &lnNdens[B3SOIPDIDNOIZ], ckt, + THERMNOISE, here->B3SOIPDdNodePrime, + here->B3SOIPDsNodePrime, + (here->B3SOIPDueff + * fabs((here->B3SOIPDqinv * here->B3SOIPDm) + / (pParam->B3SOIPDleff + * pParam->B3SOIPDleff+ + here->B3SOIPDueff*fabs + (here->B3SOIPDqinv * here->B3SOIPDm)* + (here->B3SOIPDrds / here->B3SOIPDm))))); + break; + } + NevalSrc(&noizDens[B3SOIPDFLNOIZ], (double*) NULL, + ckt, N_GAIN, here->B3SOIPDdNodePrime, + here->B3SOIPDsNodePrime, (double) 0.0); + + switch( model->B3SOIPDnoiMod ) + { case 1: + case 4: + noizDens[B3SOIPDFLNOIZ] *= model->B3SOIPDkf + * exp(model->B3SOIPDaf + * log(MAX(fabs(here->B3SOIPDcd * here->B3SOIPDm), + N_MINLOG))) + / (pow(data->freq, model->B3SOIPDef) + * pParam->B3SOIPDleff + * pParam->B3SOIPDleff + * model->B3SOIPDcox); + break; + case 2: + case 3: + vgs = *(ckt->CKTstates[0] + here->B3SOIPDvgs); + vds = *(ckt->CKTstates[0] + here->B3SOIPDvds); + if (vds < 0.0) + { vds = -vds; + vgs = vgs + vds; + } + if (vgs >= here->B3SOIPDvon + 0.1) + { Ssi = B3SOIPDStrongInversionNoiseEval(vgs, + vds, model, here, data->freq, + ckt->CKTtemp); + noizDens[B3SOIPDFLNOIZ] *= Ssi; + } + else + { pParam = here->pParam; + T10 = model->B3SOIPDoxideTrapDensityA + * 8.62e-5 * ckt->CKTtemp; + T11 = pParam->B3SOIPDweff * here->B3SOIPDm + * pParam->B3SOIPDleff + * pow(data->freq, model->B3SOIPDef) + * 4.0e36; + Swi = T10 / T11 * here->B3SOIPDcd * here->B3SOIPDm + * here->B3SOIPDcd * here->B3SOIPDm; + Slimit = B3SOIPDStrongInversionNoiseEval( + here->B3SOIPDvon + 0.1, vds, model, + here, data->freq, ckt->CKTtemp); + T1 = Swi + Slimit; + if (T1 > 0.0) + noizDens[B3SOIPDFLNOIZ] *= (Slimit + * Swi) / T1; + else + noizDens[B3SOIPDFLNOIZ] *= 0.0; + } + break; + } + + lnNdens[B3SOIPDFLNOIZ] = + log(MAX(noizDens[B3SOIPDFLNOIZ], N_MINLOG)); + + /* Low frequency excess noise due to FBE */ + NevalSrc(&noizDens[B3SOIPDFBNOIZ], &lnNdens[B3SOIPDFBNOIZ], + ckt, SHOTNOISE, here->B3SOIPDsNodePrime, + here->B3SOIPDbNode, + 2.0 * model->B3SOIPDnoif * here->B3SOIPDibs * here->B3SOIPDm); + + noizDens[B3SOIPDTOTNOIZ] = noizDens[B3SOIPDRDNOIZ] + + noizDens[B3SOIPDRSNOIZ] + + noizDens[B3SOIPDIDNOIZ] + + noizDens[B3SOIPDFLNOIZ] + + noizDens[B3SOIPDFBNOIZ]; + lnNdens[B3SOIPDTOTNOIZ] = + log(MAX(noizDens[B3SOIPDTOTNOIZ], N_MINLOG)); + + *OnDens += noizDens[B3SOIPDTOTNOIZ]; + + if (data->delFreq == 0.0) + { /* if we haven't done any previous + integration, we need to initialize our + "history" variables. + */ + + for (i = 0; i < B3SOIPDNSRCS; i++) + { here->B3SOIPDnVar[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 < B3SOIPDNSRCS; i++) + { here->B3SOIPDnVar[OUTNOIZ][i] = 0.0; + here->B3SOIPDnVar[INNOIZ][i] = 0.0; + } + } + } + else + { /* data->delFreq != 0.0, + we have to integrate. + */ + for (i = 0; i < B3SOIPDNSRCS; i++) + { if (i != B3SOIPDTOTNOIZ) + { tempOnoise = Nintegrate(noizDens[i], + lnNdens[i], + here->B3SOIPDnVar[LNLSTDENS][i], + data); + tempInoise = Nintegrate(noizDens[i] + * data->GainSqInv, lnNdens[i] + + data->lnGainInv, + here->B3SOIPDnVar[LNLSTDENS][i] + + data->lnGainInv, data); + here->B3SOIPDnVar[LNLSTDENS][i] = + lnNdens[i]; + data->outNoiz += tempOnoise; + data->inNoise += tempInoise; + if (((NOISEAN*) + ckt->CKTcurJob)->NStpsSm != 0) + { here->B3SOIPDnVar[OUTNOIZ][i] + += tempOnoise; + here->B3SOIPDnVar[OUTNOIZ][B3SOIPDTOTNOIZ] + += tempOnoise; + here->B3SOIPDnVar[INNOIZ][i] + += tempInoise; + here->B3SOIPDnVar[INNOIZ][B3SOIPDTOTNOIZ] + += tempInoise; + } + } + } + } + if (data->prtSummary) + { for (i = 0; i < B3SOIPDNSRCS; 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 < B3SOIPDNSRCS; i++) + { data->outpVector[data->outNumber++] + = here->B3SOIPDnVar[OUTNOIZ][i]; + data->outpVector[data->outNumber++] + = here->B3SOIPDnVar[INNOIZ][i]; + } + } + break; + } break; - } - - lnNdens[B3SOIPDFLNOIZ] = - log (MAX (noizDens[B3SOIPDFLNOIZ], N_MINLOG)); - - /* Low frequency excess noise due to FBE */ - NevalSrc (&noizDens[B3SOIPDFBNOIZ], &lnNdens[B3SOIPDFBNOIZ], - ckt, SHOTNOISE, here->B3SOIPDsNodePrime, - here->B3SOIPDbNode, - 2.0 * model->B3SOIPDnoif * here->B3SOIPDibs); - - noizDens[B3SOIPDTOTNOIZ] = noizDens[B3SOIPDRDNOIZ] - + noizDens[B3SOIPDRSNOIZ] - + noizDens[B3SOIPDIDNOIZ] - + noizDens[B3SOIPDFLNOIZ] + noizDens[B3SOIPDFBNOIZ]; - lnNdens[B3SOIPDTOTNOIZ] = - log (MAX (noizDens[B3SOIPDTOTNOIZ], N_MINLOG)); - - *OnDens += noizDens[B3SOIPDTOTNOIZ]; - - if (data->delFreq == 0.0) - { /* if we haven't done any previous - integration, we need to initialize our - "history" variables. - */ - - for (i = 0; i < B3SOIPDNSRCS; i++) - { - here->B3SOIPDnVar[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 < B3SOIPDNSRCS; i++) - { - here->B3SOIPDnVar[OUTNOIZ][i] = 0.0; - here->B3SOIPDnVar[INNOIZ][i] = 0.0; - } - } - } - else - { /* data->delFreq != 0.0, - we have to integrate. - */ - for (i = 0; i < B3SOIPDNSRCS; i++) - { - if (i != B3SOIPDTOTNOIZ) - { - tempOnoise = Nintegrate (noizDens[i], - lnNdens[i], - here-> - B3SOIPDnVar[LNLSTDENS] - [i], data); - tempInoise = - Nintegrate (noizDens[i] * data->GainSqInv, - lnNdens[i] + data->lnGainInv, - here->B3SOIPDnVar[LNLSTDENS][i] + - data->lnGainInv, data); - here->B3SOIPDnVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (((NOISEAN *) ckt->CKTcurJob)->NStpsSm != 0) - { - here->B3SOIPDnVar[OUTNOIZ][i] += tempOnoise; - here->B3SOIPDnVar[OUTNOIZ][B3SOIPDTOTNOIZ] - += tempOnoise; - here->B3SOIPDnVar[INNOIZ][i] += tempInoise; - here->B3SOIPDnVar[INNOIZ][B3SOIPDTOTNOIZ] - += tempInoise; - } - } - } - } - if (data->prtSummary) - { - for (i = 0; i < B3SOIPDNSRCS; 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 < B3SOIPDNSRCS; i++) - { - data->outpVector[data->outNumber++] - = here->B3SOIPDnVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] - = here->B3SOIPDnVar[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); + case N_CLOSE: + /* do nothing, the main calling routine will close */ + return (OK); + break; /* the plots */ + } /* switch (operation) */ + } /* for here */ + } /* for model */ + + return(OK); } + + + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdpar.c b/src/spicelib/devices/bsim3soi_pd/b3soipdpar.c index 44f300b1b..cd722311c 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdpar.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdpar.c @@ -3,164 +3,174 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soipdpar.c 98/5/01 Modified by Pin Su 99/2/15 +Modified by Pin Su 01/2/15 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ #include "ngspice.h" -#include #include "ifsim.h" #include "b3soipddef.h" #include "sperror.h" #include "suffix.h" int -B3SOIPDparam (param, value, inst, select) - int param; - IFvalue *value; - GENinstance *inst; - IFvalue *select; +B3SOIPDparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) { - B3SOIPDinstance *here = (B3SOIPDinstance *) inst; - switch (param) - { - case B3SOIPD_W: - here->B3SOIPDw = value->rValue; - here->B3SOIPDwGiven = TRUE; - break; - case B3SOIPD_L: - here->B3SOIPDl = value->rValue; - here->B3SOIPDlGiven = TRUE; - break; - case B3SOIPD_AS: - here->B3SOIPDsourceArea = value->rValue; - here->B3SOIPDsourceAreaGiven = TRUE; - break; - case B3SOIPD_AD: - here->B3SOIPDdrainArea = value->rValue; - here->B3SOIPDdrainAreaGiven = TRUE; - break; - case B3SOIPD_PS: - here->B3SOIPDsourcePerimeter = value->rValue; - here->B3SOIPDsourcePerimeterGiven = TRUE; - break; - case B3SOIPD_PD: - here->B3SOIPDdrainPerimeter = value->rValue; - here->B3SOIPDdrainPerimeterGiven = TRUE; - break; - case B3SOIPD_NRS: - here->B3SOIPDsourceSquares = value->rValue; - here->B3SOIPDsourceSquaresGiven = TRUE; - break; - case B3SOIPD_NRD: - here->B3SOIPDdrainSquares = value->rValue; - here->B3SOIPDdrainSquaresGiven = TRUE; - break; - case B3SOIPD_OFF: - here->B3SOIPDoff = value->iValue; - here->B3SOIPDoffGiven = TRUE; - break; - case B3SOIPD_IC_VBS: - here->B3SOIPDicVBS = value->rValue; - here->B3SOIPDicVBSGiven = TRUE; - break; - case B3SOIPD_IC_VDS: - here->B3SOIPDicVDS = value->rValue; - here->B3SOIPDicVDSGiven = TRUE; - break; - case B3SOIPD_IC_VGS: - here->B3SOIPDicVGS = value->rValue; - here->B3SOIPDicVGSGiven = TRUE; - break; - case B3SOIPD_IC_VES: - here->B3SOIPDicVES = value->rValue; - here->B3SOIPDicVESGiven = TRUE; - break; - case B3SOIPD_IC_VPS: - here->B3SOIPDicVPS = value->rValue; - here->B3SOIPDicVPSGiven = TRUE; - break; - case B3SOIPD_BJTOFF: - here->B3SOIPDbjtoff = value->iValue; - here->B3SOIPDbjtoffGiven = TRUE; - break; - case B3SOIPD_DEBUG: - here->B3SOIPDdebugMod = value->iValue; - here->B3SOIPDdebugModGiven = TRUE; - break; - case B3SOIPD_RTH0: - here->B3SOIPDrth0 = value->rValue; - here->B3SOIPDrth0Given = TRUE; - break; - case B3SOIPD_CTH0: - here->B3SOIPDcth0 = value->rValue; - here->B3SOIPDcth0Given = TRUE; - break; - case B3SOIPD_NRB: - here->B3SOIPDbodySquares = value->rValue; - here->B3SOIPDbodySquaresGiven = TRUE; - break; + B3SOIPDinstance *here = (B3SOIPDinstance*)inst; + switch(param) + { case B3SOIPD_W: + here->B3SOIPDw = value->rValue; + here->B3SOIPDwGiven = TRUE; + break; + case B3SOIPD_L: + here->B3SOIPDl = value->rValue; + here->B3SOIPDlGiven = TRUE; + break; + case B3SOIPD_M: + here->B3SOIPDm = value->rValue; + here->B3SOIPDmGiven = TRUE; + break; + case B3SOIPD_AS: + here->B3SOIPDsourceArea = value->rValue; + here->B3SOIPDsourceAreaGiven = TRUE; + break; + case B3SOIPD_AD: + here->B3SOIPDdrainArea = value->rValue; + here->B3SOIPDdrainAreaGiven = TRUE; + break; + case B3SOIPD_PS: + here->B3SOIPDsourcePerimeter = value->rValue; + here->B3SOIPDsourcePerimeterGiven = TRUE; + break; + case B3SOIPD_PD: + here->B3SOIPDdrainPerimeter = value->rValue; + here->B3SOIPDdrainPerimeterGiven = TRUE; + break; + case B3SOIPD_NRS: + here->B3SOIPDsourceSquares = value->rValue; + here->B3SOIPDsourceSquaresGiven = TRUE; + break; + case B3SOIPD_NRD: + here->B3SOIPDdrainSquares = value->rValue; + here->B3SOIPDdrainSquaresGiven = TRUE; + break; + case B3SOIPD_OFF: + here->B3SOIPDoff = value->iValue; + here->B3SOIPDoffGiven = TRUE; + break; + case B3SOIPD_IC_VBS: + here->B3SOIPDicVBS = value->rValue; + here->B3SOIPDicVBSGiven = TRUE; + break; + case B3SOIPD_IC_VDS: + here->B3SOIPDicVDS = value->rValue; + here->B3SOIPDicVDSGiven = TRUE; + break; + case B3SOIPD_IC_VGS: + here->B3SOIPDicVGS = value->rValue; + here->B3SOIPDicVGSGiven = TRUE; + break; + case B3SOIPD_IC_VES: + here->B3SOIPDicVES = value->rValue; + here->B3SOIPDicVESGiven = TRUE; + break; + case B3SOIPD_IC_VPS: + here->B3SOIPDicVPS = value->rValue; + here->B3SOIPDicVPSGiven = TRUE; + break; + case B3SOIPD_BJTOFF: + here->B3SOIPDbjtoff = value->iValue; + here->B3SOIPDbjtoffGiven= TRUE; + break; + case B3SOIPD_DEBUG: + here->B3SOIPDdebugMod = value->iValue; + here->B3SOIPDdebugModGiven= TRUE; + break; + case B3SOIPD_RTH0: + here->B3SOIPDrth0= value->rValue; + here->B3SOIPDrth0Given = TRUE; + break; + case B3SOIPD_CTH0: + here->B3SOIPDcth0= value->rValue; + here->B3SOIPDcth0Given = TRUE; + break; + case B3SOIPD_NRB: + here->B3SOIPDbodySquares = value->rValue; + here->B3SOIPDbodySquaresGiven = TRUE; + break; + case B3SOIPD_FRBODY: + here->B3SOIPDfrbody = value->rValue; + here->B3SOIPDfrbodyGiven = TRUE; + break; /* v2.0 release */ - case B3SOIPD_NBC: - here->B3SOIPDnbc = value->rValue; - here->B3SOIPDnbcGiven = TRUE; - break; - case B3SOIPD_NSEG: - here->B3SOIPDnseg = value->rValue; - here->B3SOIPDnsegGiven = TRUE; - break; - case B3SOIPD_PDBCP: - here->B3SOIPDpdbcp = value->rValue; - here->B3SOIPDpdbcpGiven = TRUE; - break; - case B3SOIPD_PSBCP: - here->B3SOIPDpsbcp = value->rValue; - here->B3SOIPDpsbcpGiven = TRUE; - break; - case B3SOIPD_AGBCP: - here->B3SOIPDagbcp = value->rValue; - here->B3SOIPDagbcpGiven = TRUE; - break; - case B3SOIPD_AEBCP: - here->B3SOIPDaebcp = value->rValue; - here->B3SOIPDaebcpGiven = TRUE; - break; - case B3SOIPD_VBSUSR: - here->B3SOIPDvbsusr = value->rValue; - here->B3SOIPDvbsusrGiven = TRUE; - break; - case B3SOIPD_TNODEOUT: - here->B3SOIPDtnodeout = value->iValue; - here->B3SOIPDtnodeoutGiven = TRUE; - break; + case B3SOIPD_NBC: + here->B3SOIPDnbc = value->rValue; + here->B3SOIPDnbcGiven = TRUE; + break; + case B3SOIPD_NSEG: + here->B3SOIPDnseg = value->rValue; + here->B3SOIPDnsegGiven = TRUE; + break; + case B3SOIPD_PDBCP: + here->B3SOIPDpdbcp = value->rValue; + here->B3SOIPDpdbcpGiven = TRUE; + break; + case B3SOIPD_PSBCP: + here->B3SOIPDpsbcp = value->rValue; + here->B3SOIPDpsbcpGiven = TRUE; + break; + case B3SOIPD_AGBCP: + here->B3SOIPDagbcp = value->rValue; + here->B3SOIPDagbcpGiven = TRUE; + break; + case B3SOIPD_AEBCP: + here->B3SOIPDaebcp = value->rValue; + here->B3SOIPDaebcpGiven = TRUE; + break; + case B3SOIPD_VBSUSR: + here->B3SOIPDvbsusr = value->rValue; + here->B3SOIPDvbsusrGiven = TRUE; + break; + case B3SOIPD_TNODEOUT: + here->B3SOIPDtnodeout = value->iValue; + here->B3SOIPDtnodeoutGiven = TRUE; + break; - case B3SOIPD_IC: - switch (value->v.numValue) - { - case 5: - here->B3SOIPDicVPS = *(value->v.vec.rVec + 4); - here->B3SOIPDicVPSGiven = TRUE; - case 4: - here->B3SOIPDicVES = *(value->v.vec.rVec + 3); - here->B3SOIPDicVESGiven = TRUE; - case 3: - here->B3SOIPDicVBS = *(value->v.vec.rVec + 2); - here->B3SOIPDicVBSGiven = TRUE; - case 2: - here->B3SOIPDicVGS = *(value->v.vec.rVec + 1); - here->B3SOIPDicVGSGiven = TRUE; - case 1: - here->B3SOIPDicVDS = *(value->v.vec.rVec); - here->B3SOIPDicVDSGiven = TRUE; - break; - default: - return (E_BADPARM); - } - break; - default: - return (E_BADPARM); + case B3SOIPD_IC: + switch(value->v.numValue){ + case 5: + here->B3SOIPDicVPS = *(value->v.vec.rVec+4); + here->B3SOIPDicVPSGiven = TRUE; + case 4: + here->B3SOIPDicVES = *(value->v.vec.rVec+3); + here->B3SOIPDicVESGiven = TRUE; + case 3: + here->B3SOIPDicVBS = *(value->v.vec.rVec+2); + here->B3SOIPDicVBSGiven = TRUE; + case 2: + here->B3SOIPDicVGS = *(value->v.vec.rVec+1); + here->B3SOIPDicVGSGiven = TRUE; + case 1: + here->B3SOIPDicVDS = *(value->v.vec.rVec); + here->B3SOIPDicVDSGiven = TRUE; + break; + default: + return(E_BADPARM); + } + break; + default: + return(E_BADPARM); } - return (OK); + return(OK); } + + + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdpzld.c b/src/spicelib/devices/bsim3soi_pd/b3soipdpzld.c index 0ad2c329d..abf25669b 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdpzld.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdpzld.c @@ -1,12 +1,16 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang -File: b3soipzld.c 98/5/01 +File: b3soipdpzld.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ #include "ngspice.h" -#include #include "cktdefs.h" #include "complex.h" #include "sperror.h" @@ -14,140 +18,143 @@ File: b3soipzld.c 98/5/01 #include "suffix.h" int -B3SOIPDpzLoad (inModel, ckt, s) - GENmodel *inModel; - CKTcircuit *ckt; - SPcomplex *s; +B3SOIPDpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) { - 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; - double GSoverlapCap, GDoverlapCap, GBoverlapCap; - double FwdSum, RevSum, Gm, Gmbs; - - for (; model != NULL; model = model->B3SOIPDnextModel) - { - for (here = model->B3SOIPDinstances; here != NULL; - here = here->B3SOIPDnextInstance) - { - if (here->B3SOIPDmode >= 0) - { - Gm = here->B3SOIPDgm; - Gmbs = here->B3SOIPDgmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cggb = here->B3SOIPDcggb; - cgsb = here->B3SOIPDcgsb; - cgdb = here->B3SOIPDcgdb; - - cbgb = here->B3SOIPDcbgb; - cbsb = here->B3SOIPDcbsb; - cbdb = here->B3SOIPDcbdb; - - cdgb = here->B3SOIPDcdgb; - cdsb = here->B3SOIPDcdsb; - cddb = here->B3SOIPDcddb; - } - else - { - Gm = -here->B3SOIPDgm; - Gmbs = -here->B3SOIPDgmbs; - FwdSum = 0.0; - RevSum = -Gm - Gmbs; - cggb = here->B3SOIPDcggb; - cgsb = here->B3SOIPDcgdb; - cgdb = here->B3SOIPDcgsb; - - cbgb = here->B3SOIPDcbgb; - cbsb = here->B3SOIPDcbdb; - cbdb = here->B3SOIPDcbsb; - - cdgb = -(here->B3SOIPDcdgb + cggb + cbgb); - cdsb = -(here->B3SOIPDcddb + cgsb + cbsb); - cddb = -(here->B3SOIPDcdsb + cgdb + cbdb); - } - gdpr = here->B3SOIPDdrainConductance; - gspr = here->B3SOIPDsourceConductance; - gds = here->B3SOIPDgds; - gbd = here->B3SOIPDgjdb; - gbs = here->B3SOIPDgjsb; +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; +double GSoverlapCap, GDoverlapCap, GBoverlapCap; +double FwdSum, RevSum, Gm, Gmbs; + +double m; + + for (; model != NULL; model = model->B3SOIPDnextModel) + { for (here = model->B3SOIPDinstances; here!= NULL; + here = here->B3SOIPDnextInstance) + { + + if (here->B3SOIPDowner != ARCHme) + continue; + + if (here->B3SOIPDmode >= 0) + { Gm = here->B3SOIPDgm; + Gmbs = here->B3SOIPDgmbs; + FwdSum = Gm + Gmbs; + RevSum = 0.0; + cggb = here->B3SOIPDcggb; + cgsb = here->B3SOIPDcgsb; + cgdb = here->B3SOIPDcgdb; + + cbgb = here->B3SOIPDcbgb; + cbsb = here->B3SOIPDcbsb; + cbdb = here->B3SOIPDcbdb; + + cdgb = here->B3SOIPDcdgb; + cdsb = here->B3SOIPDcdsb; + cddb = here->B3SOIPDcddb; + } + else + { Gm = -here->B3SOIPDgm; + Gmbs = -here->B3SOIPDgmbs; + FwdSum = 0.0; + RevSum = -Gm - Gmbs; + cggb = here->B3SOIPDcggb; + cgsb = here->B3SOIPDcgdb; + cgdb = here->B3SOIPDcgsb; + + cbgb = here->B3SOIPDcbgb; + cbsb = here->B3SOIPDcbdb; + cbdb = here->B3SOIPDcbsb; + + cdgb = -(here->B3SOIPDcdgb + cggb + cbgb); + cdsb = -(here->B3SOIPDcddb + cgsb + cbsb); + cddb = -(here->B3SOIPDcdsb + cgdb + cbdb); + } + gdpr=here->B3SOIPDdrainConductance; + gspr=here->B3SOIPDsourceConductance; + gds= here->B3SOIPDgds; + gbd= here->B3SOIPDgjdb; + gbs= here->B3SOIPDgjsb; #ifdef BULKCODE - capbd = here->B3SOIPDcapbd; - capbs = here->B3SOIPDcapbs; + capbd= here->B3SOIPDcapbd; + capbs= here->B3SOIPDcapbs; #endif - GSoverlapCap = here->B3SOIPDcgso; - GDoverlapCap = here->B3SOIPDcgdo; + GSoverlapCap = here->B3SOIPDcgso; + GDoverlapCap = here->B3SOIPDcgdo; #ifdef BULKCODE - GBoverlapCap = here->pParam->B3SOIPDcgbo; + GBoverlapCap = here->pParam->B3SOIPDcgbo; #endif - xcdgb = (cdgb - GDoverlapCap); - xcddb = (cddb + capbd + GDoverlapCap); - xcdsb = cdsb; - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap); - xcsdb = -(cgdb + cbdb + cddb); - xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)); - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap); - xcgdb = (cgdb - GDoverlapCap); - xcgsb = (cgsb - GSoverlapCap); - xcbgb = (cbgb - GBoverlapCap); - xcbdb = (cbdb - capbd); - xcbsb = (cbsb - capbs); - - - *(here->B3SOIPDGgPtr) += xcggb * s->real; - *(here->B3SOIPDGgPtr + 1) += xcggb * s->imag; - *(here->B3SOIPDBbPtr) += (-xcbgb - xcbdb - xcbsb) * s->real; - *(here->B3SOIPDBbPtr + 1) += (-xcbgb - xcbdb - xcbsb) * s->imag; - *(here->B3SOIPDDPdpPtr) += xcddb * s->real; - *(here->B3SOIPDDPdpPtr + 1) += xcddb * s->imag; - *(here->B3SOIPDSPspPtr) += xcssb * s->real; - *(here->B3SOIPDSPspPtr + 1) += xcssb * s->imag; - *(here->B3SOIPDGbPtr) += (-xcggb - xcgdb - xcgsb) * s->real; - *(here->B3SOIPDGbPtr + 1) += (-xcggb - xcgdb - xcgsb) * s->imag; - *(here->B3SOIPDGdpPtr) += xcgdb * s->real; - *(here->B3SOIPDGdpPtr + 1) += xcgdb * s->imag; - *(here->B3SOIPDGspPtr) += xcgsb * s->real; - *(here->B3SOIPDGspPtr + 1) += xcgsb * s->imag; - *(here->B3SOIPDBgPtr) += xcbgb * s->real; - *(here->B3SOIPDBgPtr + 1) += xcbgb * s->imag; - *(here->B3SOIPDBdpPtr) += xcbdb * s->real; - *(here->B3SOIPDBdpPtr + 1) += xcbdb * s->imag; - *(here->B3SOIPDBspPtr) += xcbsb * s->real; - *(here->B3SOIPDBspPtr + 1) += xcbsb * s->imag; - *(here->B3SOIPDDPgPtr) += xcdgb * s->real; - *(here->B3SOIPDDPgPtr + 1) += xcdgb * s->imag; - *(here->B3SOIPDDPbPtr) += (-xcdgb - xcddb - xcdsb) * s->real; - *(here->B3SOIPDDPbPtr + 1) += (-xcdgb - xcddb - xcdsb) * s->imag; - *(here->B3SOIPDDPspPtr) += xcdsb * s->real; - *(here->B3SOIPDDPspPtr + 1) += xcdsb * s->imag; - *(here->B3SOIPDSPgPtr) += xcsgb * s->real; - *(here->B3SOIPDSPgPtr + 1) += xcsgb * s->imag; - *(here->B3SOIPDSPbPtr) += (-xcsgb - xcsdb - xcssb) * s->real; - *(here->B3SOIPDSPbPtr + 1) += (-xcsgb - xcsdb - xcssb) * s->imag; - *(here->B3SOIPDSPdpPtr) += xcsdb * s->real; - *(here->B3SOIPDSPdpPtr + 1) += xcsdb * s->imag; - *(here->B3SOIPDDdPtr) += gdpr; - *(here->B3SOIPDSsPtr) += gspr; - *(here->B3SOIPDBbPtr) += gbd + gbs; - *(here->B3SOIPDDPdpPtr) += gdpr + gds + gbd + RevSum; - *(here->B3SOIPDSPspPtr) += gspr + gds + gbs + FwdSum; - *(here->B3SOIPDDdpPtr) -= gdpr; - *(here->B3SOIPDSspPtr) -= gspr; - *(here->B3SOIPDBdpPtr) -= gbd; - *(here->B3SOIPDBspPtr) -= gbs; - *(here->B3SOIPDDPdPtr) -= gdpr; - *(here->B3SOIPDDPgPtr) += Gm; - *(here->B3SOIPDDPbPtr) -= gbd - Gmbs; - *(here->B3SOIPDDPspPtr) -= gds + FwdSum; - *(here->B3SOIPDSPgPtr) -= Gm; - *(here->B3SOIPDSPsPtr) -= gspr; - *(here->B3SOIPDSPbPtr) -= gbs + Gmbs; - *(here->B3SOIPDSPdpPtr) -= gds + RevSum; - - } + xcdgb = (cdgb - GDoverlapCap); + xcddb = (cddb + capbd + GDoverlapCap); + xcdsb = cdsb; + xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap); + xcsdb = -(cgdb + cbdb + cddb); + xcssb = (capbs + GSoverlapCap - (cgsb+cbsb+cdsb)); + xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap); + xcgdb = (cgdb - GDoverlapCap); + xcgsb = (cgsb - GSoverlapCap); + xcbgb = (cbgb - GBoverlapCap); + xcbdb = (cbdb - capbd); + xcbsb = (cbsb - capbs); + + m = here->B3SOIPDm; + + *(here->B3SOIPDGgPtr ) += m * (xcggb * s->real); + *(here->B3SOIPDGgPtr +1) += m * (xcggb * s->imag); + *(here->B3SOIPDBbPtr ) += m * ((-xcbgb-xcbdb-xcbsb) * s->real); + *(here->B3SOIPDBbPtr +1) += m * ((-xcbgb-xcbdb-xcbsb) * s->imag); + *(here->B3SOIPDDPdpPtr ) += m * (xcddb * s->real); + *(here->B3SOIPDDPdpPtr +1) += m * (xcddb * s->imag); + *(here->B3SOIPDSPspPtr ) += m * (xcssb * s->real); + *(here->B3SOIPDSPspPtr +1) += m * (xcssb * s->imag); + *(here->B3SOIPDGbPtr ) += m * ((-xcggb-xcgdb-xcgsb) * s->real); + *(here->B3SOIPDGbPtr +1) += m * ((-xcggb-xcgdb-xcgsb) * s->imag); + *(here->B3SOIPDGdpPtr ) += m * (xcgdb * s->real); + *(here->B3SOIPDGdpPtr +1) += m * (xcgdb * s->imag); + *(here->B3SOIPDGspPtr ) += m * (xcgsb * s->real); + *(here->B3SOIPDGspPtr +1) += m * (xcgsb * s->imag); + *(here->B3SOIPDBgPtr ) += m * (xcbgb * s->real); + *(here->B3SOIPDBgPtr +1) += m * (xcbgb * s->imag); + *(here->B3SOIPDBdpPtr ) += m * (xcbdb * s->real); + *(here->B3SOIPDBdpPtr +1) += m * (xcbdb * s->imag); + *(here->B3SOIPDBspPtr ) += m * (xcbsb * s->real); + *(here->B3SOIPDBspPtr +1) += m * (xcbsb * s->imag); + *(here->B3SOIPDDPgPtr ) += m * (xcdgb * s->real); + *(here->B3SOIPDDPgPtr +1) += m * (xcdgb * s->imag); + *(here->B3SOIPDDPbPtr ) += m * ((-xcdgb-xcddb-xcdsb) * s->real); + *(here->B3SOIPDDPbPtr +1) += m * ((-xcdgb-xcddb-xcdsb) * s->imag); + *(here->B3SOIPDDPspPtr ) += m * (xcdsb * s->real); + *(here->B3SOIPDDPspPtr +1) += m * (xcdsb * s->imag); + *(here->B3SOIPDSPgPtr ) += m * (xcsgb * s->real); + *(here->B3SOIPDSPgPtr +1) += m * (xcsgb * s->imag); + *(here->B3SOIPDSPbPtr ) += m * ((-xcsgb-xcsdb-xcssb) * s->real); + *(here->B3SOIPDSPbPtr +1) += m * ((-xcsgb-xcsdb-xcssb) * s->imag); + *(here->B3SOIPDSPdpPtr ) += m * (xcsdb * s->real); + *(here->B3SOIPDSPdpPtr +1) += m * (xcsdb * s->imag); + *(here->B3SOIPDDdPtr) += m * gdpr; + *(here->B3SOIPDSsPtr) += m * gspr; + *(here->B3SOIPDBbPtr) += m * (gbd + gbs); + *(here->B3SOIPDDPdpPtr) += m * (gdpr + gds + gbd + RevSum); + *(here->B3SOIPDSPspPtr) += m * (gspr + gds + gbs + FwdSum); + *(here->B3SOIPDDdpPtr) -= m * gdpr; + *(here->B3SOIPDSspPtr) -= m * gspr; + *(here->B3SOIPDBdpPtr) -= m * gbd; + *(here->B3SOIPDBspPtr) -= m * gbs; + *(here->B3SOIPDDPdPtr) -= m * gdpr; + *(here->B3SOIPDDPgPtr) += m * Gm; + *(here->B3SOIPDDPbPtr) -= m * (gbd - Gmbs); + *(here->B3SOIPDDPspPtr) -= m * (gds + FwdSum); + *(here->B3SOIPDSPgPtr) -= m * Gm; + *(here->B3SOIPDSPsPtr) -= m * gspr; + *(here->B3SOIPDSPbPtr) -= m * (gbs + Gmbs); + *(here->B3SOIPDSPdpPtr) -= m * (gds + RevSum); + + } } - return (OK); + return(OK); } + + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdset.c b/src/spicelib/devices/bsim3soi_pd/b3soipdset.c index 53ef0802e..7bebd47dc 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdset.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdset.c @@ -6,12 +6,17 @@ Modified by Pin Su and Jan Feng 99/2/15 Modified by Pin Su 99/4/30 Modified by Pin Su, Wei Jin 99/9/27 Modified by Pin Su 00/3/1 +Modified by Pin Su 01/2/15 +Modified by Pin Su 02/3/5 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ #include "ngspice.h" -#include -#include #include "smpdefs.h" #include "cktdefs.h" #include "b3soipddef.h" @@ -27,1341 +32,1324 @@ Modified by Pin Su 00/3/1 #define Meter2Micron 1.0e6 int -B3SOIPDsetup (matrix, inModel, ckt, states) - SMPmatrix *matrix; - GENmodel *inModel; - CKTcircuit *ckt; - int *states; +B3SOIPDsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, + int *states) { - B3SOIPDmodel *model = (B3SOIPDmodel *) inModel; - B3SOIPDinstance *here; - int error; - CKTnode *tmp; +B3SOIPDmodel *model = (B3SOIPDmodel*)inModel; +B3SOIPDinstance *here; +int error; +CKTnode *tmp; + +double tmp1, tmp2; +double nfb0, Cboxt; +int itmp1; - double tmp1, tmp2; - double nfb0, Cboxt; - int itmp1; +CKTnode *tmpNode; +IFuid tmpName; - /* loop through all the B3SOIPD device models */ - for (; model != NULL; model = model->B3SOIPDnextModel) + + /* loop through all the B3SOIPD device models */ + for( ; model != NULL; model = model->B3SOIPDnextModel ) { /* Default value Processing for B3SOIPD MOSFET Models */ - if (!model->B3SOIPDtypeGiven) - model->B3SOIPDtype = NMOS; - if (!model->B3SOIPDmobModGiven) - model->B3SOIPDmobMod = 1; - if (!model->B3SOIPDbinUnitGiven) - model->B3SOIPDbinUnit = 1; - if (!model->B3SOIPDparamChkGiven) - model->B3SOIPDparamChk = 0; - if (!model->B3SOIPDcapModGiven) - model->B3SOIPDcapMod = 2; - if (!model->B3SOIPDnoiModGiven) - model->B3SOIPDnoiMod = 1; - if (!model->B3SOIPDshModGiven) - model->B3SOIPDshMod = 0; - if (!model->B3SOIPDversionGiven) - model->B3SOIPDversion = 2.0; - if (!model->B3SOIPDtoxGiven) - model->B3SOIPDtox = 100.0e-10; - model->B3SOIPDcox = 3.453133e-11 / model->B3SOIPDtox; - - if (!model->B3SOIPDcdscGiven) - model->B3SOIPDcdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->B3SOIPDcdscbGiven) - model->B3SOIPDcdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->B3SOIPDcdscdGiven) - model->B3SOIPDcdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->B3SOIPDcitGiven) - model->B3SOIPDcit = 0.0; /* unit Q/V/m^2 */ - if (!model->B3SOIPDnfactorGiven) - model->B3SOIPDnfactor = 1; - if (!model->B3SOIPDvsatGiven) - model->B3SOIPDvsat = 8.0e4; /* unit m/s */ - if (!model->B3SOIPDatGiven) - model->B3SOIPDat = 3.3e4; /* unit m/s */ - if (!model->B3SOIPDa0Given) - model->B3SOIPDa0 = 1.0; - if (!model->B3SOIPDagsGiven) - model->B3SOIPDags = 0.0; - if (!model->B3SOIPDa1Given) - model->B3SOIPDa1 = 0.0; - if (!model->B3SOIPDa2Given) - model->B3SOIPDa2 = 1.0; - if (!model->B3SOIPDketaGiven) - model->B3SOIPDketa = -0.6; /* unit / V */ - if (!model->B3SOIPDnsubGiven) - model->B3SOIPDnsub = 6.0e16; /* unit 1/cm3 */ - if (!model->B3SOIPDnpeakGiven) - model->B3SOIPDnpeak = 1.7e17; /* unit 1/cm3 */ - if (!model->B3SOIPDngateGiven) - model->B3SOIPDngate = 0; /* unit 1/cm3 */ - if (!model->B3SOIPDvbmGiven) - model->B3SOIPDvbm = -3.0; - if (!model->B3SOIPDxtGiven) - model->B3SOIPDxt = 1.55e-7; - if (!model->B3SOIPDkt1Given) - model->B3SOIPDkt1 = -0.11; /* unit V */ - if (!model->B3SOIPDkt1lGiven) - model->B3SOIPDkt1l = 0.0; /* unit V*m */ - if (!model->B3SOIPDkt2Given) - model->B3SOIPDkt2 = 0.022; /* No unit */ - if (!model->B3SOIPDk3Given) - model->B3SOIPDk3 = 0.0; - if (!model->B3SOIPDk3bGiven) - model->B3SOIPDk3b = 0.0; - if (!model->B3SOIPDw0Given) - model->B3SOIPDw0 = 2.5e-6; - if (!model->B3SOIPDnlxGiven) - model->B3SOIPDnlx = 1.74e-7; - if (!model->B3SOIPDdvt0Given) - model->B3SOIPDdvt0 = 2.2; - if (!model->B3SOIPDdvt1Given) - model->B3SOIPDdvt1 = 0.53; - if (!model->B3SOIPDdvt2Given) - model->B3SOIPDdvt2 = -0.032; /* unit 1 / V */ - - if (!model->B3SOIPDdvt0wGiven) - model->B3SOIPDdvt0w = 0.0; - if (!model->B3SOIPDdvt1wGiven) - model->B3SOIPDdvt1w = 5.3e6; - if (!model->B3SOIPDdvt2wGiven) - model->B3SOIPDdvt2w = -0.032; - - if (!model->B3SOIPDdroutGiven) - model->B3SOIPDdrout = 0.56; - if (!model->B3SOIPDdsubGiven) - model->B3SOIPDdsub = model->B3SOIPDdrout; - if (!model->B3SOIPDvth0Given) - model->B3SOIPDvth0 = (model->B3SOIPDtype == NMOS) ? 0.7 : -0.7; - if (!model->B3SOIPDuaGiven) - model->B3SOIPDua = 2.25e-9; /* unit m/V */ - if (!model->B3SOIPDua1Given) - model->B3SOIPDua1 = 4.31e-9; /* unit m/V */ - if (!model->B3SOIPDubGiven) - model->B3SOIPDub = 5.87e-19; /* unit (m/V)**2 */ - if (!model->B3SOIPDub1Given) - model->B3SOIPDub1 = -7.61e-18; /* unit (m/V)**2 */ - if (!model->B3SOIPDucGiven) - model->B3SOIPDuc = (model->B3SOIPDmobMod == 3) ? -0.0465 : -0.0465e-9; - if (!model->B3SOIPDuc1Given) - model->B3SOIPDuc1 = (model->B3SOIPDmobMod == 3) ? -0.056 : -0.056e-9; - if (!model->B3SOIPDu0Given) - model->B3SOIPDu0 = (model->B3SOIPDtype == NMOS) ? 0.067 : 0.025; - if (!model->B3SOIPDuteGiven) - model->B3SOIPDute = -1.5; - if (!model->B3SOIPDvoffGiven) - model->B3SOIPDvoff = -0.08; - if (!model->B3SOIPDdeltaGiven) - model->B3SOIPDdelta = 0.01; - if (!model->B3SOIPDrdswGiven) - model->B3SOIPDrdsw = 100; - if (!model->B3SOIPDprwgGiven) - model->B3SOIPDprwg = 0.0; /* unit 1/V */ - if (!model->B3SOIPDprwbGiven) - model->B3SOIPDprwb = 0.0; - if (!model->B3SOIPDprtGiven) - if (!model->B3SOIPDprtGiven) - model->B3SOIPDprt = 0.0; - if (!model->B3SOIPDeta0Given) - model->B3SOIPDeta0 = 0.08; /* no unit */ - if (!model->B3SOIPDetabGiven) - model->B3SOIPDetab = -0.07; /* unit 1/V */ - if (!model->B3SOIPDpclmGiven) - model->B3SOIPDpclm = 1.3; /* no unit */ - if (!model->B3SOIPDpdibl1Given) - model->B3SOIPDpdibl1 = .39; /* no unit */ - if (!model->B3SOIPDpdibl2Given) - model->B3SOIPDpdibl2 = 0.0086; /* no unit */ - if (!model->B3SOIPDpdiblbGiven) - model->B3SOIPDpdiblb = 0.0; /* 1/V */ - if (!model->B3SOIPDpvagGiven) - model->B3SOIPDpvag = 0.0; - if (!model->B3SOIPDwrGiven) - model->B3SOIPDwr = 1.0; - if (!model->B3SOIPDdwgGiven) - model->B3SOIPDdwg = 0.0; - if (!model->B3SOIPDdwbGiven) - model->B3SOIPDdwb = 0.0; - if (!model->B3SOIPDb0Given) - model->B3SOIPDb0 = 0.0; - if (!model->B3SOIPDb1Given) - model->B3SOIPDb1 = 0.0; - if (!model->B3SOIPDalpha0Given) - model->B3SOIPDalpha0 = 0.0; - - if (!model->B3SOIPDcgslGiven) - model->B3SOIPDcgsl = 0.0; - if (!model->B3SOIPDcgdlGiven) - model->B3SOIPDcgdl = 0.0; - if (!model->B3SOIPDckappaGiven) - model->B3SOIPDckappa = 0.6; - if (!model->B3SOIPDclcGiven) - model->B3SOIPDclc = 0.1e-7; - if (!model->B3SOIPDcleGiven) - model->B3SOIPDcle = 0.0; - if (!model->B3SOIPDtboxGiven) - model->B3SOIPDtbox = 3e-7; - if (!model->B3SOIPDtsiGiven) - model->B3SOIPDtsi = 1e-7; - if (!model->B3SOIPDxjGiven) - model->B3SOIPDxj = model->B3SOIPDtsi; - if (!model->B3SOIPDrbodyGiven) - model->B3SOIPDrbody = 0.0; - if (!model->B3SOIPDrbshGiven) - model->B3SOIPDrbsh = 0.0; - if (!model->B3SOIPDrth0Given) - model->B3SOIPDrth0 = 0; - - if (!model->B3SOIPDcth0Given) - model->B3SOIPDcth0 = 0; - - if (!model->B3SOIPDagidlGiven) - model->B3SOIPDagidl = 0.0; - if (!model->B3SOIPDbgidlGiven) - model->B3SOIPDbgidl = 0.0; - if (!model->B3SOIPDngidlGiven) - model->B3SOIPDngidl = 1.2; - if (!model->B3SOIPDndiodeGiven) - model->B3SOIPDndiode = 1.0; - if (!model->B3SOIPDntunGiven) - model->B3SOIPDntun = 10.0; - - if (!model->B3SOIPDnrecf0Given) - model->B3SOIPDnrecf0 = 2.0; - if (!model->B3SOIPDnrecr0Given) - model->B3SOIPDnrecr0 = 10.0; - - if (!model->B3SOIPDisbjtGiven) - model->B3SOIPDisbjt = 1e-6; - if (!model->B3SOIPDisdifGiven) - model->B3SOIPDisdif = 0.0; - if (!model->B3SOIPDisrecGiven) - model->B3SOIPDisrec = 1e-5; - if (!model->B3SOIPDistunGiven) - model->B3SOIPDistun = 0.0; - if (!model->B3SOIPDxbjtGiven) - model->B3SOIPDxbjt = 1; + if (!model->B3SOIPDtypeGiven) + model->B3SOIPDtype = NMOS; + if (!model->B3SOIPDmobModGiven) + model->B3SOIPDmobMod = 1; + if (!model->B3SOIPDbinUnitGiven) + model->B3SOIPDbinUnit = 1; + if (!model->B3SOIPDparamChkGiven) + model->B3SOIPDparamChk = 0; + if (!model->B3SOIPDcapModGiven) + model->B3SOIPDcapMod = 2; + if (!model->B3SOIPDnoiModGiven) + model->B3SOIPDnoiMod = 1; + if (!model->B3SOIPDshModGiven) + model->B3SOIPDshMod = 0; + if (!model->B3SOIPDversionGiven) + model->B3SOIPDversion = 2.0; + if (!model->B3SOIPDtoxGiven) + model->B3SOIPDtox = 100.0e-10; + model->B3SOIPDcox = 3.453133e-11 / model->B3SOIPDtox; + +/* v2.2.3 */ + if (!model->B3SOIPDdtoxcvGiven) + model->B3SOIPDdtoxcv = 0.0; + + if (!model->B3SOIPDcdscGiven) + model->B3SOIPDcdsc = 2.4e-4; /* unit Q/V/m^2 */ + if (!model->B3SOIPDcdscbGiven) + model->B3SOIPDcdscb = 0.0; /* unit Q/V/m^2 */ + if (!model->B3SOIPDcdscdGiven) + model->B3SOIPDcdscd = 0.0; /* unit Q/V/m^2 */ + if (!model->B3SOIPDcitGiven) + model->B3SOIPDcit = 0.0; /* unit Q/V/m^2 */ + if (!model->B3SOIPDnfactorGiven) + model->B3SOIPDnfactor = 1; + if (!model->B3SOIPDvsatGiven) + model->B3SOIPDvsat = 8.0e4; /* unit m/s */ + if (!model->B3SOIPDatGiven) + model->B3SOIPDat = 3.3e4; /* unit m/s */ + if (!model->B3SOIPDa0Given) + model->B3SOIPDa0 = 1.0; + if (!model->B3SOIPDagsGiven) + model->B3SOIPDags = 0.0; + if (!model->B3SOIPDa1Given) + model->B3SOIPDa1 = 0.0; + if (!model->B3SOIPDa2Given) + model->B3SOIPDa2 = 1.0; + if (!model->B3SOIPDketaGiven) + model->B3SOIPDketa = -0.6; /* unit / V */ + if (!model->B3SOIPDnsubGiven) + model->B3SOIPDnsub = 6.0e16; /* unit 1/cm3 */ + if (!model->B3SOIPDnpeakGiven) + model->B3SOIPDnpeak = 1.7e17; /* unit 1/cm3 */ + if (!model->B3SOIPDngateGiven) + model->B3SOIPDngate = 0; /* unit 1/cm3 */ + if (!model->B3SOIPDvbmGiven) + model->B3SOIPDvbm = -3.0; + if (!model->B3SOIPDxtGiven) + model->B3SOIPDxt = 1.55e-7; + if (!model->B3SOIPDkt1Given) + model->B3SOIPDkt1 = -0.11; /* unit V */ + if (!model->B3SOIPDkt1lGiven) + model->B3SOIPDkt1l = 0.0; /* unit V*m */ + if (!model->B3SOIPDkt2Given) + model->B3SOIPDkt2 = 0.022; /* No unit */ + if (!model->B3SOIPDk3Given) + model->B3SOIPDk3 = 0.0; + if (!model->B3SOIPDk3bGiven) + model->B3SOIPDk3b = 0.0; + if (!model->B3SOIPDw0Given) + model->B3SOIPDw0 = 2.5e-6; + if (!model->B3SOIPDnlxGiven) + model->B3SOIPDnlx = 1.74e-7; + if (!model->B3SOIPDdvt0Given) + model->B3SOIPDdvt0 = 2.2; + if (!model->B3SOIPDdvt1Given) + model->B3SOIPDdvt1 = 0.53; + if (!model->B3SOIPDdvt2Given) + model->B3SOIPDdvt2 = -0.032; /* unit 1 / V */ + + if (!model->B3SOIPDdvt0wGiven) + model->B3SOIPDdvt0w = 0.0; + if (!model->B3SOIPDdvt1wGiven) + model->B3SOIPDdvt1w = 5.3e6; + if (!model->B3SOIPDdvt2wGiven) + model->B3SOIPDdvt2w = -0.032; + + if (!model->B3SOIPDdroutGiven) + model->B3SOIPDdrout = 0.56; + if (!model->B3SOIPDdsubGiven) + model->B3SOIPDdsub = model->B3SOIPDdrout; + if (!model->B3SOIPDvth0Given) + model->B3SOIPDvth0 = (model->B3SOIPDtype == NMOS) ? 0.7 : -0.7; + if (!model->B3SOIPDuaGiven) + model->B3SOIPDua = 2.25e-9; /* unit m/V */ + if (!model->B3SOIPDua1Given) + model->B3SOIPDua1 = 4.31e-9; /* unit m/V */ + if (!model->B3SOIPDubGiven) + model->B3SOIPDub = 5.87e-19; /* unit (m/V)**2 */ + if (!model->B3SOIPDub1Given) + model->B3SOIPDub1 = -7.61e-18; /* unit (m/V)**2 */ + if (!model->B3SOIPDucGiven) + model->B3SOIPDuc = (model->B3SOIPDmobMod == 3) ? -0.0465 : -0.0465e-9; + if (!model->B3SOIPDuc1Given) + model->B3SOIPDuc1 = (model->B3SOIPDmobMod == 3) ? -0.056 : -0.056e-9; + if (!model->B3SOIPDu0Given) + model->B3SOIPDu0 = (model->B3SOIPDtype == NMOS) ? 0.067 : 0.025; + if (!model->B3SOIPDuteGiven) + model->B3SOIPDute = -1.5; + if (!model->B3SOIPDvoffGiven) + model->B3SOIPDvoff = -0.08; + if (!model->B3SOIPDdeltaGiven) + model->B3SOIPDdelta = 0.01; + if (!model->B3SOIPDrdswGiven) + model->B3SOIPDrdsw = 100; + if (!model->B3SOIPDprwgGiven) + model->B3SOIPDprwg = 0.0; /* unit 1/V */ + if (!model->B3SOIPDprwbGiven) + model->B3SOIPDprwb = 0.0; + if (!model->B3SOIPDprtGiven) + if (!model->B3SOIPDprtGiven) + model->B3SOIPDprt = 0.0; + if (!model->B3SOIPDeta0Given) + model->B3SOIPDeta0 = 0.08; /* no unit */ + if (!model->B3SOIPDetabGiven) + model->B3SOIPDetab = -0.07; /* unit 1/V */ + if (!model->B3SOIPDpclmGiven) + model->B3SOIPDpclm = 1.3; /* no unit */ + if (!model->B3SOIPDpdibl1Given) + model->B3SOIPDpdibl1 = .39; /* no unit */ + if (!model->B3SOIPDpdibl2Given) + model->B3SOIPDpdibl2 = 0.0086; /* no unit */ + if (!model->B3SOIPDpdiblbGiven) + model->B3SOIPDpdiblb = 0.0; /* 1/V */ + if (!model->B3SOIPDpvagGiven) + model->B3SOIPDpvag = 0.0; + if (!model->B3SOIPDwrGiven) + model->B3SOIPDwr = 1.0; + if (!model->B3SOIPDdwgGiven) + model->B3SOIPDdwg = 0.0; + if (!model->B3SOIPDdwbGiven) + model->B3SOIPDdwb = 0.0; + if (!model->B3SOIPDb0Given) + model->B3SOIPDb0 = 0.0; + if (!model->B3SOIPDb1Given) + model->B3SOIPDb1 = 0.0; + if (!model->B3SOIPDalpha0Given) + model->B3SOIPDalpha0 = 0.0; + + if (!model->B3SOIPDcgslGiven) + model->B3SOIPDcgsl = 0.0; + if (!model->B3SOIPDcgdlGiven) + model->B3SOIPDcgdl = 0.0; + if (!model->B3SOIPDckappaGiven) + model->B3SOIPDckappa = 0.6; + if (!model->B3SOIPDclcGiven) + model->B3SOIPDclc = 0.1e-7; + if (!model->B3SOIPDcleGiven) + model->B3SOIPDcle = 0.0; + if (!model->B3SOIPDtboxGiven) + model->B3SOIPDtbox = 3e-7; + if (!model->B3SOIPDtsiGiven) + model->B3SOIPDtsi = 1e-7; + if (!model->B3SOIPDxjGiven) + model->B3SOIPDxj = model->B3SOIPDtsi; + if (!model->B3SOIPDrbodyGiven) + model->B3SOIPDrbody = 0.0; + if (!model->B3SOIPDrbshGiven) + model->B3SOIPDrbsh = 0.0; + if (!model->B3SOIPDrth0Given) + model->B3SOIPDrth0 = 0; + + if (!model->B3SOIPDcth0Given) + model->B3SOIPDcth0 = 0; + + if (!model->B3SOIPDagidlGiven) + model->B3SOIPDagidl = 0.0; + if (!model->B3SOIPDbgidlGiven) + model->B3SOIPDbgidl = 0.0; + if (!model->B3SOIPDngidlGiven) + model->B3SOIPDngidl = 1.2; + if (!model->B3SOIPDndiodeGiven) + model->B3SOIPDndiode = 1.0; + if (!model->B3SOIPDntunGiven) + model->B3SOIPDntun = 10.0; + + if (!model->B3SOIPDnrecf0Given) + model->B3SOIPDnrecf0 = 2.0; + if (!model->B3SOIPDnrecr0Given) + model->B3SOIPDnrecr0 = 10.0; + + if (!model->B3SOIPDisbjtGiven) + model->B3SOIPDisbjt = 1e-6; + if (!model->B3SOIPDisdifGiven) + model->B3SOIPDisdif = 0.0; + if (!model->B3SOIPDisrecGiven) + model->B3SOIPDisrec = 1e-5; + if (!model->B3SOIPDistunGiven) + model->B3SOIPDistun = 0.0; + if (!model->B3SOIPDxbjtGiven) + model->B3SOIPDxbjt = 1; /* if (!model->B3SOIPDxdifGiven) model->B3SOIPDxdif = 1; */ - if (!model->B3SOIPDxdifGiven) - model->B3SOIPDxdif = model->B3SOIPDxbjt; - - if (!model->B3SOIPDxrecGiven) - model->B3SOIPDxrec = 1; - if (!model->B3SOIPDxtunGiven) - model->B3SOIPDxtun = 0; - if (!model->B3SOIPDttGiven) - model->B3SOIPDtt = 1e-12; - if (!model->B3SOIPDasdGiven) - model->B3SOIPDasd = 0.3; - - /* unit degree celcius */ - if (!model->B3SOIPDtnomGiven) - model->B3SOIPDtnom = ckt->CKTnomTemp; - if (!model->B3SOIPDLintGiven) - model->B3SOIPDLint = 0.0; - if (!model->B3SOIPDLlGiven) - model->B3SOIPDLl = 0.0; - if (!model->B3SOIPDLlnGiven) - model->B3SOIPDLln = 1.0; - if (!model->B3SOIPDLwGiven) - model->B3SOIPDLw = 0.0; - if (!model->B3SOIPDLwnGiven) - model->B3SOIPDLwn = 1.0; - if (!model->B3SOIPDLwlGiven) - model->B3SOIPDLwl = 0.0; - if (!model->B3SOIPDLminGiven) - model->B3SOIPDLmin = 0.0; - if (!model->B3SOIPDLmaxGiven) - model->B3SOIPDLmax = 1.0; - if (!model->B3SOIPDWintGiven) - model->B3SOIPDWint = 0.0; - if (!model->B3SOIPDWlGiven) - model->B3SOIPDWl = 0.0; - if (!model->B3SOIPDWlnGiven) - model->B3SOIPDWln = 1.0; - if (!model->B3SOIPDWwGiven) - model->B3SOIPDWw = 0.0; - if (!model->B3SOIPDWwnGiven) - model->B3SOIPDWwn = 1.0; - if (!model->B3SOIPDWwlGiven) - model->B3SOIPDWwl = 0.0; - if (!model->B3SOIPDWminGiven) - model->B3SOIPDWmin = 0.0; - if (!model->B3SOIPDWmaxGiven) - model->B3SOIPDWmax = 1.0; - if (!model->B3SOIPDdwcGiven) - model->B3SOIPDdwc = model->B3SOIPDWint; - if (!model->B3SOIPDdlcGiven) - model->B3SOIPDdlc = model->B3SOIPDLint; + if (!model->B3SOIPDxdifGiven) + model->B3SOIPDxdif = model->B3SOIPDxbjt; + + if (!model->B3SOIPDxrecGiven) + model->B3SOIPDxrec = 1; + if (!model->B3SOIPDxtunGiven) + model->B3SOIPDxtun = 0; + if (!model->B3SOIPDttGiven) + model->B3SOIPDtt = 1e-12; + if (!model->B3SOIPDasdGiven) + model->B3SOIPDasd = 0.3; + + /* unit degree celcius */ + if (!model->B3SOIPDtnomGiven) + model->B3SOIPDtnom = ckt->CKTnomTemp; + if (!model->B3SOIPDLintGiven) + model->B3SOIPDLint = 0.0; + if (!model->B3SOIPDLlGiven) + model->B3SOIPDLl = 0.0; + if (!model->B3SOIPDLlcGiven) + model->B3SOIPDLlc = 0.0; /* v2.2.3 */ + if (!model->B3SOIPDLlnGiven) + model->B3SOIPDLln = 1.0; + if (!model->B3SOIPDLwGiven) + model->B3SOIPDLw = 0.0; + if (!model->B3SOIPDLwcGiven) + model->B3SOIPDLwc = 0.0; /* v2.2.3 */ + if (!model->B3SOIPDLwnGiven) + model->B3SOIPDLwn = 1.0; + if (!model->B3SOIPDLwlGiven) + model->B3SOIPDLwl = 0.0; + if (!model->B3SOIPDLwlcGiven) + model->B3SOIPDLwlc = 0.0; /* v2.2.3 */ + if (!model->B3SOIPDLminGiven) + model->B3SOIPDLmin = 0.0; + if (!model->B3SOIPDLmaxGiven) + model->B3SOIPDLmax = 1.0; + if (!model->B3SOIPDWintGiven) + model->B3SOIPDWint = 0.0; + if (!model->B3SOIPDWlGiven) + model->B3SOIPDWl = 0.0; + if (!model->B3SOIPDWlcGiven) + model->B3SOIPDWlc = 0.0; /* v2.2.3 */ + if (!model->B3SOIPDWlnGiven) + model->B3SOIPDWln = 1.0; + if (!model->B3SOIPDWwGiven) + model->B3SOIPDWw = 0.0; + if (!model->B3SOIPDWwcGiven) + model->B3SOIPDWwc = 0.0; /* v2.2.3 */ + if (!model->B3SOIPDWwnGiven) + model->B3SOIPDWwn = 1.0; + if (!model->B3SOIPDWwlGiven) + model->B3SOIPDWwl = 0.0; + if (!model->B3SOIPDWwlcGiven) + model->B3SOIPDWwlc = 0.0; /* v2.2.3 */ + if (!model->B3SOIPDWminGiven) + model->B3SOIPDWmin = 0.0; + if (!model->B3SOIPDWmaxGiven) + model->B3SOIPDWmax = 1.0; + if (!model->B3SOIPDdwcGiven) + model->B3SOIPDdwc = model->B3SOIPDWint; + if (!model->B3SOIPDdlcGiven) + model->B3SOIPDdlc = model->B3SOIPDLint; /* v2.2 release */ - if (!model->B3SOIPDwth0Given) - model->B3SOIPDwth0 = 0.0; - if (!model->B3SOIPDrhaloGiven) - model->B3SOIPDrhalo = 1e15; - if (!model->B3SOIPDntoxGiven) - model->B3SOIPDntox = 1; - if (!model->B3SOIPDtoxrefGiven) - model->B3SOIPDtoxref = 2.5e-9; - if (!model->B3SOIPDebgGiven) - model->B3SOIPDebg = 1.2; - if (!model->B3SOIPDnevbGiven) - model->B3SOIPDnevb = 3; - if (!model->B3SOIPDalphaGB1Given) - model->B3SOIPDalphaGB1 = 0.35; - if (!model->B3SOIPDbetaGB1Given) - model->B3SOIPDbetaGB1 = 0.03; - if (!model->B3SOIPDvgb1Given) - model->B3SOIPDvgb1 = 300; - if (!model->B3SOIPDalphaGB2Given) - model->B3SOIPDalphaGB2 = 0.43; - if (!model->B3SOIPDbetaGB2Given) - model->B3SOIPDbetaGB2 = 0.05; - if (!model->B3SOIPDnecbGiven) - model->B3SOIPDnecb = 1; - if (!model->B3SOIPDvgb2Given) - model->B3SOIPDvgb2 = 17; - if (!model->B3SOIPDtoxqmGiven) - model->B3SOIPDtoxqm = model->B3SOIPDtox; - if (!model->B3SOIPDvoxhGiven) - model->B3SOIPDvoxh = 5.0; - if (!model->B3SOIPDdeltavoxGiven) - model->B3SOIPDdeltavox = 0.005; - if (!model->B3SOIPDigModGiven) - model->B3SOIPDigMod = 0; + if (!model->B3SOIPDwth0Given) + model->B3SOIPDwth0 = 0.0; + if (!model->B3SOIPDrhaloGiven) + model->B3SOIPDrhalo = 1e15; + if (!model->B3SOIPDntoxGiven) + model->B3SOIPDntox = 1; + if (!model->B3SOIPDtoxrefGiven) + model->B3SOIPDtoxref = 2.5e-9; + if (!model->B3SOIPDebgGiven) + model->B3SOIPDebg = 1.2; + if (!model->B3SOIPDvevbGiven) + model->B3SOIPDvevb = 0.075; + if (!model->B3SOIPDalphaGB1Given) + model->B3SOIPDalphaGB1 = 0.35; + if (!model->B3SOIPDbetaGB1Given) + model->B3SOIPDbetaGB1 = 0.03; + if (!model->B3SOIPDvgb1Given) + model->B3SOIPDvgb1 = 300; + if (!model->B3SOIPDalphaGB2Given) + model->B3SOIPDalphaGB2 = 0.43; + if (!model->B3SOIPDbetaGB2Given) + model->B3SOIPDbetaGB2 = 0.05; + if (!model->B3SOIPDvecbGiven) + model->B3SOIPDvecb = 0.026; + if (!model->B3SOIPDvgb2Given) + model->B3SOIPDvgb2 = 17; + if (!model->B3SOIPDtoxqmGiven) + model->B3SOIPDtoxqm = model->B3SOIPDtox; + if (!model->B3SOIPDvoxhGiven) + model->B3SOIPDvoxh = 5.0; + if (!model->B3SOIPDdeltavoxGiven) + model->B3SOIPDdeltavox = 0.005; + if (!model->B3SOIPDigModGiven) + model->B3SOIPDigMod = 0; /* v2.0 release */ - if (!model->B3SOIPDk1w1Given) - model->B3SOIPDk1w1 = 0.0; - if (!model->B3SOIPDk1w2Given) - model->B3SOIPDk1w2 = 0.0; - if (!model->B3SOIPDketasGiven) - model->B3SOIPDketas = 0.0; - if (!model->B3SOIPDdwbcGiven) - model->B3SOIPDdwbc = 0.0; - if (!model->B3SOIPDbeta0Given) - model->B3SOIPDbeta0 = 0.0; - if (!model->B3SOIPDbeta1Given) - model->B3SOIPDbeta1 = 0.0; - if (!model->B3SOIPDbeta2Given) - model->B3SOIPDbeta2 = 0.1; - if (!model->B3SOIPDvdsatii0Given) - model->B3SOIPDvdsatii0 = 0.9; - if (!model->B3SOIPDtiiGiven) - model->B3SOIPDtii = 0.0; - if (!model->B3SOIPDliiGiven) - model->B3SOIPDlii = 0.0; - if (!model->B3SOIPDsii0Given) - model->B3SOIPDsii0 = 0.5; - if (!model->B3SOIPDsii1Given) - model->B3SOIPDsii1 = 0.1; - if (!model->B3SOIPDsii2Given) - model->B3SOIPDsii2 = 0.0; - if (!model->B3SOIPDsiidGiven) - model->B3SOIPDsiid = 0.0; - if (!model->B3SOIPDfbjtiiGiven) - model->B3SOIPDfbjtii = 0.0; - if (!model->B3SOIPDesatiiGiven) - model->B3SOIPDesatii = 1e7; - if (!model->B3SOIPDlnGiven) - model->B3SOIPDln = 2e-6; - if (!model->B3SOIPDvrec0Given) - model->B3SOIPDvrec0 = 0; - if (!model->B3SOIPDvtun0Given) - model->B3SOIPDvtun0 = 0; - if (!model->B3SOIPDnbjtGiven) - model->B3SOIPDnbjt = 1.0; - if (!model->B3SOIPDlbjt0Given) - model->B3SOIPDlbjt0 = 0.20e-6; - if (!model->B3SOIPDldif0Given) - model->B3SOIPDldif0 = 1.0; - if (!model->B3SOIPDvabjtGiven) - model->B3SOIPDvabjt = 10.0; - if (!model->B3SOIPDaelyGiven) - model->B3SOIPDaely = 0; - if (!model->B3SOIPDahliGiven) - model->B3SOIPDahli = 0; - if (!model->B3SOIPDrbodyGiven) - model->B3SOIPDrbody = 0.0; - if (!model->B3SOIPDrbshGiven) - model->B3SOIPDrbsh = 0.0; - if (!model->B3SOIPDntrecfGiven) - model->B3SOIPDntrecf = 0.0; - if (!model->B3SOIPDntrecrGiven) - model->B3SOIPDntrecr = 0.0; - if (!model->B3SOIPDndifGiven) - model->B3SOIPDndif = -1.0; - if (!model->B3SOIPDdlcbGiven) - model->B3SOIPDdlcb = 0.0; - if (!model->B3SOIPDfbodyGiven) - model->B3SOIPDfbody = 1.0; - if (!model->B3SOIPDtcjswgGiven) - model->B3SOIPDtcjswg = 0.0; - if (!model->B3SOIPDtpbswgGiven) - model->B3SOIPDtpbswg = 0.0; - if (!model->B3SOIPDacdeGiven) - model->B3SOIPDacde = 1.0; - if (!model->B3SOIPDmoinGiven) - model->B3SOIPDmoin = 15.0; - if (!model->B3SOIPDdelvtGiven) - model->B3SOIPDdelvt = 0.0; - if (!model->B3SOIPDkb1Given) - model->B3SOIPDkb1 = 1.0; - if (!model->B3SOIPDdlbgGiven) - model->B3SOIPDdlbg = 0.0; + if (!model->B3SOIPDk1w1Given) + model->B3SOIPDk1w1 = 0.0; + if (!model->B3SOIPDk1w2Given) + model->B3SOIPDk1w2 = 0.0; + if (!model->B3SOIPDketasGiven) + model->B3SOIPDketas = 0.0; + if (!model->B3SOIPDdwbcGiven) + model->B3SOIPDdwbc = 0.0; + if (!model->B3SOIPDbeta0Given) + model->B3SOIPDbeta0 = 0.0; + if (!model->B3SOIPDbeta1Given) + model->B3SOIPDbeta1 = 0.0; + if (!model->B3SOIPDbeta2Given) + model->B3SOIPDbeta2 = 0.1; + if (!model->B3SOIPDvdsatii0Given) + model->B3SOIPDvdsatii0 = 0.9; + if (!model->B3SOIPDtiiGiven) + model->B3SOIPDtii = 0.0; + if (!model->B3SOIPDliiGiven) + model->B3SOIPDlii = 0.0; + if (!model->B3SOIPDsii0Given) + model->B3SOIPDsii0 = 0.5; + if (!model->B3SOIPDsii1Given) + model->B3SOIPDsii1 = 0.1; + if (!model->B3SOIPDsii2Given) + model->B3SOIPDsii2 = 0.0; + if (!model->B3SOIPDsiidGiven) + model->B3SOIPDsiid = 0.0; + if (!model->B3SOIPDfbjtiiGiven) + model->B3SOIPDfbjtii = 0.0; + if (!model->B3SOIPDesatiiGiven) + model->B3SOIPDesatii = 1e7; + if (!model->B3SOIPDlnGiven) + model->B3SOIPDln = 2e-6; + if (!model->B3SOIPDvrec0Given) + model->B3SOIPDvrec0 = 0; + if (!model->B3SOIPDvtun0Given) + model->B3SOIPDvtun0 = 0; + if (!model->B3SOIPDnbjtGiven) + model->B3SOIPDnbjt = 1.0; + if (!model->B3SOIPDlbjt0Given) + model->B3SOIPDlbjt0 = 0.20e-6; + if (!model->B3SOIPDldif0Given) + model->B3SOIPDldif0 = 1.0; + if (!model->B3SOIPDvabjtGiven) + model->B3SOIPDvabjt = 10.0; + if (!model->B3SOIPDaelyGiven) + model->B3SOIPDaely = 0; + if (!model->B3SOIPDahliGiven) + model->B3SOIPDahli = 0; + if (!model->B3SOIPDrbodyGiven) + model->B3SOIPDrbody = 0.0; + if (!model->B3SOIPDrbshGiven) + model->B3SOIPDrbsh = 0.0; + if (!model->B3SOIPDntrecfGiven) + model->B3SOIPDntrecf = 0.0; + if (!model->B3SOIPDntrecrGiven) + model->B3SOIPDntrecr = 0.0; + if (!model->B3SOIPDndifGiven) + model->B3SOIPDndif = -1.0; + if (!model->B3SOIPDdlcbGiven) + model->B3SOIPDdlcb = 0.0; + if (!model->B3SOIPDfbodyGiven) + model->B3SOIPDfbody = 1.0; + if (!model->B3SOIPDtcjswgGiven) + model->B3SOIPDtcjswg = 0.0; + if (!model->B3SOIPDtpbswgGiven) + model->B3SOIPDtpbswg = 0.0; + if (!model->B3SOIPDacdeGiven) + model->B3SOIPDacde = 1.0; + if (!model->B3SOIPDmoinGiven) + model->B3SOIPDmoin = 15.0; + if (!model->B3SOIPDdelvtGiven) + model->B3SOIPDdelvt = 0.0; + if (!model->B3SOIPDkb1Given) + model->B3SOIPDkb1 = 1.0; + if (!model->B3SOIPDdlbgGiven) + model->B3SOIPDdlbg = 0.0; /* Added for binning - START */ - /* Length dependence */ - if (!model->B3SOIPDlnpeakGiven) - model->B3SOIPDlnpeak = 0.0; - if (!model->B3SOIPDlnsubGiven) - model->B3SOIPDlnsub = 0.0; - if (!model->B3SOIPDlngateGiven) - model->B3SOIPDlngate = 0.0; - if (!model->B3SOIPDlvth0Given) - model->B3SOIPDlvth0 = 0.0; - if (!model->B3SOIPDlk1Given) - model->B3SOIPDlk1 = 0.0; - if (!model->B3SOIPDlk1w1Given) - model->B3SOIPDlk1w1 = 0.0; - if (!model->B3SOIPDlk1w2Given) - model->B3SOIPDlk1w2 = 0.0; - if (!model->B3SOIPDlk2Given) - model->B3SOIPDlk2 = 0.0; - if (!model->B3SOIPDlk3Given) - model->B3SOIPDlk3 = 0.0; - if (!model->B3SOIPDlk3bGiven) - model->B3SOIPDlk3b = 0.0; - if (!model->B3SOIPDlkb1Given) - model->B3SOIPDlkb1 = 0.0; - if (!model->B3SOIPDlw0Given) - model->B3SOIPDlw0 = 0.0; - if (!model->B3SOIPDlnlxGiven) - model->B3SOIPDlnlx = 0.0; - if (!model->B3SOIPDldvt0Given) - model->B3SOIPDldvt0 = 0.0; - if (!model->B3SOIPDldvt1Given) - model->B3SOIPDldvt1 = 0.0; - if (!model->B3SOIPDldvt2Given) - model->B3SOIPDldvt2 = 0.0; - if (!model->B3SOIPDldvt0wGiven) - model->B3SOIPDldvt0w = 0.0; - if (!model->B3SOIPDldvt1wGiven) - model->B3SOIPDldvt1w = 0.0; - if (!model->B3SOIPDldvt2wGiven) - model->B3SOIPDldvt2w = 0.0; - if (!model->B3SOIPDlu0Given) - model->B3SOIPDlu0 = 0.0; - if (!model->B3SOIPDluaGiven) - model->B3SOIPDlua = 0.0; - if (!model->B3SOIPDlubGiven) - model->B3SOIPDlub = 0.0; - if (!model->B3SOIPDlucGiven) - model->B3SOIPDluc = 0.0; - if (!model->B3SOIPDlvsatGiven) - model->B3SOIPDlvsat = 0.0; - if (!model->B3SOIPDla0Given) - model->B3SOIPDla0 = 0.0; - if (!model->B3SOIPDlagsGiven) - model->B3SOIPDlags = 0.0; - if (!model->B3SOIPDlb0Given) - model->B3SOIPDlb0 = 0.0; - if (!model->B3SOIPDlb1Given) - model->B3SOIPDlb1 = 0.0; - if (!model->B3SOIPDlketaGiven) - model->B3SOIPDlketa = 0.0; - if (!model->B3SOIPDlketasGiven) - model->B3SOIPDlketas = 0.0; - if (!model->B3SOIPDla1Given) - model->B3SOIPDla1 = 0.0; - if (!model->B3SOIPDla2Given) - model->B3SOIPDla2 = 0.0; - if (!model->B3SOIPDlrdswGiven) - model->B3SOIPDlrdsw = 0.0; - if (!model->B3SOIPDlprwbGiven) - model->B3SOIPDlprwb = 0.0; - if (!model->B3SOIPDlprwgGiven) - model->B3SOIPDlprwg = 0.0; - if (!model->B3SOIPDlwrGiven) - model->B3SOIPDlwr = 0.0; - if (!model->B3SOIPDlnfactorGiven) - model->B3SOIPDlnfactor = 0.0; - if (!model->B3SOIPDldwgGiven) - model->B3SOIPDldwg = 0.0; - if (!model->B3SOIPDldwbGiven) - model->B3SOIPDldwb = 0.0; - if (!model->B3SOIPDlvoffGiven) - model->B3SOIPDlvoff = 0.0; - if (!model->B3SOIPDleta0Given) - model->B3SOIPDleta0 = 0.0; - if (!model->B3SOIPDletabGiven) - model->B3SOIPDletab = 0.0; - if (!model->B3SOIPDldsubGiven) - model->B3SOIPDldsub = 0.0; - if (!model->B3SOIPDlcitGiven) - model->B3SOIPDlcit = 0.0; - if (!model->B3SOIPDlcdscGiven) - model->B3SOIPDlcdsc = 0.0; - if (!model->B3SOIPDlcdscbGiven) - model->B3SOIPDlcdscb = 0.0; - if (!model->B3SOIPDlcdscdGiven) - model->B3SOIPDlcdscd = 0.0; - if (!model->B3SOIPDlpclmGiven) - model->B3SOIPDlpclm = 0.0; - if (!model->B3SOIPDlpdibl1Given) - model->B3SOIPDlpdibl1 = 0.0; - if (!model->B3SOIPDlpdibl2Given) - model->B3SOIPDlpdibl2 = 0.0; - if (!model->B3SOIPDlpdiblbGiven) - model->B3SOIPDlpdiblb = 0.0; - if (!model->B3SOIPDldroutGiven) - model->B3SOIPDldrout = 0.0; - if (!model->B3SOIPDlpvagGiven) - model->B3SOIPDlpvag = 0.0; - if (!model->B3SOIPDldeltaGiven) - model->B3SOIPDldelta = 0.0; - if (!model->B3SOIPDlalpha0Given) - model->B3SOIPDlalpha0 = 0.0; - if (!model->B3SOIPDlfbjtiiGiven) - model->B3SOIPDlfbjtii = 0.0; - if (!model->B3SOIPDlbeta0Given) - model->B3SOIPDlbeta0 = 0.0; - if (!model->B3SOIPDlbeta1Given) - model->B3SOIPDlbeta1 = 0.0; - if (!model->B3SOIPDlbeta2Given) - model->B3SOIPDlbeta2 = 0.0; - if (!model->B3SOIPDlvdsatii0Given) - model->B3SOIPDlvdsatii0 = 0.0; - if (!model->B3SOIPDlliiGiven) - model->B3SOIPDllii = 0.0; - if (!model->B3SOIPDlesatiiGiven) - model->B3SOIPDlesatii = 0.0; - if (!model->B3SOIPDlsii0Given) - model->B3SOIPDlsii0 = 0.0; - if (!model->B3SOIPDlsii1Given) - model->B3SOIPDlsii1 = 0.0; - if (!model->B3SOIPDlsii2Given) - model->B3SOIPDlsii2 = 0.0; - if (!model->B3SOIPDlsiidGiven) - model->B3SOIPDlsiid = 0.0; - if (!model->B3SOIPDlagidlGiven) - model->B3SOIPDlagidl = 0.0; - if (!model->B3SOIPDlbgidlGiven) - model->B3SOIPDlbgidl = 0.0; - if (!model->B3SOIPDlngidlGiven) - model->B3SOIPDlngidl = 0.0; - if (!model->B3SOIPDlntunGiven) - model->B3SOIPDlntun = 0.0; - if (!model->B3SOIPDlndiodeGiven) - model->B3SOIPDlndiode = 0.0; - if (!model->B3SOIPDlnrecf0Given) - model->B3SOIPDlnrecf0 = 0.0; - if (!model->B3SOIPDlnrecr0Given) - model->B3SOIPDlnrecr0 = 0.0; - if (!model->B3SOIPDlisbjtGiven) - model->B3SOIPDlisbjt = 0.0; - if (!model->B3SOIPDlisdifGiven) - model->B3SOIPDlisdif = 0.0; - if (!model->B3SOIPDlisrecGiven) - model->B3SOIPDlisrec = 0.0; - if (!model->B3SOIPDlistunGiven) - model->B3SOIPDlistun = 0.0; - if (!model->B3SOIPDlvrec0Given) - model->B3SOIPDlvrec0 = 0.0; - if (!model->B3SOIPDlvtun0Given) - model->B3SOIPDlvtun0 = 0.0; - if (!model->B3SOIPDlnbjtGiven) - model->B3SOIPDlnbjt = 0.0; - if (!model->B3SOIPDllbjt0Given) - model->B3SOIPDllbjt0 = 0.0; - if (!model->B3SOIPDlvabjtGiven) - model->B3SOIPDlvabjt = 0.0; - if (!model->B3SOIPDlaelyGiven) - model->B3SOIPDlaely = 0.0; - if (!model->B3SOIPDlahliGiven) - model->B3SOIPDlahli = 0.0; - /* CV Model */ - if (!model->B3SOIPDlvsdfbGiven) - model->B3SOIPDlvsdfb = 0.0; - if (!model->B3SOIPDlvsdthGiven) - model->B3SOIPDlvsdth = 0.0; - if (!model->B3SOIPDldelvtGiven) - model->B3SOIPDldelvt = 0.0; - if (!model->B3SOIPDlacdeGiven) - model->B3SOIPDlacde = 0.0; - if (!model->B3SOIPDlmoinGiven) - model->B3SOIPDlmoin = 0.0; - - /* Width dependence */ - if (!model->B3SOIPDwnpeakGiven) - model->B3SOIPDwnpeak = 0.0; - if (!model->B3SOIPDwnsubGiven) - model->B3SOIPDwnsub = 0.0; - if (!model->B3SOIPDwngateGiven) - model->B3SOIPDwngate = 0.0; - if (!model->B3SOIPDwvth0Given) - model->B3SOIPDwvth0 = 0.0; - if (!model->B3SOIPDwk1Given) - model->B3SOIPDwk1 = 0.0; - if (!model->B3SOIPDwk1w1Given) - model->B3SOIPDwk1w1 = 0.0; - if (!model->B3SOIPDwk1w2Given) - model->B3SOIPDwk1w2 = 0.0; - if (!model->B3SOIPDwk2Given) - model->B3SOIPDwk2 = 0.0; - if (!model->B3SOIPDwk3Given) - model->B3SOIPDwk3 = 0.0; - if (!model->B3SOIPDwk3bGiven) - model->B3SOIPDwk3b = 0.0; - if (!model->B3SOIPDwkb1Given) - model->B3SOIPDwkb1 = 0.0; - if (!model->B3SOIPDww0Given) - model->B3SOIPDww0 = 0.0; - if (!model->B3SOIPDwnlxGiven) - model->B3SOIPDwnlx = 0.0; - if (!model->B3SOIPDwdvt0Given) - model->B3SOIPDwdvt0 = 0.0; - if (!model->B3SOIPDwdvt1Given) - model->B3SOIPDwdvt1 = 0.0; - if (!model->B3SOIPDwdvt2Given) - model->B3SOIPDwdvt2 = 0.0; - if (!model->B3SOIPDwdvt0wGiven) - model->B3SOIPDwdvt0w = 0.0; - if (!model->B3SOIPDwdvt1wGiven) - model->B3SOIPDwdvt1w = 0.0; - if (!model->B3SOIPDwdvt2wGiven) - model->B3SOIPDwdvt2w = 0.0; - if (!model->B3SOIPDwu0Given) - model->B3SOIPDwu0 = 0.0; - if (!model->B3SOIPDwuaGiven) - model->B3SOIPDwua = 0.0; - if (!model->B3SOIPDwubGiven) - model->B3SOIPDwub = 0.0; - if (!model->B3SOIPDwucGiven) - model->B3SOIPDwuc = 0.0; - if (!model->B3SOIPDwvsatGiven) - model->B3SOIPDwvsat = 0.0; - if (!model->B3SOIPDwa0Given) - model->B3SOIPDwa0 = 0.0; - if (!model->B3SOIPDwagsGiven) - model->B3SOIPDwags = 0.0; - if (!model->B3SOIPDwb0Given) - model->B3SOIPDwb0 = 0.0; - if (!model->B3SOIPDwb1Given) - model->B3SOIPDwb1 = 0.0; - if (!model->B3SOIPDwketaGiven) - model->B3SOIPDwketa = 0.0; - if (!model->B3SOIPDwketasGiven) - model->B3SOIPDwketas = 0.0; - if (!model->B3SOIPDwa1Given) - model->B3SOIPDwa1 = 0.0; - if (!model->B3SOIPDwa2Given) - model->B3SOIPDwa2 = 0.0; - if (!model->B3SOIPDwrdswGiven) - model->B3SOIPDwrdsw = 0.0; - if (!model->B3SOIPDwprwbGiven) - model->B3SOIPDwprwb = 0.0; - if (!model->B3SOIPDwprwgGiven) - model->B3SOIPDwprwg = 0.0; - if (!model->B3SOIPDwwrGiven) - model->B3SOIPDwwr = 0.0; - if (!model->B3SOIPDwnfactorGiven) - model->B3SOIPDwnfactor = 0.0; - if (!model->B3SOIPDwdwgGiven) - model->B3SOIPDwdwg = 0.0; - if (!model->B3SOIPDwdwbGiven) - model->B3SOIPDwdwb = 0.0; - if (!model->B3SOIPDwvoffGiven) - model->B3SOIPDwvoff = 0.0; - if (!model->B3SOIPDweta0Given) - model->B3SOIPDweta0 = 0.0; - if (!model->B3SOIPDwetabGiven) - model->B3SOIPDwetab = 0.0; - if (!model->B3SOIPDwdsubGiven) - model->B3SOIPDwdsub = 0.0; - if (!model->B3SOIPDwcitGiven) - model->B3SOIPDwcit = 0.0; - if (!model->B3SOIPDwcdscGiven) - model->B3SOIPDwcdsc = 0.0; - if (!model->B3SOIPDwcdscbGiven) - model->B3SOIPDwcdscb = 0.0; - if (!model->B3SOIPDwcdscdGiven) - model->B3SOIPDwcdscd = 0.0; - if (!model->B3SOIPDwpclmGiven) - model->B3SOIPDwpclm = 0.0; - if (!model->B3SOIPDwpdibl1Given) - model->B3SOIPDwpdibl1 = 0.0; - if (!model->B3SOIPDwpdibl2Given) - model->B3SOIPDwpdibl2 = 0.0; - if (!model->B3SOIPDwpdiblbGiven) - model->B3SOIPDwpdiblb = 0.0; - if (!model->B3SOIPDwdroutGiven) - model->B3SOIPDwdrout = 0.0; - if (!model->B3SOIPDwpvagGiven) - model->B3SOIPDwpvag = 0.0; - if (!model->B3SOIPDwdeltaGiven) - model->B3SOIPDwdelta = 0.0; - if (!model->B3SOIPDwalpha0Given) - model->B3SOIPDwalpha0 = 0.0; - if (!model->B3SOIPDwfbjtiiGiven) - model->B3SOIPDwfbjtii = 0.0; - if (!model->B3SOIPDwbeta0Given) - model->B3SOIPDwbeta0 = 0.0; - if (!model->B3SOIPDwbeta1Given) - model->B3SOIPDwbeta1 = 0.0; - if (!model->B3SOIPDwbeta2Given) - model->B3SOIPDwbeta2 = 0.0; - if (!model->B3SOIPDwvdsatii0Given) - model->B3SOIPDwvdsatii0 = 0.0; - if (!model->B3SOIPDwliiGiven) - model->B3SOIPDwlii = 0.0; - if (!model->B3SOIPDwesatiiGiven) - model->B3SOIPDwesatii = 0.0; - if (!model->B3SOIPDwsii0Given) - model->B3SOIPDwsii0 = 0.0; - if (!model->B3SOIPDwsii1Given) - model->B3SOIPDwsii1 = 0.0; - if (!model->B3SOIPDwsii2Given) - model->B3SOIPDwsii2 = 0.0; - if (!model->B3SOIPDwsiidGiven) - model->B3SOIPDwsiid = 0.0; - if (!model->B3SOIPDwagidlGiven) - model->B3SOIPDwagidl = 0.0; - if (!model->B3SOIPDwbgidlGiven) - model->B3SOIPDwbgidl = 0.0; - if (!model->B3SOIPDwngidlGiven) - model->B3SOIPDwngidl = 0.0; - if (!model->B3SOIPDwntunGiven) - model->B3SOIPDwntun = 0.0; - if (!model->B3SOIPDwndiodeGiven) - model->B3SOIPDwndiode = 0.0; - if (!model->B3SOIPDwnrecf0Given) - model->B3SOIPDwnrecf0 = 0.0; - if (!model->B3SOIPDwnrecr0Given) - model->B3SOIPDwnrecr0 = 0.0; - if (!model->B3SOIPDwisbjtGiven) - model->B3SOIPDwisbjt = 0.0; - if (!model->B3SOIPDwisdifGiven) - model->B3SOIPDwisdif = 0.0; - if (!model->B3SOIPDwisrecGiven) - model->B3SOIPDwisrec = 0.0; - if (!model->B3SOIPDwistunGiven) - model->B3SOIPDwistun = 0.0; - if (!model->B3SOIPDwvrec0Given) - model->B3SOIPDwvrec0 = 0.0; - if (!model->B3SOIPDwvtun0Given) - model->B3SOIPDwvtun0 = 0.0; - if (!model->B3SOIPDwnbjtGiven) - model->B3SOIPDwnbjt = 0.0; - if (!model->B3SOIPDwlbjt0Given) - model->B3SOIPDwlbjt0 = 0.0; - if (!model->B3SOIPDwvabjtGiven) - model->B3SOIPDwvabjt = 0.0; - if (!model->B3SOIPDwaelyGiven) - model->B3SOIPDwaely = 0.0; - if (!model->B3SOIPDwahliGiven) - model->B3SOIPDwahli = 0.0; - /* CV Model */ - if (!model->B3SOIPDwvsdfbGiven) - model->B3SOIPDwvsdfb = 0.0; - if (!model->B3SOIPDwvsdthGiven) - model->B3SOIPDwvsdth = 0.0; - if (!model->B3SOIPDwdelvtGiven) - model->B3SOIPDwdelvt = 0.0; - if (!model->B3SOIPDwacdeGiven) - model->B3SOIPDwacde = 0.0; - if (!model->B3SOIPDwmoinGiven) - model->B3SOIPDwmoin = 0.0; - - /* Cross-term dependence */ - if (!model->B3SOIPDpnpeakGiven) - model->B3SOIPDpnpeak = 0.0; - if (!model->B3SOIPDpnsubGiven) - model->B3SOIPDpnsub = 0.0; - if (!model->B3SOIPDpngateGiven) - model->B3SOIPDpngate = 0.0; - if (!model->B3SOIPDpvth0Given) - model->B3SOIPDpvth0 = 0.0; - if (!model->B3SOIPDpk1Given) - model->B3SOIPDpk1 = 0.0; - if (!model->B3SOIPDpk1w1Given) - model->B3SOIPDpk1w1 = 0.0; - if (!model->B3SOIPDpk1w2Given) - model->B3SOIPDpk1w2 = 0.0; - if (!model->B3SOIPDpk2Given) - model->B3SOIPDpk2 = 0.0; - if (!model->B3SOIPDpk3Given) - model->B3SOIPDpk3 = 0.0; - if (!model->B3SOIPDpk3bGiven) - model->B3SOIPDpk3b = 0.0; - if (!model->B3SOIPDpkb1Given) - model->B3SOIPDpkb1 = 0.0; - if (!model->B3SOIPDpw0Given) - model->B3SOIPDpw0 = 0.0; - if (!model->B3SOIPDpnlxGiven) - model->B3SOIPDpnlx = 0.0; - if (!model->B3SOIPDpdvt0Given) - model->B3SOIPDpdvt0 = 0.0; - if (!model->B3SOIPDpdvt1Given) - model->B3SOIPDpdvt1 = 0.0; - if (!model->B3SOIPDpdvt2Given) - model->B3SOIPDpdvt2 = 0.0; - if (!model->B3SOIPDpdvt0wGiven) - model->B3SOIPDpdvt0w = 0.0; - if (!model->B3SOIPDpdvt1wGiven) - model->B3SOIPDpdvt1w = 0.0; - if (!model->B3SOIPDpdvt2wGiven) - model->B3SOIPDpdvt2w = 0.0; - if (!model->B3SOIPDpu0Given) - model->B3SOIPDpu0 = 0.0; - if (!model->B3SOIPDpuaGiven) - model->B3SOIPDpua = 0.0; - if (!model->B3SOIPDpubGiven) - model->B3SOIPDpub = 0.0; - if (!model->B3SOIPDpucGiven) - model->B3SOIPDpuc = 0.0; - if (!model->B3SOIPDpvsatGiven) - model->B3SOIPDpvsat = 0.0; - if (!model->B3SOIPDpa0Given) - model->B3SOIPDpa0 = 0.0; - if (!model->B3SOIPDpagsGiven) - model->B3SOIPDpags = 0.0; - if (!model->B3SOIPDpb0Given) - model->B3SOIPDpb0 = 0.0; - if (!model->B3SOIPDpb1Given) - model->B3SOIPDpb1 = 0.0; - if (!model->B3SOIPDpketaGiven) - model->B3SOIPDpketa = 0.0; - if (!model->B3SOIPDpketasGiven) - model->B3SOIPDpketas = 0.0; - if (!model->B3SOIPDpa1Given) - model->B3SOIPDpa1 = 0.0; - if (!model->B3SOIPDpa2Given) - model->B3SOIPDpa2 = 0.0; - if (!model->B3SOIPDprdswGiven) - model->B3SOIPDprdsw = 0.0; - if (!model->B3SOIPDpprwbGiven) - model->B3SOIPDpprwb = 0.0; - if (!model->B3SOIPDpprwgGiven) - model->B3SOIPDpprwg = 0.0; - if (!model->B3SOIPDpwrGiven) - model->B3SOIPDpwr = 0.0; - if (!model->B3SOIPDpnfactorGiven) - model->B3SOIPDpnfactor = 0.0; - if (!model->B3SOIPDpdwgGiven) - model->B3SOIPDpdwg = 0.0; - if (!model->B3SOIPDpdwbGiven) - model->B3SOIPDpdwb = 0.0; - if (!model->B3SOIPDpvoffGiven) - model->B3SOIPDpvoff = 0.0; - if (!model->B3SOIPDpeta0Given) - model->B3SOIPDpeta0 = 0.0; - if (!model->B3SOIPDpetabGiven) - model->B3SOIPDpetab = 0.0; - if (!model->B3SOIPDpdsubGiven) - model->B3SOIPDpdsub = 0.0; - if (!model->B3SOIPDpcitGiven) - model->B3SOIPDpcit = 0.0; - if (!model->B3SOIPDpcdscGiven) - model->B3SOIPDpcdsc = 0.0; - if (!model->B3SOIPDpcdscbGiven) - model->B3SOIPDpcdscb = 0.0; - if (!model->B3SOIPDpcdscdGiven) - model->B3SOIPDpcdscd = 0.0; - if (!model->B3SOIPDppclmGiven) - model->B3SOIPDppclm = 0.0; - if (!model->B3SOIPDppdibl1Given) - model->B3SOIPDppdibl1 = 0.0; - if (!model->B3SOIPDppdibl2Given) - model->B3SOIPDppdibl2 = 0.0; - if (!model->B3SOIPDppdiblbGiven) - model->B3SOIPDppdiblb = 0.0; - if (!model->B3SOIPDpdroutGiven) - model->B3SOIPDpdrout = 0.0; - if (!model->B3SOIPDppvagGiven) - model->B3SOIPDppvag = 0.0; - if (!model->B3SOIPDpdeltaGiven) - model->B3SOIPDpdelta = 0.0; - if (!model->B3SOIPDpalpha0Given) - model->B3SOIPDpalpha0 = 0.0; - if (!model->B3SOIPDpfbjtiiGiven) - model->B3SOIPDpfbjtii = 0.0; - if (!model->B3SOIPDpbeta0Given) - model->B3SOIPDpbeta0 = 0.0; - if (!model->B3SOIPDpbeta1Given) - model->B3SOIPDpbeta1 = 0.0; - if (!model->B3SOIPDpbeta2Given) - model->B3SOIPDpbeta2 = 0.0; - if (!model->B3SOIPDpvdsatii0Given) - model->B3SOIPDpvdsatii0 = 0.0; - if (!model->B3SOIPDpliiGiven) - model->B3SOIPDplii = 0.0; - if (!model->B3SOIPDpesatiiGiven) - model->B3SOIPDpesatii = 0.0; - if (!model->B3SOIPDpsii0Given) - model->B3SOIPDpsii0 = 0.0; - if (!model->B3SOIPDpsii1Given) - model->B3SOIPDpsii1 = 0.0; - if (!model->B3SOIPDpsii2Given) - model->B3SOIPDpsii2 = 0.0; - if (!model->B3SOIPDpsiidGiven) - model->B3SOIPDpsiid = 0.0; - if (!model->B3SOIPDpagidlGiven) - model->B3SOIPDpagidl = 0.0; - if (!model->B3SOIPDpbgidlGiven) - model->B3SOIPDpbgidl = 0.0; - if (!model->B3SOIPDpngidlGiven) - model->B3SOIPDpngidl = 0.0; - if (!model->B3SOIPDpntunGiven) - model->B3SOIPDpntun = 0.0; - if (!model->B3SOIPDpndiodeGiven) - model->B3SOIPDpndiode = 0.0; - if (!model->B3SOIPDpnrecf0Given) - model->B3SOIPDpnrecf0 = 0.0; - if (!model->B3SOIPDpnrecr0Given) - model->B3SOIPDpnrecr0 = 0.0; - if (!model->B3SOIPDpisbjtGiven) - model->B3SOIPDpisbjt = 0.0; - if (!model->B3SOIPDpisdifGiven) - model->B3SOIPDpisdif = 0.0; - if (!model->B3SOIPDpisrecGiven) - model->B3SOIPDpisrec = 0.0; - if (!model->B3SOIPDpistunGiven) - model->B3SOIPDpistun = 0.0; - if (!model->B3SOIPDpvrec0Given) - model->B3SOIPDpvrec0 = 0.0; - if (!model->B3SOIPDpvtun0Given) - model->B3SOIPDpvtun0 = 0.0; - if (!model->B3SOIPDpnbjtGiven) - model->B3SOIPDpnbjt = 0.0; - if (!model->B3SOIPDplbjt0Given) - model->B3SOIPDplbjt0 = 0.0; - if (!model->B3SOIPDpvabjtGiven) - model->B3SOIPDpvabjt = 0.0; - if (!model->B3SOIPDpaelyGiven) - model->B3SOIPDpaely = 0.0; - if (!model->B3SOIPDpahliGiven) - model->B3SOIPDpahli = 0.0; - /* CV Model */ - if (!model->B3SOIPDpvsdfbGiven) - model->B3SOIPDpvsdfb = 0.0; - if (!model->B3SOIPDpvsdthGiven) - model->B3SOIPDpvsdth = 0.0; - if (!model->B3SOIPDpdelvtGiven) - model->B3SOIPDpdelvt = 0.0; - if (!model->B3SOIPDpacdeGiven) - model->B3SOIPDpacde = 0.0; - if (!model->B3SOIPDpmoinGiven) - model->B3SOIPDpmoin = 0.0; + /* Length dependence */ + if (!model->B3SOIPDlnpeakGiven) + model->B3SOIPDlnpeak = 0.0; + if (!model->B3SOIPDlnsubGiven) + model->B3SOIPDlnsub = 0.0; + if (!model->B3SOIPDlngateGiven) + model->B3SOIPDlngate = 0.0; + if (!model->B3SOIPDlvth0Given) + model->B3SOIPDlvth0 = 0.0; + if (!model->B3SOIPDlk1Given) + model->B3SOIPDlk1 = 0.0; + if (!model->B3SOIPDlk1w1Given) + model->B3SOIPDlk1w1 = 0.0; + if (!model->B3SOIPDlk1w2Given) + model->B3SOIPDlk1w2 = 0.0; + if (!model->B3SOIPDlk2Given) + model->B3SOIPDlk2 = 0.0; + if (!model->B3SOIPDlk3Given) + model->B3SOIPDlk3 = 0.0; + if (!model->B3SOIPDlk3bGiven) + model->B3SOIPDlk3b = 0.0; + if (!model->B3SOIPDlkb1Given) + model->B3SOIPDlkb1 = 0.0; + if (!model->B3SOIPDlw0Given) + model->B3SOIPDlw0 = 0.0; + if (!model->B3SOIPDlnlxGiven) + model->B3SOIPDlnlx = 0.0; + if (!model->B3SOIPDldvt0Given) + model->B3SOIPDldvt0 = 0.0; + if (!model->B3SOIPDldvt1Given) + model->B3SOIPDldvt1 = 0.0; + if (!model->B3SOIPDldvt2Given) + model->B3SOIPDldvt2 = 0.0; + if (!model->B3SOIPDldvt0wGiven) + model->B3SOIPDldvt0w = 0.0; + if (!model->B3SOIPDldvt1wGiven) + model->B3SOIPDldvt1w = 0.0; + if (!model->B3SOIPDldvt2wGiven) + model->B3SOIPDldvt2w = 0.0; + if (!model->B3SOIPDlu0Given) + model->B3SOIPDlu0 = 0.0; + if (!model->B3SOIPDluaGiven) + model->B3SOIPDlua = 0.0; + if (!model->B3SOIPDlubGiven) + model->B3SOIPDlub = 0.0; + if (!model->B3SOIPDlucGiven) + model->B3SOIPDluc = 0.0; + if (!model->B3SOIPDlvsatGiven) + model->B3SOIPDlvsat = 0.0; + if (!model->B3SOIPDla0Given) + model->B3SOIPDla0 = 0.0; + if (!model->B3SOIPDlagsGiven) + model->B3SOIPDlags = 0.0; + if (!model->B3SOIPDlb0Given) + model->B3SOIPDlb0 = 0.0; + if (!model->B3SOIPDlb1Given) + model->B3SOIPDlb1 = 0.0; + if (!model->B3SOIPDlketaGiven) + model->B3SOIPDlketa = 0.0; + if (!model->B3SOIPDlketasGiven) + model->B3SOIPDlketas = 0.0; + if (!model->B3SOIPDla1Given) + model->B3SOIPDla1 = 0.0; + if (!model->B3SOIPDla2Given) + model->B3SOIPDla2 = 0.0; + if (!model->B3SOIPDlrdswGiven) + model->B3SOIPDlrdsw = 0.0; + if (!model->B3SOIPDlprwbGiven) + model->B3SOIPDlprwb = 0.0; + if (!model->B3SOIPDlprwgGiven) + model->B3SOIPDlprwg = 0.0; + if (!model->B3SOIPDlwrGiven) + model->B3SOIPDlwr = 0.0; + if (!model->B3SOIPDlnfactorGiven) + model->B3SOIPDlnfactor = 0.0; + if (!model->B3SOIPDldwgGiven) + model->B3SOIPDldwg = 0.0; + if (!model->B3SOIPDldwbGiven) + model->B3SOIPDldwb = 0.0; + if (!model->B3SOIPDlvoffGiven) + model->B3SOIPDlvoff = 0.0; + if (!model->B3SOIPDleta0Given) + model->B3SOIPDleta0 = 0.0; + if (!model->B3SOIPDletabGiven) + model->B3SOIPDletab = 0.0; + if (!model->B3SOIPDldsubGiven) + model->B3SOIPDldsub = 0.0; + if (!model->B3SOIPDlcitGiven) + model->B3SOIPDlcit = 0.0; + if (!model->B3SOIPDlcdscGiven) + model->B3SOIPDlcdsc = 0.0; + if (!model->B3SOIPDlcdscbGiven) + model->B3SOIPDlcdscb = 0.0; + if (!model->B3SOIPDlcdscdGiven) + model->B3SOIPDlcdscd = 0.0; + if (!model->B3SOIPDlpclmGiven) + model->B3SOIPDlpclm = 0.0; + if (!model->B3SOIPDlpdibl1Given) + model->B3SOIPDlpdibl1 = 0.0; + if (!model->B3SOIPDlpdibl2Given) + model->B3SOIPDlpdibl2 = 0.0; + if (!model->B3SOIPDlpdiblbGiven) + model->B3SOIPDlpdiblb = 0.0; + if (!model->B3SOIPDldroutGiven) + model->B3SOIPDldrout = 0.0; + if (!model->B3SOIPDlpvagGiven) + model->B3SOIPDlpvag = 0.0; + if (!model->B3SOIPDldeltaGiven) + model->B3SOIPDldelta = 0.0; + if (!model->B3SOIPDlalpha0Given) + model->B3SOIPDlalpha0 = 0.0; + if (!model->B3SOIPDlfbjtiiGiven) + model->B3SOIPDlfbjtii = 0.0; + if (!model->B3SOIPDlbeta0Given) + model->B3SOIPDlbeta0 = 0.0; + if (!model->B3SOIPDlbeta1Given) + model->B3SOIPDlbeta1 = 0.0; + if (!model->B3SOIPDlbeta2Given) + model->B3SOIPDlbeta2 = 0.0; + if (!model->B3SOIPDlvdsatii0Given) + model->B3SOIPDlvdsatii0 = 0.0; + if (!model->B3SOIPDlliiGiven) + model->B3SOIPDllii = 0.0; + if (!model->B3SOIPDlesatiiGiven) + model->B3SOIPDlesatii = 0.0; + if (!model->B3SOIPDlsii0Given) + model->B3SOIPDlsii0 = 0.0; + if (!model->B3SOIPDlsii1Given) + model->B3SOIPDlsii1 = 0.0; + if (!model->B3SOIPDlsii2Given) + model->B3SOIPDlsii2 = 0.0; + if (!model->B3SOIPDlsiidGiven) + model->B3SOIPDlsiid = 0.0; + if (!model->B3SOIPDlagidlGiven) + model->B3SOIPDlagidl = 0.0; + if (!model->B3SOIPDlbgidlGiven) + model->B3SOIPDlbgidl = 0.0; + if (!model->B3SOIPDlngidlGiven) + model->B3SOIPDlngidl = 0.0; + if (!model->B3SOIPDlntunGiven) + model->B3SOIPDlntun = 0.0; + if (!model->B3SOIPDlndiodeGiven) + model->B3SOIPDlndiode = 0.0; + if (!model->B3SOIPDlnrecf0Given) + model->B3SOIPDlnrecf0 = 0.0; + if (!model->B3SOIPDlnrecr0Given) + model->B3SOIPDlnrecr0 = 0.0; + if (!model->B3SOIPDlisbjtGiven) + model->B3SOIPDlisbjt = 0.0; + if (!model->B3SOIPDlisdifGiven) + model->B3SOIPDlisdif = 0.0; + if (!model->B3SOIPDlisrecGiven) + model->B3SOIPDlisrec = 0.0; + if (!model->B3SOIPDlistunGiven) + model->B3SOIPDlistun = 0.0; + if (!model->B3SOIPDlvrec0Given) + model->B3SOIPDlvrec0 = 0.0; + if (!model->B3SOIPDlvtun0Given) + model->B3SOIPDlvtun0 = 0.0; + if (!model->B3SOIPDlnbjtGiven) + model->B3SOIPDlnbjt = 0.0; + if (!model->B3SOIPDllbjt0Given) + model->B3SOIPDllbjt0 = 0.0; + if (!model->B3SOIPDlvabjtGiven) + model->B3SOIPDlvabjt = 0.0; + if (!model->B3SOIPDlaelyGiven) + model->B3SOIPDlaely = 0.0; + if (!model->B3SOIPDlahliGiven) + model->B3SOIPDlahli = 0.0; + /* CV Model */ + if (!model->B3SOIPDlvsdfbGiven) + model->B3SOIPDlvsdfb = 0.0; + if (!model->B3SOIPDlvsdthGiven) + model->B3SOIPDlvsdth = 0.0; + if (!model->B3SOIPDldelvtGiven) + model->B3SOIPDldelvt = 0.0; + if (!model->B3SOIPDlacdeGiven) + model->B3SOIPDlacde = 0.0; + if (!model->B3SOIPDlmoinGiven) + model->B3SOIPDlmoin = 0.0; + + /* Width dependence */ + if (!model->B3SOIPDwnpeakGiven) + model->B3SOIPDwnpeak = 0.0; + if (!model->B3SOIPDwnsubGiven) + model->B3SOIPDwnsub = 0.0; + if (!model->B3SOIPDwngateGiven) + model->B3SOIPDwngate = 0.0; + if (!model->B3SOIPDwvth0Given) + model->B3SOIPDwvth0 = 0.0; + if (!model->B3SOIPDwk1Given) + model->B3SOIPDwk1 = 0.0; + if (!model->B3SOIPDwk1w1Given) + model->B3SOIPDwk1w1 = 0.0; + if (!model->B3SOIPDwk1w2Given) + model->B3SOIPDwk1w2 = 0.0; + if (!model->B3SOIPDwk2Given) + model->B3SOIPDwk2 = 0.0; + if (!model->B3SOIPDwk3Given) + model->B3SOIPDwk3 = 0.0; + if (!model->B3SOIPDwk3bGiven) + model->B3SOIPDwk3b = 0.0; + if (!model->B3SOIPDwkb1Given) + model->B3SOIPDwkb1 = 0.0; + if (!model->B3SOIPDww0Given) + model->B3SOIPDww0 = 0.0; + if (!model->B3SOIPDwnlxGiven) + model->B3SOIPDwnlx = 0.0; + if (!model->B3SOIPDwdvt0Given) + model->B3SOIPDwdvt0 = 0.0; + if (!model->B3SOIPDwdvt1Given) + model->B3SOIPDwdvt1 = 0.0; + if (!model->B3SOIPDwdvt2Given) + model->B3SOIPDwdvt2 = 0.0; + if (!model->B3SOIPDwdvt0wGiven) + model->B3SOIPDwdvt0w = 0.0; + if (!model->B3SOIPDwdvt1wGiven) + model->B3SOIPDwdvt1w = 0.0; + if (!model->B3SOIPDwdvt2wGiven) + model->B3SOIPDwdvt2w = 0.0; + if (!model->B3SOIPDwu0Given) + model->B3SOIPDwu0 = 0.0; + if (!model->B3SOIPDwuaGiven) + model->B3SOIPDwua = 0.0; + if (!model->B3SOIPDwubGiven) + model->B3SOIPDwub = 0.0; + if (!model->B3SOIPDwucGiven) + model->B3SOIPDwuc = 0.0; + if (!model->B3SOIPDwvsatGiven) + model->B3SOIPDwvsat = 0.0; + if (!model->B3SOIPDwa0Given) + model->B3SOIPDwa0 = 0.0; + if (!model->B3SOIPDwagsGiven) + model->B3SOIPDwags = 0.0; + if (!model->B3SOIPDwb0Given) + model->B3SOIPDwb0 = 0.0; + if (!model->B3SOIPDwb1Given) + model->B3SOIPDwb1 = 0.0; + if (!model->B3SOIPDwketaGiven) + model->B3SOIPDwketa = 0.0; + if (!model->B3SOIPDwketasGiven) + model->B3SOIPDwketas = 0.0; + if (!model->B3SOIPDwa1Given) + model->B3SOIPDwa1 = 0.0; + if (!model->B3SOIPDwa2Given) + model->B3SOIPDwa2 = 0.0; + if (!model->B3SOIPDwrdswGiven) + model->B3SOIPDwrdsw = 0.0; + if (!model->B3SOIPDwprwbGiven) + model->B3SOIPDwprwb = 0.0; + if (!model->B3SOIPDwprwgGiven) + model->B3SOIPDwprwg = 0.0; + if (!model->B3SOIPDwwrGiven) + model->B3SOIPDwwr = 0.0; + if (!model->B3SOIPDwnfactorGiven) + model->B3SOIPDwnfactor = 0.0; + if (!model->B3SOIPDwdwgGiven) + model->B3SOIPDwdwg = 0.0; + if (!model->B3SOIPDwdwbGiven) + model->B3SOIPDwdwb = 0.0; + if (!model->B3SOIPDwvoffGiven) + model->B3SOIPDwvoff = 0.0; + if (!model->B3SOIPDweta0Given) + model->B3SOIPDweta0 = 0.0; + if (!model->B3SOIPDwetabGiven) + model->B3SOIPDwetab = 0.0; + if (!model->B3SOIPDwdsubGiven) + model->B3SOIPDwdsub = 0.0; + if (!model->B3SOIPDwcitGiven) + model->B3SOIPDwcit = 0.0; + if (!model->B3SOIPDwcdscGiven) + model->B3SOIPDwcdsc = 0.0; + if (!model->B3SOIPDwcdscbGiven) + model->B3SOIPDwcdscb = 0.0; + if (!model->B3SOIPDwcdscdGiven) + model->B3SOIPDwcdscd = 0.0; + if (!model->B3SOIPDwpclmGiven) + model->B3SOIPDwpclm = 0.0; + if (!model->B3SOIPDwpdibl1Given) + model->B3SOIPDwpdibl1 = 0.0; + if (!model->B3SOIPDwpdibl2Given) + model->B3SOIPDwpdibl2 = 0.0; + if (!model->B3SOIPDwpdiblbGiven) + model->B3SOIPDwpdiblb = 0.0; + if (!model->B3SOIPDwdroutGiven) + model->B3SOIPDwdrout = 0.0; + if (!model->B3SOIPDwpvagGiven) + model->B3SOIPDwpvag = 0.0; + if (!model->B3SOIPDwdeltaGiven) + model->B3SOIPDwdelta = 0.0; + if (!model->B3SOIPDwalpha0Given) + model->B3SOIPDwalpha0 = 0.0; + if (!model->B3SOIPDwfbjtiiGiven) + model->B3SOIPDwfbjtii = 0.0; + if (!model->B3SOIPDwbeta0Given) + model->B3SOIPDwbeta0 = 0.0; + if (!model->B3SOIPDwbeta1Given) + model->B3SOIPDwbeta1 = 0.0; + if (!model->B3SOIPDwbeta2Given) + model->B3SOIPDwbeta2 = 0.0; + if (!model->B3SOIPDwvdsatii0Given) + model->B3SOIPDwvdsatii0 = 0.0; + if (!model->B3SOIPDwliiGiven) + model->B3SOIPDwlii = 0.0; + if (!model->B3SOIPDwesatiiGiven) + model->B3SOIPDwesatii = 0.0; + if (!model->B3SOIPDwsii0Given) + model->B3SOIPDwsii0 = 0.0; + if (!model->B3SOIPDwsii1Given) + model->B3SOIPDwsii1 = 0.0; + if (!model->B3SOIPDwsii2Given) + model->B3SOIPDwsii2 = 0.0; + if (!model->B3SOIPDwsiidGiven) + model->B3SOIPDwsiid = 0.0; + if (!model->B3SOIPDwagidlGiven) + model->B3SOIPDwagidl = 0.0; + if (!model->B3SOIPDwbgidlGiven) + model->B3SOIPDwbgidl = 0.0; + if (!model->B3SOIPDwngidlGiven) + model->B3SOIPDwngidl = 0.0; + if (!model->B3SOIPDwntunGiven) + model->B3SOIPDwntun = 0.0; + if (!model->B3SOIPDwndiodeGiven) + model->B3SOIPDwndiode = 0.0; + if (!model->B3SOIPDwnrecf0Given) + model->B3SOIPDwnrecf0 = 0.0; + if (!model->B3SOIPDwnrecr0Given) + model->B3SOIPDwnrecr0 = 0.0; + if (!model->B3SOIPDwisbjtGiven) + model->B3SOIPDwisbjt = 0.0; + if (!model->B3SOIPDwisdifGiven) + model->B3SOIPDwisdif = 0.0; + if (!model->B3SOIPDwisrecGiven) + model->B3SOIPDwisrec = 0.0; + if (!model->B3SOIPDwistunGiven) + model->B3SOIPDwistun = 0.0; + if (!model->B3SOIPDwvrec0Given) + model->B3SOIPDwvrec0 = 0.0; + if (!model->B3SOIPDwvtun0Given) + model->B3SOIPDwvtun0 = 0.0; + if (!model->B3SOIPDwnbjtGiven) + model->B3SOIPDwnbjt = 0.0; + if (!model->B3SOIPDwlbjt0Given) + model->B3SOIPDwlbjt0 = 0.0; + if (!model->B3SOIPDwvabjtGiven) + model->B3SOIPDwvabjt = 0.0; + if (!model->B3SOIPDwaelyGiven) + model->B3SOIPDwaely = 0.0; + if (!model->B3SOIPDwahliGiven) + model->B3SOIPDwahli = 0.0; + /* CV Model */ + if (!model->B3SOIPDwvsdfbGiven) + model->B3SOIPDwvsdfb = 0.0; + if (!model->B3SOIPDwvsdthGiven) + model->B3SOIPDwvsdth = 0.0; + if (!model->B3SOIPDwdelvtGiven) + model->B3SOIPDwdelvt = 0.0; + if (!model->B3SOIPDwacdeGiven) + model->B3SOIPDwacde = 0.0; + if (!model->B3SOIPDwmoinGiven) + model->B3SOIPDwmoin = 0.0; + + /* Cross-term dependence */ + if (!model->B3SOIPDpnpeakGiven) + model->B3SOIPDpnpeak = 0.0; + if (!model->B3SOIPDpnsubGiven) + model->B3SOIPDpnsub = 0.0; + if (!model->B3SOIPDpngateGiven) + model->B3SOIPDpngate = 0.0; + if (!model->B3SOIPDpvth0Given) + model->B3SOIPDpvth0 = 0.0; + if (!model->B3SOIPDpk1Given) + model->B3SOIPDpk1 = 0.0; + if (!model->B3SOIPDpk1w1Given) + model->B3SOIPDpk1w1 = 0.0; + if (!model->B3SOIPDpk1w2Given) + model->B3SOIPDpk1w2 = 0.0; + if (!model->B3SOIPDpk2Given) + model->B3SOIPDpk2 = 0.0; + if (!model->B3SOIPDpk3Given) + model->B3SOIPDpk3 = 0.0; + if (!model->B3SOIPDpk3bGiven) + model->B3SOIPDpk3b = 0.0; + if (!model->B3SOIPDpkb1Given) + model->B3SOIPDpkb1 = 0.0; + if (!model->B3SOIPDpw0Given) + model->B3SOIPDpw0 = 0.0; + if (!model->B3SOIPDpnlxGiven) + model->B3SOIPDpnlx = 0.0; + if (!model->B3SOIPDpdvt0Given) + model->B3SOIPDpdvt0 = 0.0; + if (!model->B3SOIPDpdvt1Given) + model->B3SOIPDpdvt1 = 0.0; + if (!model->B3SOIPDpdvt2Given) + model->B3SOIPDpdvt2 = 0.0; + if (!model->B3SOIPDpdvt0wGiven) + model->B3SOIPDpdvt0w = 0.0; + if (!model->B3SOIPDpdvt1wGiven) + model->B3SOIPDpdvt1w = 0.0; + if (!model->B3SOIPDpdvt2wGiven) + model->B3SOIPDpdvt2w = 0.0; + if (!model->B3SOIPDpu0Given) + model->B3SOIPDpu0 = 0.0; + if (!model->B3SOIPDpuaGiven) + model->B3SOIPDpua = 0.0; + if (!model->B3SOIPDpubGiven) + model->B3SOIPDpub = 0.0; + if (!model->B3SOIPDpucGiven) + model->B3SOIPDpuc = 0.0; + if (!model->B3SOIPDpvsatGiven) + model->B3SOIPDpvsat = 0.0; + if (!model->B3SOIPDpa0Given) + model->B3SOIPDpa0 = 0.0; + if (!model->B3SOIPDpagsGiven) + model->B3SOIPDpags = 0.0; + if (!model->B3SOIPDpb0Given) + model->B3SOIPDpb0 = 0.0; + if (!model->B3SOIPDpb1Given) + model->B3SOIPDpb1 = 0.0; + if (!model->B3SOIPDpketaGiven) + model->B3SOIPDpketa = 0.0; + if (!model->B3SOIPDpketasGiven) + model->B3SOIPDpketas = 0.0; + if (!model->B3SOIPDpa1Given) + model->B3SOIPDpa1 = 0.0; + if (!model->B3SOIPDpa2Given) + model->B3SOIPDpa2 = 0.0; + if (!model->B3SOIPDprdswGiven) + model->B3SOIPDprdsw = 0.0; + if (!model->B3SOIPDpprwbGiven) + model->B3SOIPDpprwb = 0.0; + if (!model->B3SOIPDpprwgGiven) + model->B3SOIPDpprwg = 0.0; + if (!model->B3SOIPDpwrGiven) + model->B3SOIPDpwr = 0.0; + if (!model->B3SOIPDpnfactorGiven) + model->B3SOIPDpnfactor = 0.0; + if (!model->B3SOIPDpdwgGiven) + model->B3SOIPDpdwg = 0.0; + if (!model->B3SOIPDpdwbGiven) + model->B3SOIPDpdwb = 0.0; + if (!model->B3SOIPDpvoffGiven) + model->B3SOIPDpvoff = 0.0; + if (!model->B3SOIPDpeta0Given) + model->B3SOIPDpeta0 = 0.0; + if (!model->B3SOIPDpetabGiven) + model->B3SOIPDpetab = 0.0; + if (!model->B3SOIPDpdsubGiven) + model->B3SOIPDpdsub = 0.0; + if (!model->B3SOIPDpcitGiven) + model->B3SOIPDpcit = 0.0; + if (!model->B3SOIPDpcdscGiven) + model->B3SOIPDpcdsc = 0.0; + if (!model->B3SOIPDpcdscbGiven) + model->B3SOIPDpcdscb = 0.0; + if (!model->B3SOIPDpcdscdGiven) + model->B3SOIPDpcdscd = 0.0; + if (!model->B3SOIPDppclmGiven) + model->B3SOIPDppclm = 0.0; + if (!model->B3SOIPDppdibl1Given) + model->B3SOIPDppdibl1 = 0.0; + if (!model->B3SOIPDppdibl2Given) + model->B3SOIPDppdibl2 = 0.0; + if (!model->B3SOIPDppdiblbGiven) + model->B3SOIPDppdiblb = 0.0; + if (!model->B3SOIPDpdroutGiven) + model->B3SOIPDpdrout = 0.0; + if (!model->B3SOIPDppvagGiven) + model->B3SOIPDppvag = 0.0; + if (!model->B3SOIPDpdeltaGiven) + model->B3SOIPDpdelta = 0.0; + if (!model->B3SOIPDpalpha0Given) + model->B3SOIPDpalpha0 = 0.0; + if (!model->B3SOIPDpfbjtiiGiven) + model->B3SOIPDpfbjtii = 0.0; + if (!model->B3SOIPDpbeta0Given) + model->B3SOIPDpbeta0 = 0.0; + if (!model->B3SOIPDpbeta1Given) + model->B3SOIPDpbeta1 = 0.0; + if (!model->B3SOIPDpbeta2Given) + model->B3SOIPDpbeta2 = 0.0; + if (!model->B3SOIPDpvdsatii0Given) + model->B3SOIPDpvdsatii0 = 0.0; + if (!model->B3SOIPDpliiGiven) + model->B3SOIPDplii = 0.0; + if (!model->B3SOIPDpesatiiGiven) + model->B3SOIPDpesatii = 0.0; + if (!model->B3SOIPDpsii0Given) + model->B3SOIPDpsii0 = 0.0; + if (!model->B3SOIPDpsii1Given) + model->B3SOIPDpsii1 = 0.0; + if (!model->B3SOIPDpsii2Given) + model->B3SOIPDpsii2 = 0.0; + if (!model->B3SOIPDpsiidGiven) + model->B3SOIPDpsiid = 0.0; + if (!model->B3SOIPDpagidlGiven) + model->B3SOIPDpagidl = 0.0; + if (!model->B3SOIPDpbgidlGiven) + model->B3SOIPDpbgidl = 0.0; + if (!model->B3SOIPDpngidlGiven) + model->B3SOIPDpngidl = 0.0; + if (!model->B3SOIPDpntunGiven) + model->B3SOIPDpntun = 0.0; + if (!model->B3SOIPDpndiodeGiven) + model->B3SOIPDpndiode = 0.0; + if (!model->B3SOIPDpnrecf0Given) + model->B3SOIPDpnrecf0 = 0.0; + if (!model->B3SOIPDpnrecr0Given) + model->B3SOIPDpnrecr0 = 0.0; + if (!model->B3SOIPDpisbjtGiven) + model->B3SOIPDpisbjt = 0.0; + if (!model->B3SOIPDpisdifGiven) + model->B3SOIPDpisdif = 0.0; + if (!model->B3SOIPDpisrecGiven) + model->B3SOIPDpisrec = 0.0; + if (!model->B3SOIPDpistunGiven) + model->B3SOIPDpistun = 0.0; + if (!model->B3SOIPDpvrec0Given) + model->B3SOIPDpvrec0 = 0.0; + if (!model->B3SOIPDpvtun0Given) + model->B3SOIPDpvtun0 = 0.0; + if (!model->B3SOIPDpnbjtGiven) + model->B3SOIPDpnbjt = 0.0; + if (!model->B3SOIPDplbjt0Given) + model->B3SOIPDplbjt0 = 0.0; + if (!model->B3SOIPDpvabjtGiven) + model->B3SOIPDpvabjt = 0.0; + if (!model->B3SOIPDpaelyGiven) + model->B3SOIPDpaely = 0.0; + if (!model->B3SOIPDpahliGiven) + model->B3SOIPDpahli = 0.0; + /* CV Model */ + if (!model->B3SOIPDpvsdfbGiven) + model->B3SOIPDpvsdfb = 0.0; + if (!model->B3SOIPDpvsdthGiven) + model->B3SOIPDpvsdth = 0.0; + if (!model->B3SOIPDpdelvtGiven) + model->B3SOIPDpdelvt = 0.0; + if (!model->B3SOIPDpacdeGiven) + model->B3SOIPDpacde = 0.0; + if (!model->B3SOIPDpmoinGiven) + model->B3SOIPDpmoin = 0.0; /* Added for binning - END */ - if (!model->B3SOIPDcfGiven) - model->B3SOIPDcf = 2.0 * EPSOX / PI - * log (1.0 + 0.4e-6 / model->B3SOIPDtox); - if (!model->B3SOIPDcgdoGiven) - { - if (model->B3SOIPDdlcGiven && (model->B3SOIPDdlc > 0.0)) - { - model->B3SOIPDcgdo = model->B3SOIPDdlc * model->B3SOIPDcox - - model->B3SOIPDcgdl; + if (!model->B3SOIPDcfGiven) + model->B3SOIPDcf = 2.0 * EPSOX / PI + * log(1.0 + 0.4e-6 / model->B3SOIPDtox); + if (!model->B3SOIPDcgdoGiven) + { if (model->B3SOIPDdlcGiven && (model->B3SOIPDdlc > 0.0)) + { model->B3SOIPDcgdo = model->B3SOIPDdlc * model->B3SOIPDcox + - model->B3SOIPDcgdl ; } - else - model->B3SOIPDcgdo = 0.6 * model->B3SOIPDxj * model->B3SOIPDcox; + else + model->B3SOIPDcgdo = 0.6 * model->B3SOIPDxj * model->B3SOIPDcox; } - if (!model->B3SOIPDcgsoGiven) - { - if (model->B3SOIPDdlcGiven && (model->B3SOIPDdlc > 0.0)) - { - model->B3SOIPDcgso = model->B3SOIPDdlc * model->B3SOIPDcox - - model->B3SOIPDcgsl; + if (!model->B3SOIPDcgsoGiven) + { if (model->B3SOIPDdlcGiven && (model->B3SOIPDdlc > 0.0)) + { model->B3SOIPDcgso = model->B3SOIPDdlc * model->B3SOIPDcox + - model->B3SOIPDcgsl ; } - else - model->B3SOIPDcgso = 0.6 * model->B3SOIPDxj * model->B3SOIPDcox; + else + model->B3SOIPDcgso = 0.6 * model->B3SOIPDxj * model->B3SOIPDcox; } - if (!model->B3SOIPDcgeoGiven) - { - model->B3SOIPDcgeo = 0.0; + if (!model->B3SOIPDcgeoGiven) + { model->B3SOIPDcgeo = 0.0; } - if (!model->B3SOIPDxpartGiven) - model->B3SOIPDxpart = 0.0; - if (!model->B3SOIPDsheetResistanceGiven) - model->B3SOIPDsheetResistance = 0.0; - if (!model->B3SOIPDcsdeswGiven) - model->B3SOIPDcsdesw = 0.0; - if (!model->B3SOIPDunitLengthGateSidewallJctCapGiven) - model->B3SOIPDunitLengthGateSidewallJctCap = 1e-10; - if (!model->B3SOIPDGatesidewallJctPotentialGiven) - model->B3SOIPDGatesidewallJctPotential = 0.7; - if (!model->B3SOIPDbodyJctGateSideGradingCoeffGiven) - model->B3SOIPDbodyJctGateSideGradingCoeff = 0.5; - if (!model->B3SOIPDoxideTrapDensityAGiven) - { - if (model->B3SOIPDtype == NMOS) - model->B3SOIPDoxideTrapDensityA = 1e20; - else - model->B3SOIPDoxideTrapDensityA = 9.9e18; + if (!model->B3SOIPDxpartGiven) + model->B3SOIPDxpart = 0.0; + if (!model->B3SOIPDsheetResistanceGiven) + model->B3SOIPDsheetResistance = 0.0; + if (!model->B3SOIPDcsdeswGiven) + model->B3SOIPDcsdesw = 0.0; + if (!model->B3SOIPDunitLengthGateSidewallJctCapGiven) + model->B3SOIPDunitLengthGateSidewallJctCap = 1e-10; + if (!model->B3SOIPDGatesidewallJctPotentialGiven) + model->B3SOIPDGatesidewallJctPotential = 0.7; + if (!model->B3SOIPDbodyJctGateSideGradingCoeffGiven) + model->B3SOIPDbodyJctGateSideGradingCoeff = 0.5; + if (!model->B3SOIPDoxideTrapDensityAGiven) + { if (model->B3SOIPDtype == NMOS) + model->B3SOIPDoxideTrapDensityA = 1e20; + else + model->B3SOIPDoxideTrapDensityA=9.9e18; } - if (!model->B3SOIPDoxideTrapDensityBGiven) - { - if (model->B3SOIPDtype == NMOS) - model->B3SOIPDoxideTrapDensityB = 5e4; - else - model->B3SOIPDoxideTrapDensityB = 2.4e3; + if (!model->B3SOIPDoxideTrapDensityBGiven) + { if (model->B3SOIPDtype == NMOS) + model->B3SOIPDoxideTrapDensityB = 5e4; + else + model->B3SOIPDoxideTrapDensityB = 2.4e3; } - if (!model->B3SOIPDoxideTrapDensityCGiven) - { - if (model->B3SOIPDtype == NMOS) - model->B3SOIPDoxideTrapDensityC = -1.4e-12; - else - model->B3SOIPDoxideTrapDensityC = 1.4e-12; + if (!model->B3SOIPDoxideTrapDensityCGiven) + { if (model->B3SOIPDtype == NMOS) + model->B3SOIPDoxideTrapDensityC = -1.4e-12; + else + model->B3SOIPDoxideTrapDensityC = 1.4e-12; } - if (!model->B3SOIPDemGiven) - model->B3SOIPDem = 4.1e7; /* V/m */ - if (!model->B3SOIPDefGiven) - model->B3SOIPDef = 1.0; - if (!model->B3SOIPDafGiven) - model->B3SOIPDaf = 1.0; - if (!model->B3SOIPDkfGiven) - model->B3SOIPDkf = 0.0; - if (!model->B3SOIPDnoifGiven) - model->B3SOIPDnoif = 1.0; - - /* loop through all the instances of the model */ - for (here = model->B3SOIPDinstances; here != NULL; - here = here->B3SOIPDnextInstance) - { /* allocate a chunk of the state vector */ - here->B3SOIPDstates = *states; - *states += B3SOIPDnumStates; - /* perform the parameter defaulting */ - if (!here->B3SOIPDdrainAreaGiven) - here->B3SOIPDdrainArea = 0.0; - if (!here->B3SOIPDdrainPerimeterGiven) - here->B3SOIPDdrainPerimeter = 0.0; - if (!here->B3SOIPDdrainSquaresGiven) - here->B3SOIPDdrainSquares = 1.0; - if (!here->B3SOIPDicVBSGiven) - here->B3SOIPDicVBS = 0; - if (!here->B3SOIPDicVDSGiven) - here->B3SOIPDicVDS = 0; - if (!here->B3SOIPDicVGSGiven) - here->B3SOIPDicVGS = 0; - if (!here->B3SOIPDicVESGiven) - here->B3SOIPDicVES = 0; - if (!here->B3SOIPDicVPSGiven) - here->B3SOIPDicVPS = 0; - if (!here->B3SOIPDbjtoffGiven) - here->B3SOIPDbjtoff = 0; - if (!here->B3SOIPDdebugModGiven) - here->B3SOIPDdebugMod = 0; - if (!here->B3SOIPDrth0Given) - here->B3SOIPDrth0 = model->B3SOIPDrth0; - if (!here->B3SOIPDcth0Given) - here->B3SOIPDcth0 = model->B3SOIPDcth0; - if (!here->B3SOIPDbodySquaresGiven) - here->B3SOIPDbodySquares = 1.0; - if (!here->B3SOIPDlGiven) - here->B3SOIPDl = 5e-6; - if (!here->B3SOIPDsourceAreaGiven) - here->B3SOIPDsourceArea = 0; - if (!here->B3SOIPDsourcePerimeterGiven) - here->B3SOIPDsourcePerimeter = 0; - if (!here->B3SOIPDsourceSquaresGiven) - here->B3SOIPDsourceSquares = 1; - if (!here->B3SOIPDwGiven) - here->B3SOIPDw = 5e-6; + if (!model->B3SOIPDemGiven) + model->B3SOIPDem = 4.1e7; /* V/m */ + if (!model->B3SOIPDefGiven) + model->B3SOIPDef = 1.0; + if (!model->B3SOIPDafGiven) + model->B3SOIPDaf = 1.0; + if (!model->B3SOIPDkfGiven) + model->B3SOIPDkf = 0.0; + if (!model->B3SOIPDnoifGiven) + model->B3SOIPDnoif = 1.0; + + /* loop through all the instances of the model */ + for (here = model->B3SOIPDinstances; here != NULL ; + here=here->B3SOIPDnextInstance) + { + + if (here->B3SOIPDowner == ARCHme) + { + /* allocate a chunk of the state vector */ + here->B3SOIPDstates = *states; + *states += B3SOIPDnumStates; + } + + /* perform the parameter defaulting */ + if (!here->B3SOIPDdrainAreaGiven) + here->B3SOIPDdrainArea = 0.0; + if (!here->B3SOIPDdrainPerimeterGiven) + here->B3SOIPDdrainPerimeter = 0.0; + if (!here->B3SOIPDdrainSquaresGiven) + here->B3SOIPDdrainSquares = 1.0; + if (!here->B3SOIPDicVBSGiven) + here->B3SOIPDicVBS = 0; + if (!here->B3SOIPDicVDSGiven) + here->B3SOIPDicVDS = 0; + if (!here->B3SOIPDicVGSGiven) + here->B3SOIPDicVGS = 0; + if (!here->B3SOIPDicVESGiven) + here->B3SOIPDicVES = 0; + if (!here->B3SOIPDicVPSGiven) + here->B3SOIPDicVPS = 0; + if (!here->B3SOIPDbjtoffGiven) + here->B3SOIPDbjtoff = 0; + if (!here->B3SOIPDdebugModGiven) + here->B3SOIPDdebugMod = 0; + if (!here->B3SOIPDrth0Given) + here->B3SOIPDrth0 = model->B3SOIPDrth0; + if (!here->B3SOIPDcth0Given) + here->B3SOIPDcth0 = model->B3SOIPDcth0; + if (!here->B3SOIPDbodySquaresGiven) + here->B3SOIPDbodySquares = 1.0; + if (!here->B3SOIPDfrbodyGiven) + here->B3SOIPDfrbody = 1.0; + if (!here->B3SOIPDlGiven) + here->B3SOIPDl = 5e-6; + if (!here->B3SOIPDsourceAreaGiven) + here->B3SOIPDsourceArea = 0; + if (!here->B3SOIPDsourcePerimeterGiven) + here->B3SOIPDsourcePerimeter = 0; + if (!here->B3SOIPDsourceSquaresGiven) + here->B3SOIPDsourceSquares = 1; + if (!here->B3SOIPDwGiven) + here->B3SOIPDw = 5e-6; + + if (!here->B3SOIPDmGiven) + here->B3SOIPDm = 1; /* v2.0 release */ - if (!here->B3SOIPDnbcGiven) - here->B3SOIPDnbc = 0; - if (!here->B3SOIPDnsegGiven) - here->B3SOIPDnseg = 1; - if (!here->B3SOIPDpdbcpGiven) - here->B3SOIPDpdbcp = 0; - if (!here->B3SOIPDpsbcpGiven) - here->B3SOIPDpsbcp = 0; - if (!here->B3SOIPDagbcpGiven) - here->B3SOIPDagbcp = 0; - if (!here->B3SOIPDaebcpGiven) - here->B3SOIPDaebcp = 0; - - if (!here->B3SOIPDoffGiven) - here->B3SOIPDoff = 0; - - /* process drain series resistance */ - if ((model->B3SOIPDsheetResistance > 0.0) && - (here->B3SOIPDdrainSquares > 0.0) && - (here->B3SOIPDdNodePrime == 0)) - { - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "drain"); - if (error) - return (error); - here->B3SOIPDdNodePrime = tmp->number; - } - else - { - here->B3SOIPDdNodePrime = here->B3SOIPDdNode; - } - - /* process source series resistance */ - if ((model->B3SOIPDsheetResistance > 0.0) && - (here->B3SOIPDsourceSquares > 0.0) && - (here->B3SOIPDsNodePrime == 0)) - { - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "source"); - if (error) - return (error); - here->B3SOIPDsNodePrime = tmp->number; - } - else - { - here->B3SOIPDsNodePrime = here->B3SOIPDsNode; - } - - /* process effective silicon film thickness */ - model->B3SOIPDcbox = 3.453133e-11 / model->B3SOIPDtbox; - model->B3SOIPDcsi = 1.03594e-10 / model->B3SOIPDtsi; - Cboxt = - model->B3SOIPDcbox * model->B3SOIPDcsi / (model->B3SOIPDcbox + - model->B3SOIPDcsi); - model->B3SOIPDqsi = - Charge_q * model->B3SOIPDnpeak * 1e6 * model->B3SOIPDtsi; - - - here->B3SOIPDfloat = 0; - if (here->B3SOIPDpNode == -1) - { /* floating body case -- 4-node */ - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Body"); - if (error) - return (error); - here->B3SOIPDbNode = tmp->number; - here->B3SOIPDpNode = 0; - here->B3SOIPDfloat = 1; - here->B3SOIPDbodyMod = 0; - } - else /* the 5th Node has been assigned */ - { - if (!here->B3SOIPDtnodeoutGiven) - { /* if t-node not assigned */ - if (here->B3SOIPDbNode == -1) - { /* 5-node body tie, bNode has not been assigned */ - if ((model->B3SOIPDrbody == 0.0) - && (model->B3SOIPDrbsh == 0.0)) - { /* ideal body tie, pNode is not used */ - here->B3SOIPDbNode = here->B3SOIPDpNode; - here->B3SOIPDbodyMod = 2; - } - else - { /* nonideal body tie */ - error = - CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Body"); - if (error) - return (error); - here->B3SOIPDbNode = tmp->number; - here->B3SOIPDbodyMod = 1; - } - } - else - { /* 6-node body tie, bNode has been assigned */ - if ((model->B3SOIPDrbody == 0.0) - && (model->B3SOIPDrbsh == 0.0)) - { - printf - ("\n Warning: model parameter rbody=0!\n"); - model->B3SOIPDrbody = 1e0; - here->B3SOIPDbodyMod = 1; - } - else - { /* nonideal body tie */ - here->B3SOIPDbodyMod = 1; - } - } - } - else - { /* t-node assigned */ - if (here->B3SOIPDbNode == -1) - { /* 4 nodes & t-node, floating body */ - error = - CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Body"); - if (error) - return (error); - here->B3SOIPDbNode = tmp->number; - here->B3SOIPDtempNode = here->B3SOIPDpNode; - here->B3SOIPDpNode = 0; - here->B3SOIPDfloat = 1; - here->B3SOIPDbodyMod = 0; - } - else - { /* 5 or 6 nodes & t-node, body-contact device */ - if (here->B3SOIPDtempNode == -1) - { /* 5 nodes & tnode */ - if ((model->B3SOIPDrbody == 0.0) - && (model->B3SOIPDrbsh == 0.0)) - { /* ideal body tie, pNode is not used */ - here->B3SOIPDtempNode = here->B3SOIPDbNode; - here->B3SOIPDbNode = here->B3SOIPDpNode; - here->B3SOIPDbodyMod = 2; - } - else - { /* nonideal body tie */ - here->B3SOIPDtempNode = here->B3SOIPDbNode; - error = - CKTmkVolt (ckt, &tmp, here->B3SOIPDname, - "Body"); - if (error) - return (error); - here->B3SOIPDbNode = tmp->number; - here->B3SOIPDbodyMod = 1; - } - } - else - { /* 6 nodes & t-node */ - if ((model->B3SOIPDrbody == 0.0) - && (model->B3SOIPDrbsh == 0.0)) - { - printf - ("\n Warning: model parameter rbody=0!\n"); - model->B3SOIPDrbody = 1e0; - here->B3SOIPDbodyMod = 1; - } - else - { /* nonideal body tie */ - here->B3SOIPDbodyMod = 1; - } - } - } - } - } - - - if ((model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0 != 0)) - { - if (here->B3SOIPDtempNode == -1) - { - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Temp"); - if (error) - return (error); - here->B3SOIPDtempNode = tmp->number; - } - - } - else - { - here->B3SOIPDtempNode = 0; - } + if (!here->B3SOIPDnbcGiven) + here->B3SOIPDnbc = 0; + if (!here->B3SOIPDnsegGiven) + here->B3SOIPDnseg = 1; + if (!here->B3SOIPDpdbcpGiven) + here->B3SOIPDpdbcp = 0; + if (!here->B3SOIPDpsbcpGiven) + here->B3SOIPDpsbcp = 0; + if (!here->B3SOIPDagbcpGiven) + here->B3SOIPDagbcp = 0; + if (!here->B3SOIPDaebcpGiven) + here->B3SOIPDaebcp = 0; + + if (!here->B3SOIPDoffGiven) + here->B3SOIPDoff = 0; + + /* process drain series resistance */ + if ((model->B3SOIPDsheetResistance > 0.0) && + (here->B3SOIPDdrainSquares > 0.0 ) && + (here->B3SOIPDdNodePrime == 0)) + { error = CKTmkVolt(ckt,&tmp,here->B3SOIPDname,"drain"); + if(error) return(error); + here->B3SOIPDdNodePrime = tmp->number; + + if (ckt->CKTcopyNodesets) { + if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } + } + + } + else + { here->B3SOIPDdNodePrime = here->B3SOIPDdNode; + } + + /* process source series resistance */ + if ((model->B3SOIPDsheetResistance > 0.0) && + (here->B3SOIPDsourceSquares > 0.0 ) && + (here->B3SOIPDsNodePrime == 0)) + { error = CKTmkVolt(ckt,&tmp,here->B3SOIPDname,"source"); + if(error) return(error); + here->B3SOIPDsNodePrime = tmp->number; + + if (ckt->CKTcopyNodesets) { + if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } + } + + } + else + { here->B3SOIPDsNodePrime = here->B3SOIPDsNode; + } + + /* process effective silicon film thickness */ + model->B3SOIPDcbox = 3.453133e-11 / model->B3SOIPDtbox; + model->B3SOIPDcsi = 1.03594e-10 / model->B3SOIPDtsi; + Cboxt = model->B3SOIPDcbox * model->B3SOIPDcsi / (model->B3SOIPDcbox + model->B3SOIPDcsi); + model->B3SOIPDqsi = Charge_q*model->B3SOIPDnpeak*1e6*model->B3SOIPDtsi; + + + here->B3SOIPDfloat = 0; + if (here->B3SOIPDpNode == -1) { /* floating body case -- 4-node */ + error = CKTmkVolt(ckt,&tmp,here->B3SOIPDname,"Body"); + if (error) return(error); + here->B3SOIPDbNode = tmp->number; + here->B3SOIPDpNode = 0; + here->B3SOIPDfloat = 1; + here->B3SOIPDbodyMod = 0; + } + else /* the 5th Node has been assigned */ + { + if (!here->B3SOIPDtnodeoutGiven) { /* if t-node not assigned */ + if (here->B3SOIPDbNode == -1) + { /* 5-node body tie, bNode has not been assigned */ + if ((model->B3SOIPDrbody == 0.0) && (model->B3SOIPDrbsh == 0.0)) + { /* ideal body tie, pNode is not used */ + here->B3SOIPDbNode = here->B3SOIPDpNode; + here->B3SOIPDbodyMod = 2; + } + else { /* nonideal body tie */ + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Body"); + if (error) return(error); + here->B3SOIPDbNode = tmp->number; + here->B3SOIPDbodyMod = 1; + } + } + else { /* 6-node body tie, bNode has been assigned */ + if ((model->B3SOIPDrbody == 0.0) && (model->B3SOIPDrbsh == 0.0)) + { + printf("\n Warning: model parameter rbody=0!\n"); + model->B3SOIPDrbody = 1e0; + here->B3SOIPDbodyMod = 1; + } + else { /* nonideal body tie */ + here->B3SOIPDbodyMod = 1; + } + } + } + else { /* t-node assigned */ + if (here->B3SOIPDbNode == -1) + { /* 4 nodes & t-node, floating body */ + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Body"); + if (error) return(error); + here->B3SOIPDbNode = tmp->number; + here->B3SOIPDtempNode = here->B3SOIPDpNode; + here->B3SOIPDpNode = 0; + here->B3SOIPDfloat = 1; + here->B3SOIPDbodyMod = 0; + } + else { /* 5 or 6 nodes & t-node, body-contact device */ + if (here->B3SOIPDtempNode == -1) { /* 5 nodes & tnode */ + if ((model->B3SOIPDrbody == 0.0) && (model->B3SOIPDrbsh == 0.0)) + { /* ideal body tie, pNode is not used */ + here->B3SOIPDtempNode = here->B3SOIPDbNode; + here->B3SOIPDbNode = here->B3SOIPDpNode; + here->B3SOIPDbodyMod = 2; + } + else { /* nonideal body tie */ + here->B3SOIPDtempNode = here->B3SOIPDbNode; + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Body"); + if (error) return(error); + here->B3SOIPDbNode = tmp->number; + here->B3SOIPDbodyMod = 1; + } + } + else { /* 6 nodes & t-node */ + if ((model->B3SOIPDrbody == 0.0) && (model->B3SOIPDrbsh == 0.0)) + { + printf("\n Warning: model parameter rbody=0!\n"); + model->B3SOIPDrbody = 1e0; + here->B3SOIPDbodyMod = 1; + } + else { /* nonideal body tie */ + here->B3SOIPDbodyMod = 1; + } + } + } + } + } + + + if ((model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0!=0)) + { + if (here->B3SOIPDtempNode == -1) { + error = CKTmkVolt(ckt,&tmp,here->B3SOIPDname,"Temp"); + if (error) return(error); + here->B3SOIPDtempNode = tmp->number; + } + + } else { + here->B3SOIPDtempNode = 0; + } /* here for debugging purpose only */ - if (here->B3SOIPDdebugMod != 0) - { - /* The real Vbs value */ - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Vbs"); - if (error) - return (error); - here->B3SOIPDvbsNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Ids"); - if (error) - return (error); - here->B3SOIPDidsNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Ic"); - if (error) - return (error); - here->B3SOIPDicNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Ibs"); - if (error) - return (error); - here->B3SOIPDibsNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Ibd"); - if (error) - return (error); - here->B3SOIPDibdNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Iii"); - if (error) - return (error); - here->B3SOIPDiiiNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Ig"); - if (error) - return (error); - here->B3SOIPDigNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Gigg"); - if (error) - return (error); - here->B3SOIPDgiggNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Gigd"); - if (error) - return (error); - here->B3SOIPDgigdNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Gigb"); - if (error) - return (error); - here->B3SOIPDgigbNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Igidl"); - if (error) - return (error); - here->B3SOIPDigidlNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Itun"); - if (error) - return (error); - here->B3SOIPDitunNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Ibp"); - if (error) - return (error); - here->B3SOIPDibpNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Cbb"); - if (error) - return (error); - here->B3SOIPDcbbNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Cbd"); - if (error) - return (error); - here->B3SOIPDcbdNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Cbg"); - if (error) - return (error); - here->B3SOIPDcbgNode = tmp->number; - - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Qbf"); - if (error) - return (error); - here->B3SOIPDqbfNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Qjs"); - if (error) - return (error); - here->B3SOIPDqjsNode = tmp->number; - - error = CKTmkVolt (ckt, &tmp, here->B3SOIPDname, "Qjd"); - if (error) - return (error); - here->B3SOIPDqjdNode = tmp->number; - - } - - /* set Sparse Matrix Pointers */ + if (here->B3SOIPDdebugMod != 0) + { + /* The real Vbs value */ + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Vbs"); + if(error) return(error); + here->B3SOIPDvbsNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ids"); + if(error) return(error); + here->B3SOIPDidsNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ic"); + if(error) return(error); + here->B3SOIPDicNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ibs"); + if(error) return(error); + here->B3SOIPDibsNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ibd"); + if(error) return(error); + here->B3SOIPDibdNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Iii"); + if(error) return(error); + here->B3SOIPDiiiNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ig"); + if(error) return(error); + here->B3SOIPDigNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Gigg"); + if(error) return(error); + here->B3SOIPDgiggNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Gigd"); + if(error) return(error); + here->B3SOIPDgigdNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Gigb"); + if(error) return(error); + here->B3SOIPDgigbNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Igidl"); + if(error) return(error); + here->B3SOIPDigidlNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Itun"); + if(error) return(error); + here->B3SOIPDitunNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ibp"); + if(error) return(error); + here->B3SOIPDibpNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Cbb"); + if(error) return(error); + here->B3SOIPDcbbNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Cbd"); + if(error) return(error); + here->B3SOIPDcbdNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Cbg"); + if(error) return(error); + here->B3SOIPDcbgNode = tmp->number; + + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Qbf"); + if(error) return(error); + here->B3SOIPDqbfNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Qjs"); + if(error) return(error); + here->B3SOIPDqjsNode = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Qjd"); + if(error) return(error); + here->B3SOIPDqjdNode = tmp->number; + + } + + /* set Sparse Matrix Pointers */ /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ @@ -1370,129 +1358,130 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ } - if ((model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0 != 0.0)) - { - TSTALLOC (B3SOIPDTemptempPtr, B3SOIPDtempNode, B3SOIPDtempNode) - TSTALLOC (B3SOIPDTempdpPtr, B3SOIPDtempNode, - B3SOIPDdNodePrime) TSTALLOC (B3SOIPDTempspPtr, - B3SOIPDtempNode, - B3SOIPDsNodePrime) - TSTALLOC (B3SOIPDTempgPtr, B3SOIPDtempNode, - B3SOIPDgNode) TSTALLOC (B3SOIPDTempbPtr, - B3SOIPDtempNode, - B3SOIPDbNode) - TSTALLOC (B3SOIPDGtempPtr, B3SOIPDgNode, - B3SOIPDtempNode) TSTALLOC (B3SOIPDDPtempPtr, - B3SOIPDdNodePrime, - B3SOIPDtempNode) - TSTALLOC (B3SOIPDSPtempPtr, B3SOIPDsNodePrime, - B3SOIPDtempNode) TSTALLOC (B3SOIPDEtempPtr, - B3SOIPDeNode, - B3SOIPDtempNode) - TSTALLOC (B3SOIPDBtempPtr, B3SOIPDbNode, - B3SOIPDtempNode) if (here->B3SOIPDbodyMod == 1) - { - TSTALLOC (B3SOIPDPtempPtr, B3SOIPDpNode, B3SOIPDtempNode)} - } - if (here->B3SOIPDbodyMod == 2) - { - /* Don't create any Jacobian entry for pNode */ - } - else if (here->B3SOIPDbodyMod == 1) - { - TSTALLOC (B3SOIPDBpPtr, B3SOIPDbNode, B3SOIPDpNode) - TSTALLOC (B3SOIPDPbPtr, B3SOIPDpNode, B3SOIPDbNode) - TSTALLOC (B3SOIPDPpPtr, B3SOIPDpNode, B3SOIPDpNode)} - - TSTALLOC (B3SOIPDEbPtr, B3SOIPDeNode, B3SOIPDbNode) - TSTALLOC (B3SOIPDGbPtr, B3SOIPDgNode, B3SOIPDbNode) - TSTALLOC (B3SOIPDDPbPtr, B3SOIPDdNodePrime, B3SOIPDbNode) - TSTALLOC (B3SOIPDSPbPtr, B3SOIPDsNodePrime, B3SOIPDbNode) - TSTALLOC (B3SOIPDBePtr, B3SOIPDbNode, B3SOIPDeNode) - TSTALLOC (B3SOIPDBgPtr, B3SOIPDbNode, B3SOIPDgNode) - TSTALLOC (B3SOIPDBdpPtr, B3SOIPDbNode, B3SOIPDdNodePrime) - TSTALLOC (B3SOIPDBspPtr, B3SOIPDbNode, B3SOIPDsNodePrime) - TSTALLOC (B3SOIPDBbPtr, B3SOIPDbNode, B3SOIPDbNode) - TSTALLOC (B3SOIPDEgPtr, B3SOIPDeNode, B3SOIPDgNode) - TSTALLOC (B3SOIPDEdpPtr, B3SOIPDeNode, B3SOIPDdNodePrime) - TSTALLOC (B3SOIPDEspPtr, B3SOIPDeNode, B3SOIPDsNodePrime) - TSTALLOC (B3SOIPDGePtr, B3SOIPDgNode, B3SOIPDeNode) - TSTALLOC (B3SOIPDDPePtr, B3SOIPDdNodePrime, B3SOIPDeNode) - TSTALLOC (B3SOIPDSPePtr, B3SOIPDsNodePrime, B3SOIPDeNode) - TSTALLOC (B3SOIPDEbPtr, B3SOIPDeNode, B3SOIPDbNode) - TSTALLOC (B3SOIPDEePtr, B3SOIPDeNode, B3SOIPDeNode) - TSTALLOC (B3SOIPDGgPtr, B3SOIPDgNode, B3SOIPDgNode) - TSTALLOC (B3SOIPDGdpPtr, B3SOIPDgNode, B3SOIPDdNodePrime) - TSTALLOC (B3SOIPDGspPtr, B3SOIPDgNode, B3SOIPDsNodePrime) - TSTALLOC (B3SOIPDDPgPtr, B3SOIPDdNodePrime, B3SOIPDgNode) - TSTALLOC (B3SOIPDDPdpPtr, B3SOIPDdNodePrime, B3SOIPDdNodePrime) - TSTALLOC (B3SOIPDDPspPtr, B3SOIPDdNodePrime, B3SOIPDsNodePrime) - TSTALLOC (B3SOIPDDPdPtr, B3SOIPDdNodePrime, B3SOIPDdNode) - TSTALLOC (B3SOIPDSPgPtr, B3SOIPDsNodePrime, B3SOIPDgNode) - TSTALLOC (B3SOIPDSPdpPtr, B3SOIPDsNodePrime, B3SOIPDdNodePrime) - TSTALLOC (B3SOIPDSPspPtr, B3SOIPDsNodePrime, B3SOIPDsNodePrime) - TSTALLOC (B3SOIPDSPsPtr, B3SOIPDsNodePrime, B3SOIPDsNode) - TSTALLOC (B3SOIPDDdPtr, B3SOIPDdNode, B3SOIPDdNode) - TSTALLOC (B3SOIPDDdpPtr, B3SOIPDdNode, B3SOIPDdNodePrime) - TSTALLOC (B3SOIPDSsPtr, B3SOIPDsNode, B3SOIPDsNode) - TSTALLOC (B3SOIPDSspPtr, B3SOIPDsNode, B3SOIPDsNodePrime) -/* here for debugging purpose only */ - if (here->B3SOIPDdebugMod != 0) - { - TSTALLOC (B3SOIPDVbsPtr, B3SOIPDvbsNode, B3SOIPDvbsNode) - TSTALLOC (B3SOIPDIdsPtr, B3SOIPDidsNode, B3SOIPDidsNode) - TSTALLOC (B3SOIPDIcPtr, B3SOIPDicNode, B3SOIPDicNode) - TSTALLOC (B3SOIPDIbsPtr, B3SOIPDibsNode, B3SOIPDibsNode) - TSTALLOC (B3SOIPDIbdPtr, B3SOIPDibdNode, B3SOIPDibdNode) - TSTALLOC (B3SOIPDIiiPtr, B3SOIPDiiiNode, B3SOIPDiiiNode) - TSTALLOC (B3SOIPDIgPtr, B3SOIPDigNode, B3SOIPDigNode) - TSTALLOC (B3SOIPDGiggPtr, B3SOIPDgiggNode, B3SOIPDgiggNode) - TSTALLOC (B3SOIPDGigdPtr, B3SOIPDgigdNode, B3SOIPDgigdNode) - TSTALLOC (B3SOIPDGigbPtr, B3SOIPDgigbNode, B3SOIPDgigbNode) - TSTALLOC (B3SOIPDIgidlPtr, B3SOIPDigidlNode, B3SOIPDigidlNode) - TSTALLOC (B3SOIPDItunPtr, B3SOIPDitunNode, B3SOIPDitunNode) - TSTALLOC (B3SOIPDIbpPtr, B3SOIPDibpNode, B3SOIPDibpNode) - TSTALLOC (B3SOIPDCbbPtr, B3SOIPDcbbNode, B3SOIPDcbbNode) - TSTALLOC (B3SOIPDCbdPtr, B3SOIPDcbdNode, B3SOIPDcbdNode) - TSTALLOC (B3SOIPDCbgPtr, B3SOIPDcbgNode, B3SOIPDcbgNode) - TSTALLOC (B3SOIPDQbfPtr, B3SOIPDqbfNode, B3SOIPDqbfNode) - TSTALLOC (B3SOIPDQjsPtr, B3SOIPDqjsNode, B3SOIPDqjsNode) - TSTALLOC (B3SOIPDQjdPtr, B3SOIPDqjdNode, B3SOIPDqjdNode)} + if ((model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0!=0.0)) { + TSTALLOC(B3SOIPDTemptempPtr, B3SOIPDtempNode, B3SOIPDtempNode) + TSTALLOC(B3SOIPDTempdpPtr, B3SOIPDtempNode, B3SOIPDdNodePrime) + TSTALLOC(B3SOIPDTempspPtr, B3SOIPDtempNode, B3SOIPDsNodePrime) + TSTALLOC(B3SOIPDTempgPtr, B3SOIPDtempNode, B3SOIPDgNode) + TSTALLOC(B3SOIPDTempbPtr, B3SOIPDtempNode, B3SOIPDbNode) + + TSTALLOC(B3SOIPDGtempPtr, B3SOIPDgNode, B3SOIPDtempNode) + TSTALLOC(B3SOIPDDPtempPtr, B3SOIPDdNodePrime, B3SOIPDtempNode) + TSTALLOC(B3SOIPDSPtempPtr, B3SOIPDsNodePrime, B3SOIPDtempNode) + TSTALLOC(B3SOIPDEtempPtr, B3SOIPDeNode, B3SOIPDtempNode) + TSTALLOC(B3SOIPDBtempPtr, B3SOIPDbNode, B3SOIPDtempNode) + + if (here->B3SOIPDbodyMod == 1) { + TSTALLOC(B3SOIPDPtempPtr, B3SOIPDpNode, B3SOIPDtempNode) + } + } + if (here->B3SOIPDbodyMod == 2) { + /* Don't create any Jacobian entry for pNode */ + } + else if (here->B3SOIPDbodyMod == 1) { + TSTALLOC(B3SOIPDBpPtr, B3SOIPDbNode, B3SOIPDpNode) + TSTALLOC(B3SOIPDPbPtr, B3SOIPDpNode, B3SOIPDbNode) + TSTALLOC(B3SOIPDPpPtr, B3SOIPDpNode, B3SOIPDpNode) + } + + TSTALLOC(B3SOIPDEbPtr, B3SOIPDeNode, B3SOIPDbNode) + TSTALLOC(B3SOIPDGbPtr, B3SOIPDgNode, B3SOIPDbNode) + TSTALLOC(B3SOIPDDPbPtr, B3SOIPDdNodePrime, B3SOIPDbNode) + TSTALLOC(B3SOIPDSPbPtr, B3SOIPDsNodePrime, B3SOIPDbNode) + TSTALLOC(B3SOIPDBePtr, B3SOIPDbNode, B3SOIPDeNode) + TSTALLOC(B3SOIPDBgPtr, B3SOIPDbNode, B3SOIPDgNode) + TSTALLOC(B3SOIPDBdpPtr, B3SOIPDbNode, B3SOIPDdNodePrime) + TSTALLOC(B3SOIPDBspPtr, B3SOIPDbNode, B3SOIPDsNodePrime) + TSTALLOC(B3SOIPDBbPtr, B3SOIPDbNode, B3SOIPDbNode) + + TSTALLOC(B3SOIPDEgPtr, B3SOIPDeNode, B3SOIPDgNode) + TSTALLOC(B3SOIPDEdpPtr, B3SOIPDeNode, B3SOIPDdNodePrime) + TSTALLOC(B3SOIPDEspPtr, B3SOIPDeNode, B3SOIPDsNodePrime) + TSTALLOC(B3SOIPDGePtr, B3SOIPDgNode, B3SOIPDeNode) + TSTALLOC(B3SOIPDDPePtr, B3SOIPDdNodePrime, B3SOIPDeNode) + TSTALLOC(B3SOIPDSPePtr, B3SOIPDsNodePrime, B3SOIPDeNode) + + TSTALLOC(B3SOIPDEbPtr, B3SOIPDeNode, B3SOIPDbNode) + TSTALLOC(B3SOIPDEePtr, B3SOIPDeNode, B3SOIPDeNode) + + TSTALLOC(B3SOIPDGgPtr, B3SOIPDgNode, B3SOIPDgNode) + TSTALLOC(B3SOIPDGdpPtr, B3SOIPDgNode, B3SOIPDdNodePrime) + TSTALLOC(B3SOIPDGspPtr, B3SOIPDgNode, B3SOIPDsNodePrime) + + TSTALLOC(B3SOIPDDPgPtr, B3SOIPDdNodePrime, B3SOIPDgNode) + TSTALLOC(B3SOIPDDPdpPtr, B3SOIPDdNodePrime, B3SOIPDdNodePrime) + TSTALLOC(B3SOIPDDPspPtr, B3SOIPDdNodePrime, B3SOIPDsNodePrime) + TSTALLOC(B3SOIPDDPdPtr, B3SOIPDdNodePrime, B3SOIPDdNode) + + TSTALLOC(B3SOIPDSPgPtr, B3SOIPDsNodePrime, B3SOIPDgNode) + TSTALLOC(B3SOIPDSPdpPtr, B3SOIPDsNodePrime, B3SOIPDdNodePrime) + TSTALLOC(B3SOIPDSPspPtr, B3SOIPDsNodePrime, B3SOIPDsNodePrime) + TSTALLOC(B3SOIPDSPsPtr, B3SOIPDsNodePrime, B3SOIPDsNode) + + TSTALLOC(B3SOIPDDdPtr, B3SOIPDdNode, B3SOIPDdNode) + TSTALLOC(B3SOIPDDdpPtr, B3SOIPDdNode, B3SOIPDdNodePrime) + + TSTALLOC(B3SOIPDSsPtr, B3SOIPDsNode, B3SOIPDsNode) + TSTALLOC(B3SOIPDSspPtr, B3SOIPDsNode, B3SOIPDsNodePrime) - } +/* here for debugging purpose only */ + if (here->B3SOIPDdebugMod != 0) + { + TSTALLOC(B3SOIPDVbsPtr, B3SOIPDvbsNode, B3SOIPDvbsNode) + TSTALLOC(B3SOIPDIdsPtr, B3SOIPDidsNode, B3SOIPDidsNode) + TSTALLOC(B3SOIPDIcPtr, B3SOIPDicNode, B3SOIPDicNode) + TSTALLOC(B3SOIPDIbsPtr, B3SOIPDibsNode, B3SOIPDibsNode) + TSTALLOC(B3SOIPDIbdPtr, B3SOIPDibdNode, B3SOIPDibdNode) + TSTALLOC(B3SOIPDIiiPtr, B3SOIPDiiiNode, B3SOIPDiiiNode) + TSTALLOC(B3SOIPDIgPtr, B3SOIPDigNode, B3SOIPDigNode) + TSTALLOC(B3SOIPDGiggPtr, B3SOIPDgiggNode, B3SOIPDgiggNode) + TSTALLOC(B3SOIPDGigdPtr, B3SOIPDgigdNode, B3SOIPDgigdNode) + TSTALLOC(B3SOIPDGigbPtr, B3SOIPDgigbNode, B3SOIPDgigbNode) + TSTALLOC(B3SOIPDIgidlPtr, B3SOIPDigidlNode, B3SOIPDigidlNode) + TSTALLOC(B3SOIPDItunPtr, B3SOIPDitunNode, B3SOIPDitunNode) + TSTALLOC(B3SOIPDIbpPtr, B3SOIPDibpNode, B3SOIPDibpNode) + TSTALLOC(B3SOIPDCbbPtr, B3SOIPDcbbNode, B3SOIPDcbbNode) + TSTALLOC(B3SOIPDCbdPtr, B3SOIPDcbdNode, B3SOIPDcbdNode) + TSTALLOC(B3SOIPDCbgPtr, B3SOIPDcbgNode, B3SOIPDcbgNode) + TSTALLOC(B3SOIPDQbfPtr, B3SOIPDqbfNode, B3SOIPDqbfNode) + TSTALLOC(B3SOIPDQjsPtr, B3SOIPDqjsNode, B3SOIPDqjsNode) + TSTALLOC(B3SOIPDQjdPtr, B3SOIPDqjdNode, B3SOIPDqjdNode) + + } + + } } - return (OK); -} + return(OK); +} int -B3SOIPDunsetup (inModel, ckt) - GENmodel *inModel; - CKTcircuit *ckt; +B3SOIPDunsetup(inModel,ckt) + GENmodel *inModel; + CKTcircuit *ckt; { -#ifndef HAS_BATCHSIM - B3SOIPDmodel *model; - B3SOIPDinstance *here; - - for (model = (B3SOIPDmodel *) inModel; model != NULL; - model = model->B3SOIPDnextModel) + B3SOIPDmodel *model; + B3SOIPDinstance *here; + + for (model = (B3SOIPDmodel *)inModel; model != NULL; + model = model->B3SOIPDnextModel) { - for (here = model->B3SOIPDinstances; here != NULL; - here = here->B3SOIPDnextInstance) - { - if (here->B3SOIPDdNodePrime - && here->B3SOIPDdNodePrime != here->B3SOIPDdNode) - { - CKTdltNNum (ckt, here->B3SOIPDdNodePrime); - here->B3SOIPDdNodePrime = 0; - } - if (here->B3SOIPDsNodePrime - && here->B3SOIPDsNodePrime != here->B3SOIPDsNode) - { - CKTdltNNum (ckt, here->B3SOIPDsNodePrime); - here->B3SOIPDsNodePrime = 0; - } - } + for (here = model->B3SOIPDinstances; here != NULL; + here=here->B3SOIPDnextInstance) + { + if (here->B3SOIPDdNodePrime + && here->B3SOIPDdNodePrime != here->B3SOIPDdNode) + { + CKTdltNNum(ckt, here->B3SOIPDdNodePrime); + here->B3SOIPDdNodePrime = 0; + } + if (here->B3SOIPDsNodePrime + && here->B3SOIPDsNodePrime != here->B3SOIPDsNode) + { + CKTdltNNum(ckt, here->B3SOIPDsNodePrime); + here->B3SOIPDsNodePrime = 0; + } + } } -#endif - return OK; + return OK; } + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c b/src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c index 3ee2bdab9..00533a29c 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c @@ -6,13 +6,19 @@ Modified by Pin Su 99/2/15 Modified by Pin Su 99/4/30 Modified by Pin Su, Wei Jin 99/9/27 Modified by Pin Su 00/3/1 +Modified by Pin Su 01/2/15 +Modified by Pin Su and Hui Wan 02/3/5 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ + /* Lmin, Lmax, Wmin, Wmax */ #include "ngspice.h" -#include -#include #include "smpdefs.h" #include "cktdefs.h" #include "b3soipddef.h" @@ -21,12 +27,12 @@ Modified by Pin Su 00/3/1 #include "suffix.h" #define Kb 1.3806226e-23 -#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */ +#define KboQ 8.617087e-5 /* Kb / q where q = 1.60219e-19 */ #define EPSOX 3.453133e-11 #define EPSSI 1.03594e-10 #define PI 3.141592654 #define Charge_q 1.60219e-19 -#define Eg300 1.115 /* energy gap at 300K */ +#define Eg300 1.115 /* energy gap at 300K */ #define MAX_EXPL 2.688117142e+43 #define MIN_EXPL 3.720075976e-44 @@ -43,995 +49,960 @@ Modified by Pin Su 00/3/1 /* ARGSUSED */ int -B3SOIPDtemp (inModel, ckt) - GENmodel *inModel; - CKTcircuit *ckt; +B3SOIPDtemp(GENmodel *inModel, CKTcircuit *ckt) { - 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; - double SDphi, SDgamma; - int Size_Not_Found; +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; +double SDphi, SDgamma; +int Size_Not_Found; /* v2.0 release */ - double tmp3, T7, T8, T9; - - - /* loop through all the B3SOIPD device models */ - for (; model != NULL; model = model->B3SOIPDnextModel) - { - Temp = ckt->CKTtemp; - if (model->B3SOIPDGatesidewallJctPotential < 0.1) - model->B3SOIPDGatesidewallJctPotential = 0.1; - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->B3SOIPDtnom; - TempRatio = Temp / Tnom; - - model->B3SOIPDvcrit = - CONSTvt0 * log (CONSTvt0 / (CONSTroot2 * 1.0e-14)); - model->B3SOIPDfactor1 = sqrt (EPSSI / EPSOX * model->B3SOIPDtox); - - Vtm0 = KboQ * Tnom; - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - model->B3SOIPDeg0 = Eg0; - model->B3SOIPDvtm = KboQ * Temp; - - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - /* ni is in cm^-3 */ - ni = 1.45e10 * (Temp / 300.15) * sqrt (Temp / 300.15) - * exp (21.5565981 - Eg / (2.0 * model->B3SOIPDvtm)); - - - /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ - for (here = model->B3SOIPDinstances; here != NULL; - here = here->B3SOIPDnextInstance) - { - here->B3SOIPDrbodyext = here->B3SOIPDbodySquares * - model->B3SOIPDrbsh; - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { - if ((here->B3SOIPDl == pSizeDependParamKnot->Length) - && (here->B3SOIPDw == pSizeDependParamKnot->Width) - && (here->B3SOIPDrth0 == pSizeDependParamKnot->Rth0) - && (here->B3SOIPDcth0 == pSizeDependParamKnot->Cth0)) - { - Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - } - else - { - pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - if (Size_Not_Found) - { - pParam = - (struct b3soipdSizeDependParam *) - malloc (sizeof (struct b3soipdSizeDependParam)); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - Ldrn = here->B3SOIPDl; - Wdrn = here->B3SOIPDw; - pParam->Length = Ldrn; - pParam->Width = Wdrn; - pParam->Rth0 = here->B3SOIPDrth0; - pParam->Cth0 = here->B3SOIPDcth0; - - T0 = pow (Ldrn, model->B3SOIPDLln); - T1 = pow (Wdrn, model->B3SOIPDLwn); - tmp1 = model->B3SOIPDLl / T0 + model->B3SOIPDLw / T1 - + model->B3SOIPDLwl / (T0 * T1); - pParam->B3SOIPDdl = model->B3SOIPDLint + tmp1; - pParam->B3SOIPDdlc = model->B3SOIPDdlc + tmp1; - - T2 = pow (Ldrn, model->B3SOIPDWln); - T3 = pow (Wdrn, model->B3SOIPDWwn); - tmp2 = model->B3SOIPDWl / T2 + model->B3SOIPDWw / T3 - + model->B3SOIPDWwl / (T2 * T3); - pParam->B3SOIPDdw = model->B3SOIPDWint + tmp2; - pParam->B3SOIPDdwc = model->B3SOIPDdwc + tmp2; - - pParam->B3SOIPDleff = here->B3SOIPDl - 2.0 * pParam->B3SOIPDdl; - if (pParam->B3SOIPDleff <= 0.0) - { - IFuid namarray[2]; - namarray[0] = model->B3SOIPDmodName; - namarray[1] = here->B3SOIPDname; - (*(SPfrontEnd->IFerror)) (ERR_FATAL, - "B3SOIPD: mosfet %s, model %s: Effective channel length <= 0", - namarray); - return (E_BADPARM); - } - - pParam->B3SOIPDweff = - here->B3SOIPDw - here->B3SOIPDnbc * model->B3SOIPDdwbc - - (2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdw; - if (pParam->B3SOIPDweff <= 0.0) - { - IFuid namarray[2]; - namarray[0] = model->B3SOIPDmodName; - namarray[1] = here->B3SOIPDname; - (*(SPfrontEnd->IFerror)) (ERR_FATAL, - "B3SOIPD: mosfet %s, model %s: Effective channel width <= 0", - namarray); - return (E_BADPARM); - } - - pParam->B3SOIPDwdiod = - pParam->B3SOIPDweff / here->B3SOIPDnseg + here->B3SOIPDpdbcp; - pParam->B3SOIPDwdios = - pParam->B3SOIPDweff / here->B3SOIPDnseg + here->B3SOIPDpsbcp; - - pParam->B3SOIPDleffCV = - here->B3SOIPDl - 2.0 * pParam->B3SOIPDdlc; - if (pParam->B3SOIPDleffCV <= 0.0) - { - IFuid namarray[2]; - namarray[0] = model->B3SOIPDmodName; - namarray[1] = here->B3SOIPDname; - (*(SPfrontEnd->IFerror)) (ERR_FATAL, - "B3SOIPD: mosfet %s, model %s: Effective channel length for C-V <= 0", - namarray); - return (E_BADPARM); - } - - pParam->B3SOIPDweffCV = - here->B3SOIPDw - here->B3SOIPDnbc * model->B3SOIPDdwbc - - (2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdwc; - if (pParam->B3SOIPDweffCV <= 0.0) - { - IFuid namarray[2]; - namarray[0] = model->B3SOIPDmodName; - namarray[1] = here->B3SOIPDname; - (*(SPfrontEnd->IFerror)) (ERR_FATAL, - "B3SOIPD: mosfet %s, model %s: Effective channel width for C-V <= 0", - namarray); - return (E_BADPARM); - } - - pParam->B3SOIPDwdiodCV = - pParam->B3SOIPDweffCV / here->B3SOIPDnseg + - here->B3SOIPDpdbcp; - pParam->B3SOIPDwdiosCV = - pParam->B3SOIPDweffCV / here->B3SOIPDnseg + - here->B3SOIPDpsbcp; - - pParam->B3SOIPDleffCVb = - here->B3SOIPDl - 2.0 * pParam->B3SOIPDdlc - - model->B3SOIPDdlcb; - if (pParam->B3SOIPDleffCVb <= 0.0) - { - IFuid namarray[2]; - namarray[0] = model->B3SOIPDmodName; - namarray[1] = here->B3SOIPDname; - (*(SPfrontEnd->IFerror)) (ERR_FATAL, - "B3SOIPD: mosfet %s, model %s: Effective channel length for C-V (body) <= 0", - namarray); - return (E_BADPARM); - } - - pParam->B3SOIPDleffCVbg = - pParam->B3SOIPDleffCVb + 2 * model->B3SOIPDdlbg; - if (pParam->B3SOIPDleffCVbg <= 0.0) - { - IFuid namarray[2]; - namarray[0] = model->B3SOIPDmodName; - namarray[1] = here->B3SOIPDname; - (*(SPfrontEnd->IFerror)) (ERR_FATAL, - "B3SOIPD: mosfet %s, model %s: Effective channel length for C-V (backgate) <= 0", - namarray); - return (E_BADPARM); - } - - /* Not binned - START */ - pParam->B3SOIPDat = model->B3SOIPDat; - pParam->B3SOIPDgamma1 = model->B3SOIPDgamma1; - pParam->B3SOIPDgamma2 = model->B3SOIPDgamma2; - pParam->B3SOIPDvbx = model->B3SOIPDvbx; - pParam->B3SOIPDvbm = model->B3SOIPDvbm; - pParam->B3SOIPDxt = model->B3SOIPDxt; - pParam->B3SOIPDkt1 = model->B3SOIPDkt1; - pParam->B3SOIPDkt1l = model->B3SOIPDkt1l; - pParam->B3SOIPDkt2 = model->B3SOIPDkt2; - pParam->B3SOIPDua1 = model->B3SOIPDua1; - pParam->B3SOIPDub1 = model->B3SOIPDub1; - pParam->B3SOIPDuc1 = model->B3SOIPDuc1; - pParam->B3SOIPDute = model->B3SOIPDute; - pParam->B3SOIPDprt = model->B3SOIPDprt; - /* Not binned - END */ - - /* CV model */ - pParam->B3SOIPDcgsl = model->B3SOIPDcgsl; - pParam->B3SOIPDcgdl = model->B3SOIPDcgdl; - pParam->B3SOIPDckappa = model->B3SOIPDckappa; - pParam->B3SOIPDcf = model->B3SOIPDcf; - pParam->B3SOIPDclc = model->B3SOIPDclc; - pParam->B3SOIPDcle = model->B3SOIPDcle; - - pParam->B3SOIPDabulkCVfactor = - 1.0 + pow ((pParam->B3SOIPDclc / pParam->B3SOIPDleff), - pParam->B3SOIPDcle); - - /* Added for binning - START */ - if (model->B3SOIPDbinUnit == 1) - { - Inv_L = 1.0e-6 / pParam->B3SOIPDleff; - Inv_W = 1.0e-6 / pParam->B3SOIPDweff; - Inv_LW = 1.0e-12 / (pParam->B3SOIPDleff - * pParam->B3SOIPDweff); - } - else - { - Inv_L = 1.0 / pParam->B3SOIPDleff; - Inv_W = 1.0 / pParam->B3SOIPDweff; - Inv_LW = 1.0 / (pParam->B3SOIPDleff * pParam->B3SOIPDweff); - } - pParam->B3SOIPDnpeak = model->B3SOIPDnpeak - + model->B3SOIPDlnpeak * Inv_L - + model->B3SOIPDwnpeak * Inv_W - + model->B3SOIPDpnpeak * Inv_LW; - pParam->B3SOIPDnsub = model->B3SOIPDnsub - + model->B3SOIPDlnsub * Inv_L - + model->B3SOIPDwnsub * Inv_W + model->B3SOIPDpnsub * Inv_LW; - pParam->B3SOIPDngate = model->B3SOIPDngate - + model->B3SOIPDlngate * Inv_L - + model->B3SOIPDwngate * Inv_W - + model->B3SOIPDpngate * Inv_LW; - pParam->B3SOIPDvth0 = model->B3SOIPDvth0 - + model->B3SOIPDlvth0 * Inv_L - + model->B3SOIPDwvth0 * Inv_W + model->B3SOIPDpvth0 * Inv_LW; - pParam->B3SOIPDk1 = model->B3SOIPDk1 - + model->B3SOIPDlk1 * Inv_L - + model->B3SOIPDwk1 * Inv_W + model->B3SOIPDpk1 * Inv_LW; - pParam->B3SOIPDk2 = model->B3SOIPDk2 - + model->B3SOIPDlk2 * Inv_L - + model->B3SOIPDwk2 * Inv_W + model->B3SOIPDpk2 * Inv_LW; - pParam->B3SOIPDk1w1 = model->B3SOIPDk1w1 - + model->B3SOIPDlk1w1 * Inv_L - + model->B3SOIPDwk1w1 * Inv_W + model->B3SOIPDpk1w1 * Inv_LW; - pParam->B3SOIPDk1w2 = model->B3SOIPDk1w2 - + model->B3SOIPDlk1w2 * Inv_L - + model->B3SOIPDwk1w2 * Inv_W + model->B3SOIPDpk1w2 * Inv_LW; - pParam->B3SOIPDk3 = model->B3SOIPDk3 - + model->B3SOIPDlk3 * Inv_L - + model->B3SOIPDwk3 * Inv_W + model->B3SOIPDpk3 * Inv_LW; - pParam->B3SOIPDk3b = model->B3SOIPDk3b - + model->B3SOIPDlk3b * Inv_L - + model->B3SOIPDwk3b * Inv_W + model->B3SOIPDpk3b * Inv_LW; - pParam->B3SOIPDkb1 = model->B3SOIPDkb1 - + model->B3SOIPDlkb1 * Inv_L - + model->B3SOIPDwkb1 * Inv_W + model->B3SOIPDpkb1 * Inv_LW; - pParam->B3SOIPDw0 = model->B3SOIPDw0 - + model->B3SOIPDlw0 * Inv_L - + model->B3SOIPDww0 * Inv_W + model->B3SOIPDpw0 * Inv_LW; - pParam->B3SOIPDnlx = model->B3SOIPDnlx - + model->B3SOIPDlnlx * Inv_L - + model->B3SOIPDwnlx * Inv_W + model->B3SOIPDpnlx * Inv_LW; - pParam->B3SOIPDdvt0 = model->B3SOIPDdvt0 - + model->B3SOIPDldvt0 * Inv_L - + model->B3SOIPDwdvt0 * Inv_W + model->B3SOIPDpdvt0 * Inv_LW; - pParam->B3SOIPDdvt1 = model->B3SOIPDdvt1 - + model->B3SOIPDldvt1 * Inv_L - + model->B3SOIPDwdvt1 * Inv_W + model->B3SOIPDpdvt1 * Inv_LW; - pParam->B3SOIPDdvt2 = model->B3SOIPDdvt2 - + model->B3SOIPDldvt2 * Inv_L - + model->B3SOIPDwdvt2 * Inv_W + model->B3SOIPDpdvt2 * Inv_LW; - pParam->B3SOIPDdvt0w = model->B3SOIPDdvt0w - + model->B3SOIPDldvt0w * Inv_L - + model->B3SOIPDwdvt0w * Inv_W - + model->B3SOIPDpdvt0w * Inv_LW; - pParam->B3SOIPDdvt1w = model->B3SOIPDdvt1w - + model->B3SOIPDldvt1w * Inv_L - + model->B3SOIPDwdvt1w * Inv_W - + model->B3SOIPDpdvt1w * Inv_LW; - pParam->B3SOIPDdvt2w = model->B3SOIPDdvt2w - + model->B3SOIPDldvt2w * Inv_L - + model->B3SOIPDwdvt2w * Inv_W - + model->B3SOIPDpdvt2w * Inv_LW; - pParam->B3SOIPDu0 = model->B3SOIPDu0 - + model->B3SOIPDlu0 * Inv_L - + model->B3SOIPDwu0 * Inv_W + model->B3SOIPDpu0 * Inv_LW; - pParam->B3SOIPDua = model->B3SOIPDua - + model->B3SOIPDlua * Inv_L - + model->B3SOIPDwua * Inv_W + model->B3SOIPDpua * Inv_LW; - pParam->B3SOIPDub = model->B3SOIPDub - + model->B3SOIPDlub * Inv_L - + model->B3SOIPDwub * Inv_W + model->B3SOIPDpub * Inv_LW; - pParam->B3SOIPDuc = model->B3SOIPDuc - + model->B3SOIPDluc * Inv_L - + model->B3SOIPDwuc * Inv_W + model->B3SOIPDpuc * Inv_LW; - pParam->B3SOIPDvsat = model->B3SOIPDvsat - + model->B3SOIPDlvsat * Inv_L - + model->B3SOIPDwvsat * Inv_W + model->B3SOIPDpvsat * Inv_LW; - pParam->B3SOIPDa0 = model->B3SOIPDa0 - + model->B3SOIPDla0 * Inv_L - + model->B3SOIPDwa0 * Inv_W + model->B3SOIPDpa0 * Inv_LW; - pParam->B3SOIPDags = model->B3SOIPDags - + model->B3SOIPDlags * Inv_L - + model->B3SOIPDwags * Inv_W + model->B3SOIPDpags * Inv_LW; - pParam->B3SOIPDb0 = model->B3SOIPDb0 - + model->B3SOIPDlb0 * Inv_L - + model->B3SOIPDwb0 * Inv_W + model->B3SOIPDpb0 * Inv_LW; - pParam->B3SOIPDb1 = model->B3SOIPDb1 - + model->B3SOIPDlb1 * Inv_L - + model->B3SOIPDwb1 * Inv_W + model->B3SOIPDpb1 * Inv_LW; - pParam->B3SOIPDketa = model->B3SOIPDketa - + model->B3SOIPDlketa * Inv_L - + model->B3SOIPDwketa * Inv_W + model->B3SOIPDpketa * Inv_LW; - pParam->B3SOIPDketas = model->B3SOIPDketas - + model->B3SOIPDlketas * Inv_L - + model->B3SOIPDwketas * Inv_W - + model->B3SOIPDpketas * Inv_LW; - pParam->B3SOIPDa1 = model->B3SOIPDa1 - + model->B3SOIPDla1 * Inv_L - + model->B3SOIPDwa1 * Inv_W + model->B3SOIPDpa1 * Inv_LW; - pParam->B3SOIPDa2 = model->B3SOIPDa2 - + model->B3SOIPDla2 * Inv_L - + model->B3SOIPDwa2 * Inv_W + model->B3SOIPDpa2 * Inv_LW; - pParam->B3SOIPDrdsw = model->B3SOIPDrdsw - + model->B3SOIPDlrdsw * Inv_L - + model->B3SOIPDwrdsw * Inv_W + model->B3SOIPDprdsw * Inv_LW; - pParam->B3SOIPDprwb = model->B3SOIPDprwb - + model->B3SOIPDlprwb * Inv_L - + model->B3SOIPDwprwb * Inv_W + model->B3SOIPDpprwb * Inv_LW; - pParam->B3SOIPDprwg = model->B3SOIPDprwg - + model->B3SOIPDlprwg * Inv_L - + model->B3SOIPDwprwg * Inv_W + model->B3SOIPDpprwg * Inv_LW; - pParam->B3SOIPDwr = model->B3SOIPDwr - + model->B3SOIPDlwr * Inv_L - + model->B3SOIPDwwr * Inv_W + model->B3SOIPDpwr * Inv_LW; - pParam->B3SOIPDnfactor = model->B3SOIPDnfactor - + model->B3SOIPDlnfactor * Inv_L - + model->B3SOIPDwnfactor * Inv_W - + model->B3SOIPDpnfactor * Inv_LW; - pParam->B3SOIPDdwg = model->B3SOIPDdwg - + model->B3SOIPDldwg * Inv_L - + model->B3SOIPDwdwg * Inv_W + model->B3SOIPDpdwg * Inv_LW; - pParam->B3SOIPDdwb = model->B3SOIPDdwb - + model->B3SOIPDldwb * Inv_L - + model->B3SOIPDwdwb * Inv_W + model->B3SOIPDpdwb * Inv_LW; - pParam->B3SOIPDvoff = model->B3SOIPDvoff - + model->B3SOIPDlvoff * Inv_L - + model->B3SOIPDwvoff * Inv_W + model->B3SOIPDpvoff * Inv_LW; - pParam->B3SOIPDeta0 = model->B3SOIPDeta0 - + model->B3SOIPDleta0 * Inv_L - + model->B3SOIPDweta0 * Inv_W + model->B3SOIPDpeta0 * Inv_LW; - pParam->B3SOIPDetab = model->B3SOIPDetab - + model->B3SOIPDletab * Inv_L - + model->B3SOIPDwetab * Inv_W + model->B3SOIPDpetab * Inv_LW; - pParam->B3SOIPDdsub = model->B3SOIPDdsub - + model->B3SOIPDldsub * Inv_L - + model->B3SOIPDwdsub * Inv_W + model->B3SOIPDpdsub * Inv_LW; - pParam->B3SOIPDcit = model->B3SOIPDcit - + model->B3SOIPDlcit * Inv_L - + model->B3SOIPDwcit * Inv_W + model->B3SOIPDpcit * Inv_LW; - pParam->B3SOIPDcdsc = model->B3SOIPDcdsc - + model->B3SOIPDlcdsc * Inv_L - + model->B3SOIPDwcdsc * Inv_W + model->B3SOIPDpcdsc * Inv_LW; - pParam->B3SOIPDcdscb = model->B3SOIPDcdscb - + model->B3SOIPDlcdscb * Inv_L - + model->B3SOIPDwcdscb * Inv_W - + model->B3SOIPDpcdscb * Inv_LW; - pParam->B3SOIPDcdscd = model->B3SOIPDcdscd - + model->B3SOIPDlcdscd * Inv_L - + model->B3SOIPDwcdscd * Inv_W - + model->B3SOIPDpcdscd * Inv_LW; - pParam->B3SOIPDpclm = model->B3SOIPDpclm - + model->B3SOIPDlpclm * Inv_L - + model->B3SOIPDwpclm * Inv_W + model->B3SOIPDppclm * Inv_LW; - pParam->B3SOIPDpdibl1 = model->B3SOIPDpdibl1 - + model->B3SOIPDlpdibl1 * Inv_L - + model->B3SOIPDwpdibl1 * Inv_W - + model->B3SOIPDppdibl1 * Inv_LW; - pParam->B3SOIPDpdibl2 = model->B3SOIPDpdibl2 - + model->B3SOIPDlpdibl2 * Inv_L - + model->B3SOIPDwpdibl2 * Inv_W - + model->B3SOIPDppdibl2 * Inv_LW; - pParam->B3SOIPDpdiblb = model->B3SOIPDpdiblb - + model->B3SOIPDlpdiblb * Inv_L - + model->B3SOIPDwpdiblb * Inv_W - + model->B3SOIPDppdiblb * Inv_LW; - pParam->B3SOIPDdrout = model->B3SOIPDdrout - + model->B3SOIPDldrout * Inv_L - + model->B3SOIPDwdrout * Inv_W - + model->B3SOIPDpdrout * Inv_LW; - pParam->B3SOIPDpvag = model->B3SOIPDpvag - + model->B3SOIPDlpvag * Inv_L - + model->B3SOIPDwpvag * Inv_W + model->B3SOIPDppvag * Inv_LW; - pParam->B3SOIPDdelta = model->B3SOIPDdelta - + model->B3SOIPDldelta * Inv_L - + model->B3SOIPDwdelta * Inv_W - + model->B3SOIPDpdelta * Inv_LW; - pParam->B3SOIPDalpha0 = model->B3SOIPDalpha0 - + model->B3SOIPDlalpha0 * Inv_L - + model->B3SOIPDwalpha0 * Inv_W - + model->B3SOIPDpalpha0 * Inv_LW; - pParam->B3SOIPDfbjtii = model->B3SOIPDfbjtii - + model->B3SOIPDlfbjtii * Inv_L - + model->B3SOIPDwfbjtii * Inv_W - + model->B3SOIPDpfbjtii * Inv_LW; - pParam->B3SOIPDbeta0 = model->B3SOIPDbeta0 - + model->B3SOIPDlbeta0 * Inv_L - + model->B3SOIPDwbeta0 * Inv_W - + model->B3SOIPDpbeta0 * Inv_LW; - pParam->B3SOIPDbeta1 = model->B3SOIPDbeta1 - + model->B3SOIPDlbeta1 * Inv_L - + model->B3SOIPDwbeta1 * Inv_W - + model->B3SOIPDpbeta1 * Inv_LW; - pParam->B3SOIPDbeta2 = model->B3SOIPDbeta2 - + model->B3SOIPDlbeta2 * Inv_L - + model->B3SOIPDwbeta2 * Inv_W - + model->B3SOIPDpbeta2 * Inv_LW; - pParam->B3SOIPDvdsatii0 = model->B3SOIPDvdsatii0 - + model->B3SOIPDlvdsatii0 * Inv_L - + model->B3SOIPDwvdsatii0 * Inv_W - + model->B3SOIPDpvdsatii0 * Inv_LW; - pParam->B3SOIPDlii = model->B3SOIPDlii - + model->B3SOIPDllii * Inv_L - + model->B3SOIPDwlii * Inv_W + model->B3SOIPDplii * Inv_LW; - pParam->B3SOIPDesatii = model->B3SOIPDesatii - + model->B3SOIPDlesatii * Inv_L - + model->B3SOIPDwesatii * Inv_W - + model->B3SOIPDpesatii * Inv_LW; - pParam->B3SOIPDsii0 = model->B3SOIPDsii0 - + model->B3SOIPDlsii0 * Inv_L - + model->B3SOIPDwsii0 * Inv_W + model->B3SOIPDpsii0 * Inv_LW; - pParam->B3SOIPDsii1 = model->B3SOIPDsii1 - + model->B3SOIPDlsii1 * Inv_L - + model->B3SOIPDwsii1 * Inv_W + model->B3SOIPDpsii1 * Inv_LW; - pParam->B3SOIPDsii2 = model->B3SOIPDsii2 - + model->B3SOIPDlsii2 * Inv_L - + model->B3SOIPDwsii2 * Inv_W + model->B3SOIPDpsii2 * Inv_LW; - pParam->B3SOIPDsiid = model->B3SOIPDsiid - + model->B3SOIPDlsiid * Inv_L - + model->B3SOIPDwsiid * Inv_W + model->B3SOIPDpsiid * Inv_LW; - pParam->B3SOIPDagidl = model->B3SOIPDagidl - + model->B3SOIPDlagidl * Inv_L - + model->B3SOIPDwagidl * Inv_W - + model->B3SOIPDpagidl * Inv_LW; - pParam->B3SOIPDbgidl = model->B3SOIPDbgidl - + model->B3SOIPDlbgidl * Inv_L - + model->B3SOIPDwbgidl * Inv_W - + model->B3SOIPDpbgidl * Inv_LW; - pParam->B3SOIPDngidl = model->B3SOIPDngidl - + model->B3SOIPDlngidl * Inv_L - + model->B3SOIPDwngidl * Inv_W - + model->B3SOIPDpngidl * Inv_LW; - pParam->B3SOIPDntun = model->B3SOIPDntun - + model->B3SOIPDlntun * Inv_L - + model->B3SOIPDwntun * Inv_W + model->B3SOIPDpntun * Inv_LW; - pParam->B3SOIPDndiode = model->B3SOIPDndiode - + model->B3SOIPDlndiode * Inv_L - + model->B3SOIPDwndiode * Inv_W - + model->B3SOIPDpndiode * Inv_LW; - pParam->B3SOIPDnrecf0 = model->B3SOIPDnrecf0 - + model->B3SOIPDlnrecf0 * Inv_L - + model->B3SOIPDwnrecf0 * Inv_W - + model->B3SOIPDpnrecf0 * Inv_LW; - pParam->B3SOIPDnrecr0 = model->B3SOIPDnrecr0 - + model->B3SOIPDlnrecr0 * Inv_L - + model->B3SOIPDwnrecr0 * Inv_W - + model->B3SOIPDpnrecr0 * Inv_LW; - pParam->B3SOIPDisbjt = model->B3SOIPDisbjt - + model->B3SOIPDlisbjt * Inv_L - + model->B3SOIPDwisbjt * Inv_W - + model->B3SOIPDpisbjt * Inv_LW; - pParam->B3SOIPDisdif = model->B3SOIPDisdif - + model->B3SOIPDlisdif * Inv_L - + model->B3SOIPDwisdif * Inv_W - + model->B3SOIPDpisdif * Inv_LW; - pParam->B3SOIPDisrec = model->B3SOIPDisrec - + model->B3SOIPDlisrec * Inv_L - + model->B3SOIPDwisrec * Inv_W - + model->B3SOIPDpisrec * Inv_LW; - pParam->B3SOIPDistun = model->B3SOIPDistun - + model->B3SOIPDlistun * Inv_L - + model->B3SOIPDwistun * Inv_W - + model->B3SOIPDpistun * Inv_LW; - pParam->B3SOIPDvrec0 = model->B3SOIPDvrec0 - + model->B3SOIPDlvrec0 * Inv_L - + model->B3SOIPDwvrec0 * Inv_W - + model->B3SOIPDpvrec0 * Inv_LW; - pParam->B3SOIPDvtun0 = model->B3SOIPDvtun0 - + model->B3SOIPDlvtun0 * Inv_L - + model->B3SOIPDwvtun0 * Inv_W - + model->B3SOIPDpvtun0 * Inv_LW; - pParam->B3SOIPDnbjt = model->B3SOIPDnbjt - + model->B3SOIPDlnbjt * Inv_L - + model->B3SOIPDwnbjt * Inv_W + model->B3SOIPDpnbjt * Inv_LW; - pParam->B3SOIPDlbjt0 = model->B3SOIPDlbjt0 - + model->B3SOIPDllbjt0 * Inv_L - + model->B3SOIPDwlbjt0 * Inv_W - + model->B3SOIPDplbjt0 * Inv_LW; - pParam->B3SOIPDvabjt = model->B3SOIPDvabjt - + model->B3SOIPDlvabjt * Inv_L - + model->B3SOIPDwvabjt * Inv_W - + model->B3SOIPDpvabjt * Inv_LW; - pParam->B3SOIPDaely = model->B3SOIPDaely - + model->B3SOIPDlaely * Inv_L - + model->B3SOIPDwaely * Inv_W + model->B3SOIPDpaely * Inv_LW; - pParam->B3SOIPDahli = model->B3SOIPDahli - + model->B3SOIPDlahli * Inv_L - + model->B3SOIPDwahli * Inv_W + model->B3SOIPDpahli * Inv_LW; - /* CV model */ - pParam->B3SOIPDvsdfb = model->B3SOIPDvsdfb - + model->B3SOIPDlvsdfb * Inv_L - + model->B3SOIPDwvsdfb * Inv_W - + model->B3SOIPDpvsdfb * Inv_LW; - pParam->B3SOIPDvsdth = model->B3SOIPDvsdth - + model->B3SOIPDlvsdth * Inv_L - + model->B3SOIPDwvsdth * Inv_W - + model->B3SOIPDpvsdth * Inv_LW; - pParam->B3SOIPDdelvt = model->B3SOIPDdelvt - + model->B3SOIPDldelvt * Inv_L - + model->B3SOIPDwdelvt * Inv_W - + model->B3SOIPDpdelvt * Inv_LW; - pParam->B3SOIPDacde = model->B3SOIPDacde - + model->B3SOIPDlacde * Inv_L - + model->B3SOIPDwacde * Inv_W + model->B3SOIPDpacde * Inv_LW; - pParam->B3SOIPDmoin = model->B3SOIPDmoin - + model->B3SOIPDlmoin * Inv_L - + model->B3SOIPDwmoin * Inv_W + model->B3SOIPDpmoin * Inv_LW; - /* Added for binning - END */ - - T0 = (TempRatio - 1.0); - - pParam->B3SOIPDuatemp = pParam->B3SOIPDua; /* save ua, ub, and uc for b3soild.c */ - pParam->B3SOIPDubtemp = pParam->B3SOIPDub; - pParam->B3SOIPDuctemp = pParam->B3SOIPDuc; - pParam->B3SOIPDrds0denom = - pow (pParam->B3SOIPDweff * 1E6, pParam->B3SOIPDwr); +double tmp3, T7, T8, T9; + + + /* loop through all the B3SOIPD device models */ + for (; model != NULL; model = model->B3SOIPDnextModel) + { Temp = ckt->CKTtemp; + if (model->B3SOIPDGatesidewallJctPotential < 0.1) + model->B3SOIPDGatesidewallJctPotential = 0.1; + model->pSizeDependParamKnot = NULL; + pLastKnot = NULL; + + Tnom = model->B3SOIPDtnom; + TempRatio = Temp / Tnom; + + model->B3SOIPDvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); + model->B3SOIPDfactor1 = sqrt(EPSSI / EPSOX * model->B3SOIPDtox); + + Vtm0 = KboQ * Tnom; + Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); + model->B3SOIPDeg0 = Eg0; + model->B3SOIPDvtm = KboQ * Temp; + + Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); + /* ni is in cm^-3 */ + ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15) + * exp(21.5565981 - Eg / (2.0 * model->B3SOIPDvtm)); + + + /* loop through all the instances of the model */ + /* MCJ: Length and Width not initialized */ + for (here = model->B3SOIPDinstances; here != NULL; + here = here->B3SOIPDnextInstance) + { + + if (here->B3SOIPDowner != ARCHme) + continue; + + here->B3SOIPDrbodyext = here->B3SOIPDbodySquares * + model->B3SOIPDrbsh; + pSizeDependParamKnot = model->pSizeDependParamKnot; + Size_Not_Found = 1; + while ((pSizeDependParamKnot != NULL) && Size_Not_Found) + { if ((here->B3SOIPDl == pSizeDependParamKnot->Length) + && (here->B3SOIPDw == pSizeDependParamKnot->Width) + && (here->B3SOIPDrth0 == pSizeDependParamKnot->Rth0) + && (here->B3SOIPDcth0 == pSizeDependParamKnot->Cth0)) + { Size_Not_Found = 0; + here->pParam = pSizeDependParamKnot; + pParam = here->pParam; /* v2.2.3 bug fix */ + } + else + { pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = pSizeDependParamKnot->pNext; + } + } + + if (Size_Not_Found) + { pParam = (struct b3soipdSizeDependParam *)xmalloc( + sizeof(struct b3soipdSizeDependParam)); + if (pLastKnot == NULL) + model->pSizeDependParamKnot = pParam; + else + pLastKnot->pNext = pParam; + pParam->pNext = NULL; + here->pParam = pParam; + + Ldrn = here->B3SOIPDl; + Wdrn = here->B3SOIPDw; + pParam->Length = Ldrn; + pParam->Width = Wdrn; + pParam->Rth0 = here->B3SOIPDrth0; + pParam->Cth0 = here->B3SOIPDcth0; + + T0 = pow(Ldrn, model->B3SOIPDLln); + T1 = pow(Wdrn, model->B3SOIPDLwn); + tmp1 = model->B3SOIPDLl / T0 + model->B3SOIPDLw / T1 + + model->B3SOIPDLwl / (T0 * T1); + pParam->B3SOIPDdl = model->B3SOIPDLint + tmp1; + +/* v2.2.3 */ + tmp1 = model->B3SOIPDLlc / T0 + model->B3SOIPDLwc / T1 + + model->B3SOIPDLwlc / (T0 * T1); + pParam->B3SOIPDdlc = model->B3SOIPDdlc + tmp1; + + + T2 = pow(Ldrn, model->B3SOIPDWln); + T3 = pow(Wdrn, model->B3SOIPDWwn); + tmp2 = model->B3SOIPDWl / T2 + model->B3SOIPDWw / T3 + + model->B3SOIPDWwl / (T2 * T3); + pParam->B3SOIPDdw = model->B3SOIPDWint + tmp2; + +/* v2.2.3 */ + tmp2 = model->B3SOIPDWlc / T2 + model->B3SOIPDWwc / T3 + + model->B3SOIPDWwlc / (T2 * T3); + pParam->B3SOIPDdwc = model->B3SOIPDdwc + tmp2; + + + pParam->B3SOIPDleff = here->B3SOIPDl - 2.0 * pParam->B3SOIPDdl; + if (pParam->B3SOIPDleff <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->B3SOIPDmodName; + namarray[1] = here->B3SOIPDname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B3SOIPD: mosfet %s, model %s: Effective channel length <= 0", + namarray); + return(E_BADPARM); + } + + pParam->B3SOIPDweff = here->B3SOIPDw - here->B3SOIPDnbc * model->B3SOIPDdwbc + - (2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdw; + if (pParam->B3SOIPDweff <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->B3SOIPDmodName; + namarray[1] = here->B3SOIPDname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B3SOIPD: mosfet %s, model %s: Effective channel width <= 0", + namarray); + return(E_BADPARM); + } + + pParam->B3SOIPDwdiod = pParam->B3SOIPDweff / here->B3SOIPDnseg + here->B3SOIPDpdbcp; + pParam->B3SOIPDwdios = pParam->B3SOIPDweff / here->B3SOIPDnseg + here->B3SOIPDpsbcp; + + pParam->B3SOIPDleffCV = here->B3SOIPDl - 2.0 * pParam->B3SOIPDdlc; + if (pParam->B3SOIPDleffCV <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->B3SOIPDmodName; + namarray[1] = here->B3SOIPDname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B3SOIPD: mosfet %s, model %s: Effective channel length for C-V <= 0", + namarray); + return(E_BADPARM); + } + + pParam->B3SOIPDweffCV = here->B3SOIPDw - here->B3SOIPDnbc * model->B3SOIPDdwbc + - (2.0 - here->B3SOIPDnbc) * pParam->B3SOIPDdwc; + if (pParam->B3SOIPDweffCV <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->B3SOIPDmodName; + namarray[1] = here->B3SOIPDname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B3SOIPD: mosfet %s, model %s: Effective channel width for C-V <= 0", + namarray); + return(E_BADPARM); + } + + pParam->B3SOIPDwdiodCV = pParam->B3SOIPDweffCV / here->B3SOIPDnseg + here->B3SOIPDpdbcp; + pParam->B3SOIPDwdiosCV = pParam->B3SOIPDweffCV / here->B3SOIPDnseg + here->B3SOIPDpsbcp; + + pParam->B3SOIPDleffCVb = here->B3SOIPDl - 2.0 * pParam->B3SOIPDdlc - model->B3SOIPDdlcb; + if (pParam->B3SOIPDleffCVb <= 0.0) + { + IFuid namarray[2]; + namarray[0] = model->B3SOIPDmodName; + namarray[1] = here->B3SOIPDname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B3SOIPD: mosfet %s, model %s: Effective channel length for C-V (body) <= 0", + namarray); + return(E_BADPARM); + } + + pParam->B3SOIPDleffCVbg = pParam->B3SOIPDleffCVb + 2 * model->B3SOIPDdlbg; + if (pParam->B3SOIPDleffCVbg <= 0.0) + { + IFuid namarray[2]; + namarray[0] = model->B3SOIPDmodName; + namarray[1] = here->B3SOIPDname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B3SOIPD: mosfet %s, model %s: Effective channel length for C-V (backgate) <= 0", + namarray); + return(E_BADPARM); + } + + /* Not binned - START */ + pParam->B3SOIPDat = model->B3SOIPDat; + pParam->B3SOIPDgamma1 = model->B3SOIPDgamma1; + pParam->B3SOIPDgamma2 = model->B3SOIPDgamma2; + pParam->B3SOIPDvbx = model->B3SOIPDvbx; + pParam->B3SOIPDvbm = model->B3SOIPDvbm; + pParam->B3SOIPDxt = model->B3SOIPDxt; + pParam->B3SOIPDkt1 = model->B3SOIPDkt1; + pParam->B3SOIPDkt1l = model->B3SOIPDkt1l; + pParam->B3SOIPDkt2 = model->B3SOIPDkt2; + pParam->B3SOIPDua1 = model->B3SOIPDua1; + pParam->B3SOIPDub1 = model->B3SOIPDub1; + pParam->B3SOIPDuc1 = model->B3SOIPDuc1; + pParam->B3SOIPDute = model->B3SOIPDute; + pParam->B3SOIPDprt = model->B3SOIPDprt; + /* Not binned - END */ + + /* CV model */ + pParam->B3SOIPDcgsl = model->B3SOIPDcgsl; + pParam->B3SOIPDcgdl = model->B3SOIPDcgdl; + pParam->B3SOIPDckappa = model->B3SOIPDckappa; + pParam->B3SOIPDcf = model->B3SOIPDcf; + pParam->B3SOIPDclc = model->B3SOIPDclc; + pParam->B3SOIPDcle = model->B3SOIPDcle; + + pParam->B3SOIPDabulkCVfactor = 1.0 + pow((pParam->B3SOIPDclc / pParam->B3SOIPDleff), + pParam->B3SOIPDcle); + + /* Added for binning - START */ + if (model->B3SOIPDbinUnit == 1) + { Inv_L = 1.0e-6 / pParam->B3SOIPDleff; + Inv_W = 1.0e-6 / pParam->B3SOIPDweff; + Inv_LW = 1.0e-12 / (pParam->B3SOIPDleff + * pParam->B3SOIPDweff); + } + else + { Inv_L = 1.0 / pParam->B3SOIPDleff; + Inv_W = 1.0 / pParam->B3SOIPDweff; + Inv_LW = 1.0 / (pParam->B3SOIPDleff + * pParam->B3SOIPDweff); + } + pParam->B3SOIPDnpeak = model->B3SOIPDnpeak + + model->B3SOIPDlnpeak * Inv_L + + model->B3SOIPDwnpeak * Inv_W + + model->B3SOIPDpnpeak * Inv_LW; + pParam->B3SOIPDnsub = model->B3SOIPDnsub + + model->B3SOIPDlnsub * Inv_L + + model->B3SOIPDwnsub * Inv_W + + model->B3SOIPDpnsub * Inv_LW; + pParam->B3SOIPDngate = model->B3SOIPDngate + + model->B3SOIPDlngate * Inv_L + + model->B3SOIPDwngate * Inv_W + + model->B3SOIPDpngate * Inv_LW; + pParam->B3SOIPDvth0 = model->B3SOIPDvth0 + + model->B3SOIPDlvth0 * Inv_L + + model->B3SOIPDwvth0 * Inv_W + + model->B3SOIPDpvth0 * Inv_LW; + pParam->B3SOIPDk1 = model->B3SOIPDk1 + + model->B3SOIPDlk1 * Inv_L + + model->B3SOIPDwk1 * Inv_W + + model->B3SOIPDpk1 * Inv_LW; + pParam->B3SOIPDk2 = model->B3SOIPDk2 + + model->B3SOIPDlk2 * Inv_L + + model->B3SOIPDwk2 * Inv_W + + model->B3SOIPDpk2 * Inv_LW; + pParam->B3SOIPDk1w1 = model->B3SOIPDk1w1 + + model->B3SOIPDlk1w1 * Inv_L + + model->B3SOIPDwk1w1 * Inv_W + + model->B3SOIPDpk1w1 * Inv_LW; + pParam->B3SOIPDk1w2 = model->B3SOIPDk1w2 + + model->B3SOIPDlk1w2 * Inv_L + + model->B3SOIPDwk1w2 * Inv_W + + model->B3SOIPDpk1w2 * Inv_LW; + pParam->B3SOIPDk3 = model->B3SOIPDk3 + + model->B3SOIPDlk3 * Inv_L + + model->B3SOIPDwk3 * Inv_W + + model->B3SOIPDpk3 * Inv_LW; + pParam->B3SOIPDk3b = model->B3SOIPDk3b + + model->B3SOIPDlk3b * Inv_L + + model->B3SOIPDwk3b * Inv_W + + model->B3SOIPDpk3b * Inv_LW; + pParam->B3SOIPDkb1 = model->B3SOIPDkb1 + + model->B3SOIPDlkb1 * Inv_L + + model->B3SOIPDwkb1 * Inv_W + + model->B3SOIPDpkb1 * Inv_LW; + pParam->B3SOIPDw0 = model->B3SOIPDw0 + + model->B3SOIPDlw0 * Inv_L + + model->B3SOIPDww0 * Inv_W + + model->B3SOIPDpw0 * Inv_LW; + pParam->B3SOIPDnlx = model->B3SOIPDnlx + + model->B3SOIPDlnlx * Inv_L + + model->B3SOIPDwnlx * Inv_W + + model->B3SOIPDpnlx * Inv_LW; + pParam->B3SOIPDdvt0 = model->B3SOIPDdvt0 + + model->B3SOIPDldvt0 * Inv_L + + model->B3SOIPDwdvt0 * Inv_W + + model->B3SOIPDpdvt0 * Inv_LW; + pParam->B3SOIPDdvt1 = model->B3SOIPDdvt1 + + model->B3SOIPDldvt1 * Inv_L + + model->B3SOIPDwdvt1 * Inv_W + + model->B3SOIPDpdvt1 * Inv_LW; + pParam->B3SOIPDdvt2 = model->B3SOIPDdvt2 + + model->B3SOIPDldvt2 * Inv_L + + model->B3SOIPDwdvt2 * Inv_W + + model->B3SOIPDpdvt2 * Inv_LW; + pParam->B3SOIPDdvt0w = model->B3SOIPDdvt0w + + model->B3SOIPDldvt0w * Inv_L + + model->B3SOIPDwdvt0w * Inv_W + + model->B3SOIPDpdvt0w * Inv_LW; + pParam->B3SOIPDdvt1w = model->B3SOIPDdvt1w + + model->B3SOIPDldvt1w * Inv_L + + model->B3SOIPDwdvt1w * Inv_W + + model->B3SOIPDpdvt1w * Inv_LW; + pParam->B3SOIPDdvt2w = model->B3SOIPDdvt2w + + model->B3SOIPDldvt2w * Inv_L + + model->B3SOIPDwdvt2w * Inv_W + + model->B3SOIPDpdvt2w * Inv_LW; + pParam->B3SOIPDu0 = model->B3SOIPDu0 + + model->B3SOIPDlu0 * Inv_L + + model->B3SOIPDwu0 * Inv_W + + model->B3SOIPDpu0 * Inv_LW; + pParam->B3SOIPDua = model->B3SOIPDua + + model->B3SOIPDlua * Inv_L + + model->B3SOIPDwua * Inv_W + + model->B3SOIPDpua * Inv_LW; + pParam->B3SOIPDub = model->B3SOIPDub + + model->B3SOIPDlub * Inv_L + + model->B3SOIPDwub * Inv_W + + model->B3SOIPDpub * Inv_LW; + pParam->B3SOIPDuc = model->B3SOIPDuc + + model->B3SOIPDluc * Inv_L + + model->B3SOIPDwuc * Inv_W + + model->B3SOIPDpuc * Inv_LW; + pParam->B3SOIPDvsat = model->B3SOIPDvsat + + model->B3SOIPDlvsat * Inv_L + + model->B3SOIPDwvsat * Inv_W + + model->B3SOIPDpvsat * Inv_LW; + pParam->B3SOIPDa0 = model->B3SOIPDa0 + + model->B3SOIPDla0 * Inv_L + + model->B3SOIPDwa0 * Inv_W + + model->B3SOIPDpa0 * Inv_LW; + pParam->B3SOIPDags = model->B3SOIPDags + + model->B3SOIPDlags * Inv_L + + model->B3SOIPDwags * Inv_W + + model->B3SOIPDpags * Inv_LW; + pParam->B3SOIPDb0 = model->B3SOIPDb0 + + model->B3SOIPDlb0 * Inv_L + + model->B3SOIPDwb0 * Inv_W + + model->B3SOIPDpb0 * Inv_LW; + pParam->B3SOIPDb1 = model->B3SOIPDb1 + + model->B3SOIPDlb1 * Inv_L + + model->B3SOIPDwb1 * Inv_W + + model->B3SOIPDpb1 * Inv_LW; + pParam->B3SOIPDketa = model->B3SOIPDketa + + model->B3SOIPDlketa * Inv_L + + model->B3SOIPDwketa * Inv_W + + model->B3SOIPDpketa * Inv_LW; + pParam->B3SOIPDketas = model->B3SOIPDketas + + model->B3SOIPDlketas * Inv_L + + model->B3SOIPDwketas * Inv_W + + model->B3SOIPDpketas * Inv_LW; + pParam->B3SOIPDa1 = model->B3SOIPDa1 + + model->B3SOIPDla1 * Inv_L + + model->B3SOIPDwa1 * Inv_W + + model->B3SOIPDpa1 * Inv_LW; + pParam->B3SOIPDa2 = model->B3SOIPDa2 + + model->B3SOIPDla2 * Inv_L + + model->B3SOIPDwa2 * Inv_W + + model->B3SOIPDpa2 * Inv_LW; + pParam->B3SOIPDrdsw = model->B3SOIPDrdsw + + model->B3SOIPDlrdsw * Inv_L + + model->B3SOIPDwrdsw * Inv_W + + model->B3SOIPDprdsw * Inv_LW; + pParam->B3SOIPDprwb = model->B3SOIPDprwb + + model->B3SOIPDlprwb * Inv_L + + model->B3SOIPDwprwb * Inv_W + + model->B3SOIPDpprwb * Inv_LW; + pParam->B3SOIPDprwg = model->B3SOIPDprwg + + model->B3SOIPDlprwg * Inv_L + + model->B3SOIPDwprwg * Inv_W + + model->B3SOIPDpprwg * Inv_LW; + pParam->B3SOIPDwr = model->B3SOIPDwr + + model->B3SOIPDlwr * Inv_L + + model->B3SOIPDwwr * Inv_W + + model->B3SOIPDpwr * Inv_LW; + pParam->B3SOIPDnfactor = model->B3SOIPDnfactor + + model->B3SOIPDlnfactor * Inv_L + + model->B3SOIPDwnfactor * Inv_W + + model->B3SOIPDpnfactor * Inv_LW; + pParam->B3SOIPDdwg = model->B3SOIPDdwg + + model->B3SOIPDldwg * Inv_L + + model->B3SOIPDwdwg * Inv_W + + model->B3SOIPDpdwg * Inv_LW; + pParam->B3SOIPDdwb = model->B3SOIPDdwb + + model->B3SOIPDldwb * Inv_L + + model->B3SOIPDwdwb * Inv_W + + model->B3SOIPDpdwb * Inv_LW; + pParam->B3SOIPDvoff = model->B3SOIPDvoff + + model->B3SOIPDlvoff * Inv_L + + model->B3SOIPDwvoff * Inv_W + + model->B3SOIPDpvoff * Inv_LW; + pParam->B3SOIPDeta0 = model->B3SOIPDeta0 + + model->B3SOIPDleta0 * Inv_L + + model->B3SOIPDweta0 * Inv_W + + model->B3SOIPDpeta0 * Inv_LW; + pParam->B3SOIPDetab = model->B3SOIPDetab + + model->B3SOIPDletab * Inv_L + + model->B3SOIPDwetab * Inv_W + + model->B3SOIPDpetab * Inv_LW; + pParam->B3SOIPDdsub = model->B3SOIPDdsub + + model->B3SOIPDldsub * Inv_L + + model->B3SOIPDwdsub * Inv_W + + model->B3SOIPDpdsub * Inv_LW; + pParam->B3SOIPDcit = model->B3SOIPDcit + + model->B3SOIPDlcit * Inv_L + + model->B3SOIPDwcit * Inv_W + + model->B3SOIPDpcit * Inv_LW; + pParam->B3SOIPDcdsc = model->B3SOIPDcdsc + + model->B3SOIPDlcdsc * Inv_L + + model->B3SOIPDwcdsc * Inv_W + + model->B3SOIPDpcdsc * Inv_LW; + pParam->B3SOIPDcdscb = model->B3SOIPDcdscb + + model->B3SOIPDlcdscb * Inv_L + + model->B3SOIPDwcdscb * Inv_W + + model->B3SOIPDpcdscb * Inv_LW; + pParam->B3SOIPDcdscd = model->B3SOIPDcdscd + + model->B3SOIPDlcdscd * Inv_L + + model->B3SOIPDwcdscd * Inv_W + + model->B3SOIPDpcdscd * Inv_LW; + pParam->B3SOIPDpclm = model->B3SOIPDpclm + + model->B3SOIPDlpclm * Inv_L + + model->B3SOIPDwpclm * Inv_W + + model->B3SOIPDppclm * Inv_LW; + pParam->B3SOIPDpdibl1 = model->B3SOIPDpdibl1 + + model->B3SOIPDlpdibl1 * Inv_L + + model->B3SOIPDwpdibl1 * Inv_W + + model->B3SOIPDppdibl1 * Inv_LW; + pParam->B3SOIPDpdibl2 = model->B3SOIPDpdibl2 + + model->B3SOIPDlpdibl2 * Inv_L + + model->B3SOIPDwpdibl2 * Inv_W + + model->B3SOIPDppdibl2 * Inv_LW; + pParam->B3SOIPDpdiblb = model->B3SOIPDpdiblb + + model->B3SOIPDlpdiblb * Inv_L + + model->B3SOIPDwpdiblb * Inv_W + + model->B3SOIPDppdiblb * Inv_LW; + pParam->B3SOIPDdrout = model->B3SOIPDdrout + + model->B3SOIPDldrout * Inv_L + + model->B3SOIPDwdrout * Inv_W + + model->B3SOIPDpdrout * Inv_LW; + pParam->B3SOIPDpvag = model->B3SOIPDpvag + + model->B3SOIPDlpvag * Inv_L + + model->B3SOIPDwpvag * Inv_W + + model->B3SOIPDppvag * Inv_LW; + pParam->B3SOIPDdelta = model->B3SOIPDdelta + + model->B3SOIPDldelta * Inv_L + + model->B3SOIPDwdelta * Inv_W + + model->B3SOIPDpdelta * Inv_LW; + pParam->B3SOIPDalpha0 = model->B3SOIPDalpha0 + + model->B3SOIPDlalpha0 * Inv_L + + model->B3SOIPDwalpha0 * Inv_W + + model->B3SOIPDpalpha0 * Inv_LW; + pParam->B3SOIPDfbjtii = model->B3SOIPDfbjtii + + model->B3SOIPDlfbjtii * Inv_L + + model->B3SOIPDwfbjtii * Inv_W + + model->B3SOIPDpfbjtii * Inv_LW; + pParam->B3SOIPDbeta0 = model->B3SOIPDbeta0 + + model->B3SOIPDlbeta0 * Inv_L + + model->B3SOIPDwbeta0 * Inv_W + + model->B3SOIPDpbeta0 * Inv_LW; + pParam->B3SOIPDbeta1 = model->B3SOIPDbeta1 + + model->B3SOIPDlbeta1 * Inv_L + + model->B3SOIPDwbeta1 * Inv_W + + model->B3SOIPDpbeta1 * Inv_LW; + pParam->B3SOIPDbeta2 = model->B3SOIPDbeta2 + + model->B3SOIPDlbeta2 * Inv_L + + model->B3SOIPDwbeta2 * Inv_W + + model->B3SOIPDpbeta2 * Inv_LW; + pParam->B3SOIPDvdsatii0 = model->B3SOIPDvdsatii0 + + model->B3SOIPDlvdsatii0 * Inv_L + + model->B3SOIPDwvdsatii0 * Inv_W + + model->B3SOIPDpvdsatii0 * Inv_LW; + pParam->B3SOIPDlii = model->B3SOIPDlii + + model->B3SOIPDllii * Inv_L + + model->B3SOIPDwlii * Inv_W + + model->B3SOIPDplii * Inv_LW; + pParam->B3SOIPDesatii = model->B3SOIPDesatii + + model->B3SOIPDlesatii * Inv_L + + model->B3SOIPDwesatii * Inv_W + + model->B3SOIPDpesatii * Inv_LW; + pParam->B3SOIPDsii0 = model->B3SOIPDsii0 + + model->B3SOIPDlsii0 * Inv_L + + model->B3SOIPDwsii0 * Inv_W + + model->B3SOIPDpsii0 * Inv_LW; + pParam->B3SOIPDsii1 = model->B3SOIPDsii1 + + model->B3SOIPDlsii1 * Inv_L + + model->B3SOIPDwsii1 * Inv_W + + model->B3SOIPDpsii1 * Inv_LW; + pParam->B3SOIPDsii2 = model->B3SOIPDsii2 + + model->B3SOIPDlsii2 * Inv_L + + model->B3SOIPDwsii2 * Inv_W + + model->B3SOIPDpsii2 * Inv_LW; + pParam->B3SOIPDsiid = model->B3SOIPDsiid + + model->B3SOIPDlsiid * Inv_L + + model->B3SOIPDwsiid * Inv_W + + model->B3SOIPDpsiid * Inv_LW; + pParam->B3SOIPDagidl = model->B3SOIPDagidl + + model->B3SOIPDlagidl * Inv_L + + model->B3SOIPDwagidl * Inv_W + + model->B3SOIPDpagidl * Inv_LW; + pParam->B3SOIPDbgidl = model->B3SOIPDbgidl + + model->B3SOIPDlbgidl * Inv_L + + model->B3SOIPDwbgidl * Inv_W + + model->B3SOIPDpbgidl * Inv_LW; + pParam->B3SOIPDngidl = model->B3SOIPDngidl + + model->B3SOIPDlngidl * Inv_L + + model->B3SOIPDwngidl * Inv_W + + model->B3SOIPDpngidl * Inv_LW; + pParam->B3SOIPDntun = model->B3SOIPDntun + + model->B3SOIPDlntun * Inv_L + + model->B3SOIPDwntun * Inv_W + + model->B3SOIPDpntun * Inv_LW; + pParam->B3SOIPDndiode = model->B3SOIPDndiode + + model->B3SOIPDlndiode * Inv_L + + model->B3SOIPDwndiode * Inv_W + + model->B3SOIPDpndiode * Inv_LW; + pParam->B3SOIPDnrecf0 = model->B3SOIPDnrecf0 + + model->B3SOIPDlnrecf0 * Inv_L + + model->B3SOIPDwnrecf0 * Inv_W + + model->B3SOIPDpnrecf0 * Inv_LW; + pParam->B3SOIPDnrecr0 = model->B3SOIPDnrecr0 + + model->B3SOIPDlnrecr0 * Inv_L + + model->B3SOIPDwnrecr0 * Inv_W + + model->B3SOIPDpnrecr0 * Inv_LW; + pParam->B3SOIPDisbjt = model->B3SOIPDisbjt + + model->B3SOIPDlisbjt * Inv_L + + model->B3SOIPDwisbjt * Inv_W + + model->B3SOIPDpisbjt * Inv_LW; + pParam->B3SOIPDisdif = model->B3SOIPDisdif + + model->B3SOIPDlisdif * Inv_L + + model->B3SOIPDwisdif * Inv_W + + model->B3SOIPDpisdif * Inv_LW; + pParam->B3SOIPDisrec = model->B3SOIPDisrec + + model->B3SOIPDlisrec * Inv_L + + model->B3SOIPDwisrec * Inv_W + + model->B3SOIPDpisrec * Inv_LW; + pParam->B3SOIPDistun = model->B3SOIPDistun + + model->B3SOIPDlistun * Inv_L + + model->B3SOIPDwistun * Inv_W + + model->B3SOIPDpistun * Inv_LW; + pParam->B3SOIPDvrec0 = model->B3SOIPDvrec0 + + model->B3SOIPDlvrec0 * Inv_L + + model->B3SOIPDwvrec0 * Inv_W + + model->B3SOIPDpvrec0 * Inv_LW; + pParam->B3SOIPDvtun0 = model->B3SOIPDvtun0 + + model->B3SOIPDlvtun0 * Inv_L + + model->B3SOIPDwvtun0 * Inv_W + + model->B3SOIPDpvtun0 * Inv_LW; + pParam->B3SOIPDnbjt = model->B3SOIPDnbjt + + model->B3SOIPDlnbjt * Inv_L + + model->B3SOIPDwnbjt * Inv_W + + model->B3SOIPDpnbjt * Inv_LW; + pParam->B3SOIPDlbjt0 = model->B3SOIPDlbjt0 + + model->B3SOIPDllbjt0 * Inv_L + + model->B3SOIPDwlbjt0 * Inv_W + + model->B3SOIPDplbjt0 * Inv_LW; + pParam->B3SOIPDvabjt = model->B3SOIPDvabjt + + model->B3SOIPDlvabjt * Inv_L + + model->B3SOIPDwvabjt * Inv_W + + model->B3SOIPDpvabjt * Inv_LW; + pParam->B3SOIPDaely = model->B3SOIPDaely + + model->B3SOIPDlaely * Inv_L + + model->B3SOIPDwaely * Inv_W + + model->B3SOIPDpaely * Inv_LW; + pParam->B3SOIPDahli = model->B3SOIPDahli + + model->B3SOIPDlahli * Inv_L + + model->B3SOIPDwahli * Inv_W + + model->B3SOIPDpahli * Inv_LW; + /* CV model */ + pParam->B3SOIPDvsdfb = model->B3SOIPDvsdfb + + model->B3SOIPDlvsdfb * Inv_L + + model->B3SOIPDwvsdfb * Inv_W + + model->B3SOIPDpvsdfb * Inv_LW; + pParam->B3SOIPDvsdth = model->B3SOIPDvsdth + + model->B3SOIPDlvsdth * Inv_L + + model->B3SOIPDwvsdth * Inv_W + + model->B3SOIPDpvsdth * Inv_LW; + pParam->B3SOIPDdelvt = model->B3SOIPDdelvt + + model->B3SOIPDldelvt * Inv_L + + model->B3SOIPDwdelvt * Inv_W + + model->B3SOIPDpdelvt * Inv_LW; + pParam->B3SOIPDacde = model->B3SOIPDacde + + model->B3SOIPDlacde * Inv_L + + model->B3SOIPDwacde * Inv_W + + model->B3SOIPDpacde * Inv_LW; + pParam->B3SOIPDmoin = model->B3SOIPDmoin + + model->B3SOIPDlmoin * Inv_L + + model->B3SOIPDwmoin * Inv_W + + model->B3SOIPDpmoin * Inv_LW; + /* Added for binning - END */ + + T0 = (TempRatio - 1.0); + + pParam->B3SOIPDuatemp = pParam->B3SOIPDua; /* save ua, ub, and uc for b3soipdld.c */ + pParam->B3SOIPDubtemp = pParam->B3SOIPDub; + pParam->B3SOIPDuctemp = pParam->B3SOIPDuc; + pParam->B3SOIPDrds0denom = pow(pParam->B3SOIPDweff * 1E6, pParam->B3SOIPDwr); /* v2.2 release */ - pParam->B3SOIPDrth = - here->B3SOIPDrth0 / (pParam->B3SOIPDweff + - model->B3SOIPDwth0) * here->B3SOIPDnseg; - pParam->B3SOIPDcth = - here->B3SOIPDcth0 * (pParam->B3SOIPDweff + - model->B3SOIPDwth0) / here->B3SOIPDnseg; - pParam->B3SOIPDrbody = - model->B3SOIPDrbody * model->B3SOIPDrhalo / (2 * - model-> - B3SOIPDrbody + - model-> - B3SOIPDrhalo * - pParam-> - B3SOIPDleff) * - pParam->B3SOIPDweff / here->B3SOIPDnseg; - - pParam->B3SOIPDoxideRatio = - pow (model->B3SOIPDtoxref / model->B3SOIPDtoxqm, - model->B3SOIPDntox) / model->B3SOIPDtoxqm / - model->B3SOIPDtoxqm; + pParam->B3SOIPDrth = here->B3SOIPDrth0 / (pParam->B3SOIPDweff + model->B3SOIPDwth0) + * here->B3SOIPDnseg; + pParam->B3SOIPDcth = here->B3SOIPDcth0 * (pParam->B3SOIPDweff + model->B3SOIPDwth0) + / here->B3SOIPDnseg; + +/* v2.2.2 adding layout-dependent Frbody multiplier */ + pParam->B3SOIPDrbody = here->B3SOIPDfrbody *model->B3SOIPDrbody * model->B3SOIPDrhalo + / (2 * model->B3SOIPDrbody + model->B3SOIPDrhalo * pParam->B3SOIPDleff) + * pParam->B3SOIPDweff / here->B3SOIPDnseg; + + pParam->B3SOIPDoxideRatio = pow(model->B3SOIPDtoxref/model->B3SOIPDtoxqm, + model->B3SOIPDntox) /model->B3SOIPDtoxqm/model->B3SOIPDtoxqm; /* v2.2 release */ - pParam->B3SOIPDua = pParam->B3SOIPDua + pParam->B3SOIPDua1 * T0; - pParam->B3SOIPDub = pParam->B3SOIPDub + pParam->B3SOIPDub1 * T0; - pParam->B3SOIPDuc = pParam->B3SOIPDuc + pParam->B3SOIPDuc1 * T0; - if (pParam->B3SOIPDu0 > 1.0) - pParam->B3SOIPDu0 = pParam->B3SOIPDu0 / 1.0e4; - - pParam->B3SOIPDu0temp = pParam->B3SOIPDu0 - * pow (TempRatio, pParam->B3SOIPDute); - pParam->B3SOIPDvsattemp = - pParam->B3SOIPDvsat - pParam->B3SOIPDat * T0; - pParam->B3SOIPDrds0 = - (pParam->B3SOIPDrdsw + - pParam->B3SOIPDprt * T0) / pow (pParam->B3SOIPDweff * 1E6, - pParam->B3SOIPDwr); - - if (B3SOIPDcheckModel (model, here, ckt)) - { - IFuid namarray[2]; - namarray[0] = model->B3SOIPDmodName; - namarray[1] = here->B3SOIPDname; - - (*(SPfrontEnd->IFerror)) (ERR_FATAL, - "Fatal error(s) detected during B3SOIPDV3 parameter checking for %s in model %s", - namarray); - return (E_BADPARM); - } - - - pParam->B3SOIPDcgdo = (model->B3SOIPDcgdo + pParam->B3SOIPDcf) - * pParam->B3SOIPDwdiodCV; - pParam->B3SOIPDcgso = (model->B3SOIPDcgso + pParam->B3SOIPDcf) - * pParam->B3SOIPDwdiosCV; - - pParam->B3SOIPDcgeo = model->B3SOIPDcgeo - * pParam->B3SOIPDleffCV; - - - if (!model->B3SOIPDnpeakGiven && model->B3SOIPDgamma1Given) - { - T0 = pParam->B3SOIPDgamma1 * model->B3SOIPDcox; - pParam->B3SOIPDnpeak = 3.021E22 * T0 * T0; - } - - - T4 = Eg300 / model->B3SOIPDvtm * (TempRatio - 1.0); - T7 = model->B3SOIPDxbjt * T4 / pParam->B3SOIPDndiode; - DEXP (T7, T0); - T7 = model->B3SOIPDxdif * T4 / pParam->B3SOIPDndiode; - DEXP (T7, T1); - T7 = model->B3SOIPDxrec * T4 / pParam->B3SOIPDnrecf0; - DEXP (T7, T2); - - pParam->B3SOIPDahli = pParam->B3SOIPDahli * T0; - - pParam->B3SOIPDjbjt = pParam->B3SOIPDisbjt * T0; - pParam->B3SOIPDjdif = pParam->B3SOIPDisdif * T1; - pParam->B3SOIPDjrec = pParam->B3SOIPDisrec * T2; - - T7 = model->B3SOIPDxtun * (TempRatio - 1); - DEXP (T7, T0); - pParam->B3SOIPDjtun = pParam->B3SOIPDistun * T0; - - - if (pParam->B3SOIPDnsub > 0) - pParam->B3SOIPDvfbb = - -model->B3SOIPDtype * model->B3SOIPDvtm * - log (pParam->B3SOIPDnpeak / pParam->B3SOIPDnsub); - else - pParam->B3SOIPDvfbb = - -model->B3SOIPDtype * model->B3SOIPDvtm * - log (-pParam->B3SOIPDnpeak * pParam->B3SOIPDnsub / ni / ni); - - if (!model->B3SOIPDvsdfbGiven) - { - if (pParam->B3SOIPDnsub > 0) - pParam->B3SOIPDvsdfb = - -model->B3SOIPDtype * (model->B3SOIPDvtm * - log (1e20 * pParam->B3SOIPDnsub / - ni / ni) - 0.3); - else if (pParam->B3SOIPDnsub < 0) - pParam->B3SOIPDvsdfb = - -model->B3SOIPDtype * (model->B3SOIPDvtm * - log (-1e20 / - pParam->B3SOIPDnsub) + 0.3); - } - - /* Phi & Gamma */ - SDphi = - 2.0 * model->B3SOIPDvtm * log (fabs (pParam->B3SOIPDnsub) / - ni); - SDgamma = - 5.753e-12 * sqrt (fabs (pParam->B3SOIPDnsub)) / - model->B3SOIPDcbox; - - if (!model->B3SOIPDvsdthGiven) - { - if (((pParam->B3SOIPDnsub > 0) && (model->B3SOIPDtype > 0)) - || ((pParam->B3SOIPDnsub < 0) - && (model->B3SOIPDtype < 0))) - pParam->B3SOIPDvsdth = - pParam->B3SOIPDvsdfb + SDphi + SDgamma * sqrt (SDphi); + pParam->B3SOIPDua = pParam->B3SOIPDua + pParam->B3SOIPDua1 * T0; + pParam->B3SOIPDub = pParam->B3SOIPDub + pParam->B3SOIPDub1 * T0; + pParam->B3SOIPDuc = pParam->B3SOIPDuc + pParam->B3SOIPDuc1 * T0; + if (pParam->B3SOIPDu0 > 1.0) + pParam->B3SOIPDu0 = pParam->B3SOIPDu0 / 1.0e4; + + pParam->B3SOIPDu0temp = pParam->B3SOIPDu0 + * pow(TempRatio, pParam->B3SOIPDute); + pParam->B3SOIPDvsattemp = pParam->B3SOIPDvsat - pParam->B3SOIPDat + * T0; + pParam->B3SOIPDrds0 = (pParam->B3SOIPDrdsw + pParam->B3SOIPDprt * T0) + / pow(pParam->B3SOIPDweff * 1E6, pParam->B3SOIPDwr); + + if (B3SOIPDcheckModel(model, here, ckt)) + { IFuid namarray[2]; + namarray[0] = model->B3SOIPDmodName; + namarray[1] = here->B3SOIPDname; + (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during B3SOIPDV3 parameter checking for %s in model %s", namarray); + return(E_BADPARM); + } + + + pParam->B3SOIPDcgdo = (model->B3SOIPDcgdo + pParam->B3SOIPDcf) + * pParam->B3SOIPDwdiodCV; + pParam->B3SOIPDcgso = (model->B3SOIPDcgso + pParam->B3SOIPDcf) + * pParam->B3SOIPDwdiosCV; + + pParam->B3SOIPDcgeo = model->B3SOIPDcgeo + * pParam->B3SOIPDleffCV; + + + if (!model->B3SOIPDnpeakGiven && model->B3SOIPDgamma1Given) + { T0 = pParam->B3SOIPDgamma1 * model->B3SOIPDcox; + pParam->B3SOIPDnpeak = 3.021E22 * T0 * T0; + } + + + T4 = Eg300 / model->B3SOIPDvtm * (TempRatio - 1.0); + T7 = model->B3SOIPDxbjt * T4 / pParam->B3SOIPDndiode; + DEXP(T7, T0); + T7 = model->B3SOIPDxdif * T4 / pParam->B3SOIPDndiode; + DEXP(T7, T1); + T7 = model->B3SOIPDxrec * T4 / pParam->B3SOIPDnrecf0; + DEXP(T7, T2); + + /* v2.2.2 bug fix */ + pParam->B3SOIPDahli0 = pParam->B3SOIPDahli * T0; + + pParam->B3SOIPDjbjt = pParam->B3SOIPDisbjt * T0; + pParam->B3SOIPDjdif = pParam->B3SOIPDisdif * T1; + pParam->B3SOIPDjrec = pParam->B3SOIPDisrec * T2; + + T7 = model->B3SOIPDxtun * (TempRatio - 1); + DEXP(T7, T0); + pParam->B3SOIPDjtun = pParam->B3SOIPDistun * T0; + + + if (pParam->B3SOIPDnsub > 0) + pParam->B3SOIPDvfbb = -model->B3SOIPDtype * model->B3SOIPDvtm * + log(pParam->B3SOIPDnpeak/ pParam->B3SOIPDnsub); + else + pParam->B3SOIPDvfbb = -model->B3SOIPDtype * model->B3SOIPDvtm * + log(-pParam->B3SOIPDnpeak* pParam->B3SOIPDnsub/ni/ni); + + if (!model->B3SOIPDvsdfbGiven) + { + if (pParam->B3SOIPDnsub > 0) + pParam->B3SOIPDvsdfb = -model->B3SOIPDtype * (model->B3SOIPDvtm*log(1e20 * + pParam->B3SOIPDnsub / ni /ni) - 0.3); + else if (pParam->B3SOIPDnsub < 0) + pParam->B3SOIPDvsdfb = -model->B3SOIPDtype * (model->B3SOIPDvtm*log(-1e20 / + pParam->B3SOIPDnsub) + 0.3); + } + + /* Phi & Gamma */ + SDphi = 2.0*model->B3SOIPDvtm*log(fabs(pParam->B3SOIPDnsub) / ni); + SDgamma = 5.753e-12 * sqrt(fabs(pParam->B3SOIPDnsub)) / model->B3SOIPDcbox; + + if (!model->B3SOIPDvsdthGiven) + { + if ( ((pParam->B3SOIPDnsub > 0) && (model->B3SOIPDtype > 0)) || + ((pParam->B3SOIPDnsub < 0) && (model->B3SOIPDtype < 0)) ) + pParam->B3SOIPDvsdth = pParam->B3SOIPDvsdfb + SDphi + + SDgamma * sqrt(SDphi); + else + pParam->B3SOIPDvsdth = pParam->B3SOIPDvsdfb - SDphi - + SDgamma * sqrt(SDphi); + } + + if (!model->B3SOIPDcsdminGiven) { + /* Cdmin */ + tmp = sqrt(2.0 * EPSSI * SDphi / (Charge_q * + fabs(pParam->B3SOIPDnsub) * 1.0e6)); + tmp1 = EPSSI / tmp; + model->B3SOIPDcsdmin = tmp1 * model->B3SOIPDcbox / + (tmp1 + model->B3SOIPDcbox); + } + + + pParam->B3SOIPDphi = 2.0 * model->B3SOIPDvtm + * log(pParam->B3SOIPDnpeak / ni); + + pParam->B3SOIPDsqrtPhi = sqrt(pParam->B3SOIPDphi); + pParam->B3SOIPDphis3 = pParam->B3SOIPDsqrtPhi * pParam->B3SOIPDphi; + + pParam->B3SOIPDXdep0 = sqrt(2.0 * EPSSI / (Charge_q + * pParam->B3SOIPDnpeak * 1.0e6)) + * pParam->B3SOIPDsqrtPhi; + pParam->B3SOIPDsqrtXdep0 = sqrt(pParam->B3SOIPDXdep0); + pParam->B3SOIPDlitl = sqrt(3.0 * model->B3SOIPDxj + * model->B3SOIPDtox); + pParam->B3SOIPDvbi = model->B3SOIPDvtm * log(1.0e20 + * pParam->B3SOIPDnpeak / (ni * ni)); + pParam->B3SOIPDcdep0 = sqrt(Charge_q * EPSSI + * pParam->B3SOIPDnpeak * 1.0e6 / 2.0 + / pParam->B3SOIPDphi); + + if (model->B3SOIPDk1Given || model->B3SOIPDk2Given) + { if (!model->B3SOIPDk1Given) + { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); + pParam->B3SOIPDk1 = 0.53; + } + if (!model->B3SOIPDk2Given) + { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); + pParam->B3SOIPDk2 = -0.0186; + } + if (model->B3SOIPDxtGiven) + fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); + if (model->B3SOIPDvbxGiven) + fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); + if (model->B3SOIPDvbmGiven) + fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n"); + if (model->B3SOIPDgamma1Given) + fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); + if (model->B3SOIPDgamma2Given) + fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); + } + else + { if (!model->B3SOIPDvbxGiven) + pParam->B3SOIPDvbx = pParam->B3SOIPDphi - 7.7348e-4 + * pParam->B3SOIPDnpeak + * pParam->B3SOIPDxt * pParam->B3SOIPDxt; + if (pParam->B3SOIPDvbx > 0.0) + pParam->B3SOIPDvbx = -pParam->B3SOIPDvbx; + if (pParam->B3SOIPDvbm > 0.0) + pParam->B3SOIPDvbm = -pParam->B3SOIPDvbm; + + if (!model->B3SOIPDgamma1Given) + pParam->B3SOIPDgamma1 = 5.753e-12 + * sqrt(pParam->B3SOIPDnpeak) + / model->B3SOIPDcox; + if (!model->B3SOIPDgamma2Given) + pParam->B3SOIPDgamma2 = 5.753e-12 + * sqrt(pParam->B3SOIPDnsub) + / model->B3SOIPDcox; + + T0 = pParam->B3SOIPDgamma1 - pParam->B3SOIPDgamma2; + T1 = sqrt(pParam->B3SOIPDphi - pParam->B3SOIPDvbx) + - pParam->B3SOIPDsqrtPhi; + T2 = sqrt(pParam->B3SOIPDphi * (pParam->B3SOIPDphi + - pParam->B3SOIPDvbm)) - pParam->B3SOIPDphi; + pParam->B3SOIPDk2 = T0 * T1 / (2.0 * T2 + pParam->B3SOIPDvbm); + pParam->B3SOIPDk1 = pParam->B3SOIPDgamma2 - 2.0 + * pParam->B3SOIPDk2 * sqrt(pParam->B3SOIPDphi + - pParam->B3SOIPDvbm); + } + + if (pParam->B3SOIPDk2 < 0.0) + { T0 = 0.5 * pParam->B3SOIPDk1 / pParam->B3SOIPDk2; + pParam->B3SOIPDvbsc = 0.9 * (pParam->B3SOIPDphi - T0 * T0); + if (pParam->B3SOIPDvbsc > -3.0) + pParam->B3SOIPDvbsc = -3.0; + else if (pParam->B3SOIPDvbsc < -30.0) + pParam->B3SOIPDvbsc = -30.0; + } else - pParam->B3SOIPDvsdth = - pParam->B3SOIPDvsdfb - SDphi - SDgamma * sqrt (SDphi); - } - - if (!model->B3SOIPDcsdminGiven) - { - /* Cdmin */ - tmp = sqrt (2.0 * EPSSI * SDphi / (Charge_q * - fabs (pParam-> - B3SOIPDnsub) * - 1.0e6)); - tmp1 = EPSSI / tmp; - model->B3SOIPDcsdmin = tmp1 * model->B3SOIPDcbox / - (tmp1 + model->B3SOIPDcbox); - } - - T0 = model->B3SOIPDcsdesw * log (1 + model->B3SOIPDtsi / - model->B3SOIPDtbox); - T1 = here->B3SOIPDsourcePerimeter - here->B3SOIPDw; - if (T1 > 0.0) - pParam->B3SOIPDcsesw = T0 * T1; - else - pParam->B3SOIPDcsesw = 0.0; - T1 = here->B3SOIPDdrainPerimeter - here->B3SOIPDw; - if (T1 > 0.0) - pParam->B3SOIPDcdesw = T0 * T1; - else - pParam->B3SOIPDcdesw = 0.0; - - pParam->B3SOIPDphi = 2.0 * model->B3SOIPDvtm - * log (pParam->B3SOIPDnpeak / ni); - - pParam->B3SOIPDsqrtPhi = sqrt (pParam->B3SOIPDphi); - pParam->B3SOIPDphis3 = - pParam->B3SOIPDsqrtPhi * pParam->B3SOIPDphi; - - pParam->B3SOIPDXdep0 = sqrt (2.0 * EPSSI / (Charge_q - * - pParam-> - B3SOIPDnpeak * - 1.0e6)) * - pParam->B3SOIPDsqrtPhi; - pParam->B3SOIPDsqrtXdep0 = sqrt (pParam->B3SOIPDXdep0); - pParam->B3SOIPDlitl = sqrt (3.0 * model->B3SOIPDxj - * model->B3SOIPDtox); - pParam->B3SOIPDvbi = model->B3SOIPDvtm * log (1.0e20 - * - pParam-> - B3SOIPDnpeak / - (ni * ni)); - pParam->B3SOIPDcdep0 = - sqrt (Charge_q * EPSSI * pParam->B3SOIPDnpeak * 1.0e6 / 2.0 / - pParam->B3SOIPDphi); - - if (model->B3SOIPDk1Given || model->B3SOIPDk2Given) - { - if (!model->B3SOIPDk1Given) - { - fprintf (stdout, - "Warning: k1 should be specified with k2.\n"); - pParam->B3SOIPDk1 = 0.53; - } - if (!model->B3SOIPDk2Given) - { - fprintf (stdout, - "Warning: k2 should be specified with k1.\n"); - pParam->B3SOIPDk2 = -0.0186; - } - if (model->B3SOIPDxtGiven) - fprintf (stdout, - "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->B3SOIPDvbxGiven) - fprintf (stdout, - "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->B3SOIPDvbmGiven) - fprintf (stdout, - "Warning: vbm is ignored because k1 or k2 is given.\n"); - if (model->B3SOIPDgamma1Given) - fprintf (stdout, - "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->B3SOIPDgamma2Given) - fprintf (stdout, - "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - else - { - if (!model->B3SOIPDvbxGiven) - pParam->B3SOIPDvbx = pParam->B3SOIPDphi - 7.7348e-4 - * pParam->B3SOIPDnpeak - * pParam->B3SOIPDxt * pParam->B3SOIPDxt; - if (pParam->B3SOIPDvbx > 0.0) - pParam->B3SOIPDvbx = -pParam->B3SOIPDvbx; - if (pParam->B3SOIPDvbm > 0.0) - pParam->B3SOIPDvbm = -pParam->B3SOIPDvbm; - - if (!model->B3SOIPDgamma1Given) - pParam->B3SOIPDgamma1 = 5.753e-12 - * sqrt (pParam->B3SOIPDnpeak) / model->B3SOIPDcox; - if (!model->B3SOIPDgamma2Given) - pParam->B3SOIPDgamma2 = 5.753e-12 - * sqrt (pParam->B3SOIPDnsub) / model->B3SOIPDcox; - - T0 = pParam->B3SOIPDgamma1 - pParam->B3SOIPDgamma2; - T1 = sqrt (pParam->B3SOIPDphi - pParam->B3SOIPDvbx) - - pParam->B3SOIPDsqrtPhi; - T2 = sqrt (pParam->B3SOIPDphi * (pParam->B3SOIPDphi - - pParam->B3SOIPDvbm)) - - pParam->B3SOIPDphi; - pParam->B3SOIPDk2 = - T0 * T1 / (2.0 * T2 + pParam->B3SOIPDvbm); - pParam->B3SOIPDk1 = - pParam->B3SOIPDgamma2 - - 2.0 * pParam->B3SOIPDk2 * sqrt (pParam->B3SOIPDphi - - pParam->B3SOIPDvbm); - } - - if (pParam->B3SOIPDk2 < 0.0) - { - T0 = 0.5 * pParam->B3SOIPDk1 / pParam->B3SOIPDk2; - pParam->B3SOIPDvbsc = 0.9 * (pParam->B3SOIPDphi - T0 * T0); - if (pParam->B3SOIPDvbsc > -3.0) - pParam->B3SOIPDvbsc = -3.0; - else if (pParam->B3SOIPDvbsc < -30.0) - pParam->B3SOIPDvbsc = -30.0; - } + { pParam->B3SOIPDvbsc = -30.0; + } + if (pParam->B3SOIPDvbsc > pParam->B3SOIPDvbm) + pParam->B3SOIPDvbsc = pParam->B3SOIPDvbm; + + if ((T0 = pParam->B3SOIPDweff + pParam->B3SOIPDk1w2) < 1e-8) + T0 = 1e-8; + pParam->B3SOIPDk1eff = pParam->B3SOIPDk1 * (1 + pParam->B3SOIPDk1w1/T0); + + if (model->B3SOIPDvth0Given) + { pParam->B3SOIPDvfb = model->B3SOIPDtype * pParam->B3SOIPDvth0 + - pParam->B3SOIPDphi - pParam->B3SOIPDk1eff + * pParam->B3SOIPDsqrtPhi; + } + else + { pParam->B3SOIPDvfb = -1.0; + pParam->B3SOIPDvth0 = model->B3SOIPDtype * (pParam->B3SOIPDvfb + + pParam->B3SOIPDphi + pParam->B3SOIPDk1eff + * pParam->B3SOIPDsqrtPhi); + } + T1 = sqrt(EPSSI / EPSOX * model->B3SOIPDtox + * pParam->B3SOIPDXdep0); + T0 = exp(-0.5 * pParam->B3SOIPDdsub * pParam->B3SOIPDleff / T1); + pParam->B3SOIPDtheta0vb0 = (T0 + 2.0 * T0 * T0); + + T0 = exp(-0.5 * pParam->B3SOIPDdrout * pParam->B3SOIPDleff / T1); + T2 = (T0 + 2.0 * T0 * T0); + pParam->B3SOIPDthetaRout = pParam->B3SOIPDpdibl1 * T2 + + pParam->B3SOIPDpdibl2; + } + + here->B3SOIPDcsbox = model->B3SOIPDcbox*here->B3SOIPDsourceArea; + here->B3SOIPDcsmin = model->B3SOIPDcsdmin*here->B3SOIPDsourceArea; + here->B3SOIPDcdbox = model->B3SOIPDcbox*here->B3SOIPDdrainArea; + here->B3SOIPDcdmin = model->B3SOIPDcsdmin*here->B3SOIPDdrainArea; + + if ( ((pParam->B3SOIPDnsub > 0) && (model->B3SOIPDtype > 0)) || + ((pParam->B3SOIPDnsub < 0) && (model->B3SOIPDtype < 0)) ) + { + T0 = pParam->B3SOIPDvsdth - pParam->B3SOIPDvsdfb; + pParam->B3SOIPDsdt1 = pParam->B3SOIPDvsdfb + model->B3SOIPDasd * T0; + T1 = here->B3SOIPDcsbox - here->B3SOIPDcsmin; + T2 = T1 / T0 / T0; + pParam->B3SOIPDst2 = T2 / model->B3SOIPDasd; + pParam->B3SOIPDst3 = T2 /( 1 - model->B3SOIPDasd); + here->B3SOIPDst4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3 + - here->B3SOIPDcsmin * pParam->B3SOIPDvsdfb; + + T1 = here->B3SOIPDcdbox - here->B3SOIPDcdmin; + T2 = T1 / T0 / T0; + pParam->B3SOIPDdt2 = T2 / model->B3SOIPDasd; + pParam->B3SOIPDdt3 = T2 /( 1 - model->B3SOIPDasd); + here->B3SOIPDdt4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3 + - here->B3SOIPDcdmin * pParam->B3SOIPDvsdfb; + } else + { + T0 = pParam->B3SOIPDvsdfb - pParam->B3SOIPDvsdth; + pParam->B3SOIPDsdt1 = pParam->B3SOIPDvsdth + model->B3SOIPDasd * T0; + T1 = here->B3SOIPDcsmin - here->B3SOIPDcsbox; + T2 = T1 / T0 / T0; + pParam->B3SOIPDst2 = T2 / model->B3SOIPDasd; + pParam->B3SOIPDst3 = T2 /( 1 - model->B3SOIPDasd); + here->B3SOIPDst4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3 + - here->B3SOIPDcsbox * pParam->B3SOIPDvsdth; + + T1 = here->B3SOIPDcdmin - here->B3SOIPDcdbox; + T2 = T1 / T0 / T0; + pParam->B3SOIPDdt2 = T2 / model->B3SOIPDasd; + pParam->B3SOIPDdt3 = T2 /( 1 - model->B3SOIPDasd); + here->B3SOIPDdt4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3 + - here->B3SOIPDcdbox * pParam->B3SOIPDvsdth; + } + + /* v2.2.2 bug fix */ + T0 = model->B3SOIPDcsdesw * log(1 + model->B3SOIPDtsi / + model->B3SOIPDtbox); + T1 = here->B3SOIPDsourcePerimeter - here->B3SOIPDw; + if (T1 > 0.0) + here->B3SOIPDcsesw = T0 * T1; + else + here->B3SOIPDcsesw = 0.0; + T1 = here->B3SOIPDdrainPerimeter - here->B3SOIPDw; + if (T1 > 0.0) + here->B3SOIPDcdesw = T0 * T1; + else + here->B3SOIPDcdesw = 0.0; + + + here->B3SOIPDphi = pParam->B3SOIPDphi; + /* process source/drain series resistance */ + here->B3SOIPDdrainConductance = model->B3SOIPDsheetResistance + * here->B3SOIPDdrainSquares; + if (here->B3SOIPDdrainConductance > 0.0) + here->B3SOIPDdrainConductance = 1.0 + / here->B3SOIPDdrainConductance; else - { - pParam->B3SOIPDvbsc = -30.0; - } - if (pParam->B3SOIPDvbsc > pParam->B3SOIPDvbm) - pParam->B3SOIPDvbsc = pParam->B3SOIPDvbm; - - if ((T0 = pParam->B3SOIPDweff + pParam->B3SOIPDk1w2) < 1e-8) - T0 = 1e-8; - pParam->B3SOIPDk1eff = - pParam->B3SOIPDk1 * (1 + pParam->B3SOIPDk1w1 / T0); - - if (model->B3SOIPDvth0Given) - { - pParam->B3SOIPDvfb = - model->B3SOIPDtype * pParam->B3SOIPDvth0 - - pParam->B3SOIPDphi - - pParam->B3SOIPDk1eff * pParam->B3SOIPDsqrtPhi; - } + here->B3SOIPDdrainConductance = 0.0; + + here->B3SOIPDsourceConductance = model->B3SOIPDsheetResistance + * here->B3SOIPDsourceSquares; + if (here->B3SOIPDsourceConductance > 0.0) + here->B3SOIPDsourceConductance = 1.0 + / here->B3SOIPDsourceConductance; else - { - pParam->B3SOIPDvfb = -1.0; - pParam->B3SOIPDvth0 = - model->B3SOIPDtype * (pParam->B3SOIPDvfb + - pParam->B3SOIPDphi + - pParam->B3SOIPDk1eff * - pParam->B3SOIPDsqrtPhi); - } - T1 = sqrt (EPSSI / EPSOX * model->B3SOIPDtox - * pParam->B3SOIPDXdep0); - T0 = - exp (-0.5 * pParam->B3SOIPDdsub * pParam->B3SOIPDleff / T1); - pParam->B3SOIPDtheta0vb0 = (T0 + 2.0 * T0 * T0); - - T0 = - exp (-0.5 * pParam->B3SOIPDdrout * pParam->B3SOIPDleff / T1); - T2 = (T0 + 2.0 * T0 * T0); - pParam->B3SOIPDthetaRout = pParam->B3SOIPDpdibl1 * T2 - + pParam->B3SOIPDpdibl2; - } - - here->B3SOIPDcsbox = model->B3SOIPDcbox * here->B3SOIPDsourceArea; - here->B3SOIPDcsmin = model->B3SOIPDcsdmin * here->B3SOIPDsourceArea; - here->B3SOIPDcdbox = model->B3SOIPDcbox * here->B3SOIPDdrainArea; - here->B3SOIPDcdmin = model->B3SOIPDcsdmin * here->B3SOIPDdrainArea; - - if (((pParam->B3SOIPDnsub > 0) && (model->B3SOIPDtype > 0)) || - ((pParam->B3SOIPDnsub < 0) && (model->B3SOIPDtype < 0))) - { - T0 = pParam->B3SOIPDvsdth - pParam->B3SOIPDvsdfb; - pParam->B3SOIPDsdt1 = - pParam->B3SOIPDvsdfb + model->B3SOIPDasd * T0; - T1 = here->B3SOIPDcsbox - here->B3SOIPDcsmin; - T2 = T1 / T0 / T0; - pParam->B3SOIPDst2 = T2 / model->B3SOIPDasd; - pParam->B3SOIPDst3 = T2 / (1 - model->B3SOIPDasd); - here->B3SOIPDst4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3 - - here->B3SOIPDcsmin * pParam->B3SOIPDvsdfb; - - T1 = here->B3SOIPDcdbox - here->B3SOIPDcdmin; - T2 = T1 / T0 / T0; - pParam->B3SOIPDdt2 = T2 / model->B3SOIPDasd; - pParam->B3SOIPDdt3 = T2 / (1 - model->B3SOIPDasd); - here->B3SOIPDdt4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3 - - here->B3SOIPDcdmin * pParam->B3SOIPDvsdfb; - } - else - { - T0 = pParam->B3SOIPDvsdfb - pParam->B3SOIPDvsdth; - pParam->B3SOIPDsdt1 = - pParam->B3SOIPDvsdth + model->B3SOIPDasd * T0; - T1 = here->B3SOIPDcsmin - here->B3SOIPDcsbox; - T2 = T1 / T0 / T0; - pParam->B3SOIPDst2 = T2 / model->B3SOIPDasd; - pParam->B3SOIPDst3 = T2 / (1 - model->B3SOIPDasd); - here->B3SOIPDst4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3 - - here->B3SOIPDcsbox * pParam->B3SOIPDvsdth; - - T1 = here->B3SOIPDcdmin - here->B3SOIPDcdbox; - T2 = T1 / T0 / T0; - pParam->B3SOIPDdt2 = T2 / model->B3SOIPDasd; - pParam->B3SOIPDdt3 = T2 / (1 - model->B3SOIPDasd); - here->B3SOIPDdt4 = T0 * T1 * (1 + model->B3SOIPDasd) / 3 - - here->B3SOIPDcdbox * pParam->B3SOIPDvsdth; - } - - here->B3SOIPDphi = pParam->B3SOIPDphi; - /* process source/drain series resistance */ - here->B3SOIPDdrainConductance = model->B3SOIPDsheetResistance - * here->B3SOIPDdrainSquares; - if (here->B3SOIPDdrainConductance > 0.0) - here->B3SOIPDdrainConductance = 1.0 - / here->B3SOIPDdrainConductance; - else - here->B3SOIPDdrainConductance = 0.0; - - here->B3SOIPDsourceConductance = model->B3SOIPDsheetResistance - * here->B3SOIPDsourceSquares; - if (here->B3SOIPDsourceConductance > 0.0) - here->B3SOIPDsourceConductance = 1.0 - / here->B3SOIPDsourceConductance; - else - here->B3SOIPDsourceConductance = 0.0; - here->B3SOIPDcgso = pParam->B3SOIPDcgso; - here->B3SOIPDcgdo = pParam->B3SOIPDcgdo; + here->B3SOIPDsourceConductance = 0.0; + here->B3SOIPDcgso = pParam->B3SOIPDcgso; + here->B3SOIPDcgdo = pParam->B3SOIPDcgdo; /* v2.0 release */ - if (model->B3SOIPDln < 1e-15) - model->B3SOIPDln = 1e-15; - T0 = - -0.5 * pParam->B3SOIPDleff * pParam->B3SOIPDleff / - model->B3SOIPDln / model->B3SOIPDln; - DEXP (T0, T1); - pParam->B3SOIPDarfabjt = T1; - - T0 = - pParam->B3SOIPDlbjt0 * (1.0 / pParam->B3SOIPDleff + - 1.0 / model->B3SOIPDln); - pParam->B3SOIPDlratio = pow (T0, pParam->B3SOIPDnbjt); - pParam->B3SOIPDlratiodif = - 1.0 + model->B3SOIPDldif0 * pow (T0, model->B3SOIPDndif); - - if ( - (pParam->B3SOIPDvearly = - pParam->B3SOIPDvabjt + - pParam->B3SOIPDaely * pParam->B3SOIPDleff) < 1) - pParam->B3SOIPDvearly = 1; - - /* vfbzb calculation for capMod 3 */ - tmp = sqrt (pParam->B3SOIPDXdep0); - tmp1 = pParam->B3SOIPDvbi - pParam->B3SOIPDphi; - tmp2 = model->B3SOIPDfactor1 * tmp; - - T0 = -0.5 * pParam->B3SOIPDdvt1w * pParam->B3SOIPDweff - * pParam->B3SOIPDleff / tmp2; - if (T0 > -EXPL_THRESHOLD) - { - T1 = exp (T0); - T2 = T1 * (1.0 + 2.0 * T1); - } - else - { - T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - } - T0 = pParam->B3SOIPDdvt0w * T2; - T2 = T0 * tmp1; - - T0 = -0.5 * pParam->B3SOIPDdvt1 * pParam->B3SOIPDleff / tmp2; - if (T0 > -EXPL_THRESHOLD) - { - T1 = exp (T0); - T3 = T1 * (1.0 + 2.0 * T1); - } - else - { - T1 = MIN_EXPL; - T3 = T1 * (1.0 + 2.0 * T1); - } - T3 = pParam->B3SOIPDdvt0 * T3 * tmp1; - - T4 = model->B3SOIPDtox * pParam->B3SOIPDphi - / (pParam->B3SOIPDweff + pParam->B3SOIPDw0); - - T0 = sqrt (1.0 + pParam->B3SOIPDnlx / pParam->B3SOIPDleff); - T5 = pParam->B3SOIPDk1eff * (T0 - 1.0) * pParam->B3SOIPDsqrtPhi - + (pParam->B3SOIPDkt1 + pParam->B3SOIPDkt1l / pParam->B3SOIPDleff) - * (TempRatio - 1.0); - - tmp3 = model->B3SOIPDtype * pParam->B3SOIPDvth0 - - T2 - T3 + pParam->B3SOIPDk3 * T4 + T5; - pParam->B3SOIPDvfbzb = - tmp3 - pParam->B3SOIPDphi - - pParam->B3SOIPDk1eff * pParam->B3SOIPDsqrtPhi; - /* End of vfbzb */ - - pParam->B3SOIPDldeb = - sqrt (EPSSI * Vtm0 / (Charge_q * pParam->B3SOIPDnpeak * 1.0e6)) / - 3.0; - pParam->B3SOIPDacde = - pParam->B3SOIPDacde * pow ((pParam->B3SOIPDnpeak / 2.0e16), - -0.25); - } + if (model->B3SOIPDln < 1e-15) model->B3SOIPDln = 1e-15; + T0 = -0.5 * pParam->B3SOIPDleff * pParam->B3SOIPDleff / model->B3SOIPDln / model->B3SOIPDln; + DEXP(T0,T1); + pParam->B3SOIPDarfabjt = T1; + + T0 = pParam->B3SOIPDlbjt0 * (1.0 / pParam->B3SOIPDleff + 1.0 / model->B3SOIPDln); + pParam->B3SOIPDlratio = pow(T0,pParam->B3SOIPDnbjt); + pParam->B3SOIPDlratiodif = 1.0 + model->B3SOIPDldif0 * pow(T0,model->B3SOIPDndif); + + if ((pParam->B3SOIPDvearly = pParam->B3SOIPDvabjt + pParam->B3SOIPDaely * pParam->B3SOIPDleff) < 1) + pParam->B3SOIPDvearly = 1; + + /* vfbzb calculation for capMod 3 */ + tmp = sqrt(pParam->B3SOIPDXdep0); + tmp1 = pParam->B3SOIPDvbi - pParam->B3SOIPDphi; + tmp2 = model->B3SOIPDfactor1 * tmp; + + T0 = -0.5 * pParam->B3SOIPDdvt1w * pParam->B3SOIPDweff + * pParam->B3SOIPDleff / tmp2; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + T2 = T1 * (1.0 + 2.0 * T1); + } + else + { T1 = MIN_EXPL; + T2 = T1 * (1.0 + 2.0 * T1); + } + T0 = pParam->B3SOIPDdvt0w * T2; + T2 = T0 * tmp1; + + T0 = -0.5 * pParam->B3SOIPDdvt1 * pParam->B3SOIPDleff / tmp2; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + T3 = T1 * (1.0 + 2.0 * T1); + } + else + { T1 = MIN_EXPL; + T3 = T1 * (1.0 + 2.0 * T1); + } + T3 = pParam->B3SOIPDdvt0 * T3 * tmp1; + +/* v2.2.3 */ + T4 = (model->B3SOIPDtox - model->B3SOIPDdtoxcv) * pParam->B3SOIPDphi + / (pParam->B3SOIPDweff + pParam->B3SOIPDw0); + + T0 = sqrt(1.0 + pParam->B3SOIPDnlx / pParam->B3SOIPDleff); + T5 = pParam->B3SOIPDk1eff * (T0 - 1.0) * pParam->B3SOIPDsqrtPhi + + (pParam->B3SOIPDkt1 + pParam->B3SOIPDkt1l / pParam->B3SOIPDleff) + * (TempRatio - 1.0); + + tmp3 = model->B3SOIPDtype * pParam->B3SOIPDvth0 + - T2 - T3 + pParam->B3SOIPDk3 * T4 + T5; + pParam->B3SOIPDvfbzb = tmp3 - pParam->B3SOIPDphi - pParam->B3SOIPDk1eff + * pParam->B3SOIPDsqrtPhi; + /* End of vfbzb */ + + pParam->B3SOIPDldeb = sqrt(EPSSI * Vtm0 / (Charge_q * pParam->B3SOIPDnpeak * 1.0e6)) / 3.0; + pParam->B3SOIPDacde = pParam->B3SOIPDacde * pow((pParam->B3SOIPDnpeak / 2.0e16), -0.25); + } } - return (OK); + return(OK); } + diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdtrunc.c b/src/spicelib/devices/bsim3soi_pd/b3soipdtrunc.c index 3cb66d5da..c37b9bc96 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdtrunc.c +++ b/src/spicelib/devices/bsim3soi_pd/b3soipdtrunc.c @@ -2,12 +2,15 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang File: b3soipdtrunc.c 98/5/01 +Modified by Paolo Nenzi 2002 **********/ +/* + * Revision 2.2.3 02/3/5 Pin Su + * BSIMPD2.2.3 release + */ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "b3soipddef.h" #include "sperror.h" @@ -15,37 +18,39 @@ File: b3soipdtrunc.c 98/5/01 int -B3SOIPDtrunc (inModel, ckt, timeStep) - GENmodel *inModel; - CKTcircuit *ckt; - double *timeStep; +B3SOIPDtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) { - B3SOIPDmodel *model = (B3SOIPDmodel *) inModel; - B3SOIPDinstance *here; +B3SOIPDmodel *model = (B3SOIPDmodel*)inModel; +B3SOIPDinstance *here; #ifdef STEPDEBUG - double debugtemp; + double debugtemp; #endif /* STEPDEBUG */ - for (; model != NULL; model = model->B3SOIPDnextModel) - { - for (here = model->B3SOIPDinstances; here != NULL; - here = here->B3SOIPDnextInstance) - { + for (; model != NULL; model = model->B3SOIPDnextModel) + { for (here = model->B3SOIPDinstances; here != NULL; + here = here->B3SOIPDnextInstance) + { + + if (here->B3SOIPDowner != ARCHme) + continue; + #ifdef STEPDEBUG - debugtemp = *timeStep; + debugtemp = *timeStep; #endif /* STEPDEBUG */ - CKTterr (here->B3SOIPDqb, ckt, timeStep); - CKTterr (here->B3SOIPDqg, ckt, timeStep); - CKTterr (here->B3SOIPDqd, ckt, timeStep); + CKTterr(here->B3SOIPDqb,ckt,timeStep); + CKTterr(here->B3SOIPDqg,ckt,timeStep); + CKTterr(here->B3SOIPDqd,ckt,timeStep); #ifdef STEPDEBUG - if (debugtemp != *timeStep) - { - printf ("device %s reduces step from %g to %g\n", - here->B3SOIPDname, debugtemp, *timeStep); - } + if(debugtemp != *timeStep) + { printf("device %s reduces step from %g to %g\n", + here->B3SOIPDname,debugtemp,*timeStep); + } #endif /* STEPDEBUG */ - } + } } - return (OK); + return(OK); } + + + diff --git a/src/spicelib/devices/bsim3v1/b3v1.c b/src/spicelib/devices/bsim3v1/b3v1.c index d97d6e1b4..c5af1436e 100644 --- a/src/spicelib/devices/bsim3v1/b3v1.c +++ b/src/spicelib/devices/bsim3v1/b3v1.c @@ -1,432 +1,435 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v1.c -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ + #include "ngspice.h" -#include #include "devdefs.h" #include "bsim3v1def.h" #include "suffix.h" -IFparm BSIM3V1pTable[] = { /* parameters */ -IOP( "l", BSIM3V1_L, IF_REAL , "Length"), -IOP( "w", BSIM3V1_W, IF_REAL , "Width"), -IOP( "ad", BSIM3V1_AD, IF_REAL , "Drain area"), -IOP( "as", BSIM3V1_AS, IF_REAL , "Source area"), -IOP( "pd", BSIM3V1_PD, IF_REAL , "Drain perimeter"), -IOP( "ps", BSIM3V1_PS, IF_REAL , "Source perimeter"), -IOP( "nrd", BSIM3V1_NRD, IF_REAL , "Number of squares in drain"), -IOP( "nrs", BSIM3V1_NRS, IF_REAL , "Number of squares in source"), -IOP( "off", BSIM3V1_OFF, IF_FLAG , "Device is initially off"), -IOP( "nqsmod", BSIM3V1_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), -IP( "ic", BSIM3V1_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), -OP( "gmbs", BSIM3V1_GMBS, IF_REAL, "Gmb"), -OP( "gm", BSIM3V1_GM, IF_REAL, "Gm"), -OP( "gds", BSIM3V1_GDS, IF_REAL, "Gds"), -OP( "vdsat", BSIM3V1_VDSAT, IF_REAL, "Vdsat"), -OP( "vth", BSIM3V1_VON, IF_REAL, "Vth"), -OP( "id", BSIM3V1_CD, IF_REAL, "Ids"), -OP( "vbs", BSIM3V1_VBS, IF_REAL, "Vbs"), -OP( "vgs", BSIM3V1_VGS, IF_REAL, "Vgs"), -OP( "vds", BSIM3V1_VDS, IF_REAL, "Vds"), -/* serban */ -IOP( "m", BSIM3V1_M, IF_REAL , "Multiplication factor"), +IFparm BSIM3v1pTable[] = { /* parameters */ +IOP( "l", BSIM3v1_L, IF_REAL , "Length"), +IOP( "w", BSIM3v1_W, IF_REAL , "Width"), +IOP( "m", BSIM3v1_M, IF_REAL , "Parallel multiplier"), +IOP( "ad", BSIM3v1_AD, IF_REAL , "Drain area"), +IOP( "as", BSIM3v1_AS, IF_REAL , "Source area"), +IOP( "pd", BSIM3v1_PD, IF_REAL , "Drain perimeter"), +IOP( "ps", BSIM3v1_PS, IF_REAL , "Source perimeter"), +IOP( "nrd", BSIM3v1_NRD, IF_REAL , "Number of squares in drain"), +IOP( "nrs", BSIM3v1_NRS, IF_REAL , "Number of squares in source"), +IOP( "off", BSIM3v1_OFF, IF_FLAG , "Device is initially off"), +IOP( "nqsmod", BSIM3v1_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), +IP( "ic", BSIM3v1_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), +OP( "gmbs", BSIM3v1_GMBS, IF_REAL, "Gmb"), +OP( "gm", BSIM3v1_GM, IF_REAL, "Gm"), +OP( "gds", BSIM3v1_GDS, IF_REAL, "Gds"), +OP( "vdsat", BSIM3v1_VDSAT, IF_REAL, "Vdsat"), +OP( "vth", BSIM3v1_VON, IF_REAL, "Vth"), +OP( "id", BSIM3v1_CD, IF_REAL, "Ids"), +OP( "vbs", BSIM3v1_VBS, IF_REAL, "Vbs"), +OP( "vgs", BSIM3v1_VGS, IF_REAL, "Vgs"), +OP( "vds", BSIM3v1_VDS, IF_REAL, "Vds"), }; -IFparm BSIM3V1mPTable[] = { /* model parameters */ -IOP( "capmod", BSIM3V1_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), -IOP( "nqsmod", BSIM3V1_MOD_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), -IOP( "mobmod", BSIM3V1_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), -IOP( "noimod", BSIM3V1_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), -IOP( "paramchk", BSIM3V1_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), -IOP( "binunit", BSIM3V1_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), -IOP( "version", BSIM3V1_MOD_VERSION, IF_REAL, " parameter for model version"), -IOP( "tox", BSIM3V1_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), +IFparm BSIM3v1mPTable[] = { /* model parameters */ +IOP( "capmod", BSIM3v1_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), +IOP( "nqsmod", BSIM3v1_MOD_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), +IOP( "mobmod", BSIM3v1_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), +IOP( "noimod", BSIM3v1_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), +IOP( "paramchk", BSIM3v1_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), +IOP( "binunit", BSIM3v1_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), +IOP( "version", BSIM3v1_MOD_VERSION, IF_REAL, " parameter for model version"), +IOP( "tox", BSIM3v1_MOD_TOX, IF_REAL, "Gate oxide thickness in meters"), -IOP( "cdsc", BSIM3V1_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), -IOP( "cdscb", BSIM3V1_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), -IOP( "cdscd", BSIM3V1_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), -IOP( "cit", BSIM3V1_MOD_CIT, IF_REAL, "Interface state capacitance"), -IOP( "nfactor", BSIM3V1_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), -IOP( "xj", BSIM3V1_MOD_XJ, IF_REAL, "Junction depth in meters"), -IOP( "vsat", BSIM3V1_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), -IOP( "at", BSIM3V1_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), -IOP( "a0", BSIM3V1_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), -IOP( "ags", BSIM3V1_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), -IOP( "a1", BSIM3V1_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), -IOP( "a2", BSIM3V1_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), -IOP( "keta", BSIM3V1_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), -IOP( "nsub", BSIM3V1_MOD_NSUB, IF_REAL, "Substrate doping concentration"), -IOP( "nch", BSIM3V1_MOD_NPEAK, IF_REAL, "Channel doping concentration"), -IOP( "ngate", BSIM3V1_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), -IOP( "gamma1", BSIM3V1_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), -IOP( "gamma2", BSIM3V1_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), -IOP( "vbx", BSIM3V1_MOD_VBX, IF_REAL, "Vth transition body Voltage"), -IOP( "vbm", BSIM3V1_MOD_VBM, IF_REAL, "Maximum body voltage"), +IOP( "cdsc", BSIM3v1_MOD_CDSC, IF_REAL, "Drain/Source and channel coupling capacitance"), +IOP( "cdscb", BSIM3v1_MOD_CDSCB, IF_REAL, "Body-bias dependence of cdsc"), +IOP( "cdscd", BSIM3v1_MOD_CDSCD, IF_REAL, "Drain-bias dependence of cdsc"), +IOP( "cit", BSIM3v1_MOD_CIT, IF_REAL, "Interface state capacitance"), +IOP( "nfactor", BSIM3v1_MOD_NFACTOR, IF_REAL, "Subthreshold swing Coefficient"), +IOP( "xj", BSIM3v1_MOD_XJ, IF_REAL, "Junction depth in meters"), +IOP( "vsat", BSIM3v1_MOD_VSAT, IF_REAL, "Saturation velocity at tnom"), +IOP( "at", BSIM3v1_MOD_AT, IF_REAL, "Temperature coefficient of vsat"), +IOP( "a0", BSIM3v1_MOD_A0, IF_REAL, "Non-uniform depletion width effect coefficient."), +IOP( "ags", BSIM3v1_MOD_AGS, IF_REAL, "Gate bias coefficient of Abulk."), +IOP( "a1", BSIM3v1_MOD_A1, IF_REAL, "Non-saturation effect coefficient"), +IOP( "a2", BSIM3v1_MOD_A2, IF_REAL, "Non-saturation effect coefficient"), +IOP( "keta", BSIM3v1_MOD_KETA, IF_REAL, "Body-bias coefficient of non-uniform depletion width effect."), +IOP( "nsub", BSIM3v1_MOD_NSUB, IF_REAL, "Substrate doping concentration"), +IOP( "nch", BSIM3v1_MOD_NPEAK, IF_REAL, "Channel doping concentration"), +IOP( "ngate", BSIM3v1_MOD_NGATE, IF_REAL, "Poly-gate doping concentration"), +IOP( "gamma1", BSIM3v1_MOD_GAMMA1, IF_REAL, "Vth body coefficient"), +IOP( "gamma2", BSIM3v1_MOD_GAMMA2, IF_REAL, "Vth body coefficient"), +IOP( "vbx", BSIM3v1_MOD_VBX, IF_REAL, "Vth transition body Voltage"), +IOP( "vbm", BSIM3v1_MOD_VBM, IF_REAL, "Maximum body voltage"), -IOP( "xt", BSIM3V1_MOD_XT, IF_REAL, "Doping depth"), -IOP( "k1", BSIM3V1_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), -IOP( "kt1", BSIM3V1_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt1l", BSIM3V1_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), -IOP( "kt2", BSIM3V1_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), -IOP( "k2", BSIM3V1_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), -IOP( "k3", BSIM3V1_MOD_K3, IF_REAL, "Narrow width effect coefficient"), -IOP( "k3b", BSIM3V1_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), -IOP( "w0", BSIM3V1_MOD_W0, IF_REAL, "Narrow width effect parameter"), -IOP( "nlx", BSIM3V1_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"), -IOP( "dvt0", BSIM3V1_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), -IOP( "dvt1", BSIM3V1_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), -IOP( "dvt2", BSIM3V1_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), -IOP( "dvt0w", BSIM3V1_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), -IOP( "dvt1w", BSIM3V1_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), -IOP( "dvt2w", BSIM3V1_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), -IOP( "drout", BSIM3V1_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), -IOP( "dsub", BSIM3V1_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), -IOP( "vth0", BSIM3V1_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "vtho", BSIM3V1_MOD_VTH0, IF_REAL,"Threshold voltage"), -IOP( "ua", BSIM3V1_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), -IOP( "ua1", BSIM3V1_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), -IOP( "ub", BSIM3V1_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), -IOP( "ub1", BSIM3V1_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), -IOP( "uc", BSIM3V1_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), -IOP( "uc1", BSIM3V1_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), -IOP( "u0", BSIM3V1_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), -IOP( "ute", BSIM3V1_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), -IOP( "voff", BSIM3V1_MOD_VOFF, IF_REAL, "Threshold voltage offset"), -IOP( "tnom", BSIM3V1_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), -IOP( "cgso", BSIM3V1_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), -IOP( "cgdo", BSIM3V1_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), -IOP( "cgbo", BSIM3V1_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"), -IOP( "xpart", BSIM3V1_MOD_XPART, IF_REAL, "Channel charge partitioning"), -IOP( "elm", BSIM3V1_MOD_ELM, IF_REAL, "Non-quasi-static Elmore Constant Parameter"), -IOP( "delta", BSIM3V1_MOD_DELTA, IF_REAL, "Effective Vds parameter"), -IOP( "rsh", BSIM3V1_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), -IOP( "rdsw", BSIM3V1_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), +IOP( "xt", BSIM3v1_MOD_XT, IF_REAL, "Doping depth"), +IOP( "k1", BSIM3v1_MOD_K1, IF_REAL, "Bulk effect coefficient 1"), +IOP( "kt1", BSIM3v1_MOD_KT1, IF_REAL, "Temperature coefficient of Vth"), +IOP( "kt1l", BSIM3v1_MOD_KT1L, IF_REAL, "Temperature coefficient of Vth"), +IOP( "kt2", BSIM3v1_MOD_KT2, IF_REAL, "Body-coefficient of kt1"), +IOP( "k2", BSIM3v1_MOD_K2, IF_REAL, "Bulk effect coefficient 2"), +IOP( "k3", BSIM3v1_MOD_K3, IF_REAL, "Narrow width effect coefficient"), +IOP( "k3b", BSIM3v1_MOD_K3B, IF_REAL, "Body effect coefficient of k3"), +IOP( "w0", BSIM3v1_MOD_W0, IF_REAL, "Narrow width effect parameter"), +IOP( "nlx", BSIM3v1_MOD_NLX, IF_REAL, "Lateral non-uniform doping effect"), +IOP( "dvt0", BSIM3v1_MOD_DVT0, IF_REAL, "Short channel effect coeff. 0"), +IOP( "dvt1", BSIM3v1_MOD_DVT1, IF_REAL, "Short channel effect coeff. 1"), +IOP( "dvt2", BSIM3v1_MOD_DVT2, IF_REAL, "Short channel effect coeff. 2"), +IOP( "dvt0w", BSIM3v1_MOD_DVT0W, IF_REAL, "Narrow Width coeff. 0"), +IOP( "dvt1w", BSIM3v1_MOD_DVT1W, IF_REAL, "Narrow Width effect coeff. 1"), +IOP( "dvt2w", BSIM3v1_MOD_DVT2W, IF_REAL, "Narrow Width effect coeff. 2"), +IOP( "drout", BSIM3v1_MOD_DROUT, IF_REAL, "DIBL coefficient of output resistance"), +IOP( "dsub", BSIM3v1_MOD_DSUB, IF_REAL, "DIBL coefficient in the subthreshold region"), +IOP( "vth0", BSIM3v1_MOD_VTH0, IF_REAL,"Threshold voltage"), +IOP( "vtho", BSIM3v1_MOD_VTH0, IF_REAL,"Threshold voltage"), +IOP( "ua", BSIM3v1_MOD_UA, IF_REAL, "Linear gate dependence of mobility"), +IOP( "ua1", BSIM3v1_MOD_UA1, IF_REAL, "Temperature coefficient of ua"), +IOP( "ub", BSIM3v1_MOD_UB, IF_REAL, "Quadratic gate dependence of mobility"), +IOP( "ub1", BSIM3v1_MOD_UB1, IF_REAL, "Temperature coefficient of ub"), +IOP( "uc", BSIM3v1_MOD_UC, IF_REAL, "Body-bias dependence of mobility"), +IOP( "uc1", BSIM3v1_MOD_UC1, IF_REAL, "Temperature coefficient of uc"), +IOP( "u0", BSIM3v1_MOD_U0, IF_REAL, "Low-field mobility at Tnom"), +IOP( "ute", BSIM3v1_MOD_UTE, IF_REAL, "Temperature coefficient of mobility"), +IOP( "voff", BSIM3v1_MOD_VOFF, IF_REAL, "Threshold voltage offset"), +IOP( "tnom", BSIM3v1_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), +IOP( "cgso", BSIM3v1_MOD_CGSO, IF_REAL, "Gate-source overlap capacitance per width"), +IOP( "cgdo", BSIM3v1_MOD_CGDO, IF_REAL, "Gate-drain overlap capacitance per width"), +IOP( "cgbo", BSIM3v1_MOD_CGBO, IF_REAL, "Gate-bulk overlap capacitance per length"), +IOP( "xpart", BSIM3v1_MOD_XPART, IF_REAL, "Channel charge partitioning"), +IOP( "elm", BSIM3v1_MOD_ELM, IF_REAL, "Non-quasi-static Elmore Constant Parameter"), +IOP( "delta", BSIM3v1_MOD_DELTA, IF_REAL, "Effective Vds parameter"), +IOP( "rsh", BSIM3v1_MOD_RSH, IF_REAL, "Source-drain sheet resistance"), +IOP( "rdsw", BSIM3v1_MOD_RDSW, IF_REAL, "Source-drain resistance per width"), -IOP( "prwg", BSIM3V1_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), -IOP( "prwb", BSIM3V1_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), +IOP( "prwg", BSIM3v1_MOD_PRWG, IF_REAL, "Gate-bias effect on parasitic resistance "), +IOP( "prwb", BSIM3v1_MOD_PRWB, IF_REAL, "Body-effect on parasitic resistance "), -IOP( "prt", BSIM3V1_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), -IOP( "eta0", BSIM3V1_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "etab", BSIM3V1_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), -IOP( "pclm", BSIM3V1_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), -IOP( "pdiblc1", BSIM3V1_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblc2", BSIM3V1_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), -IOP( "pdiblcb", BSIM3V1_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), -IOP( "pscbe1", BSIM3V1_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pscbe2", BSIM3V1_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), -IOP( "pvag", BSIM3V1_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), -IOP( "js", BSIM3V1_MOD_JS, IF_REAL, "Source/drain junction reverse saturation current density"), -IOP( "jsw", BSIM3V1_MOD_JSW, IF_REAL, "Sidewall junction reverse saturation current density"), -IOP( "pb", BSIM3V1_MOD_PB, IF_REAL, "Source/drain junction built-in potential"), -IOP( "nj", BSIM3V1_MOD_NJ, IF_REAL, "Source/drain junction emission coefficient"), -IOP( "xti", BSIM3V1_MOD_XTI, IF_REAL, "Junction current temperature exponent"), -IOP( "mj", BSIM3V1_MOD_MJ, IF_REAL, "Source/drain bottom junction capacitance grading coefficient"), -IOP( "pbsw", BSIM3V1_MOD_PBSW, IF_REAL, "Source/drain sidewall junction capacitance built in potential"), -IOP( "mjsw", BSIM3V1_MOD_MJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient"), -IOP( "pbswg", BSIM3V1_MOD_PBSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance built in potential"), -IOP( "mjswg", BSIM3V1_MOD_MJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance grading coefficient"), -IOP( "cj", BSIM3V1_MOD_CJ, IF_REAL, "Source/drain bottom junction capacitance per unit area"), -IOP( "vfbcv", BSIM3V1_MOD_VFBCV, IF_REAL, "Flat Band Voltage parameter for capmod=0 only"), -IOP( "cjsw", BSIM3V1_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance per unit periphery"), +IOP( "prt", BSIM3v1_MOD_PRT, IF_REAL, "Temperature coefficient of parasitic resistance "), +IOP( "eta0", BSIM3v1_MOD_ETA0, IF_REAL, "Subthreshold region DIBL coefficient"), +IOP( "etab", BSIM3v1_MOD_ETAB, IF_REAL, "Subthreshold region DIBL coefficient"), +IOP( "pclm", BSIM3v1_MOD_PCLM, IF_REAL, "Channel length modulation Coefficient"), +IOP( "pdiblc1", BSIM3v1_MOD_PDIBL1, IF_REAL, "Drain-induced barrier lowering coefficient"), +IOP( "pdiblc2", BSIM3v1_MOD_PDIBL2, IF_REAL, "Drain-induced barrier lowering coefficient"), +IOP( "pdiblcb", BSIM3v1_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier lowering"), +IOP( "pscbe1", BSIM3v1_MOD_PSCBE1, IF_REAL, "Substrate current body-effect coefficient"), +IOP( "pscbe2", BSIM3v1_MOD_PSCBE2, IF_REAL, "Substrate current body-effect coefficient"), +IOP( "pvag", BSIM3v1_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), +IOP( "js", BSIM3v1_MOD_JS, IF_REAL, "Source/drain junction reverse saturation current density"), +IOP( "jsw", BSIM3v1_MOD_JSW, IF_REAL, "Sidewall junction reverse saturation current density"), +IOP( "pb", BSIM3v1_MOD_PB, IF_REAL, "Source/drain junction built-in potential"), +IOP( "nj", BSIM3v1_MOD_NJ, IF_REAL, "Source/drain junction emission coefficient"), +IOP( "xti", BSIM3v1_MOD_XTI, IF_REAL, "Junction current temperature exponent"), +IOP( "mj", BSIM3v1_MOD_MJ, IF_REAL, "Source/drain bottom junction capacitance grading coefficient"), +IOP( "pbsw", BSIM3v1_MOD_PBSW, IF_REAL, "Source/drain sidewall junction capacitance built in potential"), +IOP( "mjsw", BSIM3v1_MOD_MJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient"), +IOP( "pbswg", BSIM3v1_MOD_PBSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance built in potential"), +IOP( "mjswg", BSIM3v1_MOD_MJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance grading coefficient"), +IOP( "cj", BSIM3v1_MOD_CJ, IF_REAL, "Source/drain bottom junction capacitance per unit area"), +IOP( "vfbcv", BSIM3v1_MOD_VFBCV, IF_REAL, "Flat Band Voltage parameter for capmod=0 only"), +IOP( "cjsw", BSIM3v1_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance per unit periphery"), -IOP( "cjswg", BSIM3V1_MOD_CJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance per unit width"), -IOP( "lint", BSIM3V1_MOD_LINT, IF_REAL, "Length reduction parameter"), -IOP( "ll", BSIM3V1_MOD_LL, IF_REAL, "Length reduction parameter"), -IOP( "lln", BSIM3V1_MOD_LLN, IF_REAL, "Length reduction parameter"), -IOP( "lw", BSIM3V1_MOD_LW, IF_REAL, "Length reduction parameter"), -IOP( "lwn", BSIM3V1_MOD_LWN, IF_REAL, "Length reduction parameter"), -IOP( "lwl", BSIM3V1_MOD_LWL, IF_REAL, "Length reduction parameter"), -IOP( "lmin", BSIM3V1_MOD_LMIN, IF_REAL, "Minimum length for the model"), -IOP( "lmax", BSIM3V1_MOD_LMAX, IF_REAL, "Maximum length for the model"), +IOP( "cjswg", BSIM3v1_MOD_CJSWG, IF_REAL, "Source/drain (gate side) sidewall junction capacitance per unit width"), +IOP( "lint", BSIM3v1_MOD_LINT, IF_REAL, "Length reduction parameter"), +IOP( "ll", BSIM3v1_MOD_LL, IF_REAL, "Length reduction parameter"), +IOP( "lln", BSIM3v1_MOD_LLN, IF_REAL, "Length reduction parameter"), +IOP( "lw", BSIM3v1_MOD_LW, IF_REAL, "Length reduction parameter"), +IOP( "lwn", BSIM3v1_MOD_LWN, IF_REAL, "Length reduction parameter"), +IOP( "lwl", BSIM3v1_MOD_LWL, IF_REAL, "Length reduction parameter"), +IOP( "lmin", BSIM3v1_MOD_LMIN, IF_REAL, "Minimum length for the model"), +IOP( "lmax", BSIM3v1_MOD_LMAX, IF_REAL, "Maximum length for the model"), -IOP( "wr", BSIM3V1_MOD_WR, IF_REAL, "Width dependence of rds"), -IOP( "wint", BSIM3V1_MOD_WINT, IF_REAL, "Width reduction parameter"), -IOP( "dwg", BSIM3V1_MOD_DWG, IF_REAL, "Width reduction parameter"), -IOP( "dwb", BSIM3V1_MOD_DWB, IF_REAL, "Width reduction parameter"), +IOP( "wr", BSIM3v1_MOD_WR, IF_REAL, "Width dependence of rds"), +IOP( "wint", BSIM3v1_MOD_WINT, IF_REAL, "Width reduction parameter"), +IOP( "dwg", BSIM3v1_MOD_DWG, IF_REAL, "Width reduction parameter"), +IOP( "dwb", BSIM3v1_MOD_DWB, IF_REAL, "Width reduction parameter"), -IOP( "wl", BSIM3V1_MOD_WL, IF_REAL, "Width reduction parameter"), -IOP( "wln", BSIM3V1_MOD_WLN, IF_REAL, "Width reduction parameter"), -IOP( "ww", BSIM3V1_MOD_WW, IF_REAL, "Width reduction parameter"), -IOP( "wwn", BSIM3V1_MOD_WWN, IF_REAL, "Width reduction parameter"), -IOP( "wwl", BSIM3V1_MOD_WWL, IF_REAL, "Width reduction parameter"), -IOP( "wmin", BSIM3V1_MOD_WMIN, IF_REAL, "Minimum width for the model"), -IOP( "wmax", BSIM3V1_MOD_WMAX, IF_REAL, "Maximum width for the model"), +IOP( "wl", BSIM3v1_MOD_WL, IF_REAL, "Width reduction parameter"), +IOP( "wln", BSIM3v1_MOD_WLN, IF_REAL, "Width reduction parameter"), +IOP( "ww", BSIM3v1_MOD_WW, IF_REAL, "Width reduction parameter"), +IOP( "wwn", BSIM3v1_MOD_WWN, IF_REAL, "Width reduction parameter"), +IOP( "wwl", BSIM3v1_MOD_WWL, IF_REAL, "Width reduction parameter"), +IOP( "wmin", BSIM3v1_MOD_WMIN, IF_REAL, "Minimum width for the model"), +IOP( "wmax", BSIM3v1_MOD_WMAX, IF_REAL, "Maximum width for the model"), -IOP( "b0", BSIM3V1_MOD_B0, IF_REAL, "Abulk narrow width parameter"), -IOP( "b1", BSIM3V1_MOD_B1, IF_REAL, "Abulk narrow width parameter"), +IOP( "b0", BSIM3v1_MOD_B0, IF_REAL, "Abulk narrow width parameter"), +IOP( "b1", BSIM3v1_MOD_B1, IF_REAL, "Abulk narrow width parameter"), -IOP( "cgsl", BSIM3V1_MOD_CGSL, IF_REAL, "New C-V model parameter"), -IOP( "cgdl", BSIM3V1_MOD_CGDL, IF_REAL, "New C-V model parameter"), -IOP( "ckappa", BSIM3V1_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), -IOP( "cf", BSIM3V1_MOD_CF, IF_REAL, "Fringe capacitance parameter"), -IOP( "clc", BSIM3V1_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "cle", BSIM3V1_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), -IOP( "dwc", BSIM3V1_MOD_DWC, IF_REAL, "Delta W for C-V model"), -IOP( "dlc", BSIM3V1_MOD_DLC, IF_REAL, "Delta L for C-V model"), +IOP( "cgsl", BSIM3v1_MOD_CGSL, IF_REAL, "New C-V model parameter"), +IOP( "cgdl", BSIM3v1_MOD_CGDL, IF_REAL, "New C-V model parameter"), +IOP( "ckappa", BSIM3v1_MOD_CKAPPA, IF_REAL, "New C-V model parameter"), +IOP( "cf", BSIM3v1_MOD_CF, IF_REAL, "Fringe capacitance parameter"), +IOP( "clc", BSIM3v1_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"), +IOP( "cle", BSIM3v1_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), +IOP( "dwc", BSIM3v1_MOD_DWC, IF_REAL, "Delta W for C-V model"), +IOP( "dlc", BSIM3v1_MOD_DLC, IF_REAL, "Delta L for C-V model"), -IOP( "alpha0", BSIM3V1_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), -IOP( "beta0", BSIM3V1_MOD_BETA0, IF_REAL, "substrate current model parameter"), +IOP( "alpha0", BSIM3v1_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), +IOP( "beta0", BSIM3v1_MOD_BETA0, IF_REAL, "substrate current model parameter"), -IOP( "lcdsc", BSIM3V1_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), -IOP( "lcdscb", BSIM3V1_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), -IOP( "lcdscd", BSIM3V1_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), -IOP( "lcit", BSIM3V1_MOD_LCIT, IF_REAL, "Length dependence of cit"), -IOP( "lnfactor", BSIM3V1_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), -IOP( "lxj", BSIM3V1_MOD_LXJ, IF_REAL, "Length dependence of xj"), -IOP( "lvsat", BSIM3V1_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), -IOP( "lat", BSIM3V1_MOD_LAT, IF_REAL, "Length dependence of at"), -IOP( "la0", BSIM3V1_MOD_LA0, IF_REAL, "Length dependence of a0"), -IOP( "lags", BSIM3V1_MOD_LAGS, IF_REAL, "Length dependence of ags"), -IOP( "la1", BSIM3V1_MOD_LA1, IF_REAL, "Length dependence of a1"), -IOP( "la2", BSIM3V1_MOD_LA2, IF_REAL, "Length dependence of a2"), -IOP( "lketa", BSIM3V1_MOD_LKETA, IF_REAL, "Length dependence of keta"), -IOP( "lnsub", BSIM3V1_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), -IOP( "lnch", BSIM3V1_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), -IOP( "lngate", BSIM3V1_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), -IOP( "lgamma1", BSIM3V1_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"), -IOP( "lgamma2", BSIM3V1_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"), -IOP( "lvbx", BSIM3V1_MOD_LVBX, IF_REAL, "Length dependence of vbx"), -IOP( "lvbm", BSIM3V1_MOD_LVBM, IF_REAL, "Length dependence of vbm"), -IOP( "lxt", BSIM3V1_MOD_LXT, IF_REAL, "Length dependence of xt"), -IOP( "lk1", BSIM3V1_MOD_LK1, IF_REAL, "Length dependence of k1"), -IOP( "lkt1", BSIM3V1_MOD_LKT1, IF_REAL, "Length dependence of kt1"), -IOP( "lkt1l", BSIM3V1_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), -IOP( "lkt2", BSIM3V1_MOD_LKT2, IF_REAL, "Length dependence of kt2"), -IOP( "lk2", BSIM3V1_MOD_LK2, IF_REAL, "Length dependence of k2"), -IOP( "lk3", BSIM3V1_MOD_LK3, IF_REAL, "Length dependence of k3"), -IOP( "lk3b", BSIM3V1_MOD_LK3B, IF_REAL, "Length dependence of k3b"), -IOP( "lw0", BSIM3V1_MOD_LW0, IF_REAL, "Length dependence of w0"), -IOP( "lnlx", BSIM3V1_MOD_LNLX, IF_REAL, "Length dependence of nlx"), -IOP( "ldvt0", BSIM3V1_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), -IOP( "ldvt1", BSIM3V1_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), -IOP( "ldvt2", BSIM3V1_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), -IOP( "ldvt0w", BSIM3V1_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), -IOP( "ldvt1w", BSIM3V1_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), -IOP( "ldvt2w", BSIM3V1_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), -IOP( "ldrout", BSIM3V1_MOD_LDROUT, IF_REAL, "Length dependence of drout"), -IOP( "ldsub", BSIM3V1_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), -IOP( "lvth0", BSIM3V1_MOD_LVTH0, IF_REAL,"Length dependence of vto"), -IOP( "lvtho", BSIM3V1_MOD_LVTH0, IF_REAL,"Length dependence of vto"), -IOP( "lua", BSIM3V1_MOD_LUA, IF_REAL, "Length dependence of ua"), -IOP( "lua1", BSIM3V1_MOD_LUA1, IF_REAL, "Length dependence of ua1"), -IOP( "lub", BSIM3V1_MOD_LUB, IF_REAL, "Length dependence of ub"), -IOP( "lub1", BSIM3V1_MOD_LUB1, IF_REAL, "Length dependence of ub1"), -IOP( "luc", BSIM3V1_MOD_LUC, IF_REAL, "Length dependence of uc"), -IOP( "luc1", BSIM3V1_MOD_LUC1, IF_REAL, "Length dependence of uc1"), -IOP( "lu0", BSIM3V1_MOD_LU0, IF_REAL, "Length dependence of u0"), -IOP( "lute", BSIM3V1_MOD_LUTE, IF_REAL, "Length dependence of ute"), -IOP( "lvoff", BSIM3V1_MOD_LVOFF, IF_REAL, "Length dependence of voff"), -IOP( "lelm", BSIM3V1_MOD_LELM, IF_REAL, "Length dependence of elm"), -IOP( "ldelta", BSIM3V1_MOD_LDELTA, IF_REAL, "Length dependence of delta"), -IOP( "lrdsw", BSIM3V1_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), +IOP( "lcdsc", BSIM3v1_MOD_LCDSC, IF_REAL, "Length dependence of cdsc"), +IOP( "lcdscb", BSIM3v1_MOD_LCDSCB, IF_REAL, "Length dependence of cdscb"), +IOP( "lcdscd", BSIM3v1_MOD_LCDSCD, IF_REAL, "Length dependence of cdscd"), +IOP( "lcit", BSIM3v1_MOD_LCIT, IF_REAL, "Length dependence of cit"), +IOP( "lnfactor", BSIM3v1_MOD_LNFACTOR, IF_REAL, "Length dependence of nfactor"), +IOP( "lxj", BSIM3v1_MOD_LXJ, IF_REAL, "Length dependence of xj"), +IOP( "lvsat", BSIM3v1_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), +IOP( "lat", BSIM3v1_MOD_LAT, IF_REAL, "Length dependence of at"), +IOP( "la0", BSIM3v1_MOD_LA0, IF_REAL, "Length dependence of a0"), +IOP( "lags", BSIM3v1_MOD_LAGS, IF_REAL, "Length dependence of ags"), +IOP( "la1", BSIM3v1_MOD_LA1, IF_REAL, "Length dependence of a1"), +IOP( "la2", BSIM3v1_MOD_LA2, IF_REAL, "Length dependence of a2"), +IOP( "lketa", BSIM3v1_MOD_LKETA, IF_REAL, "Length dependence of keta"), +IOP( "lnsub", BSIM3v1_MOD_LNSUB, IF_REAL, "Length dependence of nsub"), +IOP( "lnch", BSIM3v1_MOD_LNPEAK, IF_REAL, "Length dependence of nch"), +IOP( "lngate", BSIM3v1_MOD_LNGATE, IF_REAL, "Length dependence of ngate"), +IOP( "lgamma1", BSIM3v1_MOD_LGAMMA1, IF_REAL, "Length dependence of gamma1"), +IOP( "lgamma2", BSIM3v1_MOD_LGAMMA2, IF_REAL, "Length dependence of gamma2"), +IOP( "lvbx", BSIM3v1_MOD_LVBX, IF_REAL, "Length dependence of vbx"), +IOP( "lvbm", BSIM3v1_MOD_LVBM, IF_REAL, "Length dependence of vbm"), +IOP( "lxt", BSIM3v1_MOD_LXT, IF_REAL, "Length dependence of xt"), +IOP( "lk1", BSIM3v1_MOD_LK1, IF_REAL, "Length dependence of k1"), +IOP( "lkt1", BSIM3v1_MOD_LKT1, IF_REAL, "Length dependence of kt1"), +IOP( "lkt1l", BSIM3v1_MOD_LKT1L, IF_REAL, "Length dependence of kt1l"), +IOP( "lkt2", BSIM3v1_MOD_LKT2, IF_REAL, "Length dependence of kt2"), +IOP( "lk2", BSIM3v1_MOD_LK2, IF_REAL, "Length dependence of k2"), +IOP( "lk3", BSIM3v1_MOD_LK3, IF_REAL, "Length dependence of k3"), +IOP( "lk3b", BSIM3v1_MOD_LK3B, IF_REAL, "Length dependence of k3b"), +IOP( "lw0", BSIM3v1_MOD_LW0, IF_REAL, "Length dependence of w0"), +IOP( "lnlx", BSIM3v1_MOD_LNLX, IF_REAL, "Length dependence of nlx"), +IOP( "ldvt0", BSIM3v1_MOD_LDVT0, IF_REAL, "Length dependence of dvt0"), +IOP( "ldvt1", BSIM3v1_MOD_LDVT1, IF_REAL, "Length dependence of dvt1"), +IOP( "ldvt2", BSIM3v1_MOD_LDVT2, IF_REAL, "Length dependence of dvt2"), +IOP( "ldvt0w", BSIM3v1_MOD_LDVT0W, IF_REAL, "Length dependence of dvt0w"), +IOP( "ldvt1w", BSIM3v1_MOD_LDVT1W, IF_REAL, "Length dependence of dvt1w"), +IOP( "ldvt2w", BSIM3v1_MOD_LDVT2W, IF_REAL, "Length dependence of dvt2w"), +IOP( "ldrout", BSIM3v1_MOD_LDROUT, IF_REAL, "Length dependence of drout"), +IOP( "ldsub", BSIM3v1_MOD_LDSUB, IF_REAL, "Length dependence of dsub"), +IOP( "lvth0", BSIM3v1_MOD_LVTH0, IF_REAL,"Length dependence of vto"), +IOP( "lvtho", BSIM3v1_MOD_LVTH0, IF_REAL,"Length dependence of vto"), +IOP( "lua", BSIM3v1_MOD_LUA, IF_REAL, "Length dependence of ua"), +IOP( "lua1", BSIM3v1_MOD_LUA1, IF_REAL, "Length dependence of ua1"), +IOP( "lub", BSIM3v1_MOD_LUB, IF_REAL, "Length dependence of ub"), +IOP( "lub1", BSIM3v1_MOD_LUB1, IF_REAL, "Length dependence of ub1"), +IOP( "luc", BSIM3v1_MOD_LUC, IF_REAL, "Length dependence of uc"), +IOP( "luc1", BSIM3v1_MOD_LUC1, IF_REAL, "Length dependence of uc1"), +IOP( "lu0", BSIM3v1_MOD_LU0, IF_REAL, "Length dependence of u0"), +IOP( "lute", BSIM3v1_MOD_LUTE, IF_REAL, "Length dependence of ute"), +IOP( "lvoff", BSIM3v1_MOD_LVOFF, IF_REAL, "Length dependence of voff"), +IOP( "lelm", BSIM3v1_MOD_LELM, IF_REAL, "Length dependence of elm"), +IOP( "ldelta", BSIM3v1_MOD_LDELTA, IF_REAL, "Length dependence of delta"), +IOP( "lrdsw", BSIM3v1_MOD_LRDSW, IF_REAL, "Length dependence of rdsw "), -IOP( "lprwg", BSIM3V1_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), -IOP( "lprwb", BSIM3V1_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), +IOP( "lprwg", BSIM3v1_MOD_LPRWG, IF_REAL, "Length dependence of prwg "), +IOP( "lprwb", BSIM3v1_MOD_LPRWB, IF_REAL, "Length dependence of prwb "), -IOP( "lprt", BSIM3V1_MOD_LPRT, IF_REAL, "Length dependence of prt "), -IOP( "leta0", BSIM3V1_MOD_LETA0, IF_REAL, "Length dependence of eta0"), -IOP( "letab", BSIM3V1_MOD_LETAB, IF_REAL, "Length dependence of etab"), -IOP( "lpclm", BSIM3V1_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), -IOP( "lpdiblc1", BSIM3V1_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), -IOP( "lpdiblc2", BSIM3V1_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), -IOP( "lpdiblcb", BSIM3V1_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), -IOP( "lpscbe1", BSIM3V1_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), -IOP( "lpscbe2", BSIM3V1_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), -IOP( "lpvag", BSIM3V1_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), -IOP( "lwr", BSIM3V1_MOD_LWR, IF_REAL, "Length dependence of wr"), -IOP( "ldwg", BSIM3V1_MOD_LDWG, IF_REAL, "Length dependence of dwg"), -IOP( "ldwb", BSIM3V1_MOD_LDWB, IF_REAL, "Length dependence of dwb"), -IOP( "lb0", BSIM3V1_MOD_LB0, IF_REAL, "Length dependence of b0"), -IOP( "lb1", BSIM3V1_MOD_LB1, IF_REAL, "Length dependence of b1"), -IOP( "lcgsl", BSIM3V1_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), -IOP( "lcgdl", BSIM3V1_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), -IOP( "lckappa", BSIM3V1_MOD_LCKAPPA, IF_REAL, "Length dependence of ckappa"), -IOP( "lcf", BSIM3V1_MOD_LCF, IF_REAL, "Length dependence of cf"), -IOP( "lclc", BSIM3V1_MOD_LCLC, IF_REAL, "Length dependence of clc"), -IOP( "lcle", BSIM3V1_MOD_LCLE, IF_REAL, "Length dependence of cle"), -IOP( "lalpha0", BSIM3V1_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), -IOP( "lbeta0", BSIM3V1_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), -IOP( "lvfbcv", BSIM3V1_MOD_LVFBCV, IF_REAL, "Length dependence of vfbcv"), -IOP( "wcdsc", BSIM3V1_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), -IOP( "wcdscb", BSIM3V1_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), -IOP( "wcdscd", BSIM3V1_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), -IOP( "wcit", BSIM3V1_MOD_WCIT, IF_REAL, "Width dependence of cit"), -IOP( "wnfactor", BSIM3V1_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), -IOP( "wxj", BSIM3V1_MOD_WXJ, IF_REAL, "Width dependence of xj"), -IOP( "wvsat", BSIM3V1_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), -IOP( "wat", BSIM3V1_MOD_WAT, IF_REAL, "Width dependence of at"), -IOP( "wa0", BSIM3V1_MOD_WA0, IF_REAL, "Width dependence of a0"), -IOP( "wags", BSIM3V1_MOD_WAGS, IF_REAL, "Width dependence of ags"), -IOP( "wa1", BSIM3V1_MOD_WA1, IF_REAL, "Width dependence of a1"), -IOP( "wa2", BSIM3V1_MOD_WA2, IF_REAL, "Width dependence of a2"), -IOP( "wketa", BSIM3V1_MOD_WKETA, IF_REAL, "Width dependence of keta"), -IOP( "wnsub", BSIM3V1_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), -IOP( "wnch", BSIM3V1_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), -IOP( "wngate", BSIM3V1_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), -IOP( "wgamma1", BSIM3V1_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"), -IOP( "wgamma2", BSIM3V1_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"), -IOP( "wvbx", BSIM3V1_MOD_WVBX, IF_REAL, "Width dependence of vbx"), -IOP( "wvbm", BSIM3V1_MOD_WVBM, IF_REAL, "Width dependence of vbm"), -IOP( "wxt", BSIM3V1_MOD_WXT, IF_REAL, "Width dependence of xt"), -IOP( "wk1", BSIM3V1_MOD_WK1, IF_REAL, "Width dependence of k1"), -IOP( "wkt1", BSIM3V1_MOD_WKT1, IF_REAL, "Width dependence of kt1"), -IOP( "wkt1l", BSIM3V1_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), -IOP( "wkt2", BSIM3V1_MOD_WKT2, IF_REAL, "Width dependence of kt2"), -IOP( "wk2", BSIM3V1_MOD_WK2, IF_REAL, "Width dependence of k2"), -IOP( "wk3", BSIM3V1_MOD_WK3, IF_REAL, "Width dependence of k3"), -IOP( "wk3b", BSIM3V1_MOD_WK3B, IF_REAL, "Width dependence of k3b"), -IOP( "ww0", BSIM3V1_MOD_WW0, IF_REAL, "Width dependence of w0"), -IOP( "wnlx", BSIM3V1_MOD_WNLX, IF_REAL, "Width dependence of nlx"), -IOP( "wdvt0", BSIM3V1_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), -IOP( "wdvt1", BSIM3V1_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), -IOP( "wdvt2", BSIM3V1_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), -IOP( "wdvt0w", BSIM3V1_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), -IOP( "wdvt1w", BSIM3V1_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), -IOP( "wdvt2w", BSIM3V1_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), -IOP( "wdrout", BSIM3V1_MOD_WDROUT, IF_REAL, "Width dependence of drout"), -IOP( "wdsub", BSIM3V1_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), -IOP( "wvth0", BSIM3V1_MOD_WVTH0, IF_REAL,"Width dependence of vto"), -IOP( "wvtho", BSIM3V1_MOD_WVTH0, IF_REAL,"Width dependence of vto"), -IOP( "wua", BSIM3V1_MOD_WUA, IF_REAL, "Width dependence of ua"), -IOP( "wua1", BSIM3V1_MOD_WUA1, IF_REAL, "Width dependence of ua1"), -IOP( "wub", BSIM3V1_MOD_WUB, IF_REAL, "Width dependence of ub"), -IOP( "wub1", BSIM3V1_MOD_WUB1, IF_REAL, "Width dependence of ub1"), -IOP( "wuc", BSIM3V1_MOD_WUC, IF_REAL, "Width dependence of uc"), -IOP( "wuc1", BSIM3V1_MOD_WUC1, IF_REAL, "Width dependence of uc1"), -IOP( "wu0", BSIM3V1_MOD_WU0, IF_REAL, "Width dependence of u0"), -IOP( "wute", BSIM3V1_MOD_WUTE, IF_REAL, "Width dependence of ute"), -IOP( "wvoff", BSIM3V1_MOD_WVOFF, IF_REAL, "Width dependence of voff"), -IOP( "welm", BSIM3V1_MOD_WELM, IF_REAL, "Width dependence of elm"), -IOP( "wdelta", BSIM3V1_MOD_WDELTA, IF_REAL, "Width dependence of delta"), -IOP( "wrdsw", BSIM3V1_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), +IOP( "lprt", BSIM3v1_MOD_LPRT, IF_REAL, "Length dependence of prt "), +IOP( "leta0", BSIM3v1_MOD_LETA0, IF_REAL, "Length dependence of eta0"), +IOP( "letab", BSIM3v1_MOD_LETAB, IF_REAL, "Length dependence of etab"), +IOP( "lpclm", BSIM3v1_MOD_LPCLM, IF_REAL, "Length dependence of pclm"), +IOP( "lpdiblc1", BSIM3v1_MOD_LPDIBL1, IF_REAL, "Length dependence of pdiblc1"), +IOP( "lpdiblc2", BSIM3v1_MOD_LPDIBL2, IF_REAL, "Length dependence of pdiblc2"), +IOP( "lpdiblcb", BSIM3v1_MOD_LPDIBLB, IF_REAL, "Length dependence of pdiblcb"), +IOP( "lpscbe1", BSIM3v1_MOD_LPSCBE1, IF_REAL, "Length dependence of pscbe1"), +IOP( "lpscbe2", BSIM3v1_MOD_LPSCBE2, IF_REAL, "Length dependence of pscbe2"), +IOP( "lpvag", BSIM3v1_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), +IOP( "lwr", BSIM3v1_MOD_LWR, IF_REAL, "Length dependence of wr"), +IOP( "ldwg", BSIM3v1_MOD_LDWG, IF_REAL, "Length dependence of dwg"), +IOP( "ldwb", BSIM3v1_MOD_LDWB, IF_REAL, "Length dependence of dwb"), +IOP( "lb0", BSIM3v1_MOD_LB0, IF_REAL, "Length dependence of b0"), +IOP( "lb1", BSIM3v1_MOD_LB1, IF_REAL, "Length dependence of b1"), +IOP( "lcgsl", BSIM3v1_MOD_LCGSL, IF_REAL, "Length dependence of cgsl"), +IOP( "lcgdl", BSIM3v1_MOD_LCGDL, IF_REAL, "Length dependence of cgdl"), +IOP( "lckappa", BSIM3v1_MOD_LCKAPPA, IF_REAL, "Length dependence of ckappa"), +IOP( "lcf", BSIM3v1_MOD_LCF, IF_REAL, "Length dependence of cf"), +IOP( "lclc", BSIM3v1_MOD_LCLC, IF_REAL, "Length dependence of clc"), +IOP( "lcle", BSIM3v1_MOD_LCLE, IF_REAL, "Length dependence of cle"), +IOP( "lalpha0", BSIM3v1_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), +IOP( "lbeta0", BSIM3v1_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), +IOP( "lvfbcv", BSIM3v1_MOD_LVFBCV, IF_REAL, "Length dependence of vfbcv"), +IOP( "wcdsc", BSIM3v1_MOD_WCDSC, IF_REAL, "Width dependence of cdsc"), +IOP( "wcdscb", BSIM3v1_MOD_WCDSCB, IF_REAL, "Width dependence of cdscb"), +IOP( "wcdscd", BSIM3v1_MOD_WCDSCD, IF_REAL, "Width dependence of cdscd"), +IOP( "wcit", BSIM3v1_MOD_WCIT, IF_REAL, "Width dependence of cit"), +IOP( "wnfactor", BSIM3v1_MOD_WNFACTOR, IF_REAL, "Width dependence of nfactor"), +IOP( "wxj", BSIM3v1_MOD_WXJ, IF_REAL, "Width dependence of xj"), +IOP( "wvsat", BSIM3v1_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), +IOP( "wat", BSIM3v1_MOD_WAT, IF_REAL, "Width dependence of at"), +IOP( "wa0", BSIM3v1_MOD_WA0, IF_REAL, "Width dependence of a0"), +IOP( "wags", BSIM3v1_MOD_WAGS, IF_REAL, "Width dependence of ags"), +IOP( "wa1", BSIM3v1_MOD_WA1, IF_REAL, "Width dependence of a1"), +IOP( "wa2", BSIM3v1_MOD_WA2, IF_REAL, "Width dependence of a2"), +IOP( "wketa", BSIM3v1_MOD_WKETA, IF_REAL, "Width dependence of keta"), +IOP( "wnsub", BSIM3v1_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), +IOP( "wnch", BSIM3v1_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), +IOP( "wngate", BSIM3v1_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), +IOP( "wgamma1", BSIM3v1_MOD_WGAMMA1, IF_REAL, "Width dependence of gamma1"), +IOP( "wgamma2", BSIM3v1_MOD_WGAMMA2, IF_REAL, "Width dependence of gamma2"), +IOP( "wvbx", BSIM3v1_MOD_WVBX, IF_REAL, "Width dependence of vbx"), +IOP( "wvbm", BSIM3v1_MOD_WVBM, IF_REAL, "Width dependence of vbm"), +IOP( "wxt", BSIM3v1_MOD_WXT, IF_REAL, "Width dependence of xt"), +IOP( "wk1", BSIM3v1_MOD_WK1, IF_REAL, "Width dependence of k1"), +IOP( "wkt1", BSIM3v1_MOD_WKT1, IF_REAL, "Width dependence of kt1"), +IOP( "wkt1l", BSIM3v1_MOD_WKT1L, IF_REAL, "Width dependence of kt1l"), +IOP( "wkt2", BSIM3v1_MOD_WKT2, IF_REAL, "Width dependence of kt2"), +IOP( "wk2", BSIM3v1_MOD_WK2, IF_REAL, "Width dependence of k2"), +IOP( "wk3", BSIM3v1_MOD_WK3, IF_REAL, "Width dependence of k3"), +IOP( "wk3b", BSIM3v1_MOD_WK3B, IF_REAL, "Width dependence of k3b"), +IOP( "ww0", BSIM3v1_MOD_WW0, IF_REAL, "Width dependence of w0"), +IOP( "wnlx", BSIM3v1_MOD_WNLX, IF_REAL, "Width dependence of nlx"), +IOP( "wdvt0", BSIM3v1_MOD_WDVT0, IF_REAL, "Width dependence of dvt0"), +IOP( "wdvt1", BSIM3v1_MOD_WDVT1, IF_REAL, "Width dependence of dvt1"), +IOP( "wdvt2", BSIM3v1_MOD_WDVT2, IF_REAL, "Width dependence of dvt2"), +IOP( "wdvt0w", BSIM3v1_MOD_WDVT0W, IF_REAL, "Width dependence of dvt0w"), +IOP( "wdvt1w", BSIM3v1_MOD_WDVT1W, IF_REAL, "Width dependence of dvt1w"), +IOP( "wdvt2w", BSIM3v1_MOD_WDVT2W, IF_REAL, "Width dependence of dvt2w"), +IOP( "wdrout", BSIM3v1_MOD_WDROUT, IF_REAL, "Width dependence of drout"), +IOP( "wdsub", BSIM3v1_MOD_WDSUB, IF_REAL, "Width dependence of dsub"), +IOP( "wvth0", BSIM3v1_MOD_WVTH0, IF_REAL,"Width dependence of vto"), +IOP( "wvtho", BSIM3v1_MOD_WVTH0, IF_REAL,"Width dependence of vto"), +IOP( "wua", BSIM3v1_MOD_WUA, IF_REAL, "Width dependence of ua"), +IOP( "wua1", BSIM3v1_MOD_WUA1, IF_REAL, "Width dependence of ua1"), +IOP( "wub", BSIM3v1_MOD_WUB, IF_REAL, "Width dependence of ub"), +IOP( "wub1", BSIM3v1_MOD_WUB1, IF_REAL, "Width dependence of ub1"), +IOP( "wuc", BSIM3v1_MOD_WUC, IF_REAL, "Width dependence of uc"), +IOP( "wuc1", BSIM3v1_MOD_WUC1, IF_REAL, "Width dependence of uc1"), +IOP( "wu0", BSIM3v1_MOD_WU0, IF_REAL, "Width dependence of u0"), +IOP( "wute", BSIM3v1_MOD_WUTE, IF_REAL, "Width dependence of ute"), +IOP( "wvoff", BSIM3v1_MOD_WVOFF, IF_REAL, "Width dependence of voff"), +IOP( "welm", BSIM3v1_MOD_WELM, IF_REAL, "Width dependence of elm"), +IOP( "wdelta", BSIM3v1_MOD_WDELTA, IF_REAL, "Width dependence of delta"), +IOP( "wrdsw", BSIM3v1_MOD_WRDSW, IF_REAL, "Width dependence of rdsw "), -IOP( "wprwg", BSIM3V1_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), -IOP( "wprwb", BSIM3V1_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), +IOP( "wprwg", BSIM3v1_MOD_WPRWG, IF_REAL, "Width dependence of prwg "), +IOP( "wprwb", BSIM3v1_MOD_WPRWB, IF_REAL, "Width dependence of prwb "), -IOP( "wprt", BSIM3V1_MOD_WPRT, IF_REAL, "Width dependence of prt"), -IOP( "weta0", BSIM3V1_MOD_WETA0, IF_REAL, "Width dependence of eta0"), -IOP( "wetab", BSIM3V1_MOD_WETAB, IF_REAL, "Width dependence of etab"), -IOP( "wpclm", BSIM3V1_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), -IOP( "wpdiblc1", BSIM3V1_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), -IOP( "wpdiblc2", BSIM3V1_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), -IOP( "wpdiblcb", BSIM3V1_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), -IOP( "wpscbe1", BSIM3V1_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), -IOP( "wpscbe2", BSIM3V1_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), -IOP( "wpvag", BSIM3V1_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), -IOP( "wwr", BSIM3V1_MOD_WWR, IF_REAL, "Width dependence of wr"), -IOP( "wdwg", BSIM3V1_MOD_WDWG, IF_REAL, "Width dependence of dwg"), -IOP( "wdwb", BSIM3V1_MOD_WDWB, IF_REAL, "Width dependence of dwb"), -IOP( "wb0", BSIM3V1_MOD_WB0, IF_REAL, "Width dependence of b0"), -IOP( "wb1", BSIM3V1_MOD_WB1, IF_REAL, "Width dependence of b1"), -IOP( "wcgsl", BSIM3V1_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), -IOP( "wcgdl", BSIM3V1_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), -IOP( "wckappa", BSIM3V1_MOD_WCKAPPA, IF_REAL, "Width dependence of ckappa"), -IOP( "wcf", BSIM3V1_MOD_WCF, IF_REAL, "Width dependence of cf"), -IOP( "wclc", BSIM3V1_MOD_WCLC, IF_REAL, "Width dependence of clc"), -IOP( "wcle", BSIM3V1_MOD_WCLE, IF_REAL, "Width dependence of cle"), -IOP( "walpha0", BSIM3V1_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), -IOP( "wbeta0", BSIM3V1_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), -IOP( "wvfbcv", BSIM3V1_MOD_WVFBCV, IF_REAL, "Width dependence of vfbcv"), +IOP( "wprt", BSIM3v1_MOD_WPRT, IF_REAL, "Width dependence of prt"), +IOP( "weta0", BSIM3v1_MOD_WETA0, IF_REAL, "Width dependence of eta0"), +IOP( "wetab", BSIM3v1_MOD_WETAB, IF_REAL, "Width dependence of etab"), +IOP( "wpclm", BSIM3v1_MOD_WPCLM, IF_REAL, "Width dependence of pclm"), +IOP( "wpdiblc1", BSIM3v1_MOD_WPDIBL1, IF_REAL, "Width dependence of pdiblc1"), +IOP( "wpdiblc2", BSIM3v1_MOD_WPDIBL2, IF_REAL, "Width dependence of pdiblc2"), +IOP( "wpdiblcb", BSIM3v1_MOD_WPDIBLB, IF_REAL, "Width dependence of pdiblcb"), +IOP( "wpscbe1", BSIM3v1_MOD_WPSCBE1, IF_REAL, "Width dependence of pscbe1"), +IOP( "wpscbe2", BSIM3v1_MOD_WPSCBE2, IF_REAL, "Width dependence of pscbe2"), +IOP( "wpvag", BSIM3v1_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), +IOP( "wwr", BSIM3v1_MOD_WWR, IF_REAL, "Width dependence of wr"), +IOP( "wdwg", BSIM3v1_MOD_WDWG, IF_REAL, "Width dependence of dwg"), +IOP( "wdwb", BSIM3v1_MOD_WDWB, IF_REAL, "Width dependence of dwb"), +IOP( "wb0", BSIM3v1_MOD_WB0, IF_REAL, "Width dependence of b0"), +IOP( "wb1", BSIM3v1_MOD_WB1, IF_REAL, "Width dependence of b1"), +IOP( "wcgsl", BSIM3v1_MOD_WCGSL, IF_REAL, "Width dependence of cgsl"), +IOP( "wcgdl", BSIM3v1_MOD_WCGDL, IF_REAL, "Width dependence of cgdl"), +IOP( "wckappa", BSIM3v1_MOD_WCKAPPA, IF_REAL, "Width dependence of ckappa"), +IOP( "wcf", BSIM3v1_MOD_WCF, IF_REAL, "Width dependence of cf"), +IOP( "wclc", BSIM3v1_MOD_WCLC, IF_REAL, "Width dependence of clc"), +IOP( "wcle", BSIM3v1_MOD_WCLE, IF_REAL, "Width dependence of cle"), +IOP( "walpha0", BSIM3v1_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), +IOP( "wbeta0", BSIM3v1_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), +IOP( "wvfbcv", BSIM3v1_MOD_WVFBCV, IF_REAL, "Width dependence of vfbcv"), -IOP( "pcdsc", BSIM3V1_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), -IOP( "pcdscb", BSIM3V1_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), -IOP( "pcdscd", BSIM3V1_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), -IOP( "pcit", BSIM3V1_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), -IOP( "pnfactor", BSIM3V1_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), -IOP( "pxj", BSIM3V1_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), -IOP( "pvsat", BSIM3V1_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), -IOP( "pat", BSIM3V1_MOD_PAT, IF_REAL, "Cross-term dependence of at"), -IOP( "pa0", BSIM3V1_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), -IOP( "pags", BSIM3V1_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), -IOP( "pa1", BSIM3V1_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), -IOP( "pa2", BSIM3V1_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), -IOP( "pketa", BSIM3V1_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), -IOP( "pnsub", BSIM3V1_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), -IOP( "pnch", BSIM3V1_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), -IOP( "pngate", BSIM3V1_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), -IOP( "pgamma1", BSIM3V1_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"), -IOP( "pgamma2", BSIM3V1_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"), -IOP( "pvbx", BSIM3V1_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"), -IOP( "pvbm", BSIM3V1_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"), -IOP( "pxt", BSIM3V1_MOD_PXT, IF_REAL, "Cross-term dependence of xt"), -IOP( "pk1", BSIM3V1_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), -IOP( "pkt1", BSIM3V1_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), -IOP( "pkt1l", BSIM3V1_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), -IOP( "pkt2", BSIM3V1_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), -IOP( "pk2", BSIM3V1_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), -IOP( "pk3", BSIM3V1_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), -IOP( "pk3b", BSIM3V1_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), -IOP( "pw0", BSIM3V1_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), -IOP( "pnlx", BSIM3V1_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), -IOP( "pdvt0", BSIM3V1_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), -IOP( "pdvt1", BSIM3V1_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), -IOP( "pdvt2", BSIM3V1_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), -IOP( "pdvt0w", BSIM3V1_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), -IOP( "pdvt1w", BSIM3V1_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), -IOP( "pdvt2w", BSIM3V1_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), -IOP( "pdrout", BSIM3V1_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), -IOP( "pdsub", BSIM3V1_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), -IOP( "pvth0", BSIM3V1_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"), -IOP( "pvtho", BSIM3V1_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"), -IOP( "pua", BSIM3V1_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), -IOP( "pua1", BSIM3V1_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), -IOP( "pub", BSIM3V1_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), -IOP( "pub1", BSIM3V1_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), -IOP( "puc", BSIM3V1_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), -IOP( "puc1", BSIM3V1_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), -IOP( "pu0", BSIM3V1_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), -IOP( "pute", BSIM3V1_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), -IOP( "pvoff", BSIM3V1_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), -IOP( "pelm", BSIM3V1_MOD_PELM, IF_REAL, "Cross-term dependence of elm"), -IOP( "pdelta", BSIM3V1_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), -IOP( "prdsw", BSIM3V1_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), +IOP( "pcdsc", BSIM3v1_MOD_PCDSC, IF_REAL, "Cross-term dependence of cdsc"), +IOP( "pcdscb", BSIM3v1_MOD_PCDSCB, IF_REAL, "Cross-term dependence of cdscb"), +IOP( "pcdscd", BSIM3v1_MOD_PCDSCD, IF_REAL, "Cross-term dependence of cdscd"), +IOP( "pcit", BSIM3v1_MOD_PCIT, IF_REAL, "Cross-term dependence of cit"), +IOP( "pnfactor", BSIM3v1_MOD_PNFACTOR, IF_REAL, "Cross-term dependence of nfactor"), +IOP( "pxj", BSIM3v1_MOD_PXJ, IF_REAL, "Cross-term dependence of xj"), +IOP( "pvsat", BSIM3v1_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), +IOP( "pat", BSIM3v1_MOD_PAT, IF_REAL, "Cross-term dependence of at"), +IOP( "pa0", BSIM3v1_MOD_PA0, IF_REAL, "Cross-term dependence of a0"), +IOP( "pags", BSIM3v1_MOD_PAGS, IF_REAL, "Cross-term dependence of ags"), +IOP( "pa1", BSIM3v1_MOD_PA1, IF_REAL, "Cross-term dependence of a1"), +IOP( "pa2", BSIM3v1_MOD_PA2, IF_REAL, "Cross-term dependence of a2"), +IOP( "pketa", BSIM3v1_MOD_PKETA, IF_REAL, "Cross-term dependence of keta"), +IOP( "pnsub", BSIM3v1_MOD_PNSUB, IF_REAL, "Cross-term dependence of nsub"), +IOP( "pnch", BSIM3v1_MOD_PNPEAK, IF_REAL, "Cross-term dependence of nch"), +IOP( "pngate", BSIM3v1_MOD_PNGATE, IF_REAL, "Cross-term dependence of ngate"), +IOP( "pgamma1", BSIM3v1_MOD_PGAMMA1, IF_REAL, "Cross-term dependence of gamma1"), +IOP( "pgamma2", BSIM3v1_MOD_PGAMMA2, IF_REAL, "Cross-term dependence of gamma2"), +IOP( "pvbx", BSIM3v1_MOD_PVBX, IF_REAL, "Cross-term dependence of vbx"), +IOP( "pvbm", BSIM3v1_MOD_PVBM, IF_REAL, "Cross-term dependence of vbm"), +IOP( "pxt", BSIM3v1_MOD_PXT, IF_REAL, "Cross-term dependence of xt"), +IOP( "pk1", BSIM3v1_MOD_PK1, IF_REAL, "Cross-term dependence of k1"), +IOP( "pkt1", BSIM3v1_MOD_PKT1, IF_REAL, "Cross-term dependence of kt1"), +IOP( "pkt1l", BSIM3v1_MOD_PKT1L, IF_REAL, "Cross-term dependence of kt1l"), +IOP( "pkt2", BSIM3v1_MOD_PKT2, IF_REAL, "Cross-term dependence of kt2"), +IOP( "pk2", BSIM3v1_MOD_PK2, IF_REAL, "Cross-term dependence of k2"), +IOP( "pk3", BSIM3v1_MOD_PK3, IF_REAL, "Cross-term dependence of k3"), +IOP( "pk3b", BSIM3v1_MOD_PK3B, IF_REAL, "Cross-term dependence of k3b"), +IOP( "pw0", BSIM3v1_MOD_PW0, IF_REAL, "Cross-term dependence of w0"), +IOP( "pnlx", BSIM3v1_MOD_PNLX, IF_REAL, "Cross-term dependence of nlx"), +IOP( "pdvt0", BSIM3v1_MOD_PDVT0, IF_REAL, "Cross-term dependence of dvt0"), +IOP( "pdvt1", BSIM3v1_MOD_PDVT1, IF_REAL, "Cross-term dependence of dvt1"), +IOP( "pdvt2", BSIM3v1_MOD_PDVT2, IF_REAL, "Cross-term dependence of dvt2"), +IOP( "pdvt0w", BSIM3v1_MOD_PDVT0W, IF_REAL, "Cross-term dependence of dvt0w"), +IOP( "pdvt1w", BSIM3v1_MOD_PDVT1W, IF_REAL, "Cross-term dependence of dvt1w"), +IOP( "pdvt2w", BSIM3v1_MOD_PDVT2W, IF_REAL, "Cross-term dependence of dvt2w"), +IOP( "pdrout", BSIM3v1_MOD_PDROUT, IF_REAL, "Cross-term dependence of drout"), +IOP( "pdsub", BSIM3v1_MOD_PDSUB, IF_REAL, "Cross-term dependence of dsub"), +IOP( "pvth0", BSIM3v1_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"), +IOP( "pvtho", BSIM3v1_MOD_PVTH0, IF_REAL,"Cross-term dependence of vto"), +IOP( "pua", BSIM3v1_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), +IOP( "pua1", BSIM3v1_MOD_PUA1, IF_REAL, "Cross-term dependence of ua1"), +IOP( "pub", BSIM3v1_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), +IOP( "pub1", BSIM3v1_MOD_PUB1, IF_REAL, "Cross-term dependence of ub1"), +IOP( "puc", BSIM3v1_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), +IOP( "puc1", BSIM3v1_MOD_PUC1, IF_REAL, "Cross-term dependence of uc1"), +IOP( "pu0", BSIM3v1_MOD_PU0, IF_REAL, "Cross-term dependence of u0"), +IOP( "pute", BSIM3v1_MOD_PUTE, IF_REAL, "Cross-term dependence of ute"), +IOP( "pvoff", BSIM3v1_MOD_PVOFF, IF_REAL, "Cross-term dependence of voff"), +IOP( "pelm", BSIM3v1_MOD_PELM, IF_REAL, "Cross-term dependence of elm"), +IOP( "pdelta", BSIM3v1_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), +IOP( "prdsw", BSIM3v1_MOD_PRDSW, IF_REAL, "Cross-term dependence of rdsw "), -IOP( "pprwg", BSIM3V1_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), -IOP( "pprwb", BSIM3V1_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), +IOP( "pprwg", BSIM3v1_MOD_PPRWG, IF_REAL, "Cross-term dependence of prwg "), +IOP( "pprwb", BSIM3v1_MOD_PPRWB, IF_REAL, "Cross-term dependence of prwb "), -IOP( "pprt", BSIM3V1_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), -IOP( "peta0", BSIM3V1_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), -IOP( "petab", BSIM3V1_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), -IOP( "ppclm", BSIM3V1_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), -IOP( "ppdiblc1", BSIM3V1_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), -IOP( "ppdiblc2", BSIM3V1_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), -IOP( "ppdiblcb", BSIM3V1_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), -IOP( "ppscbe1", BSIM3V1_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), -IOP( "ppscbe2", BSIM3V1_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), -IOP( "ppvag", BSIM3V1_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), -IOP( "pwr", BSIM3V1_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), -IOP( "pdwg", BSIM3V1_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), -IOP( "pdwb", BSIM3V1_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), -IOP( "pb0", BSIM3V1_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), -IOP( "pb1", BSIM3V1_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), -IOP( "pcgsl", BSIM3V1_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), -IOP( "pcgdl", BSIM3V1_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), -IOP( "pckappa", BSIM3V1_MOD_PCKAPPA, IF_REAL, "Cross-term dependence of ckappa"), -IOP( "pcf", BSIM3V1_MOD_PCF, IF_REAL, "Cross-term dependence of cf"), -IOP( "pclc", BSIM3V1_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"), -IOP( "pcle", BSIM3V1_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), -IOP( "palpha0", BSIM3V1_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), -IOP( "pbeta0", BSIM3V1_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), -IOP( "pvfbcv", BSIM3V1_MOD_PVFBCV, IF_REAL, "Cross-term dependence of vfbcv"), +IOP( "pprt", BSIM3v1_MOD_PPRT, IF_REAL, "Cross-term dependence of prt "), +IOP( "peta0", BSIM3v1_MOD_PETA0, IF_REAL, "Cross-term dependence of eta0"), +IOP( "petab", BSIM3v1_MOD_PETAB, IF_REAL, "Cross-term dependence of etab"), +IOP( "ppclm", BSIM3v1_MOD_PPCLM, IF_REAL, "Cross-term dependence of pclm"), +IOP( "ppdiblc1", BSIM3v1_MOD_PPDIBL1, IF_REAL, "Cross-term dependence of pdiblc1"), +IOP( "ppdiblc2", BSIM3v1_MOD_PPDIBL2, IF_REAL, "Cross-term dependence of pdiblc2"), +IOP( "ppdiblcb", BSIM3v1_MOD_PPDIBLB, IF_REAL, "Cross-term dependence of pdiblcb"), +IOP( "ppscbe1", BSIM3v1_MOD_PPSCBE1, IF_REAL, "Cross-term dependence of pscbe1"), +IOP( "ppscbe2", BSIM3v1_MOD_PPSCBE2, IF_REAL, "Cross-term dependence of pscbe2"), +IOP( "ppvag", BSIM3v1_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), +IOP( "pwr", BSIM3v1_MOD_PWR, IF_REAL, "Cross-term dependence of wr"), +IOP( "pdwg", BSIM3v1_MOD_PDWG, IF_REAL, "Cross-term dependence of dwg"), +IOP( "pdwb", BSIM3v1_MOD_PDWB, IF_REAL, "Cross-term dependence of dwb"), +IOP( "pb0", BSIM3v1_MOD_PB0, IF_REAL, "Cross-term dependence of b0"), +IOP( "pb1", BSIM3v1_MOD_PB1, IF_REAL, "Cross-term dependence of b1"), +IOP( "pcgsl", BSIM3v1_MOD_PCGSL, IF_REAL, "Cross-term dependence of cgsl"), +IOP( "pcgdl", BSIM3v1_MOD_PCGDL, IF_REAL, "Cross-term dependence of cgdl"), +IOP( "pckappa", BSIM3v1_MOD_PCKAPPA, IF_REAL, "Cross-term dependence of ckappa"), +IOP( "pcf", BSIM3v1_MOD_PCF, IF_REAL, "Cross-term dependence of cf"), +IOP( "pclc", BSIM3v1_MOD_PCLC, IF_REAL, "Cross-term dependence of clc"), +IOP( "pcle", BSIM3v1_MOD_PCLE, IF_REAL, "Cross-term dependence of cle"), +IOP( "palpha0", BSIM3v1_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), +IOP( "pbeta0", BSIM3v1_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), +IOP( "pvfbcv", BSIM3v1_MOD_PVFBCV, IF_REAL, "Cross-term dependence of vfbcv"), -IOP( "noia", BSIM3V1_MOD_NOIA, IF_REAL, "Flicker noise parameter"), -IOP( "noib", BSIM3V1_MOD_NOIB, IF_REAL, "Flicker noise parameter"), -IOP( "noic", BSIM3V1_MOD_NOIC, IF_REAL, "Flicker noise parameter"), -IOP( "em", BSIM3V1_MOD_EM, IF_REAL, "Flicker noise parameter"), -IOP( "ef", BSIM3V1_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), -IOP( "af", BSIM3V1_MOD_AF, IF_REAL, "Flicker noise exponent"), -IOP( "kf", BSIM3V1_MOD_KF, IF_REAL, "Flicker noise coefficient"), +IOP( "noia", BSIM3v1_MOD_NOIA, IF_REAL, "Flicker noise parameter"), +IOP( "noib", BSIM3v1_MOD_NOIB, IF_REAL, "Flicker noise parameter"), +IOP( "noic", BSIM3v1_MOD_NOIC, IF_REAL, "Flicker noise parameter"), +IOP( "em", BSIM3v1_MOD_EM, IF_REAL, "Flicker noise parameter"), +IOP( "ef", BSIM3v1_MOD_EF, IF_REAL, "Flicker noise frequency exponent"), +IOP( "af", BSIM3v1_MOD_AF, IF_REAL, "Flicker noise exponent"), +IOP( "kf", BSIM3v1_MOD_KF, IF_REAL, "Flicker noise coefficient"), -IP( "nmos", BSIM3V1_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), -IP( "pmos", BSIM3V1_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), -/* serban */ -IOP( "hdif", BSIM3V1_MOD_HDIF, IF_REAL, "S/D junction extension (HSPICE style)"), +IP( "nmos", BSIM3v1_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), +IP( "pmos", BSIM3v1_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), }; -char *BSIM3V1names[] = { +char *BSIM3v1names[] = { "Drain", "Gate", "Source", @@ -434,11 +437,11 @@ char *BSIM3V1names[] = { "Charge" }; -int BSIM3V1nSize = NUMELEMS(BSIM3V1names); -int BSIM3V1pTSize = NUMELEMS(BSIM3V1pTable); -int BSIM3V1mPTSize = NUMELEMS(BSIM3V1mPTable); -int BSIM3V1iSize = sizeof(BSIM3V1instance); -int BSIM3V1mSize = sizeof(BSIM3V1model); +int BSIM3v1nSize = NUMELEMS(BSIM3v1names); +int BSIM3v1pTSize = NUMELEMS(BSIM3v1pTable); +int BSIM3v1mPTSize = NUMELEMS(BSIM3v1mPTable); +int BSIM3v1iSize = sizeof(BSIM3v1instance); +int BSIM3v1mSize = sizeof(BSIM3v1model); diff --git a/src/spicelib/devices/bsim3v1/b3v1acld.c b/src/spicelib/devices/bsim3v1/b3v1acld.c index cd3c67571..8e5f8dbc7 100644 --- a/src/spicelib/devices/bsim3v1/b3v1acld.c +++ b/src/spicelib/devices/bsim3v1/b3v1acld.c @@ -1,11 +1,16 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v1acld.c -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1acld.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ #include "ngspice.h" -#include #include "cktdefs.h" #include "bsim3v1def.h" #include "sperror.h" @@ -13,168 +18,174 @@ File: b3v1acld.c int -BSIM3V1acLoad(inModel,ckt) -GENmodel *inModel; -CKTcircuit *ckt; +BSIM3v1acLoad (GENmodel * inModel, CKTcircuit * ckt) { -BSIM3V1model *model = (BSIM3V1model*)inModel; -BSIM3V1instance *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, omega; -double GSoverlapCap, GDoverlapCap, GBoverlapCap, FwdSum, RevSum, Gm, Gmbs; - -double dxpart, sxpart, cqgb, cqdb, cqsb, cqbb, xcqgb, xcqdb, xcqsb, xcqbb; - - omega = ckt->CKTomega; - for (; model != NULL; model = model->BSIM3V1nextModel) - { - - - for (here = model->BSIM3V1instances; here!= NULL; - here = here->BSIM3V1nextInstance) - { - if (here->BSIM3V1owner != ARCHme) continue; - if (here->BSIM3V1mode >= 0) - { Gm = here->BSIM3V1gm; - Gmbs = here->BSIM3V1gmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; - cggb = here->BSIM3V1cggb; - cgsb = here->BSIM3V1cgsb; - cgdb = here->BSIM3V1cgdb; - - cbgb = here->BSIM3V1cbgb; - cbsb = here->BSIM3V1cbsb; - cbdb = here->BSIM3V1cbdb; - - cdgb = here->BSIM3V1cdgb; - cdsb = here->BSIM3V1cdsb; - cddb = here->BSIM3V1cddb; - - cqgb = here->BSIM3V1cqgb; - cqdb = here->BSIM3V1cqdb; - cqsb = here->BSIM3V1cqsb; - cqbb = here->BSIM3V1cqbb; - sxpart = 0.6; - dxpart = 0.4; - - } - else - { Gm = -here->BSIM3V1gm; - Gmbs = -here->BSIM3V1gmbs; - FwdSum = 0.0; - RevSum = -Gm - Gmbs; - cggb = here->BSIM3V1cggb; - cgsb = here->BSIM3V1cgdb; - cgdb = here->BSIM3V1cgsb; - - cbgb = here->BSIM3V1cbgb; - cbsb = here->BSIM3V1cbdb; - cbdb = here->BSIM3V1cbsb; - - cdgb = -(here->BSIM3V1cdgb + cggb + cbgb); - cdsb = -(here->BSIM3V1cddb + cgsb + cbsb); - cddb = -(here->BSIM3V1cdsb + cgdb + cbdb); - - cqgb = here->BSIM3V1cqgb; - cqdb = here->BSIM3V1cqsb; - cqsb = here->BSIM3V1cqdb; - cqbb = here->BSIM3V1cqbb; - sxpart = 0.4; - dxpart = 0.6; - } - - gdpr=here->BSIM3V1drainConductance; - gspr=here->BSIM3V1sourceConductance; - gds= here->BSIM3V1gds; - gbd= here->BSIM3V1gbd; - gbs= here->BSIM3V1gbs; - capbd= here->BSIM3V1capbd; - capbs= here->BSIM3V1capbs; - - GSoverlapCap = here->BSIM3V1cgso; - GDoverlapCap = here->BSIM3V1cgdo; - GBoverlapCap = here->pParam->BSIM3V1cgbo; - - xcdgb = (cdgb - GDoverlapCap) * omega; - xcddb = (cddb + capbd + GDoverlapCap) * omega; - xcdsb = cdsb * omega; - xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega; - xcsdb = -(cgdb + cbdb + cddb) * omega; - xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)) * omega; - xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap) - * omega; - xcgdb = (cgdb - GDoverlapCap ) * omega; - xcgsb = (cgsb - GSoverlapCap) * omega; - xcbgb = (cbgb - GBoverlapCap) * omega; - xcbdb = (cbdb - capbd ) * omega; - xcbsb = (cbsb - capbs ) * omega; - xcqgb = cqgb * omega; - xcqdb = cqdb * omega; - xcqsb = cqsb * omega; - xcqbb = cqbb * omega; - - *(here->BSIM3V1GgPtr +1) += xcggb; - *(here->BSIM3V1BbPtr +1) -= xcbgb + xcbdb + xcbsb; - *(here->BSIM3V1DPdpPtr +1) += xcddb; - *(here->BSIM3V1SPspPtr +1) += xcssb; - *(here->BSIM3V1GbPtr +1) -= xcggb + xcgdb + xcgsb; - *(here->BSIM3V1GdpPtr +1) += xcgdb; - *(here->BSIM3V1GspPtr +1) += xcgsb; - *(here->BSIM3V1BgPtr +1) += xcbgb; - *(here->BSIM3V1BdpPtr +1) += xcbdb; - *(here->BSIM3V1BspPtr +1) += xcbsb; - *(here->BSIM3V1DPgPtr +1) += xcdgb; - *(here->BSIM3V1DPbPtr +1) -= xcdgb + xcddb + xcdsb; - *(here->BSIM3V1DPspPtr +1) += xcdsb; - *(here->BSIM3V1SPgPtr +1) += xcsgb; - *(here->BSIM3V1SPbPtr +1) -= xcsgb + xcsdb + xcssb; - *(here->BSIM3V1SPdpPtr +1) += xcsdb; - - *(here->BSIM3V1QqPtr +1) += omega; - - *(here->BSIM3V1QgPtr +1) -= xcqgb; - *(here->BSIM3V1QdpPtr +1) -= xcqdb; - *(here->BSIM3V1QspPtr +1) -= xcqsb; - *(here->BSIM3V1QbPtr +1) -= xcqbb; - - - *(here->BSIM3V1DdPtr) += gdpr; - *(here->BSIM3V1SsPtr) += gspr; - *(here->BSIM3V1BbPtr) += gbd + gbs; - *(here->BSIM3V1DPdpPtr) += gdpr + gds + gbd + RevSum + dxpart*here->BSIM3V1gtd; - *(here->BSIM3V1SPspPtr) += gspr + gds + gbs + FwdSum + sxpart*here->BSIM3V1gts; - *(here->BSIM3V1DdpPtr) -= gdpr; - *(here->BSIM3V1SspPtr) -= gspr; - *(here->BSIM3V1BdpPtr) -= gbd; - *(here->BSIM3V1BspPtr) -= gbs; - *(here->BSIM3V1DPdPtr) -= gdpr; - *(here->BSIM3V1DPgPtr) += Gm + dxpart * here->BSIM3V1gtg; - *(here->BSIM3V1DPbPtr) -= gbd - Gmbs - dxpart * here->BSIM3V1gtb; - *(here->BSIM3V1DPspPtr) -= gds + FwdSum - dxpart * here->BSIM3V1gts; - *(here->BSIM3V1SPgPtr) -= Gm - sxpart * here->BSIM3V1gtg; - *(here->BSIM3V1SPsPtr) -= gspr; - *(here->BSIM3V1SPbPtr) -= gbs + Gmbs - sxpart * here->BSIM3V1gtg; - *(here->BSIM3V1SPdpPtr) -= gds + RevSum - sxpart * here->BSIM3V1gtd; - *(here->BSIM3V1GgPtr) -= here->BSIM3V1gtg; - *(here->BSIM3V1GbPtr) -= here->BSIM3V1gtb; - *(here->BSIM3V1GdpPtr) -= here->BSIM3V1gtd; - *(here->BSIM3V1GspPtr) -= here->BSIM3V1gts; - - *(here->BSIM3V1QqPtr) += here->BSIM3V1gtau; - - *(here->BSIM3V1DPqPtr) += dxpart * here->BSIM3V1gtau; - *(here->BSIM3V1SPqPtr) += sxpart * here->BSIM3V1gtau; - *(here->BSIM3V1GqPtr) -= here->BSIM3V1gtau; - - *(here->BSIM3V1QgPtr) += here->BSIM3V1gtg; - *(here->BSIM3V1QdpPtr) += here->BSIM3V1gtd; - *(here->BSIM3V1QspPtr) += here->BSIM3V1gts; - *(here->BSIM3V1QbPtr) += here->BSIM3V1gtb; - - } + BSIM3v1model *model = (BSIM3v1model *) inModel; + BSIM3v1instance *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, omega; + double GSoverlapCap, GDoverlapCap, GBoverlapCap, FwdSum, RevSum, Gm, Gmbs; + + double dxpart, sxpart, cqgb, cqdb, cqsb, cqbb, xcqgb, xcqdb, xcqsb, xcqbb; + + double m; + + omega = ckt->CKTomega; + for (; model != NULL; model = model->BSIM3v1nextModel) + { + + + for (here = model->BSIM3v1instances; here != NULL; + here = here->BSIM3v1nextInstance) + { + + if (here->BSIM3v1owner != ARCHme) + continue; + + + if (here->BSIM3v1mode >= 0) + { + Gm = here->BSIM3v1gm; + Gmbs = here->BSIM3v1gmbs; + FwdSum = Gm + Gmbs; + RevSum = 0.0; + cggb = here->BSIM3v1cggb; + cgsb = here->BSIM3v1cgsb; + cgdb = here->BSIM3v1cgdb; + + cbgb = here->BSIM3v1cbgb; + cbsb = here->BSIM3v1cbsb; + cbdb = here->BSIM3v1cbdb; + + cdgb = here->BSIM3v1cdgb; + cdsb = here->BSIM3v1cdsb; + cddb = here->BSIM3v1cddb; + + cqgb = here->BSIM3v1cqgb; + cqdb = here->BSIM3v1cqdb; + cqsb = here->BSIM3v1cqsb; + cqbb = here->BSIM3v1cqbb; + sxpart = 0.6; + dxpart = 0.4; + + } + else + { + Gm = -here->BSIM3v1gm; + Gmbs = -here->BSIM3v1gmbs; + FwdSum = 0.0; + RevSum = -Gm - Gmbs; + cggb = here->BSIM3v1cggb; + cgsb = here->BSIM3v1cgdb; + cgdb = here->BSIM3v1cgsb; + + cbgb = here->BSIM3v1cbgb; + cbsb = here->BSIM3v1cbdb; + cbdb = here->BSIM3v1cbsb; + + cdgb = -(here->BSIM3v1cdgb + cggb + cbgb); + cdsb = -(here->BSIM3v1cddb + cgsb + cbsb); + cddb = -(here->BSIM3v1cdsb + cgdb + cbdb); + + cqgb = here->BSIM3v1cqgb; + cqdb = here->BSIM3v1cqsb; + cqsb = here->BSIM3v1cqdb; + cqbb = here->BSIM3v1cqbb; + sxpart = 0.4; + dxpart = 0.6; + } + + gdpr = here->BSIM3v1drainConductance; + gspr = here->BSIM3v1sourceConductance; + gds = here->BSIM3v1gds; + gbd = here->BSIM3v1gbd; + gbs = here->BSIM3v1gbs; + capbd = here->BSIM3v1capbd; + capbs = here->BSIM3v1capbs; + + GSoverlapCap = here->BSIM3v1cgso; + GDoverlapCap = here->BSIM3v1cgdo; + GBoverlapCap = here->pParam->BSIM3v1cgbo; + + xcdgb = (cdgb - GDoverlapCap) * omega; + xcddb = (cddb + capbd + GDoverlapCap) * omega; + xcdsb = cdsb * omega; + xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega; + xcsdb = -(cgdb + cbdb + cddb) * omega; + xcssb = (capbs + GSoverlapCap - (cgsb + cbsb + cdsb)) * omega; + xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap) * omega; + xcgdb = (cgdb - GDoverlapCap) * omega; + xcgsb = (cgsb - GSoverlapCap) * omega; + xcbgb = (cbgb - GBoverlapCap) * omega; + xcbdb = (cbdb - capbd) * omega; + xcbsb = (cbsb - capbs) * omega; + xcqgb = cqgb * omega; + xcqdb = cqdb * omega; + xcqsb = cqsb * omega; + xcqbb = cqbb * omega; + + m = here->BSIM3v1m; + + *(here->BSIM3v1GgPtr + 1) += m * xcggb; + *(here->BSIM3v1BbPtr + 1) -= m * (xcbgb + xcbdb + xcbsb); + *(here->BSIM3v1DPdpPtr + 1) += m * xcddb; + *(here->BSIM3v1SPspPtr + 1) += m * xcssb; + *(here->BSIM3v1GbPtr + 1) -= m * (xcggb + xcgdb + xcgsb); + *(here->BSIM3v1GdpPtr + 1) += m * xcgdb; + *(here->BSIM3v1GspPtr + 1) += m * xcgsb; + *(here->BSIM3v1BgPtr + 1) += m * xcbgb; + *(here->BSIM3v1BdpPtr + 1) += m * xcbdb; + *(here->BSIM3v1BspPtr + 1) += m * xcbsb; + *(here->BSIM3v1DPgPtr + 1) += m * xcdgb; + *(here->BSIM3v1DPbPtr + 1) -= m * (xcdgb + xcddb + xcdsb); + *(here->BSIM3v1DPspPtr + 1) += m * xcdsb; + *(here->BSIM3v1SPgPtr + 1) += m * xcsgb; + *(here->BSIM3v1SPbPtr + 1) -= m * (xcsgb + xcsdb + xcssb); + *(here->BSIM3v1SPdpPtr + 1) += m * xcsdb; + + *(here->BSIM3v1QqPtr + 1) += m * omega; + + *(here->BSIM3v1QgPtr + 1) -= m * xcqgb; + *(here->BSIM3v1QdpPtr + 1) -= m * xcqdb; + *(here->BSIM3v1QspPtr + 1) -= m * xcqsb; + *(here->BSIM3v1QbPtr + 1) -= m * xcqbb; + + + *(here->BSIM3v1DdPtr) += m * gdpr; + *(here->BSIM3v1SsPtr) += m * gspr; + *(here->BSIM3v1BbPtr) += m * (gbd + gbs); + *(here->BSIM3v1DPdpPtr) += m * (gdpr + gds + gbd + RevSum + dxpart * here->BSIM3v1gtd); + *(here->BSIM3v1SPspPtr) += m * (gspr + gds + gbs + FwdSum + sxpart * here->BSIM3v1gts); + *(here->BSIM3v1DdpPtr) -= m * gdpr; + *(here->BSIM3v1SspPtr) -= m * gspr; + *(here->BSIM3v1BdpPtr) -= m * gbd; + *(here->BSIM3v1BspPtr) -= m * gbs; + *(here->BSIM3v1DPdPtr) -= m * gdpr; + *(here->BSIM3v1DPgPtr) += m * (Gm + dxpart * here->BSIM3v1gtg); + *(here->BSIM3v1DPbPtr) -= m * (gbd - Gmbs - dxpart * here->BSIM3v1gtb); + *(here->BSIM3v1DPspPtr) -= m * (gds + FwdSum - dxpart * here->BSIM3v1gts); + *(here->BSIM3v1SPgPtr) -= m * (Gm - sxpart * here->BSIM3v1gtg); + *(here->BSIM3v1SPsPtr) -= m * gspr; + *(here->BSIM3v1SPbPtr) -= m * (gbs + Gmbs - sxpart * here->BSIM3v1gtg); + *(here->BSIM3v1SPdpPtr) -= m * (gds + RevSum - sxpart * here->BSIM3v1gtd); + *(here->BSIM3v1GgPtr) -= m * here->BSIM3v1gtg; + *(here->BSIM3v1GbPtr) -= m * here->BSIM3v1gtb; + *(here->BSIM3v1GdpPtr) -= m * here->BSIM3v1gtd; + *(here->BSIM3v1GspPtr) -= m * here->BSIM3v1gts; + + *(here->BSIM3v1QqPtr) += m * here->BSIM3v1gtau; + + *(here->BSIM3v1DPqPtr) += m * dxpart * here->BSIM3v1gtau; + *(here->BSIM3v1SPqPtr) += m * sxpart * here->BSIM3v1gtau; + *(here->BSIM3v1GqPtr) -= m * here->BSIM3v1gtau; + + *(here->BSIM3v1QgPtr) += m * here->BSIM3v1gtg; + *(here->BSIM3v1QdpPtr) += m * here->BSIM3v1gtd; + *(here->BSIM3v1QspPtr) += m * here->BSIM3v1gts; + *(here->BSIM3v1QbPtr) += m * here->BSIM3v1gtb; + + } } - return(OK); + return (OK); } - diff --git a/src/spicelib/devices/bsim3v1/b3v1ask.c b/src/spicelib/devices/bsim3v1/b3v1ask.c index ef824972a..3653957dd 100644 --- a/src/spicelib/devices/bsim3v1/b3v1ask.c +++ b/src/spicelib/devices/bsim3v1/b3v1ask.c @@ -1,12 +1,16 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v1ask.c -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1ask.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ #include "ngspice.h" -#include -#include #include "ifsim.h" #include "cktdefs.h" #include "devdefs.h" @@ -15,184 +19,209 @@ File: b3v1ask.c #include "suffix.h" int -BSIM3V1ask(ckt,inst,which,value,select) -CKTcircuit *ckt; -GENinstance *inst; -int which; -IFvalue *value; -IFvalue *select; +BSIM3v1ask (CKTcircuit * ckt, GENinstance * inst, int which, IFvalue * value, + IFvalue * select) { -BSIM3V1instance *here = (BSIM3V1instance*)inst; + BSIM3v1instance *here = (BSIM3v1instance *) inst; - switch(which) - { case BSIM3V1_L: - value->rValue = here->BSIM3V1l; - return(OK); - case BSIM3V1_W: - value->rValue = here->BSIM3V1w; - return(OK); - case BSIM3V1_AS: - value->rValue = here->BSIM3V1sourceArea; - return(OK); - case BSIM3V1_AD: - value->rValue = here->BSIM3V1drainArea; - return(OK); - case BSIM3V1_PS: - value->rValue = here->BSIM3V1sourcePerimeter; - return(OK); - case BSIM3V1_PD: - value->rValue = here->BSIM3V1drainPerimeter; - return(OK); - case BSIM3V1_NRS: - value->rValue = here->BSIM3V1sourceSquares; - return(OK); - case BSIM3V1_NRD: - value->rValue = here->BSIM3V1drainSquares; - return(OK); - case BSIM3V1_OFF: - value->rValue = here->BSIM3V1off; - return(OK); - case BSIM3V1_NQSMOD: - value->iValue = here->BSIM3V1nqsMod; - return(OK); - case BSIM3V1_M: - value->rValue = here->BSIM3V1m; - return(OK); - case BSIM3V1_IC_VBS: - value->rValue = here->BSIM3V1icVBS; - return(OK); - case BSIM3V1_IC_VDS: - value->rValue = here->BSIM3V1icVDS; - return(OK); - case BSIM3V1_IC_VGS: - value->rValue = here->BSIM3V1icVGS; - return(OK); - case BSIM3V1_DNODE: - value->iValue = here->BSIM3V1dNode; - return(OK); - case BSIM3V1_GNODE: - value->iValue = here->BSIM3V1gNode; - return(OK); - case BSIM3V1_SNODE: - value->iValue = here->BSIM3V1sNode; - return(OK); - case BSIM3V1_BNODE: - value->iValue = here->BSIM3V1bNode; - return(OK); - case BSIM3V1_DNODEPRIME: - value->iValue = here->BSIM3V1dNodePrime; - return(OK); - case BSIM3V1_SNODEPRIME: - value->iValue = here->BSIM3V1sNodePrime; - return(OK); - case BSIM3V1_SOURCECONDUCT: - value->rValue = here->BSIM3V1sourceConductance; - return(OK); - case BSIM3V1_DRAINCONDUCT: - value->rValue = here->BSIM3V1drainConductance; - return(OK); - case BSIM3V1_VBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3V1vbd); - return(OK); - case BSIM3V1_VBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3V1vbs); - return(OK); - case BSIM3V1_VGS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3V1vgs); - return(OK); - case BSIM3V1_VDS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3V1vds); - return(OK); - case BSIM3V1_CD: - value->rValue = here->BSIM3V1cd; - return(OK); - case BSIM3V1_CBS: - value->rValue = here->BSIM3V1cbs; - return(OK); - case BSIM3V1_CBD: - value->rValue = here->BSIM3V1cbd; - return(OK); - case BSIM3V1_GM: - value->rValue = here->BSIM3V1gm; - return(OK); - case BSIM3V1_GDS: - value->rValue = here->BSIM3V1gds; - return(OK); - case BSIM3V1_GMBS: - value->rValue = here->BSIM3V1gmbs; - return(OK); - case BSIM3V1_GBD: - value->rValue = here->BSIM3V1gbd; - return(OK); - case BSIM3V1_GBS: - value->rValue = here->BSIM3V1gbs; - return(OK); - case BSIM3V1_QB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3V1qb); - return(OK); - case BSIM3V1_CQB: - value->rValue = *(ckt->CKTstate0 + here->BSIM3V1cqb); - return(OK); - case BSIM3V1_QG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3V1qg); - return(OK); - case BSIM3V1_CQG: - value->rValue = *(ckt->CKTstate0 + here->BSIM3V1cqg); - return(OK); - case BSIM3V1_QD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3V1qd); - return(OK); - case BSIM3V1_CQD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3V1cqd); - return(OK); - case BSIM3V1_CGG: - value->rValue = here->BSIM3V1cggb; - return(OK); - case BSIM3V1_CGD: - value->rValue = here->BSIM3V1cgdb; - return(OK); - case BSIM3V1_CGS: - value->rValue = here->BSIM3V1cgsb; - return(OK); - case BSIM3V1_CDG: - value->rValue = here->BSIM3V1cdgb; - return(OK); - case BSIM3V1_CDD: - value->rValue = here->BSIM3V1cddb; - return(OK); - case BSIM3V1_CDS: - value->rValue = here->BSIM3V1cdsb; - return(OK); - case BSIM3V1_CBG: - value->rValue = here->BSIM3V1cbgb; - return(OK); - case BSIM3V1_CBDB: - value->rValue = here->BSIM3V1cbdb; - return(OK); - case BSIM3V1_CBSB: - value->rValue = here->BSIM3V1cbsb; - return(OK); - case BSIM3V1_CAPBD: - value->rValue = here->BSIM3V1capbd; - return(OK); - case BSIM3V1_CAPBS: - value->rValue = here->BSIM3V1capbs; - return(OK); - case BSIM3V1_VON: - value->rValue = here->BSIM3V1von; - return(OK); - case BSIM3V1_VDSAT: - value->rValue = here->BSIM3V1vdsat; - return(OK); - case BSIM3V1_QBS: - value->rValue = *(ckt->CKTstate0 + here->BSIM3V1qbs); - return(OK); - case BSIM3V1_QBD: - value->rValue = *(ckt->CKTstate0 + here->BSIM3V1qbd); - return(OK); - default: - return(E_BADPARM); + switch (which) + { + case BSIM3v1_L: + value->rValue = here->BSIM3v1l; + return (OK); + case BSIM3v1_W: + value->rValue = here->BSIM3v1w; + return (OK); + case BSIM3v1_M: + value->rValue = here->BSIM3v1m; + return (OK); + case BSIM3v1_AS: + value->rValue = here->BSIM3v1sourceArea; + return (OK); + case BSIM3v1_AD: + value->rValue = here->BSIM3v1drainArea; + return (OK); + case BSIM3v1_PS: + value->rValue = here->BSIM3v1sourcePerimeter; + return (OK); + case BSIM3v1_PD: + value->rValue = here->BSIM3v1drainPerimeter; + return (OK); + case BSIM3v1_NRS: + value->rValue = here->BSIM3v1sourceSquares; + return (OK); + case BSIM3v1_NRD: + value->rValue = here->BSIM3v1drainSquares; + return (OK); + case BSIM3v1_OFF: + value->rValue = here->BSIM3v1off; + return (OK); + case BSIM3v1_NQSMOD: + value->iValue = here->BSIM3v1nqsMod; + return (OK); + case BSIM3v1_IC_VBS: + value->rValue = here->BSIM3v1icVBS; + return (OK); + case BSIM3v1_IC_VDS: + value->rValue = here->BSIM3v1icVDS; + return (OK); + case BSIM3v1_IC_VGS: + value->rValue = here->BSIM3v1icVGS; + return (OK); + case BSIM3v1_DNODE: + value->iValue = here->BSIM3v1dNode; + return (OK); + case BSIM3v1_GNODE: + value->iValue = here->BSIM3v1gNode; + return (OK); + case BSIM3v1_SNODE: + value->iValue = here->BSIM3v1sNode; + return (OK); + case BSIM3v1_BNODE: + value->iValue = here->BSIM3v1bNode; + return (OK); + case BSIM3v1_DNODEPRIME: + value->iValue = here->BSIM3v1dNodePrime; + return (OK); + case BSIM3v1_SNODEPRIME: + value->iValue = here->BSIM3v1sNodePrime; + return (OK); + case BSIM3v1_SOURCECONDUCT: + value->rValue = here->BSIM3v1sourceConductance; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_DRAINCONDUCT: + value->rValue = here->BSIM3v1drainConductance; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_VBD: + value->rValue = *(ckt->CKTstate0 + here->BSIM3v1vbd); + return (OK); + case BSIM3v1_VBS: + value->rValue = *(ckt->CKTstate0 + here->BSIM3v1vbs); + return (OK); + case BSIM3v1_VGS: + value->rValue = *(ckt->CKTstate0 + here->BSIM3v1vgs); + return (OK); + case BSIM3v1_VDS: + value->rValue = *(ckt->CKTstate0 + here->BSIM3v1vds); + return (OK); + case BSIM3v1_CD: + value->rValue = here->BSIM3v1cd; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CBS: + value->rValue = here->BSIM3v1cbs; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CBD: + value->rValue = here->BSIM3v1cbd; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_GM: + value->rValue = here->BSIM3v1gm; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_GDS: + value->rValue = here->BSIM3v1gds; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_GMBS: + value->rValue = here->BSIM3v1gmbs; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_GBD: + value->rValue = here->BSIM3v1gbd; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_GBS: + value->rValue = here->BSIM3v1gbs; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_QB: + value->rValue = *(ckt->CKTstate0 + here->BSIM3v1qb); + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CQB: + value->rValue = *(ckt->CKTstate0 + here->BSIM3v1cqb); + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_QG: + value->rValue = *(ckt->CKTstate0 + here->BSIM3v1qg); + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CQG: + value->rValue = *(ckt->CKTstate0 + here->BSIM3v1cqg); + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_QD: + value->rValue = *(ckt->CKTstate0 + here->BSIM3v1qd); + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CQD: + value->rValue = *(ckt->CKTstate0 + here->BSIM3v1cqd); + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CGG: + value->rValue = here->BSIM3v1cggb; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CGD: + value->rValue = here->BSIM3v1cgdb; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CGS: + value->rValue = here->BSIM3v1cgsb; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CDG: + value->rValue = here->BSIM3v1cdgb; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CDD: + value->rValue = here->BSIM3v1cddb; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CDS: + value->rValue = here->BSIM3v1cdsb; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CBG: + value->rValue = here->BSIM3v1cbgb; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CBDB: + value->rValue = here->BSIM3v1cbdb; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CBSB: + value->rValue = here->BSIM3v1cbsb; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CAPBD: + value->rValue = here->BSIM3v1capbd; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_CAPBS: + value->rValue = here->BSIM3v1capbs; + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_VON: + value->rValue = here->BSIM3v1von; + return (OK); + case BSIM3v1_VDSAT: + value->rValue = here->BSIM3v1vdsat; + return (OK); + case BSIM3v1_QBS: + value->rValue = *(ckt->CKTstate0 + here->BSIM3v1qbs); + value->rValue *= here->BSIM3v1m; + return (OK); + case BSIM3v1_QBD: + value->rValue = *(ckt->CKTstate0 + here->BSIM3v1qbd); + value->rValue *= here->BSIM3v1m; + return (OK); + default: + return (E_BADPARM); } - /* NOTREACHED */ + /* NOTREACHED */ } - diff --git a/src/spicelib/devices/bsim3v1/b3v1check.c b/src/spicelib/devices/bsim3v1/b3v1check.c index 16d58dfce..ad145d728 100644 --- a/src/spicelib/devices/bsim3v1/b3v1check.c +++ b/src/spicelib/devices/bsim3v1/b3v1check.c @@ -1,12 +1,17 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: Min-Chie Jeng. -File: b3v1check.c -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1check.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ + #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "bsim3v1def.h" #include "trandefs.h" @@ -16,338 +21,335 @@ File: b3v1check.c #include "suffix.h" int -BSIM3V1checkModel(model, here, ckt) -BSIM3V1model *model; -BSIM3V1instance *here; -CKTcircuit *ckt; +BSIM3v1checkModel(BSIM3v1model *model, BSIM3v1instance *here, CKTcircuit *ckt) { struct bsim3v1SizeDependParam *pParam; int Fatal_Flag = 0; FILE *fplog; - if ((fplog = fopen("BSIM3V3_1_check.log", "w")) != NULL) + if ((fplog = fopen("b3v3_1check.log", "w")) != NULL) { pParam = here->pParam; fprintf(fplog, "BSIM3V3.1 Parameter Check\n"); - fprintf(fplog, "Model = %s\n", model->BSIM3V1modName); - fprintf(fplog, "W = %g, L = %g\n", here->BSIM3V1w, here->BSIM3V1l); + fprintf(fplog, "Model = %s\n", model->BSIM3v1modName); + fprintf(fplog, "W = %g, L = %g\n", here->BSIM3v1w, here->BSIM3v1l); - if (pParam->BSIM3V1nlx < -pParam->BSIM3V1leff) + if (pParam->BSIM3v1nlx < -pParam->BSIM3v1leff) { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3V1nlx); + pParam->BSIM3v1nlx); printf("Fatal: Nlx = %g is less than -Leff.\n", - pParam->BSIM3V1nlx); + pParam->BSIM3v1nlx); Fatal_Flag = 1; } - if (model->BSIM3V1tox <= 0.0) + if (model->BSIM3v1tox <= 0.0) { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", - model->BSIM3V1tox); - printf("Fatal: Tox = %g is not positive.\n", model->BSIM3V1tox); + model->BSIM3v1tox); + printf("Fatal: Tox = %g is not positive.\n", model->BSIM3v1tox); Fatal_Flag = 1; } - if (pParam->BSIM3V1npeak <= 0.0) + if (pParam->BSIM3v1npeak <= 0.0) { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", - pParam->BSIM3V1npeak); + pParam->BSIM3v1npeak); printf("Fatal: Nch = %g is not positive.\n", - pParam->BSIM3V1npeak); + pParam->BSIM3v1npeak); Fatal_Flag = 1; } - if (pParam->BSIM3V1nsub <= 0.0) + if (pParam->BSIM3v1nsub <= 0.0) { fprintf(fplog, "Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3V1nsub); + pParam->BSIM3v1nsub); printf("Fatal: Nsub = %g is not positive.\n", - pParam->BSIM3V1nsub); + pParam->BSIM3v1nsub); Fatal_Flag = 1; } - if (pParam->BSIM3V1ngate < 0.0) + if (pParam->BSIM3v1ngate < 0.0) { fprintf(fplog, "Fatal: Ngate = %g is not positive.\n", - pParam->BSIM3V1ngate); + pParam->BSIM3v1ngate); printf("Fatal: Ngate = %g Ngate is not positive.\n", - pParam->BSIM3V1ngate); + pParam->BSIM3v1ngate); Fatal_Flag = 1; } - if (pParam->BSIM3V1ngate > 1.e25) + if (pParam->BSIM3v1ngate > 1.e25) { fprintf(fplog, "Fatal: Ngate = %g is too high.\n", - pParam->BSIM3V1ngate); + pParam->BSIM3v1ngate); printf("Fatal: Ngate = %g Ngate is too high\n", - pParam->BSIM3V1ngate); + pParam->BSIM3v1ngate); Fatal_Flag = 1; } - if (pParam->BSIM3V1xj <= 0.0) + if (pParam->BSIM3v1xj <= 0.0) { fprintf(fplog, "Fatal: Xj = %g is not positive.\n", - pParam->BSIM3V1xj); - printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM3V1xj); + pParam->BSIM3v1xj); + printf("Fatal: Xj = %g is not positive.\n", pParam->BSIM3v1xj); Fatal_Flag = 1; } - if (pParam->BSIM3V1dvt1 < 0.0) + if (pParam->BSIM3v1dvt1 < 0.0) { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", - pParam->BSIM3V1dvt1); - printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM3V1dvt1); + pParam->BSIM3v1dvt1); + printf("Fatal: Dvt1 = %g is negative.\n", pParam->BSIM3v1dvt1); Fatal_Flag = 1; } - if (pParam->BSIM3V1dvt1w < 0.0) + if (pParam->BSIM3v1dvt1w < 0.0) { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", - pParam->BSIM3V1dvt1w); - printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM3V1dvt1w); + pParam->BSIM3v1dvt1w); + printf("Fatal: Dvt1w = %g is negative.\n", pParam->BSIM3v1dvt1w); Fatal_Flag = 1; } - if (pParam->BSIM3V1w0 == -pParam->BSIM3V1weff) + if (pParam->BSIM3v1w0 == -pParam->BSIM3v1weff) { fprintf(fplog, "Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); printf("Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); Fatal_Flag = 1; } - if (pParam->BSIM3V1dsub < 0.0) - { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM3V1dsub); - printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3V1dsub); + if (pParam->BSIM3v1dsub < 0.0) + { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->BSIM3v1dsub); + printf("Fatal: Dsub = %g is negative.\n", pParam->BSIM3v1dsub); Fatal_Flag = 1; } - if (pParam->BSIM3V1b1 == -pParam->BSIM3V1weff) + if (pParam->BSIM3v1b1 == -pParam->BSIM3v1weff) { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); Fatal_Flag = 1; } - if (pParam->BSIM3V1u0temp <= 0.0) - { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3V1u0temp); + if (pParam->BSIM3v1u0temp <= 0.0) + { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->BSIM3v1u0temp); printf("Fatal: u0 at current temperature = %g is not positive.\n", - pParam->BSIM3V1u0temp); + pParam->BSIM3v1u0temp); Fatal_Flag = 1; } /* Check delta parameter */ - if (pParam->BSIM3V1delta < 0.0) + if (pParam->BSIM3v1delta < 0.0) { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", - pParam->BSIM3V1delta); - printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM3V1delta); + pParam->BSIM3v1delta); + printf("Fatal: Delta = %g is less than zero.\n", pParam->BSIM3v1delta); Fatal_Flag = 1; } - if (pParam->BSIM3V1vsattemp <= 0.0) - { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3V1vsattemp); + if (pParam->BSIM3v1vsattemp <= 0.0) + { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->BSIM3v1vsattemp); printf("Fatal: Vsat at current temperature = %g is not positive.\n", - pParam->BSIM3V1vsattemp); + pParam->BSIM3v1vsattemp); Fatal_Flag = 1; } /* Check Rout parameters */ - if (pParam->BSIM3V1pclm <= 0.0) - { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM3V1pclm); - printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3V1pclm); + if (pParam->BSIM3v1pclm <= 0.0) + { fprintf(fplog, "Fatal: Pclm = %g is not positive.\n", pParam->BSIM3v1pclm); + printf("Fatal: Pclm = %g is not positive.\n", pParam->BSIM3v1pclm); Fatal_Flag = 1; } - if (pParam->BSIM3V1drout < 0.0) - { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM3V1drout); - printf("Fatal: Drout = %g is negative.\n", pParam->BSIM3V1drout); + if (pParam->BSIM3v1drout < 0.0) + { fprintf(fplog, "Fatal: Drout = %g is negative.\n", pParam->BSIM3v1drout); + printf("Fatal: Drout = %g is negative.\n", pParam->BSIM3v1drout); Fatal_Flag = 1; } - if (model->BSIM3V1unitLengthSidewallJctCap > 0.0 || - model->BSIM3V1unitLengthGateSidewallJctCap > 0.0) + if (model->BSIM3v1unitLengthSidewallJctCap > 0.0 || + model->BSIM3v1unitLengthGateSidewallJctCap > 0.0) { - if (here->BSIM3V1drainPerimeter < pParam->BSIM3V1weff) + if (here->BSIM3v1drainPerimeter < pParam->BSIM3v1weff) { fprintf(fplog, "Warning: Pd = %g is less than W.\n", - here->BSIM3V1drainPerimeter); + here->BSIM3v1drainPerimeter); printf("Warning: Pd = %g is less than W.\n", - here->BSIM3V1drainPerimeter); - here->BSIM3V1drainPerimeter =pParam->BSIM3V1weff; + here->BSIM3v1drainPerimeter); + here->BSIM3v1drainPerimeter =pParam->BSIM3v1weff; } - if (here->BSIM3V1sourcePerimeter < pParam->BSIM3V1weff) + if (here->BSIM3v1sourcePerimeter < pParam->BSIM3v1weff) { fprintf(fplog, "Warning: Ps = %g is less than W.\n", - here->BSIM3V1sourcePerimeter); + here->BSIM3v1sourcePerimeter); printf("Warning: Ps = %g is less than W.\n", - here->BSIM3V1sourcePerimeter); - here->BSIM3V1sourcePerimeter =pParam->BSIM3V1weff; + here->BSIM3v1sourcePerimeter); + here->BSIM3v1sourcePerimeter =pParam->BSIM3v1weff; } } /* Check capacitance parameters */ - if (pParam->BSIM3V1clc < 0.0) - { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM3V1clc); - printf("Fatal: Clc = %g is negative.\n", pParam->BSIM3V1clc); + if (pParam->BSIM3v1clc < 0.0) + { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->BSIM3v1clc); + printf("Fatal: Clc = %g is negative.\n", pParam->BSIM3v1clc); Fatal_Flag = 1; } - if (model->BSIM3V1paramChk ==1) + if (model->BSIM3v1paramChk ==1) { /* Check L and W parameters */ - if (pParam->BSIM3V1leff <= 5.0e-8) + if (pParam->BSIM3v1leff <= 5.0e-8) { fprintf(fplog, "Warning: Leff = %g may be too small.\n", - pParam->BSIM3V1leff); + pParam->BSIM3v1leff); printf("Warning: Leff = %g may be too small.\n", - pParam->BSIM3V1leff); + pParam->BSIM3v1leff); } - if (pParam->BSIM3V1leffCV <= 5.0e-8) + if (pParam->BSIM3v1leffCV <= 5.0e-8) { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", - pParam->BSIM3V1leffCV); + pParam->BSIM3v1leffCV); printf("Warning: Leff for CV = %g may be too small.\n", - pParam->BSIM3V1leffCV); + pParam->BSIM3v1leffCV); } - if (pParam->BSIM3V1weff <= 1.0e-7) + if (pParam->BSIM3v1weff <= 1.0e-7) { fprintf(fplog, "Warning: Weff = %g may be too small.\n", - pParam->BSIM3V1weff); + pParam->BSIM3v1weff); printf("Warning: Weff = %g may be too small.\n", - pParam->BSIM3V1weff); + pParam->BSIM3v1weff); } - if (pParam->BSIM3V1weffCV <= 1.0e-7) + if (pParam->BSIM3v1weffCV <= 1.0e-7) { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", - pParam->BSIM3V1weffCV); + pParam->BSIM3v1weffCV); printf("Warning: Weff for CV = %g may be too small.\n", - pParam->BSIM3V1weffCV); + pParam->BSIM3v1weffCV); } /* Check threshold voltage parameters */ - if (pParam->BSIM3V1nlx < 0.0) - { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->BSIM3V1nlx); - printf("Warning: Nlx = %g is negative.\n", pParam->BSIM3V1nlx); + if (pParam->BSIM3v1nlx < 0.0) + { fprintf(fplog, "Warning: Nlx = %g is negative.\n", pParam->BSIM3v1nlx); + printf("Warning: Nlx = %g is negative.\n", pParam->BSIM3v1nlx); } - if (model->BSIM3V1tox < 1.0e-9) + if (model->BSIM3v1tox < 1.0e-9) { fprintf(fplog, "Warning: Tox = %g is less than 10A.\n", - model->BSIM3V1tox); - printf("Warning: Tox = %g is less than 10A.\n", model->BSIM3V1tox); + model->BSIM3v1tox); + printf("Warning: Tox = %g is less than 10A.\n", model->BSIM3v1tox); } - if (pParam->BSIM3V1npeak <= 1.0e15) + if (pParam->BSIM3v1npeak <= 1.0e15) { fprintf(fplog, "Warning: Nch = %g may be too small.\n", - pParam->BSIM3V1npeak); + pParam->BSIM3v1npeak); printf("Warning: Nch = %g may be too small.\n", - pParam->BSIM3V1npeak); + pParam->BSIM3v1npeak); } - else if (pParam->BSIM3V1npeak >= 1.0e21) + else if (pParam->BSIM3v1npeak >= 1.0e21) { fprintf(fplog, "Warning: Nch = %g may be too large.\n", - pParam->BSIM3V1npeak); + pParam->BSIM3v1npeak); printf("Warning: Nch = %g may be too large.\n", - pParam->BSIM3V1npeak); + pParam->BSIM3v1npeak); } - if (pParam->BSIM3V1nsub <= 1.0e14) + if (pParam->BSIM3v1nsub <= 1.0e14) { fprintf(fplog, "Warning: Nsub = %g may be too small.\n", - pParam->BSIM3V1nsub); + pParam->BSIM3v1nsub); printf("Warning: Nsub = %g may be too small.\n", - pParam->BSIM3V1nsub); + pParam->BSIM3v1nsub); } - else if (pParam->BSIM3V1nsub >= 1.0e21) + else if (pParam->BSIM3v1nsub >= 1.0e21) { fprintf(fplog, "Warning: Nsub = %g may be too large.\n", - pParam->BSIM3V1nsub); + pParam->BSIM3v1nsub); printf("Warning: Nsub = %g may be too large.\n", - pParam->BSIM3V1nsub); + pParam->BSIM3v1nsub); } - if ((pParam->BSIM3V1ngate > 0.0) && - (pParam->BSIM3V1ngate <= 1.e18)) + if ((pParam->BSIM3v1ngate > 0.0) && + (pParam->BSIM3v1ngate <= 1.e18)) { fprintf(fplog, "Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM3V1ngate); + pParam->BSIM3v1ngate); printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", - pParam->BSIM3V1ngate); + pParam->BSIM3v1ngate); } - if (pParam->BSIM3V1dvt0 < 0.0) + if (pParam->BSIM3v1dvt0 < 0.0) { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", - pParam->BSIM3V1dvt0); - printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM3V1dvt0); + pParam->BSIM3v1dvt0); + printf("Warning: Dvt0 = %g is negative.\n", pParam->BSIM3v1dvt0); } - if (fabs(1.0e-6 / (pParam->BSIM3V1w0 + pParam->BSIM3V1weff)) > 10.0) + if (fabs(1.0e-6 / (pParam->BSIM3v1w0 + pParam->BSIM3v1weff)) > 10.0) { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); printf("Warning: (W0 + Weff) may be too small.\n"); } /* Check subthreshold parameters */ - if (pParam->BSIM3V1nfactor < 0.0) + if (pParam->BSIM3v1nfactor < 0.0) { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", - pParam->BSIM3V1nfactor); - printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM3V1nfactor); + pParam->BSIM3v1nfactor); + printf("Warning: Nfactor = %g is negative.\n", pParam->BSIM3v1nfactor); } - if (pParam->BSIM3V1cdsc < 0.0) + if (pParam->BSIM3v1cdsc < 0.0) { fprintf(fplog, "Warning: Cdsc = %g is negative.\n", - pParam->BSIM3V1cdsc); - printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM3V1cdsc); + pParam->BSIM3v1cdsc); + printf("Warning: Cdsc = %g is negative.\n", pParam->BSIM3v1cdsc); } - if (pParam->BSIM3V1cdscd < 0.0) + if (pParam->BSIM3v1cdscd < 0.0) { fprintf(fplog, "Warning: Cdscd = %g is negative.\n", - pParam->BSIM3V1cdscd); - printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM3V1cdscd); + pParam->BSIM3v1cdscd); + printf("Warning: Cdscd = %g is negative.\n", pParam->BSIM3v1cdscd); } /* Check DIBL parameters */ - if (pParam->BSIM3V1eta0 < 0.0) + if (pParam->BSIM3v1eta0 < 0.0) { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", - pParam->BSIM3V1eta0); - printf("Warning: Eta0 = %g is negative.\n", pParam->BSIM3V1eta0); + pParam->BSIM3v1eta0); + printf("Warning: Eta0 = %g is negative.\n", pParam->BSIM3v1eta0); } /* Check Abulk parameters */ - if (fabs(1.0e-6 / (pParam->BSIM3V1b1 + pParam->BSIM3V1weff)) > 10.0) + if (fabs(1.0e-6 / (pParam->BSIM3v1b1 + pParam->BSIM3v1weff)) > 10.0) { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); printf("Warning: (B1 + Weff) may be too small.\n"); } /* Check Saturation parameters */ - if (pParam->BSIM3V1a2 < 0.01) - { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3V1a2); + if (pParam->BSIM3v1a2 < 0.01) + { fprintf(fplog, "Warning: A2 = %g is too small. Set to 0.01.\n", pParam->BSIM3v1a2); printf("Warning: A2 = %g is too small. Set to 0.01.\n", - pParam->BSIM3V1a2); - pParam->BSIM3V1a2 = 0.01; + pParam->BSIM3v1a2); + pParam->BSIM3v1a2 = 0.01; } - else if (pParam->BSIM3V1a2 > 1.0) + else if (pParam->BSIM3v1a2 > 1.0) { fprintf(fplog, "Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM3V1a2); + pParam->BSIM3v1a2); printf("Warning: A2 = %g is larger than 1. A2 is set to 1 and A1 is set to 0.\n", - pParam->BSIM3V1a2); - pParam->BSIM3V1a2 = 1.0; - pParam->BSIM3V1a1 = 0.0; + pParam->BSIM3v1a2); + pParam->BSIM3v1a2 = 1.0; + pParam->BSIM3v1a1 = 0.0; } - if (pParam->BSIM3V1rdsw < 0.0) + if (pParam->BSIM3v1rdsw < 0.0) { fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM3V1rdsw); + pParam->BSIM3v1rdsw); printf("Warning: Rdsw = %g is negative. Set to zero.\n", - pParam->BSIM3V1rdsw); - pParam->BSIM3V1rdsw = 0.0; - pParam->BSIM3V1rds0 = 0.0; + pParam->BSIM3v1rdsw); + pParam->BSIM3v1rdsw = 0.0; + pParam->BSIM3v1rds0 = 0.0; } - else if ((pParam->BSIM3V1rds0 > 0.0) && (pParam->BSIM3V1rds0 < 0.001)) + else if ((pParam->BSIM3v1rds0 > 0.0) && (pParam->BSIM3v1rds0 < 0.001)) { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->BSIM3V1rds0); + pParam->BSIM3v1rds0); printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->BSIM3V1rds0); - pParam->BSIM3V1rds0 = 0.0; + pParam->BSIM3v1rds0); + pParam->BSIM3v1rds0 = 0.0; } - if (pParam->BSIM3V1vsattemp < 1.0e3) - { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3V1vsattemp); - printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3V1vsattemp); + if (pParam->BSIM3v1vsattemp < 1.0e3) + { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3v1vsattemp); + printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3v1vsattemp); } - if (pParam->BSIM3V1pdibl1 < 0.0) + if (pParam->BSIM3v1pdibl1 < 0.0) { fprintf(fplog, "Warning: Pdibl1 = %g is negative.\n", - pParam->BSIM3V1pdibl1); - printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM3V1pdibl1); + pParam->BSIM3v1pdibl1); + printf("Warning: Pdibl1 = %g is negative.\n", pParam->BSIM3v1pdibl1); } - if (pParam->BSIM3V1pdibl2 < 0.0) + if (pParam->BSIM3v1pdibl2 < 0.0) { fprintf(fplog, "Warning: Pdibl2 = %g is negative.\n", - pParam->BSIM3V1pdibl2); - printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM3V1pdibl2); + pParam->BSIM3v1pdibl2); + printf("Warning: Pdibl2 = %g is negative.\n", pParam->BSIM3v1pdibl2); } /* Check overlap capacitance parameters */ - if (model->BSIM3V1cgdo < 0.0) - { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3V1cgdo); - printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3V1cgdo); - model->BSIM3V1cgdo = 0.0; + if (model->BSIM3v1cgdo < 0.0) + { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3v1cgdo); + printf("Warning: cgdo = %g is negative. Set to zero.\n", model->BSIM3v1cgdo); + model->BSIM3v1cgdo = 0.0; } - if (model->BSIM3V1cgso < 0.0) - { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3V1cgso); - printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3V1cgso); - model->BSIM3V1cgso = 0.0; + if (model->BSIM3v1cgso < 0.0) + { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3v1cgso); + printf("Warning: cgso = %g is negative. Set to zero.\n", model->BSIM3v1cgso); + model->BSIM3v1cgso = 0.0; } - if (model->BSIM3V1cgbo < 0.0) - { fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3V1cgbo); - printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3V1cgbo); - model->BSIM3V1cgbo = 0.0; + if (model->BSIM3v1cgbo < 0.0) + { fprintf(fplog, "Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3v1cgbo); + printf("Warning: cgbo = %g is negative. Set to zero.\n", model->BSIM3v1cgbo); + model->BSIM3v1cgbo = 0.0; } }/* loop for the parameter check for warning messages */ diff --git a/src/spicelib/devices/bsim3v1/b3v1cvtest.c b/src/spicelib/devices/bsim3v1/b3v1cvtest.c index 33e900bd9..49f0d014c 100644 --- a/src/spicelib/devices/bsim3v1/b3v1cvtest.c +++ b/src/spicelib/devices/bsim3v1/b3v1cvtest.c @@ -1,12 +1,16 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v1cvtest.c -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1cvtest.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "bsim3v1def.h" #include "trandefs.h" @@ -17,92 +21,71 @@ File: b3v1cvtest.c int -BSIM3V1convTest(inModel,ckt) -GENmodel *inModel; -CKTcircuit *ckt; +BSIM3v1convTest(GENmodel *inModel, CKTcircuit *ckt) { -BSIM3V1model *model = (BSIM3V1model*)inModel; -BSIM3V1instance *here; +BSIM3v1model *model = (BSIM3v1model*)inModel; +BSIM3v1instance *here; double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds; double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; - /* loop through all the BSIM3V1 device models */ - for (; model != NULL; model = model->BSIM3V1nextModel) + /* loop through all the BSIM3v1 device models */ + for (; model != NULL; model = model->BSIM3v1nextModel) { /* loop through all the instances of the model */ - for (here = model->BSIM3V1instances; here != NULL ; - here=here->BSIM3V1nextInstance) + for (here = model->BSIM3v1instances; here != NULL ; + here=here->BSIM3v1nextInstance) { - if (here->BSIM3V1owner != ARCHme) continue; - vbs = model->BSIM3V1type - * (*(ckt->CKTrhsOld+here->BSIM3V1bNode) - - *(ckt->CKTrhsOld+here->BSIM3V1sNodePrime)); - vgs = model->BSIM3V1type - * (*(ckt->CKTrhsOld+here->BSIM3V1gNode) - - *(ckt->CKTrhsOld+here->BSIM3V1sNodePrime)); - vds = model->BSIM3V1type - * (*(ckt->CKTrhsOld+here->BSIM3V1dNodePrime) - - *(ckt->CKTrhsOld+here->BSIM3V1sNodePrime)); + + if (here->BSIM3v1owner != ARCHme) + continue; + + vbs = model->BSIM3v1type + * (*(ckt->CKTrhsOld+here->BSIM3v1bNode) + - *(ckt->CKTrhsOld+here->BSIM3v1sNodePrime)); + vgs = model->BSIM3v1type + * (*(ckt->CKTrhsOld+here->BSIM3v1gNode) + - *(ckt->CKTrhsOld+here->BSIM3v1sNodePrime)); + vds = model->BSIM3v1type + * (*(ckt->CKTrhsOld+here->BSIM3v1dNodePrime) + - *(ckt->CKTrhsOld+here->BSIM3v1sNodePrime)); vbd = vbs - vds; vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->BSIM3V1vgs) - - *(ckt->CKTstate0 + here->BSIM3V1vds); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3V1vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3V1vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3V1vgs); - delvds = vds - *(ckt->CKTstate0 + here->BSIM3V1vds); + vgdo = *(ckt->CKTstate0 + here->BSIM3v1vgs) + - *(ckt->CKTstate0 + here->BSIM3v1vds); + delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3v1vbs); + delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3v1vbd); + delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3v1vgs); + delvds = vds - *(ckt->CKTstate0 + here->BSIM3v1vds); delvgd = vgd-vgdo; - cd = here->BSIM3V1cd; - if (here->BSIM3V1mode >= 0) - { cdhat = cd - here->BSIM3V1gbd * delvbd - + here->BSIM3V1gmbs * delvbs + here->BSIM3V1gm * delvgs - + here->BSIM3V1gds * delvds; + cd = here->BSIM3v1cd; + if (here->BSIM3v1mode >= 0) + { cdhat = cd - here->BSIM3v1gbd * delvbd + + here->BSIM3v1gmbs * delvbs + here->BSIM3v1gm * delvgs + + here->BSIM3v1gds * delvds; } else - { cdhat = cd - (here->BSIM3V1gbd - here->BSIM3V1gmbs) * delvbd - - here->BSIM3V1gm * delvgd + here->BSIM3V1gds * delvds; + { cdhat = cd - (here->BSIM3v1gbd - here->BSIM3v1gmbs) * delvbd + - here->BSIM3v1gm * delvgd + here->BSIM3v1gds * delvds; } /* * check convergence */ - if ((here->BSIM3V1off == 0) || (!(ckt->CKTmode & MODEINITFIX))) + if ((here->BSIM3v1off == 0) || (!(ckt->CKTmode & MODEINITFIX))) { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) + ckt->CKTabstol; - if (fabs(cdhat - cd) >= tol) { - -#ifdef STRANGE_PATCH -/* gtri - begin - wbk - report conv prob */ - if(ckt->enh->conv_debug.report_conv_probs) { - ENHreport_conv_prob(ENH_ANALOG_INSTANCE, - (char *) here->BSIM3V1name, - ""); - } -/* gtri - end - wbk - report conv prob */ -#endif /* STRANGE_PATCH */ - - - ckt->CKTnoncon++; + if (fabs(cdhat - cd) >= tol) + { ckt->CKTnoncon++; return(OK); } - cbs = here->BSIM3V1cbs; - cbd = here->BSIM3V1cbd; - cbhat = cbs + cbd + here->BSIM3V1gbd * delvbd - + here->BSIM3V1gbs * delvbs; + cbs = here->BSIM3v1cbs; + cbd = here->BSIM3v1cbd; + cbhat = cbs + cbd + here->BSIM3v1gbd * delvbd + + here->BSIM3v1gbs * delvbs; tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(cbs + cbd)) + ckt->CKTabstol; - if (fabs(cbhat - (cbs + cbd)) > tol) { -#ifdef STRANGE_PATCH -/* gtri - begin - wbk - report conv prob */ - if(ckt->enh->conv_debug.report_conv_probs) { - ENHreport_conv_prob(ENH_ANALOG_INSTANCE, - (char *) here->BSIM3V1name, - ""); - } -/* gtri - end - wbk - report conv prob */ -#endif /* STRANGE_PATCH */ - - ckt->CKTnoncon++; + if (fabs(cbhat - (cbs + cbd)) > tol) + { ckt->CKTnoncon++; return(OK); } } diff --git a/src/spicelib/devices/bsim3v1/b3v1del.c b/src/spicelib/devices/bsim3v1/b3v1del.c index 04e78c3de..b4c24d370 100644 --- a/src/spicelib/devices/bsim3v1/b3v1del.c +++ b/src/spicelib/devices/bsim3v1/b3v1del.c @@ -1,13 +1,17 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v1del.c -**********/ -/* + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1del.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 */ + #include "ngspice.h" -#include #include "bsim3v1def.h" #include "sperror.h" #include "gendefs.h" @@ -15,25 +19,22 @@ File: b3v1del.c int -BSIM3V1delete(inModel,name,inInst) -GENmodel *inModel; -IFuid name; -GENinstance **inInst; +BSIM3v1delete(GENmodel *inModel, IFuid name, GENinstance **inInst) { -BSIM3V1instance **fast = (BSIM3V1instance**)inInst; -BSIM3V1model *model = (BSIM3V1model*)inModel; -BSIM3V1instance **prev = NULL; -BSIM3V1instance *here; +BSIM3v1instance **fast = (BSIM3v1instance**)inInst; +BSIM3v1model *model = (BSIM3v1model*)inModel; +BSIM3v1instance **prev = NULL; +BSIM3v1instance *here; - for (; model ; model = model->BSIM3V1nextModel) - { prev = &(model->BSIM3V1instances); + for (; model ; model = model->BSIM3v1nextModel) + { prev = &(model->BSIM3v1instances); for (here = *prev; here ; here = *prev) - { if (here->BSIM3V1name == name || (fast && here==*fast)) - { *prev= here->BSIM3V1nextInstance; + { if (here->BSIM3v1name == name || (fast && here==*fast)) + { *prev= here->BSIM3v1nextInstance; FREE(here); return(OK); } - prev = &(here->BSIM3V1nextInstance); + prev = &(here->BSIM3v1nextInstance); } } return(E_NODEV); diff --git a/src/spicelib/devices/bsim3v1/b3v1dest.c b/src/spicelib/devices/bsim3v1/b3v1dest.c index 38038920a..cf674e0f2 100644 --- a/src/spicelib/devices/bsim3v1/b3v1dest.c +++ b/src/spicelib/devices/bsim3v1/b3v1dest.c @@ -1,29 +1,33 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v1dest.c -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1dest.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ #include "ngspice.h" -#include #include "bsim3v1def.h" #include "suffix.h" void -BSIM3V1destroy(inModel) -GENmodel **inModel; +BSIM3v1destroy(GENmodel **inModel) { -BSIM3V1model **model = (BSIM3V1model**)inModel; -BSIM3V1instance *here; -BSIM3V1instance *prev = NULL; -BSIM3V1model *mod = *model; -BSIM3V1model *oldmod = NULL; +BSIM3v1model **model = (BSIM3v1model**)inModel; +BSIM3v1instance *here; +BSIM3v1instance *prev = NULL; +BSIM3v1model *mod = *model; +BSIM3v1model *oldmod = NULL; - for (; mod ; mod = mod->BSIM3V1nextModel) + for (; mod ; mod = mod->BSIM3v1nextModel) { if(oldmod) FREE(oldmod); oldmod = mod; - prev = (BSIM3V1instance *)NULL; - for (here = mod->BSIM3V1instances; here; here = here->BSIM3V1nextInstance) + prev = (BSIM3v1instance *)NULL; + for (here = mod->BSIM3v1instances; here; here = here->BSIM3v1nextInstance) { if(prev) FREE(prev); prev = here; } diff --git a/src/spicelib/devices/bsim3v1/b3v1getic.c b/src/spicelib/devices/bsim3v1/b3v1getic.c index 5f22ec84a..5ff5c8e28 100644 --- a/src/spicelib/devices/bsim3v1/b3v1getic.c +++ b/src/spicelib/devices/bsim3v1/b3v1getic.c @@ -1,11 +1,16 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v1getic.c -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1getic.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ #include "ngspice.h" -#include #include "cktdefs.h" #include "bsim3v1def.h" #include "sperror.h" @@ -13,28 +18,30 @@ File: b3v1getic.c int -BSIM3V1getic(inModel,ckt) -GENmodel *inModel; -CKTcircuit *ckt; +BSIM3v1getic(GENmodel *inModel, CKTcircuit *ckt) { -BSIM3V1model *model = (BSIM3V1model*)inModel; -BSIM3V1instance *here; +BSIM3v1model *model = (BSIM3v1model*)inModel; +BSIM3v1instance *here; - for (; model ; model = model->BSIM3V1nextModel) - { for (here = model->BSIM3V1instances; here; here = here->BSIM3V1nextInstance) + for (; model ; model = model->BSIM3v1nextModel) + { for (here = model->BSIM3v1instances; here; here = here->BSIM3v1nextInstance) { - if (here->BSIM3V1owner != ARCHme) continue; - if(!here->BSIM3V1icVBSGiven) - { here->BSIM3V1icVBS = *(ckt->CKTrhs + here->BSIM3V1bNode) - - *(ckt->CKTrhs + here->BSIM3V1sNode); + + if (here->BSIM3v1owner != ARCHme) + continue; + + + if(!here->BSIM3v1icVBSGiven) + { here->BSIM3v1icVBS = *(ckt->CKTrhs + here->BSIM3v1bNode) + - *(ckt->CKTrhs + here->BSIM3v1sNode); } - if (!here->BSIM3V1icVDSGiven) - { here->BSIM3V1icVDS = *(ckt->CKTrhs + here->BSIM3V1dNode) - - *(ckt->CKTrhs + here->BSIM3V1sNode); + if (!here->BSIM3v1icVDSGiven) + { here->BSIM3v1icVDS = *(ckt->CKTrhs + here->BSIM3v1dNode) + - *(ckt->CKTrhs + here->BSIM3v1sNode); } - if (!here->BSIM3V1icVGSGiven) - { here->BSIM3V1icVGS = *(ckt->CKTrhs + here->BSIM3V1gNode) - - *(ckt->CKTrhs + here->BSIM3V1sNode); + if (!here->BSIM3v1icVGSGiven) + { here->BSIM3v1icVGS = *(ckt->CKTrhs + here->BSIM3v1gNode) + - *(ckt->CKTrhs + here->BSIM3v1sNode); } } } diff --git a/src/spicelib/devices/bsim3v1/b3v1ld.c b/src/spicelib/devices/bsim3v1/b3v1ld.c index bf98c291c..ecf578a57 100644 --- a/src/spicelib/devices/bsim3v1/b3v1ld.c +++ b/src/spicelib/devices/bsim3v1/b3v1ld.c @@ -1,13 +1,17 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1991 JianHui Huang and Min-Chie Jeng. -File: b3v1ld.c 1/3/92 -Modified by Mansun Chan (1995) -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1ld.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Mansun Chan (1995) + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "bsim3v1def.h" #include "trandefs.h" @@ -29,12 +33,10 @@ Modified by Mansun Chan (1995) int -BSIM3V1load(inModel,ckt) -GENmodel *inModel; -CKTcircuit *ckt; +BSIM3v1load(GENmodel *inModel, CKTcircuit *ckt) { -BSIM3V1model *model = (BSIM3V1model*)inModel; -BSIM3V1instance *here; +BSIM3v1model *model = (BSIM3v1model*)inModel; +BSIM3v1instance *here; double SourceSatCurrent, DrainSatCurrent; double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst; double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; @@ -42,48 +44,54 @@ double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; double delvbd, delvbs, delvds, delvgd, delvgs; double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4; double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb; -double gcsgb, gcssb, PhiB, PhiBSW, MJ, MJSW, PhiBSWG, MJSWG; +double gcsgb, gcssb, tol, PhiB, PhiBSW, MJ, MJSW, PhiBSWG, MJSWG; double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact; -double qgate=0.0, qbulk=0.0, qdrn=0.0, qsrc=0.0, cqgate=0.0, cqbulk=0.0, cqdrn=0.0; +double qgate, qbulk, qdrn, qsrc, cqgate, cqbulk, cqdrn; double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; -double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd; +double Vgs_eff, Vfb, dVfb_dVb, dVfb_dVd, dVbs_dVb; double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd; double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm; -double n, dn_dVb, Vtm; -double ExpArg, V0; +double Vgdt, Vgsaddvth, Vgsaddvth2, Vgsaddvth1o3, n, dn_dVb, Vtm; +double ExpArg, ExpArg1, V0; double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; double ueff, dueff_dVg, dueff_dVd, dueff_dVb; -double Esat, Vdsat; +double Esat, dEsat_dVg, dEsat_dVd, dEsat_dVb, Vdsat, Vdsat0; double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; +double Ilimit, Iexp, dIexp_dVg, dIexp_dVd, dIexp_dVb; double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; +double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, Va2, dVa_dVd, dVa_dVg, dVa_dVb; double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; -double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; +double Arg1, Arg2, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; +double dqbulk_dVb, dVgdt_dVg, dVgdt_dVd, dVgdt_dVb; double T0, dT0_dVg, dT0_dVd, dT0_dVb; double T1, dT1_dVg, dT1_dVd, dT1_dVb; double T2, dT2_dVg, dT2_dVd, dT2_dVb; double T3, dT3_dVg, dT3_dVd, dT3_dVb; -double T4; -double T5; -double T6; +double T4, dT4_dVg, dT4_dVd, dT4_dVb; +double T5, dT5_dVg, dT5_dVd, dT5_dVb; +double T6, dT6_dVg, dT6_dVd, dT6_dVb; double T7, dT7_dVg, dT7_dVd, dT7_dVb; -double T8; -double T9; -double T10; +double T8, dT8_dVg, dT8_dVd, dT8_dVb; +double T9, dT9_dVg, dT9_dVd, dT9_dVb; +double T10, dT10_dVg, dT10_dVb, dT10_dVd; double T11, T12; double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; +double T100, T101; double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; +double VAHCE, dVAHCE_dVg, dVAHCE_dVd, dVAHCE_dVb; double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb; -double Theta0, dTheta0_dVb; -double TempRatio, tmp1, tmp2, tmp3, tmp4; -double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; +double Theta0, dTheta0_dVb, Theta1, dTheta1_dVb; +double Thetarout, dThetarout_dVb, TempRatio, tmp1, tmp2, tmp3, tmp4; +double DIBL_Sft, dDIBL_Sft_dVd, DIBL_fact, Lambda, dLambda_dVg; +double Rout_Vgs_factor, dRout_Vgs_factor_dVg, dRout_Vgs_factor_dVb; +double dRout_Vgs_factor_dVd; double tempv, a1; double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb; double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; -double diffVds; +double diffVds, diffVdsCV; double dAbulk_dVg, dn_dVd ; double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb; double gche, dgche_dVg, dgche_dVd, dgche_dVb; @@ -92,73 +100,72 @@ double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb; double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb; double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb; double Ids, Gm, Gds, Gmb; -double Isub, Gbd, Gbg, Gbb; +double Isub, Isubd, Isubs, Gbd, Gbg, Gbb; double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb; double CoxWovL; double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; -double Vgst2Vtm, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb; +double Vgst2Vtm, VdsatCV, dVdsatCV_dVd, dVdsatCV_dVg, dVdsatCV_dVb; double Leff, Weff, dWeff_dVg, dWeff_dVb; double AbulkCV, dAbulkCV_dVb; double qgdo, qgso, cgdo, cgso; -double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift; -double gcqdb,gcqsb,gcqgb,gcqbb; +double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift, csreq; +double gcqdb,gcqsb,gcqgb,gcqbb,vss; double dxpart, sxpart; double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; double gbdpdp, gbdpg, gbdpb, gbdpsp; -double Cgg, Cgd, Cgb; -double Csg, Csd, Csb, Cbg, Cbd, Cbb; -double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0; +double Cgg, Cgd, Cgs, Cgb, Cdg, Cdd, Cds, Cdb, Qg, Qd; +double Csg, Csd, Css, Csb, Cbg, Cbd, Cbs, Cbb, Qs, Qb; +double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1, Qac0, Qsub0; double dQac0_dVg, dQac0_dVd, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; + +double m; struct bsim3v1SizeDependParam *pParam; -int ByPass, Check, ChargeComputationNeeded, error; +int ByPass, Check, ChargeComputationNeeded, J, error, I; +double junk[50]; -for (; model != NULL; model = model->BSIM3V1nextModel) -{ for (here = model->BSIM3V1instances; here != NULL; - here = here->BSIM3V1nextInstance) +for (; model != NULL; model = model->BSIM3v1nextModel) +{ for (here = model->BSIM3v1instances; here != NULL; + here = here->BSIM3v1nextInstance) { - if (here->BSIM3V1owner != ARCHme) continue; - Check = 1; + + if (here->BSIM3v1owner != ARCHme) + continue; + + + Check = 1; ByPass = 0; pParam = here->pParam; if ((ckt->CKTmode & MODEINITSMSIG)) - { vbs = *(ckt->CKTstate0 + here->BSIM3V1vbs); - vgs = *(ckt->CKTstate0 + here->BSIM3V1vgs); - vds = *(ckt->CKTstate0 + here->BSIM3V1vds); - qdef = *(ckt->CKTstate0 + here->BSIM3V1qcdump); + { vbs = *(ckt->CKTstate0 + here->BSIM3v1vbs); + vgs = *(ckt->CKTstate0 + here->BSIM3v1vgs); + vds = *(ckt->CKTstate0 + here->BSIM3v1vds); + qdef = *(ckt->CKTstate0 + here->BSIM3v1qcdump); } else if ((ckt->CKTmode & MODEINITTRAN)) - { vbs = *(ckt->CKTstate1 + here->BSIM3V1vbs); - vgs = *(ckt->CKTstate1 + here->BSIM3V1vgs); - vds = *(ckt->CKTstate1 + here->BSIM3V1vds); - qdef = *(ckt->CKTstate1 + here->BSIM3V1qcdump); + { vbs = *(ckt->CKTstate1 + here->BSIM3v1vbs); + vgs = *(ckt->CKTstate1 + here->BSIM3v1vgs); + vds = *(ckt->CKTstate1 + here->BSIM3v1vds); + qdef = *(ckt->CKTstate1 + here->BSIM3v1qcdump); } - else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM3V1off) - { vds = model->BSIM3V1type * here->BSIM3V1icVDS; - vgs = model->BSIM3V1type * here->BSIM3V1icVGS; - vbs = model->BSIM3V1type * here->BSIM3V1icVBS; + else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM3v1off) + { vds = model->BSIM3v1type * here->BSIM3v1icVDS; + vgs = model->BSIM3v1type * here->BSIM3v1icVGS; + vbs = model->BSIM3v1type * here->BSIM3v1icVBS; qdef = 0.0; if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { - vgs = pParam->BSIM3V1vth0 + 0.1; - if (here->BSIM3V1gNode == here->BSIM3V1dNode) - vds = vgs; - else - vds = 0.1; - if ((here->BSIM3V1bNode != here->BSIM3V1sNode) - && (here->BSIM3V1bNode != here->BSIM3V1dNode)) - vbs = -0.1; - else - vbs = 0.0; + { vbs = 0.0; + vgs = pParam->BSIM3v1vth0 + 0.1; + vds = 0.1; } } else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->BSIM3V1off)) + (here->BSIM3v1off)) { qdef = vbs = vgs = vds = 0.0; } else @@ -166,65 +173,66 @@ for (; model != NULL; model = model->BSIM3V1nextModel) #ifndef PREDICTOR if ((ckt->CKTmode & MODEINITPRED)) { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->BSIM3V1vbs) = - *(ckt->CKTstate1 + here->BSIM3V1vbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3V1vbs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3V1vbs))); - *(ckt->CKTstate0 + here->BSIM3V1vgs) = - *(ckt->CKTstate1 + here->BSIM3V1vgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3V1vgs)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3V1vgs))); - *(ckt->CKTstate0 + here->BSIM3V1vds) = - *(ckt->CKTstate1 + here->BSIM3V1vds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3V1vds)) - - (xfact * (*(ckt->CKTstate2 + here->BSIM3V1vds))); - *(ckt->CKTstate0 + here->BSIM3V1vbd) = - *(ckt->CKTstate0 + here->BSIM3V1vbs) - - *(ckt->CKTstate0 + here->BSIM3V1vds); - qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3V1qcdump)) - -(xfact * (*(ckt->CKTstate2 + here->BSIM3V1qcdump))); + *(ckt->CKTstate0 + here->BSIM3v1vbs) = + *(ckt->CKTstate1 + here->BSIM3v1vbs); + vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v1vbs)) + - (xfact * (*(ckt->CKTstate2 + here->BSIM3v1vbs))); + *(ckt->CKTstate0 + here->BSIM3v1vgs) = + *(ckt->CKTstate1 + here->BSIM3v1vgs); + vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v1vgs)) + - (xfact * (*(ckt->CKTstate2 + here->BSIM3v1vgs))); + *(ckt->CKTstate0 + here->BSIM3v1vds) = + *(ckt->CKTstate1 + here->BSIM3v1vds); + vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v1vds)) + - (xfact * (*(ckt->CKTstate2 + here->BSIM3v1vds))); + *(ckt->CKTstate0 + here->BSIM3v1vbd) = + *(ckt->CKTstate0 + here->BSIM3v1vbs) + - *(ckt->CKTstate0 + here->BSIM3v1vds); + qdef = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM3v1qcdump)) + -(xfact * (*(ckt->CKTstate2 + here->BSIM3v1qcdump))); } else { #endif /* PREDICTOR */ - vbs = model->BSIM3V1type - * (*(ckt->CKTrhsOld + here->BSIM3V1bNode) - - *(ckt->CKTrhsOld + here->BSIM3V1sNodePrime)); - vgs = model->BSIM3V1type - * (*(ckt->CKTrhsOld + here->BSIM3V1gNode) - - *(ckt->CKTrhsOld + here->BSIM3V1sNodePrime)); - vds = model->BSIM3V1type - * (*(ckt->CKTrhsOld + here->BSIM3V1dNodePrime) - - *(ckt->CKTrhsOld + here->BSIM3V1sNodePrime)); - qdef = *(ckt->CKTrhsOld + here->BSIM3V1qNode); + vbs = model->BSIM3v1type + * (*(ckt->CKTrhsOld + here->BSIM3v1bNode) + - *(ckt->CKTrhsOld + here->BSIM3v1sNodePrime)); + vgs = model->BSIM3v1type + * (*(ckt->CKTrhsOld + here->BSIM3v1gNode) + - *(ckt->CKTrhsOld + here->BSIM3v1sNodePrime)); + vds = model->BSIM3v1type + * (*(ckt->CKTrhsOld + here->BSIM3v1dNodePrime) + - *(ckt->CKTrhsOld + here->BSIM3v1sNodePrime)); + qdef = *(ckt->CKTrhsOld + here->BSIM3v1qNode); #ifndef PREDICTOR } #endif /* PREDICTOR */ vbd = vbs - vds; vgd = vgs - vds; - vgdo = *(ckt->CKTstate0 + here->BSIM3V1vgs) - - *(ckt->CKTstate0 + here->BSIM3V1vds); - delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3V1vbs); - delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3V1vbd); - delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3V1vgs); - delvds = vds - *(ckt->CKTstate0 + here->BSIM3V1vds); + vgdo = *(ckt->CKTstate0 + here->BSIM3v1vgs) + - *(ckt->CKTstate0 + here->BSIM3v1vds); + delvbs = vbs - *(ckt->CKTstate0 + here->BSIM3v1vbs); + delvbd = vbd - *(ckt->CKTstate0 + here->BSIM3v1vbd); + delvgs = vgs - *(ckt->CKTstate0 + here->BSIM3v1vgs); + delvds = vds - *(ckt->CKTstate0 + here->BSIM3v1vds); delvgd = vgd - vgdo; - if (here->BSIM3V1mode >= 0) - { cdhat = here->BSIM3V1cd - here->BSIM3V1gbd * delvbd - + here->BSIM3V1gmbs * delvbs + here->BSIM3V1gm * delvgs - + here->BSIM3V1gds * delvds; + if (here->BSIM3v1mode >= 0) + { cdhat = here->BSIM3v1cd - here->BSIM3v1gbd * delvbd + + here->BSIM3v1gmbs * delvbs + here->BSIM3v1gm * delvgs + + here->BSIM3v1gds * delvds; } else - { cdhat = here->BSIM3V1cd - (here->BSIM3V1gbd - here->BSIM3V1gmbs) - * delvbd - here->BSIM3V1gm * delvgd - + here->BSIM3V1gds * delvds; + { cdhat = here->BSIM3v1cd - (here->BSIM3v1gbd - here->BSIM3v1gmbs) + * delvbd - here->BSIM3v1gm * delvgd + + here->BSIM3v1gds * delvds; } - cbhat = here->BSIM3V1cbs + here->BSIM3V1cbd + here->BSIM3V1gbd - * delvbd + here->BSIM3V1gbs * delvbs; + cbhat = here->BSIM3v1cbs + here->BSIM3v1cbd + here->BSIM3v1gbd + * delvbd + here->BSIM3v1gbs * delvbs; +#ifndef NOBYPASS /* following should be one big if connected by && all over * the place, but some C compilers can't handle that, so * we split it up here to let them digest it in stages @@ -232,31 +240,31 @@ for (; model != NULL; model = model->BSIM3V1nextModel) if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass)) if ((fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->BSIM3V1vbs))) + ckt->CKTvoltTol))) + fabs(*(ckt->CKTstate0+here->BSIM3v1vbs))) + ckt->CKTvoltTol))) if ((fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->BSIM3V1vbd))) + ckt->CKTvoltTol))) + fabs(*(ckt->CKTstate0+here->BSIM3v1vbd))) + ckt->CKTvoltTol))) if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->BSIM3V1vgs))) + ckt->CKTvoltTol))) + fabs(*(ckt->CKTstate0+here->BSIM3v1vgs))) + ckt->CKTvoltTol))) if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->BSIM3V1vds))) + ckt->CKTvoltTol))) - if ((fabs(cdhat - here->BSIM3V1cd) < ckt->CKTreltol - * MAX(fabs(cdhat),fabs(here->BSIM3V1cd)) + ckt->CKTabstol)) - { tempv = MAX(fabs(cbhat),fabs(here->BSIM3V1cbs - + here->BSIM3V1cbd)) + ckt->CKTabstol; - if ((fabs(cbhat - (here->BSIM3V1cbs + here->BSIM3V1cbd)) + fabs(*(ckt->CKTstate0+here->BSIM3v1vds))) + ckt->CKTvoltTol))) + if ((fabs(cdhat - here->BSIM3v1cd) < ckt->CKTreltol + * MAX(fabs(cdhat),fabs(here->BSIM3v1cd)) + ckt->CKTabstol)) + { tempv = MAX(fabs(cbhat),fabs(here->BSIM3v1cbs + + here->BSIM3v1cbd)) + ckt->CKTabstol; + if ((fabs(cbhat - (here->BSIM3v1cbs + here->BSIM3v1cbd)) < ckt->CKTreltol * tempv)) { /* bypass code */ - vbs = *(ckt->CKTstate0 + here->BSIM3V1vbs); - vbd = *(ckt->CKTstate0 + here->BSIM3V1vbd); - vgs = *(ckt->CKTstate0 + here->BSIM3V1vgs); - vds = *(ckt->CKTstate0 + here->BSIM3V1vds); - qcheq = *(ckt->CKTstate0 + here->BSIM3V1qcheq); + vbs = *(ckt->CKTstate0 + here->BSIM3v1vbs); + vbd = *(ckt->CKTstate0 + here->BSIM3v1vbd); + vgs = *(ckt->CKTstate0 + here->BSIM3v1vgs); + vds = *(ckt->CKTstate0 + here->BSIM3v1vds); + qcheq = *(ckt->CKTstate0 + here->BSIM3v1qcheq); vgd = vgs - vds; vgb = vgs - vbs; - cdrain = here->BSIM3V1mode * (here->BSIM3V1cd - + here->BSIM3V1cbd); + cdrain = here->BSIM3v1mode * (here->BSIM3v1cd + + here->BSIM3v1cbd); if ((ckt->CKTmode & (MODETRAN | MODEAC)) || ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) @@ -269,30 +277,31 @@ for (; model != NULL; model = model->BSIM3V1nextModel) } } - von = here->BSIM3V1von; - if (*(ckt->CKTstate0 + here->BSIM3V1vds) >= 0.0) - { vgs = DEVfetlim(vgs, *(ckt->CKTstate0+here->BSIM3V1vgs), von); +#endif /*NOBYPASS*/ + von = here->BSIM3v1von; + if (*(ckt->CKTstate0 + here->BSIM3v1vds) >= 0.0) + { vgs = DEVfetlim(vgs, *(ckt->CKTstate0+here->BSIM3v1vgs), von); vds = vgs - vgd; - vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM3V1vds)); + vds = DEVlimvds(vds, *(ckt->CKTstate0 + here->BSIM3v1vds)); vgd = vgs - vds; } else { vgd = DEVfetlim(vgd, vgdo, von); vds = vgs - vgd; - vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0+here->BSIM3V1vds))); + vds = -DEVlimvds(-vds, -(*(ckt->CKTstate0+here->BSIM3v1vds))); vgs = vgd + vds; } if (vds >= 0.0) - { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM3V1vbs), - CONSTvt0, model->BSIM3V1vcrit, &Check); + { vbs = DEVpnjlim(vbs, *(ckt->CKTstate0 + here->BSIM3v1vbs), + CONSTvt0, model->BSIM3v1vcrit, &Check); vbd = vbs - vds; } else - { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM3V1vbd), - CONSTvt0, model->BSIM3V1vcrit, &Check); + { vbd = DEVpnjlim(vbd, *(ckt->CKTstate0 + here->BSIM3v1vbd), + CONSTvt0, model->BSIM3v1vcrit, &Check); vbs = vbd + vds; } } @@ -301,78 +310,81 @@ for (; model != NULL; model = model->BSIM3V1nextModel) vbd = vbs - vds; vgd = vgs - vds; vgb = vgs - vbs; + + m = here->BSIM3v1m; + /* the following code has been changed for the calculation of S/B and D/B diodes*/ - if ((here->BSIM3V1sourceArea <= 0.0) && - (here->BSIM3V1sourcePerimeter <= 0.0)) + if ((here->BSIM3v1sourceArea <= 0.0) && + (here->BSIM3v1sourcePerimeter <= 0.0)) { SourceSatCurrent = 1.0e-14; } else - { SourceSatCurrent = here->BSIM3V1sourceArea - * model->BSIM3V1jctTempSatCurDensity - + here->BSIM3V1sourcePerimeter - * model->BSIM3V1jctSidewallTempSatCurDensity; + { SourceSatCurrent = here->BSIM3v1sourceArea + * model->BSIM3v1jctTempSatCurDensity + + here->BSIM3v1sourcePerimeter + * model->BSIM3v1jctSidewallTempSatCurDensity; } - Nvtm = model->BSIM3V1vtm * model->BSIM3V1jctEmissionCoeff; + Nvtm = model->BSIM3v1vtm * model->BSIM3v1jctEmissionCoeff; if (SourceSatCurrent <= 0.0) - { here->BSIM3V1gbs = ckt->CKTgmin; - here->BSIM3V1cbs = here->BSIM3V1gbs * vbs; + { here->BSIM3v1gbs = ckt->CKTgmin; + here->BSIM3v1cbs = here->BSIM3v1gbs * vbs; } else if (vbs < 0.5) { evbs = exp(vbs / Nvtm); - here->BSIM3V1gbs = SourceSatCurrent * evbs / Nvtm + ckt->CKTgmin; - here->BSIM3V1cbs = SourceSatCurrent * (evbs - 1.0) + here->BSIM3v1gbs = SourceSatCurrent * evbs / Nvtm + ckt->CKTgmin; + here->BSIM3v1cbs = SourceSatCurrent * (evbs - 1.0) + ckt->CKTgmin * vbs; } else { evbs = exp(0.5 / Nvtm); T0 = SourceSatCurrent * evbs / Nvtm; - here->BSIM3V1gbs = T0 + ckt->CKTgmin; - here->BSIM3V1cbs = SourceSatCurrent * (evbs - 1.0) + here->BSIM3v1gbs = T0 + ckt->CKTgmin; + here->BSIM3v1cbs = SourceSatCurrent * (evbs - 1.0) + T0 * (vbs - 0.5) + ckt->CKTgmin * vbs; } - if ((here->BSIM3V1drainArea <= 0.0) && - (here->BSIM3V1drainPerimeter <= 0.0)) + if ((here->BSIM3v1drainArea <= 0.0) && + (here->BSIM3v1drainPerimeter <= 0.0)) { DrainSatCurrent = 1.0e-14; } else - { DrainSatCurrent = here->BSIM3V1drainArea - * model->BSIM3V1jctTempSatCurDensity - + here->BSIM3V1drainPerimeter - * model->BSIM3V1jctSidewallTempSatCurDensity; + { DrainSatCurrent = here->BSIM3v1drainArea + * model->BSIM3v1jctTempSatCurDensity + + here->BSIM3v1drainPerimeter + * model->BSIM3v1jctSidewallTempSatCurDensity; } if (DrainSatCurrent <= 0.0) - { here->BSIM3V1gbd = ckt->CKTgmin; - here->BSIM3V1cbd = here->BSIM3V1gbd * vbd; + { here->BSIM3v1gbd = ckt->CKTgmin; + here->BSIM3v1cbd = here->BSIM3v1gbd * vbd; } else if (vbd < 0.5) { evbd = exp(vbd / Nvtm); - here->BSIM3V1gbd = DrainSatCurrent * evbd / Nvtm + ckt->CKTgmin; - here->BSIM3V1cbd = DrainSatCurrent * (evbd - 1.0) + here->BSIM3v1gbd = DrainSatCurrent * evbd / Nvtm + ckt->CKTgmin; + here->BSIM3v1cbd = DrainSatCurrent * (evbd - 1.0) + ckt->CKTgmin * vbd; } else { evbd = exp(0.5 / Nvtm); T0 = DrainSatCurrent * evbd / Nvtm; - here->BSIM3V1gbd = T0 + ckt->CKTgmin; - here->BSIM3V1cbd = DrainSatCurrent * (evbd - 1.0) + here->BSIM3v1gbd = T0 + ckt->CKTgmin; + here->BSIM3v1cbd = DrainSatCurrent * (evbd - 1.0) + T0 * (vbd - 0.5) + ckt->CKTgmin * vbd; } /* S/B and D/B diodes code change ends */ if (vds >= 0.0) { /* normal mode */ - here->BSIM3V1mode = 1; + here->BSIM3v1mode = 1; Vds = vds; Vgs = vgs; Vbs = vbs; } else { /* inverse mode */ - here->BSIM3V1mode = -1; + here->BSIM3v1mode = -1; Vds = -vds; Vgs = vgd; Vbs = vbd; @@ -382,64 +394,64 @@ for (; model != NULL; model = model->BSIM3V1nextModel) ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) ? 1 : 0; - T0 = Vbs - pParam->BSIM3V1vbsc - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * pParam->BSIM3V1vbsc); - Vbseff = pParam->BSIM3V1vbsc + 0.5 * (T0 + T1); + T0 = Vbs - pParam->BSIM3v1vbsc - 0.001; + T1 = sqrt(T0 * T0 - 0.004 * pParam->BSIM3v1vbsc); + Vbseff = pParam->BSIM3v1vbsc + 0.5 * (T0 + T1); dVbseff_dVb = 0.5 * (1.0 + T0 / T1); if (Vbseff < Vbs) { Vbseff = Vbs; } /* Added to avoid the possible numerical problems due to computer accuracy. See comments for diffVds */ if (Vbseff > 0.0) - { T0 = pParam->BSIM3V1phi / (pParam->BSIM3V1phi + Vbseff); - Phis = pParam->BSIM3V1phi * T0; + { T0 = pParam->BSIM3v1phi / (pParam->BSIM3v1phi + Vbseff); + Phis = pParam->BSIM3v1phi * T0; dPhis_dVb = -T0 * T0; - sqrtPhis = pParam->BSIM3V1phis3 / (pParam->BSIM3V1phi + 0.5 * Vbseff); - dsqrtPhis_dVb = -0.5 * sqrtPhis * sqrtPhis / pParam->BSIM3V1phis3; + sqrtPhis = pParam->BSIM3v1phis3 / (pParam->BSIM3v1phi + 0.5 * Vbseff); + dsqrtPhis_dVb = -0.5 * sqrtPhis * sqrtPhis / pParam->BSIM3v1phis3; } else - { Phis = pParam->BSIM3V1phi - Vbseff; + { Phis = pParam->BSIM3v1phi - Vbseff; dPhis_dVb = -1.0; sqrtPhis = sqrt(Phis); dsqrtPhis_dVb = -0.5 / sqrtPhis; } - Xdep = pParam->BSIM3V1Xdep0 * sqrtPhis / pParam->BSIM3V1sqrtPhi; - dXdep_dVb = (pParam->BSIM3V1Xdep0 / pParam->BSIM3V1sqrtPhi) + Xdep = pParam->BSIM3v1Xdep0 * sqrtPhis / pParam->BSIM3v1sqrtPhi; + dXdep_dVb = (pParam->BSIM3v1Xdep0 / pParam->BSIM3v1sqrtPhi) * dsqrtPhis_dVb; - Leff = pParam->BSIM3V1leff; - Vtm = model->BSIM3V1vtm; + Leff = pParam->BSIM3v1leff; + Vtm = model->BSIM3v1vtm; /* Vth Calculation */ T3 = sqrt(Xdep); - V0 = pParam->BSIM3V1vbi - pParam->BSIM3V1phi; + V0 = pParam->BSIM3v1vbi - pParam->BSIM3v1phi; - T0 = pParam->BSIM3V1dvt2 * Vbseff; + T0 = pParam->BSIM3v1dvt2 * Vbseff; if (T0 >= - 0.5) { T1 = 1.0 + T0; - T2 = pParam->BSIM3V1dvt2; + T2 = pParam->BSIM3v1dvt2; } else /* Added to avoid any discontinuity problems caused by dvt2 */ { T4 = 1.0 / (3.0 + 8.0 * T0); T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM3V1dvt2 * T4 * T4; + T2 = pParam->BSIM3v1dvt2 * T4 * T4; } - lt1 = model->BSIM3V1factor1 * T3 * T1; - dlt1_dVb = model->BSIM3V1factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + lt1 = model->BSIM3v1factor1 * T3 * T1; + dlt1_dVb = model->BSIM3v1factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - T0 = pParam->BSIM3V1dvt2w * Vbseff; + T0 = pParam->BSIM3v1dvt2w * Vbseff; if (T0 >= - 0.5) { T1 = 1.0 + T0; - T2 = pParam->BSIM3V1dvt2w; + T2 = pParam->BSIM3v1dvt2w; } else /* Added to avoid any discontinuity problems caused by dvt2w */ { T4 = 1.0 / (3.0 + 8.0 * T0); T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->BSIM3V1dvt2w * T4 * T4; + T2 = pParam->BSIM3v1dvt2w * T4 * T4; } - ltw = model->BSIM3V1factor1 * T3 * T1; - dltw_dVb = model->BSIM3V1factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + ltw = model->BSIM3v1factor1 * T3 * T1; + dltw_dVb = model->BSIM3v1factor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - T0 = -0.5 * pParam->BSIM3V1dvt1 * Leff / lt1; + T0 = -0.5 * pParam->BSIM3v1dvt1 * Leff / lt1; if (T0 > -EXP_THRESHOLD) { T1 = exp(T0); Theta0 = T1 * (1.0 + 2.0 * T1); @@ -452,11 +464,11 @@ for (; model != NULL; model = model->BSIM3V1nextModel) dTheta0_dVb = 0.0; } - here->BSIM3V1thetavth = pParam->BSIM3V1dvt0 * Theta0; - Delt_vth = here->BSIM3V1thetavth * V0; - dDelt_vth_dVb = pParam->BSIM3V1dvt0 * dTheta0_dVb * V0; + here->BSIM3v1thetavth = pParam->BSIM3v1dvt0 * Theta0; + Delt_vth = here->BSIM3v1thetavth * V0; + dDelt_vth_dVb = pParam->BSIM3v1dvt0 * dTheta0_dVb * V0; - T0 = -0.5 * pParam->BSIM3V1dvt1w * pParam->BSIM3V1weff * Leff / ltw; + T0 = -0.5 * pParam->BSIM3v1dvt1w * pParam->BSIM3v1weff * Leff / ltw; if (T0 > -EXP_THRESHOLD) { T1 = exp(T0); T2 = T1 * (1.0 + 2.0 * T1); @@ -469,19 +481,19 @@ for (; model != NULL; model = model->BSIM3V1nextModel) dT2_dVb = 0.0; } - T0 = pParam->BSIM3V1dvt0w * T2; + T0 = pParam->BSIM3v1dvt0w * T2; T2 = T0 * V0; - dT2_dVb = pParam->BSIM3V1dvt0w * dT2_dVb * V0; + dT2_dVb = pParam->BSIM3v1dvt0w * dT2_dVb * V0; - TempRatio = ckt->CKTtemp / model->BSIM3V1tnom - 1.0; - T0 = sqrt(1.0 + pParam->BSIM3V1nlx / Leff); - T1 = pParam->BSIM3V1k1 * (T0 - 1.0) * pParam->BSIM3V1sqrtPhi - + (pParam->BSIM3V1kt1 + pParam->BSIM3V1kt1l / Leff - + pParam->BSIM3V1kt2 * Vbseff) * TempRatio; - tmp2 = model->BSIM3V1tox * pParam->BSIM3V1phi - / (pParam->BSIM3V1weff + pParam->BSIM3V1w0); + TempRatio = ckt->CKTtemp / model->BSIM3v1tnom - 1.0; + T0 = sqrt(1.0 + pParam->BSIM3v1nlx / Leff); + T1 = pParam->BSIM3v1k1 * (T0 - 1.0) * pParam->BSIM3v1sqrtPhi + + (pParam->BSIM3v1kt1 + pParam->BSIM3v1kt1l / Leff + + pParam->BSIM3v1kt2 * Vbseff) * TempRatio; + tmp2 = model->BSIM3v1tox * pParam->BSIM3v1phi + / (pParam->BSIM3v1weff + pParam->BSIM3v1w0); - T3 = pParam->BSIM3V1eta0 + pParam->BSIM3V1etab * Vbseff; + T3 = pParam->BSIM3v1eta0 + pParam->BSIM3v1etab * Vbseff; if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ { T9 = 1.0 / (3.0 - 2.0e4 * T3); T3 = (2.0e-4 - T3) * T9; @@ -490,32 +502,32 @@ for (; model != NULL; model = model->BSIM3V1nextModel) else { T4 = 1.0; } - dDIBL_Sft_dVd = T3 * pParam->BSIM3V1theta0vb0; + dDIBL_Sft_dVd = T3 * pParam->BSIM3v1theta0vb0; DIBL_Sft = dDIBL_Sft_dVd * Vds; - Vth = model->BSIM3V1type * pParam->BSIM3V1vth0 + pParam->BSIM3V1k1 - * (sqrtPhis - pParam->BSIM3V1sqrtPhi) - pParam->BSIM3V1k2 - * Vbseff - Delt_vth - T2 + (pParam->BSIM3V1k3 + pParam->BSIM3V1k3b + Vth = model->BSIM3v1type * pParam->BSIM3v1vth0 + pParam->BSIM3v1k1 + * (sqrtPhis - pParam->BSIM3v1sqrtPhi) - pParam->BSIM3v1k2 + * Vbseff - Delt_vth - T2 + (pParam->BSIM3v1k3 + pParam->BSIM3v1k3b * Vbseff) * tmp2 + T1 - DIBL_Sft; - here->BSIM3V1von = Vth; + here->BSIM3v1von = Vth; - dVth_dVb = pParam->BSIM3V1k1 * dsqrtPhis_dVb - pParam->BSIM3V1k2 - - dDelt_vth_dVb - dT2_dVb + pParam->BSIM3V1k3b * tmp2 - - pParam->BSIM3V1etab * Vds * pParam->BSIM3V1theta0vb0 * T4 - + pParam->BSIM3V1kt2 * TempRatio; + dVth_dVb = pParam->BSIM3v1k1 * dsqrtPhis_dVb - pParam->BSIM3v1k2 + - dDelt_vth_dVb - dT2_dVb + pParam->BSIM3v1k3b * tmp2 + - pParam->BSIM3v1etab * Vds * pParam->BSIM3v1theta0vb0 * T4 + + pParam->BSIM3v1kt2 * TempRatio; dVth_dVd = -dDIBL_Sft_dVd; /* Calculate n */ - tmp2 = pParam->BSIM3V1nfactor * EPSSI / Xdep; - tmp3 = pParam->BSIM3V1cdsc + pParam->BSIM3V1cdscb * Vbseff - + pParam->BSIM3V1cdscd * Vds; - tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM3V1cit) / model->BSIM3V1cox; + tmp2 = pParam->BSIM3v1nfactor * EPSSI / Xdep; + tmp3 = pParam->BSIM3v1cdsc + pParam->BSIM3v1cdscb * Vbseff + + pParam->BSIM3v1cdscd * Vds; + tmp4 = (tmp2 + tmp3 * Theta0 + pParam->BSIM3v1cit) / model->BSIM3v1cox; if (tmp4 >= -0.5) { n = 1.0 + tmp4; dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM3V1cdscb * Theta0) / model->BSIM3V1cox; - dn_dVd = pParam->BSIM3V1cdscd * Theta0 / model->BSIM3V1cox; + + pParam->BSIM3v1cdscb * Theta0) / model->BSIM3v1cox; + dn_dVd = pParam->BSIM3v1cdscd * Theta0 / model->BSIM3v1cox; } else /* avoid discontinuity problems caused by tmp4 */ @@ -523,17 +535,17 @@ for (; model != NULL; model = model->BSIM3V1nextModel) n = (1.0 + 3.0 * tmp4) * T0; T0 *= T0; dn_dVb = (-tmp2 / Xdep * dXdep_dVb + tmp3 * dTheta0_dVb - + pParam->BSIM3V1cdscb * Theta0) / model->BSIM3V1cox * T0; - dn_dVd = pParam->BSIM3V1cdscd * Theta0 / model->BSIM3V1cox * T0; + + pParam->BSIM3v1cdscb * Theta0) / model->BSIM3v1cox * T0; + dn_dVd = pParam->BSIM3v1cdscd * Theta0 / model->BSIM3v1cox * T0; } /* Poly Gate Si Depletion Effect */ - T0 = pParam->BSIM3V1vfb + pParam->BSIM3V1phi; - if ((pParam->BSIM3V1ngate > 1.e18) && (pParam->BSIM3V1ngate < 1.e25) + T0 = pParam->BSIM3v1vfb + pParam->BSIM3v1phi; + if ((pParam->BSIM3v1ngate > 1.e18) && (pParam->BSIM3v1ngate < 1.e25) && (Vgs > T0)) /* added to avoid the problem caused by ngate */ - { T1 = 1.0e6 * Charge_q * EPSSI * pParam->BSIM3V1ngate - / (model->BSIM3V1cox * model->BSIM3V1cox); + { T1 = 1.0e6 * Charge_q * EPSSI * pParam->BSIM3v1ngate + / (model->BSIM3v1cox * model->BSIM3v1cox); T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); T2 = T1 * (T4 - 1.0); T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ @@ -553,7 +565,7 @@ for (; model != NULL; model = model->BSIM3V1nextModel) T10 = 2.0 * n * Vtm; VgstNVt = Vgst / T10; - ExpArg = (2.0 * pParam->BSIM3V1voff - Vgst) / T10; + ExpArg = (2.0 * pParam->BSIM3v1voff - Vgst) / T10; /* MCJ: Very small Vgst */ if (VgstNVt > EXP_THRESHOLD) @@ -563,9 +575,9 @@ for (; model != NULL; model = model->BSIM3V1nextModel) dVgsteff_dVb = -dVth_dVb; } else if (ExpArg > EXP_THRESHOLD) - { T0 = (Vgst - pParam->BSIM3V1voff) / (n * Vtm); + { T0 = (Vgst - pParam->BSIM3v1voff) / (n * Vtm); ExpVgst = exp(T0); - Vgsteff = Vtm * pParam->BSIM3V1cdep0 / model->BSIM3V1cox * ExpVgst; + Vgsteff = Vtm * pParam->BSIM3v1cdep0 / model->BSIM3v1cox * ExpVgst; dVgsteff_dVg = Vgsteff / (n * Vtm); dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + T0 * Vtm * dn_dVd); dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + T0 * Vtm * dn_dVb); @@ -580,7 +592,7 @@ for (; model != NULL; model = model->BSIM3V1nextModel) dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) + T1 / n * dn_dVd; - dT2_dVg = -model->BSIM3V1cox / (Vtm * pParam->BSIM3V1cdep0) + dT2_dVg = -model->BSIM3v1cox / (Vtm * pParam->BSIM3v1cdep0) * exp(ExpArg); T2 = 1.0 - T10 * dT2_dVg; dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd) @@ -596,11 +608,11 @@ for (; model != NULL; model = model->BSIM3V1nextModel) } /* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - pParam->BSIM3V1sqrtPhi; - Weff = pParam->BSIM3V1weff - 2.0 * (pParam->BSIM3V1dwg * Vgsteff - + pParam->BSIM3V1dwb * T9); - dWeff_dVg = -2.0 * pParam->BSIM3V1dwg; - dWeff_dVb = -2.0 * pParam->BSIM3V1dwb * dsqrtPhis_dVb; + T9 = sqrtPhis - pParam->BSIM3v1sqrtPhi; + Weff = pParam->BSIM3v1weff - 2.0 * (pParam->BSIM3v1dwg * Vgsteff + + pParam->BSIM3v1dwb * T9); + dWeff_dVg = -2.0 * pParam->BSIM3v1dwg; + dWeff_dVb = -2.0 * pParam->BSIM3v1dwb * dsqrtPhis_dVb; if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); @@ -610,32 +622,32 @@ for (; model != NULL; model = model->BSIM3V1nextModel) dWeff_dVb *= T0; } - T0 = pParam->BSIM3V1prwg * Vgsteff + pParam->BSIM3V1prwb * T9; + T0 = pParam->BSIM3v1prwg * Vgsteff + pParam->BSIM3v1prwb * T9; if (T0 >= -0.9) - { Rds = pParam->BSIM3V1rds0 * (1.0 + T0); - dRds_dVg = pParam->BSIM3V1rds0 * pParam->BSIM3V1prwg; - dRds_dVb = pParam->BSIM3V1rds0 * pParam->BSIM3V1prwb * dsqrtPhis_dVb; + { Rds = pParam->BSIM3v1rds0 * (1.0 + T0); + dRds_dVg = pParam->BSIM3v1rds0 * pParam->BSIM3v1prwg; + dRds_dVb = pParam->BSIM3v1rds0 * pParam->BSIM3v1prwb * dsqrtPhis_dVb; } else /* to avoid the discontinuity problem due to prwg and prwb*/ { T1 = 1.0 / (17.0 + 20.0 * T0); - Rds = pParam->BSIM3V1rds0 * (0.8 + T0) * T1; + Rds = pParam->BSIM3v1rds0 * (0.8 + T0) * T1; T1 *= T1; - dRds_dVg = pParam->BSIM3V1rds0 * pParam->BSIM3V1prwg * T1; - dRds_dVb = pParam->BSIM3V1rds0 * pParam->BSIM3V1prwb * dsqrtPhis_dVb + dRds_dVg = pParam->BSIM3v1rds0 * pParam->BSIM3v1prwg * T1; + dRds_dVb = pParam->BSIM3v1rds0 * pParam->BSIM3v1prwb * dsqrtPhis_dVb * T1; } /* Calculate Abulk */ - T1 = 0.5 * pParam->BSIM3V1k1 / sqrtPhis; + T1 = 0.5 * pParam->BSIM3v1k1 / sqrtPhis; dT1_dVb = -T1 / sqrtPhis * dsqrtPhis_dVb; - T9 = sqrt(pParam->BSIM3V1xj * Xdep); + T9 = sqrt(pParam->BSIM3v1xj * Xdep); tmp1 = Leff + 2.0 * T9; T5 = Leff / tmp1; - tmp2 = pParam->BSIM3V1a0 * T5; - tmp3 = pParam->BSIM3V1weff + pParam->BSIM3V1b1; - tmp4 = pParam->BSIM3V1b0 / tmp3; + tmp2 = pParam->BSIM3v1a0 * T5; + tmp3 = pParam->BSIM3v1weff + pParam->BSIM3v1b1; + tmp4 = pParam->BSIM3v1b0 / tmp3; T2 = tmp2 + tmp4; dT2_dVb = -T9 / tmp1 / Xdep * dXdep_dVb; T6 = T5 * T5; @@ -644,7 +656,7 @@ for (; model != NULL; model = model->BSIM3V1nextModel) Abulk0 = 1.0 + T1 * T2; dAbulk0_dVb = T1 * tmp2 * dT2_dVb + T2 * dT1_dVb; - T8 = pParam->BSIM3V1ags * pParam->BSIM3V1a0 * T7; + T8 = pParam->BSIM3v1ags * pParam->BSIM3v1a0 * T7; dAbulk_dVg = -T1 * T8; Abulk = Abulk0 + dAbulk_dVg * Vgsteff; dAbulk_dVb = dAbulk0_dVb - T8 * Vgsteff * (dT1_dVb @@ -663,16 +675,16 @@ for (; model != NULL; model = model->BSIM3V1nextModel) dAbulk_dVb *= T9 * T9; } - T2 = pParam->BSIM3V1keta * Vbseff; + T2 = pParam->BSIM3v1keta * Vbseff; if (T2 >= -0.9) { T0 = 1.0 / (1.0 + T2); - dT0_dVb = -pParam->BSIM3V1keta * T0 * T0; + dT0_dVb = -pParam->BSIM3v1keta * T0 * T0; } else /* added to avoid the problems caused by Keta */ { T1 = 1.0 / (0.8 + T2); T0 = (17.0 + 20.0 * T2) * T1; - dT0_dVb = -pParam->BSIM3V1keta * T1 * T1; + dT0_dVb = -pParam->BSIM3v1keta * T1 * T1; } dAbulk_dVg *= T0; dAbulk_dVb = dAbulk_dVb * T0 + Abulk * dT0_dVb; @@ -682,35 +694,35 @@ for (; model != NULL; model = model->BSIM3V1nextModel) /* Mobility calculation */ - if (model->BSIM3V1mobMod == 1) + if (model->BSIM3v1mobMod == 1) { T0 = Vgsteff + Vth + Vth; - T2 = pParam->BSIM3V1ua + pParam->BSIM3V1uc * Vbseff; - T3 = T0 / model->BSIM3V1tox; - T5 = T3 * (T2 + pParam->BSIM3V1ub * T3); - dDenomi_dVg = (T2 + 2.0 * pParam->BSIM3V1ub * T3) / model->BSIM3V1tox; + T2 = pParam->BSIM3v1ua + pParam->BSIM3v1uc * Vbseff; + T3 = T0 / model->BSIM3v1tox; + T5 = T3 * (T2 + pParam->BSIM3v1ub * T3); + dDenomi_dVg = (T2 + 2.0 * pParam->BSIM3v1ub * T3) / model->BSIM3v1tox; dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3V1uc * T3; + dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3v1uc * T3; } - else if (model->BSIM3V1mobMod == 2) - { T5 = Vgsteff / model->BSIM3V1tox * (pParam->BSIM3V1ua - + pParam->BSIM3V1uc * Vbseff + pParam->BSIM3V1ub * Vgsteff - / model->BSIM3V1tox); - dDenomi_dVg = (pParam->BSIM3V1ua + pParam->BSIM3V1uc * Vbseff - + 2.0 * pParam->BSIM3V1ub * Vgsteff / model->BSIM3V1tox) - / model->BSIM3V1tox; + else if (model->BSIM3v1mobMod == 2) + { T5 = Vgsteff / model->BSIM3v1tox * (pParam->BSIM3v1ua + + pParam->BSIM3v1uc * Vbseff + pParam->BSIM3v1ub * Vgsteff + / model->BSIM3v1tox); + dDenomi_dVg = (pParam->BSIM3v1ua + pParam->BSIM3v1uc * Vbseff + + 2.0 * pParam->BSIM3v1ub * Vgsteff / model->BSIM3v1tox) + / model->BSIM3v1tox; dDenomi_dVd = 0.0; - dDenomi_dVb = Vgsteff * pParam->BSIM3V1uc / model->BSIM3V1tox; + dDenomi_dVb = Vgsteff * pParam->BSIM3v1uc / model->BSIM3v1tox; } else { T0 = Vgsteff + Vth + Vth; - T2 = 1.0 + pParam->BSIM3V1uc * Vbseff; - T3 = T0 / model->BSIM3V1tox; - T4 = T3 * (pParam->BSIM3V1ua + pParam->BSIM3V1ub * T3); + T2 = 1.0 + pParam->BSIM3v1uc * Vbseff; + T3 = T0 / model->BSIM3v1tox; + T4 = T3 * (pParam->BSIM3v1ua + pParam->BSIM3v1ub * T3); T5 = T4 * T2; - dDenomi_dVg = (pParam->BSIM3V1ua + 2.0 * pParam->BSIM3V1ub * T3) * T2 - / model->BSIM3V1tox; + dDenomi_dVg = (pParam->BSIM3v1ua + 2.0 * pParam->BSIM3v1ub * T3) * T2 + / model->BSIM3v1tox; dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3V1uc * T4; + dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + pParam->BSIM3v1uc * T4; } if (T5 >= -0.8) @@ -725,17 +737,17 @@ for (; model != NULL; model = model->BSIM3V1nextModel) dDenomi_dVb *= T9; } - here->BSIM3V1ueff = ueff = pParam->BSIM3V1u0temp / Denomi; + here->BSIM3v1ueff = ueff = pParam->BSIM3v1u0temp / Denomi; T9 = -ueff / Denomi; dueff_dVg = T9 * dDenomi_dVg; dueff_dVd = T9 * dDenomi_dVd; dueff_dVb = T9 * dDenomi_dVb; /* Saturation Drain Voltage Vdsat */ - WVCox = Weff * pParam->BSIM3V1vsattemp * model->BSIM3V1cox; + WVCox = Weff * pParam->BSIM3v1vsattemp * model->BSIM3v1cox; WVCoxRds = WVCox * Rds; - Esat = 2.0 * pParam->BSIM3V1vsattemp / ueff; + Esat = 2.0 * pParam->BSIM3v1vsattemp / ueff; EsatL = Esat * Leff; T0 = -EsatL /ueff; dEsatL_dVg = T0 * dueff_dVg; @@ -743,25 +755,25 @@ for (; model != NULL; model = model->BSIM3V1nextModel) dEsatL_dVb = T0 * dueff_dVb; /* Sqrt() */ - a1 = pParam->BSIM3V1a1; + a1 = pParam->BSIM3v1a1; if (a1 == 0.0) - { Lambda = pParam->BSIM3V1a2; + { Lambda = pParam->BSIM3v1a2; dLambda_dVg = 0.0; } else if (a1 > 0.0) /* Added to avoid the discontinuity problem caused by a1 and a2 (Lambda) */ - { T0 = 1.0 - pParam->BSIM3V1a2; - T1 = T0 - pParam->BSIM3V1a1 * Vgsteff - 0.0001; + { T0 = 1.0 - pParam->BSIM3v1a2; + T1 = T0 - pParam->BSIM3v1a1 * Vgsteff - 0.0001; T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->BSIM3V1a2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM3V1a1 * (1.0 + T1 / T2); + Lambda = pParam->BSIM3v1a2 + T0 - 0.5 * (T1 + T2); + dLambda_dVg = 0.5 * pParam->BSIM3v1a1 * (1.0 + T1 / T2); } else - { T1 = pParam->BSIM3V1a2 + pParam->BSIM3V1a1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM3V1a2); + { T1 = pParam->BSIM3v1a2 + pParam->BSIM3v1a1 * Vgsteff - 0.0001; + T2 = sqrt(T1 * T1 + 0.0004 * pParam->BSIM3v1a2); Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->BSIM3V1a1 * (1.0 + T1 / T2); + dLambda_dVg = 0.5 * pParam->BSIM3v1a1 * (1.0 + T1 / T2); } Vgst2Vtm = Vgsteff + 2.0 * Vtm; @@ -833,17 +845,17 @@ for (; model != NULL; model = model->BSIM3V1nextModel) - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; } - here->BSIM3V1vdsat = Vdsat; + here->BSIM3v1vdsat = Vdsat; /* Effective Vds (Vdseff) Calculation */ - T1 = Vdsat - Vds - pParam->BSIM3V1delta; + T1 = Vdsat - Vds - pParam->BSIM3v1delta; dT1_dVg = dVdsat_dVg; dT1_dVd = dVdsat_dVd - 1.0; dT1_dVb = dVdsat_dVb; - T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM3V1delta * Vdsat); + T2 = sqrt(T1 * T1 + 4.0 * pParam->BSIM3v1delta * Vdsat); T0 = T1 / T2; - T3 = 2.0 * pParam->BSIM3V1delta / T2; + T3 = 2.0 * pParam->BSIM3v1delta / T2; dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; @@ -884,8 +896,8 @@ for (; model != NULL; model = model->BSIM3V1nextModel) Vds is very close to Vdseff. */ diffVds = Vds - Vdseff; /* Calculate VACLM */ - if ((pParam->BSIM3V1pclm > 0.0) && (diffVds > 1.0e-10)) - { T0 = 1.0 / (pParam->BSIM3V1pclm * Abulk * pParam->BSIM3V1litl); + if ((pParam->BSIM3v1pclm > 0.0) && (diffVds > 1.0e-10)) + { T0 = 1.0 / (pParam->BSIM3v1pclm * Abulk * pParam->BSIM3v1litl); dT0_dVb = -T0 / Abulk * dAbulk_dVb; dT0_dVg = -T0 / Abulk * dAbulk_dVg; @@ -909,7 +921,7 @@ for (; model != NULL; model = model->BSIM3V1nextModel) } /* Calculate VADIBL */ - if (pParam->BSIM3V1thetaRout > 0.0) + if (pParam->BSIM3v1thetaRout > 0.0) { T8 = Abulk * Vdsat; T0 = Vgst2Vtm * T8; dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 @@ -923,18 +935,18 @@ for (; model != NULL; model = model->BSIM3V1nextModel) dT1_dVd = Abulk * dVdsat_dVd; T9 = T1 * T1; - T2 = pParam->BSIM3V1thetaRout; + T2 = pParam->BSIM3v1thetaRout; VADIBL = (Vgst2Vtm - T0 / T1) / T2; dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - T7 = pParam->BSIM3V1pdiblb * Vbseff; + T7 = pParam->BSIM3v1pdiblb * Vbseff; if (T7 >= -0.9) { T3 = 1.0 / (1.0 + T7); VADIBL *= T3; dVADIBL_dVg *= T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->BSIM3V1pdiblb) + dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->BSIM3v1pdiblb) * T3; dVADIBL_dVd *= T3; } @@ -944,7 +956,7 @@ for (; model != NULL; model = model->BSIM3V1nextModel) T3 = (17.0 + 20.0 * T7) * T4; dVADIBL_dVg *= T3; dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->BSIM3V1pdiblb * T4 * T4; + - VADIBL * pParam->BSIM3v1pdiblb * T4 * T4; dVADIBL_dVd *= T3; VADIBL *= T3; } @@ -956,7 +968,7 @@ for (; model != NULL; model = model->BSIM3V1nextModel) /* Calculate VA */ - T8 = pParam->BSIM3V1pvag / EsatL; + T8 = pParam->BSIM3v1pvag / EsatL; T9 = T8 * Vgsteff; if (T9 > -0.9) { T0 = 1.0 + T9; @@ -991,18 +1003,18 @@ for (; model != NULL; model = model->BSIM3V1nextModel) dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; /* Calculate VASCBE */ - if (pParam->BSIM3V1pscbe2 > 0.0) - { if (diffVds > pParam->BSIM3V1pscbe1 * pParam->BSIM3V1litl + if (pParam->BSIM3v1pscbe2 > 0.0) + { if (diffVds > pParam->BSIM3v1pscbe1 * pParam->BSIM3v1litl / EXP_THRESHOLD) - { T0 = pParam->BSIM3V1pscbe1 * pParam->BSIM3V1litl / diffVds; - VASCBE = Leff * exp(T0) / pParam->BSIM3V1pscbe2; + { T0 = pParam->BSIM3v1pscbe1 * pParam->BSIM3v1litl / diffVds; + VASCBE = Leff * exp(T0) / pParam->BSIM3v1pscbe2; T1 = T0 * VASCBE / diffVds; dVASCBE_dVg = T1 * dVdseff_dVg; dVASCBE_dVd = -T1 * (1.0 - dVdseff_dVd); dVASCBE_dVb = T1 * dVdseff_dVb; } else - { VASCBE = MAX_EXP * Leff/pParam->BSIM3V1pscbe2; + { VASCBE = MAX_EXP * Leff/pParam->BSIM3v1pscbe2; dVASCBE_dVg = dVASCBE_dVd = dVASCBE_dVb = 0.0; } } @@ -1012,7 +1024,7 @@ for (; model != NULL; model = model->BSIM3V1nextModel) } /* Calculate Ids */ - CoxWovL = model->BSIM3V1cox * Weff / Leff; + CoxWovL = model->BSIM3v1cox * Weff / Leff; beta = ueff * CoxWovL; dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff; dbeta_dVd = CoxWovL * dueff_dVd; @@ -1079,13 +1091,13 @@ for (; model != NULL; model = model->BSIM3V1nextModel) Gmb *= dVbseff_dVb; /* calculate substrate current Isub */ - if ((pParam->BSIM3V1alpha0 <= 0.0) || (pParam->BSIM3V1beta0 <= 0.0)) + if ((pParam->BSIM3v1alpha0 <= 0.0) || (pParam->BSIM3v1beta0 <= 0.0)) { Isub = Gbd = Gbb = Gbg = 0.0; } else - { T2 = pParam->BSIM3V1alpha0 / Leff; - if (diffVds > pParam->BSIM3V1beta0 / EXP_THRESHOLD) - { T0 = -pParam->BSIM3V1beta0 / diffVds; + { T2 = pParam->BSIM3v1alpha0 / Leff; + if (diffVds > pParam->BSIM3v1beta0 / EXP_THRESHOLD) + { T0 = -pParam->BSIM3v1beta0 / diffVds; T1 = T2 * diffVds * exp(T0); T3 = T1 / diffVds * (T0 - 1.0); dT1_dVg = T3 * dVdseff_dVg; @@ -1110,149 +1122,129 @@ for (; model != NULL; model = model->BSIM3V1nextModel) Gbb *= dVbseff_dVb; /* bug fixing */ } - if (Gmb < -1e-12 || Gds < 0 || Gm < -1e-12) printf("@ vds=%g vgs=%g vbs=%g Id=%g\n",Vds, Vgs, Vbs, Ids); - if (Gds < 0) - { - printf("WARNING: negative Gds = %g for %s %s\n",Gds, - model->BSIM3V1type == 1 ? "nfet" : "pfet", here->BSIM3V1name); - /* Gds = 1e-15;*/ - } - if (Gm < -1e-12) - { - printf("WARNING: negative Gm = %g for %s %s\n",Gm, - model->BSIM3V1type == 1 ? "nfet" : "pfet", here->BSIM3V1name); - /* Gm = 1e-15; */ - } - if (Gmb < -1e-12) - { - printf("WARNING: negative Gmb = %g for %s %s\n",Gmb, - model->BSIM3V1type == 1 ? "nfet" : "pfet", here->BSIM3V1name); - /* Gmb = 0; */ - } - cdrain = Ids; - here->BSIM3V1gds = Gds; - here->BSIM3V1gm = Gm; - here->BSIM3V1gmbs = Gmb; + here->BSIM3v1gds = Gds; + here->BSIM3v1gm = Gm; + here->BSIM3v1gmbs = Gmb; - here->BSIM3V1gbbs = Gbb; - here->BSIM3V1gbgs = Gbg; - here->BSIM3V1gbds = Gbd; + here->BSIM3v1gbbs = Gbb; + here->BSIM3v1gbgs = Gbg; + here->BSIM3v1gbds = Gbd; - here->BSIM3V1csub = Isub - (Gbb * Vbseff + Gbd * Vds + Gbg * Vgs); + here->BSIM3v1csub = Isub - (Gbb * Vbseff + Gbd * Vds + Gbg * Vgs); /* Calculate Qinv for Noise analysis */ T1 = Vgsteff * (1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm); - here->BSIM3V1qinv = -model->BSIM3V1cox * Weff * Leff * T1; + here->BSIM3v1qinv = -model->BSIM3v1cox * Weff * Leff * T1; - if ((model->BSIM3V1xpart < 0) || (!ChargeComputationNeeded)) + if ((model->BSIM3v1xpart < 0) || (!ChargeComputationNeeded)) { qgate = qdrn = qsrc = qbulk = 0.0; - here->BSIM3V1cggb = here->BSIM3V1cgsb = here->BSIM3V1cgdb = 0.0; - here->BSIM3V1cdgb = here->BSIM3V1cdsb = here->BSIM3V1cddb = 0.0; - here->BSIM3V1cbgb = here->BSIM3V1cbsb = here->BSIM3V1cbdb = 0.0; - here->BSIM3V1cqdb = here->BSIM3V1cqsb = here->BSIM3V1cqgb - = here->BSIM3V1cqbb = 0.0; - here->BSIM3V1gtau = 0.0; + here->BSIM3v1cggb = here->BSIM3v1cgsb = here->BSIM3v1cgdb = 0.0; + here->BSIM3v1cdgb = here->BSIM3v1cdsb = here->BSIM3v1cddb = 0.0; + here->BSIM3v1cbgb = here->BSIM3v1cbsb = here->BSIM3v1cbdb = 0.0; + here->BSIM3v1cqdb = here->BSIM3v1cqsb = here->BSIM3v1cqgb + = here->BSIM3v1cqbb = 0.0; + here->BSIM3v1gtau = 0.0; goto finished; } - else if (model->BSIM3V1capMod == 0) + else if (model->BSIM3v1capMod == 0) { if (Vbseff < 0.0) { Vbseff = Vbs; dVbseff_dVb = 1.0; } else - { Vbseff = pParam->BSIM3V1phi - Phis; + { Vbseff = pParam->BSIM3v1phi - Phis; dVbseff_dVb = -dPhis_dVb; } - Vfb = pParam->BSIM3V1vfbcv; - Vth = Vfb + pParam->BSIM3V1phi + pParam->BSIM3V1k1 * sqrtPhis; + Vfb = pParam->BSIM3v1vfbcv; + Vth = Vfb + pParam->BSIM3v1phi + pParam->BSIM3v1k1 * sqrtPhis; Vgst = Vgs_eff - Vth; - dVth_dVb = pParam->BSIM3V1k1 * dsqrtPhis_dVb; + dVth_dVb = pParam->BSIM3v1k1 * dsqrtPhis_dVb; dVgst_dVb = -dVth_dVb; dVgst_dVg = dVgs_eff_dVg; - CoxWL = model->BSIM3V1cox * pParam->BSIM3V1weffCV - * pParam->BSIM3V1leffCV; + CoxWL = model->BSIM3v1cox * pParam->BSIM3v1weffCV + * pParam->BSIM3v1leffCV; Arg1 = Vgs_eff - Vbseff - Vfb; if (Arg1 <= 0.0) { qgate = CoxWL * Arg1; qbulk = -qgate; qdrn = 0.0; - here->BSIM3V1cggb = CoxWL * dVgs_eff_dVg; - here->BSIM3V1cgdb = 0.0; - here->BSIM3V1cgsb = CoxWL * (dVbseff_dVb + here->BSIM3v1cggb = CoxWL * dVgs_eff_dVg; + here->BSIM3v1cgdb = 0.0; + here->BSIM3v1cgsb = CoxWL * (dVbseff_dVb - dVgs_eff_dVg); - here->BSIM3V1cdgb = 0.0; - here->BSIM3V1cddb = 0.0; - here->BSIM3V1cdsb = 0.0; + here->BSIM3v1cdgb = 0.0; + here->BSIM3v1cddb = 0.0; + here->BSIM3v1cdsb = 0.0; - here->BSIM3V1cbgb = -CoxWL * dVgs_eff_dVg; - here->BSIM3V1cbdb = 0.0; - here->BSIM3V1cbsb = -here->BSIM3V1cgsb; + here->BSIM3v1cbgb = -CoxWL * dVgs_eff_dVg; + here->BSIM3v1cbdb = 0.0; + here->BSIM3v1cbsb = -here->BSIM3v1cgsb; } else if (Vgst <= 0.0) - { T1 = 0.5 * pParam->BSIM3V1k1; + { T1 = 0.5 * pParam->BSIM3v1k1; T2 = sqrt(T1 * T1 + Arg1); - qgate = CoxWL * pParam->BSIM3V1k1 * (T2 - T1); + qgate = CoxWL * pParam->BSIM3v1k1 * (T2 - T1); qbulk = -qgate; qdrn = 0.0; T0 = CoxWL * T1 / T2; - here->BSIM3V1cggb = T0 * dVgs_eff_dVg; - here->BSIM3V1cgdb = 0.0; - here->BSIM3V1cgsb = T0 * (dVbseff_dVb + here->BSIM3v1cggb = T0 * dVgs_eff_dVg; + here->BSIM3v1cgdb = 0.0; + here->BSIM3v1cgsb = T0 * (dVbseff_dVb - dVgs_eff_dVg); - here->BSIM3V1cdgb = 0.0; - here->BSIM3V1cddb = 0.0; - here->BSIM3V1cdsb = 0.0; + here->BSIM3v1cdgb = 0.0; + here->BSIM3v1cddb = 0.0; + here->BSIM3v1cdsb = 0.0; - here->BSIM3V1cbgb = -here->BSIM3V1cggb; - here->BSIM3V1cbdb = 0.0; - here->BSIM3V1cbsb = -here->BSIM3V1cgsb; + here->BSIM3v1cbgb = -here->BSIM3v1cggb; + here->BSIM3v1cbdb = 0.0; + here->BSIM3v1cbsb = -here->BSIM3v1cgsb; } else { One_Third_CoxWL = CoxWL / 3.0; Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - AbulkCV = Abulk0 * pParam->BSIM3V1abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3V1abulkCVfactor * dAbulk0_dVb; + AbulkCV = Abulk0 * pParam->BSIM3v1abulkCVfactor; + dAbulkCV_dVb = pParam->BSIM3v1abulkCVfactor * dAbulk0_dVb; Vdsat = Vgst / AbulkCV; dVdsat_dVg = dVgs_eff_dVg / AbulkCV; dVdsat_dVb = - (Vdsat * dAbulkCV_dVb + dVth_dVb)/ AbulkCV; - if (model->BSIM3V1xpart > 0.5) + if (model->BSIM3v1xpart > 0.5) { /* 0/100 Charge petition model */ if (Vdsat <= Vds) { /* saturation region */ T1 = Vdsat / 3.0; qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3V1phi - T1); + - pParam->BSIM3v1phi - T1); T2 = -Two_Third_CoxWL * Vgst; qbulk = -(qgate + T2); qdrn = 0.0; - here->BSIM3V1cggb = One_Third_CoxWL * (3.0 + here->BSIM3v1cggb = One_Third_CoxWL * (3.0 - dVdsat_dVg) * dVgs_eff_dVg; T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3V1cgsb = -(here->BSIM3V1cggb + T2); - here->BSIM3V1cgdb = 0.0; + here->BSIM3v1cgsb = -(here->BSIM3v1cggb + T2); + here->BSIM3v1cgdb = 0.0; - here->BSIM3V1cdgb = 0.0; - here->BSIM3V1cddb = 0.0; - here->BSIM3V1cdsb = 0.0; + here->BSIM3v1cdgb = 0.0; + here->BSIM3v1cddb = 0.0; + here->BSIM3v1cdsb = 0.0; - here->BSIM3V1cbgb = -(here->BSIM3V1cggb + here->BSIM3v1cbgb = -(here->BSIM3v1cggb - Two_Third_CoxWL * dVgs_eff_dVg); T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3V1cbsb = -(here->BSIM3V1cbgb + T3); - here->BSIM3V1cbdb = 0.0; + here->BSIM3v1cbsb = -(here->BSIM3v1cbgb + T3); + here->BSIM3v1cbdb = 0.0; } else { /* linear region */ @@ -1265,30 +1257,30 @@ for (; model != NULL; model = model->BSIM3V1nextModel) T7 = 2.0 * Vds - T1 - 3.0 * T3; T8 = T3 - T1 - 2.0 * Vds; qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3V1phi - 0.5 * (Vds - T3)); + - pParam->BSIM3v1phi - 0.5 * (Vds - T3)); T10 = T4 * T8; qdrn = T4 * T7; qbulk = -(qgate + qdrn + T10); T5 = T3 / T1; - here->BSIM3V1cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) + here->BSIM3v1cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) * dVgs_eff_dVg; T11 = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3V1cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3V1cgsb = -(here->BSIM3V1cggb + T11 - + here->BSIM3V1cgdb); + here->BSIM3v1cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); + here->BSIM3v1cgsb = -(here->BSIM3v1cggb + T11 + + here->BSIM3v1cgdb); T6 = 1.0 / Vdsat; dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); dAlphaz_dVb = -T6 * (dVth_dVb + Alphaz * dVdsat_dVb); T7 = T9 * T7; T8 = T9 * T8; T9 = 2.0 * T4 * (1.0 - 3.0 * T5); - here->BSIM3V1cdgb = (T7 * dAlphaz_dVg - T9 + here->BSIM3v1cdgb = (T7 * dAlphaz_dVg - T9 * dVdsat_dVg) * dVgs_eff_dVg; T12 = T7 * dAlphaz_dVb - T9 * dVdsat_dVb; - here->BSIM3V1cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); - here->BSIM3V1cdsb = -(here->BSIM3V1cdgb + T12 - + here->BSIM3V1cddb); + here->BSIM3v1cddb = T4 * (3.0 - 6.0 * T2 - 3.0 * T5); + here->BSIM3v1cdsb = -(here->BSIM3v1cdgb + T12 + + here->BSIM3v1cddb); T9 = 2.0 * T4 * (1.0 + T5); T10 = (T8 * dAlphaz_dVg - T9 * dVdsat_dVg) @@ -1297,42 +1289,42 @@ for (; model != NULL; model = model->BSIM3V1nextModel) T12 = T4 * (2.0 * T2 + T5 - 1.0); T0 = -(T10 + T11 + T12); - here->BSIM3V1cbgb = -(here->BSIM3V1cggb - + here->BSIM3V1cdgb + T10); - here->BSIM3V1cbdb = -(here->BSIM3V1cgdb - + here->BSIM3V1cddb + T12); - here->BSIM3V1cbsb = -(here->BSIM3V1cgsb - + here->BSIM3V1cdsb + T0); + here->BSIM3v1cbgb = -(here->BSIM3v1cggb + + here->BSIM3v1cdgb + T10); + here->BSIM3v1cbdb = -(here->BSIM3v1cgdb + + here->BSIM3v1cddb + T12); + here->BSIM3v1cbsb = -(here->BSIM3v1cgsb + + here->BSIM3v1cdsb + T0); } } - else if (model->BSIM3V1xpart < 0.5) + else if (model->BSIM3v1xpart < 0.5) { /* 40/60 Charge petition model */ if (Vds >= Vdsat) { /* saturation region */ T1 = Vdsat / 3.0; qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3V1phi - T1); + - pParam->BSIM3v1phi - T1); T2 = -Two_Third_CoxWL * Vgst; qbulk = -(qgate + T2); qdrn = 0.4 * T2; - here->BSIM3V1cggb = One_Third_CoxWL * (3.0 + here->BSIM3v1cggb = One_Third_CoxWL * (3.0 - dVdsat_dVg) * dVgs_eff_dVg; T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3V1cgsb = -(here->BSIM3V1cggb + T2); - here->BSIM3V1cgdb = 0.0; + here->BSIM3v1cgsb = -(here->BSIM3v1cggb + T2); + here->BSIM3v1cgdb = 0.0; T3 = 0.4 * Two_Third_CoxWL; - here->BSIM3V1cdgb = -T3 * dVgs_eff_dVg; - here->BSIM3V1cddb = 0.0; + here->BSIM3v1cdgb = -T3 * dVgs_eff_dVg; + here->BSIM3v1cddb = 0.0; T4 = T3 * dVth_dVb; - here->BSIM3V1cdsb = -(T4 + here->BSIM3V1cdgb); + here->BSIM3v1cdsb = -(T4 + here->BSIM3v1cdgb); - here->BSIM3V1cbgb = -(here->BSIM3V1cggb + here->BSIM3v1cbgb = -(here->BSIM3v1cggb - Two_Third_CoxWL * dVgs_eff_dVg); T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3V1cbsb = -(here->BSIM3V1cbgb + T3); - here->BSIM3V1cbdb = 0.0; + here->BSIM3v1cbsb = -(here->BSIM3v1cbgb + T3); + here->BSIM3v1cbdb = 0.0; } else { /* linear region */ @@ -1342,16 +1334,16 @@ for (; model != NULL; model = model->BSIM3V1nextModel) T3 = T2 * Vds; T9 = 0.25 * CoxWL; T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3V1phi + qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3v1phi - 0.5 * (Vds - T3)); T5 = T3 / T1; - here->BSIM3V1cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) + here->BSIM3v1cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) * dVgs_eff_dVg; tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3V1cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3V1cgsb = -(here->BSIM3V1cggb - + here->BSIM3V1cgdb + tmp); + here->BSIM3v1cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); + here->BSIM3v1cgsb = -(here->BSIM3v1cggb + + here->BSIM3v1cgdb + tmp); T6 = 1.0 / Vdsat; dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); @@ -1367,32 +1359,32 @@ for (; model != NULL; model = model->BSIM3V1nextModel) tmp1 = T4 * (2.0 - 4.0 * tmp * T6 + T8 * (16.0 * Vdsat - 6.0 * Vds)); - here->BSIM3V1cdgb = (T7 * dAlphaz_dVg - tmp1 + here->BSIM3v1cdgb = (T7 * dAlphaz_dVg - tmp1 * dVdsat_dVg) * dVgs_eff_dVg; T10 = T7 * dAlphaz_dVb - tmp1 * dVdsat_dVb; - here->BSIM3V1cddb = T4 * (2.0 - (1.0 / (3.0 * T1 + here->BSIM3v1cddb = T4 * (2.0 - (1.0 / (3.0 * T1 * T1) + 2.0 * tmp) * T6 + T8 * (6.0 * Vdsat - 2.4 * Vds)); - here->BSIM3V1cdsb = -(here->BSIM3V1cdgb - + T10 + here->BSIM3V1cddb); + here->BSIM3v1cdsb = -(here->BSIM3v1cdgb + + T10 + here->BSIM3v1cddb); T7 = 2.0 * (T1 + T3); qbulk = -(qgate - T4 * T7); T7 *= T9; T0 = 4.0 * T4 * (1.0 - T5); - T12 = (-T7 * dAlphaz_dVg - here->BSIM3V1cdgb + T12 = (-T7 * dAlphaz_dVg - here->BSIM3v1cdgb - T0 * dVdsat_dVg) * dVgs_eff_dVg; T11 = -T7 * dAlphaz_dVb - T10 - T0 * dVdsat_dVb; T10 = -4.0 * T4 * (T2 - 0.5 + 0.5 * T5) - - here->BSIM3V1cddb; + - here->BSIM3v1cddb; tmp = -(T10 + T11 + T12); - here->BSIM3V1cbgb = -(here->BSIM3V1cggb - + here->BSIM3V1cdgb + T12); - here->BSIM3V1cbdb = -(here->BSIM3V1cgdb - + here->BSIM3V1cddb + T11); - here->BSIM3V1cbsb = -(here->BSIM3V1cgsb - + here->BSIM3V1cdsb + tmp); + here->BSIM3v1cbgb = -(here->BSIM3v1cggb + + here->BSIM3v1cdgb + T12); + here->BSIM3v1cbdb = -(here->BSIM3v1cgdb + + here->BSIM3v1cddb + T11); + here->BSIM3v1cbsb = -(here->BSIM3v1cgsb + + here->BSIM3v1cdsb + tmp); } } else @@ -1401,27 +1393,27 @@ for (; model != NULL; model = model->BSIM3V1nextModel) { /* saturation region */ T1 = Vdsat / 3.0; qgate = CoxWL * (Vgs_eff - Vfb - - pParam->BSIM3V1phi - T1); + - pParam->BSIM3v1phi - T1); T2 = -Two_Third_CoxWL * Vgst; qbulk = -(qgate + T2); qdrn = 0.5 * T2; - here->BSIM3V1cggb = One_Third_CoxWL * (3.0 + here->BSIM3v1cggb = One_Third_CoxWL * (3.0 - dVdsat_dVg) * dVgs_eff_dVg; T2 = -One_Third_CoxWL * dVdsat_dVb; - here->BSIM3V1cgsb = -(here->BSIM3V1cggb + T2); - here->BSIM3V1cgdb = 0.0; + here->BSIM3v1cgsb = -(here->BSIM3v1cggb + T2); + here->BSIM3v1cgdb = 0.0; - here->BSIM3V1cdgb = -One_Third_CoxWL * dVgs_eff_dVg; - here->BSIM3V1cddb = 0.0; + here->BSIM3v1cdgb = -One_Third_CoxWL * dVgs_eff_dVg; + here->BSIM3v1cddb = 0.0; T4 = One_Third_CoxWL * dVth_dVb; - here->BSIM3V1cdsb = -(T4 + here->BSIM3V1cdgb); + here->BSIM3v1cdsb = -(T4 + here->BSIM3v1cdgb); - here->BSIM3V1cbgb = -(here->BSIM3V1cggb + here->BSIM3v1cbgb = -(here->BSIM3v1cggb - Two_Third_CoxWL * dVgs_eff_dVg); T3 = -(T2 + Two_Third_CoxWL * dVth_dVb); - here->BSIM3V1cbsb = -(here->BSIM3V1cbgb + T3); - here->BSIM3V1cbdb = 0.0; + here->BSIM3v1cbsb = -(here->BSIM3v1cbgb + T3); + here->BSIM3v1cbdb = 0.0; } else { /* linear region */ @@ -1431,16 +1423,16 @@ for (; model != NULL; model = model->BSIM3V1nextModel) T3 = T2 * Vds; T9 = 0.25 * CoxWL; T4 = T9 * Alphaz; - qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3V1phi + qgate = CoxWL * (Vgs_eff - Vfb - pParam->BSIM3v1phi - 0.5 * (Vds - T3)); T5 = T3 / T1; - here->BSIM3V1cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) + here->BSIM3v1cggb = CoxWL * (1.0 - T5 * dVdsat_dVg) * dVgs_eff_dVg; tmp = -CoxWL * T5 * dVdsat_dVb; - here->BSIM3V1cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); - here->BSIM3V1cgsb = -(here->BSIM3V1cggb - + here->BSIM3V1cgdb + tmp); + here->BSIM3v1cgdb = CoxWL * (T2 - 0.5 + 0.5 * T5); + here->BSIM3v1cgsb = -(here->BSIM3v1cggb + + here->BSIM3v1cgdb + tmp); T6 = 1.0 / Vdsat; dAlphaz_dVg = T6 * (1.0 - Alphaz * dVdsat_dVg); @@ -1452,19 +1444,19 @@ for (; model != NULL; model = model->BSIM3V1nextModel) T7 *= T9; T0 = T4 * (2.0 * T5 - 2.0); - here->BSIM3V1cdgb = (T0 * dVdsat_dVg - T7 + here->BSIM3v1cdgb = (T0 * dVdsat_dVg - T7 * dAlphaz_dVg) * dVgs_eff_dVg; T12 = T0 * dVdsat_dVb - T7 * dAlphaz_dVb; - here->BSIM3V1cddb = T4 * (1.0 - 2.0 * T2 - T5); - here->BSIM3V1cdsb = -(here->BSIM3V1cdgb + T12 - + here->BSIM3V1cddb); - - here->BSIM3V1cbgb = -(here->BSIM3V1cggb - + 2.0 * here->BSIM3V1cdgb); - here->BSIM3V1cbdb = -(here->BSIM3V1cgdb - + 2.0 * here->BSIM3V1cddb); - here->BSIM3V1cbsb = -(here->BSIM3V1cgsb - + 2.0 * here->BSIM3V1cdsb); + here->BSIM3v1cddb = T4 * (1.0 - 2.0 * T2 - T5); + here->BSIM3v1cdsb = -(here->BSIM3v1cdgb + T12 + + here->BSIM3v1cddb); + + here->BSIM3v1cbgb = -(here->BSIM3v1cggb + + 2.0 * here->BSIM3v1cdgb); + here->BSIM3v1cbdb = -(here->BSIM3v1cgdb + + 2.0 * here->BSIM3v1cddb); + here->BSIM3v1cbsb = -(here->BSIM3v1cgsb + + 2.0 * here->BSIM3v1cdsb); } } } @@ -1476,15 +1468,15 @@ for (; model != NULL; model = model->BSIM3V1nextModel) dVbseffCV_dVb = 1.0; } else - { VbseffCV = pParam->BSIM3V1phi - Phis; + { VbseffCV = pParam->BSIM3v1phi - Phis; dVbseffCV_dVb = -dPhis_dVb; } - CoxWL = model->BSIM3V1cox * pParam->BSIM3V1weffCV - * pParam->BSIM3V1leffCV; - Vfb = Vth - pParam->BSIM3V1phi - pParam->BSIM3V1k1 * sqrtPhis; + CoxWL = model->BSIM3v1cox * pParam->BSIM3v1weffCV + * pParam->BSIM3v1leffCV; + Vfb = Vth - pParam->BSIM3v1phi - pParam->BSIM3v1k1 * sqrtPhis; - dVfb_dVb = dVth_dVb - pParam->BSIM3V1k1 * dsqrtPhis_dVb; + dVfb_dVb = dVth_dVb - pParam->BSIM3v1k1 * dsqrtPhis_dVb; dVfb_dVd = dVth_dVd; if ((VgstNVt > -EXP_THRESHOLD) && (VgstNVt < EXP_THRESHOLD)) @@ -1498,7 +1490,7 @@ for (; model != NULL; model = model->BSIM3V1nextModel) dVgsteff_dVg *= dVgs_eff_dVg; } - if (model->BSIM3V1capMod == 1) + if (model->BSIM3v1capMod == 1) { Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff; if (Arg1 <= 0.0) @@ -1508,11 +1500,11 @@ for (; model != NULL; model = model->BSIM3V1nextModel) Cgb = -CoxWL * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); } else - { T0 = 0.5 * pParam->BSIM3V1k1; + { T0 = 0.5 * pParam->BSIM3v1k1; T1 = sqrt(T0 * T0 + Arg1); T2 = CoxWL * T0 / T1; - qgate = CoxWL * pParam->BSIM3V1k1 * (T1 - T0); + qgate = CoxWL * pParam->BSIM3v1k1 * (T1 - T0); Cgg = T2 * (dVgs_eff_dVg - dVgsteff_dVg); Cgd = -T2 * (dVfb_dVd + dVgsteff_dVd); @@ -1525,8 +1517,8 @@ for (; model != NULL; model = model->BSIM3V1nextModel) One_Third_CoxWL = CoxWL / 3.0; Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - AbulkCV = Abulk0 * pParam->BSIM3V1abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3V1abulkCVfactor * dAbulk0_dVb; + AbulkCV = Abulk0 * pParam->BSIM3v1abulkCVfactor; + dAbulkCV_dVb = pParam->BSIM3v1abulkCVfactor * dAbulk0_dVb; VdsatCV = Vgsteff / AbulkCV; if (VdsatCV < Vds) { dVdsatCV_dVg = 1.0 / AbulkCV; @@ -1555,9 +1547,9 @@ for (; model != NULL; model = model->BSIM3V1nextModel) Cbb += Cbb1; Cbd += Cbd1; - if (model->BSIM3V1xpart > 0.5) + if (model->BSIM3v1xpart > 0.5) T0 = -Two_Third_CoxWL; - else if (model->BSIM3V1xpart < 0.5) + else if (model->BSIM3v1xpart < 0.5) T0 = -0.4 * CoxWL; else T0 = -One_Third_CoxWL; @@ -1600,7 +1592,7 @@ for (; model != NULL; model = model->BSIM3V1nextModel) Cbb += Cbb1; Cbd += Cbd1; - if (model->BSIM3V1xpart > 0.5) + if (model->BSIM3v1xpart > 0.5) { /* 0/100 Charge petition model */ T1 = T1 + T1; qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 @@ -1615,7 +1607,7 @@ for (; model != NULL; model = model->BSIM3V1nextModel) + Csg * dVgsteff_dVd; Csg *= dVgsteff_dVg; } - else if (model->BSIM3V1xpart < 0.5) + else if (model->BSIM3v1xpart < 0.5) { /* 40/60 Charge petition model */ T1 = T1 / 12.0; T2 = 0.5 * CoxWL / (T1 * T1); @@ -1646,18 +1638,18 @@ for (; model != NULL; model = model->BSIM3V1nextModel) Csb *= dVbseff_dVb; } qdrn = -(qgate + qbulk + qsrc); - here->BSIM3V1cggb = Cgg; - here->BSIM3V1cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3V1cgdb = Cgd; - here->BSIM3V1cdgb = -(Cgg + Cbg + Csg); - here->BSIM3V1cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + here->BSIM3v1cggb = Cgg; + here->BSIM3v1cgsb = -(Cgg + Cgd + Cgb); + here->BSIM3v1cgdb = Cgd; + here->BSIM3v1cdgb = -(Cgg + Cbg + Csg); + here->BSIM3v1cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + Csg + Csd + Csb); - here->BSIM3V1cddb = -(Cgd + Cbd + Csd); - here->BSIM3V1cbgb = Cbg; - here->BSIM3V1cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3V1cbdb = Cbd; + here->BSIM3v1cddb = -(Cgd + Cbd + Csd); + here->BSIM3v1cbgb = Cbg; + here->BSIM3v1cbsb = -(Cbg + Cbd + Cbb); + here->BSIM3v1cbdb = Cbd; } - else if (model->BSIM3V1capMod == 2) + else if (model->BSIM3v1capMod == 2) { V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; if (Vfb <= 0.0) @@ -1680,14 +1672,14 @@ for (; model != NULL; model = model->BSIM3V1nextModel) dQac0_dVd = CoxWL * (dVfbeff_dVd - dVfb_dVd); dQac0_dVb = CoxWL * (dVfbeff_dVb - dVfb_dVb); - T0 = 0.5 * pParam->BSIM3V1k1; + T0 = 0.5 * pParam->BSIM3v1k1; T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; - if (pParam->BSIM3V1k1 == 0.0) + if (pParam->BSIM3v1k1 == 0.0) { T1 = 0.0; T2 = 0.0; } else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->BSIM3V1k1; + { T1 = T0 + T3 / pParam->BSIM3v1k1; T2 = CoxWL; } else @@ -1695,7 +1687,7 @@ for (; model != NULL; model = model->BSIM3V1nextModel) T2 = CoxWL * T0 / T1; } - Qsub0 = CoxWL * pParam->BSIM3V1k1 * (T1 - T0); + Qsub0 = CoxWL * pParam->BSIM3v1k1 * (T1 - T0); dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); dQsub0_dVd = -T2 * (dVfbeff_dVd + dVgsteff_dVd); @@ -1704,8 +1696,8 @@ for (; model != NULL; model = model->BSIM3V1nextModel) One_Third_CoxWL = CoxWL / 3.0; Two_Third_CoxWL = 2.0 * One_Third_CoxWL; - AbulkCV = Abulk0 * pParam->BSIM3V1abulkCVfactor; - dAbulkCV_dVb = pParam->BSIM3V1abulkCVfactor * dAbulk0_dVb; + AbulkCV = Abulk0 * pParam->BSIM3v1abulkCVfactor; + dAbulkCV_dVb = pParam->BSIM3v1abulkCVfactor * dAbulk0_dVb; VdsatCV = Vgsteff / AbulkCV; V4 = VdsatCV - Vds - DELTA_4; @@ -1745,7 +1737,7 @@ for (; model != NULL; model = model->BSIM3V1nextModel) + Cbg1 * dVgsteff_dVb; Cbg1 *= dVgsteff_dVg; - if (model->BSIM3V1xpart > 0.5) + if (model->BSIM3v1xpart > 0.5) { /* 0/100 Charge petition model */ T1 = T1 + T1; qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 @@ -1760,7 +1752,7 @@ for (; model != NULL; model = model->BSIM3V1nextModel) + Csg * dVgsteff_dVb; Csg *= dVgsteff_dVg; } - else if (model->BSIM3V1xpart < 0.5) + else if (model->BSIM3v1xpart < 0.5) { /* 40/60 Charge petition model */ T1 = T1 / 12.0; T2 = 0.5 * CoxWL / (T1 * T1); @@ -1805,63 +1797,63 @@ for (; model != NULL; model = model->BSIM3V1nextModel) Cbb *= dVbseff_dVb; Csb *= dVbseff_dVb; - here->BSIM3V1cggb = Cgg; - here->BSIM3V1cgsb = -(Cgg + Cgd + Cgb); - here->BSIM3V1cgdb = Cgd; - here->BSIM3V1cdgb = -(Cgg + Cbg + Csg); - here->BSIM3V1cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + here->BSIM3v1cggb = Cgg; + here->BSIM3v1cgsb = -(Cgg + Cgd + Cgb); + here->BSIM3v1cgdb = Cgd; + here->BSIM3v1cdgb = -(Cgg + Cbg + Csg); + here->BSIM3v1cdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + Csg + Csd + Csb); - here->BSIM3V1cddb = -(Cgd + Cbd + Csd); - here->BSIM3V1cbgb = Cbg; - here->BSIM3V1cbsb = -(Cbg + Cbd + Cbb); - here->BSIM3V1cbdb = Cbd; + here->BSIM3v1cddb = -(Cgd + Cbd + Csd); + here->BSIM3v1cbgb = Cbg; + here->BSIM3v1cbsb = -(Cbg + Cbd + Cbb); + here->BSIM3v1cbdb = Cbd; } /* Non-quasi-static Model */ - if (here->BSIM3V1nqsMod) + if (here->BSIM3v1nqsMod) { qcheq = -qbulk - qgate; qbulk = qgate = qdrn = qsrc = 0.0; - here->BSIM3V1cqgb = -(here->BSIM3V1cggb + here->BSIM3V1cbgb); - here->BSIM3V1cqdb = -(here->BSIM3V1cgdb + here->BSIM3V1cbdb); - here->BSIM3V1cqsb = -(here->BSIM3V1cgsb + here->BSIM3V1cbsb); - here->BSIM3V1cqbb = here->BSIM3V1cggb + here->BSIM3V1cgdb - + here->BSIM3V1cgsb + here->BSIM3V1cbgb - + here->BSIM3V1cbdb + here->BSIM3V1cbsb; + here->BSIM3v1cqgb = -(here->BSIM3v1cggb + here->BSIM3v1cbgb); + here->BSIM3v1cqdb = -(here->BSIM3v1cgdb + here->BSIM3v1cbdb); + here->BSIM3v1cqsb = -(here->BSIM3v1cgsb + here->BSIM3v1cbsb); + here->BSIM3v1cqbb = here->BSIM3v1cggb + here->BSIM3v1cgdb + + here->BSIM3v1cgsb + here->BSIM3v1cbgb + + here->BSIM3v1cbdb + here->BSIM3v1cbsb; - here->BSIM3V1cggb = here->BSIM3V1cgsb = here->BSIM3V1cgdb = 0.0; - here->BSIM3V1cdgb = here->BSIM3V1cdsb = here->BSIM3V1cddb = 0.0; - here->BSIM3V1cbgb = here->BSIM3V1cbsb = here->BSIM3V1cbdb = 0.0; + here->BSIM3v1cggb = here->BSIM3v1cgsb = here->BSIM3v1cgdb = 0.0; + here->BSIM3v1cdgb = here->BSIM3v1cdsb = here->BSIM3v1cddb = 0.0; + here->BSIM3v1cbgb = here->BSIM3v1cbsb = here->BSIM3v1cbdb = 0.0; - T0 = pParam->BSIM3V1leffCV * pParam->BSIM3V1leffCV; - here->BSIM3V1tconst = pParam->BSIM3V1u0temp * pParam->BSIM3V1elm + T0 = pParam->BSIM3v1leffCV * pParam->BSIM3v1leffCV; + here->BSIM3v1tconst = pParam->BSIM3v1u0temp * pParam->BSIM3v1elm / CoxWL / T0; if (qcheq == 0.0) - here->BSIM3V1tconst = 0.0; + here->BSIM3v1tconst = 0.0; else if (qcheq < 0.0) - here->BSIM3V1tconst = -here->BSIM3V1tconst; + here->BSIM3v1tconst = -here->BSIM3v1tconst; - gtau_drift = fabs(here->BSIM3V1tconst * qcheq); - gtau_diff = 16.0 * pParam->BSIM3V1u0temp * model->BSIM3V1vtm / T0; + gtau_drift = fabs(here->BSIM3v1tconst * qcheq); + gtau_diff = 16.0 * pParam->BSIM3v1u0temp * model->BSIM3v1vtm / T0; - here->BSIM3V1gtau = gtau_drift + gtau_diff; + here->BSIM3v1gtau = gtau_drift + gtau_diff; - *(ckt->CKTstate0 + here->BSIM3V1qcheq) = qcheq; + *(ckt->CKTstate0 + here->BSIM3v1qcheq) = qcheq; if (ckt->CKTmode & MODEINITTRAN) - *(ckt->CKTstate1 + here->BSIM3V1qcheq) = - *(ckt->CKTstate0 + here->BSIM3V1qcheq); + *(ckt->CKTstate1 + here->BSIM3v1qcheq) = + *(ckt->CKTstate0 + here->BSIM3v1qcheq); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3V1qcheq); + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3v1qcheq); if (error) return (error); } else - { here->BSIM3V1cqgb = here->BSIM3V1cqdb = here->BSIM3V1cqsb - = here->BSIM3V1cqbb = 0.0; - here->BSIM3V1gtau = 0.0; + { here->BSIM3v1cqgb = here->BSIM3v1cqdb = here->BSIM3v1cqsb + = here->BSIM3v1cqbb = 0.0; + here->BSIM3v1gtau = 0.0; } } @@ -1869,7 +1861,7 @@ finished: /* returning Values to Calling Routine */ /* * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE */ - here->BSIM3V1cd = here->BSIM3V1mode * cdrain - here->BSIM3V1cbd; + here->BSIM3v1cd = here->BSIM3v1mode * cdrain - here->BSIM3v1cbd; if (ChargeComputationNeeded) { /* charge storage elements * bulk-drain and bulk-source depletion capacitances @@ -1885,45 +1877,45 @@ finished: /* returning Values to Calling Routine */ along gate side */ - czbd = model->BSIM3V1unitAreaJctCap * here->BSIM3V1drainArea; - czbs = model->BSIM3V1unitAreaJctCap * here->BSIM3V1sourceArea; - if (here->BSIM3V1drainPerimeter < pParam->BSIM3V1weff) + czbd = model->BSIM3v1unitAreaJctCap * here->BSIM3v1drainArea; + czbs = model->BSIM3v1unitAreaJctCap * here->BSIM3v1sourceArea; + if (here->BSIM3v1drainPerimeter < pParam->BSIM3v1weff) { - czbdswg = model->BSIM3V1unitLengthGateSidewallJctCap - * here->BSIM3V1drainPerimeter; + czbdswg = model->BSIM3v1unitLengthGateSidewallJctCap + * here->BSIM3v1drainPerimeter; czbdsw = 0.0; } else { - czbdsw = model->BSIM3V1unitLengthSidewallJctCap - * (here->BSIM3V1drainPerimeter - pParam->BSIM3V1weff); - czbdswg = model->BSIM3V1unitLengthGateSidewallJctCap - * pParam->BSIM3V1weff; + czbdsw = model->BSIM3v1unitLengthSidewallJctCap + * (here->BSIM3v1drainPerimeter - pParam->BSIM3v1weff); + czbdswg = model->BSIM3v1unitLengthGateSidewallJctCap + * pParam->BSIM3v1weff; } - if (here->BSIM3V1sourcePerimeter < pParam->BSIM3V1weff) + if (here->BSIM3v1sourcePerimeter < pParam->BSIM3v1weff) { czbssw = 0.0; - czbsswg = model->BSIM3V1unitLengthGateSidewallJctCap - * here->BSIM3V1sourcePerimeter; + czbsswg = model->BSIM3v1unitLengthGateSidewallJctCap + * here->BSIM3v1sourcePerimeter; } else { - czbssw = model->BSIM3V1unitLengthSidewallJctCap - * (here->BSIM3V1sourcePerimeter - pParam->BSIM3V1weff); - czbsswg = model->BSIM3V1unitLengthGateSidewallJctCap - * pParam->BSIM3V1weff; + czbssw = model->BSIM3v1unitLengthSidewallJctCap + * (here->BSIM3v1sourcePerimeter - pParam->BSIM3v1weff); + czbsswg = model->BSIM3v1unitLengthGateSidewallJctCap + * pParam->BSIM3v1weff; } - PhiB = model->BSIM3V1bulkJctPotential; - PhiBSW = model->BSIM3V1sidewallJctPotential; - PhiBSWG = model->BSIM3V1GatesidewallJctPotential; - MJ = model->BSIM3V1bulkJctBotGradingCoeff; - MJSW = model->BSIM3V1bulkJctSideGradingCoeff; - MJSWG = model->BSIM3V1bulkJctGateSideGradingCoeff; + PhiB = model->BSIM3v1bulkJctPotential; + PhiBSW = model->BSIM3v1sidewallJctPotential; + PhiBSWG = model->BSIM3v1GatesidewallJctPotential; + MJ = model->BSIM3v1bulkJctBotGradingCoeff; + MJSW = model->BSIM3v1bulkJctSideGradingCoeff; + MJSWG = model->BSIM3v1bulkJctGateSideGradingCoeff; /* Source Bulk Junction */ if (vbs == 0.0) - { *(ckt->CKTstate0 + here->BSIM3V1qbs) = 0.0; - here->BSIM3V1capbs = czbs + czbssw + czbsswg; + { *(ckt->CKTstate0 + here->BSIM3v1qbs) = 0.0; + here->BSIM3v1capbs = czbs + czbssw + czbsswg; } else if (vbs < 0.0) { if (czbs > 0.0) @@ -1932,13 +1924,13 @@ finished: /* returning Values to Calling Routine */ sarg = 1.0 / sqrt(arg); else sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3V1qbs) = PhiB * czbs + *(ckt->CKTstate0 + here->BSIM3v1qbs) = PhiB * czbs * (1.0 - arg * sarg) / (1.0 - MJ); - here->BSIM3V1capbs = czbs * sarg; + here->BSIM3v1capbs = czbs * sarg; } else - { *(ckt->CKTstate0 + here->BSIM3V1qbs) = 0.0; - here->BSIM3V1capbs = 0.0; + { *(ckt->CKTstate0 + here->BSIM3v1qbs) = 0.0; + here->BSIM3v1capbs = 0.0; } if (czbssw > 0.0) { arg = 1.0 - vbs / PhiBSW; @@ -1946,9 +1938,9 @@ finished: /* returning Values to Calling Routine */ sarg = 1.0 / sqrt(arg); else sarg = exp(-MJSW * log(arg)); - *(ckt->CKTstate0 + here->BSIM3V1qbs) += PhiBSW * czbssw + *(ckt->CKTstate0 + here->BSIM3v1qbs) += PhiBSW * czbssw * (1.0 - arg * sarg) / (1.0 - MJSW); - here->BSIM3V1capbs += czbssw * sarg; + here->BSIM3v1capbs += czbssw * sarg; } if (czbsswg > 0.0) { arg = 1.0 - vbs / PhiBSWG; @@ -1956,24 +1948,25 @@ finished: /* returning Values to Calling Routine */ sarg = 1.0 / sqrt(arg); else sarg = exp(-MJSWG * log(arg)); - *(ckt->CKTstate0 + here->BSIM3V1qbs) += PhiBSWG * czbsswg + *(ckt->CKTstate0 + here->BSIM3v1qbs) += PhiBSWG * czbsswg * (1.0 - arg * sarg) / (1.0 - MJSWG); - here->BSIM3V1capbs += czbsswg * sarg; + here->BSIM3v1capbs += czbsswg * sarg; } } else - { *(ckt->CKTstate0+here->BSIM3V1qbs) = vbs * (czbs + czbssw + { *(ckt->CKTstate0+here->BSIM3v1qbs) = vbs * (czbs + czbssw + czbsswg) + vbs * vbs * (czbs * MJ * 0.5 / PhiB + czbssw * MJSW * 0.5 / PhiBSW + czbsswg * MJSWG * 0.5 / PhiBSWG); - here->BSIM3V1capbs = czbs + czbssw + czbsswg + vbs * (czbs * MJ /PhiB + czbssw * MJSW / PhiBSW + czbsswg * MJSWG / PhiBSWG); + here->BSIM3v1capbs = czbs + czbssw + czbsswg + vbs * (czbs * MJ / + PhiB + czbssw * MJSW / PhiBSW + czbsswg * MJSWG / PhiBSWG); } /* Drain Bulk Junction */ if (vbd == 0.0) - { *(ckt->CKTstate0 + here->BSIM3V1qbd) = 0.0; - here->BSIM3V1capbd = czbd + czbdsw + czbdswg; + { *(ckt->CKTstate0 + here->BSIM3v1qbd) = 0.0; + here->BSIM3v1capbd = czbd + czbdsw + czbdswg; } else if (vbd < 0.0) { if (czbd > 0.0) @@ -1982,13 +1975,13 @@ finished: /* returning Values to Calling Routine */ sarg = 1.0 / sqrt(arg); else sarg = exp(-MJ * log(arg)); - *(ckt->CKTstate0 + here->BSIM3V1qbd) = PhiB * czbd + *(ckt->CKTstate0 + here->BSIM3v1qbd) = PhiB * czbd * (1.0 - arg * sarg) / (1.0 - MJ); - here->BSIM3V1capbd = czbd * sarg; + here->BSIM3v1capbd = czbd * sarg; } else - { *(ckt->CKTstate0 + here->BSIM3V1qbd) = 0.0; - here->BSIM3V1capbd = 0.0; + { *(ckt->CKTstate0 + here->BSIM3v1qbd) = 0.0; + here->BSIM3v1capbd = 0.0; } if (czbdsw > 0.0) { arg = 1.0 - vbd / PhiBSW; @@ -1996,9 +1989,9 @@ finished: /* returning Values to Calling Routine */ sarg = 1.0 / sqrt(arg); else sarg = exp(-MJSW * log(arg)); - *(ckt->CKTstate0 + here->BSIM3V1qbd) += PhiBSW * czbdsw + *(ckt->CKTstate0 + here->BSIM3v1qbd) += PhiBSW * czbdsw * (1.0 - arg * sarg) / (1.0 - MJSW); - here->BSIM3V1capbd += czbdsw * sarg; + here->BSIM3v1capbd += czbdsw * sarg; } if (czbdswg > 0.0) { arg = 1.0 - vbd / PhiBSWG; @@ -2006,32 +1999,34 @@ finished: /* returning Values to Calling Routine */ sarg = 1.0 / sqrt(arg); else sarg = exp(-MJSWG * log(arg)); - *(ckt->CKTstate0 + here->BSIM3V1qbd) += PhiBSWG * czbdswg + *(ckt->CKTstate0 + here->BSIM3v1qbd) += PhiBSWG * czbdswg * (1.0 - arg * sarg) / (1.0 - MJSWG); - here->BSIM3V1capbd += czbdswg * sarg; + here->BSIM3v1capbd += czbdswg * sarg; } } else - { *(ckt->CKTstate0+here->BSIM3V1qbd) = vbd * (czbd + czbdsw + { *(ckt->CKTstate0+here->BSIM3v1qbd) = vbd * (czbd + czbdsw + czbdswg) + vbd * vbd * (czbd * MJ * 0.5 / PhiB + czbdsw * MJSW * 0.5 / PhiBSW + czbdswg * MJSWG * 0.5 / PhiBSWG); - here->BSIM3V1capbd = czbd + czbdsw + czbdswg + vbd * (czbd * MJ / PhiB + czbdsw * MJSW / PhiBSW + czbdswg * MJSWG / PhiBSWG); + here->BSIM3v1capbd = czbd + czbdsw + czbdswg + vbd * (czbd * MJ / + PhiB + czbdsw * MJSW / PhiBSW + czbdswg * MJSWG / PhiBSWG); } } /* * check convergence */ - if ((here->BSIM3V1off == 0) || (!(ckt->CKTmode & MODEINITFIX))) + if ((here->BSIM3v1off == 0) || (!(ckt->CKTmode & MODEINITFIX))) { if (Check == 1) - { ckt->CKTnoncon++; + { + ckt->CKTnoncon++; } } - *(ckt->CKTstate0 + here->BSIM3V1vbs) = vbs; - *(ckt->CKTstate0 + here->BSIM3V1vbd) = vbd; - *(ckt->CKTstate0 + here->BSIM3V1vgs) = vgs; - *(ckt->CKTstate0 + here->BSIM3V1vds) = vds; + *(ckt->CKTstate0 + here->BSIM3v1vbs) = vbs; + *(ckt->CKTstate0 + here->BSIM3v1vbd) = vbd; + *(ckt->CKTstate0 + here->BSIM3v1vgs) = vgs; + *(ckt->CKTstate0 + here->BSIM3v1vds) = vds; /* bulk and channel charge plus overlaps */ @@ -2041,55 +2036,54 @@ finished: /* returning Values to Calling Routine */ line755: ag0 = ckt->CKTag[0]; - if (model->BSIM3V1capMod == 0) + if (model->BSIM3v1capMod == 0) { if (vgd < 0.0) { - cgdo = pParam->BSIM3V1cgdo; - qgdo = pParam->BSIM3V1cgdo * vgd; + cgdo = pParam->BSIM3v1cgdo; + qgdo = pParam->BSIM3v1cgdo * vgd; } else - { cgdo = pParam->BSIM3V1cgdo; - qgdo = pParam->BSIM3V1cgdo * vgd; + { cgdo = pParam->BSIM3v1cgdo; + qgdo = pParam->BSIM3v1cgdo * vgd; } if (vgs < 0.0) { - cgso = pParam->BSIM3V1cgso; - qgso = pParam->BSIM3V1cgso * vgs; + cgso = pParam->BSIM3v1cgso; + qgso = pParam->BSIM3v1cgso * vgs; } else - { cgso = pParam->BSIM3V1cgso; - qgso = pParam->BSIM3V1cgso * vgs; + { cgso = pParam->BSIM3v1cgso; + qgso = pParam->BSIM3v1cgso * vgs; } } - else if (model->BSIM3V1capMod == 1) + else if (model->BSIM3v1capMod == 1) { if (vgd < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgd / pParam->BSIM3V1ckappa); - cgdo = pParam->BSIM3V1cgdo + pParam->BSIM3V1weffCV - * pParam->BSIM3V1cgdl / T1; - qgdo = pParam->BSIM3V1cgdo * vgd - pParam->BSIM3V1weffCV * 0.5 - * pParam->BSIM3V1cgdl * pParam->BSIM3V1ckappa * (T1 - 1.0); + { T1 = sqrt(1.0 - 4.0 * vgd / pParam->BSIM3v1ckappa); + cgdo = pParam->BSIM3v1cgdo + pParam->BSIM3v1weffCV + * pParam->BSIM3v1cgdl / T1; + qgdo = pParam->BSIM3v1cgdo * vgd - pParam->BSIM3v1weffCV * 0.5 + * pParam->BSIM3v1cgdl * pParam->BSIM3v1ckappa * (T1 - 1.0); } else - { cgdo = pParam->BSIM3V1cgdo + pParam->BSIM3V1weffCV - * pParam->BSIM3V1cgdl; - qgdo = (pParam->BSIM3V1weffCV * pParam->BSIM3V1cgdl - + pParam->BSIM3V1cgdo) * vgd; + { cgdo = pParam->BSIM3v1cgdo + pParam->BSIM3v1weffCV + * pParam->BSIM3v1cgdl; + qgdo = (pParam->BSIM3v1weffCV * pParam->BSIM3v1cgdl + + pParam->BSIM3v1cgdo) * vgd; } - if (vgs < 0.0) - { T1 = sqrt(1.0 - 4.0 * vgs / pParam->BSIM3V1ckappa); - cgso = pParam->BSIM3V1cgso + pParam->BSIM3V1weffCV - * pParam->BSIM3V1cgsl / T1; - qgso = pParam->BSIM3V1cgso * vgs - pParam->BSIM3V1weffCV * 0.5 - * pParam->BSIM3V1cgsl * pParam->BSIM3V1ckappa * (T1 - 1.0); + { T1 = sqrt(1.0 - 4.0 * vgs / pParam->BSIM3v1ckappa); + cgso = pParam->BSIM3v1cgso + pParam->BSIM3v1weffCV + * pParam->BSIM3v1cgsl / T1; + qgso = pParam->BSIM3v1cgso * vgs - pParam->BSIM3v1weffCV * 0.5 + * pParam->BSIM3v1cgsl * pParam->BSIM3v1ckappa * (T1 - 1.0); } else - { cgso = pParam->BSIM3V1cgso + pParam->BSIM3V1weffCV - * pParam->BSIM3V1cgsl; - qgso = (pParam->BSIM3V1weffCV * pParam->BSIM3V1cgsl - + pParam->BSIM3V1cgso) * vgs; + { cgso = pParam->BSIM3v1cgso + pParam->BSIM3v1weffCV + * pParam->BSIM3v1cgsl; + qgso = (pParam->BSIM3v1weffCV * pParam->BSIM3v1cgsl + + pParam->BSIM3v1cgso) * vgs; } } else @@ -2097,51 +2091,51 @@ line755: T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM3V1weffCV * pParam->BSIM3V1cgdl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3V1ckappa); - cgdo = pParam->BSIM3V1cgdo + T3 - T3 * (1.0 - 1.0 / T4) + T3 = pParam->BSIM3v1weffCV * pParam->BSIM3v1cgdl; + T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3v1ckappa); + cgdo = pParam->BSIM3v1cgdo + T3 - T3 * (1.0 - 1.0 / T4) * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->BSIM3V1cgdo + T3) * vgd - T3 * (T2 - + 0.5 * pParam->BSIM3V1ckappa * (T4 - 1.0)); + qgdo = (pParam->BSIM3v1cgdo + T3) * vgd - T3 * (T2 + + 0.5 * pParam->BSIM3v1ckappa * (T4 - 1.0)); T0 = vgs + DELTA_1; T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); T2 = 0.5 * (T0 - T1); - T3 = pParam->BSIM3V1weffCV * pParam->BSIM3V1cgsl; - T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3V1ckappa); - cgso = pParam->BSIM3V1cgso + T3 - T3 * (1.0 - 1.0 / T4) + T3 = pParam->BSIM3v1weffCV * pParam->BSIM3v1cgsl; + T4 = sqrt(1.0 - 4.0 * T2 / pParam->BSIM3v1ckappa); + cgso = pParam->BSIM3v1cgso + T3 - T3 * (1.0 - 1.0 / T4) * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->BSIM3V1cgso + T3) * vgs - T3 * (T2 - + 0.5 * pParam->BSIM3V1ckappa * (T4 - 1.0)); + qgso = (pParam->BSIM3v1cgso + T3) * vgs - T3 * (T2 + + 0.5 * pParam->BSIM3v1ckappa * (T4 - 1.0)); } - if (here->BSIM3V1mode > 0) - { gcdgb = (here->BSIM3V1cdgb - cgdo) * ag0; - gcddb = (here->BSIM3V1cddb + here->BSIM3V1capbd + cgdo) * ag0; - gcdsb = here->BSIM3V1cdsb * ag0; - gcsgb = -(here->BSIM3V1cggb + here->BSIM3V1cbgb + here->BSIM3V1cdgb + if (here->BSIM3v1mode > 0) + { gcdgb = (here->BSIM3v1cdgb - cgdo) * ag0; + gcddb = (here->BSIM3v1cddb + here->BSIM3v1capbd + cgdo) * ag0; + gcdsb = here->BSIM3v1cdsb * ag0; + gcsgb = -(here->BSIM3v1cggb + here->BSIM3v1cbgb + here->BSIM3v1cdgb + cgso) * ag0; - gcsdb = -(here->BSIM3V1cgdb + here->BSIM3V1cbdb + here->BSIM3V1cddb) + gcsdb = -(here->BSIM3v1cgdb + here->BSIM3v1cbdb + here->BSIM3v1cddb) * ag0; - gcssb = (here->BSIM3V1capbs + cgso - (here->BSIM3V1cgsb - + here->BSIM3V1cbsb + here->BSIM3V1cdsb)) * ag0; - gcggb = (here->BSIM3V1cggb + cgdo + cgso + pParam->BSIM3V1cgbo ) * ag0; - gcgdb = (here->BSIM3V1cgdb - cgdo) * ag0; - gcgsb = (here->BSIM3V1cgsb - cgso) * ag0; - gcbgb = (here->BSIM3V1cbgb - pParam->BSIM3V1cgbo) * ag0; - gcbdb = (here->BSIM3V1cbdb - here->BSIM3V1capbd) * ag0; - gcbsb = (here->BSIM3V1cbsb - here->BSIM3V1capbs) * ag0; + gcssb = (here->BSIM3v1capbs + cgso - (here->BSIM3v1cgsb + + here->BSIM3v1cbsb + here->BSIM3v1cdsb)) * ag0; + gcggb = (here->BSIM3v1cggb + cgdo + cgso + pParam->BSIM3v1cgbo ) * ag0; + gcgdb = (here->BSIM3v1cgdb - cgdo) * ag0; + gcgsb = (here->BSIM3v1cgsb - cgso) * ag0; + gcbgb = (here->BSIM3v1cbgb - pParam->BSIM3v1cgbo) * ag0; + gcbdb = (here->BSIM3v1cbdb - here->BSIM3v1capbd) * ag0; + gcbsb = (here->BSIM3v1cbsb - here->BSIM3v1capbs) * ag0; - gcqgb = here->BSIM3V1cqgb * ag0; - gcqdb = here->BSIM3V1cqdb * ag0; - gcqsb = here->BSIM3V1cqsb * ag0; - gcqbb = here->BSIM3V1cqbb * ag0; - - T0 = here->BSIM3V1tconst * qdef; - here->BSIM3V1gtg = T0 * here->BSIM3V1cqgb; - here->BSIM3V1gtb = T0 * here->BSIM3V1cqbb; - here->BSIM3V1gtd = T0 * here->BSIM3V1cqdb; - here->BSIM3V1gts = T0 * here->BSIM3V1cqsb; + gcqgb = here->BSIM3v1cqgb * ag0; + gcqdb = here->BSIM3v1cqdb * ag0; + gcqsb = here->BSIM3v1cqsb * ag0; + gcqbb = here->BSIM3v1cqbb * ag0; + + T0 = here->BSIM3v1tconst * qdef; + here->BSIM3v1gtg = T0 * here->BSIM3v1cqgb; + here->BSIM3v1gtb = T0 * here->BSIM3v1cqbb; + here->BSIM3v1gtd = T0 * here->BSIM3v1cqdb; + here->BSIM3v1gts = T0 * here->BSIM3v1cqsb; sxpart = 0.6; dxpart = 0.4; @@ -2149,40 +2143,40 @@ line755: /* compute total terminal charge */ qgd = qgdo; qgs = qgso; - qgb = pParam->BSIM3V1cgbo * vgb; + qgb = pParam->BSIM3v1cgbo * vgb; qgate += qgd + qgs + qgb; qbulk -= qgb; qdrn -= qgd; qsrc = -(qgate + qbulk + qdrn); } else - { gcsgb = (here->BSIM3V1cdgb - cgso) * ag0; - gcsdb = here->BSIM3V1cdsb * ag0; - gcssb = (here->BSIM3V1cddb + here->BSIM3V1capbs + cgso) * ag0; + { gcsgb = (here->BSIM3v1cdgb - cgso) * ag0; + gcsdb = here->BSIM3v1cdsb * ag0; + gcssb = (here->BSIM3v1cddb + here->BSIM3v1capbs + cgso) * ag0; - gcdgb = -(here->BSIM3V1cggb + here->BSIM3V1cbgb + here->BSIM3V1cdgb + gcdgb = -(here->BSIM3v1cggb + here->BSIM3v1cbgb + here->BSIM3v1cdgb + cgdo) * ag0; - gcdsb = -(here->BSIM3V1cgdb + here->BSIM3V1cbdb + here->BSIM3V1cddb) + gcdsb = -(here->BSIM3v1cgdb + here->BSIM3v1cbdb + here->BSIM3v1cddb) * ag0; - gcddb = (here->BSIM3V1capbd + cgdo - (here->BSIM3V1cgsb - + here->BSIM3V1cbsb + here->BSIM3V1cdsb)) * ag0; - gcggb = (here->BSIM3V1cggb + cgdo + cgso + pParam->BSIM3V1cgbo ) * ag0; - gcgdb = (here->BSIM3V1cgsb - cgdo) * ag0; - gcgsb = (here->BSIM3V1cgdb - cgso) * ag0; - gcbgb = (here->BSIM3V1cbgb - pParam->BSIM3V1cgbo) * ag0; - gcbdb = (here->BSIM3V1cbsb - here->BSIM3V1capbd) * ag0; - gcbsb = (here->BSIM3V1cbdb - here->BSIM3V1capbs) * ag0; + gcddb = (here->BSIM3v1capbd + cgdo - (here->BSIM3v1cgsb + + here->BSIM3v1cbsb + here->BSIM3v1cdsb)) * ag0; + gcggb = (here->BSIM3v1cggb + cgdo + cgso + pParam->BSIM3v1cgbo ) * ag0; + gcgdb = (here->BSIM3v1cgsb - cgdo) * ag0; + gcgsb = (here->BSIM3v1cgdb - cgso) * ag0; + gcbgb = (here->BSIM3v1cbgb - pParam->BSIM3v1cgbo) * ag0; + gcbdb = (here->BSIM3v1cbsb - here->BSIM3v1capbd) * ag0; + gcbsb = (here->BSIM3v1cbdb - here->BSIM3v1capbs) * ag0; - gcqgb = here->BSIM3V1cqgb * ag0; - gcqdb = here->BSIM3V1cqsb * ag0; - gcqsb = here->BSIM3V1cqdb * ag0; - gcqbb = here->BSIM3V1cqbb * ag0; - - T0 = here->BSIM3V1tconst * qdef; - here->BSIM3V1gtg = T0 * here->BSIM3V1cqgb; - here->BSIM3V1gtb = T0 * here->BSIM3V1cqbb; - here->BSIM3V1gtd = T0 * here->BSIM3V1cqdb; - here->BSIM3V1gts = T0 * here->BSIM3V1cqsb; + gcqgb = here->BSIM3v1cqgb * ag0; + gcqdb = here->BSIM3v1cqsb * ag0; + gcqsb = here->BSIM3v1cqdb * ag0; + gcqbb = here->BSIM3v1cqbb * ag0; + + T0 = here->BSIM3v1tconst * qdef; + here->BSIM3v1gtg = T0 * here->BSIM3v1cqgb; + here->BSIM3v1gtb = T0 * here->BSIM3v1cqbb; + here->BSIM3v1gtd = T0 * here->BSIM3v1cqdb; + here->BSIM3v1gts = T0 * here->BSIM3v1cqsb; dxpart = 0.6; sxpart = 0.4; @@ -2190,27 +2184,27 @@ line755: /* compute total terminal charge */ qgd = qgdo; qgs = qgso; - qgb = pParam->BSIM3V1cgbo * vgb; + qgb = pParam->BSIM3v1cgbo * vgb; qgate += qgd + qgs + qgb; qbulk -= qgb; qsrc = qdrn - qgs; qdrn = -(qgate + qbulk + qsrc); } - here->BSIM3V1cgdo = cgdo; - here->BSIM3V1cgso = cgso; + here->BSIM3v1cgdo = cgdo; + here->BSIM3v1cgso = cgso; /* added by Mansun 11/1/93 */ - if (here->BSIM3V1nqsMod) - { *(ckt->CKTstate0 + here->BSIM3V1qcdump) = qdef; + if (here->BSIM3v1nqsMod) + { *(ckt->CKTstate0 + here->BSIM3v1qcdump) = qdef; if (ckt->CKTmode & MODEINITTRAN) - *(ckt->CKTstate1 + here->BSIM3V1qcdump) = - *(ckt->CKTstate0 + here->BSIM3V1qcdump); + *(ckt->CKTstate1 + here->BSIM3v1qcdump) = + *(ckt->CKTstate0 + here->BSIM3v1qcdump); - error = NIintegrate(ckt, &gqdef, &cqdef, 1.0, here->BSIM3V1qcdump); + error = NIintegrate(ckt, &gqdef, &cqdef, 1.0, here->BSIM3v1qcdump); if (error) return (error); } else @@ -2221,12 +2215,12 @@ line755: /* End added by Mansun 11/1/93 */ - *(ckt->CKTstate0 + here->BSIM3V1qg) = qgate; - *(ckt->CKTstate0 + here->BSIM3V1qd) = qdrn - - *(ckt->CKTstate0 + here->BSIM3V1qbd); - *(ckt->CKTstate0 + here->BSIM3V1qb) = qbulk - + *(ckt->CKTstate0 + here->BSIM3V1qbd) - + *(ckt->CKTstate0 + here->BSIM3V1qbs); + *(ckt->CKTstate0 + here->BSIM3v1qg) = qgate; + *(ckt->CKTstate0 + here->BSIM3v1qd) = qdrn + - *(ckt->CKTstate0 + here->BSIM3v1qbd); + *(ckt->CKTstate0 + here->BSIM3v1qb) = qbulk + + *(ckt->CKTstate0 + here->BSIM3v1qbd) + + *(ckt->CKTstate0 + here->BSIM3v1qbs); /* store small signal parameters */ if (ckt->CKTmode & MODEINITSMSIG) @@ -2236,21 +2230,21 @@ line755: goto line850; if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM3V1qb) = - *(ckt->CKTstate0 + here->BSIM3V1qb); - *(ckt->CKTstate1 + here->BSIM3V1qg) = - *(ckt->CKTstate0 + here->BSIM3V1qg); - *(ckt->CKTstate1 + here->BSIM3V1qd) = - *(ckt->CKTstate0 + here->BSIM3V1qd); + { *(ckt->CKTstate1 + here->BSIM3v1qb) = + *(ckt->CKTstate0 + here->BSIM3v1qb); + *(ckt->CKTstate1 + here->BSIM3v1qg) = + *(ckt->CKTstate0 + here->BSIM3v1qg); + *(ckt->CKTstate1 + here->BSIM3v1qd) = + *(ckt->CKTstate0 + here->BSIM3v1qd); } - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3V1qb); + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3v1qb); if (error) return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3V1qg); + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->BSIM3v1qg); if (error) return(error); - error = NIintegrate(ckt,&geq, &ceq, 0.0, here->BSIM3V1qd); + error = NIintegrate(ckt,&geq, &ceq, 0.0, here->BSIM3v1qd); if (error) return(error); @@ -2268,46 +2262,46 @@ line850: gcbgb = gcbdb = gcbsb = 0.0; gcqgb = gcqdb = gcqsb = gcqbb = 0.0; - here->BSIM3V1gtg = here->BSIM3V1gtd = here->BSIM3V1gts = here->BSIM3V1gtb = 0.0; + here->BSIM3v1gtg = here->BSIM3v1gtd = here->BSIM3v1gts = here->BSIM3v1gtb = 0.0; gqdef = 0.0; - sxpart = (1.0 - (dxpart = (here->BSIM3V1mode > 0) ? 0.4 : 0.6)); - if (here->BSIM3V1nqsMod) - here->BSIM3V1gtau = 16.0 * pParam->BSIM3V1u0temp * model->BSIM3V1vtm + sxpart = (1.0 - (dxpart = (here->BSIM3v1mode > 0) ? 0.4 : 0.6)); + if (here->BSIM3v1nqsMod) + here->BSIM3v1gtau = 16.0 * pParam->BSIM3v1u0temp * model->BSIM3v1vtm / Leff / Leff; else - here->BSIM3V1gtau = 0.0; + here->BSIM3v1gtau = 0.0; goto line900; line860: /* evaluate equivalent charge current */ - cqgate = *(ckt->CKTstate0 + here->BSIM3V1cqg); - cqbulk = *(ckt->CKTstate0 + here->BSIM3V1cqb); - cqdrn = *(ckt->CKTstate0 + here->BSIM3V1cqd); + cqgate = *(ckt->CKTstate0 + here->BSIM3v1cqg); + cqbulk = *(ckt->CKTstate0 + here->BSIM3v1cqb); + cqdrn = *(ckt->CKTstate0 + here->BSIM3v1cqd); ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs - + (here->BSIM3V1gtg * vgb - here->BSIM3V1gtd * vbd - here->BSIM3V1gts * vbs); + + (here->BSIM3v1gtg * vgb - here->BSIM3v1gtd * vbd - here->BSIM3v1gts * vbs); ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs; ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs - - dxpart * (here->BSIM3V1gtg * vgb - here->BSIM3V1gtd * vbd - - here->BSIM3V1gts * vbs); + - dxpart * (here->BSIM3v1gtg * vgb - here->BSIM3v1gtd * vbd + - here->BSIM3v1gts * vbs); - cqcheq = *(ckt->CKTstate0 + here->BSIM3V1cqcheq) + cqcheq = *(ckt->CKTstate0 + here->BSIM3v1cqcheq) - (gcqgb * vgb - gcqdb * vbd - gcqsb * vbs) - + (here->BSIM3V1gtg * vgb - here->BSIM3V1gtd * vbd - here->BSIM3V1gts * vbs); + + (here->BSIM3v1gtg * vgb - here->BSIM3v1gtd * vbd - here->BSIM3v1gts * vbs); if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->BSIM3V1cqb) = - *(ckt->CKTstate0 + here->BSIM3V1cqb); - *(ckt->CKTstate1 + here->BSIM3V1cqg) = - *(ckt->CKTstate0 + here->BSIM3V1cqg); - *(ckt->CKTstate1 + here->BSIM3V1cqd) = - *(ckt->CKTstate0 + here->BSIM3V1cqd); - *(ckt->CKTstate1 + here->BSIM3V1cqcheq) = - *(ckt->CKTstate0 + here->BSIM3V1cqcheq); - *(ckt->CKTstate1 + here->BSIM3V1cqcdump) = - *(ckt->CKTstate0 + here->BSIM3V1cqcdump); + { *(ckt->CKTstate1 + here->BSIM3v1cqb) = + *(ckt->CKTstate0 + here->BSIM3v1cqb); + *(ckt->CKTstate1 + here->BSIM3v1cqg) = + *(ckt->CKTstate0 + here->BSIM3v1cqg); + *(ckt->CKTstate1 + here->BSIM3v1cqd) = + *(ckt->CKTstate0 + here->BSIM3v1cqd); + *(ckt->CKTstate1 + here->BSIM3v1cqcheq) = + *(ckt->CKTstate0 + here->BSIM3v1cqcheq); + *(ckt->CKTstate1 + here->BSIM3v1cqcdump) = + *(ckt->CKTstate0 + here->BSIM3v1cqcdump); } /* @@ -2315,61 +2309,61 @@ line860: */ line900: - if (here->BSIM3V1mode >= 0) - { Gm = here->BSIM3V1gm; - Gmbs = here->BSIM3V1gmbs; + if (here->BSIM3v1mode >= 0) + { Gm = here->BSIM3v1gm; + Gmbs = here->BSIM3v1gmbs; FwdSum = Gm + Gmbs; RevSum = 0.0; - cdreq = model->BSIM3V1type * (cdrain - here->BSIM3V1gds * vds + cdreq = model->BSIM3v1type * (cdrain - here->BSIM3v1gds * vds - Gm * vgs - Gmbs * vbs); - ceqbs = -here->BSIM3V1csub; + ceqbs = -here->BSIM3v1csub; ceqbd = 0.0; - gbspsp = -here->BSIM3V1gbds - here->BSIM3V1gbgs - here->BSIM3V1gbbs; - gbbdp = -here->BSIM3V1gbds; - gbbsp = here->BSIM3V1gbds + here->BSIM3V1gbgs + here->BSIM3V1gbbs; - gbspg = here->BSIM3V1gbgs; - gbspb = here->BSIM3V1gbbs; - gbspdp = here->BSIM3V1gbds; + gbspsp = -here->BSIM3v1gbds - here->BSIM3v1gbgs - here->BSIM3v1gbbs; + gbbdp = -here->BSIM3v1gbds; + gbbsp = here->BSIM3v1gbds + here->BSIM3v1gbgs + here->BSIM3v1gbbs; + gbspg = here->BSIM3v1gbgs; + gbspb = here->BSIM3v1gbbs; + gbspdp = here->BSIM3v1gbds; gbdpdp = 0.0; gbdpg = 0.0; gbdpb = 0.0; gbdpsp = 0.0; } else - { Gm = -here->BSIM3V1gm; - Gmbs = -here->BSIM3V1gmbs; + { Gm = -here->BSIM3v1gm; + Gmbs = -here->BSIM3v1gmbs; FwdSum = 0.0; RevSum = -(Gm + Gmbs); - cdreq = -model->BSIM3V1type * (cdrain + here->BSIM3V1gds * vds + cdreq = -model->BSIM3v1type * (cdrain + here->BSIM3v1gds * vds + Gm * vgd + Gmbs * vbd); ceqbs = 0.0; - ceqbd = -here->BSIM3V1csub; + ceqbd = -here->BSIM3v1csub; gbspsp = 0.0; - gbbdp = here->BSIM3V1gbds + here->BSIM3V1gbgs + here->BSIM3V1gbbs; - gbbsp = -here->BSIM3V1gbds; + gbbdp = here->BSIM3v1gbds + here->BSIM3v1gbgs + here->BSIM3v1gbbs; + gbbsp = -here->BSIM3v1gbds; gbspg = 0.0; gbspb = 0.0; gbspdp = 0.0; - gbdpdp = -here->BSIM3V1gbds - here->BSIM3V1gbgs - here->BSIM3V1gbbs; - gbdpg = here->BSIM3V1gbgs; - gbdpb = here->BSIM3V1gbbs; - gbdpsp = here->BSIM3V1gbds; + gbdpdp = -here->BSIM3v1gbds - here->BSIM3v1gbgs - here->BSIM3v1gbbs; + gbdpg = here->BSIM3v1gbgs; + gbdpb = here->BSIM3v1gbbs; + gbdpsp = here->BSIM3v1gbds; } - if (model->BSIM3V1type > 0) - { ceqbs += (here->BSIM3V1cbs - (here->BSIM3V1gbs - ckt->CKTgmin) * vbs); - ceqbd += (here->BSIM3V1cbd - (here->BSIM3V1gbd - ckt->CKTgmin) * vbd); + if (model->BSIM3v1type > 0) + { ceqbs += (here->BSIM3v1cbs - (here->BSIM3v1gbs - ckt->CKTgmin) * vbs); + ceqbd += (here->BSIM3v1cbd - (here->BSIM3v1gbd - ckt->CKTgmin ) * vbd); ceqqg = ceqqg; ceqqb = ceqqb; ceqqd = ceqqd; cqcheq = cqcheq; } else - { ceqbs = -ceqbs - (here->BSIM3V1cbs - (here->BSIM3V1gbs + { ceqbs = -ceqbs - (here->BSIM3v1cbs - (here->BSIM3v1gbs - ckt->CKTgmin) * vbs); - ceqbd = -ceqbd - (here->BSIM3V1cbd - (here->BSIM3V1gbd + ceqbd = -ceqbd - (here->BSIM3v1cbd - (here->BSIM3v1gbd - ckt->CKTgmin) * vbd); ceqqg = -ceqqg; ceqqb = -ceqqb; @@ -2377,60 +2371,66 @@ line900: cqcheq = -cqcheq; } - (*(ckt->CKTrhs + here->BSIM3V1gNode) -= ceqqg); - (*(ckt->CKTrhs + here->BSIM3V1bNode) -=(ceqbs + ceqbd + ceqqb)); - (*(ckt->CKTrhs + here->BSIM3V1dNodePrime) += (ceqbd - cdreq - ceqqd)); - (*(ckt->CKTrhs + here->BSIM3V1sNodePrime) += (cdreq + ceqbs + ceqqg + (*(ckt->CKTrhs + here->BSIM3v1gNode) -= m * ceqqg); + (*(ckt->CKTrhs + here->BSIM3v1bNode) -= m * (ceqbs + ceqbd + ceqqb)); + (*(ckt->CKTrhs + here->BSIM3v1dNodePrime) += m * (ceqbd - cdreq - ceqqd)); + (*(ckt->CKTrhs + here->BSIM3v1sNodePrime) += m * (cdreq + ceqbs + ceqqg + ceqqb + ceqqd)); - *(ckt->CKTrhs + here->BSIM3V1qNode) += (cqcheq - cqdef); + *(ckt->CKTrhs + here->BSIM3v1qNode) += m * (cqcheq - cqdef); /* * load y matrix */ - (*(here->BSIM3V1DdPtr) += here->BSIM3V1drainConductance); - (*(here->BSIM3V1GgPtr) += gcggb - here->BSIM3V1gtg); - (*(here->BSIM3V1SsPtr) += here->BSIM3V1sourceConductance); - (*(here->BSIM3V1BbPtr) += (here->BSIM3V1gbd + here->BSIM3V1gbs - - gcbgb - gcbdb - gcbsb) - here->BSIM3V1gbbs); - (*(here->BSIM3V1DPdpPtr) += (here->BSIM3V1drainConductance - + here->BSIM3V1gds + here->BSIM3V1gbd - + RevSum + gcddb) + dxpart * here->BSIM3V1gtd + gbdpdp); - (*(here->BSIM3V1SPspPtr) += (here->BSIM3V1sourceConductance - + here->BSIM3V1gds + here->BSIM3V1gbs - + FwdSum + gcssb) + sxpart * here->BSIM3V1gts + gbspsp); - (*(here->BSIM3V1DdpPtr) -= here->BSIM3V1drainConductance); - (*(here->BSIM3V1GbPtr) -= gcggb + gcgdb + gcgsb + here->BSIM3V1gtb); - (*(here->BSIM3V1GdpPtr) += gcgdb - here->BSIM3V1gtd); - (*(here->BSIM3V1GspPtr) += gcgsb - here->BSIM3V1gts); - (*(here->BSIM3V1SspPtr) -= here->BSIM3V1sourceConductance); - (*(here->BSIM3V1BgPtr) += gcbgb - here->BSIM3V1gbgs); - (*(here->BSIM3V1BdpPtr) += gcbdb - here->BSIM3V1gbd + gbbdp); - (*(here->BSIM3V1BspPtr) += gcbsb - here->BSIM3V1gbs + gbbsp); - (*(here->BSIM3V1DPdPtr) -= here->BSIM3V1drainConductance); - (*(here->BSIM3V1DPgPtr) += (Gm + gcdgb) + dxpart * here->BSIM3V1gtg + gbdpg); - (*(here->BSIM3V1DPbPtr) -= (here->BSIM3V1gbd - Gmbs + gcdgb + gcddb - + gcdsb - dxpart * here->BSIM3V1gtb) - gbdpb); - (*(here->BSIM3V1DPspPtr) -= (here->BSIM3V1gds + FwdSum - gcdsb - - dxpart * here->BSIM3V1gts) - gbdpsp); - (*(here->BSIM3V1SPgPtr) += gcsgb - Gm + sxpart * here->BSIM3V1gtg + gbspg); - (*(here->BSIM3V1SPsPtr) -= here->BSIM3V1sourceConductance); - (*(here->BSIM3V1SPbPtr) -= (here->BSIM3V1gbs + Gmbs + gcsgb + gcsdb - + gcssb - sxpart * here->BSIM3V1gtb) - gbspb); - (*(here->BSIM3V1SPdpPtr) -= (here->BSIM3V1gds + RevSum - gcsdb - - sxpart * here->BSIM3V1gtd - here->BSIM3V1gbd) - gbspdp); + (*(here->BSIM3v1DdPtr) += m * here->BSIM3v1drainConductance); + (*(here->BSIM3v1GgPtr) += m * (gcggb - here->BSIM3v1gtg)); + (*(here->BSIM3v1SsPtr) += m * here->BSIM3v1sourceConductance); + (*(here->BSIM3v1BbPtr) += m * ((here->BSIM3v1gbd + here->BSIM3v1gbs + - gcbgb - gcbdb - gcbsb) - here->BSIM3v1gbbs)); + (*(here->BSIM3v1DPdpPtr) += m * ((here->BSIM3v1drainConductance + + here->BSIM3v1gds + here->BSIM3v1gbd + + RevSum + gcddb) + dxpart * here->BSIM3v1gtd + + gbdpdp)); + (*(here->BSIM3v1SPspPtr) += m * ((here->BSIM3v1sourceConductance + + here->BSIM3v1gds + here->BSIM3v1gbs + + FwdSum + gcssb) + sxpart * here->BSIM3v1gts + + gbspsp)); + (*(here->BSIM3v1DdpPtr) -= m * here->BSIM3v1drainConductance); + (*(here->BSIM3v1GbPtr) -= m * (gcggb + gcgdb + gcgsb + + here->BSIM3v1gtb)); + (*(here->BSIM3v1GdpPtr) += m * (gcgdb - here->BSIM3v1gtd)); + (*(here->BSIM3v1GspPtr) += m * (gcgsb - here->BSIM3v1gts)); + (*(here->BSIM3v1SspPtr) -= m * here->BSIM3v1sourceConductance); + (*(here->BSIM3v1BgPtr) += m * (gcbgb - here->BSIM3v1gbgs)); + (*(here->BSIM3v1BdpPtr) += m * (gcbdb - here->BSIM3v1gbd + gbbdp)); + (*(here->BSIM3v1BspPtr) += m * (gcbsb - here->BSIM3v1gbs + gbbsp)); + (*(here->BSIM3v1DPdPtr) -= m * here->BSIM3v1drainConductance); + (*(here->BSIM3v1DPgPtr) += m * ((Gm + gcdgb) + dxpart * + here->BSIM3v1gtg + gbdpg)); + (*(here->BSIM3v1DPbPtr) -= m * ((here->BSIM3v1gbd - Gmbs + gcdgb + gcddb + + gcdsb - dxpart * here->BSIM3v1gtb) - gbdpb)); + (*(here->BSIM3v1DPspPtr) -= m * ((here->BSIM3v1gds + FwdSum - gcdsb + - dxpart * here->BSIM3v1gts) - gbdpsp)); + (*(here->BSIM3v1SPgPtr) += m * (gcsgb - Gm + sxpart * + here->BSIM3v1gtg + gbspg)); + (*(here->BSIM3v1SPsPtr) -= m * here->BSIM3v1sourceConductance); + (*(here->BSIM3v1SPbPtr) -= m * ((here->BSIM3v1gbs + Gmbs + gcsgb + gcsdb + + gcssb - sxpart * here->BSIM3v1gtb) - gbspb)); + (*(here->BSIM3v1SPdpPtr) -= m * ((here->BSIM3v1gds + RevSum - gcsdb + - sxpart * here->BSIM3v1gtd - here->BSIM3v1gbd) + - gbspdp)); - *(here->BSIM3V1QqPtr) += (gqdef + here->BSIM3V1gtau); + *(here->BSIM3v1QqPtr) += m * ((gqdef + here->BSIM3v1gtau)); - *(here->BSIM3V1DPqPtr) += (dxpart * here->BSIM3V1gtau); - *(here->BSIM3V1SPqPtr) += (sxpart * here->BSIM3V1gtau); - *(here->BSIM3V1GqPtr) -= here->BSIM3V1gtau; + *(here->BSIM3v1DPqPtr) += m * ((dxpart * here->BSIM3v1gtau)); + *(here->BSIM3v1SPqPtr) += m * ((sxpart * here->BSIM3v1gtau)); + *(here->BSIM3v1GqPtr) -= m * here->BSIM3v1gtau; - *(here->BSIM3V1QgPtr) += (-gcqgb + here->BSIM3V1gtg); - *(here->BSIM3V1QdpPtr) += (-gcqdb + here->BSIM3V1gtd); - *(here->BSIM3V1QspPtr) += (-gcqsb + here->BSIM3V1gts); - *(here->BSIM3V1QbPtr) += (-gcqbb + here->BSIM3V1gtb); + *(here->BSIM3v1QgPtr) += m * (-gcqgb + here->BSIM3v1gtg); + *(here->BSIM3v1QdpPtr) += m * (-gcqdb + here->BSIM3v1gtd); + *(here->BSIM3v1QspPtr) += m * (-gcqsb + here->BSIM3v1gts); + *(here->BSIM3v1QbPtr) += m * (-gcqbb + here->BSIM3v1gtb); line1000: ; diff --git a/src/spicelib/devices/bsim3v1/b3v1mask.c b/src/spicelib/devices/bsim3v1/b3v1mask.c index 778dad8a4..ba8f6078a 100644 --- a/src/spicelib/devices/bsim3v1/b3v1mask.c +++ b/src/spicelib/devices/bsim3v1/b3v1mask.c @@ -1,11 +1,16 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v1mask.c -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1mask.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ #include "ngspice.h" -#include #include "ifsim.h" #include "cktdefs.h" #include "devdefs.h" @@ -14,1108 +19,1104 @@ File: b3v1mask.c #include "suffix.h" int -BSIM3V1mAsk(ckt,inst,which,value) -CKTcircuit *ckt; -GENmodel *inst; -int which; -IFvalue *value; +BSIM3v1mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) { - BSIM3V1model *model = (BSIM3V1model *)inst; + BSIM3v1model *model = (BSIM3v1model *)inst; switch(which) - { case BSIM3V1_MOD_MOBMOD: - value->iValue = model->BSIM3V1mobMod; + { case BSIM3v1_MOD_MOBMOD: + value->iValue = model->BSIM3v1mobMod; return(OK); - case BSIM3V1_MOD_PARAMCHK: - value->iValue = model->BSIM3V1paramChk; + case BSIM3v1_MOD_PARAMCHK: + value->iValue = model->BSIM3v1paramChk; return(OK); - case BSIM3V1_MOD_BINUNIT: - value->iValue = model->BSIM3V1binUnit; + case BSIM3v1_MOD_BINUNIT: + value->iValue = model->BSIM3v1binUnit; return(OK); - case BSIM3V1_MOD_CAPMOD: - value->iValue = model->BSIM3V1capMod; + case BSIM3v1_MOD_CAPMOD: + value->iValue = model->BSIM3v1capMod; return(OK); - case BSIM3V1_MOD_NQSMOD: - value->iValue = model->BSIM3V1nqsMod; + case BSIM3v1_MOD_NQSMOD: + value->iValue = model->BSIM3v1nqsMod; return(OK); - case BSIM3V1_MOD_NOIMOD: - value->iValue = model->BSIM3V1noiMod; + case BSIM3v1_MOD_NOIMOD: + value->iValue = model->BSIM3v1noiMod; return(OK); - case BSIM3V1_MOD_VERSION : - value->rValue = model->BSIM3V1version; + case BSIM3v1_MOD_VERSION : + value->rValue = model->BSIM3v1version; return(OK); - case BSIM3V1_MOD_TOX : - value->rValue = model->BSIM3V1tox; + case BSIM3v1_MOD_TOX : + value->rValue = model->BSIM3v1tox; return(OK); - case BSIM3V1_MOD_CDSC : - value->rValue = model->BSIM3V1cdsc; + case BSIM3v1_MOD_CDSC : + value->rValue = model->BSIM3v1cdsc; return(OK); - case BSIM3V1_MOD_CDSCB : - value->rValue = model->BSIM3V1cdscb; + case BSIM3v1_MOD_CDSCB : + value->rValue = model->BSIM3v1cdscb; return(OK); - case BSIM3V1_MOD_CDSCD : - value->rValue = model->BSIM3V1cdscd; + case BSIM3v1_MOD_CDSCD : + value->rValue = model->BSIM3v1cdscd; return(OK); - case BSIM3V1_MOD_CIT : - value->rValue = model->BSIM3V1cit; + case BSIM3v1_MOD_CIT : + value->rValue = model->BSIM3v1cit; return(OK); - case BSIM3V1_MOD_NFACTOR : - value->rValue = model->BSIM3V1nfactor; + case BSIM3v1_MOD_NFACTOR : + value->rValue = model->BSIM3v1nfactor; return(OK); - case BSIM3V1_MOD_XJ: - value->rValue = model->BSIM3V1xj; + case BSIM3v1_MOD_XJ: + value->rValue = model->BSIM3v1xj; return(OK); - case BSIM3V1_MOD_VSAT: - value->rValue = model->BSIM3V1vsat; + case BSIM3v1_MOD_VSAT: + value->rValue = model->BSIM3v1vsat; return(OK); - case BSIM3V1_MOD_AT: - value->rValue = model->BSIM3V1at; + case BSIM3v1_MOD_AT: + value->rValue = model->BSIM3v1at; return(OK); - case BSIM3V1_MOD_A0: - value->rValue = model->BSIM3V1a0; + case BSIM3v1_MOD_A0: + value->rValue = model->BSIM3v1a0; return(OK); - case BSIM3V1_MOD_AGS: - value->rValue = model->BSIM3V1ags; + case BSIM3v1_MOD_AGS: + value->rValue = model->BSIM3v1ags; return(OK); - case BSIM3V1_MOD_A1: - value->rValue = model->BSIM3V1a1; + case BSIM3v1_MOD_A1: + value->rValue = model->BSIM3v1a1; return(OK); - case BSIM3V1_MOD_A2: - value->rValue = model->BSIM3V1a2; + case BSIM3v1_MOD_A2: + value->rValue = model->BSIM3v1a2; return(OK); - case BSIM3V1_MOD_KETA: - value->rValue = model->BSIM3V1keta; + case BSIM3v1_MOD_KETA: + value->rValue = model->BSIM3v1keta; return(OK); - case BSIM3V1_MOD_NSUB: - value->rValue = model->BSIM3V1nsub; + case BSIM3v1_MOD_NSUB: + value->rValue = model->BSIM3v1nsub; return(OK); - case BSIM3V1_MOD_NPEAK: - value->rValue = model->BSIM3V1npeak; + case BSIM3v1_MOD_NPEAK: + value->rValue = model->BSIM3v1npeak; return(OK); - case BSIM3V1_MOD_NGATE: - value->rValue = model->BSIM3V1ngate; + case BSIM3v1_MOD_NGATE: + value->rValue = model->BSIM3v1ngate; return(OK); - case BSIM3V1_MOD_GAMMA1: - value->rValue = model->BSIM3V1gamma1; + case BSIM3v1_MOD_GAMMA1: + value->rValue = model->BSIM3v1gamma1; return(OK); - case BSIM3V1_MOD_GAMMA2: - value->rValue = model->BSIM3V1gamma2; + case BSIM3v1_MOD_GAMMA2: + value->rValue = model->BSIM3v1gamma2; return(OK); - case BSIM3V1_MOD_VBX: - value->rValue = model->BSIM3V1vbx; + case BSIM3v1_MOD_VBX: + value->rValue = model->BSIM3v1vbx; return(OK); - case BSIM3V1_MOD_VBM: - value->rValue = model->BSIM3V1vbm; + case BSIM3v1_MOD_VBM: + value->rValue = model->BSIM3v1vbm; return(OK); - case BSIM3V1_MOD_XT: - value->rValue = model->BSIM3V1xt; + case BSIM3v1_MOD_XT: + value->rValue = model->BSIM3v1xt; return(OK); - case BSIM3V1_MOD_K1: - value->rValue = model->BSIM3V1k1; + case BSIM3v1_MOD_K1: + value->rValue = model->BSIM3v1k1; return(OK); - case BSIM3V1_MOD_KT1: - value->rValue = model->BSIM3V1kt1; + case BSIM3v1_MOD_KT1: + value->rValue = model->BSIM3v1kt1; return(OK); - case BSIM3V1_MOD_KT1L: - value->rValue = model->BSIM3V1kt1l; + case BSIM3v1_MOD_KT1L: + value->rValue = model->BSIM3v1kt1l; return(OK); - case BSIM3V1_MOD_KT2 : - value->rValue = model->BSIM3V1kt2; + case BSIM3v1_MOD_KT2 : + value->rValue = model->BSIM3v1kt2; return(OK); - case BSIM3V1_MOD_K2 : - value->rValue = model->BSIM3V1k2; + case BSIM3v1_MOD_K2 : + value->rValue = model->BSIM3v1k2; return(OK); - case BSIM3V1_MOD_K3: - value->rValue = model->BSIM3V1k3; + case BSIM3v1_MOD_K3: + value->rValue = model->BSIM3v1k3; return(OK); - case BSIM3V1_MOD_K3B: - value->rValue = model->BSIM3V1k3b; + case BSIM3v1_MOD_K3B: + value->rValue = model->BSIM3v1k3b; return(OK); - case BSIM3V1_MOD_W0: - value->rValue = model->BSIM3V1w0; + case BSIM3v1_MOD_W0: + value->rValue = model->BSIM3v1w0; return(OK); - case BSIM3V1_MOD_NLX: - value->rValue = model->BSIM3V1nlx; + case BSIM3v1_MOD_NLX: + value->rValue = model->BSIM3v1nlx; return(OK); - case BSIM3V1_MOD_DVT0 : - value->rValue = model->BSIM3V1dvt0; + case BSIM3v1_MOD_DVT0 : + value->rValue = model->BSIM3v1dvt0; return(OK); - case BSIM3V1_MOD_DVT1 : - value->rValue = model->BSIM3V1dvt1; + case BSIM3v1_MOD_DVT1 : + value->rValue = model->BSIM3v1dvt1; return(OK); - case BSIM3V1_MOD_DVT2 : - value->rValue = model->BSIM3V1dvt2; + case BSIM3v1_MOD_DVT2 : + value->rValue = model->BSIM3v1dvt2; return(OK); - case BSIM3V1_MOD_DVT0W : - value->rValue = model->BSIM3V1dvt0w; + case BSIM3v1_MOD_DVT0W : + value->rValue = model->BSIM3v1dvt0w; return(OK); - case BSIM3V1_MOD_DVT1W : - value->rValue = model->BSIM3V1dvt1w; + case BSIM3v1_MOD_DVT1W : + value->rValue = model->BSIM3v1dvt1w; return(OK); - case BSIM3V1_MOD_DVT2W : - value->rValue = model->BSIM3V1dvt2w; + case BSIM3v1_MOD_DVT2W : + value->rValue = model->BSIM3v1dvt2w; return(OK); - case BSIM3V1_MOD_DROUT : - value->rValue = model->BSIM3V1drout; + case BSIM3v1_MOD_DROUT : + value->rValue = model->BSIM3v1drout; return(OK); - case BSIM3V1_MOD_DSUB : - value->rValue = model->BSIM3V1dsub; + case BSIM3v1_MOD_DSUB : + value->rValue = model->BSIM3v1dsub; return(OK); - case BSIM3V1_MOD_VTH0: - value->rValue = model->BSIM3V1vth0; + case BSIM3v1_MOD_VTH0: + value->rValue = model->BSIM3v1vth0; return(OK); - case BSIM3V1_MOD_UA: - value->rValue = model->BSIM3V1ua; + case BSIM3v1_MOD_UA: + value->rValue = model->BSIM3v1ua; return(OK); - case BSIM3V1_MOD_UA1: - value->rValue = model->BSIM3V1ua1; + case BSIM3v1_MOD_UA1: + value->rValue = model->BSIM3v1ua1; return(OK); - case BSIM3V1_MOD_UB: - value->rValue = model->BSIM3V1ub; + case BSIM3v1_MOD_UB: + value->rValue = model->BSIM3v1ub; return(OK); - case BSIM3V1_MOD_UB1: - value->rValue = model->BSIM3V1ub1; + case BSIM3v1_MOD_UB1: + value->rValue = model->BSIM3v1ub1; return(OK); - case BSIM3V1_MOD_UC: - value->rValue = model->BSIM3V1uc; + case BSIM3v1_MOD_UC: + value->rValue = model->BSIM3v1uc; return(OK); - case BSIM3V1_MOD_UC1: - value->rValue = model->BSIM3V1uc1; + case BSIM3v1_MOD_UC1: + value->rValue = model->BSIM3v1uc1; return(OK); - case BSIM3V1_MOD_U0: - value->rValue = model->BSIM3V1u0; + case BSIM3v1_MOD_U0: + value->rValue = model->BSIM3v1u0; return(OK); - case BSIM3V1_MOD_UTE: - value->rValue = model->BSIM3V1ute; + case BSIM3v1_MOD_UTE: + value->rValue = model->BSIM3v1ute; return(OK); - case BSIM3V1_MOD_VOFF: - value->rValue = model->BSIM3V1voff; + case BSIM3v1_MOD_VOFF: + value->rValue = model->BSIM3v1voff; return(OK); - case BSIM3V1_MOD_DELTA: - value->rValue = model->BSIM3V1delta; + case BSIM3v1_MOD_DELTA: + value->rValue = model->BSIM3v1delta; return(OK); - case BSIM3V1_MOD_RDSW: - value->rValue = model->BSIM3V1rdsw; + case BSIM3v1_MOD_RDSW: + value->rValue = model->BSIM3v1rdsw; return(OK); - case BSIM3V1_MOD_PRWG: - value->rValue = model->BSIM3V1prwg; + case BSIM3v1_MOD_PRWG: + value->rValue = model->BSIM3v1prwg; return(OK); - case BSIM3V1_MOD_PRWB: - value->rValue = model->BSIM3V1prwb; + case BSIM3v1_MOD_PRWB: + value->rValue = model->BSIM3v1prwb; return(OK); - case BSIM3V1_MOD_PRT: - value->rValue = model->BSIM3V1prt; + case BSIM3v1_MOD_PRT: + value->rValue = model->BSIM3v1prt; return(OK); - case BSIM3V1_MOD_ETA0: - value->rValue = model->BSIM3V1eta0; + case BSIM3v1_MOD_ETA0: + value->rValue = model->BSIM3v1eta0; return(OK); - case BSIM3V1_MOD_ETAB: - value->rValue = model->BSIM3V1etab; + case BSIM3v1_MOD_ETAB: + value->rValue = model->BSIM3v1etab; return(OK); - case BSIM3V1_MOD_PCLM: - value->rValue = model->BSIM3V1pclm; + case BSIM3v1_MOD_PCLM: + value->rValue = model->BSIM3v1pclm; return(OK); - case BSIM3V1_MOD_PDIBL1: - value->rValue = model->BSIM3V1pdibl1; + case BSIM3v1_MOD_PDIBL1: + value->rValue = model->BSIM3v1pdibl1; return(OK); - case BSIM3V1_MOD_PDIBL2: - value->rValue = model->BSIM3V1pdibl2; + case BSIM3v1_MOD_PDIBL2: + value->rValue = model->BSIM3v1pdibl2; return(OK); - case BSIM3V1_MOD_PDIBLB: - value->rValue = model->BSIM3V1pdiblb; + case BSIM3v1_MOD_PDIBLB: + value->rValue = model->BSIM3v1pdiblb; return(OK); - case BSIM3V1_MOD_PSCBE1: - value->rValue = model->BSIM3V1pscbe1; + case BSIM3v1_MOD_PSCBE1: + value->rValue = model->BSIM3v1pscbe1; return(OK); - case BSIM3V1_MOD_PSCBE2: - value->rValue = model->BSIM3V1pscbe2; + case BSIM3v1_MOD_PSCBE2: + value->rValue = model->BSIM3v1pscbe2; return(OK); - case BSIM3V1_MOD_PVAG: - value->rValue = model->BSIM3V1pvag; + case BSIM3v1_MOD_PVAG: + value->rValue = model->BSIM3v1pvag; return(OK); - case BSIM3V1_MOD_WR: - value->rValue = model->BSIM3V1wr; + case BSIM3v1_MOD_WR: + value->rValue = model->BSIM3v1wr; return(OK); - case BSIM3V1_MOD_DWG: - value->rValue = model->BSIM3V1dwg; + case BSIM3v1_MOD_DWG: + value->rValue = model->BSIM3v1dwg; return(OK); - case BSIM3V1_MOD_DWB: - value->rValue = model->BSIM3V1dwb; + case BSIM3v1_MOD_DWB: + value->rValue = model->BSIM3v1dwb; return(OK); - case BSIM3V1_MOD_B0: - value->rValue = model->BSIM3V1b0; + case BSIM3v1_MOD_B0: + value->rValue = model->BSIM3v1b0; return(OK); - case BSIM3V1_MOD_B1: - value->rValue = model->BSIM3V1b1; + case BSIM3v1_MOD_B1: + value->rValue = model->BSIM3v1b1; return(OK); - case BSIM3V1_MOD_ALPHA0: - value->rValue = model->BSIM3V1alpha0; + case BSIM3v1_MOD_ALPHA0: + value->rValue = model->BSIM3v1alpha0; return(OK); - case BSIM3V1_MOD_BETA0: - value->rValue = model->BSIM3V1beta0; + case BSIM3v1_MOD_BETA0: + value->rValue = model->BSIM3v1beta0; return(OK); - case BSIM3V1_MOD_ELM: - value->rValue = model->BSIM3V1elm; + case BSIM3v1_MOD_ELM: + value->rValue = model->BSIM3v1elm; return(OK); - case BSIM3V1_MOD_CGSL: - value->rValue = model->BSIM3V1cgsl; + case BSIM3v1_MOD_CGSL: + value->rValue = model->BSIM3v1cgsl; return(OK); - case BSIM3V1_MOD_CGDL: - value->rValue = model->BSIM3V1cgdl; + case BSIM3v1_MOD_CGDL: + value->rValue = model->BSIM3v1cgdl; return(OK); - case BSIM3V1_MOD_CKAPPA: - value->rValue = model->BSIM3V1ckappa; + case BSIM3v1_MOD_CKAPPA: + value->rValue = model->BSIM3v1ckappa; return(OK); - case BSIM3V1_MOD_CF: - value->rValue = model->BSIM3V1cf; + case BSIM3v1_MOD_CF: + value->rValue = model->BSIM3v1cf; return(OK); - case BSIM3V1_MOD_CLC: - value->rValue = model->BSIM3V1clc; + case BSIM3v1_MOD_CLC: + value->rValue = model->BSIM3v1clc; return(OK); - case BSIM3V1_MOD_CLE: - value->rValue = model->BSIM3V1cle; + case BSIM3v1_MOD_CLE: + value->rValue = model->BSIM3v1cle; return(OK); - case BSIM3V1_MOD_DWC: - value->rValue = model->BSIM3V1dwc; + case BSIM3v1_MOD_DWC: + value->rValue = model->BSIM3v1dwc; return(OK); - case BSIM3V1_MOD_DLC: - value->rValue = model->BSIM3V1dlc; + case BSIM3v1_MOD_DLC: + value->rValue = model->BSIM3v1dlc; return(OK); - case BSIM3V1_MOD_VFBCV: - value->rValue = model->BSIM3V1vfbcv; + case BSIM3v1_MOD_VFBCV: + value->rValue = model->BSIM3v1vfbcv; return(OK); /* Length dependence */ - case BSIM3V1_MOD_LCDSC : - value->rValue = model->BSIM3V1lcdsc; + case BSIM3v1_MOD_LCDSC : + value->rValue = model->BSIM3v1lcdsc; return(OK); - case BSIM3V1_MOD_LCDSCB : - value->rValue = model->BSIM3V1lcdscb; + case BSIM3v1_MOD_LCDSCB : + value->rValue = model->BSIM3v1lcdscb; return(OK); - case BSIM3V1_MOD_LCDSCD : - value->rValue = model->BSIM3V1lcdscd; + case BSIM3v1_MOD_LCDSCD : + value->rValue = model->BSIM3v1lcdscd; return(OK); - case BSIM3V1_MOD_LCIT : - value->rValue = model->BSIM3V1lcit; + case BSIM3v1_MOD_LCIT : + value->rValue = model->BSIM3v1lcit; return(OK); - case BSIM3V1_MOD_LNFACTOR : - value->rValue = model->BSIM3V1lnfactor; + case BSIM3v1_MOD_LNFACTOR : + value->rValue = model->BSIM3v1lnfactor; return(OK); - case BSIM3V1_MOD_LXJ: - value->rValue = model->BSIM3V1lxj; + case BSIM3v1_MOD_LXJ: + value->rValue = model->BSIM3v1lxj; return(OK); - case BSIM3V1_MOD_LVSAT: - value->rValue = model->BSIM3V1lvsat; + case BSIM3v1_MOD_LVSAT: + value->rValue = model->BSIM3v1lvsat; return(OK); - case BSIM3V1_MOD_LAT: - value->rValue = model->BSIM3V1lat; + case BSIM3v1_MOD_LAT: + value->rValue = model->BSIM3v1lat; return(OK); - case BSIM3V1_MOD_LA0: - value->rValue = model->BSIM3V1la0; + case BSIM3v1_MOD_LA0: + value->rValue = model->BSIM3v1la0; return(OK); - case BSIM3V1_MOD_LAGS: - value->rValue = model->BSIM3V1lags; + case BSIM3v1_MOD_LAGS: + value->rValue = model->BSIM3v1lags; return(OK); - case BSIM3V1_MOD_LA1: - value->rValue = model->BSIM3V1la1; + case BSIM3v1_MOD_LA1: + value->rValue = model->BSIM3v1la1; return(OK); - case BSIM3V1_MOD_LA2: - value->rValue = model->BSIM3V1la2; + case BSIM3v1_MOD_LA2: + value->rValue = model->BSIM3v1la2; return(OK); - case BSIM3V1_MOD_LKETA: - value->rValue = model->BSIM3V1lketa; + case BSIM3v1_MOD_LKETA: + value->rValue = model->BSIM3v1lketa; return(OK); - case BSIM3V1_MOD_LNSUB: - value->rValue = model->BSIM3V1lnsub; + case BSIM3v1_MOD_LNSUB: + value->rValue = model->BSIM3v1lnsub; return(OK); - case BSIM3V1_MOD_LNPEAK: - value->rValue = model->BSIM3V1lnpeak; + case BSIM3v1_MOD_LNPEAK: + value->rValue = model->BSIM3v1lnpeak; return(OK); - case BSIM3V1_MOD_LNGATE: - value->rValue = model->BSIM3V1lngate; + case BSIM3v1_MOD_LNGATE: + value->rValue = model->BSIM3v1lngate; return(OK); - case BSIM3V1_MOD_LGAMMA1: - value->rValue = model->BSIM3V1lgamma1; + case BSIM3v1_MOD_LGAMMA1: + value->rValue = model->BSIM3v1lgamma1; return(OK); - case BSIM3V1_MOD_LGAMMA2: - value->rValue = model->BSIM3V1lgamma2; + case BSIM3v1_MOD_LGAMMA2: + value->rValue = model->BSIM3v1lgamma2; return(OK); - case BSIM3V1_MOD_LVBX: - value->rValue = model->BSIM3V1lvbx; + case BSIM3v1_MOD_LVBX: + value->rValue = model->BSIM3v1lvbx; return(OK); - case BSIM3V1_MOD_LVBM: - value->rValue = model->BSIM3V1lvbm; + case BSIM3v1_MOD_LVBM: + value->rValue = model->BSIM3v1lvbm; return(OK); - case BSIM3V1_MOD_LXT: - value->rValue = model->BSIM3V1lxt; + case BSIM3v1_MOD_LXT: + value->rValue = model->BSIM3v1lxt; return(OK); - case BSIM3V1_MOD_LK1: - value->rValue = model->BSIM3V1lk1; + case BSIM3v1_MOD_LK1: + value->rValue = model->BSIM3v1lk1; return(OK); - case BSIM3V1_MOD_LKT1: - value->rValue = model->BSIM3V1lkt1; + case BSIM3v1_MOD_LKT1: + value->rValue = model->BSIM3v1lkt1; return(OK); - case BSIM3V1_MOD_LKT1L: - value->rValue = model->BSIM3V1lkt1l; + case BSIM3v1_MOD_LKT1L: + value->rValue = model->BSIM3v1lkt1l; return(OK); - case BSIM3V1_MOD_LKT2 : - value->rValue = model->BSIM3V1lkt2; + case BSIM3v1_MOD_LKT2 : + value->rValue = model->BSIM3v1lkt2; return(OK); - case BSIM3V1_MOD_LK2 : - value->rValue = model->BSIM3V1lk2; + case BSIM3v1_MOD_LK2 : + value->rValue = model->BSIM3v1lk2; return(OK); - case BSIM3V1_MOD_LK3: - value->rValue = model->BSIM3V1lk3; + case BSIM3v1_MOD_LK3: + value->rValue = model->BSIM3v1lk3; return(OK); - case BSIM3V1_MOD_LK3B: - value->rValue = model->BSIM3V1lk3b; + case BSIM3v1_MOD_LK3B: + value->rValue = model->BSIM3v1lk3b; return(OK); - case BSIM3V1_MOD_LW0: - value->rValue = model->BSIM3V1lw0; + case BSIM3v1_MOD_LW0: + value->rValue = model->BSIM3v1lw0; return(OK); - case BSIM3V1_MOD_LNLX: - value->rValue = model->BSIM3V1lnlx; + case BSIM3v1_MOD_LNLX: + value->rValue = model->BSIM3v1lnlx; return(OK); - case BSIM3V1_MOD_LDVT0: - value->rValue = model->BSIM3V1ldvt0; + case BSIM3v1_MOD_LDVT0: + value->rValue = model->BSIM3v1ldvt0; return(OK); - case BSIM3V1_MOD_LDVT1 : - value->rValue = model->BSIM3V1ldvt1; + case BSIM3v1_MOD_LDVT1 : + value->rValue = model->BSIM3v1ldvt1; return(OK); - case BSIM3V1_MOD_LDVT2 : - value->rValue = model->BSIM3V1ldvt2; + case BSIM3v1_MOD_LDVT2 : + value->rValue = model->BSIM3v1ldvt2; return(OK); - case BSIM3V1_MOD_LDVT0W : - value->rValue = model->BSIM3V1ldvt0w; + case BSIM3v1_MOD_LDVT0W : + value->rValue = model->BSIM3v1ldvt0w; return(OK); - case BSIM3V1_MOD_LDVT1W : - value->rValue = model->BSIM3V1ldvt1w; + case BSIM3v1_MOD_LDVT1W : + value->rValue = model->BSIM3v1ldvt1w; return(OK); - case BSIM3V1_MOD_LDVT2W : - value->rValue = model->BSIM3V1ldvt2w; + case BSIM3v1_MOD_LDVT2W : + value->rValue = model->BSIM3v1ldvt2w; return(OK); - case BSIM3V1_MOD_LDROUT : - value->rValue = model->BSIM3V1ldrout; + case BSIM3v1_MOD_LDROUT : + value->rValue = model->BSIM3v1ldrout; return(OK); - case BSIM3V1_MOD_LDSUB : - value->rValue = model->BSIM3V1ldsub; + case BSIM3v1_MOD_LDSUB : + value->rValue = model->BSIM3v1ldsub; return(OK); - case BSIM3V1_MOD_LVTH0: - value->rValue = model->BSIM3V1lvth0; + case BSIM3v1_MOD_LVTH0: + value->rValue = model->BSIM3v1lvth0; return(OK); - case BSIM3V1_MOD_LUA: - value->rValue = model->BSIM3V1lua; + case BSIM3v1_MOD_LUA: + value->rValue = model->BSIM3v1lua; return(OK); - case BSIM3V1_MOD_LUA1: - value->rValue = model->BSIM3V1lua1; + case BSIM3v1_MOD_LUA1: + value->rValue = model->BSIM3v1lua1; return(OK); - case BSIM3V1_MOD_LUB: - value->rValue = model->BSIM3V1lub; + case BSIM3v1_MOD_LUB: + value->rValue = model->BSIM3v1lub; return(OK); - case BSIM3V1_MOD_LUB1: - value->rValue = model->BSIM3V1lub1; + case BSIM3v1_MOD_LUB1: + value->rValue = model->BSIM3v1lub1; return(OK); - case BSIM3V1_MOD_LUC: - value->rValue = model->BSIM3V1luc; + case BSIM3v1_MOD_LUC: + value->rValue = model->BSIM3v1luc; return(OK); - case BSIM3V1_MOD_LUC1: - value->rValue = model->BSIM3V1luc1; + case BSIM3v1_MOD_LUC1: + value->rValue = model->BSIM3v1luc1; return(OK); - case BSIM3V1_MOD_LU0: - value->rValue = model->BSIM3V1lu0; + case BSIM3v1_MOD_LU0: + value->rValue = model->BSIM3v1lu0; return(OK); - case BSIM3V1_MOD_LUTE: - value->rValue = model->BSIM3V1lute; + case BSIM3v1_MOD_LUTE: + value->rValue = model->BSIM3v1lute; return(OK); - case BSIM3V1_MOD_LVOFF: - value->rValue = model->BSIM3V1lvoff; + case BSIM3v1_MOD_LVOFF: + value->rValue = model->BSIM3v1lvoff; return(OK); - case BSIM3V1_MOD_LDELTA: - value->rValue = model->BSIM3V1ldelta; + case BSIM3v1_MOD_LDELTA: + value->rValue = model->BSIM3v1ldelta; return(OK); - case BSIM3V1_MOD_LRDSW: - value->rValue = model->BSIM3V1lrdsw; + case BSIM3v1_MOD_LRDSW: + value->rValue = model->BSIM3v1lrdsw; return(OK); - case BSIM3V1_MOD_LPRWB: - value->rValue = model->BSIM3V1lprwb; + case BSIM3v1_MOD_LPRWB: + value->rValue = model->BSIM3v1lprwb; return(OK); - case BSIM3V1_MOD_LPRWG: - value->rValue = model->BSIM3V1lprwg; + case BSIM3v1_MOD_LPRWG: + value->rValue = model->BSIM3v1lprwg; return(OK); - case BSIM3V1_MOD_LPRT: - value->rValue = model->BSIM3V1lprt; + case BSIM3v1_MOD_LPRT: + value->rValue = model->BSIM3v1lprt; return(OK); - case BSIM3V1_MOD_LETA0: - value->rValue = model->BSIM3V1leta0; + case BSIM3v1_MOD_LETA0: + value->rValue = model->BSIM3v1leta0; return(OK); - case BSIM3V1_MOD_LETAB: - value->rValue = model->BSIM3V1letab; + case BSIM3v1_MOD_LETAB: + value->rValue = model->BSIM3v1letab; return(OK); - case BSIM3V1_MOD_LPCLM: - value->rValue = model->BSIM3V1lpclm; + case BSIM3v1_MOD_LPCLM: + value->rValue = model->BSIM3v1lpclm; return(OK); - case BSIM3V1_MOD_LPDIBL1: - value->rValue = model->BSIM3V1lpdibl1; + case BSIM3v1_MOD_LPDIBL1: + value->rValue = model->BSIM3v1lpdibl1; return(OK); - case BSIM3V1_MOD_LPDIBL2: - value->rValue = model->BSIM3V1lpdibl2; + case BSIM3v1_MOD_LPDIBL2: + value->rValue = model->BSIM3v1lpdibl2; return(OK); - case BSIM3V1_MOD_LPDIBLB: - value->rValue = model->BSIM3V1lpdiblb; + case BSIM3v1_MOD_LPDIBLB: + value->rValue = model->BSIM3v1lpdiblb; return(OK); - case BSIM3V1_MOD_LPSCBE1: - value->rValue = model->BSIM3V1lpscbe1; + case BSIM3v1_MOD_LPSCBE1: + value->rValue = model->BSIM3v1lpscbe1; return(OK); - case BSIM3V1_MOD_LPSCBE2: - value->rValue = model->BSIM3V1lpscbe2; + case BSIM3v1_MOD_LPSCBE2: + value->rValue = model->BSIM3v1lpscbe2; return(OK); - case BSIM3V1_MOD_LPVAG: - value->rValue = model->BSIM3V1lpvag; + case BSIM3v1_MOD_LPVAG: + value->rValue = model->BSIM3v1lpvag; return(OK); - case BSIM3V1_MOD_LWR: - value->rValue = model->BSIM3V1lwr; + case BSIM3v1_MOD_LWR: + value->rValue = model->BSIM3v1lwr; return(OK); - case BSIM3V1_MOD_LDWG: - value->rValue = model->BSIM3V1ldwg; + case BSIM3v1_MOD_LDWG: + value->rValue = model->BSIM3v1ldwg; return(OK); - case BSIM3V1_MOD_LDWB: - value->rValue = model->BSIM3V1ldwb; + case BSIM3v1_MOD_LDWB: + value->rValue = model->BSIM3v1ldwb; return(OK); - case BSIM3V1_MOD_LB0: - value->rValue = model->BSIM3V1lb0; + case BSIM3v1_MOD_LB0: + value->rValue = model->BSIM3v1lb0; return(OK); - case BSIM3V1_MOD_LB1: - value->rValue = model->BSIM3V1lb1; + case BSIM3v1_MOD_LB1: + value->rValue = model->BSIM3v1lb1; return(OK); - case BSIM3V1_MOD_LALPHA0: - value->rValue = model->BSIM3V1lalpha0; + case BSIM3v1_MOD_LALPHA0: + value->rValue = model->BSIM3v1lalpha0; return(OK); - case BSIM3V1_MOD_LBETA0: - value->rValue = model->BSIM3V1lbeta0; + case BSIM3v1_MOD_LBETA0: + value->rValue = model->BSIM3v1lbeta0; return(OK); - case BSIM3V1_MOD_LELM: - value->rValue = model->BSIM3V1lelm; + case BSIM3v1_MOD_LELM: + value->rValue = model->BSIM3v1lelm; return(OK); - case BSIM3V1_MOD_LCGSL: - value->rValue = model->BSIM3V1lcgsl; + case BSIM3v1_MOD_LCGSL: + value->rValue = model->BSIM3v1lcgsl; return(OK); - case BSIM3V1_MOD_LCGDL: - value->rValue = model->BSIM3V1lcgdl; + case BSIM3v1_MOD_LCGDL: + value->rValue = model->BSIM3v1lcgdl; return(OK); - case BSIM3V1_MOD_LCKAPPA: - value->rValue = model->BSIM3V1lckappa; + case BSIM3v1_MOD_LCKAPPA: + value->rValue = model->BSIM3v1lckappa; return(OK); - case BSIM3V1_MOD_LCF: - value->rValue = model->BSIM3V1lcf; + case BSIM3v1_MOD_LCF: + value->rValue = model->BSIM3v1lcf; return(OK); - case BSIM3V1_MOD_LCLC: - value->rValue = model->BSIM3V1lclc; + case BSIM3v1_MOD_LCLC: + value->rValue = model->BSIM3v1lclc; return(OK); - case BSIM3V1_MOD_LCLE: - value->rValue = model->BSIM3V1lcle; + case BSIM3v1_MOD_LCLE: + value->rValue = model->BSIM3v1lcle; return(OK); - case BSIM3V1_MOD_LVFBCV: - value->rValue = model->BSIM3V1lvfbcv; + case BSIM3v1_MOD_LVFBCV: + value->rValue = model->BSIM3v1lvfbcv; return(OK); /* Width dependence */ - case BSIM3V1_MOD_WCDSC : - value->rValue = model->BSIM3V1wcdsc; + case BSIM3v1_MOD_WCDSC : + value->rValue = model->BSIM3v1wcdsc; return(OK); - case BSIM3V1_MOD_WCDSCB : - value->rValue = model->BSIM3V1wcdscb; + case BSIM3v1_MOD_WCDSCB : + value->rValue = model->BSIM3v1wcdscb; return(OK); - case BSIM3V1_MOD_WCDSCD : - value->rValue = model->BSIM3V1wcdscd; + case BSIM3v1_MOD_WCDSCD : + value->rValue = model->BSIM3v1wcdscd; return(OK); - case BSIM3V1_MOD_WCIT : - value->rValue = model->BSIM3V1wcit; + case BSIM3v1_MOD_WCIT : + value->rValue = model->BSIM3v1wcit; return(OK); - case BSIM3V1_MOD_WNFACTOR : - value->rValue = model->BSIM3V1wnfactor; + case BSIM3v1_MOD_WNFACTOR : + value->rValue = model->BSIM3v1wnfactor; return(OK); - case BSIM3V1_MOD_WXJ: - value->rValue = model->BSIM3V1wxj; + case BSIM3v1_MOD_WXJ: + value->rValue = model->BSIM3v1wxj; return(OK); - case BSIM3V1_MOD_WVSAT: - value->rValue = model->BSIM3V1wvsat; + case BSIM3v1_MOD_WVSAT: + value->rValue = model->BSIM3v1wvsat; return(OK); - case BSIM3V1_MOD_WAT: - value->rValue = model->BSIM3V1wat; + case BSIM3v1_MOD_WAT: + value->rValue = model->BSIM3v1wat; return(OK); - case BSIM3V1_MOD_WA0: - value->rValue = model->BSIM3V1wa0; + case BSIM3v1_MOD_WA0: + value->rValue = model->BSIM3v1wa0; return(OK); - case BSIM3V1_MOD_WAGS: - value->rValue = model->BSIM3V1wags; + case BSIM3v1_MOD_WAGS: + value->rValue = model->BSIM3v1wags; return(OK); - case BSIM3V1_MOD_WA1: - value->rValue = model->BSIM3V1wa1; + case BSIM3v1_MOD_WA1: + value->rValue = model->BSIM3v1wa1; return(OK); - case BSIM3V1_MOD_WA2: - value->rValue = model->BSIM3V1wa2; + case BSIM3v1_MOD_WA2: + value->rValue = model->BSIM3v1wa2; return(OK); - case BSIM3V1_MOD_WKETA: - value->rValue = model->BSIM3V1wketa; + case BSIM3v1_MOD_WKETA: + value->rValue = model->BSIM3v1wketa; return(OK); - case BSIM3V1_MOD_WNSUB: - value->rValue = model->BSIM3V1wnsub; + case BSIM3v1_MOD_WNSUB: + value->rValue = model->BSIM3v1wnsub; return(OK); - case BSIM3V1_MOD_WNPEAK: - value->rValue = model->BSIM3V1wnpeak; + case BSIM3v1_MOD_WNPEAK: + value->rValue = model->BSIM3v1wnpeak; return(OK); - case BSIM3V1_MOD_WNGATE: - value->rValue = model->BSIM3V1wngate; + case BSIM3v1_MOD_WNGATE: + value->rValue = model->BSIM3v1wngate; return(OK); - case BSIM3V1_MOD_WGAMMA1: - value->rValue = model->BSIM3V1wgamma1; + case BSIM3v1_MOD_WGAMMA1: + value->rValue = model->BSIM3v1wgamma1; return(OK); - case BSIM3V1_MOD_WGAMMA2: - value->rValue = model->BSIM3V1wgamma2; + case BSIM3v1_MOD_WGAMMA2: + value->rValue = model->BSIM3v1wgamma2; return(OK); - case BSIM3V1_MOD_WVBX: - value->rValue = model->BSIM3V1wvbx; + case BSIM3v1_MOD_WVBX: + value->rValue = model->BSIM3v1wvbx; return(OK); - case BSIM3V1_MOD_WVBM: - value->rValue = model->BSIM3V1wvbm; + case BSIM3v1_MOD_WVBM: + value->rValue = model->BSIM3v1wvbm; return(OK); - case BSIM3V1_MOD_WXT: - value->rValue = model->BSIM3V1wxt; + case BSIM3v1_MOD_WXT: + value->rValue = model->BSIM3v1wxt; return(OK); - case BSIM3V1_MOD_WK1: - value->rValue = model->BSIM3V1wk1; + case BSIM3v1_MOD_WK1: + value->rValue = model->BSIM3v1wk1; return(OK); - case BSIM3V1_MOD_WKT1: - value->rValue = model->BSIM3V1wkt1; + case BSIM3v1_MOD_WKT1: + value->rValue = model->BSIM3v1wkt1; return(OK); - case BSIM3V1_MOD_WKT1L: - value->rValue = model->BSIM3V1wkt1l; + case BSIM3v1_MOD_WKT1L: + value->rValue = model->BSIM3v1wkt1l; return(OK); - case BSIM3V1_MOD_WKT2 : - value->rValue = model->BSIM3V1wkt2; + case BSIM3v1_MOD_WKT2 : + value->rValue = model->BSIM3v1wkt2; return(OK); - case BSIM3V1_MOD_WK2 : - value->rValue = model->BSIM3V1wk2; + case BSIM3v1_MOD_WK2 : + value->rValue = model->BSIM3v1wk2; return(OK); - case BSIM3V1_MOD_WK3: - value->rValue = model->BSIM3V1wk3; + case BSIM3v1_MOD_WK3: + value->rValue = model->BSIM3v1wk3; return(OK); - case BSIM3V1_MOD_WK3B: - value->rValue = model->BSIM3V1wk3b; + case BSIM3v1_MOD_WK3B: + value->rValue = model->BSIM3v1wk3b; return(OK); - case BSIM3V1_MOD_WW0: - value->rValue = model->BSIM3V1ww0; + case BSIM3v1_MOD_WW0: + value->rValue = model->BSIM3v1ww0; return(OK); - case BSIM3V1_MOD_WNLX: - value->rValue = model->BSIM3V1wnlx; + case BSIM3v1_MOD_WNLX: + value->rValue = model->BSIM3v1wnlx; return(OK); - case BSIM3V1_MOD_WDVT0: - value->rValue = model->BSIM3V1wdvt0; + case BSIM3v1_MOD_WDVT0: + value->rValue = model->BSIM3v1wdvt0; return(OK); - case BSIM3V1_MOD_WDVT1 : - value->rValue = model->BSIM3V1wdvt1; + case BSIM3v1_MOD_WDVT1 : + value->rValue = model->BSIM3v1wdvt1; return(OK); - case BSIM3V1_MOD_WDVT2 : - value->rValue = model->BSIM3V1wdvt2; + case BSIM3v1_MOD_WDVT2 : + value->rValue = model->BSIM3v1wdvt2; return(OK); - case BSIM3V1_MOD_WDVT0W : - value->rValue = model->BSIM3V1wdvt0w; + case BSIM3v1_MOD_WDVT0W : + value->rValue = model->BSIM3v1wdvt0w; return(OK); - case BSIM3V1_MOD_WDVT1W : - value->rValue = model->BSIM3V1wdvt1w; + case BSIM3v1_MOD_WDVT1W : + value->rValue = model->BSIM3v1wdvt1w; return(OK); - case BSIM3V1_MOD_WDVT2W : - value->rValue = model->BSIM3V1wdvt2w; + case BSIM3v1_MOD_WDVT2W : + value->rValue = model->BSIM3v1wdvt2w; return(OK); - case BSIM3V1_MOD_WDROUT : - value->rValue = model->BSIM3V1wdrout; + case BSIM3v1_MOD_WDROUT : + value->rValue = model->BSIM3v1wdrout; return(OK); - case BSIM3V1_MOD_WDSUB : - value->rValue = model->BSIM3V1wdsub; + case BSIM3v1_MOD_WDSUB : + value->rValue = model->BSIM3v1wdsub; return(OK); - case BSIM3V1_MOD_WVTH0: - value->rValue = model->BSIM3V1wvth0; + case BSIM3v1_MOD_WVTH0: + value->rValue = model->BSIM3v1wvth0; return(OK); - case BSIM3V1_MOD_WUA: - value->rValue = model->BSIM3V1wua; + case BSIM3v1_MOD_WUA: + value->rValue = model->BSIM3v1wua; return(OK); - case BSIM3V1_MOD_WUA1: - value->rValue = model->BSIM3V1wua1; + case BSIM3v1_MOD_WUA1: + value->rValue = model->BSIM3v1wua1; return(OK); - case BSIM3V1_MOD_WUB: - value->rValue = model->BSIM3V1wub; + case BSIM3v1_MOD_WUB: + value->rValue = model->BSIM3v1wub; return(OK); - case BSIM3V1_MOD_WUB1: - value->rValue = model->BSIM3V1wub1; + case BSIM3v1_MOD_WUB1: + value->rValue = model->BSIM3v1wub1; return(OK); - case BSIM3V1_MOD_WUC: - value->rValue = model->BSIM3V1wuc; + case BSIM3v1_MOD_WUC: + value->rValue = model->BSIM3v1wuc; return(OK); - case BSIM3V1_MOD_WUC1: - value->rValue = model->BSIM3V1wuc1; + case BSIM3v1_MOD_WUC1: + value->rValue = model->BSIM3v1wuc1; return(OK); - case BSIM3V1_MOD_WU0: - value->rValue = model->BSIM3V1wu0; + case BSIM3v1_MOD_WU0: + value->rValue = model->BSIM3v1wu0; return(OK); - case BSIM3V1_MOD_WUTE: - value->rValue = model->BSIM3V1wute; + case BSIM3v1_MOD_WUTE: + value->rValue = model->BSIM3v1wute; return(OK); - case BSIM3V1_MOD_WVOFF: - value->rValue = model->BSIM3V1wvoff; + case BSIM3v1_MOD_WVOFF: + value->rValue = model->BSIM3v1wvoff; return(OK); - case BSIM3V1_MOD_WDELTA: - value->rValue = model->BSIM3V1wdelta; + case BSIM3v1_MOD_WDELTA: + value->rValue = model->BSIM3v1wdelta; return(OK); - case BSIM3V1_MOD_WRDSW: - value->rValue = model->BSIM3V1wrdsw; + case BSIM3v1_MOD_WRDSW: + value->rValue = model->BSIM3v1wrdsw; return(OK); - case BSIM3V1_MOD_WPRWB: - value->rValue = model->BSIM3V1wprwb; + case BSIM3v1_MOD_WPRWB: + value->rValue = model->BSIM3v1wprwb; return(OK); - case BSIM3V1_MOD_WPRWG: - value->rValue = model->BSIM3V1wprwg; + case BSIM3v1_MOD_WPRWG: + value->rValue = model->BSIM3v1wprwg; return(OK); - case BSIM3V1_MOD_WPRT: - value->rValue = model->BSIM3V1wprt; + case BSIM3v1_MOD_WPRT: + value->rValue = model->BSIM3v1wprt; return(OK); - case BSIM3V1_MOD_WETA0: - value->rValue = model->BSIM3V1weta0; + case BSIM3v1_MOD_WETA0: + value->rValue = model->BSIM3v1weta0; return(OK); - case BSIM3V1_MOD_WETAB: - value->rValue = model->BSIM3V1wetab; + case BSIM3v1_MOD_WETAB: + value->rValue = model->BSIM3v1wetab; return(OK); - case BSIM3V1_MOD_WPCLM: - value->rValue = model->BSIM3V1wpclm; + case BSIM3v1_MOD_WPCLM: + value->rValue = model->BSIM3v1wpclm; return(OK); - case BSIM3V1_MOD_WPDIBL1: - value->rValue = model->BSIM3V1wpdibl1; + case BSIM3v1_MOD_WPDIBL1: + value->rValue = model->BSIM3v1wpdibl1; return(OK); - case BSIM3V1_MOD_WPDIBL2: - value->rValue = model->BSIM3V1wpdibl2; + case BSIM3v1_MOD_WPDIBL2: + value->rValue = model->BSIM3v1wpdibl2; return(OK); - case BSIM3V1_MOD_WPDIBLB: - value->rValue = model->BSIM3V1wpdiblb; + case BSIM3v1_MOD_WPDIBLB: + value->rValue = model->BSIM3v1wpdiblb; return(OK); - case BSIM3V1_MOD_WPSCBE1: - value->rValue = model->BSIM3V1wpscbe1; + case BSIM3v1_MOD_WPSCBE1: + value->rValue = model->BSIM3v1wpscbe1; return(OK); - case BSIM3V1_MOD_WPSCBE2: - value->rValue = model->BSIM3V1wpscbe2; + case BSIM3v1_MOD_WPSCBE2: + value->rValue = model->BSIM3v1wpscbe2; return(OK); - case BSIM3V1_MOD_WPVAG: - value->rValue = model->BSIM3V1wpvag; + case BSIM3v1_MOD_WPVAG: + value->rValue = model->BSIM3v1wpvag; return(OK); - case BSIM3V1_MOD_WWR: - value->rValue = model->BSIM3V1wwr; + case BSIM3v1_MOD_WWR: + value->rValue = model->BSIM3v1wwr; return(OK); - case BSIM3V1_MOD_WDWG: - value->rValue = model->BSIM3V1wdwg; + case BSIM3v1_MOD_WDWG: + value->rValue = model->BSIM3v1wdwg; return(OK); - case BSIM3V1_MOD_WDWB: - value->rValue = model->BSIM3V1wdwb; + case BSIM3v1_MOD_WDWB: + value->rValue = model->BSIM3v1wdwb; return(OK); - case BSIM3V1_MOD_WB0: - value->rValue = model->BSIM3V1wb0; + case BSIM3v1_MOD_WB0: + value->rValue = model->BSIM3v1wb0; return(OK); - case BSIM3V1_MOD_WB1: - value->rValue = model->BSIM3V1wb1; + case BSIM3v1_MOD_WB1: + value->rValue = model->BSIM3v1wb1; return(OK); - case BSIM3V1_MOD_WALPHA0: - value->rValue = model->BSIM3V1walpha0; + case BSIM3v1_MOD_WALPHA0: + value->rValue = model->BSIM3v1walpha0; return(OK); - case BSIM3V1_MOD_WBETA0: - value->rValue = model->BSIM3V1wbeta0; + case BSIM3v1_MOD_WBETA0: + value->rValue = model->BSIM3v1wbeta0; return(OK); - case BSIM3V1_MOD_WELM: - value->rValue = model->BSIM3V1welm; + case BSIM3v1_MOD_WELM: + value->rValue = model->BSIM3v1welm; return(OK); - case BSIM3V1_MOD_WCGSL: - value->rValue = model->BSIM3V1wcgsl; + case BSIM3v1_MOD_WCGSL: + value->rValue = model->BSIM3v1wcgsl; return(OK); - case BSIM3V1_MOD_WCGDL: - value->rValue = model->BSIM3V1wcgdl; + case BSIM3v1_MOD_WCGDL: + value->rValue = model->BSIM3v1wcgdl; return(OK); - case BSIM3V1_MOD_WCKAPPA: - value->rValue = model->BSIM3V1wckappa; + case BSIM3v1_MOD_WCKAPPA: + value->rValue = model->BSIM3v1wckappa; return(OK); - case BSIM3V1_MOD_WCF: - value->rValue = model->BSIM3V1wcf; + case BSIM3v1_MOD_WCF: + value->rValue = model->BSIM3v1wcf; return(OK); - case BSIM3V1_MOD_WCLC: - value->rValue = model->BSIM3V1wclc; + case BSIM3v1_MOD_WCLC: + value->rValue = model->BSIM3v1wclc; return(OK); - case BSIM3V1_MOD_WCLE: - value->rValue = model->BSIM3V1wcle; + case BSIM3v1_MOD_WCLE: + value->rValue = model->BSIM3v1wcle; return(OK); - case BSIM3V1_MOD_WVFBCV: - value->rValue = model->BSIM3V1wvfbcv; + case BSIM3v1_MOD_WVFBCV: + value->rValue = model->BSIM3v1wvfbcv; return(OK); /* Cross-term dependence */ - case BSIM3V1_MOD_PCDSC : - value->rValue = model->BSIM3V1pcdsc; + case BSIM3v1_MOD_PCDSC : + value->rValue = model->BSIM3v1pcdsc; return(OK); - case BSIM3V1_MOD_PCDSCB : - value->rValue = model->BSIM3V1pcdscb; + case BSIM3v1_MOD_PCDSCB : + value->rValue = model->BSIM3v1pcdscb; return(OK); - case BSIM3V1_MOD_PCDSCD : - value->rValue = model->BSIM3V1pcdscd; + case BSIM3v1_MOD_PCDSCD : + value->rValue = model->BSIM3v1pcdscd; return(OK); - case BSIM3V1_MOD_PCIT : - value->rValue = model->BSIM3V1pcit; + case BSIM3v1_MOD_PCIT : + value->rValue = model->BSIM3v1pcit; return(OK); - case BSIM3V1_MOD_PNFACTOR : - value->rValue = model->BSIM3V1pnfactor; + case BSIM3v1_MOD_PNFACTOR : + value->rValue = model->BSIM3v1pnfactor; return(OK); - case BSIM3V1_MOD_PXJ: - value->rValue = model->BSIM3V1pxj; + case BSIM3v1_MOD_PXJ: + value->rValue = model->BSIM3v1pxj; return(OK); - case BSIM3V1_MOD_PVSAT: - value->rValue = model->BSIM3V1pvsat; + case BSIM3v1_MOD_PVSAT: + value->rValue = model->BSIM3v1pvsat; return(OK); - case BSIM3V1_MOD_PAT: - value->rValue = model->BSIM3V1pat; + case BSIM3v1_MOD_PAT: + value->rValue = model->BSIM3v1pat; return(OK); - case BSIM3V1_MOD_PA0: - value->rValue = model->BSIM3V1pa0; + case BSIM3v1_MOD_PA0: + value->rValue = model->BSIM3v1pa0; return(OK); - case BSIM3V1_MOD_PAGS: - value->rValue = model->BSIM3V1pags; + case BSIM3v1_MOD_PAGS: + value->rValue = model->BSIM3v1pags; return(OK); - case BSIM3V1_MOD_PA1: - value->rValue = model->BSIM3V1pa1; + case BSIM3v1_MOD_PA1: + value->rValue = model->BSIM3v1pa1; return(OK); - case BSIM3V1_MOD_PA2: - value->rValue = model->BSIM3V1pa2; + case BSIM3v1_MOD_PA2: + value->rValue = model->BSIM3v1pa2; return(OK); - case BSIM3V1_MOD_PKETA: - value->rValue = model->BSIM3V1pketa; + case BSIM3v1_MOD_PKETA: + value->rValue = model->BSIM3v1pketa; return(OK); - case BSIM3V1_MOD_PNSUB: - value->rValue = model->BSIM3V1pnsub; + case BSIM3v1_MOD_PNSUB: + value->rValue = model->BSIM3v1pnsub; return(OK); - case BSIM3V1_MOD_PNPEAK: - value->rValue = model->BSIM3V1pnpeak; + case BSIM3v1_MOD_PNPEAK: + value->rValue = model->BSIM3v1pnpeak; return(OK); - case BSIM3V1_MOD_PNGATE: - value->rValue = model->BSIM3V1pngate; + case BSIM3v1_MOD_PNGATE: + value->rValue = model->BSIM3v1pngate; return(OK); - case BSIM3V1_MOD_PGAMMA1: - value->rValue = model->BSIM3V1pgamma1; + case BSIM3v1_MOD_PGAMMA1: + value->rValue = model->BSIM3v1pgamma1; return(OK); - case BSIM3V1_MOD_PGAMMA2: - value->rValue = model->BSIM3V1pgamma2; + case BSIM3v1_MOD_PGAMMA2: + value->rValue = model->BSIM3v1pgamma2; return(OK); - case BSIM3V1_MOD_PVBX: - value->rValue = model->BSIM3V1pvbx; + case BSIM3v1_MOD_PVBX: + value->rValue = model->BSIM3v1pvbx; return(OK); - case BSIM3V1_MOD_PVBM: - value->rValue = model->BSIM3V1pvbm; + case BSIM3v1_MOD_PVBM: + value->rValue = model->BSIM3v1pvbm; return(OK); - case BSIM3V1_MOD_PXT: - value->rValue = model->BSIM3V1pxt; + case BSIM3v1_MOD_PXT: + value->rValue = model->BSIM3v1pxt; return(OK); - case BSIM3V1_MOD_PK1: - value->rValue = model->BSIM3V1pk1; + case BSIM3v1_MOD_PK1: + value->rValue = model->BSIM3v1pk1; return(OK); - case BSIM3V1_MOD_PKT1: - value->rValue = model->BSIM3V1pkt1; + case BSIM3v1_MOD_PKT1: + value->rValue = model->BSIM3v1pkt1; return(OK); - case BSIM3V1_MOD_PKT1L: - value->rValue = model->BSIM3V1pkt1l; + case BSIM3v1_MOD_PKT1L: + value->rValue = model->BSIM3v1pkt1l; return(OK); - case BSIM3V1_MOD_PKT2 : - value->rValue = model->BSIM3V1pkt2; + case BSIM3v1_MOD_PKT2 : + value->rValue = model->BSIM3v1pkt2; return(OK); - case BSIM3V1_MOD_PK2 : - value->rValue = model->BSIM3V1pk2; + case BSIM3v1_MOD_PK2 : + value->rValue = model->BSIM3v1pk2; return(OK); - case BSIM3V1_MOD_PK3: - value->rValue = model->BSIM3V1pk3; + case BSIM3v1_MOD_PK3: + value->rValue = model->BSIM3v1pk3; return(OK); - case BSIM3V1_MOD_PK3B: - value->rValue = model->BSIM3V1pk3b; + case BSIM3v1_MOD_PK3B: + value->rValue = model->BSIM3v1pk3b; return(OK); - case BSIM3V1_MOD_PW0: - value->rValue = model->BSIM3V1pw0; + case BSIM3v1_MOD_PW0: + value->rValue = model->BSIM3v1pw0; return(OK); - case BSIM3V1_MOD_PNLX: - value->rValue = model->BSIM3V1pnlx; + case BSIM3v1_MOD_PNLX: + value->rValue = model->BSIM3v1pnlx; return(OK); - case BSIM3V1_MOD_PDVT0 : - value->rValue = model->BSIM3V1pdvt0; + case BSIM3v1_MOD_PDVT0 : + value->rValue = model->BSIM3v1pdvt0; return(OK); - case BSIM3V1_MOD_PDVT1 : - value->rValue = model->BSIM3V1pdvt1; + case BSIM3v1_MOD_PDVT1 : + value->rValue = model->BSIM3v1pdvt1; return(OK); - case BSIM3V1_MOD_PDVT2 : - value->rValue = model->BSIM3V1pdvt2; + case BSIM3v1_MOD_PDVT2 : + value->rValue = model->BSIM3v1pdvt2; return(OK); - case BSIM3V1_MOD_PDVT0W : - value->rValue = model->BSIM3V1pdvt0w; + case BSIM3v1_MOD_PDVT0W : + value->rValue = model->BSIM3v1pdvt0w; return(OK); - case BSIM3V1_MOD_PDVT1W : - value->rValue = model->BSIM3V1pdvt1w; + case BSIM3v1_MOD_PDVT1W : + value->rValue = model->BSIM3v1pdvt1w; return(OK); - case BSIM3V1_MOD_PDVT2W : - value->rValue = model->BSIM3V1pdvt2w; + case BSIM3v1_MOD_PDVT2W : + value->rValue = model->BSIM3v1pdvt2w; return(OK); - case BSIM3V1_MOD_PDROUT : - value->rValue = model->BSIM3V1pdrout; + case BSIM3v1_MOD_PDROUT : + value->rValue = model->BSIM3v1pdrout; return(OK); - case BSIM3V1_MOD_PDSUB : - value->rValue = model->BSIM3V1pdsub; + case BSIM3v1_MOD_PDSUB : + value->rValue = model->BSIM3v1pdsub; return(OK); - case BSIM3V1_MOD_PVTH0: - value->rValue = model->BSIM3V1pvth0; + case BSIM3v1_MOD_PVTH0: + value->rValue = model->BSIM3v1pvth0; return(OK); - case BSIM3V1_MOD_PUA: - value->rValue = model->BSIM3V1pua; + case BSIM3v1_MOD_PUA: + value->rValue = model->BSIM3v1pua; return(OK); - case BSIM3V1_MOD_PUA1: - value->rValue = model->BSIM3V1pua1; + case BSIM3v1_MOD_PUA1: + value->rValue = model->BSIM3v1pua1; return(OK); - case BSIM3V1_MOD_PUB: - value->rValue = model->BSIM3V1pub; + case BSIM3v1_MOD_PUB: + value->rValue = model->BSIM3v1pub; return(OK); - case BSIM3V1_MOD_PUB1: - value->rValue = model->BSIM3V1pub1; + case BSIM3v1_MOD_PUB1: + value->rValue = model->BSIM3v1pub1; return(OK); - case BSIM3V1_MOD_PUC: - value->rValue = model->BSIM3V1puc; + case BSIM3v1_MOD_PUC: + value->rValue = model->BSIM3v1puc; return(OK); - case BSIM3V1_MOD_PUC1: - value->rValue = model->BSIM3V1puc1; + case BSIM3v1_MOD_PUC1: + value->rValue = model->BSIM3v1puc1; return(OK); - case BSIM3V1_MOD_PU0: - value->rValue = model->BSIM3V1pu0; + case BSIM3v1_MOD_PU0: + value->rValue = model->BSIM3v1pu0; return(OK); - case BSIM3V1_MOD_PUTE: - value->rValue = model->BSIM3V1pute; + case BSIM3v1_MOD_PUTE: + value->rValue = model->BSIM3v1pute; return(OK); - case BSIM3V1_MOD_PVOFF: - value->rValue = model->BSIM3V1pvoff; + case BSIM3v1_MOD_PVOFF: + value->rValue = model->BSIM3v1pvoff; return(OK); - case BSIM3V1_MOD_PDELTA: - value->rValue = model->BSIM3V1pdelta; + case BSIM3v1_MOD_PDELTA: + value->rValue = model->BSIM3v1pdelta; return(OK); - case BSIM3V1_MOD_PRDSW: - value->rValue = model->BSIM3V1prdsw; + case BSIM3v1_MOD_PRDSW: + value->rValue = model->BSIM3v1prdsw; return(OK); - case BSIM3V1_MOD_PPRWB: - value->rValue = model->BSIM3V1pprwb; + case BSIM3v1_MOD_PPRWB: + value->rValue = model->BSIM3v1pprwb; return(OK); - case BSIM3V1_MOD_PPRWG: - value->rValue = model->BSIM3V1pprwg; + case BSIM3v1_MOD_PPRWG: + value->rValue = model->BSIM3v1pprwg; return(OK); - case BSIM3V1_MOD_PPRT: - value->rValue = model->BSIM3V1pprt; + case BSIM3v1_MOD_PPRT: + value->rValue = model->BSIM3v1pprt; return(OK); - case BSIM3V1_MOD_PETA0: - value->rValue = model->BSIM3V1peta0; + case BSIM3v1_MOD_PETA0: + value->rValue = model->BSIM3v1peta0; return(OK); - case BSIM3V1_MOD_PETAB: - value->rValue = model->BSIM3V1petab; + case BSIM3v1_MOD_PETAB: + value->rValue = model->BSIM3v1petab; return(OK); - case BSIM3V1_MOD_PPCLM: - value->rValue = model->BSIM3V1ppclm; + case BSIM3v1_MOD_PPCLM: + value->rValue = model->BSIM3v1ppclm; return(OK); - case BSIM3V1_MOD_PPDIBL1: - value->rValue = model->BSIM3V1ppdibl1; + case BSIM3v1_MOD_PPDIBL1: + value->rValue = model->BSIM3v1ppdibl1; return(OK); - case BSIM3V1_MOD_PPDIBL2: - value->rValue = model->BSIM3V1ppdibl2; + case BSIM3v1_MOD_PPDIBL2: + value->rValue = model->BSIM3v1ppdibl2; return(OK); - case BSIM3V1_MOD_PPDIBLB: - value->rValue = model->BSIM3V1ppdiblb; + case BSIM3v1_MOD_PPDIBLB: + value->rValue = model->BSIM3v1ppdiblb; return(OK); - case BSIM3V1_MOD_PPSCBE1: - value->rValue = model->BSIM3V1ppscbe1; + case BSIM3v1_MOD_PPSCBE1: + value->rValue = model->BSIM3v1ppscbe1; return(OK); - case BSIM3V1_MOD_PPSCBE2: - value->rValue = model->BSIM3V1ppscbe2; + case BSIM3v1_MOD_PPSCBE2: + value->rValue = model->BSIM3v1ppscbe2; return(OK); - case BSIM3V1_MOD_PPVAG: - value->rValue = model->BSIM3V1ppvag; + case BSIM3v1_MOD_PPVAG: + value->rValue = model->BSIM3v1ppvag; return(OK); - case BSIM3V1_MOD_PWR: - value->rValue = model->BSIM3V1pwr; + case BSIM3v1_MOD_PWR: + value->rValue = model->BSIM3v1pwr; return(OK); - case BSIM3V1_MOD_PDWG: - value->rValue = model->BSIM3V1pdwg; + case BSIM3v1_MOD_PDWG: + value->rValue = model->BSIM3v1pdwg; return(OK); - case BSIM3V1_MOD_PDWB: - value->rValue = model->BSIM3V1pdwb; + case BSIM3v1_MOD_PDWB: + value->rValue = model->BSIM3v1pdwb; return(OK); - case BSIM3V1_MOD_PB0: - value->rValue = model->BSIM3V1pb0; + case BSIM3v1_MOD_PB0: + value->rValue = model->BSIM3v1pb0; return(OK); - case BSIM3V1_MOD_PB1: - value->rValue = model->BSIM3V1pb1; + case BSIM3v1_MOD_PB1: + value->rValue = model->BSIM3v1pb1; return(OK); - case BSIM3V1_MOD_PALPHA0: - value->rValue = model->BSIM3V1palpha0; + case BSIM3v1_MOD_PALPHA0: + value->rValue = model->BSIM3v1palpha0; return(OK); - case BSIM3V1_MOD_PBETA0: - value->rValue = model->BSIM3V1pbeta0; + case BSIM3v1_MOD_PBETA0: + value->rValue = model->BSIM3v1pbeta0; return(OK); - case BSIM3V1_MOD_PELM: - value->rValue = model->BSIM3V1pelm; + case BSIM3v1_MOD_PELM: + value->rValue = model->BSIM3v1pelm; return(OK); - case BSIM3V1_MOD_PCGSL: - value->rValue = model->BSIM3V1pcgsl; + case BSIM3v1_MOD_PCGSL: + value->rValue = model->BSIM3v1pcgsl; return(OK); - case BSIM3V1_MOD_PCGDL: - value->rValue = model->BSIM3V1pcgdl; + case BSIM3v1_MOD_PCGDL: + value->rValue = model->BSIM3v1pcgdl; return(OK); - case BSIM3V1_MOD_PCKAPPA: - value->rValue = model->BSIM3V1pckappa; + case BSIM3v1_MOD_PCKAPPA: + value->rValue = model->BSIM3v1pckappa; return(OK); - case BSIM3V1_MOD_PCF: - value->rValue = model->BSIM3V1pcf; + case BSIM3v1_MOD_PCF: + value->rValue = model->BSIM3v1pcf; return(OK); - case BSIM3V1_MOD_PCLC: - value->rValue = model->BSIM3V1pclc; + case BSIM3v1_MOD_PCLC: + value->rValue = model->BSIM3v1pclc; return(OK); - case BSIM3V1_MOD_PCLE: - value->rValue = model->BSIM3V1pcle; + case BSIM3v1_MOD_PCLE: + value->rValue = model->BSIM3v1pcle; return(OK); - case BSIM3V1_MOD_PVFBCV: - value->rValue = model->BSIM3V1pvfbcv; + case BSIM3v1_MOD_PVFBCV: + value->rValue = model->BSIM3v1pvfbcv; return(OK); - case BSIM3V1_MOD_TNOM : - value->rValue = model->BSIM3V1tnom; + case BSIM3v1_MOD_TNOM : + value->rValue = model->BSIM3v1tnom; return(OK); - case BSIM3V1_MOD_CGSO: - value->rValue = model->BSIM3V1cgso; + case BSIM3v1_MOD_CGSO: + value->rValue = model->BSIM3v1cgso; return(OK); - case BSIM3V1_MOD_CGDO: - value->rValue = model->BSIM3V1cgdo; + case BSIM3v1_MOD_CGDO: + value->rValue = model->BSIM3v1cgdo; return(OK); - case BSIM3V1_MOD_CGBO: - value->rValue = model->BSIM3V1cgbo; + case BSIM3v1_MOD_CGBO: + value->rValue = model->BSIM3v1cgbo; return(OK); - case BSIM3V1_MOD_XPART: - value->rValue = model->BSIM3V1xpart; + case BSIM3v1_MOD_XPART: + value->rValue = model->BSIM3v1xpart; return(OK); - case BSIM3V1_MOD_RSH: - value->rValue = model->BSIM3V1sheetResistance; + case BSIM3v1_MOD_RSH: + value->rValue = model->BSIM3v1sheetResistance; return(OK); - case BSIM3V1_MOD_JS: - value->rValue = model->BSIM3V1jctSatCurDensity; + case BSIM3v1_MOD_JS: + value->rValue = model->BSIM3v1jctSatCurDensity; return(OK); - case BSIM3V1_MOD_JSW: - value->rValue = model->BSIM3V1jctSidewallSatCurDensity; + case BSIM3v1_MOD_JSW: + value->rValue = model->BSIM3v1jctSidewallSatCurDensity; return(OK); - case BSIM3V1_MOD_PB: - value->rValue = model->BSIM3V1bulkJctPotential; + case BSIM3v1_MOD_PB: + value->rValue = model->BSIM3v1bulkJctPotential; return(OK); - case BSIM3V1_MOD_MJ: - value->rValue = model->BSIM3V1bulkJctBotGradingCoeff; + case BSIM3v1_MOD_MJ: + value->rValue = model->BSIM3v1bulkJctBotGradingCoeff; return(OK); - case BSIM3V1_MOD_PBSW: - value->rValue = model->BSIM3V1sidewallJctPotential; + case BSIM3v1_MOD_PBSW: + value->rValue = model->BSIM3v1sidewallJctPotential; return(OK); - case BSIM3V1_MOD_MJSW: - value->rValue = model->BSIM3V1bulkJctSideGradingCoeff; + case BSIM3v1_MOD_MJSW: + value->rValue = model->BSIM3v1bulkJctSideGradingCoeff; return(OK); - case BSIM3V1_MOD_CJ: - value->rValue = model->BSIM3V1unitAreaJctCap; + case BSIM3v1_MOD_CJ: + value->rValue = model->BSIM3v1unitAreaJctCap; return(OK); - case BSIM3V1_MOD_CJSW: - value->rValue = model->BSIM3V1unitLengthSidewallJctCap; + case BSIM3v1_MOD_CJSW: + value->rValue = model->BSIM3v1unitLengthSidewallJctCap; return(OK); - case BSIM3V1_MOD_PBSWG: - value->rValue = model->BSIM3V1GatesidewallJctPotential; + case BSIM3v1_MOD_PBSWG: + value->rValue = model->BSIM3v1GatesidewallJctPotential; return(OK); - case BSIM3V1_MOD_MJSWG: - value->rValue = model->BSIM3V1bulkJctGateSideGradingCoeff; + case BSIM3v1_MOD_MJSWG: + value->rValue = model->BSIM3v1bulkJctGateSideGradingCoeff; return(OK); - case BSIM3V1_MOD_CJSWG: - value->rValue = model->BSIM3V1unitLengthGateSidewallJctCap; + case BSIM3v1_MOD_CJSWG: + value->rValue = model->BSIM3v1unitLengthGateSidewallJctCap; return(OK); - case BSIM3V1_MOD_NJ: - value->rValue = model->BSIM3V1jctEmissionCoeff; + case BSIM3v1_MOD_NJ: + value->rValue = model->BSIM3v1jctEmissionCoeff; return(OK); - case BSIM3V1_MOD_XTI: - value->rValue = model->BSIM3V1jctTempExponent; + case BSIM3v1_MOD_XTI: + value->rValue = model->BSIM3v1jctTempExponent; return(OK); - case BSIM3V1_MOD_LINT: - value->rValue = model->BSIM3V1Lint; + case BSIM3v1_MOD_LINT: + value->rValue = model->BSIM3v1Lint; return(OK); - case BSIM3V1_MOD_LL: - value->rValue = model->BSIM3V1Ll; + case BSIM3v1_MOD_LL: + value->rValue = model->BSIM3v1Ll; return(OK); - case BSIM3V1_MOD_LLN: - value->rValue = model->BSIM3V1Lln; + case BSIM3v1_MOD_LLN: + value->rValue = model->BSIM3v1Lln; return(OK); - case BSIM3V1_MOD_LW: - value->rValue = model->BSIM3V1Lw; + case BSIM3v1_MOD_LW: + value->rValue = model->BSIM3v1Lw; return(OK); - case BSIM3V1_MOD_LWN: - value->rValue = model->BSIM3V1Lwn; + case BSIM3v1_MOD_LWN: + value->rValue = model->BSIM3v1Lwn; return(OK); - case BSIM3V1_MOD_LWL: - value->rValue = model->BSIM3V1Lwl; + case BSIM3v1_MOD_LWL: + value->rValue = model->BSIM3v1Lwl; return(OK); - case BSIM3V1_MOD_LMIN: - value->rValue = model->BSIM3V1Lmin; + case BSIM3v1_MOD_LMIN: + value->rValue = model->BSIM3v1Lmin; return(OK); - case BSIM3V1_MOD_LMAX: - value->rValue = model->BSIM3V1Lmax; + case BSIM3v1_MOD_LMAX: + value->rValue = model->BSIM3v1Lmax; return(OK); - case BSIM3V1_MOD_WINT: - value->rValue = model->BSIM3V1Wint; + case BSIM3v1_MOD_WINT: + value->rValue = model->BSIM3v1Wint; return(OK); - case BSIM3V1_MOD_WL: - value->rValue = model->BSIM3V1Wl; + case BSIM3v1_MOD_WL: + value->rValue = model->BSIM3v1Wl; return(OK); - case BSIM3V1_MOD_WLN: - value->rValue = model->BSIM3V1Wln; + case BSIM3v1_MOD_WLN: + value->rValue = model->BSIM3v1Wln; return(OK); - case BSIM3V1_MOD_WW: - value->rValue = model->BSIM3V1Ww; + case BSIM3v1_MOD_WW: + value->rValue = model->BSIM3v1Ww; return(OK); - case BSIM3V1_MOD_WWN: - value->rValue = model->BSIM3V1Wwn; + case BSIM3v1_MOD_WWN: + value->rValue = model->BSIM3v1Wwn; return(OK); - case BSIM3V1_MOD_WWL: - value->rValue = model->BSIM3V1Wwl; + case BSIM3v1_MOD_WWL: + value->rValue = model->BSIM3v1Wwl; return(OK); - case BSIM3V1_MOD_WMIN: - value->rValue = model->BSIM3V1Wmin; + case BSIM3v1_MOD_WMIN: + value->rValue = model->BSIM3v1Wmin; return(OK); - case BSIM3V1_MOD_WMAX: - value->rValue = model->BSIM3V1Wmax; + case BSIM3v1_MOD_WMAX: + value->rValue = model->BSIM3v1Wmax; return(OK); - case BSIM3V1_MOD_NOIA: - value->rValue = model->BSIM3V1oxideTrapDensityA; + case BSIM3v1_MOD_NOIA: + value->rValue = model->BSIM3v1oxideTrapDensityA; return(OK); - case BSIM3V1_MOD_NOIB: - value->rValue = model->BSIM3V1oxideTrapDensityB; + case BSIM3v1_MOD_NOIB: + value->rValue = model->BSIM3v1oxideTrapDensityB; return(OK); - case BSIM3V1_MOD_NOIC: - value->rValue = model->BSIM3V1oxideTrapDensityC; + case BSIM3v1_MOD_NOIC: + value->rValue = model->BSIM3v1oxideTrapDensityC; return(OK); - case BSIM3V1_MOD_EM: - value->rValue = model->BSIM3V1em; + case BSIM3v1_MOD_EM: + value->rValue = model->BSIM3v1em; return(OK); - case BSIM3V1_MOD_EF: - value->rValue = model->BSIM3V1ef; + case BSIM3v1_MOD_EF: + value->rValue = model->BSIM3v1ef; return(OK); - case BSIM3V1_MOD_AF: - value->rValue = model->BSIM3V1af; + case BSIM3v1_MOD_AF: + value->rValue = model->BSIM3v1af; return(OK); - case BSIM3V1_MOD_KF: - value->rValue = model->BSIM3V1kf; + case BSIM3v1_MOD_KF: + value->rValue = model->BSIM3v1kf; return(OK); default: return(E_BADPARM); diff --git a/src/spicelib/devices/bsim3v1/b3v1mdel.c b/src/spicelib/devices/bsim3v1/b3v1mdel.c index d0262f8d3..776643019 100644 --- a/src/spicelib/devices/bsim3v1/b3v1mdel.c +++ b/src/spicelib/devices/bsim3v1/b3v1mdel.c @@ -1,30 +1,32 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v1mdel.c -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1mdel.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ #include "ngspice.h" -#include #include "bsim3v1def.h" #include "sperror.h" #include "suffix.h" int -BSIM3V1mDelete(inModel,modname,kill) -GENmodel **inModel; -IFuid modname; -GENmodel *kill; +BSIM3v1mDelete(GENmodel **inModel, IFuid modname, GENmodel *kill) { -BSIM3V1model **model = (BSIM3V1model**)inModel; -BSIM3V1model *modfast = (BSIM3V1model*)kill; -BSIM3V1instance *here; -BSIM3V1instance *prev = NULL; -BSIM3V1model **oldmod; +BSIM3v1model **model = (BSIM3v1model**)inModel; +BSIM3v1model *modfast = (BSIM3v1model*)kill; +BSIM3v1instance *here; +BSIM3v1instance *prev = NULL; +BSIM3v1model **oldmod; oldmod = model; - for (; *model ; model = &((*model)->BSIM3V1nextModel)) - { if ((*model)->BSIM3V1modName == modname || + for (; *model ; model = &((*model)->BSIM3v1nextModel)) + { if ((*model)->BSIM3v1modName == modname || (modfast && *model == modfast)) goto delgot; oldmod = model; @@ -32,8 +34,8 @@ BSIM3V1model **oldmod; return(E_NOMOD); delgot: - *oldmod = (*model)->BSIM3V1nextModel; /* cut deleted device out of list */ - for (here = (*model)->BSIM3V1instances; here; here = here->BSIM3V1nextInstance) + *oldmod = (*model)->BSIM3v1nextModel; /* cut deleted device out of list */ + for (here = (*model)->BSIM3v1instances; here; here = here->BSIM3v1nextInstance) { if(prev) FREE(prev); prev = here; } diff --git a/src/spicelib/devices/bsim3v1/b3v1mpar.c b/src/spicelib/devices/bsim3v1/b3v1mpar.c index 08581dbbe..c4e01b35c 100644 --- a/src/spicelib/devices/bsim3v1/b3v1mpar.c +++ b/src/spicelib/devices/bsim3v1/b3v1mpar.c @@ -1,11 +1,16 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v1mpar.c -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1mpar.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ #include "ngspice.h" -#include #include "bsim3v1def.h" #include "ifsim.h" #include "sperror.h" @@ -13,1515 +18,1507 @@ File: b3v1mpar.c int -BSIM3V1mParam(param,value,inMod) -int param; -IFvalue *value; -GENmodel *inMod; +BSIM3v1mParam(int param, IFvalue *value, GENmodel *inMod) { - BSIM3V1model *mod = (BSIM3V1model*)inMod; + BSIM3v1model *mod = (BSIM3v1model*)inMod; switch(param) - { case BSIM3V1_MOD_MOBMOD : - mod->BSIM3V1mobMod = value->iValue; - mod->BSIM3V1mobModGiven = TRUE; + { case BSIM3v1_MOD_MOBMOD : + mod->BSIM3v1mobMod = value->iValue; + mod->BSIM3v1mobModGiven = TRUE; break; - case BSIM3V1_MOD_BINUNIT : - mod->BSIM3V1binUnit = value->iValue; - mod->BSIM3V1binUnitGiven = TRUE; + case BSIM3v1_MOD_BINUNIT : + mod->BSIM3v1binUnit = value->iValue; + mod->BSIM3v1binUnitGiven = TRUE; break; - case BSIM3V1_MOD_PARAMCHK : - mod->BSIM3V1paramChk = value->iValue; - mod->BSIM3V1paramChkGiven = TRUE; + case BSIM3v1_MOD_PARAMCHK : + mod->BSIM3v1paramChk = value->iValue; + mod->BSIM3v1paramChkGiven = TRUE; break; - case BSIM3V1_MOD_CAPMOD : - mod->BSIM3V1capMod = value->iValue; - mod->BSIM3V1capModGiven = TRUE; + case BSIM3v1_MOD_CAPMOD : + mod->BSIM3v1capMod = value->iValue; + mod->BSIM3v1capModGiven = TRUE; break; - case BSIM3V1_MOD_NQSMOD : - mod->BSIM3V1nqsMod = value->iValue; - mod->BSIM3V1nqsModGiven = TRUE; + case BSIM3v1_MOD_NQSMOD : + mod->BSIM3v1nqsMod = value->iValue; + mod->BSIM3v1nqsModGiven = TRUE; break; - case BSIM3V1_MOD_NOIMOD : - mod->BSIM3V1noiMod = value->iValue; - mod->BSIM3V1noiModGiven = TRUE; + case BSIM3v1_MOD_NOIMOD : + mod->BSIM3v1noiMod = value->iValue; + mod->BSIM3v1noiModGiven = TRUE; break; - case BSIM3V1_MOD_VERSION : - mod->BSIM3V1version = value->rValue; - mod->BSIM3V1versionGiven = TRUE; + case BSIM3v1_MOD_VERSION : + mod->BSIM3v1version = value->rValue; + mod->BSIM3v1versionGiven = TRUE; break; - case BSIM3V1_MOD_TOX : - mod->BSIM3V1tox = value->rValue; - mod->BSIM3V1toxGiven = TRUE; + case BSIM3v1_MOD_TOX : + mod->BSIM3v1tox = value->rValue; + mod->BSIM3v1toxGiven = TRUE; break; - case BSIM3V1_MOD_CDSC : - mod->BSIM3V1cdsc = value->rValue; - mod->BSIM3V1cdscGiven = TRUE; + case BSIM3v1_MOD_CDSC : + mod->BSIM3v1cdsc = value->rValue; + mod->BSIM3v1cdscGiven = TRUE; break; - case BSIM3V1_MOD_CDSCB : - mod->BSIM3V1cdscb = value->rValue; - mod->BSIM3V1cdscbGiven = TRUE; + case BSIM3v1_MOD_CDSCB : + mod->BSIM3v1cdscb = value->rValue; + mod->BSIM3v1cdscbGiven = TRUE; break; - case BSIM3V1_MOD_CDSCD : - mod->BSIM3V1cdscd = value->rValue; - mod->BSIM3V1cdscdGiven = TRUE; + case BSIM3v1_MOD_CDSCD : + mod->BSIM3v1cdscd = value->rValue; + mod->BSIM3v1cdscdGiven = TRUE; break; - case BSIM3V1_MOD_CIT : - mod->BSIM3V1cit = value->rValue; - mod->BSIM3V1citGiven = TRUE; + case BSIM3v1_MOD_CIT : + mod->BSIM3v1cit = value->rValue; + mod->BSIM3v1citGiven = TRUE; break; - case BSIM3V1_MOD_NFACTOR : - mod->BSIM3V1nfactor = value->rValue; - mod->BSIM3V1nfactorGiven = TRUE; + case BSIM3v1_MOD_NFACTOR : + mod->BSIM3v1nfactor = value->rValue; + mod->BSIM3v1nfactorGiven = TRUE; break; - case BSIM3V1_MOD_XJ: - mod->BSIM3V1xj = value->rValue; - mod->BSIM3V1xjGiven = TRUE; + case BSIM3v1_MOD_XJ: + mod->BSIM3v1xj = value->rValue; + mod->BSIM3v1xjGiven = TRUE; break; - case BSIM3V1_MOD_VSAT: - mod->BSIM3V1vsat = value->rValue; - mod->BSIM3V1vsatGiven = TRUE; + case BSIM3v1_MOD_VSAT: + mod->BSIM3v1vsat = value->rValue; + mod->BSIM3v1vsatGiven = TRUE; break; - case BSIM3V1_MOD_A0: - mod->BSIM3V1a0 = value->rValue; - mod->BSIM3V1a0Given = TRUE; + case BSIM3v1_MOD_A0: + mod->BSIM3v1a0 = value->rValue; + mod->BSIM3v1a0Given = TRUE; break; - case BSIM3V1_MOD_AGS: - mod->BSIM3V1ags= value->rValue; - mod->BSIM3V1agsGiven = TRUE; + case BSIM3v1_MOD_AGS: + mod->BSIM3v1ags= value->rValue; + mod->BSIM3v1agsGiven = TRUE; break; - case BSIM3V1_MOD_A1: - mod->BSIM3V1a1 = value->rValue; - mod->BSIM3V1a1Given = TRUE; + case BSIM3v1_MOD_A1: + mod->BSIM3v1a1 = value->rValue; + mod->BSIM3v1a1Given = TRUE; break; - case BSIM3V1_MOD_A2: - mod->BSIM3V1a2 = value->rValue; - mod->BSIM3V1a2Given = TRUE; + case BSIM3v1_MOD_A2: + mod->BSIM3v1a2 = value->rValue; + mod->BSIM3v1a2Given = TRUE; break; - case BSIM3V1_MOD_AT: - mod->BSIM3V1at = value->rValue; - mod->BSIM3V1atGiven = TRUE; + case BSIM3v1_MOD_AT: + mod->BSIM3v1at = value->rValue; + mod->BSIM3v1atGiven = TRUE; break; - case BSIM3V1_MOD_KETA: - mod->BSIM3V1keta = value->rValue; - mod->BSIM3V1ketaGiven = TRUE; + case BSIM3v1_MOD_KETA: + mod->BSIM3v1keta = value->rValue; + mod->BSIM3v1ketaGiven = TRUE; break; - case BSIM3V1_MOD_NSUB: - mod->BSIM3V1nsub = value->rValue; - mod->BSIM3V1nsubGiven = TRUE; - break; - case BSIM3V1_MOD_NPEAK: - mod->BSIM3V1npeak = value->rValue; - mod->BSIM3V1npeakGiven = TRUE; - if (mod->BSIM3V1npeak > 1.0e20) - mod->BSIM3V1npeak *= 1.0e-6; - break; - case BSIM3V1_MOD_NGATE: - mod->BSIM3V1ngate = value->rValue; - mod->BSIM3V1ngateGiven = TRUE; - if (mod->BSIM3V1ngate > 1.0e23) - mod->BSIM3V1ngate *= 1.0e-6; - break; - case BSIM3V1_MOD_GAMMA1: - mod->BSIM3V1gamma1 = value->rValue; - mod->BSIM3V1gamma1Given = TRUE; - break; - case BSIM3V1_MOD_GAMMA2: - mod->BSIM3V1gamma2 = value->rValue; - mod->BSIM3V1gamma2Given = TRUE; - break; - case BSIM3V1_MOD_VBX: - mod->BSIM3V1vbx = value->rValue; - mod->BSIM3V1vbxGiven = TRUE; - break; - case BSIM3V1_MOD_VBM: - mod->BSIM3V1vbm = value->rValue; - mod->BSIM3V1vbmGiven = TRUE; - break; - case BSIM3V1_MOD_XT: - mod->BSIM3V1xt = value->rValue; - mod->BSIM3V1xtGiven = TRUE; - break; - case BSIM3V1_MOD_K1: - mod->BSIM3V1k1 = value->rValue; - mod->BSIM3V1k1Given = TRUE; - break; - case BSIM3V1_MOD_KT1: - mod->BSIM3V1kt1 = value->rValue; - mod->BSIM3V1kt1Given = TRUE; - break; - case BSIM3V1_MOD_KT1L: - mod->BSIM3V1kt1l = value->rValue; - mod->BSIM3V1kt1lGiven = TRUE; - break; - case BSIM3V1_MOD_KT2: - mod->BSIM3V1kt2 = value->rValue; - mod->BSIM3V1kt2Given = TRUE; - break; - case BSIM3V1_MOD_K2: - mod->BSIM3V1k2 = value->rValue; - mod->BSIM3V1k2Given = TRUE; - break; - case BSIM3V1_MOD_K3: - mod->BSIM3V1k3 = value->rValue; - mod->BSIM3V1k3Given = TRUE; - break; - case BSIM3V1_MOD_K3B: - mod->BSIM3V1k3b = value->rValue; - mod->BSIM3V1k3bGiven = TRUE; - break; - case BSIM3V1_MOD_NLX: - mod->BSIM3V1nlx = value->rValue; - mod->BSIM3V1nlxGiven = TRUE; - break; - case BSIM3V1_MOD_W0: - mod->BSIM3V1w0 = value->rValue; - mod->BSIM3V1w0Given = TRUE; - break; - case BSIM3V1_MOD_DVT0: - mod->BSIM3V1dvt0 = value->rValue; - mod->BSIM3V1dvt0Given = TRUE; - break; - case BSIM3V1_MOD_DVT1: - mod->BSIM3V1dvt1 = value->rValue; - mod->BSIM3V1dvt1Given = TRUE; - break; - case BSIM3V1_MOD_DVT2: - mod->BSIM3V1dvt2 = value->rValue; - mod->BSIM3V1dvt2Given = TRUE; - break; - case BSIM3V1_MOD_DVT0W: - mod->BSIM3V1dvt0w = value->rValue; - mod->BSIM3V1dvt0wGiven = TRUE; - break; - case BSIM3V1_MOD_DVT1W: - mod->BSIM3V1dvt1w = value->rValue; - mod->BSIM3V1dvt1wGiven = TRUE; - break; - case BSIM3V1_MOD_DVT2W: - mod->BSIM3V1dvt2w = value->rValue; - mod->BSIM3V1dvt2wGiven = TRUE; - break; - case BSIM3V1_MOD_DROUT: - mod->BSIM3V1drout = value->rValue; - mod->BSIM3V1droutGiven = TRUE; - break; - case BSIM3V1_MOD_DSUB: - mod->BSIM3V1dsub = value->rValue; - mod->BSIM3V1dsubGiven = TRUE; - break; - case BSIM3V1_MOD_VTH0: - mod->BSIM3V1vth0 = value->rValue; - mod->BSIM3V1vth0Given = TRUE; - break; - case BSIM3V1_MOD_UA: - mod->BSIM3V1ua = value->rValue; - mod->BSIM3V1uaGiven = TRUE; - break; - case BSIM3V1_MOD_UA1: - mod->BSIM3V1ua1 = value->rValue; - mod->BSIM3V1ua1Given = TRUE; + case BSIM3v1_MOD_NSUB: + mod->BSIM3v1nsub = value->rValue; + mod->BSIM3v1nsubGiven = TRUE; + break; + case BSIM3v1_MOD_NPEAK: + mod->BSIM3v1npeak = value->rValue; + mod->BSIM3v1npeakGiven = TRUE; + if (mod->BSIM3v1npeak > 1.0e20) + mod->BSIM3v1npeak *= 1.0e-6; + break; + case BSIM3v1_MOD_NGATE: + mod->BSIM3v1ngate = value->rValue; + mod->BSIM3v1ngateGiven = TRUE; + if (mod->BSIM3v1ngate > 1.0e23) + mod->BSIM3v1ngate *= 1.0e-6; + break; + case BSIM3v1_MOD_GAMMA1: + mod->BSIM3v1gamma1 = value->rValue; + mod->BSIM3v1gamma1Given = TRUE; + break; + case BSIM3v1_MOD_GAMMA2: + mod->BSIM3v1gamma2 = value->rValue; + mod->BSIM3v1gamma2Given = TRUE; + break; + case BSIM3v1_MOD_VBX: + mod->BSIM3v1vbx = value->rValue; + mod->BSIM3v1vbxGiven = TRUE; + break; + case BSIM3v1_MOD_VBM: + mod->BSIM3v1vbm = value->rValue; + mod->BSIM3v1vbmGiven = TRUE; + break; + case BSIM3v1_MOD_XT: + mod->BSIM3v1xt = value->rValue; + mod->BSIM3v1xtGiven = TRUE; + break; + case BSIM3v1_MOD_K1: + mod->BSIM3v1k1 = value->rValue; + mod->BSIM3v1k1Given = TRUE; + break; + case BSIM3v1_MOD_KT1: + mod->BSIM3v1kt1 = value->rValue; + mod->BSIM3v1kt1Given = TRUE; + break; + case BSIM3v1_MOD_KT1L: + mod->BSIM3v1kt1l = value->rValue; + mod->BSIM3v1kt1lGiven = TRUE; + break; + case BSIM3v1_MOD_KT2: + mod->BSIM3v1kt2 = value->rValue; + mod->BSIM3v1kt2Given = TRUE; + break; + case BSIM3v1_MOD_K2: + mod->BSIM3v1k2 = value->rValue; + mod->BSIM3v1k2Given = TRUE; + break; + case BSIM3v1_MOD_K3: + mod->BSIM3v1k3 = value->rValue; + mod->BSIM3v1k3Given = TRUE; + break; + case BSIM3v1_MOD_K3B: + mod->BSIM3v1k3b = value->rValue; + mod->BSIM3v1k3bGiven = TRUE; + break; + case BSIM3v1_MOD_NLX: + mod->BSIM3v1nlx = value->rValue; + mod->BSIM3v1nlxGiven = TRUE; + break; + case BSIM3v1_MOD_W0: + mod->BSIM3v1w0 = value->rValue; + mod->BSIM3v1w0Given = TRUE; + break; + case BSIM3v1_MOD_DVT0: + mod->BSIM3v1dvt0 = value->rValue; + mod->BSIM3v1dvt0Given = TRUE; + break; + case BSIM3v1_MOD_DVT1: + mod->BSIM3v1dvt1 = value->rValue; + mod->BSIM3v1dvt1Given = TRUE; + break; + case BSIM3v1_MOD_DVT2: + mod->BSIM3v1dvt2 = value->rValue; + mod->BSIM3v1dvt2Given = TRUE; + break; + case BSIM3v1_MOD_DVT0W: + mod->BSIM3v1dvt0w = value->rValue; + mod->BSIM3v1dvt0wGiven = TRUE; + break; + case BSIM3v1_MOD_DVT1W: + mod->BSIM3v1dvt1w = value->rValue; + mod->BSIM3v1dvt1wGiven = TRUE; + break; + case BSIM3v1_MOD_DVT2W: + mod->BSIM3v1dvt2w = value->rValue; + mod->BSIM3v1dvt2wGiven = TRUE; + break; + case BSIM3v1_MOD_DROUT: + mod->BSIM3v1drout = value->rValue; + mod->BSIM3v1droutGiven = TRUE; + break; + case BSIM3v1_MOD_DSUB: + mod->BSIM3v1dsub = value->rValue; + mod->BSIM3v1dsubGiven = TRUE; + break; + case BSIM3v1_MOD_VTH0: + mod->BSIM3v1vth0 = value->rValue; + mod->BSIM3v1vth0Given = TRUE; + break; + case BSIM3v1_MOD_UA: + mod->BSIM3v1ua = value->rValue; + mod->BSIM3v1uaGiven = TRUE; + break; + case BSIM3v1_MOD_UA1: + mod->BSIM3v1ua1 = value->rValue; + mod->BSIM3v1ua1Given = TRUE; break; - case BSIM3V1_MOD_UB: - mod->BSIM3V1ub = value->rValue; - mod->BSIM3V1ubGiven = TRUE; + case BSIM3v1_MOD_UB: + mod->BSIM3v1ub = value->rValue; + mod->BSIM3v1ubGiven = TRUE; break; - case BSIM3V1_MOD_UB1: - mod->BSIM3V1ub1 = value->rValue; - mod->BSIM3V1ub1Given = TRUE; + case BSIM3v1_MOD_UB1: + mod->BSIM3v1ub1 = value->rValue; + mod->BSIM3v1ub1Given = TRUE; break; - case BSIM3V1_MOD_UC: - mod->BSIM3V1uc = value->rValue; - mod->BSIM3V1ucGiven = TRUE; + case BSIM3v1_MOD_UC: + mod->BSIM3v1uc = value->rValue; + mod->BSIM3v1ucGiven = TRUE; break; - case BSIM3V1_MOD_UC1: - mod->BSIM3V1uc1 = value->rValue; - mod->BSIM3V1uc1Given = TRUE; + case BSIM3v1_MOD_UC1: + mod->BSIM3v1uc1 = value->rValue; + mod->BSIM3v1uc1Given = TRUE; break; - case BSIM3V1_MOD_U0 : - mod->BSIM3V1u0 = value->rValue; - mod->BSIM3V1u0Given = TRUE; + case BSIM3v1_MOD_U0 : + mod->BSIM3v1u0 = value->rValue; + mod->BSIM3v1u0Given = TRUE; break; - case BSIM3V1_MOD_UTE : - mod->BSIM3V1ute = value->rValue; - mod->BSIM3V1uteGiven = TRUE; + case BSIM3v1_MOD_UTE : + mod->BSIM3v1ute = value->rValue; + mod->BSIM3v1uteGiven = TRUE; break; - case BSIM3V1_MOD_VOFF: - mod->BSIM3V1voff = value->rValue; - mod->BSIM3V1voffGiven = TRUE; + case BSIM3v1_MOD_VOFF: + mod->BSIM3v1voff = value->rValue; + mod->BSIM3v1voffGiven = TRUE; break; - case BSIM3V1_MOD_DELTA : - mod->BSIM3V1delta = value->rValue; - mod->BSIM3V1deltaGiven = TRUE; + case BSIM3v1_MOD_DELTA : + mod->BSIM3v1delta = value->rValue; + mod->BSIM3v1deltaGiven = TRUE; break; - case BSIM3V1_MOD_RDSW: - mod->BSIM3V1rdsw = value->rValue; - mod->BSIM3V1rdswGiven = TRUE; + case BSIM3v1_MOD_RDSW: + mod->BSIM3v1rdsw = value->rValue; + mod->BSIM3v1rdswGiven = TRUE; break; - case BSIM3V1_MOD_PRWG: - mod->BSIM3V1prwg = value->rValue; - mod->BSIM3V1prwgGiven = TRUE; + case BSIM3v1_MOD_PRWG: + mod->BSIM3v1prwg = value->rValue; + mod->BSIM3v1prwgGiven = TRUE; break; - case BSIM3V1_MOD_PRWB: - mod->BSIM3V1prwb = value->rValue; - mod->BSIM3V1prwbGiven = TRUE; + case BSIM3v1_MOD_PRWB: + mod->BSIM3v1prwb = value->rValue; + mod->BSIM3v1prwbGiven = TRUE; break; - case BSIM3V1_MOD_PRT: - mod->BSIM3V1prt = value->rValue; - mod->BSIM3V1prtGiven = TRUE; + case BSIM3v1_MOD_PRT: + mod->BSIM3v1prt = value->rValue; + mod->BSIM3v1prtGiven = TRUE; break; - case BSIM3V1_MOD_ETA0: - mod->BSIM3V1eta0 = value->rValue; - mod->BSIM3V1eta0Given = TRUE; + case BSIM3v1_MOD_ETA0: + mod->BSIM3v1eta0 = value->rValue; + mod->BSIM3v1eta0Given = TRUE; break; - case BSIM3V1_MOD_ETAB: - mod->BSIM3V1etab = value->rValue; - mod->BSIM3V1etabGiven = TRUE; + case BSIM3v1_MOD_ETAB: + mod->BSIM3v1etab = value->rValue; + mod->BSIM3v1etabGiven = TRUE; break; - case BSIM3V1_MOD_PCLM: - mod->BSIM3V1pclm = value->rValue; - mod->BSIM3V1pclmGiven = TRUE; + case BSIM3v1_MOD_PCLM: + mod->BSIM3v1pclm = value->rValue; + mod->BSIM3v1pclmGiven = TRUE; break; - case BSIM3V1_MOD_PDIBL1: - mod->BSIM3V1pdibl1 = value->rValue; - mod->BSIM3V1pdibl1Given = TRUE; + case BSIM3v1_MOD_PDIBL1: + mod->BSIM3v1pdibl1 = value->rValue; + mod->BSIM3v1pdibl1Given = TRUE; break; - case BSIM3V1_MOD_PDIBL2: - mod->BSIM3V1pdibl2 = value->rValue; - mod->BSIM3V1pdibl2Given = TRUE; + case BSIM3v1_MOD_PDIBL2: + mod->BSIM3v1pdibl2 = value->rValue; + mod->BSIM3v1pdibl2Given = TRUE; break; - case BSIM3V1_MOD_PDIBLB: - mod->BSIM3V1pdiblb = value->rValue; - mod->BSIM3V1pdiblbGiven = TRUE; + case BSIM3v1_MOD_PDIBLB: + mod->BSIM3v1pdiblb = value->rValue; + mod->BSIM3v1pdiblbGiven = TRUE; break; - case BSIM3V1_MOD_PSCBE1: - mod->BSIM3V1pscbe1 = value->rValue; - mod->BSIM3V1pscbe1Given = TRUE; + case BSIM3v1_MOD_PSCBE1: + mod->BSIM3v1pscbe1 = value->rValue; + mod->BSIM3v1pscbe1Given = TRUE; break; - case BSIM3V1_MOD_PSCBE2: - mod->BSIM3V1pscbe2 = value->rValue; - mod->BSIM3V1pscbe2Given = TRUE; + case BSIM3v1_MOD_PSCBE2: + mod->BSIM3v1pscbe2 = value->rValue; + mod->BSIM3v1pscbe2Given = TRUE; break; - case BSIM3V1_MOD_PVAG: - mod->BSIM3V1pvag = value->rValue; - mod->BSIM3V1pvagGiven = TRUE; + case BSIM3v1_MOD_PVAG: + mod->BSIM3v1pvag = value->rValue; + mod->BSIM3v1pvagGiven = TRUE; break; - case BSIM3V1_MOD_WR : - mod->BSIM3V1wr = value->rValue; - mod->BSIM3V1wrGiven = TRUE; + case BSIM3v1_MOD_WR : + mod->BSIM3v1wr = value->rValue; + mod->BSIM3v1wrGiven = TRUE; break; - case BSIM3V1_MOD_DWG : - mod->BSIM3V1dwg = value->rValue; - mod->BSIM3V1dwgGiven = TRUE; + case BSIM3v1_MOD_DWG : + mod->BSIM3v1dwg = value->rValue; + mod->BSIM3v1dwgGiven = TRUE; break; - case BSIM3V1_MOD_DWB : - mod->BSIM3V1dwb = value->rValue; - mod->BSIM3V1dwbGiven = TRUE; + case BSIM3v1_MOD_DWB : + mod->BSIM3v1dwb = value->rValue; + mod->BSIM3v1dwbGiven = TRUE; break; - case BSIM3V1_MOD_B0 : - mod->BSIM3V1b0 = value->rValue; - mod->BSIM3V1b0Given = TRUE; + case BSIM3v1_MOD_B0 : + mod->BSIM3v1b0 = value->rValue; + mod->BSIM3v1b0Given = TRUE; break; - case BSIM3V1_MOD_B1 : - mod->BSIM3V1b1 = value->rValue; - mod->BSIM3V1b1Given = TRUE; + case BSIM3v1_MOD_B1 : + mod->BSIM3v1b1 = value->rValue; + mod->BSIM3v1b1Given = TRUE; break; - case BSIM3V1_MOD_ALPHA0 : - mod->BSIM3V1alpha0 = value->rValue; - mod->BSIM3V1alpha0Given = TRUE; + case BSIM3v1_MOD_ALPHA0 : + mod->BSIM3v1alpha0 = value->rValue; + mod->BSIM3v1alpha0Given = TRUE; break; - case BSIM3V1_MOD_BETA0 : - mod->BSIM3V1beta0 = value->rValue; - mod->BSIM3V1beta0Given = TRUE; + case BSIM3v1_MOD_BETA0 : + mod->BSIM3v1beta0 = value->rValue; + mod->BSIM3v1beta0Given = TRUE; break; - case BSIM3V1_MOD_ELM : - mod->BSIM3V1elm = value->rValue; - mod->BSIM3V1elmGiven = TRUE; + case BSIM3v1_MOD_ELM : + mod->BSIM3v1elm = value->rValue; + mod->BSIM3v1elmGiven = TRUE; break; - case BSIM3V1_MOD_CGSL : - mod->BSIM3V1cgsl = value->rValue; - mod->BSIM3V1cgslGiven = TRUE; + case BSIM3v1_MOD_CGSL : + mod->BSIM3v1cgsl = value->rValue; + mod->BSIM3v1cgslGiven = TRUE; break; - case BSIM3V1_MOD_CGDL : - mod->BSIM3V1cgdl = value->rValue; - mod->BSIM3V1cgdlGiven = TRUE; + case BSIM3v1_MOD_CGDL : + mod->BSIM3v1cgdl = value->rValue; + mod->BSIM3v1cgdlGiven = TRUE; break; - case BSIM3V1_MOD_CKAPPA : - mod->BSIM3V1ckappa = value->rValue; - mod->BSIM3V1ckappaGiven = TRUE; + case BSIM3v1_MOD_CKAPPA : + mod->BSIM3v1ckappa = value->rValue; + mod->BSIM3v1ckappaGiven = TRUE; break; - case BSIM3V1_MOD_CF : - mod->BSIM3V1cf = value->rValue; - mod->BSIM3V1cfGiven = TRUE; + case BSIM3v1_MOD_CF : + mod->BSIM3v1cf = value->rValue; + mod->BSIM3v1cfGiven = TRUE; break; - case BSIM3V1_MOD_CLC : - mod->BSIM3V1clc = value->rValue; - mod->BSIM3V1clcGiven = TRUE; + case BSIM3v1_MOD_CLC : + mod->BSIM3v1clc = value->rValue; + mod->BSIM3v1clcGiven = TRUE; break; - case BSIM3V1_MOD_CLE : - mod->BSIM3V1cle = value->rValue; - mod->BSIM3V1cleGiven = TRUE; + case BSIM3v1_MOD_CLE : + mod->BSIM3v1cle = value->rValue; + mod->BSIM3v1cleGiven = TRUE; break; - case BSIM3V1_MOD_DWC : - mod->BSIM3V1dwc = value->rValue; - mod->BSIM3V1dwcGiven = TRUE; + case BSIM3v1_MOD_DWC : + mod->BSIM3v1dwc = value->rValue; + mod->BSIM3v1dwcGiven = TRUE; break; - case BSIM3V1_MOD_DLC : - mod->BSIM3V1dlc = value->rValue; - mod->BSIM3V1dlcGiven = TRUE; + case BSIM3v1_MOD_DLC : + mod->BSIM3v1dlc = value->rValue; + mod->BSIM3v1dlcGiven = TRUE; break; - case BSIM3V1_MOD_VFBCV : - mod->BSIM3V1vfbcv = value->rValue; - mod->BSIM3V1vfbcvGiven = TRUE; + case BSIM3v1_MOD_VFBCV : + mod->BSIM3v1vfbcv = value->rValue; + mod->BSIM3v1vfbcvGiven = TRUE; break; /* Length dependence */ - case BSIM3V1_MOD_LCDSC : - mod->BSIM3V1lcdsc = value->rValue; - mod->BSIM3V1lcdscGiven = TRUE; + case BSIM3v1_MOD_LCDSC : + mod->BSIM3v1lcdsc = value->rValue; + mod->BSIM3v1lcdscGiven = TRUE; break; - case BSIM3V1_MOD_LCDSCB : - mod->BSIM3V1lcdscb = value->rValue; - mod->BSIM3V1lcdscbGiven = TRUE; + case BSIM3v1_MOD_LCDSCB : + mod->BSIM3v1lcdscb = value->rValue; + mod->BSIM3v1lcdscbGiven = TRUE; break; - case BSIM3V1_MOD_LCDSCD : - mod->BSIM3V1lcdscd = value->rValue; - mod->BSIM3V1lcdscdGiven = TRUE; + case BSIM3v1_MOD_LCDSCD : + mod->BSIM3v1lcdscd = value->rValue; + mod->BSIM3v1lcdscdGiven = TRUE; break; - case BSIM3V1_MOD_LCIT : - mod->BSIM3V1lcit = value->rValue; - mod->BSIM3V1lcitGiven = TRUE; + case BSIM3v1_MOD_LCIT : + mod->BSIM3v1lcit = value->rValue; + mod->BSIM3v1lcitGiven = TRUE; break; - case BSIM3V1_MOD_LNFACTOR : - mod->BSIM3V1lnfactor = value->rValue; - mod->BSIM3V1lnfactorGiven = TRUE; + case BSIM3v1_MOD_LNFACTOR : + mod->BSIM3v1lnfactor = value->rValue; + mod->BSIM3v1lnfactorGiven = TRUE; break; - case BSIM3V1_MOD_LXJ: - mod->BSIM3V1lxj = value->rValue; - mod->BSIM3V1lxjGiven = TRUE; + case BSIM3v1_MOD_LXJ: + mod->BSIM3v1lxj = value->rValue; + mod->BSIM3v1lxjGiven = TRUE; break; - case BSIM3V1_MOD_LVSAT: - mod->BSIM3V1lvsat = value->rValue; - mod->BSIM3V1lvsatGiven = TRUE; + case BSIM3v1_MOD_LVSAT: + mod->BSIM3v1lvsat = value->rValue; + mod->BSIM3v1lvsatGiven = TRUE; break; - case BSIM3V1_MOD_LA0: - mod->BSIM3V1la0 = value->rValue; - mod->BSIM3V1la0Given = TRUE; + case BSIM3v1_MOD_LA0: + mod->BSIM3v1la0 = value->rValue; + mod->BSIM3v1la0Given = TRUE; break; - case BSIM3V1_MOD_LAGS: - mod->BSIM3V1lags = value->rValue; - mod->BSIM3V1lagsGiven = TRUE; + case BSIM3v1_MOD_LAGS: + mod->BSIM3v1lags = value->rValue; + mod->BSIM3v1lagsGiven = TRUE; break; - case BSIM3V1_MOD_LA1: - mod->BSIM3V1la1 = value->rValue; - mod->BSIM3V1la1Given = TRUE; + case BSIM3v1_MOD_LA1: + mod->BSIM3v1la1 = value->rValue; + mod->BSIM3v1la1Given = TRUE; break; - case BSIM3V1_MOD_LA2: - mod->BSIM3V1la2 = value->rValue; - mod->BSIM3V1la2Given = TRUE; + case BSIM3v1_MOD_LA2: + mod->BSIM3v1la2 = value->rValue; + mod->BSIM3v1la2Given = TRUE; break; - case BSIM3V1_MOD_LAT: - mod->BSIM3V1lat = value->rValue; - mod->BSIM3V1latGiven = TRUE; + case BSIM3v1_MOD_LAT: + mod->BSIM3v1lat = value->rValue; + mod->BSIM3v1latGiven = TRUE; break; - case BSIM3V1_MOD_LKETA: - mod->BSIM3V1lketa = value->rValue; - mod->BSIM3V1lketaGiven = TRUE; + case BSIM3v1_MOD_LKETA: + mod->BSIM3v1lketa = value->rValue; + mod->BSIM3v1lketaGiven = TRUE; break; - case BSIM3V1_MOD_LNSUB: - mod->BSIM3V1lnsub = value->rValue; - mod->BSIM3V1lnsubGiven = TRUE; - break; - case BSIM3V1_MOD_LNPEAK: - mod->BSIM3V1lnpeak = value->rValue; - mod->BSIM3V1lnpeakGiven = TRUE; - if (mod->BSIM3V1lnpeak > 1.0e20) - mod->BSIM3V1lnpeak *= 1.0e-6; - break; - case BSIM3V1_MOD_LNGATE: - mod->BSIM3V1lngate = value->rValue; - mod->BSIM3V1lngateGiven = TRUE; - if (mod->BSIM3V1lngate > 1.0e23) - mod->BSIM3V1lngate *= 1.0e-6; - break; - case BSIM3V1_MOD_LGAMMA1: - mod->BSIM3V1lgamma1 = value->rValue; - mod->BSIM3V1lgamma1Given = TRUE; - break; - case BSIM3V1_MOD_LGAMMA2: - mod->BSIM3V1lgamma2 = value->rValue; - mod->BSIM3V1lgamma2Given = TRUE; - break; - case BSIM3V1_MOD_LVBX: - mod->BSIM3V1lvbx = value->rValue; - mod->BSIM3V1lvbxGiven = TRUE; - break; - case BSIM3V1_MOD_LVBM: - mod->BSIM3V1lvbm = value->rValue; - mod->BSIM3V1lvbmGiven = TRUE; - break; - case BSIM3V1_MOD_LXT: - mod->BSIM3V1lxt = value->rValue; - mod->BSIM3V1lxtGiven = TRUE; - break; - case BSIM3V1_MOD_LK1: - mod->BSIM3V1lk1 = value->rValue; - mod->BSIM3V1lk1Given = TRUE; - break; - case BSIM3V1_MOD_LKT1: - mod->BSIM3V1lkt1 = value->rValue; - mod->BSIM3V1lkt1Given = TRUE; - break; - case BSIM3V1_MOD_LKT1L: - mod->BSIM3V1lkt1l = value->rValue; - mod->BSIM3V1lkt1lGiven = TRUE; - break; - case BSIM3V1_MOD_LKT2: - mod->BSIM3V1lkt2 = value->rValue; - mod->BSIM3V1lkt2Given = TRUE; - break; - case BSIM3V1_MOD_LK2: - mod->BSIM3V1lk2 = value->rValue; - mod->BSIM3V1lk2Given = TRUE; - break; - case BSIM3V1_MOD_LK3: - mod->BSIM3V1lk3 = value->rValue; - mod->BSIM3V1lk3Given = TRUE; - break; - case BSIM3V1_MOD_LK3B: - mod->BSIM3V1lk3b = value->rValue; - mod->BSIM3V1lk3bGiven = TRUE; - break; - case BSIM3V1_MOD_LNLX: - mod->BSIM3V1lnlx = value->rValue; - mod->BSIM3V1lnlxGiven = TRUE; - break; - case BSIM3V1_MOD_LW0: - mod->BSIM3V1lw0 = value->rValue; - mod->BSIM3V1lw0Given = TRUE; - break; - case BSIM3V1_MOD_LDVT0: - mod->BSIM3V1ldvt0 = value->rValue; - mod->BSIM3V1ldvt0Given = TRUE; - break; - case BSIM3V1_MOD_LDVT1: - mod->BSIM3V1ldvt1 = value->rValue; - mod->BSIM3V1ldvt1Given = TRUE; - break; - case BSIM3V1_MOD_LDVT2: - mod->BSIM3V1ldvt2 = value->rValue; - mod->BSIM3V1ldvt2Given = TRUE; - break; - case BSIM3V1_MOD_LDVT0W: - mod->BSIM3V1ldvt0w = value->rValue; - mod->BSIM3V1ldvt0Given = TRUE; - break; - case BSIM3V1_MOD_LDVT1W: - mod->BSIM3V1ldvt1w = value->rValue; - mod->BSIM3V1ldvt1wGiven = TRUE; - break; - case BSIM3V1_MOD_LDVT2W: - mod->BSIM3V1ldvt2w = value->rValue; - mod->BSIM3V1ldvt2wGiven = TRUE; - break; - case BSIM3V1_MOD_LDROUT: - mod->BSIM3V1ldrout = value->rValue; - mod->BSIM3V1ldroutGiven = TRUE; - break; - case BSIM3V1_MOD_LDSUB: - mod->BSIM3V1ldsub = value->rValue; - mod->BSIM3V1ldsubGiven = TRUE; - break; - case BSIM3V1_MOD_LVTH0: - mod->BSIM3V1lvth0 = value->rValue; - mod->BSIM3V1lvth0Given = TRUE; - break; - case BSIM3V1_MOD_LUA: - mod->BSIM3V1lua = value->rValue; - mod->BSIM3V1luaGiven = TRUE; - break; - case BSIM3V1_MOD_LUA1: - mod->BSIM3V1lua1 = value->rValue; - mod->BSIM3V1lua1Given = TRUE; + case BSIM3v1_MOD_LNSUB: + mod->BSIM3v1lnsub = value->rValue; + mod->BSIM3v1lnsubGiven = TRUE; + break; + case BSIM3v1_MOD_LNPEAK: + mod->BSIM3v1lnpeak = value->rValue; + mod->BSIM3v1lnpeakGiven = TRUE; + if (mod->BSIM3v1lnpeak > 1.0e20) + mod->BSIM3v1lnpeak *= 1.0e-6; + break; + case BSIM3v1_MOD_LNGATE: + mod->BSIM3v1lngate = value->rValue; + mod->BSIM3v1lngateGiven = TRUE; + if (mod->BSIM3v1lngate > 1.0e23) + mod->BSIM3v1lngate *= 1.0e-6; + break; + case BSIM3v1_MOD_LGAMMA1: + mod->BSIM3v1lgamma1 = value->rValue; + mod->BSIM3v1lgamma1Given = TRUE; + break; + case BSIM3v1_MOD_LGAMMA2: + mod->BSIM3v1lgamma2 = value->rValue; + mod->BSIM3v1lgamma2Given = TRUE; + break; + case BSIM3v1_MOD_LVBX: + mod->BSIM3v1lvbx = value->rValue; + mod->BSIM3v1lvbxGiven = TRUE; + break; + case BSIM3v1_MOD_LVBM: + mod->BSIM3v1lvbm = value->rValue; + mod->BSIM3v1lvbmGiven = TRUE; + break; + case BSIM3v1_MOD_LXT: + mod->BSIM3v1lxt = value->rValue; + mod->BSIM3v1lxtGiven = TRUE; + break; + case BSIM3v1_MOD_LK1: + mod->BSIM3v1lk1 = value->rValue; + mod->BSIM3v1lk1Given = TRUE; + break; + case BSIM3v1_MOD_LKT1: + mod->BSIM3v1lkt1 = value->rValue; + mod->BSIM3v1lkt1Given = TRUE; + break; + case BSIM3v1_MOD_LKT1L: + mod->BSIM3v1lkt1l = value->rValue; + mod->BSIM3v1lkt1lGiven = TRUE; + break; + case BSIM3v1_MOD_LKT2: + mod->BSIM3v1lkt2 = value->rValue; + mod->BSIM3v1lkt2Given = TRUE; + break; + case BSIM3v1_MOD_LK2: + mod->BSIM3v1lk2 = value->rValue; + mod->BSIM3v1lk2Given = TRUE; + break; + case BSIM3v1_MOD_LK3: + mod->BSIM3v1lk3 = value->rValue; + mod->BSIM3v1lk3Given = TRUE; + break; + case BSIM3v1_MOD_LK3B: + mod->BSIM3v1lk3b = value->rValue; + mod->BSIM3v1lk3bGiven = TRUE; + break; + case BSIM3v1_MOD_LNLX: + mod->BSIM3v1lnlx = value->rValue; + mod->BSIM3v1lnlxGiven = TRUE; + break; + case BSIM3v1_MOD_LW0: + mod->BSIM3v1lw0 = value->rValue; + mod->BSIM3v1lw0Given = TRUE; + break; + case BSIM3v1_MOD_LDVT0: + mod->BSIM3v1ldvt0 = value->rValue; + mod->BSIM3v1ldvt0Given = TRUE; + break; + case BSIM3v1_MOD_LDVT1: + mod->BSIM3v1ldvt1 = value->rValue; + mod->BSIM3v1ldvt1Given = TRUE; + break; + case BSIM3v1_MOD_LDVT2: + mod->BSIM3v1ldvt2 = value->rValue; + mod->BSIM3v1ldvt2Given = TRUE; + break; + case BSIM3v1_MOD_LDVT0W: + mod->BSIM3v1ldvt0w = value->rValue; + mod->BSIM3v1ldvt0Given = TRUE; + break; + case BSIM3v1_MOD_LDVT1W: + mod->BSIM3v1ldvt1w = value->rValue; + mod->BSIM3v1ldvt1wGiven = TRUE; + break; + case BSIM3v1_MOD_LDVT2W: + mod->BSIM3v1ldvt2w = value->rValue; + mod->BSIM3v1ldvt2wGiven = TRUE; + break; + case BSIM3v1_MOD_LDROUT: + mod->BSIM3v1ldrout = value->rValue; + mod->BSIM3v1ldroutGiven = TRUE; + break; + case BSIM3v1_MOD_LDSUB: + mod->BSIM3v1ldsub = value->rValue; + mod->BSIM3v1ldsubGiven = TRUE; + break; + case BSIM3v1_MOD_LVTH0: + mod->BSIM3v1lvth0 = value->rValue; + mod->BSIM3v1lvth0Given = TRUE; + break; + case BSIM3v1_MOD_LUA: + mod->BSIM3v1lua = value->rValue; + mod->BSIM3v1luaGiven = TRUE; + break; + case BSIM3v1_MOD_LUA1: + mod->BSIM3v1lua1 = value->rValue; + mod->BSIM3v1lua1Given = TRUE; break; - case BSIM3V1_MOD_LUB: - mod->BSIM3V1lub = value->rValue; - mod->BSIM3V1lubGiven = TRUE; + case BSIM3v1_MOD_LUB: + mod->BSIM3v1lub = value->rValue; + mod->BSIM3v1lubGiven = TRUE; break; - case BSIM3V1_MOD_LUB1: - mod->BSIM3V1lub1 = value->rValue; - mod->BSIM3V1lub1Given = TRUE; + case BSIM3v1_MOD_LUB1: + mod->BSIM3v1lub1 = value->rValue; + mod->BSIM3v1lub1Given = TRUE; break; - case BSIM3V1_MOD_LUC: - mod->BSIM3V1luc = value->rValue; - mod->BSIM3V1lucGiven = TRUE; + case BSIM3v1_MOD_LUC: + mod->BSIM3v1luc = value->rValue; + mod->BSIM3v1lucGiven = TRUE; break; - case BSIM3V1_MOD_LUC1: - mod->BSIM3V1luc1 = value->rValue; - mod->BSIM3V1luc1Given = TRUE; + case BSIM3v1_MOD_LUC1: + mod->BSIM3v1luc1 = value->rValue; + mod->BSIM3v1luc1Given = TRUE; break; - case BSIM3V1_MOD_LU0 : - mod->BSIM3V1lu0 = value->rValue; - mod->BSIM3V1lu0Given = TRUE; + case BSIM3v1_MOD_LU0 : + mod->BSIM3v1lu0 = value->rValue; + mod->BSIM3v1lu0Given = TRUE; break; - case BSIM3V1_MOD_LUTE : - mod->BSIM3V1lute = value->rValue; - mod->BSIM3V1luteGiven = TRUE; + case BSIM3v1_MOD_LUTE : + mod->BSIM3v1lute = value->rValue; + mod->BSIM3v1luteGiven = TRUE; break; - case BSIM3V1_MOD_LVOFF: - mod->BSIM3V1lvoff = value->rValue; - mod->BSIM3V1lvoffGiven = TRUE; + case BSIM3v1_MOD_LVOFF: + mod->BSIM3v1lvoff = value->rValue; + mod->BSIM3v1lvoffGiven = TRUE; break; - case BSIM3V1_MOD_LDELTA : - mod->BSIM3V1ldelta = value->rValue; - mod->BSIM3V1ldeltaGiven = TRUE; + case BSIM3v1_MOD_LDELTA : + mod->BSIM3v1ldelta = value->rValue; + mod->BSIM3v1ldeltaGiven = TRUE; break; - case BSIM3V1_MOD_LRDSW: - mod->BSIM3V1lrdsw = value->rValue; - mod->BSIM3V1lrdswGiven = TRUE; + case BSIM3v1_MOD_LRDSW: + mod->BSIM3v1lrdsw = value->rValue; + mod->BSIM3v1lrdswGiven = TRUE; break; - case BSIM3V1_MOD_LPRWB: - mod->BSIM3V1lprwb = value->rValue; - mod->BSIM3V1lprwbGiven = TRUE; + case BSIM3v1_MOD_LPRWB: + mod->BSIM3v1lprwb = value->rValue; + mod->BSIM3v1lprwbGiven = TRUE; break; - case BSIM3V1_MOD_LPRWG: - mod->BSIM3V1lprwg = value->rValue; - mod->BSIM3V1lprwgGiven = TRUE; + case BSIM3v1_MOD_LPRWG: + mod->BSIM3v1lprwg = value->rValue; + mod->BSIM3v1lprwgGiven = TRUE; break; - case BSIM3V1_MOD_LPRT: - mod->BSIM3V1lprt = value->rValue; - mod->BSIM3V1lprtGiven = TRUE; + case BSIM3v1_MOD_LPRT: + mod->BSIM3v1lprt = value->rValue; + mod->BSIM3v1lprtGiven = TRUE; break; - case BSIM3V1_MOD_LETA0: - mod->BSIM3V1leta0 = value->rValue; - mod->BSIM3V1leta0Given = TRUE; + case BSIM3v1_MOD_LETA0: + mod->BSIM3v1leta0 = value->rValue; + mod->BSIM3v1leta0Given = TRUE; break; - case BSIM3V1_MOD_LETAB: - mod->BSIM3V1letab = value->rValue; - mod->BSIM3V1letabGiven = TRUE; + case BSIM3v1_MOD_LETAB: + mod->BSIM3v1letab = value->rValue; + mod->BSIM3v1letabGiven = TRUE; break; - case BSIM3V1_MOD_LPCLM: - mod->BSIM3V1lpclm = value->rValue; - mod->BSIM3V1lpclmGiven = TRUE; + case BSIM3v1_MOD_LPCLM: + mod->BSIM3v1lpclm = value->rValue; + mod->BSIM3v1lpclmGiven = TRUE; break; - case BSIM3V1_MOD_LPDIBL1: - mod->BSIM3V1lpdibl1 = value->rValue; - mod->BSIM3V1lpdibl1Given = TRUE; + case BSIM3v1_MOD_LPDIBL1: + mod->BSIM3v1lpdibl1 = value->rValue; + mod->BSIM3v1lpdibl1Given = TRUE; break; - case BSIM3V1_MOD_LPDIBL2: - mod->BSIM3V1lpdibl2 = value->rValue; - mod->BSIM3V1lpdibl2Given = TRUE; + case BSIM3v1_MOD_LPDIBL2: + mod->BSIM3v1lpdibl2 = value->rValue; + mod->BSIM3v1lpdibl2Given = TRUE; break; - case BSIM3V1_MOD_LPDIBLB: - mod->BSIM3V1lpdiblb = value->rValue; - mod->BSIM3V1lpdiblbGiven = TRUE; + case BSIM3v1_MOD_LPDIBLB: + mod->BSIM3v1lpdiblb = value->rValue; + mod->BSIM3v1lpdiblbGiven = TRUE; break; - case BSIM3V1_MOD_LPSCBE1: - mod->BSIM3V1lpscbe1 = value->rValue; - mod->BSIM3V1lpscbe1Given = TRUE; + case BSIM3v1_MOD_LPSCBE1: + mod->BSIM3v1lpscbe1 = value->rValue; + mod->BSIM3v1lpscbe1Given = TRUE; break; - case BSIM3V1_MOD_LPSCBE2: - mod->BSIM3V1lpscbe2 = value->rValue; - mod->BSIM3V1lpscbe2Given = TRUE; + case BSIM3v1_MOD_LPSCBE2: + mod->BSIM3v1lpscbe2 = value->rValue; + mod->BSIM3v1lpscbe2Given = TRUE; break; - case BSIM3V1_MOD_LPVAG: - mod->BSIM3V1lpvag = value->rValue; - mod->BSIM3V1lpvagGiven = TRUE; + case BSIM3v1_MOD_LPVAG: + mod->BSIM3v1lpvag = value->rValue; + mod->BSIM3v1lpvagGiven = TRUE; break; - case BSIM3V1_MOD_LWR : - mod->BSIM3V1lwr = value->rValue; - mod->BSIM3V1lwrGiven = TRUE; + case BSIM3v1_MOD_LWR : + mod->BSIM3v1lwr = value->rValue; + mod->BSIM3v1lwrGiven = TRUE; break; - case BSIM3V1_MOD_LDWG : - mod->BSIM3V1ldwg = value->rValue; - mod->BSIM3V1ldwgGiven = TRUE; + case BSIM3v1_MOD_LDWG : + mod->BSIM3v1ldwg = value->rValue; + mod->BSIM3v1ldwgGiven = TRUE; break; - case BSIM3V1_MOD_LDWB : - mod->BSIM3V1ldwb = value->rValue; - mod->BSIM3V1ldwbGiven = TRUE; + case BSIM3v1_MOD_LDWB : + mod->BSIM3v1ldwb = value->rValue; + mod->BSIM3v1ldwbGiven = TRUE; break; - case BSIM3V1_MOD_LB0 : - mod->BSIM3V1lb0 = value->rValue; - mod->BSIM3V1lb0Given = TRUE; + case BSIM3v1_MOD_LB0 : + mod->BSIM3v1lb0 = value->rValue; + mod->BSIM3v1lb0Given = TRUE; break; - case BSIM3V1_MOD_LB1 : - mod->BSIM3V1lb1 = value->rValue; - mod->BSIM3V1lb1Given = TRUE; + case BSIM3v1_MOD_LB1 : + mod->BSIM3v1lb1 = value->rValue; + mod->BSIM3v1lb1Given = TRUE; break; - case BSIM3V1_MOD_LALPHA0 : - mod->BSIM3V1lalpha0 = value->rValue; - mod->BSIM3V1lalpha0Given = TRUE; + case BSIM3v1_MOD_LALPHA0 : + mod->BSIM3v1lalpha0 = value->rValue; + mod->BSIM3v1lalpha0Given = TRUE; break; - case BSIM3V1_MOD_LBETA0 : - mod->BSIM3V1lbeta0 = value->rValue; - mod->BSIM3V1lbeta0Given = TRUE; + case BSIM3v1_MOD_LBETA0 : + mod->BSIM3v1lbeta0 = value->rValue; + mod->BSIM3v1lbeta0Given = TRUE; break; - case BSIM3V1_MOD_LELM : - mod->BSIM3V1lelm = value->rValue; - mod->BSIM3V1lelmGiven = TRUE; + case BSIM3v1_MOD_LELM : + mod->BSIM3v1lelm = value->rValue; + mod->BSIM3v1lelmGiven = TRUE; break; - case BSIM3V1_MOD_LCGSL : - mod->BSIM3V1lcgsl = value->rValue; - mod->BSIM3V1lcgslGiven = TRUE; + case BSIM3v1_MOD_LCGSL : + mod->BSIM3v1lcgsl = value->rValue; + mod->BSIM3v1lcgslGiven = TRUE; break; - case BSIM3V1_MOD_LCGDL : - mod->BSIM3V1lcgdl = value->rValue; - mod->BSIM3V1lcgdlGiven = TRUE; + case BSIM3v1_MOD_LCGDL : + mod->BSIM3v1lcgdl = value->rValue; + mod->BSIM3v1lcgdlGiven = TRUE; break; - case BSIM3V1_MOD_LCKAPPA : - mod->BSIM3V1lckappa = value->rValue; - mod->BSIM3V1lckappaGiven = TRUE; + case BSIM3v1_MOD_LCKAPPA : + mod->BSIM3v1lckappa = value->rValue; + mod->BSIM3v1lckappaGiven = TRUE; break; - case BSIM3V1_MOD_LCF : - mod->BSIM3V1lcf = value->rValue; - mod->BSIM3V1lcfGiven = TRUE; + case BSIM3v1_MOD_LCF : + mod->BSIM3v1lcf = value->rValue; + mod->BSIM3v1lcfGiven = TRUE; break; - case BSIM3V1_MOD_LCLC : - mod->BSIM3V1lclc = value->rValue; - mod->BSIM3V1lclcGiven = TRUE; + case BSIM3v1_MOD_LCLC : + mod->BSIM3v1lclc = value->rValue; + mod->BSIM3v1lclcGiven = TRUE; break; - case BSIM3V1_MOD_LCLE : - mod->BSIM3V1lcle = value->rValue; - mod->BSIM3V1lcleGiven = TRUE; + case BSIM3v1_MOD_LCLE : + mod->BSIM3v1lcle = value->rValue; + mod->BSIM3v1lcleGiven = TRUE; break; - case BSIM3V1_MOD_LVFBCV : - mod->BSIM3V1lvfbcv = value->rValue; - mod->BSIM3V1lvfbcvGiven = TRUE; + case BSIM3v1_MOD_LVFBCV : + mod->BSIM3v1lvfbcv = value->rValue; + mod->BSIM3v1lvfbcvGiven = TRUE; break; /* Width dependence */ - case BSIM3V1_MOD_WCDSC : - mod->BSIM3V1wcdsc = value->rValue; - mod->BSIM3V1wcdscGiven = TRUE; + case BSIM3v1_MOD_WCDSC : + mod->BSIM3v1wcdsc = value->rValue; + mod->BSIM3v1wcdscGiven = TRUE; break; - case BSIM3V1_MOD_WCDSCB : - mod->BSIM3V1wcdscb = value->rValue; - mod->BSIM3V1wcdscbGiven = TRUE; + case BSIM3v1_MOD_WCDSCB : + mod->BSIM3v1wcdscb = value->rValue; + mod->BSIM3v1wcdscbGiven = TRUE; break; - case BSIM3V1_MOD_WCDSCD : - mod->BSIM3V1wcdscd = value->rValue; - mod->BSIM3V1wcdscdGiven = TRUE; + case BSIM3v1_MOD_WCDSCD : + mod->BSIM3v1wcdscd = value->rValue; + mod->BSIM3v1wcdscdGiven = TRUE; break; - case BSIM3V1_MOD_WCIT : - mod->BSIM3V1wcit = value->rValue; - mod->BSIM3V1wcitGiven = TRUE; + case BSIM3v1_MOD_WCIT : + mod->BSIM3v1wcit = value->rValue; + mod->BSIM3v1wcitGiven = TRUE; break; - case BSIM3V1_MOD_WNFACTOR : - mod->BSIM3V1wnfactor = value->rValue; - mod->BSIM3V1wnfactorGiven = TRUE; + case BSIM3v1_MOD_WNFACTOR : + mod->BSIM3v1wnfactor = value->rValue; + mod->BSIM3v1wnfactorGiven = TRUE; break; - case BSIM3V1_MOD_WXJ: - mod->BSIM3V1wxj = value->rValue; - mod->BSIM3V1wxjGiven = TRUE; + case BSIM3v1_MOD_WXJ: + mod->BSIM3v1wxj = value->rValue; + mod->BSIM3v1wxjGiven = TRUE; break; - case BSIM3V1_MOD_WVSAT: - mod->BSIM3V1wvsat = value->rValue; - mod->BSIM3V1wvsatGiven = TRUE; + case BSIM3v1_MOD_WVSAT: + mod->BSIM3v1wvsat = value->rValue; + mod->BSIM3v1wvsatGiven = TRUE; break; - case BSIM3V1_MOD_WA0: - mod->BSIM3V1wa0 = value->rValue; - mod->BSIM3V1wa0Given = TRUE; + case BSIM3v1_MOD_WA0: + mod->BSIM3v1wa0 = value->rValue; + mod->BSIM3v1wa0Given = TRUE; break; - case BSIM3V1_MOD_WAGS: - mod->BSIM3V1wags = value->rValue; - mod->BSIM3V1wagsGiven = TRUE; + case BSIM3v1_MOD_WAGS: + mod->BSIM3v1wags = value->rValue; + mod->BSIM3v1wagsGiven = TRUE; break; - case BSIM3V1_MOD_WA1: - mod->BSIM3V1wa1 = value->rValue; - mod->BSIM3V1wa1Given = TRUE; + case BSIM3v1_MOD_WA1: + mod->BSIM3v1wa1 = value->rValue; + mod->BSIM3v1wa1Given = TRUE; break; - case BSIM3V1_MOD_WA2: - mod->BSIM3V1wa2 = value->rValue; - mod->BSIM3V1wa2Given = TRUE; + case BSIM3v1_MOD_WA2: + mod->BSIM3v1wa2 = value->rValue; + mod->BSIM3v1wa2Given = TRUE; break; - case BSIM3V1_MOD_WAT: - mod->BSIM3V1wat = value->rValue; - mod->BSIM3V1watGiven = TRUE; + case BSIM3v1_MOD_WAT: + mod->BSIM3v1wat = value->rValue; + mod->BSIM3v1watGiven = TRUE; break; - case BSIM3V1_MOD_WKETA: - mod->BSIM3V1wketa = value->rValue; - mod->BSIM3V1wketaGiven = TRUE; + case BSIM3v1_MOD_WKETA: + mod->BSIM3v1wketa = value->rValue; + mod->BSIM3v1wketaGiven = TRUE; break; - case BSIM3V1_MOD_WNSUB: - mod->BSIM3V1wnsub = value->rValue; - mod->BSIM3V1wnsubGiven = TRUE; - break; - case BSIM3V1_MOD_WNPEAK: - mod->BSIM3V1wnpeak = value->rValue; - mod->BSIM3V1wnpeakGiven = TRUE; - if (mod->BSIM3V1wnpeak > 1.0e20) - mod->BSIM3V1wnpeak *= 1.0e-6; - break; - case BSIM3V1_MOD_WNGATE: - mod->BSIM3V1wngate = value->rValue; - mod->BSIM3V1wngateGiven = TRUE; - if (mod->BSIM3V1wngate > 1.0e23) - mod->BSIM3V1wngate *= 1.0e-6; - break; - case BSIM3V1_MOD_WGAMMA1: - mod->BSIM3V1wgamma1 = value->rValue; - mod->BSIM3V1wgamma1Given = TRUE; - break; - case BSIM3V1_MOD_WGAMMA2: - mod->BSIM3V1wgamma2 = value->rValue; - mod->BSIM3V1wgamma2Given = TRUE; - break; - case BSIM3V1_MOD_WVBX: - mod->BSIM3V1wvbx = value->rValue; - mod->BSIM3V1wvbxGiven = TRUE; - break; - case BSIM3V1_MOD_WVBM: - mod->BSIM3V1wvbm = value->rValue; - mod->BSIM3V1wvbmGiven = TRUE; - break; - case BSIM3V1_MOD_WXT: - mod->BSIM3V1wxt = value->rValue; - mod->BSIM3V1wxtGiven = TRUE; - break; - case BSIM3V1_MOD_WK1: - mod->BSIM3V1wk1 = value->rValue; - mod->BSIM3V1wk1Given = TRUE; - break; - case BSIM3V1_MOD_WKT1: - mod->BSIM3V1wkt1 = value->rValue; - mod->BSIM3V1wkt1Given = TRUE; - break; - case BSIM3V1_MOD_WKT1L: - mod->BSIM3V1wkt1l = value->rValue; - mod->BSIM3V1wkt1lGiven = TRUE; - break; - case BSIM3V1_MOD_WKT2: - mod->BSIM3V1wkt2 = value->rValue; - mod->BSIM3V1wkt2Given = TRUE; - break; - case BSIM3V1_MOD_WK2: - mod->BSIM3V1wk2 = value->rValue; - mod->BSIM3V1wk2Given = TRUE; - break; - case BSIM3V1_MOD_WK3: - mod->BSIM3V1wk3 = value->rValue; - mod->BSIM3V1wk3Given = TRUE; - break; - case BSIM3V1_MOD_WK3B: - mod->BSIM3V1wk3b = value->rValue; - mod->BSIM3V1wk3bGiven = TRUE; - break; - case BSIM3V1_MOD_WNLX: - mod->BSIM3V1wnlx = value->rValue; - mod->BSIM3V1wnlxGiven = TRUE; - break; - case BSIM3V1_MOD_WW0: - mod->BSIM3V1ww0 = value->rValue; - mod->BSIM3V1ww0Given = TRUE; - break; - case BSIM3V1_MOD_WDVT0: - mod->BSIM3V1wdvt0 = value->rValue; - mod->BSIM3V1wdvt0Given = TRUE; - break; - case BSIM3V1_MOD_WDVT1: - mod->BSIM3V1wdvt1 = value->rValue; - mod->BSIM3V1wdvt1Given = TRUE; - break; - case BSIM3V1_MOD_WDVT2: - mod->BSIM3V1wdvt2 = value->rValue; - mod->BSIM3V1wdvt2Given = TRUE; - break; - case BSIM3V1_MOD_WDVT0W: - mod->BSIM3V1wdvt0w = value->rValue; - mod->BSIM3V1wdvt0wGiven = TRUE; - break; - case BSIM3V1_MOD_WDVT1W: - mod->BSIM3V1wdvt1w = value->rValue; - mod->BSIM3V1wdvt1wGiven = TRUE; - break; - case BSIM3V1_MOD_WDVT2W: - mod->BSIM3V1wdvt2w = value->rValue; - mod->BSIM3V1wdvt2wGiven = TRUE; - break; - case BSIM3V1_MOD_WDROUT: - mod->BSIM3V1wdrout = value->rValue; - mod->BSIM3V1wdroutGiven = TRUE; - break; - case BSIM3V1_MOD_WDSUB: - mod->BSIM3V1wdsub = value->rValue; - mod->BSIM3V1wdsubGiven = TRUE; - break; - case BSIM3V1_MOD_WVTH0: - mod->BSIM3V1wvth0 = value->rValue; - mod->BSIM3V1wvth0Given = TRUE; - break; - case BSIM3V1_MOD_WUA: - mod->BSIM3V1wua = value->rValue; - mod->BSIM3V1wuaGiven = TRUE; - break; - case BSIM3V1_MOD_WUA1: - mod->BSIM3V1wua1 = value->rValue; - mod->BSIM3V1wua1Given = TRUE; + case BSIM3v1_MOD_WNSUB: + mod->BSIM3v1wnsub = value->rValue; + mod->BSIM3v1wnsubGiven = TRUE; + break; + case BSIM3v1_MOD_WNPEAK: + mod->BSIM3v1wnpeak = value->rValue; + mod->BSIM3v1wnpeakGiven = TRUE; + if (mod->BSIM3v1wnpeak > 1.0e20) + mod->BSIM3v1wnpeak *= 1.0e-6; + break; + case BSIM3v1_MOD_WNGATE: + mod->BSIM3v1wngate = value->rValue; + mod->BSIM3v1wngateGiven = TRUE; + if (mod->BSIM3v1wngate > 1.0e23) + mod->BSIM3v1wngate *= 1.0e-6; + break; + case BSIM3v1_MOD_WGAMMA1: + mod->BSIM3v1wgamma1 = value->rValue; + mod->BSIM3v1wgamma1Given = TRUE; + break; + case BSIM3v1_MOD_WGAMMA2: + mod->BSIM3v1wgamma2 = value->rValue; + mod->BSIM3v1wgamma2Given = TRUE; + break; + case BSIM3v1_MOD_WVBX: + mod->BSIM3v1wvbx = value->rValue; + mod->BSIM3v1wvbxGiven = TRUE; + break; + case BSIM3v1_MOD_WVBM: + mod->BSIM3v1wvbm = value->rValue; + mod->BSIM3v1wvbmGiven = TRUE; + break; + case BSIM3v1_MOD_WXT: + mod->BSIM3v1wxt = value->rValue; + mod->BSIM3v1wxtGiven = TRUE; + break; + case BSIM3v1_MOD_WK1: + mod->BSIM3v1wk1 = value->rValue; + mod->BSIM3v1wk1Given = TRUE; + break; + case BSIM3v1_MOD_WKT1: + mod->BSIM3v1wkt1 = value->rValue; + mod->BSIM3v1wkt1Given = TRUE; + break; + case BSIM3v1_MOD_WKT1L: + mod->BSIM3v1wkt1l = value->rValue; + mod->BSIM3v1wkt1lGiven = TRUE; + break; + case BSIM3v1_MOD_WKT2: + mod->BSIM3v1wkt2 = value->rValue; + mod->BSIM3v1wkt2Given = TRUE; + break; + case BSIM3v1_MOD_WK2: + mod->BSIM3v1wk2 = value->rValue; + mod->BSIM3v1wk2Given = TRUE; + break; + case BSIM3v1_MOD_WK3: + mod->BSIM3v1wk3 = value->rValue; + mod->BSIM3v1wk3Given = TRUE; + break; + case BSIM3v1_MOD_WK3B: + mod->BSIM3v1wk3b = value->rValue; + mod->BSIM3v1wk3bGiven = TRUE; + break; + case BSIM3v1_MOD_WNLX: + mod->BSIM3v1wnlx = value->rValue; + mod->BSIM3v1wnlxGiven = TRUE; + break; + case BSIM3v1_MOD_WW0: + mod->BSIM3v1ww0 = value->rValue; + mod->BSIM3v1ww0Given = TRUE; + break; + case BSIM3v1_MOD_WDVT0: + mod->BSIM3v1wdvt0 = value->rValue; + mod->BSIM3v1wdvt0Given = TRUE; + break; + case BSIM3v1_MOD_WDVT1: + mod->BSIM3v1wdvt1 = value->rValue; + mod->BSIM3v1wdvt1Given = TRUE; + break; + case BSIM3v1_MOD_WDVT2: + mod->BSIM3v1wdvt2 = value->rValue; + mod->BSIM3v1wdvt2Given = TRUE; + break; + case BSIM3v1_MOD_WDVT0W: + mod->BSIM3v1wdvt0w = value->rValue; + mod->BSIM3v1wdvt0wGiven = TRUE; + break; + case BSIM3v1_MOD_WDVT1W: + mod->BSIM3v1wdvt1w = value->rValue; + mod->BSIM3v1wdvt1wGiven = TRUE; + break; + case BSIM3v1_MOD_WDVT2W: + mod->BSIM3v1wdvt2w = value->rValue; + mod->BSIM3v1wdvt2wGiven = TRUE; + break; + case BSIM3v1_MOD_WDROUT: + mod->BSIM3v1wdrout = value->rValue; + mod->BSIM3v1wdroutGiven = TRUE; + break; + case BSIM3v1_MOD_WDSUB: + mod->BSIM3v1wdsub = value->rValue; + mod->BSIM3v1wdsubGiven = TRUE; + break; + case BSIM3v1_MOD_WVTH0: + mod->BSIM3v1wvth0 = value->rValue; + mod->BSIM3v1wvth0Given = TRUE; + break; + case BSIM3v1_MOD_WUA: + mod->BSIM3v1wua = value->rValue; + mod->BSIM3v1wuaGiven = TRUE; + break; + case BSIM3v1_MOD_WUA1: + mod->BSIM3v1wua1 = value->rValue; + mod->BSIM3v1wua1Given = TRUE; break; - case BSIM3V1_MOD_WUB: - mod->BSIM3V1wub = value->rValue; - mod->BSIM3V1wubGiven = TRUE; + case BSIM3v1_MOD_WUB: + mod->BSIM3v1wub = value->rValue; + mod->BSIM3v1wubGiven = TRUE; break; - case BSIM3V1_MOD_WUB1: - mod->BSIM3V1wub1 = value->rValue; - mod->BSIM3V1wub1Given = TRUE; + case BSIM3v1_MOD_WUB1: + mod->BSIM3v1wub1 = value->rValue; + mod->BSIM3v1wub1Given = TRUE; break; - case BSIM3V1_MOD_WUC: - mod->BSIM3V1wuc = value->rValue; - mod->BSIM3V1wucGiven = TRUE; + case BSIM3v1_MOD_WUC: + mod->BSIM3v1wuc = value->rValue; + mod->BSIM3v1wucGiven = TRUE; break; - case BSIM3V1_MOD_WUC1: - mod->BSIM3V1wuc1 = value->rValue; - mod->BSIM3V1wuc1Given = TRUE; + case BSIM3v1_MOD_WUC1: + mod->BSIM3v1wuc1 = value->rValue; + mod->BSIM3v1wuc1Given = TRUE; break; - case BSIM3V1_MOD_WU0 : - mod->BSIM3V1wu0 = value->rValue; - mod->BSIM3V1wu0Given = TRUE; + case BSIM3v1_MOD_WU0 : + mod->BSIM3v1wu0 = value->rValue; + mod->BSIM3v1wu0Given = TRUE; break; - case BSIM3V1_MOD_WUTE : - mod->BSIM3V1wute = value->rValue; - mod->BSIM3V1wuteGiven = TRUE; + case BSIM3v1_MOD_WUTE : + mod->BSIM3v1wute = value->rValue; + mod->BSIM3v1wuteGiven = TRUE; break; - case BSIM3V1_MOD_WVOFF: - mod->BSIM3V1wvoff = value->rValue; - mod->BSIM3V1wvoffGiven = TRUE; + case BSIM3v1_MOD_WVOFF: + mod->BSIM3v1wvoff = value->rValue; + mod->BSIM3v1wvoffGiven = TRUE; break; - case BSIM3V1_MOD_WDELTA : - mod->BSIM3V1wdelta = value->rValue; - mod->BSIM3V1wdeltaGiven = TRUE; + case BSIM3v1_MOD_WDELTA : + mod->BSIM3v1wdelta = value->rValue; + mod->BSIM3v1wdeltaGiven = TRUE; break; - case BSIM3V1_MOD_WRDSW: - mod->BSIM3V1wrdsw = value->rValue; - mod->BSIM3V1wrdswGiven = TRUE; + case BSIM3v1_MOD_WRDSW: + mod->BSIM3v1wrdsw = value->rValue; + mod->BSIM3v1wrdswGiven = TRUE; break; - case BSIM3V1_MOD_WPRWB: - mod->BSIM3V1wprwb = value->rValue; - mod->BSIM3V1wprwbGiven = TRUE; + case BSIM3v1_MOD_WPRWB: + mod->BSIM3v1wprwb = value->rValue; + mod->BSIM3v1wprwbGiven = TRUE; break; - case BSIM3V1_MOD_WPRWG: - mod->BSIM3V1wprwg = value->rValue; - mod->BSIM3V1wprwgGiven = TRUE; + case BSIM3v1_MOD_WPRWG: + mod->BSIM3v1wprwg = value->rValue; + mod->BSIM3v1wprwgGiven = TRUE; break; - case BSIM3V1_MOD_WPRT: - mod->BSIM3V1wprt = value->rValue; - mod->BSIM3V1wprtGiven = TRUE; + case BSIM3v1_MOD_WPRT: + mod->BSIM3v1wprt = value->rValue; + mod->BSIM3v1wprtGiven = TRUE; break; - case BSIM3V1_MOD_WETA0: - mod->BSIM3V1weta0 = value->rValue; - mod->BSIM3V1weta0Given = TRUE; + case BSIM3v1_MOD_WETA0: + mod->BSIM3v1weta0 = value->rValue; + mod->BSIM3v1weta0Given = TRUE; break; - case BSIM3V1_MOD_WETAB: - mod->BSIM3V1wetab = value->rValue; - mod->BSIM3V1wetabGiven = TRUE; + case BSIM3v1_MOD_WETAB: + mod->BSIM3v1wetab = value->rValue; + mod->BSIM3v1wetabGiven = TRUE; break; - case BSIM3V1_MOD_WPCLM: - mod->BSIM3V1wpclm = value->rValue; - mod->BSIM3V1wpclmGiven = TRUE; + case BSIM3v1_MOD_WPCLM: + mod->BSIM3v1wpclm = value->rValue; + mod->BSIM3v1wpclmGiven = TRUE; break; - case BSIM3V1_MOD_WPDIBL1: - mod->BSIM3V1wpdibl1 = value->rValue; - mod->BSIM3V1wpdibl1Given = TRUE; + case BSIM3v1_MOD_WPDIBL1: + mod->BSIM3v1wpdibl1 = value->rValue; + mod->BSIM3v1wpdibl1Given = TRUE; break; - case BSIM3V1_MOD_WPDIBL2: - mod->BSIM3V1wpdibl2 = value->rValue; - mod->BSIM3V1wpdibl2Given = TRUE; + case BSIM3v1_MOD_WPDIBL2: + mod->BSIM3v1wpdibl2 = value->rValue; + mod->BSIM3v1wpdibl2Given = TRUE; break; - case BSIM3V1_MOD_WPDIBLB: - mod->BSIM3V1wpdiblb = value->rValue; - mod->BSIM3V1wpdiblbGiven = TRUE; + case BSIM3v1_MOD_WPDIBLB: + mod->BSIM3v1wpdiblb = value->rValue; + mod->BSIM3v1wpdiblbGiven = TRUE; break; - case BSIM3V1_MOD_WPSCBE1: - mod->BSIM3V1wpscbe1 = value->rValue; - mod->BSIM3V1wpscbe1Given = TRUE; + case BSIM3v1_MOD_WPSCBE1: + mod->BSIM3v1wpscbe1 = value->rValue; + mod->BSIM3v1wpscbe1Given = TRUE; break; - case BSIM3V1_MOD_WPSCBE2: - mod->BSIM3V1wpscbe2 = value->rValue; - mod->BSIM3V1wpscbe2Given = TRUE; + case BSIM3v1_MOD_WPSCBE2: + mod->BSIM3v1wpscbe2 = value->rValue; + mod->BSIM3v1wpscbe2Given = TRUE; break; - case BSIM3V1_MOD_WPVAG: - mod->BSIM3V1wpvag = value->rValue; - mod->BSIM3V1wpvagGiven = TRUE; + case BSIM3v1_MOD_WPVAG: + mod->BSIM3v1wpvag = value->rValue; + mod->BSIM3v1wpvagGiven = TRUE; break; - case BSIM3V1_MOD_WWR : - mod->BSIM3V1wwr = value->rValue; - mod->BSIM3V1wwrGiven = TRUE; + case BSIM3v1_MOD_WWR : + mod->BSIM3v1wwr = value->rValue; + mod->BSIM3v1wwrGiven = TRUE; break; - case BSIM3V1_MOD_WDWG : - mod->BSIM3V1wdwg = value->rValue; - mod->BSIM3V1wdwgGiven = TRUE; + case BSIM3v1_MOD_WDWG : + mod->BSIM3v1wdwg = value->rValue; + mod->BSIM3v1wdwgGiven = TRUE; break; - case BSIM3V1_MOD_WDWB : - mod->BSIM3V1wdwb = value->rValue; - mod->BSIM3V1wdwbGiven = TRUE; + case BSIM3v1_MOD_WDWB : + mod->BSIM3v1wdwb = value->rValue; + mod->BSIM3v1wdwbGiven = TRUE; break; - case BSIM3V1_MOD_WB0 : - mod->BSIM3V1wb0 = value->rValue; - mod->BSIM3V1wb0Given = TRUE; + case BSIM3v1_MOD_WB0 : + mod->BSIM3v1wb0 = value->rValue; + mod->BSIM3v1wb0Given = TRUE; break; - case BSIM3V1_MOD_WB1 : - mod->BSIM3V1wb1 = value->rValue; - mod->BSIM3V1wb1Given = TRUE; + case BSIM3v1_MOD_WB1 : + mod->BSIM3v1wb1 = value->rValue; + mod->BSIM3v1wb1Given = TRUE; break; - case BSIM3V1_MOD_WALPHA0 : - mod->BSIM3V1walpha0 = value->rValue; - mod->BSIM3V1walpha0Given = TRUE; + case BSIM3v1_MOD_WALPHA0 : + mod->BSIM3v1walpha0 = value->rValue; + mod->BSIM3v1walpha0Given = TRUE; break; - case BSIM3V1_MOD_WBETA0 : - mod->BSIM3V1wbeta0 = value->rValue; - mod->BSIM3V1wbeta0Given = TRUE; + case BSIM3v1_MOD_WBETA0 : + mod->BSIM3v1wbeta0 = value->rValue; + mod->BSIM3v1wbeta0Given = TRUE; break; - case BSIM3V1_MOD_WELM : - mod->BSIM3V1welm = value->rValue; - mod->BSIM3V1welmGiven = TRUE; + case BSIM3v1_MOD_WELM : + mod->BSIM3v1welm = value->rValue; + mod->BSIM3v1welmGiven = TRUE; break; - case BSIM3V1_MOD_WCGSL : - mod->BSIM3V1wcgsl = value->rValue; - mod->BSIM3V1wcgslGiven = TRUE; + case BSIM3v1_MOD_WCGSL : + mod->BSIM3v1wcgsl = value->rValue; + mod->BSIM3v1wcgslGiven = TRUE; break; - case BSIM3V1_MOD_WCGDL : - mod->BSIM3V1wcgdl = value->rValue; - mod->BSIM3V1wcgdlGiven = TRUE; + case BSIM3v1_MOD_WCGDL : + mod->BSIM3v1wcgdl = value->rValue; + mod->BSIM3v1wcgdlGiven = TRUE; break; - case BSIM3V1_MOD_WCKAPPA : - mod->BSIM3V1wckappa = value->rValue; - mod->BSIM3V1wckappaGiven = TRUE; + case BSIM3v1_MOD_WCKAPPA : + mod->BSIM3v1wckappa = value->rValue; + mod->BSIM3v1wckappaGiven = TRUE; break; - case BSIM3V1_MOD_WCF : - mod->BSIM3V1wcf = value->rValue; - mod->BSIM3V1wcfGiven = TRUE; + case BSIM3v1_MOD_WCF : + mod->BSIM3v1wcf = value->rValue; + mod->BSIM3v1wcfGiven = TRUE; break; - case BSIM3V1_MOD_WCLC : - mod->BSIM3V1wclc = value->rValue; - mod->BSIM3V1wclcGiven = TRUE; + case BSIM3v1_MOD_WCLC : + mod->BSIM3v1wclc = value->rValue; + mod->BSIM3v1wclcGiven = TRUE; break; - case BSIM3V1_MOD_WCLE : - mod->BSIM3V1wcle = value->rValue; - mod->BSIM3V1wcleGiven = TRUE; + case BSIM3v1_MOD_WCLE : + mod->BSIM3v1wcle = value->rValue; + mod->BSIM3v1wcleGiven = TRUE; break; - case BSIM3V1_MOD_WVFBCV : - mod->BSIM3V1wvfbcv = value->rValue; - mod->BSIM3V1wvfbcvGiven = TRUE; + case BSIM3v1_MOD_WVFBCV : + mod->BSIM3v1wvfbcv = value->rValue; + mod->BSIM3v1wvfbcvGiven = TRUE; break; /* Cross-term dependence */ - case BSIM3V1_MOD_PCDSC : - mod->BSIM3V1pcdsc = value->rValue; - mod->BSIM3V1pcdscGiven = TRUE; + case BSIM3v1_MOD_PCDSC : + mod->BSIM3v1pcdsc = value->rValue; + mod->BSIM3v1pcdscGiven = TRUE; break; - case BSIM3V1_MOD_PCDSCB : - mod->BSIM3V1pcdscb = value->rValue; - mod->BSIM3V1pcdscbGiven = TRUE; + case BSIM3v1_MOD_PCDSCB : + mod->BSIM3v1pcdscb = value->rValue; + mod->BSIM3v1pcdscbGiven = TRUE; break; - case BSIM3V1_MOD_PCDSCD : - mod->BSIM3V1pcdscd = value->rValue; - mod->BSIM3V1pcdscdGiven = TRUE; + case BSIM3v1_MOD_PCDSCD : + mod->BSIM3v1pcdscd = value->rValue; + mod->BSIM3v1pcdscdGiven = TRUE; break; - case BSIM3V1_MOD_PCIT : - mod->BSIM3V1pcit = value->rValue; - mod->BSIM3V1pcitGiven = TRUE; + case BSIM3v1_MOD_PCIT : + mod->BSIM3v1pcit = value->rValue; + mod->BSIM3v1pcitGiven = TRUE; break; - case BSIM3V1_MOD_PNFACTOR : - mod->BSIM3V1pnfactor = value->rValue; - mod->BSIM3V1pnfactorGiven = TRUE; + case BSIM3v1_MOD_PNFACTOR : + mod->BSIM3v1pnfactor = value->rValue; + mod->BSIM3v1pnfactorGiven = TRUE; break; - case BSIM3V1_MOD_PXJ: - mod->BSIM3V1pxj = value->rValue; - mod->BSIM3V1pxjGiven = TRUE; + case BSIM3v1_MOD_PXJ: + mod->BSIM3v1pxj = value->rValue; + mod->BSIM3v1pxjGiven = TRUE; break; - case BSIM3V1_MOD_PVSAT: - mod->BSIM3V1pvsat = value->rValue; - mod->BSIM3V1pvsatGiven = TRUE; + case BSIM3v1_MOD_PVSAT: + mod->BSIM3v1pvsat = value->rValue; + mod->BSIM3v1pvsatGiven = TRUE; break; - case BSIM3V1_MOD_PA0: - mod->BSIM3V1pa0 = value->rValue; - mod->BSIM3V1pa0Given = TRUE; + case BSIM3v1_MOD_PA0: + mod->BSIM3v1pa0 = value->rValue; + mod->BSIM3v1pa0Given = TRUE; break; - case BSIM3V1_MOD_PAGS: - mod->BSIM3V1pags = value->rValue; - mod->BSIM3V1pagsGiven = TRUE; + case BSIM3v1_MOD_PAGS: + mod->BSIM3v1pags = value->rValue; + mod->BSIM3v1pagsGiven = TRUE; break; - case BSIM3V1_MOD_PA1: - mod->BSIM3V1pa1 = value->rValue; - mod->BSIM3V1pa1Given = TRUE; + case BSIM3v1_MOD_PA1: + mod->BSIM3v1pa1 = value->rValue; + mod->BSIM3v1pa1Given = TRUE; break; - case BSIM3V1_MOD_PA2: - mod->BSIM3V1pa2 = value->rValue; - mod->BSIM3V1pa2Given = TRUE; + case BSIM3v1_MOD_PA2: + mod->BSIM3v1pa2 = value->rValue; + mod->BSIM3v1pa2Given = TRUE; break; - case BSIM3V1_MOD_PAT: - mod->BSIM3V1pat = value->rValue; - mod->BSIM3V1patGiven = TRUE; + case BSIM3v1_MOD_PAT: + mod->BSIM3v1pat = value->rValue; + mod->BSIM3v1patGiven = TRUE; break; - case BSIM3V1_MOD_PKETA: - mod->BSIM3V1pketa = value->rValue; - mod->BSIM3V1pketaGiven = TRUE; + case BSIM3v1_MOD_PKETA: + mod->BSIM3v1pketa = value->rValue; + mod->BSIM3v1pketaGiven = TRUE; break; - case BSIM3V1_MOD_PNSUB: - mod->BSIM3V1pnsub = value->rValue; - mod->BSIM3V1pnsubGiven = TRUE; - break; - case BSIM3V1_MOD_PNPEAK: - mod->BSIM3V1pnpeak = value->rValue; - mod->BSIM3V1pnpeakGiven = TRUE; - if (mod->BSIM3V1pnpeak > 1.0e20) - mod->BSIM3V1pnpeak *= 1.0e-6; - break; - case BSIM3V1_MOD_PNGATE: - mod->BSIM3V1pngate = value->rValue; - mod->BSIM3V1pngateGiven = TRUE; - if (mod->BSIM3V1pngate > 1.0e23) - mod->BSIM3V1pngate *= 1.0e-6; - break; - case BSIM3V1_MOD_PGAMMA1: - mod->BSIM3V1pgamma1 = value->rValue; - mod->BSIM3V1pgamma1Given = TRUE; - break; - case BSIM3V1_MOD_PGAMMA2: - mod->BSIM3V1pgamma2 = value->rValue; - mod->BSIM3V1pgamma2Given = TRUE; - break; - case BSIM3V1_MOD_PVBX: - mod->BSIM3V1pvbx = value->rValue; - mod->BSIM3V1pvbxGiven = TRUE; - break; - case BSIM3V1_MOD_PVBM: - mod->BSIM3V1pvbm = value->rValue; - mod->BSIM3V1pvbmGiven = TRUE; - break; - case BSIM3V1_MOD_PXT: - mod->BSIM3V1pxt = value->rValue; - mod->BSIM3V1pxtGiven = TRUE; - break; - case BSIM3V1_MOD_PK1: - mod->BSIM3V1pk1 = value->rValue; - mod->BSIM3V1pk1Given = TRUE; - break; - case BSIM3V1_MOD_PKT1: - mod->BSIM3V1pkt1 = value->rValue; - mod->BSIM3V1pkt1Given = TRUE; - break; - case BSIM3V1_MOD_PKT1L: - mod->BSIM3V1pkt1l = value->rValue; - mod->BSIM3V1pkt1lGiven = TRUE; - break; - case BSIM3V1_MOD_PKT2: - mod->BSIM3V1pkt2 = value->rValue; - mod->BSIM3V1pkt2Given = TRUE; - break; - case BSIM3V1_MOD_PK2: - mod->BSIM3V1pk2 = value->rValue; - mod->BSIM3V1pk2Given = TRUE; - break; - case BSIM3V1_MOD_PK3: - mod->BSIM3V1pk3 = value->rValue; - mod->BSIM3V1pk3Given = TRUE; - break; - case BSIM3V1_MOD_PK3B: - mod->BSIM3V1pk3b = value->rValue; - mod->BSIM3V1pk3bGiven = TRUE; - break; - case BSIM3V1_MOD_PNLX: - mod->BSIM3V1pnlx = value->rValue; - mod->BSIM3V1pnlxGiven = TRUE; - break; - case BSIM3V1_MOD_PW0: - mod->BSIM3V1pw0 = value->rValue; - mod->BSIM3V1pw0Given = TRUE; - break; - case BSIM3V1_MOD_PDVT0: - mod->BSIM3V1pdvt0 = value->rValue; - mod->BSIM3V1pdvt0Given = TRUE; - break; - case BSIM3V1_MOD_PDVT1: - mod->BSIM3V1pdvt1 = value->rValue; - mod->BSIM3V1pdvt1Given = TRUE; - break; - case BSIM3V1_MOD_PDVT2: - mod->BSIM3V1pdvt2 = value->rValue; - mod->BSIM3V1pdvt2Given = TRUE; - break; - case BSIM3V1_MOD_PDVT0W: - mod->BSIM3V1pdvt0w = value->rValue; - mod->BSIM3V1pdvt0wGiven = TRUE; - break; - case BSIM3V1_MOD_PDVT1W: - mod->BSIM3V1pdvt1w = value->rValue; - mod->BSIM3V1pdvt1wGiven = TRUE; - break; - case BSIM3V1_MOD_PDVT2W: - mod->BSIM3V1pdvt2w = value->rValue; - mod->BSIM3V1pdvt2wGiven = TRUE; - break; - case BSIM3V1_MOD_PDROUT: - mod->BSIM3V1pdrout = value->rValue; - mod->BSIM3V1pdroutGiven = TRUE; - break; - case BSIM3V1_MOD_PDSUB: - mod->BSIM3V1pdsub = value->rValue; - mod->BSIM3V1pdsubGiven = TRUE; - break; - case BSIM3V1_MOD_PVTH0: - mod->BSIM3V1pvth0 = value->rValue; - mod->BSIM3V1pvth0Given = TRUE; - break; - case BSIM3V1_MOD_PUA: - mod->BSIM3V1pua = value->rValue; - mod->BSIM3V1puaGiven = TRUE; - break; - case BSIM3V1_MOD_PUA1: - mod->BSIM3V1pua1 = value->rValue; - mod->BSIM3V1pua1Given = TRUE; + case BSIM3v1_MOD_PNSUB: + mod->BSIM3v1pnsub = value->rValue; + mod->BSIM3v1pnsubGiven = TRUE; + break; + case BSIM3v1_MOD_PNPEAK: + mod->BSIM3v1pnpeak = value->rValue; + mod->BSIM3v1pnpeakGiven = TRUE; + if (mod->BSIM3v1pnpeak > 1.0e20) + mod->BSIM3v1pnpeak *= 1.0e-6; + break; + case BSIM3v1_MOD_PNGATE: + mod->BSIM3v1pngate = value->rValue; + mod->BSIM3v1pngateGiven = TRUE; + if (mod->BSIM3v1pngate > 1.0e23) + mod->BSIM3v1pngate *= 1.0e-6; + break; + case BSIM3v1_MOD_PGAMMA1: + mod->BSIM3v1pgamma1 = value->rValue; + mod->BSIM3v1pgamma1Given = TRUE; + break; + case BSIM3v1_MOD_PGAMMA2: + mod->BSIM3v1pgamma2 = value->rValue; + mod->BSIM3v1pgamma2Given = TRUE; + break; + case BSIM3v1_MOD_PVBX: + mod->BSIM3v1pvbx = value->rValue; + mod->BSIM3v1pvbxGiven = TRUE; + break; + case BSIM3v1_MOD_PVBM: + mod->BSIM3v1pvbm = value->rValue; + mod->BSIM3v1pvbmGiven = TRUE; + break; + case BSIM3v1_MOD_PXT: + mod->BSIM3v1pxt = value->rValue; + mod->BSIM3v1pxtGiven = TRUE; + break; + case BSIM3v1_MOD_PK1: + mod->BSIM3v1pk1 = value->rValue; + mod->BSIM3v1pk1Given = TRUE; + break; + case BSIM3v1_MOD_PKT1: + mod->BSIM3v1pkt1 = value->rValue; + mod->BSIM3v1pkt1Given = TRUE; + break; + case BSIM3v1_MOD_PKT1L: + mod->BSIM3v1pkt1l = value->rValue; + mod->BSIM3v1pkt1lGiven = TRUE; + break; + case BSIM3v1_MOD_PKT2: + mod->BSIM3v1pkt2 = value->rValue; + mod->BSIM3v1pkt2Given = TRUE; + break; + case BSIM3v1_MOD_PK2: + mod->BSIM3v1pk2 = value->rValue; + mod->BSIM3v1pk2Given = TRUE; + break; + case BSIM3v1_MOD_PK3: + mod->BSIM3v1pk3 = value->rValue; + mod->BSIM3v1pk3Given = TRUE; + break; + case BSIM3v1_MOD_PK3B: + mod->BSIM3v1pk3b = value->rValue; + mod->BSIM3v1pk3bGiven = TRUE; + break; + case BSIM3v1_MOD_PNLX: + mod->BSIM3v1pnlx = value->rValue; + mod->BSIM3v1pnlxGiven = TRUE; + break; + case BSIM3v1_MOD_PW0: + mod->BSIM3v1pw0 = value->rValue; + mod->BSIM3v1pw0Given = TRUE; + break; + case BSIM3v1_MOD_PDVT0: + mod->BSIM3v1pdvt0 = value->rValue; + mod->BSIM3v1pdvt0Given = TRUE; + break; + case BSIM3v1_MOD_PDVT1: + mod->BSIM3v1pdvt1 = value->rValue; + mod->BSIM3v1pdvt1Given = TRUE; + break; + case BSIM3v1_MOD_PDVT2: + mod->BSIM3v1pdvt2 = value->rValue; + mod->BSIM3v1pdvt2Given = TRUE; + break; + case BSIM3v1_MOD_PDVT0W: + mod->BSIM3v1pdvt0w = value->rValue; + mod->BSIM3v1pdvt0wGiven = TRUE; + break; + case BSIM3v1_MOD_PDVT1W: + mod->BSIM3v1pdvt1w = value->rValue; + mod->BSIM3v1pdvt1wGiven = TRUE; + break; + case BSIM3v1_MOD_PDVT2W: + mod->BSIM3v1pdvt2w = value->rValue; + mod->BSIM3v1pdvt2wGiven = TRUE; + break; + case BSIM3v1_MOD_PDROUT: + mod->BSIM3v1pdrout = value->rValue; + mod->BSIM3v1pdroutGiven = TRUE; + break; + case BSIM3v1_MOD_PDSUB: + mod->BSIM3v1pdsub = value->rValue; + mod->BSIM3v1pdsubGiven = TRUE; + break; + case BSIM3v1_MOD_PVTH0: + mod->BSIM3v1pvth0 = value->rValue; + mod->BSIM3v1pvth0Given = TRUE; + break; + case BSIM3v1_MOD_PUA: + mod->BSIM3v1pua = value->rValue; + mod->BSIM3v1puaGiven = TRUE; + break; + case BSIM3v1_MOD_PUA1: + mod->BSIM3v1pua1 = value->rValue; + mod->BSIM3v1pua1Given = TRUE; break; - case BSIM3V1_MOD_PUB: - mod->BSIM3V1pub = value->rValue; - mod->BSIM3V1pubGiven = TRUE; + case BSIM3v1_MOD_PUB: + mod->BSIM3v1pub = value->rValue; + mod->BSIM3v1pubGiven = TRUE; break; - case BSIM3V1_MOD_PUB1: - mod->BSIM3V1pub1 = value->rValue; - mod->BSIM3V1pub1Given = TRUE; + case BSIM3v1_MOD_PUB1: + mod->BSIM3v1pub1 = value->rValue; + mod->BSIM3v1pub1Given = TRUE; break; - case BSIM3V1_MOD_PUC: - mod->BSIM3V1puc = value->rValue; - mod->BSIM3V1pucGiven = TRUE; + case BSIM3v1_MOD_PUC: + mod->BSIM3v1puc = value->rValue; + mod->BSIM3v1pucGiven = TRUE; break; - case BSIM3V1_MOD_PUC1: - mod->BSIM3V1puc1 = value->rValue; - mod->BSIM3V1puc1Given = TRUE; + case BSIM3v1_MOD_PUC1: + mod->BSIM3v1puc1 = value->rValue; + mod->BSIM3v1puc1Given = TRUE; break; - case BSIM3V1_MOD_PU0 : - mod->BSIM3V1pu0 = value->rValue; - mod->BSIM3V1pu0Given = TRUE; + case BSIM3v1_MOD_PU0 : + mod->BSIM3v1pu0 = value->rValue; + mod->BSIM3v1pu0Given = TRUE; break; - case BSIM3V1_MOD_PUTE : - mod->BSIM3V1pute = value->rValue; - mod->BSIM3V1puteGiven = TRUE; + case BSIM3v1_MOD_PUTE : + mod->BSIM3v1pute = value->rValue; + mod->BSIM3v1puteGiven = TRUE; break; - case BSIM3V1_MOD_PVOFF: - mod->BSIM3V1pvoff = value->rValue; - mod->BSIM3V1pvoffGiven = TRUE; + case BSIM3v1_MOD_PVOFF: + mod->BSIM3v1pvoff = value->rValue; + mod->BSIM3v1pvoffGiven = TRUE; break; - case BSIM3V1_MOD_PDELTA : - mod->BSIM3V1pdelta = value->rValue; - mod->BSIM3V1pdeltaGiven = TRUE; + case BSIM3v1_MOD_PDELTA : + mod->BSIM3v1pdelta = value->rValue; + mod->BSIM3v1pdeltaGiven = TRUE; break; - case BSIM3V1_MOD_PRDSW: - mod->BSIM3V1prdsw = value->rValue; - mod->BSIM3V1prdswGiven = TRUE; + case BSIM3v1_MOD_PRDSW: + mod->BSIM3v1prdsw = value->rValue; + mod->BSIM3v1prdswGiven = TRUE; break; - case BSIM3V1_MOD_PPRWB: - mod->BSIM3V1pprwb = value->rValue; - mod->BSIM3V1pprwbGiven = TRUE; + case BSIM3v1_MOD_PPRWB: + mod->BSIM3v1pprwb = value->rValue; + mod->BSIM3v1pprwbGiven = TRUE; break; - case BSIM3V1_MOD_PPRWG: - mod->BSIM3V1pprwg = value->rValue; - mod->BSIM3V1pprwgGiven = TRUE; + case BSIM3v1_MOD_PPRWG: + mod->BSIM3v1pprwg = value->rValue; + mod->BSIM3v1pprwgGiven = TRUE; break; - case BSIM3V1_MOD_PPRT: - mod->BSIM3V1pprt = value->rValue; - mod->BSIM3V1pprtGiven = TRUE; + case BSIM3v1_MOD_PPRT: + mod->BSIM3v1pprt = value->rValue; + mod->BSIM3v1pprtGiven = TRUE; break; - case BSIM3V1_MOD_PETA0: - mod->BSIM3V1peta0 = value->rValue; - mod->BSIM3V1peta0Given = TRUE; + case BSIM3v1_MOD_PETA0: + mod->BSIM3v1peta0 = value->rValue; + mod->BSIM3v1peta0Given = TRUE; break; - case BSIM3V1_MOD_PETAB: - mod->BSIM3V1petab = value->rValue; - mod->BSIM3V1petabGiven = TRUE; + case BSIM3v1_MOD_PETAB: + mod->BSIM3v1petab = value->rValue; + mod->BSIM3v1petabGiven = TRUE; break; - case BSIM3V1_MOD_PPCLM: - mod->BSIM3V1ppclm = value->rValue; - mod->BSIM3V1ppclmGiven = TRUE; + case BSIM3v1_MOD_PPCLM: + mod->BSIM3v1ppclm = value->rValue; + mod->BSIM3v1ppclmGiven = TRUE; break; - case BSIM3V1_MOD_PPDIBL1: - mod->BSIM3V1ppdibl1 = value->rValue; - mod->BSIM3V1ppdibl1Given = TRUE; + case BSIM3v1_MOD_PPDIBL1: + mod->BSIM3v1ppdibl1 = value->rValue; + mod->BSIM3v1ppdibl1Given = TRUE; break; - case BSIM3V1_MOD_PPDIBL2: - mod->BSIM3V1ppdibl2 = value->rValue; - mod->BSIM3V1ppdibl2Given = TRUE; + case BSIM3v1_MOD_PPDIBL2: + mod->BSIM3v1ppdibl2 = value->rValue; + mod->BSIM3v1ppdibl2Given = TRUE; break; - case BSIM3V1_MOD_PPDIBLB: - mod->BSIM3V1ppdiblb = value->rValue; - mod->BSIM3V1ppdiblbGiven = TRUE; + case BSIM3v1_MOD_PPDIBLB: + mod->BSIM3v1ppdiblb = value->rValue; + mod->BSIM3v1ppdiblbGiven = TRUE; break; - case BSIM3V1_MOD_PPSCBE1: - mod->BSIM3V1ppscbe1 = value->rValue; - mod->BSIM3V1ppscbe1Given = TRUE; + case BSIM3v1_MOD_PPSCBE1: + mod->BSIM3v1ppscbe1 = value->rValue; + mod->BSIM3v1ppscbe1Given = TRUE; break; - case BSIM3V1_MOD_PPSCBE2: - mod->BSIM3V1ppscbe2 = value->rValue; - mod->BSIM3V1ppscbe2Given = TRUE; + case BSIM3v1_MOD_PPSCBE2: + mod->BSIM3v1ppscbe2 = value->rValue; + mod->BSIM3v1ppscbe2Given = TRUE; break; - case BSIM3V1_MOD_PPVAG: - mod->BSIM3V1ppvag = value->rValue; - mod->BSIM3V1ppvagGiven = TRUE; + case BSIM3v1_MOD_PPVAG: + mod->BSIM3v1ppvag = value->rValue; + mod->BSIM3v1ppvagGiven = TRUE; break; - case BSIM3V1_MOD_PWR : - mod->BSIM3V1pwr = value->rValue; - mod->BSIM3V1pwrGiven = TRUE; + case BSIM3v1_MOD_PWR : + mod->BSIM3v1pwr = value->rValue; + mod->BSIM3v1pwrGiven = TRUE; break; - case BSIM3V1_MOD_PDWG : - mod->BSIM3V1pdwg = value->rValue; - mod->BSIM3V1pdwgGiven = TRUE; + case BSIM3v1_MOD_PDWG : + mod->BSIM3v1pdwg = value->rValue; + mod->BSIM3v1pdwgGiven = TRUE; break; - case BSIM3V1_MOD_PDWB : - mod->BSIM3V1pdwb = value->rValue; - mod->BSIM3V1pdwbGiven = TRUE; + case BSIM3v1_MOD_PDWB : + mod->BSIM3v1pdwb = value->rValue; + mod->BSIM3v1pdwbGiven = TRUE; break; - case BSIM3V1_MOD_PB0 : - mod->BSIM3V1pb0 = value->rValue; - mod->BSIM3V1pb0Given = TRUE; + case BSIM3v1_MOD_PB0 : + mod->BSIM3v1pb0 = value->rValue; + mod->BSIM3v1pb0Given = TRUE; break; - case BSIM3V1_MOD_PB1 : - mod->BSIM3V1pb1 = value->rValue; - mod->BSIM3V1pb1Given = TRUE; + case BSIM3v1_MOD_PB1 : + mod->BSIM3v1pb1 = value->rValue; + mod->BSIM3v1pb1Given = TRUE; break; - case BSIM3V1_MOD_PALPHA0 : - mod->BSIM3V1palpha0 = value->rValue; - mod->BSIM3V1palpha0Given = TRUE; + case BSIM3v1_MOD_PALPHA0 : + mod->BSIM3v1palpha0 = value->rValue; + mod->BSIM3v1palpha0Given = TRUE; break; - case BSIM3V1_MOD_PBETA0 : - mod->BSIM3V1pbeta0 = value->rValue; - mod->BSIM3V1pbeta0Given = TRUE; + case BSIM3v1_MOD_PBETA0 : + mod->BSIM3v1pbeta0 = value->rValue; + mod->BSIM3v1pbeta0Given = TRUE; break; - case BSIM3V1_MOD_PELM : - mod->BSIM3V1pelm = value->rValue; - mod->BSIM3V1pelmGiven = TRUE; + case BSIM3v1_MOD_PELM : + mod->BSIM3v1pelm = value->rValue; + mod->BSIM3v1pelmGiven = TRUE; break; - case BSIM3V1_MOD_PCGSL : - mod->BSIM3V1pcgsl = value->rValue; - mod->BSIM3V1pcgslGiven = TRUE; + case BSIM3v1_MOD_PCGSL : + mod->BSIM3v1pcgsl = value->rValue; + mod->BSIM3v1pcgslGiven = TRUE; break; - case BSIM3V1_MOD_PCGDL : - mod->BSIM3V1pcgdl = value->rValue; - mod->BSIM3V1pcgdlGiven = TRUE; + case BSIM3v1_MOD_PCGDL : + mod->BSIM3v1pcgdl = value->rValue; + mod->BSIM3v1pcgdlGiven = TRUE; break; - case BSIM3V1_MOD_PCKAPPA : - mod->BSIM3V1pckappa = value->rValue; - mod->BSIM3V1pckappaGiven = TRUE; + case BSIM3v1_MOD_PCKAPPA : + mod->BSIM3v1pckappa = value->rValue; + mod->BSIM3v1pckappaGiven = TRUE; break; - case BSIM3V1_MOD_PCF : - mod->BSIM3V1pcf = value->rValue; - mod->BSIM3V1pcfGiven = TRUE; + case BSIM3v1_MOD_PCF : + mod->BSIM3v1pcf = value->rValue; + mod->BSIM3v1pcfGiven = TRUE; break; - case BSIM3V1_MOD_PCLC : - mod->BSIM3V1pclc = value->rValue; - mod->BSIM3V1pclcGiven = TRUE; + case BSIM3v1_MOD_PCLC : + mod->BSIM3v1pclc = value->rValue; + mod->BSIM3v1pclcGiven = TRUE; break; - case BSIM3V1_MOD_PCLE : - mod->BSIM3V1pcle = value->rValue; - mod->BSIM3V1pcleGiven = TRUE; + case BSIM3v1_MOD_PCLE : + mod->BSIM3v1pcle = value->rValue; + mod->BSIM3v1pcleGiven = TRUE; break; - case BSIM3V1_MOD_PVFBCV : - mod->BSIM3V1pvfbcv = value->rValue; - mod->BSIM3V1pvfbcvGiven = TRUE; + case BSIM3v1_MOD_PVFBCV : + mod->BSIM3v1pvfbcv = value->rValue; + mod->BSIM3v1pvfbcvGiven = TRUE; break; - case BSIM3V1_MOD_TNOM : - mod->BSIM3V1tnom = value->rValue + 273.15; - mod->BSIM3V1tnomGiven = TRUE; + case BSIM3v1_MOD_TNOM : + mod->BSIM3v1tnom = value->rValue + 273.15; + mod->BSIM3v1tnomGiven = TRUE; break; - case BSIM3V1_MOD_CGSO : - mod->BSIM3V1cgso = value->rValue; - mod->BSIM3V1cgsoGiven = TRUE; + case BSIM3v1_MOD_CGSO : + mod->BSIM3v1cgso = value->rValue; + mod->BSIM3v1cgsoGiven = TRUE; break; - case BSIM3V1_MOD_CGDO : - mod->BSIM3V1cgdo = value->rValue; - mod->BSIM3V1cgdoGiven = TRUE; + case BSIM3v1_MOD_CGDO : + mod->BSIM3v1cgdo = value->rValue; + mod->BSIM3v1cgdoGiven = TRUE; break; - case BSIM3V1_MOD_CGBO : - mod->BSIM3V1cgbo = value->rValue; - mod->BSIM3V1cgboGiven = TRUE; + case BSIM3v1_MOD_CGBO : + mod->BSIM3v1cgbo = value->rValue; + mod->BSIM3v1cgboGiven = TRUE; break; - case BSIM3V1_MOD_XPART : - mod->BSIM3V1xpart = value->rValue; - mod->BSIM3V1xpartGiven = TRUE; + case BSIM3v1_MOD_XPART : + mod->BSIM3v1xpart = value->rValue; + mod->BSIM3v1xpartGiven = TRUE; break; - case BSIM3V1_MOD_RSH : - mod->BSIM3V1sheetResistance = value->rValue; - mod->BSIM3V1sheetResistanceGiven = TRUE; + case BSIM3v1_MOD_RSH : + mod->BSIM3v1sheetResistance = value->rValue; + mod->BSIM3v1sheetResistanceGiven = TRUE; break; - case BSIM3V1_MOD_JS : - mod->BSIM3V1jctSatCurDensity = value->rValue; - mod->BSIM3V1jctSatCurDensityGiven = TRUE; + case BSIM3v1_MOD_JS : + mod->BSIM3v1jctSatCurDensity = value->rValue; + mod->BSIM3v1jctSatCurDensityGiven = TRUE; break; - case BSIM3V1_MOD_JSW : - mod->BSIM3V1jctSidewallSatCurDensity = value->rValue; - mod->BSIM3V1jctSidewallSatCurDensityGiven = TRUE; + case BSIM3v1_MOD_JSW : + mod->BSIM3v1jctSidewallSatCurDensity = value->rValue; + mod->BSIM3v1jctSidewallSatCurDensityGiven = TRUE; break; - case BSIM3V1_MOD_PB : - mod->BSIM3V1bulkJctPotential = value->rValue; - mod->BSIM3V1bulkJctPotentialGiven = TRUE; + case BSIM3v1_MOD_PB : + mod->BSIM3v1bulkJctPotential = value->rValue; + mod->BSIM3v1bulkJctPotentialGiven = TRUE; break; - case BSIM3V1_MOD_MJ : - mod->BSIM3V1bulkJctBotGradingCoeff = value->rValue; - mod->BSIM3V1bulkJctBotGradingCoeffGiven = TRUE; + case BSIM3v1_MOD_MJ : + mod->BSIM3v1bulkJctBotGradingCoeff = value->rValue; + mod->BSIM3v1bulkJctBotGradingCoeffGiven = TRUE; break; - case BSIM3V1_MOD_PBSW : - mod->BSIM3V1sidewallJctPotential = value->rValue; - mod->BSIM3V1sidewallJctPotentialGiven = TRUE; + case BSIM3v1_MOD_PBSW : + mod->BSIM3v1sidewallJctPotential = value->rValue; + mod->BSIM3v1sidewallJctPotentialGiven = TRUE; break; - case BSIM3V1_MOD_MJSW : - mod->BSIM3V1bulkJctSideGradingCoeff = value->rValue; - mod->BSIM3V1bulkJctSideGradingCoeffGiven = TRUE; + case BSIM3v1_MOD_MJSW : + mod->BSIM3v1bulkJctSideGradingCoeff = value->rValue; + mod->BSIM3v1bulkJctSideGradingCoeffGiven = TRUE; break; - case BSIM3V1_MOD_CJ : - mod->BSIM3V1unitAreaJctCap = value->rValue; - mod->BSIM3V1unitAreaJctCapGiven = TRUE; + case BSIM3v1_MOD_CJ : + mod->BSIM3v1unitAreaJctCap = value->rValue; + mod->BSIM3v1unitAreaJctCapGiven = TRUE; break; - case BSIM3V1_MOD_CJSW : - mod->BSIM3V1unitLengthSidewallJctCap = value->rValue; - mod->BSIM3V1unitLengthSidewallJctCapGiven = TRUE; + case BSIM3v1_MOD_CJSW : + mod->BSIM3v1unitLengthSidewallJctCap = value->rValue; + mod->BSIM3v1unitLengthSidewallJctCapGiven = TRUE; break; - case BSIM3V1_MOD_NJ : - mod->BSIM3V1jctEmissionCoeff = value->rValue; - mod->BSIM3V1jctEmissionCoeffGiven = TRUE; + case BSIM3v1_MOD_NJ : + mod->BSIM3v1jctEmissionCoeff = value->rValue; + mod->BSIM3v1jctEmissionCoeffGiven = TRUE; break; - case BSIM3V1_MOD_PBSWG : - mod->BSIM3V1GatesidewallJctPotential = value->rValue; - mod->BSIM3V1GatesidewallJctPotentialGiven = TRUE; + case BSIM3v1_MOD_PBSWG : + mod->BSIM3v1GatesidewallJctPotential = value->rValue; + mod->BSIM3v1GatesidewallJctPotentialGiven = TRUE; break; - case BSIM3V1_MOD_MJSWG : - mod->BSIM3V1bulkJctGateSideGradingCoeff = value->rValue; - mod->BSIM3V1bulkJctGateSideGradingCoeffGiven = TRUE; + case BSIM3v1_MOD_MJSWG : + mod->BSIM3v1bulkJctGateSideGradingCoeff = value->rValue; + mod->BSIM3v1bulkJctGateSideGradingCoeffGiven = TRUE; break; - case BSIM3V1_MOD_CJSWG : - mod->BSIM3V1unitLengthGateSidewallJctCap = value->rValue; - mod->BSIM3V1unitLengthGateSidewallJctCapGiven = TRUE; + case BSIM3v1_MOD_CJSWG : + mod->BSIM3v1unitLengthGateSidewallJctCap = value->rValue; + mod->BSIM3v1unitLengthGateSidewallJctCapGiven = TRUE; break; - case BSIM3V1_MOD_XTI : - mod->BSIM3V1jctTempExponent = value->rValue; - mod->BSIM3V1jctTempExponentGiven = TRUE; + case BSIM3v1_MOD_XTI : + mod->BSIM3v1jctTempExponent = value->rValue; + mod->BSIM3v1jctTempExponentGiven = TRUE; break; - case BSIM3V1_MOD_LINT : - mod->BSIM3V1Lint = value->rValue; - mod->BSIM3V1LintGiven = TRUE; + case BSIM3v1_MOD_LINT : + mod->BSIM3v1Lint = value->rValue; + mod->BSIM3v1LintGiven = TRUE; break; - case BSIM3V1_MOD_LL : - mod->BSIM3V1Ll = value->rValue; - mod->BSIM3V1LlGiven = TRUE; + case BSIM3v1_MOD_LL : + mod->BSIM3v1Ll = value->rValue; + mod->BSIM3v1LlGiven = TRUE; break; - case BSIM3V1_MOD_LLN : - mod->BSIM3V1Lln = value->rValue; - mod->BSIM3V1LlnGiven = TRUE; + case BSIM3v1_MOD_LLN : + mod->BSIM3v1Lln = value->rValue; + mod->BSIM3v1LlnGiven = TRUE; break; - case BSIM3V1_MOD_LW : - mod->BSIM3V1Lw = value->rValue; - mod->BSIM3V1LwGiven = TRUE; + case BSIM3v1_MOD_LW : + mod->BSIM3v1Lw = value->rValue; + mod->BSIM3v1LwGiven = TRUE; break; - case BSIM3V1_MOD_LWN : - mod->BSIM3V1Lwn = value->rValue; - mod->BSIM3V1LwnGiven = TRUE; + case BSIM3v1_MOD_LWN : + mod->BSIM3v1Lwn = value->rValue; + mod->BSIM3v1LwnGiven = TRUE; break; - case BSIM3V1_MOD_LWL : - mod->BSIM3V1Lwl = value->rValue; - mod->BSIM3V1LwlGiven = TRUE; + case BSIM3v1_MOD_LWL : + mod->BSIM3v1Lwl = value->rValue; + mod->BSIM3v1LwlGiven = TRUE; break; - case BSIM3V1_MOD_LMIN : - mod->BSIM3V1Lmin = value->rValue; - mod->BSIM3V1LminGiven = TRUE; + case BSIM3v1_MOD_LMIN : + mod->BSIM3v1Lmin = value->rValue; + mod->BSIM3v1LminGiven = TRUE; break; - case BSIM3V1_MOD_LMAX : - mod->BSIM3V1Lmax = value->rValue; - mod->BSIM3V1LmaxGiven = TRUE; + case BSIM3v1_MOD_LMAX : + mod->BSIM3v1Lmax = value->rValue; + mod->BSIM3v1LmaxGiven = TRUE; break; - case BSIM3V1_MOD_WINT : - mod->BSIM3V1Wint = value->rValue; - mod->BSIM3V1WintGiven = TRUE; + case BSIM3v1_MOD_WINT : + mod->BSIM3v1Wint = value->rValue; + mod->BSIM3v1WintGiven = TRUE; break; - case BSIM3V1_MOD_WL : - mod->BSIM3V1Wl = value->rValue; - mod->BSIM3V1WlGiven = TRUE; + case BSIM3v1_MOD_WL : + mod->BSIM3v1Wl = value->rValue; + mod->BSIM3v1WlGiven = TRUE; break; - case BSIM3V1_MOD_WLN : - mod->BSIM3V1Wln = value->rValue; - mod->BSIM3V1WlnGiven = TRUE; + case BSIM3v1_MOD_WLN : + mod->BSIM3v1Wln = value->rValue; + mod->BSIM3v1WlnGiven = TRUE; break; - case BSIM3V1_MOD_WW : - mod->BSIM3V1Ww = value->rValue; - mod->BSIM3V1WwGiven = TRUE; + case BSIM3v1_MOD_WW : + mod->BSIM3v1Ww = value->rValue; + mod->BSIM3v1WwGiven = TRUE; break; - case BSIM3V1_MOD_WWN : - mod->BSIM3V1Wwn = value->rValue; - mod->BSIM3V1WwnGiven = TRUE; + case BSIM3v1_MOD_WWN : + mod->BSIM3v1Wwn = value->rValue; + mod->BSIM3v1WwnGiven = TRUE; break; - case BSIM3V1_MOD_WWL : - mod->BSIM3V1Wwl = value->rValue; - mod->BSIM3V1WwlGiven = TRUE; + case BSIM3v1_MOD_WWL : + mod->BSIM3v1Wwl = value->rValue; + mod->BSIM3v1WwlGiven = TRUE; break; - case BSIM3V1_MOD_WMIN : - mod->BSIM3V1Wmin = value->rValue; - mod->BSIM3V1WminGiven = TRUE; + case BSIM3v1_MOD_WMIN : + mod->BSIM3v1Wmin = value->rValue; + mod->BSIM3v1WminGiven = TRUE; break; - case BSIM3V1_MOD_WMAX : - mod->BSIM3V1Wmax = value->rValue; - mod->BSIM3V1WmaxGiven = TRUE; + case BSIM3v1_MOD_WMAX : + mod->BSIM3v1Wmax = value->rValue; + mod->BSIM3v1WmaxGiven = TRUE; break; - case BSIM3V1_MOD_NOIA : - mod->BSIM3V1oxideTrapDensityA = value->rValue; - mod->BSIM3V1oxideTrapDensityAGiven = TRUE; + case BSIM3v1_MOD_NOIA : + mod->BSIM3v1oxideTrapDensityA = value->rValue; + mod->BSIM3v1oxideTrapDensityAGiven = TRUE; break; - case BSIM3V1_MOD_NOIB : - mod->BSIM3V1oxideTrapDensityB = value->rValue; - mod->BSIM3V1oxideTrapDensityBGiven = TRUE; + case BSIM3v1_MOD_NOIB : + mod->BSIM3v1oxideTrapDensityB = value->rValue; + mod->BSIM3v1oxideTrapDensityBGiven = TRUE; break; - case BSIM3V1_MOD_NOIC : - mod->BSIM3V1oxideTrapDensityC = value->rValue; - mod->BSIM3V1oxideTrapDensityCGiven = TRUE; + case BSIM3v1_MOD_NOIC : + mod->BSIM3v1oxideTrapDensityC = value->rValue; + mod->BSIM3v1oxideTrapDensityCGiven = TRUE; break; - case BSIM3V1_MOD_EM : - mod->BSIM3V1em = value->rValue; - mod->BSIM3V1emGiven = TRUE; + case BSIM3v1_MOD_EM : + mod->BSIM3v1em = value->rValue; + mod->BSIM3v1emGiven = TRUE; break; - case BSIM3V1_MOD_EF : - mod->BSIM3V1ef = value->rValue; - mod->BSIM3V1efGiven = TRUE; + case BSIM3v1_MOD_EF : + mod->BSIM3v1ef = value->rValue; + mod->BSIM3v1efGiven = TRUE; break; - case BSIM3V1_MOD_AF : - mod->BSIM3V1af = value->rValue; - mod->BSIM3V1afGiven = TRUE; + case BSIM3v1_MOD_AF : + mod->BSIM3v1af = value->rValue; + mod->BSIM3v1afGiven = TRUE; break; - case BSIM3V1_MOD_KF : - mod->BSIM3V1kf = value->rValue; - mod->BSIM3V1kfGiven = TRUE; + case BSIM3v1_MOD_KF : + mod->BSIM3v1kf = value->rValue; + mod->BSIM3v1kfGiven = TRUE; break; - case BSIM3V1_MOD_NMOS : + case BSIM3v1_MOD_NMOS : if(value->iValue) { - mod->BSIM3V1type = 1; - mod->BSIM3V1typeGiven = TRUE; + mod->BSIM3v1type = 1; + mod->BSIM3v1typeGiven = TRUE; } break; - case BSIM3V1_MOD_PMOS : + case BSIM3v1_MOD_PMOS : if(value->iValue) { - mod->BSIM3V1type = - 1; - mod->BSIM3V1typeGiven = TRUE; + mod->BSIM3v1type = - 1; + mod->BSIM3v1typeGiven = TRUE; } break; -/* serban */ - case BSIM3V1_MOD_HDIF : - mod->BSIM3V1hdif = value->rValue; - mod->BSIM3V1hdifGiven = TRUE; - break; default: return(E_BADPARM); } diff --git a/src/spicelib/devices/bsim3v1/b3v1noi.c b/src/spicelib/devices/bsim3v1/b3v1noi.c index d2346e335..2b43aba80 100644 --- a/src/spicelib/devices/bsim3v1/b3v1noi.c +++ b/src/spicelib/devices/bsim3v1/b3v1noi.c @@ -1,12 +1,16 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Gary W. Ng and Min-Chie Jeng. -File: b3v1noi.c -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1noi.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ #include "ngspice.h" -#include -#include #include "bsim3v1def.h" #include "cktdefs.h" #include "iferrmsg.h" @@ -15,7 +19,7 @@ File: b3v1noi.c #include "const.h" /* jwan */ /* - * BSIM3V1noise (mode, operation, firstModel, ckt, data, OnDens) + * BSIM3v1noise (mode, operation, firstModel, ckt, data, OnDens) * This routine names and evaluates all of the noise sources * associated with MOSFET's. It starts with the model *firstModel and * traverses all of its insts. It then proceeds to any other models @@ -25,18 +29,18 @@ File: b3v1noi.c /* Channel thermal and flicker noises are calculated based on the value - of model->BSIM3V1noiMod. - If model->BSIM3V1noiMod = 1, + of model->BSIM3v1noiMod. + If model->BSIM3v1noiMod = 1, Channel thermal noise = SPICE2 model Flicker noise = SPICE2 model - If model->BSIM3V1noiMod = 2, - Channel thermal noise = BSIM3V1 model - Flicker noise = BSIM3V1 model - If model->BSIM3V1noiMod = 3, + If model->BSIM3v1noiMod = 2, + Channel thermal noise = BSIM3v1 model + Flicker noise = BSIM3v1 model + If model->BSIM3v1noiMod = 3, Channel thermal noise = SPICE2 model - Flicker noise = BSIM3V1 model - If model->BSIM3V1noiMod = 4, - Channel thermal noise = BSIM3V1 model + Flicker noise = BSIM3v1 model + If model->BSIM3v1noiMod = 4, + Channel thermal noise = BSIM3v1 model Flicker noise = SPICE2 model */ @@ -44,48 +48,45 @@ extern void NevalSrc(); extern double Nintegrate(); double -BSIM3V1StrongInversionNoiseEval(vgs, vds, model, here, freq, temp) -double vgs, vds, freq, temp; -BSIM3V1model *model; -BSIM3V1instance *here; +StrongInversionNoiseEval(double vgs, double vds, BSIM3v1model *model, + BSIM3v1instance *here, double freq, double temp) { struct bsim3v1SizeDependParam *pParam; double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9; -double Ssi; +double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi; pParam = here->pParam; - cd = fabs(here->BSIM3V1cd); - if (vds > here->BSIM3V1vdsat) - { esat = 2.0 * pParam->BSIM3V1vsattemp / here->BSIM3V1ueff; - T0 = ((((vds - here->BSIM3V1vdsat) / pParam->BSIM3V1litl) + model->BSIM3V1em) + cd = fabs(here->BSIM3v1cd) * here->BSIM3v1m; + if (vds > here->BSIM3v1vdsat) + { esat = 2.0 * pParam->BSIM3v1vsattemp / here->BSIM3v1ueff; + T0 = ((((vds - here->BSIM3v1vdsat) / pParam->BSIM3v1litl) + model->BSIM3v1em) / esat); - DelClm = pParam->BSIM3V1litl * log (MAX(T0, N_MINLOG)); + DelClm = pParam->BSIM3v1litl * log (MAX(T0, N_MINLOG)); } else DelClm = 0.0; - EffFreq = pow(freq, model->BSIM3V1ef); - T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->BSIM3V1ueff; - T2 = 1.0e8 * EffFreq * model->BSIM3V1cox - * pParam->BSIM3V1leff * pParam->BSIM3V1leff; - Vgst = vgs - here->BSIM3V1von; - N0 = model->BSIM3V1cox * Vgst / CHARGE; + EffFreq = pow(freq, model->BSIM3v1ef); + T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->BSIM3v1ueff; + T2 = 1.0e8 * EffFreq * model->BSIM3v1cox + * pParam->BSIM3v1leff * pParam->BSIM3v1leff; + Vgst = vgs - here->BSIM3v1von; + N0 = model->BSIM3v1cox * Vgst / CHARGE; if (N0 < 0.0) N0 = 0.0; - Nl = model->BSIM3V1cox * (Vgst - MIN(vds, here->BSIM3V1vdsat)) / CHARGE; + Nl = model->BSIM3v1cox * (Vgst - MIN(vds, here->BSIM3v1vdsat)) / CHARGE; if (Nl < 0.0) Nl = 0.0; - T3 = model->BSIM3V1oxideTrapDensityA + T3 = model->BSIM3v1oxideTrapDensityA * log(MAX(((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); - T4 = model->BSIM3V1oxideTrapDensityB * (N0 - Nl); - T5 = model->BSIM3V1oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); + T4 = model->BSIM3v1oxideTrapDensityB * (N0 - Nl); + T5 = model->BSIM3v1oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); T6 = 8.62e-5 * temp * cd * cd; - T7 = 1.0e8 * EffFreq * pParam->BSIM3V1leff - * pParam->BSIM3V1leff * pParam->BSIM3V1weff; - T8 = model->BSIM3V1oxideTrapDensityA + model->BSIM3V1oxideTrapDensityB * Nl - + model->BSIM3V1oxideTrapDensityC * Nl * Nl; + T7 = 1.0e8 * EffFreq * pParam->BSIM3v1leff + * pParam->BSIM3v1leff * pParam->BSIM3v1weff * here->BSIM3v1m; + T8 = model->BSIM3v1oxideTrapDensityA + model->BSIM3v1oxideTrapDensityB * Nl + + model->BSIM3v1oxideTrapDensityC * Nl * Nl; T9 = (Nl + 2.0e14) * (Nl + 2.0e14); Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; @@ -93,44 +94,46 @@ double Ssi; } int -BSIM3V1noise (mode, operation, inModel, ckt, data, OnDens) -int mode, operation; -GENmodel *inModel; -CKTcircuit *ckt; -Ndata *data; -double *OnDens; +BSIM3v1noise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt, + Ndata *data, double *OnDens) { -BSIM3V1model *model = (BSIM3V1model *)inModel; -BSIM3V1instance *here; +BSIM3v1model *model = (BSIM3v1model *)inModel; +BSIM3v1instance *here; struct bsim3v1SizeDependParam *pParam; char name[N_MXVLNTH]; double tempOnoise; double tempInoise; -double noizDens[BSIM3V1NSRCS]; -double lnNdens[BSIM3V1NSRCS]; +double noizDens[BSIM3v1NSRCS]; +double lnNdens[BSIM3v1NSRCS]; double vgs, vds, Slimit; -double T1, T10, T11; -double Ssi, Swi; +double N0, Nl; +double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13; +double n, ExpArg, Ssi, Swi; -int i; +int error, i; /* define the names of the noise sources */ - static char *BSIM3V1nNames[BSIM3V1NSRCS] = + static char *BSIM3v1nNames[BSIM3v1NSRCS] = { /* Note that we have to keep the order */ ".rd", /* noise due to rd */ /* consistent with the index definitions */ ".rs", /* noise due to rs */ - /* in BSIM3V1defs.h */ + /* in BSIM3v1defs.h */ ".id", /* noise due to id */ ".1overf", /* flicker (1/f) noise */ "" /* total transistor noise */ }; - for (; model != NULL; model = model->BSIM3V1nextModel) - { for (here = model->BSIM3V1instances; here != NULL; - here = here->BSIM3V1nextInstance) - { pParam = here->pParam; + for (; model != NULL; model = model->BSIM3v1nextModel) + { for (here = model->BSIM3v1instances; here != NULL; + here = here->BSIM3v1nextInstance) + { + + if (here->BSIM3v1owner != ARCHme) + continue; + + pParam = here->pParam; switch (operation) { case N_OPEN: /* see if we have to to produce a summary report */ @@ -139,10 +142,10 @@ int i; if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) { switch (mode) { case N_DENS: - for (i = 0; i < BSIM3V1NSRCS; i++) + for (i = 0; i < BSIM3v1NSRCS; i++) { (void) sprintf(name, "onoise.%s%s", - here->BSIM3V1name, - BSIM3V1nNames[i]); + here->BSIM3v1name, + BSIM3v1nNames[i]); data->namelist = (IFuid *) trealloc( (char *) data->namelist, (data->numPlots + 1) @@ -157,10 +160,10 @@ int i; } break; case INT_NOIZ: - for (i = 0; i < BSIM3V1NSRCS; i++) + for (i = 0; i < BSIM3v1NSRCS; i++) { (void) sprintf(name, "onoise_total.%s%s", - here->BSIM3V1name, - BSIM3V1nNames[i]); + here->BSIM3v1name, + BSIM3v1nNames[i]); data->namelist = (IFuid *) trealloc( (char *) data->namelist, (data->numPlots + 1) @@ -174,8 +177,8 @@ int i; /* we've added one more plot */ (void) sprintf(name, "inoise_total.%s%s", - here->BSIM3V1name, - BSIM3V1nNames[i]); + here->BSIM3v1name, + BSIM3v1nNames[i]); data->namelist = (IFuid *) trealloc( (char *) data->namelist, (data->numPlots + 1) @@ -195,103 +198,103 @@ int i; case N_CALC: switch (mode) { case N_DENS: - NevalSrc(&noizDens[BSIM3V1RDNOIZ], - &lnNdens[BSIM3V1RDNOIZ], ckt, THERMNOISE, - here->BSIM3V1dNodePrime, here->BSIM3V1dNode, - here->BSIM3V1drainConductance); + NevalSrc(&noizDens[BSIM3v1RDNOIZ], + &lnNdens[BSIM3v1RDNOIZ], ckt, THERMNOISE, + here->BSIM3v1dNodePrime, here->BSIM3v1dNode, + here->BSIM3v1drainConductance * here->BSIM3v1m); - NevalSrc(&noizDens[BSIM3V1RSNOIZ], - &lnNdens[BSIM3V1RSNOIZ], ckt, THERMNOISE, - here->BSIM3V1sNodePrime, here->BSIM3V1sNode, - here->BSIM3V1sourceConductance); + NevalSrc(&noizDens[BSIM3v1RSNOIZ], + &lnNdens[BSIM3v1RSNOIZ], ckt, THERMNOISE, + here->BSIM3v1sNodePrime, here->BSIM3v1sNode, + here->BSIM3v1sourceConductance * here->BSIM3v1m); - switch( model->BSIM3V1noiMod ) + switch( model->BSIM3v1noiMod ) { case 1: case 3: - NevalSrc(&noizDens[BSIM3V1IDNOIZ], - &lnNdens[BSIM3V1IDNOIZ], ckt, - THERMNOISE, here->BSIM3V1dNodePrime, - here->BSIM3V1sNodePrime, - (2.0 / 3.0 * fabs(here->BSIM3V1gm - + here->BSIM3V1gds - + here->BSIM3V1gmbs))); + NevalSrc(&noizDens[BSIM3v1IDNOIZ], + &lnNdens[BSIM3v1IDNOIZ], ckt, + THERMNOISE, here->BSIM3v1dNodePrime, + here->BSIM3v1sNodePrime, + (2.0 / 3.0 * fabs(here->BSIM3v1gm + + here->BSIM3v1gds + + here->BSIM3v1gmbs) * here->BSIM3v1m)); break; case 2: case 4: - NevalSrc(&noizDens[BSIM3V1IDNOIZ], - &lnNdens[BSIM3V1IDNOIZ], ckt, - THERMNOISE, here->BSIM3V1dNodePrime, - here->BSIM3V1sNodePrime, - (here->BSIM3V1ueff - * fabs(here->BSIM3V1qinv - / (pParam->BSIM3V1leff - * pParam->BSIM3V1leff)))); + NevalSrc(&noizDens[BSIM3v1IDNOIZ], + &lnNdens[BSIM3v1IDNOIZ], ckt, + THERMNOISE, here->BSIM3v1dNodePrime, + here->BSIM3v1sNodePrime, + (here->BSIM3v1ueff + * fabs((here->BSIM3v1qinv * here->BSIM3v1m) + / (pParam->BSIM3v1leff + * pParam->BSIM3v1leff)))); break; } - NevalSrc(&noizDens[BSIM3V1FLNOIZ], (double*) NULL, - ckt, N_GAIN, here->BSIM3V1dNodePrime, - here->BSIM3V1sNodePrime, (double) 0.0); + NevalSrc(&noizDens[BSIM3v1FLNOIZ], (double*) NULL, + ckt, N_GAIN, here->BSIM3v1dNodePrime, + here->BSIM3v1sNodePrime, (double) 0.0); - switch( model->BSIM3V1noiMod ) + switch( model->BSIM3v1noiMod ) { case 1: case 4: - noizDens[BSIM3V1FLNOIZ] *= model->BSIM3V1kf - * exp(model->BSIM3V1af - * log(MAX(fabs(here->BSIM3V1cd), + noizDens[BSIM3v1FLNOIZ] *= model->BSIM3v1kf + * exp(model->BSIM3v1af + * log(MAX(fabs(here->BSIM3v1cd * here->BSIM3v1m), N_MINLOG))) - / (pow(data->freq, model->BSIM3V1ef) - * pParam->BSIM3V1leff - * pParam->BSIM3V1leff - * model->BSIM3V1cox); + / (pow(data->freq, model->BSIM3v1ef) + * pParam->BSIM3v1leff + * pParam->BSIM3v1leff + * model->BSIM3v1cox); break; case 2: case 3: - vgs = *(ckt->CKTstates[0] + here->BSIM3V1vgs); - vds = *(ckt->CKTstates[0] + here->BSIM3V1vds); + vgs = *(ckt->CKTstates[0] + here->BSIM3v1vgs); + vds = *(ckt->CKTstates[0] + here->BSIM3v1vds); if (vds < 0.0) { vds = -vds; vgs = vgs + vds; } - if (vgs >= here->BSIM3V1von + 0.1) - { Ssi = BSIM3V1StrongInversionNoiseEval(vgs, + if (vgs >= here->BSIM3v1von + 0.1) + { Ssi = StrongInversionNoiseEval(vgs, vds, model, here, data->freq, ckt->CKTtemp); - noizDens[BSIM3V1FLNOIZ] *= Ssi; + noizDens[BSIM3v1FLNOIZ] *= Ssi; } else { pParam = here->pParam; - T10 = model->BSIM3V1oxideTrapDensityA + T10 = model->BSIM3v1oxideTrapDensityA * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->BSIM3V1weff - * pParam->BSIM3V1leff - * pow(data->freq, model->BSIM3V1ef) + T11 = pParam->BSIM3v1weff * here->BSIM3v1m + * pParam->BSIM3v1leff + * pow(data->freq, model->BSIM3v1ef) * 4.0e36; - Swi = T10 / T11 * here->BSIM3V1cd - * here->BSIM3V1cd; - Slimit = BSIM3V1StrongInversionNoiseEval( - here->BSIM3V1von + 0.1, vds, model, + Swi = T10 / T11 * here->BSIM3v1cd * here->BSIM3v1m + * here->BSIM3v1cd * here->BSIM3v1m; + Slimit = StrongInversionNoiseEval( + here->BSIM3v1von + 0.1, vds, model, here, data->freq, ckt->CKTtemp); T1 = Swi + Slimit; if (T1 > 0.0) - noizDens[BSIM3V1FLNOIZ] *= (Slimit + noizDens[BSIM3v1FLNOIZ] *= (Slimit * Swi) / T1; else - noizDens[BSIM3V1FLNOIZ] *= 0.0; + noizDens[BSIM3v1FLNOIZ] *= 0.0; } break; } - lnNdens[BSIM3V1FLNOIZ] = - log(MAX(noizDens[BSIM3V1FLNOIZ], N_MINLOG)); + lnNdens[BSIM3v1FLNOIZ] = + log(MAX(noizDens[BSIM3v1FLNOIZ], N_MINLOG)); - noizDens[BSIM3V1TOTNOIZ] = noizDens[BSIM3V1RDNOIZ] - + noizDens[BSIM3V1RSNOIZ] - + noizDens[BSIM3V1IDNOIZ] - + noizDens[BSIM3V1FLNOIZ]; - lnNdens[BSIM3V1TOTNOIZ] = - log(MAX(noizDens[BSIM3V1TOTNOIZ], N_MINLOG)); + noizDens[BSIM3v1TOTNOIZ] = noizDens[BSIM3v1RDNOIZ] + + noizDens[BSIM3v1RSNOIZ] + + noizDens[BSIM3v1IDNOIZ] + + noizDens[BSIM3v1FLNOIZ]; + lnNdens[BSIM3v1TOTNOIZ] = + log(MAX(noizDens[BSIM3v1TOTNOIZ], N_MINLOG)); - *OnDens += noizDens[BSIM3V1TOTNOIZ]; + *OnDens += noizDens[BSIM3v1TOTNOIZ]; if (data->delFreq == 0.0) { /* if we haven't done any previous @@ -299,8 +302,8 @@ int i; "history" variables. */ - for (i = 0; i < BSIM3V1NSRCS; i++) - { here->BSIM3V1nVar[LNLSTDENS][i] = + for (i = 0; i < BSIM3v1NSRCS; i++) + { here->BSIM3v1nVar[LNLSTDENS][i] = lnNdens[i]; } @@ -309,9 +312,9 @@ int i; */ if (data->freq == ((NOISEAN*) ckt->CKTcurJob)->NstartFreq) - { for (i = 0; i < BSIM3V1NSRCS; i++) - { here->BSIM3V1nVar[OUTNOIZ][i] = 0.0; - here->BSIM3V1nVar[INNOIZ][i] = 0.0; + { for (i = 0; i < BSIM3v1NSRCS; i++) + { here->BSIM3v1nVar[OUTNOIZ][i] = 0.0; + here->BSIM3v1nVar[INNOIZ][i] = 0.0; } } } @@ -319,37 +322,37 @@ int i; { /* data->delFreq != 0.0, we have to integrate. */ - for (i = 0; i < BSIM3V1NSRCS; i++) - { if (i != BSIM3V1TOTNOIZ) + for (i = 0; i < BSIM3v1NSRCS; i++) + { if (i != BSIM3v1TOTNOIZ) { tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - here->BSIM3V1nVar[LNLSTDENS][i], + here->BSIM3v1nVar[LNLSTDENS][i], data); tempInoise = Nintegrate(noizDens[i] * data->GainSqInv, lnNdens[i] + data->lnGainInv, - here->BSIM3V1nVar[LNLSTDENS][i] + here->BSIM3v1nVar[LNLSTDENS][i] + data->lnGainInv, data); - here->BSIM3V1nVar[LNLSTDENS][i] = + here->BSIM3v1nVar[LNLSTDENS][i] = lnNdens[i]; data->outNoiz += tempOnoise; data->inNoise += tempInoise; if (((NOISEAN*) ckt->CKTcurJob)->NStpsSm != 0) - { here->BSIM3V1nVar[OUTNOIZ][i] + { here->BSIM3v1nVar[OUTNOIZ][i] += tempOnoise; - here->BSIM3V1nVar[OUTNOIZ][BSIM3V1TOTNOIZ] + here->BSIM3v1nVar[OUTNOIZ][BSIM3v1TOTNOIZ] += tempOnoise; - here->BSIM3V1nVar[INNOIZ][i] + here->BSIM3v1nVar[INNOIZ][i] += tempInoise; - here->BSIM3V1nVar[INNOIZ][BSIM3V1TOTNOIZ] + here->BSIM3v1nVar[INNOIZ][BSIM3v1TOTNOIZ] += tempInoise; } } } } if (data->prtSummary) - { for (i = 0; i < BSIM3V1NSRCS; i++) + { for (i = 0; i < BSIM3v1NSRCS; i++) { /* print a summary report */ data->outpVector[data->outNumber++] = noizDens[i]; @@ -359,11 +362,11 @@ int i; case INT_NOIZ: /* already calculated, just output */ if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) - { for (i = 0; i < BSIM3V1NSRCS; i++) + { for (i = 0; i < BSIM3v1NSRCS; i++) { data->outpVector[data->outNumber++] - = here->BSIM3V1nVar[OUTNOIZ][i]; + = here->BSIM3v1nVar[OUTNOIZ][i]; data->outpVector[data->outNumber++] - = here->BSIM3V1nVar[INNOIZ][i]; + = here->BSIM3v1nVar[INNOIZ][i]; } } break; diff --git a/src/spicelib/devices/bsim3v1/b3v1par.c b/src/spicelib/devices/bsim3v1/b3v1par.c index 87664b82c..627a2addc 100644 --- a/src/spicelib/devices/bsim3v1/b3v1par.c +++ b/src/spicelib/devices/bsim3v1/b3v1par.c @@ -1,90 +1,92 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v1par.c -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1par.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ #include "ngspice.h" -#include #include "ifsim.h" #include "bsim3v1def.h" #include "sperror.h" #include "suffix.h" int -BSIM3V1param(param,value,inst,select) -int param; -IFvalue *value; -GENinstance *inst; -IFvalue *select; +BSIM3v1param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) { - BSIM3V1instance *here = (BSIM3V1instance*)inst; + BSIM3v1instance *here = (BSIM3v1instance*)inst; switch(param) - { case BSIM3V1_W: - here->BSIM3V1w = value->rValue; - here->BSIM3V1wGiven = TRUE; + { case BSIM3v1_W: + here->BSIM3v1w = value->rValue; + here->BSIM3v1wGiven = TRUE; break; - case BSIM3V1_L: - here->BSIM3V1l = value->rValue; - here->BSIM3V1lGiven = TRUE; + case BSIM3v1_L: + here->BSIM3v1l = value->rValue; + here->BSIM3v1lGiven = TRUE; break; - case BSIM3V1_AS: - here->BSIM3V1sourceArea = value->rValue; - here->BSIM3V1sourceAreaGiven = TRUE; + case BSIM3v1_M: + here->BSIM3v1m = value->rValue; + here->BSIM3v1mGiven = TRUE; break; - case BSIM3V1_AD: - here->BSIM3V1drainArea = value->rValue; - here->BSIM3V1drainAreaGiven = TRUE; + case BSIM3v1_AS: + here->BSIM3v1sourceArea = value->rValue; + here->BSIM3v1sourceAreaGiven = TRUE; break; - case BSIM3V1_PS: - here->BSIM3V1sourcePerimeter = value->rValue; - here->BSIM3V1sourcePerimeterGiven = TRUE; + case BSIM3v1_AD: + here->BSIM3v1drainArea = value->rValue; + here->BSIM3v1drainAreaGiven = TRUE; break; - case BSIM3V1_PD: - here->BSIM3V1drainPerimeter = value->rValue; - here->BSIM3V1drainPerimeterGiven = TRUE; + case BSIM3v1_PS: + here->BSIM3v1sourcePerimeter = value->rValue; + here->BSIM3v1sourcePerimeterGiven = TRUE; break; - case BSIM3V1_NRS: - here->BSIM3V1sourceSquares = value->rValue; - here->BSIM3V1sourceSquaresGiven = TRUE; + case BSIM3v1_PD: + here->BSIM3v1drainPerimeter = value->rValue; + here->BSIM3v1drainPerimeterGiven = TRUE; break; - case BSIM3V1_NRD: - here->BSIM3V1drainSquares = value->rValue; - here->BSIM3V1drainSquaresGiven = TRUE; + case BSIM3v1_NRS: + here->BSIM3v1sourceSquares = value->rValue; + here->BSIM3v1sourceSquaresGiven = TRUE; break; - case BSIM3V1_OFF: - here->BSIM3V1off = value->iValue; + case BSIM3v1_NRD: + here->BSIM3v1drainSquares = value->rValue; + here->BSIM3v1drainSquaresGiven = TRUE; break; - case BSIM3V1_M: - here->BSIM3V1m = value->rValue; + case BSIM3v1_OFF: + here->BSIM3v1off = value->iValue; break; - case BSIM3V1_IC_VBS: - here->BSIM3V1icVBS = value->rValue; - here->BSIM3V1icVBSGiven = TRUE; + case BSIM3v1_IC_VBS: + here->BSIM3v1icVBS = value->rValue; + here->BSIM3v1icVBSGiven = TRUE; break; - case BSIM3V1_IC_VDS: - here->BSIM3V1icVDS = value->rValue; - here->BSIM3V1icVDSGiven = TRUE; + case BSIM3v1_IC_VDS: + here->BSIM3v1icVDS = value->rValue; + here->BSIM3v1icVDSGiven = TRUE; break; - case BSIM3V1_IC_VGS: - here->BSIM3V1icVGS = value->rValue; - here->BSIM3V1icVGSGiven = TRUE; + case BSIM3v1_IC_VGS: + here->BSIM3v1icVGS = value->rValue; + here->BSIM3v1icVGSGiven = TRUE; break; - case BSIM3V1_NQSMOD: - here->BSIM3V1nqsMod = value->iValue; - here->BSIM3V1nqsModGiven = TRUE; + case BSIM3v1_NQSMOD: + here->BSIM3v1nqsMod = value->iValue; + here->BSIM3v1nqsModGiven = TRUE; break; - case BSIM3V1_IC: + case BSIM3v1_IC: switch(value->v.numValue){ case 3: - here->BSIM3V1icVBS = *(value->v.vec.rVec+2); - here->BSIM3V1icVBSGiven = TRUE; + here->BSIM3v1icVBS = *(value->v.vec.rVec+2); + here->BSIM3v1icVBSGiven = TRUE; case 2: - here->BSIM3V1icVGS = *(value->v.vec.rVec+1); - here->BSIM3V1icVGSGiven = TRUE; + here->BSIM3v1icVGS = *(value->v.vec.rVec+1); + here->BSIM3v1icVGSGiven = TRUE; case 1: - here->BSIM3V1icVDS = *(value->v.vec.rVec); - here->BSIM3V1icVDSGiven = TRUE; + here->BSIM3v1icVDS = *(value->v.vec.rVec); + here->BSIM3v1icVDSGiven = TRUE; break; default: return(E_BADPARM); diff --git a/src/spicelib/devices/bsim3v1/b3v1pzld.c b/src/spicelib/devices/bsim3v1/b3v1pzld.c index fbf2fbf14..fea672485 100644 --- a/src/spicelib/devices/bsim3v1/b3v1pzld.c +++ b/src/spicelib/devices/bsim3v1/b3v1pzld.c @@ -1,11 +1,16 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v1pzld.c -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1pzld.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ #include "ngspice.h" -#include #include "cktdefs.h" #include "complex.h" #include "sperror.h" @@ -13,68 +18,70 @@ File: b3v1pzld.c #include "suffix.h" int -BSIM3V1pzLoad(inModel,ckt,s) -GENmodel *inModel; -CKTcircuit *ckt; -SPcomplex *s; +BSIM3v1pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) { -BSIM3V1model *model = (BSIM3V1model*)inModel; -BSIM3V1instance *here; +BSIM3v1model *model = (BSIM3v1model*)inModel; +BSIM3v1instance *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; double GSoverlapCap, GDoverlapCap, GBoverlapCap; double FwdSum, RevSum, Gm, Gmbs; - for (; model != NULL; model = model->BSIM3V1nextModel) - { for (here = model->BSIM3V1instances; here!= NULL; - here = here->BSIM3V1nextInstance) - { - if (here->BSIM3V1owner != ARCHme) continue; - if (here->BSIM3V1mode >= 0) - { Gm = here->BSIM3V1gm; - Gmbs = here->BSIM3V1gmbs; +double m; + + for (; model != NULL; model = model->BSIM3v1nextModel) + { for (here = model->BSIM3v1instances; here!= NULL; + here = here->BSIM3v1nextInstance) + { + + if (here->BSIM3v1owner != ARCHme) + continue; + + if (here->BSIM3v1mode >= 0) + { Gm = here->BSIM3v1gm; + Gmbs = here->BSIM3v1gmbs; FwdSum = Gm + Gmbs; RevSum = 0.0; - cggb = here->BSIM3V1cggb; - cgsb = here->BSIM3V1cgsb; - cgdb = here->BSIM3V1cgdb; + cggb = here->BSIM3v1cggb; + cgsb = here->BSIM3v1cgsb; + cgdb = here->BSIM3v1cgdb; - cbgb = here->BSIM3V1cbgb; - cbsb = here->BSIM3V1cbsb; - cbdb = here->BSIM3V1cbdb; + cbgb = here->BSIM3v1cbgb; + cbsb = here->BSIM3v1cbsb; + cbdb = here->BSIM3v1cbdb; - cdgb = here->BSIM3V1cdgb; - cdsb = here->BSIM3V1cdsb; - cddb = here->BSIM3V1cddb; + cdgb = here->BSIM3v1cdgb; + cdsb = here->BSIM3v1cdsb; + cddb = here->BSIM3v1cddb; } else - { Gm = -here->BSIM3V1gm; - Gmbs = -here->BSIM3V1gmbs; + { Gm = -here->BSIM3v1gm; + Gmbs = -here->BSIM3v1gmbs; FwdSum = 0.0; RevSum = -Gm - Gmbs; - cggb = here->BSIM3V1cggb; - cgsb = here->BSIM3V1cgdb; - cgdb = here->BSIM3V1cgsb; + cggb = here->BSIM3v1cggb; + cgsb = here->BSIM3v1cgdb; + cgdb = here->BSIM3v1cgsb; - cbgb = here->BSIM3V1cbgb; - cbsb = here->BSIM3V1cbdb; - cbdb = here->BSIM3V1cbsb; + cbgb = here->BSIM3v1cbgb; + cbsb = here->BSIM3v1cbdb; + cbdb = here->BSIM3v1cbsb; - cdgb = -(here->BSIM3V1cdgb + cggb + cbgb); - cdsb = -(here->BSIM3V1cddb + cgsb + cbsb); - cddb = -(here->BSIM3V1cdsb + cgdb + cbdb); + cdgb = -(here->BSIM3v1cdgb + cggb + cbgb); + cdsb = -(here->BSIM3v1cddb + cgsb + cbsb); + cddb = -(here->BSIM3v1cdsb + cgdb + cbdb); } - gdpr=here->BSIM3V1drainConductance; - gspr=here->BSIM3V1sourceConductance; - gds= here->BSIM3V1gds; - gbd= here->BSIM3V1gbd; - gbs= here->BSIM3V1gbs; - capbd= here->BSIM3V1capbd; - capbs= here->BSIM3V1capbs; - GSoverlapCap = here->BSIM3V1cgso; - GDoverlapCap = here->BSIM3V1cgdo; - GBoverlapCap = here->pParam->BSIM3V1cgbo; + gdpr=here->BSIM3v1drainConductance; + gspr=here->BSIM3v1sourceConductance; + gds= here->BSIM3v1gds; + gbd= here->BSIM3v1gbd; + gbs= here->BSIM3v1gbs; + capbd= here->BSIM3v1capbd; + capbs= here->BSIM3v1capbs; + GSoverlapCap = here->BSIM3v1cgso; + GDoverlapCap = here->BSIM3v1cgdo; + GBoverlapCap = here->pParam->BSIM3v1cgbo; xcdgb = (cdgb - GDoverlapCap); xcddb = (cddb + capbd + GDoverlapCap); @@ -89,56 +96,57 @@ double FwdSum, RevSum, Gm, Gmbs; xcbdb = (cbdb - capbd); xcbsb = (cbsb - capbs); + m = here->BSIM3v1m; - *(here->BSIM3V1GgPtr ) += xcggb * s->real; - *(here->BSIM3V1GgPtr +1) += xcggb * s->imag; - *(here->BSIM3V1BbPtr ) += (-xcbgb-xcbdb-xcbsb) * s->real; - *(here->BSIM3V1BbPtr +1) += (-xcbgb-xcbdb-xcbsb) * s->imag; - *(here->BSIM3V1DPdpPtr ) += xcddb * s->real; - *(here->BSIM3V1DPdpPtr +1) += xcddb * s->imag; - *(here->BSIM3V1SPspPtr ) += xcssb * s->real; - *(here->BSIM3V1SPspPtr +1) += xcssb * s->imag; - *(here->BSIM3V1GbPtr ) += (-xcggb-xcgdb-xcgsb) * s->real; - *(here->BSIM3V1GbPtr +1) += (-xcggb-xcgdb-xcgsb) * s->imag; - *(here->BSIM3V1GdpPtr ) += xcgdb * s->real; - *(here->BSIM3V1GdpPtr +1) += xcgdb * s->imag; - *(here->BSIM3V1GspPtr ) += xcgsb * s->real; - *(here->BSIM3V1GspPtr +1) += xcgsb * s->imag; - *(here->BSIM3V1BgPtr ) += xcbgb * s->real; - *(here->BSIM3V1BgPtr +1) += xcbgb * s->imag; - *(here->BSIM3V1BdpPtr ) += xcbdb * s->real; - *(here->BSIM3V1BdpPtr +1) += xcbdb * s->imag; - *(here->BSIM3V1BspPtr ) += xcbsb * s->real; - *(here->BSIM3V1BspPtr +1) += xcbsb * s->imag; - *(here->BSIM3V1DPgPtr ) += xcdgb * s->real; - *(here->BSIM3V1DPgPtr +1) += xcdgb * s->imag; - *(here->BSIM3V1DPbPtr ) += (-xcdgb-xcddb-xcdsb) * s->real; - *(here->BSIM3V1DPbPtr +1) += (-xcdgb-xcddb-xcdsb) * s->imag; - *(here->BSIM3V1DPspPtr ) += xcdsb * s->real; - *(here->BSIM3V1DPspPtr +1) += xcdsb * s->imag; - *(here->BSIM3V1SPgPtr ) += xcsgb * s->real; - *(here->BSIM3V1SPgPtr +1) += xcsgb * s->imag; - *(here->BSIM3V1SPbPtr ) += (-xcsgb-xcsdb-xcssb) * s->real; - *(here->BSIM3V1SPbPtr +1) += (-xcsgb-xcsdb-xcssb) * s->imag; - *(here->BSIM3V1SPdpPtr ) += xcsdb * s->real; - *(here->BSIM3V1SPdpPtr +1) += xcsdb * s->imag; - *(here->BSIM3V1DdPtr) += gdpr; - *(here->BSIM3V1SsPtr) += gspr; - *(here->BSIM3V1BbPtr) += gbd+gbs; - *(here->BSIM3V1DPdpPtr) += gdpr+gds+gbd+RevSum; - *(here->BSIM3V1SPspPtr) += gspr+gds+gbs+FwdSum; - *(here->BSIM3V1DdpPtr) -= gdpr; - *(here->BSIM3V1SspPtr) -= gspr; - *(here->BSIM3V1BdpPtr) -= gbd; - *(here->BSIM3V1BspPtr) -= gbs; - *(here->BSIM3V1DPdPtr) -= gdpr; - *(here->BSIM3V1DPgPtr) += Gm; - *(here->BSIM3V1DPbPtr) -= gbd - Gmbs; - *(here->BSIM3V1DPspPtr) -= gds + FwdSum; - *(here->BSIM3V1SPgPtr) -= Gm; - *(here->BSIM3V1SPsPtr) -= gspr; - *(here->BSIM3V1SPbPtr) -= gbs + Gmbs; - *(here->BSIM3V1SPdpPtr) -= gds + RevSum; + *(here->BSIM3v1GgPtr ) += m * (xcggb * s->real); + *(here->BSIM3v1GgPtr +1) += m * (xcggb * s->imag); + *(here->BSIM3v1BbPtr ) += m * ((-xcbgb-xcbdb-xcbsb) * s->real); + *(here->BSIM3v1BbPtr +1) += m * ((-xcbgb-xcbdb-xcbsb) * s->imag); + *(here->BSIM3v1DPdpPtr ) += m * (xcddb * s->real); + *(here->BSIM3v1DPdpPtr +1) += xcddb * s->imag; + *(here->BSIM3v1SPspPtr ) += m * (xcssb * s->real); + *(here->BSIM3v1SPspPtr +1) += m * (xcssb * s->imag); + *(here->BSIM3v1GbPtr ) += m * ((-xcggb-xcgdb-xcgsb) * s->real); + *(here->BSIM3v1GbPtr +1) += m * ((-xcggb-xcgdb-xcgsb) * s->imag); + *(here->BSIM3v1GdpPtr ) += m * (xcgdb * s->real); + *(here->BSIM3v1GdpPtr +1) += m * (xcgdb * s->imag); + *(here->BSIM3v1GspPtr ) += m * (xcgsb * s->real); + *(here->BSIM3v1GspPtr +1) += m * (xcgsb * s->imag); + *(here->BSIM3v1BgPtr ) += m * (xcbgb * s->real); + *(here->BSIM3v1BgPtr +1) += m * (xcbgb * s->imag); + *(here->BSIM3v1BdpPtr ) += m * (xcbdb * s->real); + *(here->BSIM3v1BdpPtr +1) += m * (xcbdb * s->imag); + *(here->BSIM3v1BspPtr ) += m * (xcbsb * s->real); + *(here->BSIM3v1BspPtr +1) += m * (xcbsb * s->imag); + *(here->BSIM3v1DPgPtr ) += m * (xcdgb * s->real); + *(here->BSIM3v1DPgPtr +1) += m * (xcdgb * s->imag); + *(here->BSIM3v1DPbPtr ) += m * ((-xcdgb-xcddb-xcdsb) * s->real); + *(here->BSIM3v1DPbPtr +1) += m * ((-xcdgb-xcddb-xcdsb) * s->imag); + *(here->BSIM3v1DPspPtr ) += m * (xcdsb * s->real); + *(here->BSIM3v1DPspPtr +1) += m * (xcdsb * s->imag); + *(here->BSIM3v1SPgPtr ) += m * (xcsgb * s->real); + *(here->BSIM3v1SPgPtr +1) += m * (xcsgb * s->imag); + *(here->BSIM3v1SPbPtr ) += m * ((-xcsgb-xcsdb-xcssb) * s->real); + *(here->BSIM3v1SPbPtr +1) += m * ((-xcsgb-xcsdb-xcssb) * s->imag); + *(here->BSIM3v1SPdpPtr ) += m * (xcsdb * s->real); + *(here->BSIM3v1SPdpPtr +1) += m * (xcsdb * s->imag); + *(here->BSIM3v1DdPtr) += m * gdpr; + *(here->BSIM3v1SsPtr) += m * gspr; + *(here->BSIM3v1BbPtr) += m * (gbd + gbs); + *(here->BSIM3v1DPdpPtr) += m * (gdpr + gds + gbd + RevSum); + *(here->BSIM3v1SPspPtr) += m * (gspr + gds + gbs + FwdSum); + *(here->BSIM3v1DdpPtr) -= m * gdpr; + *(here->BSIM3v1SspPtr) -= m * gspr; + *(here->BSIM3v1BdpPtr) -= m * gbd; + *(here->BSIM3v1BspPtr) -= m * gbs; + *(here->BSIM3v1DPdPtr) -= m * gdpr; + *(here->BSIM3v1DPgPtr) += m * Gm; + *(here->BSIM3v1DPbPtr) -= m * (gbd - Gmbs); + *(here->BSIM3v1DPspPtr) -= m * (gds + FwdSum); + *(here->BSIM3v1SPgPtr) -= m * Gm; + *(here->BSIM3v1SPsPtr) -= m * gspr; + *(here->BSIM3v1SPbPtr) -= m * (gbs + Gmbs); + *(here->BSIM3v1SPdpPtr) -= m * (gds + RevSum); } } diff --git a/src/spicelib/devices/bsim3v1/b3v1set.c b/src/spicelib/devices/bsim3v1/b3v1set.c index eb54c5c10..51ed67635 100644 --- a/src/spicelib/devices/bsim3v1/b3v1set.c +++ b/src/spicelib/devices/bsim3v1/b3v1set.c @@ -1,12 +1,16 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v1set.c -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1set.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ #include "ngspice.h" -#include -#include #include "smpdefs.h" #include "cktdefs.h" #include "bsim3v1def.h" @@ -25,859 +29,847 @@ File: b3v1set.c #define Meter2Micron 1.0e6 int -BSIM3V1setup(matrix,inModel,ckt,states) -SMPmatrix *matrix; -GENmodel *inModel; -CKTcircuit *ckt; -int *states; +BSIM3v1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, + int *states) { -BSIM3V1model *model = (BSIM3V1model*)inModel; -BSIM3V1instance *here; +BSIM3v1model *model = (BSIM3v1model*)inModel; +BSIM3v1instance *here; int error; CKTnode *tmp; +double tmp1, tmp2; + +CKTnode *tmpNode; +IFuid tmpName; - /* loop through all the BSIM3V1 device models */ - for( ; model != NULL; model = model->BSIM3V1nextModel ) + /* loop through all the BSIM3v1 device models */ + for( ; model != NULL; model = model->BSIM3v1nextModel ) { -/* Default value Processing for BSIM3V1 MOSFET Models */ - if (!model->BSIM3V1typeGiven) - model->BSIM3V1type = NMOS; - if (!model->BSIM3V1mobModGiven) - model->BSIM3V1mobMod = 1; - if (!model->BSIM3V1binUnitGiven) - model->BSIM3V1binUnit = 1; - if (!model->BSIM3V1paramChkGiven) - model->BSIM3V1paramChk = 0; - if (!model->BSIM3V1capModGiven) - model->BSIM3V1capMod = 2; - if (!model->BSIM3V1nqsModGiven) - model->BSIM3V1nqsMod = 0; - if (!model->BSIM3V1noiModGiven) - model->BSIM3V1noiMod = 1; - if (!model->BSIM3V1versionGiven) - model->BSIM3V1version = 3.1; - if (!model->BSIM3V1toxGiven) - model->BSIM3V1tox = 150.0e-10; - model->BSIM3V1cox = 3.453133e-11 / model->BSIM3V1tox; - - if (!model->BSIM3V1cdscGiven) - model->BSIM3V1cdsc = 2.4e-4; /* unit Q/V/m^2 */ - if (!model->BSIM3V1cdscbGiven) - model->BSIM3V1cdscb = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3V1cdscdGiven) - model->BSIM3V1cdscd = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3V1citGiven) - model->BSIM3V1cit = 0.0; /* unit Q/V/m^2 */ - if (!model->BSIM3V1nfactorGiven) - model->BSIM3V1nfactor = 1; - if (!model->BSIM3V1xjGiven) - model->BSIM3V1xj = .15e-6; - if (!model->BSIM3V1vsatGiven) - model->BSIM3V1vsat = 8.0e4; /* unit m/s */ - if (!model->BSIM3V1atGiven) - model->BSIM3V1at = 3.3e4; /* unit m/s */ - if (!model->BSIM3V1a0Given) - model->BSIM3V1a0 = 1.0; - if (!model->BSIM3V1agsGiven) - model->BSIM3V1ags = 0.0; - if (!model->BSIM3V1a1Given) - model->BSIM3V1a1 = 0.0; - if (!model->BSIM3V1a2Given) - model->BSIM3V1a2 = 1.0; - if (!model->BSIM3V1ketaGiven) - model->BSIM3V1keta = -0.047; /* unit / V */ - if (!model->BSIM3V1nsubGiven) - model->BSIM3V1nsub = 6.0e16; /* unit 1/cm3 */ - if (!model->BSIM3V1npeakGiven) - model->BSIM3V1npeak = 1.7e17; /* unit 1/cm3 */ - if (!model->BSIM3V1ngateGiven) - model->BSIM3V1ngate = 0; /* unit 1/cm3 */ - if (!model->BSIM3V1vbmGiven) - model->BSIM3V1vbm = -3.0; - if (!model->BSIM3V1xtGiven) - model->BSIM3V1xt = 1.55e-7; - if (!model->BSIM3V1kt1Given) - model->BSIM3V1kt1 = -0.11; /* unit V */ - if (!model->BSIM3V1kt1lGiven) - model->BSIM3V1kt1l = 0.0; /* unit V*m */ - if (!model->BSIM3V1kt2Given) - model->BSIM3V1kt2 = 0.022; /* No unit */ - if (!model->BSIM3V1k3Given) - model->BSIM3V1k3 = 80.0; - if (!model->BSIM3V1k3bGiven) - model->BSIM3V1k3b = 0.0; - if (!model->BSIM3V1w0Given) - model->BSIM3V1w0 = 2.5e-6; - if (!model->BSIM3V1nlxGiven) - model->BSIM3V1nlx = 1.74e-7; - if (!model->BSIM3V1dvt0Given) - model->BSIM3V1dvt0 = 2.2; - if (!model->BSIM3V1dvt1Given) - model->BSIM3V1dvt1 = 0.53; - if (!model->BSIM3V1dvt2Given) - model->BSIM3V1dvt2 = -0.032; /* unit 1 / V */ - - if (!model->BSIM3V1dvt0wGiven) - model->BSIM3V1dvt0w = 0.0; - if (!model->BSIM3V1dvt1wGiven) - model->BSIM3V1dvt1w = 5.3e6; - if (!model->BSIM3V1dvt2wGiven) - model->BSIM3V1dvt2w = -0.032; - - if (!model->BSIM3V1droutGiven) - model->BSIM3V1drout = 0.56; - if (!model->BSIM3V1dsubGiven) - model->BSIM3V1dsub = model->BSIM3V1drout; - if (!model->BSIM3V1vth0Given) - model->BSIM3V1vth0 = (model->BSIM3V1type == NMOS) ? 0.7 : -0.7; - if (!model->BSIM3V1uaGiven) - model->BSIM3V1ua = 2.25e-9; /* unit m/V */ - if (!model->BSIM3V1ua1Given) - model->BSIM3V1ua1 = 4.31e-9; /* unit m/V */ - if (!model->BSIM3V1ubGiven) - model->BSIM3V1ub = 5.87e-19; /* unit (m/V)**2 */ - if (!model->BSIM3V1ub1Given) - model->BSIM3V1ub1 = -7.61e-18; /* unit (m/V)**2 */ - if (!model->BSIM3V1ucGiven) - model->BSIM3V1uc = (model->BSIM3V1mobMod == 3) ? -0.0465 : -0.0465e-9; - if (!model->BSIM3V1uc1Given) - model->BSIM3V1uc1 = (model->BSIM3V1mobMod == 3) ? -0.056 : -0.056e-9; - if (!model->BSIM3V1u0Given) - model->BSIM3V1u0 = (model->BSIM3V1type == NMOS) ? 0.067 : 0.025; - if (!model->BSIM3V1uteGiven) - model->BSIM3V1ute = -1.5; - if (!model->BSIM3V1voffGiven) - model->BSIM3V1voff = -0.08; - if (!model->BSIM3V1deltaGiven) - model->BSIM3V1delta = 0.01; - if (!model->BSIM3V1rdswGiven) - model->BSIM3V1rdsw = 0; - if (!model->BSIM3V1prwgGiven) - model->BSIM3V1prwg = 0.0; /* unit 1/V */ - if (!model->BSIM3V1prwbGiven) - model->BSIM3V1prwb = 0.0; - if (!model->BSIM3V1prtGiven) - if (!model->BSIM3V1prtGiven) - model->BSIM3V1prt = 0.0; - if (!model->BSIM3V1eta0Given) - model->BSIM3V1eta0 = 0.08; /* no unit */ - if (!model->BSIM3V1etabGiven) - model->BSIM3V1etab = -0.07; /* unit 1/V */ - if (!model->BSIM3V1pclmGiven) - model->BSIM3V1pclm = 1.3; /* no unit */ - if (!model->BSIM3V1pdibl1Given) - model->BSIM3V1pdibl1 = .39; /* no unit */ - if (!model->BSIM3V1pdibl2Given) - model->BSIM3V1pdibl2 = 0.0086; /* no unit */ - if (!model->BSIM3V1pdiblbGiven) - model->BSIM3V1pdiblb = 0.0; /* 1/V */ - if (!model->BSIM3V1pscbe1Given) - model->BSIM3V1pscbe1 = 4.24e8; - if (!model->BSIM3V1pscbe2Given) - model->BSIM3V1pscbe2 = 1.0e-5; - if (!model->BSIM3V1pvagGiven) - model->BSIM3V1pvag = 0.0; - if (!model->BSIM3V1wrGiven) - model->BSIM3V1wr = 1.0; - if (!model->BSIM3V1dwgGiven) - model->BSIM3V1dwg = 0.0; - if (!model->BSIM3V1dwbGiven) - model->BSIM3V1dwb = 0.0; - if (!model->BSIM3V1b0Given) - model->BSIM3V1b0 = 0.0; - if (!model->BSIM3V1b1Given) - model->BSIM3V1b1 = 0.0; - if (!model->BSIM3V1alpha0Given) - model->BSIM3V1alpha0 = 0.0; - if (!model->BSIM3V1beta0Given) - model->BSIM3V1beta0 = 30.0; - - if (!model->BSIM3V1elmGiven) - model->BSIM3V1elm = 5.0; - if (!model->BSIM3V1cgslGiven) - model->BSIM3V1cgsl = 0.0; - if (!model->BSIM3V1cgdlGiven) - model->BSIM3V1cgdl = 0.0; - if (!model->BSIM3V1ckappaGiven) - model->BSIM3V1ckappa = 0.6; - if (!model->BSIM3V1clcGiven) - model->BSIM3V1clc = 0.1e-6; - if (!model->BSIM3V1cleGiven) - model->BSIM3V1cle = 0.6; - if (!model->BSIM3V1vfbcvGiven) - model->BSIM3V1vfbcv = -1.0; +/* Default value Processing for BSIM3v1 MOSFET Models */ + if (!model->BSIM3v1typeGiven) + model->BSIM3v1type = NMOS; + if (!model->BSIM3v1mobModGiven) + model->BSIM3v1mobMod = 1; + if (!model->BSIM3v1binUnitGiven) + model->BSIM3v1binUnit = 1; + if (!model->BSIM3v1paramChkGiven) + model->BSIM3v1paramChk = 0; + if (!model->BSIM3v1capModGiven) + model->BSIM3v1capMod = 2; + if (!model->BSIM3v1nqsModGiven) + model->BSIM3v1nqsMod = 0; + if (!model->BSIM3v1noiModGiven) + model->BSIM3v1noiMod = 1; + if (!model->BSIM3v1versionGiven) + model->BSIM3v1version = 3.1; + if (!model->BSIM3v1toxGiven) + model->BSIM3v1tox = 150.0e-10; + model->BSIM3v1cox = 3.453133e-11 / model->BSIM3v1tox; + + if (!model->BSIM3v1cdscGiven) + model->BSIM3v1cdsc = 2.4e-4; /* unit Q/V/m^2 */ + if (!model->BSIM3v1cdscbGiven) + model->BSIM3v1cdscb = 0.0; /* unit Q/V/m^2 */ + if (!model->BSIM3v1cdscdGiven) + model->BSIM3v1cdscd = 0.0; /* unit Q/V/m^2 */ + if (!model->BSIM3v1citGiven) + model->BSIM3v1cit = 0.0; /* unit Q/V/m^2 */ + if (!model->BSIM3v1nfactorGiven) + model->BSIM3v1nfactor = 1; + if (!model->BSIM3v1xjGiven) + model->BSIM3v1xj = .15e-6; + if (!model->BSIM3v1vsatGiven) + model->BSIM3v1vsat = 8.0e4; /* unit m/s */ + if (!model->BSIM3v1atGiven) + model->BSIM3v1at = 3.3e4; /* unit m/s */ + if (!model->BSIM3v1a0Given) + model->BSIM3v1a0 = 1.0; + if (!model->BSIM3v1agsGiven) + model->BSIM3v1ags = 0.0; + if (!model->BSIM3v1a1Given) + model->BSIM3v1a1 = 0.0; + if (!model->BSIM3v1a2Given) + model->BSIM3v1a2 = 1.0; + if (!model->BSIM3v1ketaGiven) + model->BSIM3v1keta = -0.047; /* unit / V */ + if (!model->BSIM3v1nsubGiven) + model->BSIM3v1nsub = 6.0e16; /* unit 1/cm3 */ + if (!model->BSIM3v1npeakGiven) + model->BSIM3v1npeak = 1.7e17; /* unit 1/cm3 */ + if (!model->BSIM3v1ngateGiven) + model->BSIM3v1ngate = 0; /* unit 1/cm3 */ + if (!model->BSIM3v1vbmGiven) + model->BSIM3v1vbm = -3.0; + if (!model->BSIM3v1xtGiven) + model->BSIM3v1xt = 1.55e-7; + if (!model->BSIM3v1kt1Given) + model->BSIM3v1kt1 = -0.11; /* unit V */ + if (!model->BSIM3v1kt1lGiven) + model->BSIM3v1kt1l = 0.0; /* unit V*m */ + if (!model->BSIM3v1kt2Given) + model->BSIM3v1kt2 = 0.022; /* No unit */ + if (!model->BSIM3v1k3Given) + model->BSIM3v1k3 = 80.0; + if (!model->BSIM3v1k3bGiven) + model->BSIM3v1k3b = 0.0; + if (!model->BSIM3v1w0Given) + model->BSIM3v1w0 = 2.5e-6; + if (!model->BSIM3v1nlxGiven) + model->BSIM3v1nlx = 1.74e-7; + if (!model->BSIM3v1dvt0Given) + model->BSIM3v1dvt0 = 2.2; + if (!model->BSIM3v1dvt1Given) + model->BSIM3v1dvt1 = 0.53; + if (!model->BSIM3v1dvt2Given) + model->BSIM3v1dvt2 = -0.032; /* unit 1 / V */ + + if (!model->BSIM3v1dvt0wGiven) + model->BSIM3v1dvt0w = 0.0; + if (!model->BSIM3v1dvt1wGiven) + model->BSIM3v1dvt1w = 5.3e6; + if (!model->BSIM3v1dvt2wGiven) + model->BSIM3v1dvt2w = -0.032; + + if (!model->BSIM3v1droutGiven) + model->BSIM3v1drout = 0.56; + if (!model->BSIM3v1dsubGiven) + model->BSIM3v1dsub = model->BSIM3v1drout; + if (!model->BSIM3v1vth0Given) + model->BSIM3v1vth0 = (model->BSIM3v1type == NMOS) ? 0.7 : -0.7; + if (!model->BSIM3v1uaGiven) + model->BSIM3v1ua = 2.25e-9; /* unit m/V */ + if (!model->BSIM3v1ua1Given) + model->BSIM3v1ua1 = 4.31e-9; /* unit m/V */ + if (!model->BSIM3v1ubGiven) + model->BSIM3v1ub = 5.87e-19; /* unit (m/V)**2 */ + if (!model->BSIM3v1ub1Given) + model->BSIM3v1ub1 = -7.61e-18; /* unit (m/V)**2 */ + if (!model->BSIM3v1ucGiven) + model->BSIM3v1uc = (model->BSIM3v1mobMod == 3) ? -0.0465 : -0.0465e-9; + if (!model->BSIM3v1uc1Given) + model->BSIM3v1uc1 = (model->BSIM3v1mobMod == 3) ? -0.056 : -0.056e-9; + if (!model->BSIM3v1u0Given) + model->BSIM3v1u0 = (model->BSIM3v1type == NMOS) ? 0.067 : 0.025; + if (!model->BSIM3v1uteGiven) + model->BSIM3v1ute = -1.5; + if (!model->BSIM3v1voffGiven) + model->BSIM3v1voff = -0.08; + if (!model->BSIM3v1deltaGiven) + model->BSIM3v1delta = 0.01; + if (!model->BSIM3v1rdswGiven) + model->BSIM3v1rdsw = 0; + if (!model->BSIM3v1prwgGiven) + model->BSIM3v1prwg = 0.0; /* unit 1/V */ + if (!model->BSIM3v1prwbGiven) + model->BSIM3v1prwb = 0.0; + if (!model->BSIM3v1prtGiven) + if (!model->BSIM3v1prtGiven) + model->BSIM3v1prt = 0.0; + if (!model->BSIM3v1eta0Given) + model->BSIM3v1eta0 = 0.08; /* no unit */ + if (!model->BSIM3v1etabGiven) + model->BSIM3v1etab = -0.07; /* unit 1/V */ + if (!model->BSIM3v1pclmGiven) + model->BSIM3v1pclm = 1.3; /* no unit */ + if (!model->BSIM3v1pdibl1Given) + model->BSIM3v1pdibl1 = .39; /* no unit */ + if (!model->BSIM3v1pdibl2Given) + model->BSIM3v1pdibl2 = 0.0086; /* no unit */ + if (!model->BSIM3v1pdiblbGiven) + model->BSIM3v1pdiblb = 0.0; /* 1/V */ + if (!model->BSIM3v1pscbe1Given) + model->BSIM3v1pscbe1 = 4.24e8; + if (!model->BSIM3v1pscbe2Given) + model->BSIM3v1pscbe2 = 1.0e-5; + if (!model->BSIM3v1pvagGiven) + model->BSIM3v1pvag = 0.0; + if (!model->BSIM3v1wrGiven) + model->BSIM3v1wr = 1.0; + if (!model->BSIM3v1dwgGiven) + model->BSIM3v1dwg = 0.0; + if (!model->BSIM3v1dwbGiven) + model->BSIM3v1dwb = 0.0; + if (!model->BSIM3v1b0Given) + model->BSIM3v1b0 = 0.0; + if (!model->BSIM3v1b1Given) + model->BSIM3v1b1 = 0.0; + if (!model->BSIM3v1alpha0Given) + model->BSIM3v1alpha0 = 0.0; + if (!model->BSIM3v1beta0Given) + model->BSIM3v1beta0 = 30.0; + + if (!model->BSIM3v1elmGiven) + model->BSIM3v1elm = 5.0; + if (!model->BSIM3v1cgslGiven) + model->BSIM3v1cgsl = 0.0; + if (!model->BSIM3v1cgdlGiven) + model->BSIM3v1cgdl = 0.0; + if (!model->BSIM3v1ckappaGiven) + model->BSIM3v1ckappa = 0.6; + if (!model->BSIM3v1clcGiven) + model->BSIM3v1clc = 0.1e-6; + if (!model->BSIM3v1cleGiven) + model->BSIM3v1cle = 0.6; + if (!model->BSIM3v1vfbcvGiven) + model->BSIM3v1vfbcv = -1.0; /* Length dependence */ - if (!model->BSIM3V1lcdscGiven) - model->BSIM3V1lcdsc = 0.0; - if (!model->BSIM3V1lcdscbGiven) - model->BSIM3V1lcdscb = 0.0; - if (!model->BSIM3V1lcdscdGiven) - model->BSIM3V1lcdscd = 0.0; - if (!model->BSIM3V1lcitGiven) - model->BSIM3V1lcit = 0.0; - if (!model->BSIM3V1lnfactorGiven) - model->BSIM3V1lnfactor = 0.0; - if (!model->BSIM3V1lxjGiven) - model->BSIM3V1lxj = 0.0; - if (!model->BSIM3V1lvsatGiven) - model->BSIM3V1lvsat = 0.0; - if (!model->BSIM3V1latGiven) - model->BSIM3V1lat = 0.0; - if (!model->BSIM3V1la0Given) - model->BSIM3V1la0 = 0.0; - if (!model->BSIM3V1lagsGiven) - model->BSIM3V1lags = 0.0; - if (!model->BSIM3V1la1Given) - model->BSIM3V1la1 = 0.0; - if (!model->BSIM3V1la2Given) - model->BSIM3V1la2 = 0.0; - if (!model->BSIM3V1lketaGiven) - model->BSIM3V1lketa = 0.0; - if (!model->BSIM3V1lnsubGiven) - model->BSIM3V1lnsub = 0.0; - if (!model->BSIM3V1lnpeakGiven) - model->BSIM3V1lnpeak = 0.0; - if (!model->BSIM3V1lngateGiven) - model->BSIM3V1lngate = 0.0; - if (!model->BSIM3V1lvbmGiven) - model->BSIM3V1lvbm = 0.0; - if (!model->BSIM3V1lxtGiven) - model->BSIM3V1lxt = 0.0; - if (!model->BSIM3V1lkt1Given) - model->BSIM3V1lkt1 = 0.0; - if (!model->BSIM3V1lkt1lGiven) - model->BSIM3V1lkt1l = 0.0; - if (!model->BSIM3V1lkt2Given) - model->BSIM3V1lkt2 = 0.0; - if (!model->BSIM3V1lk3Given) - model->BSIM3V1lk3 = 0.0; - if (!model->BSIM3V1lk3bGiven) - model->BSIM3V1lk3b = 0.0; - if (!model->BSIM3V1lw0Given) - model->BSIM3V1lw0 = 0.0; - if (!model->BSIM3V1lnlxGiven) - model->BSIM3V1lnlx = 0.0; - if (!model->BSIM3V1ldvt0Given) - model->BSIM3V1ldvt0 = 0.0; - if (!model->BSIM3V1ldvt1Given) - model->BSIM3V1ldvt1 = 0.0; - if (!model->BSIM3V1ldvt2Given) - model->BSIM3V1ldvt2 = 0.0; - if (!model->BSIM3V1ldvt0wGiven) - model->BSIM3V1ldvt0w = 0.0; - if (!model->BSIM3V1ldvt1wGiven) - model->BSIM3V1ldvt1w = 0.0; - if (!model->BSIM3V1ldvt2wGiven) - model->BSIM3V1ldvt2w = 0.0; - if (!model->BSIM3V1ldroutGiven) - model->BSIM3V1ldrout = 0.0; - if (!model->BSIM3V1ldsubGiven) - model->BSIM3V1ldsub = 0.0; - if (!model->BSIM3V1lvth0Given) - model->BSIM3V1lvth0 = 0.0; - if (!model->BSIM3V1luaGiven) - model->BSIM3V1lua = 0.0; - if (!model->BSIM3V1lua1Given) - model->BSIM3V1lua1 = 0.0; - if (!model->BSIM3V1lubGiven) - model->BSIM3V1lub = 0.0; - if (!model->BSIM3V1lub1Given) - model->BSIM3V1lub1 = 0.0; - if (!model->BSIM3V1lucGiven) - model->BSIM3V1luc = 0.0; - if (!model->BSIM3V1luc1Given) - model->BSIM3V1luc1 = 0.0; - if (!model->BSIM3V1lu0Given) - model->BSIM3V1lu0 = 0.0; - if (!model->BSIM3V1luteGiven) - model->BSIM3V1lute = 0.0; - if (!model->BSIM3V1lvoffGiven) - model->BSIM3V1lvoff = 0.0; - if (!model->BSIM3V1ldeltaGiven) - model->BSIM3V1ldelta = 0.0; - if (!model->BSIM3V1lrdswGiven) - model->BSIM3V1lrdsw = 0.0; - if (!model->BSIM3V1lprwbGiven) - model->BSIM3V1lprwb = 0.0; - if (!model->BSIM3V1lprwgGiven) - model->BSIM3V1lprwg = 0.0; - if (!model->BSIM3V1lprtGiven) - if (!model->BSIM3V1lprtGiven) - model->BSIM3V1lprt = 0.0; - if (!model->BSIM3V1leta0Given) - model->BSIM3V1leta0 = 0.0; - if (!model->BSIM3V1letabGiven) - model->BSIM3V1letab = -0.0; - if (!model->BSIM3V1lpclmGiven) - model->BSIM3V1lpclm = 0.0; - if (!model->BSIM3V1lpdibl1Given) - model->BSIM3V1lpdibl1 = 0.0; - if (!model->BSIM3V1lpdibl2Given) - model->BSIM3V1lpdibl2 = 0.0; - if (!model->BSIM3V1lpdiblbGiven) - model->BSIM3V1lpdiblb = 0.0; - if (!model->BSIM3V1lpscbe1Given) - model->BSIM3V1lpscbe1 = 0.0; - if (!model->BSIM3V1lpscbe2Given) - model->BSIM3V1lpscbe2 = 0.0; - if (!model->BSIM3V1lpvagGiven) - model->BSIM3V1lpvag = 0.0; - if (!model->BSIM3V1lwrGiven) - model->BSIM3V1lwr = 0.0; - if (!model->BSIM3V1ldwgGiven) - model->BSIM3V1ldwg = 0.0; - if (!model->BSIM3V1ldwbGiven) - model->BSIM3V1ldwb = 0.0; - if (!model->BSIM3V1lb0Given) - model->BSIM3V1lb0 = 0.0; - if (!model->BSIM3V1lb1Given) - model->BSIM3V1lb1 = 0.0; - if (!model->BSIM3V1lalpha0Given) - model->BSIM3V1lalpha0 = 0.0; - if (!model->BSIM3V1lbeta0Given) - model->BSIM3V1lbeta0 = 0.0; - - if (!model->BSIM3V1lelmGiven) - model->BSIM3V1lelm = 0.0; - if (!model->BSIM3V1lcgslGiven) - model->BSIM3V1lcgsl = 0.0; - if (!model->BSIM3V1lcgdlGiven) - model->BSIM3V1lcgdl = 0.0; - if (!model->BSIM3V1lckappaGiven) - model->BSIM3V1lckappa = 0.0; - if (!model->BSIM3V1lclcGiven) - model->BSIM3V1lclc = 0.0; - if (!model->BSIM3V1lcleGiven) - model->BSIM3V1lcle = 0.0; - if (!model->BSIM3V1lcfGiven) - model->BSIM3V1lcf = 0.0; - if (!model->BSIM3V1lvfbcvGiven) - model->BSIM3V1lvfbcv = 0.0; + if (!model->BSIM3v1lcdscGiven) + model->BSIM3v1lcdsc = 0.0; + if (!model->BSIM3v1lcdscbGiven) + model->BSIM3v1lcdscb = 0.0; + if (!model->BSIM3v1lcdscdGiven) + model->BSIM3v1lcdscd = 0.0; + if (!model->BSIM3v1lcitGiven) + model->BSIM3v1lcit = 0.0; + if (!model->BSIM3v1lnfactorGiven) + model->BSIM3v1lnfactor = 0.0; + if (!model->BSIM3v1lxjGiven) + model->BSIM3v1lxj = 0.0; + if (!model->BSIM3v1lvsatGiven) + model->BSIM3v1lvsat = 0.0; + if (!model->BSIM3v1latGiven) + model->BSIM3v1lat = 0.0; + if (!model->BSIM3v1la0Given) + model->BSIM3v1la0 = 0.0; + if (!model->BSIM3v1lagsGiven) + model->BSIM3v1lags = 0.0; + if (!model->BSIM3v1la1Given) + model->BSIM3v1la1 = 0.0; + if (!model->BSIM3v1la2Given) + model->BSIM3v1la2 = 0.0; + if (!model->BSIM3v1lketaGiven) + model->BSIM3v1lketa = 0.0; + if (!model->BSIM3v1lnsubGiven) + model->BSIM3v1lnsub = 0.0; + if (!model->BSIM3v1lnpeakGiven) + model->BSIM3v1lnpeak = 0.0; + if (!model->BSIM3v1lngateGiven) + model->BSIM3v1lngate = 0.0; + if (!model->BSIM3v1lvbmGiven) + model->BSIM3v1lvbm = 0.0; + if (!model->BSIM3v1lxtGiven) + model->BSIM3v1lxt = 0.0; + if (!model->BSIM3v1lkt1Given) + model->BSIM3v1lkt1 = 0.0; + if (!model->BSIM3v1lkt1lGiven) + model->BSIM3v1lkt1l = 0.0; + if (!model->BSIM3v1lkt2Given) + model->BSIM3v1lkt2 = 0.0; + if (!model->BSIM3v1lk3Given) + model->BSIM3v1lk3 = 0.0; + if (!model->BSIM3v1lk3bGiven) + model->BSIM3v1lk3b = 0.0; + if (!model->BSIM3v1lw0Given) + model->BSIM3v1lw0 = 0.0; + if (!model->BSIM3v1lnlxGiven) + model->BSIM3v1lnlx = 0.0; + if (!model->BSIM3v1ldvt0Given) + model->BSIM3v1ldvt0 = 0.0; + if (!model->BSIM3v1ldvt1Given) + model->BSIM3v1ldvt1 = 0.0; + if (!model->BSIM3v1ldvt2Given) + model->BSIM3v1ldvt2 = 0.0; + if (!model->BSIM3v1ldvt0wGiven) + model->BSIM3v1ldvt0w = 0.0; + if (!model->BSIM3v1ldvt1wGiven) + model->BSIM3v1ldvt1w = 0.0; + if (!model->BSIM3v1ldvt2wGiven) + model->BSIM3v1ldvt2w = 0.0; + if (!model->BSIM3v1ldroutGiven) + model->BSIM3v1ldrout = 0.0; + if (!model->BSIM3v1ldsubGiven) + model->BSIM3v1ldsub = 0.0; + if (!model->BSIM3v1lvth0Given) + model->BSIM3v1lvth0 = 0.0; + if (!model->BSIM3v1luaGiven) + model->BSIM3v1lua = 0.0; + if (!model->BSIM3v1lua1Given) + model->BSIM3v1lua1 = 0.0; + if (!model->BSIM3v1lubGiven) + model->BSIM3v1lub = 0.0; + if (!model->BSIM3v1lub1Given) + model->BSIM3v1lub1 = 0.0; + if (!model->BSIM3v1lucGiven) + model->BSIM3v1luc = 0.0; + if (!model->BSIM3v1luc1Given) + model->BSIM3v1luc1 = 0.0; + if (!model->BSIM3v1lu0Given) + model->BSIM3v1lu0 = 0.0; + if (!model->BSIM3v1luteGiven) + model->BSIM3v1lute = 0.0; + if (!model->BSIM3v1lvoffGiven) + model->BSIM3v1lvoff = 0.0; + if (!model->BSIM3v1ldeltaGiven) + model->BSIM3v1ldelta = 0.0; + if (!model->BSIM3v1lrdswGiven) + model->BSIM3v1lrdsw = 0.0; + if (!model->BSIM3v1lprwbGiven) + model->BSIM3v1lprwb = 0.0; + if (!model->BSIM3v1lprwgGiven) + model->BSIM3v1lprwg = 0.0; + if (!model->BSIM3v1lprtGiven) + if (!model->BSIM3v1lprtGiven) + model->BSIM3v1lprt = 0.0; + if (!model->BSIM3v1leta0Given) + model->BSIM3v1leta0 = 0.0; + if (!model->BSIM3v1letabGiven) + model->BSIM3v1letab = -0.0; + if (!model->BSIM3v1lpclmGiven) + model->BSIM3v1lpclm = 0.0; + if (!model->BSIM3v1lpdibl1Given) + model->BSIM3v1lpdibl1 = 0.0; + if (!model->BSIM3v1lpdibl2Given) + model->BSIM3v1lpdibl2 = 0.0; + if (!model->BSIM3v1lpdiblbGiven) + model->BSIM3v1lpdiblb = 0.0; + if (!model->BSIM3v1lpscbe1Given) + model->BSIM3v1lpscbe1 = 0.0; + if (!model->BSIM3v1lpscbe2Given) + model->BSIM3v1lpscbe2 = 0.0; + if (!model->BSIM3v1lpvagGiven) + model->BSIM3v1lpvag = 0.0; + if (!model->BSIM3v1lwrGiven) + model->BSIM3v1lwr = 0.0; + if (!model->BSIM3v1ldwgGiven) + model->BSIM3v1ldwg = 0.0; + if (!model->BSIM3v1ldwbGiven) + model->BSIM3v1ldwb = 0.0; + if (!model->BSIM3v1lb0Given) + model->BSIM3v1lb0 = 0.0; + if (!model->BSIM3v1lb1Given) + model->BSIM3v1lb1 = 0.0; + if (!model->BSIM3v1lalpha0Given) + model->BSIM3v1lalpha0 = 0.0; + if (!model->BSIM3v1lbeta0Given) + model->BSIM3v1lbeta0 = 0.0; + + if (!model->BSIM3v1lelmGiven) + model->BSIM3v1lelm = 0.0; + if (!model->BSIM3v1lcgslGiven) + model->BSIM3v1lcgsl = 0.0; + if (!model->BSIM3v1lcgdlGiven) + model->BSIM3v1lcgdl = 0.0; + if (!model->BSIM3v1lckappaGiven) + model->BSIM3v1lckappa = 0.0; + if (!model->BSIM3v1lclcGiven) + model->BSIM3v1lclc = 0.0; + if (!model->BSIM3v1lcleGiven) + model->BSIM3v1lcle = 0.0; + if (!model->BSIM3v1lcfGiven) + model->BSIM3v1lcf = 0.0; + if (!model->BSIM3v1lvfbcvGiven) + model->BSIM3v1lvfbcv = 0.0; /* Width dependence */ - if (!model->BSIM3V1wcdscGiven) - model->BSIM3V1wcdsc = 0.0; - if (!model->BSIM3V1wcdscbGiven) - model->BSIM3V1wcdscb = 0.0; - if (!model->BSIM3V1wcdscdGiven) - model->BSIM3V1wcdscd = 0.0; - if (!model->BSIM3V1wcitGiven) - model->BSIM3V1wcit = 0.0; - if (!model->BSIM3V1wnfactorGiven) - model->BSIM3V1wnfactor = 0.0; - if (!model->BSIM3V1wxjGiven) - model->BSIM3V1wxj = 0.0; - if (!model->BSIM3V1wvsatGiven) - model->BSIM3V1wvsat = 0.0; - if (!model->BSIM3V1watGiven) - model->BSIM3V1wat = 0.0; - if (!model->BSIM3V1wa0Given) - model->BSIM3V1wa0 = 0.0; - if (!model->BSIM3V1wagsGiven) - model->BSIM3V1wags = 0.0; - if (!model->BSIM3V1wa1Given) - model->BSIM3V1wa1 = 0.0; - if (!model->BSIM3V1wa2Given) - model->BSIM3V1wa2 = 0.0; - if (!model->BSIM3V1wketaGiven) - model->BSIM3V1wketa = 0.0; - if (!model->BSIM3V1wnsubGiven) - model->BSIM3V1wnsub = 0.0; - if (!model->BSIM3V1wnpeakGiven) - model->BSIM3V1wnpeak = 0.0; - if (!model->BSIM3V1wngateGiven) - model->BSIM3V1wngate = 0.0; - if (!model->BSIM3V1wvbmGiven) - model->BSIM3V1wvbm = 0.0; - if (!model->BSIM3V1wxtGiven) - model->BSIM3V1wxt = 0.0; - if (!model->BSIM3V1wkt1Given) - model->BSIM3V1wkt1 = 0.0; - if (!model->BSIM3V1wkt1lGiven) - model->BSIM3V1wkt1l = 0.0; - if (!model->BSIM3V1wkt2Given) - model->BSIM3V1wkt2 = 0.0; - if (!model->BSIM3V1wk3Given) - model->BSIM3V1wk3 = 0.0; - if (!model->BSIM3V1wk3bGiven) - model->BSIM3V1wk3b = 0.0; - if (!model->BSIM3V1ww0Given) - model->BSIM3V1ww0 = 0.0; - if (!model->BSIM3V1wnlxGiven) - model->BSIM3V1wnlx = 0.0; - if (!model->BSIM3V1wdvt0Given) - model->BSIM3V1wdvt0 = 0.0; - if (!model->BSIM3V1wdvt1Given) - model->BSIM3V1wdvt1 = 0.0; - if (!model->BSIM3V1wdvt2Given) - model->BSIM3V1wdvt2 = 0.0; - if (!model->BSIM3V1wdvt0wGiven) - model->BSIM3V1wdvt0w = 0.0; - if (!model->BSIM3V1wdvt1wGiven) - model->BSIM3V1wdvt1w = 0.0; - if (!model->BSIM3V1wdvt2wGiven) - model->BSIM3V1wdvt2w = 0.0; - if (!model->BSIM3V1wdroutGiven) - model->BSIM3V1wdrout = 0.0; - if (!model->BSIM3V1wdsubGiven) - model->BSIM3V1wdsub = 0.0; - if (!model->BSIM3V1wvth0Given) - model->BSIM3V1wvth0 = 0.0; - if (!model->BSIM3V1wuaGiven) - model->BSIM3V1wua = 0.0; - if (!model->BSIM3V1wua1Given) - model->BSIM3V1wua1 = 0.0; - if (!model->BSIM3V1wubGiven) - model->BSIM3V1wub = 0.0; - if (!model->BSIM3V1wub1Given) - model->BSIM3V1wub1 = 0.0; - if (!model->BSIM3V1wucGiven) - model->BSIM3V1wuc = 0.0; - if (!model->BSIM3V1wuc1Given) - model->BSIM3V1wuc1 = 0.0; - if (!model->BSIM3V1wu0Given) - model->BSIM3V1wu0 = 0.0; - if (!model->BSIM3V1wuteGiven) - model->BSIM3V1wute = 0.0; - if (!model->BSIM3V1wvoffGiven) - model->BSIM3V1wvoff = 0.0; - if (!model->BSIM3V1wdeltaGiven) - model->BSIM3V1wdelta = 0.0; - if (!model->BSIM3V1wrdswGiven) - model->BSIM3V1wrdsw = 0.0; - if (!model->BSIM3V1wprwbGiven) - model->BSIM3V1wprwb = 0.0; - if (!model->BSIM3V1wprwgGiven) - model->BSIM3V1wprwg = 0.0; - if (!model->BSIM3V1wprtGiven) - model->BSIM3V1wprt = 0.0; - if (!model->BSIM3V1weta0Given) - model->BSIM3V1weta0 = 0.0; - if (!model->BSIM3V1wetabGiven) - model->BSIM3V1wetab = 0.0; - if (!model->BSIM3V1wpclmGiven) - model->BSIM3V1wpclm = 0.0; - if (!model->BSIM3V1wpdibl1Given) - model->BSIM3V1wpdibl1 = 0.0; - if (!model->BSIM3V1wpdibl2Given) - model->BSIM3V1wpdibl2 = 0.0; - if (!model->BSIM3V1wpdiblbGiven) - model->BSIM3V1wpdiblb = 0.0; - if (!model->BSIM3V1wpscbe1Given) - model->BSIM3V1wpscbe1 = 0.0; - if (!model->BSIM3V1wpscbe2Given) - model->BSIM3V1wpscbe2 = 0.0; - if (!model->BSIM3V1wpvagGiven) - model->BSIM3V1wpvag = 0.0; - if (!model->BSIM3V1wwrGiven) - model->BSIM3V1wwr = 0.0; - if (!model->BSIM3V1wdwgGiven) - model->BSIM3V1wdwg = 0.0; - if (!model->BSIM3V1wdwbGiven) - model->BSIM3V1wdwb = 0.0; - if (!model->BSIM3V1wb0Given) - model->BSIM3V1wb0 = 0.0; - if (!model->BSIM3V1wb1Given) - model->BSIM3V1wb1 = 0.0; - if (!model->BSIM3V1walpha0Given) - model->BSIM3V1walpha0 = 0.0; - if (!model->BSIM3V1wbeta0Given) - model->BSIM3V1wbeta0 = 0.0; - - if (!model->BSIM3V1welmGiven) - model->BSIM3V1welm = 0.0; - if (!model->BSIM3V1wcgslGiven) - model->BSIM3V1wcgsl = 0.0; - if (!model->BSIM3V1wcgdlGiven) - model->BSIM3V1wcgdl = 0.0; - if (!model->BSIM3V1wckappaGiven) - model->BSIM3V1wckappa = 0.0; - if (!model->BSIM3V1wcfGiven) - model->BSIM3V1wcf = 0.0; - if (!model->BSIM3V1wclcGiven) - model->BSIM3V1wclc = 0.0; - if (!model->BSIM3V1wcleGiven) - model->BSIM3V1wcle = 0.0; - if (!model->BSIM3V1wvfbcvGiven) - model->BSIM3V1wvfbcv = 0.0; + if (!model->BSIM3v1wcdscGiven) + model->BSIM3v1wcdsc = 0.0; + if (!model->BSIM3v1wcdscbGiven) + model->BSIM3v1wcdscb = 0.0; + if (!model->BSIM3v1wcdscdGiven) + model->BSIM3v1wcdscd = 0.0; + if (!model->BSIM3v1wcitGiven) + model->BSIM3v1wcit = 0.0; + if (!model->BSIM3v1wnfactorGiven) + model->BSIM3v1wnfactor = 0.0; + if (!model->BSIM3v1wxjGiven) + model->BSIM3v1wxj = 0.0; + if (!model->BSIM3v1wvsatGiven) + model->BSIM3v1wvsat = 0.0; + if (!model->BSIM3v1watGiven) + model->BSIM3v1wat = 0.0; + if (!model->BSIM3v1wa0Given) + model->BSIM3v1wa0 = 0.0; + if (!model->BSIM3v1wagsGiven) + model->BSIM3v1wags = 0.0; + if (!model->BSIM3v1wa1Given) + model->BSIM3v1wa1 = 0.0; + if (!model->BSIM3v1wa2Given) + model->BSIM3v1wa2 = 0.0; + if (!model->BSIM3v1wketaGiven) + model->BSIM3v1wketa = 0.0; + if (!model->BSIM3v1wnsubGiven) + model->BSIM3v1wnsub = 0.0; + if (!model->BSIM3v1wnpeakGiven) + model->BSIM3v1wnpeak = 0.0; + if (!model->BSIM3v1wngateGiven) + model->BSIM3v1wngate = 0.0; + if (!model->BSIM3v1wvbmGiven) + model->BSIM3v1wvbm = 0.0; + if (!model->BSIM3v1wxtGiven) + model->BSIM3v1wxt = 0.0; + if (!model->BSIM3v1wkt1Given) + model->BSIM3v1wkt1 = 0.0; + if (!model->BSIM3v1wkt1lGiven) + model->BSIM3v1wkt1l = 0.0; + if (!model->BSIM3v1wkt2Given) + model->BSIM3v1wkt2 = 0.0; + if (!model->BSIM3v1wk3Given) + model->BSIM3v1wk3 = 0.0; + if (!model->BSIM3v1wk3bGiven) + model->BSIM3v1wk3b = 0.0; + if (!model->BSIM3v1ww0Given) + model->BSIM3v1ww0 = 0.0; + if (!model->BSIM3v1wnlxGiven) + model->BSIM3v1wnlx = 0.0; + if (!model->BSIM3v1wdvt0Given) + model->BSIM3v1wdvt0 = 0.0; + if (!model->BSIM3v1wdvt1Given) + model->BSIM3v1wdvt1 = 0.0; + if (!model->BSIM3v1wdvt2Given) + model->BSIM3v1wdvt2 = 0.0; + if (!model->BSIM3v1wdvt0wGiven) + model->BSIM3v1wdvt0w = 0.0; + if (!model->BSIM3v1wdvt1wGiven) + model->BSIM3v1wdvt1w = 0.0; + if (!model->BSIM3v1wdvt2wGiven) + model->BSIM3v1wdvt2w = 0.0; + if (!model->BSIM3v1wdroutGiven) + model->BSIM3v1wdrout = 0.0; + if (!model->BSIM3v1wdsubGiven) + model->BSIM3v1wdsub = 0.0; + if (!model->BSIM3v1wvth0Given) + model->BSIM3v1wvth0 = 0.0; + if (!model->BSIM3v1wuaGiven) + model->BSIM3v1wua = 0.0; + if (!model->BSIM3v1wua1Given) + model->BSIM3v1wua1 = 0.0; + if (!model->BSIM3v1wubGiven) + model->BSIM3v1wub = 0.0; + if (!model->BSIM3v1wub1Given) + model->BSIM3v1wub1 = 0.0; + if (!model->BSIM3v1wucGiven) + model->BSIM3v1wuc = 0.0; + if (!model->BSIM3v1wuc1Given) + model->BSIM3v1wuc1 = 0.0; + if (!model->BSIM3v1wu0Given) + model->BSIM3v1wu0 = 0.0; + if (!model->BSIM3v1wuteGiven) + model->BSIM3v1wute = 0.0; + if (!model->BSIM3v1wvoffGiven) + model->BSIM3v1wvoff = 0.0; + if (!model->BSIM3v1wdeltaGiven) + model->BSIM3v1wdelta = 0.0; + if (!model->BSIM3v1wrdswGiven) + model->BSIM3v1wrdsw = 0.0; + if (!model->BSIM3v1wprwbGiven) + model->BSIM3v1wprwb = 0.0; + if (!model->BSIM3v1wprwgGiven) + model->BSIM3v1wprwg = 0.0; + if (!model->BSIM3v1wprtGiven) + model->BSIM3v1wprt = 0.0; + if (!model->BSIM3v1weta0Given) + model->BSIM3v1weta0 = 0.0; + if (!model->BSIM3v1wetabGiven) + model->BSIM3v1wetab = 0.0; + if (!model->BSIM3v1wpclmGiven) + model->BSIM3v1wpclm = 0.0; + if (!model->BSIM3v1wpdibl1Given) + model->BSIM3v1wpdibl1 = 0.0; + if (!model->BSIM3v1wpdibl2Given) + model->BSIM3v1wpdibl2 = 0.0; + if (!model->BSIM3v1wpdiblbGiven) + model->BSIM3v1wpdiblb = 0.0; + if (!model->BSIM3v1wpscbe1Given) + model->BSIM3v1wpscbe1 = 0.0; + if (!model->BSIM3v1wpscbe2Given) + model->BSIM3v1wpscbe2 = 0.0; + if (!model->BSIM3v1wpvagGiven) + model->BSIM3v1wpvag = 0.0; + if (!model->BSIM3v1wwrGiven) + model->BSIM3v1wwr = 0.0; + if (!model->BSIM3v1wdwgGiven) + model->BSIM3v1wdwg = 0.0; + if (!model->BSIM3v1wdwbGiven) + model->BSIM3v1wdwb = 0.0; + if (!model->BSIM3v1wb0Given) + model->BSIM3v1wb0 = 0.0; + if (!model->BSIM3v1wb1Given) + model->BSIM3v1wb1 = 0.0; + if (!model->BSIM3v1walpha0Given) + model->BSIM3v1walpha0 = 0.0; + if (!model->BSIM3v1wbeta0Given) + model->BSIM3v1wbeta0 = 0.0; + + if (!model->BSIM3v1welmGiven) + model->BSIM3v1welm = 0.0; + if (!model->BSIM3v1wcgslGiven) + model->BSIM3v1wcgsl = 0.0; + if (!model->BSIM3v1wcgdlGiven) + model->BSIM3v1wcgdl = 0.0; + if (!model->BSIM3v1wckappaGiven) + model->BSIM3v1wckappa = 0.0; + if (!model->BSIM3v1wcfGiven) + model->BSIM3v1wcf = 0.0; + if (!model->BSIM3v1wclcGiven) + model->BSIM3v1wclc = 0.0; + if (!model->BSIM3v1wcleGiven) + model->BSIM3v1wcle = 0.0; + if (!model->BSIM3v1wvfbcvGiven) + model->BSIM3v1wvfbcv = 0.0; /* Cross-term dependence */ - if (!model->BSIM3V1pcdscGiven) - model->BSIM3V1pcdsc = 0.0; - if (!model->BSIM3V1pcdscbGiven) - model->BSIM3V1pcdscb = 0.0; - if (!model->BSIM3V1pcdscdGiven) - model->BSIM3V1pcdscd = 0.0; - if (!model->BSIM3V1pcitGiven) - model->BSIM3V1pcit = 0.0; - if (!model->BSIM3V1pnfactorGiven) - model->BSIM3V1pnfactor = 0.0; - if (!model->BSIM3V1pxjGiven) - model->BSIM3V1pxj = 0.0; - if (!model->BSIM3V1pvsatGiven) - model->BSIM3V1pvsat = 0.0; - if (!model->BSIM3V1patGiven) - model->BSIM3V1pat = 0.0; - if (!model->BSIM3V1pa0Given) - model->BSIM3V1pa0 = 0.0; + if (!model->BSIM3v1pcdscGiven) + model->BSIM3v1pcdsc = 0.0; + if (!model->BSIM3v1pcdscbGiven) + model->BSIM3v1pcdscb = 0.0; + if (!model->BSIM3v1pcdscdGiven) + model->BSIM3v1pcdscd = 0.0; + if (!model->BSIM3v1pcitGiven) + model->BSIM3v1pcit = 0.0; + if (!model->BSIM3v1pnfactorGiven) + model->BSIM3v1pnfactor = 0.0; + if (!model->BSIM3v1pxjGiven) + model->BSIM3v1pxj = 0.0; + if (!model->BSIM3v1pvsatGiven) + model->BSIM3v1pvsat = 0.0; + if (!model->BSIM3v1patGiven) + model->BSIM3v1pat = 0.0; + if (!model->BSIM3v1pa0Given) + model->BSIM3v1pa0 = 0.0; - if (!model->BSIM3V1pagsGiven) - model->BSIM3V1pags = 0.0; - if (!model->BSIM3V1pa1Given) - model->BSIM3V1pa1 = 0.0; - if (!model->BSIM3V1pa2Given) - model->BSIM3V1pa2 = 0.0; - if (!model->BSIM3V1pketaGiven) - model->BSIM3V1pketa = 0.0; - if (!model->BSIM3V1pnsubGiven) - model->BSIM3V1pnsub = 0.0; - if (!model->BSIM3V1pnpeakGiven) - model->BSIM3V1pnpeak = 0.0; - if (!model->BSIM3V1pngateGiven) - model->BSIM3V1pngate = 0.0; - if (!model->BSIM3V1pvbmGiven) - model->BSIM3V1pvbm = 0.0; - if (!model->BSIM3V1pxtGiven) - model->BSIM3V1pxt = 0.0; - if (!model->BSIM3V1pkt1Given) - model->BSIM3V1pkt1 = 0.0; - if (!model->BSIM3V1pkt1lGiven) - model->BSIM3V1pkt1l = 0.0; - if (!model->BSIM3V1pkt2Given) - model->BSIM3V1pkt2 = 0.0; - if (!model->BSIM3V1pk3Given) - model->BSIM3V1pk3 = 0.0; - if (!model->BSIM3V1pk3bGiven) - model->BSIM3V1pk3b = 0.0; - if (!model->BSIM3V1pw0Given) - model->BSIM3V1pw0 = 0.0; - if (!model->BSIM3V1pnlxGiven) - model->BSIM3V1pnlx = 0.0; - if (!model->BSIM3V1pdvt0Given) - model->BSIM3V1pdvt0 = 0.0; - if (!model->BSIM3V1pdvt1Given) - model->BSIM3V1pdvt1 = 0.0; - if (!model->BSIM3V1pdvt2Given) - model->BSIM3V1pdvt2 = 0.0; - if (!model->BSIM3V1pdvt0wGiven) - model->BSIM3V1pdvt0w = 0.0; - if (!model->BSIM3V1pdvt1wGiven) - model->BSIM3V1pdvt1w = 0.0; - if (!model->BSIM3V1pdvt2wGiven) - model->BSIM3V1pdvt2w = 0.0; - if (!model->BSIM3V1pdroutGiven) - model->BSIM3V1pdrout = 0.0; - if (!model->BSIM3V1pdsubGiven) - model->BSIM3V1pdsub = 0.0; - if (!model->BSIM3V1pvth0Given) - model->BSIM3V1pvth0 = 0.0; - if (!model->BSIM3V1puaGiven) - model->BSIM3V1pua = 0.0; - if (!model->BSIM3V1pua1Given) - model->BSIM3V1pua1 = 0.0; - if (!model->BSIM3V1pubGiven) - model->BSIM3V1pub = 0.0; - if (!model->BSIM3V1pub1Given) - model->BSIM3V1pub1 = 0.0; - if (!model->BSIM3V1pucGiven) - model->BSIM3V1puc = 0.0; - if (!model->BSIM3V1puc1Given) - model->BSIM3V1puc1 = 0.0; - if (!model->BSIM3V1pu0Given) - model->BSIM3V1pu0 = 0.0; - if (!model->BSIM3V1puteGiven) - model->BSIM3V1pute = 0.0; - if (!model->BSIM3V1pvoffGiven) - model->BSIM3V1pvoff = 0.0; - if (!model->BSIM3V1pdeltaGiven) - model->BSIM3V1pdelta = 0.0; - if (!model->BSIM3V1prdswGiven) - model->BSIM3V1prdsw = 0.0; - if (!model->BSIM3V1pprwbGiven) - model->BSIM3V1pprwb = 0.0; - if (!model->BSIM3V1pprwgGiven) - model->BSIM3V1pprwg = 0.0; - if (!model->BSIM3V1pprtGiven) - model->BSIM3V1pprt = 0.0; - if (!model->BSIM3V1peta0Given) - model->BSIM3V1peta0 = 0.0; - if (!model->BSIM3V1petabGiven) - model->BSIM3V1petab = 0.0; - if (!model->BSIM3V1ppclmGiven) - model->BSIM3V1ppclm = 0.0; - if (!model->BSIM3V1ppdibl1Given) - model->BSIM3V1ppdibl1 = 0.0; - if (!model->BSIM3V1ppdibl2Given) - model->BSIM3V1ppdibl2 = 0.0; - if (!model->BSIM3V1ppdiblbGiven) - model->BSIM3V1ppdiblb = 0.0; - if (!model->BSIM3V1ppscbe1Given) - model->BSIM3V1ppscbe1 = 0.0; - if (!model->BSIM3V1ppscbe2Given) - model->BSIM3V1ppscbe2 = 0.0; - if (!model->BSIM3V1ppvagGiven) - model->BSIM3V1ppvag = 0.0; - if (!model->BSIM3V1pwrGiven) - model->BSIM3V1pwr = 0.0; - if (!model->BSIM3V1pdwgGiven) - model->BSIM3V1pdwg = 0.0; - if (!model->BSIM3V1pdwbGiven) - model->BSIM3V1pdwb = 0.0; - if (!model->BSIM3V1pb0Given) - model->BSIM3V1pb0 = 0.0; - if (!model->BSIM3V1pb1Given) - model->BSIM3V1pb1 = 0.0; - if (!model->BSIM3V1palpha0Given) - model->BSIM3V1palpha0 = 0.0; - if (!model->BSIM3V1pbeta0Given) - model->BSIM3V1pbeta0 = 0.0; - - if (!model->BSIM3V1pelmGiven) - model->BSIM3V1pelm = 0.0; - if (!model->BSIM3V1pcgslGiven) - model->BSIM3V1pcgsl = 0.0; - if (!model->BSIM3V1pcgdlGiven) - model->BSIM3V1pcgdl = 0.0; - if (!model->BSIM3V1pckappaGiven) - model->BSIM3V1pckappa = 0.0; - if (!model->BSIM3V1pcfGiven) - model->BSIM3V1pcf = 0.0; - if (!model->BSIM3V1pclcGiven) - model->BSIM3V1pclc = 0.0; - if (!model->BSIM3V1pcleGiven) - model->BSIM3V1pcle = 0.0; - if (!model->BSIM3V1pvfbcvGiven) - model->BSIM3V1pvfbcv = 0.0; + if (!model->BSIM3v1pagsGiven) + model->BSIM3v1pags = 0.0; + if (!model->BSIM3v1pa1Given) + model->BSIM3v1pa1 = 0.0; + if (!model->BSIM3v1pa2Given) + model->BSIM3v1pa2 = 0.0; + if (!model->BSIM3v1pketaGiven) + model->BSIM3v1pketa = 0.0; + if (!model->BSIM3v1pnsubGiven) + model->BSIM3v1pnsub = 0.0; + if (!model->BSIM3v1pnpeakGiven) + model->BSIM3v1pnpeak = 0.0; + if (!model->BSIM3v1pngateGiven) + model->BSIM3v1pngate = 0.0; + if (!model->BSIM3v1pvbmGiven) + model->BSIM3v1pvbm = 0.0; + if (!model->BSIM3v1pxtGiven) + model->BSIM3v1pxt = 0.0; + if (!model->BSIM3v1pkt1Given) + model->BSIM3v1pkt1 = 0.0; + if (!model->BSIM3v1pkt1lGiven) + model->BSIM3v1pkt1l = 0.0; + if (!model->BSIM3v1pkt2Given) + model->BSIM3v1pkt2 = 0.0; + if (!model->BSIM3v1pk3Given) + model->BSIM3v1pk3 = 0.0; + if (!model->BSIM3v1pk3bGiven) + model->BSIM3v1pk3b = 0.0; + if (!model->BSIM3v1pw0Given) + model->BSIM3v1pw0 = 0.0; + if (!model->BSIM3v1pnlxGiven) + model->BSIM3v1pnlx = 0.0; + if (!model->BSIM3v1pdvt0Given) + model->BSIM3v1pdvt0 = 0.0; + if (!model->BSIM3v1pdvt1Given) + model->BSIM3v1pdvt1 = 0.0; + if (!model->BSIM3v1pdvt2Given) + model->BSIM3v1pdvt2 = 0.0; + if (!model->BSIM3v1pdvt0wGiven) + model->BSIM3v1pdvt0w = 0.0; + if (!model->BSIM3v1pdvt1wGiven) + model->BSIM3v1pdvt1w = 0.0; + if (!model->BSIM3v1pdvt2wGiven) + model->BSIM3v1pdvt2w = 0.0; + if (!model->BSIM3v1pdroutGiven) + model->BSIM3v1pdrout = 0.0; + if (!model->BSIM3v1pdsubGiven) + model->BSIM3v1pdsub = 0.0; + if (!model->BSIM3v1pvth0Given) + model->BSIM3v1pvth0 = 0.0; + if (!model->BSIM3v1puaGiven) + model->BSIM3v1pua = 0.0; + if (!model->BSIM3v1pua1Given) + model->BSIM3v1pua1 = 0.0; + if (!model->BSIM3v1pubGiven) + model->BSIM3v1pub = 0.0; + if (!model->BSIM3v1pub1Given) + model->BSIM3v1pub1 = 0.0; + if (!model->BSIM3v1pucGiven) + model->BSIM3v1puc = 0.0; + if (!model->BSIM3v1puc1Given) + model->BSIM3v1puc1 = 0.0; + if (!model->BSIM3v1pu0Given) + model->BSIM3v1pu0 = 0.0; + if (!model->BSIM3v1puteGiven) + model->BSIM3v1pute = 0.0; + if (!model->BSIM3v1pvoffGiven) + model->BSIM3v1pvoff = 0.0; + if (!model->BSIM3v1pdeltaGiven) + model->BSIM3v1pdelta = 0.0; + if (!model->BSIM3v1prdswGiven) + model->BSIM3v1prdsw = 0.0; + if (!model->BSIM3v1pprwbGiven) + model->BSIM3v1pprwb = 0.0; + if (!model->BSIM3v1pprwgGiven) + model->BSIM3v1pprwg = 0.0; + if (!model->BSIM3v1pprtGiven) + model->BSIM3v1pprt = 0.0; + if (!model->BSIM3v1peta0Given) + model->BSIM3v1peta0 = 0.0; + if (!model->BSIM3v1petabGiven) + model->BSIM3v1petab = 0.0; + if (!model->BSIM3v1ppclmGiven) + model->BSIM3v1ppclm = 0.0; + if (!model->BSIM3v1ppdibl1Given) + model->BSIM3v1ppdibl1 = 0.0; + if (!model->BSIM3v1ppdibl2Given) + model->BSIM3v1ppdibl2 = 0.0; + if (!model->BSIM3v1ppdiblbGiven) + model->BSIM3v1ppdiblb = 0.0; + if (!model->BSIM3v1ppscbe1Given) + model->BSIM3v1ppscbe1 = 0.0; + if (!model->BSIM3v1ppscbe2Given) + model->BSIM3v1ppscbe2 = 0.0; + if (!model->BSIM3v1ppvagGiven) + model->BSIM3v1ppvag = 0.0; + if (!model->BSIM3v1pwrGiven) + model->BSIM3v1pwr = 0.0; + if (!model->BSIM3v1pdwgGiven) + model->BSIM3v1pdwg = 0.0; + if (!model->BSIM3v1pdwbGiven) + model->BSIM3v1pdwb = 0.0; + if (!model->BSIM3v1pb0Given) + model->BSIM3v1pb0 = 0.0; + if (!model->BSIM3v1pb1Given) + model->BSIM3v1pb1 = 0.0; + if (!model->BSIM3v1palpha0Given) + model->BSIM3v1palpha0 = 0.0; + if (!model->BSIM3v1pbeta0Given) + model->BSIM3v1pbeta0 = 0.0; + + if (!model->BSIM3v1pelmGiven) + model->BSIM3v1pelm = 0.0; + if (!model->BSIM3v1pcgslGiven) + model->BSIM3v1pcgsl = 0.0; + if (!model->BSIM3v1pcgdlGiven) + model->BSIM3v1pcgdl = 0.0; + if (!model->BSIM3v1pckappaGiven) + model->BSIM3v1pckappa = 0.0; + if (!model->BSIM3v1pcfGiven) + model->BSIM3v1pcf = 0.0; + if (!model->BSIM3v1pclcGiven) + model->BSIM3v1pclc = 0.0; + if (!model->BSIM3v1pcleGiven) + model->BSIM3v1pcle = 0.0; + if (!model->BSIM3v1pvfbcvGiven) + model->BSIM3v1pvfbcv = 0.0; /* unit degree celcius */ - if (!model->BSIM3V1tnomGiven) - model->BSIM3V1tnom = ckt->CKTnomTemp; - if (!model->BSIM3V1LintGiven) - model->BSIM3V1Lint = 0.0; - if (!model->BSIM3V1LlGiven) - model->BSIM3V1Ll = 0.0; - if (!model->BSIM3V1LlnGiven) - model->BSIM3V1Lln = 1.0; - if (!model->BSIM3V1LwGiven) - model->BSIM3V1Lw = 0.0; - if (!model->BSIM3V1LwnGiven) - model->BSIM3V1Lwn = 1.0; - if (!model->BSIM3V1LwlGiven) - model->BSIM3V1Lwl = 0.0; - if (!model->BSIM3V1LminGiven) - model->BSIM3V1Lmin = 0.0; - if (!model->BSIM3V1LmaxGiven) - model->BSIM3V1Lmax = 1.0; - if (!model->BSIM3V1WintGiven) - model->BSIM3V1Wint = 0.0; - if (!model->BSIM3V1WlGiven) - model->BSIM3V1Wl = 0.0; - if (!model->BSIM3V1WlnGiven) - model->BSIM3V1Wln = 1.0; - if (!model->BSIM3V1WwGiven) - model->BSIM3V1Ww = 0.0; - if (!model->BSIM3V1WwnGiven) - model->BSIM3V1Wwn = 1.0; - if (!model->BSIM3V1WwlGiven) - model->BSIM3V1Wwl = 0.0; - if (!model->BSIM3V1WminGiven) - model->BSIM3V1Wmin = 0.0; - if (!model->BSIM3V1WmaxGiven) - model->BSIM3V1Wmax = 1.0; - if (!model->BSIM3V1dwcGiven) - model->BSIM3V1dwc = model->BSIM3V1Wint; - if (!model->BSIM3V1dlcGiven) - model->BSIM3V1dlc = model->BSIM3V1Lint; - if (!model->BSIM3V1cfGiven) - model->BSIM3V1cf = 2.0 * EPSOX / PI - * log(1.0 + 0.4e-6 / model->BSIM3V1tox); - if (!model->BSIM3V1cgdoGiven) - { if (model->BSIM3V1dlcGiven && (model->BSIM3V1dlc > 0.0)) - { model->BSIM3V1cgdo = model->BSIM3V1dlc * model->BSIM3V1cox - - model->BSIM3V1cgdl ; + if (!model->BSIM3v1tnomGiven) + model->BSIM3v1tnom = ckt->CKTnomTemp; + if (!model->BSIM3v1LintGiven) + model->BSIM3v1Lint = 0.0; + if (!model->BSIM3v1LlGiven) + model->BSIM3v1Ll = 0.0; + if (!model->BSIM3v1LlnGiven) + model->BSIM3v1Lln = 1.0; + if (!model->BSIM3v1LwGiven) + model->BSIM3v1Lw = 0.0; + if (!model->BSIM3v1LwnGiven) + model->BSIM3v1Lwn = 1.0; + if (!model->BSIM3v1LwlGiven) + model->BSIM3v1Lwl = 0.0; + if (!model->BSIM3v1LminGiven) + model->BSIM3v1Lmin = 0.0; + if (!model->BSIM3v1LmaxGiven) + model->BSIM3v1Lmax = 1.0; + if (!model->BSIM3v1WintGiven) + model->BSIM3v1Wint = 0.0; + if (!model->BSIM3v1WlGiven) + model->BSIM3v1Wl = 0.0; + if (!model->BSIM3v1WlnGiven) + model->BSIM3v1Wln = 1.0; + if (!model->BSIM3v1WwGiven) + model->BSIM3v1Ww = 0.0; + if (!model->BSIM3v1WwnGiven) + model->BSIM3v1Wwn = 1.0; + if (!model->BSIM3v1WwlGiven) + model->BSIM3v1Wwl = 0.0; + if (!model->BSIM3v1WminGiven) + model->BSIM3v1Wmin = 0.0; + if (!model->BSIM3v1WmaxGiven) + model->BSIM3v1Wmax = 1.0; + if (!model->BSIM3v1dwcGiven) + model->BSIM3v1dwc = model->BSIM3v1Wint; + if (!model->BSIM3v1dlcGiven) + model->BSIM3v1dlc = model->BSIM3v1Lint; + if (!model->BSIM3v1cfGiven) + model->BSIM3v1cf = 2.0 * EPSOX / PI + * log(1.0 + 0.4e-6 / model->BSIM3v1tox); + if (!model->BSIM3v1cgdoGiven) + { if (model->BSIM3v1dlcGiven && (model->BSIM3v1dlc > 0.0)) + { model->BSIM3v1cgdo = model->BSIM3v1dlc * model->BSIM3v1cox + - model->BSIM3v1cgdl ; } else - model->BSIM3V1cgdo = 0.6 * model->BSIM3V1xj * model->BSIM3V1cox; + model->BSIM3v1cgdo = 0.6 * model->BSIM3v1xj * model->BSIM3v1cox; } - if (!model->BSIM3V1cgsoGiven) - { if (model->BSIM3V1dlcGiven && (model->BSIM3V1dlc > 0.0)) - { model->BSIM3V1cgso = model->BSIM3V1dlc * model->BSIM3V1cox - - model->BSIM3V1cgsl ; + if (!model->BSIM3v1cgsoGiven) + { if (model->BSIM3v1dlcGiven && (model->BSIM3v1dlc > 0.0)) + { model->BSIM3v1cgso = model->BSIM3v1dlc * model->BSIM3v1cox + - model->BSIM3v1cgsl ; } else - model->BSIM3V1cgso = 0.6 * model->BSIM3V1xj * model->BSIM3V1cox; + model->BSIM3v1cgso = 0.6 * model->BSIM3v1xj * model->BSIM3v1cox; } - if (!model->BSIM3V1cgboGiven) - { model->BSIM3V1cgbo = 2.0 * model->BSIM3V1dwc * model->BSIM3V1cox; + if (!model->BSIM3v1cgboGiven) + { model->BSIM3v1cgbo = 2.0 * model->BSIM3v1dwc * model->BSIM3v1cox; } - if (!model->BSIM3V1xpartGiven) - model->BSIM3V1xpart = 0.0; - if (!model->BSIM3V1sheetResistanceGiven) - model->BSIM3V1sheetResistance = 0.0; - if (!model->BSIM3V1unitAreaJctCapGiven) - model->BSIM3V1unitAreaJctCap = 5.0E-4; - if (!model->BSIM3V1unitLengthSidewallJctCapGiven) - model->BSIM3V1unitLengthSidewallJctCap = 5.0E-10; - if (!model->BSIM3V1unitLengthGateSidewallJctCapGiven) - model->BSIM3V1unitLengthGateSidewallJctCap = model->BSIM3V1unitLengthSidewallJctCap ; - if (!model->BSIM3V1jctSatCurDensityGiven) - model->BSIM3V1jctSatCurDensity = 1.0E-4; - if (!model->BSIM3V1jctSidewallSatCurDensityGiven) - model->BSIM3V1jctSidewallSatCurDensity = 0.0; - if (!model->BSIM3V1bulkJctPotentialGiven) - model->BSIM3V1bulkJctPotential = 1.0; - if (!model->BSIM3V1sidewallJctPotentialGiven) - model->BSIM3V1sidewallJctPotential = 1.0; - if (!model->BSIM3V1GatesidewallJctPotentialGiven) - model->BSIM3V1GatesidewallJctPotential = model->BSIM3V1sidewallJctPotential; - if (!model->BSIM3V1bulkJctBotGradingCoeffGiven) - model->BSIM3V1bulkJctBotGradingCoeff = 0.5; - if (!model->BSIM3V1bulkJctSideGradingCoeffGiven) - model->BSIM3V1bulkJctSideGradingCoeff = 0.33; - if (!model->BSIM3V1bulkJctGateSideGradingCoeffGiven) - model->BSIM3V1bulkJctGateSideGradingCoeff = model->BSIM3V1bulkJctSideGradingCoeff; - if (!model->BSIM3V1jctEmissionCoeffGiven) - model->BSIM3V1jctEmissionCoeff = 1.0; - if (!model->BSIM3V1jctTempExponentGiven) - model->BSIM3V1jctTempExponent = 3.0; - if (!model->BSIM3V1oxideTrapDensityAGiven) - if (!model->BSIM3V1oxideTrapDensityAGiven) - { if (model->BSIM3V1type == NMOS) - model->BSIM3V1oxideTrapDensityA = 1e20; + if (!model->BSIM3v1xpartGiven) + model->BSIM3v1xpart = 0.0; + if (!model->BSIM3v1sheetResistanceGiven) + model->BSIM3v1sheetResistance = 0.0; + if (!model->BSIM3v1unitAreaJctCapGiven) + model->BSIM3v1unitAreaJctCap = 5.0E-4; + if (!model->BSIM3v1unitLengthSidewallJctCapGiven) + model->BSIM3v1unitLengthSidewallJctCap = 5.0E-10; + if (!model->BSIM3v1unitLengthGateSidewallJctCapGiven) + model->BSIM3v1unitLengthGateSidewallJctCap = model->BSIM3v1unitLengthSidewallJctCap ; + if (!model->BSIM3v1jctSatCurDensityGiven) + model->BSIM3v1jctSatCurDensity = 1.0E-4; + if (!model->BSIM3v1jctSidewallSatCurDensityGiven) + model->BSIM3v1jctSidewallSatCurDensity = 0.0; + if (!model->BSIM3v1bulkJctPotentialGiven) + model->BSIM3v1bulkJctPotential = 1.0; + if (!model->BSIM3v1sidewallJctPotentialGiven) + model->BSIM3v1sidewallJctPotential = 1.0; + if (!model->BSIM3v1GatesidewallJctPotentialGiven) + model->BSIM3v1GatesidewallJctPotential = model->BSIM3v1sidewallJctPotential; + if (!model->BSIM3v1bulkJctBotGradingCoeffGiven) + model->BSIM3v1bulkJctBotGradingCoeff = 0.5; + if (!model->BSIM3v1bulkJctSideGradingCoeffGiven) + model->BSIM3v1bulkJctSideGradingCoeff = 0.33; + if (!model->BSIM3v1bulkJctGateSideGradingCoeffGiven) + model->BSIM3v1bulkJctGateSideGradingCoeff = model->BSIM3v1bulkJctSideGradingCoeff; + if (!model->BSIM3v1jctEmissionCoeffGiven) + model->BSIM3v1jctEmissionCoeff = 1.0; + if (!model->BSIM3v1jctTempExponentGiven) + model->BSIM3v1jctTempExponent = 3.0; + if (!model->BSIM3v1oxideTrapDensityAGiven) + if (!model->BSIM3v1oxideTrapDensityAGiven) + { if (model->BSIM3v1type == NMOS) + model->BSIM3v1oxideTrapDensityA = 1e20; else - model->BSIM3V1oxideTrapDensityA=9.9e18; + model->BSIM3v1oxideTrapDensityA=9.9e18; } - if (!model->BSIM3V1oxideTrapDensityBGiven) - { if (model->BSIM3V1type == NMOS) - model->BSIM3V1oxideTrapDensityB = 5e4; + if (!model->BSIM3v1oxideTrapDensityBGiven) + { if (model->BSIM3v1type == NMOS) + model->BSIM3v1oxideTrapDensityB = 5e4; else - model->BSIM3V1oxideTrapDensityB = 2.4e3; + model->BSIM3v1oxideTrapDensityB = 2.4e3; } - if (!model->BSIM3V1oxideTrapDensityCGiven) - { if (model->BSIM3V1type == NMOS) - model->BSIM3V1oxideTrapDensityC = -1.4e-12; + if (!model->BSIM3v1oxideTrapDensityCGiven) + { if (model->BSIM3v1type == NMOS) + model->BSIM3v1oxideTrapDensityC = -1.4e-12; else - model->BSIM3V1oxideTrapDensityC = 1.4e-12; + model->BSIM3v1oxideTrapDensityC = 1.4e-12; } - if (!model->BSIM3V1emGiven) - model->BSIM3V1em = 4.1e7; /* V/m */ - if (!model->BSIM3V1efGiven) - model->BSIM3V1ef = 1.0; - if (!model->BSIM3V1afGiven) - model->BSIM3V1af = 1.0; - if (!model->BSIM3V1kfGiven) - model->BSIM3V1kf = 0.0; + if (!model->BSIM3v1emGiven) + model->BSIM3v1em = 4.1e7; /* V/m */ + if (!model->BSIM3v1efGiven) + model->BSIM3v1ef = 1.0; + if (!model->BSIM3v1afGiven) + model->BSIM3v1af = 1.0; + if (!model->BSIM3v1kfGiven) + model->BSIM3v1kf = 0.0; /* loop through all the instances of the model */ - for (here = model->BSIM3V1instances; here != NULL ; - here=here->BSIM3V1nextInstance) - + for (here = model->BSIM3v1instances; here != NULL ; + here=here->BSIM3v1nextInstance) { - if (here->BSIM3V1owner == ARCHme) { - /* allocate a chunk of the state vector */ - here->BSIM3V1states = *states; - *states += BSIM3V1numStates; - } + if (here->BSIM3v1owner == ARCHme) + { + /* allocate a chunk of the state vector */ + here->BSIM3v1states = *states; + *states += BSIM3v1numStates; + } + /* perform the parameter defaulting */ - if(here->BSIM3V1m == 0.0) - here->BSIM3V1m = 1.0; - fprintf(stderr, "M = %.2f\n", here->BSIM3V1m); - if (!here->BSIM3V1wGiven) - here->BSIM3V1w = 5e-6; - here->BSIM3V1w *= here->BSIM3V1m; - - if (!here->BSIM3V1drainAreaGiven) - { - if(model->BSIM3V1hdifGiven) - here->BSIM3V1drainArea = here->BSIM3V1w * 2 * model->BSIM3V1hdif; - else - here->BSIM3V1drainArea = 0.0; - } - here->BSIM3V1drainArea *= here->BSIM3V1m; - if (!here->BSIM3V1drainPerimeterGiven) - { - if(model->BSIM3V1hdifGiven) - here->BSIM3V1drainPerimeter = - 2 * here->BSIM3V1w + 4 * model->BSIM3V1hdif; - else - here->BSIM3V1drainPerimeter = 0.0; - } - here->BSIM3V1drainPerimeter *= here->BSIM3V1m; - - if (!here->BSIM3V1drainSquaresGiven) - here->BSIM3V1drainSquares = 1.0; - here->BSIM3V1drainSquares /= here->BSIM3V1m; - - if (!here->BSIM3V1icVBSGiven) - here->BSIM3V1icVBS = 0; - if (!here->BSIM3V1icVDSGiven) - here->BSIM3V1icVDS = 0; - if (!here->BSIM3V1icVGSGiven) - here->BSIM3V1icVGS = 0; - if (!here->BSIM3V1lGiven) - here->BSIM3V1l = 5e-6; - if (!here->BSIM3V1sourceAreaGiven) - { - if(model->BSIM3V1hdifGiven) - here->BSIM3V1sourceArea = here->BSIM3V1w * 2 * model->BSIM3V1hdif; - else - here->BSIM3V1sourceArea = 0.0; - } - here->BSIM3V1sourceArea *= here->BSIM3V1m; - - if (!here->BSIM3V1sourcePerimeterGiven) - { - if(model->BSIM3V1hdifGiven) - here->BSIM3V1sourcePerimeter = - 2 * here->BSIM3V1w + 4 * model->BSIM3V1hdif; - else - here->BSIM3V1sourcePerimeter = 0.0; - } - here->BSIM3V1sourcePerimeter *= here->BSIM3V1m; - - if (!here->BSIM3V1sourceSquaresGiven) - here->BSIM3V1sourceSquares = 1.0; - here->BSIM3V1sourceSquares /= here->BSIM3V1m; - - if (!here->BSIM3V1nqsModGiven) - here->BSIM3V1nqsMod = model->BSIM3V1nqsMod; + if (!here->BSIM3v1drainAreaGiven) + here->BSIM3v1drainArea = 0.0; + if (!here->BSIM3v1drainPerimeterGiven) + here->BSIM3v1drainPerimeter = 0.0; + if (!here->BSIM3v1drainSquaresGiven) + here->BSIM3v1drainSquares = 1.0; + if (!here->BSIM3v1icVBSGiven) + here->BSIM3v1icVBS = 0; + if (!here->BSIM3v1icVDSGiven) + here->BSIM3v1icVDS = 0; + if (!here->BSIM3v1icVGSGiven) + here->BSIM3v1icVGS = 0; + if (!here->BSIM3v1lGiven) + here->BSIM3v1l = 5e-6; + if (!here->BSIM3v1sourceAreaGiven) + here->BSIM3v1sourceArea = 0; + if (!here->BSIM3v1sourcePerimeterGiven) + here->BSIM3v1sourcePerimeter = 0; + if (!here->BSIM3v1sourceSquaresGiven) + here->BSIM3v1sourceSquares = 1; + if (!here->BSIM3v1wGiven) + here->BSIM3v1w = 5e-6; + + if (!here->BSIM3v1mGiven) + here->BSIM3v1m = 1; + + if (!here->BSIM3v1nqsModGiven) + here->BSIM3v1nqsMod = model->BSIM3v1nqsMod; /* process drain series resistance */ - if ((model->BSIM3V1sheetResistance > 0.0) && - (here->BSIM3V1drainSquares > 0.0 ) && - (here->BSIM3V1dNodePrime == 0)) - { error = CKTmkVolt(ckt,&tmp,here->BSIM3V1name,"drain"); + if ((model->BSIM3v1sheetResistance > 0.0) && + (here->BSIM3v1drainSquares > 0.0 ) && + (here->BSIM3v1dNodePrime == 0)) + { error = CKTmkVolt(ckt,&tmp,here->BSIM3v1name,"drain"); if(error) return(error); - here->BSIM3V1dNodePrime = tmp->number; - } + here->BSIM3v1dNodePrime = tmp->number; + + if (ckt->CKTcopyNodesets) { + if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } + } + + } else - { here->BSIM3V1dNodePrime = here->BSIM3V1dNode; + { here->BSIM3v1dNodePrime = here->BSIM3v1dNode; } /* process source series resistance */ - if ((model->BSIM3V1sheetResistance > 0.0) && - (here->BSIM3V1sourceSquares > 0.0 ) && - (here->BSIM3V1sNodePrime == 0)) - { error = CKTmkVolt(ckt,&tmp,here->BSIM3V1name,"source"); + if ((model->BSIM3v1sheetResistance > 0.0) && + (here->BSIM3v1sourceSquares > 0.0 ) && + (here->BSIM3v1sNodePrime == 0)) + { error = CKTmkVolt(ckt,&tmp,here->BSIM3v1name,"source"); if(error) return(error); - here->BSIM3V1sNodePrime = tmp->number; + here->BSIM3v1sNodePrime = tmp->number; + + if (ckt->CKTcopyNodesets) { + if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } + } + } else - { here->BSIM3V1sNodePrime = here->BSIM3V1sNode; + { here->BSIM3v1sNodePrime = here->BSIM3v1sNode; } /* internal charge node */ - if ((here->BSIM3V1nqsMod) && (here->BSIM3V1qNode == 0)) - { error = CKTmkVolt(ckt,&tmp,here->BSIM3V1name,"charge"); + if ((here->BSIM3v1nqsMod) && (here->BSIM3v1qNode == 0)) + { error = CKTmkVolt(ckt,&tmp,here->BSIM3v1name,"charge"); if(error) return(error); - here->BSIM3V1qNode = tmp->number; + here->BSIM3v1qNode = tmp->number; } else - { here->BSIM3V1qNode = 0; + { here->BSIM3v1qNode = 0; } /* set Sparse Matrix Pointers */ @@ -888,39 +880,39 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ return(E_NOMEM);\ } - TSTALLOC(BSIM3V1DdPtr, BSIM3V1dNode, BSIM3V1dNode) - TSTALLOC(BSIM3V1GgPtr, BSIM3V1gNode, BSIM3V1gNode) - TSTALLOC(BSIM3V1SsPtr, BSIM3V1sNode, BSIM3V1sNode) - TSTALLOC(BSIM3V1BbPtr, BSIM3V1bNode, BSIM3V1bNode) - TSTALLOC(BSIM3V1DPdpPtr, BSIM3V1dNodePrime, BSIM3V1dNodePrime) - TSTALLOC(BSIM3V1SPspPtr, BSIM3V1sNodePrime, BSIM3V1sNodePrime) - TSTALLOC(BSIM3V1DdpPtr, BSIM3V1dNode, BSIM3V1dNodePrime) - TSTALLOC(BSIM3V1GbPtr, BSIM3V1gNode, BSIM3V1bNode) - TSTALLOC(BSIM3V1GdpPtr, BSIM3V1gNode, BSIM3V1dNodePrime) - TSTALLOC(BSIM3V1GspPtr, BSIM3V1gNode, BSIM3V1sNodePrime) - TSTALLOC(BSIM3V1SspPtr, BSIM3V1sNode, BSIM3V1sNodePrime) - TSTALLOC(BSIM3V1BdpPtr, BSIM3V1bNode, BSIM3V1dNodePrime) - TSTALLOC(BSIM3V1BspPtr, BSIM3V1bNode, BSIM3V1sNodePrime) - TSTALLOC(BSIM3V1DPspPtr, BSIM3V1dNodePrime, BSIM3V1sNodePrime) - TSTALLOC(BSIM3V1DPdPtr, BSIM3V1dNodePrime, BSIM3V1dNode) - TSTALLOC(BSIM3V1BgPtr, BSIM3V1bNode, BSIM3V1gNode) - TSTALLOC(BSIM3V1DPgPtr, BSIM3V1dNodePrime, BSIM3V1gNode) - TSTALLOC(BSIM3V1SPgPtr, BSIM3V1sNodePrime, BSIM3V1gNode) - TSTALLOC(BSIM3V1SPsPtr, BSIM3V1sNodePrime, BSIM3V1sNode) - TSTALLOC(BSIM3V1DPbPtr, BSIM3V1dNodePrime, BSIM3V1bNode) - TSTALLOC(BSIM3V1SPbPtr, BSIM3V1sNodePrime, BSIM3V1bNode) - TSTALLOC(BSIM3V1SPdpPtr, BSIM3V1sNodePrime, BSIM3V1dNodePrime) - - TSTALLOC(BSIM3V1QqPtr, BSIM3V1qNode, BSIM3V1qNode) + TSTALLOC(BSIM3v1DdPtr, BSIM3v1dNode, BSIM3v1dNode) + TSTALLOC(BSIM3v1GgPtr, BSIM3v1gNode, BSIM3v1gNode) + TSTALLOC(BSIM3v1SsPtr, BSIM3v1sNode, BSIM3v1sNode) + TSTALLOC(BSIM3v1BbPtr, BSIM3v1bNode, BSIM3v1bNode) + TSTALLOC(BSIM3v1DPdpPtr, BSIM3v1dNodePrime, BSIM3v1dNodePrime) + TSTALLOC(BSIM3v1SPspPtr, BSIM3v1sNodePrime, BSIM3v1sNodePrime) + TSTALLOC(BSIM3v1DdpPtr, BSIM3v1dNode, BSIM3v1dNodePrime) + TSTALLOC(BSIM3v1GbPtr, BSIM3v1gNode, BSIM3v1bNode) + TSTALLOC(BSIM3v1GdpPtr, BSIM3v1gNode, BSIM3v1dNodePrime) + TSTALLOC(BSIM3v1GspPtr, BSIM3v1gNode, BSIM3v1sNodePrime) + TSTALLOC(BSIM3v1SspPtr, BSIM3v1sNode, BSIM3v1sNodePrime) + TSTALLOC(BSIM3v1BdpPtr, BSIM3v1bNode, BSIM3v1dNodePrime) + TSTALLOC(BSIM3v1BspPtr, BSIM3v1bNode, BSIM3v1sNodePrime) + TSTALLOC(BSIM3v1DPspPtr, BSIM3v1dNodePrime, BSIM3v1sNodePrime) + TSTALLOC(BSIM3v1DPdPtr, BSIM3v1dNodePrime, BSIM3v1dNode) + TSTALLOC(BSIM3v1BgPtr, BSIM3v1bNode, BSIM3v1gNode) + TSTALLOC(BSIM3v1DPgPtr, BSIM3v1dNodePrime, BSIM3v1gNode) + TSTALLOC(BSIM3v1SPgPtr, BSIM3v1sNodePrime, BSIM3v1gNode) + TSTALLOC(BSIM3v1SPsPtr, BSIM3v1sNodePrime, BSIM3v1sNode) + TSTALLOC(BSIM3v1DPbPtr, BSIM3v1dNodePrime, BSIM3v1bNode) + TSTALLOC(BSIM3v1SPbPtr, BSIM3v1sNodePrime, BSIM3v1bNode) + TSTALLOC(BSIM3v1SPdpPtr, BSIM3v1sNodePrime, BSIM3v1dNodePrime) + + TSTALLOC(BSIM3v1QqPtr, BSIM3v1qNode, BSIM3v1qNode) - TSTALLOC(BSIM3V1QdpPtr, BSIM3V1qNode, BSIM3V1dNodePrime) - TSTALLOC(BSIM3V1QspPtr, BSIM3V1qNode, BSIM3V1sNodePrime) - TSTALLOC(BSIM3V1QgPtr, BSIM3V1qNode, BSIM3V1gNode) - TSTALLOC(BSIM3V1QbPtr, BSIM3V1qNode, BSIM3V1bNode) - TSTALLOC(BSIM3V1DPqPtr, BSIM3V1dNodePrime, BSIM3V1qNode) - TSTALLOC(BSIM3V1SPqPtr, BSIM3V1sNodePrime, BSIM3V1qNode) - TSTALLOC(BSIM3V1GqPtr, BSIM3V1gNode, BSIM3V1qNode) - TSTALLOC(BSIM3V1BqPtr, BSIM3V1bNode, BSIM3V1qNode) + TSTALLOC(BSIM3v1QdpPtr, BSIM3v1qNode, BSIM3v1dNodePrime) + TSTALLOC(BSIM3v1QspPtr, BSIM3v1qNode, BSIM3v1sNodePrime) + TSTALLOC(BSIM3v1QgPtr, BSIM3v1qNode, BSIM3v1gNode) + TSTALLOC(BSIM3v1QbPtr, BSIM3v1qNode, BSIM3v1bNode) + TSTALLOC(BSIM3v1DPqPtr, BSIM3v1dNodePrime, BSIM3v1qNode) + TSTALLOC(BSIM3v1SPqPtr, BSIM3v1sNodePrime, BSIM3v1qNode) + TSTALLOC(BSIM3v1GqPtr, BSIM3v1gNode, BSIM3v1qNode) + TSTALLOC(BSIM3v1BqPtr, BSIM3v1bNode, BSIM3v1qNode) } } @@ -928,6 +920,33 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ } +int +BSIM3v1unsetup(GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM3v1model *model; + BSIM3v1instance *here; + for (model = (BSIM3v1model *)inModel; model != NULL; + model = model->BSIM3v1nextModel) + { + for (here = model->BSIM3v1instances; here != NULL; + here=here->BSIM3v1nextInstance) + { + if (here->BSIM3v1dNodePrime + && here->BSIM3v1dNodePrime != here->BSIM3v1dNode) + { + CKTdltNNum(ckt, here->BSIM3v1dNodePrime); + here->BSIM3v1dNodePrime = 0; + } + if (here->BSIM3v1sNodePrime + && here->BSIM3v1sNodePrime != here->BSIM3v1sNode) + { + CKTdltNNum(ckt, here->BSIM3v1sNodePrime); + here->BSIM3v1sNodePrime = 0; + } + } + } + return OK; +} diff --git a/src/spicelib/devices/bsim3v1/b3v1temp.c b/src/spicelib/devices/bsim3v1/b3v1temp.c index cab2870c1..819e6d323 100644 --- a/src/spicelib/devices/bsim3v1/b3v1temp.c +++ b/src/spicelib/devices/bsim3v1/b3v1temp.c @@ -1,13 +1,18 @@ -/*********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v1temp.c -**********/ +/********** + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1ld.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ + /* Lmin, Lmax, Wmin, Wmax */ #include "ngspice.h" -#include -#include #include "smpdefs.h" #include "cktdefs.h" #include "bsim3v1def.h" @@ -28,73 +33,74 @@ File: b3v1temp.c /* ARGSUSED */ int -BSIM3V1temp(inModel,ckt) -GENmodel *inModel; -CKTcircuit *ckt; +BSIM3v1temp(GENmodel *inModel, CKTcircuit *ckt) { -BSIM3V1model *model = (BSIM3V1model*) inModel; -BSIM3V1instance *here; +BSIM3v1model *model = (BSIM3v1model*) inModel; +BSIM3v1instance *here; struct bsim3v1SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam; -double tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, Ldrn, Wdrn; -double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; +double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn; +double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, Tnom; int Size_Not_Found; - /* loop through all the BSIM3V1 device models */ - for (; model != NULL; model = model->BSIM3V1nextModel) + /* loop through all the BSIM3v1 device models */ + for (; model != NULL; model = model->BSIM3v1nextModel) { Temp = ckt->CKTtemp; - if (model->BSIM3V1bulkJctPotential < 0.1) - model->BSIM3V1bulkJctPotential = 0.1; - if (model->BSIM3V1sidewallJctPotential < 0.1) - model->BSIM3V1sidewallJctPotential = 0.1; - if (model->BSIM3V1GatesidewallJctPotential < 0.1) - model->BSIM3V1GatesidewallJctPotential = 0.1; + if (model->BSIM3v1bulkJctPotential < 0.1) + model->BSIM3v1bulkJctPotential = 0.1; + if (model->BSIM3v1sidewallJctPotential < 0.1) + model->BSIM3v1sidewallJctPotential = 0.1; + if (model->BSIM3v1GatesidewallJctPotential < 0.1) + model->BSIM3v1GatesidewallJctPotential = 0.1; model->pSizeDependParamKnot = NULL; pLastKnot = NULL; - Tnom = model->BSIM3V1tnom; + Tnom = model->BSIM3v1tnom; TRatio = Temp / Tnom; - model->BSIM3V1vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - model->BSIM3V1factor1 = sqrt(EPSSI / EPSOX * model->BSIM3V1tox); + model->BSIM3v1vcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); + model->BSIM3v1factor1 = sqrt(EPSSI / EPSOX * model->BSIM3v1tox); Vtm0 = KboQ * Tnom; Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); ni = 1.45e10 * (Tnom / 300.15) * sqrt(Tnom / 300.15) * exp(21.5565981 - Eg0 / (2.0 * Vtm0)); - model->BSIM3V1vtm = KboQ * Temp; + model->BSIM3v1vtm = KboQ * Temp; Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); if (Temp != Tnom) - { T0 = Eg0 / Vtm0 - Eg / model->BSIM3V1vtm + model->BSIM3V1jctTempExponent + { T0 = Eg0 / Vtm0 - Eg / model->BSIM3v1vtm + model->BSIM3v1jctTempExponent * log(Temp / Tnom); - T1 = exp(T0 / model->BSIM3V1jctEmissionCoeff); - model->BSIM3V1jctTempSatCurDensity = model->BSIM3V1jctSatCurDensity + T1 = exp(T0 / model->BSIM3v1jctEmissionCoeff); + model->BSIM3v1jctTempSatCurDensity = model->BSIM3v1jctSatCurDensity * T1; - model->BSIM3V1jctSidewallTempSatCurDensity - = model->BSIM3V1jctSidewallSatCurDensity * T1; + model->BSIM3v1jctSidewallTempSatCurDensity + = model->BSIM3v1jctSidewallSatCurDensity * T1; } else - { model->BSIM3V1jctTempSatCurDensity = model->BSIM3V1jctSatCurDensity; - model->BSIM3V1jctSidewallTempSatCurDensity - = model->BSIM3V1jctSidewallSatCurDensity; + { model->BSIM3v1jctTempSatCurDensity = model->BSIM3v1jctSatCurDensity; + model->BSIM3v1jctSidewallTempSatCurDensity + = model->BSIM3v1jctSidewallSatCurDensity; } - if (model->BSIM3V1jctTempSatCurDensity < 0.0) - model->BSIM3V1jctTempSatCurDensity = 0.0; - if (model->BSIM3V1jctSidewallTempSatCurDensity < 0.0) - model->BSIM3V1jctSidewallTempSatCurDensity = 0.0; + if (model->BSIM3v1jctTempSatCurDensity < 0.0) + model->BSIM3v1jctTempSatCurDensity = 0.0; + if (model->BSIM3v1jctSidewallTempSatCurDensity < 0.0) + model->BSIM3v1jctSidewallTempSatCurDensity = 0.0; /* loop through all the instances of the model */ /* MCJ: Length and Width not initialized */ - for (here = model->BSIM3V1instances; here != NULL; - here = here->BSIM3V1nextInstance) + for (here = model->BSIM3v1instances; here != NULL; + here = here->BSIM3v1nextInstance) { - if (here->BSIM3V1owner != ARCHme) continue; - pSizeDependParamKnot = model->pSizeDependParamKnot; + + if (here->BSIM3v1owner != ARCHme) + continue; + + pSizeDependParamKnot = model->pSizeDependParamKnot; Size_Not_Found = 1; while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->BSIM3V1l == pSizeDependParamKnot->Length) - && (here->BSIM3V1w == pSizeDependParamKnot->Width)) + { if ((here->BSIM3v1l == pSizeDependParamKnot->Length) + && (here->BSIM3v1w == pSizeDependParamKnot->Width)) { Size_Not_Found = 0; here->pParam = pSizeDependParamKnot; } @@ -114,557 +120,558 @@ int Size_Not_Found; pParam->pNext = NULL; here->pParam = pParam; - Ldrn = here->BSIM3V1l; - Wdrn = here->BSIM3V1w; + Ldrn = here->BSIM3v1l; + Wdrn = here->BSIM3v1w; pParam->Length = Ldrn; pParam->Width = Wdrn; - T0 = pow(Ldrn, model->BSIM3V1Lln); - T1 = pow(Wdrn, model->BSIM3V1Lwn); - tmp1 = model->BSIM3V1Ll / T0 + model->BSIM3V1Lw / T1 - + model->BSIM3V1Lwl / (T0 * T1); - pParam->BSIM3V1dl = model->BSIM3V1Lint + tmp1; - pParam->BSIM3V1dlc = model->BSIM3V1dlc + tmp1; - - T2 = pow(Ldrn, model->BSIM3V1Wln); - T3 = pow(Wdrn, model->BSIM3V1Wwn); - tmp2 = model->BSIM3V1Wl / T2 + model->BSIM3V1Ww / T3 - + model->BSIM3V1Wwl / (T2 * T3); - pParam->BSIM3V1dw = model->BSIM3V1Wint + tmp2; - pParam->BSIM3V1dwc = model->BSIM3V1dwc + tmp2; - - pParam->BSIM3V1leff = here->BSIM3V1l - 2.0 * pParam->BSIM3V1dl; - if (pParam->BSIM3V1leff <= 0.0) + T0 = pow(Ldrn, model->BSIM3v1Lln); + T1 = pow(Wdrn, model->BSIM3v1Lwn); + tmp1 = model->BSIM3v1Ll / T0 + model->BSIM3v1Lw / T1 + + model->BSIM3v1Lwl / (T0 * T1); + pParam->BSIM3v1dl = model->BSIM3v1Lint + tmp1; + pParam->BSIM3v1dlc = model->BSIM3v1dlc + tmp1; + + T2 = pow(Ldrn, model->BSIM3v1Wln); + T3 = pow(Wdrn, model->BSIM3v1Wwn); + tmp2 = model->BSIM3v1Wl / T2 + model->BSIM3v1Ww / T3 + + model->BSIM3v1Wwl / (T2 * T3); + pParam->BSIM3v1dw = model->BSIM3v1Wint + tmp2; + pParam->BSIM3v1dwc = model->BSIM3v1dwc + tmp2; + + pParam->BSIM3v1leff = here->BSIM3v1l - 2.0 * pParam->BSIM3v1dl; + if (pParam->BSIM3v1leff <= 0.0) { IFuid namarray[2]; - namarray[0] = model->BSIM3V1modName; - namarray[1] = here->BSIM3V1name; + namarray[0] = model->BSIM3v1modName; + namarray[1] = here->BSIM3v1name; (*(SPfrontEnd->IFerror))(ERR_FATAL, - "BSIM3V1: mosfet %s, model %s: Effective channel length <= 0", + "BSIM3v1: mosfet %s, model %s: Effective channel length <= 0", namarray); return(E_BADPARM); } - pParam->BSIM3V1weff = here->BSIM3V1w - 2.0 * pParam->BSIM3V1dw; - if (pParam->BSIM3V1weff <= 0.0) + pParam->BSIM3v1weff = here->BSIM3v1w - 2.0 * pParam->BSIM3v1dw; + if (pParam->BSIM3v1weff <= 0.0) { IFuid namarray[2]; - namarray[0] = model->BSIM3V1modName; - namarray[1] = here->BSIM3V1name; + namarray[0] = model->BSIM3v1modName; + namarray[1] = here->BSIM3v1name; (*(SPfrontEnd->IFerror))(ERR_FATAL, - "BSIM3V1: mosfet %s, model %s: Effective channel width <= 0", + "BSIM3v1: mosfet %s, model %s: Effective channel width <= 0", namarray); return(E_BADPARM); } - pParam->BSIM3V1leffCV = here->BSIM3V1l - 2.0 * pParam->BSIM3V1dlc; - if (pParam->BSIM3V1leffCV <= 0.0) + pParam->BSIM3v1leffCV = here->BSIM3v1l - 2.0 * pParam->BSIM3v1dlc; + if (pParam->BSIM3v1leffCV <= 0.0) { IFuid namarray[2]; - namarray[0] = model->BSIM3V1modName; - namarray[1] = here->BSIM3V1name; + namarray[0] = model->BSIM3v1modName; + namarray[1] = here->BSIM3v1name; (*(SPfrontEnd->IFerror))(ERR_FATAL, - "BSIM3V1: mosfet %s, model %s: Effective channel length for C-V <= 0", + "BSIM3v1: mosfet %s, model %s: Effective channel length for C-V <= 0", namarray); return(E_BADPARM); } - pParam->BSIM3V1weffCV = here->BSIM3V1w - 2.0 * pParam->BSIM3V1dwc; - if (pParam->BSIM3V1weffCV <= 0.0) + pParam->BSIM3v1weffCV = here->BSIM3v1w - 2.0 * pParam->BSIM3v1dwc; + if (pParam->BSIM3v1weffCV <= 0.0) { IFuid namarray[2]; - namarray[0] = model->BSIM3V1modName; - namarray[1] = here->BSIM3V1name; + namarray[0] = model->BSIM3v1modName; + namarray[1] = here->BSIM3v1name; (*(SPfrontEnd->IFerror))(ERR_FATAL, - "BSIM3V1: mosfet %s, model %s: Effective channel width for C-V <= 0", + "BSIM3v1: mosfet %s, model %s: Effective channel width for C-V <= 0", namarray); return(E_BADPARM); } - if (model->BSIM3V1binUnit == 1) - { Inv_L = 1.0e-6 / pParam->BSIM3V1leff; - Inv_W = 1.0e-6 / pParam->BSIM3V1weff; - Inv_LW = 1.0e-12 / (pParam->BSIM3V1leff - * pParam->BSIM3V1weff); + if (model->BSIM3v1binUnit == 1) + { Inv_L = 1.0e-6 / pParam->BSIM3v1leff; + Inv_W = 1.0e-6 / pParam->BSIM3v1weff; + Inv_LW = 1.0e-12 / (pParam->BSIM3v1leff + * pParam->BSIM3v1weff); } else - { Inv_L = 1.0 / pParam->BSIM3V1leff; - Inv_W = 1.0 / pParam->BSIM3V1weff; - Inv_LW = 1.0 / (pParam->BSIM3V1leff - * pParam->BSIM3V1weff); + { Inv_L = 1.0 / pParam->BSIM3v1leff; + Inv_W = 1.0 / pParam->BSIM3v1weff; + Inv_LW = 1.0 / (pParam->BSIM3v1leff + * pParam->BSIM3v1weff); } - pParam->BSIM3V1cdsc = model->BSIM3V1cdsc - + model->BSIM3V1lcdsc * Inv_L - + model->BSIM3V1wcdsc * Inv_W - + model->BSIM3V1pcdsc * Inv_LW; - pParam->BSIM3V1cdscb = model->BSIM3V1cdscb - + model->BSIM3V1lcdscb * Inv_L - + model->BSIM3V1wcdscb * Inv_W - + model->BSIM3V1pcdscb * Inv_LW; + pParam->BSIM3v1cdsc = model->BSIM3v1cdsc + + model->BSIM3v1lcdsc * Inv_L + + model->BSIM3v1wcdsc * Inv_W + + model->BSIM3v1pcdsc * Inv_LW; + pParam->BSIM3v1cdscb = model->BSIM3v1cdscb + + model->BSIM3v1lcdscb * Inv_L + + model->BSIM3v1wcdscb * Inv_W + + model->BSIM3v1pcdscb * Inv_LW; - pParam->BSIM3V1cdscd = model->BSIM3V1cdscd - + model->BSIM3V1lcdscd * Inv_L - + model->BSIM3V1wcdscd * Inv_W - + model->BSIM3V1pcdscd * Inv_LW; + pParam->BSIM3v1cdscd = model->BSIM3v1cdscd + + model->BSIM3v1lcdscd * Inv_L + + model->BSIM3v1wcdscd * Inv_W + + model->BSIM3v1pcdscd * Inv_LW; - pParam->BSIM3V1cit = model->BSIM3V1cit - + model->BSIM3V1lcit * Inv_L - + model->BSIM3V1wcit * Inv_W - + model->BSIM3V1pcit * Inv_LW; - pParam->BSIM3V1nfactor = model->BSIM3V1nfactor - + model->BSIM3V1lnfactor * Inv_L - + model->BSIM3V1wnfactor * Inv_W - + model->BSIM3V1pnfactor * Inv_LW; - pParam->BSIM3V1xj = model->BSIM3V1xj - + model->BSIM3V1lxj * Inv_L - + model->BSIM3V1wxj * Inv_W - + model->BSIM3V1pxj * Inv_LW; - pParam->BSIM3V1vsat = model->BSIM3V1vsat - + model->BSIM3V1lvsat * Inv_L - + model->BSIM3V1wvsat * Inv_W - + model->BSIM3V1pvsat * Inv_LW; - pParam->BSIM3V1at = model->BSIM3V1at - + model->BSIM3V1lat * Inv_L - + model->BSIM3V1wat * Inv_W - + model->BSIM3V1pat * Inv_LW; - pParam->BSIM3V1a0 = model->BSIM3V1a0 - + model->BSIM3V1la0 * Inv_L - + model->BSIM3V1wa0 * Inv_W - + model->BSIM3V1pa0 * Inv_LW; + pParam->BSIM3v1cit = model->BSIM3v1cit + + model->BSIM3v1lcit * Inv_L + + model->BSIM3v1wcit * Inv_W + + model->BSIM3v1pcit * Inv_LW; + pParam->BSIM3v1nfactor = model->BSIM3v1nfactor + + model->BSIM3v1lnfactor * Inv_L + + model->BSIM3v1wnfactor * Inv_W + + model->BSIM3v1pnfactor * Inv_LW; + pParam->BSIM3v1xj = model->BSIM3v1xj + + model->BSIM3v1lxj * Inv_L + + model->BSIM3v1wxj * Inv_W + + model->BSIM3v1pxj * Inv_LW; + pParam->BSIM3v1vsat = model->BSIM3v1vsat + + model->BSIM3v1lvsat * Inv_L + + model->BSIM3v1wvsat * Inv_W + + model->BSIM3v1pvsat * Inv_LW; + pParam->BSIM3v1at = model->BSIM3v1at + + model->BSIM3v1lat * Inv_L + + model->BSIM3v1wat * Inv_W + + model->BSIM3v1pat * Inv_LW; + pParam->BSIM3v1a0 = model->BSIM3v1a0 + + model->BSIM3v1la0 * Inv_L + + model->BSIM3v1wa0 * Inv_W + + model->BSIM3v1pa0 * Inv_LW; - pParam->BSIM3V1ags = model->BSIM3V1ags - + model->BSIM3V1lags * Inv_L - + model->BSIM3V1wags * Inv_W - + model->BSIM3V1pags * Inv_LW; + pParam->BSIM3v1ags = model->BSIM3v1ags + + model->BSIM3v1lags * Inv_L + + model->BSIM3v1wags * Inv_W + + model->BSIM3v1pags * Inv_LW; - pParam->BSIM3V1a1 = model->BSIM3V1a1 - + model->BSIM3V1la1 * Inv_L - + model->BSIM3V1wa1 * Inv_W - + model->BSIM3V1pa1 * Inv_LW; - pParam->BSIM3V1a2 = model->BSIM3V1a2 - + model->BSIM3V1la2 * Inv_L - + model->BSIM3V1wa2 * Inv_W - + model->BSIM3V1pa2 * Inv_LW; - pParam->BSIM3V1keta = model->BSIM3V1keta - + model->BSIM3V1lketa * Inv_L - + model->BSIM3V1wketa * Inv_W - + model->BSIM3V1pketa * Inv_LW; - pParam->BSIM3V1nsub = model->BSIM3V1nsub - + model->BSIM3V1lnsub * Inv_L - + model->BSIM3V1wnsub * Inv_W - + model->BSIM3V1pnsub * Inv_LW; - pParam->BSIM3V1npeak = model->BSIM3V1npeak - + model->BSIM3V1lnpeak * Inv_L - + model->BSIM3V1wnpeak * Inv_W - + model->BSIM3V1pnpeak * Inv_LW; - pParam->BSIM3V1ngate = model->BSIM3V1ngate - + model->BSIM3V1lngate * Inv_L - + model->BSIM3V1wngate * Inv_W - + model->BSIM3V1pngate * Inv_LW; - pParam->BSIM3V1gamma1 = model->BSIM3V1gamma1 - + model->BSIM3V1lgamma1 * Inv_L - + model->BSIM3V1wgamma1 * Inv_W - + model->BSIM3V1pgamma1 * Inv_LW; - pParam->BSIM3V1gamma2 = model->BSIM3V1gamma2 - + model->BSIM3V1lgamma2 * Inv_L - + model->BSIM3V1wgamma2 * Inv_W - + model->BSIM3V1pgamma2 * Inv_LW; - pParam->BSIM3V1vbx = model->BSIM3V1vbx - + model->BSIM3V1lvbx * Inv_L - + model->BSIM3V1wvbx * Inv_W - + model->BSIM3V1pvbx * Inv_LW; - pParam->BSIM3V1vbm = model->BSIM3V1vbm - + model->BSIM3V1lvbm * Inv_L - + model->BSIM3V1wvbm * Inv_W - + model->BSIM3V1pvbm * Inv_LW; - pParam->BSIM3V1xt = model->BSIM3V1xt - + model->BSIM3V1lxt * Inv_L - + model->BSIM3V1wxt * Inv_W - + model->BSIM3V1pxt * Inv_LW; - pParam->BSIM3V1k1 = model->BSIM3V1k1 - + model->BSIM3V1lk1 * Inv_L - + model->BSIM3V1wk1 * Inv_W - + model->BSIM3V1pk1 * Inv_LW; - pParam->BSIM3V1kt1 = model->BSIM3V1kt1 - + model->BSIM3V1lkt1 * Inv_L - + model->BSIM3V1wkt1 * Inv_W - + model->BSIM3V1pkt1 * Inv_LW; - pParam->BSIM3V1kt1l = model->BSIM3V1kt1l - + model->BSIM3V1lkt1l * Inv_L - + model->BSIM3V1wkt1l * Inv_W - + model->BSIM3V1pkt1l * Inv_LW; - pParam->BSIM3V1k2 = model->BSIM3V1k2 - + model->BSIM3V1lk2 * Inv_L - + model->BSIM3V1wk2 * Inv_W - + model->BSIM3V1pk2 * Inv_LW; - pParam->BSIM3V1kt2 = model->BSIM3V1kt2 - + model->BSIM3V1lkt2 * Inv_L - + model->BSIM3V1wkt2 * Inv_W - + model->BSIM3V1pkt2 * Inv_LW; - pParam->BSIM3V1k3 = model->BSIM3V1k3 - + model->BSIM3V1lk3 * Inv_L - + model->BSIM3V1wk3 * Inv_W - + model->BSIM3V1pk3 * Inv_LW; - pParam->BSIM3V1k3b = model->BSIM3V1k3b - + model->BSIM3V1lk3b * Inv_L - + model->BSIM3V1wk3b * Inv_W - + model->BSIM3V1pk3b * Inv_LW; - pParam->BSIM3V1w0 = model->BSIM3V1w0 - + model->BSIM3V1lw0 * Inv_L - + model->BSIM3V1ww0 * Inv_W - + model->BSIM3V1pw0 * Inv_LW; - pParam->BSIM3V1nlx = model->BSIM3V1nlx - + model->BSIM3V1lnlx * Inv_L - + model->BSIM3V1wnlx * Inv_W - + model->BSIM3V1pnlx * Inv_LW; - pParam->BSIM3V1dvt0 = model->BSIM3V1dvt0 - + model->BSIM3V1ldvt0 * Inv_L - + model->BSIM3V1wdvt0 * Inv_W - + model->BSIM3V1pdvt0 * Inv_LW; - pParam->BSIM3V1dvt1 = model->BSIM3V1dvt1 - + model->BSIM3V1ldvt1 * Inv_L - + model->BSIM3V1wdvt1 * Inv_W - + model->BSIM3V1pdvt1 * Inv_LW; - pParam->BSIM3V1dvt2 = model->BSIM3V1dvt2 - + model->BSIM3V1ldvt2 * Inv_L - + model->BSIM3V1wdvt2 * Inv_W - + model->BSIM3V1pdvt2 * Inv_LW; - pParam->BSIM3V1dvt0w = model->BSIM3V1dvt0w - + model->BSIM3V1ldvt0w * Inv_L - + model->BSIM3V1wdvt0w * Inv_W - + model->BSIM3V1pdvt0w * Inv_LW; - pParam->BSIM3V1dvt1w = model->BSIM3V1dvt1w - + model->BSIM3V1ldvt1w * Inv_L - + model->BSIM3V1wdvt1w * Inv_W - + model->BSIM3V1pdvt1w * Inv_LW; - pParam->BSIM3V1dvt2w = model->BSIM3V1dvt2w - + model->BSIM3V1ldvt2w * Inv_L - + model->BSIM3V1wdvt2w * Inv_W - + model->BSIM3V1pdvt2w * Inv_LW; - pParam->BSIM3V1drout = model->BSIM3V1drout - + model->BSIM3V1ldrout * Inv_L - + model->BSIM3V1wdrout * Inv_W - + model->BSIM3V1pdrout * Inv_LW; - pParam->BSIM3V1dsub = model->BSIM3V1dsub - + model->BSIM3V1ldsub * Inv_L - + model->BSIM3V1wdsub * Inv_W - + model->BSIM3V1pdsub * Inv_LW; - pParam->BSIM3V1vth0 = model->BSIM3V1vth0 - + model->BSIM3V1lvth0 * Inv_L - + model->BSIM3V1wvth0 * Inv_W - + model->BSIM3V1pvth0 * Inv_LW; - pParam->BSIM3V1ua = model->BSIM3V1ua - + model->BSIM3V1lua * Inv_L - + model->BSIM3V1wua * Inv_W - + model->BSIM3V1pua * Inv_LW; - pParam->BSIM3V1ua1 = model->BSIM3V1ua1 - + model->BSIM3V1lua1 * Inv_L - + model->BSIM3V1wua1 * Inv_W - + model->BSIM3V1pua1 * Inv_LW; - pParam->BSIM3V1ub = model->BSIM3V1ub - + model->BSIM3V1lub * Inv_L - + model->BSIM3V1wub * Inv_W - + model->BSIM3V1pub * Inv_LW; - pParam->BSIM3V1ub1 = model->BSIM3V1ub1 - + model->BSIM3V1lub1 * Inv_L - + model->BSIM3V1wub1 * Inv_W - + model->BSIM3V1pub1 * Inv_LW; - pParam->BSIM3V1uc = model->BSIM3V1uc - + model->BSIM3V1luc * Inv_L - + model->BSIM3V1wuc * Inv_W - + model->BSIM3V1puc * Inv_LW; - pParam->BSIM3V1uc1 = model->BSIM3V1uc1 - + model->BSIM3V1luc1 * Inv_L - + model->BSIM3V1wuc1 * Inv_W - + model->BSIM3V1puc1 * Inv_LW; - pParam->BSIM3V1u0 = model->BSIM3V1u0 - + model->BSIM3V1lu0 * Inv_L - + model->BSIM3V1wu0 * Inv_W - + model->BSIM3V1pu0 * Inv_LW; - pParam->BSIM3V1ute = model->BSIM3V1ute - + model->BSIM3V1lute * Inv_L - + model->BSIM3V1wute * Inv_W - + model->BSIM3V1pute * Inv_LW; - pParam->BSIM3V1voff = model->BSIM3V1voff - + model->BSIM3V1lvoff * Inv_L - + model->BSIM3V1wvoff * Inv_W - + model->BSIM3V1pvoff * Inv_LW; - pParam->BSIM3V1delta = model->BSIM3V1delta - + model->BSIM3V1ldelta * Inv_L - + model->BSIM3V1wdelta * Inv_W - + model->BSIM3V1pdelta * Inv_LW; - pParam->BSIM3V1rdsw = model->BSIM3V1rdsw - + model->BSIM3V1lrdsw * Inv_L - + model->BSIM3V1wrdsw * Inv_W - + model->BSIM3V1prdsw * Inv_LW; - pParam->BSIM3V1prwg = model->BSIM3V1prwg - + model->BSIM3V1lprwg * Inv_L - + model->BSIM3V1wprwg * Inv_W - + model->BSIM3V1pprwg * Inv_LW; - pParam->BSIM3V1prwb = model->BSIM3V1prwb - + model->BSIM3V1lprwb * Inv_L - + model->BSIM3V1wprwb * Inv_W - + model->BSIM3V1pprwb * Inv_LW; - pParam->BSIM3V1prt = model->BSIM3V1prt - + model->BSIM3V1lprt * Inv_L - + model->BSIM3V1wprt * Inv_W - + model->BSIM3V1pprt * Inv_LW; - pParam->BSIM3V1eta0 = model->BSIM3V1eta0 - + model->BSIM3V1leta0 * Inv_L - + model->BSIM3V1weta0 * Inv_W - + model->BSIM3V1peta0 * Inv_LW; - pParam->BSIM3V1etab = model->BSIM3V1etab - + model->BSIM3V1letab * Inv_L - + model->BSIM3V1wetab * Inv_W - + model->BSIM3V1petab * Inv_LW; - pParam->BSIM3V1pclm = model->BSIM3V1pclm - + model->BSIM3V1lpclm * Inv_L - + model->BSIM3V1wpclm * Inv_W - + model->BSIM3V1ppclm * Inv_LW; - pParam->BSIM3V1pdibl1 = model->BSIM3V1pdibl1 - + model->BSIM3V1lpdibl1 * Inv_L - + model->BSIM3V1wpdibl1 * Inv_W - + model->BSIM3V1ppdibl1 * Inv_LW; - pParam->BSIM3V1pdibl2 = model->BSIM3V1pdibl2 - + model->BSIM3V1lpdibl2 * Inv_L - + model->BSIM3V1wpdibl2 * Inv_W - + model->BSIM3V1ppdibl2 * Inv_LW; - pParam->BSIM3V1pdiblb = model->BSIM3V1pdiblb - + model->BSIM3V1lpdiblb * Inv_L - + model->BSIM3V1wpdiblb * Inv_W - + model->BSIM3V1ppdiblb * Inv_LW; - pParam->BSIM3V1pscbe1 = model->BSIM3V1pscbe1 - + model->BSIM3V1lpscbe1 * Inv_L - + model->BSIM3V1wpscbe1 * Inv_W - + model->BSIM3V1ppscbe1 * Inv_LW; - pParam->BSIM3V1pscbe2 = model->BSIM3V1pscbe2 - + model->BSIM3V1lpscbe2 * Inv_L - + model->BSIM3V1wpscbe2 * Inv_W - + model->BSIM3V1ppscbe2 * Inv_LW; - pParam->BSIM3V1pvag = model->BSIM3V1pvag - + model->BSIM3V1lpvag * Inv_L - + model->BSIM3V1wpvag * Inv_W - + model->BSIM3V1ppvag * Inv_LW; - pParam->BSIM3V1wr = model->BSIM3V1wr - + model->BSIM3V1lwr * Inv_L - + model->BSIM3V1wwr * Inv_W - + model->BSIM3V1pwr * Inv_LW; - pParam->BSIM3V1dwg = model->BSIM3V1dwg - + model->BSIM3V1ldwg * Inv_L - + model->BSIM3V1wdwg * Inv_W - + model->BSIM3V1pdwg * Inv_LW; - pParam->BSIM3V1dwb = model->BSIM3V1dwb - + model->BSIM3V1ldwb * Inv_L - + model->BSIM3V1wdwb * Inv_W - + model->BSIM3V1pdwb * Inv_LW; - pParam->BSIM3V1b0 = model->BSIM3V1b0 - + model->BSIM3V1lb0 * Inv_L - + model->BSIM3V1wb0 * Inv_W - + model->BSIM3V1pb0 * Inv_LW; - pParam->BSIM3V1b1 = model->BSIM3V1b1 - + model->BSIM3V1lb1 * Inv_L - + model->BSIM3V1wb1 * Inv_W - + model->BSIM3V1pb1 * Inv_LW; - pParam->BSIM3V1alpha0 = model->BSIM3V1alpha0 - + model->BSIM3V1lalpha0 * Inv_L - + model->BSIM3V1walpha0 * Inv_W - + model->BSIM3V1palpha0 * Inv_LW; - pParam->BSIM3V1beta0 = model->BSIM3V1beta0 - + model->BSIM3V1lbeta0 * Inv_L - + model->BSIM3V1wbeta0 * Inv_W - + model->BSIM3V1pbeta0 * Inv_LW; + pParam->BSIM3v1a1 = model->BSIM3v1a1 + + model->BSIM3v1la1 * Inv_L + + model->BSIM3v1wa1 * Inv_W + + model->BSIM3v1pa1 * Inv_LW; + pParam->BSIM3v1a2 = model->BSIM3v1a2 + + model->BSIM3v1la2 * Inv_L + + model->BSIM3v1wa2 * Inv_W + + model->BSIM3v1pa2 * Inv_LW; + pParam->BSIM3v1keta = model->BSIM3v1keta + + model->BSIM3v1lketa * Inv_L + + model->BSIM3v1wketa * Inv_W + + model->BSIM3v1pketa * Inv_LW; + pParam->BSIM3v1nsub = model->BSIM3v1nsub + + model->BSIM3v1lnsub * Inv_L + + model->BSIM3v1wnsub * Inv_W + + model->BSIM3v1pnsub * Inv_LW; + pParam->BSIM3v1npeak = model->BSIM3v1npeak + + model->BSIM3v1lnpeak * Inv_L + + model->BSIM3v1wnpeak * Inv_W + + model->BSIM3v1pnpeak * Inv_LW; + pParam->BSIM3v1ngate = model->BSIM3v1ngate + + model->BSIM3v1lngate * Inv_L + + model->BSIM3v1wngate * Inv_W + + model->BSIM3v1pngate * Inv_LW; + pParam->BSIM3v1gamma1 = model->BSIM3v1gamma1 + + model->BSIM3v1lgamma1 * Inv_L + + model->BSIM3v1wgamma1 * Inv_W + + model->BSIM3v1pgamma1 * Inv_LW; + pParam->BSIM3v1gamma2 = model->BSIM3v1gamma2 + + model->BSIM3v1lgamma2 * Inv_L + + model->BSIM3v1wgamma2 * Inv_W + + model->BSIM3v1pgamma2 * Inv_LW; + pParam->BSIM3v1vbx = model->BSIM3v1vbx + + model->BSIM3v1lvbx * Inv_L + + model->BSIM3v1wvbx * Inv_W + + model->BSIM3v1pvbx * Inv_LW; + pParam->BSIM3v1vbm = model->BSIM3v1vbm + + model->BSIM3v1lvbm * Inv_L + + model->BSIM3v1wvbm * Inv_W + + model->BSIM3v1pvbm * Inv_LW; + pParam->BSIM3v1xt = model->BSIM3v1xt + + model->BSIM3v1lxt * Inv_L + + model->BSIM3v1wxt * Inv_W + + model->BSIM3v1pxt * Inv_LW; + pParam->BSIM3v1k1 = model->BSIM3v1k1 + + model->BSIM3v1lk1 * Inv_L + + model->BSIM3v1wk1 * Inv_W + + model->BSIM3v1pk1 * Inv_LW; + pParam->BSIM3v1kt1 = model->BSIM3v1kt1 + + model->BSIM3v1lkt1 * Inv_L + + model->BSIM3v1wkt1 * Inv_W + + model->BSIM3v1pkt1 * Inv_LW; + pParam->BSIM3v1kt1l = model->BSIM3v1kt1l + + model->BSIM3v1lkt1l * Inv_L + + model->BSIM3v1wkt1l * Inv_W + + model->BSIM3v1pkt1l * Inv_LW; + pParam->BSIM3v1k2 = model->BSIM3v1k2 + + model->BSIM3v1lk2 * Inv_L + + model->BSIM3v1wk2 * Inv_W + + model->BSIM3v1pk2 * Inv_LW; + pParam->BSIM3v1kt2 = model->BSIM3v1kt2 + + model->BSIM3v1lkt2 * Inv_L + + model->BSIM3v1wkt2 * Inv_W + + model->BSIM3v1pkt2 * Inv_LW; + pParam->BSIM3v1k3 = model->BSIM3v1k3 + + model->BSIM3v1lk3 * Inv_L + + model->BSIM3v1wk3 * Inv_W + + model->BSIM3v1pk3 * Inv_LW; + pParam->BSIM3v1k3b = model->BSIM3v1k3b + + model->BSIM3v1lk3b * Inv_L + + model->BSIM3v1wk3b * Inv_W + + model->BSIM3v1pk3b * Inv_LW; + pParam->BSIM3v1w0 = model->BSIM3v1w0 + + model->BSIM3v1lw0 * Inv_L + + model->BSIM3v1ww0 * Inv_W + + model->BSIM3v1pw0 * Inv_LW; + pParam->BSIM3v1nlx = model->BSIM3v1nlx + + model->BSIM3v1lnlx * Inv_L + + model->BSIM3v1wnlx * Inv_W + + model->BSIM3v1pnlx * Inv_LW; + pParam->BSIM3v1dvt0 = model->BSIM3v1dvt0 + + model->BSIM3v1ldvt0 * Inv_L + + model->BSIM3v1wdvt0 * Inv_W + + model->BSIM3v1pdvt0 * Inv_LW; + pParam->BSIM3v1dvt1 = model->BSIM3v1dvt1 + + model->BSIM3v1ldvt1 * Inv_L + + model->BSIM3v1wdvt1 * Inv_W + + model->BSIM3v1pdvt1 * Inv_LW; + pParam->BSIM3v1dvt2 = model->BSIM3v1dvt2 + + model->BSIM3v1ldvt2 * Inv_L + + model->BSIM3v1wdvt2 * Inv_W + + model->BSIM3v1pdvt2 * Inv_LW; + pParam->BSIM3v1dvt0w = model->BSIM3v1dvt0w + + model->BSIM3v1ldvt0w * Inv_L + + model->BSIM3v1wdvt0w * Inv_W + + model->BSIM3v1pdvt0w * Inv_LW; + pParam->BSIM3v1dvt1w = model->BSIM3v1dvt1w + + model->BSIM3v1ldvt1w * Inv_L + + model->BSIM3v1wdvt1w * Inv_W + + model->BSIM3v1pdvt1w * Inv_LW; + pParam->BSIM3v1dvt2w = model->BSIM3v1dvt2w + + model->BSIM3v1ldvt2w * Inv_L + + model->BSIM3v1wdvt2w * Inv_W + + model->BSIM3v1pdvt2w * Inv_LW; + pParam->BSIM3v1drout = model->BSIM3v1drout + + model->BSIM3v1ldrout * Inv_L + + model->BSIM3v1wdrout * Inv_W + + model->BSIM3v1pdrout * Inv_LW; + pParam->BSIM3v1dsub = model->BSIM3v1dsub + + model->BSIM3v1ldsub * Inv_L + + model->BSIM3v1wdsub * Inv_W + + model->BSIM3v1pdsub * Inv_LW; + pParam->BSIM3v1vth0 = model->BSIM3v1vth0 + + model->BSIM3v1lvth0 * Inv_L + + model->BSIM3v1wvth0 * Inv_W + + model->BSIM3v1pvth0 * Inv_LW; + pParam->BSIM3v1ua = model->BSIM3v1ua + + model->BSIM3v1lua * Inv_L + + model->BSIM3v1wua * Inv_W + + model->BSIM3v1pua * Inv_LW; + pParam->BSIM3v1ua1 = model->BSIM3v1ua1 + + model->BSIM3v1lua1 * Inv_L + + model->BSIM3v1wua1 * Inv_W + + model->BSIM3v1pua1 * Inv_LW; + pParam->BSIM3v1ub = model->BSIM3v1ub + + model->BSIM3v1lub * Inv_L + + model->BSIM3v1wub * Inv_W + + model->BSIM3v1pub * Inv_LW; + pParam->BSIM3v1ub1 = model->BSIM3v1ub1 + + model->BSIM3v1lub1 * Inv_L + + model->BSIM3v1wub1 * Inv_W + + model->BSIM3v1pub1 * Inv_LW; + pParam->BSIM3v1uc = model->BSIM3v1uc + + model->BSIM3v1luc * Inv_L + + model->BSIM3v1wuc * Inv_W + + model->BSIM3v1puc * Inv_LW; + pParam->BSIM3v1uc1 = model->BSIM3v1uc1 + + model->BSIM3v1luc1 * Inv_L + + model->BSIM3v1wuc1 * Inv_W + + model->BSIM3v1puc1 * Inv_LW; + pParam->BSIM3v1u0 = model->BSIM3v1u0 + + model->BSIM3v1lu0 * Inv_L + + model->BSIM3v1wu0 * Inv_W + + model->BSIM3v1pu0 * Inv_LW; + pParam->BSIM3v1ute = model->BSIM3v1ute + + model->BSIM3v1lute * Inv_L + + model->BSIM3v1wute * Inv_W + + model->BSIM3v1pute * Inv_LW; + pParam->BSIM3v1voff = model->BSIM3v1voff + + model->BSIM3v1lvoff * Inv_L + + model->BSIM3v1wvoff * Inv_W + + model->BSIM3v1pvoff * Inv_LW; + pParam->BSIM3v1delta = model->BSIM3v1delta + + model->BSIM3v1ldelta * Inv_L + + model->BSIM3v1wdelta * Inv_W + + model->BSIM3v1pdelta * Inv_LW; + pParam->BSIM3v1rdsw = model->BSIM3v1rdsw + + model->BSIM3v1lrdsw * Inv_L + + model->BSIM3v1wrdsw * Inv_W + + model->BSIM3v1prdsw * Inv_LW; + pParam->BSIM3v1prwg = model->BSIM3v1prwg + + model->BSIM3v1lprwg * Inv_L + + model->BSIM3v1wprwg * Inv_W + + model->BSIM3v1pprwg * Inv_LW; + pParam->BSIM3v1prwb = model->BSIM3v1prwb + + model->BSIM3v1lprwb * Inv_L + + model->BSIM3v1wprwb * Inv_W + + model->BSIM3v1pprwb * Inv_LW; + pParam->BSIM3v1prt = model->BSIM3v1prt + + model->BSIM3v1lprt * Inv_L + + model->BSIM3v1wprt * Inv_W + + model->BSIM3v1pprt * Inv_LW; + pParam->BSIM3v1eta0 = model->BSIM3v1eta0 + + model->BSIM3v1leta0 * Inv_L + + model->BSIM3v1weta0 * Inv_W + + model->BSIM3v1peta0 * Inv_LW; + pParam->BSIM3v1etab = model->BSIM3v1etab + + model->BSIM3v1letab * Inv_L + + model->BSIM3v1wetab * Inv_W + + model->BSIM3v1petab * Inv_LW; + pParam->BSIM3v1pclm = model->BSIM3v1pclm + + model->BSIM3v1lpclm * Inv_L + + model->BSIM3v1wpclm * Inv_W + + model->BSIM3v1ppclm * Inv_LW; + pParam->BSIM3v1pdibl1 = model->BSIM3v1pdibl1 + + model->BSIM3v1lpdibl1 * Inv_L + + model->BSIM3v1wpdibl1 * Inv_W + + model->BSIM3v1ppdibl1 * Inv_LW; + pParam->BSIM3v1pdibl2 = model->BSIM3v1pdibl2 + + model->BSIM3v1lpdibl2 * Inv_L + + model->BSIM3v1wpdibl2 * Inv_W + + model->BSIM3v1ppdibl2 * Inv_LW; + pParam->BSIM3v1pdiblb = model->BSIM3v1pdiblb + + model->BSIM3v1lpdiblb * Inv_L + + model->BSIM3v1wpdiblb * Inv_W + + model->BSIM3v1ppdiblb * Inv_LW; + pParam->BSIM3v1pscbe1 = model->BSIM3v1pscbe1 + + model->BSIM3v1lpscbe1 * Inv_L + + model->BSIM3v1wpscbe1 * Inv_W + + model->BSIM3v1ppscbe1 * Inv_LW; + pParam->BSIM3v1pscbe2 = model->BSIM3v1pscbe2 + + model->BSIM3v1lpscbe2 * Inv_L + + model->BSIM3v1wpscbe2 * Inv_W + + model->BSIM3v1ppscbe2 * Inv_LW; + pParam->BSIM3v1pvag = model->BSIM3v1pvag + + model->BSIM3v1lpvag * Inv_L + + model->BSIM3v1wpvag * Inv_W + + model->BSIM3v1ppvag * Inv_LW; + pParam->BSIM3v1wr = model->BSIM3v1wr + + model->BSIM3v1lwr * Inv_L + + model->BSIM3v1wwr * Inv_W + + model->BSIM3v1pwr * Inv_LW; + pParam->BSIM3v1dwg = model->BSIM3v1dwg + + model->BSIM3v1ldwg * Inv_L + + model->BSIM3v1wdwg * Inv_W + + model->BSIM3v1pdwg * Inv_LW; + pParam->BSIM3v1dwb = model->BSIM3v1dwb + + model->BSIM3v1ldwb * Inv_L + + model->BSIM3v1wdwb * Inv_W + + model->BSIM3v1pdwb * Inv_LW; + pParam->BSIM3v1b0 = model->BSIM3v1b0 + + model->BSIM3v1lb0 * Inv_L + + model->BSIM3v1wb0 * Inv_W + + model->BSIM3v1pb0 * Inv_LW; + pParam->BSIM3v1b1 = model->BSIM3v1b1 + + model->BSIM3v1lb1 * Inv_L + + model->BSIM3v1wb1 * Inv_W + + model->BSIM3v1pb1 * Inv_LW; + pParam->BSIM3v1alpha0 = model->BSIM3v1alpha0 + + model->BSIM3v1lalpha0 * Inv_L + + model->BSIM3v1walpha0 * Inv_W + + model->BSIM3v1palpha0 * Inv_LW; + pParam->BSIM3v1beta0 = model->BSIM3v1beta0 + + model->BSIM3v1lbeta0 * Inv_L + + model->BSIM3v1wbeta0 * Inv_W + + model->BSIM3v1pbeta0 * Inv_LW; /* CV model */ - pParam->BSIM3V1elm = model->BSIM3V1elm - + model->BSIM3V1lelm * Inv_L - + model->BSIM3V1welm * Inv_W - + model->BSIM3V1pelm * Inv_LW; - pParam->BSIM3V1cgsl = model->BSIM3V1cgsl - + model->BSIM3V1lcgsl * Inv_L - + model->BSIM3V1wcgsl * Inv_W - + model->BSIM3V1pcgsl * Inv_LW; - pParam->BSIM3V1cgdl = model->BSIM3V1cgdl - + model->BSIM3V1lcgdl * Inv_L - + model->BSIM3V1wcgdl * Inv_W - + model->BSIM3V1pcgdl * Inv_LW; - pParam->BSIM3V1ckappa = model->BSIM3V1ckappa - + model->BSIM3V1lckappa * Inv_L - + model->BSIM3V1wckappa * Inv_W - + model->BSIM3V1pckappa * Inv_LW; - pParam->BSIM3V1cf = model->BSIM3V1cf - + model->BSIM3V1lcf * Inv_L - + model->BSIM3V1wcf * Inv_W - + model->BSIM3V1pcf * Inv_LW; - pParam->BSIM3V1clc = model->BSIM3V1clc - + model->BSIM3V1lclc * Inv_L - + model->BSIM3V1wclc * Inv_W - + model->BSIM3V1pclc * Inv_LW; - pParam->BSIM3V1cle = model->BSIM3V1cle - + model->BSIM3V1lcle * Inv_L - + model->BSIM3V1wcle * Inv_W - + model->BSIM3V1pcle * Inv_LW; - pParam->BSIM3V1vfbcv = model->BSIM3V1vfbcv - + model->BSIM3V1lvfbcv * Inv_L - + model->BSIM3V1wvfbcv * Inv_W - + model->BSIM3V1pvfbcv * Inv_LW; - pParam->BSIM3V1abulkCVfactor = 1.0 + pow((pParam->BSIM3V1clc - / pParam->BSIM3V1leff), - pParam->BSIM3V1cle); + pParam->BSIM3v1elm = model->BSIM3v1elm + + model->BSIM3v1lelm * Inv_L + + model->BSIM3v1welm * Inv_W + + model->BSIM3v1pelm * Inv_LW; + pParam->BSIM3v1cgsl = model->BSIM3v1cgsl + + model->BSIM3v1lcgsl * Inv_L + + model->BSIM3v1wcgsl * Inv_W + + model->BSIM3v1pcgsl * Inv_LW; + pParam->BSIM3v1cgdl = model->BSIM3v1cgdl + + model->BSIM3v1lcgdl * Inv_L + + model->BSIM3v1wcgdl * Inv_W + + model->BSIM3v1pcgdl * Inv_LW; + pParam->BSIM3v1ckappa = model->BSIM3v1ckappa + + model->BSIM3v1lckappa * Inv_L + + model->BSIM3v1wckappa * Inv_W + + model->BSIM3v1pckappa * Inv_LW; + pParam->BSIM3v1cf = model->BSIM3v1cf + + model->BSIM3v1lcf * Inv_L + + model->BSIM3v1wcf * Inv_W + + model->BSIM3v1pcf * Inv_LW; + pParam->BSIM3v1clc = model->BSIM3v1clc + + model->BSIM3v1lclc * Inv_L + + model->BSIM3v1wclc * Inv_W + + model->BSIM3v1pclc * Inv_LW; + pParam->BSIM3v1cle = model->BSIM3v1cle + + model->BSIM3v1lcle * Inv_L + + model->BSIM3v1wcle * Inv_W + + model->BSIM3v1pcle * Inv_LW; + pParam->BSIM3v1vfbcv = model->BSIM3v1vfbcv + + model->BSIM3v1lvfbcv * Inv_L + + model->BSIM3v1wvfbcv * Inv_W + + model->BSIM3v1pvfbcv * Inv_LW; + pParam->BSIM3v1abulkCVfactor = 1.0 + pow((pParam->BSIM3v1clc + / pParam->BSIM3v1leff), + pParam->BSIM3v1cle); T0 = (TRatio - 1.0); - pParam->BSIM3V1ua = pParam->BSIM3V1ua + pParam->BSIM3V1ua1 * T0; - pParam->BSIM3V1ub = pParam->BSIM3V1ub + pParam->BSIM3V1ub1 * T0; - pParam->BSIM3V1uc = pParam->BSIM3V1uc + pParam->BSIM3V1uc1 * T0; - if (pParam->BSIM3V1u0 > 1.0) - pParam->BSIM3V1u0 = pParam->BSIM3V1u0 / 1.0e4; - - pParam->BSIM3V1u0temp = pParam->BSIM3V1u0 - * pow(TRatio, pParam->BSIM3V1ute); - pParam->BSIM3V1vsattemp = pParam->BSIM3V1vsat - pParam->BSIM3V1at + pParam->BSIM3v1ua = pParam->BSIM3v1ua + pParam->BSIM3v1ua1 * T0; + pParam->BSIM3v1ub = pParam->BSIM3v1ub + pParam->BSIM3v1ub1 * T0; + pParam->BSIM3v1uc = pParam->BSIM3v1uc + pParam->BSIM3v1uc1 * T0; + if (pParam->BSIM3v1u0 > 1.0) + pParam->BSIM3v1u0 = pParam->BSIM3v1u0 / 1.0e4; + + pParam->BSIM3v1u0temp = pParam->BSIM3v1u0 + * pow(TRatio, pParam->BSIM3v1ute); + pParam->BSIM3v1vsattemp = pParam->BSIM3v1vsat - pParam->BSIM3v1at * T0; - pParam->BSIM3V1rds0 = (pParam->BSIM3V1rdsw + pParam->BSIM3V1prt * T0) - / pow(pParam->BSIM3V1weff * 1E6, pParam->BSIM3V1wr); + pParam->BSIM3v1rds0 = (pParam->BSIM3v1rdsw + pParam->BSIM3v1prt * T0) + / pow(pParam->BSIM3v1weff * 1E6, pParam->BSIM3v1wr); - if (BSIM3V1checkModel(model, here, ckt)) + if (BSIM3v1checkModel(model, here, ckt)) { IFuid namarray[2]; - namarray[0] = model->BSIM3V1modName; - namarray[1] = here->BSIM3V1name; - (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during BSIM3V1V3 parameter checking for %s in model %s", namarray); + namarray[0] = model->BSIM3v1modName; + namarray[1] = here->BSIM3v1name; + (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during BSIM3V3.1 parameter checking for %s in model %s", namarray); return(E_BADPARM); } - pParam->BSIM3V1cgdo = (model->BSIM3V1cgdo + pParam->BSIM3V1cf) - * pParam->BSIM3V1weffCV; - pParam->BSIM3V1cgso = (model->BSIM3V1cgso + pParam->BSIM3V1cf) - * pParam->BSIM3V1weffCV; - pParam->BSIM3V1cgbo = model->BSIM3V1cgbo * pParam->BSIM3V1leffCV; + pParam->BSIM3v1cgdo = (model->BSIM3v1cgdo + pParam->BSIM3v1cf) + * pParam->BSIM3v1weffCV; + pParam->BSIM3v1cgso = (model->BSIM3v1cgso + pParam->BSIM3v1cf) + * pParam->BSIM3v1weffCV; + pParam->BSIM3v1cgbo = model->BSIM3v1cgbo * pParam->BSIM3v1leffCV; - if (!model->BSIM3V1npeakGiven && model->BSIM3V1gamma1Given) - { T0 = pParam->BSIM3V1gamma1 * model->BSIM3V1cox; - pParam->BSIM3V1npeak = 3.021E22 * T0 * T0; + if (!model->BSIM3v1npeakGiven && model->BSIM3v1gamma1Given) + { T0 = pParam->BSIM3v1gamma1 * model->BSIM3v1cox; + pParam->BSIM3v1npeak = 3.021E22 * T0 * T0; } - pParam->BSIM3V1phi = 2.0 * Vtm0 - * log(pParam->BSIM3V1npeak / ni); - - pParam->BSIM3V1sqrtPhi = sqrt(pParam->BSIM3V1phi); - pParam->BSIM3V1phis3 = pParam->BSIM3V1sqrtPhi * pParam->BSIM3V1phi; - - pParam->BSIM3V1Xdep0 = sqrt(2.0 * EPSSI / (Charge_q - * pParam->BSIM3V1npeak * 1.0e6)) - * pParam->BSIM3V1sqrtPhi; - pParam->BSIM3V1sqrtXdep0 = sqrt(pParam->BSIM3V1Xdep0); - pParam->BSIM3V1litl = sqrt(3.0 * pParam->BSIM3V1xj - * model->BSIM3V1tox); - pParam->BSIM3V1vbi = Vtm0 * log(1.0e20 - * pParam->BSIM3V1npeak / (ni * ni)); - pParam->BSIM3V1cdep0 = sqrt(Charge_q * EPSSI - * pParam->BSIM3V1npeak * 1.0e6 / 2.0 - / pParam->BSIM3V1phi); + pParam->BSIM3v1phi = 2.0 * Vtm0 + * log(pParam->BSIM3v1npeak / ni); + + pParam->BSIM3v1sqrtPhi = sqrt(pParam->BSIM3v1phi); + pParam->BSIM3v1phis3 = pParam->BSIM3v1sqrtPhi * pParam->BSIM3v1phi; + + pParam->BSIM3v1Xdep0 = sqrt(2.0 * EPSSI / (Charge_q + * pParam->BSIM3v1npeak * 1.0e6)) + * pParam->BSIM3v1sqrtPhi; + pParam->BSIM3v1sqrtXdep0 = sqrt(pParam->BSIM3v1Xdep0); + pParam->BSIM3v1litl = sqrt(3.0 * pParam->BSIM3v1xj + * model->BSIM3v1tox); + pParam->BSIM3v1vbi = Vtm0 * log(1.0e20 + * pParam->BSIM3v1npeak / (ni * ni)); + pParam->BSIM3v1cdep0 = sqrt(Charge_q * EPSSI + * pParam->BSIM3v1npeak * 1.0e6 / 2.0 + / pParam->BSIM3v1phi); - if (model->BSIM3V1k1Given || model->BSIM3V1k2Given) - { if (!model->BSIM3V1k1Given) + if (model->BSIM3v1k1Given || model->BSIM3v1k2Given) + { if (!model->BSIM3v1k1Given) { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->BSIM3V1k1 = 0.53; + pParam->BSIM3v1k1 = 0.53; } - if (!model->BSIM3V1k2Given) + if (!model->BSIM3v1k2Given) { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->BSIM3V1k2 = -0.0186; + pParam->BSIM3v1k2 = -0.0186; } - if (model->BSIM3V1nsubGiven) + if (model->BSIM3v1nsubGiven) fprintf(stdout, "Warning: nsub is ignored because k1 or k2 is given.\n"); - if (model->BSIM3V1xtGiven) + if (model->BSIM3v1xtGiven) fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->BSIM3V1vbxGiven) + if (model->BSIM3v1vbxGiven) fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->BSIM3V1vbmGiven) + if (model->BSIM3v1vbmGiven) fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n"); - if (model->BSIM3V1gamma1Given) + if (model->BSIM3v1gamma1Given) fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->BSIM3V1gamma2Given) + if (model->BSIM3v1gamma2Given) fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); } else - { if (!model->BSIM3V1vbxGiven) - pParam->BSIM3V1vbx = pParam->BSIM3V1phi - 7.7348e-4 - * pParam->BSIM3V1npeak - * pParam->BSIM3V1xt * pParam->BSIM3V1xt; - if (pParam->BSIM3V1vbx > 0.0) - pParam->BSIM3V1vbx = -pParam->BSIM3V1vbx; - if (pParam->BSIM3V1vbm > 0.0) - pParam->BSIM3V1vbm = -pParam->BSIM3V1vbm; + { if (!model->BSIM3v1vbxGiven) + pParam->BSIM3v1vbx = pParam->BSIM3v1phi - 7.7348e-4 + * pParam->BSIM3v1npeak + * pParam->BSIM3v1xt * pParam->BSIM3v1xt; + if (pParam->BSIM3v1vbx > 0.0) + pParam->BSIM3v1vbx = -pParam->BSIM3v1vbx; + if (pParam->BSIM3v1vbm > 0.0) + pParam->BSIM3v1vbm = -pParam->BSIM3v1vbm; - if (!model->BSIM3V1gamma1Given) - pParam->BSIM3V1gamma1 = 5.753e-12 - * sqrt(pParam->BSIM3V1npeak) - / model->BSIM3V1cox; - if (!model->BSIM3V1gamma2Given) - pParam->BSIM3V1gamma2 = 5.753e-12 - * sqrt(pParam->BSIM3V1nsub) - / model->BSIM3V1cox; - - T0 = pParam->BSIM3V1gamma1 - pParam->BSIM3V1gamma2; - T1 = sqrt(pParam->BSIM3V1phi - pParam->BSIM3V1vbx) - - pParam->BSIM3V1sqrtPhi; - T2 = sqrt(pParam->BSIM3V1phi * (pParam->BSIM3V1phi - - pParam->BSIM3V1vbm)) - pParam->BSIM3V1phi; - pParam->BSIM3V1k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM3V1vbm); - pParam->BSIM3V1k1 = pParam->BSIM3V1gamma2 - 2.0 - * pParam->BSIM3V1k2 * sqrt(pParam->BSIM3V1phi - - pParam->BSIM3V1vbm); + if (!model->BSIM3v1gamma1Given) + pParam->BSIM3v1gamma1 = 5.753e-12 + * sqrt(pParam->BSIM3v1npeak) + / model->BSIM3v1cox; + if (!model->BSIM3v1gamma2Given) + pParam->BSIM3v1gamma2 = 5.753e-12 + * sqrt(pParam->BSIM3v1nsub) + / model->BSIM3v1cox; + + T0 = pParam->BSIM3v1gamma1 - pParam->BSIM3v1gamma2; + T1 = sqrt(pParam->BSIM3v1phi - pParam->BSIM3v1vbx) + - pParam->BSIM3v1sqrtPhi; + T2 = sqrt(pParam->BSIM3v1phi * (pParam->BSIM3v1phi + - pParam->BSIM3v1vbm)) - pParam->BSIM3v1phi; + pParam->BSIM3v1k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM3v1vbm); + pParam->BSIM3v1k1 = pParam->BSIM3v1gamma2 - 2.0 + * pParam->BSIM3v1k2 * sqrt(pParam->BSIM3v1phi + - pParam->BSIM3v1vbm); } - if (pParam->BSIM3V1k2 < 0.0) - { T0 = 0.5 * pParam->BSIM3V1k1 / pParam->BSIM3V1k2; - pParam->BSIM3V1vbsc = 0.9 * (pParam->BSIM3V1phi - T0 * T0); - if (pParam->BSIM3V1vbsc > -3.0) - pParam->BSIM3V1vbsc = -3.0; - else if (pParam->BSIM3V1vbsc < -30.0) - pParam->BSIM3V1vbsc = -30.0; + if (pParam->BSIM3v1k2 < 0.0) + { T0 = 0.5 * pParam->BSIM3v1k1 / pParam->BSIM3v1k2; + pParam->BSIM3v1vbsc = 0.9 * (pParam->BSIM3v1phi - T0 * T0); + if (pParam->BSIM3v1vbsc > -3.0) + pParam->BSIM3v1vbsc = -3.0; + else if (pParam->BSIM3v1vbsc < -30.0) + pParam->BSIM3v1vbsc = -30.0; } else - { pParam->BSIM3V1vbsc = -30.0; + { pParam->BSIM3v1vbsc = -30.0; } - if (pParam->BSIM3V1vbsc > pParam->BSIM3V1vbm) - pParam->BSIM3V1vbsc = pParam->BSIM3V1vbm; + if (pParam->BSIM3v1vbsc > pParam->BSIM3v1vbm) + pParam->BSIM3v1vbsc = pParam->BSIM3v1vbm; - if (model->BSIM3V1vth0Given) - { pParam->BSIM3V1vfb = model->BSIM3V1type * pParam->BSIM3V1vth0 - - pParam->BSIM3V1phi - pParam->BSIM3V1k1 - * pParam->BSIM3V1sqrtPhi; + if (model->BSIM3v1vth0Given) + { pParam->BSIM3v1vfb = model->BSIM3v1type * pParam->BSIM3v1vth0 + - pParam->BSIM3v1phi - pParam->BSIM3v1k1 + * pParam->BSIM3v1sqrtPhi; } else - { pParam->BSIM3V1vfb = -1.0; - pParam->BSIM3V1vth0 = model->BSIM3V1type * (pParam->BSIM3V1vfb - + pParam->BSIM3V1phi + pParam->BSIM3V1k1 - * pParam->BSIM3V1sqrtPhi); + { pParam->BSIM3v1vfb = -1.0; + pParam->BSIM3v1vth0 = model->BSIM3v1type * (pParam->BSIM3v1vfb + + pParam->BSIM3v1phi + pParam->BSIM3v1k1 + * pParam->BSIM3v1sqrtPhi); } - T1 = sqrt(EPSSI / EPSOX * model->BSIM3V1tox - * pParam->BSIM3V1Xdep0); - T0 = exp(-0.5 * pParam->BSIM3V1dsub * pParam->BSIM3V1leff / T1); - pParam->BSIM3V1theta0vb0 = (T0 + 2.0 * T0 * T0); + T1 = sqrt(EPSSI / EPSOX * model->BSIM3v1tox + * pParam->BSIM3v1Xdep0); + T0 = exp(-0.5 * pParam->BSIM3v1dsub * pParam->BSIM3v1leff / T1); + pParam->BSIM3v1theta0vb0 = (T0 + 2.0 * T0 * T0); - T0 = exp(-0.5 * pParam->BSIM3V1drout * pParam->BSIM3V1leff / T1); + T0 = exp(-0.5 * pParam->BSIM3v1drout * pParam->BSIM3v1leff / T1); T2 = (T0 + 2.0 * T0 * T0); - pParam->BSIM3V1thetaRout = pParam->BSIM3V1pdibl1 * T2 - + pParam->BSIM3V1pdibl2; + pParam->BSIM3v1thetaRout = pParam->BSIM3v1pdibl1 * T2 + + pParam->BSIM3v1pdibl2; } /* process source/drain series resistance */ - here->BSIM3V1drainConductance = model->BSIM3V1sheetResistance - * here->BSIM3V1drainSquares; - if (here->BSIM3V1drainConductance > 0.0) - here->BSIM3V1drainConductance = 1.0 - / here->BSIM3V1drainConductance; + here->BSIM3v1drainConductance = model->BSIM3v1sheetResistance + * here->BSIM3v1drainSquares; + if (here->BSIM3v1drainConductance > 0.0) + here->BSIM3v1drainConductance = 1.0 + / here->BSIM3v1drainConductance; else - here->BSIM3V1drainConductance = 0.0; + here->BSIM3v1drainConductance = 0.0; - here->BSIM3V1sourceConductance = model->BSIM3V1sheetResistance - * here->BSIM3V1sourceSquares; - if (here->BSIM3V1sourceConductance > 0.0) - here->BSIM3V1sourceConductance = 1.0 - / here->BSIM3V1sourceConductance; + here->BSIM3v1sourceConductance = model->BSIM3v1sheetResistance + * here->BSIM3v1sourceSquares; + if (here->BSIM3v1sourceConductance > 0.0) + here->BSIM3v1sourceConductance = 1.0 + / here->BSIM3v1sourceConductance; else - here->BSIM3V1sourceConductance = 0.0; - here->BSIM3V1cgso = pParam->BSIM3V1cgso; - here->BSIM3V1cgdo = pParam->BSIM3V1cgdo; + here->BSIM3v1sourceConductance = 0.0; + here->BSIM3v1cgso = pParam->BSIM3v1cgso; + here->BSIM3v1cgdo = pParam->BSIM3v1cgdo; } } return(OK); } + diff --git a/src/spicelib/devices/bsim3v1/b3v1trunc.c b/src/spicelib/devices/bsim3v1/b3v1trunc.c index fa3e351c4..c9939fa45 100644 --- a/src/spicelib/devices/bsim3v1/b3v1trunc.c +++ b/src/spicelib/devices/bsim3v1/b3v1trunc.c @@ -1,12 +1,16 @@ /********** -Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan. -File: b3v1trunc.c -**********/ + * Copyright 1990 Regents of the University of California. All rights reserved. + * File: b3v1ld.c + * Author: 1995 Min-Chie Jeng and Mansun Chan. + * Modified by Paolo Nenzi 2002 + **********/ + +/* + * Release Notes: + * BSIM3v3.1, Released by yuhua 96/12/08 + */ #include "ngspice.h" -#include -#include #include "cktdefs.h" #include "bsim3v1def.h" #include "sperror.h" @@ -14,37 +18,39 @@ File: b3v1trunc.c int -BSIM3V1trunc(inModel,ckt,timeStep) -GENmodel *inModel; -CKTcircuit *ckt; -double *timeStep; +BSIM3v1trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) { -BSIM3V1model *model = (BSIM3V1model*)inModel; -BSIM3V1instance *here; +BSIM3v1model *model = (BSIM3v1model*)inModel; +BSIM3v1instance *here; #ifdef STEPDEBUG double debugtemp; #endif /* STEPDEBUG */ - for (; model != NULL; model = model->BSIM3V1nextModel) - { for (here = model->BSIM3V1instances; here != NULL; - here = here->BSIM3V1nextInstance) + for (; model != NULL; model = model->BSIM3v1nextModel) + { for (here = model->BSIM3v1instances; here != NULL; + here = here->BSIM3v1nextInstance) { - if (here->BSIM3V1owner != ARCHme) continue; + + if (here->BSIM3v1owner != ARCHme) + continue; + #ifdef STEPDEBUG debugtemp = *timeStep; #endif /* STEPDEBUG */ - CKTterr(here->BSIM3V1qb,ckt,timeStep); - CKTterr(here->BSIM3V1qg,ckt,timeStep); - CKTterr(here->BSIM3V1qd,ckt,timeStep); + CKTterr(here->BSIM3v1qb,ckt,timeStep); + CKTterr(here->BSIM3v1qg,ckt,timeStep); + CKTterr(here->BSIM3v1qd,ckt,timeStep); #ifdef STEPDEBUG if(debugtemp != *timeStep) { printf("device %s reduces step from %g to %g\n", - here->BSIM3V1name,debugtemp,*timeStep); + here->BSIM3v1name,debugtemp,*timeStep); } #endif /* STEPDEBUG */ - } - } + } return(OK); } + + + diff --git a/src/spicelib/devices/bsim3v1/bsim3v1def.h b/src/spicelib/devices/bsim3v1/bsim3v1def.h index 0bf8a46a5..5a9776f95 100644 --- a/src/spicelib/devices/bsim3v1/bsim3v1def.h +++ b/src/spicelib/devices/bsim3v1/bsim3v1def.h @@ -1,11 +1,12 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. -Author: 1995 Min-Chie Jeng and Mansun Chan +Author: 1995 Min-Chie Jeng and Mansun Chan. +Modified: 2002 Paolo Nenzi. File: bsim3v1def.h **********/ -#ifndef BSIM3V1 -#define BSIM3V1 +#ifndef BSIM3v1 +#define BSIM3v1 #include "ifsim.h" #include "gendefs.h" @@ -13,1105 +14,1103 @@ File: bsim3v1def.h #include "complex.h" #include "noisedef.h" -typedef struct sBSIM3V1instance +typedef struct sBSIM3v1instance { - struct sBSIM3V1model *BSIM3V1modPtr; - struct sBSIM3V1instance *BSIM3V1nextInstance; - IFuid BSIM3V1name; - int BSIM3V1owner; /* number of owner process */ - int BSIM3V1states; /* index into state table for this device */ - - int BSIM3V1dNode; - int BSIM3V1gNode; - int BSIM3V1sNode; - int BSIM3V1bNode; - int BSIM3V1dNodePrime; - int BSIM3V1sNodePrime; - int BSIM3V1qNode; /* MCJ */ + struct sBSIM3v1model *BSIM3v1modPtr; + struct sBSIM3v1instance *BSIM3v1nextInstance; + IFuid BSIM3v1name; + int BSIM3v1owner; /* number of owner process */ + int BSIM3v1states; /* index into state table for this device */ + + int BSIM3v1dNode; + int BSIM3v1gNode; + int BSIM3v1sNode; + int BSIM3v1bNode; + int BSIM3v1dNodePrime; + int BSIM3v1sNodePrime; + int BSIM3v1qNode; /* MCJ */ /* MCJ */ - double BSIM3V1ueff; - double BSIM3V1thetavth; - double BSIM3V1von; - double BSIM3V1vdsat; - double BSIM3V1cgdo; - double BSIM3V1cgso; - - double BSIM3V1l; - double BSIM3V1w; - double BSIM3V1drainArea; - double BSIM3V1sourceArea; - double BSIM3V1drainSquares; - double BSIM3V1sourceSquares; - double BSIM3V1drainPerimeter; - double BSIM3V1sourcePerimeter; - double BSIM3V1sourceConductance; - double BSIM3V1drainConductance; - double BSIM3V1m; - - double BSIM3V1icVBS; - double BSIM3V1icVDS; - double BSIM3V1icVGS; - int BSIM3V1off; - int BSIM3V1mode; - int BSIM3V1nqsMod; + double BSIM3v1ueff; + double BSIM3v1thetavth; + double BSIM3v1von; + double BSIM3v1vdsat; + double BSIM3v1cgdo; + double BSIM3v1cgso; + + double BSIM3v1l; + double BSIM3v1w; + double BSIM3v1m; + double BSIM3v1drainArea; + double BSIM3v1sourceArea; + double BSIM3v1drainSquares; + double BSIM3v1sourceSquares; + double BSIM3v1drainPerimeter; + double BSIM3v1sourcePerimeter; + double BSIM3v1sourceConductance; + double BSIM3v1drainConductance; + + double BSIM3v1icVBS; + double BSIM3v1icVDS; + double BSIM3v1icVGS; + int BSIM3v1off; + int BSIM3v1mode; + int BSIM3v1nqsMod; /* OP point */ - double BSIM3V1qinv; - double BSIM3V1cd; - double BSIM3V1cbs; - double BSIM3V1cbd; - double BSIM3V1csub; - double BSIM3V1gm; - double BSIM3V1gds; - double BSIM3V1gmbs; - double BSIM3V1gbd; - double BSIM3V1gbs; - - double BSIM3V1gbbs; - double BSIM3V1gbgs; - double BSIM3V1gbds; - - double BSIM3V1cggb; - double BSIM3V1cgdb; - double BSIM3V1cgsb; - double BSIM3V1cbgb; - double BSIM3V1cbdb; - double BSIM3V1cbsb; - double BSIM3V1cdgb; - double BSIM3V1cddb; - double BSIM3V1cdsb; - double BSIM3V1capbd; - double BSIM3V1capbs; - - double BSIM3V1cqgb; - double BSIM3V1cqdb; - double BSIM3V1cqsb; - double BSIM3V1cqbb; - - double BSIM3V1gtau; - double BSIM3V1gtg; - double BSIM3V1gtd; - double BSIM3V1gts; - double BSIM3V1gtb; - double BSIM3V1tconst; + double BSIM3v1qinv; + double BSIM3v1cd; + double BSIM3v1cbs; + double BSIM3v1cbd; + double BSIM3v1csub; + double BSIM3v1gm; + double BSIM3v1gds; + double BSIM3v1gmbs; + double BSIM3v1gbd; + double BSIM3v1gbs; + + double BSIM3v1gbbs; + double BSIM3v1gbgs; + double BSIM3v1gbds; + + double BSIM3v1cggb; + double BSIM3v1cgdb; + double BSIM3v1cgsb; + double BSIM3v1cbgb; + double BSIM3v1cbdb; + double BSIM3v1cbsb; + double BSIM3v1cdgb; + double BSIM3v1cddb; + double BSIM3v1cdsb; + double BSIM3v1capbd; + double BSIM3v1capbs; + + double BSIM3v1cqgb; + double BSIM3v1cqdb; + double BSIM3v1cqsb; + double BSIM3v1cqbb; + + double BSIM3v1gtau; + double BSIM3v1gtg; + double BSIM3v1gtd; + double BSIM3v1gts; + double BSIM3v1gtb; + double BSIM3v1tconst; struct bsim3v1SizeDependParam *pParam; - unsigned BSIM3V1lGiven :1; - unsigned BSIM3V1wGiven :1; - unsigned BSIM3V1drainAreaGiven :1; - unsigned BSIM3V1sourceAreaGiven :1; - unsigned BSIM3V1drainSquaresGiven :1; - unsigned BSIM3V1sourceSquaresGiven :1; - unsigned BSIM3V1drainPerimeterGiven :1; - unsigned BSIM3V1sourcePerimeterGiven :1; - unsigned BSIM3V1dNodePrimeSet :1; - unsigned BSIM3V1sNodePrimeSet :1; - unsigned BSIM3V1icVBSGiven :1; - unsigned BSIM3V1icVDSGiven :1; - unsigned BSIM3V1icVGSGiven :1; - unsigned BSIM3V1nqsModGiven :1; - - double *BSIM3V1DdPtr; - double *BSIM3V1GgPtr; - double *BSIM3V1SsPtr; - double *BSIM3V1BbPtr; - double *BSIM3V1DPdpPtr; - double *BSIM3V1SPspPtr; - double *BSIM3V1DdpPtr; - double *BSIM3V1GbPtr; - double *BSIM3V1GdpPtr; - double *BSIM3V1GspPtr; - double *BSIM3V1SspPtr; - double *BSIM3V1BdpPtr; - double *BSIM3V1BspPtr; - double *BSIM3V1DPspPtr; - double *BSIM3V1DPdPtr; - double *BSIM3V1BgPtr; - double *BSIM3V1DPgPtr; - double *BSIM3V1SPgPtr; - double *BSIM3V1SPsPtr; - double *BSIM3V1DPbPtr; - double *BSIM3V1SPbPtr; - double *BSIM3V1SPdpPtr; - - double *BSIM3V1QqPtr; - double *BSIM3V1QdpPtr; - double *BSIM3V1QgPtr; - double *BSIM3V1QspPtr; - double *BSIM3V1QbPtr; - double *BSIM3V1DPqPtr; - double *BSIM3V1GqPtr; - double *BSIM3V1SPqPtr; - double *BSIM3V1BqPtr; - -#define BSIM3V1vbd BSIM3V1states+ 0 -#define BSIM3V1vbs BSIM3V1states+ 1 -#define BSIM3V1vgs BSIM3V1states+ 2 -#define BSIM3V1vds BSIM3V1states+ 3 - -#define BSIM3V1qb BSIM3V1states+ 4 -#define BSIM3V1cqb BSIM3V1states+ 5 -#define BSIM3V1qg BSIM3V1states+ 6 -#define BSIM3V1cqg BSIM3V1states+ 7 -#define BSIM3V1qd BSIM3V1states+ 8 -#define BSIM3V1cqd BSIM3V1states+ 9 - -#define BSIM3V1qbs BSIM3V1states+ 10 -#define BSIM3V1qbd BSIM3V1states+ 11 - -#define BSIM3V1qcheq BSIM3V1states+ 12 -#define BSIM3V1cqcheq BSIM3V1states+ 13 -#define BSIM3V1qcdump BSIM3V1states+ 14 -#define BSIM3V1cqcdump BSIM3V1states+ 15 - -#define BSIM3V1tau BSIM3V1states+ 16 -#define BSIM3V1qdef BSIM3V1states+ 17 - -#define BSIM3V1numStates 18 - - -/* indices to the array of BSIM3V1 NOISE SOURCES */ - -#define BSIM3V1RDNOIZ 0 -#define BSIM3V1RSNOIZ 1 -#define BSIM3V1IDNOIZ 2 -#define BSIM3V1FLNOIZ 3 -#define BSIM3V1TOTNOIZ 4 - -#define BSIM3V1NSRCS 5 /* the number of MOSFET(3) noise sources */ + unsigned BSIM3v1lGiven :1; + unsigned BSIM3v1wGiven :1; + unsigned BSIM3v1mGiven :1; + unsigned BSIM3v1drainAreaGiven :1; + unsigned BSIM3v1sourceAreaGiven :1; + unsigned BSIM3v1drainSquaresGiven :1; + unsigned BSIM3v1sourceSquaresGiven :1; + unsigned BSIM3v1drainPerimeterGiven :1; + unsigned BSIM3v1sourcePerimeterGiven :1; + unsigned BSIM3v1dNodePrimeSet :1; + unsigned BSIM3v1sNodePrimeSet :1; + unsigned BSIM3v1icVBSGiven :1; + unsigned BSIM3v1icVDSGiven :1; + unsigned BSIM3v1icVGSGiven :1; + unsigned BSIM3v1nqsModGiven :1; + + double *BSIM3v1DdPtr; + double *BSIM3v1GgPtr; + double *BSIM3v1SsPtr; + double *BSIM3v1BbPtr; + double *BSIM3v1DPdpPtr; + double *BSIM3v1SPspPtr; + double *BSIM3v1DdpPtr; + double *BSIM3v1GbPtr; + double *BSIM3v1GdpPtr; + double *BSIM3v1GspPtr; + double *BSIM3v1SspPtr; + double *BSIM3v1BdpPtr; + double *BSIM3v1BspPtr; + double *BSIM3v1DPspPtr; + double *BSIM3v1DPdPtr; + double *BSIM3v1BgPtr; + double *BSIM3v1DPgPtr; + double *BSIM3v1SPgPtr; + double *BSIM3v1SPsPtr; + double *BSIM3v1DPbPtr; + double *BSIM3v1SPbPtr; + double *BSIM3v1SPdpPtr; + + double *BSIM3v1QqPtr; + double *BSIM3v1QdpPtr; + double *BSIM3v1QgPtr; + double *BSIM3v1QspPtr; + double *BSIM3v1QbPtr; + double *BSIM3v1DPqPtr; + double *BSIM3v1GqPtr; + double *BSIM3v1SPqPtr; + double *BSIM3v1BqPtr; + +#define BSIM3v1vbd BSIM3v1states+ 0 +#define BSIM3v1vbs BSIM3v1states+ 1 +#define BSIM3v1vgs BSIM3v1states+ 2 +#define BSIM3v1vds BSIM3v1states+ 3 + +#define BSIM3v1qb BSIM3v1states+ 4 +#define BSIM3v1cqb BSIM3v1states+ 5 +#define BSIM3v1qg BSIM3v1states+ 6 +#define BSIM3v1cqg BSIM3v1states+ 7 +#define BSIM3v1qd BSIM3v1states+ 8 +#define BSIM3v1cqd BSIM3v1states+ 9 + +#define BSIM3v1qbs BSIM3v1states+ 10 +#define BSIM3v1qbd BSIM3v1states+ 11 + +#define BSIM3v1qcheq BSIM3v1states+ 12 +#define BSIM3v1cqcheq BSIM3v1states+ 13 +#define BSIM3v1qcdump BSIM3v1states+ 14 +#define BSIM3v1cqcdump BSIM3v1states+ 15 + +#define BSIM3v1tau BSIM3v1states+ 16 +#define BSIM3v1qdef BSIM3v1states+ 17 + +#define BSIM3v1numStates 18 + + +/* indices to the array of BSIM3v1 NOISE SOURCES */ + +#define BSIM3v1RDNOIZ 0 +#define BSIM3v1RSNOIZ 1 +#define BSIM3v1IDNOIZ 2 +#define BSIM3v1FLNOIZ 3 +#define BSIM3v1TOTNOIZ 4 + +#define BSIM3v1NSRCS 5 /* the number of MOSFET(3) noise sources */ #ifndef NONOISE - double BSIM3V1nVar[NSTATVARS][BSIM3V1NSRCS]; + double BSIM3v1nVar[NSTATVARS][BSIM3v1NSRCS]; #else /* NONOISE */ - double **BSIM3V1nVar; + double **BSIM3v1nVar; #endif /* NONOISE */ -} BSIM3V1instance ; +} BSIM3v1instance ; struct bsim3v1SizeDependParam { double Width; double Length; - double BSIM3V1cdsc; - double BSIM3V1cdscb; - double BSIM3V1cdscd; - double BSIM3V1cit; - double BSIM3V1nfactor; - double BSIM3V1xj; - double BSIM3V1vsat; - double BSIM3V1at; - double BSIM3V1a0; - double BSIM3V1ags; - double BSIM3V1a1; - double BSIM3V1a2; - double BSIM3V1keta; - double BSIM3V1nsub; - double BSIM3V1npeak; - double BSIM3V1ngate; - double BSIM3V1gamma1; - double BSIM3V1gamma2; - double BSIM3V1vbx; - double BSIM3V1vbi; - double BSIM3V1vbm; - double BSIM3V1vbsc; - double BSIM3V1xt; - double BSIM3V1phi; - double BSIM3V1litl; - double BSIM3V1k1; - double BSIM3V1kt1; - double BSIM3V1kt1l; - double BSIM3V1kt2; - double BSIM3V1k2; - double BSIM3V1k3; - double BSIM3V1k3b; - double BSIM3V1w0; - double BSIM3V1nlx; - double BSIM3V1dvt0; - double BSIM3V1dvt1; - double BSIM3V1dvt2; - double BSIM3V1dvt0w; - double BSIM3V1dvt1w; - double BSIM3V1dvt2w; - double BSIM3V1drout; - double BSIM3V1dsub; - double BSIM3V1vth0; - double BSIM3V1ua; - double BSIM3V1ua1; - double BSIM3V1ub; - double BSIM3V1ub1; - double BSIM3V1uc; - double BSIM3V1uc1; - double BSIM3V1u0; - double BSIM3V1ute; - double BSIM3V1voff; - double BSIM3V1vfb; - double BSIM3V1delta; - double BSIM3V1rdsw; - double BSIM3V1rds0; - double BSIM3V1prwg; - double BSIM3V1prwb; - double BSIM3V1prt; - double BSIM3V1eta0; - double BSIM3V1etab; - double BSIM3V1pclm; - double BSIM3V1pdibl1; - double BSIM3V1pdibl2; - double BSIM3V1pdiblb; - double BSIM3V1pscbe1; - double BSIM3V1pscbe2; - double BSIM3V1pvag; - double BSIM3V1wr; - double BSIM3V1dwg; - double BSIM3V1dwb; - double BSIM3V1b0; - double BSIM3V1b1; - double BSIM3V1alpha0; - double BSIM3V1beta0; + double BSIM3v1cdsc; + double BSIM3v1cdscb; + double BSIM3v1cdscd; + double BSIM3v1cit; + double BSIM3v1nfactor; + double BSIM3v1xj; + double BSIM3v1vsat; + double BSIM3v1at; + double BSIM3v1a0; + double BSIM3v1ags; + double BSIM3v1a1; + double BSIM3v1a2; + double BSIM3v1keta; + double BSIM3v1nsub; + double BSIM3v1npeak; + double BSIM3v1ngate; + double BSIM3v1gamma1; + double BSIM3v1gamma2; + double BSIM3v1vbx; + double BSIM3v1vbi; + double BSIM3v1vbm; + double BSIM3v1vbsc; + double BSIM3v1xt; + double BSIM3v1phi; + double BSIM3v1litl; + double BSIM3v1k1; + double BSIM3v1kt1; + double BSIM3v1kt1l; + double BSIM3v1kt2; + double BSIM3v1k2; + double BSIM3v1k3; + double BSIM3v1k3b; + double BSIM3v1w0; + double BSIM3v1nlx; + double BSIM3v1dvt0; + double BSIM3v1dvt1; + double BSIM3v1dvt2; + double BSIM3v1dvt0w; + double BSIM3v1dvt1w; + double BSIM3v1dvt2w; + double BSIM3v1drout; + double BSIM3v1dsub; + double BSIM3v1vth0; + double BSIM3v1ua; + double BSIM3v1ua1; + double BSIM3v1ub; + double BSIM3v1ub1; + double BSIM3v1uc; + double BSIM3v1uc1; + double BSIM3v1u0; + double BSIM3v1ute; + double BSIM3v1voff; + double BSIM3v1vfb; + double BSIM3v1delta; + double BSIM3v1rdsw; + double BSIM3v1rds0; + double BSIM3v1prwg; + double BSIM3v1prwb; + double BSIM3v1prt; + double BSIM3v1eta0; + double BSIM3v1etab; + double BSIM3v1pclm; + double BSIM3v1pdibl1; + double BSIM3v1pdibl2; + double BSIM3v1pdiblb; + double BSIM3v1pscbe1; + double BSIM3v1pscbe2; + double BSIM3v1pvag; + double BSIM3v1wr; + double BSIM3v1dwg; + double BSIM3v1dwb; + double BSIM3v1b0; + double BSIM3v1b1; + double BSIM3v1alpha0; + double BSIM3v1beta0; /* CV model */ - double BSIM3V1elm; - double BSIM3V1cgsl; - double BSIM3V1cgdl; - double BSIM3V1ckappa; - double BSIM3V1cf; - double BSIM3V1clc; - double BSIM3V1cle; - double BSIM3V1vfbcv; + double BSIM3v1elm; + double BSIM3v1cgsl; + double BSIM3v1cgdl; + double BSIM3v1ckappa; + double BSIM3v1cf; + double BSIM3v1clc; + double BSIM3v1cle; + double BSIM3v1vfbcv; /* Pre-calculated constants */ - double BSIM3V1dw; - double BSIM3V1dl; - double BSIM3V1leff; - double BSIM3V1weff; - - double BSIM3V1dwc; - double BSIM3V1dlc; - double BSIM3V1leffCV; - double BSIM3V1weffCV; - double BSIM3V1abulkCVfactor; - double BSIM3V1cgso; - double BSIM3V1cgdo; - double BSIM3V1cgbo; - - double BSIM3V1u0temp; - double BSIM3V1vsattemp; - double BSIM3V1sqrtPhi; - double BSIM3V1phis3; - double BSIM3V1Xdep0; - double BSIM3V1sqrtXdep0; - double BSIM3V1theta0vb0; - double BSIM3V1thetaRout; - - double BSIM3V1cof1; - double BSIM3V1cof2; - double BSIM3V1cof3; - double BSIM3V1cof4; - double BSIM3V1cdep0; + double BSIM3v1dw; + double BSIM3v1dl; + double BSIM3v1leff; + double BSIM3v1weff; + + double BSIM3v1dwc; + double BSIM3v1dlc; + double BSIM3v1leffCV; + double BSIM3v1weffCV; + double BSIM3v1abulkCVfactor; + double BSIM3v1cgso; + double BSIM3v1cgdo; + double BSIM3v1cgbo; + + double BSIM3v1u0temp; + double BSIM3v1vsattemp; + double BSIM3v1sqrtPhi; + double BSIM3v1phis3; + double BSIM3v1Xdep0; + double BSIM3v1sqrtXdep0; + double BSIM3v1theta0vb0; + double BSIM3v1thetaRout; + + double BSIM3v1cof1; + double BSIM3v1cof2; + double BSIM3v1cof3; + double BSIM3v1cof4; + double BSIM3v1cdep0; struct bsim3v1SizeDependParam *pNext; }; -typedef struct sBSIM3V1model +typedef struct sBSIM3v1model { - int BSIM3V1modType; - struct sBSIM3V1model *BSIM3V1nextModel; - BSIM3V1instance *BSIM3V1instances; - IFuid BSIM3V1modName; - int BSIM3V1type; - - int BSIM3V1mobMod; - int BSIM3V1capMod; - int BSIM3V1nqsMod; - int BSIM3V1noiMod; - int BSIM3V1binUnit; - int BSIM3V1paramChk; - double BSIM3V1version; - double BSIM3V1tox; - double BSIM3V1cdsc; - double BSIM3V1cdscb; - double BSIM3V1cdscd; - double BSIM3V1cit; - double BSIM3V1nfactor; - double BSIM3V1xj; - double BSIM3V1vsat; - double BSIM3V1at; - double BSIM3V1a0; - double BSIM3V1ags; - double BSIM3V1a1; - double BSIM3V1a2; - double BSIM3V1keta; - double BSIM3V1nsub; - double BSIM3V1npeak; - double BSIM3V1ngate; - double BSIM3V1gamma1; - double BSIM3V1gamma2; - double BSIM3V1vbx; - double BSIM3V1vbm; - double BSIM3V1xt; - double BSIM3V1k1; - double BSIM3V1kt1; - double BSIM3V1kt1l; - double BSIM3V1kt2; - double BSIM3V1k2; - double BSIM3V1k3; - double BSIM3V1k3b; - double BSIM3V1w0; - double BSIM3V1nlx; - double BSIM3V1dvt0; - double BSIM3V1dvt1; - double BSIM3V1dvt2; - double BSIM3V1dvt0w; - double BSIM3V1dvt1w; - double BSIM3V1dvt2w; - double BSIM3V1drout; - double BSIM3V1dsub; - double BSIM3V1vth0; - double BSIM3V1ua; - double BSIM3V1ua1; - double BSIM3V1ub; - double BSIM3V1ub1; - double BSIM3V1uc; - double BSIM3V1uc1; - double BSIM3V1u0; - double BSIM3V1ute; - double BSIM3V1voff; - double BSIM3V1delta; - double BSIM3V1rdsw; - double BSIM3V1prwg; - double BSIM3V1prwb; - double BSIM3V1prt; - double BSIM3V1eta0; - double BSIM3V1etab; - double BSIM3V1pclm; - double BSIM3V1pdibl1; - double BSIM3V1pdibl2; - double BSIM3V1pdiblb; - double BSIM3V1pscbe1; - double BSIM3V1pscbe2; - double BSIM3V1pvag; - double BSIM3V1wr; - double BSIM3V1dwg; - double BSIM3V1dwb; - double BSIM3V1b0; - double BSIM3V1b1; - double BSIM3V1alpha0; - double BSIM3V1beta0; -/* serban */ - double BSIM3V1hdif; + int BSIM3v1modType; + struct sBSIM3v1model *BSIM3v1nextModel; + BSIM3v1instance *BSIM3v1instances; + IFuid BSIM3v1modName; + int BSIM3v1type; + + int BSIM3v1mobMod; + int BSIM3v1capMod; + int BSIM3v1nqsMod; + int BSIM3v1noiMod; + int BSIM3v1binUnit; + int BSIM3v1paramChk; + double BSIM3v1version; + double BSIM3v1tox; + double BSIM3v1cdsc; + double BSIM3v1cdscb; + double BSIM3v1cdscd; + double BSIM3v1cit; + double BSIM3v1nfactor; + double BSIM3v1xj; + double BSIM3v1vsat; + double BSIM3v1at; + double BSIM3v1a0; + double BSIM3v1ags; + double BSIM3v1a1; + double BSIM3v1a2; + double BSIM3v1keta; + double BSIM3v1nsub; + double BSIM3v1npeak; + double BSIM3v1ngate; + double BSIM3v1gamma1; + double BSIM3v1gamma2; + double BSIM3v1vbx; + double BSIM3v1vbm; + double BSIM3v1xt; + double BSIM3v1k1; + double BSIM3v1kt1; + double BSIM3v1kt1l; + double BSIM3v1kt2; + double BSIM3v1k2; + double BSIM3v1k3; + double BSIM3v1k3b; + double BSIM3v1w0; + double BSIM3v1nlx; + double BSIM3v1dvt0; + double BSIM3v1dvt1; + double BSIM3v1dvt2; + double BSIM3v1dvt0w; + double BSIM3v1dvt1w; + double BSIM3v1dvt2w; + double BSIM3v1drout; + double BSIM3v1dsub; + double BSIM3v1vth0; + double BSIM3v1ua; + double BSIM3v1ua1; + double BSIM3v1ub; + double BSIM3v1ub1; + double BSIM3v1uc; + double BSIM3v1uc1; + double BSIM3v1u0; + double BSIM3v1ute; + double BSIM3v1voff; + double BSIM3v1delta; + double BSIM3v1rdsw; + double BSIM3v1prwg; + double BSIM3v1prwb; + double BSIM3v1prt; + double BSIM3v1eta0; + double BSIM3v1etab; + double BSIM3v1pclm; + double BSIM3v1pdibl1; + double BSIM3v1pdibl2; + double BSIM3v1pdiblb; + double BSIM3v1pscbe1; + double BSIM3v1pscbe2; + double BSIM3v1pvag; + double BSIM3v1wr; + double BSIM3v1dwg; + double BSIM3v1dwb; + double BSIM3v1b0; + double BSIM3v1b1; + double BSIM3v1alpha0; + double BSIM3v1beta0; /* CV model */ - double BSIM3V1elm; - double BSIM3V1cgsl; - double BSIM3V1cgdl; - double BSIM3V1ckappa; - double BSIM3V1cf; - double BSIM3V1vfbcv; - double BSIM3V1clc; - double BSIM3V1cle; - double BSIM3V1dwc; - double BSIM3V1dlc; + double BSIM3v1elm; + double BSIM3v1cgsl; + double BSIM3v1cgdl; + double BSIM3v1ckappa; + double BSIM3v1cf; + double BSIM3v1vfbcv; + double BSIM3v1clc; + double BSIM3v1cle; + double BSIM3v1dwc; + double BSIM3v1dlc; /* Length Dependence */ - double BSIM3V1lcdsc; - double BSIM3V1lcdscb; - double BSIM3V1lcdscd; - double BSIM3V1lcit; - double BSIM3V1lnfactor; - double BSIM3V1lxj; - double BSIM3V1lvsat; - double BSIM3V1lat; - double BSIM3V1la0; - double BSIM3V1lags; - double BSIM3V1la1; - double BSIM3V1la2; - double BSIM3V1lketa; - double BSIM3V1lnsub; - double BSIM3V1lnpeak; - double BSIM3V1lngate; - double BSIM3V1lgamma1; - double BSIM3V1lgamma2; - double BSIM3V1lvbx; - double BSIM3V1lvbm; - double BSIM3V1lxt; - double BSIM3V1lk1; - double BSIM3V1lkt1; - double BSIM3V1lkt1l; - double BSIM3V1lkt2; - double BSIM3V1lk2; - double BSIM3V1lk3; - double BSIM3V1lk3b; - double BSIM3V1lw0; - double BSIM3V1lnlx; - double BSIM3V1ldvt0; - double BSIM3V1ldvt1; - double BSIM3V1ldvt2; - double BSIM3V1ldvt0w; - double BSIM3V1ldvt1w; - double BSIM3V1ldvt2w; - double BSIM3V1ldrout; - double BSIM3V1ldsub; - double BSIM3V1lvth0; - double BSIM3V1lua; - double BSIM3V1lua1; - double BSIM3V1lub; - double BSIM3V1lub1; - double BSIM3V1luc; - double BSIM3V1luc1; - double BSIM3V1lu0; - double BSIM3V1lute; - double BSIM3V1lvoff; - double BSIM3V1ldelta; - double BSIM3V1lrdsw; - double BSIM3V1lprwg; - double BSIM3V1lprwb; - double BSIM3V1lprt; - double BSIM3V1leta0; - double BSIM3V1letab; - double BSIM3V1lpclm; - double BSIM3V1lpdibl1; - double BSIM3V1lpdibl2; - double BSIM3V1lpdiblb; - double BSIM3V1lpscbe1; - double BSIM3V1lpscbe2; - double BSIM3V1lpvag; - double BSIM3V1lwr; - double BSIM3V1ldwg; - double BSIM3V1ldwb; - double BSIM3V1lb0; - double BSIM3V1lb1; - double BSIM3V1lalpha0; - double BSIM3V1lbeta0; + double BSIM3v1lcdsc; + double BSIM3v1lcdscb; + double BSIM3v1lcdscd; + double BSIM3v1lcit; + double BSIM3v1lnfactor; + double BSIM3v1lxj; + double BSIM3v1lvsat; + double BSIM3v1lat; + double BSIM3v1la0; + double BSIM3v1lags; + double BSIM3v1la1; + double BSIM3v1la2; + double BSIM3v1lketa; + double BSIM3v1lnsub; + double BSIM3v1lnpeak; + double BSIM3v1lngate; + double BSIM3v1lgamma1; + double BSIM3v1lgamma2; + double BSIM3v1lvbx; + double BSIM3v1lvbm; + double BSIM3v1lxt; + double BSIM3v1lk1; + double BSIM3v1lkt1; + double BSIM3v1lkt1l; + double BSIM3v1lkt2; + double BSIM3v1lk2; + double BSIM3v1lk3; + double BSIM3v1lk3b; + double BSIM3v1lw0; + double BSIM3v1lnlx; + double BSIM3v1ldvt0; + double BSIM3v1ldvt1; + double BSIM3v1ldvt2; + double BSIM3v1ldvt0w; + double BSIM3v1ldvt1w; + double BSIM3v1ldvt2w; + double BSIM3v1ldrout; + double BSIM3v1ldsub; + double BSIM3v1lvth0; + double BSIM3v1lua; + double BSIM3v1lua1; + double BSIM3v1lub; + double BSIM3v1lub1; + double BSIM3v1luc; + double BSIM3v1luc1; + double BSIM3v1lu0; + double BSIM3v1lute; + double BSIM3v1lvoff; + double BSIM3v1ldelta; + double BSIM3v1lrdsw; + double BSIM3v1lprwg; + double BSIM3v1lprwb; + double BSIM3v1lprt; + double BSIM3v1leta0; + double BSIM3v1letab; + double BSIM3v1lpclm; + double BSIM3v1lpdibl1; + double BSIM3v1lpdibl2; + double BSIM3v1lpdiblb; + double BSIM3v1lpscbe1; + double BSIM3v1lpscbe2; + double BSIM3v1lpvag; + double BSIM3v1lwr; + double BSIM3v1ldwg; + double BSIM3v1ldwb; + double BSIM3v1lb0; + double BSIM3v1lb1; + double BSIM3v1lalpha0; + double BSIM3v1lbeta0; /* CV model */ - double BSIM3V1lelm; - double BSIM3V1lcgsl; - double BSIM3V1lcgdl; - double BSIM3V1lckappa; - double BSIM3V1lcf; - double BSIM3V1lclc; - double BSIM3V1lcle; - double BSIM3V1lvfbcv; + double BSIM3v1lelm; + double BSIM3v1lcgsl; + double BSIM3v1lcgdl; + double BSIM3v1lckappa; + double BSIM3v1lcf; + double BSIM3v1lclc; + double BSIM3v1lcle; + double BSIM3v1lvfbcv; /* Width Dependence */ - double BSIM3V1wcdsc; - double BSIM3V1wcdscb; - double BSIM3V1wcdscd; - double BSIM3V1wcit; - double BSIM3V1wnfactor; - double BSIM3V1wxj; - double BSIM3V1wvsat; - double BSIM3V1wat; - double BSIM3V1wa0; - double BSIM3V1wags; - double BSIM3V1wa1; - double BSIM3V1wa2; - double BSIM3V1wketa; - double BSIM3V1wnsub; - double BSIM3V1wnpeak; - double BSIM3V1wngate; - double BSIM3V1wgamma1; - double BSIM3V1wgamma2; - double BSIM3V1wvbx; - double BSIM3V1wvbm; - double BSIM3V1wxt; - double BSIM3V1wk1; - double BSIM3V1wkt1; - double BSIM3V1wkt1l; - double BSIM3V1wkt2; - double BSIM3V1wk2; - double BSIM3V1wk3; - double BSIM3V1wk3b; - double BSIM3V1ww0; - double BSIM3V1wnlx; - double BSIM3V1wdvt0; - double BSIM3V1wdvt1; - double BSIM3V1wdvt2; - double BSIM3V1wdvt0w; - double BSIM3V1wdvt1w; - double BSIM3V1wdvt2w; - double BSIM3V1wdrout; - double BSIM3V1wdsub; - double BSIM3V1wvth0; - double BSIM3V1wua; - double BSIM3V1wua1; - double BSIM3V1wub; - double BSIM3V1wub1; - double BSIM3V1wuc; - double BSIM3V1wuc1; - double BSIM3V1wu0; - double BSIM3V1wute; - double BSIM3V1wvoff; - double BSIM3V1wdelta; - double BSIM3V1wrdsw; - double BSIM3V1wprwg; - double BSIM3V1wprwb; - double BSIM3V1wprt; - double BSIM3V1weta0; - double BSIM3V1wetab; - double BSIM3V1wpclm; - double BSIM3V1wpdibl1; - double BSIM3V1wpdibl2; - double BSIM3V1wpdiblb; - double BSIM3V1wpscbe1; - double BSIM3V1wpscbe2; - double BSIM3V1wpvag; - double BSIM3V1wwr; - double BSIM3V1wdwg; - double BSIM3V1wdwb; - double BSIM3V1wb0; - double BSIM3V1wb1; - double BSIM3V1walpha0; - double BSIM3V1wbeta0; + double BSIM3v1wcdsc; + double BSIM3v1wcdscb; + double BSIM3v1wcdscd; + double BSIM3v1wcit; + double BSIM3v1wnfactor; + double BSIM3v1wxj; + double BSIM3v1wvsat; + double BSIM3v1wat; + double BSIM3v1wa0; + double BSIM3v1wags; + double BSIM3v1wa1; + double BSIM3v1wa2; + double BSIM3v1wketa; + double BSIM3v1wnsub; + double BSIM3v1wnpeak; + double BSIM3v1wngate; + double BSIM3v1wgamma1; + double BSIM3v1wgamma2; + double BSIM3v1wvbx; + double BSIM3v1wvbm; + double BSIM3v1wxt; + double BSIM3v1wk1; + double BSIM3v1wkt1; + double BSIM3v1wkt1l; + double BSIM3v1wkt2; + double BSIM3v1wk2; + double BSIM3v1wk3; + double BSIM3v1wk3b; + double BSIM3v1ww0; + double BSIM3v1wnlx; + double BSIM3v1wdvt0; + double BSIM3v1wdvt1; + double BSIM3v1wdvt2; + double BSIM3v1wdvt0w; + double BSIM3v1wdvt1w; + double BSIM3v1wdvt2w; + double BSIM3v1wdrout; + double BSIM3v1wdsub; + double BSIM3v1wvth0; + double BSIM3v1wua; + double BSIM3v1wua1; + double BSIM3v1wub; + double BSIM3v1wub1; + double BSIM3v1wuc; + double BSIM3v1wuc1; + double BSIM3v1wu0; + double BSIM3v1wute; + double BSIM3v1wvoff; + double BSIM3v1wdelta; + double BSIM3v1wrdsw; + double BSIM3v1wprwg; + double BSIM3v1wprwb; + double BSIM3v1wprt; + double BSIM3v1weta0; + double BSIM3v1wetab; + double BSIM3v1wpclm; + double BSIM3v1wpdibl1; + double BSIM3v1wpdibl2; + double BSIM3v1wpdiblb; + double BSIM3v1wpscbe1; + double BSIM3v1wpscbe2; + double BSIM3v1wpvag; + double BSIM3v1wwr; + double BSIM3v1wdwg; + double BSIM3v1wdwb; + double BSIM3v1wb0; + double BSIM3v1wb1; + double BSIM3v1walpha0; + double BSIM3v1wbeta0; /* CV model */ - double BSIM3V1welm; - double BSIM3V1wcgsl; - double BSIM3V1wcgdl; - double BSIM3V1wckappa; - double BSIM3V1wcf; - double BSIM3V1wclc; - double BSIM3V1wcle; - double BSIM3V1wvfbcv; + double BSIM3v1welm; + double BSIM3v1wcgsl; + double BSIM3v1wcgdl; + double BSIM3v1wckappa; + double BSIM3v1wcf; + double BSIM3v1wclc; + double BSIM3v1wcle; + double BSIM3v1wvfbcv; /* Cross-term Dependence */ - double BSIM3V1pcdsc; - double BSIM3V1pcdscb; - double BSIM3V1pcdscd; - double BSIM3V1pcit; - double BSIM3V1pnfactor; - double BSIM3V1pxj; - double BSIM3V1pvsat; - double BSIM3V1pat; - double BSIM3V1pa0; - double BSIM3V1pags; - double BSIM3V1pa1; - double BSIM3V1pa2; - double BSIM3V1pketa; - double BSIM3V1pnsub; - double BSIM3V1pnpeak; - double BSIM3V1pngate; - double BSIM3V1pgamma1; - double BSIM3V1pgamma2; - double BSIM3V1pvbx; - double BSIM3V1pvbm; - double BSIM3V1pxt; - double BSIM3V1pk1; - double BSIM3V1pkt1; - double BSIM3V1pkt1l; - double BSIM3V1pkt2; - double BSIM3V1pk2; - double BSIM3V1pk3; - double BSIM3V1pk3b; - double BSIM3V1pw0; - double BSIM3V1pnlx; - double BSIM3V1pdvt0; - double BSIM3V1pdvt1; - double BSIM3V1pdvt2; - double BSIM3V1pdvt0w; - double BSIM3V1pdvt1w; - double BSIM3V1pdvt2w; - double BSIM3V1pdrout; - double BSIM3V1pdsub; - double BSIM3V1pvth0; - double BSIM3V1pua; - double BSIM3V1pua1; - double BSIM3V1pub; - double BSIM3V1pub1; - double BSIM3V1puc; - double BSIM3V1puc1; - double BSIM3V1pu0; - double BSIM3V1pute; - double BSIM3V1pvoff; - double BSIM3V1pdelta; - double BSIM3V1prdsw; - double BSIM3V1pprwg; - double BSIM3V1pprwb; - double BSIM3V1pprt; - double BSIM3V1peta0; - double BSIM3V1petab; - double BSIM3V1ppclm; - double BSIM3V1ppdibl1; - double BSIM3V1ppdibl2; - double BSIM3V1ppdiblb; - double BSIM3V1ppscbe1; - double BSIM3V1ppscbe2; - double BSIM3V1ppvag; - double BSIM3V1pwr; - double BSIM3V1pdwg; - double BSIM3V1pdwb; - double BSIM3V1pb0; - double BSIM3V1pb1; - double BSIM3V1palpha0; - double BSIM3V1pbeta0; + double BSIM3v1pcdsc; + double BSIM3v1pcdscb; + double BSIM3v1pcdscd; + double BSIM3v1pcit; + double BSIM3v1pnfactor; + double BSIM3v1pxj; + double BSIM3v1pvsat; + double BSIM3v1pat; + double BSIM3v1pa0; + double BSIM3v1pags; + double BSIM3v1pa1; + double BSIM3v1pa2; + double BSIM3v1pketa; + double BSIM3v1pnsub; + double BSIM3v1pnpeak; + double BSIM3v1pngate; + double BSIM3v1pgamma1; + double BSIM3v1pgamma2; + double BSIM3v1pvbx; + double BSIM3v1pvbm; + double BSIM3v1pxt; + double BSIM3v1pk1; + double BSIM3v1pkt1; + double BSIM3v1pkt1l; + double BSIM3v1pkt2; + double BSIM3v1pk2; + double BSIM3v1pk3; + double BSIM3v1pk3b; + double BSIM3v1pw0; + double BSIM3v1pnlx; + double BSIM3v1pdvt0; + double BSIM3v1pdvt1; + double BSIM3v1pdvt2; + double BSIM3v1pdvt0w; + double BSIM3v1pdvt1w; + double BSIM3v1pdvt2w; + double BSIM3v1pdrout; + double BSIM3v1pdsub; + double BSIM3v1pvth0; + double BSIM3v1pua; + double BSIM3v1pua1; + double BSIM3v1pub; + double BSIM3v1pub1; + double BSIM3v1puc; + double BSIM3v1puc1; + double BSIM3v1pu0; + double BSIM3v1pute; + double BSIM3v1pvoff; + double BSIM3v1pdelta; + double BSIM3v1prdsw; + double BSIM3v1pprwg; + double BSIM3v1pprwb; + double BSIM3v1pprt; + double BSIM3v1peta0; + double BSIM3v1petab; + double BSIM3v1ppclm; + double BSIM3v1ppdibl1; + double BSIM3v1ppdibl2; + double BSIM3v1ppdiblb; + double BSIM3v1ppscbe1; + double BSIM3v1ppscbe2; + double BSIM3v1ppvag; + double BSIM3v1pwr; + double BSIM3v1pdwg; + double BSIM3v1pdwb; + double BSIM3v1pb0; + double BSIM3v1pb1; + double BSIM3v1palpha0; + double BSIM3v1pbeta0; /* CV model */ - double BSIM3V1pelm; - double BSIM3V1pcgsl; - double BSIM3V1pcgdl; - double BSIM3V1pckappa; - double BSIM3V1pcf; - double BSIM3V1pclc; - double BSIM3V1pcle; - double BSIM3V1pvfbcv; - - double BSIM3V1tnom; - double BSIM3V1cgso; - double BSIM3V1cgdo; - double BSIM3V1cgbo; - double BSIM3V1xpart; - double BSIM3V1cFringOut; - double BSIM3V1cFringMax; - - double BSIM3V1sheetResistance; - double BSIM3V1jctSatCurDensity; - double BSIM3V1jctSidewallSatCurDensity; - double BSIM3V1bulkJctPotential; - double BSIM3V1bulkJctBotGradingCoeff; - double BSIM3V1bulkJctSideGradingCoeff; - double BSIM3V1bulkJctGateSideGradingCoeff; - double BSIM3V1sidewallJctPotential; - double BSIM3V1GatesidewallJctPotential; - double BSIM3V1unitAreaJctCap; - double BSIM3V1unitLengthSidewallJctCap; - double BSIM3V1unitLengthGateSidewallJctCap; - double BSIM3V1jctEmissionCoeff; - double BSIM3V1jctTempExponent; - - double BSIM3V1Lint; - double BSIM3V1Ll; - double BSIM3V1Lln; - double BSIM3V1Lw; - double BSIM3V1Lwn; - double BSIM3V1Lwl; - double BSIM3V1Lmin; - double BSIM3V1Lmax; - - double BSIM3V1Wint; - double BSIM3V1Wl; - double BSIM3V1Wln; - double BSIM3V1Ww; - double BSIM3V1Wwn; - double BSIM3V1Wwl; - double BSIM3V1Wmin; - double BSIM3V1Wmax; + double BSIM3v1pelm; + double BSIM3v1pcgsl; + double BSIM3v1pcgdl; + double BSIM3v1pckappa; + double BSIM3v1pcf; + double BSIM3v1pclc; + double BSIM3v1pcle; + double BSIM3v1pvfbcv; + + double BSIM3v1tnom; + double BSIM3v1cgso; + double BSIM3v1cgdo; + double BSIM3v1cgbo; + double BSIM3v1xpart; + double BSIM3v1cFringOut; + double BSIM3v1cFringMax; + + double BSIM3v1sheetResistance; + double BSIM3v1jctSatCurDensity; + double BSIM3v1jctSidewallSatCurDensity; + double BSIM3v1bulkJctPotential; + double BSIM3v1bulkJctBotGradingCoeff; + double BSIM3v1bulkJctSideGradingCoeff; + double BSIM3v1bulkJctGateSideGradingCoeff; + double BSIM3v1sidewallJctPotential; + double BSIM3v1GatesidewallJctPotential; + double BSIM3v1unitAreaJctCap; + double BSIM3v1unitLengthSidewallJctCap; + double BSIM3v1unitLengthGateSidewallJctCap; + double BSIM3v1jctEmissionCoeff; + double BSIM3v1jctTempExponent; + + double BSIM3v1Lint; + double BSIM3v1Ll; + double BSIM3v1Lln; + double BSIM3v1Lw; + double BSIM3v1Lwn; + double BSIM3v1Lwl; + double BSIM3v1Lmin; + double BSIM3v1Lmax; + + double BSIM3v1Wint; + double BSIM3v1Wl; + double BSIM3v1Wln; + double BSIM3v1Ww; + double BSIM3v1Wwn; + double BSIM3v1Wwl; + double BSIM3v1Wmin; + double BSIM3v1Wmax; /* Pre-calculated constants */ /* MCJ: move to size-dependent param. */ - double BSIM3V1vtm; - double BSIM3V1cox; - double BSIM3V1cof1; - double BSIM3V1cof2; - double BSIM3V1cof3; - double BSIM3V1cof4; - double BSIM3V1vcrit; - double BSIM3V1factor1; - double BSIM3V1jctTempSatCurDensity; - double BSIM3V1jctSidewallTempSatCurDensity; - - double BSIM3V1oxideTrapDensityA; - double BSIM3V1oxideTrapDensityB; - double BSIM3V1oxideTrapDensityC; - double BSIM3V1em; - double BSIM3V1ef; - double BSIM3V1af; - double BSIM3V1kf; + double BSIM3v1vtm; + double BSIM3v1cox; + double BSIM3v1cof1; + double BSIM3v1cof2; + double BSIM3v1cof3; + double BSIM3v1cof4; + double BSIM3v1vcrit; + double BSIM3v1factor1; + double BSIM3v1jctTempSatCurDensity; + double BSIM3v1jctSidewallTempSatCurDensity; + + double BSIM3v1oxideTrapDensityA; + double BSIM3v1oxideTrapDensityB; + double BSIM3v1oxideTrapDensityC; + double BSIM3v1em; + double BSIM3v1ef; + double BSIM3v1af; + double BSIM3v1kf; struct bsim3v1SizeDependParam *pSizeDependParamKnot; /* Flags */ - unsigned BSIM3V1mobModGiven :1; - unsigned BSIM3V1binUnitGiven :1; - unsigned BSIM3V1capModGiven :1; - unsigned BSIM3V1paramChkGiven :1; - unsigned BSIM3V1nqsModGiven :1; - unsigned BSIM3V1noiModGiven :1; - unsigned BSIM3V1typeGiven :1; - unsigned BSIM3V1toxGiven :1; - unsigned BSIM3V1versionGiven :1; - - unsigned BSIM3V1cdscGiven :1; - unsigned BSIM3V1cdscbGiven :1; - unsigned BSIM3V1cdscdGiven :1; - unsigned BSIM3V1citGiven :1; - unsigned BSIM3V1nfactorGiven :1; - unsigned BSIM3V1xjGiven :1; - unsigned BSIM3V1vsatGiven :1; - unsigned BSIM3V1atGiven :1; - unsigned BSIM3V1a0Given :1; - unsigned BSIM3V1agsGiven :1; - unsigned BSIM3V1a1Given :1; - unsigned BSIM3V1a2Given :1; - unsigned BSIM3V1ketaGiven :1; - unsigned BSIM3V1nsubGiven :1; - unsigned BSIM3V1npeakGiven :1; - unsigned BSIM3V1ngateGiven :1; - unsigned BSIM3V1gamma1Given :1; - unsigned BSIM3V1gamma2Given :1; - unsigned BSIM3V1vbxGiven :1; - unsigned BSIM3V1vbmGiven :1; - unsigned BSIM3V1xtGiven :1; - unsigned BSIM3V1k1Given :1; - unsigned BSIM3V1kt1Given :1; - unsigned BSIM3V1kt1lGiven :1; - unsigned BSIM3V1kt2Given :1; - unsigned BSIM3V1k2Given :1; - unsigned BSIM3V1k3Given :1; - unsigned BSIM3V1k3bGiven :1; - unsigned BSIM3V1w0Given :1; - unsigned BSIM3V1nlxGiven :1; - unsigned BSIM3V1dvt0Given :1; - unsigned BSIM3V1dvt1Given :1; - unsigned BSIM3V1dvt2Given :1; - unsigned BSIM3V1dvt0wGiven :1; - unsigned BSIM3V1dvt1wGiven :1; - unsigned BSIM3V1dvt2wGiven :1; - unsigned BSIM3V1droutGiven :1; - unsigned BSIM3V1dsubGiven :1; - unsigned BSIM3V1vth0Given :1; - unsigned BSIM3V1uaGiven :1; - unsigned BSIM3V1ua1Given :1; - unsigned BSIM3V1ubGiven :1; - unsigned BSIM3V1ub1Given :1; - unsigned BSIM3V1ucGiven :1; - unsigned BSIM3V1uc1Given :1; - unsigned BSIM3V1u0Given :1; - unsigned BSIM3V1uteGiven :1; - unsigned BSIM3V1voffGiven :1; - unsigned BSIM3V1rdswGiven :1; - unsigned BSIM3V1prwgGiven :1; - unsigned BSIM3V1prwbGiven :1; - unsigned BSIM3V1prtGiven :1; - unsigned BSIM3V1eta0Given :1; - unsigned BSIM3V1etabGiven :1; - unsigned BSIM3V1pclmGiven :1; - unsigned BSIM3V1pdibl1Given :1; - unsigned BSIM3V1pdibl2Given :1; - unsigned BSIM3V1pdiblbGiven :1; - unsigned BSIM3V1pscbe1Given :1; - unsigned BSIM3V1pscbe2Given :1; - unsigned BSIM3V1pvagGiven :1; - unsigned BSIM3V1deltaGiven :1; - unsigned BSIM3V1wrGiven :1; - unsigned BSIM3V1dwgGiven :1; - unsigned BSIM3V1dwbGiven :1; - unsigned BSIM3V1b0Given :1; - unsigned BSIM3V1b1Given :1; - unsigned BSIM3V1alpha0Given :1; - unsigned BSIM3V1beta0Given :1; - unsigned BSIM3V1hdifGiven :1; + unsigned BSIM3v1mobModGiven :1; + unsigned BSIM3v1binUnitGiven :1; + unsigned BSIM3v1capModGiven :1; + unsigned BSIM3v1paramChkGiven :1; + unsigned BSIM3v1nqsModGiven :1; + unsigned BSIM3v1noiModGiven :1; + unsigned BSIM3v1typeGiven :1; + unsigned BSIM3v1toxGiven :1; + unsigned BSIM3v1versionGiven :1; + + unsigned BSIM3v1cdscGiven :1; + unsigned BSIM3v1cdscbGiven :1; + unsigned BSIM3v1cdscdGiven :1; + unsigned BSIM3v1citGiven :1; + unsigned BSIM3v1nfactorGiven :1; + unsigned BSIM3v1xjGiven :1; + unsigned BSIM3v1vsatGiven :1; + unsigned BSIM3v1atGiven :1; + unsigned BSIM3v1a0Given :1; + unsigned BSIM3v1agsGiven :1; + unsigned BSIM3v1a1Given :1; + unsigned BSIM3v1a2Given :1; + unsigned BSIM3v1ketaGiven :1; + unsigned BSIM3v1nsubGiven :1; + unsigned BSIM3v1npeakGiven :1; + unsigned BSIM3v1ngateGiven :1; + unsigned BSIM3v1gamma1Given :1; + unsigned BSIM3v1gamma2Given :1; + unsigned BSIM3v1vbxGiven :1; + unsigned BSIM3v1vbmGiven :1; + unsigned BSIM3v1xtGiven :1; + unsigned BSIM3v1k1Given :1; + unsigned BSIM3v1kt1Given :1; + unsigned BSIM3v1kt1lGiven :1; + unsigned BSIM3v1kt2Given :1; + unsigned BSIM3v1k2Given :1; + unsigned BSIM3v1k3Given :1; + unsigned BSIM3v1k3bGiven :1; + unsigned BSIM3v1w0Given :1; + unsigned BSIM3v1nlxGiven :1; + unsigned BSIM3v1dvt0Given :1; + unsigned BSIM3v1dvt1Given :1; + unsigned BSIM3v1dvt2Given :1; + unsigned BSIM3v1dvt0wGiven :1; + unsigned BSIM3v1dvt1wGiven :1; + unsigned BSIM3v1dvt2wGiven :1; + unsigned BSIM3v1droutGiven :1; + unsigned BSIM3v1dsubGiven :1; + unsigned BSIM3v1vth0Given :1; + unsigned BSIM3v1uaGiven :1; + unsigned BSIM3v1ua1Given :1; + unsigned BSIM3v1ubGiven :1; + unsigned BSIM3v1ub1Given :1; + unsigned BSIM3v1ucGiven :1; + unsigned BSIM3v1uc1Given :1; + unsigned BSIM3v1u0Given :1; + unsigned BSIM3v1uteGiven :1; + unsigned BSIM3v1voffGiven :1; + unsigned BSIM3v1rdswGiven :1; + unsigned BSIM3v1prwgGiven :1; + unsigned BSIM3v1prwbGiven :1; + unsigned BSIM3v1prtGiven :1; + unsigned BSIM3v1eta0Given :1; + unsigned BSIM3v1etabGiven :1; + unsigned BSIM3v1pclmGiven :1; + unsigned BSIM3v1pdibl1Given :1; + unsigned BSIM3v1pdibl2Given :1; + unsigned BSIM3v1pdiblbGiven :1; + unsigned BSIM3v1pscbe1Given :1; + unsigned BSIM3v1pscbe2Given :1; + unsigned BSIM3v1pvagGiven :1; + unsigned BSIM3v1deltaGiven :1; + unsigned BSIM3v1wrGiven :1; + unsigned BSIM3v1dwgGiven :1; + unsigned BSIM3v1dwbGiven :1; + unsigned BSIM3v1b0Given :1; + unsigned BSIM3v1b1Given :1; + unsigned BSIM3v1alpha0Given :1; + unsigned BSIM3v1beta0Given :1; /* CV model */ - unsigned BSIM3V1elmGiven :1; - unsigned BSIM3V1cgslGiven :1; - unsigned BSIM3V1cgdlGiven :1; - unsigned BSIM3V1ckappaGiven :1; - unsigned BSIM3V1cfGiven :1; - unsigned BSIM3V1vfbcvGiven :1; - unsigned BSIM3V1clcGiven :1; - unsigned BSIM3V1cleGiven :1; - unsigned BSIM3V1dwcGiven :1; - unsigned BSIM3V1dlcGiven :1; + unsigned BSIM3v1elmGiven :1; + unsigned BSIM3v1cgslGiven :1; + unsigned BSIM3v1cgdlGiven :1; + unsigned BSIM3v1ckappaGiven :1; + unsigned BSIM3v1cfGiven :1; + unsigned BSIM3v1vfbcvGiven :1; + unsigned BSIM3v1clcGiven :1; + unsigned BSIM3v1cleGiven :1; + unsigned BSIM3v1dwcGiven :1; + unsigned BSIM3v1dlcGiven :1; /* Length dependence */ - unsigned BSIM3V1lcdscGiven :1; - unsigned BSIM3V1lcdscbGiven :1; - unsigned BSIM3V1lcdscdGiven :1; - unsigned BSIM3V1lcitGiven :1; - unsigned BSIM3V1lnfactorGiven :1; - unsigned BSIM3V1lxjGiven :1; - unsigned BSIM3V1lvsatGiven :1; - unsigned BSIM3V1latGiven :1; - unsigned BSIM3V1la0Given :1; - unsigned BSIM3V1lagsGiven :1; - unsigned BSIM3V1la1Given :1; - unsigned BSIM3V1la2Given :1; - unsigned BSIM3V1lketaGiven :1; - unsigned BSIM3V1lnsubGiven :1; - unsigned BSIM3V1lnpeakGiven :1; - unsigned BSIM3V1lngateGiven :1; - unsigned BSIM3V1lgamma1Given :1; - unsigned BSIM3V1lgamma2Given :1; - unsigned BSIM3V1lvbxGiven :1; - unsigned BSIM3V1lvbmGiven :1; - unsigned BSIM3V1lxtGiven :1; - unsigned BSIM3V1lk1Given :1; - unsigned BSIM3V1lkt1Given :1; - unsigned BSIM3V1lkt1lGiven :1; - unsigned BSIM3V1lkt2Given :1; - unsigned BSIM3V1lk2Given :1; - unsigned BSIM3V1lk3Given :1; - unsigned BSIM3V1lk3bGiven :1; - unsigned BSIM3V1lw0Given :1; - unsigned BSIM3V1lnlxGiven :1; - unsigned BSIM3V1ldvt0Given :1; - unsigned BSIM3V1ldvt1Given :1; - unsigned BSIM3V1ldvt2Given :1; - unsigned BSIM3V1ldvt0wGiven :1; - unsigned BSIM3V1ldvt1wGiven :1; - unsigned BSIM3V1ldvt2wGiven :1; - unsigned BSIM3V1ldroutGiven :1; - unsigned BSIM3V1ldsubGiven :1; - unsigned BSIM3V1lvth0Given :1; - unsigned BSIM3V1luaGiven :1; - unsigned BSIM3V1lua1Given :1; - unsigned BSIM3V1lubGiven :1; - unsigned BSIM3V1lub1Given :1; - unsigned BSIM3V1lucGiven :1; - unsigned BSIM3V1luc1Given :1; - unsigned BSIM3V1lu0Given :1; - unsigned BSIM3V1luteGiven :1; - unsigned BSIM3V1lvoffGiven :1; - unsigned BSIM3V1lrdswGiven :1; - unsigned BSIM3V1lprwgGiven :1; - unsigned BSIM3V1lprwbGiven :1; - unsigned BSIM3V1lprtGiven :1; - unsigned BSIM3V1leta0Given :1; - unsigned BSIM3V1letabGiven :1; - unsigned BSIM3V1lpclmGiven :1; - unsigned BSIM3V1lpdibl1Given :1; - unsigned BSIM3V1lpdibl2Given :1; - unsigned BSIM3V1lpdiblbGiven :1; - unsigned BSIM3V1lpscbe1Given :1; - unsigned BSIM3V1lpscbe2Given :1; - unsigned BSIM3V1lpvagGiven :1; - unsigned BSIM3V1ldeltaGiven :1; - unsigned BSIM3V1lwrGiven :1; - unsigned BSIM3V1ldwgGiven :1; - unsigned BSIM3V1ldwbGiven :1; - unsigned BSIM3V1lb0Given :1; - unsigned BSIM3V1lb1Given :1; - unsigned BSIM3V1lalpha0Given :1; - unsigned BSIM3V1lbeta0Given :1; + unsigned BSIM3v1lcdscGiven :1; + unsigned BSIM3v1lcdscbGiven :1; + unsigned BSIM3v1lcdscdGiven :1; + unsigned BSIM3v1lcitGiven :1; + unsigned BSIM3v1lnfactorGiven :1; + unsigned BSIM3v1lxjGiven :1; + unsigned BSIM3v1lvsatGiven :1; + unsigned BSIM3v1latGiven :1; + unsigned BSIM3v1la0Given :1; + unsigned BSIM3v1lagsGiven :1; + unsigned BSIM3v1la1Given :1; + unsigned BSIM3v1la2Given :1; + unsigned BSIM3v1lketaGiven :1; + unsigned BSIM3v1lnsubGiven :1; + unsigned BSIM3v1lnpeakGiven :1; + unsigned BSIM3v1lngateGiven :1; + unsigned BSIM3v1lgamma1Given :1; + unsigned BSIM3v1lgamma2Given :1; + unsigned BSIM3v1lvbxGiven :1; + unsigned BSIM3v1lvbmGiven :1; + unsigned BSIM3v1lxtGiven :1; + unsigned BSIM3v1lk1Given :1; + unsigned BSIM3v1lkt1Given :1; + unsigned BSIM3v1lkt1lGiven :1; + unsigned BSIM3v1lkt2Given :1; + unsigned BSIM3v1lk2Given :1; + unsigned BSIM3v1lk3Given :1; + unsigned BSIM3v1lk3bGiven :1; + unsigned BSIM3v1lw0Given :1; + unsigned BSIM3v1lnlxGiven :1; + unsigned BSIM3v1ldvt0Given :1; + unsigned BSIM3v1ldvt1Given :1; + unsigned BSIM3v1ldvt2Given :1; + unsigned BSIM3v1ldvt0wGiven :1; + unsigned BSIM3v1ldvt1wGiven :1; + unsigned BSIM3v1ldvt2wGiven :1; + unsigned BSIM3v1ldroutGiven :1; + unsigned BSIM3v1ldsubGiven :1; + unsigned BSIM3v1lvth0Given :1; + unsigned BSIM3v1luaGiven :1; + unsigned BSIM3v1lua1Given :1; + unsigned BSIM3v1lubGiven :1; + unsigned BSIM3v1lub1Given :1; + unsigned BSIM3v1lucGiven :1; + unsigned BSIM3v1luc1Given :1; + unsigned BSIM3v1lu0Given :1; + unsigned BSIM3v1luteGiven :1; + unsigned BSIM3v1lvoffGiven :1; + unsigned BSIM3v1lrdswGiven :1; + unsigned BSIM3v1lprwgGiven :1; + unsigned BSIM3v1lprwbGiven :1; + unsigned BSIM3v1lprtGiven :1; + unsigned BSIM3v1leta0Given :1; + unsigned BSIM3v1letabGiven :1; + unsigned BSIM3v1lpclmGiven :1; + unsigned BSIM3v1lpdibl1Given :1; + unsigned BSIM3v1lpdibl2Given :1; + unsigned BSIM3v1lpdiblbGiven :1; + unsigned BSIM3v1lpscbe1Given :1; + unsigned BSIM3v1lpscbe2Given :1; + unsigned BSIM3v1lpvagGiven :1; + unsigned BSIM3v1ldeltaGiven :1; + unsigned BSIM3v1lwrGiven :1; + unsigned BSIM3v1ldwgGiven :1; + unsigned BSIM3v1ldwbGiven :1; + unsigned BSIM3v1lb0Given :1; + unsigned BSIM3v1lb1Given :1; + unsigned BSIM3v1lalpha0Given :1; + unsigned BSIM3v1lbeta0Given :1; /* CV model */ - unsigned BSIM3V1lelmGiven :1; - unsigned BSIM3V1lcgslGiven :1; - unsigned BSIM3V1lcgdlGiven :1; - unsigned BSIM3V1lckappaGiven :1; - unsigned BSIM3V1lcfGiven :1; - unsigned BSIM3V1lclcGiven :1; - unsigned BSIM3V1lcleGiven :1; - unsigned BSIM3V1lvfbcvGiven :1; + unsigned BSIM3v1lelmGiven :1; + unsigned BSIM3v1lcgslGiven :1; + unsigned BSIM3v1lcgdlGiven :1; + unsigned BSIM3v1lckappaGiven :1; + unsigned BSIM3v1lcfGiven :1; + unsigned BSIM3v1lclcGiven :1; + unsigned BSIM3v1lcleGiven :1; + unsigned BSIM3v1lvfbcvGiven :1; /* Width dependence */ - unsigned BSIM3V1wcdscGiven :1; - unsigned BSIM3V1wcdscbGiven :1; - unsigned BSIM3V1wcdscdGiven :1; - unsigned BSIM3V1wcitGiven :1; - unsigned BSIM3V1wnfactorGiven :1; - unsigned BSIM3V1wxjGiven :1; - unsigned BSIM3V1wvsatGiven :1; - unsigned BSIM3V1watGiven :1; - unsigned BSIM3V1wa0Given :1; - unsigned BSIM3V1wagsGiven :1; - unsigned BSIM3V1wa1Given :1; - unsigned BSIM3V1wa2Given :1; - unsigned BSIM3V1wketaGiven :1; - unsigned BSIM3V1wnsubGiven :1; - unsigned BSIM3V1wnpeakGiven :1; - unsigned BSIM3V1wngateGiven :1; - unsigned BSIM3V1wgamma1Given :1; - unsigned BSIM3V1wgamma2Given :1; - unsigned BSIM3V1wvbxGiven :1; - unsigned BSIM3V1wvbmGiven :1; - unsigned BSIM3V1wxtGiven :1; - unsigned BSIM3V1wk1Given :1; - unsigned BSIM3V1wkt1Given :1; - unsigned BSIM3V1wkt1lGiven :1; - unsigned BSIM3V1wkt2Given :1; - unsigned BSIM3V1wk2Given :1; - unsigned BSIM3V1wk3Given :1; - unsigned BSIM3V1wk3bGiven :1; - unsigned BSIM3V1ww0Given :1; - unsigned BSIM3V1wnlxGiven :1; - unsigned BSIM3V1wdvt0Given :1; - unsigned BSIM3V1wdvt1Given :1; - unsigned BSIM3V1wdvt2Given :1; - unsigned BSIM3V1wdvt0wGiven :1; - unsigned BSIM3V1wdvt1wGiven :1; - unsigned BSIM3V1wdvt2wGiven :1; - unsigned BSIM3V1wdroutGiven :1; - unsigned BSIM3V1wdsubGiven :1; - unsigned BSIM3V1wvth0Given :1; - unsigned BSIM3V1wuaGiven :1; - unsigned BSIM3V1wua1Given :1; - unsigned BSIM3V1wubGiven :1; - unsigned BSIM3V1wub1Given :1; - unsigned BSIM3V1wucGiven :1; - unsigned BSIM3V1wuc1Given :1; - unsigned BSIM3V1wu0Given :1; - unsigned BSIM3V1wuteGiven :1; - unsigned BSIM3V1wvoffGiven :1; - unsigned BSIM3V1wrdswGiven :1; - unsigned BSIM3V1wprwgGiven :1; - unsigned BSIM3V1wprwbGiven :1; - unsigned BSIM3V1wprtGiven :1; - unsigned BSIM3V1weta0Given :1; - unsigned BSIM3V1wetabGiven :1; - unsigned BSIM3V1wpclmGiven :1; - unsigned BSIM3V1wpdibl1Given :1; - unsigned BSIM3V1wpdibl2Given :1; - unsigned BSIM3V1wpdiblbGiven :1; - unsigned BSIM3V1wpscbe1Given :1; - unsigned BSIM3V1wpscbe2Given :1; - unsigned BSIM3V1wpvagGiven :1; - unsigned BSIM3V1wdeltaGiven :1; - unsigned BSIM3V1wwrGiven :1; - unsigned BSIM3V1wdwgGiven :1; - unsigned BSIM3V1wdwbGiven :1; - unsigned BSIM3V1wb0Given :1; - unsigned BSIM3V1wb1Given :1; - unsigned BSIM3V1walpha0Given :1; - unsigned BSIM3V1wbeta0Given :1; + unsigned BSIM3v1wcdscGiven :1; + unsigned BSIM3v1wcdscbGiven :1; + unsigned BSIM3v1wcdscdGiven :1; + unsigned BSIM3v1wcitGiven :1; + unsigned BSIM3v1wnfactorGiven :1; + unsigned BSIM3v1wxjGiven :1; + unsigned BSIM3v1wvsatGiven :1; + unsigned BSIM3v1watGiven :1; + unsigned BSIM3v1wa0Given :1; + unsigned BSIM3v1wagsGiven :1; + unsigned BSIM3v1wa1Given :1; + unsigned BSIM3v1wa2Given :1; + unsigned BSIM3v1wketaGiven :1; + unsigned BSIM3v1wnsubGiven :1; + unsigned BSIM3v1wnpeakGiven :1; + unsigned BSIM3v1wngateGiven :1; + unsigned BSIM3v1wgamma1Given :1; + unsigned BSIM3v1wgamma2Given :1; + unsigned BSIM3v1wvbxGiven :1; + unsigned BSIM3v1wvbmGiven :1; + unsigned BSIM3v1wxtGiven :1; + unsigned BSIM3v1wk1Given :1; + unsigned BSIM3v1wkt1Given :1; + unsigned BSIM3v1wkt1lGiven :1; + unsigned BSIM3v1wkt2Given :1; + unsigned BSIM3v1wk2Given :1; + unsigned BSIM3v1wk3Given :1; + unsigned BSIM3v1wk3bGiven :1; + unsigned BSIM3v1ww0Given :1; + unsigned BSIM3v1wnlxGiven :1; + unsigned BSIM3v1wdvt0Given :1; + unsigned BSIM3v1wdvt1Given :1; + unsigned BSIM3v1wdvt2Given :1; + unsigned BSIM3v1wdvt0wGiven :1; + unsigned BSIM3v1wdvt1wGiven :1; + unsigned BSIM3v1wdvt2wGiven :1; + unsigned BSIM3v1wdroutGiven :1; + unsigned BSIM3v1wdsubGiven :1; + unsigned BSIM3v1wvth0Given :1; + unsigned BSIM3v1wuaGiven :1; + unsigned BSIM3v1wua1Given :1; + unsigned BSIM3v1wubGiven :1; + unsigned BSIM3v1wub1Given :1; + unsigned BSIM3v1wucGiven :1; + unsigned BSIM3v1wuc1Given :1; + unsigned BSIM3v1wu0Given :1; + unsigned BSIM3v1wuteGiven :1; + unsigned BSIM3v1wvoffGiven :1; + unsigned BSIM3v1wrdswGiven :1; + unsigned BSIM3v1wprwgGiven :1; + unsigned BSIM3v1wprwbGiven :1; + unsigned BSIM3v1wprtGiven :1; + unsigned BSIM3v1weta0Given :1; + unsigned BSIM3v1wetabGiven :1; + unsigned BSIM3v1wpclmGiven :1; + unsigned BSIM3v1wpdibl1Given :1; + unsigned BSIM3v1wpdibl2Given :1; + unsigned BSIM3v1wpdiblbGiven :1; + unsigned BSIM3v1wpscbe1Given :1; + unsigned BSIM3v1wpscbe2Given :1; + unsigned BSIM3v1wpvagGiven :1; + unsigned BSIM3v1wdeltaGiven :1; + unsigned BSIM3v1wwrGiven :1; + unsigned BSIM3v1wdwgGiven :1; + unsigned BSIM3v1wdwbGiven :1; + unsigned BSIM3v1wb0Given :1; + unsigned BSIM3v1wb1Given :1; + unsigned BSIM3v1walpha0Given :1; + unsigned BSIM3v1wbeta0Given :1; /* CV model */ - unsigned BSIM3V1welmGiven :1; - unsigned BSIM3V1wcgslGiven :1; - unsigned BSIM3V1wcgdlGiven :1; - unsigned BSIM3V1wckappaGiven :1; - unsigned BSIM3V1wcfGiven :1; - unsigned BSIM3V1wclcGiven :1; - unsigned BSIM3V1wcleGiven :1; - unsigned BSIM3V1wvfbcvGiven :1; + unsigned BSIM3v1welmGiven :1; + unsigned BSIM3v1wcgslGiven :1; + unsigned BSIM3v1wcgdlGiven :1; + unsigned BSIM3v1wckappaGiven :1; + unsigned BSIM3v1wcfGiven :1; + unsigned BSIM3v1wclcGiven :1; + unsigned BSIM3v1wcleGiven :1; + unsigned BSIM3v1wvfbcvGiven :1; /* Cross-term dependence */ - unsigned BSIM3V1pcdscGiven :1; - unsigned BSIM3V1pcdscbGiven :1; - unsigned BSIM3V1pcdscdGiven :1; - unsigned BSIM3V1pcitGiven :1; - unsigned BSIM3V1pnfactorGiven :1; - unsigned BSIM3V1pxjGiven :1; - unsigned BSIM3V1pvsatGiven :1; - unsigned BSIM3V1patGiven :1; - unsigned BSIM3V1pa0Given :1; - unsigned BSIM3V1pagsGiven :1; - unsigned BSIM3V1pa1Given :1; - unsigned BSIM3V1pa2Given :1; - unsigned BSIM3V1pketaGiven :1; - unsigned BSIM3V1pnsubGiven :1; - unsigned BSIM3V1pnpeakGiven :1; - unsigned BSIM3V1pngateGiven :1; - unsigned BSIM3V1pgamma1Given :1; - unsigned BSIM3V1pgamma2Given :1; - unsigned BSIM3V1pvbxGiven :1; - unsigned BSIM3V1pvbmGiven :1; - unsigned BSIM3V1pxtGiven :1; - unsigned BSIM3V1pk1Given :1; - unsigned BSIM3V1pkt1Given :1; - unsigned BSIM3V1pkt1lGiven :1; - unsigned BSIM3V1pkt2Given :1; - unsigned BSIM3V1pk2Given :1; - unsigned BSIM3V1pk3Given :1; - unsigned BSIM3V1pk3bGiven :1; - unsigned BSIM3V1pw0Given :1; - unsigned BSIM3V1pnlxGiven :1; - unsigned BSIM3V1pdvt0Given :1; - unsigned BSIM3V1pdvt1Given :1; - unsigned BSIM3V1pdvt2Given :1; - unsigned BSIM3V1pdvt0wGiven :1; - unsigned BSIM3V1pdvt1wGiven :1; - unsigned BSIM3V1pdvt2wGiven :1; - unsigned BSIM3V1pdroutGiven :1; - unsigned BSIM3V1pdsubGiven :1; - unsigned BSIM3V1pvth0Given :1; - unsigned BSIM3V1puaGiven :1; - unsigned BSIM3V1pua1Given :1; - unsigned BSIM3V1pubGiven :1; - unsigned BSIM3V1pub1Given :1; - unsigned BSIM3V1pucGiven :1; - unsigned BSIM3V1puc1Given :1; - unsigned BSIM3V1pu0Given :1; - unsigned BSIM3V1puteGiven :1; - unsigned BSIM3V1pvoffGiven :1; - unsigned BSIM3V1prdswGiven :1; - unsigned BSIM3V1pprwgGiven :1; - unsigned BSIM3V1pprwbGiven :1; - unsigned BSIM3V1pprtGiven :1; - unsigned BSIM3V1peta0Given :1; - unsigned BSIM3V1petabGiven :1; - unsigned BSIM3V1ppclmGiven :1; - unsigned BSIM3V1ppdibl1Given :1; - unsigned BSIM3V1ppdibl2Given :1; - unsigned BSIM3V1ppdiblbGiven :1; - unsigned BSIM3V1ppscbe1Given :1; - unsigned BSIM3V1ppscbe2Given :1; - unsigned BSIM3V1ppvagGiven :1; - unsigned BSIM3V1pdeltaGiven :1; - unsigned BSIM3V1pwrGiven :1; - unsigned BSIM3V1pdwgGiven :1; - unsigned BSIM3V1pdwbGiven :1; - unsigned BSIM3V1pb0Given :1; - unsigned BSIM3V1pb1Given :1; - unsigned BSIM3V1palpha0Given :1; - unsigned BSIM3V1pbeta0Given :1; + unsigned BSIM3v1pcdscGiven :1; + unsigned BSIM3v1pcdscbGiven :1; + unsigned BSIM3v1pcdscdGiven :1; + unsigned BSIM3v1pcitGiven :1; + unsigned BSIM3v1pnfactorGiven :1; + unsigned BSIM3v1pxjGiven :1; + unsigned BSIM3v1pvsatGiven :1; + unsigned BSIM3v1patGiven :1; + unsigned BSIM3v1pa0Given :1; + unsigned BSIM3v1pagsGiven :1; + unsigned BSIM3v1pa1Given :1; + unsigned BSIM3v1pa2Given :1; + unsigned BSIM3v1pketaGiven :1; + unsigned BSIM3v1pnsubGiven :1; + unsigned BSIM3v1pnpeakGiven :1; + unsigned BSIM3v1pngateGiven :1; + unsigned BSIM3v1pgamma1Given :1; + unsigned BSIM3v1pgamma2Given :1; + unsigned BSIM3v1pvbxGiven :1; + unsigned BSIM3v1pvbmGiven :1; + unsigned BSIM3v1pxtGiven :1; + unsigned BSIM3v1pk1Given :1; + unsigned BSIM3v1pkt1Given :1; + unsigned BSIM3v1pkt1lGiven :1; + unsigned BSIM3v1pkt2Given :1; + unsigned BSIM3v1pk2Given :1; + unsigned BSIM3v1pk3Given :1; + unsigned BSIM3v1pk3bGiven :1; + unsigned BSIM3v1pw0Given :1; + unsigned BSIM3v1pnlxGiven :1; + unsigned BSIM3v1pdvt0Given :1; + unsigned BSIM3v1pdvt1Given :1; + unsigned BSIM3v1pdvt2Given :1; + unsigned BSIM3v1pdvt0wGiven :1; + unsigned BSIM3v1pdvt1wGiven :1; + unsigned BSIM3v1pdvt2wGiven :1; + unsigned BSIM3v1pdroutGiven :1; + unsigned BSIM3v1pdsubGiven :1; + unsigned BSIM3v1pvth0Given :1; + unsigned BSIM3v1puaGiven :1; + unsigned BSIM3v1pua1Given :1; + unsigned BSIM3v1pubGiven :1; + unsigned BSIM3v1pub1Given :1; + unsigned BSIM3v1pucGiven :1; + unsigned BSIM3v1puc1Given :1; + unsigned BSIM3v1pu0Given :1; + unsigned BSIM3v1puteGiven :1; + unsigned BSIM3v1pvoffGiven :1; + unsigned BSIM3v1prdswGiven :1; + unsigned BSIM3v1pprwgGiven :1; + unsigned BSIM3v1pprwbGiven :1; + unsigned BSIM3v1pprtGiven :1; + unsigned BSIM3v1peta0Given :1; + unsigned BSIM3v1petabGiven :1; + unsigned BSIM3v1ppclmGiven :1; + unsigned BSIM3v1ppdibl1Given :1; + unsigned BSIM3v1ppdibl2Given :1; + unsigned BSIM3v1ppdiblbGiven :1; + unsigned BSIM3v1ppscbe1Given :1; + unsigned BSIM3v1ppscbe2Given :1; + unsigned BSIM3v1ppvagGiven :1; + unsigned BSIM3v1pdeltaGiven :1; + unsigned BSIM3v1pwrGiven :1; + unsigned BSIM3v1pdwgGiven :1; + unsigned BSIM3v1pdwbGiven :1; + unsigned BSIM3v1pb0Given :1; + unsigned BSIM3v1pb1Given :1; + unsigned BSIM3v1palpha0Given :1; + unsigned BSIM3v1pbeta0Given :1; /* CV model */ - unsigned BSIM3V1pelmGiven :1; - unsigned BSIM3V1pcgslGiven :1; - unsigned BSIM3V1pcgdlGiven :1; - unsigned BSIM3V1pckappaGiven :1; - unsigned BSIM3V1pcfGiven :1; - unsigned BSIM3V1pclcGiven :1; - unsigned BSIM3V1pcleGiven :1; - unsigned BSIM3V1pvfbcvGiven :1; - - unsigned BSIM3V1useFringeGiven :1; - - unsigned BSIM3V1tnomGiven :1; - unsigned BSIM3V1cgsoGiven :1; - unsigned BSIM3V1cgdoGiven :1; - unsigned BSIM3V1cgboGiven :1; - unsigned BSIM3V1xpartGiven :1; - unsigned BSIM3V1sheetResistanceGiven :1; - unsigned BSIM3V1jctSatCurDensityGiven :1; - unsigned BSIM3V1jctSidewallSatCurDensityGiven :1; - unsigned BSIM3V1bulkJctPotentialGiven :1; - unsigned BSIM3V1bulkJctBotGradingCoeffGiven :1; - unsigned BSIM3V1sidewallJctPotentialGiven :1; - unsigned BSIM3V1GatesidewallJctPotentialGiven :1; - unsigned BSIM3V1bulkJctSideGradingCoeffGiven :1; - unsigned BSIM3V1unitAreaJctCapGiven :1; - unsigned BSIM3V1unitLengthSidewallJctCapGiven :1; - unsigned BSIM3V1bulkJctGateSideGradingCoeffGiven :1; - unsigned BSIM3V1unitLengthGateSidewallJctCapGiven :1; - unsigned BSIM3V1jctEmissionCoeffGiven :1; - unsigned BSIM3V1jctTempExponentGiven :1; - - unsigned BSIM3V1oxideTrapDensityAGiven :1; - unsigned BSIM3V1oxideTrapDensityBGiven :1; - unsigned BSIM3V1oxideTrapDensityCGiven :1; - unsigned BSIM3V1emGiven :1; - unsigned BSIM3V1efGiven :1; - unsigned BSIM3V1afGiven :1; - unsigned BSIM3V1kfGiven :1; - - unsigned BSIM3V1LintGiven :1; - unsigned BSIM3V1LlGiven :1; - unsigned BSIM3V1LlnGiven :1; - unsigned BSIM3V1LwGiven :1; - unsigned BSIM3V1LwnGiven :1; - unsigned BSIM3V1LwlGiven :1; - unsigned BSIM3V1LminGiven :1; - unsigned BSIM3V1LmaxGiven :1; - - unsigned BSIM3V1WintGiven :1; - unsigned BSIM3V1WlGiven :1; - unsigned BSIM3V1WlnGiven :1; - unsigned BSIM3V1WwGiven :1; - unsigned BSIM3V1WwnGiven :1; - unsigned BSIM3V1WwlGiven :1; - unsigned BSIM3V1WminGiven :1; - unsigned BSIM3V1WmaxGiven :1; - -} BSIM3V1model; + unsigned BSIM3v1pelmGiven :1; + unsigned BSIM3v1pcgslGiven :1; + unsigned BSIM3v1pcgdlGiven :1; + unsigned BSIM3v1pckappaGiven :1; + unsigned BSIM3v1pcfGiven :1; + unsigned BSIM3v1pclcGiven :1; + unsigned BSIM3v1pcleGiven :1; + unsigned BSIM3v1pvfbcvGiven :1; + + unsigned BSIM3v1useFringeGiven :1; + + unsigned BSIM3v1tnomGiven :1; + unsigned BSIM3v1cgsoGiven :1; + unsigned BSIM3v1cgdoGiven :1; + unsigned BSIM3v1cgboGiven :1; + unsigned BSIM3v1xpartGiven :1; + unsigned BSIM3v1sheetResistanceGiven :1; + unsigned BSIM3v1jctSatCurDensityGiven :1; + unsigned BSIM3v1jctSidewallSatCurDensityGiven :1; + unsigned BSIM3v1bulkJctPotentialGiven :1; + unsigned BSIM3v1bulkJctBotGradingCoeffGiven :1; + unsigned BSIM3v1sidewallJctPotentialGiven :1; + unsigned BSIM3v1GatesidewallJctPotentialGiven :1; + unsigned BSIM3v1bulkJctSideGradingCoeffGiven :1; + unsigned BSIM3v1unitAreaJctCapGiven :1; + unsigned BSIM3v1unitLengthSidewallJctCapGiven :1; + unsigned BSIM3v1bulkJctGateSideGradingCoeffGiven :1; + unsigned BSIM3v1unitLengthGateSidewallJctCapGiven :1; + unsigned BSIM3v1jctEmissionCoeffGiven :1; + unsigned BSIM3v1jctTempExponentGiven :1; + + unsigned BSIM3v1oxideTrapDensityAGiven :1; + unsigned BSIM3v1oxideTrapDensityBGiven :1; + unsigned BSIM3v1oxideTrapDensityCGiven :1; + unsigned BSIM3v1emGiven :1; + unsigned BSIM3v1efGiven :1; + unsigned BSIM3v1afGiven :1; + unsigned BSIM3v1kfGiven :1; + + unsigned BSIM3v1LintGiven :1; + unsigned BSIM3v1LlGiven :1; + unsigned BSIM3v1LlnGiven :1; + unsigned BSIM3v1LwGiven :1; + unsigned BSIM3v1LwnGiven :1; + unsigned BSIM3v1LwlGiven :1; + unsigned BSIM3v1LminGiven :1; + unsigned BSIM3v1LmaxGiven :1; + + unsigned BSIM3v1WintGiven :1; + unsigned BSIM3v1WlGiven :1; + unsigned BSIM3v1WlnGiven :1; + unsigned BSIM3v1WwGiven :1; + unsigned BSIM3v1WwnGiven :1; + unsigned BSIM3v1WwlGiven :1; + unsigned BSIM3v1WminGiven :1; + unsigned BSIM3v1WmaxGiven :1; + +} BSIM3v1model; #ifndef NMOS @@ -1121,512 +1120,510 @@ typedef struct sBSIM3V1model /* device parameters */ -#define BSIM3V1_W 1 -#define BSIM3V1_L 2 -#define BSIM3V1_AS 3 -#define BSIM3V1_AD 4 -#define BSIM3V1_PS 5 -#define BSIM3V1_PD 6 -#define BSIM3V1_NRS 7 -#define BSIM3V1_NRD 8 -#define BSIM3V1_OFF 9 -#define BSIM3V1_IC_VBS 10 -#define BSIM3V1_IC_VDS 11 -#define BSIM3V1_IC_VGS 12 -#define BSIM3V1_IC 13 -#define BSIM3V1_NQSMOD 14 -#define BSIM3V1_M 20 +#define BSIM3v1_W 1 +#define BSIM3v1_L 2 +#define BSIM3v1_M 15 +#define BSIM3v1_AS 3 +#define BSIM3v1_AD 4 +#define BSIM3v1_PS 5 +#define BSIM3v1_PD 6 +#define BSIM3v1_NRS 7 +#define BSIM3v1_NRD 8 +#define BSIM3v1_OFF 9 +#define BSIM3v1_IC_VBS 10 +#define BSIM3v1_IC_VDS 11 +#define BSIM3v1_IC_VGS 12 +#define BSIM3v1_IC 13 +#define BSIM3v1_NQSMOD 14 /* model parameters */ -#define BSIM3V1_MOD_CAPMOD 101 -#define BSIM3V1_MOD_NQSMOD 102 -#define BSIM3V1_MOD_MOBMOD 103 -#define BSIM3V1_MOD_NOIMOD 104 - -#define BSIM3V1_MOD_TOX 105 - -#define BSIM3V1_MOD_CDSC 106 -#define BSIM3V1_MOD_CDSCB 107 -#define BSIM3V1_MOD_CIT 108 -#define BSIM3V1_MOD_NFACTOR 109 -#define BSIM3V1_MOD_XJ 110 -#define BSIM3V1_MOD_VSAT 111 -#define BSIM3V1_MOD_AT 112 -#define BSIM3V1_MOD_A0 113 -#define BSIM3V1_MOD_A1 114 -#define BSIM3V1_MOD_A2 115 -#define BSIM3V1_MOD_KETA 116 -#define BSIM3V1_MOD_NSUB 117 -#define BSIM3V1_MOD_NPEAK 118 -#define BSIM3V1_MOD_NGATE 120 -#define BSIM3V1_MOD_GAMMA1 121 -#define BSIM3V1_MOD_GAMMA2 122 -#define BSIM3V1_MOD_VBX 123 -#define BSIM3V1_MOD_BINUNIT 124 - -#define BSIM3V1_MOD_VBM 125 - -#define BSIM3V1_MOD_XT 126 -#define BSIM3V1_MOD_K1 129 -#define BSIM3V1_MOD_KT1 130 -#define BSIM3V1_MOD_KT1L 131 -#define BSIM3V1_MOD_K2 132 -#define BSIM3V1_MOD_KT2 133 -#define BSIM3V1_MOD_K3 134 -#define BSIM3V1_MOD_K3B 135 -#define BSIM3V1_MOD_W0 136 -#define BSIM3V1_MOD_NLX 137 - -#define BSIM3V1_MOD_DVT0 138 -#define BSIM3V1_MOD_DVT1 139 -#define BSIM3V1_MOD_DVT2 140 - -#define BSIM3V1_MOD_DVT0W 141 -#define BSIM3V1_MOD_DVT1W 142 -#define BSIM3V1_MOD_DVT2W 143 - -#define BSIM3V1_MOD_DROUT 144 -#define BSIM3V1_MOD_DSUB 145 -#define BSIM3V1_MOD_VTH0 146 -#define BSIM3V1_MOD_UA 147 -#define BSIM3V1_MOD_UA1 148 -#define BSIM3V1_MOD_UB 149 -#define BSIM3V1_MOD_UB1 150 -#define BSIM3V1_MOD_UC 151 -#define BSIM3V1_MOD_UC1 152 -#define BSIM3V1_MOD_U0 153 -#define BSIM3V1_MOD_UTE 154 -#define BSIM3V1_MOD_VOFF 155 -#define BSIM3V1_MOD_DELTA 156 -#define BSIM3V1_MOD_RDSW 157 -#define BSIM3V1_MOD_PRT 158 -#define BSIM3V1_MOD_LDD 159 -#define BSIM3V1_MOD_ETA 160 -#define BSIM3V1_MOD_ETA0 161 -#define BSIM3V1_MOD_ETAB 162 -#define BSIM3V1_MOD_PCLM 163 -#define BSIM3V1_MOD_PDIBL1 164 -#define BSIM3V1_MOD_PDIBL2 165 -#define BSIM3V1_MOD_PSCBE1 166 -#define BSIM3V1_MOD_PSCBE2 167 -#define BSIM3V1_MOD_PVAG 168 -#define BSIM3V1_MOD_WR 169 -#define BSIM3V1_MOD_DWG 170 -#define BSIM3V1_MOD_DWB 171 -#define BSIM3V1_MOD_B0 172 -#define BSIM3V1_MOD_B1 173 -#define BSIM3V1_MOD_ALPHA0 174 -#define BSIM3V1_MOD_BETA0 175 -#define BSIM3V1_MOD_PDIBLB 178 - -#define BSIM3V1_MOD_PRWG 179 -#define BSIM3V1_MOD_PRWB 180 - -#define BSIM3V1_MOD_CDSCD 181 -#define BSIM3V1_MOD_AGS 182 - -#define BSIM3V1_MOD_FRINGE 184 -#define BSIM3V1_MOD_ELM 185 -#define BSIM3V1_MOD_CGSL 186 -#define BSIM3V1_MOD_CGDL 187 -#define BSIM3V1_MOD_CKAPPA 188 -#define BSIM3V1_MOD_CF 189 -#define BSIM3V1_MOD_CLC 190 -#define BSIM3V1_MOD_CLE 191 -#define BSIM3V1_MOD_PARAMCHK 192 -#define BSIM3V1_MOD_VERSION 193 -#define BSIM3V1_MOD_VFBCV 194 - -#define BSIM3V1_MOD_HDIF 198 +#define BSIM3v1_MOD_CAPMOD 101 +#define BSIM3v1_MOD_NQSMOD 102 +#define BSIM3v1_MOD_MOBMOD 103 +#define BSIM3v1_MOD_NOIMOD 104 + +#define BSIM3v1_MOD_TOX 105 + +#define BSIM3v1_MOD_CDSC 106 +#define BSIM3v1_MOD_CDSCB 107 +#define BSIM3v1_MOD_CIT 108 +#define BSIM3v1_MOD_NFACTOR 109 +#define BSIM3v1_MOD_XJ 110 +#define BSIM3v1_MOD_VSAT 111 +#define BSIM3v1_MOD_AT 112 +#define BSIM3v1_MOD_A0 113 +#define BSIM3v1_MOD_A1 114 +#define BSIM3v1_MOD_A2 115 +#define BSIM3v1_MOD_KETA 116 +#define BSIM3v1_MOD_NSUB 117 +#define BSIM3v1_MOD_NPEAK 118 +#define BSIM3v1_MOD_NGATE 120 +#define BSIM3v1_MOD_GAMMA1 121 +#define BSIM3v1_MOD_GAMMA2 122 +#define BSIM3v1_MOD_VBX 123 +#define BSIM3v1_MOD_BINUNIT 124 + +#define BSIM3v1_MOD_VBM 125 + +#define BSIM3v1_MOD_XT 126 +#define BSIM3v1_MOD_K1 129 +#define BSIM3v1_MOD_KT1 130 +#define BSIM3v1_MOD_KT1L 131 +#define BSIM3v1_MOD_K2 132 +#define BSIM3v1_MOD_KT2 133 +#define BSIM3v1_MOD_K3 134 +#define BSIM3v1_MOD_K3B 135 +#define BSIM3v1_MOD_W0 136 +#define BSIM3v1_MOD_NLX 137 + +#define BSIM3v1_MOD_DVT0 138 +#define BSIM3v1_MOD_DVT1 139 +#define BSIM3v1_MOD_DVT2 140 + +#define BSIM3v1_MOD_DVT0W 141 +#define BSIM3v1_MOD_DVT1W 142 +#define BSIM3v1_MOD_DVT2W 143 + +#define BSIM3v1_MOD_DROUT 144 +#define BSIM3v1_MOD_DSUB 145 +#define BSIM3v1_MOD_VTH0 146 +#define BSIM3v1_MOD_UA 147 +#define BSIM3v1_MOD_UA1 148 +#define BSIM3v1_MOD_UB 149 +#define BSIM3v1_MOD_UB1 150 +#define BSIM3v1_MOD_UC 151 +#define BSIM3v1_MOD_UC1 152 +#define BSIM3v1_MOD_U0 153 +#define BSIM3v1_MOD_UTE 154 +#define BSIM3v1_MOD_VOFF 155 +#define BSIM3v1_MOD_DELTA 156 +#define BSIM3v1_MOD_RDSW 157 +#define BSIM3v1_MOD_PRT 158 +#define BSIM3v1_MOD_LDD 159 +#define BSIM3v1_MOD_ETA 160 +#define BSIM3v1_MOD_ETA0 161 +#define BSIM3v1_MOD_ETAB 162 +#define BSIM3v1_MOD_PCLM 163 +#define BSIM3v1_MOD_PDIBL1 164 +#define BSIM3v1_MOD_PDIBL2 165 +#define BSIM3v1_MOD_PSCBE1 166 +#define BSIM3v1_MOD_PSCBE2 167 +#define BSIM3v1_MOD_PVAG 168 +#define BSIM3v1_MOD_WR 169 +#define BSIM3v1_MOD_DWG 170 +#define BSIM3v1_MOD_DWB 171 +#define BSIM3v1_MOD_B0 172 +#define BSIM3v1_MOD_B1 173 +#define BSIM3v1_MOD_ALPHA0 174 +#define BSIM3v1_MOD_BETA0 175 +#define BSIM3v1_MOD_PDIBLB 178 + +#define BSIM3v1_MOD_PRWG 179 +#define BSIM3v1_MOD_PRWB 180 + +#define BSIM3v1_MOD_CDSCD 181 +#define BSIM3v1_MOD_AGS 182 + +#define BSIM3v1_MOD_FRINGE 184 +#define BSIM3v1_MOD_ELM 185 +#define BSIM3v1_MOD_CGSL 186 +#define BSIM3v1_MOD_CGDL 187 +#define BSIM3v1_MOD_CKAPPA 188 +#define BSIM3v1_MOD_CF 189 +#define BSIM3v1_MOD_CLC 190 +#define BSIM3v1_MOD_CLE 191 +#define BSIM3v1_MOD_PARAMCHK 192 +#define BSIM3v1_MOD_VERSION 193 +#define BSIM3v1_MOD_VFBCV 194 /* Length dependence */ -#define BSIM3V1_MOD_LCDSC 201 -#define BSIM3V1_MOD_LCDSCB 202 -#define BSIM3V1_MOD_LCIT 203 -#define BSIM3V1_MOD_LNFACTOR 204 -#define BSIM3V1_MOD_LXJ 205 -#define BSIM3V1_MOD_LVSAT 206 -#define BSIM3V1_MOD_LAT 207 -#define BSIM3V1_MOD_LA0 208 -#define BSIM3V1_MOD_LA1 209 -#define BSIM3V1_MOD_LA2 210 -#define BSIM3V1_MOD_LKETA 211 -#define BSIM3V1_MOD_LNSUB 212 -#define BSIM3V1_MOD_LNPEAK 213 -#define BSIM3V1_MOD_LNGATE 215 -#define BSIM3V1_MOD_LGAMMA1 216 -#define BSIM3V1_MOD_LGAMMA2 217 -#define BSIM3V1_MOD_LVBX 218 - -#define BSIM3V1_MOD_LVBM 220 - -#define BSIM3V1_MOD_LXT 222 -#define BSIM3V1_MOD_LK1 225 -#define BSIM3V1_MOD_LKT1 226 -#define BSIM3V1_MOD_LKT1L 227 -#define BSIM3V1_MOD_LK2 228 -#define BSIM3V1_MOD_LKT2 229 -#define BSIM3V1_MOD_LK3 230 -#define BSIM3V1_MOD_LK3B 231 -#define BSIM3V1_MOD_LW0 232 -#define BSIM3V1_MOD_LNLX 233 - -#define BSIM3V1_MOD_LDVT0 234 -#define BSIM3V1_MOD_LDVT1 235 -#define BSIM3V1_MOD_LDVT2 236 - -#define BSIM3V1_MOD_LDVT0W 237 -#define BSIM3V1_MOD_LDVT1W 238 -#define BSIM3V1_MOD_LDVT2W 239 - -#define BSIM3V1_MOD_LDROUT 240 -#define BSIM3V1_MOD_LDSUB 241 -#define BSIM3V1_MOD_LVTH0 242 -#define BSIM3V1_MOD_LUA 243 -#define BSIM3V1_MOD_LUA1 244 -#define BSIM3V1_MOD_LUB 245 -#define BSIM3V1_MOD_LUB1 246 -#define BSIM3V1_MOD_LUC 247 -#define BSIM3V1_MOD_LUC1 248 -#define BSIM3V1_MOD_LU0 249 -#define BSIM3V1_MOD_LUTE 250 -#define BSIM3V1_MOD_LVOFF 251 -#define BSIM3V1_MOD_LDELTA 252 -#define BSIM3V1_MOD_LRDSW 253 -#define BSIM3V1_MOD_LPRT 254 -#define BSIM3V1_MOD_LLDD 255 -#define BSIM3V1_MOD_LETA 256 -#define BSIM3V1_MOD_LETA0 257 -#define BSIM3V1_MOD_LETAB 258 -#define BSIM3V1_MOD_LPCLM 259 -#define BSIM3V1_MOD_LPDIBL1 260 -#define BSIM3V1_MOD_LPDIBL2 261 -#define BSIM3V1_MOD_LPSCBE1 262 -#define BSIM3V1_MOD_LPSCBE2 263 -#define BSIM3V1_MOD_LPVAG 264 -#define BSIM3V1_MOD_LWR 265 -#define BSIM3V1_MOD_LDWG 266 -#define BSIM3V1_MOD_LDWB 267 -#define BSIM3V1_MOD_LB0 268 -#define BSIM3V1_MOD_LB1 269 -#define BSIM3V1_MOD_LALPHA0 270 -#define BSIM3V1_MOD_LBETA0 271 -#define BSIM3V1_MOD_LPDIBLB 274 - -#define BSIM3V1_MOD_LPRWG 275 -#define BSIM3V1_MOD_LPRWB 276 - -#define BSIM3V1_MOD_LCDSCD 277 -#define BSIM3V1_MOD_LAGS 278 +#define BSIM3v1_MOD_LCDSC 201 +#define BSIM3v1_MOD_LCDSCB 202 +#define BSIM3v1_MOD_LCIT 203 +#define BSIM3v1_MOD_LNFACTOR 204 +#define BSIM3v1_MOD_LXJ 205 +#define BSIM3v1_MOD_LVSAT 206 +#define BSIM3v1_MOD_LAT 207 +#define BSIM3v1_MOD_LA0 208 +#define BSIM3v1_MOD_LA1 209 +#define BSIM3v1_MOD_LA2 210 +#define BSIM3v1_MOD_LKETA 211 +#define BSIM3v1_MOD_LNSUB 212 +#define BSIM3v1_MOD_LNPEAK 213 +#define BSIM3v1_MOD_LNGATE 215 +#define BSIM3v1_MOD_LGAMMA1 216 +#define BSIM3v1_MOD_LGAMMA2 217 +#define BSIM3v1_MOD_LVBX 218 + +#define BSIM3v1_MOD_LVBM 220 + +#define BSIM3v1_MOD_LXT 222 +#define BSIM3v1_MOD_LK1 225 +#define BSIM3v1_MOD_LKT1 226 +#define BSIM3v1_MOD_LKT1L 227 +#define BSIM3v1_MOD_LK2 228 +#define BSIM3v1_MOD_LKT2 229 +#define BSIM3v1_MOD_LK3 230 +#define BSIM3v1_MOD_LK3B 231 +#define BSIM3v1_MOD_LW0 232 +#define BSIM3v1_MOD_LNLX 233 + +#define BSIM3v1_MOD_LDVT0 234 +#define BSIM3v1_MOD_LDVT1 235 +#define BSIM3v1_MOD_LDVT2 236 + +#define BSIM3v1_MOD_LDVT0W 237 +#define BSIM3v1_MOD_LDVT1W 238 +#define BSIM3v1_MOD_LDVT2W 239 + +#define BSIM3v1_MOD_LDROUT 240 +#define BSIM3v1_MOD_LDSUB 241 +#define BSIM3v1_MOD_LVTH0 242 +#define BSIM3v1_MOD_LUA 243 +#define BSIM3v1_MOD_LUA1 244 +#define BSIM3v1_MOD_LUB 245 +#define BSIM3v1_MOD_LUB1 246 +#define BSIM3v1_MOD_LUC 247 +#define BSIM3v1_MOD_LUC1 248 +#define BSIM3v1_MOD_LU0 249 +#define BSIM3v1_MOD_LUTE 250 +#define BSIM3v1_MOD_LVOFF 251 +#define BSIM3v1_MOD_LDELTA 252 +#define BSIM3v1_MOD_LRDSW 253 +#define BSIM3v1_MOD_LPRT 254 +#define BSIM3v1_MOD_LLDD 255 +#define BSIM3v1_MOD_LETA 256 +#define BSIM3v1_MOD_LETA0 257 +#define BSIM3v1_MOD_LETAB 258 +#define BSIM3v1_MOD_LPCLM 259 +#define BSIM3v1_MOD_LPDIBL1 260 +#define BSIM3v1_MOD_LPDIBL2 261 +#define BSIM3v1_MOD_LPSCBE1 262 +#define BSIM3v1_MOD_LPSCBE2 263 +#define BSIM3v1_MOD_LPVAG 264 +#define BSIM3v1_MOD_LWR 265 +#define BSIM3v1_MOD_LDWG 266 +#define BSIM3v1_MOD_LDWB 267 +#define BSIM3v1_MOD_LB0 268 +#define BSIM3v1_MOD_LB1 269 +#define BSIM3v1_MOD_LALPHA0 270 +#define BSIM3v1_MOD_LBETA0 271 +#define BSIM3v1_MOD_LPDIBLB 274 + +#define BSIM3v1_MOD_LPRWG 275 +#define BSIM3v1_MOD_LPRWB 276 + +#define BSIM3v1_MOD_LCDSCD 277 +#define BSIM3v1_MOD_LAGS 278 -#define BSIM3V1_MOD_LFRINGE 281 -#define BSIM3V1_MOD_LELM 282 -#define BSIM3V1_MOD_LCGSL 283 -#define BSIM3V1_MOD_LCGDL 284 -#define BSIM3V1_MOD_LCKAPPA 285 -#define BSIM3V1_MOD_LCF 286 -#define BSIM3V1_MOD_LCLC 287 -#define BSIM3V1_MOD_LCLE 288 -#define BSIM3V1_MOD_LVFBCV 289 +#define BSIM3v1_MOD_LFRINGE 281 +#define BSIM3v1_MOD_LELM 282 +#define BSIM3v1_MOD_LCGSL 283 +#define BSIM3v1_MOD_LCGDL 284 +#define BSIM3v1_MOD_LCKAPPA 285 +#define BSIM3v1_MOD_LCF 286 +#define BSIM3v1_MOD_LCLC 287 +#define BSIM3v1_MOD_LCLE 288 +#define BSIM3v1_MOD_LVFBCV 289 /* Width dependence */ -#define BSIM3V1_MOD_WCDSC 301 -#define BSIM3V1_MOD_WCDSCB 302 -#define BSIM3V1_MOD_WCIT 303 -#define BSIM3V1_MOD_WNFACTOR 304 -#define BSIM3V1_MOD_WXJ 305 -#define BSIM3V1_MOD_WVSAT 306 -#define BSIM3V1_MOD_WAT 307 -#define BSIM3V1_MOD_WA0 308 -#define BSIM3V1_MOD_WA1 309 -#define BSIM3V1_MOD_WA2 310 -#define BSIM3V1_MOD_WKETA 311 -#define BSIM3V1_MOD_WNSUB 312 -#define BSIM3V1_MOD_WNPEAK 313 -#define BSIM3V1_MOD_WNGATE 315 -#define BSIM3V1_MOD_WGAMMA1 316 -#define BSIM3V1_MOD_WGAMMA2 317 -#define BSIM3V1_MOD_WVBX 318 - -#define BSIM3V1_MOD_WVBM 320 - -#define BSIM3V1_MOD_WXT 322 -#define BSIM3V1_MOD_WK1 325 -#define BSIM3V1_MOD_WKT1 326 -#define BSIM3V1_MOD_WKT1L 327 -#define BSIM3V1_MOD_WK2 328 -#define BSIM3V1_MOD_WKT2 329 -#define BSIM3V1_MOD_WK3 330 -#define BSIM3V1_MOD_WK3B 331 -#define BSIM3V1_MOD_WW0 332 -#define BSIM3V1_MOD_WNLX 333 - -#define BSIM3V1_MOD_WDVT0 334 -#define BSIM3V1_MOD_WDVT1 335 -#define BSIM3V1_MOD_WDVT2 336 - -#define BSIM3V1_MOD_WDVT0W 337 -#define BSIM3V1_MOD_WDVT1W 338 -#define BSIM3V1_MOD_WDVT2W 339 - -#define BSIM3V1_MOD_WDROUT 340 -#define BSIM3V1_MOD_WDSUB 341 -#define BSIM3V1_MOD_WVTH0 342 -#define BSIM3V1_MOD_WUA 343 -#define BSIM3V1_MOD_WUA1 344 -#define BSIM3V1_MOD_WUB 345 -#define BSIM3V1_MOD_WUB1 346 -#define BSIM3V1_MOD_WUC 347 -#define BSIM3V1_MOD_WUC1 348 -#define BSIM3V1_MOD_WU0 349 -#define BSIM3V1_MOD_WUTE 350 -#define BSIM3V1_MOD_WVOFF 351 -#define BSIM3V1_MOD_WDELTA 352 -#define BSIM3V1_MOD_WRDSW 353 -#define BSIM3V1_MOD_WPRT 354 -#define BSIM3V1_MOD_WLDD 355 -#define BSIM3V1_MOD_WETA 356 -#define BSIM3V1_MOD_WETA0 357 -#define BSIM3V1_MOD_WETAB 358 -#define BSIM3V1_MOD_WPCLM 359 -#define BSIM3V1_MOD_WPDIBL1 360 -#define BSIM3V1_MOD_WPDIBL2 361 -#define BSIM3V1_MOD_WPSCBE1 362 -#define BSIM3V1_MOD_WPSCBE2 363 -#define BSIM3V1_MOD_WPVAG 364 -#define BSIM3V1_MOD_WWR 365 -#define BSIM3V1_MOD_WDWG 366 -#define BSIM3V1_MOD_WDWB 367 -#define BSIM3V1_MOD_WB0 368 -#define BSIM3V1_MOD_WB1 369 -#define BSIM3V1_MOD_WALPHA0 370 -#define BSIM3V1_MOD_WBETA0 371 -#define BSIM3V1_MOD_WPDIBLB 374 - -#define BSIM3V1_MOD_WPRWG 375 -#define BSIM3V1_MOD_WPRWB 376 - -#define BSIM3V1_MOD_WCDSCD 377 -#define BSIM3V1_MOD_WAGS 378 - - -#define BSIM3V1_MOD_WFRINGE 381 -#define BSIM3V1_MOD_WELM 382 -#define BSIM3V1_MOD_WCGSL 383 -#define BSIM3V1_MOD_WCGDL 384 -#define BSIM3V1_MOD_WCKAPPA 385 -#define BSIM3V1_MOD_WCF 386 -#define BSIM3V1_MOD_WCLC 387 -#define BSIM3V1_MOD_WCLE 388 -#define BSIM3V1_MOD_WVFBCV 389 +#define BSIM3v1_MOD_WCDSC 301 +#define BSIM3v1_MOD_WCDSCB 302 +#define BSIM3v1_MOD_WCIT 303 +#define BSIM3v1_MOD_WNFACTOR 304 +#define BSIM3v1_MOD_WXJ 305 +#define BSIM3v1_MOD_WVSAT 306 +#define BSIM3v1_MOD_WAT 307 +#define BSIM3v1_MOD_WA0 308 +#define BSIM3v1_MOD_WA1 309 +#define BSIM3v1_MOD_WA2 310 +#define BSIM3v1_MOD_WKETA 311 +#define BSIM3v1_MOD_WNSUB 312 +#define BSIM3v1_MOD_WNPEAK 313 +#define BSIM3v1_MOD_WNGATE 315 +#define BSIM3v1_MOD_WGAMMA1 316 +#define BSIM3v1_MOD_WGAMMA2 317 +#define BSIM3v1_MOD_WVBX 318 + +#define BSIM3v1_MOD_WVBM 320 + +#define BSIM3v1_MOD_WXT 322 +#define BSIM3v1_MOD_WK1 325 +#define BSIM3v1_MOD_WKT1 326 +#define BSIM3v1_MOD_WKT1L 327 +#define BSIM3v1_MOD_WK2 328 +#define BSIM3v1_MOD_WKT2 329 +#define BSIM3v1_MOD_WK3 330 +#define BSIM3v1_MOD_WK3B 331 +#define BSIM3v1_MOD_WW0 332 +#define BSIM3v1_MOD_WNLX 333 + +#define BSIM3v1_MOD_WDVT0 334 +#define BSIM3v1_MOD_WDVT1 335 +#define BSIM3v1_MOD_WDVT2 336 + +#define BSIM3v1_MOD_WDVT0W 337 +#define BSIM3v1_MOD_WDVT1W 338 +#define BSIM3v1_MOD_WDVT2W 339 + +#define BSIM3v1_MOD_WDROUT 340 +#define BSIM3v1_MOD_WDSUB 341 +#define BSIM3v1_MOD_WVTH0 342 +#define BSIM3v1_MOD_WUA 343 +#define BSIM3v1_MOD_WUA1 344 +#define BSIM3v1_MOD_WUB 345 +#define BSIM3v1_MOD_WUB1 346 +#define BSIM3v1_MOD_WUC 347 +#define BSIM3v1_MOD_WUC1 348 +#define BSIM3v1_MOD_WU0 349 +#define BSIM3v1_MOD_WUTE 350 +#define BSIM3v1_MOD_WVOFF 351 +#define BSIM3v1_MOD_WDELTA 352 +#define BSIM3v1_MOD_WRDSW 353 +#define BSIM3v1_MOD_WPRT 354 +#define BSIM3v1_MOD_WLDD 355 +#define BSIM3v1_MOD_WETA 356 +#define BSIM3v1_MOD_WETA0 357 +#define BSIM3v1_MOD_WETAB 358 +#define BSIM3v1_MOD_WPCLM 359 +#define BSIM3v1_MOD_WPDIBL1 360 +#define BSIM3v1_MOD_WPDIBL2 361 +#define BSIM3v1_MOD_WPSCBE1 362 +#define BSIM3v1_MOD_WPSCBE2 363 +#define BSIM3v1_MOD_WPVAG 364 +#define BSIM3v1_MOD_WWR 365 +#define BSIM3v1_MOD_WDWG 366 +#define BSIM3v1_MOD_WDWB 367 +#define BSIM3v1_MOD_WB0 368 +#define BSIM3v1_MOD_WB1 369 +#define BSIM3v1_MOD_WALPHA0 370 +#define BSIM3v1_MOD_WBETA0 371 +#define BSIM3v1_MOD_WPDIBLB 374 + +#define BSIM3v1_MOD_WPRWG 375 +#define BSIM3v1_MOD_WPRWB 376 + +#define BSIM3v1_MOD_WCDSCD 377 +#define BSIM3v1_MOD_WAGS 378 + + +#define BSIM3v1_MOD_WFRINGE 381 +#define BSIM3v1_MOD_WELM 382 +#define BSIM3v1_MOD_WCGSL 383 +#define BSIM3v1_MOD_WCGDL 384 +#define BSIM3v1_MOD_WCKAPPA 385 +#define BSIM3v1_MOD_WCF 386 +#define BSIM3v1_MOD_WCLC 387 +#define BSIM3v1_MOD_WCLE 388 +#define BSIM3v1_MOD_WVFBCV 389 /* Cross-term dependence */ -#define BSIM3V1_MOD_PCDSC 401 -#define BSIM3V1_MOD_PCDSCB 402 -#define BSIM3V1_MOD_PCIT 403 -#define BSIM3V1_MOD_PNFACTOR 404 -#define BSIM3V1_MOD_PXJ 405 -#define BSIM3V1_MOD_PVSAT 406 -#define BSIM3V1_MOD_PAT 407 -#define BSIM3V1_MOD_PA0 408 -#define BSIM3V1_MOD_PA1 409 -#define BSIM3V1_MOD_PA2 410 -#define BSIM3V1_MOD_PKETA 411 -#define BSIM3V1_MOD_PNSUB 412 -#define BSIM3V1_MOD_PNPEAK 413 -#define BSIM3V1_MOD_PNGATE 415 -#define BSIM3V1_MOD_PGAMMA1 416 -#define BSIM3V1_MOD_PGAMMA2 417 -#define BSIM3V1_MOD_PVBX 418 - -#define BSIM3V1_MOD_PVBM 420 - -#define BSIM3V1_MOD_PXT 422 -#define BSIM3V1_MOD_PK1 425 -#define BSIM3V1_MOD_PKT1 426 -#define BSIM3V1_MOD_PKT1L 427 -#define BSIM3V1_MOD_PK2 428 -#define BSIM3V1_MOD_PKT2 429 -#define BSIM3V1_MOD_PK3 430 -#define BSIM3V1_MOD_PK3B 431 -#define BSIM3V1_MOD_PW0 432 -#define BSIM3V1_MOD_PNLX 433 - -#define BSIM3V1_MOD_PDVT0 434 -#define BSIM3V1_MOD_PDVT1 435 -#define BSIM3V1_MOD_PDVT2 436 - -#define BSIM3V1_MOD_PDVT0W 437 -#define BSIM3V1_MOD_PDVT1W 438 -#define BSIM3V1_MOD_PDVT2W 439 - -#define BSIM3V1_MOD_PDROUT 440 -#define BSIM3V1_MOD_PDSUB 441 -#define BSIM3V1_MOD_PVTH0 442 -#define BSIM3V1_MOD_PUA 443 -#define BSIM3V1_MOD_PUA1 444 -#define BSIM3V1_MOD_PUB 445 -#define BSIM3V1_MOD_PUB1 446 -#define BSIM3V1_MOD_PUC 447 -#define BSIM3V1_MOD_PUC1 448 -#define BSIM3V1_MOD_PU0 449 -#define BSIM3V1_MOD_PUTE 450 -#define BSIM3V1_MOD_PVOFF 451 -#define BSIM3V1_MOD_PDELTA 452 -#define BSIM3V1_MOD_PRDSW 453 -#define BSIM3V1_MOD_PPRT 454 -#define BSIM3V1_MOD_PLDD 455 -#define BSIM3V1_MOD_PETA 456 -#define BSIM3V1_MOD_PETA0 457 -#define BSIM3V1_MOD_PETAB 458 -#define BSIM3V1_MOD_PPCLM 459 -#define BSIM3V1_MOD_PPDIBL1 460 -#define BSIM3V1_MOD_PPDIBL2 461 -#define BSIM3V1_MOD_PPSCBE1 462 -#define BSIM3V1_MOD_PPSCBE2 463 -#define BSIM3V1_MOD_PPVAG 464 -#define BSIM3V1_MOD_PWR 465 -#define BSIM3V1_MOD_PDWG 466 -#define BSIM3V1_MOD_PDWB 467 -#define BSIM3V1_MOD_PB0 468 -#define BSIM3V1_MOD_PB1 469 -#define BSIM3V1_MOD_PALPHA0 470 -#define BSIM3V1_MOD_PBETA0 471 -#define BSIM3V1_MOD_PPDIBLB 474 - -#define BSIM3V1_MOD_PPRWG 475 -#define BSIM3V1_MOD_PPRWB 476 - -#define BSIM3V1_MOD_PCDSCD 477 -#define BSIM3V1_MOD_PAGS 478 - -#define BSIM3V1_MOD_PFRINGE 481 -#define BSIM3V1_MOD_PELM 482 -#define BSIM3V1_MOD_PCGSL 483 -#define BSIM3V1_MOD_PCGDL 484 -#define BSIM3V1_MOD_PCKAPPA 485 -#define BSIM3V1_MOD_PCF 486 -#define BSIM3V1_MOD_PCLC 487 -#define BSIM3V1_MOD_PCLE 488 -#define BSIM3V1_MOD_PVFBCV 489 - -#define BSIM3V1_MOD_TNOM 501 -#define BSIM3V1_MOD_CGSO 502 -#define BSIM3V1_MOD_CGDO 503 -#define BSIM3V1_MOD_CGBO 504 -#define BSIM3V1_MOD_XPART 505 - -#define BSIM3V1_MOD_RSH 506 -#define BSIM3V1_MOD_JS 507 -#define BSIM3V1_MOD_PB 508 -#define BSIM3V1_MOD_MJ 509 -#define BSIM3V1_MOD_PBSW 510 -#define BSIM3V1_MOD_MJSW 511 -#define BSIM3V1_MOD_CJ 512 -#define BSIM3V1_MOD_CJSW 513 -#define BSIM3V1_MOD_NMOS 514 -#define BSIM3V1_MOD_PMOS 515 - -#define BSIM3V1_MOD_NOIA 516 -#define BSIM3V1_MOD_NOIB 517 -#define BSIM3V1_MOD_NOIC 518 - -#define BSIM3V1_MOD_LINT 519 -#define BSIM3V1_MOD_LL 520 -#define BSIM3V1_MOD_LLN 521 -#define BSIM3V1_MOD_LW 522 -#define BSIM3V1_MOD_LWN 523 -#define BSIM3V1_MOD_LWL 524 -#define BSIM3V1_MOD_LMIN 525 -#define BSIM3V1_MOD_LMAX 526 - -#define BSIM3V1_MOD_WINT 527 -#define BSIM3V1_MOD_WL 528 -#define BSIM3V1_MOD_WLN 529 -#define BSIM3V1_MOD_WW 530 -#define BSIM3V1_MOD_WWN 531 -#define BSIM3V1_MOD_WWL 532 -#define BSIM3V1_MOD_WMIN 533 -#define BSIM3V1_MOD_WMAX 534 - -#define BSIM3V1_MOD_DWC 535 -#define BSIM3V1_MOD_DLC 536 - -#define BSIM3V1_MOD_EM 537 -#define BSIM3V1_MOD_EF 538 -#define BSIM3V1_MOD_AF 539 -#define BSIM3V1_MOD_KF 540 - -#define BSIM3V1_MOD_NJ 541 -#define BSIM3V1_MOD_XTI 542 - -#define BSIM3V1_MOD_PBSWG 543 -#define BSIM3V1_MOD_MJSWG 544 -#define BSIM3V1_MOD_CJSWG 545 -#define BSIM3V1_MOD_JSW 546 +#define BSIM3v1_MOD_PCDSC 401 +#define BSIM3v1_MOD_PCDSCB 402 +#define BSIM3v1_MOD_PCIT 403 +#define BSIM3v1_MOD_PNFACTOR 404 +#define BSIM3v1_MOD_PXJ 405 +#define BSIM3v1_MOD_PVSAT 406 +#define BSIM3v1_MOD_PAT 407 +#define BSIM3v1_MOD_PA0 408 +#define BSIM3v1_MOD_PA1 409 +#define BSIM3v1_MOD_PA2 410 +#define BSIM3v1_MOD_PKETA 411 +#define BSIM3v1_MOD_PNSUB 412 +#define BSIM3v1_MOD_PNPEAK 413 +#define BSIM3v1_MOD_PNGATE 415 +#define BSIM3v1_MOD_PGAMMA1 416 +#define BSIM3v1_MOD_PGAMMA2 417 +#define BSIM3v1_MOD_PVBX 418 + +#define BSIM3v1_MOD_PVBM 420 + +#define BSIM3v1_MOD_PXT 422 +#define BSIM3v1_MOD_PK1 425 +#define BSIM3v1_MOD_PKT1 426 +#define BSIM3v1_MOD_PKT1L 427 +#define BSIM3v1_MOD_PK2 428 +#define BSIM3v1_MOD_PKT2 429 +#define BSIM3v1_MOD_PK3 430 +#define BSIM3v1_MOD_PK3B 431 +#define BSIM3v1_MOD_PW0 432 +#define BSIM3v1_MOD_PNLX 433 + +#define BSIM3v1_MOD_PDVT0 434 +#define BSIM3v1_MOD_PDVT1 435 +#define BSIM3v1_MOD_PDVT2 436 + +#define BSIM3v1_MOD_PDVT0W 437 +#define BSIM3v1_MOD_PDVT1W 438 +#define BSIM3v1_MOD_PDVT2W 439 + +#define BSIM3v1_MOD_PDROUT 440 +#define BSIM3v1_MOD_PDSUB 441 +#define BSIM3v1_MOD_PVTH0 442 +#define BSIM3v1_MOD_PUA 443 +#define BSIM3v1_MOD_PUA1 444 +#define BSIM3v1_MOD_PUB 445 +#define BSIM3v1_MOD_PUB1 446 +#define BSIM3v1_MOD_PUC 447 +#define BSIM3v1_MOD_PUC1 448 +#define BSIM3v1_MOD_PU0 449 +#define BSIM3v1_MOD_PUTE 450 +#define BSIM3v1_MOD_PVOFF 451 +#define BSIM3v1_MOD_PDELTA 452 +#define BSIM3v1_MOD_PRDSW 453 +#define BSIM3v1_MOD_PPRT 454 +#define BSIM3v1_MOD_PLDD 455 +#define BSIM3v1_MOD_PETA 456 +#define BSIM3v1_MOD_PETA0 457 +#define BSIM3v1_MOD_PETAB 458 +#define BSIM3v1_MOD_PPCLM 459 +#define BSIM3v1_MOD_PPDIBL1 460 +#define BSIM3v1_MOD_PPDIBL2 461 +#define BSIM3v1_MOD_PPSCBE1 462 +#define BSIM3v1_MOD_PPSCBE2 463 +#define BSIM3v1_MOD_PPVAG 464 +#define BSIM3v1_MOD_PWR 465 +#define BSIM3v1_MOD_PDWG 466 +#define BSIM3v1_MOD_PDWB 467 +#define BSIM3v1_MOD_PB0 468 +#define BSIM3v1_MOD_PB1 469 +#define BSIM3v1_MOD_PALPHA0 470 +#define BSIM3v1_MOD_PBETA0 471 +#define BSIM3v1_MOD_PPDIBLB 474 + +#define BSIM3v1_MOD_PPRWG 475 +#define BSIM3v1_MOD_PPRWB 476 + +#define BSIM3v1_MOD_PCDSCD 477 +#define BSIM3v1_MOD_PAGS 478 + +#define BSIM3v1_MOD_PFRINGE 481 +#define BSIM3v1_MOD_PELM 482 +#define BSIM3v1_MOD_PCGSL 483 +#define BSIM3v1_MOD_PCGDL 484 +#define BSIM3v1_MOD_PCKAPPA 485 +#define BSIM3v1_MOD_PCF 486 +#define BSIM3v1_MOD_PCLC 487 +#define BSIM3v1_MOD_PCLE 488 +#define BSIM3v1_MOD_PVFBCV 489 + +#define BSIM3v1_MOD_TNOM 501 +#define BSIM3v1_MOD_CGSO 502 +#define BSIM3v1_MOD_CGDO 503 +#define BSIM3v1_MOD_CGBO 504 +#define BSIM3v1_MOD_XPART 505 + +#define BSIM3v1_MOD_RSH 506 +#define BSIM3v1_MOD_JS 507 +#define BSIM3v1_MOD_PB 508 +#define BSIM3v1_MOD_MJ 509 +#define BSIM3v1_MOD_PBSW 510 +#define BSIM3v1_MOD_MJSW 511 +#define BSIM3v1_MOD_CJ 512 +#define BSIM3v1_MOD_CJSW 513 +#define BSIM3v1_MOD_NMOS 514 +#define BSIM3v1_MOD_PMOS 515 + +#define BSIM3v1_MOD_NOIA 516 +#define BSIM3v1_MOD_NOIB 517 +#define BSIM3v1_MOD_NOIC 518 + +#define BSIM3v1_MOD_LINT 519 +#define BSIM3v1_MOD_LL 520 +#define BSIM3v1_MOD_LLN 521 +#define BSIM3v1_MOD_LW 522 +#define BSIM3v1_MOD_LWN 523 +#define BSIM3v1_MOD_LWL 524 +#define BSIM3v1_MOD_LMIN 525 +#define BSIM3v1_MOD_LMAX 526 + +#define BSIM3v1_MOD_WINT 527 +#define BSIM3v1_MOD_WL 528 +#define BSIM3v1_MOD_WLN 529 +#define BSIM3v1_MOD_WW 530 +#define BSIM3v1_MOD_WWN 531 +#define BSIM3v1_MOD_WWL 532 +#define BSIM3v1_MOD_WMIN 533 +#define BSIM3v1_MOD_WMAX 534 + +#define BSIM3v1_MOD_DWC 535 +#define BSIM3v1_MOD_DLC 536 + +#define BSIM3v1_MOD_EM 537 +#define BSIM3v1_MOD_EF 538 +#define BSIM3v1_MOD_AF 539 +#define BSIM3v1_MOD_KF 540 + +#define BSIM3v1_MOD_NJ 541 +#define BSIM3v1_MOD_XTI 542 + +#define BSIM3v1_MOD_PBSWG 543 +#define BSIM3v1_MOD_MJSWG 544 +#define BSIM3v1_MOD_CJSWG 545 +#define BSIM3v1_MOD_JSW 546 /* device questions */ -#define BSIM3V1_DNODE 601 -#define BSIM3V1_GNODE 602 -#define BSIM3V1_SNODE 603 -#define BSIM3V1_BNODE 604 -#define BSIM3V1_DNODEPRIME 605 -#define BSIM3V1_SNODEPRIME 606 -#define BSIM3V1_VBD 607 -#define BSIM3V1_VBS 608 -#define BSIM3V1_VGS 609 -#define BSIM3V1_VDS 610 -#define BSIM3V1_CD 611 -#define BSIM3V1_CBS 612 -#define BSIM3V1_CBD 613 -#define BSIM3V1_GM 614 -#define BSIM3V1_GDS 615 -#define BSIM3V1_GMBS 616 -#define BSIM3V1_GBD 617 -#define BSIM3V1_GBS 618 -#define BSIM3V1_QB 619 -#define BSIM3V1_CQB 620 -#define BSIM3V1_QG 621 -#define BSIM3V1_CQG 622 -#define BSIM3V1_QD 623 -#define BSIM3V1_CQD 624 -#define BSIM3V1_CGG 625 -#define BSIM3V1_CGD 626 -#define BSIM3V1_CGS 627 -#define BSIM3V1_CBG 628 -#define BSIM3V1_CAPBD 629 -#define BSIM3V1_CQBD 630 -#define BSIM3V1_CAPBS 631 -#define BSIM3V1_CQBS 632 -#define BSIM3V1_CDG 633 -#define BSIM3V1_CDD 634 -#define BSIM3V1_CDS 635 -#define BSIM3V1_VON 636 -#define BSIM3V1_VDSAT 637 -#define BSIM3V1_QBS 638 -#define BSIM3V1_QBD 639 -#define BSIM3V1_SOURCECONDUCT 640 -#define BSIM3V1_DRAINCONDUCT 641 -#define BSIM3V1_CBDB 642 -#define BSIM3V1_CBSB 643 +#define BSIM3v1_DNODE 601 +#define BSIM3v1_GNODE 602 +#define BSIM3v1_SNODE 603 +#define BSIM3v1_BNODE 604 +#define BSIM3v1_DNODEPRIME 605 +#define BSIM3v1_SNODEPRIME 606 +#define BSIM3v1_VBD 607 +#define BSIM3v1_VBS 608 +#define BSIM3v1_VGS 609 +#define BSIM3v1_VDS 610 +#define BSIM3v1_CD 611 +#define BSIM3v1_CBS 612 +#define BSIM3v1_CBD 613 +#define BSIM3v1_GM 614 +#define BSIM3v1_GDS 615 +#define BSIM3v1_GMBS 616 +#define BSIM3v1_GBD 617 +#define BSIM3v1_GBS 618 +#define BSIM3v1_QB 619 +#define BSIM3v1_CQB 620 +#define BSIM3v1_QG 621 +#define BSIM3v1_CQG 622 +#define BSIM3v1_QD 623 +#define BSIM3v1_CQD 624 +#define BSIM3v1_CGG 625 +#define BSIM3v1_CGD 626 +#define BSIM3v1_CGS 627 +#define BSIM3v1_CBG 628 +#define BSIM3v1_CAPBD 629 +#define BSIM3v1_CQBD 630 +#define BSIM3v1_CAPBS 631 +#define BSIM3v1_CQBS 632 +#define BSIM3v1_CDG 633 +#define BSIM3v1_CDD 634 +#define BSIM3v1_CDS 635 +#define BSIM3v1_VON 636 +#define BSIM3v1_VDSAT 637 +#define BSIM3v1_QBS 638 +#define BSIM3v1_QBD 639 +#define BSIM3v1_SOURCECONDUCT 640 +#define BSIM3v1_DRAINCONDUCT 641 +#define BSIM3v1_CBDB 642 +#define BSIM3v1_CBSB 643 #include "bsim3v1ext.h" #ifdef __STDC__ -extern void BSIM3V1evaluate(double,double,double,BSIM3V1instance*,BSIM3V1model*, +extern void BSIM3v1evaluate(double,double,double,BSIM3v1instance*,BSIM3v1model*, double*,double*,double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, CKTcircuit*); -extern int BSIM3V1debug(BSIM3V1model*, BSIM3V1instance*, CKTcircuit*, int); -extern int BSIM3V1checkModel(BSIM3V1model*, BSIM3V1instance*, CKTcircuit*); +extern int BSIM3v1debug(BSIM3v1model*, BSIM3v1instance*, CKTcircuit*, int); +extern int BSIM3v1checkModel(BSIM3v1model*, BSIM3v1instance*, CKTcircuit*); #else /* stdc */ -extern void BSIM3V1evaluate(); -extern int BSIM3V1debug(); -extern int BSIM3V1checkModel(); +extern void BSIM3v1evaluate(); +extern int BSIM3v1debug(); +extern int BSIM3v1checkModel(); #endif /* stdc */ -#endif /*BSIM3V1*/ +#endif /*BSIM3v1*/ diff --git a/src/spicelib/devices/bsim3v1/bsim3v1ext.h b/src/spicelib/devices/bsim3v1/bsim3v1ext.h index b8a752f71..67c96c37e 100644 --- a/src/spicelib/devices/bsim3v1/bsim3v1ext.h +++ b/src/spicelib/devices/bsim3v1/bsim3v1ext.h @@ -1,51 +1,31 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1991 JianHui Huang and Min-Chie Jeng. +Modified: 2002 Paolo Nenzi. File: bsim3v1ext.h **********/ -#ifdef __STDC__ -extern int BSIM3V1acLoad(GENmodel *,CKTcircuit*); -extern int BSIM3V1ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); -extern int BSIM3V1convTest(GENmodel *,CKTcircuit*); -extern int BSIM3V1delete(GENmodel*,IFuid,GENinstance**); -extern void BSIM3V1destroy(GENmodel**); -extern int BSIM3V1getic(GENmodel*,CKTcircuit*); -extern int BSIM3V1load(GENmodel*,CKTcircuit*); -extern int BSIM3V1mAsk(CKTcircuit*,GENmodel *,int, IFvalue*); -extern int BSIM3V1mDelete(GENmodel**,IFuid,GENmodel*); -extern int BSIM3V1mParam(int,IFvalue*,GENmodel*); -extern void BSIM3V1mosCap(CKTcircuit*, double, double, double, double, +extern int BSIM3v1acLoad(GENmodel *, CKTcircuit *); +extern int BSIM3v1ask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *); +extern int BSIM3v1convTest(GENmodel *, CKTcircuit *); +extern int BSIM3v1delete(GENmodel *, IFuid, GENinstance **); +extern void BSIM3v1destroy(GENmodel **); +extern int BSIM3v1getic(GENmodel *, CKTcircuit *); +extern int BSIM3v1load(GENmodel *, CKTcircuit *); +extern int BSIM3v1mAsk(CKTcircuit *, GENmodel *, int, IFvalue *); +extern int BSIM3v1mDelete(GENmodel **, IFuid, GENmodel *); +extern int BSIM3v1mParam(int, IFvalue *, GENmodel *); +extern void BSIM3v1mosCap(CKTcircuit *, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double*, - double*, double*, double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, - double*); -extern int BSIM3V1param(int,IFvalue*,GENinstance*,IFvalue*); -extern int BSIM3V1pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); -extern int BSIM3V1setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); -extern int BSIM3V1temp(GENmodel*,CKTcircuit*); -extern int BSIM3V1trunc(GENmodel*,CKTcircuit*,double*); -extern int BSIM3V1noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); - -#else /* stdc */ -extern int BSIM3V1acLoad(); -extern int BSIM3V1delete(); -extern void BSIM3V1destroy(); -extern int BSIM3V1getic(); -extern int BSIM3V1load(); -extern int BSIM3V1mDelete(); -extern int BSIM3V1ask(); -extern int BSIM3V1mAsk(); -extern int BSIM3V1convTest(); -extern int BSIM3V1temp(); -extern int BSIM3V1mParam(); -extern void BSIM3V1mosCap(); -extern int BSIM3V1param(); -extern int BSIM3V1pzLoad(); -extern int BSIM3V1setup(); -extern int BSIM3V1trunc(); -extern int BSIM3V1noise(); - -#endif /* stdc */ + double *, double *, double *, double *, double *, double *, double *, + double *, double *, double *, double *, double *, double *, double *, + double *); +extern int BSIM3v1param(int, IFvalue *, GENinstance *, IFvalue *); +extern int BSIM3v1pzLoad(GENmodel *, CKTcircuit *, SPcomplex *); +extern int BSIM3v1setup(SMPmatrix *, GENmodel *, CKTcircuit *, int *); +extern int BSIM3v1temp(GENmodel *, CKTcircuit *); +extern int BSIM3v1trunc(GENmodel *, CKTcircuit *, double *); +extern int BSIM3v1noise(int, int, GENmodel *, CKTcircuit *, Ndata *, double *); +extern int BSIM3v1unsetup(GENmodel *, CKTcircuit *); diff --git a/src/spicelib/devices/bsim3v1/bsim3v1init.c b/src/spicelib/devices/bsim3v1/bsim3v1init.c index 60af2d9a2..7e3348e26 100644 --- a/src/spicelib/devices/bsim3v1/bsim3v1init.c +++ b/src/spicelib/devices/bsim3v1/bsim3v1init.c @@ -6,21 +6,19 @@ #include "bsim3v1ext.h" #include "bsim3v1init.h" +SPICEdev B3v1info = { + { "BSIM3v1", + "Berkeley Short Channel IGFET Model Version-3 (3.1)", -SPICEdev BSIM3V1info = { - { - "BSIM3V1", - "Berkeley Short Channel IGFET Model Version-3 (3v3.1)", + &BSIM3v1nSize, + &BSIM3v1nSize, + BSIM3v1names, - &BSIM3V1nSize, - &BSIM3V1nSize, - BSIM3V1names, + &BSIM3v1pTSize, + BSIM3v1pTable, - &BSIM3V1pTSize, - BSIM3V1pTable, - - &BSIM3V1mPTSize, - BSIM3V1mPTable, + &BSIM3v1mPTSize, + BSIM3v1mPTable, #ifdef XSPICE /*---- Fixed by SDB 5.2.2003 to enable XSPICE/tclspice integration -----*/ @@ -36,41 +34,43 @@ SPICEdev BSIM3V1info = { NULL, /* This is a SPICE device, it has no MIF info data */ /*--------------------------- End of SDB fix -------------------------*/ #endif - - DEV_DEFAULT, - + + DEV_DEFAULT }, - DEVparam : BSIM3V1param, - DEVmodParam : BSIM3V1mParam, - DEVload : BSIM3V1load, - DEVsetup : BSIM3V1setup, - DEVunsetup : NULL, - DEVpzSetup : BSIM3V1setup, - DEVtemperature: BSIM3V1temp, - DEVtrunc : BSIM3V1trunc, + DEVparam : BSIM3v1param, + DEVmodParam : BSIM3v1mParam, + DEVload : BSIM3v1load, + DEVsetup : BSIM3v1setup, + DEVunsetup : BSIM3v1unsetup, + DEVpzSetup : BSIM3v1setup, + DEVtemperature: BSIM3v1temp, + DEVtrunc : BSIM3v1trunc, DEVfindBranch : NULL, - DEVacLoad : BSIM3V1acLoad, + DEVacLoad : BSIM3v1acLoad, DEVaccept : NULL, - DEVdestroy : BSIM3V1destroy, - DEVmodDelete : BSIM3V1mDelete, - DEVdelete : BSIM3V1delete, - DEVsetic : BSIM3V1getic, - DEVask : BSIM3V1ask, - DEVmodAsk : BSIM3V1mAsk, - DEVpzLoad : BSIM3V1pzLoad, - DEVconvTest : BSIM3V1convTest, + DEVdestroy : BSIM3v1destroy, + DEVmodDelete : BSIM3v1mDelete, + DEVdelete : BSIM3v1delete, + DEVsetic : BSIM3v1getic, + DEVask : BSIM3v1ask, + DEVmodAsk : BSIM3v1mAsk, + DEVpzLoad : BSIM3v1pzLoad, + DEVconvTest : BSIM3v1convTest, DEVsenSetup : NULL, DEVsenLoad : NULL, DEVsenUpdate : NULL, DEVsenAcLoad : NULL, DEVsenPrint : NULL, DEVsenTrunc : NULL, - DEVdisto : NULL, - DEVnoise : BSIM3V1noise, - - DEVinstSize : &BSIM3V1iSize, - DEVmodSize : &BSIM3V1mSize + DEVdisto : NULL, + DEVnoise : BSIM3v1noise, +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif + DEVinstSize : &BSIM3v1iSize, + DEVmodSize : &BSIM3v1mSize }; @@ -78,5 +78,5 @@ SPICEdev BSIM3V1info = { SPICEdev * get_bsim3v1_info(void) { - return &BSIM3V1info; + return &B3v1info; } diff --git a/src/spicelib/devices/bsim3v1/bsim3v1init.h b/src/spicelib/devices/bsim3v1/bsim3v1init.h index 7c8ae9b3c..35701d659 100644 --- a/src/spicelib/devices/bsim3v1/bsim3v1init.h +++ b/src/spicelib/devices/bsim3v1/bsim3v1init.h @@ -1,13 +1,13 @@ -#ifndef _BSIM3V1INIT_H -#define _BSIM3V1INIT_H +#ifndef _BSIM3v1INIT_H +#define _BSIM3v1INIT_H -extern IFparm BSIM3V1pTable[ ]; -extern IFparm BSIM3V1mPTable[ ]; -extern char *BSIM3V1names[ ]; -extern int BSIM3V1pTSize; -extern int BSIM3V1mPTSize; -extern int BSIM3V1nSize; -extern int BSIM3V1iSize; -extern int BSIM3V1mSize; +extern IFparm BSIM3v1pTable[ ]; +extern IFparm BSIM3v1mPTable[ ]; +extern char *BSIM3v1names[ ]; +extern int BSIM3v1pTSize; +extern int BSIM3v1mPTSize; +extern int BSIM3v1nSize; +extern int BSIM3v1iSize; +extern int BSIM3v1mSize; #endif diff --git a/src/spicelib/devices/bsim3v1/bsim3v1itf.h b/src/spicelib/devices/bsim3v1/bsim3v1itf.h index c0c84feb8..101e4f07a 100644 --- a/src/spicelib/devices/bsim3v1/bsim3v1itf.h +++ b/src/spicelib/devices/bsim3v1/bsim3v1itf.h @@ -1,11 +1,14 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1991 JianHui Huang and Min-Chie Jeng. +Modified: 2002 Paolo Nenzi. File: bsim3v1itf.h **********/ -#ifndef DEV_BSIM3V1 -#define DEV_BSIM3V1 + +#ifndef DEV_BSIM3v1 +#define DEV_BSIM3v1 SPICEdev *get_bsim3v1_info(void); #endif + diff --git a/src/spicelib/devices/cap/cap.c b/src/spicelib/devices/cap/cap.c index ba0a49f23..695faa3c0 100644 --- a/src/spicelib/devices/cap/cap.c +++ b/src/spicelib/devices/cap/cap.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "devdefs.h" #include "capdefs.h" #include "suffix.h" diff --git a/src/spicelib/devices/cap/capacld.c b/src/spicelib/devices/cap/capacld.c index 2b37c34d2..82b6760d0 100644 --- a/src/spicelib/devices/cap/capacld.c +++ b/src/spicelib/devices/cap/capacld.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "capdefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/cap/capask.c b/src/spicelib/devices/cap/capask.c index 74af35722..cfde81b20 100644 --- a/src/spicelib/devices/cap/capask.c +++ b/src/spicelib/devices/cap/capask.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "devdefs.h" #include "capdefs.h" diff --git a/src/spicelib/devices/cap/capdel.c b/src/spicelib/devices/cap/capdel.c index c2c44f0d3..05aa1e2a8 100644 --- a/src/spicelib/devices/cap/capdel.c +++ b/src/spicelib/devices/cap/capdel.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "capdefs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/cap/capdest.c b/src/spicelib/devices/cap/capdest.c index d65c7155e..a5ebf7b5f 100644 --- a/src/spicelib/devices/cap/capdest.c +++ b/src/spicelib/devices/cap/capdest.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "capdefs.h" #include "suffix.h" diff --git a/src/spicelib/devices/cap/capgetic.c b/src/spicelib/devices/cap/capgetic.c index 307b11947..ea87cf0f3 100644 --- a/src/spicelib/devices/cap/capgetic.c +++ b/src/spicelib/devices/cap/capgetic.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "capdefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/cap/capinit.c b/src/spicelib/devices/cap/capinit.c index ec9352318..744f00e52 100644 --- a/src/spicelib/devices/cap/capinit.c +++ b/src/spicelib/devices/cap/capinit.c @@ -66,7 +66,10 @@ SPICEdev CAPinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, /* DISTO */ DEVnoise : NULL, /* NOISE */ - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &CAPiSize, DEVmodSize : &CAPmSize }; diff --git a/src/spicelib/devices/cap/capload.c b/src/spicelib/devices/cap/capload.c index 765e48964..7b0ea40c8 100644 --- a/src/spicelib/devices/cap/capload.c +++ b/src/spicelib/devices/cap/capload.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "capdefs.h" #include "trandefs.h" diff --git a/src/spicelib/devices/cap/capmask.c b/src/spicelib/devices/cap/capmask.c index 7e41cd7e8..7413667e3 100644 --- a/src/spicelib/devices/cap/capmask.c +++ b/src/spicelib/devices/cap/capmask.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "devdefs.h" #include "capdefs.h" diff --git a/src/spicelib/devices/cap/capmdel.c b/src/spicelib/devices/cap/capmdel.c index ba21d092c..a22c80c8c 100644 --- a/src/spicelib/devices/cap/capmdel.c +++ b/src/spicelib/devices/cap/capmdel.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "capdefs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/cap/capmpar.c b/src/spicelib/devices/cap/capmpar.c index 2f8b47589..928a6a2c3 100644 --- a/src/spicelib/devices/cap/capmpar.c +++ b/src/spicelib/devices/cap/capmpar.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "ifsim.h" #include "capdefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/cap/capparam.c b/src/spicelib/devices/cap/capparam.c index 0f6646c8a..69d286a2e 100644 --- a/src/spicelib/devices/cap/capparam.c +++ b/src/spicelib/devices/cap/capparam.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "ifsim.h" #include "capdefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/cap/cappzld.c b/src/spicelib/devices/cap/cappzld.c index dc53f1da1..fe2e9ade0 100644 --- a/src/spicelib/devices/cap/cappzld.c +++ b/src/spicelib/devices/cap/cappzld.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "complex.h" #include "sperror.h" diff --git a/src/spicelib/devices/cap/capsacl.c b/src/spicelib/devices/cap/capsacl.c index 13514dc03..f8fb7d78e 100644 --- a/src/spicelib/devices/cap/capsacl.c +++ b/src/spicelib/devices/cap/capsacl.c @@ -10,7 +10,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "capdefs.h" #include "trandefs.h" diff --git a/src/spicelib/devices/cap/capsetup.c b/src/spicelib/devices/cap/capsetup.c index 2a69642f2..986690987 100644 --- a/src/spicelib/devices/cap/capsetup.c +++ b/src/spicelib/devices/cap/capsetup.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "capdefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/cap/capsload.c b/src/spicelib/devices/cap/capsload.c index 8761826e3..3d672e800 100644 --- a/src/spicelib/devices/cap/capsload.c +++ b/src/spicelib/devices/cap/capsload.c @@ -10,7 +10,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "capdefs.h" #include "trandefs.h" diff --git a/src/spicelib/devices/cap/capsprt.c b/src/spicelib/devices/cap/capsprt.c index fe6d440b7..8c6ed0b19 100644 --- a/src/spicelib/devices/cap/capsprt.c +++ b/src/spicelib/devices/cap/capsprt.c @@ -10,7 +10,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "capdefs.h" #include "trandefs.h" diff --git a/src/spicelib/devices/cap/capsset.c b/src/spicelib/devices/cap/capsset.c index c8750c40d..adcc21a8b 100644 --- a/src/spicelib/devices/cap/capsset.c +++ b/src/spicelib/devices/cap/capsset.c @@ -10,7 +10,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "capdefs.h" #include "trandefs.h" diff --git a/src/spicelib/devices/cap/capsupd.c b/src/spicelib/devices/cap/capsupd.c index 4782314d1..fd50cbd19 100644 --- a/src/spicelib/devices/cap/capsupd.c +++ b/src/spicelib/devices/cap/capsupd.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles /* update the charge sensitivities and their derivatives */ #include "ngspice.h" -#include #include "cktdefs.h" #include "capdefs.h" #include "trandefs.h" diff --git a/src/spicelib/devices/cap/captemp.c b/src/spicelib/devices/cap/captemp.c index 47f24a917..07c71df20 100644 --- a/src/spicelib/devices/cap/captemp.c +++ b/src/spicelib/devices/cap/captemp.c @@ -10,7 +10,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "capdefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/cap/captrunc.c b/src/spicelib/devices/cap/captrunc.c index 0e3a86ce6..fd99909a5 100644 --- a/src/spicelib/devices/cap/captrunc.c +++ b/src/spicelib/devices/cap/captrunc.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "capdefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/cccs/cccsinit.c b/src/spicelib/devices/cccs/cccsinit.c index b00123636..e287a4a9d 100644 --- a/src/spicelib/devices/cccs/cccsinit.c +++ b/src/spicelib/devices/cccs/cccsinit.c @@ -66,7 +66,10 @@ SPICEdev CCCSinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, /* DISTO */ DEVnoise : NULL, /* NOISE */ - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &CCCSiSize, DEVmodSize : &CCCSmSize diff --git a/src/spicelib/devices/ccvs/ccvsinit.c b/src/spicelib/devices/ccvs/ccvsinit.c index 03f643bbf..8ee1036ad 100644 --- a/src/spicelib/devices/ccvs/ccvsinit.c +++ b/src/spicelib/devices/ccvs/ccvsinit.c @@ -67,7 +67,10 @@ SPICEdev CCVSinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, /* DISTO */ DEVnoise : NULL, /* NOISE */ - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &CCVSiSize, DEVmodSize : &CCVSmSize diff --git a/src/spicelib/devices/cpl/cpl.c b/src/spicelib/devices/cpl/cpl.c index 4bb1aaf46..67c013e50 100644 --- a/src/spicelib/devices/cpl/cpl.c +++ b/src/spicelib/devices/cpl/cpl.c @@ -5,7 +5,6 @@ Author: 1992 Charles Hough **********/ #include "ngspice.h" -#include #include "cpldefs.h" #include "devdefs.h" #include "ifsim.h" diff --git a/src/spicelib/devices/cpl/cpldefs.h b/src/spicelib/devices/cpl/cpldefs.h index 81aa5a0b3..e7d27a727 100644 --- a/src/spicelib/devices/cpl/cpldefs.h +++ b/src/spicelib/devices/cpl/cpldefs.h @@ -16,6 +16,7 @@ typedef struct sCPLinstance { * current model*/ IFuid CPLname; /* pointer to character string naming this instance */ + int CPLowner; /* number of owner process */ int dimension; int *CPLposNodes; diff --git a/src/spicelib/devices/cpl/cpldel.c b/src/spicelib/devices/cpl/cpldel.c index 746811eaf..bcf4c02bd 100644 --- a/src/spicelib/devices/cpl/cpldel.c +++ b/src/spicelib/devices/cpl/cpldel.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include "cpldefs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/cpl/cpldest.c b/src/spicelib/devices/cpl/cpldest.c index e0c6b46f6..1d9f123b0 100644 --- a/src/spicelib/devices/cpl/cpldest.c +++ b/src/spicelib/devices/cpl/cpldest.c @@ -5,7 +5,6 @@ Author: 1992 Charles Hough **********/ #include "ngspice.h" -#include #include "cpldefs.h" #include "suffix.h" diff --git a/src/spicelib/devices/cpl/cplinit.c b/src/spicelib/devices/cpl/cplinit.c index d9891f9a4..695ef803d 100644 --- a/src/spicelib/devices/cpl/cplinit.c +++ b/src/spicelib/devices/cpl/cplinit.c @@ -39,41 +39,40 @@ SPICEdev CPLinfo = { 0 }, - CPLparam, - CPLmParam, - CPLload, - CPLsetup, - NULL, - NULL, - NULL, - NULL, - NULL, /* CPLfindBranch, */ - NULL, - NULL, - CPLdestroy, -#ifdef DELETES - CPLmDelete, - CPLdelete, -#else /* DELETES */ - NULL, - NULL, -#endif /* DELETES */ - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - - &CPLiSize, - &CPLmSize + + DEVparam : CPLmParam, + DEVmodParam : NULL, + DEVload : CPLload, + DEVsetup : CPLsetup, + DEVunsetup : NULL, + DEVpzSetup : NULL, + DEVtemperature : NULL, + DEVtrunc : NULL, + DEVfindBranch : NULL, /* CPLfindBranch, */ + DEVacLoad : NULL, + DEVaccept : NULL, + DEVdestroy : CPLdestroy, + DEVmodDelete : CPLmDelete, + DEVdelete : CPLdelete, + DEVsetic : NULL, + DEVask : NULL, + DEVmodAsk : NULL, + DEVpzload : NULL, + DEVconvTest : NULL, + DEVsenSetup : NULL, + DEVsenLoad : NULL, + DEVsenUpdate : NULL, + DEVsenAcLoad : NULL, + DEVsenPrint : NULL, + DEVsenTrunc : NULL, + DEVdisto : NULL, + DEVnoise : NULL, +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif + DEVinstSize : &CPLiSize, + DEVmodSize : &CPLmSize }; diff --git a/src/spicelib/devices/cpl/cplload.c b/src/spicelib/devices/cpl/cplload.c index 5b502fe5e..b37343447 100644 --- a/src/spicelib/devices/cpl/cplload.c +++ b/src/spicelib/devices/cpl/cplload.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include "cpldefs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/cpl/cplmdel.c b/src/spicelib/devices/cpl/cplmdel.c index 0697dc890..176be0906 100644 --- a/src/spicelib/devices/cpl/cplmdel.c +++ b/src/spicelib/devices/cpl/cplmdel.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include "cpldefs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/cpl/cplmpar.c b/src/spicelib/devices/cpl/cplmpar.c index 03cef866f..646b7213d 100644 --- a/src/spicelib/devices/cpl/cplmpar.c +++ b/src/spicelib/devices/cpl/cplmpar.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "cpldefs.h" diff --git a/src/spicelib/devices/cpl/cplparam.c b/src/spicelib/devices/cpl/cplparam.c index 98dd7eaec..b4cf8e05e 100644 --- a/src/spicelib/devices/cpl/cplparam.c +++ b/src/spicelib/devices/cpl/cplparam.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "cpldefs.h" diff --git a/src/spicelib/devices/cpl/cplsetup.c b/src/spicelib/devices/cpl/cplsetup.c index f5bb8337c..44a70d983 100644 --- a/src/spicelib/devices/cpl/cplsetup.c +++ b/src/spicelib/devices/cpl/cplsetup.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include "smpdefs.h" #include "cpldefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/csw/cswinit.c b/src/spicelib/devices/csw/cswinit.c index bdb43009c..9d06fb834 100644 --- a/src/spicelib/devices/csw/cswinit.c +++ b/src/spicelib/devices/csw/cswinit.c @@ -69,7 +69,10 @@ SPICEdev CSWinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, /* DISTO */ DEVnoise : CSWnoise, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &CSWiSize, DEVmodSize : &CSWmSize diff --git a/src/spicelib/devices/dev.c b/src/spicelib/devices/dev.c index aed7ed36e..36393fd6a 100644 --- a/src/spicelib/devices/dev.c +++ b/src/spicelib/devices/dev.c @@ -76,12 +76,15 @@ int add_udn(int,Evt_Udn_Info_t **); #include "asrc/asrcitf.h" #include "bjt/bjtitf.h" -/* #include "bjt2/bjt2itf.h" */ +#include "bjt2/bjt2itf.h" #include "bsim1/bsim1itf.h" #include "bsim2/bsim2itf.h" #include "bsim3/bsim3itf.h" +#include "bsim3v0/bsim3v0itf.h" #include "bsim3v1/bsim3v1itf.h" -#include "bsim3v2/bsim3v2itf.h" +#include "bsim3v1a/bsim3v1aitf.h" +#include "bsim3v1s/bsim3v1sitf.h" +#include "bsim3soi/b3soiitf.h" #include "bsim4/bsim4itf.h" #include "bsim3soi_pd/b3soipditf.h" #include "bsim3soi_fd/b3soifditf.h" @@ -93,6 +96,7 @@ int add_udn(int,Evt_Udn_Info_t **); #include "dio/dioitf.h" #include "hfet1/hfetitf.h" #include "hfet2/hfet2itf.h" +#include "hisim/hsm1itf.h" #include "ind/inditf.h" #include "isrc/isrcitf.h" #include "jfet/jfetitf.h" @@ -115,19 +119,30 @@ int add_udn(int,Evt_Udn_Info_t **); #include "vccs/vccsitf.h" #include "vcvs/vcvsitf.h" #include "vsrc/vsrcitf.h" + +#ifdef CIDER +/* Numerical devices (Cider integration) */ +#include "nbjt/nbjtitf.h" +#include "nbjt2/nbjt2itf.h" +#include "numd/numditf.h" +#include "numd2/numd2itf.h" +#include "numos/numositf.h" +#endif + + /*saj in xspice the DEVices size can be varied so DEVNUM is an int*/ #ifdef HAVE_EKV #include "ekv/ekvitf.h" #ifdef XSPICE -static int DEVNUM = 43; +static int DEVNUM = 52; #else -#define DEVNUM 43 +#define DEVNUM 52 #endif #else #ifdef XSPICE -static int DEVNUM = 42; +static int DEVNUM = 51; #else -#define DEVNUM 42 +#define DEVNUM 51 #endif #endif @@ -168,52 +183,69 @@ spice_init_devices(void) DEVices[ 0] = get_urc_info(); DEVices[ 1] = get_asrc_info(); DEVices[ 2] = get_bjt_info(); - DEVices[ 3] = get_bjt_info(); /* Quick hack until bjt2 works */ - /* DEVices[ 3] = get bjt2_info(); */ + DEVices[ 3] = get_bjt2_info(); DEVices[ 4] = get_bsim1_info(); DEVices[ 5] = get_bsim2_info(); DEVices[ 6] = get_bsim3_info(); - DEVices[ 7] = get_bsim3v1_info(); - DEVices[ 8] = get_bsim3v2_info(); - DEVices[ 9] = get_bsim4_info(); - DEVices[10] = get_bsim3soipd_info(); - DEVices[11] = get_bsim3soifd_info(); - DEVices[12] = get_bsim3soidd_info(); - DEVices[13] = get_cap_info(); - DEVices[14] = get_cccs_info(); - DEVices[15] = get_ccvs_info(); - DEVices[16] = get_cpl_info(); - DEVices[17] = get_csw_info(); - DEVices[18] = get_dio_info(); - DEVices[19] = get_hfeta_info(); - DEVices[20] = get_hfet2_info(); - DEVices[21] = get_ind_info(); - DEVices[22] = get_mut_info(); - DEVices[23] = get_isrc_info(); - DEVices[24] = get_jfet_info(); - DEVices[25] = get_jfet2_info(); - DEVices[26] = get_ltra_info(); - DEVices[27] = get_mes_info(); - DEVices[28] = get_mesa_info(); - DEVices[29] = get_mos1_info(); - DEVices[30] = get_mos2_info(); - DEVices[31] = get_mos3_info(); - DEVices[32] = get_mos6_info(); - DEVices[33] = get_mos9_info(); - DEVices[34] = get_res_info(); - DEVices[35] = get_soi3_info(); - DEVices[36] = get_sw_info(); - DEVices[37] = get_tra_info(); - DEVices[38] = get_txl_info(); - DEVices[39] = get_vccs_info(); - DEVices[40] = get_vcvs_info(); - DEVices[41] = get_vsrc_info(); - + DEVices[ 7] = get_bsim3v0_info(); + DEVices[ 8] = get_bsim3v1_info(); + DEVices[ 9] = get_bsim3v1a_info(); + DEVices[10] = get_bsim3v1s_info(); + DEVices[11] = get_b3soi_info(); + DEVices[12] = get_bsim4_info(); + DEVices[13] = get_b3soipd_info(); + DEVices[14] = get_b3soifd_info(); + DEVices[15] = get_b3soidd_info(); + DEVices[16] = get_cap_info(); + DEVices[17] = get_cccs_info(); + DEVices[18] = get_ccvs_info(); + DEVices[19] = get_cpl_info(); + DEVices[20] = get_csw_info(); + DEVices[21] = get_dio_info(); + DEVices[22] = get_hfeta_info(); + DEVices[23] = get_hfet2_info(); + DEVices[24] = get_hsm1_info(); + DEVices[25] = get_ind_info(); + DEVices[26] = get_mut_info(); + DEVices[27] = get_isrc_info(); + DEVices[28] = get_jfet_info(); + DEVices[29] = get_jfet2_info(); + DEVices[30] = get_ltra_info(); + DEVices[31] = get_mes_info(); + DEVices[32] = get_mesa_info(); + DEVices[33] = get_mos1_info(); + DEVices[34] = get_mos2_info(); + DEVices[35] = get_mos3_info(); + DEVices[36] = get_mos6_info(); + DEVices[37] = get_mos9_info(); + DEVices[38] = get_res_info(); + DEVices[39] = get_soi3_info(); + DEVices[40] = get_sw_info(); + DEVices[41] = get_tra_info(); + DEVices[42] = get_txl_info(); + DEVices[43] = get_vccs_info(); + DEVices[44] = get_vcvs_info(); + DEVices[45] = get_vsrc_info(); + +#ifdef CIDER + DEVices[46] = get_nbjt_info(); + DEVices[47] = get_nbjt2_info(); + DEVices[48] = get_numd_info(); + DEVices[49] = get_numd2_info(); + DEVices[50] = get_numos_info(); +#ifdef HAVE_EKV + DEVices[51] = get_ekv_info(); + assert(52 == DEVNUM); +#else + assert(51 == DEVNUM); +#endif /* HAVE_EKV */ +#endif /* CIDER */ + #ifdef HAVE_EKV - DEVices[42] = get_ekv_info(); - assert(43 == DEVNUM); + DEVices[46] = get_ekv_info(); + assert(47 == DEVNUM); #else - assert(42 == DEVNUM); + assert(46 == DEVNUM); #endif return; } diff --git a/src/spicelib/devices/devsup.c b/src/spicelib/devices/devsup.c index c6d47125b..f70691b82 100644 --- a/src/spicelib/devices/devsup.c +++ b/src/spicelib/devices/devsup.c @@ -11,10 +11,11 @@ Modified: 2000 AlansFixes #include "cktdefs.h" #include "suffix.h" -/* limit the per-iteration change of VDS */ +/* + * Limit the per-iteration change of VDS + */ double -DEVlimvds(double vnew, - double vold) +DEVlimvds(double vnew, double vold) { if(vold >= 3.5) { @@ -36,13 +37,14 @@ DEVlimvds(double vnew, } -/* limit the per-iteration change of PN junction voltages */ +/* + * Limit the per-iteration change of PN junction voltages + * + * This code has been fixed by Alan Gillespie adding limiting + * for negative voltages. + */ double -DEVpnjlim(double vnew, - double vold, - double vt, - double vcrit, - int *icheck) +DEVpnjlim(double vnew, double vold, double vt, double vcrit, int *icheck) { double arg; @@ -78,11 +80,14 @@ DEVpnjlim(double vnew, return(vnew); } -/* limit the per-iteration change of FET voltages */ +/* + * Limit the per-iteration change of FET voltages + * + * This code has been fixed by Alan Gillespie: a new + * definition for vtstlo. + */ double -DEVfetlim(double vnew, - double vold, - double vto) +DEVfetlim(double vnew, double vold, double vto) { double vtsthi; double vtstlo; @@ -144,7 +149,10 @@ DEVfetlim(double vnew, /* Compute the MOS overlap capacitances as functions of the device - * terminal voltages */ + * terminal voltages + * + * PN 2002: As of ngspice this code is not used by any device. + */ void DEVcmeyer(double vgs0, /* initial voltage gate-source */ double vgd0, /* initial voltage gate-drain */ @@ -229,7 +237,11 @@ DEVcmeyer(double vgs0, /* initial voltage gate-source */ /* Compute the MOS overlap capacitances as functions of the device - * terminal voltages */ + * terminal voltages + * + * PN 2002: This is the Meyer model used by MOS1 MOS2 MOS3 MOS6 and MOS9 + * device models. + */ void DEVqmeyer(double vgs, /* initial voltage gate-source */ double vgd, /* initial voltage gate-drain */ @@ -296,6 +308,77 @@ DEVqmeyer(double vgs, /* initial voltage gate-source */ } +#ifdef notdef +/* XXX This is no longer used, apparently + * PN 2002: This is industrial archaelology + */ +void +DEVcap(CKTcircuit *ckt, double vgd, double vgs, double vgb, double covlgd, + double covlgs, double covlgb, double capbd, double capbs, double cggb, + double cgdb, double cgsb, double cbgb, double cbdb, double cbsb, + double *gcggb, double *gcgdb, double *gcgsb, double *gcbgb, + double *gcbdb, double *gcbsb, double *gcdgb, double *gcddb, + double *gcdsb, double *gcsgb, double *gcsdb, double *gcssb, + double qgate, double qchan, double qbulk, double *qdrn, double *qsrc, + double xqc) + + /* + * compute equivalent conductances + * divide up the channel charge (1-xqc)/xqc to source and drain + */ +{ + + double gcd; + double gcdxd; + double gcdxs; + double gcg; + double gcgxd; + double gcgxs; + double gcs; + double gcsxd; + double gcsxs; + double qgb; + double qgd; + double qgs; + + gcg = (cggb+cbgb)*ckt->CKTag[1]; + gcd = (cgdb+cbdb)*ckt->CKTag[1]; + gcs = (cgsb+cbsb)*ckt->CKTag[1]; + gcgxd = -xqc*gcg; + gcgxs = -(1-xqc)*gcg; + gcdxd = -xqc*gcd; + gcdxs = -(1-xqc)*gcd; + gcsxd = -xqc*gcs; + gcsxs = -(1-xqc)*gcs; + *gcdgb = gcgxd-covlgd*ckt->CKTag[1]; + *gcddb = gcdxd+(capbd+covlgd)*ckt->CKTag[1]; + *gcdsb = gcsxd; + *gcsgb = gcgxs-covlgs*ckt->CKTag[1]; + *gcsdb = gcdxs; + *gcssb = gcsxs+(capbs+covlgs)*ckt->CKTag[1]; + *gcggb = (cggb+covlgd+covlgs+covlgb)*ckt->CKTag[1]; + *gcgdb = (cgdb-covlgd)*ckt->CKTag[1]; + *gcgsb = (cgsb-covlgs)*ckt->CKTag[1]; + *gcbgb = (cbgb-covlgb)*ckt->CKTag[1]; + *gcbdb = (cbdb-capbd)*ckt->CKTag[1]; + *gcbsb = (cbsb-capbs)*ckt->CKTag[1]; + /* + * compute total terminal charges + */ + qgd = covlgd*vgd; + qgs = covlgs*vgs; + qgb = covlgb*vgb; + qgate = qgate+qgd+qgs+qgb; + qbulk = qbulk-qgb; + *qdrn = xqc*qchan-qgd; + *qsrc = (1-xqc)*qchan-qgs; + /* + * finished + */ +} +#endif + + /* Predict a value for the capacitor at loct by extrapolating from * previous values */ double diff --git a/src/spicelib/devices/dio/dio.c b/src/spicelib/devices/dio/dio.c index e396fd10c..bbdfbab30 100644 --- a/src/spicelib/devices/dio/dio.c +++ b/src/spicelib/devices/dio/dio.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "devdefs.h" #include "diodefs.h" #include "suffix.h" diff --git a/src/spicelib/devices/dio/dioacld.c b/src/spicelib/devices/dio/dioacld.c index f2fa5db91..3597b3a55 100644 --- a/src/spicelib/devices/dio/dioacld.c +++ b/src/spicelib/devices/dio/dioacld.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "diodefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/dio/dioask.c b/src/spicelib/devices/dio/dioask.c index 17e7cd594..d59ca1796 100644 --- a/src/spicelib/devices/dio/dioask.c +++ b/src/spicelib/devices/dio/dioask.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "const.h" #include "devdefs.h" #include "ifsim.h" diff --git a/src/spicelib/devices/dio/dioconv.c b/src/spicelib/devices/dio/dioconv.c index f8f4fd718..c9dc3b77c 100644 --- a/src/spicelib/devices/dio/dioconv.c +++ b/src/spicelib/devices/dio/dioconv.c @@ -3,7 +3,6 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles **********/ -#include #include "ngspice.h" #include "devdefs.h" #include "cktdefs.h" diff --git a/src/spicelib/devices/dio/diodel.c b/src/spicelib/devices/dio/diodel.c index bac91e0e1..14330f1b9 100644 --- a/src/spicelib/devices/dio/diodel.c +++ b/src/spicelib/devices/dio/diodel.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "diodefs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/dio/diodest.c b/src/spicelib/devices/dio/diodest.c index b92cef28a..095716d50 100644 --- a/src/spicelib/devices/dio/diodest.c +++ b/src/spicelib/devices/dio/diodest.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "diodefs.h" #include "suffix.h" diff --git a/src/spicelib/devices/dio/diodisto.c b/src/spicelib/devices/dio/diodisto.c index 8de0ec718..477b2ec98 100644 --- a/src/spicelib/devices/dio/diodisto.c +++ b/src/spicelib/devices/dio/diodisto.c @@ -4,7 +4,6 @@ Author: 1988 Jaijeet S Roychowdhury **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "diodefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/dio/diodset.c b/src/spicelib/devices/dio/diodset.c index 9c6e3637e..5883a34a6 100644 --- a/src/spicelib/devices/dio/diodset.c +++ b/src/spicelib/devices/dio/diodset.c @@ -4,7 +4,6 @@ Author: 1988 Jaijeet S Roychowdhury **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "diodefs.h" #include "const.h" diff --git a/src/spicelib/devices/dio/diogetic.c b/src/spicelib/devices/dio/diogetic.c index ccf539e5e..70efe67a2 100644 --- a/src/spicelib/devices/dio/diogetic.c +++ b/src/spicelib/devices/dio/diogetic.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "diodefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/dio/dioinit.c b/src/spicelib/devices/dio/dioinit.c index f1df1ff4e..70804d8f6 100644 --- a/src/spicelib/devices/dio/dioinit.c +++ b/src/spicelib/devices/dio/dioinit.c @@ -69,7 +69,9 @@ SPICEdev DIOinfo = { DEVsenTrunc : NULL, DEVdisto : DIOdisto, DEVnoise : DIOnoise, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, DEVinstSize : &DIOiSize, DEVmodSize : &DIOmSize }; diff --git a/src/spicelib/devices/dio/dioload.c b/src/spicelib/devices/dio/dioload.c index d1481d5b3..8f3483665 100644 --- a/src/spicelib/devices/dio/dioload.c +++ b/src/spicelib/devices/dio/dioload.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "devdefs.h" #include "cktdefs.h" #include "diodefs.h" diff --git a/src/spicelib/devices/dio/diomask.c b/src/spicelib/devices/dio/diomask.c index 51410ed35..a8f5f1748 100644 --- a/src/spicelib/devices/dio/diomask.c +++ b/src/spicelib/devices/dio/diomask.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "const.h" #include "cktdefs.h" #include "ifsim.h" diff --git a/src/spicelib/devices/dio/diomdel.c b/src/spicelib/devices/dio/diomdel.c index 0ab248dc8..31eb18c26 100644 --- a/src/spicelib/devices/dio/diomdel.c +++ b/src/spicelib/devices/dio/diomdel.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "diodefs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/dio/diompar.c b/src/spicelib/devices/dio/diompar.c index e8cf88f96..4abd43314 100644 --- a/src/spicelib/devices/dio/diompar.c +++ b/src/spicelib/devices/dio/diompar.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "diodefs.h" diff --git a/src/spicelib/devices/dio/dionoise.c b/src/spicelib/devices/dio/dionoise.c index 624faa0ef..75bd8b79c 100644 --- a/src/spicelib/devices/dio/dionoise.c +++ b/src/spicelib/devices/dio/dionoise.c @@ -4,7 +4,6 @@ Author: 1987 Gary W. Ng **********/ #include "ngspice.h" -#include #include "diodefs.h" #include "cktdefs.h" #include "iferrmsg.h" diff --git a/src/spicelib/devices/dio/dioparam.c b/src/spicelib/devices/dio/dioparam.c index a34222efd..445d996c9 100644 --- a/src/spicelib/devices/dio/dioparam.c +++ b/src/spicelib/devices/dio/dioparam.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "diodefs.h" diff --git a/src/spicelib/devices/dio/diopzld.c b/src/spicelib/devices/dio/diopzld.c index 4f7dff7a4..5c7433842 100644 --- a/src/spicelib/devices/dio/diopzld.c +++ b/src/spicelib/devices/dio/diopzld.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "complex.h" #include "sperror.h" diff --git a/src/spicelib/devices/dio/diosacl.c b/src/spicelib/devices/dio/diosacl.c index 3e46bd455..086b106ee 100644 --- a/src/spicelib/devices/dio/diosacl.c +++ b/src/spicelib/devices/dio/diosacl.c @@ -10,7 +10,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "smpdefs.h" #include "const.h" #include "cktdefs.h" diff --git a/src/spicelib/devices/dio/diosetup.c b/src/spicelib/devices/dio/diosetup.c index 7c8d08a40..737c4ef8a 100644 --- a/src/spicelib/devices/dio/diosetup.c +++ b/src/spicelib/devices/dio/diosetup.c @@ -9,7 +9,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "diodefs.h" diff --git a/src/spicelib/devices/dio/diosload.c b/src/spicelib/devices/dio/diosload.c index 864a8a3a5..20051addb 100644 --- a/src/spicelib/devices/dio/diosload.c +++ b/src/spicelib/devices/dio/diosload.c @@ -10,7 +10,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "diodefs.h" diff --git a/src/spicelib/devices/dio/diosprt.c b/src/spicelib/devices/dio/diosprt.c index 280db644a..635701381 100644 --- a/src/spicelib/devices/dio/diosprt.c +++ b/src/spicelib/devices/dio/diosprt.c @@ -10,7 +10,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "diodefs.h" diff --git a/src/spicelib/devices/dio/diosset.c b/src/spicelib/devices/dio/diosset.c index afe8f7325..86098414f 100644 --- a/src/spicelib/devices/dio/diosset.c +++ b/src/spicelib/devices/dio/diosset.c @@ -10,7 +10,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "diodefs.h" diff --git a/src/spicelib/devices/dio/diosupd.c b/src/spicelib/devices/dio/diosupd.c index aa76ef402..c1829564a 100644 --- a/src/spicelib/devices/dio/diosupd.c +++ b/src/spicelib/devices/dio/diosupd.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles /* update the charge sensitivities and their derivatives */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "diodefs.h" diff --git a/src/spicelib/devices/dio/diotemp.c b/src/spicelib/devices/dio/diotemp.c index 742b7fda0..7a6e70446 100644 --- a/src/spicelib/devices/dio/diotemp.c +++ b/src/spicelib/devices/dio/diotemp.c @@ -7,7 +7,6 @@ Modified: 2000 AlansFixes /* perform the temperature update to the diode */ #include "ngspice.h" -#include #include "cktdefs.h" #include "diodefs.h" #include "const.h" diff --git a/src/spicelib/devices/dio/diotrunc.c b/src/spicelib/devices/dio/diotrunc.c index 1d4b805a3..501d3d74f 100644 --- a/src/spicelib/devices/dio/diotrunc.c +++ b/src/spicelib/devices/dio/diotrunc.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "diodefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/hfet1/hfetinit.c b/src/spicelib/devices/hfet1/hfetinit.c index eab29cdb0..032ecef9f 100644 --- a/src/spicelib/devices/hfet1/hfetinit.c +++ b/src/spicelib/devices/hfet1/hfetinit.c @@ -67,7 +67,10 @@ SPICEdev HFETAinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, DEVnoise : NULL, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &HFETAiSize, DEVmodSize : &HFETAmSize diff --git a/src/spicelib/devices/hfet2/hfet2init.c b/src/spicelib/devices/hfet2/hfet2init.c index 1c141a19d..0e6a5ae14 100644 --- a/src/spicelib/devices/hfet2/hfet2init.c +++ b/src/spicelib/devices/hfet2/hfet2init.c @@ -67,7 +67,10 @@ SPICEdev HFET2info = { DEVsenTrunc : NULL, DEVdisto : NULL, DEVnoise : NULL, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &HFET2iSize, DEVmodSize : &HFET2mSize diff --git a/src/spicelib/devices/ind/ind.c b/src/spicelib/devices/ind/ind.c index f9a166e47..6906ebd04 100644 --- a/src/spicelib/devices/ind/ind.c +++ b/src/spicelib/devices/ind/ind.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles #include "ngspice.h" #include "devdefs.h" #include "ifsim.h" -#include #include "inddefs.h" #include "suffix.h" diff --git a/src/spicelib/devices/ind/indacld.c b/src/spicelib/devices/ind/indacld.c index ef3a3e3e7..faef1446e 100644 --- a/src/spicelib/devices/ind/indacld.c +++ b/src/spicelib/devices/ind/indacld.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "inddefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/ind/indask.c b/src/spicelib/devices/ind/indask.c index 4dfeaa543..5a0154937 100644 --- a/src/spicelib/devices/ind/indask.c +++ b/src/spicelib/devices/ind/indask.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "inddefs.h" #include "ifsim.h" #include "cktdefs.h" diff --git a/src/spicelib/devices/ind/inddel.c b/src/spicelib/devices/ind/inddel.c index faabba275..12a449b19 100644 --- a/src/spicelib/devices/ind/inddel.c +++ b/src/spicelib/devices/ind/inddel.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "inddefs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/ind/inddest.c b/src/spicelib/devices/ind/inddest.c index 072162b8b..d249737bd 100644 --- a/src/spicelib/devices/ind/inddest.c +++ b/src/spicelib/devices/ind/inddest.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "inddefs.h" #include "suffix.h" diff --git a/src/spicelib/devices/ind/indinit.c b/src/spicelib/devices/ind/indinit.c index 3bb334cad..73a4a8919 100644 --- a/src/spicelib/devices/ind/indinit.c +++ b/src/spicelib/devices/ind/indinit.c @@ -66,7 +66,10 @@ SPICEdev INDinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, /* DISTO */ DEVnoise : NULL, /* NOISE */ - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &INDiSize, DEVmodSize : &INDmSize diff --git a/src/spicelib/devices/ind/indload.c b/src/spicelib/devices/ind/indload.c index a96301fbc..645d5b1c2 100644 --- a/src/spicelib/devices/ind/indload.c +++ b/src/spicelib/devices/ind/indload.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "inddefs.h" #include "trandefs.h" diff --git a/src/spicelib/devices/ind/indmdel.c b/src/spicelib/devices/ind/indmdel.c index 827a29133..a4c84d303 100644 --- a/src/spicelib/devices/ind/indmdel.c +++ b/src/spicelib/devices/ind/indmdel.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "inddefs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/ind/indparam.c b/src/spicelib/devices/ind/indparam.c index f2deb4b71..ff2f7bc5d 100644 --- a/src/spicelib/devices/ind/indparam.c +++ b/src/spicelib/devices/ind/indparam.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "ifsim.h" #include "inddefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/ind/indpzld.c b/src/spicelib/devices/ind/indpzld.c index d81c63198..10388522b 100644 --- a/src/spicelib/devices/ind/indpzld.c +++ b/src/spicelib/devices/ind/indpzld.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "complex.h" #include "sperror.h" diff --git a/src/spicelib/devices/ind/indsacl.c b/src/spicelib/devices/ind/indsacl.c index 289538610..1885bf83e 100644 --- a/src/spicelib/devices/ind/indsacl.c +++ b/src/spicelib/devices/ind/indsacl.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "inddefs.h" diff --git a/src/spicelib/devices/ind/indsetup.c b/src/spicelib/devices/ind/indsetup.c index 104bf3567..3e54ec7fb 100644 --- a/src/spicelib/devices/ind/indsetup.c +++ b/src/spicelib/devices/ind/indsetup.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "inddefs.h" diff --git a/src/spicelib/devices/ind/indsload.c b/src/spicelib/devices/ind/indsload.c index 3fd027242..fdcba9369 100644 --- a/src/spicelib/devices/ind/indsload.c +++ b/src/spicelib/devices/ind/indsload.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "inddefs.h" diff --git a/src/spicelib/devices/ind/indsprt.c b/src/spicelib/devices/ind/indsprt.c index 2de24a336..7597283d9 100644 --- a/src/spicelib/devices/ind/indsprt.c +++ b/src/spicelib/devices/ind/indsprt.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "inddefs.h" diff --git a/src/spicelib/devices/ind/indsset.c b/src/spicelib/devices/ind/indsset.c index c1e036742..7a443290c 100644 --- a/src/spicelib/devices/ind/indsset.c +++ b/src/spicelib/devices/ind/indsset.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "inddefs.h" diff --git a/src/spicelib/devices/ind/indsupd.c b/src/spicelib/devices/ind/indsupd.c index c9e8fda46..593883f02 100644 --- a/src/spicelib/devices/ind/indsupd.c +++ b/src/spicelib/devices/ind/indsupd.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles /* update the charge sensitivities and their derivatives */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "inddefs.h" diff --git a/src/spicelib/devices/ind/indtrunc.c b/src/spicelib/devices/ind/indtrunc.c index c3a4cb26f..d391dcac1 100644 --- a/src/spicelib/devices/ind/indtrunc.c +++ b/src/spicelib/devices/ind/indtrunc.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "inddefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/ind/mutacld.c b/src/spicelib/devices/ind/mutacld.c index 47602fbd3..f6e91fd51 100644 --- a/src/spicelib/devices/ind/mutacld.c +++ b/src/spicelib/devices/ind/mutacld.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "inddefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/ind/mutask.c b/src/spicelib/devices/ind/mutask.c index 69cb6b26c..dd0cf42ac 100644 --- a/src/spicelib/devices/ind/mutask.c +++ b/src/spicelib/devices/ind/mutask.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "inddefs.h" #include "ifsim.h" #include "cktdefs.h" diff --git a/src/spicelib/devices/ind/mutdel.c b/src/spicelib/devices/ind/mutdel.c index ba993efa0..78ad9019b 100644 --- a/src/spicelib/devices/ind/mutdel.c +++ b/src/spicelib/devices/ind/mutdel.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "inddefs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/ind/mutdest.c b/src/spicelib/devices/ind/mutdest.c index a8a104e04..6034e1fd7 100644 --- a/src/spicelib/devices/ind/mutdest.c +++ b/src/spicelib/devices/ind/mutdest.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "inddefs.h" #include "suffix.h" diff --git a/src/spicelib/devices/ind/mutmdel.c b/src/spicelib/devices/ind/mutmdel.c index fe31fb7ac..fe11a2227 100644 --- a/src/spicelib/devices/ind/mutmdel.c +++ b/src/spicelib/devices/ind/mutmdel.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "inddefs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/ind/mutparam.c b/src/spicelib/devices/ind/mutparam.c index 983a80dac..d26d37500 100644 --- a/src/spicelib/devices/ind/mutparam.c +++ b/src/spicelib/devices/ind/mutparam.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "ifsim.h" #include "inddefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/ind/mutpzld.c b/src/spicelib/devices/ind/mutpzld.c index 8b3053dcd..87f273a3f 100644 --- a/src/spicelib/devices/ind/mutpzld.c +++ b/src/spicelib/devices/ind/mutpzld.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "complex.h" #include "sperror.h" diff --git a/src/spicelib/devices/ind/mutsetup.c b/src/spicelib/devices/ind/mutsetup.c index 6bce9baf5..cdc23e1b3 100644 --- a/src/spicelib/devices/ind/mutsetup.c +++ b/src/spicelib/devices/ind/mutsetup.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "ifsim.h" #include "smpdefs.h" #include "cktdefs.h" diff --git a/src/spicelib/devices/ind/mutsprt.c b/src/spicelib/devices/ind/mutsprt.c index f70466afb..9b2da891b 100644 --- a/src/spicelib/devices/ind/mutsprt.c +++ b/src/spicelib/devices/ind/mutsprt.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "inddefs.h" diff --git a/src/spicelib/devices/ind/mutsset.c b/src/spicelib/devices/ind/mutsset.c index fafcdecb2..2dc9e865f 100644 --- a/src/spicelib/devices/ind/mutsset.c +++ b/src/spicelib/devices/ind/mutsset.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "ifsim.h" #include "smpdefs.h" #include "cktdefs.h" diff --git a/src/spicelib/devices/isrc/isrcinit.c b/src/spicelib/devices/isrc/isrcinit.c index 535187d29..4b539fbe8 100644 --- a/src/spicelib/devices/isrc/isrcinit.c +++ b/src/spicelib/devices/isrc/isrcinit.c @@ -67,7 +67,10 @@ SPICEdev ISRCinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, /* DISTO */ DEVnoise : NULL, /* NOISE */ - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &ISRCiSize, DEVmodSize : &ISRCmSize }; diff --git a/src/spicelib/devices/jfet/jfetinit.c b/src/spicelib/devices/jfet/jfetinit.c index 805a3305c..60d276d5d 100644 --- a/src/spicelib/devices/jfet/jfetinit.c +++ b/src/spicelib/devices/jfet/jfetinit.c @@ -67,7 +67,10 @@ SPICEdev JFETinfo = { DEVsenTrunc : NULL, DEVdisto : JFETdisto, DEVnoise : JFETnoise, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &JFETiSize, DEVmodSize : &JFETmSize diff --git a/src/spicelib/devices/jfet2/jfet2init.c b/src/spicelib/devices/jfet2/jfet2init.c index 506ba4779..022f2c106 100644 --- a/src/spicelib/devices/jfet2/jfet2init.c +++ b/src/spicelib/devices/jfet2/jfet2init.c @@ -67,7 +67,10 @@ SPICEdev JFET2info = { DEVsenTrunc : NULL, DEVdisto : NULL, /* AN_disto */ DEVnoise : JFET2noise, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &JFET2iSize, DEVmodSize : &JFET2mSize diff --git a/src/spicelib/devices/ltra/ltrainit.c b/src/spicelib/devices/ltra/ltrainit.c index bd9e658fe..a5054bf4c 100644 --- a/src/spicelib/devices/ltra/ltrainit.c +++ b/src/spicelib/devices/ltra/ltrainit.c @@ -67,7 +67,10 @@ SPICEdev LTRAinfo = { DEVsenTrunc : NULL, /* */ DEVdisto : NULL, /* disto */ DEVnoise : NULL, /* noise */ - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : <RAiSize, DEVmodSize : <RAmSize diff --git a/src/spicelib/devices/mes/mesinit.c b/src/spicelib/devices/mes/mesinit.c index fa100c20e..0c2a728ad 100644 --- a/src/spicelib/devices/mes/mesinit.c +++ b/src/spicelib/devices/mes/mesinit.c @@ -67,7 +67,10 @@ SPICEdev MESinfo = { DEVsenTrunc : NULL, DEVdisto : MESdisto, DEVnoise : MESnoise, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &MESiSize, DEVmodSize : &MESmSize diff --git a/src/spicelib/devices/mesa/mesainit.c b/src/spicelib/devices/mesa/mesainit.c index cd0b7f8b0..dcc1a7fd5 100644 --- a/src/spicelib/devices/mesa/mesainit.c +++ b/src/spicelib/devices/mesa/mesainit.c @@ -67,7 +67,10 @@ SPICEdev MESAinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, DEVnoise : NULL, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &MESAiSize, DEVmodSize : &MESAmSize diff --git a/src/spicelib/devices/mos1/mos1.c b/src/spicelib/devices/mos1/mos1.c index cdad2144e..7b382e094 100644 --- a/src/spicelib/devices/mos1/mos1.c +++ b/src/spicelib/devices/mos1/mos1.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "devdefs.h" #include "ifsim.h" #include "mos1defs.h" diff --git a/src/spicelib/devices/mos1/mos1acld.c b/src/spicelib/devices/mos1/mos1acld.c index b6edf7785..b880d0566 100644 --- a/src/spicelib/devices/mos1/mos1acld.c +++ b/src/spicelib/devices/mos1/mos1acld.c @@ -7,7 +7,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos1defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/mos1/mos1ask.c b/src/spicelib/devices/mos1/mos1ask.c index ac6fb97b6..53757dfc0 100644 --- a/src/spicelib/devices/mos1/mos1ask.c +++ b/src/spicelib/devices/mos1/mos1ask.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "cktdefs.h" diff --git a/src/spicelib/devices/mos1/mos1conv.c b/src/spicelib/devices/mos1/mos1conv.c index d9b976579..59ec9ffc0 100644 --- a/src/spicelib/devices/mos1/mos1conv.c +++ b/src/spicelib/devices/mos1/mos1conv.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos1defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/mos1/mos1del.c b/src/spicelib/devices/mos1/mos1del.c index 4a89b4d9a..78ff314e4 100644 --- a/src/spicelib/devices/mos1/mos1del.c +++ b/src/spicelib/devices/mos1/mos1del.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "mos1defs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/mos1/mos1dest.c b/src/spicelib/devices/mos1/mos1dest.c index 7e1f78b98..edd2f7f12 100644 --- a/src/spicelib/devices/mos1/mos1dest.c +++ b/src/spicelib/devices/mos1/mos1dest.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "mos1defs.h" #include "suffix.h" diff --git a/src/spicelib/devices/mos1/mos1dist.c b/src/spicelib/devices/mos1/mos1dist.c index a0c884f54..eba5334ed 100644 --- a/src/spicelib/devices/mos1/mos1dist.c +++ b/src/spicelib/devices/mos1/mos1dist.c @@ -4,7 +4,6 @@ Author: 1988 Jaijeet S Roychowdhury **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos1defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/mos1/mos1dset.c b/src/spicelib/devices/mos1/mos1dset.c index 8278f01ad..4bb4b9107 100644 --- a/src/spicelib/devices/mos1/mos1dset.c +++ b/src/spicelib/devices/mos1/mos1dset.c @@ -4,7 +4,6 @@ Author: 1988 Jaijeet S Roychowdhury **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "devdefs.h" #include "mos1defs.h" diff --git a/src/spicelib/devices/mos1/mos1ic.c b/src/spicelib/devices/mos1/mos1ic.c index efab88487..22172e9a1 100644 --- a/src/spicelib/devices/mos1/mos1ic.c +++ b/src/spicelib/devices/mos1/mos1ic.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos1defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/mos1/mos1init.c b/src/spicelib/devices/mos1/mos1init.c index 23e10f624..a4e4a488a 100644 --- a/src/spicelib/devices/mos1/mos1init.c +++ b/src/spicelib/devices/mos1/mos1init.c @@ -67,7 +67,10 @@ SPICEdev MOS1info = { DEVsenTrunc : NULL, DEVdisto : MOS1disto, DEVnoise : MOS1noise, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &MOS1iSize, DEVmodSize : &MOS1mSize }; diff --git a/src/spicelib/devices/mos1/mos1load.c b/src/spicelib/devices/mos1/mos1load.c index be0bd20f1..41c3db55b 100644 --- a/src/spicelib/devices/mos1/mos1load.c +++ b/src/spicelib/devices/mos1/mos1load.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "devdefs.h" #include "mos1defs.h" @@ -76,11 +75,25 @@ MOS1load(inModel,ckt) double capgd; /* total gate-drain capacitance */ double capgb; /* total gate-bulk capacitance */ int Check; +#ifndef NOBYPASS double tempv; +#endif /*NOBYPASS*/ int error; + #ifdef CAPBYPASS + int senflag; +#endif /*CAPBYPASS*/ int SenCond; + +#ifdef CAPBYPASS + senflag = 0; + if(ckt->CKTsenInfo && ckt->CKTsenInfo->SENstatus == PERTURBATION && + (ckt->CKTsenInfo->SENmode & (ACSEN | TRANSEN))) { + senflag = 1; + } +#endif /* CAPBYPASS */ + /* loop through all the MOS1 device models */ for( ; model != NULL; model = model->MOS1nextModel ) { @@ -264,6 +277,7 @@ MOS1load(inModel,ckt) */ +#ifndef NOBYPASS /* now lets see if we can bypass (ugh) */ tempv = (MAX(fabs(cbhat), fabs(here->MOS1cbs + here->MOS1cbd)) + @@ -329,6 +343,7 @@ MOS1load(inModel,ckt) } goto bypass; } +#endif /*NOBYPASS*/ /* @@ -543,9 +558,18 @@ next1: if(vbs <= -3*vt) { * *.. bulk-drain and bulk-source depletion capacitances */ +#ifdef CAPBYPASS + if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || + fabs(delvbs) >= ckt->CKTreltol * MAX(fabs(vbs), + fabs(*(ckt->CKTstate0+here->MOS1vbs)))+ + ckt->CKTvoltTol)|| senflag) +#endif /*CAPBYPASS*/ + { /* can't bypass the diode capacitance calculations */ +#ifdef CAPZEROBYPASS if(here->MOS1Cbs != 0 || here->MOS1Cbssw != 0 ) { +#endif /*CAPZEROBYPASS*/ if (vbs < here->MOS1tDepCap){ arg=1-vbs/here->MOS1tBulkPot; /* @@ -597,14 +621,25 @@ next1: if(vbs <= -3*vt) { vbs*(here->MOS1f2s+vbs*(here->MOS1f3s/2)); here->MOS1capbs=here->MOS1f2s+here->MOS1f3s*vbs; } +#ifdef CAPZEROBYPASS } else { *(ckt->CKTstate0 + here->MOS1qbs) = 0; here->MOS1capbs=0; } +#endif /*CAPZEROBYPASS*/ } +#ifdef CAPBYPASS + if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || + fabs(delvbd) >= ckt->CKTreltol * MAX(fabs(vbd), + fabs(*(ckt->CKTstate0+here->MOS1vbd)))+ + ckt->CKTvoltTol)|| senflag) +#endif /*CAPBYPASS*/ + /* can't bypass the diode capacitance calculations */ { +#ifdef CAPZEROBYPASS if(here->MOS1Cbd != 0 || here->MOS1Cbdsw != 0 ) { +#endif /*CAPZEROBYPASS*/ if (vbd < here->MOS1tDepCap) { arg=1-vbd/here->MOS1tBulkPot; /* @@ -651,10 +686,12 @@ next1: if(vbs <= -3*vt) { vbd * (here->MOS1f2d + vbd * here->MOS1f3d/2); here->MOS1capbd=here->MOS1f2d + vbd * here->MOS1f3d; } +#ifdef CAPZEROBYPASS } else { *(ckt->CKTstate0 + here->MOS1qbd) = 0; here->MOS1capbd = 0; } +#endif /*CAPZEROBYPASS*/ } /* diff --git a/src/spicelib/devices/mos1/mos1mask.c b/src/spicelib/devices/mos1/mos1mask.c index f5509c3e1..d75c02d0f 100644 --- a/src/spicelib/devices/mos1/mos1mask.c +++ b/src/spicelib/devices/mos1/mos1mask.c @@ -4,7 +4,6 @@ Author: 1987 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "cktdefs.h" diff --git a/src/spicelib/devices/mos1/mos1mdel.c b/src/spicelib/devices/mos1/mos1mdel.c index 7669da534..76a0d6d88 100644 --- a/src/spicelib/devices/mos1/mos1mdel.c +++ b/src/spicelib/devices/mos1/mos1mdel.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "mos1defs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/mos1/mos1mpar.c b/src/spicelib/devices/mos1/mos1mpar.c index 9e08d2b56..48e31b423 100644 --- a/src/spicelib/devices/mos1/mos1mpar.c +++ b/src/spicelib/devices/mos1/mos1mpar.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "mos1defs.h" diff --git a/src/spicelib/devices/mos1/mos1noi.c b/src/spicelib/devices/mos1/mos1noi.c index 1da24d77e..44b4b7d4b 100644 --- a/src/spicelib/devices/mos1/mos1noi.c +++ b/src/spicelib/devices/mos1/mos1noi.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "mos1defs.h" #include "cktdefs.h" #include "iferrmsg.h" diff --git a/src/spicelib/devices/mos1/mos1par.c b/src/spicelib/devices/mos1/mos1par.c index c0b137da7..2e742ebd3 100644 --- a/src/spicelib/devices/mos1/mos1par.c +++ b/src/spicelib/devices/mos1/mos1par.c @@ -7,7 +7,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "mos1defs.h" diff --git a/src/spicelib/devices/mos1/mos1pzld.c b/src/spicelib/devices/mos1/mos1pzld.c index 0f8d2f7d0..7495cd3c8 100644 --- a/src/spicelib/devices/mos1/mos1pzld.c +++ b/src/spicelib/devices/mos1/mos1pzld.c @@ -7,7 +7,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "cktdefs.h" #include "complex.h" #include "mos1defs.h" diff --git a/src/spicelib/devices/mos1/mos1sacl.c b/src/spicelib/devices/mos1/mos1sacl.c index eab4eff94..6e4f33f5f 100644 --- a/src/spicelib/devices/mos1/mos1sacl.c +++ b/src/spicelib/devices/mos1/mos1sacl.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "const.h" diff --git a/src/spicelib/devices/mos1/mos1set.c b/src/spicelib/devices/mos1/mos1set.c index 1377fcb44..8f65f4439 100644 --- a/src/spicelib/devices/mos1/mos1set.c +++ b/src/spicelib/devices/mos1/mos1set.c @@ -9,7 +9,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "mos1defs.h" diff --git a/src/spicelib/devices/mos1/mos1sld.c b/src/spicelib/devices/mos1/mos1sld.c index e885afd1c..70be120d0 100644 --- a/src/spicelib/devices/mos1/mos1sld.c +++ b/src/spicelib/devices/mos1/mos1sld.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "mos1defs.h" diff --git a/src/spicelib/devices/mos1/mos1sprt.c b/src/spicelib/devices/mos1/mos1sprt.c index 818ea38e3..06bed1963 100644 --- a/src/spicelib/devices/mos1/mos1sprt.c +++ b/src/spicelib/devices/mos1/mos1sprt.c @@ -9,7 +9,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "mos1defs.h" diff --git a/src/spicelib/devices/mos1/mos1sset.c b/src/spicelib/devices/mos1/mos1sset.c index 2096fc469..220b14bdb 100644 --- a/src/spicelib/devices/mos1/mos1sset.c +++ b/src/spicelib/devices/mos1/mos1sset.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "mos1defs.h" diff --git a/src/spicelib/devices/mos1/mos1supd.c b/src/spicelib/devices/mos1/mos1supd.c index 9726eb124..408275787 100644 --- a/src/spicelib/devices/mos1/mos1supd.c +++ b/src/spicelib/devices/mos1/mos1supd.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "mos1defs.h" diff --git a/src/spicelib/devices/mos1/mos1temp.c b/src/spicelib/devices/mos1/mos1temp.c index cb94f6157..87ebed5c4 100644 --- a/src/spicelib/devices/mos1/mos1temp.c +++ b/src/spicelib/devices/mos1/mos1temp.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos1defs.h" #include "const.h" diff --git a/src/spicelib/devices/mos1/mos1trun.c b/src/spicelib/devices/mos1/mos1trun.c index 48dec293e..29008c84f 100644 --- a/src/spicelib/devices/mos1/mos1trun.c +++ b/src/spicelib/devices/mos1/mos1trun.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos1defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/mos2/mos2.c b/src/spicelib/devices/mos2/mos2.c index b51c7b011..fa2d12254 100644 --- a/src/spicelib/devices/mos2/mos2.c +++ b/src/spicelib/devices/mos2/mos2.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFIxes **********/ #include "ngspice.h" -#include #include "devdefs.h" #include "ifsim.h" #include "mos2defs.h" diff --git a/src/spicelib/devices/mos2/mos2acld.c b/src/spicelib/devices/mos2/mos2acld.c index f773ed78e..02f69651b 100644 --- a/src/spicelib/devices/mos2/mos2acld.c +++ b/src/spicelib/devices/mos2/mos2acld.c @@ -7,7 +7,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos2defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/mos2/mos2ask.c b/src/spicelib/devices/mos2/mos2ask.c index 1849e9344..5217d5286 100644 --- a/src/spicelib/devices/mos2/mos2ask.c +++ b/src/spicelib/devices/mos2/mos2ask.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "cktdefs.h" diff --git a/src/spicelib/devices/mos2/mos2conv.c b/src/spicelib/devices/mos2/mos2conv.c index 2eeb5b9e7..ee2c6e756 100644 --- a/src/spicelib/devices/mos2/mos2conv.c +++ b/src/spicelib/devices/mos2/mos2conv.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos2defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/mos2/mos2del.c b/src/spicelib/devices/mos2/mos2del.c index ee2ec9d49..a520f72cc 100644 --- a/src/spicelib/devices/mos2/mos2del.c +++ b/src/spicelib/devices/mos2/mos2del.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "mos2defs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/mos2/mos2dest.c b/src/spicelib/devices/mos2/mos2dest.c index e760b42b2..2dbad2eb7 100644 --- a/src/spicelib/devices/mos2/mos2dest.c +++ b/src/spicelib/devices/mos2/mos2dest.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "mos2defs.h" #include "suffix.h" diff --git a/src/spicelib/devices/mos2/mos2dist.c b/src/spicelib/devices/mos2/mos2dist.c index a4bca0f4e..a95669309 100644 --- a/src/spicelib/devices/mos2/mos2dist.c +++ b/src/spicelib/devices/mos2/mos2dist.c @@ -4,7 +4,6 @@ Author: 1988 Jaijeet S Roychowdhury **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos2defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/mos2/mos2dset.c b/src/spicelib/devices/mos2/mos2dset.c index 409c613db..a073bb592 100644 --- a/src/spicelib/devices/mos2/mos2dset.c +++ b/src/spicelib/devices/mos2/mos2dset.c @@ -4,7 +4,6 @@ Author: 1988 Jaijeet S Roychowdhury Modified: 2000 AlansFixes **********/ -#include #include "ngspice.h" #include "distodef.h" #include "devdefs.h" diff --git a/src/spicelib/devices/mos2/mos2ic.c b/src/spicelib/devices/mos2/mos2ic.c index 00b1ed27d..942560953 100644 --- a/src/spicelib/devices/mos2/mos2ic.c +++ b/src/spicelib/devices/mos2/mos2ic.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos2defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/mos2/mos2init.c b/src/spicelib/devices/mos2/mos2init.c index 3f58f6b14..4f03a2c03 100644 --- a/src/spicelib/devices/mos2/mos2init.c +++ b/src/spicelib/devices/mos2/mos2init.c @@ -67,7 +67,10 @@ SPICEdev MOS2info = { DEVsenTrunc : NULL, DEVdisto : MOS2disto, DEVnoise : MOS2noise, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &MOS2iSize, DEVmodSize : &MOS2mSize }; diff --git a/src/spicelib/devices/mos2/mos2load.c b/src/spicelib/devices/mos2/mos2load.c index 6ccda5825..6a08082dd 100644 --- a/src/spicelib/devices/mos2/mos2load.c +++ b/src/spicelib/devices/mos2/mos2load.c @@ -5,7 +5,6 @@ Modified: 2000 alansFixes **********/ #include "ngspice.h" -#include #include "devdefs.h" #include "cktdefs.h" #include "mos2defs.h" @@ -83,9 +82,26 @@ MOS2load(inModel,ckt) int xnrm; int xrev; int Check; +#ifndef NOBYPASS double tempv; +#endif /*NOBYPASS*/ +#ifdef CAPBYPASS + int senflag; +#endif /* CAPBYPASS */ int SenCond=0; +#ifdef CAPBYPASS + senflag = 0; + if(ckt->CKTsenInfo){ + if(ckt->CKTsenInfo->SENstatus == PERTURBATION){ + if((ckt->CKTsenInfo->SENmode == ACSEN)|| + (ckt->CKTsenInfo->SENmode == TRANSEN)){ + senflag = 1; + } + } + } +#endif /* CAPBYPASS */ + /* loop through all the MOS2 device models */ for( ; model != NULL; model = model->MOS2nextModel ) { @@ -257,6 +273,7 @@ MOS2load(inModel,ckt) * can't handle it in one piece, so it is broken up * into several stages here */ +#ifndef NOBYPASS tempv = MAX(fabs(cbhat),fabs(here->MOS2cbs+here->MOS2cbd))+ ckt->CKTabstol; if((!(ckt->CKTmode & (MODEINITPRED|MODEINITTRAN|MODEINITSMSIG) @@ -309,6 +326,7 @@ MOS2load(inModel,ckt) } goto bypass; } +#endif /*NOBYPASS*/ /* ok - bypass is out, do it the hard way */ von = model->MOS2type * here->MOS2von; @@ -1010,10 +1028,19 @@ doneval: * *.. bulk-drain and bulk-source depletion capacitances */ +#ifdef CAPBYPASS + if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || + fabs(delvbs) >= ckt->CKTreltol * MAX(fabs(vbs), + fabs(*(ckt->CKTstate0+here->MOS2vbs)))+ + ckt->CKTvoltTol)|| senflag) +#endif /*CAPBYPASS*/ + { /* can't bypass the diode capacitance calculations */ +#ifdef CAPZEROBYPASS if(here->MOS2Cbs != 0 || here->MOS2Cbssw != 0) { - if (vbs < here->MOS2tDepCap){ +#endif /*CAPZEROBYPASS*/ + if (vbs < here->MOS2tDepCap){ arg=1-vbs/here->MOS2tBulkPot; /* * the following block looks somewhat long and messy, @@ -1064,14 +1091,25 @@ doneval: vbs*(here->MOS2f2s+vbs*(here->MOS2f3s/2)); here->MOS2capbs=here->MOS2f2s+here->MOS2f3s*vbs; } +#ifdef CAPZEROBYPASS } else { *(ckt->CKTstate0 + here->MOS2qbs) = 0; here->MOS2capbs=0; } +#endif /*CAPZEROBYPASS*/ } +#ifdef CAPBYPASS + if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || + fabs(delvbd) >= ckt->CKTreltol * MAX(fabs(vbd), + fabs(*(ckt->CKTstate0+here->MOS2vbd)))+ + ckt->CKTvoltTol)|| senflag) +#endif /*CAPBYPASS*/ + /* can't bypass the diode capacitance calculations */ { +#ifdef CAPZEROBYPASS if(here->MOS2Cbd != 0 || here->MOS2Cbdsw != 0 ) { +#endif /*CAPZEROBYPASS*/ if (vbd < here->MOS2tDepCap) { arg=1-vbd/here->MOS2tBulkPot; /* @@ -1118,10 +1156,12 @@ doneval: vbd * (here->MOS2f2d + vbd * here->MOS2f3d/2); here->MOS2capbd=here->MOS2f2d + vbd * here->MOS2f3d; } +#ifdef CAPZEROBYPASS } else { *(ckt->CKTstate0 + here->MOS2qbd) = 0; here->MOS2capbd = 0; } +#endif /*CAPZEROBYPASS*/ } if(SenCond && (ckt->CKTsenInfo->SENmode==TRANSEN)) goto next2; @@ -1254,7 +1294,9 @@ next2: *(ckt->CKTstate0 + here->MOS2vbs) = vbs; } #endif /* PREDICTOR */ } +#ifndef NOBYPASS bypass: +#endif /* NOBYPASS */ if(SenCond) continue; diff --git a/src/spicelib/devices/mos2/mos2mask.c b/src/spicelib/devices/mos2/mos2mask.c index 4713b8efc..1b93f65ea 100644 --- a/src/spicelib/devices/mos2/mos2mask.c +++ b/src/spicelib/devices/mos2/mos2mask.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "mos2defs.h" diff --git a/src/spicelib/devices/mos2/mos2mdel.c b/src/spicelib/devices/mos2/mos2mdel.c index 83043dd1e..55af19900 100644 --- a/src/spicelib/devices/mos2/mos2mdel.c +++ b/src/spicelib/devices/mos2/mos2mdel.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "mos2defs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/mos2/mos2mpar.c b/src/spicelib/devices/mos2/mos2mpar.c index 3c85b9b70..2436e1718 100644 --- a/src/spicelib/devices/mos2/mos2mpar.c +++ b/src/spicelib/devices/mos2/mos2mpar.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "mos2defs.h" diff --git a/src/spicelib/devices/mos2/mos2noi.c b/src/spicelib/devices/mos2/mos2noi.c index 9e9a6fa18..c5c928658 100644 --- a/src/spicelib/devices/mos2/mos2noi.c +++ b/src/spicelib/devices/mos2/mos2noi.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "mos2defs.h" #include "cktdefs.h" #include "iferrmsg.h" diff --git a/src/spicelib/devices/mos2/mos2par.c b/src/spicelib/devices/mos2/mos2par.c index c661095f8..024a5ff78 100644 --- a/src/spicelib/devices/mos2/mos2par.c +++ b/src/spicelib/devices/mos2/mos2par.c @@ -7,7 +7,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "mos2defs.h" diff --git a/src/spicelib/devices/mos2/mos2pzld.c b/src/spicelib/devices/mos2/mos2pzld.c index 73495230e..0681f58ae 100644 --- a/src/spicelib/devices/mos2/mos2pzld.c +++ b/src/spicelib/devices/mos2/mos2pzld.c @@ -7,7 +7,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "cktdefs.h" #include "complex.h" #include "mos2defs.h" diff --git a/src/spicelib/devices/mos2/mos2sacl.c b/src/spicelib/devices/mos2/mos2sacl.c index d24dfe992..84de9567e 100644 --- a/src/spicelib/devices/mos2/mos2sacl.c +++ b/src/spicelib/devices/mos2/mos2sacl.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "const.h" diff --git a/src/spicelib/devices/mos2/mos2set.c b/src/spicelib/devices/mos2/mos2set.c index 3b1e8afe2..9f06c37dd 100644 --- a/src/spicelib/devices/mos2/mos2set.c +++ b/src/spicelib/devices/mos2/mos2set.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "smpdefs.h" #include "const.h" #include "cktdefs.h" diff --git a/src/spicelib/devices/mos2/mos2sld.c b/src/spicelib/devices/mos2/mos2sld.c index dd4019d54..108283be8 100644 --- a/src/spicelib/devices/mos2/mos2sld.c +++ b/src/spicelib/devices/mos2/mos2sld.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "mos2defs.h" diff --git a/src/spicelib/devices/mos2/mos2sprt.c b/src/spicelib/devices/mos2/mos2sprt.c index c4a5820c1..48bdf69b4 100644 --- a/src/spicelib/devices/mos2/mos2sprt.c +++ b/src/spicelib/devices/mos2/mos2sprt.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "mos2defs.h" diff --git a/src/spicelib/devices/mos2/mos2sset.c b/src/spicelib/devices/mos2/mos2sset.c index b2462853e..5af865788 100644 --- a/src/spicelib/devices/mos2/mos2sset.c +++ b/src/spicelib/devices/mos2/mos2sset.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "mos2defs.h" diff --git a/src/spicelib/devices/mos2/mos2supd.c b/src/spicelib/devices/mos2/mos2supd.c index b7a64b387..c2dc6850c 100644 --- a/src/spicelib/devices/mos2/mos2supd.c +++ b/src/spicelib/devices/mos2/mos2supd.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles /* update the charge sensitivities and their derivatives */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "mos2defs.h" diff --git a/src/spicelib/devices/mos2/mos2temp.c b/src/spicelib/devices/mos2/mos2temp.c index f72f93345..b497efb9a 100644 --- a/src/spicelib/devices/mos2/mos2temp.c +++ b/src/spicelib/devices/mos2/mos2temp.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos2defs.h" #include "const.h" diff --git a/src/spicelib/devices/mos2/mos2trun.c b/src/spicelib/devices/mos2/mos2trun.c index 2fc0f8f82..9fd5df669 100644 --- a/src/spicelib/devices/mos2/mos2trun.c +++ b/src/spicelib/devices/mos2/mos2trun.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos2defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/mos3/mos3.c b/src/spicelib/devices/mos3/mos3.c index faea44dfd..3d4532ea2 100644 --- a/src/spicelib/devices/mos3/mos3.c +++ b/src/spicelib/devices/mos3/mos3.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "devdefs.h" #include "ifsim.h" #include "mos3defs.h" diff --git a/src/spicelib/devices/mos3/mos3acld.c b/src/spicelib/devices/mos3/mos3acld.c index 7e439c55d..761f5e47a 100644 --- a/src/spicelib/devices/mos3/mos3acld.c +++ b/src/spicelib/devices/mos3/mos3acld.c @@ -7,7 +7,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos3defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/mos3/mos3ask.c b/src/spicelib/devices/mos3/mos3ask.c index 4da324cf7..5275b6578 100644 --- a/src/spicelib/devices/mos3/mos3ask.c +++ b/src/spicelib/devices/mos3/mos3ask.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "cktdefs.h" diff --git a/src/spicelib/devices/mos3/mos3conv.c b/src/spicelib/devices/mos3/mos3conv.c index 853256fc4..2da77c09f 100644 --- a/src/spicelib/devices/mos3/mos3conv.c +++ b/src/spicelib/devices/mos3/mos3conv.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos3defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/mos3/mos3del.c b/src/spicelib/devices/mos3/mos3del.c index 406dfea77..a67d0b24d 100644 --- a/src/spicelib/devices/mos3/mos3del.c +++ b/src/spicelib/devices/mos3/mos3del.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "mos3defs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/mos3/mos3dest.c b/src/spicelib/devices/mos3/mos3dest.c index 44a5b57d4..f8b4cadc9 100644 --- a/src/spicelib/devices/mos3/mos3dest.c +++ b/src/spicelib/devices/mos3/mos3dest.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "mos3defs.h" #include "suffix.h" diff --git a/src/spicelib/devices/mos3/mos3dist.c b/src/spicelib/devices/mos3/mos3dist.c index 6221c83ee..c8f762a49 100644 --- a/src/spicelib/devices/mos3/mos3dist.c +++ b/src/spicelib/devices/mos3/mos3dist.c @@ -4,7 +4,6 @@ Author: 1988 Jaijeet S Roychowdhury **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos3defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/mos3/mos3dset.c b/src/spicelib/devices/mos3/mos3dset.c index fe05c5f01..ecebbeaf3 100644 --- a/src/spicelib/devices/mos3/mos3dset.c +++ b/src/spicelib/devices/mos3/mos3dset.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "devdefs.h" #include "mos3defs.h" diff --git a/src/spicelib/devices/mos3/mos3ic.c b/src/spicelib/devices/mos3/mos3ic.c index dc6f128b5..8341b69d0 100644 --- a/src/spicelib/devices/mos3/mos3ic.c +++ b/src/spicelib/devices/mos3/mos3ic.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos3defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/mos3/mos3init.c b/src/spicelib/devices/mos3/mos3init.c index 2f4a564f9..a43333bf1 100644 --- a/src/spicelib/devices/mos3/mos3init.c +++ b/src/spicelib/devices/mos3/mos3init.c @@ -67,7 +67,10 @@ SPICEdev MOS3info = { DEVsenTrunc : NULL, DEVdisto : MOS3disto, DEVnoise : MOS3noise, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &MOS3iSize, DEVmodSize : &MOS3mSize diff --git a/src/spicelib/devices/mos3/mos3load.c b/src/spicelib/devices/mos3/mos3load.c index e4a300dae..00a3d5dec 100644 --- a/src/spicelib/devices/mos3/mos3load.c +++ b/src/spicelib/devices/mos3/mos3load.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "devdefs.h" #include "mos3defs.h" @@ -73,16 +72,27 @@ MOS3load(GENmodel *inModel, CKTcircuit *ckt) double capgd; /* total gate-drain capacitance */ double capgb; /* total gate-bulk capacitance */ int Check; +#ifndef NOBYPASS double tempv; +#endif /*NOBYPASS*/ int error; +#ifdef CAPBYPASS + int senflag; +#endif /*CAPBYPASS*/ int SenCond; double vt; /* vt at instance temperature */ - +#ifdef CAPBYPASS + senflag = 0; +#endif /* CAPBYPASS */ if(ckt->CKTsenInfo){ if(ckt->CKTsenInfo->SENstatus == PERTURBATION) { if((ckt->CKTsenInfo->SENmode == ACSEN)|| (ckt->CKTsenInfo->SENmode == TRANSEN)){ +#ifdef CAPBYPASS + senflag = 1; +#endif /* CAPBYPASS */ + } goto next; } @@ -268,7 +278,7 @@ MOS3load(GENmodel *inModel, CKTcircuit *ckt) here->MOS3cbd + here->MOS3gbd * delvbd + here->MOS3gbs * delvbs ; - +#ifndef NOBYPASS /* now lets see if we can bypass (ugh) */ /* the following mess should be one if statement, but * many compilers can't handle it all at once, so it @@ -322,7 +332,7 @@ MOS3load(GENmodel *inModel, CKTcircuit *ckt) } goto bypass; } - +#endif /*NOBYPASS*/ /* ok - bypass is out, do it the hard way */ von = model->MOS3type * here->MOS3von; @@ -885,9 +895,18 @@ innerline1000:; * *.. bulk-drain and bulk-source depletion capacitances */ +#ifdef CAPBYPASS + if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || + fabs(delvbs) >= ckt->CKTreltol * MAX(fabs(vbs), + fabs(*(ckt->CKTstate0+here->MOS3vbs)))+ + ckt->CKTvoltTol)|| senflag ) +#endif /*CAPBYPASS*/ + { /* can't bypass the diode capacitance calculations */ +#ifdef CAPZEROBYPASS if(here->MOS3Cbs != 0 || here->MOS3Cbssw != 0 ) { +#endif /*CAPZEROBYPASS*/ if (vbs < here->MOS3tDepCap){ arg=1-vbs/here->MOS3tBulkPot; /* @@ -939,14 +958,24 @@ innerline1000:; vbs*(here->MOS3f2s+vbs*(here->MOS3f3s/2)); here->MOS3capbs=here->MOS3f2s+here->MOS3f3s*vbs; } +#ifdef CAPZEROBYPASS } else { *(ckt->CKTstate0 + here->MOS3qbs) = 0; here->MOS3capbs=0; } +#endif /*CAPZEROBYPASS*/ } +#ifdef CAPBYPASS + if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || + fabs(delvbd) >= ckt->CKTreltol * MAX(fabs(vbd), + fabs(*(ckt->CKTstate0+here->MOS3vbd)))+ + ckt->CKTvoltTol)|| senflag ) +#endif /*CAPBYPASS*/ /* can't bypass the diode capacitance calculations */ { +#ifdef CAPZEROBYPASS if(here->MOS3Cbd != 0 || here->MOS3Cbdsw != 0 ) { +#endif /*CAPZEROBYPASS*/ if (vbd < here->MOS3tDepCap) { arg=1-vbd/here->MOS3tBulkPot; /* @@ -993,10 +1022,12 @@ innerline1000:; vbd * (here->MOS3f2d + vbd * here->MOS3f3d/2); here->MOS3capbd=here->MOS3f2d + vbd * here->MOS3f3d; } +#ifdef CAPZEROBYPASS } else { *(ckt->CKTstate0 + here->MOS3qbd) = 0; here->MOS3capbd = 0; } +#endif /*CAPZEROBYPASS*/ } if(SenCond && (ckt->CKTsenInfo->SENmode==TRANSEN)) goto next2; @@ -1209,8 +1240,16 @@ innerline1000:; *(ckt->CKTrhs + here->MOS3sNodePrime) += cdreq + ceqbs + model->MOS3type * ceqgs; /* - * load y matrix - */ + * load y matrix + */ +#if 0 +printf(" loading %s at time %g\n",here->MOS3name,ckt->CKTtime); +printf("%g %g %g %g %g\n", here->MOS3drainConductance,gcgd+gcgs+gcgb, + here->MOS3sourceConductance,here->MOS3gbd,here->MOS3gbs); +printf("%g %g %g %g %g\n",-gcgb,0.0,0.0,here->MOS3gds,here->MOS3gm); +printf("%g %g %g %g %g\n", here->MOS3gds,here->MOS3gmbs,gcgd,-gcgs,-gcgd); +printf("%g %g %g %g %g\n", -gcgs,-gcgd,0.0,-gcgs,0.0); +#endif *(here->MOS3DdPtr) += (here->MOS3drainConductance); *(here->MOS3GgPtr) += ((gcgd+gcgs+gcgb)); *(here->MOS3SsPtr) += (here->MOS3sourceConductance); diff --git a/src/spicelib/devices/mos3/mos3mask.c b/src/spicelib/devices/mos3/mos3mask.c index ec9584929..84f599820 100644 --- a/src/spicelib/devices/mos3/mos3mask.c +++ b/src/spicelib/devices/mos3/mos3mask.c @@ -7,7 +7,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "cktdefs.h" diff --git a/src/spicelib/devices/mos3/mos3mdel.c b/src/spicelib/devices/mos3/mos3mdel.c index ed8a758b9..6deeffe3f 100644 --- a/src/spicelib/devices/mos3/mos3mdel.c +++ b/src/spicelib/devices/mos3/mos3mdel.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "mos3defs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/mos3/mos3mpar.c b/src/spicelib/devices/mos3/mos3mpar.c index 8176d1108..a9ee5fbe5 100644 --- a/src/spicelib/devices/mos3/mos3mpar.c +++ b/src/spicelib/devices/mos3/mos3mpar.c @@ -7,7 +7,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "mos3defs.h" diff --git a/src/spicelib/devices/mos3/mos3noi.c b/src/spicelib/devices/mos3/mos3noi.c index e8704efa8..adf6c8e45 100644 --- a/src/spicelib/devices/mos3/mos3noi.c +++ b/src/spicelib/devices/mos3/mos3noi.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "mos3defs.h" #include "cktdefs.h" #include "iferrmsg.h" diff --git a/src/spicelib/devices/mos3/mos3par.c b/src/spicelib/devices/mos3/mos3par.c index b2f2ddf76..87dd024cc 100644 --- a/src/spicelib/devices/mos3/mos3par.c +++ b/src/spicelib/devices/mos3/mos3par.c @@ -7,7 +7,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "mos3defs.h" diff --git a/src/spicelib/devices/mos3/mos3pzld.c b/src/spicelib/devices/mos3/mos3pzld.c index 7a1f886f6..1776b319b 100644 --- a/src/spicelib/devices/mos3/mos3pzld.c +++ b/src/spicelib/devices/mos3/mos3pzld.c @@ -7,7 +7,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "cktdefs.h" #include "complex.h" #include "mos3defs.h" diff --git a/src/spicelib/devices/mos3/mos3sacl.c b/src/spicelib/devices/mos3/mos3sacl.c index 7d8aa9875..5d334e8e8 100644 --- a/src/spicelib/devices/mos3/mos3sacl.c +++ b/src/spicelib/devices/mos3/mos3sacl.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "const.h" diff --git a/src/spicelib/devices/mos3/mos3set.c b/src/spicelib/devices/mos3/mos3set.c index e2b5f9ed7..2662957f1 100644 --- a/src/spicelib/devices/mos3/mos3set.c +++ b/src/spicelib/devices/mos3/mos3set.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "mos3defs.h" diff --git a/src/spicelib/devices/mos3/mos3sld.c b/src/spicelib/devices/mos3/mos3sld.c index 26edd8198..cea6e2437 100644 --- a/src/spicelib/devices/mos3/mos3sld.c +++ b/src/spicelib/devices/mos3/mos3sld.c @@ -9,7 +9,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "mos3defs.h" diff --git a/src/spicelib/devices/mos3/mos3sprt.c b/src/spicelib/devices/mos3/mos3sprt.c index 20e133666..1bc20e8ac 100644 --- a/src/spicelib/devices/mos3/mos3sprt.c +++ b/src/spicelib/devices/mos3/mos3sprt.c @@ -9,7 +9,6 @@ Modified: 2000 AlansFixes */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "mos3defs.h" diff --git a/src/spicelib/devices/mos3/mos3sset.c b/src/spicelib/devices/mos3/mos3sset.c index 6cdb427f8..23ba965ad 100644 --- a/src/spicelib/devices/mos3/mos3sset.c +++ b/src/spicelib/devices/mos3/mos3sset.c @@ -8,7 +8,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "mos3defs.h" diff --git a/src/spicelib/devices/mos3/mos3supd.c b/src/spicelib/devices/mos3/mos3supd.c index ff4052608..22e294e1c 100644 --- a/src/spicelib/devices/mos3/mos3supd.c +++ b/src/spicelib/devices/mos3/mos3supd.c @@ -3,7 +3,6 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles **********/ -#include #include "ngspice.h" #include "smpdefs.h" #include "cktdefs.h" diff --git a/src/spicelib/devices/mos3/mos3temp.c b/src/spicelib/devices/mos3/mos3temp.c index 6ceec8b4e..d226ab369 100644 --- a/src/spicelib/devices/mos3/mos3temp.c +++ b/src/spicelib/devices/mos3/mos3temp.c @@ -5,7 +5,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos3defs.h" #include "const.h" diff --git a/src/spicelib/devices/mos3/mos3trun.c b/src/spicelib/devices/mos3/mos3trun.c index 4dd134c41..a60659996 100644 --- a/src/spicelib/devices/mos3/mos3trun.c +++ b/src/spicelib/devices/mos3/mos3trun.c @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "mos3defs.h" #include "sperror.h" diff --git a/src/spicelib/devices/mos6/mos6init.c b/src/spicelib/devices/mos6/mos6init.c index 3d7340bb9..2e5e3e6f8 100644 --- a/src/spicelib/devices/mos6/mos6init.c +++ b/src/spicelib/devices/mos6/mos6init.c @@ -67,7 +67,10 @@ SPICEdev MOS6info = { DEVsenTrunc : NULL, DEVdisto : NULL, /* Distortion routine */ DEVnoise : NULL, /* Noise routine */ - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &MOS6iSize, DEVmodSize : &MOS6mSize }; diff --git a/src/spicelib/devices/mos9/mos9init.c b/src/spicelib/devices/mos9/mos9init.c index b6bd91d50..bdda0c8e9 100644 --- a/src/spicelib/devices/mos9/mos9init.c +++ b/src/spicelib/devices/mos9/mos9init.c @@ -67,7 +67,10 @@ SPICEdev MOS9info = { DEVsenTrunc : NULL, DEVdisto : MOS9disto, DEVnoise : MOS9noise, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &MOS9iSize, DEVmodSize : &MOS9mSize diff --git a/src/spicelib/devices/res/res.c b/src/spicelib/devices/res/res.c index 4ba865909..649026687 100644 --- a/src/spicelib/devices/res/res.c +++ b/src/spicelib/devices/res/res.c @@ -6,7 +6,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "resdefs.h" #include "devdefs.h" #include "ifsim.h" diff --git a/src/spicelib/devices/res/resask.c b/src/spicelib/devices/res/resask.c index 96a22d005..08893b90a 100644 --- a/src/spicelib/devices/res/resask.c +++ b/src/spicelib/devices/res/resask.c @@ -5,7 +5,6 @@ Modified: Apr 2000 - Paolo Nenzi **********/ #include "ngspice.h" -#include #include "const.h" #include "resdefs.h" #include "ifsim.h" diff --git a/src/spicelib/devices/res/resdel.c b/src/spicelib/devices/res/resdel.c index 35fe2f4c3..ee6d2a64d 100644 --- a/src/spicelib/devices/res/resdel.c +++ b/src/spicelib/devices/res/resdel.c @@ -7,7 +7,6 @@ Modified: Apr 2000 - Paolo Nenzi */ #include "ngspice.h" -#include #include "resdefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/res/resdest.c b/src/spicelib/devices/res/resdest.c index aa8be2cb5..985d78fce 100644 --- a/src/spicelib/devices/res/resdest.c +++ b/src/spicelib/devices/res/resdest.c @@ -7,7 +7,6 @@ Modified: Apr 2000 - Paolo Nenzi */ #include "ngspice.h" -#include #include "resdefs.h" diff --git a/src/spicelib/devices/res/resinit.c b/src/spicelib/devices/res/resinit.c index d731b07b8..bdc1d52a7 100644 --- a/src/spicelib/devices/res/resinit.c +++ b/src/spicelib/devices/res/resinit.c @@ -67,7 +67,10 @@ SPICEdev RESinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, DEVnoise : RESnoise, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &RESiSize, DEVmodSize : &RESmSize diff --git a/src/spicelib/devices/res/resload.c b/src/spicelib/devices/res/resload.c index 3682d7296..2e3a1c38a 100644 --- a/src/spicelib/devices/res/resload.c +++ b/src/spicelib/devices/res/resload.c @@ -5,7 +5,6 @@ Modified: Apr 2000 - Paolo Nenzi **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "resdefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/res/resmask.c b/src/spicelib/devices/res/resmask.c index 20421723e..0cf52279e 100644 --- a/src/spicelib/devices/res/resmask.c +++ b/src/spicelib/devices/res/resmask.c @@ -7,7 +7,6 @@ Modified: 2000 AlansFixes #include "ngspice.h" -#include #include "const.h" #include "cktdefs.h" #include "ifsim.h" diff --git a/src/spicelib/devices/res/resmdel.c b/src/spicelib/devices/res/resmdel.c index 56c50e9ba..0862bf233 100644 --- a/src/spicelib/devices/res/resmdel.c +++ b/src/spicelib/devices/res/resmdel.c @@ -5,7 +5,6 @@ Modified: Apr 2000 - Paolo Nenzi **********/ #include "ngspice.h" -#include #include "resdefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/res/resmpar.c b/src/spicelib/devices/res/resmpar.c index 8af8fb906..b461d9f2f 100644 --- a/src/spicelib/devices/res/resmpar.c +++ b/src/spicelib/devices/res/resmpar.c @@ -6,7 +6,6 @@ Modified: 2000 AlansFixes **********/ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "resdefs.h" diff --git a/src/spicelib/devices/res/resnoise.c b/src/spicelib/devices/res/resnoise.c index a14c58f44..450f1c000 100644 --- a/src/spicelib/devices/res/resnoise.c +++ b/src/spicelib/devices/res/resnoise.c @@ -5,7 +5,6 @@ Modified: Apr 2000 - Paolo Nenzi **********/ #include "ngspice.h" -#include #include "resdefs.h" #include "cktdefs.h" #include "iferrmsg.h" diff --git a/src/spicelib/devices/res/resparam.c b/src/spicelib/devices/res/resparam.c index 3ac92875c..73eaf02ec 100644 --- a/src/spicelib/devices/res/resparam.c +++ b/src/spicelib/devices/res/resparam.c @@ -5,7 +5,6 @@ Modified: Apr 2000 - Paolo Nenzi **********/ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "resdefs.h" diff --git a/src/spicelib/devices/res/respzld.c b/src/spicelib/devices/res/respzld.c index f861985f7..52968f235 100644 --- a/src/spicelib/devices/res/respzld.c +++ b/src/spicelib/devices/res/respzld.c @@ -6,7 +6,6 @@ Modified: Apr 2000 - Paolo Nenzi #include "ngspice.h" -#include #include "cktdefs.h" #include "complex.h" #include "sperror.h" diff --git a/src/spicelib/devices/res/ressacl.c b/src/spicelib/devices/res/ressacl.c index 3b195414f..28a13c67a 100644 --- a/src/spicelib/devices/res/ressacl.c +++ b/src/spicelib/devices/res/ressacl.c @@ -5,7 +5,6 @@ Modified: Apr 2000 - Paolo Nenzi **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "resdefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/res/ressetup.c b/src/spicelib/devices/res/ressetup.c index 805291719..2fafd9afe 100644 --- a/src/spicelib/devices/res/ressetup.c +++ b/src/spicelib/devices/res/ressetup.c @@ -5,7 +5,6 @@ Modified: Apr 2000 Paolo Nenzi **********/ #include "ngspice.h" -#include #include "smpdefs.h" #include "resdefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/res/ressload.c b/src/spicelib/devices/res/ressload.c index f33601fb5..756c32567 100644 --- a/src/spicelib/devices/res/ressload.c +++ b/src/spicelib/devices/res/ressload.c @@ -6,7 +6,6 @@ Modified: Apr 2000 - Paolo Nenzi #include "ngspice.h" -#include #include "cktdefs.h" #include "resdefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/res/ressprt.c b/src/spicelib/devices/res/ressprt.c index 3358119f7..1c7d5fb54 100644 --- a/src/spicelib/devices/res/ressprt.c +++ b/src/spicelib/devices/res/ressprt.c @@ -1,7 +1,7 @@ /********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles -Modified: Apr 2000 - Paolo Nenzi +Modified: Apr 2002 - Paolo Nenzi **********/ /* Pretty print the sensitivity info for all @@ -9,7 +9,6 @@ Modified: Apr 2000 - Paolo Nenzi */ #include "ngspice.h" -#include #include "cktdefs.h" #include "resdefs.h" #include "sperror.h" @@ -35,6 +34,10 @@ RESsPrint(GENmodel *inModel, CKTcircuit *ckt) printf(" Instance name:%s\n",here->RESname); printf(" Positive, negative nodes: %s, %s\n", CKTnodName(ckt,here->RESposNode),CKTnodName(ckt,here->RESnegNode)); + + printf(" Multiplier: %g ",here->RESm); + printf(here->RESmGiven ? "(specified)\n" : "(default)\n"); + printf(" Resistance: %f ",here->RESresist); printf(here->RESresGiven ? "(specified)\n" : "(default)\n"); printf(" RESsenParmNo:%d\n",here->RESsenParmNo); diff --git a/src/spicelib/devices/res/ressset.c b/src/spicelib/devices/res/ressset.c index 58880fe01..d00ebc47d 100644 --- a/src/spicelib/devices/res/ressset.c +++ b/src/spicelib/devices/res/ressset.c @@ -5,7 +5,6 @@ Modified: Apr 2000 - Paolo Nenzi **********/ #include "ngspice.h" -#include #include "smpdefs.h" #include "resdefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/res/restemp.c b/src/spicelib/devices/res/restemp.c index c03c94b82..efe779569 100644 --- a/src/spicelib/devices/res/restemp.c +++ b/src/spicelib/devices/res/restemp.c @@ -6,7 +6,6 @@ Modified: 2000 AlanSfixes **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "resdefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/soi3/soi3.c b/src/spicelib/devices/soi3/soi3.c index 80a82e0be..b08cfd6b9 100644 --- a/src/spicelib/devices/soi3/soi3.c +++ b/src/spicelib/devices/soi3/soi3.c @@ -1,12 +1,12 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,17 +15,18 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" -#include #include "devdefs.h" #include "ifsim.h" #include "soi3defs.h" #include "suffix.h" - char *SOI3names[] = { "Drain", "Front Gate", @@ -39,6 +40,10 @@ char *SOI3names[] = { IFparm SOI3pTable[] = { /* parameters */ IOP("l", SOI3_L, IF_REAL, "Length"), IOP("w", SOI3_W, IF_REAL, "Width"), + IOP("m", SOI3_M, IF_REAL, "Parallel Multiplier"), + IOP("as", SOI3_AS, IF_REAL, "Source area"), + IOP("ad", SOI3_AD, IF_REAL, "Drain area"), + IOP("ab", SOI3_AB, IF_REAL, "Body area"), IOP("nrd", SOI3_NRD, IF_REAL, "Drain squares"), IOP("nrs", SOI3_NRS, IF_REAL, "Source squares"), IP("off", SOI3_OFF, IF_FLAG, "Device initially off"), @@ -156,7 +161,7 @@ IFparm SOI3mPTable[] = { /* model parameters */ IOP("cgfbo", SOI3_MOD_CGFBO, IF_REAL ,"Front Gate-bulk overlap cap."), IOP("cgbso", SOI3_MOD_CGBSO, IF_REAL ,"Back Gate-source overlap cap."), IOP("cgbdo", SOI3_MOD_CGBDO, IF_REAL ,"Back Gate-drain overlap cap."), - IOP("cgb_bo", SOI3_MOD_CGB_BO, IF_REAL ,"Back Gate-bulk overlap cap."), + IOP("cgbbo", SOI3_MOD_CGBBO, IF_REAL ,"Back Gate-bulk overlap cap."), IOP("rsh", SOI3_MOD_RSH, IF_REAL ,"Sheet resistance"), IOP("cj", SOI3_MOD_CJSW, IF_REAL ,"Side junction cap per area"), IOP("mj", SOI3_MOD_MJSW, IF_REAL ,"Side grading coefficient"), @@ -222,18 +227,14 @@ IFparm SOI3mPTable[] = { /* model parameters */ IOP("csf", SOI3_MOD_CSF ,IF_REAL ,"Saturation region charge sharing factor"), IOP("nplus", SOI3_MOD_NPLUS ,IF_REAL ,"Doping concentration of N+ or P+ regions"), IOP("rta", SOI3_MOD_RTA ,IF_REAL ,"Thermal resistance area scaling factor"), - IOP("cta", SOI3_MOD_CTA ,IF_REAL ,"Thermal capacitance area scaling factor") - + IOP("cta", SOI3_MOD_CTA ,IF_REAL ,"Thermal capacitance area scaling factor"), + IOP("mexp", SOI3_MOD_MEXP ,IF_REAL ,"Exponent for CLM smoothing") }; - int SOI3nSize = NUMELEMS(SOI3names); int SOI3pTSize = NUMELEMS(SOI3pTable); int SOI3mPTSize = NUMELEMS(SOI3mPTable); int SOI3iSize = sizeof(SOI3instance); int SOI3mSize = sizeof(SOI3model); - - - diff --git a/src/spicelib/devices/soi3/soi3acld.c b/src/spicelib/devices/soi3/soi3acld.c index 0a962002e..4db4413b8 100644 --- a/src/spicelib/devices/soi3/soi3acld.c +++ b/src/spicelib/devices/soi3/soi3acld.c @@ -1,406 +1,449 @@ -/********** -STAG version 2.6 -Copyright 2000 owned by the United Kingdom Secretary of State for Defence -acting through the Defence Evaluation and Research Agency. -Developed by : Jim Benson, - Department of Electronics and Computer Science, - University of Southampton, - United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. - -Based on STAG version 2.1 -Developed by : Mike Lee, -With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards - and John Bunyan. -Acknowledgements : Rupert Howes and Pete Mole. -**********/ - -/* Modified: 2001 Paolo Nenzi */ - -#include "ngspice.h" -#include -#include "cktdefs.h" -#include "soi3defs.h" -#include "sperror.h" -#include "suffix.h" - - -int -SOI3acLoad(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; -{ - SOI3model *model = (SOI3model*)inModel; - SOI3instance *here; - int xnrm; - int xrev; - - double cgfgf,cgfd,cgfs,cgfdeltaT; - double cdgf,cdd,cds,cddeltaT; - double csgf,csd,css,csdeltaT; - double cbgf,cbd,cbs,cbdeltaT,cbgb; - double cgbgb,cgbsb,cgbdb; - - double xcgfgf,xcgfd,xcgfs,xcgfdeltaT; - double xcdgf,xcdd,xcds,xcddeltaT; - double xcsgf,xcsd,xcss,xcsdeltaT; - double xcbgf,xcbd,xcbs,xcbdeltaT,xcbgb; - double xcgbgb,xcgbsb,xcgbdb; - - double capbd,capbs; /* diode capacitances */ - - double xcBJTbsbs,xcBJTbsdeltaT; - double xcBJTbdbd,xcBJTbddeltaT; - - double rtargs[5]; - double grt[5]; - double ctargs[5]; - double xct[5]; /* 1/reactance of thermal cap */ - int tnodeindex; - - double cgfb0; - double cgfd0; - double cgfs0; - - double cgbb0; - double cgbd0; - double cgbs0; - - double xcgbd0,xcgbs0; - - double EffectiveLength; - - double omega; - - omega = ckt->CKTomega; - - for( ; model != NULL; model = model->SOI3nextModel) - { - for(here = model->SOI3instances; here!= NULL; - here = here->SOI3nextInstance) - { - - if (here->SOI3mode < 0) - { - xnrm=0; - xrev=1; - } - else - { - xnrm=1; - xrev=0; - } - - EffectiveLength=here->SOI3l - 2*model->SOI3latDiff; - cgfs0 = model->SOI3frontGateSourceOverlapCapFactor * here->SOI3w; - cgfd0 = model->SOI3frontGateDrainOverlapCapFactor * here->SOI3w; - cgfb0 = model->SOI3frontGateBulkOverlapCapFactor * EffectiveLength; - - /* JimB - can use basic device geometry to calculate source/back gate */ - /* and drain/back gate capacitances to a first approximation. Use this*/ - /* default model if capacitance factors aren't given in model netlist. */ - - if(model->SOI3backGateSourceOverlapCapFactorGiven) - { - cgbs0 = model->SOI3backGateSourceOverlapCapFactor * here->SOI3w; - } - else - { - /* As a basic circuit designers approximation, length of drain and */ - /* source regions often taken to have length of twice the minimum */ - /* feature size for that technology. */ - cgbs0 = 2*1e-6*model->SOI3minimumFeatureSize * here->SOI3w - * model->SOI3backOxideCapFactor; - } - if(model->SOI3backGateDrainOverlapCapFactorGiven) - { - cgbd0 = model->SOI3backGateDrainOverlapCapFactor * here->SOI3w; - } - else - { - /* As a basic circuit designer's approximation, length of drain and */ - /* source regions often taken to have length of twice the minimum */ - /* feature size for that technology. */ - cgbd0 = 2*1e-6*model->SOI3minimumFeatureSize * here->SOI3w - * model->SOI3backOxideCapFactor; - } - cgbb0 = model->SOI3backGateBulkOverlapCapFactor * EffectiveLength; - - capbd = here->SOI3capbd; - capbs = here->SOI3capbs; - - cgfgf = *(ckt->CKTstate0 + here->SOI3cgfgf); - cgfd = *(ckt->CKTstate0 + here->SOI3cgfd); - cgfs = *(ckt->CKTstate0 + here->SOI3cgfs); - cgfdeltaT = *(ckt->CKTstate0 + here->SOI3cgfdeltaT); - csgf = *(ckt->CKTstate0 + here->SOI3csgf); - csd = *(ckt->CKTstate0 + here->SOI3csd); - css = *(ckt->CKTstate0 + here->SOI3css); - csdeltaT = *(ckt->CKTstate0 + here->SOI3csdeltaT); - cdgf = *(ckt->CKTstate0 + here->SOI3cdgf); - cdd = *(ckt->CKTstate0 + here->SOI3cdd); - cds = *(ckt->CKTstate0 + here->SOI3cds); - cddeltaT = *(ckt->CKTstate0 + here->SOI3cddeltaT); - cgbgb = *(ckt->CKTstate0 + here->SOI3cgbgb); - cgbsb = *(ckt->CKTstate0 + here->SOI3cgbsb); - cgbdb = *(ckt->CKTstate0 + here->SOI3cgbdb); - cbgf = -(cgfgf + cdgf + csgf); - cbd = -(cgfd + cdd + csd + cgbdb); - cbs = -(cgfs + cds + css + cgbsb); - cbdeltaT = -(cgfdeltaT + cddeltaT + csdeltaT); - cbgb = -cgbgb; - - xcgfgf = (cgfgf + cgfd0 + cgfs0 + cgfb0) * omega; - xcgfd = (cgfd - cgfd0) * omega; - xcgfs = (cgfs - cgfs0) * omega; - xcgfdeltaT = cgfdeltaT * omega; - xcsgf = (csgf - cgfs0) * omega; - xcsd = csd * omega; - xcss = (css + capbs + cgfs0) * omega; - xcsdeltaT = csdeltaT * omega; - xcdgf = (cdgf - cgfd0) * omega; - xcdd = (cdd + capbd + cgfd0) * omega; - xcds = cds * omega; - xcddeltaT = cddeltaT * omega; - xcgbgb = (cgbgb + cgbb0 + cgbd0 + cgbs0) * omega; - xcgbsb = (cgbsb - cgbs0) * omega; - xcgbdb = -cgbd0 * omega; - xcbgf = (cbgf - cgfb0) * omega; - xcbd = (cbd - capbd) * omega; - xcbs = (cbs - capbs) * omega; - xcbdeltaT = cbdeltaT * omega; - xcbgb = cbgb * omega; - - xcgbs0 = cgbs0 * omega; - xcgbd0 = cgbd0 * omega; - - xcBJTbsbs = *(ckt->CKTstate0 + here->SOI3cBJTbsbs) * omega; - xcBJTbsdeltaT = *(ckt->CKTstate0 + here->SOI3cBJTbsdeltaT) * omega; - xcBJTbdbd = *(ckt->CKTstate0 + here->SOI3cBJTbdbd) * omega; - xcBJTbddeltaT = *(ckt->CKTstate0 + here->SOI3cBJTbddeltaT) * omega; - - /* JimB - 15/9/99 */ - /* Code for multiple thermal time constants. Start by moving all */ - /* rt and ct constants into arrays. */ - rtargs[0]=here->SOI3rt; - rtargs[1]=here->SOI3rt1; - rtargs[2]=here->SOI3rt2; - rtargs[3]=here->SOI3rt3; - rtargs[4]=here->SOI3rt4; - - ctargs[0]=here->SOI3ct; - ctargs[1]=here->SOI3ct1; - ctargs[2]=here->SOI3ct2; - ctargs[3]=here->SOI3ct3; - ctargs[4]=here->SOI3ct4; - - /* Set all admittance components to zero. */ - grt[0]=grt[1]=grt[2]=grt[3]=grt[4]=0.0; - xct[0]=xct[1]=xct[2]=xct[3]=xct[4]=0.0; - /* Now calculate conductances and susceptances from rt and ct. */ - /* Don't need to worry about divide by zero when calculating */ - /* grt components, as soi3setup() only creates a thermal node */ - /* if corresponding rt is greater than zero. */ - for(tnodeindex=0;tnodeindexSOI3numThermalNodes;tnodeindex++) - { - xct[tnodeindex] = ctargs[tnodeindex] * ckt->CKTomega; - grt[tnodeindex] = 1/rtargs[tnodeindex]; - } - /* End JimB */ - - /* - * load matrix - */ - - *(here->SOI3GF_gfPtr + 1) += xcgfgf; - *(here->SOI3GB_gbPtr + 1) += xcgbgb; - *(here->SOI3B_bPtr + 1) += -(xcbgf+xcbd+xcbs+xcbgb) - +xcBJTbsbs+xcBJTbdbd; - - *(here->SOI3DP_dpPtr + 1) += xcdd+xcgbd0+xcBJTbdbd; - *(here->SOI3SP_spPtr + 1) += xcss+xcgbs0+xcBJTbsbs; - - *(here->SOI3GF_dpPtr + 1) += xcgfd; - *(here->SOI3GF_spPtr + 1) += xcgfs; - *(here->SOI3GF_bPtr + 1) -= (xcgfgf + xcgfd + xcgfs); - - *(here->SOI3GB_dpPtr + 1) += xcgbdb; - *(here->SOI3GB_spPtr + 1) += xcgbsb; - *(here->SOI3GB_bPtr + 1) -= (xcgbgb + xcgbdb + xcgbsb); - - *(here->SOI3B_gfPtr + 1) += xcbgf; - *(here->SOI3B_gbPtr + 1) += xcbgb; - *(here->SOI3B_dpPtr + 1) += xcbd-xcBJTbdbd; - *(here->SOI3B_spPtr + 1) += xcbs-xcBJTbsbs; - - *(here->SOI3DP_gfPtr + 1) += xcdgf; - *(here->SOI3DP_gbPtr + 1) += -xcgbd0; - *(here->SOI3DP_bPtr + 1) += -(xcdgf + xcdd + xcds + xcBJTbdbd); - *(here->SOI3DP_spPtr + 1) += xcds; - - *(here->SOI3SP_gfPtr + 1) += xcsgf; - *(here->SOI3SP_gbPtr + 1) += -xcgbs0; - *(here->SOI3SP_bPtr + 1) += -(xcsgf + xcsd + xcss + xcBJTbsbs); - *(here->SOI3SP_dpPtr + 1) += xcsd; - -/* if no thermal behaviour specified, then put in zero valued indpt. voltage source - between TOUT and ground */ - if (here->SOI3rt==0) - { - *(here->SOI3TOUT_ibrPtr + 1) += 1.0; - *(here->SOI3IBR_toutPtr + 1) += 1.0; - *(ckt->CKTirhs + (here->SOI3branch)) = 0; - } - else - { - *(here->SOI3TOUT_toutPtr + 1) += xct[0]; - if (here->SOI3numThermalNodes > 1) - { - *(here->SOI3TOUT_tout1Ptr + 1) += -xct[0]; - *(here->SOI3TOUT1_toutPtr + 1) += -xct[0]; - *(here->SOI3TOUT1_tout1Ptr + 1) += xct[0]+xct[1]; - } - if (here->SOI3numThermalNodes > 2) - { - *(here->SOI3TOUT1_tout2Ptr + 1) += -xct[1]; - *(here->SOI3TOUT2_tout1Ptr + 1) += -xct[1]; - *(here->SOI3TOUT2_tout2Ptr + 1) += xct[1]+xct[2]; - } - if (here->SOI3numThermalNodes > 3) - { - *(here->SOI3TOUT2_tout3Ptr + 1) += -xct[2]; - *(here->SOI3TOUT3_tout2Ptr + 1) += -xct[2]; - *(here->SOI3TOUT3_tout3Ptr + 1) += xct[2]+xct[3]; - } - if (here->SOI3numThermalNodes > 4) - { - *(here->SOI3TOUT3_tout4Ptr + 1) += -xct[3]; - *(here->SOI3TOUT4_tout3Ptr + 1) += -xct[3]; - *(here->SOI3TOUT4_tout4Ptr + 1) += xct[3]+xct[4]; - } - *(here->SOI3GF_toutPtr + 1) += xcgfdeltaT*model->SOI3type; - *(here->SOI3DP_toutPtr + 1) += (xcddeltaT - xcBJTbddeltaT)*model->SOI3type; - *(here->SOI3SP_toutPtr + 1) += (xcsdeltaT - xcBJTbsdeltaT)*model->SOI3type; - *(here->SOI3B_toutPtr + 1) += model->SOI3type* - (xcbdeltaT + xcBJTbsdeltaT + xcBJTbddeltaT); - } - - - /* and now real part */ - *(here->SOI3D_dPtr) += (here->SOI3drainConductance); - *(here->SOI3S_sPtr) += (here->SOI3sourceConductance); - *(here->SOI3B_bPtr) += (here->SOI3gbd+here->SOI3gbs - - here->SOI3gMmbs - - here->SOI3gBJTdb_bs - here->SOI3gBJTsb_bd); - - *(here->SOI3DP_dpPtr) += - (here->SOI3drainConductance+here->SOI3gds+ - here->SOI3gbd+xrev*(here->SOI3gmf+here->SOI3gmbs+ - here->SOI3gmb)+xnrm*here->SOI3gMd); - *(here->SOI3SP_spPtr) += - (here->SOI3sourceConductance+here->SOI3gds+ - here->SOI3gbs+xnrm*(here->SOI3gmf+here->SOI3gmbs+ - here->SOI3gmb)+xrev*here->SOI3gMd); - - *(here->SOI3D_dpPtr) += (-here->SOI3drainConductance); - - *(here->SOI3S_spPtr) += (-here->SOI3sourceConductance); - *(here->SOI3B_gfPtr) += -here->SOI3gMmf; - *(here->SOI3B_gbPtr) += -(here->SOI3gMmb); - *(here->SOI3B_dpPtr) += -(here->SOI3gbd) + here->SOI3gBJTsb_bd + - xrev*(here->SOI3gMmf+here->SOI3gMmb+ - here->SOI3gMmbs+here->SOI3gMd) - - xnrm*here->SOI3gMd; - *(here->SOI3B_spPtr) += -(here->SOI3gbs) + here->SOI3gBJTdb_bs + - xnrm*(here->SOI3gMmf+here->SOI3gMmb+ - here->SOI3gMmbs+here->SOI3gMd) - - xrev*here->SOI3gMd; - *(here->SOI3DP_dPtr) += (-here->SOI3drainConductance); - *(here->SOI3SP_sPtr) += (-here->SOI3sourceConductance); - - *(here->SOI3DP_gfPtr) += ((xnrm-xrev)*here->SOI3gmf + - xnrm*here->SOI3gMmf); - *(here->SOI3DP_gbPtr) += ((xnrm-xrev)*here->SOI3gmb + - xnrm*here->SOI3gMmb); - *(here->SOI3DP_bPtr) += (-here->SOI3gbd + here->SOI3gBJTdb_bs - +(xnrm-xrev)*here->SOI3gmbs+ - xnrm*here->SOI3gMmbs); - *(here->SOI3DP_spPtr) += (-here->SOI3gds - here->SOI3gBJTdb_bs - -xnrm*(here->SOI3gmf+here->SOI3gmb+here->SOI3gmbs + - here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)); - - *(here->SOI3SP_gfPtr) += (-(xnrm-xrev)*here->SOI3gmf+ - xrev*here->SOI3gMmf); - *(here->SOI3SP_gbPtr) += (-(xnrm-xrev)*here->SOI3gmb+ - xrev*here->SOI3gMmb); - *(here->SOI3SP_bPtr) += (-here->SOI3gbs + here->SOI3gBJTsb_bd - -(xnrm-xrev)*here->SOI3gmbs+ - xrev*here->SOI3gMmbs); - *(here->SOI3SP_dpPtr) += (-here->SOI3gds - here->SOI3gBJTsb_bd - -xrev*(here->SOI3gmf+here->SOI3gmb+here->SOI3gmbs+ - here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)); - -/* if no thermal behaviour specified, then put in zero valued indpt. voltage source - between TOUT and ground */ - if (here->SOI3rt==0) - { - *(here->SOI3TOUT_ibrPtr) += 1.0; - *(here->SOI3IBR_toutPtr) += 1.0; - *(ckt->CKTrhs + (here->SOI3branch)) = 0; - } - else - { - *(here->SOI3TOUT_toutPtr) += -(here->SOI3gPdT)+grt[0]; - if (here->SOI3numThermalNodes > 1) - { - *(here->SOI3TOUT_tout1Ptr) += -grt[0]; - *(here->SOI3TOUT1_toutPtr) += -grt[0]; - *(here->SOI3TOUT1_tout1Ptr) += grt[0]+grt[1]; - } - if (here->SOI3numThermalNodes > 2) - { - *(here->SOI3TOUT1_tout2Ptr) += -grt[1]; - *(here->SOI3TOUT2_tout1Ptr) += -grt[1]; - *(here->SOI3TOUT2_tout2Ptr) += grt[1]+grt[2]; - } - if (here->SOI3numThermalNodes > 3) - { - *(here->SOI3TOUT2_tout3Ptr) += -grt[2]; - *(here->SOI3TOUT3_tout2Ptr) += -grt[2]; - *(here->SOI3TOUT3_tout3Ptr) += grt[2]+grt[3]; - } - if (here->SOI3numThermalNodes > 4) - { - *(here->SOI3TOUT3_tout4Ptr) += -grt[3]; - *(here->SOI3TOUT4_tout3Ptr) += -grt[3]; - *(here->SOI3TOUT4_tout4Ptr) += grt[3]+grt[4]; - } - - *(here->SOI3TOUT_dpPtr) += xnrm*(-(here->SOI3gPds*model->SOI3type)) - +xrev*(here->SOI3gPds+here->SOI3gPmf+ - here->SOI3gPmb+here->SOI3gPmbs)* - model->SOI3type; - *(here->SOI3TOUT_gfPtr) += -(here->SOI3gPmf*model->SOI3type); - *(here->SOI3TOUT_gbPtr) += -(here->SOI3gPmb*model->SOI3type); - *(here->SOI3TOUT_bPtr) += -(here->SOI3gPmbs*model->SOI3type); - *(here->SOI3TOUT_spPtr) += xnrm*(here->SOI3gPds+here->SOI3gPmf+ - here->SOI3gPmb+here->SOI3gPmbs)*model->SOI3type - +xrev*(-(here->SOI3gPds*model->SOI3type)); - - *(here->SOI3DP_toutPtr) += (xnrm-xrev)*here->SOI3gt*model->SOI3type; - *(here->SOI3SP_toutPtr) += (xrev-xnrm)*here->SOI3gt*model->SOI3type; -/* need to mult by type in above as conductances will be used with exterior voltages - which will be -ve for PMOS except for gPdT */ -/* now for thermal influence on impact ionisation current and tranisent stuff */ - *(here->SOI3DP_toutPtr) += (xnrm*here->SOI3gMdeltaT - - here->SOI3gbdT + here->SOI3gBJTdb_deltaT)*model->SOI3type; - *(here->SOI3SP_toutPtr) += (xrev*here->SOI3gMdeltaT - - here->SOI3gbsT + here->SOI3gBJTsb_deltaT)*model->SOI3type; - *(here->SOI3B_toutPtr) -= (here->SOI3gMdeltaT - here->SOI3gbsT - - here->SOI3gbdT + here->SOI3gBJTdb_deltaT + - here->SOI3gBJTsb_deltaT)*model->SOI3type; - } - } - } - return(OK); -} +/********** +STAG version 2.7 +Copyright 2000 owned by the United Kingdom Secretary of State for Defence +acting through the Defence Evaluation and Research Agency. +Developed by : Jim Benson, + Department of Electronics and Computer Science, + University of Southampton, + United Kingdom. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, + and Craig Easson. + +Based on STAG version 2.1 +Developed by : Mike Lee, +With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards + and John Bunyan. +Acknowledgements : Rupert Howes and Pete Mole. +**********/ + +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ + +#include "ngspice.h" +#include "cktdefs.h" +#include "soi3defs.h" +#include "sperror.h" +#include "suffix.h" + + +int +SOI3acLoad(GENmodel *inModel, CKTcircuit *ckt) +{ + SOI3model *model = (SOI3model*)inModel; + SOI3instance *here; + int xnrm; + int xrev; + + double cgfgf,cgfd,cgfs,cgfdeltaT,cgfgb; + double cdgf,cdd,cds,cddeltaT,cdgb; + double csgf,csd,css,csdeltaT,csgb; + double cbgf,cbd,cbs,cbdeltaT,cbgb; + double cgbgf,cgbd,cgbs,cgbdeltaT,cgbgb; + + double xcgfgf,xcgfd,xcgfs,xcgfdeltaT,xcgfgb; + double xcdgf,xcdd,xcds,xcddeltaT,xcdgb; + double xcsgf,xcsd,xcss,xcsdeltaT,xcsgb; + double xcbgf,xcbd,xcbs,xcbdeltaT,xcbgb; + double xcgbgf,xcgbd,xcgbs,xcgbdeltaT,xcgbgb; + + double capbd,capbs; /* diode capacitances */ + + double xcBJTbsbs,xcBJTbsdeltaT; + double xcBJTbdbd,xcBJTbddeltaT; + + double rtargs[5]; + double grt[5]; + double ctargs[5]; + double xct[5]; /* 1/reactance of thermal cap */ + int tnodeindex; + + double cgfb0; + double cgfd0; + double cgfs0; + + double cgbb0; + double cgbd0; + double cgbs0; + + double EffectiveLength; + + double omega; + + double m; + + omega = ckt->CKTomega; + + for( ; model != NULL; model = model->SOI3nextModel) + { + for(here = model->SOI3instances; here!= NULL; + here = here->SOI3nextInstance) + { + + if (here->SOI3owner != ARCHme) + continue; + + if (here->SOI3mode < 0) + { + xnrm=0; + xrev=1; + } + else + { + xnrm=1; + xrev=0; + } + + EffectiveLength=here->SOI3l - 2*model->SOI3latDiff; + + /* JimB - can use basic device geometry to estimate front and back */ + /* overlap capacitances to a first approximation. Use this default */ + /* model if capacitance factors aren't given in model netlist. */ + + /* Calculate front gate overlap capacitances. */ + + if(model->SOI3frontGateSourceOverlapCapFactorGiven) + { + cgfs0 = model->SOI3frontGateSourceOverlapCapFactor * here->SOI3w; + } + else + { + cgfs0 = model->SOI3latDiff * here->SOI3w * model->SOI3frontOxideCapFactor; + } + if(model->SOI3frontGateDrainOverlapCapFactorGiven) + { + cgfd0 = model->SOI3frontGateDrainOverlapCapFactor * here->SOI3w; + } + else + { + cgfd0 = model->SOI3latDiff * here->SOI3w * model->SOI3frontOxideCapFactor; + } + if(model->SOI3frontGateBulkOverlapCapFactorGiven) + { + cgfb0 = model->SOI3frontGateBulkOverlapCapFactor * EffectiveLength; + } + else + { + cgfb0 = EffectiveLength * (0.1*1e-6*model->SOI3minimumFeatureSize) + * model->SOI3frontOxideCapFactor; + } + + /* Calculate back gate overlap capacitances. */ + + if( (model->SOI3backGateSourceOverlapCapAreaFactorGiven) && + (!model->SOI3backGateSourceOverlapCapAreaFactor || here->SOI3asGiven) ) + { + cgbs0 = model->SOI3backGateSourceOverlapCapAreaFactor * here->SOI3as; + } + else + { + cgbs0 = (2*1e-6*model->SOI3minimumFeatureSize + model->SOI3latDiff) * here->SOI3w + * model->SOI3backOxideCapFactor; + } + if( (model->SOI3backGateDrainOverlapCapAreaFactorGiven) && + (!model->SOI3backGateDrainOverlapCapAreaFactor || here->SOI3adGiven) ) + { + cgbd0 = model->SOI3backGateDrainOverlapCapAreaFactor * here->SOI3ad; + } + else + { + cgbd0 = (2*1e-6*model->SOI3minimumFeatureSize + model->SOI3latDiff) * here->SOI3w + * model->SOI3backOxideCapFactor; + } + if( (model->SOI3backGateBulkOverlapCapAreaFactorGiven) && + (!model->SOI3backGateBulkOverlapCapAreaFactor || here->SOI3abGiven) ) + { + cgbb0 = model->SOI3backGateBulkOverlapCapAreaFactor * here->SOI3ab; + } + else + { + cgbb0 = EffectiveLength * (0.1*1e-6*model->SOI3minimumFeatureSize + here->SOI3w) + * model->SOI3backOxideCapFactor; + } + + capbd = here->SOI3capbd; + capbs = here->SOI3capbs; + + cgfgf = *(ckt->CKTstate0 + here->SOI3cgfgf); + cgfd = *(ckt->CKTstate0 + here->SOI3cgfd); + cgfs = *(ckt->CKTstate0 + here->SOI3cgfs); + cgfdeltaT = *(ckt->CKTstate0 + here->SOI3cgfdeltaT); + cgfgb = *(ckt->CKTstate0 + here->SOI3cgfgb); + csgf = *(ckt->CKTstate0 + here->SOI3csgf); + csd = *(ckt->CKTstate0 + here->SOI3csd); + css = *(ckt->CKTstate0 + here->SOI3css); + csdeltaT = *(ckt->CKTstate0 + here->SOI3csdeltaT); + csgb = *(ckt->CKTstate0 + here->SOI3csgb); + cdgf = *(ckt->CKTstate0 + here->SOI3cdgf); + cdd = *(ckt->CKTstate0 + here->SOI3cdd); + cds = *(ckt->CKTstate0 + here->SOI3cds); + cddeltaT = *(ckt->CKTstate0 + here->SOI3cddeltaT); + cdgb = *(ckt->CKTstate0 + here->SOI3cdgb); + cgbgf = *(ckt->CKTstate0 + here->SOI3cgbgf); + cgbd = *(ckt->CKTstate0 + here->SOI3cgbd); + cgbs = *(ckt->CKTstate0 + here->SOI3cgbs); + cgbdeltaT = *(ckt->CKTstate0 + here->SOI3cgbdeltaT); + cgbgb = *(ckt->CKTstate0 + here->SOI3cgbgb); + cbgf = -(cgfgf + cdgf + csgf + cgbgf); + cbd = -(cgfd + cdd + csd + cgbd); + cbs = -(cgfs + cds + css + cgbs); + cbdeltaT = -(cgfdeltaT + cddeltaT + csdeltaT + cgbdeltaT); + cbgb = -(cgfgb + cdgb + csgb + cgbgb); + + xcgfgf = (cgfgf + cgfd0 + cgfs0 + cgfb0) * omega; + xcgfd = (cgfd - cgfd0) * omega; + xcgfs = (cgfs - cgfs0) * omega; + xcgfdeltaT = cgfdeltaT * omega; + xcgfgb = cgfgb * omega; + xcdgf = (cdgf - cgfd0) * omega; + xcdd = (cdd + capbd + cgfd0 + cgbd0) * omega; + xcds = cds * omega; + xcddeltaT = cddeltaT * omega; + xcdgb = (cdgb - cgbd0) * omega; + xcsgf = (csgf - cgfs0) * omega; + xcsd = csd * omega; + xcss = (css + capbs + cgfs0 + cgbs0) * omega; + xcsdeltaT = csdeltaT * omega; + xcsgb = (csgb - cgbs0) * omega; + xcbgf = (cbgf - cgfb0) * omega; + xcbd = (cbd - capbd) * omega; + xcbs = (cbs - capbs) * omega; + xcbdeltaT = cbdeltaT * omega; + xcbgb = (cbgb - cgbb0) * omega; + xcgbgf = cgbgf * omega; + xcgbd = (cgbd - cgbd0) * omega; + xcgbs = (cgbs - cgbs0) * omega; + xcgbdeltaT = cgbdeltaT * omega; + xcgbgb = (cgbgb + cgbd0 + cgbs0 + cgbb0) * omega; + + xcBJTbsbs = *(ckt->CKTstate0 + here->SOI3cBJTbsbs) * omega; + xcBJTbsdeltaT = *(ckt->CKTstate0 + here->SOI3cBJTbsdeltaT) * omega; + xcBJTbdbd = *(ckt->CKTstate0 + here->SOI3cBJTbdbd) * omega; + xcBJTbddeltaT = *(ckt->CKTstate0 + here->SOI3cBJTbddeltaT) * omega; + + /* JimB - 15/9/99 */ + /* Code for multiple thermal time constants. Start by moving all */ + /* rt and ct constants into arrays. */ + rtargs[0]=here->SOI3rt; + rtargs[1]=here->SOI3rt1; + rtargs[2]=here->SOI3rt2; + rtargs[3]=here->SOI3rt3; + rtargs[4]=here->SOI3rt4; + + ctargs[0]=here->SOI3ct; + ctargs[1]=here->SOI3ct1; + ctargs[2]=here->SOI3ct2; + ctargs[3]=here->SOI3ct3; + ctargs[4]=here->SOI3ct4; + + /* Set all admittance components to zero. */ + grt[0]=grt[1]=grt[2]=grt[3]=grt[4]=0.0; + xct[0]=xct[1]=xct[2]=xct[3]=xct[4]=0.0; + /* Now calculate conductances and susceptances from rt and ct. */ + /* Don't need to worry about divide by zero when calculating */ + /* grt components, as soi3setup() only creates a thermal node */ + /* if corresponding rt is greater than zero. */ + for(tnodeindex=0;tnodeindexSOI3numThermalNodes;tnodeindex++) + { + xct[tnodeindex] = ctargs[tnodeindex] * ckt->CKTomega; + grt[tnodeindex] = 1/rtargs[tnodeindex]; + } + /* End JimB */ + + /* + * load matrix + */ + + m = here->SOI3m; + + *(here->SOI3GF_gfPtr + 1) += m * xcgfgf; + *(here->SOI3GF_gbPtr + 1) += m * xcgfgb; + *(here->SOI3GF_dpPtr + 1) += m * xcgfd; + *(here->SOI3GF_spPtr + 1) += m * xcgfs; + *(here->SOI3GF_bPtr + 1) -= m * (xcgfgf + xcgfd + xcgfs + xcgfgb); + + *(here->SOI3GB_gfPtr + 1) += m * xcgbgf; + *(here->SOI3GB_gbPtr + 1) += m * xcgbgb; + *(here->SOI3GB_dpPtr + 1) += m * xcgbd; + *(here->SOI3GB_spPtr + 1) += m * xcgbs; + *(here->SOI3GB_bPtr + 1) -= m * (xcgbgf + xcgbd + xcgbs + xcgbgb); + + *(here->SOI3B_gfPtr + 1) += m * xcbgf; + *(here->SOI3B_gbPtr + 1) += m * xcbgb; + *(here->SOI3B_dpPtr + 1) += m * (xcbd-xcBJTbdbd); + *(here->SOI3B_spPtr + 1) += m * (xcbs-xcBJTbsbs); + *(here->SOI3B_bPtr + 1) += m * (-(xcbgf+xcbd+xcbs+xcbgb) + +xcBJTbsbs+xcBJTbdbd); + + *(here->SOI3DP_gfPtr + 1) += m * xcdgf; + *(here->SOI3DP_gbPtr + 1) += m * xcdgb; + *(here->SOI3DP_dpPtr + 1) += m * (xcdd+xcBJTbdbd); + *(here->SOI3DP_spPtr + 1) += m * xcds; + *(here->SOI3DP_bPtr + 1) -= m * (xcdgf + xcdd + xcds + xcdgb + xcBJTbdbd); + + *(here->SOI3SP_gfPtr + 1) += m * xcsgf; + *(here->SOI3SP_gbPtr + 1) += m * xcsgb; + *(here->SOI3SP_dpPtr + 1) += m * xcsd; + *(here->SOI3SP_spPtr + 1) += m * (xcss+xcBJTbsbs); + *(here->SOI3SP_bPtr + 1) -= m * (xcsgf + xcsd + xcss + xcsgb + xcBJTbsbs); + +/* if no thermal behaviour specified, then put in zero valued indpt. voltage source + between TOUT and ground */ + if (here->SOI3rt==0) + { + *(here->SOI3TOUT_ibrPtr + 1) += m * 1.0; + *(here->SOI3IBR_toutPtr + 1) += m * 1.0; + *(ckt->CKTirhs + (here->SOI3branch)) = 0; + } + else + { + *(here->SOI3TOUT_toutPtr + 1) += m * xct[0]; + if (here->SOI3numThermalNodes > 1) + { + *(here->SOI3TOUT_tout1Ptr + 1) += m * (-xct[0]); + *(here->SOI3TOUT1_toutPtr + 1) += m * (-xct[0]); + *(here->SOI3TOUT1_tout1Ptr + 1) += m * (xct[0]+xct[1]); + } + if (here->SOI3numThermalNodes > 2) + { + *(here->SOI3TOUT1_tout2Ptr + 1) += m * (-xct[1]); + *(here->SOI3TOUT2_tout1Ptr + 1) += m * (-xct[1]); + *(here->SOI3TOUT2_tout2Ptr + 1) += m * (xct[1]+xct[2]); + } + if (here->SOI3numThermalNodes > 3) + { + *(here->SOI3TOUT2_tout3Ptr + 1) += m * (-xct[2]); + *(here->SOI3TOUT3_tout2Ptr + 1) += m * (-xct[2]); + *(here->SOI3TOUT3_tout3Ptr + 1) += m * (xct[2]+xct[3]); + } + if (here->SOI3numThermalNodes > 4) + { + *(here->SOI3TOUT3_tout4Ptr + 1) += m * (-xct[3]); + *(here->SOI3TOUT4_tout3Ptr + 1) += m * (-xct[3]); + *(here->SOI3TOUT4_tout4Ptr + 1) += m * (xct[3]+xct[4]); + } + *(here->SOI3GF_toutPtr + 1) += m * xcgfdeltaT*model->SOI3type; + *(here->SOI3DP_toutPtr + 1) += m * (xcddeltaT - xcBJTbddeltaT)*model->SOI3type; + *(here->SOI3SP_toutPtr + 1) += m * (xcsdeltaT - xcBJTbsdeltaT)*model->SOI3type; + *(here->SOI3B_toutPtr + 1) += m * model->SOI3type * + (xcbdeltaT + xcBJTbsdeltaT + xcBJTbddeltaT); + *(here->SOI3GB_toutPtr + 1) += m * xcgbdeltaT*model->SOI3type; + } + + + /* and now real part */ + *(here->SOI3D_dPtr) += (m * here->SOI3drainConductance); + *(here->SOI3D_dpPtr) += (m * (-here->SOI3drainConductance)); + *(here->SOI3DP_dPtr) += (m * (-here->SOI3drainConductance)); + + *(here->SOI3S_sPtr) += (m * here->SOI3sourceConductance); + *(here->SOI3S_spPtr) += (m * (-here->SOI3sourceConductance)); + *(here->SOI3SP_sPtr) += (m * (-here->SOI3sourceConductance)); + + *(here->SOI3DP_gfPtr) += ((m * (xnrm-xrev)*here->SOI3gmf + + xnrm*here->SOI3gMmf)); + *(here->SOI3DP_gbPtr) += (m * ((xnrm-xrev)*here->SOI3gmb + + xnrm*here->SOI3gMmb)); + *(here->SOI3DP_dpPtr) += m * (here->SOI3drainConductance+here->SOI3gds+ + here->SOI3gbd+xrev*(here->SOI3gmf+here->SOI3gmbs+ + here->SOI3gmb)+xnrm*here->SOI3gMd); + *(here->SOI3DP_spPtr) += m * (-here->SOI3gds - here->SOI3gBJTdb_bs + -xnrm*(here->SOI3gmf+here->SOI3gmb+here->SOI3gmbs + + here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)); + *(here->SOI3DP_bPtr) += m * (-here->SOI3gbd + here->SOI3gBJTdb_bs + +(xnrm-xrev)*here->SOI3gmbs+ + xnrm*here->SOI3gMmbs); + + *(here->SOI3SP_gfPtr) += m * (-(xnrm-xrev)*here->SOI3gmf+ + xrev*here->SOI3gMmf); + *(here->SOI3SP_gbPtr) += m * (-(xnrm-xrev)*here->SOI3gmb+ + xrev*here->SOI3gMmb); + *(here->SOI3SP_dpPtr) += m * (-here->SOI3gds - here->SOI3gBJTsb_bd + -xrev*(here->SOI3gmf+here->SOI3gmb+here->SOI3gmbs+ + here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)); + *(here->SOI3SP_spPtr) += m * (here->SOI3sourceConductance+here->SOI3gds+ + here->SOI3gbs+xnrm*(here->SOI3gmf+here->SOI3gmbs+ + here->SOI3gmb)+xrev*here->SOI3gMd); + *(here->SOI3SP_bPtr) += m * (-here->SOI3gbs + here->SOI3gBJTsb_bd + -(xnrm-xrev)*here->SOI3gmbs+ + xrev*here->SOI3gMmbs); + + *(here->SOI3B_gfPtr) += m * (-here->SOI3gMmf); + *(here->SOI3B_gbPtr) += m * (-here->SOI3gMmb); + *(here->SOI3B_dpPtr) += m * (-(here->SOI3gbd) + here->SOI3gBJTsb_bd + + xrev*(here->SOI3gMmf+here->SOI3gMmb+ + here->SOI3gMmbs+here->SOI3gMd) - + xnrm*here->SOI3gMd); + *(here->SOI3B_spPtr) += m * (-(here->SOI3gbs) + here->SOI3gBJTdb_bs + + xnrm*(here->SOI3gMmf+here->SOI3gMmb+ + here->SOI3gMmbs+here->SOI3gMd) - + xrev*here->SOI3gMd); + *(here->SOI3B_bPtr) += m * (here->SOI3gbd+here->SOI3gbs - + here->SOI3gMmbs + - here->SOI3gBJTdb_bs - here->SOI3gBJTsb_bd); + +/* if no thermal behaviour specified, then put in zero valued indpt. voltage source + between TOUT and ground */ + if (here->SOI3rt==0) + { + *(here->SOI3TOUT_ibrPtr) += m * 1.0; + *(here->SOI3IBR_toutPtr) += m * 1.0; + *(ckt->CKTrhs + (here->SOI3branch)) = 0; + } + else + { + *(here->SOI3TOUT_toutPtr) += m * (-(here->SOI3gPdT)+grt[0]); + if (here->SOI3numThermalNodes > 1) + { + *(here->SOI3TOUT_tout1Ptr) += m * (-grt[0]); + *(here->SOI3TOUT1_toutPtr) += m * (-grt[0]); + *(here->SOI3TOUT1_tout1Ptr) += m * (grt[0]+grt[1]); + } + if (here->SOI3numThermalNodes > 2) + { + *(here->SOI3TOUT1_tout2Ptr) += m * (-grt[1]); + *(here->SOI3TOUT2_tout1Ptr) += m * (-grt[1]); + *(here->SOI3TOUT2_tout2Ptr) += m * (grt[1]+grt[2]); + } + if (here->SOI3numThermalNodes > 3) + { + *(here->SOI3TOUT2_tout3Ptr) += m * (-grt[2]); + *(here->SOI3TOUT3_tout2Ptr) += m * (-grt[2]); + *(here->SOI3TOUT3_tout3Ptr) += m * (grt[2]+grt[3]); + } + if (here->SOI3numThermalNodes > 4) + { + *(here->SOI3TOUT3_tout4Ptr) += m * (-grt[3]); + *(here->SOI3TOUT4_tout3Ptr) += m * (-grt[3]); + *(here->SOI3TOUT4_tout4Ptr) += m * (grt[3]+grt[4]); + } + + *(here->SOI3TOUT_dpPtr) += m * (xnrm*(-(here->SOI3gPds*model->SOI3type)) + +xrev*(here->SOI3gPds+here->SOI3gPmf+ + here->SOI3gPmb+here->SOI3gPmbs)* + model->SOI3type); + *(here->SOI3TOUT_gfPtr) += m * (-(here->SOI3gPmf*model->SOI3type)); + *(here->SOI3TOUT_gbPtr) += m * (-(here->SOI3gPmb*model->SOI3type)); + *(here->SOI3TOUT_bPtr) += m * (-(here->SOI3gPmbs*model->SOI3type)); + *(here->SOI3TOUT_spPtr) += m * (xnrm*(here->SOI3gPds+here->SOI3gPmf+ + here->SOI3gPmb+here->SOI3gPmbs)*model->SOI3type + +xrev*(-(here->SOI3gPds*model->SOI3type))); + + *(here->SOI3DP_toutPtr) += m * (xnrm-xrev)*here->SOI3gt*model->SOI3type; + *(here->SOI3SP_toutPtr) += m * (xrev-xnrm)*here->SOI3gt*model->SOI3type; +/* need to mult by type in above as conductances will be used with exterior voltages + which will be -ve for PMOS except for gPdT */ +/* now for thermal influence on impact ionisation current and transient stuff */ + *(here->SOI3DP_toutPtr) += m * (xnrm*here->SOI3gMdeltaT - + here->SOI3gbdT + here->SOI3gBJTdb_deltaT)*model->SOI3type; + *(here->SOI3SP_toutPtr) += m * (xrev*here->SOI3gMdeltaT - + here->SOI3gbsT + here->SOI3gBJTsb_deltaT)*model->SOI3type; + *(here->SOI3B_toutPtr) -= m * (here->SOI3gMdeltaT - here->SOI3gbsT - + here->SOI3gbdT + here->SOI3gBJTdb_deltaT + + here->SOI3gBJTsb_deltaT)*model->SOI3type; + } + } + } + return(OK); +} diff --git a/src/spicelib/devices/soi3/soi3ask.c b/src/spicelib/devices/soi3/soi3ask.c index f284e6ae5..5e060a3c4 100644 --- a/src/spicelib/devices/soi3/soi3ask.c +++ b/src/spicelib/devices/soi3/soi3ask.c @@ -1,12 +1,12 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,10 +15,12 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "cktdefs.h" @@ -30,12 +32,8 @@ Acknowledgements : Rupert Howes and Pete Mole. /*ARGSUSED*/ int -SOI3ask(ckt,inst,which,value,select) - CKTcircuit *ckt; - GENinstance *inst; - int which; - IFvalue *value; - IFvalue *select; +SOI3ask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, + IFvalue *select) { SOI3instance *here = (SOI3instance*)inst; double vr; @@ -51,6 +49,18 @@ SOI3ask(ckt,inst,which,value,select) case SOI3_W: value->rValue = here->SOI3w; return(OK); + case SOI3_M: + value->rValue = here->SOI3m; + return(OK); + case SOI3_AS: + value->rValue = here->SOI3as; + return(OK); + case SOI3_AD: + value->rValue = here->SOI3ad; + return(OK); + case SOI3_AB: + value->rValue = here->SOI3ab; + return(OK); case SOI3_NRS: value->rValue = here->SOI3sourceSquares; return(OK); @@ -77,9 +87,11 @@ SOI3ask(ckt,inst,which,value,select) return(OK); case SOI3_RT: value->rValue = here->SOI3rt; + value->rValue /= here->SOI3m; return(OK); case SOI3_CT: value->rValue = here->SOI3ct; + value->rValue *= here->SOI3m; return(OK); case SOI3_DNODE: value->iValue = here->SOI3dNode; @@ -110,9 +122,11 @@ SOI3ask(ckt,inst,which,value,select) return(OK); case SOI3_SOURCECONDUCT: value->rValue = here->SOI3sourceConductance; + value->rValue *= here->SOI3m; return(OK); case SOI3_DRAINCONDUCT: value->rValue = here->SOI3drainConductance; + value->rValue *= here->SOI3m; return(OK); case SOI3_VON: value->rValue = here->SOI3tVto; @@ -131,42 +145,55 @@ SOI3ask(ckt,inst,which,value,select) return(OK); case SOI3_ID: value->rValue = here->SOI3id; + value->rValue *= here->SOI3m; return(OK); case SOI3_IBS: value->rValue = here->SOI3ibs; + value->rValue *= here->SOI3m; return(OK); case SOI3_IBD: value->rValue = here->SOI3ibd; + value->rValue *= here->SOI3m; return(OK); case SOI3_GMBS: value->rValue = here->SOI3gmbs; + value->rValue *= here->SOI3m; return(OK); case SOI3_GMF: value->rValue = here->SOI3gmf; + value->rValue *= here->SOI3m; return(OK); case SOI3_GMB: value->rValue = here->SOI3gmb; + value->rValue *= here->SOI3m; return(OK); case SOI3_GDS: value->rValue = here->SOI3gds; + value->rValue *= here->SOI3m; return(OK); case SOI3_GBD: value->rValue = here->SOI3gbd; + value->rValue *= here->SOI3m; return(OK); case SOI3_GBS: value->rValue = here->SOI3gbs; + value->rValue *= here->SOI3m; return(OK); case SOI3_CAPBD: value->rValue = here->SOI3capbd; + value->rValue *= here->SOI3m; return(OK); case SOI3_CAPBS: value->rValue = here->SOI3capbs; + value->rValue *= here->SOI3m; return(OK); case SOI3_CAPZEROBIASBD: value->rValue = here->SOI3Cbd; + value->rValue *= here->SOI3m; return(OK); case SOI3_CAPZEROBIASBS: value->rValue = here->SOI3Cbs; + value->rValue *= here->SOI3m; return(OK); case SOI3_VBD: value->rValue = *(ckt->CKTstate0 + here->SOI3vbd); @@ -185,69 +212,123 @@ SOI3ask(ckt,inst,which,value,select) return(OK); case SOI3_QGF: value->rValue = *(ckt->CKTstate0 + here->SOI3qgf); + value->rValue *= here->SOI3m; return(OK); case SOI3_IQGF: value->rValue = *(ckt->CKTstate0 + here->SOI3iqgf); + value->rValue *= here->SOI3m; return(OK); case SOI3_QD: value->rValue = *(ckt->CKTstate0 + here->SOI3qd); + value->rValue *= here->SOI3m; return(OK); case SOI3_IQD: value->rValue = *(ckt->CKTstate0 + here->SOI3iqd); + value->rValue *= here->SOI3m; return(OK); case SOI3_QS: value->rValue = *(ckt->CKTstate0 + here->SOI3qs); + value->rValue *= here->SOI3m; return(OK); case SOI3_IQS: value->rValue = *(ckt->CKTstate0 + here->SOI3iqs); + value->rValue *= here->SOI3m; return(OK); case SOI3_CGFGF: value->rValue = *(ckt->CKTstate0 + here->SOI3cgfgf); + value->rValue *= here->SOI3m; return (OK); case SOI3_CGFD: value->rValue = *(ckt->CKTstate0 + here->SOI3cgfd); + value->rValue *= here->SOI3m; return (OK); case SOI3_CGFS: value->rValue = *(ckt->CKTstate0 + here->SOI3cgfs); + value->rValue *= here->SOI3m; return (OK); case SOI3_CGFDELTAT: value->rValue = *(ckt->CKTstate0 + here->SOI3cgfdeltaT); + value->rValue *= here->SOI3m; return (OK); + case SOI3_CGFGB: + value->rValue = *(ckt->CKTstate0 + here->SOI3cgfgb); + value->rValue *= here->SOI3m; + return (OK); case SOI3_CDGF: value->rValue = *(ckt->CKTstate0 + here->SOI3cdgf); + value->rValue *= here->SOI3m; return (OK); case SOI3_CDD: value->rValue = *(ckt->CKTstate0 + here->SOI3cdd); + value->rValue *= here->SOI3m; return (OK); case SOI3_CDS: value->rValue = *(ckt->CKTstate0 + here->SOI3cds); + value->rValue *= here->SOI3m; return (OK); case SOI3_CDDELTAT: value->rValue = *(ckt->CKTstate0 + here->SOI3cddeltaT); + value->rValue *= here->SOI3m; + return (OK); + case SOI3_CDGB: + value->rValue = *(ckt->CKTstate0 + here->SOI3cdgb); + value->rValue *= here->SOI3m; return (OK); case SOI3_CSGF: value->rValue = *(ckt->CKTstate0 + here->SOI3csgf); + value->rValue *= here->SOI3m; return (OK); case SOI3_CSD: value->rValue = *(ckt->CKTstate0 + here->SOI3csd); + value->rValue *= here->SOI3m; return (OK); case SOI3_CSS: value->rValue = *(ckt->CKTstate0 + here->SOI3css); + value->rValue *= here->SOI3m; return (OK); case SOI3_CSDELTAT: value->rValue = *(ckt->CKTstate0 + here->SOI3csdeltaT); + value->rValue *= here->SOI3m; + return (OK); + case SOI3_CSGB: + value->rValue = *(ckt->CKTstate0 + here->SOI3csgb); + value->rValue *= here->SOI3m; + return (OK); + case SOI3_CGBGF: + value->rValue = *(ckt->CKTstate0 + here->SOI3cgbgf); + value->rValue *= here->SOI3m; + return (OK); + case SOI3_CGBD: + value->rValue = *(ckt->CKTstate0 + here->SOI3cgbd); + value->rValue *= here->SOI3m; + return (OK); + case SOI3_CGBS: + value->rValue = *(ckt->CKTstate0 + here->SOI3cgbs); + value->rValue *= here->SOI3m; + return (OK); + case SOI3_CGBDELTAT: + value->rValue = *(ckt->CKTstate0 + here->SOI3cgbdeltaT); + value->rValue *= here->SOI3m; + return (OK); + case SOI3_CGBGB: + value->rValue = *(ckt->CKTstate0 + here->SOI3cgbgb); + value->rValue *= here->SOI3m; return (OK); case SOI3_QBD: value->rValue = *(ckt->CKTstate0 + here->SOI3qbd); + value->rValue *= here->SOI3m; return(OK); case SOI3_IQBD: value->rValue = *(ckt->CKTstate0 + here->SOI3iqbd); + value->rValue *= here->SOI3m; return(OK); case SOI3_QBS: value->rValue = *(ckt->CKTstate0 + here->SOI3qbs); + value->rValue *= here->SOI3m; return(OK); case SOI3_IQBS: value->rValue = *(ckt->CKTstate0 + here->SOI3iqbs); + value->rValue *= here->SOI3m; return(OK); /* extra stuff for newer model - msll Jan96 */ case SOI3_VFBB: @@ -255,27 +336,35 @@ SOI3ask(ckt,inst,which,value,select) return(OK); case SOI3_RT1: value->rValue = here->SOI3rt1; + value->rValue /= here->SOI3m; return(OK); case SOI3_CT1: value->rValue = here->SOI3ct1; + value->rValue *= here->SOI3m; return(OK); case SOI3_RT2: value->rValue = here->SOI3rt2; + value->rValue /= here->SOI3m; return(OK); case SOI3_CT2: value->rValue = here->SOI3ct2; + value->rValue *= here->SOI3m; return(OK); case SOI3_RT3: value->rValue = here->SOI3rt3; + value->rValue /= here->SOI3m; return(OK); case SOI3_CT3: value->rValue = here->SOI3ct3; + value->rValue *= here->SOI3m; return(OK); case SOI3_RT4: value->rValue = here->SOI3rt4; + value->rValue /= here->SOI3m; return(OK); case SOI3_CT4: value->rValue = here->SOI3ct4; + value->rValue *= here->SOI3m; return(OK); /* diff --git a/src/spicelib/devices/soi3/soi3cap.c b/src/spicelib/devices/soi3/soi3cap.c index 351bb03d6..4e92b0e5f 100644 --- a/src/spicelib/devices/soi3/soi3cap.c +++ b/src/spicelib/devices/soi3/soi3cap.c @@ -1,12 +1,13 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, + and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,7 +16,10 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" #include "cktdefs.h" @@ -26,34 +30,19 @@ Acknowledgements : Rupert Howes and Pete Mole. void -SOI3cap(vgB,Phiplusvsb,gammaB, - paramargs, - Bfargs,alpha_args,psi_st0args, - vGTargs, - psi_sLargs,psi_s0args, - ldargs, - Qg,Qb,Qd,QgB, - cggf,cgd,cgs,cgdeltaT, - cbgf,cbd,cbs,cbdeltaT,cbgb, - cdgf,cdd,cds,cddeltaT, - cgbgb,cgbsb +SOI3cap(double vgB, double Phiplusvsb, double gammaB, + double paramargs[10], + double Bfargs[2], double alpha_args[2], double psi_st0args[5], + double vGTargs[5], + double psi_sLargs[5], double psi_s0args[5], + double ldargs[5], + double *Qg, double *Qb, double *Qd, double *QgB, + double *cgfgf, double *cgfd, double *cgfs, double *cgfdeltaT, + double *cgfgb, double *cbgf, double *cbd, double *cbs, + double *cbdeltaT, double *cbgb, double *cdgf, double *cdd, + double *cds, double *cddeltaT, double *cdgb, double *cgbgf, + double *cgbd, double *cgbs, double *cgbdeltaT, double *cgbgb ) - -double vgB,Phiplusvsb,gammaB; -double paramargs[10]; -double Bfargs[2],alpha_args[5]; -double psi_st0args[5]; -double vGTargs[5]; -double psi_sLargs[5],psi_s0args[5]; -double ldargs[5]; - -double *Qg,*Qb,*Qd,*QgB; -double *cggf,*cgd,*cgs,*cgdeltaT; -double *cbgf,*cbd,*cbs,*cbdeltaT,*cbgb; -double *cdgf,*cdd,*cds,*cddeltaT; -double *cgbgb,*cgbsb; - - /****** Part 1 - declare local variables. ******/ { @@ -77,7 +66,7 @@ double dercq,derdq; double sigmaC,Eqc,Eqd; double DVqs_Dvgfb,DVqs_Dvdb,DVqs_Dvsb,DVqs_DdeltaT; double DF_Dvgfb,DF_Dvdb,DF_Dvsb,DF_DdeltaT; -double ccgf,ccd,ccs,ccdeltaT; +double ccgf,ccd,ccs,ccdeltaT,ccgb; double A0B,EA0B,tmpsb; double Vgmax0B,VgBx0,EBmax0,tmpmax0,tmpmaxsb; @@ -142,11 +131,14 @@ sigmaC = 1E-8; Vqd = (vGT - alpha*psi_sL); /* This is -qd/Cof */ Vqs = (vGT - alpha*psi_s0); /* This is -qs/Cof */ -if (Vqs<=0) { /* deep subthreshold contingency */ +if (Vqs<=0) +{ /* deep subthreshold contingency */ F = 1; -} else { +} else +{ F = Vqd/Vqs; - if (F<0) { /* physically impossible situation */ + if (F<0) + { /* physically impossible situation */ F=0; } } @@ -208,12 +200,15 @@ DVqs_Dvdb = DvGT_Dvdb - alpha*Dpsi_s0_Dvdb - psi_s0*Dalpha_Dvdb; DVqs_Dvsb = DvGT_Dvsb - alpha*Dpsi_s0_Dvsb - psi_s0*Dalpha_Dvsb; DVqs_DdeltaT = DvGT_DdeltaT - alpha*Dpsi_s0_DdeltaT - psi_s0*Dalpha_DdeltaT; -if (Vqs==0) { +if (Vqs==0) +{ DF_Dvgfb = 0; DF_Dvdb = 0; DF_Dvsb = 0; DF_DdeltaT = 0; -} else { +} +else +{ DF_Dvgfb = (DvGT_Dvgfb - alpha*Dpsi_sL_Dvgfb - psi_sL*Dalpha_Dvgfb - F*DVqs_Dvgfb)/Vqs; DF_Dvdb = (DvGT_Dvdb - alpha*Dpsi_sL_Dvdb - psi_sL*Dalpha_Dvdb - @@ -230,6 +225,7 @@ ccgf = Dlimc*(-2*(DVqs_Dvgfb*cq + Vqs*dercq*DF_Dvgfb)/3); ccd = Dlimc*(-2*(DVqs_Dvdb*cq + Vqs*dercq*DF_Dvdb)/3); ccs = Dlimc*(-2*(DVqs_Dvsb*cq + Vqs*dercq*DF_Dvsb)/3); ccdeltaT = Dlimc*(-2*(DVqs_DdeltaT*cq + Vqs*dercq*DF_DdeltaT)/3); +ccgb = 0; derdq = F*(3*F2 + 9*F + 8)/((1+F)*(1+F)*(1+F)); @@ -237,6 +233,7 @@ derdq = F*(3*F2 + 9*F + 8)/((1+F)*(1+F)*(1+F)); *cdd = Dlimd*(-2*(DVqs_Dvdb * dq + Vqs*derdq*DF_Dvdb)/15); *cds = Dlimd*(-2*(DVqs_Dvsb * dq + Vqs*derdq*DF_Dvsb)/15); *cddeltaT = Dlimd*(-2*(DVqs_DdeltaT * dq + Vqs*derdq*DF_DdeltaT)/15); +*cdgb = 0; /* JimB - note that for the following expressions, the Vx dependence of */ /* delta is accounted for by the term (vGT+Qcprime)*(Dalpha_Dvx/gamma). */ @@ -265,6 +262,7 @@ derdq = F*(3*F2 + 9*F + 8)/((1+F)*(1+F)*(1+F)); delta*(vGT+Qcprime)*Dalpha_DdeltaT )/(alpha*alpha) ); +*cbgb = 0; /****** Part 6 - Normalised expressions from part 4 are adjusted ******/ @@ -338,6 +336,7 @@ Qg2prime = -Qc2prime-Qb2prime; (psi_sL*Dalpha_DdeltaT/gamma)) + (Qb2prime - Qbprime/(Fc*Fc))*Dld_DdeltaT ); +*cbgb = 0; ccgf = WCox*(Lprime*(ccgf) - ld*(DvGT_Dvgfb - alpha*Dpsi_sL_Dvgfb - psi_sL*Dalpha_Dvgfb) + @@ -353,26 +352,9 @@ ccdeltaT = WCox*(Lprime*(ccdeltaT) - ld*(DvGT_DdeltaT - alpha*Dpsi_sL_DdeltaT - psi_sL*Dalpha_DdeltaT) + (Qc2prime - Qcprime/(Fc*Fc))*Dld_DdeltaT ); +ccgb = 0; -/* JimB - 9/1/99. Re-partition drain region charge */ - -/* -*cdgf = WCox*(Lprime*(*cdgf) - ld*(DvGT_Dvgfb - alpha*Dpsi_sL_Dvgfb - psi_sL*Dalpha_Dvgfb) + - (Qd2prime - Qdprime/(Fc*Fc))*Dld_Dvgfb - ); -*cdd = WCox*(Lprime*(*cdd) - ld*(DvGT_Dvdb - alpha*Dpsi_sL_Dvdb - psi_sL*Dalpha_Dvdb) + - (Qd2prime - Qdprime/(Fc*Fc))*Dld_Dvdb - ); -*cds = WCox*(Lprime*(*cds) - ld*(DvGT_Dvsb - alpha*Dpsi_sL_Dvsb - psi_sL*Dalpha_Dvsb) + - (Qd2prime - Qdprime/(Fc*Fc))*Dld_Dvsb - ); -*cddeltaT = WCox*(Lprime*(*cddeltaT) - ld*(DvGT_DdeltaT - - alpha*Dpsi_sL_DdeltaT - psi_sL*Dalpha_DdeltaT) + - (Qd2prime - Qdprime/(Fc*Fc))*Dld_DdeltaT - ); -*/ - *cdgf = WCox*(Lprime*(*cdgf) - 0.5*ld*(DvGT_Dvgfb - alpha*Dpsi_sL_Dvgfb - psi_sL*Dalpha_Dvgfb) + (Qd2prime - Qdprime/(Fc*Fc))*Dld_Dvgfb ); @@ -386,9 +368,9 @@ ccdeltaT = WCox*(Lprime*(ccdeltaT) - alpha*Dpsi_sL_DdeltaT - psi_sL*Dalpha_DdeltaT) + (Qd2prime - Qdprime/(Fc*Fc))*Dld_DdeltaT ); +*cdgb = 0; - -/****** Part 9 - Finally, include accumulation charge derivatives. ******/ +/****** Part 9 - Finally, include accumulation charge derivatives. ******/ /* Now include accumulation charge derivs */ @@ -396,125 +378,59 @@ ccdeltaT = WCox*(Lprime*(ccdeltaT) - *cbd += -WCox*L*tmpacc*sigma; *cbs += -WCox*L*tmpacc*(-sigma); *cbdeltaT += -WCox*L*tmpacc*chiFB; +*cbgb += 0; -*cggf = -(ccgf + *cbgf); -*cgd = -(ccd + *cbd); -*cgs = -(ccs + *cbs); -*cgdeltaT = -(ccdeltaT + *cbdeltaT); - - -/****** Part 10 - Back gate stuff - doesn't work, so commented out. ******/ - -/* front gate stuff is self consistent by itself, now add in back gate stuff - we're not too interested in EXACT back gate behaviour, so this is quite a - rough model. - But even this causes convergence problems in transient - so leave it out - for now. Scope for further work. -*/ -/* -if (Phiplusvsb > vt*MAX_EXP_ARG) { - A0B = Phiplusvsb; - tmpsb = 1; -} else { - EA0B = exp(Phiplusvsb/vt); - A0B = vt*log(1+EA0B); - tmpsb = EA0B/(1+EA0B); -} - -Vgmax0B = A0B + gammaB*sqrt(A0B); - -if ((Vgmax0B-vgB)>vt*MAX_EXP_ARG) { - VgBx0=vgB; - tmpmax0 = 1; - tmpmaxsb = 0; -} else { - EBmax0 = exp((Vgmax0B - vgB)/vt); - VgBx0=Vgmax0B - vt*log(1+EBmax0); - tmpmax0 = EBmax0/(1+EBmax0); - tmpmaxsb = 1/(1+EBmax0); -} - -if (VgBx0>vt*MAX_EXP_ARG) { - VgBy0 = VgBx0; - tmpmin0 = 1; -} else { - EBy0 = exp(VgBx0/vt); - VgBy0 = vt*log(1+EBy0); - tmpmin0 = EBy0/(1+EBy0); -} - -SgB0 = sqrt(gammaB*gammaB + 4*VgBy0); - -*QgB = -WCob*L*gammaB*0.5*(gammaB-SgB0); -*Qb -= *QgB; +*cgfgf = -(ccgf + *cbgf); +*cgfd = -(ccd + *cbd); +*cgfs = -(ccs + *cbs); +*cgfdeltaT = -(ccdeltaT + *cbdeltaT); +*cgfgb = 0; -*cgbgb = (WCob*L*gammaB/SgB0)*tmpmin0*tmpmax0; -*cgbsb = (WCob*L*gammaB/SgB0)*tmpmin0*tmpmaxsb*(1+0.5*gammaB/sqrt(A0B))*tmpsb; +/****** Part 10 - Back gate stuff - doesn't work, so set to zero. ******/ -*cbgb = -(*cgbgb); -*cbs -= *cgbsb; -*/ +/* Should move this before the accumulation section for consistency, but */ +/* doesn't matter, as all intrinsic back-gate capacitances set to zero +anyway. */ *QgB = 0; -*cbgb = 0; + +*cgbgf = 0; +*cgbd = 0; +*cgbs = 0; *cgbgb = 0; -*cgbsb = 0; +*cgbdeltaT = 0; } void -SOI3capEval(ckt, - Frontcapargs, - Backcapargs, - cgfgf,cgfd,cgfs,cgfdeltaT, - cdgf,cdd,cds,cddeltaT, - csgf,csd,css,csdeltaT, - cbgf,cbd,cbs,cbdeltaT,cbgb, - cgbgb,cgbsb, - gcgfgf,gcgfd,gcgfs,gcgfdeltaT, - gcdgf,gcdd,gcds,gcddeltaT, - gcsgf,gcsd,gcss,gcsdeltaT, - gcbgf,gcbd,gcbs,gcbdeltaT,gcbgb, - gcgbgb,gcgbsb,gcgbdb, - gcgbs0,gcgbd0, - qgatef,qbody,qdrn,qsrc,qgateb) - -register CKTcircuit *ckt; -double Frontcapargs[6]; -double Backcapargs[6]; - - -double cgfgf,cgfd,cgfs,cgfdeltaT; -double cdgf,cdd,cds,cddeltaT; -double csgf,csd,css,csdeltaT; -double cbgf,cbd,cbs,cbdeltaT,cbgb; -double cgbgb,cgbsb; - -double *gcgfgf,*gcgfd,*gcgfs,*gcgfdeltaT; -double *gcdgf,*gcdd,*gcds,*gcddeltaT; -double *gcsgf,*gcsd,*gcss,*gcsdeltaT; -double *gcbgf,*gcbd,*gcbs,*gcbdeltaT,*gcbgb; -double *gcgbgb,*gcgbsb,*gcgbdb; -double *gcgbs0,*gcgbd0; - -double *qgatef; -double *qbody; -double *qdrn; -double *qsrc; -double *qgateb; +SOI3capEval(CKTcircuit *ckt, + double Frontcapargs[6], + double Backcapargs[6], + double cgfgf, double cgfd, double cgfs, double cgfdeltaT, double cgfgb, + double cdgf, double cdd, double cds, double cddeltaT, double cdgb, + double csgf, double csd, double css, double csdeltaT, double csgb, + double cbgf, double cbd, double cbs, double cbdeltaT, double cbgb, + double cgbgf, double cgbd, double cgbs, double cgbdeltaT, double cgbgb, + + double *gcgfgf, double *gcgfd, double *gcgfs, double *gcgfdeltaT, double *gcgfgb, + double *gcdgf, double *gcdd, double *gcds, double *gcddeltaT, double *gcdgb, + double *gcsgf, double *gcsd, double *gcss, double *gcsdeltaT, double *gcsgb, + double *gcbgf, double *gcbd, double *gcbs, double *gcbdeltaT, double *gcbgb, + double *gcgbgf, double *gcgbd, double *gcgbs, double *gcgbdeltaT, double *gcgbgb, + double *qgatef, double *qbody, double *qdrn, double *qsrc, double *qgateb) { +double cgfd0,cgfs0,cgfb0; +double cgbd0,cgbs0,cgbb0; double vgfd,vgfs,vgfb; double vgbd,vgbs,vgbb; -double cgd0,cgs0,cgb0; -double cgbd0,cgbs0,cgbb0; double ag0; -double qgd,qgs,qgb; -double qgb_d,qgb_s,qgb_b; +double qgfd,qgfs,qgfb; +double qgbd,qgbs,qgbb; -cgd0 = Frontcapargs[0]; -cgs0 = Frontcapargs[1]; -cgb0 = Frontcapargs[2]; +cgfd0 = Frontcapargs[0]; +cgfs0 = Frontcapargs[1]; +cgfb0 = Frontcapargs[2]; vgfd = Frontcapargs[3]; vgfs = Frontcapargs[4]; vgfb = Frontcapargs[5]; @@ -529,62 +445,47 @@ vgbb = Backcapargs[5]; /* stuff below includes overlap caps' conductances */ ag0 = ckt->CKTag[0]; -*gcgfgf = (cgfgf + cgd0 + cgs0 + cgb0) * ag0; -*gcgfd = (cgfd - cgd0) * ag0; -*gcgfs = (cgfs - cgs0) * ag0; +*gcgfgf = (cgfgf + cgfd0 + cgfs0 + cgfb0) * ag0; +*gcgfd = (cgfd - cgfd0) * ag0; +*gcgfs = (cgfs - cgfs0) * ag0; *gcgfdeltaT = cgfdeltaT * ag0; +*gcgfgb = cgfgb * ag0; -*gcdgf = (cdgf - cgd0) * ag0; -*gcdd = (cdd + cgd0) * ag0; +*gcdgf = (cdgf - cgfd0) * ag0; +*gcdd = (cdd + cgfd0 + cgbd0) * ag0; *gcds = cds * ag0; *gcddeltaT = cddeltaT * ag0; +*gcdgb = (cdgb - cgbd0) * ag0; -*gcsgf = (csgf - cgs0) * ag0; +*gcsgf = (csgf - cgfs0) * ag0; *gcsd = csd * ag0; -*gcss = (css + cgs0) * ag0; +*gcss = (css + cgfs0 + cgbs0) * ag0; *gcsdeltaT = csdeltaT * ag0; +*gcsgb = (csgb - cgbs0) * ag0; -*gcbgf = (cbgf - cgb0) * ag0; +*gcbgf = (cbgf - cgfb0) * ag0; *gcbd = cbd * ag0; *gcbs = cbs * ag0; *gcbdeltaT = cbdeltaT * ag0; - -*gcbgb = cbgb * ag0; -/* *gcbgb = (cbgb - cgbb0) * ag0; +*gcgbgf = cgbgf * ag0; +*gcgbd = (cgbd - cgbd0) * ag0; +*gcgbs = (cgbs - cgbs0) * ag0; +*gcgbdeltaT = cgbdeltaT * ag0; +*gcgbgb = (cgbgb + cgbd0 + cgbs0 + cgbb0) * ag0; -*gcgbgb = (cgbgb + cgbb0 + cgbd0 + cgbs0) * ag0; -*gcgbsb = (cgbsb - cgbs0) * ag0; -*gcgbdb = -cgbd0 * ag0; - -*gcgbd0 = cgbd0 * ag0; -*gcgbs0 = cgbs0 * ag0; -*/ - -*gcgbgb = cgbgb * ag0; -*gcgbsb = cgbsb * ag0; -*gcgbdb = 0; - -*gcgbd0 = 0; -*gcgbs0 = 0; - -qgd = cgd0 * vgfd; -qgs = cgs0 * vgfs; -qgb = cgb0 * vgfb; +qgfd = cgfd0 * vgfd; +qgfs = cgfs0 * vgfs; +qgfb = cgfb0 * vgfb; -/* -qgb_d = cgbd0 * vgbd; -qgb_s = cgbs0 * vgbs; -qgb_b = cgbb0 * vgbb; -*/ -qgb_d = 0; -qgb_s = 0; -qgb_b = 0; +qgbd = cgbd0 * vgbd; +qgbs = cgbs0 * vgbs; +qgbb = cgbb0 * vgbb; -*qgatef = *qgatef + qgd + qgs + qgb; -*qbody = *qbody - qgb - qgb_b; -*qdrn = *qdrn - qgd - qgb_d; -*qgateb = *qgateb + qgb_d + qgb_s + qgb_b; +*qgatef = *qgatef + qgfd + qgfs + qgfb; +*qbody = *qbody - qgfb - qgbb; +*qdrn = *qdrn - qgfd - qgbd; +*qgateb = *qgateb + qgbd + qgbs + qgbb; *qsrc = -(*qgatef + *qbody + *qdrn + *qgateb); } diff --git a/src/spicelib/devices/soi3/soi3conv.c b/src/spicelib/devices/soi3/soi3conv.c index 156db8af8..ea4d2d646 100644 --- a/src/spicelib/devices/soi3/soi3conv.c +++ b/src/spicelib/devices/soi3/soi3conv.c @@ -1,12 +1,12 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,10 +15,12 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "soi3defs.h" #include "sperror.h" @@ -26,9 +28,7 @@ Acknowledgements : Rupert Howes and Pete Mole. int -SOI3convTest(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +SOI3convTest(GENmodel *inModel, CKTcircuit *ckt) { SOI3model *model = (SOI3model*)inModel; SOI3instance *here; @@ -60,6 +60,9 @@ SOI3convTest(inModel,ckt) for(here = model->SOI3instances; here!= NULL; here = here->SOI3nextInstance) { + if (here->SOI3owner != ARCHme) + continue; + vbs = model->SOI3type * ( *(ckt->CKTrhs+here->SOI3bNode) - *(ckt->CKTrhs+here->SOI3sNodePrime)); @@ -174,9 +177,11 @@ SOI3convTest(inModel,ckt) ckt->CKTabstol; if (fabs(idhat-here->SOI3id) >= tol) { ckt->CKTnoncon++; - /* JimB - Remove line containing ckt->CKTtroubleElt for the */ + + /* JimB - Remove line containing ckt->CKTtroubleElt for the */ /* Simetrix DLL version - element removed from ckt structure */ ckt->CKTtroubleElt = (GENinstance *) here; + return(OK); /* no reason to continue, we haven't converged */ } else { tol=ckt->CKTreltol* @@ -188,8 +193,9 @@ SOI3convTest(inModel,ckt) - here->SOI3iMdb - here->SOI3iMsb - here->SOI3iBJTdb - here->SOI3iBJTsb)) > tol) { ckt->CKTnoncon++; - /* JimB - Remove line containing ckt->CKTtroubleElt for the */ - /* Simetrix DLL version - element removed from ckt structure */ + + /* JimB - Remove line containing ckt->CKTtroubleElt for the */ + /* Simetrix DLL version - element removed from ckt structure */ ckt->CKTtroubleElt = (GENinstance *) here; return(OK); /* no reason to continue,we haven't converged*/ } else { @@ -197,7 +203,8 @@ SOI3convTest(inModel,ckt) fabs(here->SOI3iPt))+ckt->CKTabstol; if (fabs(iPthat-here->SOI3iPt) >= tol) { ckt->CKTnoncon++; - /* JimB - Remove line containing ckt->CKTtroubleElt for the */ + + /* JimB - Remove line containing ckt->CKTtroubleElt for the */ /* Simetrix DLL version - element removed from ckt structure */ ckt->CKTtroubleElt = (GENinstance *) here; return(OK); /* no reason to continue,we haven't converged*/ diff --git a/src/spicelib/devices/soi3/soi3defs.h b/src/spicelib/devices/soi3/soi3defs.h index ef349d2d1..81cf7e26a 100644 --- a/src/spicelib/devices/soi3/soi3defs.h +++ b/src/spicelib/devices/soi3/soi3defs.h @@ -1,12 +1,13 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, + and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,6 +16,11 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ + #ifndef SOI3 #define SOI3 @@ -31,12 +37,11 @@ Acknowledgements : Rupert Howes and Pete Mole. typedef struct sSOI3instance { - struct sSOI3model *sSOI3modPtr; /* backpointer to model */ struct sSOI3instance *SOI3nextInstance; /* pointer to next instance of *current model*/ - IFuid SOI3name; /* pointer to character string naming this instance */ - int SOI3owner; /* number of owner process */ + IFuid SOI3name; /* pointer to character string naming this instance */ + int SOI3owner; /* number of owner process */ int SOI3states; /* index into state table for this device */ @@ -53,7 +58,6 @@ typedef struct sSOI3instance { int SOI3sNodePrime; /* number of the internal source node of the mosfet */ - int SOI3tout1Node; /* first internal thermal node */ int SOI3tout2Node; /* second internal thermal node */ int SOI3tout3Node; /* third internal thermal node */ @@ -61,6 +65,11 @@ typedef struct sSOI3instance { double SOI3l; /* the length of the channel region */ double SOI3w; /* the width of the channel region */ + double SOI3m; /* the parallel multiplier parameter */ + + double SOI3as; /* Area of source region */ + double SOI3ad; /* Area of drain region */ + double SOI3ab; /* Area of body region */ double SOI3drainSquares; /* the length of the drain in squares */ double SOI3sourceSquares; /* the length of the source in squares */ @@ -79,7 +88,6 @@ typedef struct sSOI3instance { double SOI3rt4; /* 4th internal Thermal resistance */ double SOI3ct4; /* 4th internal Thermal capacitance */ - double SOI3tTransconductance; /* temperature corrected transconductance (KP param) */ double SOI3ueff; /* passed on to noise model */ double SOI3tSurfMob; /* temperature corrected surface mobility */ @@ -107,7 +115,7 @@ typedef struct sSOI3instance { double SOI3vdsat; double SOI3sourceVcrit; /* Vcrit for pos. vds */ double SOI3drainVcrit; /* Vcrit for pos. vds */ - double SOI3id; /* drain current */ + double SOI3id; /* DC drain current */ double SOI3ibs; /* bulk source current */ double SOI3ibd; /* bulk drain current */ double SOI3iMdb; /* drain bulk impact ionisation current */ @@ -175,6 +183,10 @@ typedef struct sSOI3instance { unsigned SOI3tempGiven :1; /* instance temperature specified */ unsigned SOI3lGiven :1; unsigned SOI3wGiven :1; + unsigned SOI3mGiven :1; + unsigned SOI3asGiven:1; + unsigned SOI3adGiven:1; + unsigned SOI3abGiven:1; unsigned SOI3drainSquaresGiven :1; unsigned SOI3sourceSquaresGiven :1; unsigned SOI3dNodePrimeSet :1; @@ -200,62 +212,66 @@ typedef struct sSOI3instance { double *SOI3D_dPtr; /* pointer to sparse matrix element at * (Drain node,drain node) */ - double *SOI3GF_gfPtr; /* pointer to sparse matrix element at - * (front gate node,front gate node) */ - double *SOI3S_sPtr; /* pointer to sparse matrix element at - * (source node,source node) */ - double *SOI3B_bPtr; /* pointer to sparse matrix element at - * (bulk node,bulk node) */ - double *SOI3GB_gbPtr; /* pointer to sparse matrix element at - * (back gate node,back gate node) */ - double *SOI3DP_dpPtr; /* pointer to sparse matrix element at - * (drain prime node,drain prime node) */ - double *SOI3SP_spPtr; /* pointer to sparse matrix element at - * (source prime node,source prime node) */ double *SOI3D_dpPtr; /* pointer to sparse matrix element at * (drain node,drain prime node) */ - double *SOI3GF_bPtr; /* pointer to sparse matrix element at - * (front gate node,bulk node) */ - double *SOI3GB_bPtr; /* pointer to sparse matrix element at - * (back gate node,bulk node) */ + double *SOI3DP_dPtr; /* pointer to sparse matrix element at + * (drain prime node,drain node) */ + double *SOI3S_sPtr; /* pointer to sparse matrix element at + * (source node,source node) */ + double *SOI3S_spPtr; /* pointer to sparse matrix element at + * (source node,source prime node) */ + double *SOI3SP_sPtr; /* pointer to sparse matrix element at + * (source prime node,source node) */ + double *SOI3GF_gfPtr; /* pointer to sparse matrix element at + * (front gate node,front gate node) */ + double *SOI3GF_gbPtr; /* pointer to sparse matrix element at + * (front gate node,back gate node) */ double *SOI3GF_dpPtr; /* pointer to sparse matrix element at * (front gate node,drain prime node) */ - double *SOI3GB_dpPtr; /* pointer to sparse matrix element at - * (back gate node,drain prime node) */ double *SOI3GF_spPtr; /* pointer to sparse matrix element at * (front gate node,source prime node) */ + double *SOI3GF_bPtr; /* pointer to sparse matrix element at + * (front gate node,bulk node) */ + double *SOI3GB_gfPtr; /* pointer to sparse matrix element at + * (back gate node,front gate node) */ + double *SOI3GB_gbPtr; /* pointer to sparse matrix element at + * (back gate node,back gate node) */ + double *SOI3GB_dpPtr; /* pointer to sparse matrix element at + * (back gate node,drain prime node) */ double *SOI3GB_spPtr; /* pointer to sparse matrix element at * (back gate node,source prime node) */ - double *SOI3S_spPtr; /* pointer to sparse matrix element at - * (source node,source prime node) */ - double *SOI3B_dpPtr; /* pointer to sparse matrix element at - * (bulk node,drain prime node) */ - double *SOI3B_spPtr; /* pointer to sparse matrix element at - * (bulk node,source prime node) */ - double *SOI3DP_spPtr; /* pointer to sparse matrix element at - * (drain prime node,source prime node) */ - double *SOI3DP_dPtr; /* pointer to sparse matrix element at - * (drain prime node,drain node) */ - double *SOI3B_gfPtr; /* pointer to sparse matrix element at - * (bulk node,front gate node) */ - double *SOI3B_gbPtr; /* pointer to sparse matrix element at - * (bulk node,back gate node) */ + double *SOI3GB_bPtr; /* pointer to sparse matrix element at + * (back gate node,bulk node) */ double *SOI3DP_gfPtr; /* pointer to sparse matrix element at * (drain prime node,front gate node) */ double *SOI3DP_gbPtr; /* pointer to sparse matrix element at * (drain prime node,back gate node) */ + double *SOI3DP_dpPtr; /* pointer to sparse matrix element at + * (drain prime node,drain prime node) */ + double *SOI3DP_spPtr; /* pointer to sparse matrix element at + * (drain prime node,source prime node) */ + double *SOI3DP_bPtr; /* pointer to sparse matrix element at + * (drain prime node,bulk node) */ double *SOI3SP_gfPtr; /* pointer to sparse matrix element at * (source prime node,front gate node) */ double *SOI3SP_gbPtr; /* pointer to sparse matrix element at * (source prime node,back gate node) */ - double *SOI3SP_sPtr; /* pointer to sparse matrix element at - * (source prime node,source node) */ - double *SOI3DP_bPtr; /* pointer to sparse matrix element at - * (drain prime node,bulk node) */ - double *SOI3SP_bPtr; /* pointer to sparse matrix element at - * (source prime node,bulk node) */ double *SOI3SP_dpPtr; /* pointer to sparse matrix element at * (source prime node,drain prime node) */ + double *SOI3SP_spPtr; /* pointer to sparse matrix element at + * (source prime node,source prime node) */ + double *SOI3SP_bPtr; /* pointer to sparse matrix element at + * (source prime node,bulk node) */ + double *SOI3B_gfPtr; /* pointer to sparse matrix element at + * (bulk node,front gate node) */ + double *SOI3B_gbPtr; /* pointer to sparse matrix element at + * (bulk node,back gate node) */ + double *SOI3B_dpPtr; /* pointer to sparse matrix element at + * (bulk node,drain prime node) */ + double *SOI3B_spPtr; /* pointer to sparse matrix element at + * (bulk node,source prime node) */ + double *SOI3B_bPtr; /* pointer to sparse matrix element at + * (bulk node,bulk node) */ /** Now for Thermal Node **/ @@ -267,6 +283,7 @@ typedef struct sSOI3instance { double *SOI3TOUT_spPtr; double *SOI3GF_toutPtr; + double *SOI3GB_toutPtr; double *SOI3DP_toutPtr; double *SOI3SP_toutPtr; @@ -329,60 +346,65 @@ typedef struct sSOI3instance { #define SOI3cgfgf SOI3states+ 16 #define SOI3cgfd SOI3states+ 17 #define SOI3cgfs SOI3states+ 18 -#define SOI3cgfdeltaT SOI3states+ 19 - -#define SOI3cdgf SOI3states+ 20 -#define SOI3cdd SOI3states+ 21 -#define SOI3cds SOI3states+ 22 -#define SOI3cddeltaT SOI3states+ 23 - -#define SOI3csgf SOI3states+ 24 -#define SOI3csd SOI3states+ 25 -#define SOI3css SOI3states+ 26 -#define SOI3csdeltaT SOI3states+ 27 - -#define SOI3cgbgb SOI3states + 28 -#define SOI3cgbsb SOI3states + 29 -#define SOI3cgbdb SOI3states + 30 - -#define SOI3qbd SOI3states+ 31 /* body-drain capacitor charge */ -#define SOI3iqbd SOI3states+ 32 /* body-drain capacitor current */ - -#define SOI3qbs SOI3states+ 33 /* body-source capacitor charge */ -#define SOI3iqbs SOI3states+ 34 /* body-source capacitor current */ - -#define SOI3qt SOI3states+ 35 /* Energy or 'charge' associated with ct */ -#define SOI3iqt SOI3states+ 36 /* equiv current source for ct */ -#define SOI3qt1 SOI3states+ 37 /* Energy or 'charge' associated with ct */ -#define SOI3iqt1 SOI3states+ 38 /* equiv current source for ct */ -#define SOI3qt2 SOI3states+ 39 /* Energy or 'charge' associated with ct */ -#define SOI3iqt2 SOI3states+ 40 /* equiv current source for ct */ -#define SOI3qt3 SOI3states+ 41 /* Energy or 'charge' associated with ct */ -#define SOI3iqt3 SOI3states+ 42 /* equiv current source for ct */ -#define SOI3qt4 SOI3states+ 43 /* Energy or 'charge' associated with ct */ -#define SOI3iqt4 SOI3states+ 44 /* equiv current source for ct */ - -#define SOI3qBJTbs SOI3states+ 45 -#define SOI3iqBJTbs SOI3states+ 46 - -#define SOI3qBJTbd SOI3states+ 47 -#define SOI3iqBJTbd SOI3states+ 48 - -#define SOI3cBJTbsbs SOI3states+ 49 -#define SOI3cBJTbsdeltaT SOI3states+ 50 - -#define SOI3cBJTbdbd SOI3states+ 51 -#define SOI3cBJTbddeltaT SOI3states+ 52 - -#define SOI3idrain SOI3states+ 53 /* final drain current at timepoint (no define) */ - -#define SOI3deltaT1 SOI3states+ 54 /* final temperature difference */ -#define SOI3deltaT2 SOI3states+ 55 /* final temperature difference */ -#define SOI3deltaT3 SOI3states+ 56 /* final temperature difference */ -#define SOI3deltaT4 SOI3states+ 57 /* final temperature difference */ -#define SOI3deltaT5 SOI3states+ 58 /* final temperature difference */ - -#define SOI3numStates 59 +#define SOI3cgfdeltaT SOI3states+ 19 +#define SOI3cgfgb SOI3states+ 20 + +#define SOI3cdgf SOI3states+ 21 +#define SOI3cdd SOI3states+ 22 +#define SOI3cds SOI3states+ 23 +#define SOI3cddeltaT SOI3states+ 24 +#define SOI3cdgb SOI3states+ 25 + +#define SOI3csgf SOI3states+ 26 +#define SOI3csd SOI3states+ 27 +#define SOI3css SOI3states+ 28 +#define SOI3csdeltaT SOI3states+ 29 +#define SOI3csgb SOI3states+ 30 + +#define SOI3cgbgf SOI3states + 31 +#define SOI3cgbd SOI3states + 32 +#define SOI3cgbs SOI3states + 33 +#define SOI3cgbdeltaT SOI3states+ 34 +#define SOI3cgbgb SOI3states + 35 + +#define SOI3qbd SOI3states+ 36 /* body-drain capacitor charge */ +#define SOI3iqbd SOI3states+ 37 /* body-drain capacitor current */ + +#define SOI3qbs SOI3states+ 38 /* body-source capacitor charge */ +#define SOI3iqbs SOI3states+ 39 /* body-source capacitor current */ + +#define SOI3qt SOI3states+ 40 /* Energy or 'charge' associated with ct */ +#define SOI3iqt SOI3states+ 41 /* equiv current source for ct */ +#define SOI3qt1 SOI3states+ 42 /* Energy or 'charge' associated with ct */ +#define SOI3iqt1 SOI3states+ 43 /* equiv current source for ct */ +#define SOI3qt2 SOI3states+ 44 /* Energy or 'charge' associated with ct */ +#define SOI3iqt2 SOI3states+ 45 /* equiv current source for ct */ +#define SOI3qt3 SOI3states+ 46 /* Energy or 'charge' associated with ct */ +#define SOI3iqt3 SOI3states+ 47 /* equiv current source for ct */ +#define SOI3qt4 SOI3states+ 48 /* Energy or 'charge' associated with ct */ +#define SOI3iqt4 SOI3states+ 49 /* equiv current source for ct */ + +#define SOI3qBJTbs SOI3states+ 50 +#define SOI3iqBJTbs SOI3states+ 51 + +#define SOI3qBJTbd SOI3states+ 52 +#define SOI3iqBJTbd SOI3states+ 53 + +#define SOI3cBJTbsbs SOI3states+ 54 +#define SOI3cBJTbsdeltaT SOI3states+ 55 + +#define SOI3cBJTbdbd SOI3states+ 56 +#define SOI3cBJTbddeltaT SOI3states+ 57 + +#define SOI3idrain SOI3states+ 58 /* final drain current at timepoint (no define) */ + +#define SOI3deltaT1 SOI3states+ 59 /* final temperature difference */ +#define SOI3deltaT2 SOI3states+ 60 /* final temperature difference */ +#define SOI3deltaT3 SOI3states+ 61 /* final temperature difference */ +#define SOI3deltaT4 SOI3states+ 62 /* final temperature difference */ +#define SOI3deltaT5 SOI3states+ 63 /* final temperature difference */ + +#define SOI3numStates 64 /* per model data */ @@ -395,7 +417,6 @@ typedef struct sSOI3instance { typedef struct sSOI3model { /* model structure for an SOI3 MOSFET */ - int SOI3modType; /* type index to this device type */ struct sSOI3model *SOI3nextModel; /* pointer to next possible model *in linked list */ @@ -416,9 +437,9 @@ typedef struct sSOI3model { /* model structure for an SOI3 MOSFET */ double SOI3frontGateSourceOverlapCapFactor; double SOI3frontGateDrainOverlapCapFactor; double SOI3frontGateBulkOverlapCapFactor; - double SOI3backGateSourceOverlapCapFactor; - double SOI3backGateDrainOverlapCapFactor; - double SOI3backGateBulkOverlapCapFactor; + double SOI3backGateSourceOverlapCapAreaFactor; + double SOI3backGateDrainOverlapCapAreaFactor; + double SOI3backGateBulkOverlapCapAreaFactor; double SOI3frontOxideCapFactor; /* Cof NO DEFINES */ double SOI3backOxideCapFactor; /* Cob OR */ double SOI3bodyCapFactor; /* Cb FLAGS */ @@ -497,6 +518,7 @@ typedef struct sSOI3model { /* model structure for an SOI3 MOSFET */ double SOI3nplusDoping; /* Doping concentration of N+ or P+ regions */ double SOI3rta; /* thermal resistance area scaling factor */ double SOI3cta; /* thermal capacitance area scaling factor */ + double SOI3mexp; /* exponent for CLM smoothing */ unsigned SOI3typeGiven :1; unsigned SOI3latDiffGiven :1; @@ -511,9 +533,9 @@ typedef struct sSOI3model { /* model structure for an SOI3 MOSFET */ unsigned SOI3frontGateSourceOverlapCapFactorGiven :1; unsigned SOI3frontGateDrainOverlapCapFactorGiven :1; unsigned SOI3frontGateBulkOverlapCapFactorGiven :1; - unsigned SOI3backGateSourceOverlapCapFactorGiven :1; - unsigned SOI3backGateDrainOverlapCapFactorGiven :1; - unsigned SOI3backGateBulkOverlapCapFactorGiven :1; + unsigned SOI3backGateSourceOverlapCapAreaFactorGiven :1; + unsigned SOI3backGateDrainOverlapCapAreaFactorGiven :1; + unsigned SOI3backGateBulkOverlapCapAreaFactorGiven :1; unsigned SOI3subsBiasFactorGiven :1; unsigned SOI3bodyFactorGiven :1; unsigned SOI3vt0Given :1; @@ -585,6 +607,7 @@ typedef struct sSOI3model { /* model structure for an SOI3 MOSFET */ unsigned SOI3nplusDopingGiven :1; unsigned SOI3rtaGiven :1; unsigned SOI3ctaGiven :1; + unsigned SOI3mexpGiven :1; } SOI3model; @@ -594,74 +617,77 @@ typedef struct sSOI3model { /* model structure for an SOI3 MOSFET */ #endif /*NSOI3*/ /* device parameters */ -#define SOI3_W 1 -#define SOI3_L 2 -#define SOI3_AS 3 -#define SOI3_AD 4 -#define SOI3_PS 5 -#define SOI3_PD 6 -#define SOI3_NRS 7 -#define SOI3_NRD 8 -#define SOI3_OFF 9 -#define SOI3_IC 10 -#define SOI3_IC_VBS 11 -#define SOI3_IC_VDS 12 -#define SOI3_IC_VGFS 13 -#define SOI3_IC_VGBS 21 -#define SOI3_W_SENS 14 -#define SOI3_L_SENS 15 -#define SOI3_IB 16 -#define SOI3_IGF 17 -#define SOI3_IGB 22 -#define SOI3_IS 18 -#define SOI3_POWER 19 -#define SOI3_TEMP 20 +#define SOI3_W 1 +#define SOI3_L 2 +#define SOI3_M 25 +#define SOI3_AS 3 +#define SOI3_AD 4 +#define SOI3_AB 5 +#define SOI3_PS 6 +#define SOI3_PD 7 +#define SOI3_PB 8 +#define SOI3_NRS 9 +#define SOI3_NRD 10 +#define SOI3_OFF 11 +#define SOI3_IC 12 +#define SOI3_IC_VBS 13 +#define SOI3_IC_VDS 14 +#define SOI3_IC_VGFS 15 +#define SOI3_IC_VGBS 16 +#define SOI3_W_SENS 17 +#define SOI3_L_SENS 18 +#define SOI3_IB 19 +#define SOI3_IGF 20 +#define SOI3_IGB 21 +#define SOI3_IS 22 +#define SOI3_POWER 23 +#define SOI3_TEMP 24 /* model parameters */ -#define SOI3_MOD_VTO 101 +#define SOI3_MOD_VTO 101 #define SOI3_MOD_VFBF 149 -#define SOI3_MOD_KP 102 -#define SOI3_MOD_GAMMA 103 -#define SOI3_MOD_PHI 104 -#define SOI3_MOD_LAMBDA 105 +#define SOI3_MOD_KP 102 +#define SOI3_MOD_GAMMA 103 +#define SOI3_MOD_PHI 104 +#define SOI3_MOD_LAMBDA 105 #define SOI3_MOD_THETA 139 -#define SOI3_MOD_RD 106 -#define SOI3_MOD_RS 107 -#define SOI3_MOD_CBD 108 -#define SOI3_MOD_CBS 109 -#define SOI3_MOD_IS 110 -#define SOI3_MOD_PB 111 -#define SOI3_MOD_CGFSO 112 -#define SOI3_MOD_CGFDO 113 -#define SOI3_MOD_CGFBO 114 +#define SOI3_MOD_RD 106 +#define SOI3_MOD_RS 107 +#define SOI3_MOD_CBD 108 +#define SOI3_MOD_CBS 109 +#define SOI3_MOD_IS 110 +#define SOI3_MOD_PB 111 +#define SOI3_MOD_CGFSO 112 +#define SOI3_MOD_CGFDO 113 +#define SOI3_MOD_CGFBO 114 #define SOI3_MOD_CGBSO 144 #define SOI3_MOD_CGBDO 145 -#define SOI3_MOD_CGB_BO 146 -#define SOI3_MOD_CJ 115 -#define SOI3_MOD_MJ 116 -#define SOI3_MOD_CJSW 117 -#define SOI3_MOD_MJSW 118 -#define SOI3_MOD_JS 119 -#define SOI3_MOD_TOF 120 -#define SOI3_MOD_TOB 133 -#define SOI3_MOD_TB 134 -#define SOI3_MOD_LD 121 -#define SOI3_MOD_RSH 122 -#define SOI3_MOD_U0 123 -#define SOI3_MOD_FC 124 -#define SOI3_MOD_NSUB 125 -#define SOI3_MOD_TPG 126 +#define SOI3_MOD_CGBBO 146 +#define SOI3_MOD_CJ 115 +#define SOI3_MOD_MJ 116 +#define SOI3_MOD_CJSW 117 +#define SOI3_MOD_MJSW 118 +#define SOI3_MOD_JS 119 +#define SOI3_MOD_TOF 120 +#define SOI3_MOD_TOB 133 +#define SOI3_MOD_TB 134 +#define SOI3_MOD_LD 121 +#define SOI3_MOD_RSH 122 +#define SOI3_MOD_U0 123 +#define SOI3_MOD_FC 124 +#define SOI3_MOD_NSUB 125 +#define SOI3_MOD_TPG 126 #define SOI3_MOD_NQFF 147 #define SOI3_MOD_NQFB 148 -#define SOI3_MOD_NSSF 127 -#define SOI3_MOD_NSSB 135 -#define SOI3_MOD_NSOI3 128 -#define SOI3_MOD_PSOI3 129 -#define SOI3_MOD_TNOM 130 -#define SOI3_MOD_KF 131 -#define SOI3_MOD_AF 132 -#define SOI3_MOD_KOX 142 -#define SOI3_MOD_SHSI 143 +#define SOI3_MOD_NSSF 127 +#define SOI3_MOD_NSSB 135 +#define SOI3_MOD_NSOI3 128 +#define SOI3_MOD_PSOI3 129 +#define SOI3_MOD_TNOM 130 +#define SOI3_MOD_KF 131 +#define SOI3_MOD_AF 132 +#define SOI3_MOD_KOX 142 +#define SOI3_MOD_SHSI 143 /* extra stuff for newer model - msll Jan96 */ #define SOI3_MOD_SIGMA 150 #define SOI3_MOD_CHIFB 151 @@ -705,6 +731,7 @@ typedef struct sSOI3model { /* model structure for an SOI3 MOSFET */ #define SOI3_MOD_NPLUS 388 #define SOI3_MOD_RTA 389 #define SOI3_MOD_CTA 390 +#define SOI3_MOD_MEXP 391 /* device questions */ #define SOI3_DNODE 201 @@ -759,38 +786,46 @@ typedef struct sSOI3model { /* model structure for an SOI3 MOSFET */ #define SOI3_CGFD 250 #define SOI3_CGFS 251 #define SOI3_CGFDELTAT 252 -#define SOI3_CDGF 253 -#define SOI3_CDD 254 -#define SOI3_CDS 255 -#define SOI3_CDDELTAT 256 -#define SOI3_CSGF 257 -#define SOI3_CSD 258 -#define SOI3_CSS 259 -#define SOI3_CSDELTAT 260 -#define SOI3_L_SENS_REAL 261 -#define SOI3_L_SENS_IMAG 262 -#define SOI3_L_SENS_MAG 263 -#define SOI3_L_SENS_PH 264 -#define SOI3_L_SENS_CPLX 265 -#define SOI3_W_SENS_REAL 266 -#define SOI3_W_SENS_IMAG 267 -#define SOI3_W_SENS_MAG 268 -#define SOI3_W_SENS_PH 269 -#define SOI3_W_SENS_CPLX 270 -#define SOI3_L_SENS_DC 271 -#define SOI3_W_SENS_DC 272 -#define SOI3_RT 273 -#define SOI3_CT 274 -/* extra stuff for newer model - msll Jan96 */ -#define SOI3_VFBB 275 -#define SOI3_RT1 276 -#define SOI3_CT1 277 -#define SOI3_RT2 278 -#define SOI3_CT2 279 -#define SOI3_RT3 280 -#define SOI3_CT3 281 -#define SOI3_RT4 282 -#define SOI3_CT4 283 +#define SOI3_CGFGB 253 +#define SOI3_CDGF 254 +#define SOI3_CDD 255 +#define SOI3_CDS 256 +#define SOI3_CDDELTAT 257 +#define SOI3_CDGB 258 +#define SOI3_CSGF 259 +#define SOI3_CSD 260 +#define SOI3_CSS 261 +#define SOI3_CSDELTAT 262 +#define SOI3_CSGB 263 +#define SOI3_CGBGF 264 +#define SOI3_CGBD 265 +#define SOI3_CGBS 266 +#define SOI3_CGBDELTAT 267 +#define SOI3_CGBGB 268 +#define SOI3_L_SENS_REAL 269 +#define SOI3_L_SENS_IMAG 270 +#define SOI3_L_SENS_MAG 271 +#define SOI3_L_SENS_PH 272 +#define SOI3_L_SENS_CPLX 273 +#define SOI3_W_SENS_REAL 274 +#define SOI3_W_SENS_IMAG 275 +#define SOI3_W_SENS_MAG 276 +#define SOI3_W_SENS_PH 277 +#define SOI3_W_SENS_CPLX 278 +#define SOI3_L_SENS_DC 279 +#define SOI3_W_SENS_DC 280 +#define SOI3_RT 281 +#define SOI3_CT 282 +#define SOI3_VFBB 283 +#define SOI3_RT1 284 +#define SOI3_CT1 285 +#define SOI3_RT2 286 +#define SOI3_CT2 287 +#define SOI3_RT3 288 +#define SOI3_CT3 289 +#define SOI3_RT4 290 +#define SOI3_CT4 291 +#define SOI3_ITOT 292 /* model questions */ diff --git a/src/spicelib/devices/soi3/soi3del.c b/src/spicelib/devices/soi3/soi3del.c index 58a4793b9..c1ea0f514 100644 --- a/src/spicelib/devices/soi3/soi3del.c +++ b/src/spicelib/devices/soi3/soi3del.c @@ -1,12 +1,12 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,20 +15,19 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" -#include #include "soi3defs.h" #include "sperror.h" #include "suffix.h" int -SOI3delete(inModel,name,inst) - GENmodel *inModel; - IFuid name; - GENinstance **inst; +SOI3delete(GENmodel *inModel, IFuid name, GENinstance **inst) { SOI3model *model = (SOI3model *)inModel; SOI3instance **fast = (SOI3instance **)inst; diff --git a/src/spicelib/devices/soi3/soi3dest.c b/src/spicelib/devices/soi3/soi3dest.c index e5ae5926d..62eeb8228 100644 --- a/src/spicelib/devices/soi3/soi3dest.c +++ b/src/spicelib/devices/soi3/soi3dest.c @@ -1,12 +1,12 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,17 +15,18 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" -#include #include "soi3defs.h" #include "suffix.h" void -SOI3destroy(inModel) - GENmodel **inModel; +SOI3destroy(GENmodel **inModel) { SOI3model **model = (SOI3model**)inModel; SOI3instance *here; diff --git a/src/spicelib/devices/soi3/soi3ext.h b/src/spicelib/devices/soi3/soi3ext.h index e3d518d81..c7e194acd 100644 --- a/src/spicelib/devices/soi3/soi3ext.h +++ b/src/spicelib/devices/soi3/soi3ext.h @@ -1,12 +1,13 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, + and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,7 +16,11 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -#ifdef __STDC__ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ + extern int SOI3acLoad(GENmodel *,CKTcircuit*); extern int SOI3ask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); extern int SOI3delete(GENmodel*,IFuid,GENinstance**); @@ -26,23 +31,25 @@ extern int SOI3mAsk(CKTcircuit *,GENmodel *,int,IFvalue*); extern int SOI3mDelete(GENmodel**,IFuid,GENmodel*); extern int SOI3mParam(int,IFvalue*,GENmodel*); extern void SOI3cap(double,double,double, - double*,double*,double*,double*,double*,double*, - double*,double*,double*,double*, - double*,double*,double*,double*,double*,double*,double*,double*, - double*,double*,double*,double*,double*,double*,double*,double*,double*); + double*,double*,double*,double*, + double*,double*,double*,double*, + double*,double*,double*,double*, + double*,double*,double*,double*,double*, + double*,double*,double*,double*,double*, + double*,double*,double*,double*,double*, + double*,double*,double*,double*,double*); extern void SOI3capEval(CKTcircuit*,double*,double*, - double,double,double,double, - double,double,double,double, - double,double,double,double, - double,double,double,double,double, - double,double, - double*,double*,double*,double*, - double*,double*,double*,double*, - double*,double*,double*,double*, - double*,double*,double*,double*,double*, - double*,double*,double*, - double*,double*, - double*,double*,double*,double*,double*); + double,double,double,double,double, + double,double,double,double,double, + double,double,double,double,double, + double,double,double,double,double, + double,double,double,double,double, + double*,double*,double*,double*,double*, + double*,double*,double*,double*,double*, + double*,double*,double*,double*,double*, + double*,double*,double*,double*,double*, + double*,double*,double*,double*,double*, + double*,double*,double*,double*,double*); extern int SOI3param(int,IFvalue*,GENinstance*,IFvalue*); /* extern int SOI3pzLoad(GENmodel*,CKTcircuit*,SPcomplex*); | extern int SOI3sAcLoad(GENmodel*,CKTcircuit*); | @@ -54,42 +61,7 @@ extern int SOI3setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int SOI3unsetup(GENmodel*,CKTcircuit*); extern int SOI3temp(GENmodel*,CKTcircuit*); extern int SOI3trunc(GENmodel*,CKTcircuit*,double*); - -#ifdef SIMETRIX_VERSION -/* NTL modification 27.4.98 - add lastAttempt */ -extern int SOI3convTest(GENmodel*,CKTcircuit*,int lastAttempt); -/* end NTL modification */ -#else /* SIMETRIX_VERSION */ extern int SOI3convTest(GENmodel*,CKTcircuit*); -#endif /* SIMETRIX_VERSION */ /* extern int SOI3disto(int,GENmodel*,CKTcircuit*); */ extern int SOI3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); - -#else /* stdc */ -extern int SOI3acLoad(); -extern int SOI3ask(); -extern int SOI3delete(); -extern void SOI3destroy(); -extern int SOI3getic(); -extern int SOI3load(); -extern int SOI3mAsk(); -extern int SOI3mDelete(); -extern int SOI3mParam(); -extern void SOI3cap(); -extern void SOI3capEval(); -extern int SOI3param(); -/* extern int SOI3pzLoad(); | -extern int SOI3sAcLoad(); | -extern int SOI3sLoad(); | ignored -extern void SOI3sPrint(); | -extern int SOI3sSetup(); | -extern int SOI3sUpdate(); */ -extern int SOI3setup(); -extern int SOI3unsetup(); -extern int SOI3temp(); -extern int SOI3trunc(); -extern int SOI3convTest(); -/* extern int SOI3disto(); */ -extern int SOI3noise(); -#endif /* stdc */ diff --git a/src/spicelib/devices/soi3/soi3ic.c b/src/spicelib/devices/soi3/soi3ic.c index c217a6fca..85cc167bf 100644 --- a/src/spicelib/devices/soi3/soi3ic.c +++ b/src/spicelib/devices/soi3/soi3ic.c @@ -1,12 +1,12 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,10 +15,12 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "soi3defs.h" #include "sperror.h" @@ -26,9 +28,7 @@ Acknowledgements : Rupert Howes and Pete Mole. int -SOI3getic(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +SOI3getic(GENmodel *inModel, CKTcircuit *ckt) { SOI3model *model = (SOI3model *)inModel; SOI3instance *here; @@ -39,7 +39,11 @@ SOI3getic(inModel,ckt) for( ; model ; model = model->SOI3nextModel) { for(here = model->SOI3instances; here ; here = here->SOI3nextInstance) { - if(!here->SOI3icVBSGiven) { + + if (here->SOI3owner != ARCHme) + continue; + + if(!here->SOI3icVBSGiven) { here->SOI3icVBS = *(ckt->CKTrhs + here->SOI3bNode) - *(ckt->CKTrhs + here->SOI3sNode); diff --git a/src/spicelib/devices/soi3/soi3init.c b/src/spicelib/devices/soi3/soi3init.c index 730055f6b..18b6dc5c4 100644 --- a/src/spicelib/devices/soi3/soi3init.c +++ b/src/spicelib/devices/soi3/soi3init.c @@ -10,7 +10,7 @@ SPICEdev SOI3info = { { "SOI3", - "Basic Thick Film SOI3 model", + "Basic Thick Film SOI3 model v2.7", &SOI3nSize, &SOI3nSize, @@ -67,7 +67,10 @@ SPICEdev SOI3info = { DEVsenTrunc : NULL, DEVdisto : NULL, DEVnoise : SOI3noise, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &SOI3iSize, DEVmodSize : &SOI3mSize diff --git a/src/spicelib/devices/soi3/soi3itf.h b/src/spicelib/devices/soi3/soi3itf.h index b91193d39..3ea642221 100644 --- a/src/spicelib/devices/soi3/soi3itf.h +++ b/src/spicelib/devices/soi3/soi3itf.h @@ -1,12 +1,12 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,7 +15,10 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #ifndef DEV_SOI3 #define DEV_SOI3 diff --git a/src/spicelib/devices/soi3/soi3load.c b/src/spicelib/devices/soi3/soi3load.c index 9317e078b..61d9788f4 100644 --- a/src/spicelib/devices/soi3/soi3load.c +++ b/src/spicelib/devices/soi3/soi3load.c @@ -1,12 +1,13 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, + and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,10 +16,12 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "devdefs.h" #include "soi3defs.h" @@ -27,19 +30,16 @@ Acknowledgements : Rupert Howes and Pete Mole. #include "sperror.h" #include "suffix.h" -extern double DEVsoipnjlim(double vnew, double vold,double vt,double vcrit,int *icheck); -/* extern double DEVsoipnjlim(); */ +extern double DEVsoipnjlim(double, double, double, double, int *); int -SOI3load(inModel,ckt) - GENmodel *inModel; - register CKTcircuit *ckt; +SOI3load(GENmodel *inModel, CKTcircuit *ckt) /* actually load the current value into the * sparse matrix previously provided */ { - register SOI3model *model = (SOI3model *) inModel; - register SOI3instance *here; + SOI3model *model = (SOI3model *) inModel; + SOI3instance *here; double Beta; double DrainSatCur; /* for drain pn junction */ double SourceSatCur; /* for source pn junction */ @@ -99,7 +99,7 @@ SOI3load(inModel,ckt) /* now back to our regular programming */ /* vgfb exists already for gate cap calc */ double deltaT,deltaT1,deltaT2,deltaT3,deltaT4,deltaT5; - double vdsat; + double vdsat_ext; double vgfb; double vgfd; double vgbd; @@ -122,17 +122,17 @@ SOI3load(inModel,ckt) double ldargs[5]; double qgatef,qdrn,qsrc,qbody,qgateb; double ieqqgf,ieqqd,ieqqs,ieqqgb; - double cgfgf,cgfd,cgfs,cgfdeltaT; - double cdgf,cdd,cds,cddeltaT; - double csgf,csd,css,csdeltaT; - double cbgf,cbd,cbs,cbdeltaT,cbgb; - double cgbgb,cgbsb,cgbdb; - double gcgfgf,gcgfd,gcgfs,gcgfdeltaT; - double gcdgf,gcdd,gcds,gcddeltaT; - double gcsgf,gcsd,gcss,gcsdeltaT; - double gcbgf,gcbd,gcbs,gcbdeltaT,gcbgb; - double gcgbgb,gcgbsb,gcgbdb; - double gcgbs0,gcgbd0; + + double cgfgf,cgfd,cgfs,cgfdeltaT,cgfgb; + double cdgf,cdd,cds,cddeltaT,cdgb; + double csgf,csd,css,csdeltaT,csgb; + double cbgf,cbd,cbs,cbdeltaT,cbgb; + double cgbgf,cgbd,cgbs,cgbdeltaT,cgbgb; + double gcgfgf,gcgfd,gcgfs,gcgfdeltaT,gcgfgb; + double gcdgf,gcdd,gcds,gcddeltaT,gcdgb; + double gcsgf,gcsd,gcss,gcsdeltaT,gcsgb; + double gcbgf,gcbd,gcbs,gcbdeltaT,gcbgb; + double gcgbgf,gcgbd,gcgbs,gcgbdeltaT,gcgbgb; double alphaBJT; double tauFBJTeff,tauRBJTeff; @@ -144,9 +144,10 @@ SOI3load(inModel,ckt) int Check; int ByPass; - + +#ifndef NOBYPASS double tempv; - +#endif /*NOBYPASS*/ int error; #ifdef CAPBYPASS int senflag; @@ -160,12 +161,16 @@ SOI3load(inModel,ckt) double DXs_Dvgfb, DXs_Dvdb, DXs_Dvsb, DXs_DdeltaT; double DXd_Dvgfb, DXd_Dvdb, DXd_Dvsb, DXd_DdeltaT; + double m; for( ; model != NULL; model = model->SOI3nextModel ) { /* loop through all the instances of the model */ for (here = model->SOI3instances; here != NULL ; here=here->SOI3nextInstance) { + + if (here->SOI3owner != ARCHme) + continue; vt = CONSTKoverQ * here->SOI3temp; Check=1; @@ -198,18 +203,70 @@ SOI3load(inModel,ckt) } /* NB Junction sat. cur. density is NOW PER UNIT WIDTH */ - FrontGateSourceOverlapCap = model->SOI3frontGateSourceOverlapCapFactor * - here->SOI3w; - FrontGateDrainOverlapCap = model->SOI3frontGateDrainOverlapCapFactor * - here->SOI3w; - FrontGateBulkOverlapCap = model->SOI3frontGateBulkOverlapCapFactor * - EffectiveLength; - BackGateSourceOverlapCap = model->SOI3backGateSourceOverlapCapFactor * - here->SOI3w; - BackGateDrainOverlapCap = model->SOI3backGateDrainOverlapCapFactor * - here->SOI3w; - BackGateBulkOverlapCap = model->SOI3backGateBulkOverlapCapFactor * - EffectiveLength; + /* JimB - can use basic device geometry to estimate front and back */ + /* overlap capacitances to a first approximation. Use this default */ + /* model if capacitance factors aren't given in model netlist. */ + + /* Calculate front gate overlap capacitances. */ + + if(model->SOI3frontGateSourceOverlapCapFactorGiven) + { + FrontGateSourceOverlapCap = model->SOI3frontGateSourceOverlapCapFactor * here->SOI3w; + } + else + { + FrontGateSourceOverlapCap = model->SOI3latDiff * here->SOI3w * model->SOI3frontOxideCapFactor; + } + if(model->SOI3frontGateDrainOverlapCapFactorGiven) + { + FrontGateDrainOverlapCap = model->SOI3frontGateDrainOverlapCapFactor * here->SOI3w; + } + else + { + FrontGateDrainOverlapCap = model->SOI3latDiff * here->SOI3w * model->SOI3frontOxideCapFactor; + } + if(model->SOI3frontGateBulkOverlapCapFactorGiven) + { + FrontGateBulkOverlapCap = model->SOI3frontGateBulkOverlapCapFactor * EffectiveLength; + } + else + { + FrontGateBulkOverlapCap = EffectiveLength * (0.1*1e-6*model->SOI3minimumFeatureSize) + * model->SOI3frontOxideCapFactor; + } + + /* Calculate back gate overlap capacitances. */ + + if( (model->SOI3backGateSourceOverlapCapAreaFactorGiven) && + (!model->SOI3backGateSourceOverlapCapAreaFactor || here->SOI3asGiven) ) + { + BackGateSourceOverlapCap = model->SOI3backGateSourceOverlapCapAreaFactor * here->SOI3as; + } + else + { + BackGateSourceOverlapCap = (2*1e-6*model->SOI3minimumFeatureSize + model->SOI3latDiff) * here->SOI3w + * model->SOI3backOxideCapFactor; + } + if( (model->SOI3backGateDrainOverlapCapAreaFactorGiven) && + (!model->SOI3backGateDrainOverlapCapAreaFactor || here->SOI3adGiven) ) + { + BackGateDrainOverlapCap = model->SOI3backGateDrainOverlapCapAreaFactor * here->SOI3ad; + } + else + { + BackGateDrainOverlapCap = (2*1e-6*model->SOI3minimumFeatureSize + model->SOI3latDiff) * here->SOI3w + * model->SOI3backOxideCapFactor; + } + if( (model->SOI3backGateBulkOverlapCapAreaFactorGiven) && + (!model->SOI3backGateBulkOverlapCapAreaFactor || here->SOI3abGiven) ) + { + BackGateBulkOverlapCap = model->SOI3backGateBulkOverlapCapAreaFactor * here->SOI3ab; + } + else + { + BackGateBulkOverlapCap = EffectiveLength * (0.1*1e-6*model->SOI3minimumFeatureSize + here->SOI3w) + * model->SOI3backOxideCapFactor; + } Beta = here->SOI3tTransconductance * here->SOI3w/EffectiveLength; /* reset mu_eff to ambient temp value in SI units */ @@ -333,6 +390,8 @@ SOI3load(inModel,ckt) *(ckt->CKTstate1 + here->SOI3cgfs); *(ckt->CKTstate0 + here->SOI3cgfdeltaT) = *(ckt->CKTstate1 + here->SOI3cgfdeltaT); + *(ckt->CKTstate0 + here->SOI3cgfgb) = + *(ckt->CKTstate1 + here->SOI3cgfgb); *(ckt->CKTstate0 + here->SOI3csgf) = *(ckt->CKTstate1 + here->SOI3csgf); *(ckt->CKTstate0 + here->SOI3csd) = @@ -341,6 +400,8 @@ SOI3load(inModel,ckt) *(ckt->CKTstate1 + here->SOI3css); *(ckt->CKTstate0 + here->SOI3csdeltaT) = *(ckt->CKTstate1 + here->SOI3csdeltaT); + *(ckt->CKTstate0 + here->SOI3csgb) = + *(ckt->CKTstate1 + here->SOI3csgb); *(ckt->CKTstate0 + here->SOI3cdgf) = *(ckt->CKTstate1 + here->SOI3cdgf); *(ckt->CKTstate0 + here->SOI3cdd) = @@ -349,12 +410,18 @@ SOI3load(inModel,ckt) *(ckt->CKTstate1 + here->SOI3cds); *(ckt->CKTstate0 + here->SOI3cddeltaT) = *(ckt->CKTstate1 + here->SOI3cddeltaT); + *(ckt->CKTstate0 + here->SOI3cdgb) = + *(ckt->CKTstate1 + here->SOI3cdgb); + *(ckt->CKTstate0 + here->SOI3cgbgf) = + *(ckt->CKTstate1 + here->SOI3cgbgf); + *(ckt->CKTstate0 + here->SOI3cgbd) = + *(ckt->CKTstate1 + here->SOI3cgbd); + *(ckt->CKTstate0 + here->SOI3cgbs) = + *(ckt->CKTstate1 + here->SOI3cgbs); + *(ckt->CKTstate0 + here->SOI3cgbdeltaT) = + *(ckt->CKTstate1 + here->SOI3cgbdeltaT); *(ckt->CKTstate0 + here->SOI3cgbgb) = *(ckt->CKTstate1 + here->SOI3cgbgb); - *(ckt->CKTstate0 + here->SOI3cgbsb) = - *(ckt->CKTstate1 + here->SOI3cgbsb); - *(ckt->CKTstate0 + here->SOI3cgbdb) = - *(ckt->CKTstate1 + here->SOI3cgbdb); *(ckt->CKTstate0 + here->SOI3cBJTbsbs) = *(ckt->CKTstate1 + here->SOI3cBJTbsbs); *(ckt->CKTstate0 + here->SOI3cBJTbsdeltaT) = @@ -413,7 +480,7 @@ SOI3load(inModel,ckt) { deltaT4 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout3Node)); deltaT3 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout2Node) - deltaT4); - deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3); + deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3 - deltaT4); deltaT1 = deltaT - deltaT2 - deltaT3 - deltaT4; deltaT5=0; } @@ -421,8 +488,8 @@ SOI3load(inModel,ckt) { deltaT5 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout4Node)); deltaT4 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout3Node) - deltaT5); - deltaT3 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout2Node) - deltaT4); - deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3); + deltaT3 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout2Node) - deltaT4 - deltaT5); + deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3 - deltaT4 - deltaT5); deltaT1 = deltaT - deltaT2 - deltaT3 - deltaT4 - deltaT5; } #ifndef PREDICTOR @@ -533,15 +600,8 @@ SOI3load(inModel,ckt) here->SOI3gPmb * delvgbs + here->SOI3gPds * delvds * here->SOI3mode + here->SOI3gPdT * deldeltaT; -/* - -*/ - -#ifdef DETAILPROF -asm(" .globl mosptb"); -asm("mosptb:"); -#endif /*DETAILPROF*/ +#ifndef NOBYPASS /* now lets see if we can bypass (ugh) */ /* the following mess should be one if statement, but * many compilers can't handle it all at once, so it @@ -650,22 +710,27 @@ asm("mosptb:"); cgfd = *(ckt->CKTstate0 + here->SOI3cgfd); cgfs = *(ckt->CKTstate0 + here->SOI3cgfs); cgfdeltaT = *(ckt->CKTstate0 + here->SOI3cgfdeltaT); + cgfgb = *(ckt->CKTstate0 + here->SOI3cgfgb); csgf = *(ckt->CKTstate0 + here->SOI3csgf); csd = *(ckt->CKTstate0 + here->SOI3csd); css = *(ckt->CKTstate0 + here->SOI3css); csdeltaT = *(ckt->CKTstate0 + here->SOI3csdeltaT); + csgb = *(ckt->CKTstate0 + here->SOI3csgb); cdgf = *(ckt->CKTstate0 + here->SOI3cdgf); cdd = *(ckt->CKTstate0 + here->SOI3cdd); cds = *(ckt->CKTstate0 + here->SOI3cds); cddeltaT = *(ckt->CKTstate0 + here->SOI3cddeltaT); + cdgb = *(ckt->CKTstate0 + here->SOI3cdgb); + cgbgf = *(ckt->CKTstate0 + here->SOI3cgbgf); + cgbd = *(ckt->CKTstate0 + here->SOI3cgbd); + cgbs = *(ckt->CKTstate0 + here->SOI3cgbs); + cgbdeltaT = *(ckt->CKTstate0 + here->SOI3cgbdeltaT); cgbgb = *(ckt->CKTstate0 + here->SOI3cgbgb); - cgbsb = *(ckt->CKTstate0 + here->SOI3cgbsb); - cgbdb = *(ckt->CKTstate0 + here->SOI3cgbdb); - cbgf = -(cgfgf + cdgf + csgf); - cbd = -(cgfd + cdd + csd + cgbdb); - cbs = -(cgfs + cds + css + cgbsb); - cbdeltaT = -(cgfdeltaT + cddeltaT + csdeltaT); - cbgb = -cgbgb; + cbgf = -(cgfgf + cdgf + csgf + cgbgf); + cbd = -(cgfd + cdd + csd + cgbd); + cbs = -(cgfs + cds + css + cgbs); + cbdeltaT = -(cgfdeltaT + cddeltaT + csdeltaT + cgbdeltaT); + cbgb = -(cgfgb + cdgb + csgb + cgbgb); qgatef = *(ckt->CKTstate0 + here->SOI3qgf); qdrn = *(ckt->CKTstate0 + here->SOI3qd); qsrc = *(ckt->CKTstate0 + here->SOI3qs); @@ -676,14 +741,8 @@ asm("mosptb:"); } goto bypass2; } -/* - -*/ +#endif /*NOBYPASS*/ -#ifdef DETAILPROF -asm(" .globl mosptc"); -asm("mosptc:"); -#endif /*DETAILPROF*/ /* ok - bypass is out, do it the hard way */ von = model->SOI3type * here->SOI3von; @@ -765,7 +824,7 @@ asm("mosptc:"); { deltaT4 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout3Node)); deltaT3 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout2Node) - deltaT4); - deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3); + deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3 - deltaT4); deltaT1 = deltaT - deltaT2 - deltaT3 - deltaT4; deltaT5=0; } @@ -773,22 +832,15 @@ asm("mosptc:"); { deltaT5 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout4Node)); deltaT4 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout3Node) - deltaT5); - deltaT3 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout2Node) - deltaT4); - deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3); + deltaT3 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout2Node) - deltaT4 - deltaT5); + deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3 - deltaT4 - deltaT5); deltaT1 = deltaT - deltaT2 - deltaT3 - deltaT4 - deltaT5; } Check = 1; } #endif /*NODELIMITING*/ -/* - -*/ -#ifdef DETAILPROF -asm(" .globl mosptd"); -asm("mosptd:"); -#endif /*DETAILPROF*/ } else { /* ok - not one of the simple cases, so we have to @@ -820,14 +872,7 @@ asm("mosptd:"); vbs=vgfs=vds=vgbs=deltaT=deltaT1=deltaT2=deltaT3=deltaT4=deltaT5=0.0; } } -/* - -*/ -#ifdef DETAILPROF -asm(" .globl mospte"); -asm("mospte:"); -#endif /*DETAILPROF*/ /* * now all the preliminaries are over - we can start doing the @@ -852,14 +897,7 @@ asm("mospte:"); /* inverse mode */ here->SOI3mode = -1; } -/* - -*/ -#ifdef DETAILPROF -asm(" .globl mosptf"); -asm("mosptf:"); -#endif /*DETAILPROF*/ { /* begin block */ /* @@ -925,7 +963,13 @@ asm("mosptf:"); double Dpsi_sLsat_DdeltaT; double Dpsi_sL_Dvgfb,Dpsi_s0_Dvgfb,Dpsi_sL_Dvdb,Dpsi_s0_Dvdb; double Dpsi_sL_Dvsb,Dpsi_s0_Dvsb,Dpsi_sL_DdeltaT,Dpsi_s0_DdeltaT; - double Vm,Em,Vmx; + + double vdsat; + double Dvdsat_Dvgfb,Dvdsat_Dvsb,Dvdsat_Dvdb,Dvdsat_DdeltaT; + int m,i; + double vds2m,vdsat2m,Em,vdslim; + double Dvdslim_Dvgfb,Dvdslim_Dvdb,Dvdslim_Dvsb,Dvdslim_DdeltaT; + double Vmx; double DVmx_Dvgfb,DVmx_Dvdb,DVmx_Dvsb,DVmx_DdeltaT; double Vm1,Em1,Vm1x; double DVm1x_Dvgfb,DVm1x_Dvdb,DVm1x_Dvsb,DVm1x_DdeltaT; @@ -1430,46 +1474,82 @@ asm("mosptf:"); * Channel Length Modulation */ - Vm = (here->SOI3mode*vds) + psi_s0 - psi_sLsat; - if (model->SOI3useLAMBDA) { - Vmx = Vm; - DVmx_Dvgfb = (Dpsi_s0_Dvgfb - Dpsi_sLsat_Dvgfb); - DVmx_Dvdb = (1 + Dpsi_s0_Dvdb - Dpsi_sLsat_Dvdb); - DVmx_Dvsb = (Dpsi_s0_Dvsb - Dpsi_sLsat_Dvsb - 1); - DVmx_DdeltaT = (Dpsi_s0_DdeltaT - Dpsi_sLsat_DdeltaT); - ld = model->SOI3lambda*Vmx; - tmp = model->SOI3lambda; - } else { - if (Vm > (vt*MAX_EXP_ARG)) { - Vmx = Vm; - tmp = 1; - } else { - Em = exp(Vm/vt); - Vmx = vt * log(1 + Em) + 1e-25; - tmp = (Em/(1+Em)); + /* JimB - add thermal voltage to vdsat to ensure it remains above zero in subthreshold */ + vdsat = psi_sLsat - psi_st0 + vt; + Dvdsat_Dvgfb = Dpsi_sLsat_Dvgfb - Dpsi_st0_Dvgfb; + Dvdsat_Dvsb = Dpsi_sLsat_Dvsb - Dpsi_st0_Dvsb; + Dvdsat_Dvdb = Dpsi_sLsat_Dvdb - Dpsi_st0_Dvdb; + Dvdsat_DdeltaT = Dpsi_sLsat_DdeltaT - Dpsi_st0_DdeltaT; + + m = model->SOI3mexp; + + if (m>0) + { + if (vdsat>0) + { + vds2m = 1; + vdsat2m = 1; + for (i=0; i<2*m; i=i+1) + { + vds2m = vds2m*(vds*here->SOI3mode); + vdsat2m = vdsat2m*vdsat; + } + Em = exp(-log(vds2m+vdsat2m)/(2*m)); + vdslim = (here->SOI3mode*vds)*vdsat*Em; + Dvdslim_Dvgfb = (here->SOI3mode*vds*Em*Dvdsat_Dvgfb*vds2m)/(vds2m+vdsat2m); + Dvdslim_Dvdb = (here->SOI3mode*vds*Em*Dvdsat_Dvdb*vds2m + vdsat*Em*vdsat2m)/(vds2m+vdsat2m); + Dvdslim_Dvsb = (here->SOI3mode*vds*Em*Dvdsat_Dvsb*vds2m - vdsat*Em*vdsat2m)/(vds2m+vdsat2m); + Dvdslim_DdeltaT = (here->SOI3mode*vds*Em*Dvdsat_DdeltaT*vds2m)/(vds2m+vdsat2m); + + Vmx = (here->SOI3mode*vds) - vdslim; + DVmx_Dvgfb = -Dvdslim_Dvgfb; + DVmx_Dvdb = 1 - Dvdslim_Dvdb; + DVmx_Dvsb = -1 - Dvdslim_Dvsb; + DVmx_DdeltaT = -Dvdslim_DdeltaT; + } + else + { + Vmx = 0; + DVmx_Dvgfb = 0; + DVmx_Dvdb = 0; + DVmx_Dvsb = 0; + DVmx_DdeltaT = 0; + } + } + else + { + Vmx = (here->SOI3mode*vds) - vdsat; + DVmx_Dvgfb = -Dvdsat_Dvgfb; + DVmx_Dvdb = 1 - Dvdsat_Dvdb; + DVmx_Dvsb = -1 - Dvdsat_Dvsb; + DVmx_DdeltaT = -Dvdsat_DdeltaT; + } + + if (model->SOI3useLAMBDA) + { + ld = model->SOI3lambda*Vmx; + tmp = model->SOI3lambda; + } + else + { + ld = model->SOI3lx * log(1 + Vmx/model->SOI3vp); + tmp = model->SOI3lx/(model->SOI3vp + Vmx); } - DVmx_Dvgfb = tmp * (Dpsi_s0_Dvgfb - Dpsi_sLsat_Dvgfb); - DVmx_Dvdb = tmp * (1 + Dpsi_s0_Dvdb - Dpsi_sLsat_Dvdb); - DVmx_Dvsb = tmp * (Dpsi_s0_Dvsb - Dpsi_sLsat_Dvsb - 1); - DVmx_DdeltaT = tmp * (Dpsi_s0_DdeltaT - Dpsi_sLsat_DdeltaT); - ld = model->SOI3lx * log(1 + Vmx/model->SOI3vp); - tmp = model->SOI3lx/(model->SOI3vp + Vmx); - } - Y = 1 + (ld/EffectiveLength); + Y = 1 + (ld/EffectiveLength); - Dld_Dvgfb = tmp * DVmx_Dvgfb; - Dld_Dvdb = tmp * DVmx_Dvdb; - Dld_Dvsb = tmp * DVmx_Dvsb; - Dld_DdeltaT = tmp * DVmx_DdeltaT; + Dld_Dvgfb = tmp * DVmx_Dvgfb; + Dld_Dvdb = tmp * DVmx_Dvdb; + Dld_Dvsb = tmp * DVmx_Dvsb; + Dld_DdeltaT = tmp * DVmx_DdeltaT; - gmg = gmg * Y + (ich0/EffectiveLength) * Dld_Dvgfb; - gmd = gmd * Y + (ich0/EffectiveLength) * Dld_Dvdb; - gms = gms * Y + (ich0/EffectiveLength) * Dld_Dvsb; - gmt = gmt * Y + (ich0/EffectiveLength) * Dld_DdeltaT; + gmg = gmg * Y + (ich0/EffectiveLength) * Dld_Dvgfb; + gmd = gmd * Y + (ich0/EffectiveLength) * Dld_Dvdb; + gms = gms * Y + (ich0/EffectiveLength) * Dld_Dvsb; + gmt = gmt * Y + (ich0/EffectiveLength) * Dld_DdeltaT; - ich0 = ich0 * Y; - /* Need to do ich0 last as its old value is needed for gds */ + ich0 = ich0 * Y; + /* Need to do ich0 last as its old value is needed for gds */ /* * End Channel Length Modulation @@ -1559,7 +1639,7 @@ asm("mosptf:"); here->SOI3gmbs = -(gms + gmg + gmd); here->SOI3gds = gmd; here->SOI3gt = gmt; - vdsat = psi_sLsat - psi_s0; + vdsat_ext = psi_sLsat - psi_s0; /* now for thermal subcircuit values */ tmp = (here->SOI3drainConductance==0?0:(1/(here->SOI3drainConductance))); @@ -1749,19 +1829,11 @@ asm("mosptf:"); } /* end block */ -/* - -*/ - -#ifdef DETAILPROF -asm(" .globl mosptg"); -asm("mosptg:"); -#endif /*DETAILPROF*/ /* now deal with n vs p polarity */ here->SOI3von = model->SOI3type * von; - here->SOI3vdsat = model->SOI3type * vdsat; + here->SOI3vdsat = model->SOI3type * vdsat_ext; /* line 490 */ /* * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE @@ -1892,14 +1964,6 @@ asm("mosptg:"); *(ckt->CKTstate0 + here->SOI3qt3) = here->SOI3ct3 * deltaT4; *(ckt->CKTstate0 + here->SOI3qt4) = here->SOI3ct4 * deltaT5; /* ct is constant, so integral is trivial */ -/* - -*/ - -#ifdef DETAILPROF -asm(" .globl mospth"); -asm("mospth:"); -#endif /*DETAILPROF*/ if ( (ckt->CKTmode & MODETRAN) || ( (ckt->CKTmode&MODEINITTRAN) && !(ckt->CKTmode&MODEUIC)) ) { @@ -1927,14 +1991,7 @@ asm("mospth:"); here->SOI3ibs += *(ckt->CKTstate0 + here->SOI3iqbs); } } -/* - -*/ -#ifdef DETAILPROF -asm(" .globl mospti"); -asm("mospti:"); -#endif /*DETAILPROF*/ /* if(SenCond) goto next2; */ @@ -1948,9 +2005,7 @@ asm("mospti:"); ckt->CKTnoncon++; } } -/* - -*/ + /* * new capacitor model */ @@ -1978,15 +2033,15 @@ asm("mospti:"); psi_sLargs,psi_s0args, ldargs, &qgatef,&qbody,&qdrn,&qgateb, - &cgfgf,&cgfd,&cgfs,&cgfdeltaT, + &cgfgf,&cgfd,&cgfs,&cgfdeltaT,&cgfgb, &cbgf,&cbd,&cbs,&cbdeltaT,&cbgb, - &cdgf,&cdd,&cds,&cddeltaT, - &cgbgb,&cgbsb); - csgf = -(cgfgf + cdgf + cbgf); - csd = -(cgfd + cdd + cbd); - css = -(cgfs + cds + cbs); - csdeltaT = -(cgfdeltaT + cddeltaT + cbdeltaT); - cgbdb = 0; + &cdgf,&cdd,&cds,&cddeltaT,&cdgb, + &cgbgf,&cgbd,&cgbs,&cgbdeltaT,&cgbgb); + csgf = -(cgfgf + cdgf + cbgf + cgbgf); + csd = -(cgfd + cdd + cbd + cgbd); + css = -(cgfs + cds + cbs + cgbs); + csdeltaT = -(cgfdeltaT + cddeltaT + cbdeltaT + cgbdeltaT); + csgb = -(cgfgb + cdgb + cbgb + cgbgb); } else { @@ -1997,35 +2052,42 @@ asm("mospti:"); psi_sLargs,psi_s0args, ldargs, &qgatef,&qbody,&qsrc,&qgateb, - &cgfgf,&cgfs,&cgfd,&cgfdeltaT, + &cgfgf,&cgfs,&cgfd,&cgfdeltaT,&cgfgb, &cbgf,&cbs,&cbd,&cbdeltaT,&cbgb, - &csgf,&css,&csd,&csdeltaT, - &cgbgb,&cgbdb); - cdgf = -(cgfgf + csgf + cbgf); - cdd = -(cgfd + csd + cbd); - cds = -(cgfs + css + cbs); - cddeltaT = -(cgfdeltaT + csdeltaT + cbdeltaT); - cgbsb = 0; + &csgf,&css,&csd,&csdeltaT,&csgb, + &cgbgf,&cgbs,&cgbd,&cgbdeltaT,&cgbgb); + cdgf = -(cgfgf + csgf + cbgf + cgbgf); + cdd = -(cgfd + csd + cbd + cgbd); + cds = -(cgfs + css + cbs + cgbs); + cddeltaT = -(cgfdeltaT + csdeltaT + cbdeltaT + cgbdeltaT); + cdgb = -(cgfgb + csgb + cbgb + cgbgb); } *(ckt->CKTstate0 + here->SOI3cgfgf) = cgfgf; *(ckt->CKTstate0 + here->SOI3cgfd) = cgfd; *(ckt->CKTstate0 + here->SOI3cgfs) = cgfs; *(ckt->CKTstate0 + here->SOI3cgfdeltaT) = cgfdeltaT; + *(ckt->CKTstate0 + here->SOI3cgfgb) = cgfgb; *(ckt->CKTstate0 + here->SOI3csgf) = csgf; *(ckt->CKTstate0 + here->SOI3csd) = csd; *(ckt->CKTstate0 + here->SOI3css) = css; *(ckt->CKTstate0 + here->SOI3csdeltaT) = csdeltaT; + *(ckt->CKTstate0 + here->SOI3csgb) = csgb; *(ckt->CKTstate0 + here->SOI3cdgf) = cdgf; *(ckt->CKTstate0 + here->SOI3cdd) = cdd; *(ckt->CKTstate0 + here->SOI3cds) = cds; *(ckt->CKTstate0 + here->SOI3cddeltaT) = cddeltaT; + *(ckt->CKTstate0 + here->SOI3cdgb) = cdgb; + *(ckt->CKTstate0 + here->SOI3cgbgf) = cgbgf; + *(ckt->CKTstate0 + here->SOI3cgbd) = cgbd; + *(ckt->CKTstate0 + here->SOI3cgbs) = cgbs; + *(ckt->CKTstate0 + here->SOI3cgbdeltaT) = cgbdeltaT; *(ckt->CKTstate0 + here->SOI3cgbgb) = cgbgb; - *(ckt->CKTstate0 + here->SOI3cgbsb) = cgbsb; - *(ckt->CKTstate0 + here->SOI3cgbdb) = cgbdb; + + /* got charges and caps now, must get equiv conductances/current sources * but first work out charge and caps for BJT charge storage */ @@ -2066,13 +2128,6 @@ asm("mospti:"); here->SOI3gBJTsb_deltaT; } /* end of charge/cap calculations */ -/* - -*/ -#ifdef DETAILPROF -asm(" .globl mosptj"); -asm("mosptj:"); -#endif /*DETAILPROF*/ /* save things away for next time */ @@ -2111,17 +2166,16 @@ bypass1: SOI3capEval(ckt, Frontcapargs, Backcapargs, - cgfgf,cgfd,cgfs,cgfdeltaT, - cdgf,cdd,cds,cddeltaT, - csgf,csd,css,csdeltaT, + cgfgf,cgfd,cgfs,cgfdeltaT,cgfgb, + cdgf,cdd,cds,cddeltaT,cdgb, + csgf,csd,css,csdeltaT,csgb, cbgf,cbd,cbs,cbdeltaT,cbgb, - cgbgb,cgbsb, - &gcgfgf,&gcgfd,&gcgfs,&gcgfdeltaT, - &gcdgf,&gcdd,&gcds,&gcddeltaT, - &gcsgf,&gcsd,&gcss,&gcsdeltaT, + cgbgf,cgbd,cgbs,cgbdeltaT,cgbgb, + &gcgfgf,&gcgfd,&gcgfs,&gcgfdeltaT,&gcgfgb, + &gcdgf,&gcdd,&gcds,&gcddeltaT,&gcdgb, + &gcsgf,&gcsd,&gcss,&gcsdeltaT,&gcsgb, &gcbgf,&gcbd,&gcbs,&gcbdeltaT,&gcbgb, - &gcgbgb,&gcgbsb,&gcgbdb, - &gcgbs0,&gcgbd0, + &gcgbgf,&gcgbd,&gcgbs,&gcgbdeltaT,&gcgbgb, &qgatef,&qbody,&qdrn,&qsrc,&qgateb); } else { Frontcapargs[0] = FrontGateSourceOverlapCap; @@ -2139,17 +2193,16 @@ bypass1: SOI3capEval(ckt, Frontcapargs, Backcapargs, - cgfgf,cgfs,cgfd,cgfdeltaT, - csgf,css,csd,csdeltaT, - cdgf,cds,cdd,cddeltaT, + cgfgf,cgfs,cgfd,cgfdeltaT,cgfgb, + csgf,css,csd,csdeltaT,csgb, + cdgf,cds,cdd,cddeltaT,cdgb, cbgf,cbs,cbd,cbdeltaT,cbgb, - cgbgb,cgbdb, - &gcgfgf,&gcgfs,&gcgfd,&gcgfdeltaT, - &gcsgf,&gcss,&gcsd,&gcsdeltaT, - &gcdgf,&gcds,&gcdd,&gcddeltaT, + cgbgf,cgbs,cgbd,cgbdeltaT,cgbgb, + &gcgfgf,&gcgfs,&gcgfd,&gcgfdeltaT,&gcgfgb, + &gcsgf,&gcss,&gcsd,&gcsdeltaT,&gcsgb, + &gcdgf,&gcds,&gcdd,&gcddeltaT,&gcdgb, &gcbgf,&gcbs,&gcbd,&gcbdeltaT,&gcbgb, - &gcgbgb,&gcgbdb,&gcgbsb, - &gcgbd0,&gcgbs0, + &gcgbgf,&gcgbs,&gcgbd,&gcgbdeltaT,&gcgbgb, &qgatef,&qbody,&qsrc,&qdrn,&qgateb); } ag0 = ckt->CKTag[0]; @@ -2176,17 +2229,23 @@ bypass1: *(ckt->CKTstate0+here->SOI3cgfd) = cgfd; *(ckt->CKTstate0+here->SOI3cgfs) = cgfs; *(ckt->CKTstate0+here->SOI3cgfdeltaT) = cgfdeltaT; - *(ckt->CKTstate0+here->SOI3cdgf) = cdgf; - *(ckt->CKTstate0+here->SOI3cdd) = cdd; - *(ckt->CKTstate0+here->SOI3cds) = cds; + *(ckt->CKTstate0+here->SOI3cgfgb) = cgfgb; + *(ckt->CKTstate0+here->SOI3cdgf) = cdgf; + *(ckt->CKTstate0+here->SOI3cdd) = cdd; + *(ckt->CKTstate0+here->SOI3cds) = cds; *(ckt->CKTstate0+here->SOI3cddeltaT) = cddeltaT; - *(ckt->CKTstate0+here->SOI3csgf) = csgf; - *(ckt->CKTstate0+here->SOI3csd) = csd; - *(ckt->CKTstate0+here->SOI3css) = css; + *(ckt->CKTstate0+here->SOI3cdgb) = cdgb; + *(ckt->CKTstate0+here->SOI3csgf) = csgf; + *(ckt->CKTstate0+here->SOI3csd) = csd; + *(ckt->CKTstate0+here->SOI3css) = css; *(ckt->CKTstate0+here->SOI3csdeltaT) = csdeltaT; + *(ckt->CKTstate0+here->SOI3csgb) = csgb; + *(ckt->CKTstate0+here->SOI3cgbgf) = cgbgf; + *(ckt->CKTstate0+here->SOI3cgbd) = cgbd; + *(ckt->CKTstate0+here->SOI3cgbs) = cgbs; + *(ckt->CKTstate0+here->SOI3cgbdeltaT) = cgbdeltaT; *(ckt->CKTstate0+here->SOI3cgbgb) = cgbgb; - *(ckt->CKTstate0+here->SOI3cgbsb) = cgbsb; - *(ckt->CKTstate0+here->SOI3cgbdb) = cgbdb; + goto End; } @@ -2231,12 +2290,11 @@ bypass2: * and current (DC and TRANOP) */ ieqqgf = ieqqd = ieqqs = ieqqgb = 0.0; - gcgfgf = gcgfd = gcgfs = gcgfdeltaT = 0.0; - gcdgf = gcdd = gcds = gcddeltaT = 0.0; - gcsgf = gcsd = gcss = gcsdeltaT = 0.0; - gcbgf = gcbd = gcbs = gcbdeltaT = gcbgb = 0.0; - gcgbgb = gcgbsb = gcgbdb = 0.0; - gcgbd0 = gcgbs0 = 0.0; + gcgfgf = gcgfd = gcgfs = gcgfdeltaT = gcgfgb = 0.0; + gcdgf = gcdd = gcds = gcddeltaT = gcdgb = 0.0; + gcsgf = gcsd = gcss = gcsdeltaT = gcsgb = 0.0; + gcbgf = gcbd = gcbs = gcbdeltaT = gcbgb = 0.0; + gcgbgf = gcgbd = gcgbs = gcgbdeltaT = gcgbgb = 0.0; gct[0]=gct[1]=gct[2]=gct[3]=gct[4]=0.0; ieqct=ieqct1=ieqct2=ieqct3=ieqct4=0.0; ieqqBJTbs = ieqqBJTbd = 0.0; @@ -2248,15 +2306,17 @@ line860: /* evaluate equivalent charge currents */ ieqqgf = *(ckt->CKTstate0 + here->SOI3iqgf) - - gcgfgf * vgfb - gcgfd * vdb - gcgfs * vsb - gcgfdeltaT * deltaT; + gcgfgf * vgfb - gcgfd * vdb - gcgfs * vsb - gcgfdeltaT * deltaT - + gcgfgb * vgbb; ieqqd = *(ckt->CKTstate0 + here->SOI3iqd) - - gcdgf * vgfb - gcdd * vdb - gcds * vsb - gcddeltaT * deltaT + - gcgbd0 * vgbd; + gcdgf * vgfb - gcdd * vdb - gcds * vsb - gcddeltaT * deltaT - + gcdgb * vgbb; ieqqs = *(ckt->CKTstate0 + here->SOI3iqs) - - gcsgf * vgfb - gcsd * vdb - gcss * vsb - gcsdeltaT * deltaT + - gcgbs0 * vgbs; + gcsgf * vgfb - gcsd * vdb - gcss * vsb - gcsdeltaT * deltaT - + gcsgb * vgbb; ieqqgb = *(ckt->CKTstate0 + here->SOI3iqgb) - - gcgbgb * vgbb - gcgbdb * vdb - gcgbsb * vsb; + gcgbgf * vgfb - gcgbd * vdb - gcgbs * vsb - gcgbdeltaT * deltaT - + gcgbgb * vgbb; ieqqBJTbs = *(ckt->CKTstate0 + here->SOI3iqBJTbs) - gcBJTbsbs * vbs - gcBJTbsdeltaT * deltaT; @@ -2289,6 +2349,9 @@ LoadUp: /* * load current vector */ + + m = here->SOI3m; + ieqbs = model->SOI3type * (here->SOI3ibs-(here->SOI3gbs-ckt->CKTgmin)*vbs -(here->SOI3gbsT)*deltaT); @@ -2306,7 +2369,8 @@ LoadUp: here->SOI3gPmb*(here->SOI3mode==1?vgbs:vgbd)+ here->SOI3gPmbs*(here->SOI3mode==1?vbs:vbd)+ here->SOI3gPdT*(deltaT)); - if (here->SOI3mode >= 0) { + if (here->SOI3mode >= 0) + { xnrm=1; xrev=0; idreq=model->SOI3type*(idrain-here->SOI3gds*vds- @@ -2316,7 +2380,9 @@ LoadUp: here->SOI3gMmf*vgfs-here->SOI3gMmbs*vbs- here->SOI3gMmb*vgbs-here->SOI3gMdeltaT*deltaT); iMsbeq=0; - } else { + } + else + { xnrm=0; xrev=1; idreq = -(model->SOI3type)*(idrain-here->SOI3gds*(-vds)- @@ -2327,179 +2393,178 @@ LoadUp: here->SOI3gMmb*vgbd-here->SOI3gMdeltaT*deltaT); iMdbeq = 0; } - *(ckt->CKTrhs + here->SOI3gfNode) -= - (model->SOI3type * ieqqgf); - *(ckt->CKTrhs + here->SOI3gbNode) -= - (model->SOI3type * ieqqgb); - *(ckt->CKTrhs + here->SOI3bNode) += -(ieqbs + ieqbd) + + *(ckt->CKTrhs + here->SOI3gfNode) -= m * (model->SOI3type * ieqqgf); + *(ckt->CKTrhs + here->SOI3gbNode) -= m * (model->SOI3type * ieqqgb); + *(ckt->CKTrhs + here->SOI3bNode) += m * (-(ieqbs + ieqbd) + iMdbeq + iMsbeq /* one is 0 */ +iBJTdbeq + iBJTsbeq + model->SOI3type * (ieqqgf + ieqqd + ieqqs + ieqqgb) - - model->SOI3type * (ieqqBJTbs + ieqqBJTbd); - *(ckt->CKTrhs + here->SOI3dNodePrime) += (ieqbd-idreq) - + - model->SOI3type * (ieqqBJTbs + ieqqBJTbd)); + *(ckt->CKTrhs + here->SOI3dNodePrime) += m * ((ieqbd-idreq) - iMdbeq - iBJTdbeq - model->SOI3type * (ieqqd) - + model->SOI3type * (ieqqBJTbd); - *(ckt->CKTrhs + here->SOI3sNodePrime) += (idreq + ieqbs) - + + model->SOI3type * (ieqqBJTbd)); + *(ckt->CKTrhs + here->SOI3sNodePrime) += m * ((idreq + ieqbs) - iMsbeq - iBJTsbeq - model->SOI3type * (ieqqs) - + model->SOI3type * (ieqqBJTbs); - *(ckt->CKTrhs + here->SOI3toutNode) += ieqPt-ieqct; + + model->SOI3type * (ieqqBJTbs)); + *(ckt->CKTrhs + here->SOI3toutNode) += m * (ieqPt-ieqct); if (here->SOI3numThermalNodes > 1) { - *(ckt->CKTrhs + here->SOI3tout1Node) += ieqct-ieqct1; + *(ckt->CKTrhs + here->SOI3tout1Node) += m * (ieqct-ieqct1); } if (here->SOI3numThermalNodes > 2) { - *(ckt->CKTrhs + here->SOI3tout2Node) += ieqct1-ieqct2; + *(ckt->CKTrhs + here->SOI3tout2Node) += m * (ieqct1-ieqct2); } if (here->SOI3numThermalNodes > 3) { - *(ckt->CKTrhs + here->SOI3tout3Node) += ieqct2-ieqct3; + *(ckt->CKTrhs + here->SOI3tout3Node) += m * (ieqct2-ieqct3); } - if (here->SOI3numThermalNodes > 2) + if (here->SOI3numThermalNodes > 4) { - *(ckt->CKTrhs + here->SOI3tout4Node) += ieqct3-ieqct4; + *(ckt->CKTrhs + here->SOI3tout4Node) += m * (ieqct3-ieqct4); } - /* - * load y matrix - */ - *(here->SOI3D_dPtr) += (here->SOI3drainConductance); - *(here->SOI3GF_gfPtr) += gcgfgf; - *(here->SOI3GB_gbPtr) += gcgbgb; - *(here->SOI3S_sPtr) += (here->SOI3sourceConductance); - *(here->SOI3B_bPtr) += (here->SOI3gbd+here->SOI3gbs - - here->SOI3gMmbs - - here->SOI3gBJTdb_bs - here->SOI3gBJTsb_bd) - - (gcbgf+gcbd+gcbs+gcbgb) - +gcBJTbsbs+gcBJTbdbd; - - *(here->SOI3DP_dpPtr) += - (here->SOI3drainConductance+here->SOI3gds+ - here->SOI3gbd+xrev*(here->SOI3gmf+here->SOI3gmbs+ - here->SOI3gmb)+xnrm*here->SOI3gMd + gcdd)+ - gcgbd0 + gcBJTbdbd; - *(here->SOI3SP_spPtr) += - (here->SOI3sourceConductance+here->SOI3gds+ - here->SOI3gbs+xnrm*(here->SOI3gmf+here->SOI3gmbs+ - here->SOI3gmb)+xrev*here->SOI3gMd + gcss)+ - gcgbs0 + gcBJTbsbs; - - *(here->SOI3D_dpPtr) += (-here->SOI3drainConductance); - *(here->SOI3GF_dpPtr) += gcgfd; - *(here->SOI3GF_spPtr) += gcgfs; - *(here->SOI3GF_bPtr) -= (gcgfgf + gcgfd + gcgfs); - - *(here->SOI3GB_dpPtr) += gcgbdb; - *(here->SOI3GB_spPtr) += gcgbsb; - *(here->SOI3GB_bPtr) -= (gcgbgb + gcgbdb + gcgbsb); - - *(here->SOI3S_spPtr) += (-here->SOI3sourceConductance); - *(here->SOI3B_gfPtr) += -here->SOI3gMmf + gcbgf; - *(here->SOI3B_gbPtr) += -(here->SOI3gMmb) + gcbgb; - *(here->SOI3B_dpPtr) += -(here->SOI3gbd) + here->SOI3gBJTsb_bd + - xrev*(here->SOI3gMmf+here->SOI3gMmb+ - here->SOI3gMmbs+here->SOI3gMd) - - xnrm*here->SOI3gMd + - gcbd - gcBJTbdbd; - *(here->SOI3B_spPtr) += -(here->SOI3gbs) + here->SOI3gBJTdb_bs + - xnrm*(here->SOI3gMmf+here->SOI3gMmb+ - here->SOI3gMmbs+here->SOI3gMd) - - xrev*here->SOI3gMd + - gcbs - gcBJTbsbs; - *(here->SOI3DP_dPtr) += (-here->SOI3drainConductance); - *(here->SOI3SP_sPtr) += (-here->SOI3sourceConductance); + /* load y matrix */ + + *(here->SOI3D_dPtr) += m * (here->SOI3drainConductance); + *(here->SOI3D_dpPtr) += m * (-here->SOI3drainConductance); + *(here->SOI3DP_dPtr) += m * (-here->SOI3drainConductance); - *(here->SOI3DP_gfPtr) += ((xnrm-xrev)*here->SOI3gmf + gcdgf+ + *(here->SOI3S_sPtr) += m * (here->SOI3sourceConductance); + *(here->SOI3S_spPtr) += m * (-here->SOI3sourceConductance); + *(here->SOI3SP_sPtr) += m * (-here->SOI3sourceConductance); + + *(here->SOI3GF_gfPtr) += m * gcgfgf; + *(here->SOI3GF_dpPtr) += m * gcgfd; + *(here->SOI3GF_spPtr) += m * gcgfs; + *(here->SOI3GF_gbPtr) += m * gcgfgb; + *(here->SOI3GF_bPtr) -= m * (gcgfgf + gcgfd + gcgfs + gcgfgb); + + *(here->SOI3DP_gfPtr) += m * ((xnrm-xrev)*here->SOI3gmf + gcdgf+ xnrm*here->SOI3gMmf); - *(here->SOI3DP_gbPtr) += ((xnrm-xrev)*here->SOI3gmb + - xnrm*here->SOI3gMmb) - gcgbd0; - *(here->SOI3DP_bPtr) += (-here->SOI3gbd + here->SOI3gBJTdb_bs - +(xnrm-xrev)*here->SOI3gmbs+ - xnrm*here->SOI3gMmbs) - - (gcdgf + gcdd + gcds + gcBJTbdbd); - *(here->SOI3DP_spPtr) += (-here->SOI3gds - here->SOI3gBJTdb_bs + *(here->SOI3DP_dpPtr) += m * ((here->SOI3drainConductance+here->SOI3gds+ + here->SOI3gbd+xrev*(here->SOI3gmf+here->SOI3gmbs+ + here->SOI3gmb)+xnrm*here->SOI3gMd + gcdd)+ + gcBJTbdbd); + *(here->SOI3DP_spPtr) += m * ((-here->SOI3gds - here->SOI3gBJTdb_bs -xnrm*(here->SOI3gmf+here->SOI3gmb+here->SOI3gmbs + - here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)) + - gcds; + here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)) + + gcds); + *(here->SOI3DP_gbPtr) += m * (((xnrm-xrev)*here->SOI3gmb + + xnrm*here->SOI3gMmb) + gcdgb); + *(here->SOI3DP_bPtr) += m * ((-here->SOI3gbd + here->SOI3gBJTdb_bs + + (xnrm-xrev)*here->SOI3gmbs + + xnrm*here->SOI3gMmbs) - + (gcdgf + gcdd + gcds + gcdgb + gcBJTbdbd)); - *(here->SOI3SP_gfPtr) += (-(xnrm-xrev)*here->SOI3gmf+ + *(here->SOI3SP_gfPtr) += m * ((-(xnrm-xrev)*here->SOI3gmf+ xrev*here->SOI3gMmf) + - gcsgf; - *(here->SOI3SP_gbPtr) += (-(xnrm-xrev)*here->SOI3gmb+ - xrev*here->SOI3gMmb) - gcgbs0; - *(here->SOI3SP_bPtr) += (-here->SOI3gbs + here->SOI3gBJTsb_bd - -(xnrm-xrev)*here->SOI3gmbs+ - xrev*here->SOI3gMmbs) - - (gcsgf + gcsd + gcss + gcBJTbsbs); - *(here->SOI3SP_dpPtr) += (-here->SOI3gds - here->SOI3gBJTsb_bd + gcsgf); + *(here->SOI3SP_dpPtr) += m * ((-here->SOI3gds - here->SOI3gBJTsb_bd -xrev*(here->SOI3gmf+here->SOI3gmb+here->SOI3gmbs+ - here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)) + - gcsd; + here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)) + + gcsd); + *(here->SOI3SP_spPtr) += m * ((here->SOI3sourceConductance+here->SOI3gds+ + here->SOI3gbs+xnrm*(here->SOI3gmf+here->SOI3gmbs+ + here->SOI3gmb)+xrev*here->SOI3gMd + gcss)+ + gcBJTbsbs); + *(here->SOI3SP_gbPtr) += m * ((-(xnrm-xrev)*here->SOI3gmb+ + xrev*here->SOI3gMmb) + gcsgb); + *(here->SOI3SP_bPtr) += m * ((-here->SOI3gbs + here->SOI3gBJTsb_bd - + (xnrm-xrev)*here->SOI3gmbs+ + xrev*here->SOI3gMmbs) - + (gcsgf + gcsd + gcss + gcsgb + gcBJTbsbs)); + + *(here->SOI3GB_gfPtr) += m * gcgbgf; + *(here->SOI3GB_dpPtr) += m * gcgbd; + *(here->SOI3GB_spPtr) += m * gcgbs; + *(here->SOI3GB_gbPtr) += m * gcgbgb; + *(here->SOI3GB_bPtr) -= m * (gcgbgf + gcgbd + gcgbs + gcgbgb); + + *(here->SOI3B_gfPtr) += m * (-here->SOI3gMmf + gcbgf); + *(here->SOI3B_dpPtr) += m * (-(here->SOI3gbd) + here->SOI3gBJTsb_bd + + xrev*(here->SOI3gMmf+here->SOI3gMmb+ + here->SOI3gMmbs+here->SOI3gMd) - + xnrm*here->SOI3gMd + + gcbd - gcBJTbdbd); + *(here->SOI3B_spPtr) += m * (-(here->SOI3gbs) + here->SOI3gBJTdb_bs + + xnrm*(here->SOI3gMmf+here->SOI3gMmb+ + here->SOI3gMmbs+here->SOI3gMd) - + xrev*here->SOI3gMd + + gcbs - gcBJTbsbs); + *(here->SOI3B_gbPtr) += m * (-(here->SOI3gMmb) + gcbgb); + *(here->SOI3B_bPtr) += m * ((here->SOI3gbd+here->SOI3gbs - + here->SOI3gMmbs - + here->SOI3gBJTdb_bs - here->SOI3gBJTsb_bd) - + (gcbgf+gcbd+gcbs+gcbgb) + + gcBJTbsbs+gcBJTbdbd); + /* if no thermal behaviour specified, then put in zero valued indpt. voltage source between TOUT and ground */ if (here->SOI3rt==0) { - *(here->SOI3TOUT_ibrPtr) += 1.0 ; - *(here->SOI3IBR_toutPtr) += 1.0 ; + *(here->SOI3TOUT_ibrPtr) += m * 1.0 ; + *(here->SOI3IBR_toutPtr) += m * 1.0 ; *(ckt->CKTrhs + (here->SOI3branch)) = 0 ; } else { - *(here->SOI3TOUT_toutPtr) += -(here->SOI3gPdT)+grt[0]+gct[0]; + *(here->SOI3TOUT_toutPtr) += m * (-(here->SOI3gPdT)+grt[0]+gct[0]); if (here->SOI3numThermalNodes > 1) { - *(here->SOI3TOUT_tout1Ptr) += -grt[0]-gct[0]; - *(here->SOI3TOUT1_toutPtr) += -grt[0]-gct[0]; - *(here->SOI3TOUT1_tout1Ptr) += grt[0]+grt[1]+gct[0]+gct[1]; + *(here->SOI3TOUT_tout1Ptr) += m * (-grt[0]-gct[0]); + *(here->SOI3TOUT1_toutPtr) += m * (-grt[0]-gct[0]); + *(here->SOI3TOUT1_tout1Ptr) += m * (grt[0]+grt[1]+gct[0]+gct[1]); } if (here->SOI3numThermalNodes > 2) { - *(here->SOI3TOUT1_tout2Ptr) += -grt[1]-gct[1]; - *(here->SOI3TOUT2_tout1Ptr) += -grt[1]-gct[1]; - *(here->SOI3TOUT2_tout2Ptr) += grt[1]+grt[2]+gct[1]+gct[2]; + *(here->SOI3TOUT1_tout2Ptr) += m * (-grt[1]-gct[1]); + *(here->SOI3TOUT2_tout1Ptr) += m * (-grt[1]-gct[1]); + *(here->SOI3TOUT2_tout2Ptr) += m * (grt[1]+grt[2]+gct[1]+gct[2]); } if (here->SOI3numThermalNodes > 3) { - *(here->SOI3TOUT2_tout3Ptr) += -grt[2]-gct[2]; - *(here->SOI3TOUT3_tout2Ptr) += -grt[2]-gct[2]; - *(here->SOI3TOUT3_tout3Ptr) += grt[2]+grt[3]+gct[2]+gct[3]; + *(here->SOI3TOUT2_tout3Ptr) += m * (-grt[2]-gct[2]); + *(here->SOI3TOUT3_tout2Ptr) += m * (-grt[2]-gct[2]); + *(here->SOI3TOUT3_tout3Ptr) += m * (grt[2]+grt[3]+gct[2]+gct[3]); } if (here->SOI3numThermalNodes > 4) { - *(here->SOI3TOUT3_tout4Ptr) += -grt[3]-gct[3]; - *(here->SOI3TOUT4_tout3Ptr) += -grt[3]-gct[3]; - *(here->SOI3TOUT4_tout4Ptr) += grt[3]+grt[4]+gct[3]+gct[4]; + *(here->SOI3TOUT3_tout4Ptr) += m * (-grt[3]-gct[3]); + *(here->SOI3TOUT4_tout3Ptr) += m * (-grt[3]-gct[3]); + *(here->SOI3TOUT4_tout4Ptr) += m * (grt[3]+grt[4]+gct[3]+gct[4]); } - *(here->SOI3TOUT_dpPtr) += xnrm*(-(here->SOI3gPds*model->SOI3type)) + *(here->SOI3TOUT_dpPtr) += m * (xnrm*(-(here->SOI3gPds*model->SOI3type)) +xrev*(here->SOI3gPds+here->SOI3gPmf+ here->SOI3gPmb+here->SOI3gPmbs)* - model->SOI3type; - *(here->SOI3TOUT_gfPtr) += -(here->SOI3gPmf*model->SOI3type); - *(here->SOI3TOUT_gbPtr) += -(here->SOI3gPmb*model->SOI3type); - *(here->SOI3TOUT_bPtr) += -(here->SOI3gPmbs*model->SOI3type); - *(here->SOI3TOUT_spPtr) += xnrm*(here->SOI3gPds+here->SOI3gPmf+ + model->SOI3type); + *(here->SOI3TOUT_gfPtr) += m * (-(here->SOI3gPmf*model->SOI3type)); + *(here->SOI3TOUT_gbPtr) += m * (-(here->SOI3gPmb*model->SOI3type)); + *(here->SOI3TOUT_bPtr) += m * (-(here->SOI3gPmbs*model->SOI3type)); + *(here->SOI3TOUT_spPtr) += m * (xnrm*(here->SOI3gPds+here->SOI3gPmf+ here->SOI3gPmb+here->SOI3gPmbs)*model->SOI3type - +xrev*(-(here->SOI3gPds*model->SOI3type)); + +xrev*(-(here->SOI3gPds*model->SOI3type))); - *(here->SOI3DP_toutPtr) += (xnrm-xrev)*here->SOI3gt*model->SOI3type; - *(here->SOI3SP_toutPtr) += (xrev-xnrm)*here->SOI3gt*model->SOI3type; + *(here->SOI3DP_toutPtr) += m * (xnrm-xrev)*here->SOI3gt*model->SOI3type; + *(here->SOI3SP_toutPtr) += m * (xrev-xnrm)*here->SOI3gt*model->SOI3type; /* need to mult by type in above as conductances will be used with exterior voltages which will be -ve for PMOS except for gPdT */ /* now for thermal influence on impact ionisation current and tranisent stuff */ - *(here->SOI3GF_toutPtr) += gcgfdeltaT*model->SOI3type; - *(here->SOI3DP_toutPtr) += (xnrm*here->SOI3gMdeltaT + gcddeltaT - + *(here->SOI3GF_toutPtr) += m * gcgfdeltaT*model->SOI3type; + *(here->SOI3DP_toutPtr) += m * (xnrm*here->SOI3gMdeltaT + gcddeltaT - here->SOI3gbdT + here->SOI3gBJTdb_deltaT - gcBJTbddeltaT)*model->SOI3type; - *(here->SOI3SP_toutPtr) += (xrev*here->SOI3gMdeltaT + gcsdeltaT - + *(here->SOI3SP_toutPtr) += m * (xrev*here->SOI3gMdeltaT + gcsdeltaT - here->SOI3gbsT + here->SOI3gBJTsb_deltaT - gcBJTbsdeltaT)*model->SOI3type; - *(here->SOI3B_toutPtr) -= (here->SOI3gMdeltaT - gcbdeltaT - + *(here->SOI3GB_toutPtr) += m * gcgbdeltaT*model->SOI3type; + *(here->SOI3B_toutPtr) -= m * (here->SOI3gMdeltaT - gcbdeltaT - here->SOI3gbsT - here->SOI3gbdT + here->SOI3gBJTdb_deltaT + here->SOI3gBJTsb_deltaT @@ -2511,23 +2576,13 @@ End: ; return(OK); } -void common_handler(int sig,int code,struct sigcontext *scp,char * addr) -{; -} /* DEVsoipnjlim(vnew,vold,vt,vcrit,icheck) * limit the per-iteration change of PN junction voltages */ double -DEVsoipnjlim(vnew,vold,vt,vcrit,icheck) - - double vnew; - double vold; - double vt; - double vcrit; - int *icheck; - +DEVsoipnjlim(double vnew, double vold, double vt, double vcrit, int *icheck) { double arg; diff --git a/src/spicelib/devices/soi3/soi3mask.c b/src/spicelib/devices/soi3/soi3mask.c index 50136982c..5287c7a90 100644 --- a/src/spicelib/devices/soi3/soi3mask.c +++ b/src/spicelib/devices/soi3/soi3mask.c @@ -1,12 +1,12 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,10 +15,12 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: Paolo Nenzi 2001 */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "cktdefs.h" @@ -30,11 +32,7 @@ Acknowledgements : Rupert Howes and Pete Mole. /*ARGSUSED*/ int -SOI3mAsk(ckt,inst,which,value) - CKTcircuit *ckt; - GENmodel *inst; - int which; - IFvalue *value; +SOI3mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) { SOI3model *model = (SOI3model *)inst; switch(which) { @@ -90,13 +88,13 @@ SOI3mAsk(ckt,inst,which,value) value->rValue = model->SOI3frontGateBulkOverlapCapFactor; return(OK); case SOI3_MOD_CGBSO: - value->rValue = model->SOI3backGateSourceOverlapCapFactor; + value->rValue = model->SOI3backGateSourceOverlapCapAreaFactor; return(OK); case SOI3_MOD_CGBDO: - value->rValue = model->SOI3backGateDrainOverlapCapFactor; + value->rValue = model->SOI3backGateDrainOverlapCapAreaFactor; return(OK); - case SOI3_MOD_CGB_BO: - value->rValue = model->SOI3backGateBulkOverlapCapFactor; + case SOI3_MOD_CGBBO: + value->rValue = model->SOI3backGateBulkOverlapCapAreaFactor; return(OK); case SOI3_MOD_RSH: value->rValue = model->SOI3sheetResistance; @@ -279,6 +277,9 @@ SOI3mAsk(ckt,inst,which,value) case SOI3_MOD_CTA: value->rValue = model->SOI3cta; return(OK); + case SOI3_MOD_MEXP: + value->rValue = model->SOI3mexp; + return(OK); default: return(E_BADPARM); } diff --git a/src/spicelib/devices/soi3/soi3mdel.c b/src/spicelib/devices/soi3/soi3mdel.c index be6c05c06..909b93b0c 100644 --- a/src/spicelib/devices/soi3/soi3mdel.c +++ b/src/spicelib/devices/soi3/soi3mdel.c @@ -1,12 +1,12 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,20 +15,19 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" -#include #include "soi3defs.h" #include "sperror.h" #include "suffix.h" int -SOI3mDelete(inModel,modname,kill) - GENmodel **inModel; - IFuid modname; - GENmodel *kill; +SOI3mDelete(GENmodel **inModel, IFuid modname, GENmodel *kill) { SOI3model **model = (SOI3model **)inModel; SOI3model *modfast = (SOI3model *)kill; diff --git a/src/spicelib/devices/soi3/soi3mpar.c b/src/spicelib/devices/soi3/soi3mpar.c index 4ff0417ba..ca78a516a 100644 --- a/src/spicelib/devices/soi3/soi3mpar.c +++ b/src/spicelib/devices/soi3/soi3mpar.c @@ -1,12 +1,12 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,10 +15,12 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "soi3defs.h" @@ -26,10 +28,7 @@ Acknowledgements : Rupert Howes and Pete Mole. #include "suffix.h" int -SOI3mParam(param,value,inModel) - int param; - IFvalue *value; - GENmodel *inModel; +SOI3mParam(int param, IFvalue *value, GENmodel *inModel) { register SOI3model *model = (SOI3model *)inModel; switch(param) { @@ -102,16 +101,16 @@ SOI3mParam(param,value,inModel) model->SOI3frontGateBulkOverlapCapFactorGiven = TRUE; break; case SOI3_MOD_CGBSO: - model->SOI3backGateSourceOverlapCapFactor = value->rValue; - model->SOI3backGateSourceOverlapCapFactorGiven = TRUE; + model->SOI3backGateSourceOverlapCapAreaFactor = value->rValue; + model->SOI3backGateSourceOverlapCapAreaFactorGiven = TRUE; break; case SOI3_MOD_CGBDO: - model->SOI3backGateDrainOverlapCapFactor = value->rValue; - model->SOI3backGateDrainOverlapCapFactorGiven = TRUE; + model->SOI3backGateDrainOverlapCapAreaFactor = value->rValue; + model->SOI3backGateDrainOverlapCapAreaFactorGiven = TRUE; break; - case SOI3_MOD_CGB_BO: - model->SOI3backGateBulkOverlapCapFactor = value->rValue; - model->SOI3backGateBulkOverlapCapFactorGiven = TRUE; + case SOI3_MOD_CGBBO: + model->SOI3backGateBulkOverlapCapAreaFactor = value->rValue; + model->SOI3backGateBulkOverlapCapAreaFactorGiven = TRUE; break; /* case SOI3_MOD_CJ: model->SOI3bulkCapFactor = value->rValue; @@ -382,6 +381,10 @@ SOI3mParam(param,value,inModel) model->SOI3cta = value->rValue; model->SOI3ctaGiven = TRUE; break; + case SOI3_MOD_MEXP: + model->SOI3mexp = value->rValue; + model->SOI3mexpGiven = TRUE; + break; default: return(E_BADPARM); diff --git a/src/spicelib/devices/soi3/soi3nois.c b/src/spicelib/devices/soi3/soi3nois.c index 9372bc466..d1ac30251 100644 --- a/src/spicelib/devices/soi3/soi3nois.c +++ b/src/spicelib/devices/soi3/soi3nois.c @@ -1,5 +1,5 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, @@ -15,10 +15,12 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" -#include #include "soi3defs.h" #include "cktdefs.h" #include "iferrmsg.h" @@ -27,7 +29,6 @@ Acknowledgements : Rupert Howes and Pete Mole. #include "suffix.h" - /* This routine is VERY closely based on the standard MOS noise function. * SOI3noise (mode, operation, firstModel, ckt, data, OnDens) * This routine names and evaluates all of the noise sources @@ -40,18 +41,15 @@ Acknowledgements : Rupert Howes and Pete Mole. extern void NevalSrc(); extern double Nintegrate(); + int -SOI3noise (mode, operation, genmodel, ckt, data, OnDens) - int mode; - int operation; - GENmodel *genmodel; - CKTcircuit *ckt; - register Ndata *data; - double *OnDens; +SOI3noise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, + Ndata *data, double *OnDens) + { SOI3model *firstModel = (SOI3model *) genmodel; - register SOI3model *model; - register SOI3instance *inst; + SOI3model *model; + SOI3instance *inst; char name[N_MXVLNTH]; double tempOnoise; double tempInoise; @@ -64,6 +62,8 @@ SOI3noise (mode, operation, genmodel, ckt, data, OnDens) /* define the names of the noise sources */ + + static char *SOI3nNames[SOI3NSRCS] = { /* Note that we have to keep the order */ "_rd", /* noise due to rd */ /* consistent with the index definitions */ "_rs", /* noise due to rs */ /* in SOI3defs.h */ @@ -74,6 +74,10 @@ SOI3noise (mode, operation, genmodel, ckt, data, OnDens) for (model=firstModel; model != NULL; model=model->SOI3nextModel) { for (inst=model->SOI3instances; inst != NULL; inst=inst->SOI3nextInstance) { + + if (inst->SOI3owner != ARCHme) + continue; + switch (operation) { case N_OPEN: @@ -145,7 +149,7 @@ if (!data->namelist) return(E_NOMEM); (double)0.0); noizDens[SOI3RDNOIZ] *= 4 * CONSTboltz * (ckt->CKTtemp + *(ckt->CKTstate0 + inst->SOI3deltaT)) * - inst->SOI3drainConductance; + inst->SOI3drainConductance * inst->SOI3m; lnNdens[SOI3RDNOIZ] = log(MAX(noizDens[SOI3RDNOIZ],N_MINLOG)); NevalSrc(&noizDens[SOI3RSNOIZ],(double*)NULL, @@ -153,7 +157,7 @@ if (!data->namelist) return(E_NOMEM); (double)0.0); noizDens[SOI3RSNOIZ] *= 4 * CONSTboltz * (ckt->CKTtemp + *(ckt->CKTstate0 + inst->SOI3deltaT)) * - inst->SOI3sourceConductance; + inst->SOI3sourceConductance * inst->SOI3m; lnNdens[SOI3RSNOIZ] = log(MAX(noizDens[SOI3RSNOIZ],N_MINLOG)); NevalSrc(&gain,(double*)NULL,ckt, @@ -162,7 +166,7 @@ if (!data->namelist) return(E_NOMEM); noizDens[SOI3IDNOIZ] = (gain * 4 * CONSTboltz * (ckt->CKTtemp + *(ckt->CKTstate0 + inst->SOI3deltaT)) * - inst->SOI3ueff * + inst->SOI3ueff * inst->SOI3m * fabs(*(ckt->CKTstate0 + inst->SOI3qd) + *(ckt->CKTstate0 + inst->SOI3qs)))/ (EffectiveLength*EffectiveLength); @@ -171,9 +175,9 @@ if (!data->namelist) return(E_NOMEM); switch (model->SOI3nLev) { case 2: noizDens[SOI3FLNOIZ] = gain * model->SOI3fNcoef * - (inst->SOI3gmf)*(inst->SOI3gmf)/ + (inst->SOI3gmf * inst->SOI3m)*(inst->SOI3gmf * inst->SOI3m)/ (model->SOI3frontOxideCapFactor * - inst->SOI3w * EffectiveLength * + inst->SOI3w * inst->SOI3m * EffectiveLength * exp(model->SOI3fNexp * log(MAX(fabs(data->freq),N_MINLOG))) ); @@ -182,8 +186,8 @@ if (!data->namelist) return(E_NOMEM); case 1: noizDens[SOI3FLNOIZ] = gain * model->SOI3fNcoef * exp(model->SOI3fNexp * - log(MAX(fabs(inst->SOI3id),N_MINLOG))) / - (data->freq * EffectiveLength * inst->SOI3w * + log(MAX(fabs(inst->SOI3id * inst->SOI3m),N_MINLOG))) / + (data->freq * EffectiveLength * inst->SOI3w * inst->SOI3m * model->SOI3frontOxideCapFactor); break; diff --git a/src/spicelib/devices/soi3/soi3par.c b/src/spicelib/devices/soi3/soi3par.c index efcea9b79..db7183070 100644 --- a/src/spicelib/devices/soi3/soi3par.c +++ b/src/spicelib/devices/soi3/soi3par.c @@ -1,12 +1,12 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,10 +15,12 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "soi3defs.h" @@ -28,11 +30,7 @@ Acknowledgements : Rupert Howes and Pete Mole. /* ARGSUSED */ int -SOI3param(param,value,inst,select) - int param; - IFvalue *value; - GENinstance *inst; - IFvalue *select; +SOI3param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) { SOI3instance *here = (SOI3instance *)inst; switch(param) { @@ -44,6 +42,22 @@ SOI3param(param,value,inst,select) here->SOI3w = value->rValue; here->SOI3wGiven = TRUE; break; + case SOI3_M: + here->SOI3m = value->rValue; + here->SOI3mGiven = TRUE; + break; + case SOI3_AS: + here->SOI3as = value->rValue; + here->SOI3asGiven = TRUE; + break; + case SOI3_AD: + here->SOI3ad = value->rValue; + here->SOI3adGiven = TRUE; + break; + case SOI3_AB: + here->SOI3ab = value->rValue; + here->SOI3abGiven = TRUE; + break; case SOI3_NRD: here->SOI3drainSquares = value->rValue; here->SOI3drainSquaresGiven = TRUE; diff --git a/src/spicelib/devices/soi3/soi3set.c b/src/spicelib/devices/soi3/soi3set.c index 110105663..c9223049e 100644 --- a/src/spicelib/devices/soi3/soi3set.c +++ b/src/spicelib/devices/soi3/soi3set.c @@ -1,12 +1,13 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, + and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,10 +16,12 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "soi3defs.h" @@ -27,11 +30,7 @@ Acknowledgements : Rupert Howes and Pete Mole. int -SOI3setup(matrix,inModel,ckt,states) - SMPmatrix *matrix; - GENmodel *inModel; - CKTcircuit *ckt; - int *states; +SOI3setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) { SOI3model *model = (SOI3model *)inModel; SOI3instance *here; @@ -41,9 +40,14 @@ SOI3setup(matrix,inModel,ckt,states) /* JimB - new variable for RT and CT scaling */ double thermal_area; - double rtargs[5]; + double rtargs[5]; double * rtptr; - int node_count; + int node_count; + + CKTnode *tmpNode; + IFuid tmpName; + + /****** Part 1 - set any model parameters that are not present in ******/ /****** the netlist to default values. ******/ @@ -81,14 +85,14 @@ SOI3setup(matrix,inModel,ckt,states) if(!model->SOI3frontGateBulkOverlapCapFactorGiven) { model->SOI3frontGateBulkOverlapCapFactor = 0; } - if(!model->SOI3backGateSourceOverlapCapFactorGiven) { - model->SOI3backGateSourceOverlapCapFactor = 0; + if(!model->SOI3backGateSourceOverlapCapAreaFactorGiven) { + model->SOI3backGateSourceOverlapCapAreaFactor = 0; } - if(!model->SOI3backGateDrainOverlapCapFactorGiven) { - model->SOI3backGateDrainOverlapCapFactor = 0; + if(!model->SOI3backGateDrainOverlapCapAreaFactorGiven) { + model->SOI3backGateDrainOverlapCapAreaFactor = 0; } - if(!model->SOI3backGateBulkOverlapCapFactorGiven) { - model->SOI3backGateBulkOverlapCapFactor = 0; + if(!model->SOI3backGateBulkOverlapCapAreaFactorGiven) { + model->SOI3backGateBulkOverlapCapAreaFactor = 0; } if(!model->SOI3sideWallCapFactorGiven) { model->SOI3sideWallCapFactor = 0; @@ -175,21 +179,6 @@ SOI3setup(matrix,inModel,ckt,states) if(!model->SOI3gammaBGiven) { model->SOI3gammaB = 0; } -/* now check to determine which CLM model to use */ - if((model->SOI3lx != 0) && (model->SOI3lambda != 0)) { - (*(SPfrontEnd->IFerror))(ERR_WARNING, - "%s: Non-zero values for BOTH LAMBDA and LX. \nDefaulting to simple LAMBDA model", - &model->SOI3modName); - model->SOI3useLAMBDA = TRUE; - } - -/* if only lx given and vp!=0, use froody model, else basic */ - if ((model->SOI3lxGiven) && (model->SOI3lx != 0) && - (!model->SOI3lambdaGiven) && (model->SOI3vp != 0)) { - model->SOI3useLAMBDA = FALSE; - } else { - model->SOI3useLAMBDA = TRUE; - } if(!model->SOI3etaGiven) { model->SOI3eta = 1.0; /* normal field for imp. ion. */ } @@ -268,6 +257,31 @@ SOI3setup(matrix,inModel,ckt,states) if(!model->SOI3ctaGiven) { model->SOI3cta = 0; } + if(!model->SOI3mexpGiven) { + model->SOI3mexp = 0; + } + + /* now check to determine which CLM model to use */ + if((model->SOI3lx != 0) && (model->SOI3lambda != 0)) + { + + (*(SPfrontEnd->IFerror))(ERR_WARNING, + "%s: Non-zero values for BOTH LAMBDA and LX. \nDefaulting to simple LAMBDA model", + &model->SOI3modName); + + model->SOI3useLAMBDA = TRUE; + } + + /* if only lx given, AND vp!=0, AND mexp (integer) is at least 1, use lx/vp, else basic lambda model*/ + if ((model->SOI3lxGiven) && (model->SOI3lx != 0) && + (!model->SOI3lambdaGiven) && (model->SOI3vp != 0) && (model->SOI3mexp > 0)) + { + model->SOI3useLAMBDA = FALSE; + } + else + { + model->SOI3useLAMBDA = TRUE; + } /****** Part 2 - set any instance parameters that are not present ******/ @@ -276,11 +290,7 @@ SOI3setup(matrix,inModel,ckt,states) /* loop through all the instances of the model */ for (here = model->SOI3instances; here != NULL ; here=here->SOI3nextInstance) { - - CKTnode *tmpNode; - IFuid tmpName; - - + if(!here->SOI3icVBSGiven) { here->SOI3icVBS = 0; @@ -301,6 +311,9 @@ SOI3setup(matrix,inModel,ckt,states) here->SOI3sourceSquares=1; } + if (!here->SOI3mGiven) + here->SOI3m = 1; + /****** Part 3 - Initialise transconductances. ******/ /* initialise gM's */ @@ -311,14 +324,18 @@ SOI3setup(matrix,inModel,ckt,states) here->SOI3gMmb = 0.0; here->SOI3gMd = 0.0; here->SOI3gMdeltaT = 0.0; - /* allocate a chunk of the state vector */ - here->SOI3states = *states; - *states += SOI3numStates; -/* if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN) ){ - *states += 10 * (ckt->CKTsenInfo->SENparms); - } + + if (here->SOI3owner == ARCHme) + { + + /* allocate a chunk of the state vector */ + here->SOI3states = *states; + *states += SOI3numStates; +/* if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN) ){ + *states += 10 * (ckt->CKTsenInfo->SENparms); + } */ - + } /****** Part 4 - check resistance values for internal nodes, ******/ /****** to see which internal nodes need to be created. ******/ @@ -331,14 +348,15 @@ SOI3setup(matrix,inModel,ckt,states) && here->SOI3dNodePrime == 0) { error = CKTmkVolt(ckt,&tmp,here->SOI3name,"drain"); + if(error) { return(error); } here->SOI3dNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { + + if (ckt->CKTcopyNodesets) { + if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { if (tmpNode->nsGiven) { tmp->nodeset=tmpNode->nodeset; tmp->nsGiven=tmpNode->nsGiven; @@ -359,14 +377,15 @@ SOI3setup(matrix,inModel,ckt,states) here->SOI3sNodePrime==0) { error = CKTmkVolt(ckt,&tmp,here->SOI3name,"source"); + if(error) { return(error); } here->SOI3sNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { + + if (ckt->CKTcopyNodesets) { + if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { if (tmpNode->nsGiven) { tmp->nodeset=tmpNode->nodeset; tmp->nsGiven=tmpNode->nsGiven; @@ -374,7 +393,7 @@ SOI3setup(matrix,inModel,ckt,states) } } - + } else { @@ -495,16 +514,6 @@ SOI3setup(matrix,inModel,ckt,states) return(error); } here->SOI3branch = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } else { /* have thermal - now how many time constants ? */ @@ -514,17 +523,6 @@ SOI3setup(matrix,inModel,ckt,states) error = CKTmkVolt(ckt,&tmp,here->SOI3name,"tout1"); if (error) return (error); here->SOI3tout1Node = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - - } else { @@ -536,17 +534,6 @@ SOI3setup(matrix,inModel,ckt,states) error = CKTmkVolt(ckt,&tmp,here->SOI3name,"tout2"); if (error) return (error); here->SOI3tout2Node = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - - } else { @@ -558,18 +545,6 @@ SOI3setup(matrix,inModel,ckt,states) error = CKTmkVolt(ckt,&tmp,here->SOI3name,"tout3"); if (error) return (error); here->SOI3tout3Node = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - - - } else { @@ -581,16 +556,6 @@ SOI3setup(matrix,inModel,ckt,states) error = CKTmkVolt(ckt,&tmp,here->SOI3name,"tout4"); if (error) return (error); here->SOI3tout4Node = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } else { @@ -609,35 +574,44 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ return(E_NOMEM);\ } + TSTALLOC(SOI3D_dPtr,SOI3dNode,SOI3dNode) - TSTALLOC(SOI3GF_gfPtr,SOI3gfNode,SOI3gfNode) - TSTALLOC(SOI3S_sPtr,SOI3sNode,SOI3sNode) - TSTALLOC(SOI3GB_gbPtr,SOI3gbNode,SOI3gbNode) - TSTALLOC(SOI3B_bPtr,SOI3bNode,SOI3bNode) - TSTALLOC(SOI3DP_dpPtr,SOI3dNodePrime,SOI3dNodePrime) - TSTALLOC(SOI3SP_spPtr,SOI3sNodePrime,SOI3sNodePrime) TSTALLOC(SOI3D_dpPtr,SOI3dNode,SOI3dNodePrime) - TSTALLOC(SOI3GF_bPtr,SOI3gfNode,SOI3bNode) + TSTALLOC(SOI3DP_dPtr,SOI3dNodePrime,SOI3dNode) + + TSTALLOC(SOI3S_sPtr,SOI3sNode,SOI3sNode) + TSTALLOC(SOI3S_spPtr,SOI3sNode,SOI3sNodePrime) + TSTALLOC(SOI3SP_sPtr,SOI3sNodePrime,SOI3sNode) + + TSTALLOC(SOI3GF_gfPtr,SOI3gfNode,SOI3gfNode) + TSTALLOC(SOI3GF_gbPtr,SOI3gfNode,SOI3gbNode) TSTALLOC(SOI3GF_dpPtr,SOI3gfNode,SOI3dNodePrime) TSTALLOC(SOI3GF_spPtr,SOI3gfNode,SOI3sNodePrime) - TSTALLOC(SOI3GB_bPtr,SOI3gbNode,SOI3bNode) + TSTALLOC(SOI3GF_bPtr,SOI3gfNode,SOI3bNode) + + TSTALLOC(SOI3GB_gfPtr,SOI3gbNode,SOI3gfNode) + TSTALLOC(SOI3GB_gbPtr,SOI3gbNode,SOI3gbNode) TSTALLOC(SOI3GB_dpPtr,SOI3gbNode,SOI3dNodePrime) TSTALLOC(SOI3GB_spPtr,SOI3gbNode,SOI3sNodePrime) - TSTALLOC(SOI3S_spPtr,SOI3sNode,SOI3sNodePrime) + TSTALLOC(SOI3GB_bPtr,SOI3gbNode,SOI3bNode) + + TSTALLOC(SOI3B_gfPtr,SOI3bNode,SOI3gfNode) + TSTALLOC(SOI3B_gbPtr,SOI3bNode,SOI3gbNode) TSTALLOC(SOI3B_dpPtr,SOI3bNode,SOI3dNodePrime) TSTALLOC(SOI3B_spPtr,SOI3bNode,SOI3sNodePrime) - TSTALLOC(SOI3DP_spPtr,SOI3dNodePrime,SOI3sNodePrime) - TSTALLOC(SOI3DP_dPtr,SOI3dNodePrime,SOI3dNode) - TSTALLOC(SOI3B_gfPtr,SOI3bNode,SOI3gfNode) + TSTALLOC(SOI3B_bPtr,SOI3bNode,SOI3bNode) + TSTALLOC(SOI3DP_gfPtr,SOI3dNodePrime,SOI3gfNode) - TSTALLOC(SOI3SP_gfPtr,SOI3sNodePrime,SOI3gfNode) - TSTALLOC(SOI3B_gbPtr,SOI3bNode,SOI3gbNode) TSTALLOC(SOI3DP_gbPtr,SOI3dNodePrime,SOI3gbNode) - TSTALLOC(SOI3SP_gbPtr,SOI3sNodePrime,SOI3gbNode) - TSTALLOC(SOI3SP_sPtr,SOI3sNodePrime,SOI3sNode) + TSTALLOC(SOI3DP_dpPtr,SOI3dNodePrime,SOI3dNodePrime) + TSTALLOC(SOI3DP_spPtr,SOI3dNodePrime,SOI3sNodePrime) TSTALLOC(SOI3DP_bPtr,SOI3dNodePrime,SOI3bNode) - TSTALLOC(SOI3SP_bPtr,SOI3sNodePrime,SOI3bNode) + + TSTALLOC(SOI3SP_gfPtr,SOI3sNodePrime,SOI3gfNode) + TSTALLOC(SOI3SP_gbPtr,SOI3sNodePrime,SOI3gbNode) TSTALLOC(SOI3SP_dpPtr,SOI3sNodePrime,SOI3dNodePrime) + TSTALLOC(SOI3SP_spPtr,SOI3sNodePrime,SOI3sNodePrime) + TSTALLOC(SOI3SP_bPtr,SOI3sNodePrime,SOI3bNode) if (here->SOI3rt == 0) { @@ -673,16 +647,16 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ } TSTALLOC(SOI3TOUT_toutPtr,SOI3toutNode,SOI3toutNode) - TSTALLOC(SOI3TOUT_dpPtr,SOI3toutNode,SOI3dNodePrime) TSTALLOC(SOI3TOUT_gfPtr,SOI3toutNode,SOI3gfNode) TSTALLOC(SOI3TOUT_gbPtr,SOI3toutNode,SOI3gbNode) - TSTALLOC(SOI3TOUT_bPtr,SOI3toutNode,SOI3bNode) + TSTALLOC(SOI3TOUT_dpPtr,SOI3toutNode,SOI3dNodePrime) TSTALLOC(SOI3TOUT_spPtr,SOI3toutNode,SOI3sNodePrime) + TSTALLOC(SOI3TOUT_bPtr,SOI3toutNode,SOI3bNode) TSTALLOC(SOI3GF_toutPtr,SOI3gfNode,SOI3toutNode) + TSTALLOC(SOI3GB_toutPtr,SOI3gbNode,SOI3toutNode) TSTALLOC(SOI3DP_toutPtr,SOI3dNodePrime,SOI3toutNode) TSTALLOC(SOI3SP_toutPtr,SOI3sNodePrime,SOI3toutNode) - TSTALLOC(SOI3B_toutPtr,SOI3bNode,SOI3toutNode) } } @@ -690,14 +664,10 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ return(OK); } -/* JimB - SIMetrix is based on SPICE3e2. Since */ -/* unsetup is a SPICE3f5 function, only use it in */ -/* the standard version */ + int -SOI3unsetup(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +SOI3unsetup(GENmodel *inModel, CKTcircuit *ckt) { SOI3model *model; SOI3instance *here; diff --git a/src/spicelib/devices/soi3/soi3temp.c b/src/spicelib/devices/soi3/soi3temp.c index 8304fa95f..dee40dd7f 100644 --- a/src/spicelib/devices/soi3/soi3temp.c +++ b/src/spicelib/devices/soi3/soi3temp.c @@ -1,12 +1,12 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,10 +15,12 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "soi3defs.h" #include "const.h" @@ -27,9 +29,7 @@ Acknowledgements : Rupert Howes and Pete Mole. int -SOI3temp(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +SOI3temp(GENmodel *inModel, CKTcircuit *ckt) { SOI3model *model = (SOI3model *)inModel; SOI3instance *here; @@ -94,10 +94,11 @@ SOI3temp(inModel,ckt) !model->SOI3bodyThicknessGiven || model->SOI3bodyThickness == 0) { + (*(SPfrontEnd->IFerror))(ERR_FATAL, "%s: SOI3 device film thickness must be supplied", &model->SOI3modName); - return(E_BADPARM); + return(E_BADPARM); } else /* Oxide and film thicknesses are supplied. */ { @@ -309,8 +310,18 @@ SOI3temp(inModel,ckt) double arg; /* 1 - fc */ double sarg; /* (1-fc) ^^ (-mj) */ + + if (here->SOI3owner != ARCHme) + continue; + /* perform the parameter defaulting */ - if(!here->SOI3tempGiven) + + /* JimB - if device temperature not given, OR, if self-heating switched */ + /* on, then set device temperature equal to circuit temperature. Can't */ + /* set device temp with self-heating on, otherwise get multiple thermal */ + /* ground nodes, but doesn't matter, since any sizeable thermal gradient*/ + /* across an IC circuit is probably due to self-heating anyway. */ + if ( (!here->SOI3tempGiven) || (here->SOI3rt != 0) ) { here->SOI3temp = ckt->CKTtemp; } diff --git a/src/spicelib/devices/soi3/soi3trun.c b/src/spicelib/devices/soi3/soi3trun.c index 43fb72c03..55d5eff47 100644 --- a/src/spicelib/devices/soi3/soi3trun.c +++ b/src/spicelib/devices/soi3/soi3trun.c @@ -1,12 +1,12 @@ /********** -STAG version 2.6 +STAG version 2.7 Copyright 2000 owned by the United Kingdom Secretary of State for Defence acting through the Defence Evaluation and Research Agency. Developed by : Jim Benson, Department of Electronics and Computer Science, University of Southampton, United Kingdom. -With help from : Nele D'Halleweyn, Bill Redman-White, and Craig Easson. +With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, and Craig Easson. Based on STAG version 2.1 Developed by : Mike Lee, @@ -15,10 +15,12 @@ With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards Acknowledgements : Rupert Howes and Pete Mole. **********/ -/* Modified: 2001 Paolo Nenzi */ +/********** +Modified by Paolo Nenzi 2002 +ngspice integration +**********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "soi3defs.h" #include "sperror.h" @@ -26,18 +28,19 @@ Acknowledgements : Rupert Howes and Pete Mole. int -SOI3trunc(inModel,ckt,timeStep) - GENmodel *inModel; - register CKTcircuit *ckt; - double *timeStep; +SOI3trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) { - register SOI3model *model = (SOI3model *)inModel; - register SOI3instance *here; + SOI3model *model = (SOI3model *)inModel; + SOI3instance *here; for( ; model != NULL; model = model->SOI3nextModel) { for(here=model->SOI3instances;here!=NULL;here = here->SOI3nextInstance) { + + if (here->SOI3owner != ARCHme) + continue; + CKTterr(here->SOI3qgf,ckt,timeStep); CKTterr(here->SOI3qd,ckt,timeStep); CKTterr(here->SOI3qs,ckt,timeStep); diff --git a/src/spicelib/devices/sw/swinit.c b/src/spicelib/devices/sw/swinit.c index 1162d738c..11958d07d 100644 --- a/src/spicelib/devices/sw/swinit.c +++ b/src/spicelib/devices/sw/swinit.c @@ -68,7 +68,10 @@ SPICEdev SWinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, /* DISTO */ DEVnoise : SWnoise, - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif CIDER DEVinstSize : &SWiSize, DEVmodSize : &SWmSize diff --git a/src/spicelib/devices/tra/trainit.c b/src/spicelib/devices/tra/trainit.c index fc5fc932b..e0c5f675c 100644 --- a/src/spicelib/devices/tra/trainit.c +++ b/src/spicelib/devices/tra/trainit.c @@ -67,7 +67,10 @@ SPICEdev TRAinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, /* DISTO */ DEVnoise : NULL, /* NOISE */ - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &TRAiSize, DEVmodSize : &TRAmSize diff --git a/src/spicelib/devices/txl/txl.c b/src/spicelib/devices/txl/txl.c index c1b3d2a8c..b5e6d5c8b 100644 --- a/src/spicelib/devices/txl/txl.c +++ b/src/spicelib/devices/txl/txl.c @@ -5,7 +5,6 @@ Author: 1992 Charles Hough **********/ #include "ngspice.h" -#include #include "txldefs.h" #include "devdefs.h" #include "ifsim.h" diff --git a/src/spicelib/devices/txl/txlacct.c b/src/spicelib/devices/txl/txlacct.c index bc4c979f6..bde3e0327 100644 --- a/src/spicelib/devices/txl/txlacct.c +++ b/src/spicelib/devices/txl/txlacct.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include #include "cktdefs.h" #include "txldefs.h" diff --git a/src/spicelib/devices/txl/txlask.c b/src/spicelib/devices/txl/txlask.c index 2fd2dde5f..369776fcb 100644 --- a/src/spicelib/devices/txl/txlask.c +++ b/src/spicelib/devices/txl/txlask.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include #include "const.h" #include "txldefs.h" diff --git a/src/spicelib/devices/txl/txldefs.h b/src/spicelib/devices/txl/txldefs.h index 3bb520f10..06a2d4954 100644 --- a/src/spicelib/devices/txl/txldefs.h +++ b/src/spicelib/devices/txl/txldefs.h @@ -16,7 +16,9 @@ typedef struct sTXLinstance { * current model*/ IFuid TXLname; /* pointer to character string naming this instance */ - + int TXLowner; /* number of owner process */ + + int dimensions; /* may we not need this but ... */ int TXLposNode; int TXLnegNode; double TXLlength; diff --git a/src/spicelib/devices/txl/txldel.c b/src/spicelib/devices/txl/txldel.c index 3817a3f65..df4ba420e 100644 --- a/src/spicelib/devices/txl/txldel.c +++ b/src/spicelib/devices/txl/txldel.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include "txldefs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/txl/txldest.c b/src/spicelib/devices/txl/txldest.c index 6c371f9fe..0dc75791b 100644 --- a/src/spicelib/devices/txl/txldest.c +++ b/src/spicelib/devices/txl/txldest.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include "txldefs.h" #include "suffix.h" diff --git a/src/spicelib/devices/txl/txlfbr.c b/src/spicelib/devices/txl/txlfbr.c index 07d9a5b8f..ca88e6a6e 100644 --- a/src/spicelib/devices/txl/txlfbr.c +++ b/src/spicelib/devices/txl/txlfbr.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include "cktdefs.h" #include "txldefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/txl/txlinit.c b/src/spicelib/devices/txl/txlinit.c index 052420b20..107a628a6 100644 --- a/src/spicelib/devices/txl/txlinit.c +++ b/src/spicelib/devices/txl/txlinit.c @@ -45,39 +45,37 @@ SPICEdev TXLinfo = { 0 }, - TXLparam, - TXLmParam, - TXLload, - TXLsetup, - NULL, - NULL, - NULL, - NULL, - NULL, /* TXLfindBranch, */ - TXLload, /* ac load */ - NULL, - TXLdestroy, -#ifdef DELETES - TXLmDelete, - TXLdelete, -#else /* DELETES */ - NULL, - NULL, -#endif /* DELETES */ - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - + DEVparam : TXLparam, + DEVmodParam : TXLmParam, + DEVload : TXLload, + DEVsetup : TXLsetup, + DEVunsetup : NULL, + DEVpzSetup : NULL, + DEVtemperature: NULL, + DEVtrunc : NULL, + DEVfindBranch : NULL, /* TXLfindBranch, */ + DEVacLoad : TXLload, /* ac load */ + DEVaccept : NULL, + DEVdestroy : TXLdestroy, + DEVmodDelete : TXLmDelete, + DEVdelete : TXLdelete, + DEVsetic : NULL, + DEVask : NULL, + DEVmodAsk : NULL, + DEVpzLoad : NULL, + DEVconvTest : NULL, + DEVsenSetup : NULL, + DEVsenLoad : NULL, + DEVsenUpdate : NULL, + DEVsenAcLoad : NULL, + DEVsenPrint : NULL, + DEVsenTrunc : NULL, + DEVdisto : NULL, + DEVnoise : NULL, +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif &TXLiSize, &TXLmSize diff --git a/src/spicelib/devices/txl/txlload.c b/src/spicelib/devices/txl/txlload.c index 45ae8702a..6077d56cd 100644 --- a/src/spicelib/devices/txl/txlload.c +++ b/src/spicelib/devices/txl/txlload.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include "txldefs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/txl/txlmask.c b/src/spicelib/devices/txl/txlmask.c index 995a8bf74..e0783803a 100644 --- a/src/spicelib/devices/txl/txlmask.c +++ b/src/spicelib/devices/txl/txlmask.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include "const.h" #include "cktdefs.h" #include "ifsim.h" diff --git a/src/spicelib/devices/txl/txlmdel.c b/src/spicelib/devices/txl/txlmdel.c index 434f03543..d509c76d2 100644 --- a/src/spicelib/devices/txl/txlmdel.c +++ b/src/spicelib/devices/txl/txlmdel.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include "txldefs.h" #include "sperror.h" #include "suffix.h" diff --git a/src/spicelib/devices/txl/txlmpar.c b/src/spicelib/devices/txl/txlmpar.c index f3346bf55..da23aa279 100644 --- a/src/spicelib/devices/txl/txlmpar.c +++ b/src/spicelib/devices/txl/txlmpar.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "txldefs.h" diff --git a/src/spicelib/devices/txl/txlparam.c b/src/spicelib/devices/txl/txlparam.c index 83e9aaf93..160af8156 100644 --- a/src/spicelib/devices/txl/txlparam.c +++ b/src/spicelib/devices/txl/txlparam.c @@ -5,7 +5,6 @@ Author: 1992 Charles Hough **********/ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "txldefs.h" diff --git a/src/spicelib/devices/txl/txlsetup.c b/src/spicelib/devices/txl/txlsetup.c index f9f728a42..18ba09afa 100644 --- a/src/spicelib/devices/txl/txlsetup.c +++ b/src/spicelib/devices/txl/txlsetup.c @@ -6,7 +6,6 @@ Author: 1992 Charles Hough #include "ngspice.h" -#include #include "smpdefs.h" #include "txldefs.h" #include "sperror.h" diff --git a/src/spicelib/devices/urc/urcinit.c b/src/spicelib/devices/urc/urcinit.c index 938331f93..a69faae40 100644 --- a/src/spicelib/devices/urc/urcinit.c +++ b/src/spicelib/devices/urc/urcinit.c @@ -67,7 +67,10 @@ SPICEdev URCinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, /* DISTO */ DEVnoise : NULL, /* NOISE */ - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &URCiSize, DEVmodSize : &URCmSize diff --git a/src/spicelib/devices/vccs/vccsask.c b/src/spicelib/devices/vccs/vccsask.c index 8e7e601d9..78a7e2a6d 100644 --- a/src/spicelib/devices/vccs/vccsask.c +++ b/src/spicelib/devices/vccs/vccsask.c @@ -131,7 +131,7 @@ VCCSask(ckt,inst,which,value,select) case VCCS_POWER: if (ckt->CKTcurrentAnalysis & DOING_AC) { errMsg = MALLOC(strlen(msg)+1); - errRtn = "BJTask"; + errRtn = "VCCSask"; strcpy(errMsg,msg); return(E_ASKPOWER); } else { diff --git a/src/spicelib/devices/vccs/vccsinit.c b/src/spicelib/devices/vccs/vccsinit.c index 5c008b9ed..65ec86bd4 100644 --- a/src/spicelib/devices/vccs/vccsinit.c +++ b/src/spicelib/devices/vccs/vccsinit.c @@ -67,7 +67,10 @@ SPICEdev VCCSinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, /* DISTO */ DEVnoise : NULL, /* NOISE */ - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &VCCSiSize, DEVmodSize : &VCCSmSize diff --git a/src/spicelib/devices/vcvs/vcvsinit.c b/src/spicelib/devices/vcvs/vcvsinit.c index 7ae22f51c..564bd07ee 100644 --- a/src/spicelib/devices/vcvs/vcvsinit.c +++ b/src/spicelib/devices/vcvs/vcvsinit.c @@ -67,7 +67,10 @@ SPICEdev VCVSinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, /* DISTO */ DEVnoise : NULL, /* NOISE */ - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &VCVSiSize, DEVmodSize : &VCVSmSize diff --git a/src/spicelib/devices/vsrc/vsrcinit.c b/src/spicelib/devices/vsrc/vsrcinit.c index 055bda1e3..87125fef2 100644 --- a/src/spicelib/devices/vsrc/vsrcinit.c +++ b/src/spicelib/devices/vsrc/vsrcinit.c @@ -67,7 +67,10 @@ SPICEdev VSRCinfo = { DEVsenTrunc : NULL, DEVdisto : NULL, /* DISTO */ DEVnoise : NULL, /* NOISE */ - +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif DEVinstSize : &VSRCiSize, DEVmodSize : &VSRCmSize };