diff --git a/src/actions.c b/src/actions.c index 4f82f679..0ee44a3f 100644 --- a/src/actions.c +++ b/src/actions.c @@ -1216,23 +1216,27 @@ void launcher(void) } } -const char *get_sym_name(int inst, int ext) + +/* get symbol reference of instance 'inst', looking into + * instance 'schematic' attribute (and appending '.sym') if set + * or get it from inst[inst].name. + * perform tcl substitution of the result and + * return the last 'ndir' directory components of symbol reference. */ +const char *get_sym_name(int inst, int ndir, int ext) { const char *sym, *sch; /* instance based symbol selection */ sch = get_tok_value(xctx->inst[inst].prop_ptr, "schematic", 0); if(xctx->tok_size) { /* token exists */ - if(ext) sym = get_cell_w_ext(add_ext(rel_sym_path(sch), ".sym"), 0); - else sym = get_cell(add_ext(rel_sym_path(sch), ".sym"), 0); + sym = add_ext(rel_sym_path(sch), ".sym"); } - else if(ext) { - sym = get_cell_w_ext(tcl_hook2(xctx->inst[inst].name), 0); - } else { - sym = get_cell(tcl_hook2(xctx->inst[inst].name), 0); + else { + sym = tcl_hook2(xctx->inst[inst].name); } - dbg(1, "get_sym_name(): inst=%d, ext=%d, returning sym=%s\n", inst, ext, sym); - return sym; + + if(ext) return get_cell_w_ext(sym, ndir); + else return get_cell(sym, ndir); } void copy_symbol(xSymbol *dest_sym, xSymbol *src_sym) diff --git a/src/netlist.c b/src/netlist.c index e75d3cd4..31a2c97c 100644 --- a/src/netlist.c +++ b/src/netlist.c @@ -1380,8 +1380,8 @@ int sym_vs_sch_pins() err |= 1; tcleval("show_infotext"); /* critical error: force ERC window showing */ for(j = 0; j < xctx->instances; ++j) { - if(!xctx->x_strcmp(tcl_hook2(xctx->inst[j].name), xctx->sym[i].name)) { - xctx->inst[i].color = -PINLAYER; + if(!xctx->x_strcmp(get_sym_name(j, 9999, 1), xctx->sym[i].name)) { + xctx->inst[j].color = -PINLAYER; xctx->hilight_nets=1; } } @@ -1399,8 +1399,8 @@ int sym_vs_sch_pins() tcleval("show_infotext"); /* critical error: force ERC window showing */ for(j = 0; j < xctx->instances; ++j) { dbg(1, "inst.name=%s, sym.name=%s\n", tcl_hook2(xctx->inst[j].name), xctx->sym[i].name); - if(!xctx->x_strcmp(tcl_hook2(xctx->inst[j].name), xctx->sym[i].name)) { - xctx->inst[i].color = -PINLAYER; + if(!xctx->x_strcmp(get_sym_name(j, 9999, 1), xctx->sym[i].name)) { + xctx->inst[j].color = -PINLAYER; xctx->hilight_nets=1; } } @@ -1434,8 +1434,9 @@ int sym_vs_sch_pins() err |= 1; tcleval("show_infotext"); /* critical error: force ERC window showing */ for(j = 0; j < xctx->instances; ++j) { - if(!xctx->x_strcmp(tcl_hook2(xctx->inst[j].name), xctx->sym[i].name)) { - xctx->inst[i].color = -PINLAYER; + dbg(0, "instance %d --> %s, sym=%s\n", j, get_sym_name(j, 9999, 1), xctx->sym[i].name); + if(!xctx->x_strcmp(get_sym_name(j, 9999, 1), xctx->sym[i].name)) { + xctx->inst[j].color = -PINLAYER; xctx->hilight_nets=1; } } @@ -1459,8 +1460,8 @@ int sym_vs_sch_pins() err |= 1; tcleval("show_infotext"); /* critical error: force ERC window showing */ for(k = 0; k < xctx->instances; ++k) { - if(!xctx->x_strcmp(tcl_hook2(xctx->inst[k].name), xctx->sym[i].name)) { - xctx->inst[i].color = -PINLAYER; + if(!xctx->x_strcmp(get_sym_name(k, 9999, 1), xctx->sym[i].name)) { + xctx->inst[k].color = -PINLAYER; xctx->hilight_nets=1; } } diff --git a/src/token.c b/src/token.c index e41d0d9e..ee14378c 100644 --- a/src/token.c +++ b/src/token.c @@ -851,12 +851,12 @@ static void print_vhdl_primitive(FILE *fd, int inst) /* netlist primitives, 200 else if(strcmp(token,"@symname")==0) /* of course symname must not be present */ /* in hash table */ { - const char *s = sanitize(get_sym_name(inst, 0)); + const char *s = sanitize(get_sym_name(inst, 0, 0)); fputs(s, fd); } else if (strcmp(token,"@symname_ext")==0) { - const char *s = sanitize(get_sym_name(inst, 1)); + const char *s = sanitize(get_sym_name(inst, 0, 1)); fputs(s, fd); } else if(strcmp(token,"@schname_ext")==0) /* of course schname must not be present */ @@ -1223,9 +1223,9 @@ void print_vhdl_element(FILE *fd, int inst) /* print instance name and subckt */ dbg(2, "print_vhdl_element(): printing inst name & subcircuit name\n"); if( (lab = expandlabel(name, &tmp)) != NULL) - fprintf(fd, "%d %s : %s\n", tmp, lab, sanitize(get_sym_name(inst, 0)) ); + fprintf(fd, "%d %s : %s\n", tmp, lab, sanitize(get_sym_name(inst, 0, 0)) ); else /* name in some strange format, probably an error */ - fprintf(fd, "1 %s : %s\n", name, sanitize(get_sym_name(inst, 0)) ); + fprintf(fd, "1 %s : %s\n", name, sanitize(get_sym_name(inst, 0, 0)) ); dbg(2, "print_vhdl_element(): printing generics passed as properties\n"); @@ -1864,7 +1864,7 @@ int print_spice_element(FILE *fd, int inst) } else if (strcmp(token,"@symname")==0) /* of course symname must not be present in attributes */ { - const char *s = sanitize(get_sym_name(inst, 0)); + const char *s = sanitize(get_sym_name(inst, 0, 0)); tmp = strlen(s) +100 ; /* always make room for some extra chars * so 1-char writes to result do not need reallocs */ STR_ALLOC(&result, tmp + result_pos, &size); @@ -1873,7 +1873,7 @@ int print_spice_element(FILE *fd, int inst) } else if (strcmp(token,"@symname_ext")==0) /* of course symname must not be present in attributes */ { - const char *s = sanitize(get_sym_name(inst, 1)); + const char *s = sanitize(get_sym_name(inst, 0, 1)); tmp = strlen(s) +100 ; /* always make room for some extra chars * so 1-char writes to result do not need reallocs */ STR_ALLOC(&result, tmp + result_pos, &size); @@ -2094,7 +2094,7 @@ void print_tedax_element(FILE *fd, int inst) int n; Int_hashtable table={NULL, 0}; subcircuit = 1; - fprintf(fd, "__subcircuit__ %s %s\n", sanitize(get_sym_name(inst, 0)), xctx->inst[inst].instname); + fprintf(fd, "__subcircuit__ %s %s\n", sanitize(get_sym_name(inst, 0, 0)), xctx->inst[inst].instname); int_hash_init(&table, 37); for(i=0;iinst[inst].ptr + xctx->sym)->prop_ptr, "verilogprefix", 0)); if(verilogprefix) { my_strdup(_ALLOC_ID_, &symname, verilogprefix); - my_strcat(_ALLOC_ID_, &symname, get_sym_name(inst, 0)); + my_strcat(_ALLOC_ID_, &symname, get_sym_name(inst, 0, 0)); } else { - my_strdup(_ALLOC_ID_, &symname, get_sym_name(inst, 0)); + my_strdup(_ALLOC_ID_, &symname, get_sym_name(inst, 0, 0)); } my_free(_ALLOC_ID_, &verilogprefix); my_strdup(_ALLOC_ID_, &template, (xctx->inst[inst].ptr + xctx->sym)->templ); @@ -2976,7 +2976,7 @@ const char *translate(int inst, const char* s) memcpy(result+result_pos,xctx->inst[inst].instname, tmp+1); result_pos+=tmp; } else if(strcmp(token,"@symname")==0) { - tmp_sym_name = get_sym_name(inst, 0); + tmp_sym_name = get_sym_name(inst, 0, 0); tmp_sym_name=tmp_sym_name ? tmp_sym_name : ""; tmp=strlen(tmp_sym_name); STR_ALLOC(&result, tmp + result_pos, &size); @@ -2989,7 +2989,7 @@ const char *translate(int inst, const char* s) memcpy(result+result_pos, path, tmp+1); result_pos+=tmp; } else if(strcmp(token,"@symname_ext")==0) { - tmp_sym_name = get_sym_name(inst, 1); + tmp_sym_name = get_sym_name(inst, 0, 1); tmp_sym_name=tmp_sym_name ? tmp_sym_name : ""; tmp=strlen(tmp_sym_name); STR_ALLOC(&result, tmp + result_pos, &size); diff --git a/src/xschem.h b/src/xschem.h index 91e42609..2577b542 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -1309,7 +1309,7 @@ extern char *read_line(FILE *fp, int dbg_level); extern void read_record(int firstchar, FILE *fp, int dbg_level); extern void create_sch_from_sym(void); extern void get_sch_from_sym(char *filename, xSymbol *sym, int inst); -extern const char *get_sym_name(int inst, int ext); +extern const char *get_sym_name(int inst, int ndir, int ext); extern void get_additional_symbols(int what); extern int descend_schematic(int instnumber); extern void go_back(int confirm);