diff --git a/ChangeLog b/ChangeLog index b586ca150..491675b42 100644 --- a/ChangeLog +++ b/ChangeLog @@ -13794,7 +13794,7 @@ New include File: 2010-10-09 Robert Larice * src/include/complex.h : !REVERT! remove typedef for _complex, which is used nowhere - this breaks MSVC, currently unkown why, FIXME + this breaks MSVC, currently unknown why, FIXME 2010-10-09 Robert Larice * src/frontend/parse-bison.c , diff --git a/NEWS b/NEWS index a9b487200..f0816b363 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,9 @@ +Ngspice-45.2, Sept. 5th, 2025 +============ +- Bug-fix release + + A bug in the MS Windows version has been fixed + (bug no. 804, see https://sourceforge.net/p/ngspice/bugs/804/) + Ngspice-45, August 17th, 2025 ============ - New features: diff --git a/autogen.sh b/autogen.sh index bd1c3f5a0..2e3b036c7 100755 --- a/autogen.sh +++ b/autogen.sh @@ -115,6 +115,10 @@ fi exit 1 } +echo "Removing files to be remade" +rm -f Makefile.in aclocal.m4 ar-lib config.guess config.sub +rm -f depcomp install-sh ltmain.sh missing ylwrap +rm -r -f autom4te.cache echo "Running $LIBTOOLIZE" $LIBTOOLIZE --copy --force \ diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index ff9bb8072..40d1809d6 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -5283,11 +5283,9 @@ int get_number_terminals(char *c) /* required to make m= 1 a single token m=1 */ ccfree = cc = inp_remove_ws(cc); for (i = j = 0; (i < 12) && (*cc != '\0'); ++i) { - char* comma; name[i] = gettok_instance(&cc); - if (search_plain_identifier(name[i], "off") || - strchr(name[i], '=')) { + if (search_plain_identifier(name[i], "off")) { j++; } #ifdef CIDER @@ -5296,16 +5294,13 @@ int get_number_terminals(char *c) j++; } #endif - /* If we have IC=VBE, VCE instead of IC=VBE,VCE - * we need to increment j. - */ - if ((comma = strchr(name[i], ',')) != NULL && - (*(++comma) == '\0')) - j++; - /* If we have IC=VBE , VCE ("," is a token) we need to inc j - */ - if (eq(name[i], ",")) - j++; + if (strchr(name[i], '=')) { + break; + } + /* an expression for area {...}, (without area={...})*/ + if (*name[i] == '{') { + break; + } } i--; tfree(ccfree); @@ -9844,6 +9839,10 @@ static void inp_meas_control(struct card* card) * might need to add the prefix separately if using the result in APIs * that require it for long path support. * + * Using this function however may neglect the ngspice file search sequence, + * as an absolute path is returned also for relative paths. + * So restrict this function to paths longer than MAX_PATH. + * * @param input_path The input path string (UTF-8 encoded). Can be relative or * absolute, may contain '.' or '..'. * @return char* A newly allocated UTF-8 string containing the canonical absolute @@ -9869,6 +9868,10 @@ char* get_windows_canonical_path(const char* input_path) { inputLenMB = (int)strlen(input_path); + /* If path length is less than MAX_PATH, just copy and return path. */ + if (inputLenMB < MAX_PATH) + return copy(input_path); + if (inputLenMB == 0) { inputLenW = 1; } diff --git a/src/frontend/options.c b/src/frontend/options.c index 0b54881ba..7dfe6f97a 100644 --- a/src/frontend/options.c +++ b/src/frontend/options.c @@ -330,7 +330,7 @@ cp_usrset(struct variable *var, bool isset) ft_stricterror = isset; if (ft_ngdebug) fprintf(stdout, "Note: strict_errorhandling is set\n"); - /* Immediately bail out when spinit error has occured */ + /* Immediately bail out when spinit error has occurred */ if (ft_spiniterror) controlled_exit(EXIT_BAD); } else if (eq(var->va_name, "rawfileprec")) { diff --git a/src/include/ngspice/klu.h b/src/include/ngspice/klu.h index 248b9bf64..7e64bcdc5 100644 --- a/src/include/ngspice/klu.h +++ b/src/include/ngspice/klu.h @@ -133,7 +133,7 @@ typedef struct /* 64-bit version (otherwise same as above) */ #define KLU_EMPTY_MATRIX (2) /* Modified by Francesco Lannutti - Case when the matrix is empty */ #define KLU_OUT_OF_MEMORY (-2) #define KLU_INVALID (-3) -#define KLU_TOO_LARGE (-4) /* integer overflow has occured */ +#define KLU_TOO_LARGE (-4) /* integer overflow has occurred */ typedef struct klu_common_struct { diff --git a/src/osdi/osdisetup.c b/src/osdi/osdisetup.c index 4feb3ec90..46cabceb5 100644 --- a/src/osdi/osdisetup.c +++ b/src/osdi/osdisetup.c @@ -46,7 +46,6 @@ static int handle_init_info(OsdiInitInfo info, const OsdiDescriptor *descr) { printf("Unknown OSDO init error code %d!\n", err->code); } } - free(info.errors); errMsg = tprintf("%i errors occurred during initialization", info.num_errors); return (E_PRIVATE); } diff --git a/src/spicelib/devices/bsim4/b4.c b/src/spicelib/devices/bsim4/b4.c index b39901f32..438c1498b 100644 --- a/src/spicelib/devices/bsim4/b4.c +++ b/src/spicelib/devices/bsim4/b4.c @@ -71,6 +71,9 @@ IOP( "mult_i", BSIM4_MULT_I, IF_REAL, "Variability in current"), IOP( "mult_q", BSIM4_MULT_Q, IF_REAL, "Variability in charge"), IOP( "mult_fn", BSIM4_MULT_FN, IF_REAL, "Variability in flicker noise"), IP( "ic", BSIM4_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), +IOP( "icvgs", BSIM4_IC_VGS, IF_REAL , "GS initial voltage"), +IOP( "icvds", BSIM4_IC_VDS, IF_REAL , "DS initial voltage"), +IOP( "icvbs", BSIM4_IC_VBS, IF_REAL , "BS initial voltage"), OP( "gmbs", BSIM4_GMBS, IF_REAL, "Gmb"), OP( "gm", BSIM4_GM, IF_REAL, "Gm"), OP( "gds", BSIM4_GDS, IF_REAL, "Gds"), diff --git a/src/spicelib/devices/bsim4/b4acld.c b/src/spicelib/devices/bsim4/b4acld.c index 18257423c..c972d6866 100644 --- a/src/spicelib/devices/bsim4/b4acld.c +++ b/src/spicelib/devices/bsim4/b4acld.c @@ -462,8 +462,8 @@ double m, mult_i, mult_q; * Loading AC matrix */ m = here->BSIM4m; - mult_i = here->BSIM4mult_i; - mult_q = here->BSIM4mult_q; + mult_i = here->BSIM4mult_i * here->BSIM4m; + mult_q = here->BSIM4mult_q * here->BSIM4m; if (!model->BSIM4rdsMod) { gdpr = here->BSIM4drainConductance; diff --git a/src/spicelib/devices/bsim4/b4ask.c b/src/spicelib/devices/bsim4/b4ask.c index c0f843e95..d43e1a708 100644 --- a/src/spicelib/devices/bsim4/b4ask.c +++ b/src/spicelib/devices/bsim4/b4ask.c @@ -203,11 +203,11 @@ BSIM4instance *here = (BSIM4instance*)inst; return(OK); case BSIM4_SOURCECONDUCT: value->rValue = here->BSIM4sourceConductance; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_DRAINCONDUCT: value->rValue = here->BSIM4drainConductance; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_VBD: value->rValue = *(ckt->CKTstate0 + here->BSIM4vbd); @@ -223,67 +223,67 @@ BSIM4instance *here = (BSIM4instance*)inst; return(OK); case BSIM4_CD: value->rValue = here->BSIM4cd; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_CBS: value->rValue = here->BSIM4cbs; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_CBD: value->rValue = here->BSIM4cbd; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_CSUB: value->rValue = here->BSIM4csub; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_IGIDL: value->rValue = here->BSIM4Igidl; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_IGISL: value->rValue = here->BSIM4Igisl; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_IGS: value->rValue = here->BSIM4Igs; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_IGD: value->rValue = here->BSIM4Igd; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_IGB: value->rValue = here->BSIM4Igb; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_IGCS: value->rValue = here->BSIM4Igcs; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_IGCD: value->rValue = here->BSIM4Igcd; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_GM: value->rValue = here->BSIM4gm; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_GDS: value->rValue = here->BSIM4gds; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_GMBS: value->rValue = here->BSIM4gmbs; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_GBD: value->rValue = here->BSIM4gbd; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_GBS: value->rValue = here->BSIM4gbs; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); /* case BSIM4_QB: value->rValue = *(ckt->CKTstate0 + here->BSIM4qb); @@ -308,19 +308,19 @@ BSIM4instance *here = (BSIM4instance*)inst; return(OK); */ case BSIM4_QB: value->rValue = here->BSIM4qbulk; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_QG: value->rValue = here->BSIM4qgate; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_QS: value->rValue = here->BSIM4qsrc; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_QD: value->rValue = here->BSIM4qdrn; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_QINV: value->rValue = here->BSIM4qinv; @@ -330,82 +330,82 @@ BSIM4instance *here = (BSIM4instance*)inst; return(OK); case BSIM4_GCRG: value->rValue = here->BSIM4gcrg; - value->rValue *= here->BSIM4mult_i; + value->rValue *= here->BSIM4mult_i * here->BSIM4m; return(OK); case BSIM4_GTAU: value->rValue = here->BSIM4gtau; return(OK); case BSIM4_CGGB: value->rValue = here->BSIM4cggb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CGDB: value->rValue = here->BSIM4cgdb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CGSB: value->rValue = here->BSIM4cgsb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CDGB: value->rValue = here->BSIM4cdgb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CDDB: value->rValue = here->BSIM4cddb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CDSB: value->rValue = here->BSIM4cdsb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CBGB: value->rValue = here->BSIM4cbgb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CBDB: value->rValue = here->BSIM4cbdb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CBSB: value->rValue = here->BSIM4cbsb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CSGB: value->rValue = here->BSIM4csgb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CSDB: value->rValue = here->BSIM4csdb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CSSB: value->rValue = here->BSIM4cssb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CGBB: value->rValue = here->BSIM4cgbb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CDBB: value->rValue = here->BSIM4cdbb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CSBB: value->rValue = here->BSIM4csbb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CBBB: value->rValue = here->BSIM4cbbb; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CAPBD: value->rValue = here->BSIM4capbd; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CAPBS: value->rValue = here->BSIM4capbs; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_VON: value->rValue = here->BSIM4von; @@ -427,15 +427,15 @@ BSIM4instance *here = (BSIM4instance*)inst; return(OK); case BSIM4_CGSO: value->rValue = here->BSIM4cgso; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CGDO: value->rValue = here->BSIM4cgdo; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_CGBO: value->rValue = here->pParam->BSIM4cgbo; - value->rValue *= here->BSIM4mult_q; + value->rValue *= here->BSIM4mult_q * here->BSIM4m; return(OK); case BSIM4_WEFF: value->rValue = here->pParam->BSIM4weff; diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index da408eaef..af8713ef8 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -4986,9 +4986,9 @@ line900: */ m = here->BSIM4m; - mult_i = here->BSIM4mult_i; - mult_q = here->BSIM4mult_q; - + mult_i = here->BSIM4mult_i * here->BSIM4m; + mult_q = here->BSIM4mult_q * here->BSIM4m; + #ifdef USE_OMP here->BSIM4rhsdPrime = (mult_i * (ceqjd - ceqbd + ceqgdtot - ceqdrn + Idtoteq) - mult_q * ceqqd); @@ -5006,9 +5006,9 @@ line900: - ceqgstot + Istoteq) + mult_q * (ceqqg + ceqqb + ceqqd + ceqqgmid)); } else - { here->BSIM4rhsdb = mult_i * (ceqjd + ceqqjd); + { here->BSIM4rhsdb = mult_i * (ceqjd /*+ ceqqjd */) + mult_q * ceqqjd; here->BSIM4rhsbPrime = (mult_i * (ceqbd + ceqbs + Ibtoteq) - mult_q * ceqqb); - here->BSIM4rhssb = mult_i * (ceqjs + ceqqjs); + here->BSIM4rhssb = mult_i * (ceqjs /*+ ceqqjs*/) + mult_q * ceqqjs; here->BSIM4rhssPrime = (mult_i * (ceqdrn - ceqbs + ceqjs - ceqgstot + Istoteq) + mult_q * (ceqqd + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid)); } @@ -5037,9 +5037,9 @@ line900: - ceqgstot + Istoteq) + mult_q * (ceqqg + ceqqb + ceqqd + ceqqgmid))); } else - { (*(ckt->CKTrhs + here->BSIM4dbNode) -= mult_i * (ceqjd + ceqqjd)); + { (*(ckt->CKTrhs + here->BSIM4dbNode) -= mult_i * (ceqjd /*+ ceqqjd*/) + mult_q * ceqqjd); (*(ckt->CKTrhs + here->BSIM4bNodePrime) += (mult_i * (ceqbd + ceqbs + Ibtoteq) - mult_q * ceqqb)); - (*(ckt->CKTrhs + here->BSIM4sbNode) -= mult_i * (ceqjs + ceqqjs)); + (*(ckt->CKTrhs + here->BSIM4sbNode) -= mult_i * (ceqjs /*+ ceqqjs*/) + mult_q * ceqqjs); (*(ckt->CKTrhs + here->BSIM4sNodePrime) += (mult_i * (ceqdrn - ceqbs + ceqjs - ceqgstot + Istoteq) + mult_q * (ceqqd + ceqqg + ceqqb + ceqqjd + ceqqjs + ceqqgmid))); } @@ -5227,9 +5227,9 @@ line900: here->BSIM4_99 = m * (ggts - gcqsb); here->BSIM4_100 = m * (ggtb - gcqbb); - here->BSIM4_101 = m * dxpart * here->BSIM4gtau; - here->BSIM4_102 = m * sxpart * here->BSIM4gtau; - here->BSIM4_103 = m * here->BSIM4gtau; + here->BSIM4_101 = mult_q * dxpart * here->BSIM4gtau; + here->BSIM4_102 = mult_q * sxpart * here->BSIM4gtau; + here->BSIM4_103 = mult_q * here->BSIM4gtau; } #else if (here->BSIM4rgateMod == 1) @@ -5382,9 +5382,9 @@ line900: (*(here->BSIM4QspPtr) += m * (ggts - gcqsb)); (*(here->BSIM4QbpPtr) += m * (ggtb - gcqbb)); - (*(here->BSIM4DPqPtr) += m * (dxpart * here->BSIM4gtau)); - (*(here->BSIM4SPqPtr) += m * (sxpart * here->BSIM4gtau)); - (*(here->BSIM4GPqPtr) -= m * (here->BSIM4gtau)); + (*(here->BSIM4DPqPtr) += mult_q * (dxpart * here->BSIM4gtau)); + (*(here->BSIM4SPqPtr) += mult_q * (sxpart * here->BSIM4gtau)); + (*(here->BSIM4GPqPtr) -= mult_q * (here->BSIM4gtau)); } #endif diff --git a/src/spicelib/devices/bsim4/b4noi.c b/src/spicelib/devices/bsim4/b4noi.c index 473dea60d..c6aa87936 100644 --- a/src/spicelib/devices/bsim4/b4noi.c +++ b/src/spicelib/devices/bsim4/b4noi.c @@ -155,8 +155,8 @@ double mult_i, mult_fn; } break; case N_CALC: - mult_i = here->BSIM4mult_i; - mult_fn = here->BSIM4mult_fn; + mult_i = here->BSIM4mult_i * here->BSIM4m; + mult_fn = here->BSIM4mult_fn * here->BSIM4m; switch (mode) { case N_DENS: if (model->BSIM4tnoiMod == 0) @@ -366,9 +366,7 @@ double mult_i, mult_fn; epsilon = (T7 - T7 * T7 * T7 / 3.0) / (6.0 * T6); T8 = here->BSIM4Vgsteff / here->BSIM4EsatL; T8 *= T8; - if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3)) && - (strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) && - (strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4))) + if (model->BSIM4v48intVersion<=BSIM4v48V480) { npart_c = model->BSIM4rnoic * (1.0 + T8 * model->BSIM4tnoic * Leff); @@ -420,9 +418,7 @@ double mult_i, mult_fn; } switch(model->BSIM4tnoiMod) { case 0: - if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3)) && - (strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) && - (strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4))) + if (model->BSIM4v48intVersion<=BSIM4v48V480) { T0 = here->BSIM4ueff * fabs(here->BSIM4qinv); T1 = T0 * tmp + pParam->BSIM4leff @@ -449,9 +445,7 @@ double mult_i, mult_fn; } break; case 1: - if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && (strncmp(model->BSIM4version, "4.8", 3)) && - (strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) && - (strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4))) + if (model->BSIM4v48intVersion<=BSIM4v48V480) { T0 = here->BSIM4gm + here->BSIM4gmbs + here->BSIM4gds; T0 *= T0; diff --git a/src/spicelib/devices/bsim4/b4pzld.c b/src/spicelib/devices/bsim4/b4pzld.c index 970f78889..ff66cf13a 100644 --- a/src/spicelib/devices/bsim4/b4pzld.c +++ b/src/spicelib/devices/bsim4/b4pzld.c @@ -494,8 +494,8 @@ double m, mult_i, mult_q; * Loading PZ matrix */ m = here->BSIM4m; - mult_i = here->BSIM4mult_i; - mult_q = here->BSIM4mult_q; + mult_i = here->BSIM4mult_i * here->BSIM4m; + mult_q = here->BSIM4mult_q * here->BSIM4m; if (!model->BSIM4rdsMod) { gdpr = here->BSIM4drainConductance; diff --git a/src/spicelib/devices/bsim4/b4set.c b/src/spicelib/devices/bsim4/b4set.c index 0637be32e..71bc75a81 100644 --- a/src/spicelib/devices/bsim4/b4set.c +++ b/src/spicelib/devices/bsim4/b4set.c @@ -203,6 +203,19 @@ BSIM4instance **InstArray; } if (!model->BSIM4versionGiven) model->BSIM4version = copy("4.8.3"); + /* Speed up version checking via integer version number */ + if ((!strcmp(model->BSIM4version, "4.8.3"))||(!strncmp(model->BSIM4version, "4.83", 4))||(!strncmp(model->BSIM4version, "4.8", 3))) { + model->BSIM4v48intVersion = BSIM4v48V483; + } else if ((!strcmp(model->BSIM4version, "4.8.2"))||(!strncmp(model->BSIM4version, "4.82", 4))) { + model->BSIM4v48intVersion = BSIM4v48V482; + } else if ((!strcmp(model->BSIM4version, "4.8.1"))||(!strncmp(model->BSIM4version, "4.81", 4))) { + model->BSIM4v48intVersion = BSIM4v48V481; + } else if ((!strcmp(model->BSIM4version, "4.8.0"))||(!strncmp(model->BSIM4version, "4.80", 4))) { + model->BSIM4v48intVersion = BSIM4v48V480; + } else { + printf("Warning: unknown BSIM4 version. Working now with BSIM4.8.3.\n"); + model->BSIM4v48intVersion = BSIM4v48V483; + } if (!model->BSIM4toxrefGiven) model->BSIM4toxref = 30.0e-10; if (!model->BSIM4eotGiven) @@ -342,9 +355,7 @@ BSIM4instance **InstArray; if (!model->BSIM4ucsGiven) model->BSIM4ucs = (model->BSIM4type == NMOS) ? 1.67 : 1.0; - if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && - (strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) && - (strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4))) + if (model->BSIM4v48intVersion<=BSIM4v48V480) { if (!model->BSIM4uaGiven) model->BSIM4ua = ((model->BSIM4mobMod == 2)) ? 1.0e-15 : 1.0e-9; /* unit m/V */ @@ -2361,10 +2372,6 @@ BSIM4instance **InstArray; if (!here->BSIM4ngconGiven) here->BSIM4ngcon = model->BSIM4ngcon; - here->BSIM4mult_i = here->BSIM4mult_i * here->BSIM4m; - here->BSIM4mult_q = here->BSIM4mult_q * here->BSIM4m; - here->BSIM4mult_fn = here->BSIM4mult_fn * here->BSIM4m; - /* Process instance model selectors, some * may override their global counterparts */ diff --git a/src/spicelib/devices/bsim4/b4temp.c b/src/spicelib/devices/bsim4/b4temp.c index 3c9796db6..9e786ab3c 100644 --- a/src/spicelib/devices/bsim4/b4temp.c +++ b/src/spicelib/devices/bsim4/b4temp.c @@ -122,8 +122,12 @@ int Fatal_Flag = 0; if(model->BSIM4mtrlMod == 0) { + double chktol = fabs(model->BSIM4toxe); + if (fabs(model->BSIM4toxp)>chktol) chktol = fabs(model->BSIM4toxp); + if (fabs(model->BSIM4dtox)>chktol) chktol = fabs(model->BSIM4dtox); + chktol=chktol*1e-14; if ((model->BSIM4toxeGiven) && (model->BSIM4toxpGiven) && (model->BSIM4dtoxGiven) - && (model->BSIM4toxe != (model->BSIM4toxp + model->BSIM4dtox))) + && (fabs(model->BSIM4toxe-(model->BSIM4toxp + model->BSIM4dtox))>chktol)) { printf("Warning: toxe, toxp and dtox all given and toxe != toxp + dtox; dtox ignored.\n"); } else if ((model->BSIM4toxeGiven) && (!model->BSIM4toxpGiven)) @@ -1368,10 +1372,7 @@ int Fatal_Flag = 0; pParam->BSIM4Aechvb = (model->BSIM4type == NMOS) ? 4.97232e-7 : 3.42537e-7; pParam->BSIM4Bechvb = (model->BSIM4type == NMOS) ? 7.45669e11 : 1.16645e12; - if ((strcmp(model->BSIM4version, "4.8.1")) && (strncmp(model->BSIM4version, "4.81", 4)) && - (strcmp(model->BSIM4version, "4.8.2")) && (strncmp(model->BSIM4version, "4.82", 4)) && - (strcmp(model->BSIM4version, "4.8.3")) && (strncmp(model->BSIM4version, "4.83", 4))) - { + if (model->BSIM4v48intVersion<=BSIM4v48V480) { pParam->BSIM4AechvbEdgeS = pParam->BSIM4Aechvb * pParam->BSIM4weff * model->BSIM4dlcig * pParam->BSIM4ToxRatioEdge; pParam->BSIM4AechvbEdgeD = pParam->BSIM4Aechvb * pParam->BSIM4weff diff --git a/src/spicelib/devices/bsim4/bsim4def.h b/src/spicelib/devices/bsim4/bsim4def.h index a2bff4121..6d7d652e8 100644 --- a/src/spicelib/devices/bsim4/bsim4def.h +++ b/src/spicelib/devices/bsim4/bsim4def.h @@ -941,7 +941,12 @@ typedef struct sBSIM4model int BSIM4tempMod; int BSIM4binUnit; int BSIM4paramChk; - char *BSIM4version; + char *BSIM4version; + int BSIM4v48intVersion; +#define BSIM4v48V483 483 /* BSIM4v48 V4.8.3 */ +#define BSIM4v48V482 482 /* BSIM4v48 V4.8.2 */ +#define BSIM4v48V481 481 /* BSIM4v48 V4.8.1 */ +#define BSIM4v48V480 480 /* BSIM4v48 V4.8.0 */ double BSIM4eot; double BSIM4vddeot; double BSIM4tempeot; diff --git a/src/spicelib/devices/vsrc/vsrcset.c b/src/spicelib/devices/vsrc/vsrcset.c index e9febf2a7..b539fc493 100644 --- a/src/spicelib/devices/vsrc/vsrcset.c +++ b/src/spicelib/devices/vsrc/vsrcset.c @@ -107,13 +107,13 @@ VSRCunsetup(GENmodel *inModel, CKTcircuit *ckt) VSRCinstance *here; for (model = (VSRCmodel *)inModel; model != NULL; - model = VSRCnextModel(model)) + model = VSRCnextModel(model)) { for (here = VSRCinstances(model); here != NULL; here=VSRCnextInstance(here)) - { - if (here->VSRCbranch > 0) - CKTdltNNum(ckt, here->VSRCbranch); + { + if (here->VSRCbranch > 0) + CKTdltNNum(ckt, here->VSRCbranch); here->VSRCbranch = 0; #ifdef RFSPICE if ((here->VSRCresNode > 0) & (here->VSRCisPort)) @@ -121,7 +121,7 @@ VSRCunsetup(GENmodel *inModel, CKTcircuit *ckt) here->VSRCresNode = 0; #endif - } + } } return OK; } diff --git a/src/xspice/icm/analog/file_source/cfunc.mod b/src/xspice/icm/analog/file_source/cfunc.mod index 2190b1a67..73eb12e68 100644 --- a/src/xspice/icm/analog/file_source/cfunc.mod +++ b/src/xspice/icm/analog/file_source/cfunc.mod @@ -336,9 +336,9 @@ void cm_filesource(ARGS) /* structure holding parms, inputs, outputs, etc. loc->timeinterval[1] = loc->indata->datavec[loc->indata->actpointer + stepsize]; if (terr) - cm_message_printf("WARNING: some error occured during reading the time values"); + cm_message_printf("WARNING: some error occurred during reading the time values"); if (derr) - cm_message_printf("WARNING: some error occured during reading the data values"); + cm_message_printf("WARNING: some error occurred during reading the data values"); } loc = STATIC_VAR (locdata);