diff --git a/src/frontend/subckt.c b/src/frontend/subckt.c index f70d463fd..7da42f993 100644 --- a/src/frontend/subckt.c +++ b/src/frontend/subckt.c @@ -96,15 +96,13 @@ static int translate(struct card *deck, char *formal, int flen, char *actual, struct bxx_buffer; static void finishLine(struct bxx_buffer *dst, char *src, char *scname); static int settrans(char *formal, int flen, char *actual, const char *subname); -static char *gettrans(const char *name, const char *name_end); +static char *gettrans(const char *name, const char *name_end, bool *isglobal); static int numnodes(const char *line, struct subs *subs, wordlist const *modnames); static int numdevs(char *s); static wordlist *modtranslate(struct card *deck, char *subname, wordlist *new_modnames); static void devmodtranslate(struct card *deck, char *subname, wordlist * const orig_modnames); static int inp_numnodes(char c); -#define N_GLOBAL_NODES 1005 - /* hash table to store the global nodes * For now its use is limited to avoid double entries in global_nodes[] */ static NGHASHPTR glonodes = NULL; @@ -143,47 +141,35 @@ static bool use_numparams = FALSE; static char start[32], sbend[32], invoke[32], model[32]; -static char *global_nodes[N_GLOBAL_NODES]; -static int num_global_nodes; - - static void collect_global_nodes(struct card *c) { + /* hash table for global nodes */ glonodes = nghash_init(NGHASH_MIN_SIZE); - num_global_nodes = 0; - - global_nodes[num_global_nodes++] = copy("0"); - nghash_insert(glonodes, global_nodes[num_global_nodes - 1], DUMMYDATA); - + /* add 0 and null as global nodes */ + nghash_insert(glonodes, "0", DUMMYDATA); #ifdef XSPICE - global_nodes[num_global_nodes++] = copy("null"); - nghash_insert(glonodes, global_nodes[num_global_nodes - 1], DUMMYDATA); + nghash_insert(glonodes, "null", DUMMYDATA); #endif - - for (; c; c = c->nextcard) if (ciprefix(".global", c->line)) { char *s = c->line; s = nexttok(s); while (*s) { - if (num_global_nodes == N_GLOBAL_NODES) { - fprintf(stderr, "ERROR, the number of global nodes is limited to %d\n", N_GLOBAL_NODES); - controlled_exit(EXIT_FAILURE); - } char *t = skip_non_ws(s); + /* global node name */ char *gnode = copy_substring(s, t); - if (nghash_find(glonodes, gnode) == NULL) { - global_nodes[num_global_nodes++] = gnode; + /* insert only if not yet found in table */ + if (gnode && *gnode != '\0' && nghash_find(glonodes, gnode) == NULL) { nghash_insert(glonodes, gnode, DUMMYDATA); } s = skip_ws(t); } c->line[0] = '*'; /* comment it out */ } - nghash_free(glonodes, NULL, NULL); + #ifdef TRACE { @@ -201,10 +187,7 @@ collect_global_nodes(struct card *c) static void free_global_nodes(void) { - int i; - for (i = 0; i < num_global_nodes; i++) - tfree(global_nodes[i]); - num_global_nodes = 0; + nghash_free(glonodes, NULL, NULL); } @@ -1124,14 +1107,19 @@ bxx_buffer(struct bxx_buffer *t) static void translate_node_name(struct bxx_buffer *buffer, const char *scname, const char *name, const char *name_e) { - const char *t; + bool isglobal; + if (!name_e) name_e = strchr(name, '\0'); - t = gettrans(name, name_e); + t = gettrans(name, name_e, &isglobal); + if (t) { bxx_put_cstring(buffer, t); + /* free only if t is global node, nodes from table[].t_new are freed elsewhere */ + if(isglobal) + tfree(t); } else { bxx_put_cstring(buffer, scname); bxx_putc(buffer, '.'); @@ -1641,21 +1629,26 @@ eq_substr(const char *str, const char *end, const char *cstring) * otherwise it returns NULL. *------------------------------------------------------------------------------*/ static char * -gettrans(const char *name, const char *name_end) +gettrans(const char *name, const char *name_end, bool *isglobal) { int i; + *isglobal = FALSE; if (!name_end) name_end = strchr(name, '\0'); /* Added by H.Tanaka to translate global nodes */ - for (i = 0; i