Browse Source

update to 4.3

pre-master-46
dwarning 16 years ago
parent
commit
278f3c64fd
  1. 45
      src/spicelib/devices/bsim3soi/b4soi.c
  2. 5
      src/spicelib/devices/bsim3soi/b4soiacld.c
  3. 5
      src/spicelib/devices/bsim3soi/b4soiask.c
  4. 120
      src/spicelib/devices/bsim3soi/b4soicheck.c
  5. 5
      src/spicelib/devices/bsim3soi/b4soicvtest.c
  6. 37
      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. 1005
      src/spicelib/devices/bsim3soi/b4soild.c
  13. 9
      src/spicelib/devices/bsim3soi/b4soimask.c
  14. 5
      src/spicelib/devices/bsim3soi/b4soimdel.c
  15. 24
      src/spicelib/devices/bsim3soi/b4soimpar.c
  16. 111
      src/spicelib/devices/bsim3soi/b4soinoi.c
  17. 9
      src/spicelib/devices/bsim3soi/b4soipar.c
  18. 5
      src/spicelib/devices/bsim3soi/b4soipzld.c
  19. 25
      src/spicelib/devices/bsim3soi/b4soiset.c
  20. 234
      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

45
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.
@ -9,9 +11,10 @@
* File: b4soi.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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 "devdefs.h"
#include "b4soidef.h"
@ -76,7 +79,7 @@ OP( "debug3", B4SOI_DEBUG3, IF_REAL, "DebugOut3"),
#endif
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( "cth0", B4SOI_CTH0, IF_REAL, "Instance Thermal Capacitance"),
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( "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( "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"),
@ -622,6 +625,9 @@ IOP( "leu", B4SOI_MOD_LEU, IF_REAL, " Length dependence of eu"),
IOP( "lua", B4SOI_MOD_LUA, IF_REAL, "Length dependence of ua"),
IOP( "lub", B4SOI_MOD_LUB, IF_REAL, "Length dependence of ub"),
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( "lucs", B4SOI_MOD_LUCS, IF_REAL, "Length dependence of lucs"),
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( "lalpha0", B4SOI_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"),
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( "lbeta1", B4SOI_MOD_LBETA1, IF_REAL, "Length dependence of beta1"),
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( "ldelvt", B4SOI_MOD_LDELVT, IF_REAL, "Length dependence of delvt"),
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 */
/* 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( "wpigcd", B4SOI_MOD_WPIGCD, IF_REAL, "Width dependence for pigcd"),
IOP( "wpoxedge", B4SOI_MOD_WPOXEDGE, IF_REAL, "Width dependence for poxedge"),
IOP( "wnch", B4SOI_MOD_WNPEAK, IF_REAL, "Width dependence of nch"),
IOP( "wnsub", B4SOI_MOD_WNSUB, IF_REAL, "Width dependence of nsub"),
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( "wub", B4SOI_MOD_WUB, IF_REAL, "Width dependence of ub"),
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( "wucs", B4SOI_MOD_WUCS, IF_REAL, "Width dependence of ucs"),
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( "walpha0", B4SOI_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"),
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( "wbeta1", B4SOI_MOD_WBETA1, IF_REAL, "Width dependence of beta1"),
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( "wdelvt", B4SOI_MOD_WDELVT, IF_REAL, "Width dependence of delvt"),
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 */
/* v3.1 added for RF */
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*/
@ -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( "pub", B4SOI_MOD_PUB, IF_REAL, "Cross-term dependence of ub"),
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( "pucs", B4SOI_MOD_PUCS, IF_REAL, "Cross-term dependence of ucs"),
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( "palpha0", B4SOI_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"),
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( "pbeta1", B4SOI_MOD_PBETA1, IF_REAL, "Cross-term dependence of beta1"),
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( "pdelvt", B4SOI_MOD_PDELVT, IF_REAL, "Cross-term dependence of delvt"),
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 */
/* v3.1 added for RF */
@ -1083,7 +1108,7 @@ char *B4SOInames[] = {
"Gate",
"Source",
"Backgate",
"Body_ext",
"",
"Body",
"Temp",
"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.
@ -9,6 +10,8 @@
* File: b4soiacld.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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"

5
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.
@ -9,6 +10,8 @@
* File: b4soiask.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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"

120
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.
@ -9,6 +10,8 @@
* File: b4soicheck.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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"
@ -328,7 +331,46 @@ FILE *fplog;
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)
{
@ -410,7 +452,22 @@ FILE *fplog;
{ fprintf(fplog, "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 */
if (pParam->B4SOInfactor < 0.0)
{ fprintf(fplog, "Warning: Nfactor = %g is negative.\n",
@ -621,27 +678,6 @@ FILE *fplog;
}
/* 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 */
if (model->B4SOIwth0 < 0.0)
{ fprintf(fplog, "Warning: WTH0 = %g is negative.\n",
@ -658,12 +694,6 @@ FILE *fplog;
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)
{ fprintf(fplog, "Warning: EBG = %g is negative.\n",
model->B4SOIebg);
@ -709,23 +739,11 @@ FILE *fplog;
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)
{ fprintf(fplog, "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 */
if (model->B4SOIk1w1 < 0.0)
@ -843,7 +861,7 @@ FILE *fplog;
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",
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",
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 */
/*
@ -863,7 +881,7 @@ FILE *fplog;
}
*/
if (model->B4SOItcjswg < 0.0)
/* if (model->B4SOItcjswg < 0.0)
{ fprintf(fplog, "Warning: TCJSWGS = %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",
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))
{ fprintf(fplog, "Warning: ACDE = %g is out of range.\n",
model->B4SOIacde);
@ -950,8 +968,10 @@ FILE *fplog;
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)
{ fprintf(fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n",
pParam->B4SOIxj, model->B4SOItsi);
@ -962,6 +982,10 @@ FILE *fplog;
if (model->B4SOIcapMod < 2)
{ fprintf(fplog, "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 */

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.
@ -9,6 +10,8 @@
* File: b4soicvtest.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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"

37
src/spicelib/devices/bsim3soi/b4soidef.h

@ -3,7 +3,8 @@ Copyright 2009 Regents of the University of California. All rights reserved.
Author: 1998 Samuel Fung
authors:1999-2004 Pin Su, Hui Wan b3soidef.h
Authors:2005- Hui Wan, Jane Xi
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: b4soidef.h
**********/
@ -122,12 +123,13 @@ typedef struct sB4SOIinstance
double B4SOIigp; /* v4.1 for Igb in the AGBCP2 region */
double B4SOIgigpg; /* v4.1 for Igb in the AGBCP2 region */
double B4SOIgigpp; /* v4.1 for Igb in the AGBCP2 region */
double B4SOITempSH; /* v4.2 for portability of SH temp */
double B4SOIigidl;
double B4SOIigisl;
double B4SOIitun;
double B4SOIibp;
double B4SOIabeff;
/* double B4SOIabeff; */ /* v4.2 never used in the code */
double B4SOIvbseff;
double B4SOIcbg;
double B4SOIcbb;
@ -249,7 +251,7 @@ typedef struct sB4SOIinstance
double B4SOIcbodcon;
double B4SOIcth;
double B4SOIcsubstrate;
/* double B4SOIcsubstrate; */ /* v4.2 never used in the code */
double B4SOIgm;
double B4SOIgme; /* v3.0 */
@ -568,8 +570,10 @@ typedef struct sB4SOIinstance
#define B4SOIvgms B4SOIstates+ 28
#define B4SOIvgge B4SOIstates+ 29
#define B4SOIvggm B4SOIstates+ 30
#define B4SOIcqgmid B4SOIstates+ 31
#define B4SOIqgmid B4SOIstates + 32
/* #define B4SOIcqgmid B4SOIstates+ 31 */ /* Bug # 29 */
/* #define B4SOIqgmid B4SOIstates + 32 */ /* Bug # 29 */
#define B4SOIqgmid B4SOIstates+ 31 /* Bug Fix # 29 Jul09*/
#define B4SOIcqgmid B4SOIstates + 32 /* Bug Fix # 29 Jul09*/
/* v3.1 added or changed for RF end */
/* v4.0 */
@ -907,17 +911,18 @@ struct b4soiSizeDependParam
double B4SOIleffCVb;
double B4SOIleffCVbg;
double B4SOIcof1;
/* double B4SOIcof1;
double B4SOIcof2;
double B4SOIcof3;
double B4SOIcof4;
double B4SOIcof4; */ /* v4.2 nover used in the code */
double B4SOIcdep0;
/* v3.0 */
double B4SOIToxRatio;
double B4SOIAechvb;
double B4SOIBechvb;
double B4SOIToxRatioEdge;
double B4SOIAechvbEdge;
double B4SOIAechvbEdges; /* LFW */
double B4SOIAechvbEdged; /* LFW */
double B4SOIBechvbEdge;
double B4SOIvfbsd;
/* v4.0 */
@ -1304,8 +1309,8 @@ typedef struct sB4SOImodel
double B4SOIcgeo;
double B4SOIxpart;
double B4SOIcFringOut;
double B4SOIcFringMax;
/* double B4SOIcFringOut;
double B4SOIcFringMax; */ /* v4.2 never used in the code */
double B4SOIsheetResistance;
double B4SOIbodyJctGateSideSGradingCoeff; /* v4.0 */
@ -1866,12 +1871,12 @@ typedef struct sB4SOImodel
/* Pre-calculated constants */
double B4SOIcbox;
double B4SOIcsi;
double B4SOIcsieff;
/* double B4SOIcsieff;
double B4SOIcoxt;
double B4SOInfb;
double B4SOIadice;
double B4SOIadice */ /* v4.2 never used in the code */
double B4SOIeg0;
double B4SOIeg; /* Jun 09*/
/* v4.0 added for stress effect */
double B4SOIsaref;
@ -1900,10 +1905,10 @@ typedef struct sB4SOImodel
/* MCJ: move to size-dependent param. */
double B4SOIvtm;
double B4SOIcox;
double B4SOIcof1;
/* double B4SOIcof1;
double B4SOIcof2;
double B4SOIcof3;
double B4SOIcof4;
double B4SOIcof4 */ /* v4.2 never used in the code */
double B4SOIvcrit;
double B4SOIfactor1;
@ -3066,7 +3071,7 @@ typedef struct sB4SOImodel
/*#define B4SOI_MOD_NOIMOD 104 v3.2 */
#define B4SOI_MOD_RDSMOD 104 /* v4.0 */
#define B4SOI_MOD_SHMOD 105
#define B4SOI_MOD_DDMOD 106
/*#define B4SOI_MOD_DDMOD 106 v4.2 ddmod is not used any more*/
#define B4SOI_MOD_TOX 107
#define B4SOI_MOD_CDSC 108

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.
@ -9,6 +10,8 @@
* File: b4soidel.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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"

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.
@ -9,6 +10,8 @@
* File: b4soidest.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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"

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

@ -2,6 +2,7 @@
Copyright 2009 Regents of the University of California. All rights reserved.
Author: 2005 Hui Wan (based on Samuel Fung's b3soiext.h)
Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu.
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.
@ -9,6 +10,8 @@
* File: b4soigetic.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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"

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

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

1005
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.
@ -9,6 +10,8 @@
* File: b4soimask.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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"
@ -1229,10 +1232,10 @@ IFvalue *value)
value->iValue = model->B4SOIrgateMod;
return(OK);
case B4SOI_MOD_XRCRG1:
value->iValue = model->B4SOIxrcrg1;
value->rValue = model->B4SOIxrcrg1;
return(OK);
case B4SOI_MOD_XRCRG2:
value->iValue = model->B4SOIxrcrg2;
value->rValue = model->B4SOIxrcrg2;
return(OK);
case B4SOI_MOD_RSHG:
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.
@ -9,6 +10,8 @@
* File: b4soimdel.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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"

24
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.
@ -9,6 +10,8 @@
* File: b4soimpar.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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"
@ -217,20 +220,21 @@ GENmodel *inMod)
case B4SOI_MOD_NPEAK:
mod->B4SOInpeak = value->rValue;
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;
case B4SOI_MOD_NSD:
mod->B4SOInsd = value->rValue;
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;
case B4SOI_MOD_NGATE:
mod->B4SOIngate = value->rValue;
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;
case B4SOI_MOD_GAMMA1:
mod->B4SOIgamma1 = value->rValue;
@ -428,6 +432,7 @@ case B4SOI_MOD_UD:
case B4SOI_MOD_PUCS:
mod->B4SOIpucs = value->rValue;
mod->B4SOIpucsGiven = TRUE;
break; /* Bug fix # 31 Jul09 */
case B4SOI_MOD_UCSTE:
mod->B4SOIucste = value->rValue;
mod->B4SOIucsteGiven = TRUE;
@ -659,7 +664,8 @@ case B4SOI_MOD_UD:
mod->B4SOIfgislGiven = TRUE;
break;
case B4SOI_MOD_FDMOD :
mod->B4SOIfdMod = value->rValue;
/* mod->B4SOIfdMod = value->rValue; v4.2 */
mod->B4SOIfdMod = value->iValue;
mod->B4SOIfdModGiven = TRUE;
break;
case B4SOI_MOD_VSCE :
@ -1167,6 +1173,7 @@ case B4SOI_MOD_UD:
case B4SOI_MOD_RBDB :
mod->B4SOIrbdb = value->rValue;
mod->B4SOIrbdbGiven = TRUE;
break; /* Bug fix # 31 Jul 09 */
case B4SOI_MOD_RBSB :
mod->B4SOIrbsb = value->rValue;
mod->B4SOIrbsbGiven = TRUE;
@ -1402,6 +1409,7 @@ case B4SOI_MOD_UD:
case B4SOI_MOD_LODK2 :
mod->B4SOIlodk2 = value->rValue;
mod->B4SOIlodk2Given = TRUE;
break; /* Bug fix # 31 Jul 09*/
case B4SOI_MOD_STETA0 :
mod->B4SOIsteta0 = value->rValue;
mod->B4SOIsteta0Given = TRUE;

111
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.
@ -9,6 +10,8 @@
* File: b4soinoi.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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"
@ -60,7 +63,7 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
pParam = here->pParam;
cd = fabs(here->B4SOIcd);
esat = 2.0 * pParam->B4SOIvsattemp / here->B4SOIueff;
esat = 2.0 * here->B4SOIvsattemp / here->B4SOIueff;
/* v2.2.3 bug fix */
if(model->B4SOIem<=0.0) DelClm = 0.0;
else {
@ -79,7 +82,6 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
Nl = model->B4SOIcox * here->B4SOIVgsteff
* (1.0 - here->B4SOIAbovVgst2Vtm * here->B4SOIVdseff) / CHARGE;
T3 = model->B4SOIoxideTrapDensityA
* log(MAX(((N0 + here->B4SOInstar) / (Nl + here->B4SOInstar)), N_MINLOG));
T4 = model->B4SOIoxideTrapDensityB * (N0 - Nl);
@ -122,6 +124,7 @@ double Ssi, Swi;
double npart_theta, npart_beta, igsquare, esat;
/* v3.2 end */
double gspr, gdpr;
double tempRatioSH, Vdseffovcd; /* v4.2 bugfix */
int i;
@ -218,7 +221,21 @@ int i;
case N_CALC:
switch (mode)
{ case N_DENS:
if (model->B4SOItnoiMod == 0) /* v4.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;
gdpr = here->B4SOIdrainConductance;
@ -230,7 +247,7 @@ int i;
}
else
{
esat = 2.0 * pParam->B4SOIvsattemp / here->B4SOIueff;
esat = 2.0 * here->B4SOIvsattemp / here->B4SOIueff;
T5 = here->B4SOIVgsteff / esat
/ pParam->B4SOIleff;
T5 *= T5;
@ -241,6 +258,13 @@ int i;
T5 * model->B4SOItnoib *
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)
{ gspr = here->B4SOIsourceConductance;
gdpr = here->B4SOIdrainConductance;
@ -263,27 +287,39 @@ int i;
NevalSrc(&noizDens[B4SOIRDNOIZ],
&lnNdens[B4SOIRDNOIZ], ckt, THERMNOISE,
here->B4SOIdNodePrime, here->B4SOIdNode,
gdpr * here->B4SOIm);
gdpr * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
NevalSrc(&noizDens[B4SOIRSNOIZ],
&lnNdens[B4SOIRSNOIZ], ckt, THERMNOISE,
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],
&lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE,
here->B4SOIgNode,
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)
{ NevalSrc(&noizDens[B4SOIRGNOIZ],
&lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE,
here->B4SOIgNodeMid,
here->B4SOIgNodeExt,
here->B4SOIgrgeltd);
here->B4SOIgrgeltd * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
}
else
{ noizDens[B4SOIRGNOIZ] = 0.0;
@ -297,11 +333,11 @@ int i;
NevalSrc(&noizDens[B4SOIRBSBNOIZ],
&lnNdens[B4SOIRBSBNOIZ], ckt, THERMNOISE,
here->B4SOIbNode, here->B4SOIsbNode,
here->B4SOIgrbsb);
here->B4SOIgrbsb * here->B4SOIm);
NevalSrc(&noizDens[B4SOIRBDBNOIZ],
&lnNdens[B4SOIRBDBNOIZ], ckt, THERMNOISE,
here->B4SOIbNode, here->B4SOIdbNode,
here->B4SOIgrbdb);
here->B4SOIgrbdb * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
}
else
{ noizDens[B4SOIRBSBNOIZ] = 0.0;
@ -317,8 +353,8 @@ int i;
NevalSrc(&noizDens[B4SOIRBODYNOIZ],
&lnNdens[B4SOIRBODYNOIZ], ckt, THERMNOISE,
here->B4SOIbNode, here->B4SOIpNode,
1/ (here->B4SOIrbodyext +
pParam->B4SOIrbody));
tempRatioSH / (here->B4SOIrbodyext + /* v4.2 self-heating temp */
pParam->B4SOIrbody) * here->B4SOIm);
}
else
{ noizDens[B4SOIRBODYNOIZ] = 0.0;
@ -341,7 +377,8 @@ int i;
+ here->B4SOIueff*fabs
(here->B4SOIqinv)
* here->B4SOIrds)))
* model->B4SOIntnoi );
* tempRatioSH /* v4.2 self-heating temp */
* model->B4SOIntnoi * here->B4SOIm);
break;
/* v2.2.3 bug fix */
@ -349,7 +386,7 @@ int i;
T0 = here->B4SOIgm + here->B4SOIgmbs +
here->B4SOIgds;
T0 *= T0;
esat = 2.0 * pParam->B4SOIvsattemp /
esat = 2.0 * here->B4SOIvsattemp /
here->B4SOIueff;
T5 = here->B4SOIVgsteff / esat /
pParam->B4SOIleff;
@ -360,20 +397,20 @@ int i;
npart_theta = model->B4SOIrnoib * (1.0 +
T5 * model->B4SOItnoib *
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
+ 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],
&lnNdens[B4SOIIDNOIZ], ckt,
THERMNOISE,
here->B4SOIdNodePrime,
here->B4SOIsNodePrime,
(T2 - igsquare));
/* (T2 - igsquare)); */
(T2 - igsquare) * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
break;
case 2:
@ -383,9 +420,10 @@ int i;
here->B4SOIdNodePrime,
here->B4SOIsNodePrime,
model->B4SOIntnoi *
tempRatioSH * /* v4.2 self-heating temp */
(2.0 / 3.0 * fabs(here->B4SOIgm
+ here->B4SOIgds
+ here->B4SOIgmbs)));
+ here->B4SOIgmbs)) * here->B4SOIm);
break;
}
@ -423,12 +461,22 @@ int i;
{ vds = -vds;
vgs = vgs + vds;
}
/*v4.2 implementing SH temp */
if ((model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0))
Ssi = B4SOIEval1ovFNoise(vds, model, here,
data->freq, ckt->CKTtemp);
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 * ckt->CKTtemp;
* CONSTboltz * here->B4SOITempSH;
else
T10 = model->B4SOIoxideTrapDensityA
* CONSTboltz * ckt->CKTtemp; /*v4.2 implementing SH temp */
T11 = pParam->B4SOIweff * here->B4SOInf
* pParam->B4SOIleff
* pow(data->freq, model->B4SOIef)
@ -476,10 +524,15 @@ int i;
here->B4SOIsNodePrime, here->B4SOIbNode,
model->B4SOInoif * here->B4SOIibs * here->B4SOIm);
/* NevalSrc(&noizDens[B4SOIFB_IBDNOIZ],
&lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE,
here->B4SOIdNodePrime, here->B4SOIbNode,
model->B4SOInoif * fabs(here->B4SOIibd)); */ /*v4.2*/
NevalSrc(&noizDens[B4SOIFB_IBDNOIZ],
&lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE,
here->B4SOIdNodePrime, here->B4SOIbNode,
model->B4SOInoif * fabs(here->B4SOIibd) * here->B4SOIm);
model->B4SOInoif * (here->B4SOIibd) * here->B4SOIm); /*v4.2 extra fabs()removed */
noizDens[B4SOITOTNOIZ] = noizDens[B4SOIRDNOIZ]
+ noizDens[B4SOIRSNOIZ]

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.
@ -9,6 +10,8 @@
* File: b4soipar.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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"
@ -208,15 +211,19 @@ IFvalue *select)
case 5:
here->B4SOIicVPS = *(value->v.vec.rVec+4);
here->B4SOIicVPSGiven = TRUE;
break; /* v4.2 bugfix */
case 4:
here->B4SOIicVES = *(value->v.vec.rVec+3);
here->B4SOIicVESGiven = TRUE;
break; /* v4.2 bugfix */
case 3:
here->B4SOIicVBS = *(value->v.vec.rVec+2);
here->B4SOIicVBSGiven = TRUE;
break; /* v4.2 bugfix */
case 2:
here->B4SOIicVGS = *(value->v.vec.rVec+1);
here->B4SOIicVGSGiven = TRUE;
break; /* v4.2 bugfix */
case 1:
here->B4SOIicVDS = *(value->v.vec.rVec);
here->B4SOIicVDSGiven = TRUE;

