Browse Source

update to 4.3

pre-master-46
dwarning 16 years ago
parent
commit
278f3c64fd
  1. 47
      src/spicelib/devices/bsim3soi/b4soi.c
  2. 5
      src/spicelib/devices/bsim3soi/b4soiacld.c
  3. 9
      src/spicelib/devices/bsim3soi/b4soiask.c
  4. 262
      src/spicelib/devices/bsim3soi/b4soicheck.c
  5. 5
      src/spicelib/devices/bsim3soi/b4soicvtest.c
  6. 963
      src/spicelib/devices/bsim3soi/b4soidef.h
  7. 5
      src/spicelib/devices/bsim3soi/b4soidel.c
  8. 5
      src/spicelib/devices/bsim3soi/b4soidest.c
  9. 1
      src/spicelib/devices/bsim3soi/b4soiext.h
  10. 5
      src/spicelib/devices/bsim3soi/b4soigetic.c
  11. 2
      src/spicelib/devices/bsim3soi/b4soiinit.c
  12. 16171
      src/spicelib/devices/bsim3soi/b4soild.c
  13. 9
      src/spicelib/devices/bsim3soi/b4soimask.c
  14. 5
      src/spicelib/devices/bsim3soi/b4soimdel.c
  15. 30
      src/spicelib/devices/bsim3soi/b4soimpar.c
  16. 129
      src/spicelib/devices/bsim3soi/b4soinoi.c
  17. 9
      src/spicelib/devices/bsim3soi/b4soipar.c
  18. 29
      src/spicelib/devices/bsim3soi/b4soipzld.c
  19. 29
      src/spicelib/devices/bsim3soi/b4soiset.c
  20. 3992
      src/spicelib/devices/bsim3soi/b4soitemp.c
  21. 5
      src/spicelib/devices/bsim3soi/b4soitrunc.c
  22. 4
      tests/bsim3soi/inv_dc.cir
  23. 4
      tests/bsim3soi/inv_tr.cir
  24. 2
      tests/bsim3soi/nmos4p3.mod
  25. 2
      tests/bsim3soi/pmos4p3.mod
  26. 4
      tests/bsim3soi/ring51_41.cir
  27. 7
      tests/bsim3soi/test1.cir
  28. 2662
      tests/bsim3soi/test1.out
  29. 2
      tests/bsim3soi/test2.cir
  30. 2
      tests/bsim3soi/test3.cir
  31. 2
      tests/bsim3soi/test4.cir
  32. 2
      tests/bsim3soi/test5.cir
  33. 2
      tests/bsim3soi/test6.cir
  34. 2
      tests/bsim3soi/test7.cir
  35. 2
      tests/bsim3soi/test8.cir

47
src/spicelib/devices/bsim3soi/b4soi.c

