diff --git a/ChangeLog b/ChangeLog index d2b898ad4..0dd0c8f8f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2009-09-22: Paolo Nenzi + * b4ld.c, b4temp.c: Updated BSIM4 code to BSIM 4.6.5 + according to BSIM 4.6.5 bug report. + 2009-09-20 Holger Vogt * inpmkmod.c: fix bug no. 2859013 * INSTALL corrected diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index c3963662a..35c14750d 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -660,7 +660,7 @@ for (; model != NULL; model = model->BSIM4nextModel) /* Source/drain junction diode DC model begins */ Nvtms = model->BSIM4vtm * model->BSIM4SjctEmissionCoeff; if ((here->BSIM4Aseff <= 0.0) && (here->BSIM4Pseff <= 0.0)) - { SourceSatCurrent = 1.0e-14; + { SourceSatCurrent = 0.0; } else { SourceSatCurrent = here->BSIM4Aseff * model->BSIM4SjctTempSatCurDensity @@ -758,7 +758,7 @@ for (; model != NULL; model = model->BSIM4nextModel) Nvtmd = model->BSIM4vtm * model->BSIM4DjctEmissionCoeff; if ((here->BSIM4Adeff <= 0.0) && (here->BSIM4Pdeff <= 0.0)) - { DrainSatCurrent = 1.0e-14; + { DrainSatCurrent = 0.0; } else { DrainSatCurrent = here->BSIM4Adeff * model->BSIM4DjctTempSatCurDensity diff --git a/src/spicelib/devices/bsim4/b4temp.c b/src/spicelib/devices/bsim4/b4temp.c index 368ffcdfc..3be470c4c 100644 --- a/src/spicelib/devices/bsim4/b4temp.c +++ b/src/spicelib/devices/bsim4/b4temp.c @@ -1729,12 +1729,19 @@ int Size_Not_Found, i; DMDGeff = model->BSIM4dmdg - model->BSIM4dmcgt; if (here->BSIM4sourcePerimeterGiven) + { if(here->BSIM4sourcePerimeter == 0.0) + here->BSIM4Pseff = 0.0; + else if (here->BSIM4sourcePerimeter < 0.0) + { printf("Warning: Source Perimeter is specified as negative, it is set to zero.\n"); + here->BSIM4Pseff = 0.0;} + else { if (model->BSIM4perMod == 0) here->BSIM4Pseff = here->BSIM4sourcePerimeter; else here->BSIM4Pseff = here->BSIM4sourcePerimeter - pParam->BSIM4weffCJ * here->BSIM4nf; } + } else BSIM4PAeffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4min, pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, @@ -1745,12 +1752,19 @@ int Size_Not_Found, i; if (here->BSIM4drainPerimeterGiven) + { if(here->BSIM4drainPerimeter = 0.0) + here->BSIM4Pdeff = 0.0; + else if(here->BSIM4drainPerimeter < 0.0) + { printf("Warning: Drain Perimeter is specified as negative, it is set to zero\n"); + here->BSIM4Pdeff = 0.0;} + else { if (model->BSIM4perMod == 0) here->BSIM4Pdeff = here->BSIM4drainPerimeter; else here->BSIM4Pdeff = here->BSIM4drainPerimeter - pParam->BSIM4weffCJ * here->BSIM4nf; } + } else BSIM4PAeffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4min, pParam->BSIM4weffCJ, DMCGeff, DMCIeff, DMDGeff, @@ -1840,7 +1854,7 @@ int Size_Not_Found, i; Nvtms = model->BSIM4vtm * model->BSIM4SjctEmissionCoeff; if ((here->BSIM4Aseff <= 0.0) && (here->BSIM4Pseff <= 0.0)) - { SourceSatCurrent = 1.0e-14; + { SourceSatCurrent = 0.0; } else { SourceSatCurrent = here->BSIM4Aseff * model->BSIM4SjctTempSatCurDensity @@ -1899,7 +1913,7 @@ int Size_Not_Found, i; Nvtmd = model->BSIM4vtm * model->BSIM4DjctEmissionCoeff; if ((here->BSIM4Adeff <= 0.0) && (here->BSIM4Pdeff <= 0.0)) - { DrainSatCurrent = 1.0e-14; + { DrainSatCurrent = 0.0; } else { DrainSatCurrent = here->BSIM4Adeff * model->BSIM4DjctTempSatCurDensity