5
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.
@ -9,6 +10,8 @@
* File: b4soipzld.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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"

25
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.
@ -9,6 +10,8 @@
* File: b4soiset.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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"
@ -61,11 +64,14 @@ double Vbs0t, Qsi;
model->B4SOIparamChk = 0;
if (!model->B4SOIcapModGiven)
model->B4SOIcapMod = 2;
if (!model->B4SOIiiiModGiven) /* Bug fix #7 Jun 09 'iiimod' with default value added */
model->B4SOIiiiMod = 0;
if (!model->B4SOImtrlModGiven)
model->B4SOImtrlMod = 0; /*4.1*/
if (!model->B4SOIvgstcvModGiven)
model->B4SOIvgstcvMod = 0;
/*model->B4SOIvgstcvMod = 0; v4.2 Bugfix */
model->B4SOIvgstcvMod = 1;
if (!model->B4SOIgidlModGiven)
model->B4SOIgidlMod = 0;
if (!model->B4SOIeotGiven)
@ -307,7 +313,8 @@ double Vbs0t, Qsi;
if (!model->B4SOIwudGiven)
model->B4SOIwud = 0.0;
if (!model->B4SOIpudGiven)
model->B4SOIpud1 = 0.0;
/* model->B4SOIpud1 = 0.0; */ /*Bug fix # 33 Jul 09 */
model->B4SOIpud = 0.0;
if (!model->B4SOIud1Given)
model->B4SOIud1 = 0.0;
if (!model->B4SOIlud1Given)
@ -422,7 +429,7 @@ double Vbs0t, Qsi;
if (!model->B4SOIbgidlGiven)
model->B4SOIbgidl = 2.3e9; /* 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 */
model->B4SOIrgidl = 1.0;
if (!model->B4SOIkgidlGiven) /* v4.1 */
@ -2041,7 +2048,6 @@ double Vbs0t, Qsi;
model->B4SOIvsce = 0.0;
if (!model->B4SOIcdsbsGiven)
model->B4SOIcdsbs = 0.0;
if (!model->B4SOIminvcvGiven) /* v4.1 for Vgsteffcv */
model->B4SOIminvcv = 0.0;
if (!model->B4SOIlminvcvGiven) /* v4.1 for Vgsteffcv */
@ -2051,7 +2057,8 @@ double Vbs0t, Qsi;
if (!model->B4SOIpminvcvGiven) /* v4.1 for Vgsteffcv */
model->B4SOIpminvcv = 0.0;
if (!model->B4SOIvoffcvGiven)
model->B4SOIvoffcv = -0.08;
/*model->B4SOIvoffcv = -0.08; v4.2 */
model->B4SOIvoffcv = 0.0;
if (!model->B4SOIlvoffcvGiven)
model->B4SOIlvoffcv = 0.0;
if (!model->B4SOIwvoffcvGiven)
@ -2103,10 +2110,8 @@ double Vbs0t, Qsi;
here->B4SOIsourceSquares = 1;
if (!here->B4SOIwGiven)
here->B4SOIw = 5e-6;
if (!here->B4SOImGiven)
here->B4SOIm = 1;
/* v2.0 release */
if (!here->B4SOInbcGiven)
here->B4SOInbc = 0;
@ -2657,7 +2662,9 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
}
int
B4SOIunsetup(GENmodel *inModel, CKTcircuit *ckt)
B4SOIunsetup(
GENmodel *inModel,
CKTcircuit *ckt)
{
#ifndef HAS_BATCHSIM
B4SOImodel *model;

234
src/spicelib/devices/bsim3soi/b4soitemp.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.
@ -9,6 +10,8 @@
* File: b4soitemp.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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
**********/
/* Lmin, Lmax, Wmin, Wmax */
@ -43,7 +46,6 @@
B = exp(A); \
} \
}
/* ARGSUSED */
int
B4SOItemp(
@ -72,7 +74,6 @@ double niter,toxpf,toxpi, Tcen;
double n0;
/* v2.0 release */
double tmp3, T7;
/*4.1*/
@ -123,7 +124,7 @@ double epsrox, toxe, epssub;
model->B4SOIvtm = KboQ * Temp;
Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0);
model->B4SOIeg = Eg; /* Bug fix #11 Jun 09 Eg is evaluated at Temp, not Tnom. To be used if no selfheat */
/* ni is in cm^-3 */
ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15)
* exp(21.5565981 - Eg / (2.0 * model->B4SOIvtm));
@ -136,7 +137,7 @@ double epsrox, toxe, epssub;
model->B4SOIvtm = KboQ * Temp;
Eg = model->B4SOIbg0sub - model->B4SOItbgasub * Temp * Temp
/ (Temp + model->B4SOItbgbsub);
model->B4SOIeg = Eg; /* Bug fix #11 Jun 09 Eg is evaluated at Temp, not Tnom. To be used if no selfheat */
ni = model->B4SOIni0sub * (Temp / Tnom) * sqrt(Temp / Tnom)
* exp(Eg0/(2.0*Vtm0) - Eg / (2.0 * model->B4SOIvtm));
@ -153,7 +154,8 @@ double epsrox, toxe, epssub;
pSizeDependParamKnot = model->pSizeDependParamKnot;
Size_Not_Found = 1;
while ((pSizeDependParamKnot != NULL) && Size_Not_Found)
{ if ((here->B4SOIl == pSizeDependParamKnot->Length)
{
if ((here->B4SOIl == pSizeDependParamKnot->Length)
&& (here->B4SOIw == pSizeDependParamKnot->Width)
&& (here->B4SOIrth0 == pSizeDependParamKnot->Rth0)
&& (here->B4SOIcth0 == pSizeDependParamKnot->Cth0)
@ -881,9 +883,11 @@ double epsrox, toxe, epssub;
/*4.1 mobmod=4*/
pParam->B4SOIud = model->B4SOIud
+ model->B4SOIud * Inv_L
/* + model->B4SOIud * Inv_L*//*Bug #15 Jun 09*/
+ model->B4SOIlud * Inv_L /*Fix*/
+ model->B4SOIwud * Inv_W
+ model->B4SOIpud * Inv_LW;
pParam->B4SOIud1 = model->B4SOIud1
+ model->B4SOIlud1 * Inv_L
+ model->B4SOIwud1 * Inv_W
@ -1044,6 +1048,10 @@ double epsrox, toxe, epssub;
+ model->B4SOIlminvcv * Inv_L
+ model->B4SOIwminvcv * Inv_W
+ model->B4SOIpminvcv * Inv_LW; /* v4.1 */
pParam->B4SOIvoffcv = model->B4SOIvoffcv /*Bug fix # 16 Jun09*/
+ model->B4SOIlvoffcv * Inv_L
+ model->B4SOIwvoffcv * Inv_W
+ model->B4SOIpvoffcv * Inv_LW;
pParam->B4SOIfprout = model->B4SOIfprout
+ model->B4SOIlfprout * Inv_L
+ model->B4SOIwfprout * Inv_W
@ -1089,18 +1097,27 @@ double epsrox, toxe, epssub;
/* v2.2 release */
pParam->B4SOIrth = here->B4SOIrth0
/ (pParam->B4SOIweff + model->B4SOIwth0)
* here->B4SOInseg;
* here->B4SOInseg / here->B4SOInf; /* bugfix_snps nf*/
pParam->B4SOIcth = here->B4SOIcth0
* (pParam->B4SOIweff + model->B4SOIwth0)
/ here->B4SOInseg;
/ here->B4SOInseg * here->B4SOInf; /* bugfix_snps nf*/
/* v2.2.2 adding layout-dependent Frbody multiplier */
pParam->B4SOIrbody = here->B4SOIfrbody *model->B4SOIrbody
/* pParam->B4SOIrbody = here->B4SOIfrbody *model->B4SOIrbody
* model->B4SOIrhalo
/ (2 * model->B4SOIrbody
+ model->B4SOIrhalo * pParam->B4SOIleff)
* pParam->B4SOIweff / here->B4SOInseg
/ here->B4SOInf /* v4.0 */;
/ here->B4SOInf */ /* v4.0 *//*;*/
if (model->B4SOIrbody == 0) /* Bug Fix # 27 added to avoid NaN (0/0) in QA*/
pParam->B4SOIrbody = 0;
else
pParam->B4SOIrbody = here->B4SOIfrbody *model->B4SOIrbody
* model->B4SOIrhalo
/ (2 * model->B4SOIrbody
+ model->B4SOIrhalo * pParam->B4SOIleff)
* pParam->B4SOIweff / here->B4SOInseg/ here->B4SOInf; /* v4.0 */
pParam->B4SOIoxideRatio = pow(model->B4SOItoxref
/model->B4SOItoxqm, model->B4SOIntox)
@ -1198,7 +1215,7 @@ double epsrox, toxe, epssub;
pParam->B4SOIjtuns = pParam->B4SOIistun * T0;
/* drain side */
pParam->B4SOIjtund = pParam->B4SOIidtun * T0;
/* pParam->B4SOIjtund = pParam->B4SOIidtun * T0; */ /*v4.2 redundant */
T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndioded;
DEXP(T7, T0);
@ -1275,7 +1292,8 @@ double epsrox, toxe, epssub;
pParam->B4SOIlitl = sqrt(3.0 *3.9/epsrox* pParam->B4SOIxj
* model->B4SOItox);
else
pParam->B4SOIlitl = sqrt(epssub * pParam->B4SOIxj * model->B4SOItox/(epsrox*EPS0));
/* pParam->B4SOIlitl = sqrt(epssub * pParam->B4SOIxj * model->B4SOItox/(epsrox*EPS0)); */ /* Bug fix # 13 Jun 09 'not reported by vendors'*/
pParam->B4SOIlitl = sqrt(epssub * pParam->B4SOIxj * toxe/(epsrox*EPS0)); /* fix */
pParam->B4SOIvbi = model->B4SOIvtm * log(1.0e20
* pParam->B4SOInpeak / (ni * ni));
pParam->B4SOIcdep0 = sqrt(Charge_q * epssub
@ -1314,14 +1332,24 @@ double epsrox, toxe, epssub;
/ pParam->B4SOIpoxedge / pParam->B4SOIpoxedge;
pParam->B4SOIAechvb = (model->B4SOItype == NMOS) ? 4.97232e-7 : 3.42537e-7;
pParam->B4SOIBechvb = (model->B4SOItype == NMOS) ? 7.45669e11 : 1.16645e12;
pParam->B4SOIAechvbEdge = pParam->B4SOIAechvb * pParam->B4SOIweff/here->B4SOInseg
// The edge should have a contribution from psbcp & pdbcp. Need s & d terms.
// There is no NF correction because psbcp & pdbcp are "per finger" in manual.
pParam->B4SOIAechvbEdges = pParam->B4SOIAechvb
* (pParam->B4SOIweff/here->B4SOInseg + here->B4SOIpsbcp)
* pParam->B4SOIdlcig * pParam->B4SOIToxRatioEdge; /* v3.1 bug fix */
pParam->B4SOIAechvbEdged = pParam->B4SOIAechvb
* (pParam->B4SOIweff/here->B4SOInseg + here->B4SOIpdbcp)
* pParam->B4SOIdlcig * pParam->B4SOIToxRatioEdge; /* v3.1 bug fix */
pParam->B4SOIBechvbEdge = -pParam->B4SOIBechvb
* model->B4SOItoxqm * pParam->B4SOIpoxedge;
pParam->B4SOIAechvb *= pParam->B4SOIweff/here->B4SOInseg
/* pParam->B4SOIAechvb *= pParam->B4SOIweff/here->B4SOInseg */
/* * pParam->B4SOIleff */
/* * pParam->B4SOIToxRatio */
/* + here->B4SOIagbcpd; v4.0 */
pParam->B4SOIAechvb *= (pParam->B4SOIweff/here->B4SOInseg
* pParam->B4SOIleff
* pParam->B4SOIToxRatio
+ here->B4SOIagbcpd; /* v4.0 */
+ here->B4SOIagbcpd/here->B4SOInf) /* LFW */
* pParam->B4SOIToxRatio; /* From Geoffrey Coram 10/22/09 */
pParam->B4SOIBechvb *= -model->B4SOItoxqm;
/* v3.0 */
@ -1377,7 +1405,7 @@ double epsrox, toxe, epssub;
- pParam->B4SOIvbm);
}
if (pParam->B4SOIk2 < 0.0)
/*if (pParam->B4SOIk2 < 0.0)
{ T0 = 0.5 * pParam->B4SOIk1 / pParam->B4SOIk2;
pParam->B4SOIvbsc = 0.9 * (pParam->B4SOIphi - T0 * T0);
if (pParam->B4SOIvbsc > -3.0)
@ -1389,7 +1417,7 @@ double epsrox, toxe, epssub;
{ pParam->B4SOIvbsc = -30.0;
}
if (pParam->B4SOIvbsc > pParam->B4SOIvbm)
pParam->B4SOIvbsc = pParam->B4SOIvbm;
pParam->B4SOIvbsc = pParam->B4SOIvbm; */ /* v4.2 never used in code */
if ((T0 = pParam->B4SOIweff + pParam->B4SOIk1w2) < 1e-8)
T0 = 1e-8;
@ -1444,6 +1472,11 @@ double epsrox, toxe, epssub;
pParam->B4SOIdvtp2factor = pParam->B4SOIdvtp2 / exp(pParam->B4SOIdvtp3 * log(pParam->B4SOIleff));
/* stress effect */
if (model->B4SOIwlod < 0.0)
{ fprintf(stderr, "Warning: WLOD = %g is less than 0. Set to 0.0\n",model->B4SOIwlod);
model->B4SOIwlod = 0.0;
}
T0 = pow(Ldrn, model->B4SOIllodku0);
W_tmp = Wdrn + model->B4SOIwlod;
T1 = pow(W_tmp, model->B4SOIwlodku0);
@ -1473,6 +1506,79 @@ double epsrox, toxe, epssub;
}
/* v4.0 stress effect */ /* Bug Fix # 17 Jul09 Code 1484-1560 is moved up from lines 1884-1958 of old version*/
/* v4.0 stress effect */
if( (here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) &&
( (here->B4SOInf == 1.0) ||
((here->B4SOInf > 1.0) && (here->B4SOIsd > 0.0))
)
)
{ Inv_sa = 0;
Inv_sb = 0;
if (model->B4SOIkvsat < -1.0 )
{ fprintf(stderr, "Warning: KVSAT = %g is too small; Reset to -1.0.\n",model->B4SOIkvsat);
here->B4SOIkvsat = kvsat = -1.0;
}
else if (model->B4SOIkvsat > 1.0)
{ fprintf(stderr, "Warning: KVSAT = %g is too big; Reset to 1.0.\n",model->B4SOIkvsat);
here->B4SOIkvsat = kvsat = 1.0;
}
else here->B4SOIkvsat = model->B4SOIkvsat;
for(i = 0; i < here->B4SOInf; i++) {
T0 = 1.0 / here->B4SOInf / (here->B4SOIsa
+ 0.5*Ldrn + i * (here->B4SOIsd +Ldrn));
T1 = 1.0 / here->B4SOInf / (here->B4SOIsb
+ 0.5*Ldrn + i * (here->B4SOIsd +Ldrn));
Inv_sa += T0;
Inv_sb += T1;
}
Inv_ODeff = Inv_sa + Inv_sb;
here->B4SOIInv_ODeff = Inv_ODeff;
rho = model->B4SOIku0 / pParam->B4SOIku0temp * Inv_ODeff;
T0 = (1.0 + rho)/(1.0 + pParam->B4SOIrho_ref);
here->B4SOIu0temp = pParam->B4SOIu0temp * T0;
T1 = (1.0 + here->B4SOIkvsat * rho)/(1.0 + here->B4SOIkvsat * pParam->B4SOIrho_ref);/*self-heating bug fix*/
here->B4SOIvsattemp = pParam->B4SOIvsattemp * T1;
OD_offset = Inv_ODeff - pParam->B4SOIinv_od_ref;
dvth0_lod = model->B4SOIkvth0
/ pParam->B4SOIkvth0 * OD_offset;
dk2_lod = model->B4SOIstk2
/ pow(pParam->B4SOIkvth0, model->B4SOIlodk2)
* OD_offset;
deta0_lod = model->B4SOIsteta0
/ pow(pParam->B4SOIkvth0, model->B4SOIlodeta0)
* OD_offset;
here->B4SOIvth0 = pParam->B4SOIvth0 + dvth0_lod;
here->B4SOIk2 = pParam->B4SOIk2 + dk2_lod;
here->B4SOIeta0 = pParam->B4SOIeta0 + deta0_lod;
}
else {
here->B4SOIu0temp = pParam->B4SOIu0temp;
here->B4SOIvth0 = pParam->B4SOIvth0;
here->B4SOIvsattemp = pParam->B4SOIvsattemp;
here->B4SOIk2 = pParam->B4SOIk2;
here->B4SOIeta0 = pParam->B4SOIeta0;
here->B4SOIInv_ODeff = 0;
pParam->B4SOIinv_od_ref = 0; /*Stress bug fix*/
here->B4SOIkvsat = 0; /*Stress bug fix*/
} /* v4.0 stress effect end */
here->B4SOIk2ox = here->B4SOIk2 * model->B4SOItox
/ model->B4SOItoxm; /* v4.0 */
here->B4SOIvth0 += here->B4SOIdelvto; /* v4.0 */
here->B4SOIvfb = pParam->B4SOIvfb + model->B4SOItype * here->B4SOIdelvto;
/* Bug Fix # 17 Jul09 Code 1479-1545 is moved up from lines 1884-1950 of old version, 1954-2035 in this version*/
here->B4SOIcsbox = model->B4SOIcbox*here->B4SOIsourceArea;
here->B4SOIcsmin = model->B4SOIcsdmin*here->B4SOIsourceArea;
here->B4SOIcdbox = model->B4SOIcbox*here->B4SOIdrainArea;
@ -1651,7 +1757,9 @@ double epsrox, toxe, epssub;
/* v4.0 DITS */
if (pParam->B4SOIdvtp0 > 0.0) {
T0 = 0.0;
T2 = 1; /* Bug fix #1 Jun 09 Shorter implementation of same code */
/* T0 = 0.0;
T2 = exp(T0);
if (T0 < -EXPL_THRESHOLD) {
T2 = MIN_EXPL;
@ -1659,7 +1767,7 @@ double epsrox, toxe, epssub;
else {
T2 = exp(T0);
}
} end */
T3 = model->B4SOIleffeot + pParam->B4SOIdvtp0 * (1.0 + T2);
@ -1728,6 +1836,7 @@ double epsrox, toxe, epssub;
T10 = n * Vtmeot; /* v4.0 */
VgstNVt = pParam->B4SOImstar * Vgst / T10; /* v4.0 */
ExpArg = (pParam->B4SOIvoff - (1- pParam->B4SOImstar) * Vgst)
/ T10; /* v4.0 */
@ -1876,81 +1985,8 @@ double epsrox, toxe, epssub;
+ 1.0 / here->B4SOIrbsb;
}
/* v4.0 rbodyMod end */
/* v4.0 stress effect */
if( (here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) &&
( (here->B4SOInf == 1.0) ||
((here->B4SOInf > 1.0) && (here->B4SOIsd > 0.0))
)
)
{ Inv_sa = 0;
Inv_sb = 0;
if (model->B4SOIwlod < 0.0)
{ fprintf(stderr, "Warning: WLOD = %g is less than 0. Set to 0.0\n",model->B4SOIwlod);
model->B4SOIwlod = 0.0;
}
if (model->B4SOIkvsat < -1.0 )
{ fprintf(stderr, "Warning: KVSAT = %g is too small; Reset to -1.0.\n",model->B4SOIkvsat);
here->B4SOIkvsat = kvsat = -1.0;
}
else if (model->B4SOIkvsat > 1.0)
{ fprintf(stderr, "Warning: KVSAT = %g is too big; Reset to 1.0.\n",model->B4SOIkvsat);
here->B4SOIkvsat = kvsat = 1.0;
}
else here->B4SOIkvsat = model->B4SOIkvsat;
for(i = 0; i < here->B4SOInf; i++) {
T0 = 1.0 / here->B4SOInf / (here->B4SOIsa
+ 0.5*Ldrn + i * (here->B4SOIsd +Ldrn));
T1 = 1.0 / here->B4SOInf / (here->B4SOIsb
+ 0.5*Ldrn + i * (here->B4SOIsd +Ldrn));
Inv_sa += T0;
Inv_sb += T1;
}
/* Bug Fix # 17 Jul09 Stress effect code (lines: 1954-2020) is moved up to lines 1479-1545*/
Inv_ODeff = Inv_sa + Inv_sb;
here->B4SOIInv_ODeff = Inv_ODeff;
rho = model->B4SOIku0 / pParam->B4SOIku0temp * Inv_ODeff;
T0 = (1.0 + rho)/(1.0 + pParam->B4SOIrho_ref);
here->B4SOIu0temp = pParam->B4SOIu0temp * T0;
T1 = (1.0 + here->B4SOIkvsat * rho)/(1.0 + here->B4SOIkvsat * pParam->B4SOIrho_ref);/*self-heating bug fix*/
here->B4SOIvsattemp = pParam->B4SOIvsattemp * T1;
OD_offset = Inv_ODeff - pParam->B4SOIinv_od_ref;
dvth0_lod = model->B4SOIkvth0
/ pParam->B4SOIkvth0 * OD_offset;
dk2_lod = model->B4SOIstk2
/ pow(pParam->B4SOIkvth0, model->B4SOIlodk2)
* OD_offset;
deta0_lod = model->B4SOIsteta0
/ pow(pParam->B4SOIkvth0, model->B4SOIlodeta0)
* OD_offset;
here->B4SOIvth0 = pParam->B4SOIvth0 + dvth0_lod;
here->B4SOIk2 = pParam->B4SOIk2 + dk2_lod;
here->B4SOIeta0 = pParam->B4SOIeta0 + deta0_lod;
}
else {
here->B4SOIu0temp = pParam->B4SOIu0temp;
here->B4SOIvth0 = pParam->B4SOIvth0;
here->B4SOIvsattemp = pParam->B4SOIvsattemp;
here->B4SOIk2 = pParam->B4SOIk2;
here->B4SOIeta0 = pParam->B4SOIeta0;
here->B4SOIInv_ODeff = 0;
pParam->B4SOIinv_od_ref = 0; /*Stress bug fix*/
here->B4SOIkvsat = 0; /*Stress bug fix*/
} /* v4.0 stress effect end */
here->B4SOIk2ox = here->B4SOIk2 * model->B4SOItox
/ model->B4SOItoxm; /* v4.0 */
here->B4SOIvth0 += here->B4SOIdelvto; /* v4.0 */
here->B4SOIvfb = pParam->B4SOIvfb + model->B4SOItype * here->B4SOIdelvto;
here->B4SOIvfbzb = pParam->B4SOIvfbzb + model->B4SOItype * here->B4SOIdelvto;
pParam->B4SOIldeb = sqrt(epssub * Vtm0 /
@ -1968,9 +2004,9 @@ double epsrox, toxe, epssub;
if(model->B4SOImobMod == 4)
{
/*Calculate n @ Vbs=Vds=0*/
V0 = pParam->B4SOIvbi - pParam->B4SOIphi;
/*V0 = pParam->B4SOIvbi - pParam->B4SOIphi; */ /* v4.2 never used in code */
lt1 = model->B4SOIfactor1* pParam->B4SOIsqrtXdep0;
ltw = lt1;
/* ltw = lt1; */ /* v4.2 never used in code */
T0 = pParam->B4SOIdvt1 * pParam->B4SOIleff / lt1;
if (T0 < EXPL_THRESHOLD)
{
@ -1984,8 +2020,8 @@ double epsrox, toxe, epssub;
Theta0 = 1.0 / (MAX_EXPL - 2.0);
tmp1 = epssub / pParam->B4SOIXdep0;
here->B4SOInstar = model->B4SOIvtm / Charge_q *
(model->B4SOIcox + tmp1 + pParam->B4SOIcit);
/*here->B4SOInstar = model->B4SOIvtm / Charge_q *
(model->B4SOIcox + tmp1 + pParam->B4SOIcit); */ /* v4.2 never used in code */
tmp2 = pParam->B4SOInfactor * tmp1;
tmp3 = (tmp2 + pParam->B4SOIcdsc * Theta0 + pParam->B4SOIcit) / model->B4SOIcox;
if (tmp3 >= -0.5)

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.
@ -9,6 +10,8 @@
* File: b4soitrunc.c
* Modified by Hui Wan, Xuemei Xi 11/30/2005
* 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"

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)
* Modified by Darsen Lu 03/11/2009
.include ./nmos4p1.mod
.include ./pmos4p1.mod
.include ./nmos4p3.mod
.include ./pmos4p3.mod
.option TEMP=27C noacct
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)
* Modified by Darsen Lu 03/11/2009
.include ./nmos4p1.mod
.include ./pmos4p1.mod
.include ./nmos4p3.mod
.include ./pmos4p3.mod
.option TEMP=27C noacct
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
+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
+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
.tran 0.2n 10n
.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

7
tests/bsim3soi/test1.cir

@ -5,7 +5,7 @@
.option ingold=1
.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
+SA=0.31u SB=0.2u SD=0.1u
@ -13,9 +13,10 @@ vg g 0 1.2
vd d 0 1.2
vs s 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
.include ./nmos4p1.mod
.print dc i(vd)
.include ./nmos4p3.mod
.print dc i(vd) i(vs)
.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
.dc vd 0 1.2 0.02 vg 0.4 1.2 0.1
.include ./nmos4p1.mod
.include ./nmos4p3.mod
.print dc i(vd)
.end

2
tests/bsim3soi/test3.cir

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

2
tests/bsim3soi/test4.cir

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

2
tests/bsim3soi/test5.cir

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

2
tests/bsim3soi/test6.cir

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

2
tests/bsim3soi/test7.cir

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

2
tests/bsim3soi/test8.cir

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