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. 9
      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. 16119
      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. 127
      src/spicelib/devices/bsim3soi/b4soinoi.c
  17. 9
      src/spicelib/devices/bsim3soi/b4soipar.c
  18. 29
      src/spicelib/devices/bsim3soi/b4soipzld.c
  19. 27
      src/spicelib/devices/bsim3soi/b4soiset.c
  20. 3850
      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"

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.
@ -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"
@ -180,7 +183,7 @@ B4SOIinstance *here = (B4SOIinstance*)inst;
case B4SOI_AGBCP:
value->rValue = here->B4SOIagbcp;
return(OK);
case B4SOI_AGBCP2:
case B4SOI_AGBCP2:
value->rValue = here->B4SOIagbcp2;
return(OK); /* v4.1 for BC improvement */
case B4SOI_AGBCPD: /* v4.0 */
@ -280,7 +283,7 @@ B4SOIinstance *here = (B4SOIinstance*)inst;
case B4SOI_IGIDL:
value->rValue = here->B4SOIigidl;
return(OK);
case B4SOI_IGISL:
case B4SOI_IGISL:
value->rValue = here->B4SOIigisl;
return(OK);
case B4SOI_IGS:

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,

16119
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"

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.
@ -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,8 +664,9 @@ case B4SOI_MOD_UD:
mod->B4SOIfgislGiven = TRUE;
break;
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;
case B4SOI_MOD_VSCE :
mod->B4SOIvsce = value->rValue;
@ -1167,7 +1173,8 @@ case B4SOI_MOD_UD:
case B4SOI_MOD_RBDB :
mod->B4SOIrbdb = value->rValue;
mod->B4SOIrbdbGiven = TRUE;
case B4SOI_MOD_RBSB :
break; /* Bug fix # 31 Jul 09 */
case B4SOI_MOD_RBSB :
mod->B4SOIrbsb = value->rValue;
mod->B4SOIrbsbGiven = TRUE;
break;
@ -1402,7 +1409,8 @@ case B4SOI_MOD_UD:
case B4SOI_MOD_LODK2 :
mod->B4SOIlodk2 = value->rValue;
mod->B4SOIlodk2Given = TRUE;
case B4SOI_MOD_STETA0 :
break; /* Bug fix # 31 Jul 09*/
case B4SOI_MOD_STETA0 :
mod->B4SOIsteta0 = value->rValue;
mod->B4SOIsteta0Given = TRUE;
break;

127
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,8 +221,22 @@ int i;
case N_CALC:
switch (mode)
{ 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;
gdpr = here->B4SOIdrainConductance;
}
@ -230,8 +247,8 @@ int i;
}
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;
T5 *= T5;
npart_beta = model->B4SOIrnoia * (1.0 +
@ -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,13 +461,23 @@ int i;
{ vds = -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
* pow(data->freq, model->B4SOIef)
* 1.0e10 * here->B4SOInstar
@ -476,12 +524,17 @@ int i;
here->B4SOIsNodePrime, here->B4SOIbNode,
model->B4SOInoif * here->B4SOIibs * here->B4SOIm);
NevalSrc(&noizDens[B4SOIFB_IBDNOIZ],
/* 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[B4SOITOTNOIZ] = noizDens[B4SOIRDNOIZ]
+ noizDens[B4SOIRSNOIZ]
+ noizDens[B4SOIRGNOIZ]
+ 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.
@ -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;

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.
@ -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"
@ -37,7 +40,7 @@ double m;
for (; model != NULL; model = model->B4SOInextModel)
{ for (here = model->B4SOIinstances; here!= NULL;
here = here->B4SOInextInstance)
{
{
if (here->B4SOImode >= 0)
{
@ -45,9 +48,9 @@ double m;
continue;
Gm = here->B4SOIgm;
Gmbs = here->B4SOIgmbs;
FwdSum = Gm + Gmbs;
RevSum = 0.0;
Gmbs = here->B4SOIgmbs;
FwdSum = Gm + Gmbs;
RevSum = 0.0;
cggb = here->B4SOIcggb;
cgsb = here->B4SOIcgsb;
cgdb = here->B4SOIcgdb;
@ -60,11 +63,11 @@ double m;
cdsb = here->B4SOIcdsb;
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;
cgsb = here->B4SOIcgdb;
cgdb = here->B4SOIcgsb;
@ -86,10 +89,10 @@ double m;
capbd= here->B4SOIcapbd;
capbs= here->B4SOIcapbs;
#endif
GSoverlapCap = here->B4SOIcgso;
GDoverlapCap = here->B4SOIcgdo;
GSoverlapCap = here->B4SOIcgso;
GDoverlapCap = here->B4SOIcgdo;
#ifdef BULKCODE
GBoverlapCap = here->pParam->B4SOIcgbo;
GBoverlapCap = here->pParam->B4SOIcgbo;
#endif
xcdgb = (cdgb - GDoverlapCap);

27
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,8 +2048,7 @@ double Vbs0t, Qsi;
model->B4SOIvsce = 0.0;
if (!model->B4SOIcdsbsGiven)
model->B4SOIcdsbs = 0.0;
if (!model->B4SOIminvcvGiven) /* v4.1 for Vgsteffcv */
if (!model->B4SOIminvcvGiven) /* v4.1 for Vgsteffcv */
model->B4SOIminvcv = 0.0;
if (!model->B4SOIlminvcvGiven) /* v4.1 for Vgsteffcv */
model->B4SOIlminvcv = 0.0;
@ -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;

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