recursive attribute substitution. use also template attribute of parents if not found in instance prop_ptr

This commit is contained in:
Stefan Frederik 2022-10-20 10:30:48 +02:00
parent 77e4909ca4
commit 0f25befe31
5 changed files with 41 additions and 30 deletions

View File

@ -805,7 +805,7 @@ void attach_labels_to_inst(int interactive) /* offloaded from callback.c 201710
int use_label_prefix; int use_label_prefix;
int found=0; int found=0;
my_strdup(1607, &symname_pin, tcleval("rel_sym_path [find_file lab_pin.sym]")); my_strdup(1611, &symname_pin, tcleval("rel_sym_path [find_file lab_pin.sym]"));
my_strdup(1607, &symname_wire, tcleval("rel_sym_path [find_file lab_wire.sym]")); my_strdup(1607, &symname_wire, tcleval("rel_sym_path [find_file lab_wire.sym]"));
if(symname_pin && symname_wire) { if(symname_pin && symname_wire) {
rebuild_selected_array(); rebuild_selected_array();
@ -1214,7 +1214,7 @@ int descend_schematic(int instnumber)
char filename[PATH_MAX]; char filename[PATH_MAX];
int inst_mult, inst_number; int inst_mult, inst_number;
int save_ok = 0; int save_ok = 0;
int n = 0;
rebuild_selected_array(); rebuild_selected_array();
if(xctx->lastsel !=1 || xctx->sel_array[0].type!=ELEMENT) if(xctx->lastsel !=1 || xctx->sel_array[0].type!=ELEMENT)
@ -1224,7 +1224,8 @@ int descend_schematic(int instnumber)
} }
else else
{ {
dbg(1, "descend_schematic(): selected:%s\n", xctx->inst[xctx->sel_array[0].n].name); n = xctx->sel_array[0].n;
dbg(1, "descend_schematic(): selected:%s\n", xctx->inst[n].name);
/* no name set for current schematic: save it before descending*/ /* no name set for current schematic: save it before descending*/
if(!strcmp(xctx->sch[xctx->currsch],"")) if(!strcmp(xctx->sch[xctx->currsch],""))
{ {
@ -1242,12 +1243,12 @@ int descend_schematic(int instnumber)
if(save_ok==0) return 0; if(save_ok==0) return 0;
} }
dbg(1, "descend_schematic(): inst type: %s\n", (xctx->inst[xctx->sel_array[0].n].ptr+ xctx->sym)->type); dbg(1, "descend_schematic(): inst type: %s\n", (xctx->inst[n].ptr+ xctx->sym)->type);
if( /* do not descend if not subcircuit */ if( /* do not descend if not subcircuit */
(xctx->inst[xctx->sel_array[0].n].ptr+ xctx->sym)->type && (xctx->inst[n].ptr+ xctx->sym)->type &&
strcmp( (xctx->inst[xctx->sel_array[0].n].ptr+ xctx->sym)->type, "subcircuit") && strcmp( (xctx->inst[n].ptr+ xctx->sym)->type, "subcircuit") &&
strcmp( (xctx->inst[xctx->sel_array[0].n].ptr+ xctx->sym)->type, "primitive") strcmp( (xctx->inst[n].ptr+ xctx->sym)->type, "primitive")
) return 0; ) return 0;
if(xctx->modified) if(xctx->modified)
@ -1267,11 +1268,11 @@ int descend_schematic(int instnumber)
} }
/* build up current hierarchy path */ /* build up current hierarchy path */
dbg(1, "descend_schematic(): selected instname=%s\n", xctx->inst[xctx->sel_array[0].n].instname); dbg(1, "descend_schematic(): selected instname=%s\n", xctx->inst[n].instname);
if(xctx->inst[xctx->sel_array[0].n].instname && xctx->inst[xctx->sel_array[0].n].instname[0]) { if(xctx->inst[n].instname && xctx->inst[n].instname[0]) {
str=expandlabel(xctx->inst[xctx->sel_array[0].n].instname, &inst_mult); str=expandlabel(xctx->inst[n].instname, &inst_mult);
} else { } else {
str = ""; str = "";
inst_mult = 1; inst_mult = 1;
@ -1279,7 +1280,9 @@ int descend_schematic(int instnumber)
my_strdup(14, &xctx->sch_path[xctx->currsch+1], xctx->sch_path[xctx->currsch]); my_strdup(14, &xctx->sch_path[xctx->currsch+1], xctx->sch_path[xctx->currsch]);
xctx->sch_path_hash[xctx->currsch+1] =0; xctx->sch_path_hash[xctx->currsch+1] =0;
my_strdup(1516, &xctx->hier_attr[xctx->currsch].prop_ptr, my_strdup(1516, &xctx->hier_attr[xctx->currsch].prop_ptr,
xctx->inst[xctx->sel_array[0].n].prop_ptr); xctx->inst[n].prop_ptr);
my_strdup(1613, &xctx->hier_attr[xctx->currsch].templ,
get_tok_value((xctx->inst[n].ptr+ xctx->sym)->prop_ptr, "template", 0));
inst_number = 1; inst_number = 1;
if(inst_mult > 1) { /* on multiple instances ask where to descend, to correctly evaluate if(inst_mult > 1) { /* on multiple instances ask where to descend, to correctly evaluate
the hierarchy path you descend to */ the hierarchy path you descend to */
@ -1312,14 +1315,14 @@ int descend_schematic(int instnumber)
dbg(1, "descend_schematic(): current path: %s\n", xctx->sch_path[xctx->currsch+1]); dbg(1, "descend_schematic(): current path: %s\n", xctx->sch_path[xctx->currsch+1]);
dbg(1, "descend_schematic(): inst_number=%d\n", inst_number); dbg(1, "descend_schematic(): inst_number=%d\n", inst_number);
xctx->previous_instance[xctx->currsch]=xctx->sel_array[0].n; xctx->previous_instance[xctx->currsch]=n;
xctx->zoom_array[xctx->currsch].x=xctx->xorigin; xctx->zoom_array[xctx->currsch].x=xctx->xorigin;
xctx->zoom_array[xctx->currsch].y=xctx->yorigin; xctx->zoom_array[xctx->currsch].y=xctx->yorigin;
xctx->zoom_array[xctx->currsch].zoom=xctx->zoom; xctx->zoom_array[xctx->currsch].zoom=xctx->zoom;
xctx->currsch++; xctx->currsch++;
hilight_child_pins(); hilight_child_pins();
get_sch_from_sym(filename, xctx->inst[xctx->sel_array[0].n].ptr+ xctx->sym); get_sch_from_sym(filename, xctx->inst[n].ptr+ xctx->sym);
unselect_all(1); unselect_all(1);
remove_symbols(); remove_symbols();
load_schematic(1,filename, 1); load_schematic(1,filename, 1);

View File

@ -3579,13 +3579,14 @@ void descend_symbol(void)
FILE *fd; FILE *fd;
char name[PATH_MAX]; char name[PATH_MAX];
char name_embedded[PATH_MAX]; char name_embedded[PATH_MAX];
int n = 0;
rebuild_selected_array(); rebuild_selected_array();
if(xctx->lastsel > 1) return; if(xctx->lastsel > 1) return;
if(xctx->lastsel==1 && xctx->sel_array[0].type==ELEMENT) { if(xctx->lastsel==1 && xctx->sel_array[0].type==ELEMENT) {
n =xctx->sel_array[0].n;
if(xctx->modified) if(xctx->modified)
{ {
int ret; int ret;
ret = save(1); ret = save(1);
/* if circuit is changed but not saved before descending /* if circuit is changed but not saved before descending
* state will be inconsistent when returning, can not propagare hilights * state will be inconsistent when returning, can not propagare hilights
@ -3597,39 +3598,39 @@ void descend_symbol(void)
if(ret == 0) clear_all_hilights(); if(ret == 0) clear_all_hilights();
if(ret == -1) return; /* user cancel */ if(ret == -1) return; /* user cancel */
} }
my_snprintf(name, S(name), "%s", xctx->inst[xctx->sel_array[0].n].name); my_snprintf(name, S(name), "%s", xctx->inst[n].name);
/* dont allow descend in the default missing symbol */ /* dont allow descend in the default missing symbol */
if((xctx->inst[xctx->sel_array[0].n].ptr+ xctx->sym)->type && if((xctx->inst[n].ptr+ xctx->sym)->type &&
!strcmp( (xctx->inst[xctx->sel_array[0].n].ptr+ xctx->sym)->type,"missing")) return; !strcmp( (xctx->inst[n].ptr+ xctx->sym)->type,"missing")) return;
} }
else return; else return;
/* build up current hierarchy path */ /* build up current hierarchy path */
my_strdup(363, &str, xctx->inst[xctx->sel_array[0].n].instname); my_strdup(363, &str, xctx->inst[n].instname);
my_strdup(364, &xctx->sch_path[xctx->currsch+1], xctx->sch_path[xctx->currsch]); my_strdup(364, &xctx->sch_path[xctx->currsch+1], xctx->sch_path[xctx->currsch]);
my_strcat(365, &xctx->sch_path[xctx->currsch+1], str); my_strcat(365, &xctx->sch_path[xctx->currsch+1], str);
my_strcat(366, &xctx->sch_path[xctx->currsch+1], "."); my_strcat(366, &xctx->sch_path[xctx->currsch+1], ".");
xctx->sch_path_hash[xctx->currsch+1] = 0; xctx->sch_path_hash[xctx->currsch+1] = 0;
my_strdup(1518, &xctx->hier_attr[xctx->currsch].prop_ptr, my_strdup(1518, &xctx->hier_attr[xctx->currsch].prop_ptr,
xctx->inst[xctx->sel_array[0].n].prop_ptr); xctx->inst[n].prop_ptr);
my_strdup(1612, &xctx->hier_attr[xctx->currsch].templ,
get_tok_value((xctx->inst[n].ptr+ xctx->sym)->prop_ptr, "template", 0));
xctx->sch_inst_number[xctx->currsch+1] = 1; xctx->sch_inst_number[xctx->currsch+1] = 1;
my_free(921, &str); my_free(921, &str);
xctx->previous_instance[xctx->currsch]=xctx->sel_array[0].n; xctx->previous_instance[xctx->currsch]=n;
xctx->zoom_array[xctx->currsch].x=xctx->xorigin; xctx->zoom_array[xctx->currsch].x=xctx->xorigin;
xctx->zoom_array[xctx->currsch].y=xctx->yorigin; xctx->zoom_array[xctx->currsch].y=xctx->yorigin;
xctx->zoom_array[xctx->currsch].zoom=xctx->zoom; xctx->zoom_array[xctx->currsch].zoom=xctx->zoom;
++xctx->currsch; ++xctx->currsch;
if((xctx->inst[xctx->sel_array[0].n].ptr+ xctx->sym)->flags & EMBEDDED || if((xctx->inst[n].ptr+ xctx->sym)->flags & EMBEDDED ||
!strcmp(get_tok_value(xctx->inst[xctx->sel_array[0].n].prop_ptr,"embed", 0), "true")) { !strcmp(get_tok_value(xctx->inst[n].prop_ptr,"embed", 0), "true")) {
/* save embedded symbol into a temporary file */ /* save embedded symbol into a temporary file */
my_snprintf(name_embedded, S(name_embedded), my_snprintf(name_embedded, S(name_embedded),
"%s/.xschem_embedded_%d_%s", tclgetvar("XSCHEM_TMP_DIR"), getpid(), get_cell_w_ext(name, 0)); "%s/.xschem_embedded_%d_%s", tclgetvar("XSCHEM_TMP_DIR"), getpid(), get_cell_w_ext(name, 0));
if(!(fd = fopen(name_embedded, "w")) ) { if(!(fd = fopen(name_embedded, "w")) ) {
fprintf(errfp, "descend_symbol(): problems opening file %s \n", name_embedded); fprintf(errfp, "descend_symbol(): problems opening file %s \n", name_embedded);
} }
save_embedded_symbol(xctx->inst[xctx->sel_array[0].n].ptr+xctx->sym, fd); save_embedded_symbol(xctx->inst[n].ptr+xctx->sym, fd);
fclose(fd); fclose(fd);
unselect_all(1); unselect_all(1);
remove_symbols(); /* must follow save (if) embedded */ remove_symbols(); /* must follow save (if) embedded */

View File

@ -3355,12 +3355,16 @@ const char *translate(int inst, const char* s)
if(xctx->tok_size && tok[0]) { if(xctx->tok_size && tok[0]) {
dbg(1, "tok=%s\n", tok); dbg(1, "tok=%s\n", tok);
my_strdup2(1523, &value1, tok); my_strdup2(1523, &value1, tok);
} else {
tok = get_tok_value(lcc[i-1].templ, value1, 0);
if(xctx->tok_size && tok[0]) {
dbg(1, "from parent template: tok=%s\n", tok);
my_strdup2(1614, &value1, tok);
}
} }
dbg(1, "2 translate(): lcc[%d].prop_ptr=%s, value1=%s\n", i-1, lcc[i-1].prop_ptr, value1); dbg(1, "2 translate(): lcc[%d].prop_ptr=%s, value1=%s\n", i-1, lcc[i-1].prop_ptr, value1);
i--; i--;
} }
tmp=strlen(value1); tmp=strlen(value1);
STR_ALLOC(&result, tmp + result_pos, &size); STR_ALLOC(&result, tmp + result_pos, &size);
memcpy(result+result_pos, value1, tmp+1); memcpy(result+result_pos, value1, tmp+1);

View File

@ -360,9 +360,10 @@ static void free_xschem_data()
my_free(1133, &xctx->maxl); my_free(1133, &xctx->maxl);
my_free(1108, &xctx->sel_array); my_free(1108, &xctx->sel_array);
for(i=0;i<CADMAXHIER;i++) { for(i=0;i<CADMAXHIER;i++) {
my_free(1139, &xctx->sch_path[i]); if(xctx->sch_path[i]) my_free(1139, &xctx->sch_path[i]);
my_free(959, &xctx->hier_attr[i].prop_ptr); if(xctx->hier_attr[i].templ) my_free(1608, &xctx->hier_attr[i].templ);
my_free(960, &xctx->hier_attr[i].symname); if(xctx->hier_attr[i].prop_ptr) my_free(959, &xctx->hier_attr[i].prop_ptr);
if(xctx->hier_attr[i].symname) my_free(960, &xctx->hier_attr[i].symname);
} }
my_free(1099, &xctx->gridpoint); my_free(1099, &xctx->gridpoint);
@ -543,6 +544,7 @@ static void alloc_xschem_data(const char *top_path, const char *win_path)
xctx->sch_path[i]=NULL; xctx->sch_path[i]=NULL;
xctx->sch_path_hash[i]=0; xctx->sch_path_hash[i]=0;
xctx->hier_attr[i].prop_ptr = NULL; xctx->hier_attr[i].prop_ptr = NULL;
xctx->hier_attr[i].templ = NULL;
xctx->hier_attr[i].symname = NULL; xctx->hier_attr[i].symname = NULL;
xctx->hier_attr[i].fd = NULL; xctx->hier_attr[i].fd = NULL;
} }

View File

@ -578,6 +578,7 @@ typedef struct
short flip; short flip;
FILE *fd; FILE *fd;
char *prop_ptr; char *prop_ptr;
char *templ;
char *symname; char *symname;
} Lcc; } Lcc;