diff --git a/src/actions.c b/src/actions.c index d56798ac..7a6f56e5 100644 --- a/src/actions.c +++ b/src/actions.c @@ -3183,61 +3183,11 @@ void new_wire(int what, double mx_snap, double my_snap) xctx->ui_state &= ~STARTWIRE; } if( (what & RUBBER) ) { - if(xctx->manhattan_lines & 1) { - xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1; - xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; - ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); - drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); - xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1; - xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; - ORDER(xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); - drawtempline(xctx->gctiled, NOW, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); - restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); - xctx->nl_x2 = mx_snap; xctx->nl_y2 = my_snap; - if(!(what & CLEAR)) { - xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; - xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; - ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); - drawtempline(xctx->gc[WIRELAYER], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); - xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; - xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; - ORDER(xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); - drawtempline(xctx->gc[WIRELAYER], NOW, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); - } - } else if(xctx->manhattan_lines & 2) { - xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; - xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; - ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); - drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); - xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; - xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; - ORDER(xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); - drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); - restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); - xctx->nl_x2 = mx_snap; xctx->nl_y2 = my_snap; - if(!(what & CLEAR)) { - xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; - xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; - ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); - drawtempline(xctx->gc[WIRELAYER], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); - xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; - xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; - ORDER(xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); - drawtempline(xctx->gc[WIRELAYER], NOW, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); - } - } else { - xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; - xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; - ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); - drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); - restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); - xctx->nl_x2 = mx_snap; xctx->nl_y2 = my_snap; - if(!(what & CLEAR)) { - xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; - xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; - ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); - drawtempline(xctx->gc[WIRELAYER], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); - } + drawtemp_manhattanline(xctx->gctiled, NOW, xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); + restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); + xctx->nl_x2 = mx_snap; xctx->nl_y2 = my_snap; + if(!(what & CLEAR)) { + drawtemp_manhattanline(xctx->gc[WIRELAYER], NOW, xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); } } } diff --git a/src/draw.c b/src/draw.c index fb0c1ddc..c6bbeabe 100644 --- a/src/draw.c +++ b/src/draw.c @@ -1375,6 +1375,45 @@ void drawtempline(GC gc, int what, double linex1,double liney1,double linex2,dou } } +void drawtemp_manhattanline(GC gc, int what, double x1, double y1, double x2, double y2) +{ + double origin_shifted_x2, origin_shifted_y2; + if(tclgetboolvar("orthogonal_wiring")) { + /* Origin shift the cartesian coordinate p2(x2,y2) w.r.t. p1(x1,y1) */ + origin_shifted_x2 = x2 - x1; + origin_shifted_y2 = y2 - y1; + /* Draw whichever component of the resulting orthogonal-wire is bigger (either horizontal or vertical), first */ + if(origin_shifted_x2*origin_shifted_x2 > origin_shifted_y2*origin_shifted_y2) + xctx->manhattan_lines = 1; + else + xctx->manhattan_lines = 2; + } + if(xctx->manhattan_lines & 1) { + xctx->nl_xx1 = x1; xctx->nl_yy1 = y1; + xctx->nl_xx2 = x2; xctx->nl_yy2 = y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); + drawtempline(gc, what, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); + xctx->nl_xx1 = x1; xctx->nl_yy1 = y1; + xctx->nl_xx2 = x2; xctx->nl_yy2 = y2; + ORDER(xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(gc, what, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + } else if(xctx->manhattan_lines & 2) { + xctx->nl_xx1 = x1; xctx->nl_yy1 = y1; + xctx->nl_xx2 = x2; xctx->nl_yy2 = y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); + drawtempline(gc, what, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); + xctx->nl_xx1 = x1; xctx->nl_yy1 = y1; + xctx->nl_xx2 = x2; xctx->nl_yy2 = y2; + ORDER(xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(gc, what, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); + } else { + xctx->nl_xx1 = x1; xctx->nl_yy1 = y1; + xctx->nl_xx2 = x2; xctx->nl_yy2 = y2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + drawtempline(gc, what, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + } +} + void drawtemparc(GC gc, int what, double x, double y, double r, double a, double b) { static int i=0; diff --git a/src/move.c b/src/move.c index 6ec3ba09..37db4066 100644 --- a/src/move.c +++ b/src/move.c @@ -378,25 +378,25 @@ void draw_selection(GC g, int interruptable) if(xctx->wire[n].sel==SELECTED) { if(xctx->wire[n].bus) - drawtempline(g, THICK, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, + drawtemp_manhattanline(g, THICK, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); else - drawtempline(g, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, + drawtemp_manhattanline(g, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); } else if(xctx->wire[n].sel==SELECTED1) { if(xctx->wire[n].bus) - drawtempline(g, THICK, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->rx2, xctx->ry2); + drawtemp_manhattanline(g, THICK, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->rx2, xctx->ry2); else - drawtempline(g, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->rx2, xctx->ry2); + drawtemp_manhattanline(g, ADD, xctx->rx1+xctx->deltax, xctx->ry1+xctx->deltay, xctx->rx2, xctx->ry2); } else if(xctx->wire[n].sel==SELECTED2) { if(xctx->wire[n].bus) - drawtempline(g, THICK, xctx->rx1, xctx->ry1, xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); + drawtemp_manhattanline(g, THICK, xctx->rx1, xctx->ry1, xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); else - drawtempline(g, ADD, xctx->rx1, xctx->ry1, xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); + drawtemp_manhattanline(g, ADD, xctx->rx1, xctx->ry1, xctx->rx2+xctx->deltax, xctx->ry2+xctx->deltay); } break; case LINE: @@ -1135,10 +1135,66 @@ void move_objects(int what, int merge, double dx, double dy) if(wire[n].sel == SELECTED1) wire[n].sel = SELECTED2; else if(wire[n].sel == SELECTED2) wire[n].sel = SELECTED1; } - wire[n].x1=xctx->rx1; - wire[n].y1=xctx->ry1; - wire[n].x2=xctx->rx2; - wire[n].y2=xctx->ry2; + + if(wire[n].sel & (SELECTED|SELECTED1)) + { + if(xctx->manhattan_lines & 1) xctx->manhattan_lines=2; + else if(xctx->manhattan_lines & 2) xctx->manhattan_lines=1; + } + wire[n].sel = SELECTED; + delete_wires(SELECTED); + if(xctx->manhattan_lines & 1) { + if(xctx->nl_xx2!=xctx->nl_xx1) { + xctx->nl_xx1 = xctx->rx1; xctx->nl_yy1 = xctx->ry1; + xctx->nl_xx2 = xctx->rx2; xctx->nl_yy2 = xctx->ry2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); + storeobject(-1, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1,WIRE,0,0,NULL); + hash_wire(XINSERT, xctx->wires-1, 1); + drawline(WIRELAYER,NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1, 0, NULL); + } + if(xctx->nl_yy2!=xctx->nl_yy1) { + xctx->nl_xx1 = xctx->rx1; xctx->nl_yy1 = xctx->ry1; + xctx->nl_xx2 = xctx->rx2; xctx->nl_yy2 = xctx->ry2; + ORDER(xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + storeobject(-1, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2,WIRE,0,0,NULL); + hash_wire(XINSERT, xctx->wires-1, 1); + drawline(WIRELAYER,NOW, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2, 0, NULL); + } + } else if(xctx->manhattan_lines & 2) { + if(xctx->nl_yy2!=xctx->nl_yy1) { + xctx->nl_xx1 = xctx->rx1; xctx->nl_yy1 = xctx->ry1; + xctx->nl_xx2 = xctx->rx2; xctx->nl_yy2 = xctx->ry2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2); + storeobject(-1, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2,WIRE,0,0,NULL); + hash_wire(XINSERT, xctx->wires-1, 1); + drawline(WIRELAYER,NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx1,xctx->nl_yy2, 0, NULL); + } + if(xctx->nl_xx2!=xctx->nl_xx1) { + xctx->nl_xx1 = xctx->rx1; xctx->nl_yy1 = xctx->ry1; + xctx->nl_xx2 = xctx->rx2; xctx->nl_yy2 = xctx->ry2; + ORDER(xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); + storeobject(-1, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2,WIRE,0,0,NULL); + hash_wire(XINSERT, xctx->wires-1, 1); + drawline(WIRELAYER,NOW, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2, 0, NULL); + } + } else { + xctx->nl_xx1 = xctx->rx1; xctx->nl_yy1 = xctx->ry1; + xctx->nl_xx2 = xctx->rx2; xctx->nl_yy2 = xctx->ry2; + ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); + storeobject(-1, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2,WIRE,0,0,NULL); + hash_wire(XINSERT, xctx->wires-1, 1); + drawline(WIRELAYER,NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2, 0, NULL); + } + xctx->prep_hi_structs = 0; + if(tclgetboolvar("autotrim_wires")) trim_wires(); + prepare_netlist_structs(0); /* since xctx->prep_hi_structs==0, do a delete_netlist_structs() first, + * this clears both xctx->prep_hi_structs and xctx->prep_net_structs. */ + if(xctx->hilight_nets) { + propagate_hilights(1, 1, XINSERT_NOREPLACE); + } + draw(); + /* draw_hilight_net(1);*/ /* for updating connection bubbles on hilight nets */ + set_modify(1); } break; diff --git a/src/xschem.h b/src/xschem.h index 93c93b09..4d85fe43 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -1428,6 +1428,7 @@ extern void filledrect(int c, int what, double rectx1,double recty1, extern void drawtempline(GC gc, int what, double x1,double y1,double x2,double y2); +extern void drawtemp_manhattanline(GC gc, int what, double x1,double y1,double x2,double y2); /* instead of doing a drawtemprect(xctx->gctiled, NOW, ....) do 4 * XCopy Area operations. Used if fix_broken_tiled_fill is set */