From d8fb5b148027fd081d63a27ab555d51c3781f6d4 Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Tue, 25 Nov 2025 15:25:42 +0100 Subject: [PATCH] added bus (cached from attr) member in Polygon struct for efficiency --- src/check.c | 24 ++++++++++++++++-------- src/draw.c | 6 ++++-- src/editprop.c | 13 ++++++------- src/paste.c | 2 +- src/psprint.c | 7 ++----- src/save.c | 3 ++- src/svgdraw.c | 7 ++----- src/xschem.h | 1 + 8 files changed, 34 insertions(+), 29 deletions(-) diff --git a/src/check.c b/src/check.c index e0c5f9f6..89813e50 100644 --- a/src/check.c +++ b/src/check.c @@ -218,8 +218,10 @@ void trim_wires(void) } xctx->wire[xctx->wires].prop_ptr=NULL; my_strdup(_ALLOC_ID_, &xctx->wire[xctx->wires].prop_ptr, xctx->wire[j].prop_ptr); - xctx->wire[xctx->wires].bus = - get_attr_val(get_tok_value(xctx->wire[xctx->wires].prop_ptr,"bus",0)); + /* xctx->wire[xctx->wires].bus = + * get_attr_val(get_tok_value(xctx->wire[xctx->wires].prop_ptr,"bus",0)); + */ + xctx->wire[xctx->wires].bus = xctx->wire[j].bus; xctx->wire[xctx->wires].node=NULL; my_strdup(_ALLOC_ID_, &xctx->wire[xctx->wires].node, xctx->wire[j].node); @@ -498,8 +500,10 @@ void break_wires_at_point(double x0, double y0, int align) xctx->wire[xctx->wires].sel=0; xctx->wire[xctx->wires].prop_ptr=NULL; my_strdup(_ALLOC_ID_, &xctx->wire[xctx->wires].prop_ptr, xctx->wire[i].prop_ptr); - xctx->wire[xctx->wires].bus = - get_attr_val(get_tok_value(xctx->wire[xctx->wires].prop_ptr,"bus",0)); + /* xctx->wire[xctx->wires].bus = + * get_attr_val(get_tok_value(xctx->wire[xctx->wires].prop_ptr,"bus",0)); + */ + xctx->wire[xctx->wires].bus = xctx->wire[i].bus; xctx->wire[xctx->wires].node=NULL; hash_wire(XINSERT, xctx->wires, 0); /* insertion happens at beginning of list */ dbg(1, "break_wires_at_pins(): hashing new wire %d: %g %g %g %g\n", @@ -573,8 +577,10 @@ void break_wires_at_pins(int remove) xctx->wire[xctx->wires].sel=xctx->wire[i].sel; xctx->wire[xctx->wires].prop_ptr=NULL; my_strdup(_ALLOC_ID_, &xctx->wire[xctx->wires].prop_ptr, xctx->wire[i].prop_ptr); - xctx->wire[xctx->wires].bus = - get_attr_val(get_tok_value(xctx->wire[xctx->wires].prop_ptr,"bus", 0)); + /* xctx->wire[xctx->wires].bus = + * get_attr_val(get_tok_value(xctx->wire[xctx->wires].prop_ptr,"bus", 0)); + */ + xctx->wire[xctx->wires].bus = xctx->wire[i].bus; xctx->wire[xctx->wires].node=NULL; hash_wire(XINSERT, xctx->wires, 0); /* insertion happens at beginning of list */ dbg(1, "break_wires_at_pins(): hashing new wire %d: %g %g %g %g\n", @@ -667,8 +673,10 @@ void break_wires_at_pins(int remove) set_first_sel(WIRE, xctx->wires, 0); xctx->wire[xctx->wires].prop_ptr=NULL; my_strdup(_ALLOC_ID_, &xctx->wire[xctx->wires].prop_ptr, xctx->wire[i].prop_ptr); - xctx->wire[xctx->wires].bus = - get_attr_val(get_tok_value(xctx->wire[xctx->wires].prop_ptr,"bus",0)); + /* xctx->wire[xctx->wires].bus = + * get_attr_val(get_tok_value(xctx->wire[xctx->wires].prop_ptr,"bus",0)); + */ + xctx->wire[xctx->wires].bus = xctx->wire[i].bus; xctx->wire[xctx->wires].node=NULL; hash_wire(XINSERT, xctx->wires, 0); /* insertion happens at beginning of list */ xctx->need_reb_sel_arr=1; diff --git a/src/draw.c b/src/draw.c index 70ccaa5f..f789383e 100644 --- a/src/draw.c +++ b/src/draw.c @@ -744,7 +744,8 @@ void draw_symbol(int what,int c, int n,int layer,short tmp_flip, short rot, int bezier; int bus; polygon = &(symptr->poly[layer])[j]; - bus = get_attr_val(get_tok_value(polygon->prop_ptr, "bus", 0)) ? THICK : NOW; + /* bus = get_attr_val(get_tok_value(polygon->prop_ptr, "bus", 0)) ? THICK : NOW; */ + bus = polygon->bus ? THICK : NOW; bezier = !strboolcmp(get_tok_value(polygon->prop_ptr, "bezier", 0), "true"); dash = (disabled == 1) ? 3 : polygon->dash; x = my_malloc(_ALLOC_ID_, sizeof(double) * polygon->points); @@ -5180,7 +5181,8 @@ void draw(void) if(draw_layer && xctx->enable_layer[c]) for(i=0;ipolygons[c]; ++i) { int bezier; xPoly *p = &xctx->poly[c][i]; - int bus = get_attr_val(get_tok_value(p->prop_ptr, "bus", 0)) ? THICK : NOW; + /* int bus = get_attr_val(get_tok_value(p->prop_ptr, "bus", 0)) ? THICK : NOW; */ + int bus = p->bus ? THICK : NOW; bezier = 2 + !strboolcmp(get_tok_value(p->prop_ptr, "bezier", 0), "true"); drawpolygon(cc, bus, p->x, p->y, p->points, p->fill, p->dash, bezier); } diff --git a/src/editprop.c b/src/editprop.c index 3fc5a14f..f5cc4846 100644 --- a/src/editprop.c +++ b/src/editprop.c @@ -1186,14 +1186,13 @@ static int edit_wire_property(void) } else { my_strdup(_ALLOC_ID_, &xctx->wire[k].prop_ptr,(char *) tclgetvar("tctx::retval")); } - bus = get_attr_val(get_tok_value(xctx->wire[k].prop_ptr,"bus",0)); + xctx->wire[k].bus = bus = get_attr_val(get_tok_value(xctx->wire[k].prop_ptr,"bus",0)); if(bus) { double ov, y1, y2; ov = INT_BUS_WIDTH(xctx->lw) > xctx->cadhalfdotsize ? INT_BUS_WIDTH(xctx->lw) : CADHALFDOTSIZE; if(xctx->wire[k].y1 < xctx->wire[k].y2) { y1 = xctx->wire[k].y1-ov; y2 = xctx->wire[k].y2+ov; } else { y1 = xctx->wire[k].y1+ov; y2 = xctx->wire[k].y2-ov; } bbox(ADD, xctx->wire[k].x1-ov, y1 , xctx->wire[k].x2+ov , y2 ); - xctx->wire[k].bus=1; } else { if(oldbus){ double ov, y1, y2; @@ -1201,7 +1200,6 @@ static int edit_wire_property(void) if(xctx->wire[k].y1 < xctx->wire[k].y2) { y1 = xctx->wire[k].y1-ov; y2 = xctx->wire[k].y2+ov; } else { y1 = xctx->wire[k].y1+ov; y2 = xctx->wire[k].y2-ov; } bbox(ADD, xctx->wire[k].x1-ov, y1 , xctx->wire[k].x2+ov , y2 ); - xctx->wire[k].bus=0; } } } @@ -1291,7 +1289,7 @@ static int edit_polygon_property(void) int oldbezier, bezier; int k; double x1=0., y1=0., x2=0., y2=0.; - int c, i, ii, old_dash, old_bus, bus; + int c, i, ii, old_dash, oldbus, bus; int drw = 0; char *oldprop = NULL; const char *dash; @@ -1318,7 +1316,8 @@ static int edit_polygon_property(void) c = xctx->sel_array[ii].col; oldbezier = !strboolcmp(get_tok_value(xctx->poly[c][i].prop_ptr,"bezier",0),"true") ; - old_bus = get_attr_val(get_tok_value(xctx->poly[c][i].prop_ptr,"bus",0)); + /* oldbus = get_attr_val(get_tok_value(xctx->poly[c][i].prop_ptr,"bus",0)); */ + oldbus = xctx->poly[c][i].bus; if(oldprop && preserve == 1) { set_different_token(&xctx->poly[c][i].prop_ptr, (char *) tclgetvar("tctx::retval"), oldprop); } else { @@ -1327,7 +1326,7 @@ static int edit_polygon_property(void) old_fill = xctx->poly[c][i].fill; old_dash = xctx->poly[c][i].dash; bezier = !strboolcmp(get_tok_value(xctx->poly[c][i].prop_ptr,"bezier",0),"true") ; - bus = get_attr_val(get_tok_value(xctx->poly[c][i].prop_ptr,"bus",0)); + xctx->poly[c][i].bus = bus = get_attr_val(get_tok_value(xctx->poly[c][i].prop_ptr,"bus",0)); fill_ptr = get_tok_value(xctx->poly[c][i].prop_ptr,"fill",0); if( !strcmp(fill_ptr,"full") ) @@ -1343,7 +1342,7 @@ static int edit_polygon_property(void) } else xctx->poly[c][i].dash = 0; if(old_fill != xctx->poly[c][i].fill || old_dash != xctx->poly[c][i].dash || - oldbezier != bezier || old_bus != bus) { + oldbezier != bezier || oldbus != bus) { if(!drw) { bbox(START,0.0,0.0,0.0,0.0); drw = 1; diff --git a/src/paste.c b/src/paste.c index 095d59ad..8889f329 100644 --- a/src/paste.c +++ b/src/paste.c @@ -231,7 +231,7 @@ static void merge_polygon(FILE *fd) } else { ptr[i].dash = 0; } - + ptr[i].bus = get_attr_val(get_tok_value(ptr[i].prop_ptr, "bus", 0)); select_polygon(c,i, SELECTED, 1, 1); xctx->polygons[c]++; } diff --git a/src/psprint.c b/src/psprint.c index 44a30991..1b78d324 100644 --- a/src/psprint.c +++ b/src/psprint.c @@ -1033,10 +1033,8 @@ static void ps_draw_symbol(int c, int n,int layer, int what, short tmp_flip, sho { int dash; int bezier; - int bus; polygon = &(symptr->poly[layer])[j]; bezier = !strboolcmp(get_tok_value(polygon->prop_ptr, "bezier", 0), "true"); - bus = get_attr_val(get_tok_value(polygon->prop_ptr, "bus", 0)); dash = (disabled == 1) ? 3 : polygon->dash; { /* scope block so we declare some auxiliary arrays for coord transforms. 20171115 */ int k; @@ -1047,7 +1045,7 @@ static void ps_draw_symbol(int c, int n,int layer, int what, short tmp_flip, sho x[k]+= x0; y[k] += y0; } - ps_drawpolygon(c, NOW, x, y, polygon->points, polygon->fill, dash, bezier, bus); + ps_drawpolygon(c, NOW, x, y, polygon->points, polygon->fill, dash, bezier, polygon->bus); my_free(_ALLOC_ID_, &x); my_free(_ALLOC_ID_, &y); } @@ -1481,9 +1479,8 @@ void create_ps(char **psfile, int what, int fullzoom, int eps) } for(i=0;ipolygons[c]; ++i) { int bezier = !strboolcmp(get_tok_value(xctx->poly[c][i].prop_ptr, "bezier", 0), "true"); - int bus = get_attr_val(get_tok_value(xctx->poly[c][i].prop_ptr, "bus", 0)); ps_drawpolygon(c, NOW, xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points, - xctx->poly[c][i].fill, xctx->poly[c][i].dash, bezier, bus); + xctx->poly[c][i].fill, xctx->poly[c][i].dash, bezier, xctx->poly[c][i].bus); } dbg(1, "create_ps(): starting drawing symbols on layer %d\n", c); } /* for(c=0;cpolygons[c]++; } @@ -4520,7 +4521,7 @@ int load_sym_def(const char *name, FILE *embed_fd) pp[c][i].dash = 0; pp[c][i].sel = 0; - + pp[c][i].bus = get_attr_val(get_tok_value(pp[c][i].prop_ptr,"bus", 0)); dbg(2, "l_s_d(): loaded polygon: ptr=%lx\n", (unsigned long)pp[c]); lastp[c]++; break; diff --git a/src/svgdraw.c b/src/svgdraw.c index e45d76f5..0d52a183 100644 --- a/src/svgdraw.c +++ b/src/svgdraw.c @@ -714,9 +714,7 @@ static void svg_draw_symbol(int c, int n,int layer,short tmp_flip, short rot, for(j=0;j< symptr->polygons[layer]; ++j) { int dash; int bezier; - int bus; polygon =&(symptr->poly[layer])[j]; - bus = get_attr_val(get_tok_value(polygon->prop_ptr, "bus", 0)); bezier = !strboolcmp(get_tok_value(polygon->prop_ptr, "bezier", 0), "true"); dash = (disabled == 1) ? 3 : polygon->dash; { /* scope block so we declare some auxiliary arrays for coord transforms. 20171115 */ @@ -728,7 +726,7 @@ static void svg_draw_symbol(int c, int n,int layer,short tmp_flip, short rot, x[k]+= x0; y[k] += y0; } - svg_drawpolygon(c, NOW, x, y, polygon->points, polygon->fill, dash, bezier, bus); + svg_drawpolygon(c, NOW, x, y, polygon->points, polygon->fill, dash, bezier, polygon->bus); my_free(_ALLOC_ID_, &x); my_free(_ALLOC_ID_, &y); } @@ -1076,9 +1074,8 @@ void svg_draw(void) } for(i=0;ipolygons[c]; ++i) { int bezier = !strboolcmp(get_tok_value(xctx->poly[c][i].prop_ptr, "bezier", 0), "true"); - int bus = get_attr_val(get_tok_value(xctx->poly[c][i].prop_ptr, "bus", 0)); svg_drawpolygon(c, NOW, xctx->poly[c][i].x, xctx->poly[c][i].y, xctx->poly[c][i].points, - xctx->poly[c][i].fill, xctx->poly[c][i].dash, bezier, bus); + xctx->poly[c][i].fill, xctx->poly[c][i].dash, bezier, xctx->poly[c][i].bus); } for(i=0;iinstances; ++i) { svg_draw_symbol(c,i,c,0,0,0.0,0.0); diff --git a/src/xschem.h b/src/xschem.h index 6aca17ed..d7620707 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -519,6 +519,7 @@ typedef struct char *prop_ptr; short fill; short dash; + int bus; } xPoly; typedef struct