From d279783faa8118e0eda76891976cbb141d4f6a24 Mon Sep 17 00:00:00 2001 From: Stefan Frederik Date: Thu, 25 Aug 2022 13:59:36 +0200 Subject: [PATCH] added menu entries to set and conmpare with schematic. --- scconfig/src/default/regex.c | 2 +- scconfig/src/default/regex.h | 1 + src/actions.c | 8 ++-- src/callback.c | 24 ++++++----- src/editprop.c | 2 +- src/font.c | 6 +-- src/hilight.c | 2 +- src/in_memory_undo.c | 2 +- src/netlist.c | 82 +++++++++++++++++++++++++++++------- src/paste.c | 2 +- src/save.c | 8 ++-- src/scheduler.c | 24 ++++++----- src/select.c | 68 +++++++++++++++++------------- src/spice_netlist.c | 8 ++-- src/tedax_netlist.c | 4 +- src/verilog_netlist.c | 6 +-- src/vhdl_netlist.c | 6 +-- src/xinit.c | 8 +++- src/xschem.h | 4 +- src/xschem.tcl | 8 ++++ 20 files changed, 179 insertions(+), 96 deletions(-) diff --git a/scconfig/src/default/regex.c b/scconfig/src/default/regex.c index 42920330..7fab7b8e 100644 --- a/scconfig/src/default/regex.c +++ b/scconfig/src/default/regex.c @@ -291,7 +291,7 @@ re_comp(const char *pat) } -static const char *bol; +const char *bol; const char *bopat[MAXTAG]; const char *eopat[MAXTAG]; static const char *pmatch(const char *, CHAR *, int *); diff --git a/scconfig/src/default/regex.h b/scconfig/src/default/regex.h index 03830a07..267434f2 100644 --- a/scconfig/src/default/regex.h +++ b/scconfig/src/default/regex.h @@ -3,6 +3,7 @@ extern const char *bopat[]; extern const char *eopat[]; +extern const char *bol; extern char *re_comp(const char *); diff --git a/src/actions.c b/src/actions.c index 81f2e4a3..1a8d3f6e 100644 --- a/src/actions.c +++ b/src/actions.c @@ -459,7 +459,7 @@ void ask_new_file(void) dbg(1, "ask_new_file(): load file: %s\n", f); clear_all_hilights(); xctx->currsch = 0; - unselect_all(); + unselect_all(1); remove_symbols(); load_schematic(1, f,1); /* 20180925.1 */ tclvareval("update_recent_file {", f, "}", NULL); @@ -1324,7 +1324,7 @@ int descend_schematic(int instnumber) hilight_child_pins(); get_sch_from_sym(filename, xctx->inst[xctx->sel_array[0].n].ptr+ xctx->sym); - unselect_all(); + unselect_all(1); remove_symbols(); load_schematic(1,filename, 1); @@ -1363,7 +1363,7 @@ void go_back(int confirm) /* 20171006 add confirm */ } } if(save_ok==0) return; - unselect_all(); + unselect_all(1); remove_symbols(); from_embedded_sym=0; if(strstr(xctx->sch[xctx->currsch], ".xschem_embedded_")) { @@ -2057,7 +2057,7 @@ void change_layer() } } if(xctx->lastsel) delete_only_rect_line_arc_poly(); - unselect_all(); + unselect_all(1); } void new_arc(int what, double sweep) diff --git a/src/callback.c b/src/callback.c index 66a90f34..bbb06533 100644 --- a/src/callback.c +++ b/src/callback.c @@ -111,7 +111,7 @@ static void abort_operation(void) set_modify(0); /* aborted merge: no change, so reset modify flag set by delete() */ } xctx->ui_state = 0; - unselect_all(); + unselect_all(1); draw(); } @@ -123,7 +123,7 @@ static void start_place_symbol(double mx, double my) tclvareval("set INITIALINSTDIR [file dirname {", abs_sym_path(xctx->inst[xctx->sel_array[0].n].name, ""), "}]", NULL); } - unselect_all(); + unselect_all(1); xctx->mx_double_save = xctx->mousex_snap; xctx->my_double_save = xctx->mousey_snap; if(place_symbol(-1,NULL,xctx->mousex_snap, xctx->mousey_snap, 0, 0, NULL, 4, 1, 1/* to_push_undo */) ) { @@ -955,7 +955,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, if( stat(xctx->sel_or_clip, &buf) && (xctx->ui_state & STARTCOPY) ) { copy_objects(ABORT); /* also unlinks sel_or_flip file */ - unselect_all(); + unselect_all(1); } /* xschem window *receiving* selected objects */ /* no selected objects and selection file exists */ @@ -1048,10 +1048,10 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, if(abs(mx-xctx->mx_save) > 8 || abs(my-xctx->my_save) > 8 ) { /* set reasonable threshold before unsel */ if(xctx->onetime) { - unselect_all(); /* 20171026 avoid multiple calls of unselect_all() */ + unselect_all(1); /* 20171026 avoid multiple calls of unselect_all() */ xctx->onetime=0; } - xctx->ui_state|=STARTSELECT; /* set it again cause unselect_all() clears it... */ + xctx->ui_state|=STARTSELECT; /* set it again cause unselect_all(1) clears it... */ } } } @@ -1358,7 +1358,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, } if(key=='p' && state == Mod1Mask) /* add symbol pin */ { - unselect_all(); + unselect_all(1); storeobject(-1, xctx->mousex_snap-2.5, xctx->mousey_snap-2.5, xctx->mousex_snap+2.5, xctx->mousey_snap+2.5, xRECT, PINLAYER, SELECTED, "name=XXX\ndir=inout"); xctx->need_reb_sel_arr=1; @@ -1606,6 +1606,10 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, } break; } + if(key=='x' && state == Mod1Mask) /* compare schematics(must set first) */ + { + compare_schematics(""); + } if(key=='x' && state == ControlMask) /* cut selection into clipboard */ { if(xctx->semaphore >= 2) break; @@ -1716,7 +1720,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, "-message {Are you sure you want to reload from disk?}"); if(strcmp(tclresult(),"ok")==0) { char filename[PATH_MAX]; - unselect_all(); + unselect_all(1); remove_symbols(); my_strncpy(filename, abs_sym_path(xctx->sch[xctx->currsch], ""), S(filename)); load_schematic(1, filename, 1); @@ -2052,7 +2056,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, { yyparse_error = 0; if(xctx->semaphore >= 2) break; - unselect_all(); + unselect_all(1); if(set_netlist_dir(0, NULL)) { dbg(1, "callback(): -------------\n"); if(xctx->netlist_type == CAD_SPICE_NETLIST) @@ -2075,7 +2079,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, { yyparse_error = 0; if(xctx->semaphore >= 2) break; - unselect_all(); + unselect_all(1); if( set_netlist_dir(0, NULL) ) { dbg(1, "callback(): -------------\n"); if(xctx->netlist_type == CAD_SPICE_NETLIST) @@ -2586,7 +2590,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; if( !(state & ShiftMask) && !(state & Mod1Mask) ) { - unselect_all(); + unselect_all(1); #ifndef __unix__ MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gctiled, xctx->xrect[0].x, xctx->xrect[0].y, xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y); diff --git a/src/editprop.c b/src/editprop.c index f89bc991..24e785d4 100644 --- a/src/editprop.c +++ b/src/editprop.c @@ -1408,7 +1408,7 @@ void edit_property(int x) case ELEMENT: edit_symbol_property(x); while( x == 0 && tclgetvar("edit_symbol_prop_new_sel")[0] == '1' ) { - unselect_all(); + unselect_all(1); select_object(xctx->mousex, xctx->mousey, SELECTED, 0); rebuild_selected_array(); if(xctx->lastsel && xctx->sel_array[0].type ==ELEMENT) { diff --git a/src/font.c b/src/font.c index 2ad8a506..3c5ea5e2 100644 --- a/src/font.c +++ b/src/font.c @@ -29,12 +29,12 @@ void compile_font(void) xctx->currsch = 0; my_snprintf(name, S(name), "%s/systemlib/font.sch", tclgetvar("XSCHEM_SHAREDIR")); - unselect_all(); + unselect_all(1); remove_symbols(); load_schematic(1,name,0); for(code=0;code<127;code++) { - unselect_all(); + unselect_all(1); select_inside(code*FONTOFFSET-1,-FONTHEIGHT-1, code*FONTOFFSET+FONTWIDTH+1,FONTWHITESPACE + FONTDESCENT+1, 1); rebuild_selected_array(); @@ -58,7 +58,7 @@ void compile_font(void) dbg(2, "};\n"); } clear_drawing(); - unselect_all(); + unselect_all(1); xctx->currsch = 0; my_strncpy(xctx->sch[xctx->currsch], "", S(xctx->sch[xctx->currsch])); } diff --git a/src/hilight.c b/src/hilight.c index 44054c0b..cc6fd861 100644 --- a/src/hilight.c +++ b/src/hilight.c @@ -1700,7 +1700,7 @@ void unhilight_net(void) draw(); if(!big) bbox(END , 0.0 , 0.0 , 0.0 , 0.0); - unselect_all(); + unselect_all(1); } /* redraws the whole affected rectangle, this avoids artifacts due to antialiased text */ diff --git a/src/in_memory_undo.c b/src/in_memory_undo.c index 1ee1a377..80ed2f55 100644 --- a/src/in_memory_undo.c +++ b/src/in_memory_undo.c @@ -479,7 +479,7 @@ void mem_pop_undo(int redo, int set_modify_status) } slot = xctx->cur_undo_ptr%MAX_UNDO; clear_drawing(); - unselect_all(); + unselect_all(1); my_free(1345, &xctx->wire); my_free(1346, &xctx->text); my_free(1347, &xctx->inst); diff --git a/src/netlist.c b/src/netlist.c index b71c7451..1ab05c84 100644 --- a/src/netlist.c +++ b/src/netlist.c @@ -1047,9 +1047,9 @@ void prepare_netlist_structs(int for_netlist) } -int compare_schematics(const char *filename) +int compare_schematics(const char *f) { - Int_hashentry *table[HASHSIZE]; + Int_hashentry *table1[HASHSIZE], *table2[HASHSIZE]; Int_hashentry *found; char *s = NULL; int i; @@ -1057,21 +1057,29 @@ int compare_schematics(const char *filename) char current_sch[PATH_MAX]; int ret=0; /* ret==0 means no differences found */ + if(f == NULL) { + tcleval("load_file_dialog {Schematic to compare with} .sch.sym INITIALLOADDIR"); + if(tclresult()[0]) my_strncpy(xctx->sch_to_compare, tclresult(), S(xctx->sch_to_compare)); + else my_strncpy(xctx->sch_to_compare, "", S(xctx->sch_to_compare)); + } else if(f[0] != '\0') { + my_strncpy(xctx->sch_to_compare, f, S(xctx->sch_to_compare)); + } + if(!xctx->sch_to_compare[0]) { + dbg(0, "compare_schematics() schematic to compare with not set\n"); + return -1; + } + memset(table1, 0, HASHSIZE * sizeof(Int_hashentry *)); + memset(table2, 0, HASHSIZE * sizeof(Int_hashentry *)); my_strncpy(current_sch, abs_sym_path(xctx->current_name, ""), S(current_sch)); - clear_all_hilights(); - unselect_all(); - remove_symbols(); - xctx->no_draw = 1; - load_schematic(1, filename, 1); - memset(table, 0, HASHSIZE * sizeof(Int_hashentry *)); + /* HASH SCHEMATIC 1 */ for(i = 0; i < xctx->instances; i++) { l = 1024 + strlen(xctx->inst[i].prop_ptr ? xctx->inst[i].prop_ptr : ""); my_realloc(1534, &s, l); my_snprintf(s, l, "C %s %g %g %d %d %s", xctx->inst[i].name, xctx->inst[i].x0, xctx->inst[i].y0, xctx->inst[i].rot, xctx->inst[i].flip, xctx->inst[i].prop_ptr ? xctx->inst[i].prop_ptr : ""); - int_hash_lookup(table, s, i, XINSERT_NOREPLACE); + int_hash_lookup(table1, s, i, XINSERT_NOREPLACE); } for(i=0;iwires;i++) { @@ -1080,19 +1088,61 @@ int compare_schematics(const char *filename) my_snprintf(s, l, "N %g %g %g %g %s", xctx->wire[i].x1, xctx->wire[i].y1, xctx->wire[i].x2, xctx->wire[i].y2, xctx->wire[i].prop_ptr ? xctx->wire[i].prop_ptr : ""); - int_hash_lookup(table, s, i, XINSERT_NOREPLACE); + int_hash_lookup(table1, s, i, XINSERT_NOREPLACE); } - + clear_all_hilights(); + unselect_all(1); + remove_symbols(); + xctx->no_draw = 1; + load_schematic(1, xctx->sch_to_compare, 1); + /* HASH SCHEMATIC 2 , CHECK SCHEMATIC 2 WITH SCHEMATIC 1 */ + for(i = 0; i < xctx->instances; i++) { + l = 1024 + strlen(xctx->inst[i].prop_ptr ? xctx->inst[i].prop_ptr : ""); + my_realloc(1534, &s, l); + my_snprintf(s, l, "C %s %g %g %d %d %s", xctx->inst[i].name, + xctx->inst[i].x0, xctx->inst[i].y0, xctx->inst[i].rot, xctx->inst[i].flip, + xctx->inst[i].prop_ptr ? xctx->inst[i].prop_ptr : ""); + int_hash_lookup(table2, s, i, XINSERT_NOREPLACE); + found = int_hash_lookup(table1, s, i, XLOOKUP); + if(!found) { + dbg(1, "schematic 2 instance %d: %s mismatch or not found in schematic 1\n", i, + xctx->inst[i].instname ? xctx->inst[i].instname : ""); + select_element(i,SELECTED, 1, 1); + ret = 1; + } + } + for(i=0;iwires;i++) + { + l =1024 + strlen(xctx->wire[i].prop_ptr ? xctx->wire[i].prop_ptr : ""); + my_realloc(1535, &s, l); + my_snprintf(s, l, "N %g %g %g %g %s", xctx->wire[i].x1, xctx->wire[i].y1, + xctx->wire[i].x2, xctx->wire[i].y2, + xctx->wire[i].prop_ptr ? xctx->wire[i].prop_ptr : ""); + int_hash_lookup(table2, s, i, XINSERT_NOREPLACE); + found = int_hash_lookup(table1, s, i, XLOOKUP); + if(!found) { + dbg(1, "schematic 2 net %d: %s mismatch or not found in schematic 1\n", i, + xctx->wire[i].prop_ptr ? xctx->wire[i].prop_ptr : ""); + select_wire(i, SELECTED, 1); + ret = 1; + } + } + if(ret) { + rebuild_selected_array(); + draw_selection(xctx->gc[PINLAYER], 0); + } + unselect_all(0); load_schematic(1, current_sch, 1); xctx->no_draw = 0; + /* CHECK SCHEMATIC 1 WITH SCHEMATIC 2*/ for(i = 0; i < xctx->instances; i++) { l = 1024 + strlen(xctx->inst[i].prop_ptr ? xctx->inst[i].prop_ptr : ""); my_realloc(1536,&s, l); my_snprintf(s, l, "C %s %g %g %d %d %s", xctx->inst[i].name, xctx->inst[i].x0, xctx->inst[i].y0, xctx->inst[i].rot, xctx->inst[i].flip, xctx->inst[i].prop_ptr ? xctx->inst[i].prop_ptr : ""); - found = int_hash_lookup(table, s, i, XLOOKUP); + found = int_hash_lookup(table2, s, i, XLOOKUP); if(!found) { select_element(i,SELECTED, 1, 1); ret = 1; @@ -1105,14 +1155,16 @@ int compare_schematics(const char *filename) my_snprintf(s, l, "N %g %g %g %g %s", xctx->wire[i].x1, xctx->wire[i].y1, xctx->wire[i].x2, xctx->wire[i].y2, xctx->wire[i].prop_ptr ? xctx->wire[i].prop_ptr : ""); - found = int_hash_lookup(table, s, i, XLOOKUP); + found = int_hash_lookup(table2, s, i, XLOOKUP); if(!found) { select_wire(i, SELECTED, 1); ret = 1; } } - int_hash_free(table); - draw(); + int_hash_free(table1); + int_hash_free(table2); + rebuild_selected_array(); + draw_selection(xctx->gc[SELLAYER], 0); my_free(1531, &s); return ret; } diff --git a/src/paste.c b/src/paste.c index 29ae0ec7..6d7596dc 100644 --- a/src/paste.c +++ b/src/paste.c @@ -352,7 +352,7 @@ void merge_file(int selection_load, const char ext[]) xctx->prep_hash_wires=0; got_mouse = 0; xctx->push_undo(); - unselect_all(); + unselect_all(1); old=xctx->instances; while(!endfile) { diff --git a/src/save.c b/src/save.c index da4920dc..366d8fa3 100644 --- a/src/save.c +++ b/src/save.c @@ -1830,7 +1830,7 @@ int save_schematic(const char *schname) /* 20171020 added return value */ tcleval("alert_ {file opening for write failed!} {}"); return 0; } - unselect_all(); + unselect_all(1); write_xschem_file(fd); fclose(fd); /* update time stamp */ @@ -2127,7 +2127,7 @@ void pop_undo(int redo, int set_modify_status) xctx->cur_undo_ptr--; /* will be restored after building file name */ } clear_drawing(); - unselect_all(); + unselect_all(1); #if HAS_POPEN==1 my_snprintf(diff_name, S(diff_name), "gzip -d -c %s/undo%d", xctx->undo_dirname, xctx->cur_undo_ptr%MAX_UNDO); @@ -3282,13 +3282,13 @@ void descend_symbol(void) } save_embedded_symbol(xctx->inst[xctx->sel_array[0].n].ptr+xctx->sym, fd); fclose(fd); - unselect_all(); + unselect_all(1); remove_symbols(); /* must follow save (if) embedded */ /* load_symbol(name_embedded); */ load_schematic(1, name_embedded, 1); } else { /* load_symbol(abs_sym_path(name, "")); */ - unselect_all(); + unselect_all(1); remove_symbols(); /* must follow save (if) embedded */ load_schematic(1, abs_sym_path(name, ""), 1); } diff --git a/src/scheduler.c b/src/scheduler.c index 3b4bc9ce..9a5b1d72 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -289,7 +289,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg if(!strcmp(argv[1],"add_symbol_pin")) { cmd_found = 1; - unselect_all(); + unselect_all(1); storeobject(-1, xctx->mousex_snap-2.5, xctx->mousey_snap-2.5, xctx->mousex_snap+2.5, xctx->mousey_snap+2.5, xRECT, PINLAYER, SELECTED, "name=XXX\ndir=inout"); xctx->need_reb_sel_arr=1; @@ -302,7 +302,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg if(!strcmp(argv[1],"add_graph")) { cmd_found = 1; - unselect_all(); + unselect_all(1); xctx->graph_lastsel = xctx->rects[GRIDLAYER]; storeobject(-1, xctx->mousex_snap-400, xctx->mousey_snap-200, xctx->mousex_snap+400, xctx->mousey_snap+200, xRECT, GRIDLAYER, SELECTED, @@ -336,7 +336,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg { char str[PATH_MAX+100]; cmd_found = 1; - unselect_all(); + unselect_all(1); tcleval("tk_getOpenFile -filetypes { {{Png} {.png}} {{All files} *} }"); if(tclresult()[0]) { my_snprintf(str, S(str), "flags=image,unscaled\nalpha=0.8\nimage=%s\n", tclresult()); @@ -487,7 +487,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg int i; xctx->currsch = 0; - unselect_all(); + unselect_all(1); remove_symbols(); clear_drawing(); if(argc>=3 && !strcmp(argv[2],"SYMBOL")) { @@ -552,6 +552,9 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg if(argc > 2) { ret = compare_schematics(argv[2]); } + else { + ret = compare_schematics(NULL); + } Tcl_SetResult(interp, my_itoa(ret), TCL_VOLATILE); } @@ -1623,7 +1626,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg } if(!skip) { clear_all_hilights(); - unselect_all(); + unselect_all(1); if(!undo_reset) xctx->push_undo(); xctx->currsch = 0; remove_symbols(); @@ -1735,7 +1738,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg if(!strcmp(argv[1],"net_label")) { cmd_found = 1; - unselect_all(); + unselect_all(1); if(argc>=3) place_net_label(atoi(argv[2])); } @@ -1867,7 +1870,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg tclvareval("set INITIALINSTDIR [file dirname {", abs_sym_path(xctx->inst[xctx->sel_array[0].n].name, ""), "}]", NULL); } - unselect_all(); + unselect_all(1); xctx->mx_double_save = xctx->mousex_snap; xctx->my_double_save = xctx->mousey_snap; if(argc == 4) { @@ -1894,7 +1897,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg xctx->semaphore++; xctx->last_command = 0; - unselect_all(); + unselect_all(1); xctx->mx_double_save = xctx->mousex_snap; xctx->my_double_save = xctx->mousey_snap; if(place_text(0, xctx->mousex_snap, xctx->mousey_snap)) { /* 1 = draw text 24122002 */ @@ -2195,7 +2198,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg else if(!strcmp(argv[1],"reload")) { cmd_found = 1; - unselect_all(); + unselect_all(1); remove_symbols(); load_schematic(1, xctx->sch[xctx->currsch], 1); if(argc >= 3 && !strcmp(argv[2], "zoom_full") ) { @@ -2883,7 +2886,8 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg else if(!strcmp(argv[1],"unselect_all")) { cmd_found = 1; - unselect_all(); + if(argc > 2) unselect_all(atoi(argv[2])); + else unselect_all(1); Tcl_ResetResult(interp); } } diff --git a/src/select.c b/src/select.c index fda05752..379c1705 100644 --- a/src/select.c +++ b/src/select.c @@ -579,14 +579,14 @@ void bbox(int what,double x1,double y1, double x2, double y2) } } -void unselect_all(void) +void unselect_all(int dr) { int i,c; char str[PATH_MAX]; #if HAS_CAIRO==1 int customfont; #endif - dbg(1, "unselect_all(): start\n"); + dbg(1, "unselect_all(1): start\n"); xctx->ui_state = 0; xctx->lastsel = 0; @@ -596,12 +596,14 @@ void unselect_all(void) { xctx->wire[i].sel = 0; { - if(xctx->wire[i].bus) - drawtempline(xctx->gctiled, THICK, xctx->wire[i].x1, xctx->wire[i].y1, + if(dr) { + if(xctx->wire[i].bus) + drawtempline(xctx->gctiled, THICK, xctx->wire[i].x1, xctx->wire[i].y1, + xctx->wire[i].x2, xctx->wire[i].y2); + else + drawtempline(xctx->gctiled, ADD, xctx->wire[i].x1, xctx->wire[i].y1, xctx->wire[i].x2, xctx->wire[i].y2); - else - drawtempline(xctx->gctiled, ADD, xctx->wire[i].x1, xctx->wire[i].y1, - xctx->wire[i].x2, xctx->wire[i].y2); + } } } } @@ -610,7 +612,7 @@ void unselect_all(void) if(xctx->inst[i].sel == SELECTED) { xctx->inst[i].sel = 0; - for(c=0;cgctiled, i, c,0,0,0.0,0.0); } } @@ -619,16 +621,18 @@ void unselect_all(void) if(xctx->text[i].sel == SELECTED) { xctx->text[i].sel = 0; - #if HAS_CAIRO==1 - customfont = set_text_custom_font(& xctx->text[i]); /* needed for bbox calculation */ - #endif - draw_temp_string(xctx->gctiled,ADD, xctx->text[i].txt_ptr, - xctx->text[i].rot, xctx->text[i].flip, xctx->text[i].hcenter, xctx->text[i].vcenter, - xctx->text[i].x0, xctx->text[i].y0, - xctx->text[i].xscale, xctx->text[i].yscale); - #if HAS_CAIRO==1 - if(customfont) cairo_restore(xctx->cairo_ctx); - #endif + if(dr) { + #if HAS_CAIRO==1 + customfont = set_text_custom_font(& xctx->text[i]); /* needed for bbox calculation */ + #endif + draw_temp_string(xctx->gctiled,ADD, xctx->text[i].txt_ptr, + xctx->text[i].rot, xctx->text[i].flip, xctx->text[i].hcenter, xctx->text[i].vcenter, + xctx->text[i].x0, xctx->text[i].y0, + xctx->text[i].xscale, xctx->text[i].yscale); + #if HAS_CAIRO==1 + if(customfont) cairo_restore(xctx->cairo_ctx); + #endif + } } } for(c=0;carc[c][i].sel) { xctx->arc[c][i].sel = 0; - drawtemparc(xctx->gctiled, ADD, xctx->arc[c][i].x, xctx->arc[c][i].y, + if(dr) drawtemparc(xctx->gctiled, ADD, xctx->arc[c][i].x, xctx->arc[c][i].y, xctx->arc[c][i].r, xctx->arc[c][i].a, xctx->arc[c][i].b); } } @@ -647,7 +651,7 @@ void unselect_all(void) if(xctx->rect[c][i].sel) { xctx->rect[c][i].sel = 0; - drawtemprect(xctx->gctiled, ADD, xctx->rect[c][i].x1, xctx->rect[c][i].y1, + if(dr) drawtemprect(xctx->gctiled, ADD, xctx->rect[c][i].x1, xctx->rect[c][i].y1, xctx->rect[c][i].x2, xctx->rect[c][i].y2); } } @@ -656,12 +660,14 @@ void unselect_all(void) if(xctx->line[c][i].sel) { xctx->line[c][i].sel = 0; - if(xctx->line[c][i].bus) - drawtempline(xctx->gctiled, THICK, xctx->line[c][i].x1, xctx->line[c][i].y1, + if(dr) { + if(xctx->line[c][i].bus) + drawtempline(xctx->gctiled, THICK, xctx->line[c][i].x1, xctx->line[c][i].y1, + xctx->line[c][i].x2, xctx->line[c][i].y2); + else + drawtempline(xctx->gctiled, ADD, xctx->line[c][i].x1, xctx->line[c][i].y1, xctx->line[c][i].x2, xctx->line[c][i].y2); - else - drawtempline(xctx->gctiled, ADD, xctx->line[c][i].x1, xctx->line[c][i].y1, - xctx->line[c][i].x2, xctx->line[c][i].y2); + } } } for(i=0;ipolygons[c];i++) @@ -671,18 +677,20 @@ void unselect_all(void) int k; for(k=0;kpoly[c][i].points; k++) xctx->poly[c][i].selected_point[k] = 0; xctx->poly[c][i].sel = 0; - drawtemppolygon(xctx->gctiled, NOW, xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points); + if(dr) drawtemppolygon(xctx->gctiled, NOW, xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points); } } } - drawtemparc(xctx->gctiled, END, 0.0, 0.0, 0.0, 0.0, 0.0); - drawtemprect(xctx->gctiled, END, 0.0, 0.0, 0.0, 0.0); - drawtempline(xctx->gctiled,END, 0.0, 0.0, 0.0, 0.0); + if(dr) { + drawtemparc(xctx->gctiled, END, 0.0, 0.0, 0.0, 0.0, 0.0); + drawtemprect(xctx->gctiled, END, 0.0, 0.0, 0.0, 0.0); + drawtempline(xctx->gctiled,END, 0.0, 0.0, 0.0, 0.0); + } xctx->ui_state &= ~SELECTION; /*\statusmsg("",2); */ my_snprintf(str, S(str), "%s/%s", user_conf_dir, ".selection.sch"); /* 20161115 PWD->HOME */ xunlink(str); - dbg(1, "unselect_all(): done\n"); + dbg(1, "unselect_all(1): done\n"); } void select_wire(int i,unsigned short select_mode, int fast) diff --git a/src/spice_netlist.c b/src/spice_netlist.c index 0ab7f1f7..c4369adb 100644 --- a/src/spice_netlist.c +++ b/src/spice_netlist.c @@ -39,7 +39,7 @@ void hier_psprint(void) /* netlister driver */ zoom_full(0, 0, 1, 0.97); ps_draw(2); /* page */ dbg(1,"--> %s\n", skip_dir( xctx->sch[xctx->currsch]) ); - unselect_all(); + unselect_all(1); remove_symbols(); /* ensure all unused symbols purged before descending hierarchy */ /* reload data without popping undo stack, this populates embedded symbols if any */ xctx->pop_undo(2, 0); @@ -75,7 +75,7 @@ void hier_psprint(void) /* netlister driver */ my_free(1229, &subckt_name); my_strncpy(xctx->sch[xctx->currsch] , "", S(xctx->sch[xctx->currsch])); xctx->currsch--; - unselect_all(); + unselect_all(1); xctx->pop_undo(0, 0); my_strncpy(xctx->current_name, rel_sym_path(xctx->sch[xctx->currsch]), S(xctx->current_name)); ps_draw(4); /* trailer */ @@ -348,7 +348,7 @@ void global_spice_netlist(int global) /* netlister driver */ if(global) { int saved_hilight_nets = xctx->hilight_nets; - unselect_all(); + unselect_all(1); remove_symbols(); /* 20161205 ensure all unused symbols purged before descending hierarchy */ /* reload data without popping undo stack, this populates embedded symbols if any */ xctx->pop_undo(2, 0); @@ -388,7 +388,7 @@ void global_spice_netlist(int global) /* netlister driver */ /*clear_drawing(); */ my_strncpy(xctx->sch[xctx->currsch] , "", S(xctx->sch[xctx->currsch])); xctx->currsch--; - unselect_all(); + unselect_all(1); xctx->pop_undo(0, 0); my_strncpy(xctx->current_name, rel_sym_path(xctx->sch[xctx->currsch]), S(xctx->current_name)); prepare_netlist_structs(1); /* so 'lab=...' attributes for unnamed nets are set */ diff --git a/src/tedax_netlist.c b/src/tedax_netlist.c index 0bbb1074..828c7566 100644 --- a/src/tedax_netlist.c +++ b/src/tedax_netlist.c @@ -181,7 +181,7 @@ void global_tedax_netlist(int global) /* netlister driver */ if(global) /* was if(global) ... 20180901 no hierarchical tEDAx netlist for now */ { int saved_hilight_nets = xctx->hilight_nets; - unselect_all(); + unselect_all(1); remove_symbols(); /* 20161205 ensure all unused symbols purged before descending hierarchy */ /* reload data without popping undo stack, this populates embedded symbols if any */ xctx->pop_undo(2, 0); @@ -206,7 +206,7 @@ void global_tedax_netlist(int global) /* netlister driver */ /*clear_drawing(); */ my_strncpy(xctx->sch[xctx->currsch] , "", S(xctx->sch[xctx->currsch])); xctx->currsch--; - unselect_all(); + unselect_all(1); xctx->pop_undo(0, 0); my_strncpy(xctx->current_name, rel_sym_path(xctx->sch[xctx->currsch]), S(xctx->current_name)); prepare_netlist_structs(1); /* so 'lab=...' attributes for unnamed nets are set */ diff --git a/src/verilog_netlist.c b/src/verilog_netlist.c index c266184c..d14018ac 100644 --- a/src/verilog_netlist.c +++ b/src/verilog_netlist.c @@ -141,7 +141,7 @@ void global_verilog_netlist(int global) /* netlister driver */ dbg(1, "global_verilog_netlist(): printing top level entity\n"); fprintf(fd,"module %s (\n", skip_dir( xctx->sch[xctx->currsch]) ); /* flush data structures (remove unused symbols) */ - unselect_all(); + unselect_all(1); remove_symbols(); /* removed 25122002, readded 04112003 */ /* reload data without popping undo stack, this populates embedded symbols if any */ xctx->pop_undo(2, 0); @@ -333,7 +333,7 @@ void global_verilog_netlist(int global) /* netlister driver */ if(global) { int saved_hilight_nets = xctx->hilight_nets; - unselect_all(); + unselect_all(1); remove_symbols(); /* 20161205 ensure all unused symbols purged before descending hierarchy */ /* reload data without popping undo stack, this populates embedded symbols if any */ xctx->pop_undo(2, 0); @@ -371,7 +371,7 @@ void global_verilog_netlist(int global) /* netlister driver */ my_free(1073, &subckt_name); my_strncpy(xctx->sch[xctx->currsch] , "", S(xctx->sch[xctx->currsch])); xctx->currsch--; - unselect_all(); + unselect_all(1); xctx->pop_undo(0, 0); my_strncpy(xctx->current_name, rel_sym_path(xctx->sch[xctx->currsch]), S(xctx->current_name)); prepare_netlist_structs(1); /* so 'lab=...' attributes for unnamed nets are set */ diff --git a/src/vhdl_netlist.c b/src/vhdl_netlist.c index ef771868..14e01385 100644 --- a/src/vhdl_netlist.c +++ b/src/vhdl_netlist.c @@ -200,7 +200,7 @@ void global_vhdl_netlist(int global) /* netlister driver */ /* 20071015 end */ /* flush data structures (remove unused symbols) */ - unselect_all(); + unselect_all(1); remove_symbols(); /* removed 25122002, readded 04112003.. this removes unused symbols */ /* reload data without popping undo stack, this populates embedded symbols if any */ xctx->pop_undo(2, 0); @@ -428,7 +428,7 @@ void global_vhdl_netlist(int global) /* netlister driver */ if(global) { int saved_hilight_nets = xctx->hilight_nets; - unselect_all(); + unselect_all(1); remove_symbols(); /* 20161205 ensure all unused symbols purged before descending hierarchy */ /* reload data without popping undo stack, this populates embedded symbols if any */ xctx->pop_undo(2, 0); @@ -467,7 +467,7 @@ void global_vhdl_netlist(int global) /* netlister driver */ my_free(1087, &subckt_name); my_strncpy(xctx->sch[xctx->currsch] , "", S(xctx->sch[xctx->currsch])); xctx->currsch--; - unselect_all(); + unselect_all(1); xctx->pop_undo(0, 0); my_strncpy(xctx->current_name, rel_sym_path(xctx->sch[xctx->currsch]), S(xctx->current_name)); prepare_netlist_structs(1); /* so 'lab=...' attributes for unnamed nets are set */ diff --git a/src/xinit.c b/src/xinit.c index 3d69f195..53df1c0b 100644 --- a/src/xinit.c +++ b/src/xinit.c @@ -476,6 +476,9 @@ static void alloc_xschem_data(const char *top_path, const char *win_path) xctx->prep_hash_wires = 0; xctx->modified = 0; xctx->semaphore = 0; + xctx->current_name[0] = '\0'; + xctx->sel_or_clip[0] = '\0'; + xctx->sch_to_compare[0] = '\0'; xctx->tok_size = 0; xctx->netlist_name[0] = '\0'; xctx->flat_netlist = 0; @@ -534,6 +537,7 @@ static void alloc_xschem_data(const char *top_path, const char *win_path) xctx->hilight_nets = 0; xctx->hilight_color = 0; for(i=0;isch[i][0] = '\0'; xctx->sch_path[i]=NULL; xctx->sch_path_hash[i]=0; xctx->hier_attr[i].prop_ptr = NULL; @@ -632,8 +636,8 @@ static void alloc_xschem_data(const char *top_path, const char *win_path) static void delete_schematic_data(void) { dbg(1, "delete_schematic_data()\n"); - unselect_all(); - /* clear static data in get_tok_value() must be done after unselect_all() + unselect_all(1); + /* clear static data in get_tok_value() must be done after unselect_all(1) * as this functions re-uses get_tok_value() */ get_tok_value(NULL, NULL, 0); /* clear static data in function */ /* delete inst and wire node fields, delete inst_pin spatial hash, and node hash table */ diff --git a/src/xschem.h b/src/xschem.h index d34deec3..613ea96f 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -848,6 +848,8 @@ typedef struct { int nl_points, nl_maxpoints; /* select_rect */ double nl_xr, nl_yr, nl_xr2, nl_yr2; + /* compare_schematics */ + char sch_to_compare[PATH_MAX]; /* pan */ double xpan,ypan,xpan2,ypan2; double p_xx1,p_xx2,p_yy1,p_yy2; @@ -1112,7 +1114,7 @@ extern int text_bbox_nocairo(const char * str,double xscale, double yscale, extern unsigned short select_object(double mx,double my, unsigned short sel_mode, int override_lock); /* return type 20160503 */ -extern void unselect_all(void); +extern void unselect_all(int dr); extern void select_inside(double x1,double y1, double x2, double y2, int sel); extern int Tcl_AppInit(Tcl_Interp *interp); extern int callback(const char *winpath, int event, int mx, int my, KeySym key, diff --git a/src/xschem.tcl b/src/xschem.tcl index 35779c96..60dfdc22 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -5236,6 +5236,14 @@ proc build_widgets { {topwin {} } } { -command { xschem connected_nets} $topwin.menubar.tools.menu add command -label "Select conn. wires, stop at junctions" \ -accelerator {Ctrl-Righ Butt.} -command { xschem connected_nets 1 } + + $topwin.menubar.hilight.menu add command \ + -label {Set schematic to compare and compare with} \ + -command "xschem compare_schematics" + $topwin.menubar.hilight.menu add command \ + -label {Compare schematics} \ + -command "xschem compare_schematics {}" \ + -accelerator {Alt-X} $topwin.menubar.hilight.menu add command \ -label {Highlight net-pin name mismatches on selected instances} \ -command "xschem net_pin_mismatch" \