From d2d9eaa4e8b78e11b6e18c121810ba0d48b4edfd Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Fri, 10 Mar 2023 04:42:21 +0100 Subject: [PATCH] instance attribute "hide=true" will make the instance display as a bounding box only --- doc/xschem_man/component_property_syntax.html | 2 + src/actions.c | 2 + src/draw.c | 172 ++++++++++-------- src/editprop.c | 3 + src/paste.c | 2 + src/save.c | 8 + src/xschem.h | 6 +- 7 files changed, 119 insertions(+), 76 deletions(-) diff --git a/doc/xschem_man/component_property_syntax.html b/doc/xschem_man/component_property_syntax.html index f64ca1a4..b3e4aaa6 100644 --- a/doc/xschem_man/component_property_syntax.html +++ b/doc/xschem_man/component_property_syntax.html @@ -123,6 +123,8 @@ name="mchanged_name" model=\"nmos\" w="20u" l="3u" m="10"

A lock=true attribute will make the symbol not editable. the only way to make it editable again is to right click on it to bring up the edit attributes dialog box and set to false. This is useful for title symbols.

+
  • hide
  • +

    A hide=true attribute will only display the symbol bounding box.

  • highlight
  • If set to true the symbol will be highlighted when one of the nets attached to its pins are highlighted.

  • net_name
  • diff --git a/src/actions.c b/src/actions.c index 1cf57821..c99ad536 100644 --- a/src/actions.c +++ b/src/actions.c @@ -1061,6 +1061,8 @@ int place_symbol(int pos, const char *symbol_name, double x, double y, short rot } dbg(1, "place_symbol(): done set_inst_prop()\n"); /* 03-02-2000 */ + if(!strcmp(get_tok_value(xctx->inst[n].prop_ptr,"hide",0), "true")) + xctx->inst[n].flags |= HIDE_INST; if(!strcmp(get_tok_value(xctx->inst[n].prop_ptr,"highlight",0), "true")) xctx->inst[n].flags |= HILIGHT_CONN; type = xctx->sym[xctx->inst[n].ptr].type; diff --git a/src/draw.c b/src/draw.c index eb81220f..33038413 100644 --- a/src/draw.c +++ b/src/draw.c @@ -437,8 +437,10 @@ void draw_symbol(int what,int c, int n,int layer,short tmp_flip, short rot, if(xctx->inst[n].ptr == -1) return; if( (layer != PINLAYER && !xctx->enable_layer[layer]) ) return; if(!has_x) return; - if( (xctx->hide_symbols==1 && (xctx->inst[n].ptr+ xctx->sym)->prop_ptr && - !strcmp( (xctx->inst[n].ptr+ xctx->sym)->type, "subcircuit") ) || (xctx->hide_symbols == 2) ) { + if( (xctx->inst[n].flags & HIDE_INST) || + (xctx->hide_symbols==1 && (xctx->inst[n].ptr+ xctx->sym)->prop_ptr && + !strcmp( (xctx->inst[n].ptr+ xctx->sym)->type, "subcircuit") ) || + (xctx->hide_symbols == 2) ) { hide = 1; } else { hide = 0; @@ -618,7 +620,7 @@ void draw_temp_symbol(int what, GC gc, int n,int layer,short tmp_flip, short rot double xoffset, double yoffset) /* draws current layer only, should be called within */ { /* a "for(i=0;iinst[n].ptr == -1) return; if(!has_x) return; + if( (xctx->inst[n].flags & HIDE_INST) || + (xctx->hide_symbols==1 && (xctx->inst[n].ptr+ xctx->sym)->prop_ptr && + !strcmp( (xctx->inst[n].ptr+ xctx->sym)->type, "subcircuit") ) || + (xctx->hide_symbols == 2) ) { + hide = 1; + } else { + hide = 0; + } + flip = xctx->inst[n].flip; if(tmp_flip) flip = !flip; rot = (xctx->inst[n].rot + rot ) & 0x3; @@ -658,6 +669,17 @@ void draw_temp_symbol(int what, GC gc, int n,int layer,short tmp_flip, short rot return; } else xctx->inst[n].flags&=~1; + if(hide) { + symptr = (xctx->inst[n].ptr+ xctx->sym); + x0=xctx->inst[n].x0; + y0=xctx->inst[n].y0; + x0 += xoffset; + y0 += yoffset; + ROTATION(rot, flip, 0.0,0.0,symptr->minx, symptr->miny,x1,y1); + ROTATION(rot, flip, 0.0,0.0,symptr->maxx, symptr->maxy,x2,y2); + RECTORDER(x1,y1,x2,y2); + drawtemprect(gc,what, x0+x1, y0+y1, x0+x2, y0+y2); + } } else if(xctx->inst[n].flags&1) { dbg(2, "draw_symbol(): skipping inst %d\n", n); return; @@ -666,81 +688,83 @@ void draw_temp_symbol(int what, GC gc, int n,int layer,short tmp_flip, short rot x0=xctx->inst[n].x0 + xoffset; y0=xctx->inst[n].y0 + yoffset; symptr = (xctx->inst[n].ptr+ xctx->sym); - for(j=0;j< symptr->lines[layer]; ++j) - { - line = &(symptr->line[layer])[j]; - ROTATION(rot, flip, 0.0,0.0,line->x1,line->y1,x1,y1); - ROTATION(rot, flip, 0.0,0.0,line->x2,line->y2,x2,y2); - ORDER(x1,y1,x2,y2); - if(line->bus) - drawtempline(gc,THICK, x0+x1, y0+y1, x0+x2, y0+y2); - else - drawtempline(gc,what, x0+x1, y0+y1, x0+x2, y0+y2); - } - for(j=0;j< symptr->polygons[layer]; ++j) - { - polygon = &(symptr->poly[layer])[j]; - - { /* scope block so we declare some auxiliary arrays for coord transforms. 20171115 */ - int k; - double *x = my_malloc(_ALLOC_ID_, sizeof(double) * polygon->points); - double *y = my_malloc(_ALLOC_ID_, sizeof(double) * polygon->points); - for(k=0;kpoints; ++k) { - ROTATION(rot, flip, 0.0,0.0,polygon->x[k],polygon->y[k],x[k],y[k]); - x[k] += x0; - y[k] += y0; + if(!hide) { + for(j=0;j< symptr->lines[layer]; ++j) + { + line = &(symptr->line[layer])[j]; + ROTATION(rot, flip, 0.0,0.0,line->x1,line->y1,x1,y1); + ROTATION(rot, flip, 0.0,0.0,line->x2,line->y2,x2,y2); + ORDER(x1,y1,x2,y2); + if(line->bus) + drawtempline(gc,THICK, x0+x1, y0+y1, x0+x2, y0+y2); + else + drawtempline(gc,what, x0+x1, y0+y1, x0+x2, y0+y2); + } + for(j=0;j< symptr->polygons[layer]; ++j) + { + polygon = &(symptr->poly[layer])[j]; + + { /* scope block so we declare some auxiliary arrays for coord transforms. 20171115 */ + int k; + double *x = my_malloc(_ALLOC_ID_, sizeof(double) * polygon->points); + double *y = my_malloc(_ALLOC_ID_, sizeof(double) * polygon->points); + for(k=0;kpoints; ++k) { + ROTATION(rot, flip, 0.0,0.0,polygon->x[k],polygon->y[k],x[k],y[k]); + x[k] += x0; + y[k] += y0; + } + drawtemppolygon(gc, NOW, x, y, polygon->points); + my_free(_ALLOC_ID_, &x); + my_free(_ALLOC_ID_, &y); } - drawtemppolygon(gc, NOW, x, y, polygon->points); - my_free(_ALLOC_ID_, &x); - my_free(_ALLOC_ID_, &y); } - } - - for(j=0;j< symptr->rects[layer]; ++j) - { - rect = &(symptr->rect[layer])[j]; - ROTATION(rot, flip, 0.0,0.0,rect->x1,rect->y1,x1,y1); - ROTATION(rot, flip, 0.0,0.0,rect->x2,rect->y2,x2,y2); - RECTORDER(x1,y1,x2,y2); - drawtemprect(gc,what, x0+x1, y0+y1, x0+x2, y0+y2); - } - for(j=0;j< symptr->arcs[layer]; ++j) - { - arc = &(symptr->arc[layer])[j]; - if(flip) { - angle = 270.*rot+180.-arc->b-arc->a; - } else { - angle = arc->a+rot*270.; + + for(j=0;j< symptr->rects[layer]; ++j) + { + rect = &(symptr->rect[layer])[j]; + ROTATION(rot, flip, 0.0,0.0,rect->x1,rect->y1,x1,y1); + ROTATION(rot, flip, 0.0,0.0,rect->x2,rect->y2,x2,y2); + RECTORDER(x1,y1,x2,y2); + drawtemprect(gc,what, x0+x1, y0+y1, x0+x2, y0+y2); } - angle = fmod(angle, 360.); - if(angle<0.) angle+=360.; - ROTATION(rot, flip, 0.0,0.0,arc->x,arc->y,x1,y1); - drawtemparc(gc, what, x0+x1, y0+y1, arc->r, angle, arc->b); - } - - if(layer==PROPERTYLAYER && xctx->sym_txt) - { - const char *txtptr; - for(j=0;j< symptr->texts; ++j) - { - text = symptr->text[j]; - if(!text.txt_ptr || !text.txt_ptr[0] || text.xscale*FONTWIDTH*xctx->mooz<1) continue; - if(!xctx->show_hidden_texts && (text.flags & HIDE_TEXT)) continue; - txtptr= translate(n, text.txt_ptr); - ROTATION(rot, flip, 0.0,0.0,text.x0,text.y0,x1,y1); - #if HAS_CAIRO==1 - customfont = set_text_custom_font(&text); - #endif - if(txtptr[0]) draw_temp_string(gc, what, txtptr, - (text.rot + ( (flip && (text.rot & 1) ) ? rot+2 : rot) ) & 0x3, - flip^text.flip, text.hcenter, text.vcenter, x0+x1, y0+y1, text.xscale, text.yscale); - #if HAS_CAIRO==1 - if(customfont) { - cairo_restore(xctx->cairo_ctx); + for(j=0;j< symptr->arcs[layer]; ++j) + { + arc = &(symptr->arc[layer])[j]; + if(flip) { + angle = 270.*rot+180.-arc->b-arc->a; + } else { + angle = arc->a+rot*270.; + } + angle = fmod(angle, 360.); + if(angle<0.) angle+=360.; + ROTATION(rot, flip, 0.0,0.0,arc->x,arc->y,x1,y1); + drawtemparc(gc, what, x0+x1, y0+y1, arc->r, angle, arc->b); + } + + if(layer==PROPERTYLAYER && xctx->sym_txt) + { + const char *txtptr; + for(j=0;j< symptr->texts; ++j) + { + text = symptr->text[j]; + if(!text.txt_ptr || !text.txt_ptr[0] || text.xscale*FONTWIDTH*xctx->mooz<1) continue; + if(!xctx->show_hidden_texts && (text.flags & HIDE_TEXT)) continue; + txtptr= translate(n, text.txt_ptr); + ROTATION(rot, flip, 0.0,0.0,text.x0,text.y0,x1,y1); + #if HAS_CAIRO==1 + customfont = set_text_custom_font(&text); + #endif + if(txtptr[0]) draw_temp_string(gc, what, txtptr, + (text.rot + ( (flip && (text.rot & 1) ) ? rot+2 : rot) ) & 0x3, + flip^text.flip, text.hcenter, text.vcenter, x0+x1, y0+y1, text.xscale, text.yscale); + #if HAS_CAIRO==1 + if(customfont) { + cairo_restore(xctx->cairo_ctx); + } + #endif + + } } - #endif - - } } } diff --git a/src/editprop.c b/src/editprop.c index 9dfb7f93..f68851b8 100644 --- a/src/editprop.c +++ b/src/editprop.c @@ -1376,6 +1376,9 @@ static void update_symbol(const char *result, int x) if(!strcmp(get_tok_value(xctx->inst[*ii].prop_ptr,"highlight",0), "true")) xctx->inst[*ii].flags |= HILIGHT_CONN; else xctx->inst[*ii].flags &= ~HILIGHT_CONN; + if(!strcmp(get_tok_value(xctx->inst[*ii].prop_ptr,"hide",0), "true")) + xctx->inst[*ii].flags |= HIDE_INST; + else xctx->inst[*ii].flags &= ~HIDE_INST; xctx->inst[*ii].embed = !strcmp(get_tok_value(xctx->inst[*ii].prop_ptr, "embed", 2), "true"); } /* end for(k=0;klastsel; ++k) */ /* new symbol bbox after prop changes (may change due to text length) */ diff --git a/src/paste.c b/src/paste.c index 03ebd01b..a58474e9 100644 --- a/src/paste.c +++ b/src/paste.c @@ -281,6 +281,8 @@ static void merge_inst(int k,FILE *fd) new_prop_string(i, prop_ptr, k, tclgetboolvar("disable_unique_names")); /* will also assign .instname */ /* the final tmp argument is zero for the 1st call and used in */ /* new_prop_string() for cleaning some internal caches. */ + if(!strcmp(get_tok_value(xctx->inst[i].prop_ptr,"hide",0), "true")) + xctx->inst[i].flags |= HIDE_INST; if(!strcmp(get_tok_value(xctx->inst[i].prop_ptr,"highlight",0), "true")) xctx->inst[i].flags |= HILIGHT_CONN; xctx->inst[i].embed = !strcmp(get_tok_value(xctx->inst[i].prop_ptr, "embed", 2), "true"); diff --git a/src/save.c b/src/save.c index a263e10c..c414caa6 100644 --- a/src/save.c +++ b/src/save.c @@ -1891,6 +1891,8 @@ static void load_inst(int k, FILE *fd) load_ascii_string(&prop_ptr,fd); my_strdup(_ALLOC_ID_, &xctx->inst[i].prop_ptr, prop_ptr); my_strdup2(_ALLOC_ID_, &xctx->inst[i].instname, get_tok_value(xctx->inst[i].prop_ptr, "name", 0)); + if(!strcmp(get_tok_value(xctx->inst[i].prop_ptr,"hide",0), "true")) + xctx->inst[i].flags |= HIDE_INST; if(!strcmp(get_tok_value(xctx->inst[i].prop_ptr,"highlight",0), "true")) xctx->inst[i].flags |= HILIGHT_CONN; @@ -3225,6 +3227,9 @@ int load_sym_def(const char *name, FILE *embed_fd) if(!strcmp(get_tok_value(symbol[symbols].prop_ptr,"highlight",0), "true")) symbol[symbols].flags |= HILIGHT_CONN; else symbol[symbols].flags &= ~HILIGHT_CONN; + if(!strcmp(get_tok_value(symbol[symbols].prop_ptr,"hide",0), "true")) + symbol[symbols].flags |= HIDE_INST; + else symbol[symbols].flags &= ~HIDE_INST; } else { @@ -3242,6 +3247,9 @@ int load_sym_def(const char *name, FILE *embed_fd) if(!strcmp(get_tok_value(symbol[symbols].prop_ptr,"highlight",0), "true")) symbol[symbols].flags |= HILIGHT_CONN; else symbol[symbols].flags &= ~HILIGHT_CONN; + if(!strcmp(get_tok_value(symbol[symbols].prop_ptr,"hide",0), "true")) + symbol[symbols].flags |= HIDE_INST; + else symbol[symbols].flags &= ~HIDE_INST; } else { load_ascii_string(&aux_ptr, lcc[level].fd); diff --git a/src/xschem.h b/src/xschem.h index 97e156cf..ec4a9727 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -165,6 +165,7 @@ extern char win_temp_dir[PATH_MAX]; #define ELEMDEF 50 /* (initial) max # of defined elements */ #define EMBEDDED 1 /* used for embedded symbols marking in Symbol.flags */ #define HILIGHT_CONN 4 /* used to hilight instances if connected wire is hilighted */ +#define HIDE_INST 8 /* will only show a bounding box for specific symbol instance */ #define CADMAXGRIDPOINTS 512 #define CADMAXHIER 80 #define CADCHUNKALLOC 512 /* was 256 20102004 */ @@ -537,8 +538,9 @@ typedef struct int color; /* hilight color */ short flags; /* bit 0: skip field, * bit 1: flag for different textlayer for pin/labels, - * 1: ordinary symbol, 0: label/pin/show - * bit 2: highlight if connected net/label is highlighted */ + * 1: ordinary symbol, 0: label/pin/show + * bit 2: highlight if connected net/label is highlighted + * bit 3: hidden instance, show only bounding box (hide=true attribute)*/ char *prop_ptr; char **node; char *lab; /* lab attribute if any (pin/label) */