diff --git a/doc/xschem_man/developer_info.html b/doc/xschem_man/developer_info.html index f079f211..90222099 100644 --- a/doc/xschem_man/developer_info.html +++ b/doc/xschem_man/developer_info.html @@ -1452,8 +1452,15 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
  • set_different_tok str new_str old_str
  •     Return string 'str' replacing/adding/removing tokens that are
        different between 'new_str' and 'old_str' 
    -
  • set_modify
  • -   Force modify status on current schematic 
    +
  • set_modify [n]
  • +   Force modify status on current schematic
    +   integer 'n':
    +   0 : clear modified flag, update title and tab names, upd. simulation button colors.
    +   1 : set modified flag, update title and tab names, upd. simulation button colors, rst floater caches.
    +   2 : clear modified flag, do nothing else.
    +   3 : set modified flag, do nothing else.
    +  -1 : set title, rst floater caches.
    +  -2 : rst floater caches, update simulation button colors (Simulate, Waves, Netlist).
  • setprop instance|symbol|text|rect ref tok [val] [fast]
  •        
            setprop instance inst [tok] [val] [fast]
    @@ -1685,6 +1692,7 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
     
     
     
    +
     
     
      
    diff --git a/src/actions.c b/src/actions.c
    index 7621ee7c..1d52d0b5 100644
    --- a/src/actions.c
    +++ b/src/actions.c
    @@ -140,9 +140,14 @@ const char *get_text_floater(int i)
       return txt_ptr;
     } 
     
    -/* mod=-1 used to force set title 
    - * mod=-2 used to reset floaters cache 
    - * if floaters are present set_modify(1) (after a modify opration) must be done before draw()
    +/* mod:
    + *   0 : clear modified flag, update title and tab names, upd. simulation button colors.
    + *   1 : set modified flag, update title and tab names, upd. simulation button colors, rst floater caches.
    + *   2 : clear modified flag, do nothing else.
    + *   3 : set modified flag, do nothing else.
    + *  -1 : set title, rst floater caches.
    + *  -2 : rst floater caches, update simulation button colors (Simulate, Waves, Netlist).
    + * If floaters are present set_modify(1) (after a modify operation) must be done before draw()
      * to invalidate cached floater string values  before redrawing
      * return 1 if floaters are found (mod==-2 or mod == 1 or mod == -1) */
     int set_modify(int mod)
    @@ -152,8 +157,8 @@ int set_modify(int mod)
       dbg(1, "set_modify(): %d, prev_set_modify=%d\n", mod, xctx->prev_set_modify);
     
       /* set modify state */
    -  if(mod == 0 || mod == 1) {
    -    xctx->modified = mod;
    +  if(mod == 0 || mod == 1 || mod == 2 || mod == 3) {
    +    xctx->modified = (mod & 1);
       }
       if(mod == 1 || (mod == 0  && xctx->prev_set_modify) || mod == -2) {
         /*                Do not configure buttons if displaying in preview window */
    diff --git a/src/draw.c b/src/draw.c
    index 6fa8c132..cf376639 100644
    --- a/src/draw.c
    +++ b/src/draw.c
    @@ -771,7 +771,8 @@ void draw_symbol(int what,int c, int n,int layer,short tmp_flip, short rot,
             dbg(1, "draw_symbol(): drawing string: before translate(): text.txt_ptr=%s\n", text.txt_ptr);
             my_strdup2(_ALLOC_ID_, &txtptr, translate(n, text.txt_ptr));
             /* do another round of substitutions if some @var are found, but if not found leave @var as is */
    -        dbg(1, "draw_symbol(): drawing string: str=%s prop=%s\n", txtptr, text.prop_ptr ?  text.prop_ptr : "NULL");
    +        dbg(1, "draw_symbol(): drawing string: str=%s prop=%s\n",
    +                txtptr, text.prop_ptr ?  text.prop_ptr : "");
              my_strdup2(_ALLOC_ID_, &txtptr, translate3(txtptr, 1, xctx->inst[n].prop_ptr, 
                xctx->sym[xctx->inst[n].ptr].templ, NULL ));
             dbg(1, "draw_symbol(): after translate3: str=%s\n", txtptr);
    @@ -2478,7 +2479,7 @@ int graph_fullyzoom(xRect *r,  Graph_ctx *gr, int graph_dataset)
               /* also trim spaces */
               my_strdup2(_ALLOC_ID_, &bus_msb, trim_chars(tmp_ptr, "\n "));
             }
    -        dbg(1, "ntok_copy=|%s|, bus_msb=|%s|\n", ntok_copy, bus_msb ? bus_msb : "NULL");
    +        dbg(1, "ntok_copy=|%s|, bus_msb=|%s|\n", ntok_copy, bus_msb ? bus_msb : "");
             stok = my_strtok_r(sptr, "\n\t ", "\"", 0, &saves);
             nptr = sptr = NULL;
             if(stok && stok[0]) {
    @@ -3352,7 +3353,7 @@ int edit_wave_attributes(int what, int i, Graph_ctx *gr)
         ctok = my_strtok_r(cptr, " ", "", 0, &savec);
         stok = my_strtok_r(sptr, "\t\n ", "\"", 0, &saves);
         nptr = cptr = sptr = NULL;
    -    dbg(1, "ntok=%s ctok=%s\n", ntok, ctok? ctok: "NULL");
    +    dbg(1, "ntok=%s ctok=%s\n", ntok, ctok? ctok: "");
         if(stok && stok[0]) {
           sweep_idx = get_raw_index(stok, NULL);
           if( sweep_idx == -1) sweep_idx = 0;
    @@ -3828,11 +3829,11 @@ void draw_graph(int i, const int flags, Graph_ctx *gr, void *ct)
             /* also trim spaces */
             my_strdup2(_ALLOC_ID_, &bus_msb, trim_chars(tmp_ptr, "\n "));
           }
    -      dbg(1, "ntok_copy=|%s|, bus_msb=|%s|\n", ntok_copy, bus_msb ? bus_msb : "NULL");
    +      dbg(1, "ntok_copy=|%s|, bus_msb=|%s|\n", ntok_copy, bus_msb ? bus_msb : "");
           ctok = my_strtok_r(cptr, " ", "", 0, &savec);
           stok = my_strtok_r(sptr, "\t\n ", "\"", 0, &saves);
           cptr = sptr = NULL;
    -      dbg(1, "ntok_copy=%s ctok=%s\n", ntok_copy, ctok? ctok: "NULL");
    +      dbg(1, "ntok_copy=%s ctok=%s\n", ntok_copy, ctok? ctok: "");
           if(ctok && ctok[0]) wc = atoi(ctok);
           if(wc < 0) wc = 4;
           if(wc >= cadlayers) wc = cadlayers - 1;
    @@ -3863,7 +3864,7 @@ void draw_graph(int i, const int flags, Graph_ctx *gr, void *ct)
               else         hilight_graph_node(bus_msb, wc);
             }
           }
    -      dbg(1, "express=%s, bus_msb=%s\n", express ? express : "NULL", bus_msb ? bus_msb : "NULL");
    +      dbg(1, "express=%s, bus_msb=%s\n", express ? express : "", bus_msb ? bus_msb : "");
           /* quickly find index number of ntok_copy variable to be plotted */
           if(sch_waves_loaded() != -1 && valid_rawfile &&
              (expression || (idx = get_raw_index(bus_msb ? bus_msb : express, NULL)) != -1)) {
    diff --git a/src/editprop.c b/src/editprop.c
    index dd23a094..277ad78d 100644
    --- a/src/editprop.c
    +++ b/src/editprop.c
    @@ -624,7 +624,8 @@ size_t my_mstrcat(int id, char **str, const char *add, ...)
     size_t my_strcat(int id, char **str, const char *append_str)
     {
       size_t s, a;
    -  dbg(3,"my_strcat(%d,): str=%s  append_str=%s\n", id, *str, append_str);
    +  dbg(3,"my_strcat(%d,): str=%s  append_str=%s\n", id,
    +    *str? *str : "", append_str ? append_str : "");
       if( *str != NULL)
       {
         s = strlen(*str);
    @@ -648,7 +649,8 @@ size_t my_strcat(int id, char **str, const char *append_str)
     size_t my_strcat2(int id, char **str, const char *append_str)
     {     
       size_t s, a;
    -  dbg(3,"my_strcat(%d,): str=%s  append_str=%s\n", id, *str, append_str);
    +  dbg(3,"my_strcat(%d,): str=%s  append_str=%s\n", id,
    +    *str? *str : "", append_str ? append_str : "");
       if( *str != NULL)
       { 
         s = strlen(*str);
    @@ -672,7 +674,8 @@ size_t my_strcat2(int id, char **str, const char *append_str)
     size_t my_strncat(int id, char **str, size_t n, const char *append_str)
     {
      size_t s, a;
    - dbg(3,"my_strncat(%d,): str=%s  append_str=%s\n", id, *str, append_str);
    + dbg(3,"my_strncat(%d,): str=%s  append_str=%s\n", id,
    +    *str? *str : "", append_str ? append_str : "");
      a = strlen(append_str) + 1;
      if(a > n + 1) a = n + 1;
      if( *str != NULL)
    @@ -1581,7 +1584,7 @@ static int update_symbol(const char *result, int x, int selected_inst)
                 dbg(1, "update_symbol(): changing prop: |%s| -> |%s|\n",
                     xctx->inst[*ii].prop_ptr, new_prop);
                 if(!pushed) { xctx->push_undo(); pushed=1;}
    -            dbg(1, "update_symbol(): *ii=%d, new_prop=%s\n", *ii, new_prop ? new_prop : "NULL");
    +            dbg(1, "update_symbol(): *ii=%d, new_prop=%s\n", *ii, new_prop ? new_prop : "");
                 my_strdup(_ALLOC_ID_, &xctx->inst[*ii].prop_ptr, new_prop);
               }
             }  else {
    diff --git a/src/hilight.c b/src/hilight.c
    index 1035cab8..f4d0f2b7 100644
    --- a/src/hilight.c
    +++ b/src/hilight.c
    @@ -153,7 +153,7 @@ Hilight_hashentry *bus_hilight_hash_lookup(const char *token, int value, int wha
       int mult;
      
       dbg(1, "bus_hilight_hash_lookup(): token=%s value=%d what=%d\n",
    -       token ? token : "NULL", value, what);
    +       token ? token : "", value, what);
       xctx->some_nets_added = 0;
       if(token==NULL) return NULL;
       /* if( token[0] == '#' || !strpbrk(token, "*[],.:")) { */
    @@ -1478,7 +1478,7 @@ static int eval_logic_expr(int inst, int output)
     
       stack[0] = 2; /* default if nothing is calculated: LOGIC_X */
       str = xctx->simdata[inst].pin[output].function;
    -  dbg(1, "eval_logic_expr(): inst=%d pin=%d function=%s\n", inst, output, str ? str : "NULL");
    +  dbg(1, "eval_logic_expr(): inst=%d pin=%d function=%s\n", inst, output, str ? str : "");
       if(!str) return 2; /* no logic function defined, return LOGIC_X */
       while(str[pos]) {
         switch(str[pos]) {
    diff --git a/src/netlist.c b/src/netlist.c
    index 303a7ebf..a474f53a 100644
    --- a/src/netlist.c
    +++ b/src/netlist.c
    @@ -921,7 +921,7 @@ static int name_attached_inst_to_net(int k, int sqx, int sqy)
         if(touch(wire[k].x1, wire[k].y1, wire[k].x2, wire[k].y2, x0, y0)) {
           if(!inst[n].node[p]) {
             dbg(1, "name_attached_inst_to_net(): inst %s, pin %d <-- %s\n", 
    -              inst[n].instname, p, wire[k].node ? wire[k].node : "NULL");
    +              inst[n].instname, p, wire[k].node ? wire[k].node : "");
             set_inst_node(n, p, wire[k].node);
             err |= instcheck(n, p);
           } else {
    diff --git a/src/node_hash.c b/src/node_hash.c
    index 1c0c816c..b7939e5e 100644
    --- a/src/node_hash.c
    +++ b/src/node_hash.c
    @@ -73,7 +73,7 @@ static Node_hashentry *node_hash_lookup(const char *token, const char *dir,int w
         entry->hash=hashcode;
         *preventry=entry;
         dbg(3, "node_hash_lookup(): hashing %s : value=%s\n\n",
    -           entry->token, entry->value? entry->value:"NULL");
    +           entry->token, entry->value? entry->value:"");
         dbg(3, "node_hash_lookup(): hashing %s in=%d out=%d inout=%d port=%d\n",
                     token, d.in, d.out, d.inout, d.port);
        }
    @@ -108,7 +108,7 @@ static Node_hashentry *node_hash_lookup(const char *token, const char *dir,int w
         if(value && value[0] !='\0')
           my_strdup(_ALLOC_ID_,  &(entry->value), value);
         dbg(3, "node_hash_lookup(): hashing %s : value=%s\n\n",
    -           entry->token, entry->value? entry->value:"NULL");
    +           entry->token, entry->value? entry->value:"");
         return entry;
        }
       }
    @@ -275,7 +275,7 @@ void print_vhdl_signals(FILE *fd)
               mult=1;
             }
             dbg(2, "print_vhdl_signals(): node: %s mult: %d value=%s \n\n",
    -              ptr->token,mult, ptr->value?ptr->value:"NULL");
    +              ptr->token,mult, ptr->value?ptr->value:"");
             if( ptr->class && ptr->class[0] )
               my_strdup(_ALLOC_ID_, &class, ptr->class);
             else
    @@ -334,7 +334,7 @@ void print_verilog_signals(FILE *fd)
              mult=1;
             }
             dbg(2, " print_verilog_signals(): node: %s mult: %d value=%s \n\n",
    -               ptr->token,mult, ptr->value?ptr->value:"NULL");
    +               ptr->token,mult, ptr->value?ptr->value:"");
             if(mult>1) {
               for(j=mult-1;j>=0;j--) {
                 if(ptr->verilog_type && ptr->verilog_type[0]) {
    diff --git a/src/options.c b/src/options.c
    index 84015594..e2872111 100644
    --- a/src/options.c
    +++ b/src/options.c
    @@ -61,11 +61,11 @@ static void check_opt(char *opt, char *optval, int type)
             cli_opt_do_print = 1;
     
         } else if( (type == LONG && !strcmp("plotfile", opt)) ) {
    -        dbg(1, "process_options(): user plotfile specified: %s\n", optval ? optval : "NULL");
    +        dbg(1, "process_options(): user plotfile specified: %s\n", optval ? optval : "");
             if(optval) my_strncpy(cli_opt_plotfile, optval, S(cli_opt_plotfile));
     
         } else if( (type == LONG && !strcmp("rcfile", opt)) ) {
    -        dbg(1, "process_options(): user rcfile specified: %s\n", optval ? optval : "NULL");
    +        dbg(1, "process_options(): user rcfile specified: %s\n", optval ? optval : "");
             if(optval) my_strncpy(cli_opt_rcfile, optval, S(cli_opt_rcfile));
     
         } else if( (type == LONG && !strcmp("png", opt)) ) {
    diff --git a/src/save.c b/src/save.c
    index 04b416db..24e38d02 100644
    --- a/src/save.c
    +++ b/src/save.c
    @@ -36,7 +36,7 @@ char **parse_cmd_string(const char *cmd, int *argc)
       static char *cmd_copy = NULL;
       static char *argv[PARSE_SIZE];
       char *cmd_ptr, *cmd_save;
    -  dbg(1, "parse_cmd_string(): cmd=|%s|\n", cmd ? cmd : "NULL");
    +  dbg(1, "parse_cmd_string(): cmd=|%s|\n", cmd ? cmd : "");
       if(!cmd || !cmd[0]) {
         if(cmd_copy) my_free(_ALLOC_ID_, &cmd_copy);
         return NULL;
    @@ -1009,7 +1009,7 @@ int raw_read(const char *f, Raw **rawptr, const char *type, double sweep1, doubl
         dbg(0, "raw_read(): must clear current raw file before loading new\n");
         return res;
       }
    -  dbg(1, "raw_read(): type=%s\n", type ? type : "NULL");
    +  dbg(1, "raw_read(): type=%s\n", type ? type : "");
       *rawptr = my_calloc(_ALLOC_ID_, 1, sizeof(Raw));
       raw = *rawptr;
       raw->level = -1; 
    @@ -1033,7 +1033,7 @@ int raw_read(const char *f, Raw **rawptr, const char *type, double sweep1, doubl
           }
           dbg(0, "Raw file data read: %s\n", f);
           dbg(0, "points=%d, vars=%d, datasets=%d sim_type=%s\n", 
    -             raw->allpoints, raw->nvars, raw->datasets, raw->sim_type ? raw->sim_type : "NULL");
    +             raw->allpoints, raw->nvars, raw->datasets, raw->sim_type ? raw->sim_type : "");
         } else {
           /* free_rawfile(rawptr, 0); */ /* do not free: already done in read_dataset()->extra_rawfile() */
           dbg(0, "raw_read(): no useful data found\n");
    @@ -1179,7 +1179,7 @@ int extra_rawfile(int what, const char *file, const char *type, double sweep1, d
       if(type && !type[0]) type = NULL; /* empty string as type will be considered NULL */
     
       dbg(1, "extra_rawfile(): what=%d, file=%s, type=%s\n",
    -      what, file ? file : "NULL", type ? type : "NULL");
    +      what, file ? file : "", type ? type : "");
       if(what == 0) return 0;
       /* if not already done insert base raw file (if there is one) into xctx->extra_raw_arr[0] */
       if(xctx->raw && xctx->extra_raw_n == 0) {
    @@ -1242,7 +1242,7 @@ int extra_rawfile(int what, const char *file, const char *type, double sweep1, d
           read_ret = raw_read(f, &xctx->raw, type, sweep1, sweep2);
           if(read_ret) {
             dbg(1, "extra_rawfile(): read %s %s, switch to it. raw->sim_type=%s\n", f,
    -          type ? type : "NULL", xctx->raw->sim_type ? xctx->raw->sim_type : "NULL");
    +          type ? type : "", xctx->raw->sim_type ? xctx->raw->sim_type : "");
             xctx->extra_raw_arr[xctx->extra_raw_n] = xctx->raw;
             xctx->extra_prev_idx = xctx->extra_idx;
             xctx->extra_idx = xctx->extra_raw_n;
    @@ -1359,7 +1359,7 @@ int extra_rawfile(int what, const char *file, const char *type, double sweep1, d
           Tcl_AppendResult(interp, my_itoa(xctx->extra_idx), " current\n", NULL);
           for(i = 0; i < xctx->extra_raw_n; i++) {
             Tcl_AppendResult(interp, my_itoa(i), " ", xctx->extra_raw_arr[i]->rawfile, " ", 
    -            xctx->extra_raw_arr[i]->sim_type ? xctx->extra_raw_arr[i]->sim_type : "NULL", "\n",  NULL);
    +            xctx->extra_raw_arr[i]->sim_type ? xctx->extra_raw_arr[i]->sim_type : "", "\n",  NULL);
           }
         }
       } else {
    @@ -3322,11 +3322,12 @@ int save_schematic(const char *schname) /* 20171020 added return value */
       xRect *rect;
       int rects;
       char msg[PATH_MAX + 100];
    +  int same_name = 0;
     
       if(!schname || !strcmp(schname, "")) return 0;
     
       dbg(1, "save_schematic(): currsch=%d schname=%s\n",xctx->currsch, schname);
    -  dbg(1, "save_schematic(): sch[currsch]=%s\n", xctx->sch[xctx->currsch] ? xctx->sch[xctx->currsch] : "NULL");
    +  dbg(1, "save_schematic(): sch[currsch]=%s\n", xctx->sch[xctx->currsch] ? xctx->sch[xctx->currsch] : "");
     
       if(!xctx->sch[xctx->currsch]) { /* no current schematic name -> assign new name */
         my_strdup2(_ALLOC_ID_, &xctx->sch[xctx->currsch], schname);
    @@ -3337,6 +3338,7 @@ int save_schematic(const char *schname) /* 20171020 added return value */
         set_modify(-1); /* set title to new filename */
       }
       else { /* user asks to save to same filename */
    +    same_name = 1;
         if(!stat(xctx->sch[xctx->currsch], &buf)) {
           if(xctx->time_last_modify && xctx->time_last_modify != buf.st_mtime) {
             tclvareval("ask_save_optional \"Schematic file: ", xctx->sch[xctx->currsch],
    @@ -3372,7 +3374,8 @@ int save_schematic(const char *schname) /* 20171020 added return value */
        * xctx->prep_hash_wires=0;
        */
       if(!strstr(xctx->sch[xctx->currsch], ".xschem_embedded_")) {
    -     set_modify(0);
    +     if(same_name) set_modify(2); /* clear only modified flag, do not set window title etc */
    +     else set_modify(0);
       }
       tclvareval(xctx->top_path, ".menubar entryconfigure Simulate -background $simulate_bg", NULL);
       tclvareval("set tctx::", xctx->current_win_path, "_simulate $simulate_bg", NULL);
    @@ -3839,7 +3842,7 @@ static void get_sym_type(const char *symname, char **type,
         }
       }
       if( !found ) {
    -    dbg(1, "get_sym_type(): open file %s, pintable %s\n",name, pintable ? "set" : "null");
    +    dbg(1, "get_sym_type(): open file %s, pintable %s\n",name, pintable ? "set" : "");
         /* ... if not found open file and look for 'type' into the global attributes. */
     
         if(embed_fd) fd = embed_fd;
    @@ -4656,7 +4659,7 @@ int load_sym_def(const char *name, FILE *embed_fd)
            my_snprintf(lay, S(lay), " layer=%d", WIRELAYER);
            my_strcat(_ALLOC_ID_, &tt[i].prop_ptr, lay);
          }
    -     dbg(1, "l_s_d(): loaded text : t=%s p=%s\n", tt[i].txt_ptr, tt[i].prop_ptr ? tt[i].prop_ptr : "NULL");
    +     dbg(1, "l_s_d(): loaded text : t=%s p=%s\n", tt[i].txt_ptr, tt[i].prop_ptr ? tt[i].prop_ptr : "");
          set_text_flags(&tt[i]);
          ++lastt;
          break;
    diff --git a/src/scheduler.c b/src/scheduler.c
    index a6ce89de..ea7d1a69 100644
    --- a/src/scheduler.c
    +++ b/src/scheduler.c
    @@ -5179,8 +5179,16 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
           my_free(_ALLOC_ID_, &s);
         }
     
    -    /* set_modify
    -     *   Force modify status on current schematic */
    +    /* set_modify [n]
    +     *   Force modify status on current schematic
    +     *   integer 'n':
    +     *   0 : clear modified flag, update title and tab names, upd. simulation button colors.
    +     *   1 : set modified flag, update title and tab names, upd. simulation button colors, rst floater caches.
    +     *   2 : clear modified flag, do nothing else.
    +     *   3 : set modified flag, do nothing else.
    +     *  -1 : set title, rst floater caches.
    +     *  -2 : rst floater caches, update simulation button colors (Simulate, Waves, Netlist).
    +     */
         else if(!strcmp(argv[1], "set_modify"))
         {
           if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
    @@ -5533,7 +5541,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
           char *s=NULL;
           if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
           if(argc < 5) {Tcl_SetResult(interp, "Missing arguments", TCL_STATIC);return TCL_ERROR;}
    -      my_strdup(_ALLOC_ID_, &s, subst_token(argv[2], argv[3], strcmp(argv[4], "NULL") ? argv[4] : NULL));
    +      my_strdup(_ALLOC_ID_, &s, subst_token(argv[2], argv[3], strcmp(argv[4], "") ? argv[4] : NULL));
           Tcl_SetResult(interp, s, TCL_VOLATILE);
           my_free(_ALLOC_ID_, &s);
         }
    diff --git a/src/select.c b/src/select.c
    index e08d58ed..bf8f3c92 100644
    --- a/src/select.c
    +++ b/src/select.c
    @@ -360,7 +360,7 @@ void symbol_bbox(int i, double *x1,double *y1, double *x2, double *y2)
          if(!xctx->show_hidden_texts && (text.flags & (HIDE_TEXT | HIDE_TEXT_INSTANTIATED))) continue;
          sym_flip = flip;
          sym_rot = rot;
    -     dbg(1, "symbol_bbox(): instance %d text n: %d text str=%s\n", i,j, text.txt_ptr? text.txt_ptr:"NULL");
    +     dbg(1, "symbol_bbox(): instance %d text n: %d text str=%s\n", i,j, text.txt_ptr? text.txt_ptr:"");
          tmp_txt = translate(i, text.txt_ptr);
          dbg(1, "symbol_bbox(): translated text: %s\n", tmp_txt);
          ROTATION(rot, flip, 0.0,0.0,text.x0, text.y0,text_x0,text_y0);
    @@ -904,7 +904,7 @@ void select_wire(int i,unsigned short select_mode, int fast)
       {
         my_snprintf(str, S(str), "Info: selected wire: n=%d end1=%d end2=%d\nnode=%s",i,
                xctx->wire[i].end1, xctx->wire[i].end2,
    -           xctx->wire[i].prop_ptr? xctx->wire[i].prop_ptr: "(null)");
    +           xctx->wire[i].prop_ptr? xctx->wire[i].prop_ptr: "");
         statusmsg(str,3);
         tcleval("infowindow");
     
    diff --git a/src/spice_netlist.c b/src/spice_netlist.c
    index 169318f1..fe1ebb1b 100644
    --- a/src/spice_netlist.c
    +++ b/src/spice_netlist.c
    @@ -366,7 +366,7 @@ int global_spice_netlist(int global)  /* netlister driver */
          int n = pinnumber_list[i].n;
          str_tmp = expandlabel ( (xctx->inst[n].lab ? xctx->inst[n].lab : ""), &multip);
          /*must handle  invalid node names */
    -     fprintf(fd, " %s", str_tmp ? str_tmp : "(NULL)" );
    +     fprintf(fd, " %s", str_tmp ? str_tmp : "" );
        }
      }
      my_free(_ALLOC_ID_, &pinnumber_list);
    diff --git a/src/token.c b/src/token.c
    index 8a9bb0b7..f41c01e7 100644
    --- a/src/token.c
    +++ b/src/token.c
    @@ -408,8 +408,8 @@ static void get_pin_and_attr(const char *token, char **pin_num_or_name, char **p
         my_strdup2(_ALLOC_ID_, pin_attr, "");
       }
       dbg(1, "get_pin_and_attr(): token=%s, name=%s, attr=%s\n", token,
    -      *pin_num_or_name ? *pin_num_or_name : "NULL", 
    -      *pin_attr ? *pin_attr: "NULL");
    +      *pin_num_or_name ? *pin_num_or_name : "", 
    +      *pin_attr ? *pin_attr: "");
     }
     
     /* state machine that parses a string made up of = ... */
    @@ -544,7 +544,7 @@ const char *get_sym_template(char *s,char *extra)
     /* 2: eat backslashes */
     /* 3: 1+2  :) */
     
    - dbg(1, "get_sym_template(): s=%s, extra=%s\n", s ? s : "NULL", extra ? extra : "NULL");
    + dbg(1, "get_sym_template(): s=%s, extra=%s\n", s ? s : "", extra ? extra : "");
      if(s==NULL) {
        my_free(_ALLOC_ID_, &result);
        return "";
    @@ -683,7 +683,7 @@ void hash_names(int inst, int action)
         stop = inst + 1;
       }
       if(inst != -1) dbg(1, "hash_names(): start=%d, stop=%d, instname=%s\n",
    -        start, stop, xctx->inst[inst].instname? xctx->inst[inst].instname : "NULL");
    +        start, stop, xctx->inst[inst].instname? xctx->inst[inst].instname : "");
       for(i = start; i < stop; ++i) {
         if(xctx->inst[i].instname && xctx->inst[i].instname[0]) {
           my_strdup(_ALLOC_ID_, &upinst, expandlabel(xctx->inst[i].instname, &xmult));
    @@ -1904,8 +1904,8 @@ static int has_included_subcircuit(int inst, int symbol, char **result)
               pin_expanded_ptr = pin_expanded;
               while((pin = my_strtok_r(pin_expanded_ptr, ",", "", 0, &pin_save))) {
                 net = my_strtok_r(net_expanded_ptr, ",", "", 0, &net_save);
    -            str_hash_lookup(&table, pin, net ? net : "NULL", XINSERT_NOREPLACE);
    -            dbg(1, "inserting pin: %s, net: %s\n", pin, net ? net : "NULL");
    +            str_hash_lookup(&table, pin, net ? net : "", XINSERT_NOREPLACE);
    +            dbg(1, "inserting pin: %s, net: %s\n", pin, net ? net : "");
                 pin_expanded_ptr = NULL;
                 net_expanded_ptr = NULL;
               }
    @@ -3693,7 +3693,7 @@ const char *translate(int inst, const char* s)
      my_realloc(_ALLOC_ID_, &result,size);
      result[0]='\0';
     
    - dbg(1, "translate(): substituting props in <%s>, instance <%s>\n", s ? s : "NULL" , instname);
    + dbg(1, "translate(): substituting props in <%s>, instance <%s>\n", s ? s : "" , instname);
     
      while(1)
      {
    diff --git a/src/verilog_netlist.c b/src/verilog_netlist.c
    index 8fa681ed..2a66227c 100644
    --- a/src/verilog_netlist.c
    +++ b/src/verilog_netlist.c
    @@ -140,7 +140,7 @@ int global_verilog_netlist(int global)  /* netlister driver */
           str_tmp = get_tok_value( (xctx->inst[i].ptr+ xctx->sym)->prop_ptr, "verilog_format", 2);
     
        my_strdup(_ALLOC_ID_, &tmp_string, str_tmp);
    -   fprintf(fd, "%s\n", str_tmp ? translate(i, tmp_string) : "(NULL)");
    +   fprintf(fd, "%s\n", str_tmp ? translate(i, tmp_string) : "");
       }
      }
     
    @@ -168,7 +168,7 @@ int global_verilog_netlist(int global)  /* netlister driver */
        if(tmp) fprintf(fd, " ,\n");
        ++tmp;
        str_tmp = xctx->inst[i].lab ? xctx->inst[i].lab : "";
    -   fprintf(fd, "  %s", str_tmp ? str_tmp : "(NULL)");
    +   fprintf(fd, "  %s", str_tmp ? str_tmp : "");
       }
      }
     
    @@ -182,7 +182,7 @@ int global_verilog_netlist(int global)  /* netlister driver */
        if(tmp) fprintf(fd, " ,\n");
        ++tmp;
        str_tmp = xctx->inst[i].lab ? xctx->inst[i].lab : "";
    -   fprintf(fd, "  %s", str_tmp ? str_tmp : "(NULL)");
    +   fprintf(fd, "  %s", str_tmp ? str_tmp : "");
       }
      }
     
    @@ -225,8 +225,8 @@ int global_verilog_netlist(int global)  /* netlister driver */
        my_strdup(_ALLOC_ID_, &sig_type,get_tok_value(xctx->inst[i].prop_ptr,"verilog_type",0));
        if(!sig_type || sig_type[0]=='\0') my_strdup(_ALLOC_ID_, &sig_type,"wire"); /* 20070720 changed reg to wire */
        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)");
    +   fprintf(fd, "  output %s ;\n", str_tmp ? str_tmp : "");
    +   fprintf(fd, "  %s %s ", sig_type, str_tmp ? str_tmp : "");
     
        if(port_value && port_value[0]) fprintf(fd," = %s", port_value);
        fprintf(fd, ";\n");
    @@ -244,8 +244,8 @@ int global_verilog_netlist(int global)  /* netlister driver */
        my_strdup(_ALLOC_ID_, &sig_type,get_tok_value(xctx->inst[i].prop_ptr,"verilog_type",0));
        if(!sig_type || sig_type[0]=='\0') my_strdup(_ALLOC_ID_, &sig_type,"wire");
        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)");
    +   fprintf(fd, "  inout %s ;\n", str_tmp ? str_tmp : "");
    +   fprintf(fd, "  %s %s ", sig_type, str_tmp ? str_tmp : "");
     
        if(port_value && port_value[0]) fprintf(fd," = %s", port_value);
        fprintf(fd, ";\n");
    @@ -483,7 +483,7 @@ int verilog_block_netlist(FILE *fd, int i)
           if(!xctx->tok_size && strcmp(fmt_attr, "verilog_format")) 
              str_tmp = get_tok_value( (xctx->inst[j].ptr+ xctx->sym)->prop_ptr, "verilog_format", 2);
           my_strdup(_ALLOC_ID_, &tmp_string, str_tmp);
    -      fprintf(fd, "%s\n", str_tmp ? translate(j, tmp_string) : "(NULL)");
    +      fprintf(fd, "%s\n", str_tmp ? translate(j, tmp_string) : "");
          }
         }
      
    diff --git a/src/vhdl_netlist.c b/src/vhdl_netlist.c
    index c3845d94..ad54345d 100644
    --- a/src/vhdl_netlist.c
    +++ b/src/vhdl_netlist.c
    @@ -218,7 +218,7 @@ int global_vhdl_netlist(int global)  /* netlister driver */
      /*   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 ); */
    + /*   fprintf(fd, "  %s : %s", str_tmp ? str_tmp : "", sig_type ); */
      /*   if(port_value &&port_value[0]) */
      /*      fprintf(fd," := %s", port_value); */
      /* */
    @@ -243,7 +243,7 @@ int global_vhdl_netlist(int global)  /* netlister driver */
        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 );
    +   fprintf(fd, "  %s : out %s", str_tmp ? str_tmp : "", sig_type );
        tmp=1;
       }
      }
    @@ -260,7 +260,7 @@ int global_vhdl_netlist(int global)  /* netlister driver */
        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 );
    +   fprintf(fd, "  %s : inout %s", str_tmp ? str_tmp : "", sig_type );
        tmp=1;
       }
      }
    diff --git a/src/xinit.c b/src/xinit.c
    index 604d7086..bb4d5b6e 100644
    --- a/src/xinit.c
    +++ b/src/xinit.c
    @@ -1202,7 +1202,7 @@ int preview_window(const char *what, const char *win_path, const char *fname)
       if(semaphore) return 0;
       ++semaphore;
       dbg(1, "preview_window(): what=%s, win_path=%s, fname=%s\n", 
    -     what, win_path ? win_path : "NULL", fname ? fname : "NULL");
    +     what, win_path ? win_path : "", fname ? fname : "");
       dbg(1, "------\n");
       tclvareval("save_ctx ", xctx->current_win_path, NULL);
       if(!strcmp(what, "create") && last_preview < 4) {
    @@ -2579,7 +2579,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
     
      dbg(1, "Tcl_AppInit(): XSCHEM_SHAREDIR=%s  XSCHEM_LIBRARY_PATH=%s\n",
            tclgetvar("XSCHEM_SHAREDIR"),
    -       tclgetvar("XSCHEM_LIBRARY_PATH") ? tclgetvar("XSCHEM_LIBRARY_PATH") : "NULL"
    +       tclgetvar("XSCHEM_LIBRARY_PATH") ? tclgetvar("XSCHEM_LIBRARY_PATH") : ""
      );
      dbg(1, "Tcl_AppInit(): done step a of xinit()\n");
     
    @@ -2917,7 +2917,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
        #ifndef __unix__
        change_to_unix_fn(tmp);
        #endif
    -   dbg(1, "Tcl_AppInit(): tmp=%s\n", tmp? tmp: "NULL");
    +   dbg(1, "Tcl_AppInit(): tmp=%s\n", tmp? tmp: "");
        if(0 && cli_argc > 1)  /* disabled */
          my_strncpy(fname, "", S(fname)); /* no load XSCHEM_START_WINDOW if cli args given */
        else
    diff --git a/src/xschem.tcl b/src/xschem.tcl
    index 25e6b615..8d0b32e5 100644
    --- a/src/xschem.tcl
    +++ b/src/xschem.tcl
    @@ -1770,25 +1770,34 @@ proc simconf_add {tool} {
     ############ cellview
     # this proc prints symbol bindings (default binding or "schematic" attr in symbol)
     # of all symbols used in current and sub schematics.
    -proc cellview_setlabels {w sch} {
    -  if {[$w get] ne $sch} {
    -    if { [file exists [abs_sym_path [$w get]]] } {
    -      $w configure -bg green
    -    } else {
    -      # puts "$sch --- [$sf.f$i.s get]"
    -      $w configure -bg red
    -    }
    +proc cellview_setlabels {w sym_sch default_sch sym_spice_sym_def} {
    +  global dark_gui_colorscheme
    +  if {$dark_gui_colorscheme} {
    +    set symfg SeaGreen1
    +    set symbg SeaGreen4
    +    set missingbg IndianRed4
    +  } else { 
    +    set symfg SeaGreen4
    +    set symbg SeaGreen1
    +    set missingbg IndianRed1 
    +  }     
    +  $w configure -fg [option get . foreground {}]
    +  $w configure -bg [option get . background {}]
    +  if { $sym_spice_sym_def ne {}} {
    +    $w configure -fg $symfg
    +  } elseif { ![file exists [abs_sym_path [$w get]]] } {
    +    $w configure -bg $missingbg
       } else {
    -    if { [file exists [abs_sym_path [$w get]]] } {
    -      $w configure -bg [option get . background {}]
    -    } else {
    -      $w configure -bg red
    +    if {[$w get] eq $default_sch} {
    +      # ....
    +    } elseif {[$w get] eq $sym_sch} {
    +      $w configure -bg $symbg
         }
       }
     }
     
     proc cellview {} {
    -  global keep_symbols
    +  global keep_symbols nolist_libs
     
       if {[info tclversion] >= 8.5} {
         set font {TkDefaultFont 10 bold} ;# Monospace
    @@ -1813,42 +1822,46 @@ proc cellview {} {
       set sf [sframe .cv.center]
       # puts sf=$sf
       set syms [join [lsort -index 1 [xschem symbols]]]
    -  foreach {i sym} $syms {
    -    set abs_sch [xschem get_sch_from_sym -1 $sym]
    -    set sch [rel_sym_path $abs_sch]
    -    set default_sch [add_ext $sym .sch]
    -    set type [xschem getprop symbol $sym type]
    -    set spice_sym_def [xschem getprop symbol $sym spice_sym_def]
    +  foreach {i symbol} $syms {
    +    set abs_sch [xschem get_sch_from_sym -1 $symbol]
    +    set abs_sym [abs_sym_path $symbol]
    +    set default_sch [add_ext $symbol .sch]
    +    set skip 0
    +    foreach j $nolist_libs {
    +      if {[regexp $j $abs_sym]} { 
    +        set skip 1
    +        break
    +      }
    +    }
    +    if {$skip} { continue }
    +    set sym_sch [rel_sym_path $abs_sch]
    +    set default_sch [add_ext $symbol .sch]
    +    set type [xschem getprop symbol $symbol type]
    +    set sym_spice_sym_def [xschem getprop symbol $symbol spice_sym_def]
         if {$type eq {subcircuit}} {
           frame $sf.f$i
           pack $sf.f$i -side top -fill x
    -      label  $sf.f$i.l -text $sym -width 20 -anchor w -padx 4 -borderwidth 1 \
    +      label  $sf.f$i.l -text $symbol -width 20 -anchor w -padx 4 -borderwidth 1 \
             -relief sunken -pady 1 -font $font
           # puts $sf.f$i.s
           entry $sf.f$i.s -width 50 -borderwidth 1 -relief sunken -font $font
    -      if { $spice_sym_def eq {}} {
    -        if {![file exists $abs_sch]} {
    -          $sf.f$i.s configure -bg red
    -        } elseif {$default_sch ne $sch} {
    -          $sf.f$i.s configure -bg green
    -        }
    -      } else {
    -        $sf.f$i.s configure -fg red
    -      }
           balloon $sf.f$i.s $abs_sch
           button $sf.f$i.b -text Sch -padx 4 -borderwidth 1 -pady 0 -font $font \
                  -command "
    -                if { [list $spice_sym_def] eq {}} {
    +                if { [list $sym_spice_sym_def] eq {}} {
                       xschem load_new_window \[$sf.f$i.s get\]
                     } else {
    -                  editdata [list $spice_sym_def] {Symbol spice_sym_def attribute}
    +                  editdata [list $sym_spice_sym_def] {Symbol spice_sym_def attribute}
                     }"
    -      if {$spice_sym_def eq {}} {
    -        $sf.f$i.s insert 0 $sch
    +      if {$sym_spice_sym_def eq {}} {
    +        $sf.f$i.s insert 0 $sym_sch
           } else {
             $sf.f$i.s insert 0 {defined in symbol spice_sym_def}
           }
    -      bind $sf.f$i.s  "cellview_setlabels %W [list $sch]"
    +      bind $sf.f$i.s  "
    +        cellview_setlabels %W [list $sym_sch] [list $default_sch] [list $sym_spice_sym_def]
    +      "
    +      cellview_setlabels $sf.f$i.s $sym_sch $default_sch $sym_spice_sym_def
           pack $sf.f$i.l $sf.f$i.s -side left -fill x -expand 1
           pack $sf.f$i.b -side left
         }
    @@ -1871,59 +1884,64 @@ proc cellview {} {
     ############ /cellview
     
     ############ traversal
    -proc traversal_setlabels {w parent_sch sch instname default_sch inst_spice_sym_def sym_spice_sym_def} {
    -  global traversal_cnt
    +proc traversal_setlabels {w parent_sch instname inst_sch sym_sch default_sch inst_spice_sym_def sym_spice_sym_def} {
    +  global traversal_cnt dark_gui_colorscheme
       set sf .trav.center.f.scrl
    -  # puts "traversal_setlabels $w $parent_sch $sch $instname"
    +  # puts "traversal_setlabels $w $parent_sch $inst_sch $instname"
     
       # update schematic
       if {$parent_sch ne {}} {
         set current [xschem get current_name]
    -    puts "traversal_update_schematic: $w parent: $parent_sch $instname def: $default_sch $sch --> [$w get]"
    -    if { $sch ne [$w get] } {
    +    puts "traversal_update_schematic: $w parent: $parent_sch $instname def: $sym_sch $inst_sch --> [$w get]"
    +    if { $inst_sch ne [$w get] } {
           puts "update attr"
           xschem load $parent_sch noundoreset nodraw
    -      set sch [xschem getprop instance $instname schematic]
    -      if { $sch ne [$w get]} {
    -        if { [$w get] eq  $default_sch} {
    -          xschem setprop instance $instname schematic fast ;# remove schematic attr on instance
    -        } else {
    -          xschem setprop instance $instname schematic [$w get] fast ;# set schematic attr on instance
    -        } 
    -        xschem set_modify 1
    -        xschem save
    -        set sch [$w get]
    -        puts "sch set to: $sch"
    -      }
    +      if { [$w get] eq  $sym_sch} {
    +        xschem setprop instance $instname schematic fast ;# remove schematic attr on instance
    +      } else {
    +        xschem setprop instance $instname schematic [$w get] fast ;# set schematic attr on instance
    +      } 
    +      xschem set_modify 3 ;# set only modified flag to force a save, do not update window/tab titles
    +      xschem save
    +      set inst_sch [$w get]
    +      puts "inst_sch set to: $inst_sch"
           xschem load $current  noundoreset nodraw
       
           bind $w  "
    -        traversal_setlabels $w [list $parent_sch] [list $sch] [list $instname] [list $default_sch] \
    -                            [list $inst_spice_sym_def] [list $sym_spice_sym_def]
    +        traversal_setlabels $w [list $parent_sch] [list $instname] [list $inst_sch] [list $sym_sch] \
    +                               [list $default_sch] [list $inst_spice_sym_def] [list $sym_spice_sym_def]
           "
         }
       }
       # /update schematic
    -
    -  if {[$w get] ne $default_sch} {
    -    if { $sym_spice_sym_def ne {}} {
    -      $w configure -fg green
    -      $w configure -bg [option get . background {}]
    -    } elseif {$inst_spice_sym_def ne {}} {
    -      $w configure -fg red
    -      $w configure -bg [option get . background {}]
    -    } elseif { [file exists [abs_sym_path [$w get]]] } {
    -      $w configure -fg [option get . foreground {}]
    -      $w configure -bg green
    -    } else {
    -      $w configure -fg [option get . foreground {}]
    -      $w configure -bg red
    -    }
    +  if {$dark_gui_colorscheme} {
    +    set instfg orange1
    +    set symfg SeaGreen1
    +    set instbg orange4
    +    set symbg SeaGreen4
    +    set missingbg IndianRed4
       } else {
    -    if { [file exists [abs_sym_path [$w get]]] } {
    -      $w configure -bg [option get . background {}]
    -    } else {
    -      $w configure -bg red
    +    set instfg orange4
    +    set symfg SeaGreen4
    +    set instbg Orange1
    +    set symbg SeaGreen1
    +    set missingbg IndianRed1
    +  }
    +  $w configure -fg [option get . foreground {}]
    +  $w configure -bg [option get . background {}]
    +  if { $sym_spice_sym_def ne {}} {
    +    $w configure -fg $symfg
    +  } elseif {$inst_spice_sym_def ne {}} {
    +    $w configure -fg $instfg
    +  } elseif { ![file exists [abs_sym_path [$w get]]] } {
    +    $w configure -bg $missingbg
    +  } else {
    +    if {[$w get] eq $default_sch} {
    +      # ....
    +    } elseif {[$w get] eq $sym_sch} {
    +      $w configure -bg $symbg
    +    } elseif {[$w get] eq $inst_sch} {
    +      $w configure -bg $instbg
         }
       }
     }
    @@ -1996,12 +2014,13 @@ proc hier_traversal {{level 0} {only_subckts 0} {all_hierarchy 1}} {
         set instname [xschem getprop instance $i name]
         set symbol [xschem getprop instance $i cell::name]
         set default_sch [add_ext $symbol .sch]
    +    set sym_sch [rel_sym_path [xschem get_sch_from_sym -1 $symbol]]
         set abs_symbol [abs_sym_path $symbol]
         set type [xschem getprop symbol $symbol type]
         set schematic [xschem get_sch_from_sym $i]
         set sch_exists [expr {[file exists $schematic] ? {} : {**missing**}}]
    -    set sch_tail [rel_sym_path $schematic]
    -    set sch_rootname [file tail [file rootname $sch_tail]]
    +    set inst_sch [rel_sym_path $schematic]
    +    set sch_rootname [file tail [file rootname $inst_sch]]
         set inst_spice_sym_def [xschem getprop instance $i spice_sym_def]
         set sym_spice_sym_def [xschem getprop instance $i cell::spice_sym_def]
         if {$only_subckts && ($type ne {subcircuit})} { continue }
    @@ -2032,7 +2051,7 @@ proc hier_traversal {{level 0} {only_subckts 0} {all_hierarchy 1}} {
           } elseif {$sym_spice_sym_def ne {}} {
             $sf.f$traversal_cnt.s insert 0 "$sch_rootname defined in symbol spice_sym_def"
           } else {
    -        $sf.f$traversal_cnt.s insert 0 "$sch_tail"
    +        $sf.f$traversal_cnt.s insert 0 "$inst_sch"
           }
         }
         button $sf.f$traversal_cnt.bsym -text {Sym} -padx 4 -borderwidth 1 -pady 0 -font $font \
    @@ -2050,12 +2069,12 @@ proc hier_traversal {{level 0} {only_subckts 0} {all_hierarchy 1}} {
                   }"
         if { $sym_spice_sym_def eq {} && $inst_spice_sym_def eq {}} {
           bind $sf.f$traversal_cnt.s  "
    -        traversal_setlabels %W [list $parent_sch] [list $sch_tail] [list $instname] [list $default_sch] \
    -                            [list $inst_spice_sym_def] [list $sym_spice_sym_def]
    +        traversal_setlabels %W [list $parent_sch] [list $instname] [list $inst_sch] [list $sym_sch] \
    +                               [list $default_sch] [list $inst_spice_sym_def] [list $sym_spice_sym_def]
           "
         }
    -    traversal_setlabels $sf.f$traversal_cnt.s {} $sch_tail $instname $default_sch \
    -                        $inst_spice_sym_def $sym_spice_sym_def
    +    traversal_setlabels $sf.f$traversal_cnt.s {} $instname $inst_sch $sym_sch \
    +                        $default_sch $inst_spice_sym_def $sym_spice_sym_def
         pack $sf.f$traversal_cnt.i -side left -fill x -expand 1
         pack $sf.f$traversal_cnt.l $sf.f$traversal_cnt.s -side left -fill x
         pack $sf.f$traversal_cnt.bsym $sf.f$traversal_cnt.bsch -side left
    @@ -8861,6 +8880,19 @@ if {$text_replace_selection && $OS != "Windows"} {
       }
     }
     
    +## allow to unpost menu entries when clicking a posted menu
    +
    +if { [info tclversion] >= 8.6 } {
    +  bind Menu