@ -1,4 +1,6 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,9 +11,10 @@
* File: b4soi.c * File: b4soi.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"
#include "devdefs.h" #include "devdefs.h"
#include "b4soidef.h" #include "b4soidef.h"
@ -76,7 +79,7 @@ OP( "debug3", B4SOI_DEBUG3, IF_REAL, "DebugOut3"),
#endif #endif
IOP( "bjtoff", B4SOI_BJTOFF, IF_INTEGER, "BJT on/off flag"), IOP( "bjtoff", B4SOI_BJTOFF, IF_INTEGER, "BJT on/off flag"),
IOP( "debug", B4SOI_DEBUG, IF_INTEGER, "BJT on/off flag"),
IOP( "debug", B4SOI_DEBUG, IF_INTEGER, "DEBUG on/off flag"),
IOP( "rth0", B4SOI_RTH0, IF_REAL, "Instance Thermal Resistance"), IOP( "rth0", B4SOI_RTH0, IF_REAL, "Instance Thermal Resistance"),
IOP( "cth0", B4SOI_CTH0, IF_REAL, "Instance Thermal Capacitance"), IOP( "cth0", B4SOI_CTH0, IF_REAL, "Instance Thermal Capacitance"),
IOP( "nrb", B4SOI_NRB, IF_REAL, "Number of squares in body"), IOP( "nrb", B4SOI_NRB, IF_REAL, "Number of squares in body"),
@ -226,7 +229,7 @@ IOP( "pdiblcb", B4SOI_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier
IOP( "pvag", B4SOI_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), IOP( "pvag", B4SOI_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"),
IOP( "shmod", B4SOI_MOD_SHMOD, IF_INTEGER, "Self heating mode selector"), IOP( "shmod", B4SOI_MOD_SHMOD, IF_INTEGER, "Self heating mode selector"),
IOP( "ddmod", B4SOI_MOD_DDMOD, IF_INTEGER, "Dynamic depletion mode selector"),
/* IOP( "ddmod", B4SOI_MOD_DDMOD, IF_INTEGER, "Dynamic depletion mode selector"), */ /*v4.2 soiMod = 1 now has the functionality */
IOP( "tbox", B4SOI_MOD_TBOX, IF_REAL, "Back gate oxide thickness in meters"), IOP( "tbox", B4SOI_MOD_TBOX, IF_REAL, "Back gate oxide thickness in meters"),
IOP( "tsi", B4SOI_MOD_TSI, IF_REAL, "Silicon-on-insulator thickness in meters"), IOP( "tsi", B4SOI_MOD_TSI, IF_REAL, "Silicon-on-insulator thickness in meters"),
IOP( "etsi", B4SOI_MOD_ETSI, IF_REAL, "Effective Silicon-on-insulator thickness in meters"), IOP( "etsi", B4SOI_MOD_ETSI, IF_REAL, "Effective Silicon-on-insulator thickness in meters"),
@ -621,7 +624,10 @@ IOP( "lu0", B4SOI_MOD_LU0, IF_REAL, "Length dependence of u0"),
IOP( "leu", B4SOI_MOD_LEU, IF_REAL, " Length dependence of eu"), IOP( "leu", B4SOI_MOD_LEU, IF_REAL, " Length dependence of eu"),
IOP( "lua", B4SOI_MOD_LUA, IF_REAL, "Length dependence of ua"), IOP( "lua", B4SOI_MOD_LUA, IF_REAL, "Length dependence of ua"),
IOP( "lub", B4SOI_MOD_LUB, IF_REAL, "Length dependence of ub"), IOP( "lub", B4SOI_MOD_LUB, IF_REAL, "Length dependence of ub"),
IOP( "luc", B4SOI_MOD_LUC, IF_REAL, "Length dependence of uc"),
IOP( "luc", B4SOI_MOD_LUC, IF_REAL, "Length dependence of uc"),
IOP( "lud", B4SOI_MOD_LUD, IF_REAL, "Length dependence of ud"), /* Bug fix # 32 Jul 09 */
IOP( "lud1", B4SOI_MOD_LUD1, IF_REAL, "Length dependence of ud1"),
/* Bug fix # 32 Jul 09 */
IOP( "lucste", B4SOI_MOD_LUCSTE, IF_REAL, "Length dependence of ucste"), IOP( "lucste", B4SOI_MOD_LUCSTE, IF_REAL, "Length dependence of ucste"),
IOP( "lucs", B4SOI_MOD_LUCS, IF_REAL, "Length dependence of lucs"), IOP( "lucs", B4SOI_MOD_LUCS, IF_REAL, "Length dependence of lucs"),
IOP( "lvsat", B4SOI_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), IOP( "lvsat", B4SOI_MOD_LVSAT, IF_REAL, "Length dependence of vsat"),
@ -659,6 +665,11 @@ IOP( "lpvag", B4SOI_MOD_LPVAG, IF_REAL, "Length dependence of pvag"),
IOP( "ldelta", B4SOI_MOD_LDELTA, IF_REAL, "Length dependence of delta"), IOP( "ldelta", B4SOI_MOD_LDELTA, IF_REAL, "Length dependence of delta"),
IOP( "lalpha0", B4SOI_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), IOP( "lalpha0", B4SOI_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"),
IOP( "lfbjtii", B4SOI_MOD_LFBJTII, IF_REAL, "Length dependence of fbjtii"), IOP( "lfbjtii", B4SOI_MOD_LFBJTII, IF_REAL, "Length dependence of fbjtii"),
IOP( "labjtii", B4SOI_MOD_LABJTII, IF_REAL, "Length dependence of abjtii"), /*Bug fix # 32 Jul 09*/
IOP( "lcbjtii", B4SOI_MOD_LCBJTII, IF_REAL, "Length dependence of cbjtii"), /*Bug fix # 32 Jul 09*/
IOP( "lebjtii", B4SOI_MOD_LEBJTII, IF_REAL, "Length dependence of ebjtii"), /*Bug fix # 32 Jul 09*/
IOP( "lmbjtii", B4SOI_MOD_LMBJTII, IF_REAL, "Length dependence of mbjtii"), /*Bug fix # 32 Jul 09*/
IOP( "lvbci", B4SOI_MOD_LVBCI, IF_REAL, "Length dependence of vbci"), /*Bug fix # 32 Jul 09*/
IOP( "lbeta0", B4SOI_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), IOP( "lbeta0", B4SOI_MOD_LBETA0, IF_REAL, "Length dependence of beta0"),
IOP( "lbeta1", B4SOI_MOD_LBETA1, IF_REAL, "Length dependence of beta1"), IOP( "lbeta1", B4SOI_MOD_LBETA1, IF_REAL, "Length dependence of beta1"),
IOP( "lbeta2", B4SOI_MOD_LBETA2, IF_REAL, "Length dependence of beta2"), IOP( "lbeta2", B4SOI_MOD_LBETA2, IF_REAL, "Length dependence of beta2"),
@ -713,7 +724,7 @@ IOP( "lvsdfb", B4SOI_MOD_LVSDFB, IF_REAL, "Length dependence of vsdfb"),
IOP( "lvsdth", B4SOI_MOD_LVSDTH, IF_REAL, "Length dependence of vsdth"), IOP( "lvsdth", B4SOI_MOD_LVSDTH, IF_REAL, "Length dependence of vsdth"),
IOP( "ldelvt", B4SOI_MOD_LDELVT, IF_REAL, "Length dependence of delvt"), IOP( "ldelvt", B4SOI_MOD_LDELVT, IF_REAL, "Length dependence of delvt"),
IOP( "lacde", B4SOI_MOD_LACDE, IF_REAL, "Length dependence of acde"), IOP( "lacde", B4SOI_MOD_LACDE, IF_REAL, "Length dependence of acde"),
IOP( "lmoin", B4SOI_MOD_LMOIN, IF_REAL, "Length dependence of amoin"),
IOP( "lmoin", B4SOI_MOD_LMOIN, IF_REAL, "Length dependence of moin"),
IOP( "lnoff", B4SOI_MOD_LNOFF, IF_REAL, "Length dependence of noff"), /* v3.2 */ IOP( "lnoff", B4SOI_MOD_LNOFF, IF_REAL, "Length dependence of noff"), /* v3.2 */
/* v3.1 added for RF */ /* v3.1 added for RF */
@ -764,7 +775,6 @@ IOP( "wcigsd", B4SOI_MOD_WCIGSD, IF_REAL, "Width dependence of cigsd"),
IOP( "wnigc", B4SOI_MOD_WNIGC, IF_REAL, "Width dependence of nigc"), IOP( "wnigc", B4SOI_MOD_WNIGC, IF_REAL, "Width dependence of nigc"),
IOP( "wpigcd", B4SOI_MOD_WPIGCD, IF_REAL, "Width dependence for pigcd"), IOP( "wpigcd", B4SOI_MOD_WPIGCD, IF_REAL, "Width dependence for pigcd"),
IOP( "wpoxedge", B4SOI_MOD_WPOXEDGE, IF_REAL, "Width dependence for poxedge"), IOP( "wpoxedge", B4SOI_MOD_WPOXEDGE, IF_REAL, "Width dependence for poxedge"),
IOP( "wnch", B4SOI_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), IOP( "wnch", B4SOI_MOD_WNPEAK, IF_REAL, "Width dependence of nch"),
IOP( "wnsub", B4SOI_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), IOP( "wnsub", B4SOI_MOD_WNSUB, IF_REAL, "Width dependence of nsub"),
IOP( "wngate", B4SOI_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), IOP( "wngate", B4SOI_MOD_WNGATE, IF_REAL, "Width dependence of ngate"),
@ -792,6 +802,8 @@ IOP( "weu", B4SOI_MOD_WEU, IF_REAL, "Width dependence of eu"),
IOP( "wua", B4SOI_MOD_WUA, IF_REAL, "Width dependence of ua"), IOP( "wua", B4SOI_MOD_WUA, IF_REAL, "Width dependence of ua"),
IOP( "wub", B4SOI_MOD_WUB, IF_REAL, "Width dependence of ub"), IOP( "wub", B4SOI_MOD_WUB, IF_REAL, "Width dependence of ub"),
IOP( "wuc", B4SOI_MOD_WUC, IF_REAL, "Width dependence of uc"), IOP( "wuc", B4SOI_MOD_WUC, IF_REAL, "Width dependence of uc"),
IOP( "wud", B4SOI_MOD_WUD, IF_REAL, "Width dependence of ud"), /* Bug fix # 32 Jul 09 */
IOP( "wud1", B4SOI_MOD_WUD1, IF_REAL, "Width dependence of ud1"), /* Bug fix # 32 Jul 09 */
IOP( "wucste", B4SOI_MOD_WUCSTE, IF_REAL, "Width dependence of ucste"), IOP( "wucste", B4SOI_MOD_WUCSTE, IF_REAL, "Width dependence of ucste"),
IOP( "wucs", B4SOI_MOD_WUCS, IF_REAL, "Width dependence of ucs"), IOP( "wucs", B4SOI_MOD_WUCS, IF_REAL, "Width dependence of ucs"),
IOP( "wvsat", B4SOI_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), IOP( "wvsat", B4SOI_MOD_WVSAT, IF_REAL, "Width dependence of vsat"),
@ -829,6 +841,11 @@ IOP( "wpvag", B4SOI_MOD_WPVAG, IF_REAL, "Width dependence of pvag"),
IOP( "wdelta", B4SOI_MOD_WDELTA, IF_REAL, "Width dependence of delta"), IOP( "wdelta", B4SOI_MOD_WDELTA, IF_REAL, "Width dependence of delta"),
IOP( "walpha0", B4SOI_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), IOP( "walpha0", B4SOI_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"),
IOP( "wfbjtii", B4SOI_MOD_WFBJTII, IF_REAL, "Width dependence of fbjtii"), IOP( "wfbjtii", B4SOI_MOD_WFBJTII, IF_REAL, "Width dependence of fbjtii"),
IOP( "wabjtii", B4SOI_MOD_WABJTII, IF_REAL, "Width dependence of abjtii"), /*Bug fix # 32 Jul 09 */
IOP( "wcbjtii", B4SOI_MOD_WCBJTII, IF_REAL, "Width dependence of cbjtii"), /*Bug fix # 32 Jul 09 */
IOP( "webjtii", B4SOI_MOD_WEBJTII, IF_REAL, "Width dependence of ebjtii"), /*Bug fix # 32 Jul 09 */
IOP( "wmbjtii", B4SOI_MOD_WMBJTII, IF_REAL, "Width dependence of mbjtii"), /*Bug fix # 32 Jul 09 */
IOP( "wvbci", B4SOI_MOD_WVBCI, IF_REAL, "Width dependence of vbci"), /*Bug fix # 32 Jul 09*/
IOP( "wbeta0", B4SOI_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), IOP( "wbeta0", B4SOI_MOD_WBETA0, IF_REAL, "Width dependence of beta0"),
IOP( "wbeta1", B4SOI_MOD_WBETA1, IF_REAL, "Width dependence of beta1"), IOP( "wbeta1", B4SOI_MOD_WBETA1, IF_REAL, "Width dependence of beta1"),
IOP( "wbeta2", B4SOI_MOD_WBETA2, IF_REAL, "Width dependence of beta2"), IOP( "wbeta2", B4SOI_MOD_WBETA2, IF_REAL, "Width dependence of beta2"),
@ -883,12 +900,13 @@ IOP( "wvsdfb", B4SOI_MOD_WVSDFB, IF_REAL, "Width dependence of vsdfb"),
IOP( "wvsdth", B4SOI_MOD_WVSDTH, IF_REAL, "Width dependence of vsdth"), IOP( "wvsdth", B4SOI_MOD_WVSDTH, IF_REAL, "Width dependence of vsdth"),
IOP( "wdelvt", B4SOI_MOD_WDELVT, IF_REAL, "Width dependence of delvt"), IOP( "wdelvt", B4SOI_MOD_WDELVT, IF_REAL, "Width dependence of delvt"),
IOP( "wacde", B4SOI_MOD_WACDE, IF_REAL, "Width dependence of acde"), IOP( "wacde", B4SOI_MOD_WACDE, IF_REAL, "Width dependence of acde"),
IOP( "wmoin", B4SOI_MOD_WMOIN, IF_REAL, "Width dependence of amoin"),
IOP( "wmoin", B4SOI_MOD_WMOIN, IF_REAL, "Width dependence of moin"),
IOP( "wnoff", B4SOI_MOD_WNOFF, IF_REAL, "Width dependence of noff"), /* v3.2 */ IOP( "wnoff", B4SOI_MOD_WNOFF, IF_REAL, "Width dependence of noff"), /* v3.2 */
/* v3.1 added for RF */ /* v3.1 added for RF */
IOP("wxrcrg1", B4SOI_MOD_WXRCRG1, IF_REAL, "Width dependence of xrcrg1"), IOP("wxrcrg1", B4SOI_MOD_WXRCRG1, IF_REAL, "Width dependence of xrcrg1"),
IOP("Wxrcrg2", B4SOI_MOD_WXRCRG2, IF_REAL, "Width dependence of xrcrg2"),
/* IOP("Wxrcrg2", B4SOI_MOD_WXRCRG2, IF_REAL, "Width dependence of xrcrg2") *//*Bug fix # 32 Jul 09 */
IOP("wxrcrg2", B4SOI_MOD_WXRCRG2, IF_REAL, "Width dependence of xrcrg2"),
/* added for RF model end*/ /* added for RF model end*/
@ -963,6 +981,8 @@ IOP( "peu", B4SOI_MOD_PEU, IF_REAL, "Cross-term dependence of eu"),
IOP( "pua", B4SOI_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), IOP( "pua", B4SOI_MOD_PUA, IF_REAL, "Cross-term dependence of ua"),
IOP( "pub", B4SOI_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), IOP( "pub", B4SOI_MOD_PUB, IF_REAL, "Cross-term dependence of ub"),
IOP( "puc", B4SOI_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), IOP( "puc", B4SOI_MOD_PUC, IF_REAL, "Cross-term dependence of uc"),
IOP( "pud", B4SOI_MOD_PUD, IF_REAL, "Cross-term dependence of ud"), /*Bug fix # 32 Jul 09 */
IOP( "pud1", B4SOI_MOD_PUD1, IF_REAL, "Cross-term dependence of ud1"), /*Bug fix # 32 Jul 09 */
IOP( "pucste", B4SOI_MOD_PUCSTE, IF_REAL, "Cross-term dependence of ucste"), IOP( "pucste", B4SOI_MOD_PUCSTE, IF_REAL, "Cross-term dependence of ucste"),
IOP( "pucs", B4SOI_MOD_PUCS, IF_REAL, "Cross-term dependence of ucs"), IOP( "pucs", B4SOI_MOD_PUCS, IF_REAL, "Cross-term dependence of ucs"),
IOP( "pvsat", B4SOI_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), IOP( "pvsat", B4SOI_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"),
@ -1000,6 +1020,11 @@ IOP( "ppvag", B4SOI_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"),
IOP( "pdelta", B4SOI_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), IOP( "pdelta", B4SOI_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"),
IOP( "palpha0", B4SOI_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), IOP( "palpha0", B4SOI_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"),
IOP( "pfbjtii", B4SOI_MOD_PFBJTII, IF_REAL, "Cross-term dependence of fbjtii"), IOP( "pfbjtii", B4SOI_MOD_PFBJTII, IF_REAL, "Cross-term dependence of fbjtii"),
IOP( "pabjtii", B4SOI_MOD_PABJTII, IF_REAL, "Cross-term dependence of abjtii"), /* Bug fix # 32 Jul 09 */
IOP( "pcbjtii", B4SOI_MOD_PCBJTII, IF_REAL, "Cross-term dependence of cbjtii"), /* Bug fix # 32 Jul 09 */
IOP( "pebjtii", B4SOI_MOD_PEBJTII, IF_REAL, "Cross-term dependence of ebjtii"), /* Bug fix # 32 Jul 09 */
IOP( "pmbjtii", B4SOI_MOD_PMBJTII, IF_REAL, "Cross-term dependence of mbjtii"), /* Bug fix # 32 Jul 09 */
IOP( "pvbci", B4SOI_MOD_PVBCI, IF_REAL, "Cross-term dependence of vbci"), /* Bug fix # 32 Jul 09 */
IOP( "pbeta0", B4SOI_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), IOP( "pbeta0", B4SOI_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"),
IOP( "pbeta1", B4SOI_MOD_PBETA1, IF_REAL, "Cross-term dependence of beta1"), IOP( "pbeta1", B4SOI_MOD_PBETA1, IF_REAL, "Cross-term dependence of beta1"),
IOP( "pbeta2", B4SOI_MOD_PBETA2, IF_REAL, "Cross-term dependence of beta2"), IOP( "pbeta2", B4SOI_MOD_PBETA2, IF_REAL, "Cross-term dependence of beta2"),
@ -1054,7 +1079,7 @@ IOP( "pvsdfb", B4SOI_MOD_PVSDFB, IF_REAL, "Cross-term dependence of vsdfb"),
IOP( "pvsdth", B4SOI_MOD_PVSDTH, IF_REAL, "Cross-term dependence of vsdth"), IOP( "pvsdth", B4SOI_MOD_PVSDTH, IF_REAL, "Cross-term dependence of vsdth"),
IOP( "pdelvt", B4SOI_MOD_PDELVT, IF_REAL, "Cross-term dependence of delvt"), IOP( "pdelvt", B4SOI_MOD_PDELVT, IF_REAL, "Cross-term dependence of delvt"),
IOP( "pacde", B4SOI_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), IOP( "pacde", B4SOI_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"),
IOP( "pmoin", B4SOI_MOD_PMOIN, IF_REAL, "Cross-term dependence of amoin"),
IOP( "pmoin", B4SOI_MOD_PMOIN, IF_REAL, "Cross-term dependence of moin"),
IOP( "pnoff", B4SOI_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"), /* v3.2 */ IOP( "pnoff", B4SOI_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"), /* v3.2 */
/* v3.1 added for RF */ /* v3.1 added for RF */
@ -1083,7 +1108,7 @@ char *B4SOInames[] = {
"Gate", "Gate",
"Source", "Source",
"Backgate", "Backgate",
"Body_ext",
"",
"Body", "Body",
"Temp", "Temp",
"Charge", "Charge",

5
src/spicelib/devices/bsim3soi/b4soiacld.c

@ -1,4 +1,5 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,6 +10,8 @@
* File: b4soiacld.c * File: b4soiacld.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"

9
src/spicelib/devices/bsim3soi/b4soiask.c

@ -1,4 +1,5 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,6 +10,8 @@
* File: b4soiask.c * File: b4soiask.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"
@ -180,7 +183,7 @@ B4SOIinstance *here = (B4SOIinstance*)inst;
case B4SOI_AGBCP: case B4SOI_AGBCP:
value->rValue = here->B4SOIagbcp; value->rValue = here->B4SOIagbcp;
return(OK); return(OK);
case B4SOI_AGBCP2:
case B4SOI_AGBCP2:
value->rValue = here->B4SOIagbcp2; value->rValue = here->B4SOIagbcp2;
return(OK); /* v4.1 for BC improvement */ return(OK); /* v4.1 for BC improvement */
case B4SOI_AGBCPD: /* v4.0 */ case B4SOI_AGBCPD: /* v4.0 */
@ -280,7 +283,7 @@ B4SOIinstance *here = (B4SOIinstance*)inst;
case B4SOI_IGIDL: case B4SOI_IGIDL:
value->rValue = here->B4SOIigidl; value->rValue = here->B4SOIigidl;
return(OK); return(OK);
case B4SOI_IGISL:
case B4SOI_IGISL:
value->rValue = here->B4SOIigisl; value->rValue = here->B4SOIigisl;
return(OK); return(OK);
case B4SOI_IGS: case B4SOI_IGS:

262
src/spicelib/devices/bsim3soi/b4soicheck.c

@ -1,4 +1,5 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,6 +10,8 @@
* File: b4soicheck.c * File: b4soicheck.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"
@ -29,7 +32,7 @@ CKTcircuit *ckt)
struct b4soiSizeDependParam *pParam; struct b4soiSizeDependParam *pParam;
int Fatal_Flag = 0; int Fatal_Flag = 0;
FILE *fplog; FILE *fplog;
if ((fplog = fopen("b4soiv1check.log", "w")) != NULL) if ((fplog = fopen("b4soiv1check.log", "w")) != NULL)
{ pParam = here->pParam; { pParam = here->pParam;
fprintf(fplog, "B4SOIV3 Parameter Check\n"); fprintf(fplog, "B4SOIV3 Parameter Check\n");
@ -45,7 +48,7 @@ FILE *fplog;
} }
if((here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) && if((here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) &&
((here->B4SOInf == 1.0) || ((here->B4SOInf > 1.0) &&
((here->B4SOInf == 1.0) || ((here->B4SOInf > 1.0) &&
(here->B4SOIsd > 0.0))) ) (here->B4SOIsd > 0.0))) )
{ if (model->B4SOIsaref <= 0.0) { if (model->B4SOIsaref <= 0.0)
{ fprintf(fplog, "Fatal: SAref = %g is not positive.\n", { fprintf(fplog, "Fatal: SAref = %g is not positive.\n",
@ -175,23 +178,23 @@ FILE *fplog;
if (pParam->B4SOIdvt1 < 0.0) if (pParam->B4SOIdvt1 < 0.0)
{ fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n",
pParam->B4SOIdvt1);
printf("Fatal: Dvt1 = %g is negative.\n", pParam->B4SOIdvt1);
pParam->B4SOIdvt1);
printf("Fatal: Dvt1 = %g is negative.\n", pParam->B4SOIdvt1);
Fatal_Flag = 1; Fatal_Flag = 1;
} }
if (pParam->B4SOIdvt1w < 0.0) if (pParam->B4SOIdvt1w < 0.0)
{ fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n",
pParam->B4SOIdvt1w); pParam->B4SOIdvt1w);
printf("Fatal: Dvt1w = %g is negative.\n", pParam->B4SOIdvt1w); printf("Fatal: Dvt1w = %g is negative.\n", pParam->B4SOIdvt1w);
Fatal_Flag = 1; Fatal_Flag = 1;
} }
if (pParam->B4SOIw0 == -pParam->B4SOIweff) if (pParam->B4SOIw0 == -pParam->B4SOIweff)
{ fprintf(fplog, "Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); { fprintf(fplog, "Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n");
printf("Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); printf("Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n");
Fatal_Flag = 1; Fatal_Flag = 1;
}
}
if (pParam->B4SOIdsub < 0.0) if (pParam->B4SOIdsub < 0.0)
{ fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->B4SOIdsub); { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->B4SOIdsub);
@ -202,21 +205,21 @@ FILE *fplog;
{ fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n");
printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n");
Fatal_Flag = 1; Fatal_Flag = 1;
}
}
if (pParam->B4SOIu0temp <= 0.0) if (pParam->B4SOIu0temp <= 0.0)
{ fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->B4SOIu0temp); { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->B4SOIu0temp);
printf("Fatal: u0 at current temperature = %g is not positive.\n", printf("Fatal: u0 at current temperature = %g is not positive.\n",
pParam->B4SOIu0temp); pParam->B4SOIu0temp);
Fatal_Flag = 1; Fatal_Flag = 1;
} }
/* Check delta parameter */
/* Check delta parameter */
if (pParam->B4SOIdelta < 0.0) if (pParam->B4SOIdelta < 0.0)
{ fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n",
pParam->B4SOIdelta); pParam->B4SOIdelta);
printf("Fatal: Delta = %g is less than zero.\n", pParam->B4SOIdelta); printf("Fatal: Delta = %g is less than zero.\n", pParam->B4SOIdelta);
Fatal_Flag = 1; Fatal_Flag = 1;
}
}
if (pParam->B4SOIvsattemp <= 0.0) if (pParam->B4SOIvsattemp <= 0.0)
{ fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->B4SOIvsattemp); { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->B4SOIvsattemp);
@ -243,7 +246,7 @@ FILE *fplog;
here->B4SOIdrainPerimeter); here->B4SOIdrainPerimeter);
printf("Warning: Pd = %g is less than W.\n", printf("Warning: Pd = %g is less than W.\n",
here->B4SOIdrainPerimeter); here->B4SOIdrainPerimeter);
here->B4SOIdrainPerimeter =pParam->B4SOIweff;
here->B4SOIdrainPerimeter =pParam->B4SOIweff;
} }
} }
if ( model->B4SOIunitLengthGateSidewallJctCapS > 0.0) /* v4.0 */ if ( model->B4SOIunitLengthGateSidewallJctCapS > 0.0) /* v4.0 */
@ -261,7 +264,7 @@ FILE *fplog;
{ fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->B4SOIclc); { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->B4SOIclc);
printf("Fatal: Clc = %g is negative.\n", pParam->B4SOIclc); printf("Fatal: Clc = %g is negative.\n", pParam->B4SOIclc);
Fatal_Flag = 1; Fatal_Flag = 1;
}
}
/* v3.2 */ /* v3.2 */
@ -279,8 +282,8 @@ FILE *fplog;
/* added for stress */ /* added for stress */
/* Check stress effect parameters */ /* Check stress effect parameters */
if( (here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) &&
((here->B4SOInf == 1.0) || ((here->B4SOInf > 1.0) &&
if( (here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) &&
((here->B4SOInf == 1.0) || ((here->B4SOInf > 1.0) &&
(here->B4SOIsd > 0.0))) ) (here->B4SOIsd > 0.0))) )
{ if (model->B4SOIlodk2 <= 0.0) { if (model->B4SOIlodk2 <= 0.0)
{ fprintf(fplog, "Warning: LODK2 = %g is not positive.\n",model->B4SOIlodk2); { fprintf(fplog, "Warning: LODK2 = %g is not positive.\n",model->B4SOIlodk2);
@ -328,38 +331,77 @@ FILE *fplog;
pParam->B4SOIacde); pParam->B4SOIacde);
} }
} }
/* v2.2.3 */
/* v4.2 always perform Fatal checks */
if (pParam->B4SOInigc <= 0.0)
{ fprintf(fplog, "Fatal: nigc = %g is non-positive.\n",
pParam->B4SOInigc);
printf("Fatal: nigc = %g is non-positive.\n", pParam->B4SOInigc);
Fatal_Flag = 1;
}
if (pParam->B4SOIpoxedge <= 0.0)
{ fprintf(fplog, "Fatal: poxedge = %g is non-positive.\n",
pParam->B4SOIpoxedge);
printf("Fatal: poxedge = %g is non-positive.\n", pParam->B4SOIpoxedge);
Fatal_Flag = 1;
}
if (pParam->B4SOIpigcd <= 0.0)
{ fprintf(fplog, "Fatal: pigcd = %g is non-positive.\n",
pParam->B4SOIpigcd);
printf("Fatal: pigcd = %g is non-positive.\n", pParam->B4SOIpigcd);
Fatal_Flag = 1;
}
if (model->B4SOItoxref < 0.0)
{ fprintf(fplog, "Warning: TOXREF = %g is negative.\n",
model->B4SOItoxref);
printf("Warning: Toxref = %g is negative.\n", model->B4SOItoxref);
Fatal_Flag = 1;
}
if (model->B4SOItoxqm <= 0.0)
{ fprintf(fplog, "Fatal: Toxqm = %g is not positive.\n",
model->B4SOItoxqm);
printf("Fatal: Toxqm = %g is not positive.\n", model->B4SOItoxqm);
Fatal_Flag = 1;
}
if (model->B4SOIdeltavox <= 0.0)
{ fprintf(fplog, "Fatal: Deltavox = %g is not positive.\n",
model->B4SOIdeltavox);
printf("Fatal: Deltavox = %g is not positive.\n", model->B4SOIdeltavox);
}
if (model->B4SOIparamChk ==1) if (model->B4SOIparamChk ==1)
{ {
/* Check L and W parameters */
/* Check L and W parameters */
if (pParam->B4SOIleff <= 5.0e-8) if (pParam->B4SOIleff <= 5.0e-8)
{ fprintf(fplog, "Warning: Leff = %g may be too small.\n", { fprintf(fplog, "Warning: Leff = %g may be too small.\n",
pParam->B4SOIleff); pParam->B4SOIleff);
printf("Warning: Leff = %g may be too small.\n", printf("Warning: Leff = %g may be too small.\n",
pParam->B4SOIleff); pParam->B4SOIleff);
}
}
if (pParam->B4SOIleffCV <= 5.0e-8) if (pParam->B4SOIleffCV <= 5.0e-8)
{ fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n",
pParam->B4SOIleffCV); pParam->B4SOIleffCV);
printf("Warning: Leff for CV = %g may be too small.\n", printf("Warning: Leff for CV = %g may be too small.\n",
pParam->B4SOIleffCV); pParam->B4SOIleffCV);
}
}
if (pParam->B4SOIweff <= 1.0e-7) if (pParam->B4SOIweff <= 1.0e-7)
{ fprintf(fplog, "Warning: Weff = %g may be too small.\n", { fprintf(fplog, "Warning: Weff = %g may be too small.\n",
pParam->B4SOIweff); pParam->B4SOIweff);
printf("Warning: Weff = %g may be too small.\n", printf("Warning: Weff = %g may be too small.\n",
pParam->B4SOIweff); pParam->B4SOIweff);
}
}
if (pParam->B4SOIweffCV <= 1.0e-7) if (pParam->B4SOIweffCV <= 1.0e-7)
{ fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n",
pParam->B4SOIweffCV); pParam->B4SOIweffCV);
printf("Warning: Weff for CV = %g may be too small.\n", printf("Warning: Weff for CV = %g may be too small.\n",
pParam->B4SOIweffCV); pParam->B4SOIweffCV);
}
}
/* Check threshold voltage parameters */ /* Check threshold voltage parameters */
if (pParam->B4SOIlpe0 < 0.0) if (pParam->B4SOIlpe0 < 0.0)
@ -399,18 +441,33 @@ FILE *fplog;
printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n",
pParam->B4SOIngate); pParam->B4SOIngate);
} }
if (pParam->B4SOIdvt0 < 0.0) if (pParam->B4SOIdvt0 < 0.0)
{ fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n",
pParam->B4SOIdvt0);
printf("Warning: Dvt0 = %g is negative.\n", pParam->B4SOIdvt0);
pParam->B4SOIdvt0);
printf("Warning: Dvt0 = %g is negative.\n", pParam->B4SOIdvt0);
} }
if (fabs(1.0e-6 / (pParam->B4SOIw0 + pParam->B4SOIweff)) > 10.0) if (fabs(1.0e-6 / (pParam->B4SOIw0 + pParam->B4SOIweff)) > 10.0)
{ fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n");
printf("Warning: (W0 + Weff) may be too small.\n"); printf("Warning: (W0 + Weff) may be too small.\n");
} }
/* Check Nsd, Ngate and Npeak parameters*/ /* Bug Fix # 22 Jul09*/
if (model->B4SOInsd > 1.0e23)
{ fprintf(fplog, "Warning: Nsd = %g is too large, should be specified in cm^-3.\n",
model->B4SOInsd);
printf("Warning: Nsd = %g is too large, should be specified in cm^-3.\n", model->B4SOInsd);
}
if (model->B4SOIngate > 1.0e23)
{ fprintf(fplog, "Warning: Ngate = %g is too large, should be specified in cm^-3.\n",
model->B4SOIngate);
printf("Warning: Ngate = %g is too large, should be specified in cm^-3.\n", model->B4SOIngate);
}
if (model->B4SOInpeak > 1.0e20)
{ fprintf(fplog, "Warning: Npeak = %g is too large, should be less than 1.0e20, specified in cm^-3.\n",
model->B4SOInpeak);
printf("Warning: Npeak = %g is too large, should be less than 1.0e20, specified in cm^-3.\n", model->B4SOInpeak);
}
/* Check subthreshold parameters */ /* Check subthreshold parameters */
if (pParam->B4SOInfactor < 0.0) if (pParam->B4SOInfactor < 0.0)
{ fprintf(fplog, "Warning: Nfactor = %g is negative.\n", { fprintf(fplog, "Warning: Nfactor = %g is negative.\n",
@ -430,15 +487,15 @@ FILE *fplog;
/* Check DIBL parameters */ /* Check DIBL parameters */
if (pParam->B4SOIeta0 < 0.0) if (pParam->B4SOIeta0 < 0.0)
{ fprintf(fplog, "Warning: Eta0 = %g is negative.\n", { fprintf(fplog, "Warning: Eta0 = %g is negative.\n",
pParam->B4SOIeta0);
printf("Warning: Eta0 = %g is negative.\n", pParam->B4SOIeta0);
pParam->B4SOIeta0);
printf("Warning: Eta0 = %g is negative.\n", pParam->B4SOIeta0);
} }
/* Check Abulk parameters */
/* Check Abulk parameters */
if (fabs(1.0e-6 / (pParam->B4SOIb1 + pParam->B4SOIweff)) > 10.0) if (fabs(1.0e-6 / (pParam->B4SOIb1 + pParam->B4SOIweff)) > 10.0)
{ fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n");
printf("Warning: (B1 + Weff) may be too small.\n"); printf("Warning: (B1 + Weff) may be too small.\n");
}
}
/* Check Saturation parameters */ /* Check Saturation parameters */
if (pParam->B4SOIa2 < 0.01) if (pParam->B4SOIa2 < 0.01)
@ -492,12 +549,12 @@ FILE *fplog;
{ fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->B4SOIcgdo); { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->B4SOIcgdo);
printf("Warning: cgdo = %g is negative. Set to zero.\n", model->B4SOIcgdo); printf("Warning: cgdo = %g is negative. Set to zero.\n", model->B4SOIcgdo);
model->B4SOIcgdo = 0.0; model->B4SOIcgdo = 0.0;
}
}
if (model->B4SOIcgso < 0.0) if (model->B4SOIcgso < 0.0)
{ fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->B4SOIcgso); { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->B4SOIcgso);
printf("Warning: cgso = %g is negative. Set to zero.\n", model->B4SOIcgso); printf("Warning: cgso = %g is negative. Set to zero.\n", model->B4SOIcgso);
model->B4SOIcgso = 0.0; model->B4SOIcgso = 0.0;
}
}
if (model->B4SOIcgeo < 0.0) if (model->B4SOIcgeo < 0.0)
{ fprintf(fplog, "Warning: cgeo = %g is negative. Set to zero.\n", model->B4SOIcgeo); { fprintf(fplog, "Warning: cgeo = %g is negative. Set to zero.\n", model->B4SOIcgeo);
printf("Warning: cgeo = %g is negative. Set to zero.\n", model->B4SOIcgeo); printf("Warning: cgeo = %g is negative. Set to zero.\n", model->B4SOIcgeo);
@ -506,32 +563,32 @@ FILE *fplog;
if (model->B4SOIntun < 0.0) if (model->B4SOIntun < 0.0)
{ fprintf(fplog, "Warning: Ntuns = %g is negative.\n", { fprintf(fplog, "Warning: Ntuns = %g is negative.\n",
model->B4SOIntun);
printf("Warning: Ntuns = %g is negative.\n", model->B4SOIntun);
model->B4SOIntun);
printf("Warning: Ntuns = %g is negative.\n", model->B4SOIntun);
} }
if (model->B4SOIntund < 0.0) if (model->B4SOIntund < 0.0)
{ fprintf(fplog, "Warning: Ntund = %g is negative.\n", { fprintf(fplog, "Warning: Ntund = %g is negative.\n",
model->B4SOIntund);
printf("Warning: Ntund = %g is negative.\n", model->B4SOIntund);
model->B4SOIntund);
printf("Warning: Ntund = %g is negative.\n", model->B4SOIntund);
} }
if (model->B4SOIndiode < 0.0) if (model->B4SOIndiode < 0.0)
{ fprintf(fplog, "Warning: Ndiode = %g is negative.\n", { fprintf(fplog, "Warning: Ndiode = %g is negative.\n",
model->B4SOIndiode);
model->B4SOIndiode);
printf("Warning: Ndiode = %g is negative.\n", model->B4SOIndiode); printf("Warning: Ndiode = %g is negative.\n", model->B4SOIndiode);
} }
if (model->B4SOIndioded < 0.0) if (model->B4SOIndioded < 0.0)
{ fprintf(fplog, "Warning: Ndioded = %g is negative.\n", { fprintf(fplog, "Warning: Ndioded = %g is negative.\n",
model->B4SOIndioded);
model->B4SOIndioded);
printf("Warning: Ndioded = %g is negative.\n", model->B4SOIndioded); printf("Warning: Ndioded = %g is negative.\n", model->B4SOIndioded);
} }
if (model->B4SOIisbjt < 0.0) if (model->B4SOIisbjt < 0.0)
{ fprintf(fplog, "Warning: Isbjt = %g is negative.\n", { fprintf(fplog, "Warning: Isbjt = %g is negative.\n",
model->B4SOIisbjt);
printf("Warning: Isbjt = %g is negative.\n", model->B4SOIisbjt);
model->B4SOIisbjt);
printf("Warning: Isbjt = %g is negative.\n", model->B4SOIisbjt);
} }
if (model->B4SOIidbjt < 0.0) if (model->B4SOIidbjt < 0.0)
{ fprintf(fplog, "Warning: Idbjt = %g is negative.\n", { fprintf(fplog, "Warning: Idbjt = %g is negative.\n",
@ -541,8 +598,8 @@ FILE *fplog;
if (model->B4SOIisdif < 0.0) if (model->B4SOIisdif < 0.0)
{ fprintf(fplog, "Warning: Isdif = %g is negative.\n", { fprintf(fplog, "Warning: Isdif = %g is negative.\n",
model->B4SOIisdif);
printf("Warning: Isdif = %g is negative.\n", model->B4SOIisdif);
model->B4SOIisdif);
printf("Warning: Isdif = %g is negative.\n", model->B4SOIisdif);
} }
if (model->B4SOIiddif < 0.0) if (model->B4SOIiddif < 0.0)
{ fprintf(fplog, "Warning: Iddif = %g is negative.\n", { fprintf(fplog, "Warning: Iddif = %g is negative.\n",
@ -552,8 +609,8 @@ FILE *fplog;
if (model->B4SOIisrec < 0.0) if (model->B4SOIisrec < 0.0)
{ fprintf(fplog, "Warning: Isrec = %g is negative.\n", { fprintf(fplog, "Warning: Isrec = %g is negative.\n",
model->B4SOIisrec);
printf("Warning: Isrec = %g is negative.\n", model->B4SOIisrec);
model->B4SOIisrec);
printf("Warning: Isrec = %g is negative.\n", model->B4SOIisrec);
} }
if (model->B4SOIidrec < 0.0) if (model->B4SOIidrec < 0.0)
{ fprintf(fplog, "Warning: Idrec = %g is negative.\n", { fprintf(fplog, "Warning: Idrec = %g is negative.\n",
@ -563,8 +620,8 @@ FILE *fplog;
if (model->B4SOIistun < 0.0) if (model->B4SOIistun < 0.0)
{ fprintf(fplog, "Warning: Istun = %g is negative.\n", { fprintf(fplog, "Warning: Istun = %g is negative.\n",
model->B4SOIistun);
printf("Warning: Istun = %g is negative.\n", model->B4SOIistun);
model->B4SOIistun);
printf("Warning: Istun = %g is negative.\n", model->B4SOIistun);
} }
if (model->B4SOIidtun < 0.0) if (model->B4SOIidtun < 0.0)
{ fprintf(fplog, "Warning: Idtun = %g is negative.\n", { fprintf(fplog, "Warning: Idtun = %g is negative.\n",
@ -574,74 +631,53 @@ FILE *fplog;
if (model->B4SOItt < 0.0) if (model->B4SOItt < 0.0)
{ fprintf(fplog, "Warning: Tt = %g is negative.\n", { fprintf(fplog, "Warning: Tt = %g is negative.\n",
model->B4SOItt);
printf("Warning: Tt = %g is negative.\n", model->B4SOItt);
model->B4SOItt);
printf("Warning: Tt = %g is negative.\n", model->B4SOItt);
} }
if (model->B4SOIcsdmin < 0.0) if (model->B4SOIcsdmin < 0.0)
{ fprintf(fplog, "Warning: Csdmin = %g is negative.\n", { fprintf(fplog, "Warning: Csdmin = %g is negative.\n",
model->B4SOIcsdmin);
printf("Warning: Csdmin = %g is negative.\n", model->B4SOIcsdmin);
model->B4SOIcsdmin);
printf("Warning: Csdmin = %g is negative.\n", model->B4SOIcsdmin);
} }
if (model->B4SOIcsdesw < 0.0) if (model->B4SOIcsdesw < 0.0)
{ fprintf(fplog, "Warning: Csdesw = %g is negative.\n", { fprintf(fplog, "Warning: Csdesw = %g is negative.\n",
model->B4SOIcsdesw);
printf("Warning: Csdesw = %g is negative.\n", model->B4SOIcsdesw);
model->B4SOIcsdesw);
printf("Warning: Csdesw = %g is negative.\n", model->B4SOIcsdesw);
} }
if (model->B4SOIasd < 0.0) if (model->B4SOIasd < 0.0)
{ fprintf(fplog, "Warning: Asd = %g should be within (0, 1).\n", { fprintf(fplog, "Warning: Asd = %g should be within (0, 1).\n",
model->B4SOIasd);
printf("Warning: Asd = %g should be within (0, 1).\n", model->B4SOIasd);
model->B4SOIasd);
printf("Warning: Asd = %g should be within (0, 1).\n", model->B4SOIasd);
} }
if (model->B4SOIrth0 < 0.0) if (model->B4SOIrth0 < 0.0)
{ fprintf(fplog, "Warning: Rth0 = %g is negative.\n", { fprintf(fplog, "Warning: Rth0 = %g is negative.\n",
model->B4SOIrth0);
printf("Warning: Rth0 = %g is negative.\n", model->B4SOIrth0);
model->B4SOIrth0);
printf("Warning: Rth0 = %g is negative.\n", model->B4SOIrth0);
} }
if (model->B4SOIcth0 < 0.0) if (model->B4SOIcth0 < 0.0)
{ fprintf(fplog, "Warning: Cth0 = %g is negative.\n", { fprintf(fplog, "Warning: Cth0 = %g is negative.\n",
model->B4SOIcth0);
printf("Warning: Cth0 = %g is negative.\n", model->B4SOIcth0);
model->B4SOIcth0);
printf("Warning: Cth0 = %g is negative.\n", model->B4SOIcth0);
} }
if (model->B4SOIrbody < 0.0) if (model->B4SOIrbody < 0.0)
{ fprintf(fplog, "Warning: Rbody = %g is negative.\n", { fprintf(fplog, "Warning: Rbody = %g is negative.\n",
model->B4SOIrbody);
printf("Warning: Rbody = %g is negative.\n", model->B4SOIrbody);
model->B4SOIrbody);
printf("Warning: Rbody = %g is negative.\n", model->B4SOIrbody);
} }
if (model->B4SOIrbsh < 0.0) if (model->B4SOIrbsh < 0.0)
{ fprintf(fplog, "Warning: Rbsh = %g is negative.\n", { fprintf(fplog, "Warning: Rbsh = %g is negative.\n",
model->B4SOIrbsh);
printf("Warning: Rbsh = %g is negative.\n", model->B4SOIrbsh);
model->B4SOIrbsh);
printf("Warning: Rbsh = %g is negative.\n", model->B4SOIrbsh);
} }
/* v3.0 */
if (pParam->B4SOInigc <= 0.0)
{ fprintf(fplog, "Fatal: nigc = %g is non-positive.\n",
pParam->B4SOInigc);
printf("Fatal: nigc = %g is non-positive.\n", pParam->B4SOInigc);
Fatal_Flag = 1;
}
if (pParam->B4SOIpoxedge <= 0.0)
{ fprintf(fplog, "Fatal: poxedge = %g is non-positive.\n",
pParam->B4SOIpoxedge);
printf("Fatal: poxedge = %g is non-positive.\n", pParam->B4SOIpoxedge);
Fatal_Flag = 1;
}
if (pParam->B4SOIpigcd <= 0.0)
{ fprintf(fplog, "Fatal: pigcd = %g is non-positive.\n",
pParam->B4SOIpigcd);
printf("Fatal: pigcd = %g is non-positive.\n", pParam->B4SOIpigcd);
Fatal_Flag = 1;
}
/* v2.2 release */ /* v2.2 release */
if (model->B4SOIwth0 < 0.0) if (model->B4SOIwth0 < 0.0)
{ fprintf(fplog, "Warning: WTH0 = %g is negative.\n", { fprintf(fplog, "Warning: WTH0 = %g is negative.\n",
@ -658,12 +694,6 @@ FILE *fplog;
model->B4SOIntox); model->B4SOIntox);
printf("Warning: Ntox = %g is negative.\n", model->B4SOIntox); printf("Warning: Ntox = %g is negative.\n", model->B4SOIntox);
} }
if (model->B4SOItoxref < 0.0)
{ fprintf(fplog, "Warning: TOXREF = %g is negative.\n",
model->B4SOItoxref);
printf("Warning: Toxref = %g is negative.\n", model->B4SOItoxref);
Fatal_Flag = 1;
}
if (model->B4SOIebg < 0.0) if (model->B4SOIebg < 0.0)
{ fprintf(fplog, "Warning: EBG = %g is negative.\n", { fprintf(fplog, "Warning: EBG = %g is negative.\n",
model->B4SOIebg); model->B4SOIebg);
@ -709,26 +739,14 @@ FILE *fplog;
model->B4SOIvgb2); model->B4SOIvgb2);
printf("Warning: Vgb2 = %g is negative.\n", model->B4SOIvgb2); printf("Warning: Vgb2 = %g is negative.\n", model->B4SOIvgb2);
} }
if (model->B4SOItoxqm <= 0.0)
{ fprintf(fplog, "Fatal: Toxqm = %g is not positive.\n",
model->B4SOItoxqm);
printf("Fatal: Toxqm = %g is not positive.\n", model->B4SOItoxqm);
Fatal_Flag = 1;
}
if (model->B4SOIvoxh < 0.0) if (model->B4SOIvoxh < 0.0)
{ fprintf(fplog, "Warning: Voxh = %g is negative.\n", { fprintf(fplog, "Warning: Voxh = %g is negative.\n",
model->B4SOIvoxh); model->B4SOIvoxh);
printf("Warning: Voxh = %g is negative.\n", model->B4SOIvoxh); printf("Warning: Voxh = %g is negative.\n", model->B4SOIvoxh);
} }
if (model->B4SOIdeltavox <= 0.0)
{ fprintf(fplog, "Fatal: Deltavox = %g is not positive.\n",
model->B4SOIdeltavox);
printf("Fatal: Deltavox = %g is not positive.\n", model->B4SOIdeltavox);
}
/* v2.0 release */ /* v2.0 release */
if (model->B4SOIk1w1 < 0.0)
if (model->B4SOIk1w1 < 0.0)
{ fprintf(fplog, "Warning: K1W1 = %g is negative.\n", { fprintf(fplog, "Warning: K1W1 = %g is negative.\n",
model->B4SOIk1w1); model->B4SOIk1w1);
printf("Warning: K1w1 = %g is negative.\n", model->B4SOIk1w1); printf("Warning: K1w1 = %g is negative.\n", model->B4SOIk1w1);
@ -779,7 +797,7 @@ FILE *fplog;
printf("Warning: Sii1 = %g is negative.\n", model->B4SOIsii1); printf("Warning: Sii1 = %g is negative.\n", model->B4SOIsii1);
} }
if (model->B4SOIsii2 < 0.0) if (model->B4SOIsii2 < 0.0)
{ fprintf(fplog, "Warning: SII2 = %g is negative.\n",
{ fprintf(fplog, "Warning: SII2 = %g is negative.\n",
model->B4SOIsii2); model->B4SOIsii2);
printf("Warning: Sii2 = %g is negative.\n", model->B4SOIsii1); printf("Warning: Sii2 = %g is negative.\n", model->B4SOIsii1);
} }
@ -843,7 +861,7 @@ FILE *fplog;
model->B4SOIrbsh); model->B4SOIrbsh);
printf("Warning: Rbsh = %g is negative.\n", model->B4SOIrbsh); printf("Warning: Rbsh = %g is negative.\n", model->B4SOIrbsh);
} }
if (pParam->B4SOIntrecf < 0.0)
/* if (pParam->B4SOIntrecf < 0.0)
{ fprintf(fplog, "Warning: NTRECF = %g is negative.\n", { fprintf(fplog, "Warning: NTRECF = %g is negative.\n",
pParam->B4SOIntrecf); pParam->B4SOIntrecf);
printf("Warning: Ntrecf = %g is negative.\n", pParam->B4SOIntrecf); printf("Warning: Ntrecf = %g is negative.\n", pParam->B4SOIntrecf);
@ -852,7 +870,7 @@ FILE *fplog;
{ fprintf(fplog, "Warning: NTRECR = %g is negative.\n", { fprintf(fplog, "Warning: NTRECR = %g is negative.\n",
pParam->B4SOIntrecr); pParam->B4SOIntrecr);
printf("Warning: Ntrecr = %g is negative.\n", pParam->B4SOIntrecr); printf("Warning: Ntrecr = %g is negative.\n", pParam->B4SOIntrecr);
}
} v4.2 bugfix: QA Test uses negative temp co-efficients*/
/* v3.0 bug fix */ /* v3.0 bug fix */
/* /*
@ -863,7 +881,7 @@ FILE *fplog;
} }
*/ */
if (model->B4SOItcjswg < 0.0)
/* if (model->B4SOItcjswg < 0.0)
{ fprintf(fplog, "Warning: TCJSWGS = %g is negative.\n", { fprintf(fplog, "Warning: TCJSWGS = %g is negative.\n",
model->B4SOItcjswg); model->B4SOItcjswg);
printf("Warning: Tcjswg = %g is negative.\n", model->B4SOItcjswg); printf("Warning: Tcjswg = %g is negative.\n", model->B4SOItcjswg);
@ -882,7 +900,7 @@ FILE *fplog;
{ fprintf(fplog, "Warning: TPBSWGD = %g is negative.\n", { fprintf(fplog, "Warning: TPBSWGD = %g is negative.\n",
model->B4SOItpbswgd); model->B4SOItpbswgd);
printf("Warning: Tpbswgd = %g is negative.\n", model->B4SOItpbswgd); printf("Warning: Tpbswgd = %g is negative.\n", model->B4SOItpbswgd);
}
} v4.2 bugfix: QA Test uses negative temp co-efficients*/
if ((model->B4SOIacde < 0.1) || (model->B4SOIacde > 1.6)) if ((model->B4SOIacde < 0.1) || (model->B4SOIacde > 1.6))
{ fprintf(fplog, "Warning: ACDE = %g is out of range.\n", { fprintf(fplog, "Warning: ACDE = %g is out of range.\n",
model->B4SOIacde); model->B4SOIacde);
@ -913,7 +931,7 @@ FILE *fplog;
if (fabs(model->B4SOIcgidl) < 1e-9) if (fabs(model->B4SOIcgidl) < 1e-9)
{ fprintf(fplog, "Warning: CGIDL = %g is smaller than 1e-9.\n", { fprintf(fplog, "Warning: CGIDL = %g is smaller than 1e-9.\n",
model->B4SOIcgidl); model->B4SOIcgidl);
printf("Warning: Cgidl = %g is smaller than 1e-9.\n",
printf("Warning: Cgidl = %g is smaller than 1e-9.\n",
model->B4SOIcgidl); model->B4SOIcgidl);
} }
if (model->B4SOIegidl < 0.0) if (model->B4SOIegidl < 0.0)
@ -935,7 +953,7 @@ FILE *fplog;
if (fabs(model->B4SOIcgisl) < 1e-9) if (fabs(model->B4SOIcgisl) < 1e-9)
{ fprintf(fplog, "Warning: CGISL = %g is smaller than 1e-9.\n", { fprintf(fplog, "Warning: CGISL = %g is smaller than 1e-9.\n",
model->B4SOIcgisl); model->B4SOIcgisl);
printf("Warning: Cgisl = %g is smaller than 1e-9.\n",
printf("Warning: Cgisl = %g is smaller than 1e-9.\n",
model->B4SOIcgisl); model->B4SOIcgisl);
} }
if (model->B4SOIegisl < 0.0) if (model->B4SOIegisl < 0.0)
@ -949,22 +967,28 @@ FILE *fplog;
model->B4SOIesatii); model->B4SOIesatii);
printf("Warning: Esatii = %g should be within (0, 1).\n", model->B4SOIesatii); printf("Warning: Esatii = %g should be within (0, 1).\n", model->B4SOIesatii);
} }
if (!model->B4SOIvgstcvModGiven)
{ fprintf(fplog, "Warning: The default vgstcvMod is changed in v4.2 from '0' to '1'.\n");
printf("Warning: The default vgstcvMod is changed in v4.2 from '0' to '1'.\n");
}
if (pParam->B4SOIxj > model->B4SOItsi) if (pParam->B4SOIxj > model->B4SOItsi)
{ fprintf(fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n", { fprintf(fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n",
pParam->B4SOIxj, model->B4SOItsi);
printf("Warning: Xj = %g is thicker than Tsi = %g.\n",
pParam->B4SOIxj, model->B4SOItsi);
pParam->B4SOIxj, model->B4SOItsi);
printf("Warning: Xj = %g is thicker than Tsi = %g.\n",
pParam->B4SOIxj, model->B4SOItsi);
} }
if (model->B4SOIcapMod < 2) if (model->B4SOIcapMod < 2)
{ fprintf(fplog, "Warning: capMod < 2 is not supported by BSIM3SOI.\n"); { fprintf(fplog, "Warning: capMod < 2 is not supported by BSIM3SOI.\n");
printf("Warning: Warning: capMod < 2 is not supported by BSIM3SOI.\n"); printf("Warning: Warning: capMod < 2 is not supported by BSIM3SOI.\n");
}
if (model->B4SOIcapMod > 3)
{ fprintf(fplog, "Warning: capMod > 3 is not supported by BSIMSOI4.2.\n");
printf("Warning: Warning: capMod > 3 is not supported by BSIMSOI4.2.\n");
} }
}/* loop for the parameter check for warning messages */
}/* loop for the parameter check for warning messages */
fclose(fplog); fclose(fplog);
} }
else else

5
src/spicelib/devices/bsim3soi/b4soicvtest.c

@ -1,4 +1,5 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,6 +10,8 @@
* File: b4soicvtest.c * File: b4soicvtest.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"

963
src/spicelib/devices/bsim3soi/b4soidef.h
File diff suppressed because it is too large
View File

5
src/spicelib/devices/bsim3soi/b4soidel.c

@ -1,4 +1,5 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,6 +10,8 @@
* File: b4soidel.c * File: b4soidel.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"

5
src/spicelib/devices/bsim3soi/b4soidest.c

@ -1,4 +1,5 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,6 +10,8 @@
* File: b4soidest.c * File: b4soidest.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"

1
src/spicelib/devices/bsim3soi/b4soiext.h

@ -2,6 +2,7 @@
Copyright 2009 Regents of the University of California. All rights reserved. Copyright 2009 Regents of the University of California. All rights reserved.
Author: 2005 Hui Wan (based on Samuel Fung's b3soiext.h) Author: 2005 Hui Wan (based on Samuel Fung's b3soiext.h)
Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu.
File: b4soiext.h File: b4soiext.h
**********/ **********/

5
src/spicelib/devices/bsim3soi/b4soigetic.c

@ -1,4 +1,5 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,6 +10,8 @@
* File: b4soigetic.c * File: b4soigetic.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"

2
src/spicelib/devices/bsim3soi/b4soiinit.c

@ -8,7 +8,7 @@
SPICEdev B4SOIinfo = { SPICEdev B4SOIinfo = {
{ "B4SOI", { "B4SOI",
"Berkeley SOI MOSFET model version 4.0",
"Berkeley SOI MOSFET model version 4.3",
&B4SOInSize, &B4SOInSize,
&B4SOInSize, &B4SOInSize,

16171
src/spicelib/devices/bsim3soi/b4soild.c
File diff suppressed because it is too large
View File

9
src/spicelib/devices/bsim3soi/b4soimask.c

@ -1,4 +1,5 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,6 +10,8 @@
* File: b4soimask.c * File: b4soimask.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"
@ -1229,10 +1232,10 @@ IFvalue *value)
value->iValue = model->B4SOIrgateMod; value->iValue = model->B4SOIrgateMod;
return(OK); return(OK);
case B4SOI_MOD_XRCRG1: case B4SOI_MOD_XRCRG1:
value->iValue = model->B4SOIxrcrg1;
value->rValue = model->B4SOIxrcrg1;
return(OK); return(OK);
case B4SOI_MOD_XRCRG2: case B4SOI_MOD_XRCRG2:
value->iValue = model->B4SOIxrcrg2;
value->rValue = model->B4SOIxrcrg2;
return(OK); return(OK);
case B4SOI_MOD_RSHG: case B4SOI_MOD_RSHG:
value->rValue = model->B4SOIrshg; value->rValue = model->B4SOIrshg;

5
src/spicelib/devices/bsim3soi/b4soimdel.c

@ -1,4 +1,5 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,6 +10,8 @@
* File: b4soimdel.c * File: b4soimdel.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"

30
src/spicelib/devices/bsim3soi/b4soimpar.c

@ -1,4 +1,5 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,6 +10,8 @@
* File: b4soimpar.c * File: b4soimpar.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"
@ -217,20 +220,21 @@ GENmodel *inMod)
case B4SOI_MOD_NPEAK: case B4SOI_MOD_NPEAK:
mod->B4SOInpeak = value->rValue; mod->B4SOInpeak = value->rValue;
mod->B4SOInpeakGiven = TRUE; mod->B4SOInpeakGiven = TRUE;
if (mod->B4SOInpeak > 1.0e20)
mod->B4SOInpeak *= 1.0e-6;
/* Bug # 22 Jul09 Proper limiting conditions are specified in the B4SOIcheck.c file*/
/* if (mod->B4SOInpeak > 1.0e20)
mod->B4SOInpeak *= 1.0e-6; */
break; break;
case B4SOI_MOD_NSD: case B4SOI_MOD_NSD:
mod->B4SOInsd = value->rValue; mod->B4SOInsd = value->rValue;
mod->B4SOInsdGiven = TRUE; mod->B4SOInsdGiven = TRUE;
if (mod->B4SOInsd > 1.0e23)
mod->B4SOInsd *= 1.0e-6;
/* if (mod->B4SOInsd > 1.0e23)
mod->B4SOInsd *= 1.0e-6; */ /* Bug # 22 Jul09 Proper limiting conditions are specified in the B4SOIcheck.c file*/
break; break;
case B4SOI_MOD_NGATE: case B4SOI_MOD_NGATE:
mod->B4SOIngate = value->rValue; mod->B4SOIngate = value->rValue;
mod->B4SOIngateGiven = TRUE; mod->B4SOIngateGiven = TRUE;
if (mod->B4SOIngate > 1.0e23)
mod->B4SOIngate *= 1.0e-6;
/* if (mod->B4SOIngate > 1.0e23)
mod->B4SOIngate *= 1.0e-6; */ /* Bug # 22 Jul09 Proper limiting conditions are specified in the B4SOIcheck.c file*/
break; break;
case B4SOI_MOD_GAMMA1: case B4SOI_MOD_GAMMA1:
mod->B4SOIgamma1 = value->rValue; mod->B4SOIgamma1 = value->rValue;
@ -428,6 +432,7 @@ case B4SOI_MOD_UD:
case B4SOI_MOD_PUCS: case B4SOI_MOD_PUCS:
mod->B4SOIpucs = value->rValue; mod->B4SOIpucs = value->rValue;
mod->B4SOIpucsGiven = TRUE; mod->B4SOIpucsGiven = TRUE;
break; /* Bug fix # 31 Jul09 */
case B4SOI_MOD_UCSTE: case B4SOI_MOD_UCSTE:
mod->B4SOIucste = value->rValue; mod->B4SOIucste = value->rValue;
mod->B4SOIucsteGiven = TRUE; mod->B4SOIucsteGiven = TRUE;
@ -659,8 +664,9 @@ case B4SOI_MOD_UD:
mod->B4SOIfgislGiven = TRUE; mod->B4SOIfgislGiven = TRUE;
break; break;
case B4SOI_MOD_FDMOD : case B4SOI_MOD_FDMOD :
mod->B4SOIfdMod = value->rValue;
mod->B4SOIfdModGiven = TRUE;
/* mod->B4SOIfdMod = value->rValue; v4.2 */
mod->B4SOIfdMod = value->iValue;
mod->B4SOIfdModGiven = TRUE;
break; break;
case B4SOI_MOD_VSCE : case B4SOI_MOD_VSCE :
mod->B4SOIvsce = value->rValue; mod->B4SOIvsce = value->rValue;
@ -1167,7 +1173,8 @@ case B4SOI_MOD_UD:
case B4SOI_MOD_RBDB : case B4SOI_MOD_RBDB :
mod->B4SOIrbdb = value->rValue; mod->B4SOIrbdb = value->rValue;
mod->B4SOIrbdbGiven = TRUE; mod->B4SOIrbdbGiven = TRUE;
case B4SOI_MOD_RBSB :
break; /* Bug fix # 31 Jul 09 */
case B4SOI_MOD_RBSB :
mod->B4SOIrbsb = value->rValue; mod->B4SOIrbsb = value->rValue;
mod->B4SOIrbsbGiven = TRUE; mod->B4SOIrbsbGiven = TRUE;
break; break;
@ -1402,7 +1409,8 @@ case B4SOI_MOD_UD:
case B4SOI_MOD_LODK2 : case B4SOI_MOD_LODK2 :
mod->B4SOIlodk2 = value->rValue; mod->B4SOIlodk2 = value->rValue;
mod->B4SOIlodk2Given = TRUE; mod->B4SOIlodk2Given = TRUE;
case B4SOI_MOD_STETA0 :
break; /* Bug fix # 31 Jul 09*/
case B4SOI_MOD_STETA0 :
mod->B4SOIsteta0 = value->rValue; mod->B4SOIsteta0 = value->rValue;
mod->B4SOIsteta0Given = TRUE; mod->B4SOIsteta0Given = TRUE;
break; break;

129
src/spicelib/devices/bsim3soi/b4soinoi.c

@ -1,4 +1,5 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,6 +10,8 @@
* File: b4soinoi.c * File: b4soinoi.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"
@ -60,7 +63,7 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
pParam = here->pParam; pParam = here->pParam;
cd = fabs(here->B4SOIcd); cd = fabs(here->B4SOIcd);
esat = 2.0 * pParam->B4SOIvsattemp / here->B4SOIueff;
esat = 2.0 * here->B4SOIvsattemp / here->B4SOIueff;
/* v2.2.3 bug fix */ /* v2.2.3 bug fix */
if(model->B4SOIem<=0.0) DelClm = 0.0; if(model->B4SOIem<=0.0) DelClm = 0.0;
else { else {
@ -79,7 +82,6 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
Nl = model->B4SOIcox * here->B4SOIVgsteff Nl = model->B4SOIcox * here->B4SOIVgsteff
* (1.0 - here->B4SOIAbovVgst2Vtm * here->B4SOIVdseff) / CHARGE; * (1.0 - here->B4SOIAbovVgst2Vtm * here->B4SOIVdseff) / CHARGE;
T3 = model->B4SOIoxideTrapDensityA T3 = model->B4SOIoxideTrapDensityA
* log(MAX(((N0 + here->B4SOInstar) / (Nl + here->B4SOInstar)), N_MINLOG)); * log(MAX(((N0 + here->B4SOInstar) / (Nl + here->B4SOInstar)), N_MINLOG));
T4 = model->B4SOIoxideTrapDensityB * (N0 - Nl); T4 = model->B4SOIoxideTrapDensityB * (N0 - Nl);
@ -122,6 +124,7 @@ double Ssi, Swi;
double npart_theta, npart_beta, igsquare, esat; double npart_theta, npart_beta, igsquare, esat;
/* v3.2 end */ /* v3.2 end */
double gspr, gdpr; double gspr, gdpr;
double tempRatioSH, Vdseffovcd; /* v4.2 bugfix */
int i; int i;
@ -218,8 +221,22 @@ int i;
case N_CALC: case N_CALC:
switch (mode) switch (mode)
{ case N_DENS: { case N_DENS:
if (model->B4SOItnoiMod == 0) /* v4.0 */
{ if (model->B4SOIrdsMod == 0)
/*v4.2 implementing SH temp */
if ((model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0))
tempRatioSH = here->B4SOITempSH / ckt->CKTtemp;
else
tempRatioSH = 1.0;
/*v4.2 implementing limit on Vdseffovcd*/
if (here->B4SOIcd != 0)
{
Vdseffovcd = here->B4SOIVdseff / here->B4SOIcd;
if (Vdseffovcd >= 1.0e9) Vdseffovcd = 1.0e9 ;
}
else
Vdseffovcd = 1.0e9;
/* if (model->B4SOItnoiMod == 0) */ /* v4.0 */ /* v4.2 bugfix: consider tnoiMod = 2*/
if (model->B4SOItnoiMod != 1)
{ if (model->B4SOIrdsMod == 0)
{ gspr = here->B4SOIsourceConductance; { gspr = here->B4SOIsourceConductance;
gdpr = here->B4SOIdrainConductance; gdpr = here->B4SOIdrainConductance;
} }
@ -230,8 +247,8 @@ int i;
} }
else else
{ {
esat = 2.0 * pParam->B4SOIvsattemp / here->B4SOIueff;
T5 = here->B4SOIVgsteff / esat
esat = 2.0 * here->B4SOIvsattemp / here->B4SOIueff;
T5 = here->B4SOIVgsteff / esat
/ pParam->B4SOIleff; / pParam->B4SOIleff;
T5 *= T5; T5 *= T5;
npart_beta = model->B4SOIrnoia * (1.0 + npart_beta = model->B4SOIrnoia * (1.0 +
@ -241,6 +258,13 @@ int i;
T5 * model->B4SOItnoib * T5 * model->B4SOItnoib *
pParam->B4SOIleff); pParam->B4SOIleff);
/* v4.2 bugfix: implement bugfix from bsim4.6.2 */
if(npart_theta > 0.9)
npart_theta = 0.9;
if(npart_theta > 0.9 * npart_beta)
npart_theta = 0.9 * npart_beta;
if (model->B4SOIrdsMod == 0) if (model->B4SOIrdsMod == 0)
{ gspr = here->B4SOIsourceConductance; { gspr = here->B4SOIsourceConductance;
gdpr = here->B4SOIdrainConductance; gdpr = here->B4SOIdrainConductance;
@ -263,27 +287,39 @@ int i;
NevalSrc(&noizDens[B4SOIRDNOIZ], NevalSrc(&noizDens[B4SOIRDNOIZ],
&lnNdens[B4SOIRDNOIZ], ckt, THERMNOISE, &lnNdens[B4SOIRDNOIZ], ckt, THERMNOISE,
here->B4SOIdNodePrime, here->B4SOIdNode, here->B4SOIdNodePrime, here->B4SOIdNode,
gdpr * here->B4SOIm);
gdpr * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
NevalSrc(&noizDens[B4SOIRSNOIZ], NevalSrc(&noizDens[B4SOIRSNOIZ],
&lnNdens[B4SOIRSNOIZ], ckt, THERMNOISE, &lnNdens[B4SOIRSNOIZ], ckt, THERMNOISE,
here->B4SOIsNodePrime, here->B4SOIsNode, here->B4SOIsNodePrime, here->B4SOIsNode,
gspr * here->B4SOIm);
gspr * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
if ((here->B4SOIrgateMod == 1) ||
(here->B4SOIrgateMod == 2))
/* v4.2 bugfix: implement correct thermal noise model (bsim4.6.0)*/
/* if ((here->B4SOIrgateMod == 1) ||
(here->B4SOIrgateMod == 2)) */
if (here->B4SOIrgateMod == 1)
{ NevalSrc(&noizDens[B4SOIRGNOIZ], { NevalSrc(&noizDens[B4SOIRGNOIZ],
&lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE, &lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE,
here->B4SOIgNode, here->B4SOIgNode,
here->B4SOIgNodeExt, here->B4SOIgNodeExt,
here->B4SOIgrgeltd);
here->B4SOIgrgeltd * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
}
else if (here->B4SOIrgateMod == 2) /*v4.2*/
{
T0 = 1.0 + here->B4SOIgrgeltd/here->B4SOIgcrg;
T1 = T0 * T0;
NevalSrc(&noizDens[B4SOIRGNOIZ],
&lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE,
here->B4SOIgNode,
here->B4SOIgNodeExt,
here->B4SOIgrgeltd/T1 * tempRatioSH * here->B4SOIm); /*v4.2*/
} }
else if (here->B4SOIrgateMod == 3) else if (here->B4SOIrgateMod == 3)
{ NevalSrc(&noizDens[B4SOIRGNOIZ], { NevalSrc(&noizDens[B4SOIRGNOIZ],
&lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE, &lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE,
here->B4SOIgNodeMid, here->B4SOIgNodeMid,
here->B4SOIgNodeExt, here->B4SOIgNodeExt,
here->B4SOIgrgeltd);
here->B4SOIgrgeltd * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
} }
else else
{ noizDens[B4SOIRGNOIZ] = 0.0; { noizDens[B4SOIRGNOIZ] = 0.0;
@ -297,11 +333,11 @@ int i;
NevalSrc(&noizDens[B4SOIRBSBNOIZ], NevalSrc(&noizDens[B4SOIRBSBNOIZ],
&lnNdens[B4SOIRBSBNOIZ], ckt, THERMNOISE, &lnNdens[B4SOIRBSBNOIZ], ckt, THERMNOISE,
here->B4SOIbNode, here->B4SOIsbNode, here->B4SOIbNode, here->B4SOIsbNode,
here->B4SOIgrbsb);
here->B4SOIgrbsb * here->B4SOIm);
NevalSrc(&noizDens[B4SOIRBDBNOIZ], NevalSrc(&noizDens[B4SOIRBDBNOIZ],
&lnNdens[B4SOIRBDBNOIZ], ckt, THERMNOISE, &lnNdens[B4SOIRBDBNOIZ], ckt, THERMNOISE,
here->B4SOIbNode, here->B4SOIdbNode, here->B4SOIbNode, here->B4SOIdbNode,
here->B4SOIgrbdb);
here->B4SOIgrbdb * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
} }
else else
{ noizDens[B4SOIRBSBNOIZ] = 0.0; { noizDens[B4SOIRBSBNOIZ] = 0.0;
@ -317,15 +353,15 @@ int i;
NevalSrc(&noizDens[B4SOIRBODYNOIZ], NevalSrc(&noizDens[B4SOIRBODYNOIZ],
&lnNdens[B4SOIRBODYNOIZ], ckt, THERMNOISE, &lnNdens[B4SOIRBODYNOIZ], ckt, THERMNOISE,
here->B4SOIbNode, here->B4SOIpNode, here->B4SOIbNode, here->B4SOIpNode,
1/ (here->B4SOIrbodyext +
pParam->B4SOIrbody));
tempRatioSH / (here->B4SOIrbodyext + /* v4.2 self-heating temp */
pParam->B4SOIrbody) * here->B4SOIm);
} }
else else
{ noizDens[B4SOIRBODYNOIZ] = 0.0; { noizDens[B4SOIRBODYNOIZ] = 0.0;
lnNdens[B4SOIRBODYNOIZ] = lnNdens[B4SOIRBODYNOIZ] =
log(MAX(noizDens[B4SOIRBODYNOIZ], N_MINLOG)); log(MAX(noizDens[B4SOIRBODYNOIZ], N_MINLOG));
} }
switch( model->B4SOItnoiMod ) switch( model->B4SOItnoiMod )
{ {
case 0: case 0:
@ -341,7 +377,8 @@ int i;
+ here->B4SOIueff*fabs + here->B4SOIueff*fabs
(here->B4SOIqinv) (here->B4SOIqinv)
* here->B4SOIrds))) * here->B4SOIrds)))
* model->B4SOIntnoi );
* tempRatioSH /* v4.2 self-heating temp */
* model->B4SOIntnoi * here->B4SOIm);
break; break;
/* v2.2.3 bug fix */ /* v2.2.3 bug fix */
@ -349,7 +386,7 @@ int i;
T0 = here->B4SOIgm + here->B4SOIgmbs + T0 = here->B4SOIgm + here->B4SOIgmbs +
here->B4SOIgds; here->B4SOIgds;
T0 *= T0; T0 *= T0;
esat = 2.0 * pParam->B4SOIvsattemp /
esat = 2.0 * here->B4SOIvsattemp /
here->B4SOIueff; here->B4SOIueff;
T5 = here->B4SOIVgsteff / esat / T5 = here->B4SOIVgsteff / esat /
pParam->B4SOIleff; pParam->B4SOIleff;
@ -360,20 +397,20 @@ int i;
npart_theta = model->B4SOIrnoib * (1.0 + npart_theta = model->B4SOIrnoib * (1.0 +
T5 * model->B4SOItnoib * T5 * model->B4SOItnoib *
pParam->B4SOIleff); pParam->B4SOIleff);
igsquare = npart_theta * npart_theta *
T0 * here->B4SOIVdseff /
here->B4SOIcd;
/*igsquare = npart_theta * npart_theta *
T0 * here->B4SOIVdseff / here->B4SOIcd; v4.2 implementing limit on Vdseffovcd*/
igsquare = npart_theta * npart_theta * T0 * Vdseffovcd;
T1 = npart_beta * (here->B4SOIgm T1 = npart_beta * (here->B4SOIgm
+ here->B4SOIgmbs) + here->B4SOIgds; + here->B4SOIgmbs) + here->B4SOIgds;
T2 = T1 * T1 * here->B4SOIVdseff /
here->B4SOIcd;
/*T2 = T1 * T1 * here->B4SOIVdseff / here->B4SOIcd; v4.2 implementing limit on Vdseffovcd*/
T2 = T1 * T1 * Vdseffovcd;
NevalSrc(&noizDens[B4SOIIDNOIZ], NevalSrc(&noizDens[B4SOIIDNOIZ],
&lnNdens[B4SOIIDNOIZ], ckt, &lnNdens[B4SOIIDNOIZ], ckt,
THERMNOISE, THERMNOISE,
here->B4SOIdNodePrime, here->B4SOIdNodePrime,
here->B4SOIsNodePrime, here->B4SOIsNodePrime,
(T2 - igsquare));
/* (T2 - igsquare)); */
(T2 - igsquare) * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
break; break;
case 2: case 2:
@ -383,9 +420,10 @@ int i;
here->B4SOIdNodePrime, here->B4SOIdNodePrime,
here->B4SOIsNodePrime, here->B4SOIsNodePrime,
model->B4SOIntnoi * model->B4SOIntnoi *
tempRatioSH * /* v4.2 self-heating temp */
(2.0 / 3.0 * fabs(here->B4SOIgm (2.0 / 3.0 * fabs(here->B4SOIgm
+ here->B4SOIgds + here->B4SOIgds
+ here->B4SOIgmbs)));
+ here->B4SOIgmbs)) * here->B4SOIm);
break; break;
} }
@ -423,13 +461,23 @@ int i;
{ vds = -vds; { vds = -vds;
vgs = vgs + vds; vgs = vgs + vds;
} }
Ssi = B4SOIEval1ovFNoise(vds, model, here,
data->freq, ckt->CKTtemp);
T10 = model->B4SOIoxideTrapDensityA
* CONSTboltz * ckt->CKTtemp;
T11 = pParam->B4SOIweff * here->B4SOInf
/*v4.2 implementing SH temp */
if ((model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0))
Ssi = B4SOIEval1ovFNoise(vds, model, here,
data->freq, here->B4SOITempSH);
else
Ssi = B4SOIEval1ovFNoise(vds, model, here,
data->freq, ckt->CKTtemp); /*v4.2 implementing SH temp */
/*v4.2 implementing SH temp */
if ((model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0))
T10 = model->B4SOIoxideTrapDensityA
* CONSTboltz * here->B4SOITempSH;
else
T10 = model->B4SOIoxideTrapDensityA
* CONSTboltz * ckt->CKTtemp; /*v4.2 implementing SH temp */
T11 = pParam->B4SOIweff * here->B4SOInf
* pParam->B4SOIleff * pParam->B4SOIleff
* pow(data->freq, model->B4SOIef) * pow(data->freq, model->B4SOIef)
* 1.0e10 * here->B4SOInstar * 1.0e10 * here->B4SOInstar
@ -476,12 +524,17 @@ int i;
here->B4SOIsNodePrime, here->B4SOIbNode, here->B4SOIsNodePrime, here->B4SOIbNode,
model->B4SOInoif * here->B4SOIibs * here->B4SOIm); model->B4SOInoif * here->B4SOIibs * here->B4SOIm);
NevalSrc(&noizDens[B4SOIFB_IBDNOIZ],
/* NevalSrc(&noizDens[B4SOIFB_IBDNOIZ],
&lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE, &lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE,
here->B4SOIdNodePrime, here->B4SOIbNode, here->B4SOIdNodePrime, here->B4SOIbNode,
model->B4SOInoif * fabs(here->B4SOIibd) * here->B4SOIm);
model->B4SOInoif * fabs(here->B4SOIibd)); */ /*v4.2*/
noizDens[B4SOITOTNOIZ] = noizDens[B4SOIRDNOIZ]
NevalSrc(&noizDens[B4SOIFB_IBDNOIZ],
&lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE,
here->B4SOIdNodePrime, here->B4SOIbNode,
model->B4SOInoif * (here->B4SOIibd) * here->B4SOIm); /*v4.2 extra fabs()removed */
noizDens[B4SOITOTNOIZ] = noizDens[B4SOIRDNOIZ]
+ noizDens[B4SOIRSNOIZ] + noizDens[B4SOIRSNOIZ]
+ noizDens[B4SOIRGNOIZ] + noizDens[B4SOIRGNOIZ]
+ noizDens[B4SOIIDNOIZ] + noizDens[B4SOIIDNOIZ]

9
src/spicelib/devices/bsim3soi/b4soipar.c

@ -1,4 +1,5 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,6 +10,8 @@
* File: b4soipar.c * File: b4soipar.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"
@ -208,15 +211,19 @@ IFvalue *select)
case 5: case 5:
here->B4SOIicVPS = *(value->v.vec.rVec+4); here->B4SOIicVPS = *(value->v.vec.rVec+4);
here->B4SOIicVPSGiven = TRUE; here->B4SOIicVPSGiven = TRUE;
break; /* v4.2 bugfix */
case 4: case 4:
here->B4SOIicVES = *(value->v.vec.rVec+3); here->B4SOIicVES = *(value->v.vec.rVec+3);
here->B4SOIicVESGiven = TRUE; here->B4SOIicVESGiven = TRUE;
break; /* v4.2 bugfix */
case 3: case 3:
here->B4SOIicVBS = *(value->v.vec.rVec+2); here->B4SOIicVBS = *(value->v.vec.rVec+2);
here->B4SOIicVBSGiven = TRUE; here->B4SOIicVBSGiven = TRUE;
break; /* v4.2 bugfix */
case 2: case 2:
here->B4SOIicVGS = *(value->v.vec.rVec+1); here->B4SOIicVGS = *(value->v.vec.rVec+1);
here->B4SOIicVGSGiven = TRUE; here->B4SOIicVGSGiven = TRUE;
break; /* v4.2 bugfix */
case 1: case 1:
here->B4SOIicVDS = *(value->v.vec.rVec); here->B4SOIicVDS = *(value->v.vec.rVec);
here->B4SOIicVDSGiven = TRUE; here->B4SOIicVDSGiven = TRUE;

29
src/spicelib/devices/bsim3soi/b4soipzld.c

@ -1,4 +1,5 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,6 +10,8 @@
* File: b4soipzld.c * File: b4soipzld.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"
@ -37,7 +40,7 @@ double m;
for (; model != NULL; model = model->B4SOInextModel) for (; model != NULL; model = model->B4SOInextModel)
{ for (here = model->B4SOIinstances; here!= NULL; { for (here = model->B4SOIinstances; here!= NULL;
here = here->B4SOInextInstance) here = here->B4SOInextInstance)
{
{
if (here->B4SOImode >= 0) if (here->B4SOImode >= 0)
{ {
@ -45,9 +48,9 @@ double m;
continue; continue;
Gm = here->B4SOIgm; Gm = here->B4SOIgm;
Gmbs = here->B4SOIgmbs;
FwdSum = Gm + Gmbs;
RevSum = 0.0;
Gmbs = here->B4SOIgmbs;
FwdSum = Gm + Gmbs;
RevSum = 0.0;
cggb = here->B4SOIcggb; cggb = here->B4SOIcggb;
cgsb = here->B4SOIcgsb; cgsb = here->B4SOIcgsb;
cgdb = here->B4SOIcgdb; cgdb = here->B4SOIcgdb;
@ -60,11 +63,11 @@ double m;
cdsb = here->B4SOIcdsb; cdsb = here->B4SOIcdsb;
cddb = here->B4SOIcddb; cddb = here->B4SOIcddb;
} }
else
{ Gm = -here->B4SOIgm;
Gmbs = -here->B4SOIgmbs;
FwdSum = 0.0;
RevSum = -Gm - Gmbs;
else
{ Gm = -here->B4SOIgm;
Gmbs = -here->B4SOIgmbs;
FwdSum = 0.0;
RevSum = -Gm - Gmbs;
cggb = here->B4SOIcggb; cggb = here->B4SOIcggb;
cgsb = here->B4SOIcgdb; cgsb = here->B4SOIcgdb;
cgdb = here->B4SOIcgsb; cgdb = here->B4SOIcgsb;
@ -86,10 +89,10 @@ double m;
capbd= here->B4SOIcapbd; capbd= here->B4SOIcapbd;
capbs= here->B4SOIcapbs; capbs= here->B4SOIcapbs;
#endif #endif
GSoverlapCap = here->B4SOIcgso;
GDoverlapCap = here->B4SOIcgdo;
GSoverlapCap = here->B4SOIcgso;
GDoverlapCap = here->B4SOIcgdo;
#ifdef BULKCODE #ifdef BULKCODE
GBoverlapCap = here->pParam->B4SOIcgbo;
GBoverlapCap = here->pParam->B4SOIcgbo;
#endif #endif
xcdgb = (cdgb - GDoverlapCap); xcdgb = (cdgb - GDoverlapCap);

29
src/spicelib/devices/bsim3soi/b4soiset.c

@ -1,4 +1,5 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,6 +10,8 @@
* File: b4soiset.c * File: b4soiset.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"
@ -61,11 +64,14 @@ double Vbs0t, Qsi;
model->B4SOIparamChk = 0; model->B4SOIparamChk = 0;
if (!model->B4SOIcapModGiven) if (!model->B4SOIcapModGiven)
model->B4SOIcapMod = 2; model->B4SOIcapMod = 2;
if (!model->B4SOIiiiModGiven) /* Bug fix #7 Jun 09 'iiimod' with default value added */
model->B4SOIiiiMod = 0;
if (!model->B4SOImtrlModGiven) if (!model->B4SOImtrlModGiven)
model->B4SOImtrlMod = 0; /*4.1*/ model->B4SOImtrlMod = 0; /*4.1*/
if (!model->B4SOIvgstcvModGiven) if (!model->B4SOIvgstcvModGiven)
model->B4SOIvgstcvMod = 0;
/*model->B4SOIvgstcvMod = 0; v4.2 Bugfix */
model->B4SOIvgstcvMod = 1;
if (!model->B4SOIgidlModGiven) if (!model->B4SOIgidlModGiven)
model->B4SOIgidlMod = 0; model->B4SOIgidlMod = 0;
if (!model->B4SOIeotGiven) if (!model->B4SOIeotGiven)
@ -307,7 +313,8 @@ double Vbs0t, Qsi;
if (!model->B4SOIwudGiven) if (!model->B4SOIwudGiven)
model->B4SOIwud = 0.0; model->B4SOIwud = 0.0;
if (!model->B4SOIpudGiven) if (!model->B4SOIpudGiven)
model->B4SOIpud1 = 0.0;
/* model->B4SOIpud1 = 0.0; */ /*Bug fix # 33 Jul 09 */
model->B4SOIpud = 0.0;
if (!model->B4SOIud1Given) if (!model->B4SOIud1Given)
model->B4SOIud1 = 0.0; model->B4SOIud1 = 0.0;
if (!model->B4SOIlud1Given) if (!model->B4SOIlud1Given)
@ -422,7 +429,7 @@ double Vbs0t, Qsi;
if (!model->B4SOIbgidlGiven) if (!model->B4SOIbgidlGiven)
model->B4SOIbgidl = 2.3e9; /* v4.0 */ model->B4SOIbgidl = 2.3e9; /* v4.0 */
if (!model->B4SOIcgidlGiven) /* v4.0 */ if (!model->B4SOIcgidlGiven) /* v4.0 */
model->B4SOIcgidl = 0.0;
model->B4SOIcgidl = 0.5; /* v4.2 default value changed from 0 to 0.5 */
if (!model->B4SOIrgidlGiven) /* v4.1 */ if (!model->B4SOIrgidlGiven) /* v4.1 */
model->B4SOIrgidl = 1.0; model->B4SOIrgidl = 1.0;
if (!model->B4SOIkgidlGiven) /* v4.1 */ if (!model->B4SOIkgidlGiven) /* v4.1 */
@ -2041,8 +2048,7 @@ double Vbs0t, Qsi;
model->B4SOIvsce = 0.0; model->B4SOIvsce = 0.0;
if (!model->B4SOIcdsbsGiven) if (!model->B4SOIcdsbsGiven)
model->B4SOIcdsbs = 0.0; model->B4SOIcdsbs = 0.0;
if (!model->B4SOIminvcvGiven) /* v4.1 for Vgsteffcv */
if (!model->B4SOIminvcvGiven) /* v4.1 for Vgsteffcv */
model->B4SOIminvcv = 0.0; model->B4SOIminvcv = 0.0;
if (!model->B4SOIlminvcvGiven) /* v4.1 for Vgsteffcv */ if (!model->B4SOIlminvcvGiven) /* v4.1 for Vgsteffcv */
model->B4SOIlminvcv = 0.0; model->B4SOIlminvcv = 0.0;
@ -2051,7 +2057,8 @@ double Vbs0t, Qsi;
if (!model->B4SOIpminvcvGiven) /* v4.1 for Vgsteffcv */ if (!model->B4SOIpminvcvGiven) /* v4.1 for Vgsteffcv */
model->B4SOIpminvcv = 0.0; model->B4SOIpminvcv = 0.0;
if (!model->B4SOIvoffcvGiven) if (!model->B4SOIvoffcvGiven)
model->B4SOIvoffcv = -0.08;
/*model->B4SOIvoffcv = -0.08; v4.2 */
model->B4SOIvoffcv = 0.0;
if (!model->B4SOIlvoffcvGiven) if (!model->B4SOIlvoffcvGiven)
model->B4SOIlvoffcv = 0.0; model->B4SOIlvoffcv = 0.0;
if (!model->B4SOIwvoffcvGiven) if (!model->B4SOIwvoffcvGiven)
@ -2103,10 +2110,8 @@ double Vbs0t, Qsi;
here->B4SOIsourceSquares = 1; here->B4SOIsourceSquares = 1;
if (!here->B4SOIwGiven) if (!here->B4SOIwGiven)
here->B4SOIw = 5e-6; here->B4SOIw = 5e-6;
if (!here->B4SOImGiven) if (!here->B4SOImGiven)
here->B4SOIm = 1;
here->B4SOIm = 1;
/* v2.0 release */ /* v2.0 release */
if (!here->B4SOInbcGiven) if (!here->B4SOInbcGiven)
here->B4SOInbc = 0; here->B4SOInbc = 0;
@ -2657,7 +2662,9 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
} }
int int
B4SOIunsetup(GENmodel *inModel, CKTcircuit *ckt)
B4SOIunsetup(
GENmodel *inModel,
CKTcircuit *ckt)
{ {
#ifndef HAS_BATCHSIM #ifndef HAS_BATCHSIM
B4SOImodel *model; B4SOImodel *model;

3992
src/spicelib/devices/bsim3soi/b4soitemp.c
File diff suppressed because it is too large
View File

5
src/spicelib/devices/bsim3soi/b4soitrunc.c

@ -1,4 +1,5 @@
/*** B4SOI 03/06/2009 Wenwei Yang Release ***/
/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/
/********** /**********
* Copyright 2009 Regents of the University of California. All rights reserved. * Copyright 2009 Regents of the University of California. All rights reserved.
@ -9,6 +10,8 @@
* File: b4soitrunc.c * File: b4soitrunc.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Hui Wan, Xuemei Xi 11/30/2005
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
* Modified by Tanvir Morshed 09/22/2009
* Modified by Tanvir Morshed 12/31/2009
**********/ **********/
#include "ngspice.h" #include "ngspice.h"

4
tests/bsim3soi/inv_dc.cir

@ -1,8 +1,8 @@
B4SOI Drain Gate Source Back-gate(substrate) Body Tx W L (body ommitted for FB) B4SOI Drain Gate Source Back-gate(substrate) Body Tx W L (body ommitted for FB)
* Modified by Darsen Lu 03/11/2009 * Modified by Darsen Lu 03/11/2009
.include ./nmos4p1.mod
.include ./pmos4p1.mod
.include ./nmos4p3.mod
.include ./pmos4p3.mod
.option TEMP=27C noacct .option TEMP=27C noacct
Vpower VD 0 1.5 Vpower VD 0 1.5

4
tests/bsim3soi/inv_tr.cir

@ -1,8 +1,8 @@
B4SOI Drain Gate Source Back-gate(substrate) Body Tx W L (body ommitted for FB) B4SOI Drain Gate Source Back-gate(substrate) Body Tx W L (body ommitted for FB)
* Modified by Darsen Lu 03/11/2009 * Modified by Darsen Lu 03/11/2009
.include ./nmos4p1.mod
.include ./pmos4p1.mod
.include ./nmos4p3.mod
.include ./pmos4p3.mod
.option TEMP=27C noacct .option TEMP=27C noacct
Vpower VD 0 1.5 Vpower VD 0 1.5

2
tests/bsim3soi/nmos4p1.mod → tests/bsim3soi/nmos4p3.mod

@ -1,4 +1,4 @@
* BSIMSOI4.1 example modelcard
* BSIMSOI4.3 example modelcard
.Model N1 NMOS Level= 10 .Model N1 NMOS Level= 10
+MOBMOD = 2 SHMOD = 0 CAPMOD = 2 +MOBMOD = 2 SHMOD = 0 CAPMOD = 2

2
tests/bsim3soi/pmos4p1.mod → tests/bsim3soi/pmos4p3.mod

@ -1,4 +1,4 @@
*BSIMSOI4.1 example modelcard
*BSIMSOI4.3 example modelcard
.Model P1 PMOS Level= 10 .Model P1 PMOS Level= 10
+MOBMOD = 2 SHMOD = 0 CAPMOD = 2 +MOBMOD = 2 SHMOD = 0 CAPMOD = 2

4
tests/bsim3soi/ring51_41.cir

@ -16,8 +16,8 @@ cout buf ss 1pF
*.option itl1=1000 itl4=20 temp=85 gmin=1e-15 abstol=1e-12 reltol=1e-4 *.option itl1=1000 itl4=20 temp=85 gmin=1e-15 abstol=1e-12 reltol=1e-4
.tran 0.2n 10n .tran 0.2n 10n
.print tran v(out25) v(out50) .print tran v(out25) v(out50)
.include nmos4p1.mod
.include pmos4p1.mod
.include nmos4p3.mod
.include pmos4p3.mod
.subckt inv1 dd ss sub in out .subckt inv1 dd ss sub in out

7
tests/bsim3soi/test1.cir

@ -5,7 +5,7 @@
.option ingold=1 .option ingold=1
.option gmin=0 .option gmin=0
m1 d g s 0 p n1 w=1u l=0.1u soimod=0
m1 d g s b p n1 w=1u l=0.1u soimod=0
+NF=1 +NF=1
+SA=0.31u SB=0.2u SD=0.1u +SA=0.31u SB=0.2u SD=0.1u
@ -13,9 +13,10 @@ vg g 0 1.2
vd d 0 1.2 vd d 0 1.2
vs s 0 0.0 vs s 0 0.0
vp p 0 0.0 vp p 0 0.0
vb b 0 0.0
.dc vd 0 1.2 0.01 vg 0.2 1.2 0.1 .dc vd 0 1.2 0.01 vg 0.2 1.2 0.1
.include ./nmos4p1.mod
.print dc i(vd)
.include ./nmos4p3.mod
.print dc i(vd) i(vs)
.end .end

2662
tests/bsim3soi/test1.out
File diff suppressed because it is too large
View File

2
tests/bsim3soi/test2.cir

@ -14,7 +14,7 @@ vs s 0 0.0
vp p 0 0.0 vp p 0 0.0
.dc vd 0 1.2 0.02 vg 0.4 1.2 0.1 .dc vd 0 1.2 0.02 vg 0.4 1.2 0.1
.include ./nmos4p1.mod
.include ./nmos4p3.mod
.print dc i(vd) .print dc i(vd)
.end .end

2
tests/bsim3soi/test3.cir

@ -14,7 +14,7 @@ vs s 0 0.0
vp p 0 0.0 vp p 0 0.0
.dc vg 0 1.2 0.02 vd 0.05 1.2 0.5 .dc vg 0 1.2 0.02 vd 0.05 1.2 0.5
.include ./nmos4p1.mod
.include ./nmos4p3.mod
.print dc i(vd) .print dc i(vd)
.end .end

2
tests/bsim3soi/test4.cir

@ -14,7 +14,7 @@ vs s 0 0.0
vp p 0 0.0 vp p 0 0.0
.dc vg 0 1.2 0.02 vd 0.05 1.2 0.5 .dc vg 0 1.2 0.02 vd 0.05 1.2 0.5
.include ./nmos4p1.mod
.include ./nmos4p3.mod
.print dc i(vd) .print dc i(vd)
.end .end

2
tests/bsim3soi/test5.cir

@ -14,7 +14,7 @@ vs s 0 0.0
vp p 0 0.0 vp p 0 0.0
.dc vd 0 -1.2 -0.02 vg -0.4 -1.2 -0.1 .dc vd 0 -1.2 -0.02 vg -0.4 -1.2 -0.1
.include ./pmos4p1.mod
.include ./pmos4p3.mod
.print dc i(vd) .print dc i(vd)
.end .end

2
tests/bsim3soi/test6.cir

@ -14,7 +14,7 @@ vs s 0 0.0
vp p 0 0.0 vp p 0 0.0
.dc vd 0 -1.2 -0.02 vg -0.4 -1.2 -0.1 .dc vd 0 -1.2 -0.02 vg -0.4 -1.2 -0.1
.include ./pmos4p1.mod
.include ./pmos4p3.mod
.print dc i(vd) .print dc i(vd)
.end .end

2
tests/bsim3soi/test7.cir

@ -14,7 +14,7 @@ vs s 0 0.0
vp p 0 0.0 vp p 0 0.0
.dc vg 0 -1.2 -0.02 vd -0.05 -1.2 -0.5 .dc vg 0 -1.2 -0.02 vd -0.05 -1.2 -0.5
.include ./pmos4p1.mod
.include ./pmos4p3.mod
.print dc i(vd) .print dc i(vd)
.end .end

2
tests/bsim3soi/test8.cir

@ -14,7 +14,7 @@ vs s 0 0.0
vp p 0 0.0 vp p 0 0.0
.dc vg 0 -1.2 -0.02 vd -0.05 -1.2 -0.5 .dc vg 0 -1.2 -0.02 vd -0.05 -1.2 -0.5
.include ./pmos4p1.mod
.include ./pmos4p3.mod
.print dc i(vd) .print dc i(vd)
.end .end
Loading…
Cancel
Save