diff --git a/src/actions.c b/src/actions.c index 1fea40d3..f4adbbfc 100644 --- a/src/actions.c +++ b/src/actions.c @@ -406,7 +406,7 @@ void ask_new_file(void) if( fullname[0] ) { dbg(1, "ask_new_file(): load file: %s\n", fullname); - delete_hilight_net(); + clear_all_hilights(); xctx->currsch = 0; unselect_all(); remove_symbols(); @@ -851,7 +851,7 @@ int place_symbol(int pos, const char *symbol_name, double x, double y, short rot xctx->inst[n].flip=symbol_name ? flip : 0; xctx->inst[n].flags=0; - xctx->inst[n].color=0; + xctx->inst[n].color=-1; xctx->inst[n].sel=0; xctx->inst[n].node=NULL; xctx->inst[n].prop_ptr=NULL; @@ -1105,7 +1105,7 @@ void descend_schematic(int instnumber) if(xctx->hilight_nets) { prepare_netlist_structs(0); - propagate_hilights(1); + propagate_hilights(1, 0); } dbg(1, "descend_schematic(): before zoom(): prep_hash_inst=%d\n", xctx->prep_hash_inst); zoom_full(1, 0, 1, 0.97); @@ -1157,7 +1157,7 @@ void go_back(int confirm) /* 20171006 add confirm */ if(xctx->hilight_nets) { if(prev_sch_type != CAD_SYMBOL_ATTRS) hilight_parent_pins(); - propagate_hilights(1); + propagate_hilights(1, 0); } xctx->xorigin=xctx->zoom_array[xctx->currsch].x; xctx->yorigin=xctx->zoom_array[xctx->currsch].y; @@ -1330,7 +1330,7 @@ void calc_drawing_bbox(xRect *boundbox, int selected) entry=bus_hilight_lookup(xctx->inst[i].lab, 0, XLOOKUP ); if(entry) found = 1; } - else if( (xctx->inst[i].color) ) { + else if( xctx->inst[i].color != -1 ) { found = 1; } if(!found) continue; diff --git a/src/callback.c b/src/callback.c index 87636d21..3dc932e4 100644 --- a/src/callback.c +++ b/src/callback.c @@ -811,6 +811,11 @@ int callback(int event, int mx, int my, KeySym key, new_arc(PLACE, 360.); break; } + if(key=='O' && (state == (ControlMask|ShiftMask)) ) /* load most recent tile */ + { + Tcl_VarEval(interp, "xschem load [lindex $recentfile 0]", NULL); + break; + } if(key=='O' && state == ShiftMask) /* Toggle light/dark colorscheme 20171113 */ { dark_colorscheme=!dark_colorscheme; @@ -922,19 +927,8 @@ int callback(int event, int mx, int my, KeySym key, } if(key=='k' && state==ControlMask) /* unhilight net */ { - xRect boundbox; - int big = xctx->wires> 2000 || xctx->instances > 2000 ; if(xctx->semaphore >= 2) break; - if(!big) calc_drawing_bbox(&boundbox, 2); unhilight_net(); - /* undraw_hilight_net(1); */ - if(!big) { - bbox(START, 0.0 , 0.0 , 0.0 , 0.0); - bbox(ADD, boundbox.x1, boundbox.y1, boundbox.x2, boundbox.y2); - bbox(SET , 0.0 , 0.0 , 0.0 , 0.0); - } - draw(); - if(!big) bbox(END , 0.0 , 0.0 , 0.0 , 0.0); break; } if(key=='K' && state==(ControlMask|ShiftMask)) /* hilight net drilling thru elements */ @@ -963,7 +957,7 @@ int callback(int event, int mx, int my, KeySym key, if(xctx->semaphore >= 2) break; enable_drill=0; if(!big) calc_drawing_bbox(&boundbox, 2); - delete_hilight_net(); + clear_all_hilights(); /* undraw_hilight_net(1); */ if(!big) { bbox(START, 0.0 , 0.0 , 0.0 , 0.0); @@ -1628,7 +1622,7 @@ int callback(int event, int mx, int my, KeySym key, if(!prev_last_sel) { int big = xctx->wires> 2000 || xctx->instances > 2000 ; if(!big) calc_drawing_bbox(&boundbox, 2); - delete_hilight_net(); + clear_all_hilights(); /* undraw_hilight_net(1); */ if(!big) { bbox(START, 0.0 , 0.0 , 0.0 , 0.0); diff --git a/src/check.c b/src/check.c index cedea5bd..75f735cd 100644 --- a/src/check.c +++ b/src/check.c @@ -193,15 +193,14 @@ void trim_wires(void) else xctx->wire[xctx->wires].bus=0; xctx->wire[xctx->wires].node=NULL; + my_strdup(28, &xctx->wire[xctx->wires].node, xctx->wire[j].node); xctx->wire[j].x1 = x0; xctx->wire[j].y1 = y0; hash_wire(XINSERT, xctx->wires, 0); - i--; /* redo current i iteration, since we break the 'j' loop due to changed wire hash table */ hash_wire(XDELETE, j, 0); /* rehash since endpoint x1, y1 changed */ hash_wire(XINSERT, j, 0); - xctx->wires++; changed = 1; break; @@ -371,8 +370,9 @@ void trim_wires(void) set_modify(1); } } while(changed); - dbg(1,"trim_wires(): doloops=%d changed=%d\n", doloops, changed); + dbg(1, "trim_wires(): doloops=%d changed=%d\n", doloops, changed); my_free(115, &wireflag); + } void break_wires_at_pins(void) diff --git a/src/draw.c b/src/draw.c index cb77fb30..a2ba07be 100644 --- a/src/draw.c +++ b/src/draw.c @@ -383,7 +383,7 @@ void draw_symbol(int what,int c, int n,int layer,short tmp_flip, short rot, ( /* ... and inst is hilighted ... */ IS_LABEL_SH_OR_PIN(type) && xctx->inst[n].node && xctx->inst[n].node[0] && bus_hilight_lookup(xctx->inst[n].node[0], 0, XLOOKUP ) - ) || ( !IS_LABEL_SH_OR_PIN(type) && (xctx->inst[n].color)) )) { + ) || ( !IS_LABEL_SH_OR_PIN(type) && (xctx->inst[n].color != -1)) )) { xctx->inst[n].flags|=1; /* ... then SKIP instance now and for following layers */ return; } diff --git a/src/hilight.c b/src/hilight.c index 65bff00f..0c386146 100644 --- a/src/hilight.c +++ b/src/hilight.c @@ -179,120 +179,107 @@ void create_plot_cmd(int viewer) } } -struct hilight_hashentry *hilight_lookup(const char *token, int value, int remove) -/* token remove ... what ... */ -/* -------------------------------------------------------------------------- */ -/* "whatever" 0,XINSERT insert in hash table if not in and return NULL */ -/* if already present just return entry address */ -/* return NULL otherwise */ -/* */ -/* "whatever" 1,XDELETE delete entry if found return NULL */ -/* "whatever" 2,XLOOKUP only look up element, dont insert */ +struct hilight_hashentry *hilight_lookup(const char *token, int value, int what) +/* token what ... what ... + * -------------------------------------------------------------------------- + * "whatever" XINSERT insert in hash table if not in and return NULL. If already present update + * value if not NULL, retun new value, return NULL otherwise + * "whatever" XINSERT_NOREPLACE same as XINSERT but do not replace existing value, return NULL if not found. + * "whatever" XDELETE delete entry if found, return NULL + * "whatever" XLOOKUP only look up element, dont insert, return NULL if not found. + */ { - unsigned int hashcode, index; - struct hilight_hashentry *entry, *saveptr, **preventry; - char *ptr; - int s ; - int depth=0; - - if(token==NULL) return NULL; - hashcode=hi_hash(token); - index=hashcode % HASHSIZE; - entry=xctx->hilight_table[index]; - preventry=&xctx->hilight_table[index]; - depth=0; - while(1) - { - if( !entry ) /* empty slot */ - { - if( remove==XINSERT ) /* insert data */ - { - s=sizeof( struct hilight_hashentry ); - ptr= my_malloc(137, s ); - entry=(struct hilight_hashentry *)ptr; - entry->next = NULL; - entry->token = NULL; - my_strdup(138, &(entry->token),token); - entry->path = NULL; - my_strdup(139, &(entry->path),xctx->sch_path[xctx->currsch]); - entry->value=value; - entry->hash=hashcode; - *preventry=entry; - xctx->hilight_nets=1; /* some nets should be hilighted .... 07122002 */ - } - return NULL; /* whether inserted or not return NULL since it was not in */ + unsigned int hashcode, index; + struct hilight_hashentry *entry, *saveptr, **preventry; + char *ptr; + int s ; + int depth=0; + + if(token==NULL) return NULL; + hashcode=hi_hash(token); + index=hashcode % HASHSIZE; + entry=xctx->hilight_table[index]; + preventry=&xctx->hilight_table[index]; + depth=0; + while(1) { + if( !entry ) { /* empty slot */ + if( what==XINSERT || what == XINSERT_NOREPLACE) { /* insert data */ + s=sizeof( struct hilight_hashentry ); + ptr= my_malloc(137, s ); + entry=(struct hilight_hashentry *)ptr; + entry->next = NULL; + entry->token = NULL; + my_strdup(138, &(entry->token),token); + entry->path = NULL; + my_strdup(139, &(entry->path),xctx->sch_path[xctx->currsch]); + entry->value=value; + entry->hash=hashcode; + *preventry=entry; + xctx->hilight_nets=1; /* some nets should be hilighted .... 07122002 */ + } + return NULL; /* whether inserted or not return NULL since it was not in */ + } + if( entry -> hash==hashcode && !strcmp(token,entry->token) && + !strcmp(xctx->sch_path[xctx->currsch], entry->path) ) { /* found matching tok */ + if(what==XDELETE) { /* remove token from the hash table ... */ + saveptr=entry->next; + my_free(762, &entry->token); + my_free(763, &entry->path); + my_free(764, &entry); + *preventry=saveptr; + } else if(what == XINSERT ) { + entry->value = value; + } + return entry; /* found matching entry, return the address */ + } + preventry=&entry->next; /* descend into the list. */ + entry = entry->next; + depth++; } - if( entry -> hash==hashcode && !strcmp(token,entry->token) && - !strcmp(xctx->sch_path[xctx->currsch], entry->path) ) /* found matching tok */ - { - if(remove==XDELETE) /* remove token from the hash table ... */ - { - saveptr=entry->next; - my_free(762, &entry->token); - my_free(763, &entry->path); - my_free(764, &entry); - *preventry=saveptr; - return NULL; - } - else /* found matching entry, return the address */ - { - return entry; - } - } - preventry=&entry->next; /* descend into the list. */ - entry = entry->next; - depth++; - if(debug_var>=2) - if(depth>200) - fprintf(errfp, "hilight_lookup(): deep into the list: %d, index=%d, token=%s, hashcode=%d\n", - depth, index, token, hashcode); - } } /* warning, in case of buses return only pointer to first bus element */ -struct hilight_hashentry *bus_hilight_lookup(const char *token, int value, int remove) +struct hilight_hashentry *bus_hilight_lookup(const char *token, int value, int what) { - char *start, *string_ptr, c; - char *string=NULL; - struct hilight_hashentry *ptr1=NULL, *ptr2=NULL; - int mult; - - if(token==NULL) return NULL; - if( token[0] == '#') { - my_strdup(140, &string, token); - } - else { - my_strdup(141, &string, expandlabel(token,&mult)); - } - - if(string==NULL) { - return NULL; - } - string_ptr = start = string; - while(1) { - c=(*string_ptr); - if(c==','|| c=='\0') - { - *string_ptr='\0'; /* set end string at comma position.... */ - /* insert one bus element at a time in hash table */ - dbg(2, "bus_hilight_lookup(): inserting: %s, value:%d\n", start,value); - ptr1=hilight_lookup(start, value, remove); - if(ptr1 && !ptr2) { - ptr2=ptr1; /*return first non null entry */ - if(remove==2) break; /* 20161221 no need to go any further if only looking up element */ - } - *string_ptr=c; /* ....restore original char */ - start=string_ptr+1; + char *start, *string_ptr, c; + char *string=NULL; + struct hilight_hashentry *ptr1=NULL, *ptr2=NULL; + int mult; + + if(token==NULL) return NULL; + if( token[0] == '#') { + my_strdup(140, &string, token); } - if(c==0) break; - string_ptr++; - } - /* if something found return first pointer */ - my_free(765, &string); - return ptr2; + else { + my_strdup(141, &string, expandlabel(token,&mult)); + } + if(string==NULL) { + return NULL; + } + string_ptr = start = string; + while(1) { + c=(*string_ptr); + if(c==','|| c=='\0') { + *string_ptr='\0'; /* set end string at comma position.... */ + /* insert one bus element at a time in hash table */ + dbg(2, "bus_hilight_lookup(): inserting: %s, value:%d\n", start,value); + ptr1=hilight_lookup(start, value, what); + if(ptr1 && !ptr2) { + ptr2=ptr1; /*return first non null entry */ + if(what==XLOOKUP) break; /* 20161221 no need to go any further if only looking up element */ + } + *string_ptr=c; /* ....restore original char */ + start=string_ptr+1; + } + if(c==0) break; + string_ptr++; + } + /* if something found return first pointer */ + my_free(765, &string); + return ptr2; } -void delete_hilight_net(void) +void clear_all_hilights(void) { int i; if(!xctx->hilight_nets) return; @@ -300,9 +287,9 @@ void delete_hilight_net(void) xctx->hilight_nets=0; for(i=0;iinstances;i++) { - xctx->inst[i].color = 0 ; + xctx->inst[i].color = -1 ; } - dbg(1, "delete_hilight_net(): clearing\n"); + dbg(1, "clear_all_hilights(): clearing\n"); xctx->hilight_color=0; } @@ -336,7 +323,7 @@ void hilight_net_pin_mismatches(void) dbg(1, "hilight_net_pin_mismatches(): i=%d labname=%s explabname = %s net = %s\n", i, labname, lab, netname); if(netname && strcmp(lab, netname)) { dbg(1, "hilight_net_pin_mismatches(): hilight: %s\n", netname); - bus_hilight_lookup(netname, xctx->hilight_color, XINSERT); + bus_hilight_lookup(netname, xctx->hilight_color, XINSERT_NOREPLACE); if(incr_hilight) xctx->hilight_color++; } } @@ -346,6 +333,7 @@ void hilight_net_pin_mismatches(void) my_free(714, &labname); my_free(715, &lab); my_free(716, &netname); + propagate_hilights(1, 0); redraw_hilights(); } @@ -432,7 +420,7 @@ void hilight_child_pins(void) ((inst_number - 1) * mult + k - 1) % net_mult + 1), 0, XLOOKUP); xctx->currsch++; if(entry) { - bus_hilight_lookup(find_nth(pin_node, ',', k), entry->value, XINSERT); + bus_hilight_lookup(find_nth(pin_node, ',', k), entry->value, XINSERT_NOREPLACE); dbg(1, "hilight_child_pins(): inserting: %s\n", find_nth(pin_node, ',', k)); } else { @@ -458,7 +446,7 @@ int bus_search(const char*s) int search(const char *tok, const char *val, int sub, int sel, int what) { - int save_draw, hilight_layer = 7; + int save_draw; int i,c, col = 7,tmp,bus=0; const char *str; char *type; @@ -484,7 +472,6 @@ int search(const char *tok, const char *val, int sub, int sel, int what) if(!sel) { col=xctx->hilight_color; - hilight_layer = get_color(col); if(incr_hilight) xctx->hilight_color++; } has_token = 0; @@ -526,11 +513,11 @@ int search(const char *tok, const char *val, int sub, int sel, int what) if(!sel) { type = (xctx->inst[i].ptr+ xctx->sym)->type; if( type && IS_LABEL_SH_OR_PIN(type) ) { - bus_hilight_lookup(xctx->inst[i].node[0], col, XINSERT); /* sets xctx->hilight_nets = 1; */ + bus_hilight_lookup(xctx->inst[i].node[0], col, XINSERT_NOREPLACE); /* sets xctx->hilight_nets = 1; */ } else { dbg(1, "search(): setting hilight flag on inst %d\n",i); xctx->hilight_nets=1; - xctx->inst[i].color = hilight_layer; + xctx->inst[i].color = col; } } if(sel==1) { @@ -557,7 +544,7 @@ int search(const char *tok, const char *val, int sub, int sel, int what) #endif { if(!sel) { - bus_hilight_lookup(xctx->wire[i].node, col, XINSERT); /* sets xctx->hilight_nets = 1 */ + bus_hilight_lookup(xctx->wire[i].node, col, XINSERT_NOREPLACE); /* sets xctx->hilight_nets = 1 */ } if(sel==1) { xctx->wire[i].sel = SELECTED; @@ -575,7 +562,7 @@ int search(const char *tok, const char *val, int sub, int sel, int what) } } } - if(!sel) propagate_hilights(1); + if(!sel) propagate_hilights(1, 0); if(sel) for(c = 0; c < cadlayers; c++) for(i=0;ilines[c];i++) { str = get_tok_value(xctx->line[c][i].prop_ptr, tok,0); if(get_tok_size) { @@ -657,9 +644,6 @@ int search(const char *tok, const char *val, int sub, int sel, int what) if(found) return 1; else return 0; } - - - /* "drill" option (pass through resistors or pass gates or whatever elements with */ /* 'propagate_to' properties set on pins) */ void drill_hilight(void) @@ -673,13 +657,10 @@ void drill_hilight(void) const char *propagate_str; int propagate; struct hilight_hashentry *entry, *propag_entry; - int count; prepare_netlist_structs(0); - count=0; while(1) { found=0; - count++; for(i=0; iinstances;i++) { symbol = xctx->inst[i].ptr+xctx->sym; npin = symbol->rects[PINLAYER]; @@ -692,11 +673,8 @@ void drill_hilight(void) /* get net to propagate hilight to...*/ my_strdup(144, &propagated_net, net_name(i, propagate, &mult, 1, 1)); /* add net to highlight list */ - propag_entry = bus_hilight_lookup(propagated_net, entry->value, XINSERT); - if(!propag_entry) { - found=1; /* keep looping until no more nets are found. */ - } - + propag_entry = bus_hilight_lookup(propagated_net, entry->value, XINSERT_NOREPLACE); + if(!propag_entry) found=1; /* keep looping until no more nets are found. */ } } /* for(j...) */ } /* for(i...) */ @@ -708,18 +686,17 @@ void drill_hilight(void) int hilight_netname(const char *name) { - int ret = 0; struct node_hashentry *node_entry; prepare_netlist_structs(0); dbg(1, "hilight_netname(): entering\n"); rebuild_selected_array(); node_entry = bus_hash_lookup(name, "", XLOOKUP, 0, "", "", "", ""); - ret = node_entry ? 1 : 0; - if(ret && !bus_hilight_lookup(name, xctx->hilight_color, XINSERT)) { /* sets xctx->hilight_nets=1 */ + if(node_entry && !bus_hilight_lookup(name, xctx->hilight_color, XINSERT_NOREPLACE)) { /* sets xctx->hilight_nets=1 */ if(incr_hilight) xctx->hilight_color++; + propagate_hilights(1, 0); redraw_hilights(); } - return ret; + return node_entry ? 1 : 0; } static void send_net_to_gaw(int simtype, const char *node) @@ -771,7 +748,6 @@ static void send_current_to_gaw(int simtype, const char *node) if(!node || !node[0]) return; tok = node; - /* c = get_color(xctx->hilight_color); */ c = PINLAYER; sprintf(color_str, "%02x%02x%02x", xcolor_array[c].red>>8, xcolor_array[c].green>>8, xcolor_array[c].blue>>8); expanded_tok = expandlabel(tok, &tok_mult); @@ -792,15 +768,13 @@ static void send_current_to_gaw(int simtype, const char *node) Tcl_VarEval(interp, "puts $gaw_fd {copyvar ", xctx->currsch>0 ? "V:" : "", strtoupper(p), strtoupper( xctx->currsch>0 ? t+1 : t ), "#branch", " p0 #", color_str, "}\nvwait gaw_fd\n", NULL); - } } my_free(1181, &p); my_free(1182, &t); - } -void propagate_hilights(int set) +void propagate_hilights(int set, int clear) { int i, hilight_connected_inst; struct hilight_hashentry *entry; @@ -815,36 +789,181 @@ void propagate_hilights(int set) 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; + int rects, j, nohilight_pins; if( (rects = (xctx->inst[i].ptr+ xctx->sym)->rects[PINLAYER]) > 0 ) { - clear = 1; + nohilight_pins = 1; for(j=0;jinst[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); + xctx->inst[i].color=entry->value; } else { - clear = 0; + nohilight_pins = 0; /* at least one connected net is hilighted: keep instance hilighted */ } break; } } } - if(clear && !set) { - xctx->inst[i].color=0; + if(nohilight_pins && clear) { + xctx->inst[i].color=-1; } } } 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; + if(entry && set) xctx->inst[i].color = entry->value; + else if(!entry && clear) xctx->inst[i].color = -1; } } xctx->hilight_nets = there_are_hilights(); - if(xctx->hilight_nets && enable_drill) drill_hilight(); + if(xctx->hilight_nets && enable_drill && set) drill_hilight(); } +#define LOGIC_X -1 +#define STACKMAX 100 +int get_logic_value(int n) +{ + return 0; +} + +int eval_logic_expr(char *expr) +{ + int stack[STACKMAX]; + int i, sp = 0; + char *saveptr = NULL; + char *ptr1; + char *ptr2; + char *arg; + int res = 0; + + my_strdup(1218, &saveptr, expr); + ptr2 = saveptr; + while( (arg = my_strtok_r(ptr2, " ", &ptr1)) ) { + ptr2 = NULL; + if(arg[0] == '~') { + if(sp > 0) { + sp--; + if(stack[sp] != LOGIC_X) stack[sp] = !stack[sp]; + ++sp; + } + } else if(arg[0] == '|') { + if(sp > 1) { + res = 0; + for(i = sp - 2; i < sp; i++) { + if(stack[i] == 1) { + res = 1; + break; + } + else if(stack[i] == LOGIC_X) { + res = LOGIC_X; + } + } + stack[sp - 2] = res; + sp--; + } + } else if(arg[0] == '&') { + if(sp > 1) { + res = 1; + for(i = sp - 2; i < sp; i++) { + if(stack[i] == 0) { + res = 0; + break; + } + else if(stack[i] == LOGIC_X) { + res = LOGIC_X; + } + } + stack[sp - 2] = res; + sp--; + } + } else if(arg[0] == '^') { + if(sp > 1) { + res = 0; + for(i = sp - 2; i < sp; i++) { + if(stack[i] != LOGIC_X) { + res = res ^ stack[i]; + } + else { + res = LOGIC_X; + break; + } + } + stack[sp - 2] = res; + sp--; + } + } else if(isdigit(arg[0])) { + if(sp < STACKMAX) stack[sp++] = get_logic_value(atoi(arg)); + } + } + free(saveptr); + return stack[0]; +} + + +void toggle_net_logic_value() +{ + int i, n, value, newvalue; + char *type; + struct hilight_hashentry *entry; + xRect boundbox; + int big = xctx->wires> 2000 || xctx->instances > 2000 ; + + prepare_netlist_structs(0); + rebuild_selected_array(); + if(!big) { + calc_drawing_bbox(&boundbox, 2); + bbox(START, 0.0 , 0.0 , 0.0 , 0.0); + bbox(ADD, boundbox.x1, boundbox.y1, boundbox.x2, boundbox.y2); + } + for(i=0;ilastsel;i++) + { + n = xctx->sel_array[i].n; + switch(xctx->sel_array[i].type) + { + case WIRE: + entry = bus_hilight_lookup(xctx->wire[n].node, 0, XLOOKUP); + if(!entry) value = LOGIC_X; + else if(!entry->value) value = 0; + else value = 1; + newvalue = (value + 2) % 3 - 1; /* next logic value LOGIC_X (-1), 0, 1 */ + here(value); + here(newvalue); + if(newvalue == LOGIC_X) { + bus_hilight_lookup(xctx->wire[n].node, value, XDELETE); + } else { /* sets xctx->hilight_nets=1 */ + bus_hilight_lookup(xctx->wire[n].node, newvalue, XINSERT); + } + break; + case ELEMENT: + type = (xctx->inst[n].ptr+ xctx->sym)->type; + if( type && xctx->inst[n].node && IS_LABEL_SH_OR_PIN(type) ) { /* instance must have a pin! */ + entry = bus_hilight_lookup(xctx->inst[n].node[0], 0, XLOOKUP); + if(!entry) value = LOGIC_X; + else if(!entry->value) value = 0; + else value = 1; + newvalue = (value + 2) % 3 - 1; /* next logic value LOGIC_X (-1), 0, 1 */ + if(newvalue == LOGIC_X) bus_hilight_lookup(xctx->inst[n].node[0], value, XDELETE); + /* sets xctx->hilight_nets=1 */ + else bus_hilight_lookup(xctx->inst[n].node[0], newvalue, XINSERT); + } + break; + default: + break; + } + } + propagate_hilights(1, 1); + if(!big) { + calc_drawing_bbox(&boundbox, 2); + bbox(ADD, boundbox.x1, boundbox.y1, boundbox.x2, boundbox.y2); + bbox(SET , 0.0 , 0.0 , 0.0 , 0.0); + } + draw(); + if(!big) bbox(END , 0.0 , 0.0 , 0.0 , 0.0); + tcleval("if { [info exists gaw_fd] } {close $gaw_fd; unset gaw_fd}\n"); +} + + + void hilight_net(int to_waveform) { int i, n; @@ -856,14 +975,12 @@ void hilight_net(int to_waveform) rebuild_selected_array(); tcleval("sim_is_xyce"); sim_is_xyce = atoi( tclresult() ); - for(i=0;ilastsel;i++) - { + for(i=0;ilastsel;i++) { n = xctx->sel_array[i].n; - switch(xctx->sel_array[i].type) - { + switch(xctx->sel_array[i].type) { case WIRE: /* sets xctx->hilight_nets=1 */ - if(!bus_hilight_lookup(xctx->wire[n].node, xctx->hilight_color, XINSERT)) { + if(!bus_hilight_lookup(xctx->wire[n].node, xctx->hilight_color, XINSERT_NOREPLACE)) { if(to_waveform == GAW) send_net_to_gaw(sim_is_xyce, xctx->wire[n].node); if(incr_hilight) xctx->hilight_color++; } @@ -872,14 +989,14 @@ void hilight_net(int to_waveform) type = (xctx->inst[n].ptr+ xctx->sym)->type; if( type && xctx->inst[n].node && IS_LABEL_SH_OR_PIN(type) ) { /* instance must have a pin! */ /* sets xctx->hilight_nets=1 */ - if(!bus_hilight_lookup(xctx->inst[n].node[0], xctx->hilight_color, XINSERT)) { + if(!bus_hilight_lookup(xctx->inst[n].node[0], xctx->hilight_color, XINSERT_NOREPLACE)) { if(to_waveform == GAW) send_net_to_gaw(sim_is_xyce, xctx->inst[n].node[0]); if(incr_hilight) xctx->hilight_color++; } } else { dbg(1, "hilight_net(): setting hilight flag on inst %d\n",n); xctx->hilight_nets=1; - xctx->inst[n].color = get_color(xctx->hilight_color); + xctx->inst[n].color = xctx->hilight_color; if(incr_hilight) xctx->hilight_color++; } if(type && (!strcmp(type, "current_probe") || !strcmp(type, "vsource")) ) { @@ -891,11 +1008,7 @@ void hilight_net(int to_waveform) } } if(!incr_hilight) xctx->hilight_color++; - if(enable_drill) { - drill_hilight(); - /*traverse_schematic(); */ - } - propagate_hilights(1); + propagate_hilights(1, 0); tcleval("if { [info exists gaw_fd] } {close $gaw_fd; unset gaw_fd}\n"); } @@ -903,34 +1016,39 @@ void unhilight_net(void) { int i,n; char *type; + xRect boundbox; + int big = xctx->wires> 2000 || xctx->instances > 2000 ; - prepare_netlist_structs(0); - dbg(1, "unhilight_net(): entering\n"); rebuild_selected_array(); - - - for(i=0;ilastsel;i++) - { + prepare_netlist_structs(0); + if(!big) calc_drawing_bbox(&boundbox, 2); + dbg(1, "unhilight_net(): entering\n"); + for(i=0;ilastsel;i++) { n = xctx->sel_array[i].n; - switch(xctx->sel_array[i].type) - { + switch(xctx->sel_array[i].type) { case WIRE: bus_hilight_lookup(xctx->wire[n].node, xctx->hilight_color, XDELETE); break; case ELEMENT: type = (xctx->inst[n].ptr+ xctx->sym)->type; - if( type && - xctx->inst[n].node && IS_LABEL_SH_OR_PIN(type) ) { /* instance must have a pin! */ + if( type && xctx->inst[n].node && IS_LABEL_SH_OR_PIN(type) ) { /* instance must have a pin! */ bus_hilight_lookup(xctx->inst[n].node[0], xctx->hilight_color, XDELETE); - } else { } - xctx->inst[n].color = 0; + xctx->inst[n].color = -1; break; default: break; } } - propagate_hilights(0); + if(!big) { + bbox(START, 0.0 , 0.0 , 0.0 , 0.0); + bbox(ADD, boundbox.x1, boundbox.y1, boundbox.x2, boundbox.y2); + bbox(SET , 0.0 , 0.0 , 0.0 , 0.0); + } + propagate_hilights(0, 1); + draw(); + if(!big) bbox(END , 0.0 , 0.0 , 0.0 , 0.0); + unselect_all(); } @@ -970,7 +1088,7 @@ void select_hilight_net(void) 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( xctx->inst[i].color) { + if( xctx->inst[i].color != -1) { dbg(1, "select_hilight_net(): instance %d flags &4 true\n", i); xctx->inst[i].sel = SELECTED; xctx->ui_state|=SELECTION; @@ -1068,8 +1186,9 @@ void draw_hilight_net(int on_window) i++; if(i >= xctx->instances) break; } - if(xctx->inst[i].color ) + if(xctx->inst[i].color != -1) { + int col = get_color(xctx->inst[i].color); symptr = (xctx->inst[i].ptr+ xctx->sym); if( c==0 || /*draw_symbol call is needed on layer 0 to avoid redundant work (outside check) */ symptr->lines[c] || @@ -1077,12 +1196,12 @@ void draw_hilight_net(int on_window) symptr->arcs[c] || symptr->polygons[c] || ((c==TEXTWIRELAYER || c==TEXTLAYER) && symptr->texts)) { - draw_symbol(ADD, xctx->inst[i].color, i,c,0,0,0.0,0.0); + draw_symbol(ADD, col, i,c,0,0,0.0,0.0); } - filledrect(xctx->inst[i].color, END, 0.0, 0.0, 0.0, 0.0); - drawarc(xctx->inst[i].color, END, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0); - drawrect(xctx->inst[i].color, END, 0.0, 0.0, 0.0, 0.0, 0); - drawline(xctx->inst[i].color, END, 0.0, 0.0, 0.0, 0.0, 0); + filledrect(col, END, 0.0, 0.0, 0.0, 0.0); + drawarc(col, END, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0); + drawrect(col, END, 0.0, 0.0, 0.0, 0.0, 0); + drawline(col, END, 0.0, 0.0, 0.0, 0.0, 0); } } } diff --git a/src/move.c b/src/move.c index 4c229f98..11b115cb 100644 --- a/src/move.c +++ b/src/move.c @@ -902,7 +902,7 @@ void copy_objects(int what) 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].color = 0; + xctx->inst[xctx->instances].color = -1; xctx->inst[xctx->instances].x0 = xctx->rx1+xctx->deltax; xctx->inst[xctx->instances].y0 = xctx->ry1+xctx->deltay; xctx->inst[xctx->instances].sel = SELECTED; diff --git a/src/netlist.c b/src/netlist.c index d1b08f08..e1c7f0f8 100644 --- a/src/netlist.c +++ b/src/netlist.c @@ -303,8 +303,9 @@ void hash_wire(int what, int n, int incremental) struct wireentry *wptr; xWire * const wire = xctx->wire; - /* wire[n].node=NULL; */ - my_free(827, &wire[n].node); + + /* >>>>> THIS IS NOT NEEDED !! delete_netlist_structs() does this... Why this HERE ?? <<<<< */ + /* my_free(827, &wire[n].node); */ wire[n].end1 = wire[n].end2=-1; x1=wire[n].x1; @@ -1040,7 +1041,7 @@ void prepare_netlist_structs(int for_netlist) my_free(841, &global_node); dbg(2, "prepare_netlist_structs(): returning\n"); - propagate_hilights(1); + propagate_hilights(1, 0); } int sym_vs_sch_pins() diff --git a/src/node_hash.c b/src/node_hash.c index 73d57dcc..927671f5 100644 --- a/src/node_hash.c +++ b/src/node_hash.c @@ -314,35 +314,35 @@ void traverse_node_hash() if(entry->d.out + entry->d.inout + entry->d.in == 1) { my_snprintf(str, S(str), "open net: %s", entry->token); - if(!netlist_count) bus_hilight_lookup(entry->token, xctx->hilight_color, XINSERT); + if(!netlist_count) bus_hilight_lookup(entry->token, xctx->hilight_color, XINSERT_NOREPLACE); if(incr_hilight) xctx->hilight_color++; statusmsg(str,2); } else if(entry->d.out ==0 && entry->d.inout == 0) { my_snprintf(str, S(str), "undriven node: %s", entry->token); - if(!netlist_count) bus_hilight_lookup(entry->token, xctx->hilight_color, XINSERT); + if(!netlist_count) bus_hilight_lookup(entry->token, xctx->hilight_color, XINSERT_NOREPLACE); if(incr_hilight) xctx->hilight_color++; statusmsg(str,2); } else if(entry->d.out >=2 && entry->d.port>=0) /* era d.port>=2 03102001 */ { my_snprintf(str, S(str), "shorted output node: %s", entry->token); - if(!netlist_count) bus_hilight_lookup(entry->token, xctx->hilight_color, XINSERT); + if(!netlist_count) bus_hilight_lookup(entry->token, xctx->hilight_color, XINSERT_NOREPLACE); if(incr_hilight) xctx->hilight_color++; statusmsg(str,2); } else if(entry->d.in ==0 && entry->d.inout == 0) { my_snprintf(str, S(str), "node: %s goes nowhere", entry->token); - if(!netlist_count) bus_hilight_lookup(entry->token, xctx->hilight_color, XINSERT); + if(!netlist_count) bus_hilight_lookup(entry->token, xctx->hilight_color, XINSERT_NOREPLACE); if(incr_hilight) xctx->hilight_color++; statusmsg(str,2); } else if(entry->d.out >=2 && entry->d.inout == 0 && entry->d.port>=0) /* era d.port>=2 03102001 */ { my_snprintf(str, S(str), "shorted output node: %s", entry->token); - if(!netlist_count) bus_hilight_lookup(entry->token, xctx->hilight_color, XINSERT); + if(!netlist_count) bus_hilight_lookup(entry->token, xctx->hilight_color, XINSERT_NOREPLACE); if(incr_hilight) xctx->hilight_color++; statusmsg(str,2); } diff --git a/src/paste.c b/src/paste.c index 80147bcd..04f3eec4 100644 --- a/src/paste.c +++ b/src/paste.c @@ -213,7 +213,7 @@ void merge_inst(int k,FILE *fd) } ptr[i].sel=0; ptr[i].flags=0; - ptr[i].color=0; + ptr[i].color=-1; ptr[i].ptr=-1; ptr[i].prop_ptr=NULL; ptr[i].instname=NULL; diff --git a/src/save.c b/src/save.c index 04ccacab..eec8f619 100644 --- a/src/save.c +++ b/src/save.c @@ -551,7 +551,7 @@ static void load_inst(int k, FILE *fd) fprintf(errfp,"WARNING: missing fields for INSTANCE object, ignoring.\n"); read_line(fd, 0); } else { - xctx->inst[i].color=0; + xctx->inst[i].color=-1; xctx->inst[i].flags=0; xctx->inst[i].sel=0; xctx->inst[i].ptr=-1; /*04112003 was 0 */ diff --git a/src/scheduler.c b/src/scheduler.c index 60cc9115..762b5a2a 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -1370,7 +1370,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg if(argc==3) { if(!has_x || !xctx->modified || !save(1) ) { /* save(1)==1 --> user cancel */ dbg(1, "scheduler(): load: filename=%s\n", argv[2]); - delete_hilight_net(); + clear_all_hilights(); xctx->currsch = 0; unselect_all(); remove_symbols(); @@ -1407,7 +1407,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg cmd_found = 1; if(argc==3) { dbg(1, "scheduler(): load: filename=%s\n", argv[2]); - delete_hilight_net(); + clear_all_hilights(); xctx->currsch = 0; unselect_all(); remove_symbols(); @@ -1427,6 +1427,14 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg else if(argc==2 && opened==1) { fclose(errfp); errfp=stderr;opened=0; } Tcl_ResetResult(interp); } + else if(!strcmp(argv[1],"logic_set")) + { + cmd_found = 1; + enable_drill = 1; + toggle_net_logic_value(); + Tcl_ResetResult(interp); + } + } else if(argv[1][0] == 'm') { @@ -1758,10 +1766,13 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg else if(!strcmp(argv[1],"propagate_hilights")) { - int set = 1; + int set = 1, clear = 0; cmd_found = 1; - if(argc>=3) set = atoi(argv[2]); - propagate_hilights(set); + if(argc>=4) { + set = atoi(argv[2]); + clear = atoi(argv[3]); + } + propagate_hilights(set, clear); } else if(!strcmp(argv[1],"push_undo")) @@ -2455,14 +2466,14 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg Tcl_ResetResult(interp); } - else if(!strcmp(argv[1],"unhilight")) + else if(!strcmp(argv[1],"unhilight_all")) { xRect boundbox; int big = xctx->wires> 2000 || xctx->instances > 2000 ; cmd_found = 1; enable_drill=0; if(!big) calc_drawing_bbox(&boundbox, 2); - delete_hilight_net(); + clear_all_hilights(); /* undraw_hilight_net(1); */ if(!big) { bbox(START, 0.0 , 0.0 , 0.0 , 0.0); @@ -2472,13 +2483,13 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg draw(); if(!big) bbox(END , 0.0 , 0.0 , 0.0 , 0.0); - /* - enable_drill = 0; - unhilight_net(); - draw(); - */ Tcl_ResetResult(interp); } + else if(!strcmp(argv[1],"unhilight")) + { + cmd_found = 1; + unhilight_net(); + } else if(!strcmp(argv[1],"unselect_all")) { diff --git a/src/spice_netlist.c b/src/spice_netlist.c index 3a17a424..86fe9377 100644 --- a/src/spice_netlist.c +++ b/src/spice_netlist.c @@ -207,7 +207,7 @@ void global_spice_netlist(int global) /* netlister driver */ } /* restore hilight flags from errors found analyzing top level before descending hierarchy */ for(i=0;iinstances; i++) xctx->inst[i].color = stored_flags[i]; - propagate_hilights(1); + propagate_hilights(1, 0); draw_hilight_net(1); my_free(945, &stored_flags); @@ -535,12 +535,12 @@ void free_hash(struct hashentry **table) /* token value what ... what ... * -------------------------------------------------------------------------- * "whatever" "whatever" XINSERT insert in hash table if not in. - * if already present update value if not NULL, - * return entry address. + * if already present update value if not NULL, + * return new entry address. * "whatever" "whatever" XINSERT_NOREPLACE same as XINSERT but do not replace existing value - * return NULL if not found. + * return NULL if not found. * "whatever" "whatever" XLOOKUP lookup in hash table,return entry addr. - * return NULL if not found + * return NULL if not found * "whatever" "whatever" XDELETE delete entry if found,return NULL */ struct int_hashentry *int_hash_lookup(struct int_hashentry **table, const char *token, const int value, int what) diff --git a/src/svgdraw.c b/src/svgdraw.c index d2b17b17..173774fc 100644 --- a/src/svgdraw.c +++ b/src/svgdraw.c @@ -722,7 +722,7 @@ void svg_draw(void) } for(i=0;iinstances;i++) { color = c; - if(xctx->inst[i].color) color = xctx->inst[i].color; + if(xctx->inst[i].color != -1) color = get_color(xctx->inst[i].color); svg_draw_symbol(color,i,c,0,0,0.0,0.0); } } diff --git a/src/tedax_netlist.c b/src/tedax_netlist.c index 2a8585a3..1da1ee8f 100644 --- a/src/tedax_netlist.c +++ b/src/tedax_netlist.c @@ -120,7 +120,7 @@ void global_tedax_netlist(int global) /* netlister driver */ } /* restore hilight flags from errors found analyzing top level before descending hierarchy */ for(i=0;iinstances; i++) xctx->inst[i].color = stored_flags[i]; - propagate_hilights(1); + propagate_hilights(1, 0); draw_hilight_net(1); my_free(965, &stored_flags); diff --git a/src/token.c b/src/token.c index 6b0daee4..c6bd75a6 100644 --- a/src/token.c +++ b/src/token.c @@ -187,7 +187,7 @@ void check_unique_names(int rename) xRect boundbox; if(!big) calc_drawing_bbox(&boundbox, 2); enable_drill=0; - delete_hilight_net(); + clear_all_hilights(); /* undraw_hilight_net(1); */ if(!big) { bbox(START, 0.0 , 0.0 , 0.0 , 0.0); @@ -229,7 +229,7 @@ void check_unique_names(int rename) comma_pos++; } } /* for(j...) */ - if( xctx->inst[i].color && rename) { + if( (xctx->inst[i].color != -1) && 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)); diff --git a/src/verilog_netlist.c b/src/verilog_netlist.c index 4ab259b2..6d9d7643 100644 --- a/src/verilog_netlist.c +++ b/src/verilog_netlist.c @@ -321,7 +321,7 @@ void global_verilog_netlist(int global) /* netlister driver */ } /* restore hilight flags from errors found analyzing top level before descending hierarchy */ for(i=0;iinstances; i++) xctx->inst[i].color = stored_flags[i]; - propagate_hilights(1); + propagate_hilights(1, 0); draw_hilight_net(1); my_free(1074, &stored_flags); diff --git a/src/vhdl_netlist.c b/src/vhdl_netlist.c index 279fca34..646f37f7 100644 --- a/src/vhdl_netlist.c +++ b/src/vhdl_netlist.c @@ -375,7 +375,7 @@ void global_vhdl_netlist(int global) /* netlister driver */ } /* restore hilight flags from errors found analyzing top level before descending hierarchy */ for(i=0;iinstances; i++) xctx->inst[i].color = stored_flags[i]; - propagate_hilights(1); + propagate_hilights(1, 0); draw_hilight_net(1); my_free(1088, &stored_flags); dbg(1, "global_vhdl_netlist(): starting awk on netlist!\n"); diff --git a/src/xinit.c b/src/xinit.c index a7c6b4b6..3c4d7403 100644 --- a/src/xinit.c +++ b/src/xinit.c @@ -541,7 +541,7 @@ void xwin_exit(void) return; } delete_netlist_structs(); - delete_hilight_net(); + clear_all_hilights(); get_unnamed_node(0, 0, 0); if(has_x) { resetwin(0, 1, 1, 0, 0); /* create_pixmap, clear_pixmap, force */ @@ -739,7 +739,7 @@ void delete_schematic_data(void) dbg(1, "delete_schematic_data()\n"); unselect_all(); delete_netlist_structs(); /* netlist - specific data and hash tables */ - delete_hilight_net(); /* data structs for hilighting nets/instances */ + clear_all_hilights(); /* data structs for hilighting nets/instances */ get_unnamed_node(0, 0, 0); /* net### enumerator used for netlisting */ remove_symbols(); clear_drawing(); /* delete instances, wires, lines, rects, ... */ diff --git a/src/xschem.h b/src/xschem.h index 72a91e32..cba27a95 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -814,7 +814,7 @@ extern int samefile(const char *fa, const char *fb); extern void saveas(const char *f, int type); extern const char *get_file_path(char *f); extern int save(int confirm); -extern struct hilight_hashentry *bus_hilight_lookup(const char *token, int value, int remove) ; +extern struct hilight_hashentry *bus_hilight_lookup(const char *token, int value, int what) ; extern int name_strcmp(char *s, char *d) ; extern int search(const char *tok, const char *val, int sub, int sel, int what); extern int process_options(int argc, char **argv); @@ -1104,9 +1104,10 @@ extern void print_verilog_signals(FILE *fd); extern void print_generic(FILE *fd, char *ent_or_comp, int symbol); extern void print_verilog_param(FILE *fd, int symbol); extern void hilight_net(int to_waveform); +extern void toggle_net_logic_value(); extern int hilight_netname(const char *name); extern void unhilight_net(); -extern void propagate_hilights(int set); +extern void propagate_hilights(int set, int clear); extern void draw_hilight_net(int on_window); extern void display_hilights(char **str); extern void redraw_hilights(void); @@ -1114,7 +1115,7 @@ extern void override_netlist_type(int type); extern void prepare_netlist_structs(int for_netlist); extern void delete_netlist_structs(void); extern void delete_inst_node(int i); -extern void delete_hilight_net(void); +extern void clear_all_hilights(void); extern void hilight_child_pins(void); extern void hilight_parent_pins(void); extern void hilight_net_pin_mismatches(void); diff --git a/src/xschem.tcl b/src/xschem.tcl index c92000a8..d31f3236 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -3709,6 +3709,8 @@ if { ( $::OS== "Windows" || [string length [lindex [array get env DISPLAY] 1] ] setup_recent_menu .menubar.file.menu add cascade -label "Open Recent" -menu .menubar.file.menu.recent + .menubar.file.menu add command -label "Open Most Recent" \ + -command "eval {xschem load [lindex "$recentfile" 0]}" -accelerator {Ctrl+Shift+O} .menubar.file.menu add command -label "Save" -command "xschem save" -accelerator {Ctrl+S} toolbar_create FileSave "xschem save" "Save File" .menubar.file.menu add command -label "Merge" -command "xschem merge" -accelerator {Shift+B} @@ -4052,7 +4054,7 @@ if { ( $::OS== "Windows" || [string length [lindex [array get env DISPLAY] 1] ] .menubar.hilight.menu add command -label {Select hilight nets / pins} -command "xschem select_hilight_net" \ -accelerator Alt+K .menubar.hilight.menu add command -label {Un-highlight all net/pins} \ - -command "xschem unhilight" -accelerator Shift+K + -command "xschem unhilight_all" -accelerator Shift+K .menubar.hilight.menu add command -label {Un-highlight selected net/pins} \ -command "xschem unhilight" -accelerator Ctrl+K # 20160413 diff --git a/xschem_library/examples/mos_power_ampli.sch b/xschem_library/examples/mos_power_ampli.sch index 621471f8..f349b3a1 100644 --- a/xschem_library/examples/mos_power_ampli.sch +++ b/xschem_library/examples/mos_power_ampli.sch @@ -13,7 +13,7 @@ N 260 -470 340 -470 {lab=E9} N 340 -500 340 -470 {lab=E9} N 1110 -700 1110 -670 {lab=SA} N 840 -1020 840 -980 {lab=E4} -N 1110 -590 1110 -570 {lab=xxx} +N 1110 -590 1110 -570 {lab=OUTI} N 1110 -510 1110 -470 {lab=#net1} N 180 -1020 180 -980 {lab=E1} N 390 -790 520 -790 {lab=C2} @@ -49,9 +49,9 @@ N 260 -180 260 -130 {lab=E3} N 150 -150 150 -70 {lab=VSS} N 50 -150 50 -70 {lab=VSS} N 50 -70 150 -70 {lab=VSS} -N 690 -600 1110 -600 {lab=xxx} +N 690 -600 1110 -600 {lab=OUTI} N 180 -470 260 -470 {lab=E9} -N 1110 -610 1110 -600 {lab=xxx} +N 1110 -610 1110 -600 {lab=OUTI} N 860 -380 1110 -380 {lab=SB} N 860 -700 1110 -700 {lab=SA} N 1240 -1120 1240 -960 {lab=VBOOST} @@ -64,8 +64,8 @@ N 220 -630 340 -630 {lab=C9} N 180 -600 180 -560 {lab=C5} N 1110 -320 1110 -280 {lab=VNN} N 1330 -590 1390 -590 {lab=OUT} -N 1110 -590 1240 -590 {lab=xxx} -N 1110 -600 1110 -590 {lab=xxx} +N 1110 -590 1240 -590 {lab=OUTI} +N 1110 -600 1110 -590 {lab=OUTI} N 340 -860 340 -820 {lab=#net4} N 560 -860 560 -820 {lab=#net5} N 560 -1020 560 -920 {lab=E6} @@ -73,16 +73,16 @@ N 340 -1020 340 -920 {lab=E2} N 260 -280 260 -240 {lab=C3} N 730 -440 770 -440 {lab=#net6} N 560 -440 670 -440 {lab=C8} -N 690 -650 690 -600 {lab=xxx} +N 690 -650 690 -600 {lab=OUTI} N 690 -730 690 -710 {lab=#net7} N 180 -840 180 -660 {lab=C7} N 840 -860 840 -840 {lab=E11} -N 1240 -810 1240 -590 {lab=xxx} +N 1240 -810 1240 -590 {lab=OUTI} N 860 -760 860 -750 {lab=GA} N 860 -710 860 -700 {lab=SA} N 860 -440 860 -430 {lab=GB} N 860 -390 860 -380 {lab=SB} -N 1240 -590 1270 -590 {lab=xxx} +N 1240 -590 1270 -590 {lab=OUTI} N 830 -440 860 -440 {lab=GB} N 840 -760 860 -760 {lab=GA} N 340 -1180 340 -1080 { lab=VPP} diff --git a/xschem_library/pcb/pcb_test1.sch b/xschem_library/pcb/pcb_test1.sch index e66a469b..0fd0f6a5 100644 --- a/xschem_library/pcb/pcb_test1.sch +++ b/xschem_library/pcb/pcb_test1.sch @@ -1,5 +1,6 @@ -v {xschem version=2.9.5_RC8 file_version=1.1} +v {xschem version=2.9.9 file_version=1.2 } G {} +K {} V {} S {} E {} @@ -37,7 +38,9 @@ C {capa.sym} 590 -160 0 0 {name=C0 m=1 value=100u device="electrolitic capacitor C {74ls00.sym} 420 -460 0 0 {name=U1:4 risedel=100 falldel=200 url="http://www.engrcs.com/components/74LS00.pdf" power=VCC5 -___net:14=VCC5} + +___net:14=VCC5 +___pinnumber(B)=111:222:333:444} C {7805.sym} 730 -190 0 0 {name=U0 spiceprefix=X url="https://www.sparkfun.com/datasheets/Components/LM7805.pdf"}