add tcl variable "unselect_partial_sel_wires" and related options menu entry to unselect partially selected wires attached to component pins after a stretch move command

This commit is contained in:
stefan schippers 2023-09-26 01:38:48 +02:00
parent a4b597cfc2
commit 983f6d9d6b
5 changed files with 102 additions and 46 deletions

View File

@ -973,20 +973,18 @@ void clear_partial_selected_wires(void)
int wire = xctx->sel_array[j].n;
select_wire(wire, 0, 1);
}
xctx->need_reb_sel_arr = 1;
rebuild_selected_array();
}
/* Add wires when moving instances or wires
* action: 1 to select, 0 to unselect */
short connect_by_kissing(int action)
/* Add wires when moving instances or wires */
int connect_by_kissing(void)
{
xSymbol *symbol;
int npin, i, j;
double x0,y0, pinx0, piny0;
short flip, rot;
xRect *rct;
short kissing, changed = 0;
int kissing, changed = 0;
int k, ii, done_undo = 0;
Wireentry *wptr;
Instpinentry *iptr;
@ -997,24 +995,15 @@ short connect_by_kissing(int action)
str_hash_init(&coord_table, HASHSIZE);
rebuild_selected_array();
k = xctx->lastsel;
prepare_netlist_structs(0);
prepare_netlist_structs(0); /* rebuild spatial hashes */
/* add wires to moving instance pins */
for(j=0;j<k; ++j) if(xctx->sel_array[j].type==ELEMENT) {
int inst = xctx->sel_array[j].n;
x0 = xctx->inst[inst].x0;
y0 = xctx->inst[inst].y0;
rot = xctx->inst[inst].rot;
flip = xctx->inst[inst].flip;
symbol = xctx->sym + xctx->inst[inst].ptr;
npin = symbol->rects[PINLAYER];
rct=symbol->rect[PINLAYER];
for(i=0;i<npin; ++i) {
pinx0 = (rct[i].x1+rct[i].x2)/2;
piny0 = (rct[i].y1+rct[i].y2)/2;
ROTATION(rot, flip, 0.0, 0.0, pinx0, piny0, pinx0, piny0);
pinx0 += x0;
piny0 += y0;
get_inst_pin_coord(inst, i, &pinx0, &piny0);
get_square(pinx0, piny0, &sqx, &sqy);
iptr=xctx->instpin_spatial_table[sqx][sqy];
wptr=xctx->wire_spatial_table[sqx][sqy];
@ -1025,23 +1014,17 @@ short connect_by_kissing(int action)
iptr = iptr->next;
continue;
}
if( iptr->x0 == pinx0 && iptr->y0 == piny0 && xctx->inst[ii].sel == 0) {
kissing=1;
if( iptr->x0 == pinx0 && iptr->y0 == piny0 && xctx->inst[ii].sel == 0) {
kissing = 1;
break;
}
iptr = iptr->next;
}
while(wptr) {
xWire *w = &xctx->wire[wptr->n];
if( touch(w->x1, w->y1, w->x2, w->y2, pinx0, piny0)) {
if( w->sel) {
kissing=0;
break;
}
else {
kissing = 1;
break;
}
if( touch(w->x1, w->y1, w->x2, w->y2, pinx0, piny0) && w->sel == 0) {
kissing = 1;
break;
}
wptr = wptr->next;
}
@ -1057,6 +1040,7 @@ short connect_by_kissing(int action)
str_hash_lookup(&coord_table, coord, "", XINSERT);
storeobject(-1, pinx0, piny0, pinx0, piny0, WIRE, 0, SELECTED1, NULL);
changed = 1;
xctx->prep_hash_wires=0;
xctx->need_reb_sel_arr = 1;
}
}
@ -1085,7 +1069,7 @@ short connect_by_kissing(int action)
dbg(1, "connect_by_kissing(): ii=%d, x0=%g, y0=%g, iptr->x0=%g, iptr->y0=%g\n",
ii, x0, y0, iptr->x0, iptr->y0);
if( iptr->x0 == x0 && iptr->y0 == y0 && xctx->inst[ii].sel == 0) {
kissing=1;
kissing = 1;
break;
}
iptr = iptr->next;
@ -1096,15 +1080,9 @@ short connect_by_kissing(int action)
wptr = wptr->next;
continue;
}
if( touch(w->x1, w->y1, w->x2, w->y2, x0, y0)) {
if( w->sel) {
kissing=0;
break;
}
else {
kissing = 1;
break;
}
if( touch(w->x1, w->y1, w->x2, w->y2, x0, y0) && w->sel == 0) {
kissing = 1;
break;
}
wptr = wptr->next;
}
@ -1119,9 +1097,9 @@ short connect_by_kissing(int action)
str_hash_lookup(&coord_table, coord, "", XINSERT);
storeobject(-1, x0, y0, x0, y0, WIRE, 0, SELECTED1, NULL);
changed = 1;
xctx->prep_hash_wires=0;
xctx->need_reb_sel_arr = 1;
}
}
}
}
@ -1130,6 +1108,73 @@ short connect_by_kissing(int action)
return changed;
}
int unselect_partial_sel_wires(void)
{
xSymbol *symbol;
int npin, i, j;
double x0,y0, pinx0, piny0;
int changed = 0;
int k;
Wireentry *wptr;
int sqx, sqy;
if(!tclgetboolvar("unselect_partial_sel_wires")) return 0;
rebuild_selected_array();
k = xctx->lastsel;
prepare_netlist_structs(0); /* rebuild spatial hashes */
/* unselect wires attached to moved instance pins */
for(j=0;j<k; ++j) if(xctx->sel_array[j].type==ELEMENT) {
int inst = xctx->sel_array[j].n;
symbol = xctx->sym + xctx->inst[inst].ptr;
npin = symbol->rects[PINLAYER];
for(i=0;i<npin; ++i) {
get_inst_pin_coord(inst, i, &pinx0, &piny0);
get_square(pinx0, piny0, &sqx, &sqy);
wptr=xctx->wire_spatial_table[sqx][sqy];
while(wptr) {
xWire *w = &xctx->wire[wptr->n];
if(touch(w->x1, w->y1, w->x2, w->y2, pinx0, piny0) && w->sel && w->sel != SELECTED) {
select_wire(wptr->n, 0, 1);
changed = 1;
}
wptr = wptr->next;
}
}
}
/* unselect wires attached to moved wire endpoints */
for(j=0; j < k; ++j) if(xctx->sel_array[j].type == WIRE) {
int wire = xctx->sel_array[j].n;
if(xctx->wire[wire].sel != SELECTED) continue; /* skip partially selected wires */
for(i=0;i<2; ++i) {
if(i == 0) {
x0 = xctx->wire[wire].x1;
y0 = xctx->wire[wire].y1;
} else {
x0 = xctx->wire[wire].x2;
y0 = xctx->wire[wire].y2;
}
get_square(x0, y0, &sqx, &sqy);
wptr=xctx->wire_spatial_table[sqx][sqy];
while(wptr) {
xWire *w = &xctx->wire[wptr->n];
if(wire == wptr->n) {
wptr = wptr->next;
continue;
}
if(touch(w->x1, w->y1, w->x2, w->y2, x0, y0) && w->sel && w->sel != SELECTED) {
xctx->wire[wptr->n].sel = 0;
select_wire(wptr->n, 0, 1);
changed = 1;
}
wptr = wptr->next;
}
}
}
return changed;
}
void attach_labels_to_inst(int interactive) /* offloaded from callback.c 20171005 */
{
xSymbol *symbol;

View File

@ -658,7 +658,7 @@ void copy_objects(int what)
xctx->rotatelocal=0;
dbg(1, "copy_objects(): START copy\n");
rebuild_selected_array();
if(tclgetintvar("connect_by_kissing") == 2) xctx->kissing = connect_by_kissing(1);
if(tclgetintvar("connect_by_kissing") == 2) xctx->kissing = connect_by_kissing();
else xctx->kissing = 0;
save_selection(1);
@ -1106,7 +1106,7 @@ void move_objects(int what, int merge, double dx, double dy)
xctx->deltax = xctx->deltay = 0.0;
rebuild_selected_array();
/* if connect_by_kissing==2 it was set in callback.c ('M' command) */
if(tclgetintvar("connect_by_kissing")) xctx->kissing = connect_by_kissing(1);
if(tclgetintvar("connect_by_kissing")) xctx->kissing = connect_by_kissing();
else xctx->kissing = 0;
xctx->movelastsel = xctx->lastsel;
if(xctx->lastsel==1 && xctx->sel_array[0].type==ARC &&
@ -1622,6 +1622,9 @@ void move_objects(int what, int merge, double dx, double dy)
draw();
if(!floaters) bbox(END , 0.0 , 0.0 , 0.0 , 0.0);
xctx->rotatelocal=0;
unselect_partial_sel_wires();
}
draw_selection(xctx->gc[SELLAYER], 0);
if(tclgetboolvar("draw_crosshair")) draw_crosshair(0);

View File

@ -947,7 +947,7 @@ typedef struct {
double rx1, rx2, ry1, ry2;
short move_rot;
/* a wire was created while separating a component frm a net or another component */
short kissing;
int kissing;
short move_flip;
int manhattan_lines;
double x1, y_1, x2, y_2, deltax, deltay;
@ -1355,7 +1355,8 @@ extern int place_symbol(int pos, const char *symbol_name, double x, double y, sh
extern void place_net_label(int type);
extern void attach_labels_to_inst(int interactive);
extern void clear_partial_selected_wires(void);
extern short connect_by_kissing(int action); /* action: 1 to select, 0 to unselect */
extern int connect_by_kissing(void);
extern int unselect_partial_sel_wires(void);
extern void delete_files(void);
extern int sym_vs_sch_pins(void);
extern char *get_generator_command(const char *str);

View File

@ -5610,7 +5610,8 @@ set tctx::global_list {
svg_font_name sym_txt symbol symbol_width tclcmd_txt tclstop text_line_default_geometry
text_replace_selection textwindow_fileid textwindow_filename textwindow_w tmp_bus_char
toolbar_horiz toolbar_list
toolbar_visible transparent_svg undo_type use_lab_wire use_label_prefix use_tclreadline
toolbar_visible transparent_svg undo_type use_lab_wire unselect_partial_sel_wires
use_label_prefix use_tclreadline
user_wants_copy_cell verilog_2001 verilog_bitblast viewdata_fileid viewdata_filename viewdata_w
vsize xschem_libs xschem_listen_port zoom_full_center
}
@ -5983,6 +5984,8 @@ proc build_widgets { {topwin {} } } {
-onvalue disk -offvalue memory -command {switch_undo}
$topwin.menubar.option.menu add checkbutton -label "Enable stretch" -variable enable_stretch \
-accelerator Y
$topwin.menubar.option.menu add checkbutton -label "Unsel. partial sel. wires after stretch move" \
-variable unselect_partial_sel_wires
$topwin.menubar.option.menu add checkbutton -label "Auto Join/Trim Wires" -variable autotrim_wires \
-command {
@ -6007,7 +6010,6 @@ proc build_widgets { {topwin {} } } {
set bus_replacement_char $tmp_bus_char
}
}
$topwin.menubar.option.menu add checkbutton -label "Verilog 2001 netlist variant" -variable verilog_2001
$topwin.menubar.option.menu add checkbutton \
-label "Group bus slices in Verilog instances" -variable verilog_bitblast
$topwin.menubar.option.menu add checkbutton -label "Draw grid" -variable draw_grid \
@ -6072,7 +6074,6 @@ proc build_widgets { {topwin {} } } {
-value 1 -accelerator H -command {xschem set constrained_move 1}
$topwin.menubar.edit.menu add radiobutton -label "Constrained Vertical move" -variable constrained_move \
-value 2 -accelerator V -command {xschem set constrained_move 2}
$topwin.menubar.edit.menu add checkbutton -label "Add wire when separating pins" -variable connect_by_kissing
$topwin.menubar.edit.menu add command -label "Push schematic" -command "xschem descend" -accelerator E
toolbar_add EditPushSch "xschem descend" "Push schematic" $topwin
$topwin.menubar.edit.menu add command -label "Push symbol" -command "xschem descend_symbol" -accelerator I
@ -6754,6 +6755,7 @@ set_ne incr_hilight 1
set_ne enable_stretch 0
set_ne constrained_move 0
set_ne connect_by_kissing 0
set_ne unselect_partial_sel_wires 0
set_ne draw_crosshair 0
set_ne draw_grid 1
set_ne big_grid_points 0

View File

@ -181,6 +181,11 @@
#### connected by pins. Default: not enabled (0)
# set connect_by_kissing 1
#### if set to 1 at end of a move operation that stretches wires attached to
#### moved objects these wires will be unselected.
#### default: not enabled (0)
# set unselect_partial_sel_wires 0
#### if set to 1 automatically join/trim wires while editing
#### this may slow down on rally big designs. Can be disabled via menu
#### default: 0