caching "lab" and "highlight" attributes for speed
This commit is contained in:
parent
41c46bd84b
commit
a837682731
|
|
@ -531,6 +531,7 @@ void clear_drawing(void)
|
|||
my_free(693, &xctx->inst[i].prop_ptr);
|
||||
my_free(694, &xctx->inst[i].name);
|
||||
my_free(695, &xctx->inst[i].instname);
|
||||
my_free(874, &xctx->inst[i].lab);
|
||||
delete_inst_node(i);
|
||||
}
|
||||
xctx->instances = 0;
|
||||
|
|
@ -838,6 +839,7 @@ int place_symbol(int pos, const char *symbol_name, double x, double y, short rot
|
|||
xctx->inst[n].ptr = i;
|
||||
xctx->inst[n].name=NULL;
|
||||
xctx->inst[n].instname=NULL;
|
||||
xctx->inst[n].lab=NULL;
|
||||
dbg(1, "place_symbol(): entering my_strdup: name=%s\n",name); /* 03-02-2000 */
|
||||
my_strdup(12, &xctx->inst[n].name ,name);
|
||||
dbg(1, "place_symbol(): done my_strdup: name=%s\n",name); /* 03-02-2000 */
|
||||
|
|
@ -864,11 +866,11 @@ 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 */
|
||||
|
||||
my_strdup2(13, &xctx->inst[n].instname, get_tok_value(xctx->inst[n].prop_ptr,"name",0) );
|
||||
|
||||
if(!strcmp(get_tok_value(xctx->inst[n].prop_ptr,"highlight",0), "true")) xctx->inst[n].flags |= 4;
|
||||
type = xctx->sym[xctx->inst[n].ptr].type;
|
||||
cond= !type || !IS_LABEL_SH_OR_PIN(type);
|
||||
if(cond) xctx->inst[n].flags|=2;
|
||||
else xctx->inst[n].flags &=~2;
|
||||
else my_strdup(145, &xctx->inst[n].lab, get_tok_value(xctx->inst[n].prop_ptr,"lab",0));
|
||||
|
||||
if(first_call && (draw_sym & 3) ) bbox(START, 0.0 , 0.0 , 0.0 , 0.0);
|
||||
|
||||
|
|
@ -996,10 +998,7 @@ void descend_schematic(int instnumber)
|
|||
const char *str;
|
||||
char filename[PATH_MAX];
|
||||
int inst_mult, inst_number;
|
||||
int i, save_ok = 0;
|
||||
int hilight_connected_inst;
|
||||
char *type;
|
||||
struct hilight_hashentry *entry;
|
||||
int save_ok = 0;
|
||||
|
||||
|
||||
rebuild_selected_array();
|
||||
|
|
@ -1106,36 +1105,7 @@ void descend_schematic(int instnumber)
|
|||
if(xctx->hilight_nets)
|
||||
{
|
||||
prepare_netlist_structs(0);
|
||||
|
||||
|
||||
for(i = 0; i < xctx->instances; i++) {
|
||||
type = (xctx->inst[i].ptr+ xctx->sym)->type;
|
||||
hilight_connected_inst =
|
||||
!strcmp(get_tok_value(xctx->inst[i].prop_ptr, "highlight", 0), "true") ||
|
||||
!strcmp(get_tok_value((xctx->inst[i].ptr+ xctx->sym)->prop_ptr, "highlight", 0), "true");
|
||||
if(hilight_connected_inst && type && !IS_LABEL_SH_OR_PIN(type)) {
|
||||
int rects, j;
|
||||
if( (rects = (xctx->inst[i].ptr+ xctx->sym)->rects[PINLAYER]) > 0 ) {
|
||||
dbg(2, "draw_hilight_net(): hilight_connected_inst inst=%d, node=%s\n", i, xctx->inst[i].node[0]);
|
||||
for(j=0;j<rects;j++) {
|
||||
if( xctx->inst[i].node && xctx->inst[i].node[j]) {
|
||||
entry=bus_hilight_lookup(xctx->inst[i].node[j], 0, XLOOKUP);
|
||||
if(entry) {
|
||||
xctx->inst[i].flags |= 4;
|
||||
xctx->inst[i].color=get_color(entry->value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if( type && IS_LABEL_SH_OR_PIN(type) ) {
|
||||
entry=bus_hilight_lookup( get_tok_value(xctx->inst[i].prop_ptr,"lab",0) , 0, XLOOKUP);
|
||||
if(entry) xctx->inst[i].color=get_color(entry->value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
propagate_hilights(1);
|
||||
if(enable_drill) drill_hilight();
|
||||
}
|
||||
dbg(1, "descend_schematic(): before zoom(): prep_hash_inst=%d\n", xctx->prep_hash_inst);
|
||||
|
|
@ -1184,7 +1154,10 @@ void go_back(int confirm) /* 20171006 add confirm */
|
|||
load_schematic(1, filename, 1);
|
||||
if(from_embedded_sym) xctx->modified=save_modified; /* to force ask save embedded sym in parent schematic */
|
||||
|
||||
hilight_parent_pins();
|
||||
if(xctx->hilight_nets) {
|
||||
hilight_parent_pins();
|
||||
propagate_hilights(1);
|
||||
}
|
||||
if(enable_drill) drill_hilight();
|
||||
xctx->xorigin=xctx->zoom_array[xctx->currsch].x;
|
||||
xctx->yorigin=xctx->zoom_array[xctx->currsch].y;
|
||||
|
|
@ -1353,10 +1326,10 @@ void calc_drawing_bbox(xRect *boundbox, int selected)
|
|||
}
|
||||
}
|
||||
else if( type && IS_LABEL_OR_PIN(type)) {
|
||||
entry=bus_hilight_lookup( get_tok_value(xctx->inst[i].prop_ptr,"lab",0) , 0, XLOOKUP );
|
||||
entry=bus_hilight_lookup(xctx->inst[i].lab, 0, XLOOKUP );
|
||||
if(entry) found = 1;
|
||||
}
|
||||
else if( (xctx->inst[i].flags & 4) ) {
|
||||
else if( (xctx->inst[i].color) ) {
|
||||
found = 1;
|
||||
}
|
||||
if(!found) continue;
|
||||
|
|
|
|||
|
|
@ -1054,7 +1054,7 @@ int callback(int event, int mx, int my, KeySym key,
|
|||
{
|
||||
int mult;
|
||||
remove_symbol(2);
|
||||
link_symbols_to_instances();
|
||||
link_symbols_to_instances(0);
|
||||
expandlabel("/RST", &mult);
|
||||
expandlabel("/CCC[3:0]", &mult);
|
||||
expandlabel("CCC[AA:BB:DD]", &mult);
|
||||
|
|
|
|||
|
|
@ -584,11 +584,11 @@ void draw_symbol(int what,int c, int n,int layer,short tmp_flip, short rot,
|
|||
ROTATION(rot, flip, 0.0,0.0,text.x0,text.y0,x1,y1);
|
||||
|
||||
textlayer = c;
|
||||
if( !(c == PINLAYER && (xctx->inst[n].flags & 4))) {
|
||||
if( !(c == PINLAYER && (xctx->inst[n].color))) {
|
||||
textlayer = symptr->text[j].layer;
|
||||
if(textlayer < 0 || textlayer >= cadlayers) textlayer = c;
|
||||
}
|
||||
if((c == PINLAYER && xctx->inst[n].flags & 4) || enable_layer[textlayer]) {
|
||||
if((c == PINLAYER && xctx->inst[n].color) || enable_layer[textlayer]) {
|
||||
#if HAS_CAIRO==1
|
||||
textfont = symptr->text[j].font;
|
||||
if((textfont && textfont[0]) || symptr->text[j].flags) {
|
||||
|
|
@ -1663,7 +1663,7 @@ void draw(void)
|
|||
bus_hilight_lookup(xctx->inst[i].node[0], 0, XLOOKUP )
|
||||
) ||
|
||||
(
|
||||
!IS_LABEL_SH_OR_PIN(type) && (xctx->inst[i].flags & 4)
|
||||
!IS_LABEL_SH_OR_PIN(type) && (xctx->inst[i].color)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -378,10 +378,10 @@ char *strtoupper(char* s) {
|
|||
|
||||
void set_inst_prop(int i)
|
||||
{
|
||||
char *ptr = NULL;
|
||||
char *ptr;
|
||||
char *tmp = NULL;
|
||||
|
||||
my_strdup(104, &ptr, (xctx->inst[i].ptr+ xctx->sym)->templ);
|
||||
ptr = (xctx->inst[i].ptr+ xctx->sym)->templ;
|
||||
dbg(1, "set_inst_prop(): i=%d, name=%s, prop_ptr = %s, template=%s\n",
|
||||
i, xctx->inst[i].name, xctx->inst[i].prop_ptr, ptr);
|
||||
my_strdup(69, &xctx->inst[i].prop_ptr, ptr);
|
||||
|
|
@ -391,7 +391,6 @@ void set_inst_prop(int i)
|
|||
new_prop_string(i, tmp, 0, dis_uniq_names);
|
||||
my_free(724, &tmp);
|
||||
}
|
||||
my_free(330, &ptr);
|
||||
}
|
||||
|
||||
void edit_rect_property(void)
|
||||
|
|
@ -962,7 +961,7 @@ void update_symbol(const char *result, int x)
|
|||
may be out of sync wrt disk version */
|
||||
if(copy_cell) {
|
||||
remove_symbols();
|
||||
link_symbols_to_instances();
|
||||
link_symbols_to_instances(0);
|
||||
}
|
||||
/* symbol reference changed? --> sym_number >=0, set prefix to 1st char
|
||||
to use for inst name (from symbol template) */
|
||||
|
|
@ -1033,17 +1032,19 @@ void update_symbol(const char *result, int x)
|
|||
dbg(1, "update_symbol(): name=%s, inst[i].prop_ptr=%s\n", name, xctx->inst[i].prop_ptr);
|
||||
my_strdup(89, &ptr,subst_token(xctx->inst[i].prop_ptr, "name", name) );
|
||||
/* set name of current inst */
|
||||
|
||||
if(!pushed) { push_undo(); pushed=1;}
|
||||
if(!k) hash_all_names(i);
|
||||
new_prop_string(i, ptr, k, dis_uniq_names); /* set new prop_ptr */
|
||||
|
||||
type=xctx->sym[xctx->inst[i].ptr].type;
|
||||
cond= !type || !IS_LABEL_SH_OR_PIN(type);
|
||||
if(cond) xctx->inst[i].flags|=2; /* bit 1: flag for different textlayer for pin/labels */
|
||||
else xctx->inst[i].flags &=~2;
|
||||
}
|
||||
my_strdup2(90, &xctx->inst[i].instname, get_tok_value(xctx->inst[i].prop_ptr, "name",0));
|
||||
|
||||
type=xctx->sym[xctx->inst[i].ptr].type;
|
||||
cond= !type || !IS_LABEL_SH_OR_PIN(type);
|
||||
if(cond) xctx->inst[i].flags |= 2; /* bit 1: flag for different textlayer for pin/labels */
|
||||
else {
|
||||
xctx->inst[i].flags &= ~2;
|
||||
my_strdup(880, &xctx->inst[i].lab, get_tok_value(xctx->inst[i].prop_ptr, "lab",0));
|
||||
}
|
||||
} /* end for(k=0;k<xctx->lastsel;k++) */
|
||||
/* new symbol bbox after prop changes (may change due to text length) */
|
||||
if(xctx->modified) {
|
||||
|
|
|
|||
146
src/hilight.c
146
src/hilight.c
|
|
@ -291,7 +291,6 @@ void delete_hilight_net(void)
|
|||
|
||||
xctx->hilight_nets=0;
|
||||
for(i=0;i<xctx->instances;i++) {
|
||||
xctx->inst[i].flags &= ~4 ;
|
||||
xctx->inst[i].color = 0 ;
|
||||
}
|
||||
dbg(1, "delete_hilight_net(): clearing\n");
|
||||
|
|
@ -343,11 +342,9 @@ void hilight_net_pin_mismatches(void)
|
|||
|
||||
void hilight_parent_pins(void)
|
||||
{
|
||||
int hilight_connected_inst;
|
||||
int rects, i, j, k;
|
||||
struct hilight_hashentry *entry;
|
||||
const char *pin_name;
|
||||
char *type;
|
||||
char *pin_node = NULL;
|
||||
char *net_node=NULL;
|
||||
int mult, net_mult, inst_number;
|
||||
|
|
@ -387,31 +384,6 @@ void hilight_parent_pins(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
for(i = 0; i < xctx->instances; i++) {
|
||||
type = (xctx->inst[i].ptr+ xctx->sym)->type;
|
||||
hilight_connected_inst =
|
||||
!strcmp(get_tok_value(xctx->inst[i].prop_ptr, "highlight", 0), "true") ||
|
||||
!strcmp(get_tok_value((xctx->inst[i].ptr+ xctx->sym)->prop_ptr, "highlight", 0), "true");
|
||||
if(hilight_connected_inst && type && !IS_LABEL_SH_OR_PIN(type)) {
|
||||
int rects, j;
|
||||
if( (rects = (xctx->inst[i].ptr+ xctx->sym)->rects[PINLAYER]) > 0 ) {
|
||||
dbg(2, "draw_hilight_net(): hilight_connected_inst inst=%d, node=%s\n", i, xctx->inst[i].node[0]);
|
||||
for(j=0;j<rects;j++) {
|
||||
if( xctx->inst[i].node && xctx->inst[i].node[j]) {
|
||||
entry=bus_hilight_lookup(xctx->inst[i].node[j], 0, XLOOKUP);
|
||||
if(entry) {
|
||||
xctx->inst[i].flags |= 4;
|
||||
xctx->inst[i].color=get_color(entry->value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if( type && IS_LABEL_SH_OR_PIN(type) ) {
|
||||
entry=bus_hilight_lookup( get_tok_value(xctx->inst[i].prop_ptr,"lab",0) , 0, XLOOKUP);
|
||||
if(entry) xctx->inst[i].color=get_color(entry->value);
|
||||
}
|
||||
}
|
||||
my_free(767, &pin_node);
|
||||
my_free(768, &net_node);
|
||||
}
|
||||
|
|
@ -552,7 +524,6 @@ int search(const char *tok, const char *val, int sub, int sel, int what)
|
|||
else {
|
||||
dbg(1, "search(): setting hilight flag on inst %d\n",i);
|
||||
xctx->hilight_nets=1;
|
||||
xctx->inst[i].flags |= 4;
|
||||
xctx->inst[i].color = hilight_layer;
|
||||
if(what==NOW) for(c=0;c<cadlayers;c++)
|
||||
draw_symbol(NOW, hilight_layer, i,c,0,0,0.0,0.0);
|
||||
|
|
@ -828,14 +799,50 @@ static void send_current_to_gaw(int simtype, const char *node)
|
|||
|
||||
}
|
||||
|
||||
void propagate_hilights(int set)
|
||||
{
|
||||
int i, hilight_connected_inst;
|
||||
struct hilight_hashentry *entry;
|
||||
char *type;
|
||||
|
||||
for(i = 0; i < xctx->instances; i++) {
|
||||
type = (xctx->inst[i].ptr+ xctx->sym)->type;
|
||||
hilight_connected_inst = (xctx->inst[i].flags & 4) || ((xctx->inst[i].ptr+ xctx->sym)->flags & 4);
|
||||
if(hilight_connected_inst && type && !IS_LABEL_SH_OR_PIN(type)) {
|
||||
int rects, j, clear;
|
||||
if( (rects = (xctx->inst[i].ptr+ xctx->sym)->rects[PINLAYER]) > 0 ) {
|
||||
dbg(2, "draw_hilight_net(): hilight_connected_inst inst=%d, node=%s\n", i, xctx->inst[i].node[0]);
|
||||
clear = 1;
|
||||
for(j=0;j<rects;j++) {
|
||||
if( xctx->inst[i].node && xctx->inst[i].node[j]) {
|
||||
entry=bus_hilight_lookup(xctx->inst[i].node[j], 0, XLOOKUP);
|
||||
if(entry) {
|
||||
if(set) {
|
||||
xctx->inst[i].color=get_color(entry->value);
|
||||
} else {
|
||||
clear = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(clear && !set) {
|
||||
xctx->inst[i].color=0;
|
||||
}
|
||||
}
|
||||
} else if( type && IS_LABEL_SH_OR_PIN(type) ) {
|
||||
entry=bus_hilight_lookup( xctx->inst[i].lab, 0, XLOOKUP);
|
||||
if(entry && set) xctx->inst[i].color = get_color(entry->value);
|
||||
else if(!entry && !set) xctx->inst[i].color = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void hilight_net(int to_waveform)
|
||||
{
|
||||
int i, n;
|
||||
char *type;
|
||||
int sim_is_xyce;
|
||||
int hilight_connected_inst;
|
||||
struct hilight_hashentry *entry;
|
||||
|
||||
prepare_netlist_structs(0);
|
||||
dbg(1, "hilight_net(): entering\n");
|
||||
|
|
@ -865,7 +872,6 @@ void hilight_net(int to_waveform)
|
|||
} else {
|
||||
dbg(1, "hilight_net(): setting hilight flag on inst %d\n",n);
|
||||
xctx->hilight_nets=1;
|
||||
xctx->inst[n].flags |= 4;
|
||||
xctx->inst[n].color = get_color(xctx->hilight_color);
|
||||
if(incr_hilight) xctx->hilight_color++;
|
||||
}
|
||||
|
|
@ -877,33 +883,7 @@ void hilight_net(int to_waveform)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for(i = 0; i < xctx->instances; i++) {
|
||||
type = (xctx->inst[i].ptr+ xctx->sym)->type;
|
||||
hilight_connected_inst =
|
||||
!strcmp(get_tok_value(xctx->inst[i].prop_ptr, "highlight", 0), "true") ||
|
||||
!strcmp(get_tok_value((xctx->inst[i].ptr+ xctx->sym)->prop_ptr, "highlight", 0), "true");
|
||||
if(hilight_connected_inst && type && !IS_LABEL_SH_OR_PIN(type)) {
|
||||
int rects, j;
|
||||
if( (rects = (xctx->inst[i].ptr+ xctx->sym)->rects[PINLAYER]) > 0 ) {
|
||||
dbg(2, "draw_hilight_net(): hilight_connected_inst inst=%d, node=%s\n", i, xctx->inst[i].node[0]);
|
||||
for(j=0;j<rects;j++) {
|
||||
if( xctx->inst[i].node && xctx->inst[i].node[j]) {
|
||||
entry=bus_hilight_lookup(xctx->inst[i].node[j], 0, XLOOKUP);
|
||||
if(entry) {
|
||||
xctx->inst[i].flags |= 4;
|
||||
xctx->inst[i].color=get_color(entry->value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if( type && IS_LABEL_SH_OR_PIN(type) ) {
|
||||
entry=bus_hilight_lookup( get_tok_value(xctx->inst[i].prop_ptr,"lab",0) , 0, XLOOKUP);
|
||||
if(entry) xctx->inst[i].color=get_color(entry->value);
|
||||
}
|
||||
}
|
||||
|
||||
propagate_hilights(1);
|
||||
if(!incr_hilight) xctx->hilight_color++;
|
||||
if(enable_drill) {
|
||||
drill_hilight();
|
||||
|
|
@ -914,10 +894,8 @@ void hilight_net(int to_waveform)
|
|||
|
||||
void unhilight_net(void)
|
||||
{
|
||||
int i,n, clear;
|
||||
int i,n;
|
||||
char *type;
|
||||
int hilight_connected_inst;
|
||||
struct hilight_hashentry *entry;
|
||||
|
||||
prepare_netlist_structs(0);
|
||||
dbg(1, "unhilight_net(): entering\n");
|
||||
|
|
@ -939,45 +917,13 @@ void unhilight_net(void)
|
|||
bus_hilight_lookup(xctx->inst[n].node[0], xctx->hilight_color, XDELETE);
|
||||
} else {
|
||||
}
|
||||
xctx->inst[n].flags &= ~4;
|
||||
xctx->inst[n].color = 0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for(i = 0; i < xctx->instances; i++) {
|
||||
type = (xctx->inst[i].ptr+ xctx->sym)->type;
|
||||
hilight_connected_inst =
|
||||
!strcmp(get_tok_value(xctx->inst[i].prop_ptr, "highlight", 0), "true") ||
|
||||
!strcmp(get_tok_value((xctx->inst[i].ptr+ xctx->sym)->prop_ptr, "highlight", 0), "true");
|
||||
if(hilight_connected_inst && type && !IS_LABEL_SH_OR_PIN(type)) {
|
||||
int rects, j;
|
||||
if( (rects = (xctx->inst[i].ptr+ xctx->sym)->rects[PINLAYER]) > 0 ) {
|
||||
dbg(2, "draw_hilight_net(): hilight_connected_inst inst=%d, node=%s\n", i, xctx->inst[i].node[0]);
|
||||
for(j=0;j<rects;j++) {
|
||||
clear = 1;
|
||||
if( xctx->inst[i].node && xctx->inst[i].node[j]) {
|
||||
entry=bus_hilight_lookup(xctx->inst[i].node[j], 0, XLOOKUP);
|
||||
if(entry) {
|
||||
clear = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(clear) {
|
||||
xctx->inst[i].flags &= ~4;
|
||||
xctx->inst[i].color=0;
|
||||
}
|
||||
}
|
||||
} else if( type && IS_LABEL_SH_OR_PIN(type) ) {
|
||||
entry=bus_hilight_lookup( get_tok_value(xctx->inst[i].prop_ptr,"lab",0) , 0, XLOOKUP);
|
||||
if(!entry) xctx->inst[i].color=0;
|
||||
}
|
||||
}
|
||||
|
||||
propagate_hilights(0);
|
||||
unselect_all();
|
||||
}
|
||||
|
||||
|
|
@ -1014,10 +960,8 @@ void select_hilight_net(void)
|
|||
for(i=0;i<xctx->instances;i++) {
|
||||
|
||||
type = (xctx->inst[i].ptr+ xctx->sym)->type;
|
||||
hilight_connected_inst =
|
||||
!strcmp(get_tok_value((xctx->inst[i].ptr+ xctx->sym)->prop_ptr, "highlight", 0), "true") ||
|
||||
!strcmp(get_tok_value(xctx->inst[i].prop_ptr, "highlight", 0), "true");
|
||||
if( xctx->inst[i].flags & 4) {
|
||||
hilight_connected_inst = (xctx->inst[i].flags & 4) || ((xctx->inst[i].ptr+ xctx->sym)->flags & 4);
|
||||
if( xctx->inst[i].color) {
|
||||
dbg(1, "select_hilight_net(): instance %d flags &4 true\n", i);
|
||||
xctx->inst[i].sel = SELECTED;
|
||||
}
|
||||
|
|
@ -1036,8 +980,8 @@ void select_hilight_net(void)
|
|||
}
|
||||
}
|
||||
} else if( type && IS_LABEL_SH_OR_PIN(type) ) {
|
||||
entry=bus_hilight_lookup( get_tok_value(xctx->inst[i].prop_ptr,"lab",0) , 0, XLOOKUP);
|
||||
if(entry) xctx->inst[i].sel = SELECTED;
|
||||
entry=bus_hilight_lookup(xctx->inst[i].lab , 0, XLOOKUP);
|
||||
if(entry) xctx->inst[i].sel = SELECTED;
|
||||
}
|
||||
}
|
||||
xctx->need_reb_sel_arr = 1;
|
||||
|
|
|
|||
|
|
@ -152,6 +152,7 @@ void free_instances(int slot)
|
|||
my_free(800, &uslot[slot].iptr[i].name);
|
||||
my_free(801, &uslot[slot].iptr[i].prop_ptr);
|
||||
my_free(802, &uslot[slot].iptr[i].instname);
|
||||
my_free(104, &uslot[slot].iptr[i].lab);
|
||||
}
|
||||
my_free(803, &uslot[slot].iptr);
|
||||
uslot[slot].instances = 0;
|
||||
|
|
@ -278,7 +279,9 @@ void push_undo(void)
|
|||
uslot[slot].iptr[i].prop_ptr = NULL;
|
||||
uslot[slot].iptr[i].name = NULL;
|
||||
uslot[slot].iptr[i].instname = NULL;
|
||||
uslot[slot].iptr[i].lab = NULL;
|
||||
uslot[slot].iptr[i].node = NULL;
|
||||
my_strdup(330, &uslot[slot].iptr[i].lab, xctx->inst[i].lab);
|
||||
my_strdup2(191, &uslot[slot].iptr[i].instname, xctx->inst[i].instname);
|
||||
my_strdup(192, &uslot[slot].iptr[i].prop_ptr, xctx->inst[i].prop_ptr);
|
||||
my_strdup(193, &uslot[slot].iptr[i].name, xctx->inst[i].name);
|
||||
|
|
@ -393,9 +396,11 @@ void pop_undo(int redo)
|
|||
xctx->inst[i].prop_ptr=NULL;
|
||||
xctx->inst[i].name=NULL;
|
||||
xctx->inst[i].instname=NULL;
|
||||
xctx->inst[i].lab=NULL;
|
||||
my_strdup(214, &xctx->inst[i].prop_ptr, uslot[slot].iptr[i].prop_ptr);
|
||||
my_strdup(215, &xctx->inst[i].name, uslot[slot].iptr[i].name);
|
||||
my_strdup2(216, &xctx->inst[i].instname, uslot[slot].iptr[i].instname);
|
||||
my_strdup(766, &xctx->inst[i].lab, uslot[slot].iptr[i].lab);
|
||||
}
|
||||
|
||||
/* texts */
|
||||
|
|
@ -421,7 +426,7 @@ void pop_undo(int redo)
|
|||
my_strdup(222, &xctx->wire[i].prop_ptr, uslot[slot].wptr[i].prop_ptr);
|
||||
}
|
||||
|
||||
link_symbols_to_instances();
|
||||
link_symbols_to_instances(0);
|
||||
set_modify(1);
|
||||
xctx->prep_hash_inst=0;
|
||||
xctx->prep_hash_wires=0;
|
||||
|
|
|
|||
|
|
@ -892,14 +892,15 @@ void copy_objects(int what)
|
|||
xctx->inst[xctx->instances] = xctx->inst[n];
|
||||
xctx->inst[xctx->instances].prop_ptr=NULL;
|
||||
xctx->inst[xctx->instances].instname=NULL;
|
||||
xctx->inst[xctx->instances].lab=NULL;
|
||||
xctx->inst[xctx->instances].node=NULL;
|
||||
xctx->inst[xctx->instances].name=NULL;
|
||||
my_strdup(232, &xctx->inst[xctx->instances].name, xctx->inst[n].name);
|
||||
my_strdup(233, &xctx->inst[xctx->instances].prop_ptr, xctx->inst[n].prop_ptr);
|
||||
my_strdup2(234, &xctx->inst[xctx->instances].instname, get_tok_value(xctx->inst[n].prop_ptr, "name",0));
|
||||
my_strdup(312, &xctx->inst[xctx->instances].lab, xctx->inst[n].lab);
|
||||
xctx->inst[n].sel=0;
|
||||
xctx->inst[xctx->instances].flags = xctx->inst[n].flags;
|
||||
xctx->inst[xctx->instances].flags &= ~4; /* do not propagate hilight */
|
||||
xctx->inst[xctx->instances].color = 0;
|
||||
xctx->inst[xctx->instances].x0 = xctx->rx1+xctx->deltax;
|
||||
xctx->inst[xctx->instances].y0 = xctx->ry1+xctx->deltay;
|
||||
|
|
|
|||
|
|
@ -276,7 +276,6 @@ void hash_inst_pin(int what, int i, int j)
|
|||
xctx->inst[i].name, j, prop_ptr);
|
||||
statusmsg(str,2);
|
||||
if(!netlist_count) {
|
||||
xctx->inst[i].flags |=4;
|
||||
xctx->inst[i].color = PINLAYER;
|
||||
xctx->hilight_nets=1;
|
||||
}
|
||||
|
|
@ -699,7 +698,6 @@ void prepare_netlist_structs(int for_netlist)
|
|||
strcmp(type, "use")) {
|
||||
my_snprintf(str, S(str), "instance: %d (%s): no name attribute set", i, inst[i].name);
|
||||
statusmsg(str,2);
|
||||
inst[i].flags |=4;
|
||||
inst[i].color = PINLAYER;
|
||||
xctx->hilight_nets=1;
|
||||
}
|
||||
|
|
@ -708,7 +706,6 @@ void prepare_netlist_structs(int for_netlist)
|
|||
char str[2048];
|
||||
my_snprintf(str, S(str), "Symbol: %s: no type attribute set", inst[i].name);
|
||||
statusmsg(str,2);
|
||||
inst[i].flags |=4;
|
||||
inst[i].color = PINLAYER;
|
||||
xctx->hilight_nets=1;
|
||||
}
|
||||
|
|
@ -755,7 +752,7 @@ void prepare_netlist_structs(int for_netlist)
|
|||
my_strdup(261, &class,get_tok_value(inst[i].prop_ptr,"class",0));
|
||||
}
|
||||
|
||||
my_strdup(262, &inst[i].node[0], get_tok_value(inst[i].prop_ptr,"lab",0));
|
||||
my_strdup(262, &inst[i].node[0], inst[i].lab);
|
||||
|
||||
if (!(inst[i].node[0])) {
|
||||
my_strdup(65, &inst[i].node[0], get_tok_value((inst[i].ptr+ xctx->sym)->templ, "lab",0));
|
||||
|
|
@ -771,8 +768,6 @@ void prepare_netlist_structs(int for_netlist)
|
|||
bus_hash_lookup(inst[i].node[0], /* insert node in hash table */
|
||||
dir, XINSERT, port, sig_type, verilog_type, value, class);
|
||||
|
||||
dbg(2, "prepare_netlist_structs(): name=%s\n",
|
||||
get_tok_value( inst[i].prop_ptr, "lab",0));
|
||||
dbg(2, "prepare_netlist_structs(): pin=%s\n",
|
||||
get_tok_value( (inst[i].ptr+ xctx->sym)->rect[PINLAYER][0].prop_ptr, "name",0));
|
||||
dbg(2, "prepare_netlist_structs(): dir=%s\n",
|
||||
|
|
@ -1187,7 +1182,6 @@ int sym_vs_sch_pins()
|
|||
statusmsg(str,2);
|
||||
for(j = 0; j < xctx->instances; j++) {
|
||||
if(!strcmp(xctx->inst[j].name, xctx->sym[i].name)) {
|
||||
xctx->inst[j].flags |=4;
|
||||
xctx->inst[i].color = PINLAYER;
|
||||
xctx->hilight_nets=1;
|
||||
}
|
||||
|
|
@ -1204,7 +1198,6 @@ int sym_vs_sch_pins()
|
|||
statusmsg(str,2);
|
||||
for(j = 0; j < xctx->instances; j++) {
|
||||
if(!strcmp(xctx->inst[j].name, xctx->sym[i].name)) {
|
||||
xctx->inst[j].flags |=4;
|
||||
xctx->inst[i].color = PINLAYER;
|
||||
xctx->hilight_nets=1;
|
||||
}
|
||||
|
|
@ -1238,7 +1231,6 @@ int sym_vs_sch_pins()
|
|||
statusmsg(str,2);
|
||||
for(j = 0; j < xctx->instances; j++) {
|
||||
if(!strcmp(xctx->inst[j].name, xctx->sym[i].name)) {
|
||||
xctx->inst[j].flags |=4;
|
||||
xctx->inst[i].color = PINLAYER;
|
||||
xctx->hilight_nets=1;
|
||||
}
|
||||
|
|
@ -1262,7 +1254,6 @@ int sym_vs_sch_pins()
|
|||
statusmsg(str,2);
|
||||
for(k = 0; k < xctx->instances; k++) {
|
||||
if(!strcmp(xctx->inst[k].name, xctx->sym[i].name)) {
|
||||
xctx->inst[k].flags |=4;
|
||||
xctx->inst[i].color = PINLAYER;
|
||||
xctx->hilight_nets=1;
|
||||
}
|
||||
|
|
|
|||
56
src/paste.c
56
src/paste.c
|
|
@ -213,9 +213,11 @@ void merge_inst(int k,FILE *fd)
|
|||
}
|
||||
ptr[i].sel=0;
|
||||
ptr[i].flags=0;
|
||||
ptr[i].color=0;
|
||||
ptr[i].ptr=-1;
|
||||
ptr[i].prop_ptr=NULL;
|
||||
ptr[i].instname=NULL;
|
||||
ptr[i].lab=NULL; /* assigned in link_symbols_to_instances */
|
||||
ptr[i].node=NULL;
|
||||
load_ascii_string(&prop_ptr,fd);
|
||||
if(!k) hash_all_names(i);
|
||||
|
|
@ -223,61 +225,13 @@ void merge_inst(int k,FILE *fd)
|
|||
/* the final tmp argument is zero for the 1st call and used in */
|
||||
/* new_prop_string() for cleaning some internal caches. */
|
||||
my_strdup2(306, &xctx->inst[i].instname, get_tok_value(xctx->inst[i].prop_ptr, "name", 0));
|
||||
if(!strcmp(get_tok_value(xctx->inst[i].prop_ptr,"highlight",0), "true")) xctx->inst[i].flags |= 4;
|
||||
|
||||
my_free(871, &prop_ptr);
|
||||
xctx->instances++;
|
||||
set_modify(1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void match_merged_inst(int old)
|
||||
{
|
||||
int i,missing,symbol;
|
||||
int cond;
|
||||
char *type;
|
||||
missing = 0;
|
||||
for(i=old;i<xctx->instances;i++)
|
||||
{
|
||||
symbol = match_symbol(xctx->inst[i].name);
|
||||
if(symbol == -1)
|
||||
{
|
||||
dbg(1, "match_merged_inst(): missing symbol, skipping...\n");
|
||||
my_free(872, &xctx->inst[i].prop_ptr); /* 06052001 remove properties */
|
||||
my_free(873, &xctx->inst[i].name); /* 06052001 remove symname */
|
||||
my_free(874, &xctx->inst[i].instname);
|
||||
missing++;
|
||||
continue;
|
||||
}
|
||||
xctx->inst[i].ptr = symbol;
|
||||
if(missing)
|
||||
{
|
||||
|
||||
xctx->inst[i-missing] = xctx->inst[i];
|
||||
xctx->inst[i].prop_ptr=NULL;
|
||||
/* delete_inst_node(i); */ /* probably not needed */
|
||||
xctx->inst[i].ptr=-1; /*04112003 was 0 */
|
||||
xctx->inst[i].flags=0;
|
||||
xctx->inst[i].color=0;
|
||||
xctx->inst[i].name=NULL;
|
||||
xctx->inst[i].instname=NULL;
|
||||
}
|
||||
}
|
||||
xctx->instances -= missing;
|
||||
for(i=old;i<xctx->instances;i++)
|
||||
{
|
||||
if(xctx->inst[i].ptr<0) continue;
|
||||
select_element(i,SELECTED,1, 0);
|
||||
symbol_bbox(i, &xctx->inst[i].x1, &xctx->inst[i].y1,
|
||||
&xctx->inst[i].x2, &xctx->inst[i].y2);
|
||||
type=xctx->sym[xctx->inst[i].ptr].type;
|
||||
cond= !type || !IS_LABEL_SH_OR_PIN(type);
|
||||
if(cond) xctx->inst[i].flags|=2;
|
||||
else xctx->inst[i].flags &=~2;
|
||||
}
|
||||
}
|
||||
|
||||
/* merge selection if selection_load=1, otherwise ask for filename */
|
||||
/* selection_load: */
|
||||
/* 0: ask filename to merge */
|
||||
|
|
@ -391,7 +345,7 @@ void merge_file(int selection_load, const char ext[])
|
|||
xctx->mousey_snap = 0.;
|
||||
}
|
||||
my_free(875, &aux_ptr);
|
||||
match_merged_inst(old);
|
||||
link_symbols_to_instances(old);
|
||||
fclose(fd);
|
||||
xctx->ui_state |= STARTMERGE;
|
||||
dbg(1, "merge_file(): loaded file:wire=%d inst=%d ui_state=%ld\n",
|
||||
|
|
|
|||
|
|
@ -511,7 +511,7 @@ static void ps_draw_symbol(int n,int layer, short tmp_flip, short rot, double xo
|
|||
txtptr= translate(n, text.txt_ptr);
|
||||
ROTATION(rot, flip, 0.0,0.0,text.x0,text.y0,x1,y1);
|
||||
textlayer = layer;
|
||||
if( !(layer == PINLAYER && (xctx->inst[n].flags & 4))) {
|
||||
if( !(layer == PINLAYER && (xctx->inst[n].color))) {
|
||||
textlayer = (xctx->inst[n].ptr+ xctx->sym)->text[j].layer;
|
||||
if(textlayer < 0 || textlayer >= cadlayers) textlayer = layer;
|
||||
}
|
||||
|
|
@ -530,7 +530,7 @@ static void ps_draw_symbol(int n,int layer, short tmp_flip, short rot, double xo
|
|||
if( symptr->text[j].flags & TEXT_OBLIQUE)
|
||||
my_snprintf(ps_font_family, S(ps_font_family), "%s-Oblique", ps_font_name);
|
||||
|
||||
if((layer == PINLAYER && xctx->inst[n].flags & 4) || enable_layer[textlayer]) {
|
||||
if((layer == PINLAYER && xctx->inst[n].color) || enable_layer[textlayer]) {
|
||||
if(text_ps) {
|
||||
ps_draw_string(textlayer, txtptr,
|
||||
(text.rot + ( (flip && (text.rot & 1) ) ? rot+2 : rot) ) & 0x3,
|
||||
|
|
|
|||
28
src/save.c
28
src/save.c
|
|
@ -557,10 +557,13 @@ static void load_inst(int k, FILE *fd)
|
|||
xctx->inst[i].ptr=-1; /*04112003 was 0 */
|
||||
xctx->inst[i].prop_ptr=NULL;
|
||||
xctx->inst[i].instname=NULL;
|
||||
xctx->inst[i].lab=NULL; /* assigned in link_symbols_to_instances */
|
||||
xctx->inst[i].node=NULL;
|
||||
load_ascii_string(&prop_ptr,fd);
|
||||
my_strdup(319, &xctx->inst[i].prop_ptr, prop_ptr);
|
||||
my_strdup2(320, &xctx->inst[i].instname, get_tok_value(xctx->inst[i].prop_ptr, "name", 0));
|
||||
if(!strcmp(get_tok_value(xctx->inst[i].prop_ptr,"highlight",0), "true")) xctx->inst[i].flags |= 4;
|
||||
|
||||
dbg(2, "load_inst(): n=%d name=%s prop=%s\n", i, xctx->inst[i].name? xctx->inst[i].name:"<NULL>",
|
||||
xctx->inst[i].prop_ptr? xctx->inst[i].prop_ptr:"<NULL>");
|
||||
xctx->instances++;
|
||||
|
|
@ -949,29 +952,31 @@ int save_schematic(const char *schname) /* 20171020 added return value */
|
|||
return 0;
|
||||
}
|
||||
|
||||
void link_symbols_to_instances(void) /* 20150326 separated from load_schematic() */
|
||||
void link_symbols_to_instances(int from)
|
||||
{
|
||||
int i;
|
||||
char *type=NULL; /* 20150407 added static */
|
||||
char *type=NULL;
|
||||
int cond;
|
||||
|
||||
for(i=0;i<xctx->instances;i++)
|
||||
for(i = from; i < xctx->instances; i++)
|
||||
{
|
||||
dbg(2, "link_symbols_to_instances(): inst=%d\n", i);
|
||||
dbg(2, "link_symbols_to_instances(): matching inst %d name=%s \n",i, xctx->inst[i].name);
|
||||
dbg(2, "link_symbols_to_instances(): -------\n");
|
||||
xctx->inst[i].ptr = match_symbol(xctx->inst[i].name);
|
||||
}
|
||||
for(i=0;i<xctx->instances;i++) {
|
||||
symbol_bbox(i, &xctx->inst[i].x1, &xctx->inst[i].y1,
|
||||
&xctx->inst[i].x2, &xctx->inst[i].y2);
|
||||
for(i = from; i < xctx->instances; i++) {
|
||||
symbol_bbox(i, &xctx->inst[i].x1, &xctx->inst[i].y1, &xctx->inst[i].x2, &xctx->inst[i].y2);
|
||||
type=xctx->sym[xctx->inst[i].ptr].type;
|
||||
cond= !type || !IS_LABEL_SH_OR_PIN(type);
|
||||
if(cond) xctx->inst[i].flags|=2; /* ordinary symbol */
|
||||
else xctx->inst[i].flags &=~2; /* label or pin */
|
||||
else {
|
||||
xctx->inst[i].flags &=~2; /* label or pin */
|
||||
my_strdup(1216, &xctx->inst[i].lab, get_tok_value(xctx->inst[i].prop_ptr,"lab",0));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* ALWAYS use absolute pathname for filename!!! */
|
||||
void load_schematic(int load_symbols, const char *filename, int reset_undo) /* 20150327 added reset_undo */
|
||||
{
|
||||
|
|
@ -1011,7 +1016,7 @@ void load_schematic(int load_symbols, const char *filename, int reset_undo) /* 2
|
|||
fclose(fd); /* 20150326 moved before load symbols */
|
||||
set_modify(0);
|
||||
dbg(2, "load_schematic(): loaded file:wire=%d inst=%d\n",xctx->wires , xctx->instances);
|
||||
if(load_symbols) link_symbols_to_instances();
|
||||
if(load_symbols) link_symbols_to_instances(0);
|
||||
if(reset_undo) {
|
||||
Tcl_VarEval(interp, "is_xschem_file ", xctx->sch[xctx->currsch], NULL);
|
||||
if(!strcmp(tclresult(), "SYMBOL")) {
|
||||
|
|
@ -1230,7 +1235,7 @@ void pop_undo(int redo)
|
|||
fclose(fd);
|
||||
#endif
|
||||
dbg(2, "pop_undo(): loaded file:wire=%d inst=%d\n",xctx->wires , xctx->instances);
|
||||
link_symbols_to_instances();
|
||||
link_symbols_to_instances(0);
|
||||
set_modify(1);
|
||||
xctx->prep_hash_inst=0;
|
||||
xctx->prep_hash_wires=0;
|
||||
|
|
@ -1634,6 +1639,8 @@ int load_sym_def(const char *name, FILE *embed_fd)
|
|||
get_tok_value(symbol[symbols].prop_ptr, "template", 0));
|
||||
my_strdup2(515, &symbol[symbols].type,
|
||||
get_tok_value(symbol[symbols].prop_ptr, "type",0));
|
||||
if(!strcmp(get_tok_value(symbol[symbols].prop_ptr,"highlight",0), "true")) symbol[symbols].flags |= 4;
|
||||
|
||||
}
|
||||
else {
|
||||
load_ascii_string(&aux_ptr, lcc[level].fd);
|
||||
|
|
@ -1647,6 +1654,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
|
|||
get_tok_value(symbol[symbols].prop_ptr, "template", 0));
|
||||
my_strdup2(342, &symbol[symbols].type,
|
||||
get_tok_value(symbol[symbols].prop_ptr, "type",0));
|
||||
if(!strcmp(get_tok_value(symbol[symbols].prop_ptr,"highlight",0), "true")) symbol[symbols].flags |= 4;
|
||||
}
|
||||
else {
|
||||
load_ascii_string(&aux_ptr, lcc[level].fd);
|
||||
|
|
|
|||
|
|
@ -1819,7 +1819,10 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
|||
type=xctx->sym[xctx->inst[inst].ptr].type;
|
||||
cond= !type || !IS_LABEL_SH_OR_PIN(type);
|
||||
if(cond) xctx->inst[inst].flags|=2;
|
||||
else xctx->inst[inst].flags &=~2;
|
||||
else {
|
||||
xctx->inst[inst].flags &=~2;
|
||||
my_strdup(1215, &xctx->inst[inst].lab, get_tok_value(xctx->inst[inst].prop_ptr, "lab", 0));
|
||||
}
|
||||
my_free(922, &ptr);
|
||||
}
|
||||
my_free(923, &name);
|
||||
|
|
@ -2237,6 +2240,8 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
|||
Tcl_SetResult(interp, "xschem setprop: instance not found", TCL_STATIC);
|
||||
return TCL_ERROR;
|
||||
} else {
|
||||
char *type;
|
||||
int cond;
|
||||
if(!fast) {
|
||||
bbox(START,0.0,0.0,0.0,0.0);
|
||||
symbol_bbox(inst, &xctx->inst[inst].x1, &xctx->inst[inst].y1, &xctx->inst[inst].x2, &xctx->inst[inst].y2);
|
||||
|
|
@ -2254,7 +2259,15 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
|||
new_prop_string(inst, subst_token(xctx->inst[inst].prop_ptr, argv[3], NULL),fast, dis_uniq_names);
|
||||
}
|
||||
my_strdup2(367, &xctx->inst[inst].instname, get_tok_value(xctx->inst[inst].prop_ptr, "name",0));
|
||||
|
||||
|
||||
type=xctx->sym[xctx->inst[inst].ptr].type;
|
||||
cond= !type || !IS_LABEL_SH_OR_PIN(type);
|
||||
if(cond) xctx->inst[inst].flags|=2;
|
||||
else {
|
||||
xctx->inst[inst].flags &=~2;
|
||||
my_strdup(1215, &xctx->inst[inst].lab, get_tok_value(xctx->inst[inst].prop_ptr, "lab", 0));
|
||||
}
|
||||
|
||||
if(!fast) {
|
||||
/* new symbol bbox after prop changes (may change due to text length) */
|
||||
symbol_bbox(inst, &xctx->inst[inst].x1, &xctx->inst[inst].y1, &xctx->inst[inst].x2, &xctx->inst[inst].y2);
|
||||
|
|
|
|||
|
|
@ -311,6 +311,7 @@ void delete(void)
|
|||
delete_inst_node(i);
|
||||
my_free(939, &xctx->inst[i].name);
|
||||
my_free(940, &xctx->inst[i].instname);
|
||||
my_free(878, &xctx->inst[i].lab);
|
||||
j++;
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -100,9 +100,7 @@ void global_spice_netlist(int global) /* netlister driver */
|
|||
continue;
|
||||
}
|
||||
if( type && IS_PIN(type)) {
|
||||
str_tmp = expandlabel ( get_tok_value(xctx->inst[i].prop_ptr,"lab",0) ,&multip);
|
||||
dbg(1, "global_spice_netlist(): |%s|\n",
|
||||
get_tok_value(xctx->inst[i].prop_ptr,"lab",0));
|
||||
str_tmp = expandlabel ( (xctx->inst[i].lab ? xctx->inst[i].lab : ""), &multip);
|
||||
/*must handle invalid node names */
|
||||
fprintf(fd, " %s", str_tmp ? str_tmp : "(NULL)" );
|
||||
}
|
||||
|
|
@ -158,7 +156,7 @@ void global_spice_netlist(int global) /* netlister driver */
|
|||
|
||||
/* preserve current level instance flags before descending hierarchy for netlisting, restore later */
|
||||
stored_flags = my_calloc(146, xctx->instances, sizeof(unsigned int));
|
||||
for(i=0;i<xctx->instances;i++) stored_flags[i] = xctx->inst[i].flags & 4;
|
||||
for(i=0;i<xctx->instances;i++) stored_flags[i] = xctx->inst[i].color;
|
||||
|
||||
if(global)
|
||||
{
|
||||
|
|
@ -205,7 +203,7 @@ void global_spice_netlist(int global) /* netlister driver */
|
|||
/* symbol vs schematic pin check, we do it here since now we have ALL symbols loaded */
|
||||
sym_vs_sch_pins();
|
||||
/* restore hilight flags from errors found analyzing top level before descending hierarchy */
|
||||
for(i=0;i<xctx->instances; i++) xctx->inst[i].flags |= stored_flags[i];
|
||||
for(i=0;i<xctx->instances; i++) xctx->inst[i].color = stored_flags[i];
|
||||
draw_hilight_net(1);
|
||||
}
|
||||
my_free(945, &stored_flags);
|
||||
|
|
|
|||
|
|
@ -495,7 +495,7 @@ static void svg_draw_symbol(int n,int layer,short tmp_flip, short rot,
|
|||
txtptr= translate(n, text.txt_ptr);
|
||||
ROTATION(rot, flip, 0.0,0.0,text.x0,text.y0,x1,y1);
|
||||
textlayer = layer;
|
||||
if( !(layer == PINLAYER && (xctx->inst[n].flags & 4))) {
|
||||
if( !(layer == PINLAYER && (xctx->inst[n].color))) {
|
||||
textlayer = (xctx->inst[n].ptr+ xctx->sym)->text[j].layer;
|
||||
if(textlayer < 0 || textlayer >= cadlayers) textlayer = layer;
|
||||
}
|
||||
|
|
@ -516,7 +516,7 @@ static void svg_draw_symbol(int n,int layer,short tmp_flip, short rot,
|
|||
if( symptr->text[j].flags & TEXT_OBLIQUE)
|
||||
my_snprintf(svg_font_style, S(svg_font_style), "oblique");
|
||||
|
||||
if((layer == PINLAYER && xctx->inst[n].flags & 4) || enable_layer[textlayer]) {
|
||||
if((layer == PINLAYER && xctx->inst[n].color) || enable_layer[textlayer]) {
|
||||
if(text_svg)
|
||||
svg_draw_string(textlayer, txtptr,
|
||||
(text.rot + ( (flip && (text.rot & 1) ) ? rot+2 : rot) ) & 0x3,
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ void global_tedax_netlist(int global) /* netlister driver */
|
|||
|
||||
/* preserve current level instance flags before descending hierarchy for netlisting, restore later */
|
||||
stored_flags = my_calloc(149, xctx->instances, sizeof(unsigned int));
|
||||
for(i=0;i<xctx->instances;i++) stored_flags[i] = xctx->inst[i].flags & 4;
|
||||
for(i=0;i<xctx->instances;i++) stored_flags[i] = xctx->inst[i].color;
|
||||
|
||||
if(global) /* was if(global) ... 20180901 no hierarchical tEDAx netlist for now */
|
||||
{
|
||||
|
|
@ -117,7 +117,7 @@ void global_tedax_netlist(int global) /* netlister driver */
|
|||
sym_vs_sch_pins();
|
||||
|
||||
/* restore hilight flags from errors found analyzing top level before descending hierarchy */
|
||||
for(i=0;i<xctx->instances; i++) xctx->inst[i].flags |= stored_flags[i];
|
||||
for(i=0;i<xctx->instances; i++) xctx->inst[i].color = stored_flags[i];
|
||||
draw_hilight_net(1);
|
||||
}
|
||||
my_free(965, &stored_flags);
|
||||
|
|
|
|||
|
|
@ -210,7 +210,6 @@ void check_unique_names(int rename)
|
|||
if(comma_pos) *comma_pos = '\0';
|
||||
dbg(1, "check_unique_names(): checking %s\n", start);
|
||||
if( (entry = inst_hash_lookup(table, start, i, XINSERT_NOREPLACE, strlen(start)) ) && entry->value != i) {
|
||||
xctx->inst[i].flags |=4;
|
||||
xctx->inst[i].color = PINLAYER;
|
||||
xctx->hilight_nets=1;
|
||||
if(rename == 1) {
|
||||
|
|
@ -230,7 +229,7 @@ void check_unique_names(int rename)
|
|||
comma_pos++;
|
||||
}
|
||||
} /* for(j...) */
|
||||
if( (xctx->inst[i].flags & 4) && rename) {
|
||||
if( xctx->inst[i].color && rename) {
|
||||
my_strdup(511, &tmp, xctx->inst[i].prop_ptr);
|
||||
new_prop_string(i, tmp, newpropcnt++, !rename);
|
||||
my_strdup2(512, &xctx->inst[i].instname, get_tok_value(xctx->inst[i].prop_ptr, "name", 0));
|
||||
|
|
@ -2327,7 +2326,6 @@ const char *net_name(int i, int j, int *multip, int hash_prefix_unnamed_net, int
|
|||
i, j, xctx->inst[i].instname ) ;
|
||||
statusmsg(errstr,2);
|
||||
if(!netlist_count) {
|
||||
xctx->inst[i].flags |=4;
|
||||
xctx->inst[i].color = PINLAYER;
|
||||
xctx->hilight_nets=1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ void global_verilog_netlist(int global) /* netlister driver */
|
|||
{
|
||||
if(tmp) fprintf(fd, " ,\n");
|
||||
tmp++;
|
||||
str_tmp = get_tok_value(xctx->inst[i].prop_ptr,"lab",0);
|
||||
str_tmp = xctx->inst[i].lab ? xctx->inst[i].lab : "";
|
||||
fprintf(fd, " %s", str_tmp ? str_tmp : "(NULL)");
|
||||
}
|
||||
}
|
||||
|
|
@ -130,7 +130,7 @@ void global_verilog_netlist(int global) /* netlister driver */
|
|||
{
|
||||
if(tmp) fprintf(fd, " ,\n");
|
||||
tmp++;
|
||||
str_tmp = get_tok_value(xctx->inst[i].prop_ptr,"lab",0);
|
||||
str_tmp = xctx->inst[i].lab ? xctx->inst[i].lab : "";
|
||||
fprintf(fd, " %s", str_tmp ? str_tmp : "(NULL)");
|
||||
}
|
||||
}
|
||||
|
|
@ -148,7 +148,7 @@ void global_verilog_netlist(int global) /* netlister driver */
|
|||
{
|
||||
if(tmp) fprintf(fd, " ,\n");
|
||||
tmp++;
|
||||
str_tmp = get_tok_value(xctx->inst[i].prop_ptr,"lab",0);
|
||||
str_tmp = xctx->inst[i].lab ? xctx->inst[i].lab : "";
|
||||
fprintf(fd, " %s", str_tmp ? str_tmp : "<NULL>");
|
||||
}
|
||||
}
|
||||
|
|
@ -181,7 +181,7 @@ void global_verilog_netlist(int global) /* netlister driver */
|
|||
my_strdup(550, &port_value,get_tok_value(xctx->inst[i].prop_ptr,"value",0));
|
||||
my_strdup(551, &sig_type,get_tok_value(xctx->inst[i].prop_ptr,"verilog_type",0));
|
||||
if(!sig_type || sig_type[0]=='\0') my_strdup(552, &sig_type,"wire"); /* 20070720 changed reg to wire */
|
||||
str_tmp = get_tok_value(xctx->inst[i].prop_ptr,"lab",0);
|
||||
str_tmp = xctx->inst[i].lab ? xctx->inst[i].lab : "";
|
||||
fprintf(fd, " output %s ;\n", str_tmp ? str_tmp : "(NULL)");
|
||||
fprintf(fd, " %s %s ", sig_type, str_tmp ? str_tmp : "(NULL)");
|
||||
|
||||
|
|
@ -204,7 +204,7 @@ void global_verilog_netlist(int global) /* netlister driver */
|
|||
my_strdup(554, &port_value,get_tok_value(xctx->inst[i].prop_ptr,"value",0));
|
||||
my_strdup(555, &sig_type,get_tok_value(xctx->inst[i].prop_ptr,"verilog_type",0));
|
||||
if(!sig_type || sig_type[0]=='\0') my_strdup(556, &sig_type,"wire");
|
||||
str_tmp = get_tok_value(xctx->inst[i].prop_ptr,"lab",0);
|
||||
str_tmp = xctx->inst[i].lab ? xctx->inst[i].lab : "";
|
||||
fprintf(fd, " inout %s ;\n", str_tmp ? str_tmp : "(NULL)");
|
||||
fprintf(fd, " %s %s ", sig_type, str_tmp ? str_tmp : "(NULL)");
|
||||
|
||||
|
|
@ -227,7 +227,7 @@ void global_verilog_netlist(int global) /* netlister driver */
|
|||
my_strdup(558, &port_value,get_tok_value(xctx->inst[i].prop_ptr,"value",0));
|
||||
my_strdup(559, &sig_type,get_tok_value(xctx->inst[i].prop_ptr,"verilog_type",0));
|
||||
if(!sig_type || sig_type[0]=='\0') my_strdup(560, &sig_type,"wire");
|
||||
str_tmp = get_tok_value(xctx->inst[i].prop_ptr,"lab",0);
|
||||
str_tmp = xctx->inst[i].lab ? xctx->inst[i].lab : "";
|
||||
fprintf(fd, " input %s ;\n", str_tmp ? str_tmp : "<NULL>");
|
||||
fprintf(fd, " %s %s ", sig_type, str_tmp ? str_tmp : "<NULL>");
|
||||
|
||||
|
|
@ -271,7 +271,7 @@ void global_verilog_netlist(int global) /* netlister driver */
|
|||
|
||||
/* preserve current level instance flags before descending hierarchy for netlisting, restore later */
|
||||
stored_flags = my_calloc(150, xctx->instances, sizeof(unsigned int));
|
||||
for(i=0;i<xctx->instances;i++) stored_flags[i] = xctx->inst[i].flags & 4;
|
||||
for(i=0;i<xctx->instances;i++) stored_flags[i] = xctx->inst[i].color;
|
||||
|
||||
if(global)
|
||||
{
|
||||
|
|
@ -318,7 +318,7 @@ void global_verilog_netlist(int global) /* netlister driver */
|
|||
sym_vs_sch_pins();
|
||||
|
||||
/* restore hilight flags from errors found analyzing top level before descending hierarchy */
|
||||
for(i=0;i<xctx->instances; i++) xctx->inst[i].flags |= stored_flags[i];
|
||||
for(i=0;i<xctx->instances; i++) xctx->inst[i].color = stored_flags[i];
|
||||
|
||||
draw_hilight_net(1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -140,7 +140,7 @@ void global_vhdl_netlist(int global) /* netlister driver */
|
|||
/* if( type && (strcmp(type,"generic"))==0) */
|
||||
/* { */
|
||||
/* my_strdup(576, &port_value,get_tok_value(xctx->inst[i].prop_ptr,"value", 0)); */
|
||||
/* str_tmp = get_tok_value(xctx->inst[i].prop_ptr,"lab",0); */
|
||||
/* str_tmp = xctx->inst[i].lab ? xctx->inst[i].lab : ""; */
|
||||
/* if(!tmp) fprintf(fd,"generic (\n"); */
|
||||
/* if(tmp) fprintf(fd," ;\n"); */
|
||||
/* fprintf(fd, " %s : %s", str_tmp ? str_tmp : "(NULL)", sig_type ); */
|
||||
|
|
@ -169,7 +169,7 @@ void global_vhdl_netlist(int global) /* netlister driver */
|
|||
my_strdup(579, &type,(xctx->inst[i].ptr+ xctx->sym)->type);
|
||||
if( type && (strcmp(type,"opin"))==0)
|
||||
{
|
||||
str_tmp = get_tok_value(xctx->inst[i].prop_ptr,"lab",0);
|
||||
str_tmp = xctx->inst[i].lab ? xctx->inst[i].lab : "";
|
||||
if(!tmp) fprintf(fd,"port(\n");
|
||||
if(tmp) fprintf(fd," ;\n");
|
||||
fprintf(fd, " %s : out %s", str_tmp ? str_tmp : "(NULL)", sig_type );
|
||||
|
|
@ -190,7 +190,7 @@ void global_vhdl_netlist(int global) /* netlister driver */
|
|||
my_strdup(582, &type,(xctx->inst[i].ptr+ xctx->sym)->type);
|
||||
if( type && (strcmp(type,"iopin"))==0)
|
||||
{
|
||||
str_tmp = get_tok_value(xctx->inst[i].prop_ptr,"lab",0);
|
||||
str_tmp = xctx->inst[i].lab ? xctx->inst[i].lab : "";
|
||||
if(!tmp) fprintf(fd,"port(\n");
|
||||
if(tmp) fprintf(fd," ;\n");
|
||||
fprintf(fd, " %s : inout %s", str_tmp ? str_tmp : "(NULL)", sig_type );
|
||||
|
|
@ -211,7 +211,7 @@ void global_vhdl_netlist(int global) /* netlister driver */
|
|||
my_strdup(585, &type,(xctx->inst[i].ptr+ xctx->sym)->type);
|
||||
if( type && (strcmp(type,"ipin"))==0)
|
||||
{
|
||||
str_tmp = get_tok_value(xctx->inst[i].prop_ptr,"lab",0);
|
||||
str_tmp = xctx->inst[i].lab ? xctx->inst[i].lab : "";
|
||||
if(!tmp) fprintf(fd,"port(\n");
|
||||
if(tmp) fprintf(fd," ;\n");
|
||||
fprintf(fd, " %s : in %s", str_tmp ? str_tmp : "<NULL>", sig_type );
|
||||
|
|
@ -324,7 +324,7 @@ void global_vhdl_netlist(int global) /* netlister driver */
|
|||
|
||||
/* preserve current level instance flags before descending hierarchy for netlisting, restore later */
|
||||
stored_flags = my_calloc(151, xctx->instances, sizeof(unsigned int));
|
||||
for(i=0;i<xctx->instances;i++) stored_flags[i] = xctx->inst[i].flags & 4;
|
||||
for(i=0;i<xctx->instances;i++) stored_flags[i] = xctx->inst[i].color;
|
||||
|
||||
if(global)
|
||||
{
|
||||
|
|
@ -371,7 +371,7 @@ void global_vhdl_netlist(int global) /* netlister driver */
|
|||
sym_vs_sch_pins();
|
||||
|
||||
/* restore hilight flags from errors found analyzing top level before descending hierarchy */
|
||||
for(i=0;i<xctx->instances; i++) xctx->inst[i].flags |= stored_flags[i];
|
||||
for(i=0;i<xctx->instances; i++) xctx->inst[i].color = stored_flags[i];
|
||||
|
||||
draw_hilight_net(1);
|
||||
}
|
||||
|
|
|
|||
16
src/xschem.h
16
src/xschem.h
|
|
@ -436,7 +436,9 @@ typedef struct
|
|||
char *prop_ptr;
|
||||
char *type;
|
||||
char *templ;
|
||||
short flags; /* currently only used for embedded symbols (EMBEDDED) */
|
||||
short flags; /* bit 0: embedded flag
|
||||
* bit 1: **free**
|
||||
* bit 2: highight if connected wire highlighted */
|
||||
} xSymbol;
|
||||
|
||||
typedef struct
|
||||
|
|
@ -456,12 +458,13 @@ typedef struct
|
|||
short rot;
|
||||
short flip;
|
||||
short sel;
|
||||
short color;
|
||||
short flags; /* bit 0: skip field, bit 1: flag for different textlayer for pin/labels
|
||||
* bit 2 : hilight flag.
|
||||
*/
|
||||
short 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 */
|
||||
char *prop_ptr;
|
||||
char **node;
|
||||
char *lab; /* lab attribute if any (pin/label) */
|
||||
char *instname; /* 20150409 instance name (example: I23) */
|
||||
} xInstance;
|
||||
|
||||
|
|
@ -965,7 +968,7 @@ extern void pop_undo(int redo);
|
|||
extern void delete_undo(void);
|
||||
extern void clear_undo(void);
|
||||
extern void load_schematic(int load_symbol, const char *abs_name, int reset_undo);
|
||||
extern void link_symbols_to_instances(void);
|
||||
extern void link_symbols_to_instances(int from);
|
||||
extern void load_ascii_string(char **ptr, FILE *fd);
|
||||
extern void read_xschem_file(FILE *fd);
|
||||
extern char *read_line(FILE *fp, int dbg_level);
|
||||
|
|
@ -1097,6 +1100,7 @@ extern void print_verilog_param(FILE *fd, int symbol);
|
|||
extern void hilight_net(int to_waveform);
|
||||
extern int hilight_netname(const char *name);
|
||||
extern void unhilight_net();
|
||||
extern void propagate_hilights(int set);
|
||||
extern void draw_hilight_net(int on_window);
|
||||
extern void display_hilights(char **str);
|
||||
extern void redraw_hilights(void);
|
||||
|
|
|
|||
Loading…
Reference in New Issue