From 2c94087510ffe16997b92f7acc1f344a9aff7f7f Mon Sep 17 00:00:00 2001 From: "R. Timothy Edwards" Date: Sun, 28 Jun 2026 11:44:42 -0400 Subject: [PATCH] Corrected an error in delimiter parsing, which is due to the lack of any standard array delimiter character in SPICE. Often brackets are used, but just as often angle brackets are used instead, and do not match the bracket syntax of verilog. The "matchnocase" function automatically casts common delimiter characters to a single type to facilitate matching between names using different delimiters. However, some code in MatchPins() was assuming square brackets and breaking this allowance, causing pins to be marked mismatch in spite of the handling in "matchnocase". The code has been corrected to make the same allowance for different delimiter characters everywhere. --- VERSION | 2 +- base/netcmp.c | 21 +++++++++++---------- base/objlist.c | 27 +++++++++++++++++++++++++++ base/objlist.h | 2 ++ 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/VERSION b/VERSION index 14ba5da..b8dfb32 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.321 +1.5.322 diff --git a/base/netcmp.c b/base/netcmp.c index 5985a03..f47b95a 100644 --- a/base/netcmp.c +++ b/base/netcmp.c @@ -7897,6 +7897,7 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist) j = 0; for (ob2 = tc2->cell; ob2 != NULL; ob2 = ob2->next) { char *name1, *name2, *aptr1 = NULL, *aptr2 = NULL; + char delim1, delim2; if (!IsPort(ob2)) break; @@ -7920,8 +7921,8 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist) /* matchfunc(). */ if ((tc1->flags & CELL_PLACEHOLDER) || (tc2->flags && CELL_PLACEHOLDER)) { - aptr1 = strchr(name1, '['); - aptr2 = strchr(name2, '['); + aptr1 = get_array_delimiter(name1, &delim1); + aptr2 = get_array_delimiter(name2, &delim2); if ((aptr1 != NULL) && (aptr2 == NULL)) { *aptr1 = '\0'; @@ -7934,8 +7935,8 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist) if (!IsPort(ob3)) break; if (ob3 == ob1) continue; if (!strncmp(ob3->name, name1, strlen(name1)) && - *(ob3->name + strlen(name1)) == '[') { - *aptr1 = '['; + is_delimiter(*(ob3->name + strlen(name1)))) { + *aptr1 = delim1; break; } } @@ -7953,8 +7954,8 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist) if (!IsPort(ob3)) break; if (ob3 == ob2) continue; if (!strncmp(ob3->name, name2, strlen(name2)) && - *(ob3->name + strlen(name2)) == '[') { - *aptr2 = '['; + is_delimiter(*(ob3->name + strlen(name2)))) { + *aptr2 = delim2; break; } } @@ -7964,8 +7965,8 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist) if ((*matchfunc)(name1, name2)) { - if (aptr1) *aptr1 = '['; - if (aptr2) *aptr2 = '['; + if (aptr1) *aptr1 = delim1; + if (aptr2) *aptr2 = delim2; /* If both sides have unconnected nodes, then pins with */ /* matching names are an automatic match. Otherwise, if */ @@ -8120,8 +8121,8 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist) } } if (bangptr2) *bangptr2 = '!'; - if (aptr1) *aptr1 = '['; - if (aptr2) *aptr2 = '['; + if (aptr1) *aptr1 = delim1; + if (aptr2) *aptr2 = delim2; j++; } } diff --git a/base/objlist.c b/base/objlist.c index 1849168..716a556 100644 --- a/base/objlist.c +++ b/base/objlist.c @@ -282,6 +282,33 @@ int matchfilenocase(char *st1, char *st2, int f1, int f2) return 1; } +/* Delimiter matching---Find an opening delimiter in a string. */ +/* Return the position of the first opening delimeter in the string, */ +/* like strchr(). Place the actual delimeter character in *delim. */ + +char *get_array_delimiter(char *name, char *delim) +{ + char *stest = name; + + while (*stest != '\0') + { + if (to_lower[*stest] == '<') { + *delim = *stest; + return stest; + } + stest++; + } + return NULL; +} + +/* Delimiter parsing---Check if a character is an opening array delimiter. */ +/* Return TRUE if the character is an opening delimiter, FALSE if not. */ + +int is_delimiter(char testc) +{ + return (to_lower[testc] == '<') ? TRUE : FALSE; +} + #ifdef HAVE_MALLINFO void PrintMemoryStats(void) { diff --git a/base/objlist.h b/base/objlist.h index b0c3feb..4e5023f 100644 --- a/base/objlist.h +++ b/base/objlist.h @@ -309,6 +309,8 @@ extern int match(char *, char *); extern int matchnocase(char *, char *); extern int matchfile(char *, char *, int, int); extern int matchfilenocase(char *, char *, int, int); +extern int is_delimiter(char); +extern char *get_array_delimiter(char *, char *); extern void GarbageCollect(void); extern void InitGarbageCollection(void);