diff --git a/doc/xschem_man/commands.html b/doc/xschem_man/commands.html
index 06b3db56..8b0ecd3f 100644
--- a/doc/xschem_man/commands.html
+++ b/doc/xschem_man/commands.html
@@ -208,6 +208,7 @@ ctrl 's' Save schematic
alt 's' Reload current schematic from disk
ctrl+alt 's' Save-as symbol
- 't' Place text
+shift 'T' Toggle *_ignore flag on selected instances
alt 'u' Align to current grid selected objects
shift 'U' Redo
- 'u' Undo
diff --git a/src/actions.c b/src/actions.c
index 5e8b748f..b375e88b 100644
--- a/src/actions.c
+++ b/src/actions.c
@@ -1853,6 +1853,39 @@ void copy_symbol(xSymbol *dest_sym, xSymbol *src_sym)
}
}
+void toggle_ignore(void)
+{
+ int i, n, first = 1, remove = 0;
+ char *attr;
+ if(xctx->netlist_type == CAD_VERILOG_NETLIST) attr="verilog_ignore";
+ else if(xctx->netlist_type == CAD_VHDL_NETLIST) attr="vhdl_ignore";
+ else if(xctx->netlist_type == CAD_TEDAX_NETLIST) attr="tedax_ignore";
+ else if(xctx->netlist_type == CAD_SPICE_NETLIST) attr="spice_ignore";
+ else attr = NULL;
+ if(attr) {
+ rebuild_selected_array();
+ for(n=0; n < xctx->lastsel; ++n) {
+ if(xctx->sel_array[n].type == ELEMENT) {
+ i = xctx->sel_array[n].n;
+ if(first) {
+ xctx->push_undo();
+ first = 0;
+ }
+ remove = 0;
+ if(!strboolcmp(get_tok_value(xctx->inst[i].prop_ptr, attr, 0), "true")) remove = 1;
+ if(remove) {
+ my_strdup(_ALLOC_ID_, &xctx->inst[i].prop_ptr, subst_token(xctx->inst[i].prop_ptr, attr, NULL));
+ } else {
+ my_strdup(_ALLOC_ID_, &xctx->inst[i].prop_ptr, subst_token(xctx->inst[i].prop_ptr, attr, "true"));
+ }
+ set_inst_flags(&xctx->inst[i]);
+ set_modify(1);
+ }
+ }
+ draw();
+ }
+}
+
/* what = 1: start
* what = 0 : end : should NOT be called if match_symbol() has been executed between start & end
*/
diff --git a/src/callback.c b/src/callback.c
index 18e79820..b900264c 100644
--- a/src/callback.c
+++ b/src/callback.c
@@ -1798,6 +1798,10 @@ int rstate; /* (reduced state, without ShiftMask) */
xctx->semaphore = save_sem;
break;
}
+ /* toggle spice_ignore, verilog_ignore, ... flag on selected instances. */
+ if(key == 'T' && rstate == 0) {
+ toggle_ignore();
+ }
if(key=='t' && rstate == 0) /* place text */
{
if(waves_selected(event, key, state, button)) {
diff --git a/src/keys.help b/src/keys.help
index d7e58f84..3a3c5f26 100644
--- a/src/keys.help
+++ b/src/keys.help
@@ -168,6 +168,7 @@ ctrl 's' Save schematic
alt 's' Reload current schematic from disk
ctrl+alt 's' Save-as symbol
- 't' Place text
+shift 'T' Toggle *_ignore flag on selected instances
alt 'u' Align to current grid selected objects
shift 'U' Redo
- 'u' Undo
diff --git a/src/scheduler.c b/src/scheduler.c
index 6ccd9e78..c537b5dd 100644
--- a/src/scheduler.c
+++ b/src/scheduler.c
@@ -5193,36 +5193,8 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
* * = {spice,verilog,vhdl,tedax} depending on current netlist mode */
else if(!strcmp(argv[1], "toggle_ignore"))
{
- int i, n, first = 1, remove = 0;
- char *attr;
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
- if(xctx->netlist_type == CAD_VERILOG_NETLIST) attr="verilog_ignore";
- else if(xctx->netlist_type == CAD_VHDL_NETLIST) attr="vhdl_ignore";
- else if(xctx->netlist_type == CAD_TEDAX_NETLIST) attr="tedax_ignore";
- else if(xctx->netlist_type == CAD_SPICE_NETLIST) attr="spice_ignore";
- else attr = NULL;
- if(attr) {
- rebuild_selected_array();
- for(n=0; n < xctx->lastsel; ++n) {
- if(xctx->sel_array[n].type == ELEMENT) {
- i = xctx->sel_array[n].n;
- if(first) {
- xctx->push_undo();
- first = 0;
- }
- remove = 0;
- if(!strboolcmp(get_tok_value(xctx->inst[i].prop_ptr, attr, 0), "true")) remove = 1;
- if(remove) {
- my_strdup(_ALLOC_ID_, &xctx->inst[i].prop_ptr, subst_token(xctx->inst[i].prop_ptr, attr, NULL));
- } else {
- my_strdup(_ALLOC_ID_, &xctx->inst[i].prop_ptr, subst_token(xctx->inst[i].prop_ptr, attr, "true"));
- }
- set_inst_flags(&xctx->inst[i]);
- set_modify(1);
- }
- }
- draw();
- }
+ toggle_ignore();
Tcl_ResetResult(interp);
}
diff --git a/src/xschem.h b/src/xschem.h
index 0cd8accb..a80b8370 100644
--- a/src/xschem.h
+++ b/src/xschem.h
@@ -1481,6 +1481,7 @@ 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, int fallback);
extern const char *get_sym_name(int inst, int ndir, int ext);
+extern void toggle_ignore(void);
extern void get_additional_symbols(int what);
extern int descend_schematic(int instnumber, int fallback, int alert);
extern void go_back(int confirm);
diff --git a/src/xschem.tcl b/src/xschem.tcl
index bd5a0dd2..145fad38 100644
--- a/src/xschem.tcl
+++ b/src/xschem.tcl
@@ -2235,6 +2235,7 @@ proc graph_add_nodes {} {
set change_done 0
foreach i $sel_idx {
set c [.graphdialog.center.left.list1 get $i]
+ # escape [ and ] characters.
set c [regsub -all {([][])} $c {\\\1}]
if { ![regexp "(^|\[ \t\n\])${c}($|\[ \t\n\])" $current_node_list]} {
if {$sel ne {}} {append sel $sep}
@@ -2351,6 +2352,7 @@ proc graph_tag_nodes {txt} {
set col [xschem getprop rect 2 $graph_selected color]
set col [string trim $col " \n"]
}
+ # non capturing `tcleval(` at beginning and `)` at end
set regx {(?:tcleval\(\n*)?("[^"]+"|[^ \t\n)]+)(?:\))?}
set tt {}
set cc {}
@@ -4931,7 +4933,7 @@ proc edit_prop {txtlabel} {
set retval_orig [.dialog.symprop get 1.0 {end - 1 chars}]
} else {
set retval [.dialog.symprop get 1.0 {end - 1 chars}]
- regsub -all {(["\\])} $retval {\\\1} retval ;#" editor is confused by the previous quote
+ regsub -all {(["\\])} $retval {\\\1} retval ;# vim syntax fix "
set retval \"${retval}\"
set retval_orig [xschem subst_tok $retval_orig $old_selected_tok $retval]
}
@@ -4974,6 +4976,26 @@ proc edit_prop {txtlabel} {
wm geometry .dialog $edit_prop_pos
}
set edit_symbol_prop_new_sel 0
+
+ tkwait visibility .dialog
+ # select text after value= or lab= and place cursor just before selection
+ set regx {value *= *("[^"]+"|[^ \t\n"]+)} ;# vim syntax fix "
+ set regx1 {value *= *[^ \n]}
+ set idx [.dialog.symprop search -regexp -nolinestop -count nchars $regx 1.0]
+ .dialog.symprop search -regexp -nolinestop -count len $regx1 1.0
+ incr len -1
+ if {$idx eq {} } {
+ set regx {lab *= *("[^"]+"|[^ \t\n"]+)} ;# vim syntax fix "
+ set regx1 {lab *= *[^ \n]}
+ set idx [.dialog.symprop search -regexp -nolinestop -count nchars $regx 1.0]
+ .dialog.symprop search -regexp -nolinestop -count len $regx1 1.0
+ incr len -1
+ }
+ if { $idx ne {} } {
+ .dialog.symprop tag add sel "$idx + $len chars" "$idx + $nchars chars"
+ .dialog.symprop mark set insert "$idx + $len chars"
+ }
+ focus .dialog.symprop
tkwait window .dialog
xschem set semaphore [expr {[xschem get semaphore] -1}]
return $tctx::rcode
@@ -7358,7 +7380,7 @@ proc build_widgets { {topwin {} } } {
$topwin.menubar.prop.menu add command -label "Edit with editor" -command "xschem edit_vi_prop" -accelerator Shift+Q
$topwin.menubar.prop.menu add command -label "View" -command "xschem view_prop" -accelerator Ctrl+Shift+Q
$topwin.menubar.prop.menu add command -label "Toggle *_ignore attribute on selected instances" \
- -command "xschem toggle_ignore"
+ -command "xschem toggle_ignore" -accelerator Shift+T
$topwin.menubar.prop.menu add command -label "Edit Header/License text" \
-command { update_schematic_header } -accelerator Shift+B
$topwin.menubar.prop.menu add command -background red -label "Edit file (danger!)" \