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);