add "ndir" parameter to get_sym_name(), some fixes in sym_vs_sch_pins()

This commit is contained in:
stefan schippers 2023-05-01 23:17:57 +02:00
parent ae8931c788
commit a9ffa50ed8
4 changed files with 38 additions and 33 deletions

View File

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

View File

@ -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;
}
}

View File

@ -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;i<no_of_pins; ++i) {
my_strdup2(_ALLOC_ID_, &net, net_name(inst,i, &net_mult, 0, 1));
@ -2231,12 +2231,12 @@ void print_tedax_element(FILE *fd, int inst)
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 */
@ -2472,12 +2472,12 @@ static void print_verilog_primitive(FILE *fd, int inst) /* netlist switch level
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 */
@ -2620,9 +2620,9 @@ void print_verilog_element(FILE *fd, int inst)
get_tok_value((xctx->inst[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);

View File

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