From 6619b7265ea70c0f4dc3bda0288aee9e8bcc32de Mon Sep 17 00:00:00 2001 From: Brian Taylor Date: Sun, 21 Sep 2025 09:32:06 -0700 Subject: [PATCH 1/4] Fix memory leaks in INPpas4 and get_number_terminals found using paranoia_parallel. --- src/frontend/inpcom.c | 18 +++++++++++++----- src/spicelib/parser/inppas4.c | 1 + 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 9c354356e..ff693b115 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -5171,7 +5171,6 @@ int get_number_terminals(char *c) { int i, j, k; char *inst; - char *name[12]; bool area_found = FALSE; if (!c) @@ -5277,20 +5276,26 @@ int get_number_terminals(char *c) * */ /* 12 tokens maximum */ { + char *name[12]; char* cc, * ccfree; + (void) memset(name, 0, sizeof(name)); cc = copy(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) { name[i] = gettok_instance(&cc); + if (!name[i] || name[i][0] == '\0') { + continue; + } if (search_plain_identifier(name[i], "off")) { j++; } #ifdef CIDER - if (search_plain_identifier(name[i], "save") || - search_plain_identifier(name[i], "print")) { + if (search_plain_identifier(name[i], "save")) { + j++; + } else if (search_plain_identifier(name[i], "print")) { j++; } #endif @@ -5320,8 +5325,11 @@ int get_number_terminals(char *c) if (only_digits && (strchr(name[k - 1], ',') == NULL)) area_found = TRUE; } - for (k = i; k >= 0; k--) - tfree(name[k]); + for (k = 0; k < 12; k++) { + if (name[k]) { + tfree(name[k]); + } + } if (area_found) { return i - j - 2; } diff --git a/src/spicelib/parser/inppas4.c b/src/spicelib/parser/inppas4.c index f053435d8..dd6096577 100644 --- a/src/spicelib/parser/inppas4.c +++ b/src/spicelib/parser/inppas4.c @@ -58,6 +58,7 @@ void INPpas4(CKTcircuit *ckt, INPtables *tab) char* devname = tprintf("capac%dshunt", nn); (*(ft_sim->newInstance))(ckt, tab->defCmod, &fast, devname); + txfree(devname); /* the top node, second node is gnd automatically */ (*(ft_sim->bindNode))(ckt, fast, 1, node); From 1921d64163beb573fddc21f4e5af226bad5fb6b6 Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 23 Sep 2025 16:47:52 +0200 Subject: [PATCH 2/4] count level=3 model poly and metal capacitance in charge calculation --- src/spicelib/devices/dio/dioload.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spicelib/devices/dio/dioload.c b/src/spicelib/devices/dio/dioload.c index 65a88b82a..9c3aa3f00 100644 --- a/src/spicelib/devices/dio/dioload.c +++ b/src/spicelib/devices/dio/dioload.c @@ -435,7 +435,7 @@ next1: diffcharge = here->DIOtTransitTime*cd; *(ckt->CKTstate0 + here->DIOcapCharge) = - diffcharge + deplcharge + deplchargeSW; + diffcharge + deplcharge + deplchargeSW + (here->DIOcmetal + here->DIOcpoly)*vd; diffcap = here->DIOtTransitTime*gd; From 2a5f9e3ba88ccbd4737eecf15551d4b855b75251 Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 23 Sep 2025 17:02:42 +0200 Subject: [PATCH 3/4] correct xoi and xom defaults to Angstrom and clarify comments --- src/spicelib/devices/dio/diompar.c | 4 ++-- src/spicelib/devices/dio/diosetup.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/spicelib/devices/dio/diompar.c b/src/spicelib/devices/dio/diompar.c index 8c06b4bfc..e68052eb0 100644 --- a/src/spicelib/devices/dio/diompar.c +++ b/src/spicelib/devices/dio/diompar.c @@ -263,11 +263,11 @@ DIOmParam(int param, IFvalue *value, GENmodel *inModel) model->DIOwidthPolyGiven = TRUE; break; case DIO_MOD_XOM: - model->DIOmetalOxideThick = value->rValue * 1e-10; /* m */ + model->DIOmetalOxideThick = value->rValue * 1e-10; /* Angstrom -> m */ model->DIOmetalOxideThickGiven = TRUE; break; case DIO_MOD_XOI: - model->DIOpolyOxideThick = value->rValue * 1e-10; /* m */ + model->DIOpolyOxideThick = value->rValue * 1e-10; /* Angstrom -> m */ model->DIOpolyOxideThickGiven = TRUE; break; case DIO_MOD_XM: diff --git a/src/spicelib/devices/dio/diosetup.c b/src/spicelib/devices/dio/diosetup.c index d67449313..98ced6e01 100644 --- a/src/spicelib/devices/dio/diosetup.c +++ b/src/spicelib/devices/dio/diosetup.c @@ -259,10 +259,10 @@ DIOsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) model->DIOwidthPoly = 0.0; } if(!model->DIOmetalOxideThickGiven) { - model->DIOmetalOxideThick = 1e-06; /* m */ + model->DIOmetalOxideThick = 1e4; /* 10k Angstrom */ } if(!model->DIOpolyOxideThickGiven) { - model->DIOpolyOxideThick = 1e-06; /* m */ + model->DIOpolyOxideThick = 1e4; /* 10k Angstrom */ } if(!model->DIOmetalMaskOffsetGiven) { model->DIOmetalMaskOffset = 0.0; From c5dd1bd3791c7e54a21351129ac128015d23d081 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Tue, 23 Sep 2025 22:57:48 +0200 Subject: [PATCH 4/4] Typo --- src/spicelib/devices/bsim4v6/b4v6check.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spicelib/devices/bsim4v6/b4v6check.c b/src/spicelib/devices/bsim4v6/b4v6check.c index d78af90be..5c01820a6 100644 --- a/src/spicelib/devices/bsim4v6/b4v6check.c +++ b/src/spicelib/devices/bsim4v6/b4v6check.c @@ -55,7 +55,7 @@ CKTcircuit *ckt) wl = wlstart = TMALLOC(wordlist, 1); wl->wl_prev = NULL; wl->wl_next = NULL; - wl->wl_word = tprintf("\nChecking parameters for BSIM 4.5 model %s\n", model->BSIM4v6modName); + wl->wl_word = tprintf("\nChecking parameters for BSIM 4.6 model %s\n", model->BSIM4v6modName); if ((here->BSIM4v6rgateMod == 2) || (here->BSIM4v6rgateMod == 3)) { if ((here->BSIM4v6trnqsMod == 1) || (here->BSIM4v6acnqsMod == 1)) {