Hello community,

here is the log from the commit of package gtkwave for openSUSE:Factory checked 
in at 2020-02-25 16:04:57
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gtkwave (Old)
 and      /work/SRC/openSUSE:Factory/.gtkwave.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gtkwave"

Tue Feb 25 16:04:57 2020 rev:31 rq:778806 version:3.3.104

Changes:
--------
--- /work/SRC/openSUSE:Factory/gtkwave/gtkwave.changes  2019-08-28 
18:35:54.769279212 +0200
+++ /work/SRC/openSUSE:Factory/.gtkwave.new.26092/gtkwave.changes       
2020-02-25 16:05:29.240411499 +0100
@@ -1,0 +2,18 @@
+Mon Feb 24 08:44:00 UTC 2020 - Paolo Stivanin <[email protected]>
+
+- Update to 3.3.104: 
+  * Remove redundant TREE_VHDL_ST_PACKAGE from SST exclude.
+  * Added addCommentTracesFromList tcl command from user patch.
+  * Harden savefile loader for missing group start on vectors.
+  * Preliminary VHDL support for wlf2vcd.
+  * Add missing return value checks on mmap() in FST writer.
+  * Fix MAP_FAILED missing for MinGW.
+  * Fix to make the coloration red on 'u' traces.  (Bug from
+  * Dinotrace-like rendering in 3.3.96.)
+  * Typo fix on missing group start on vectors.
+  * Added support for loading .vf files
+  * Added support for dumping variable types in vcd saveer,
+    not just using "wire" for non-reals/strings.
+  * Fix for uninitialized values at time 0 for FST, FSDB loaders.
+
+-------------------------------------------------------------------

Old:
----
  gtkwave-3.3.101.tar.gz

New:
----
  gtkwave-3.3.104.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gtkwave.spec ++++++
--- /var/tmp/diff_new_pack.or9Lfv/_old  2020-02-25 16:05:30.092411439 +0100
+++ /var/tmp/diff_new_pack.or9Lfv/_new  2020-02-25 16:05:30.096411439 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package gtkwave
 #
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -12,17 +12,17 @@
 # license that conforms to the Open Source Definition (Version 1.9)
 # published by the Open Source Initiative.
 
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
 
 Name:           gtkwave
-Version:        3.3.101
+Version:        3.3.104
 Release:        0
 Summary:        Waveform viewer for Ditital Signals
-License:        GPL-2.0+
+License:        GPL-2.0-or-later
 Group:          Productivity/Scientific/Electronics
-Url:            http://gtkwave.sourceforge.net/
+URL:            http://gtkwave.sourceforge.net/
 Source0:        
http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
 BuildRequires:  fdupes
 BuildRequires:  flex

++++++ gtkwave-3.3.101.tar.gz -> gtkwave-3.3.104.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/AUTHORS new/gtkwave-3.3.104/AUTHORS
--- old/gtkwave-3.3.101/AUTHORS 2019-05-23 05:15:27.000000000 +0200
+++ new/gtkwave-3.3.104/AUTHORS 2020-02-14 06:07:29.000000000 +0100
@@ -1,13 +1,13 @@
-GTKWave Wave Viewer is Copyright (C) 1999-2019 Tony Bybell.
-Windows compatibility and PS/MIF routines are Copyright (C) 1999-2019 Udi 
Finkelstein.
-Context support is Copyright (C) 2007-2019 Kermin Elliott Fleming.
-Trace group support is  Copyright (C) 2009-2019 Donald Baltus.
-GHW and additional GUI support is Copyright (C) 2005-2019 Tristan Gingold.
-Analog support is Copyright (C) 2005-2019 Thomas Sailer.
-External DnD support is Copyright (C) 2008-2019 Concept Engineering GmbH.
-FastLZ is Copyright (C) 2005-2019 Ariya Hidayat.
+GTKWave Wave Viewer is Copyright (C) 1999-2020 Tony Bybell.
+Windows compatibility and PS/MIF routines are Copyright (C) 1999-2020 Udi 
Finkelstein.
+Context support is Copyright (C) 2007-2020 Kermin Elliott Fleming.
+Trace group support is  Copyright (C) 2009-2020 Donald Baltus.
+GHW and additional GUI support is Copyright (C) 2005-2020 Tristan Gingold.
+Analog support is Copyright (C) 2005-2020 Thomas Sailer.
+External DnD support is Copyright (C) 2008-2020 Concept Engineering GmbH.
+FastLZ is Copyright (C) 2005-2020 Ariya Hidayat.
 Some public domain clip art by contributors at http://www.sxc.hu/ website.
 Hierarchy marker icons from the Silk icons set by Mark James found at the 
http://www.famfamfam.com/lab/icons/silk/ website.
 Portions of the TCL implementation, tcl_np.c and tcl_np.h are copyrighted by 
the Regents of the University of California, Sun Microsystems, Inc., Scriptics 
Corporation, ActiveState Corporation, and other parties.
-NSAlert is Copyright (C) 2011-2019 Philipp Mayerhofer.
-LZ4 is Copyright (C) 2011-2019 Yann Collet.
+NSAlert is Copyright (C) 2011-2020 Philipp Mayerhofer.
+LZ4 is Copyright (C) 2011-2020 Yann Collet.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/ChangeLog 
new/gtkwave-3.3.104/ChangeLog
--- old/gtkwave-3.3.101/ChangeLog       2019-05-23 05:15:27.000000000 +0200
+++ new/gtkwave-3.3.104/ChangeLog       2020-02-14 06:07:29.000000000 +0100
@@ -1709,3 +1709,17 @@
                of 10 roundoff errors.
                 Remove register        keyword where applicable as is 
deprecated.
                Added --saveonexit gtkwave command line option.
+3.3.102        21sep19 Remove redundant TREE_VHDL_ST_PACKAGE from SST exclude.
+               Added addCommentTracesFromList tcl command from user patch.
+               Harden savefile loader for missing group start on vectors.
+               Preliminary VHDL support for wlf2vcd.
+               Add missing return value checks on mmap() in FST writer.
+3.3.103 03nov19 Fix MAP_FAILED missing for MinGW.
+                Fix to make the coloration red on 'u' traces.  (Bug from
+                Dinotrace-like rendering in 3.3.96.)
+                Typo fix on missing group start on vectors.
+3.3.104        24jan20 Added support for loading .vf files (provided FSDB 
reader
+               libraries are enabled).
+               Added support for dumping variable types in vcd saveer, not
+               just using "wire" for non-reals/strings.
+               Fix for uninitialized values at time 0 for FST, FSDB loaders.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/LICENSE.TXT 
new/gtkwave-3.3.104/LICENSE.TXT
--- old/gtkwave-3.3.101/LICENSE.TXT     2019-05-23 05:15:28.000000000 +0200
+++ new/gtkwave-3.3.104/LICENSE.TXT     2020-02-14 06:07:29.000000000 +0100
@@ -1,14 +1,14 @@
 ##########################################################################
 
-GTKWave 3.3.101 Wave Viewer is Copyright (C) 1999-2019 Tony Bybell.  
-Portions of GTKWave are Copyright (C) 1999-2019 Udi Finkelstein. 
-Context support is Copyright (C) 2007-2019 Kermin Elliott Fleming.
-Trace group support is  Copyright (C) 2009-2019 Donald Baltus.
-GHW and additional GUI support is Copyright (C) 2005-2019 Tristan Gingold.
-Analog support is Copyright (C) 2005-2019 Thomas Sailer.
-External DnD support is Copyright (C) 2008-2019 Concept Engineering GmbH.
-FastLZ is Copyright (C) 2005-2019 Ariya Hidayat.
-LZ4 is Copyright (C) 2011-2019 Yann Collet.
+GTKWave 3.3.104 Wave Viewer is Copyright (C) 1999-2020 Tony Bybell.  
+Portions of GTKWave are Copyright (C) 1999-2020 Udi Finkelstein. 
+Context support is Copyright (C) 2007-2020 Kermin Elliott Fleming.
+Trace group support is  Copyright (C) 2009-2020 Donald Baltus.
+GHW and additional GUI support is Copyright (C) 2005-2020 Tristan Gingold.
+Analog support is Copyright (C) 2005-2020 Thomas Sailer.
+External DnD support is Copyright (C) 2008-2020 Concept Engineering GmbH.
+FastLZ is Copyright (C) 2005-2020 Ariya Hidayat.
+LZ4 is Copyright (C) 2011-2020 Yann Collet.
 
 This program is free software; you can redistribute it and/or modify it
 under the terms of the GNU General Public License as published by the Free
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/configure 
new/gtkwave-3.3.104/configure
--- old/gtkwave-3.3.101/configure       2019-05-23 05:15:27.000000000 +0200
+++ new/gtkwave-3.3.104/configure       2020-02-14 06:07:29.000000000 +0100
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for gtkwave 3.3.101.
+# Generated by GNU Autoconf 2.69 for gtkwave 3.3.104.
 #
 # Report bugs to <[email protected]>.
 #
@@ -580,8 +580,8 @@
 # Identity of this package.
 PACKAGE_NAME='gtkwave'
 PACKAGE_TARNAME='gtkwave'
-PACKAGE_VERSION='3.3.101'
-PACKAGE_STRING='gtkwave 3.3.101'
+PACKAGE_VERSION='3.3.104'
+PACKAGE_STRING='gtkwave 3.3.104'
 PACKAGE_BUGREPORT='[email protected]'
 PACKAGE_URL=''
 
@@ -1405,7 +1405,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures gtkwave 3.3.101 to adapt to many kinds of systems.
+\`configure' configures gtkwave 3.3.104 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1471,7 +1471,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of gtkwave 3.3.101:";;
+     short | recursive ) echo "Configuration of gtkwave 3.3.104:";;
    esac
   cat <<\_ACEOF
 
@@ -1630,7 +1630,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-gtkwave configure 3.3.101
+gtkwave configure 3.3.104
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2274,7 +2274,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by gtkwave $as_me 3.3.101, which was
+It was created by gtkwave $as_me 3.3.104, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3141,7 +3141,7 @@
 
 # Define the identity of the package.
  PACKAGE='gtkwave'
- VERSION='3.3.101'
+ VERSION='3.3.104'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -11499,7 +11499,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by gtkwave $as_me 3.3.101, which was
+This file was extended by gtkwave $as_me 3.3.104, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -11565,7 +11565,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-gtkwave config.status 3.3.101
+gtkwave config.status 3.3.104
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/configure.ac 
new/gtkwave-3.3.104/configure.ac
--- old/gtkwave-3.3.101/configure.ac    2019-05-23 05:15:28.000000000 +0200
+++ new/gtkwave-3.3.104/configure.ac    2020-02-14 06:07:29.000000000 +0100
@@ -2,7 +2,7 @@
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ(2.59)
-AC_INIT(gtkwave, 3.3.101, [email protected])
+AC_INIT(gtkwave, 3.3.104, [email protected])
 AC_CONFIG_SRCDIR([src/vcd.c])
 AM_INIT_AUTOMAKE
 AC_CONFIG_HEADER([config.h])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gtkwave-3.3.101/contrib/bundle_for_osx/Info-gtkwave.plist 
new/gtkwave-3.3.104/contrib/bundle_for_osx/Info-gtkwave.plist
--- old/gtkwave-3.3.101/contrib/bundle_for_osx/Info-gtkwave.plist       
2019-05-23 05:15:28.000000000 +0200
+++ new/gtkwave-3.3.104/contrib/bundle_for_osx/Info-gtkwave.plist       
2020-02-14 06:07:29.000000000 +0100
@@ -8,7 +8,7 @@
     <key>CFBundleExecutable</key>
     <string>gtkwave</string>
     <key>CFBundleGetInfoString</key>
-    <string>3.3.101, (C) 1999-2019 Tony Bybell 
http://gtkwave.sourceforge.net</string>
+    <string>3.3.104, (C) 1999-2020 Tony Bybell 
http://gtkwave.sourceforge.net</string>
     <key>CFBundleIconFile</key>
     <string>gtkwave.icns</string>
     <key>CFBundleIdentifier</key>
@@ -18,13 +18,13 @@
     <key>CFBundlePackageType</key>
     <string>APPL</string>
     <key>CFBundleShortVersionString</key>
-    <string>3.3.101</string>
+    <string>3.3.104</string>
     <key>CFBundleSignature</key>
     <string>????</string>
     <key>CFBundleVersion</key>
-    <string>3.3.101</string>
+    <string>3.3.104</string>
     <key>NSHumanReadableCopyright</key>
-    <string>Copyright 1999 - 2019 Tony Bybell, GNU General Public 
License.</string>
+    <string>Copyright 1999 - 2020 Tony Bybell, GNU General Public 
License.</string>
     <key>LSMinimumSystemVersion</key>
     <string>10.6</string>
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/contrib/wlf2vcd/wlf2vcd.c 
new/gtkwave-3.3.104/contrib/wlf2vcd/wlf2vcd.c
--- old/gtkwave-3.3.101/contrib/wlf2vcd/wlf2vcd.c       2019-05-23 
05:15:28.000000000 +0200
+++ new/gtkwave-3.3.104/contrib/wlf2vcd/wlf2vcd.c       2020-02-14 
06:07:29.000000000 +0100
@@ -17,6 +17,8 @@
 
 /* definition of WlfVreg from wlf_api.h */
 #define WLF2VCD_MVL4           "01zx"
+#define WLF2VCD_MVL9           "ux01zwlh-"
+static const char *wlf_mvl9[9] = {"'U'", "'X'", "'0'", "'1'", "'Z'", "'W'", 
"'L'", "'H'", "'-'"};
 
 typedef struct WlfGlobalContext 
 {
@@ -31,6 +33,8 @@
 unsigned int max_bits;
 unsigned int num_aliases;
 
+unsigned is_vhdl : 1;
+
 unsigned char *value_string;
 int *archive_number;
 WlfSymbolId *archive_sym;
@@ -41,9 +45,10 @@
 static void AddSymbolToCB(
         WlfSymbolId sym,
         unsigned int vcdid,
-        unsigned int num_bits,
+                 int num_bits,
         unsigned int is_real,
         unsigned int is_vbit,
+        unsigned int is_vhbit,
         unsigned int is_vreg
         );
 
@@ -58,6 +63,7 @@
 unsigned int num_bits;
 unsigned is_real : 1;
 unsigned is_vbit : 1;
+unsigned is_vhbit : 1;
 unsigned is_vreg : 1;
 } cbData;
 
@@ -108,6 +114,7 @@
 WlfIterId iter;  
 WlfSymbolId sym;  
 int cnt;  
+WlfDataType vtyp;
 
 /* create an iterator to retrieve children of top */  
 iter = wlfSymChildren64(top, wlfSelAll);  
@@ -119,6 +126,11 @@
        cnt = wlfSymPropInt(sym, WLF_PROP_SUBELEMENT_COUNT);  
        WlfSymbolSel64 typ = wlfSymPropSymbolSel64(sym, WLF_PROP_SYMBOL_TYPE);
 
+       if(typ & wlfSelVhdlScopes) 
+               {
+               wgc.is_vhdl = 1;
+               }
+
        if(typ & (wlfSelVhdlScopes | wlfSelVlogScopes))
                {
                wgc.num_scopes++;
@@ -126,21 +138,32 @@
                else
                {  
                WlfTypeId wid = wlfSymPropTypeId(sym, WLF_PROP_TYPE_ID);
-               WlfDataType vtyp = wlfTypePropDataType(wid, WLF_TYPE_TYPE);
+               vtyp = wlfTypePropDataType(wid, WLF_TYPE_TYPE);
 
+               if(vtyp == wlfTypeRecord)
+                       {
+                       // fprintf(stderr, "wlfTypeRecord %d\n", cnt);
+                       wgc.num_scopes++;
+                       }
+               else
                if(vtyp != wlfTypeArray) /* still possibly have to recurse */
                        {
                        int rgh = wlfTypePropInt(wid, WLF_TYPE_ARRAY_RIGHT);
                        int lft = wlfTypePropInt(wid, WLF_TYPE_ARRAY_LEFT);
                        int len = wlfTypePropInt(wid, WLF_TYPE_ARRAY_LENGTH);
 
+                       if(vtyp == wlfTypeScalar)
+                               {
+                               lft = 31; rgh = 0; len = 32;
+                               }
+
                        wgc.num_symbols++;
                        if(len > wgc.max_bits) wgc.max_bits = len;
                        }
                } 
       
-       /* recurse through the children, but block out bitblasted children */
-       if(cnt<=0)
+       /* recurse through the children, but block out bitblasted children 
(except vhdl) */
+       if((cnt<=0) || (wgc.is_vhdl))
                {
                countSubElements(sym);  
                }
@@ -267,6 +290,7 @@
 
        unsigned int is_real = 0;
        unsigned int is_vbit = 0;
+       unsigned int is_vhbit = 0;
        unsigned int num_bits = 0;
        unsigned int is_vreg = 0;
        char *vartype = NULL;
@@ -312,7 +336,7 @@
                case wlfSelNamedEvent:  vartype = "event"; break;
 
                /* wlfSelHdlSignals */
-               case wlfSelSignal:
+               case wlfSelSignal:      vartype = "wire"; break;
                                        break;
 
                case wlfSelNet:         vartype = "wire"; break;
@@ -323,7 +347,8 @@
                case wlfSelGeneric:
                case wlfSelAlias:
 
-               default:                break;
+               default:        fprintf(stderr, "Type: %d\n", typ); exit(255);
+                               break;
                }
 
        WlfModeSel ptyp = wlfSymPropModeSel(sym, WLF_PROP_PORT_TYPE);
@@ -333,15 +358,23 @@
                {
                wgc.prev_hier[wgc.prev_hier_len - 1] = 0;
                char *pmod = strrchr(wgc.prev_hier, '/');
+               char *dmod = strrchr(wgc.prev_hier, '.');
+               if(dmod && (dmod - pmod > 0)) pmod = dmod;
                *(pmod + 1) = 0;
                wgc.prev_hier_len = pmod - wgc.prev_hier + 1;
                
                printf("$upscope $end\n");
                }
 
-       if(typ & (wlfSelVhdlScopes | wlfSelVlogScopes))
+       WlfTypeId wid = wlfSymPropTypeId(sym, WLF_PROP_TYPE_ID);
+       WlfDataType vtyp = wlfTypePropDataType(wid, WLF_TYPE_TYPE);
+
+       if((typ & (wlfSelVhdlScopes | wlfSelVlogScopes)) || (vtyp == 
wlfTypeRecord))
                {
                char *ls = strrchr(name, '/');
+               char *ds = strrchr(name, '.');
+               if(ds && (ds - ls > 0)) ls = ds;
+
                char *sname = ls ? (ls+1) : name;
                printf("$scope %s %s $end\n", scopetype, sname);
 
@@ -353,20 +386,47 @@
                int hlen = strlen(name);
                wgc.prev_hier = malloc(hlen + 1 + 1);
                memcpy(wgc.prev_hier, name, hlen);
-               wgc.prev_hier[hlen] = '/';
+               wgc.prev_hier[hlen] = (vtyp == wlfTypeRecord) ? '.' : '/';
                wgc.prev_hier[(wgc.prev_hier_len = hlen + 1)] = 0;
                }
                else
                {  
-               WlfTypeId wid = wlfSymPropTypeId(sym, WLF_PROP_TYPE_ID);
-               WlfDataType vtyp = wlfTypePropDataType(wid, WLF_TYPE_TYPE);
-
                if(vtyp != wlfTypeArray) /* still possibly have to recurse, 
depends on value of cnt below */
                        {
                        int rgh = wlfTypePropInt(wid, WLF_TYPE_ARRAY_RIGHT);
                        int lft = wlfTypePropInt(wid, WLF_TYPE_ARRAY_LEFT);
                        int len = wlfTypePropInt(wid, WLF_TYPE_ARRAY_LENGTH);
 
+                        if(vtyp == wlfTypeScalar)
+                                {
+                                lft = 31; rgh = 0; len = 32;
+                               is_vbit = 1; is_vhbit = 0; is_real = 0; is_vreg 
= 0;
+                                }
+
+                       if(vtyp == wlfTypeEnum)
+                               {
+                               char **enumLiterals;
+                               int i, count;
+                               wlfEnumLiterals(wid, &enumLiterals, &count);
+                               if(count == 9)
+                                       {
+                                       for(i=0;i<9;i++)
+                                               {
+                                               if(strcmp(enumLiterals[i], 
wlf_mvl9[i]))
+                                                       {
+                                                       break;
+                                                       }
+                                               }
+                                       if(i == 9)
+                                               {
+                                               is_vhbit = 1;
+                                               is_vbit = 0;
+                                               lft = rgh = 0;
+                                               len = 1;
+                                               }
+                                       }
+                               }
+
                        if((is_real) || (vtyp == wlfTypeReal) || (vtyp == 
wlfTypeVlogReal))
                                {
                                is_real = 1;
@@ -387,7 +447,7 @@
 
                        if(!vcdid)
                                {
-                               AddSymbolToCB(sym, ++wgc.vcdid_added, num_bits 
= len, is_real, is_vbit, is_vreg);  
+                               AddSymbolToCB(sym, ++wgc.vcdid_added, num_bits 
= len, is_real, is_vbit, is_vhbit, is_vreg);  
                                vcdid = wgc.vcdid_added;
                                if(arch >= 0)
                                        {
@@ -406,26 +466,57 @@
                                wgc.num_aliases++;
                                }
 
+                       char *rsl = strrchr(name, '.');
+                       if(!rsl) rsl = strrchr(name, '/');
+
+                       char *lp = strrchr(rsl, '(');
+                       char *rp = strrchr(rsl, ')');
+                       char *lp2 = NULL, *rp2 = NULL;
+                       if(lp && rp)
+                               {
+                               *lp = '['; *rp = ']';
+
+                               lp2 = strrchr(rsl, '(');
+                               rp2 = strrchr(rsl, ')');
+                               if(lp2 && rp2)
+                                       {
+                                       *lp2 = '['; *rp2 = ']';
+                                       }
+                                       else
+                                       {
+                                       lp2 = rp2 = NULL;
+                                       }
+                               }
+
                        if((lft != rgh) && (!is_vbit) && (!is_real))
                                {
-                               printf("$var %s %d %s %s [%d:%d] $end\n", 
vartype, len, genVcdID(vcdid_str, vcdid), strrchr(name, '/')+1, lft, rgh);
+                               printf("$var %s %d %s %s [%d:%d] $end\n", 
vartype, len, genVcdID(vcdid_str, vcdid), rsl+1, lft, rgh);
                                }
                                else
                                {
                                if(cnt && (!is_vbit) && (!is_real))
                                        {
-                                       printf("$var %s %d %s %s [%d] $end\n", 
vartype, len, genVcdID(vcdid_str, vcdid), strrchr(name, '/')+1, lft);
+                                       printf("$var %s %d %s %s [%d] $end\n", 
vartype, len, genVcdID(vcdid_str, vcdid), rsl+1, lft);
                                        }
                                        else
                                        {
-                                       printf("$var %s %d %s %s $end\n", 
vartype, len, genVcdID(vcdid_str, vcdid), strrchr(name, '/')+1);
+                                       printf("$var %s %d %s %s $end\n", 
vartype, len, genVcdID(vcdid_str, vcdid), rsl+1);
                                        }
                                }
+
+                       if(lp && rp)
+                               {
+                               *lp = '('; *rp = ')';
+                               }
+                       if(lp2 && rp2)
+                               {
+                               *lp2 = '('; *rp2 = ')';
+                               }
                        }
                } 
       
-        /* recurse through the children, but block out bitblasted children */  
-       if(cnt<=0)
+        /* recurse through the children, but block out bitblasted children 
(except vhdl) */  
+       if((cnt<=0) || (wgc.is_vhdl))
                {
                printSubElements(sym);  
                }
@@ -490,7 +581,15 @@
        unsigned char *pv = ((cbData*) data)->pv;
        char *value = wgc.value_string;
 
-       if(((cbData*) data)->is_vbit)
+       if(((cbData*) data)->is_vhbit)
+               {
+               for(i=0;i<nbits;i++)
+                       {
+                       value[i] = WLF2VCD_MVL9[*(pv++)];
+                       }
+               value[i] = 0;
+               }
+       else if(((cbData*) data)->is_vbit)
                {
                WlfVbit *ip = (WlfVbit *)pv;
                int bitrvs = (nbits - 1);
@@ -646,9 +745,10 @@
 static void AddSymbolToCB(   
         WlfSymbolId sym,   
        unsigned int vcdid,
-       unsigned int num_bits,
+       int num_bits,
        unsigned int is_real,
        unsigned int is_vbit,
+       unsigned int is_vhbit,
        unsigned int is_vreg
         )  
 {  
@@ -664,9 +764,10 @@
         pdata->pv = wlfValueGetValue(val);
 #endif
        pdata->vcdid = vcdid;
-       pdata->num_bits = num_bits;
+       pdata->num_bits = (num_bits < 0) ? 0 : num_bits; // ?? how to fix 
properly
        pdata->is_real = is_real;
        pdata->is_vbit = is_vbit;
+       pdata->is_vhbit = is_vhbit;
        pdata->is_vreg = is_vreg;
         status = wlfAddSignalEventCB(wgc.pack, sym, val, 
WLF_REQUEST_POSTPONED, sigCb, pdata);  
         if(status != WLF_OK)
@@ -693,6 +794,7 @@
 wgc.prev_hier = NULL;
 wgc.prev_hier_len = 0;
 wgc.vcdid_added = 0;
+wgc.is_vhdl = 0;
 
 if(argc < 2) 
        {  
Binary files old/gtkwave-3.3.101/doc/gtkwave.odt and 
new/gtkwave-3.3.104/doc/gtkwave.odt differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/src/extload.c 
new/gtkwave-3.3.104/src/extload.c
--- old/gtkwave-3.3.101/src/extload.c   2019-05-23 05:15:28.000000000 +0200
+++ new/gtkwave-3.3.104/src/extload.c   2020-02-14 06:07:29.000000000 +0100
@@ -2171,7 +2171,7 @@
  */
 void import_extload_trace(nptr np)
 {
-struct HistEnt *htemp, *histent_tail;
+struct HistEnt *htemp, *htempx=NULL, *histent_tail;
 int len, i;
 struct fac *f;
 int txidx, txidx_in_trace;
@@ -2359,6 +2359,7 @@
                htemp->v.h_val = AN_X;          /* x */
                }
        }
+htempx = htemp;
 htemp->time = MAX_HISTENT_TIME-1;
 htemp->next = histent_tail;
 
@@ -2402,11 +2403,11 @@
                 {
                if(len>1)
                        {
-                       htemp2->v.h_vector = htemp->v.h_vector;
+                       htemp2->v.h_vector = htempx->v.h_vector;
                        }
                        else
                        {
-                       htemp2->v.h_val = htemp->v.h_val;
+                       htemp2->v.h_val = htempx->v.h_val;
                        }
                }
        htemp2->next = htemp;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/src/fst.c 
new/gtkwave-3.3.104/src/fst.c
--- old/gtkwave-3.3.101/src/fst.c       2019-05-23 05:15:27.000000000 +0200
+++ new/gtkwave-3.3.104/src/fst.c       2020-02-14 06:07:29.000000000 +0100
@@ -1664,6 +1664,7 @@
        else
        {
        htemp->v.h_val = AN_X;          /* x */
+        htempx = htemp;
        }
 htemp->time = MAX_HISTENT_TIME-1;
 htemp->next = histent_tail;
@@ -1705,7 +1706,7 @@
                 }
                 else
                 {
-                htemp2->v.h_val = htemp->v.h_val;
+                htemp2->v.h_val = htempx->v.h_val;
                }
        htemp2->next = htemp;
         htemp = htemp2;
@@ -1921,6 +1922,7 @@
                        else
                        {
                        htemp->v.h_val = AN_X;          /* x */
+                       htempx = htemp;
                        }
                htemp->time = MAX_HISTENT_TIME-1;
                htemp->next = histent_tail;
@@ -1962,7 +1964,7 @@
                                 }
                                 else
                                 {
-                                htemp2->v.h_val = htemp->v.h_val;
+                                htemp2->v.h_val = htempx->v.h_val;
                                }
                         htemp2->next = htemp;
                         htemp = htemp2;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/src/gconf.h 
new/gtkwave-3.3.104/src/gconf.h
--- old/gtkwave-3.3.101/src/gconf.h     2019-05-23 05:15:27.000000000 +0200
+++ new/gtkwave-3.3.104/src/gconf.h     2020-02-14 06:07:29.000000000 +0100
@@ -26,7 +26,7 @@
 /*                      12345678901234567 */
 #define WAVE_GCONF_DIR_LEN (17)
 
-int wave_rpc_id;
+extern int wave_rpc_id;
 
 void wave_gconf_init(int argc, char **argv);
 gboolean wave_gconf_client_set_string(const gchar *key, const gchar *val);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/src/helpers/fst/fstapi.c 
new/gtkwave-3.3.104/src/helpers/fst/fstapi.c
--- old/gtkwave-3.3.101/src/helpers/fst/fstapi.c        2019-05-23 
05:15:27.000000000 +0200
+++ new/gtkwave-3.3.104/src/helpers/fst/fstapi.c        2020-02-14 
06:07:29.000000000 +0100
@@ -37,11 +37,15 @@
  *
  */
 
-#include <config.h>
+#ifndef FST_CONFIG_INCLUDE
+# define FST_CONFIG_INCLUDE <config.h>
+#endif
+#include FST_CONFIG_INCLUDE
 
 #include "fstapi.h"
 #include "fastlz.h"
 #include "lz4.h"
+#include <errno.h>
 
 #ifndef HAVE_LIBPTHREAD
 #undef FST_WRITER_PARALLEL
@@ -128,6 +132,16 @@
 #include <sys/sysctl.h>
 #endif
 
+#ifdef __GNUC__
+/* Boolean expression more often true than false */
+#define FST_LIKELY(x) __builtin_expect(!!(x), 1)
+/* Boolean expression more often false than true */
+#define FST_UNLIKELY(x) __builtin_expect(!!(x), 0)
+#else
+#define FST_LIKELY(x) (!!(x))
+#define FST_UNLIKELY(x) (!!(x))
+#endif
+
 #define FST_APIMESS "FSTAPI  | "
 
 /***********************/
@@ -723,6 +737,9 @@
 uint32_t *valpos_mem;
 unsigned char *curval_mem;
 
+unsigned char *outval_mem; /* for two-state / Verilator-style value changes */
+uint32_t outval_alloc_siz;
+
 char *filename;
 
 fstHandle maxhandle;
@@ -952,6 +969,19 @@
 /*
  * mmap functions
  */
+static void fstWriterMmapSanity(void *pnt, const char *file, int line, const 
char *usage)
+{
+#if !defined(__CYGWIN__) && !defined(__MINGW32__)
+if(pnt == MAP_FAILED)
+       {
+       fprintf(stderr, "fstMmap() assigned to %s failed: errno: %d, file %s, 
line %d.\n", usage, errno, file, line);
+       perror("Why");
+       pnt = NULL;
+       }
+#endif
+}
+
+
 static void fstWriterCreateMmaps(struct fstWriterContext *xc)
 {
 off_t curpos = ftello(xc->handle);
@@ -974,12 +1004,20 @@
 if(!xc->valpos_mem)
         {
         fflush(xc->valpos_handle);
-        xc->valpos_mem = (uint32_t *)fstMmap(NULL, xc->maxhandle * 4 * 
sizeof(uint32_t), PROT_READ|PROT_WRITE, MAP_SHARED, fileno(xc->valpos_handle), 
0);
+       errno = 0;
+       if(xc->maxhandle)
+               {
+               fstWriterMmapSanity(xc->valpos_mem = (uint32_t *)fstMmap(NULL, 
xc->maxhandle * 4 * sizeof(uint32_t), PROT_READ|PROT_WRITE, MAP_SHARED, 
fileno(xc->valpos_handle), 0), __FILE__, __LINE__, "xc->valpos_mem");
+               }
         }
 if(!xc->curval_mem)
         {
         fflush(xc->curval_handle);
-        xc->curval_mem = (unsigned char *)fstMmap(NULL, xc->maxvalpos, 
PROT_READ|PROT_WRITE, MAP_SHARED, fileno(xc->curval_handle), 0);
+       errno = 0;
+       if(xc->maxvalpos)
+               {
+               fstWriterMmapSanity(xc->curval_mem = (unsigned char 
*)fstMmap(NULL, xc->maxvalpos, PROT_READ|PROT_WRITE, MAP_SHARED, 
fileno(xc->curval_handle), 0), __FILE__, __LINE__, "xc->curval_handle");
+               }
         }
 }
 
@@ -1682,7 +1720,8 @@
 tlen = ftello(xc->tchn_handle);
 fstWriterFseeko(xc, xc->tchn_handle, 0, SEEK_SET);
 
-tmem = (unsigned char *)fstMmap(NULL, tlen, PROT_READ|PROT_WRITE, MAP_SHARED, 
fileno(xc->tchn_handle), 0);
+errno = 0;
+fstWriterMmapSanity(tmem = (unsigned char *)fstMmap(NULL, tlen, 
PROT_READ|PROT_WRITE, MAP_SHARED, fileno(xc->tchn_handle), 0), __FILE__, 
__LINE__, "tmem");
 if(tmem)
         {
         unsigned long destlen = tlen;
@@ -1874,7 +1913,7 @@
 
 if(xc && !xc->already_in_close && !xc->already_in_flush)
         {
-        unsigned char *tmem;
+        unsigned char *tmem = NULL;
         off_t fixup_offs, tlen, hlen;
 
         xc->already_in_close = 1; /* never need to zero this out as it is 
freed at bottom */
@@ -1890,7 +1929,7 @@
                 xc->skip_writing_section_hdr = 1;
                 if(!xc->size_limit_locked)
                         {
-                        if(xc->is_initial_time) /* simulation time never 
advanced so mock up the changes as time zero ones */
+                        if(FST_UNLIKELY(xc->is_initial_time)) /* simulation 
time never advanced so mock up the changes as time zero ones */
                                 {
                                 fstHandle dupe_idx;
 
@@ -1908,11 +1947,21 @@
                         }
                 }
         fstDestroyMmaps(xc, 1);
+       if(xc->outval_mem)
+               {
+               free(xc->outval_mem); xc->outval_mem = NULL;
+               xc->outval_alloc_siz = 0;
+               }
 
         /* write out geom section */
         fflush(xc->geom_handle);
         tlen = ftello(xc->geom_handle);
-        tmem = (unsigned char *)fstMmap(NULL, tlen, PROT_READ|PROT_WRITE, 
MAP_SHARED, fileno(xc->geom_handle), 0);
+       errno = 0;
+       if(tlen)
+               {
+               fstWriterMmapSanity(tmem = (unsigned char *)fstMmap(NULL, tlen, 
PROT_READ|PROT_WRITE, MAP_SHARED, fileno(xc->geom_handle), 0), __FILE__, 
__LINE__, "tmem");
+               }
+
         if(tmem)
                 {
                 unsigned long destlen = tlen;
@@ -2020,14 +2069,18 @@
                         {
                         int lz4_maxlen;
                         unsigned char *mem;
-                        unsigned char *hmem;
+                        unsigned char *hmem = NULL;
                         int packed_len;
 
                         fflush(xc->handle);
 
                         lz4_maxlen = LZ4_compressBound(xc->hier_file_len);
                         mem = (unsigned char *)malloc(lz4_maxlen);
-                        hmem = (unsigned char *)fstMmap(NULL, 
xc->hier_file_len, PROT_READ|PROT_WRITE, MAP_SHARED, fileno(xc->hier_handle), 
0);
+                       errno = 0;
+                       if(xc->hier_file_len)
+                               {
+                               fstWriterMmapSanity(hmem = (unsigned char 
*)fstMmap(NULL, xc->hier_file_len, PROT_READ|PROT_WRITE, MAP_SHARED, 
fileno(xc->hier_handle), 0), __FILE__, __LINE__, "hmem");
+                               }
                         packed_len = LZ4_compress((char *)hmem, (char *)mem, 
xc->hier_file_len);
                         fstMunmap(hmem, xc->hier_file_len);
 
@@ -2843,12 +2896,12 @@
 uint32_t offs;
 int len;
 
-if((xc) && (handle <= xc->maxhandle))
+if(FST_LIKELY((xc) && (handle <= xc->maxhandle)))
         {
         uint32_t fpos;
         uint32_t *vm4ip;
 
-        if(!xc->valpos_mem)
+        if(FST_UNLIKELY(!xc->valpos_mem))
                 {
                 xc->vc_emitted = 1;
                 fstWriterCreateMmaps(xc);
@@ -2858,17 +2911,17 @@
         vm4ip = &(xc->valpos_mem[4*handle]);
 
         len  = vm4ip[1];
-        if(len) /* len of zero = variable length, use 
fstWriterEmitVariableLengthValueChange */
+        if(FST_LIKELY(len)) /* len of zero = variable length, use 
fstWriterEmitVariableLengthValueChange */
                 {
-                if(!xc->is_initial_time)
+                if(FST_LIKELY(!xc->is_initial_time))
                         {
                         fpos = xc->vchg_siz;
 
-                        if((fpos + len + 10) > xc->vchg_alloc_siz)
+                        if(FST_UNLIKELY((fpos + len + 10) > 
xc->vchg_alloc_siz))
                                 {
                                 xc->vchg_alloc_siz += (xc->fst_break_add_size 
+ len); /* +len added in the case of extremely long vectors and small break add 
sizes */
                                 xc->vchg_mem = (unsigned char 
*)realloc(xc->vchg_mem, xc->vchg_alloc_siz);
-                                if(!xc->vchg_mem)
+                                if(FST_UNLIKELY(!xc->vchg_mem))
                                         {
                                         fprintf(stderr, FST_APIMESS "Could not 
realloc() in fstWriterEmitValueChange, exiting.\n");
                                         exit(255);
@@ -2953,18 +3006,139 @@
         }
 }
 
+void fstWriterEmitValueChange32(void *ctx, fstHandle handle,
+                                uint32_t bits, uint32_t val) {
+        char buf[32];
+        char *s = buf;
+        uint32_t i;
+        for (i = 0; i < bits; ++i)
+        {
+                *s++ = '0' + ((val >> (bits - i - 1)) & 1);
+        }
+        fstWriterEmitValueChange(ctx, handle, buf);
+}
+void fstWriterEmitValueChange64(void *ctx, fstHandle handle,
+                                uint32_t bits, uint64_t val) {
+        char buf[64];
+        char *s = buf;
+        uint32_t i;
+        for (i = 0; i < bits; ++i)
+        {
+                *s++ = '0' + ((val >> (bits - i - 1)) & 1);
+        }
+        fstWriterEmitValueChange(ctx, handle, buf);
+}
+void fstWriterEmitValueChangeVec32(void *ctx, fstHandle handle,
+                                   uint32_t bits, const uint32_t *val) {
+        struct fstWriterContext *xc = (struct fstWriterContext *)ctx;
+        if (FST_UNLIKELY(bits <= 32))
+        {
+                fstWriterEmitValueChange32(ctx, handle, bits, val[0]);
+        }
+        else if(FST_LIKELY(xc))
+        {
+                int bq = bits / 32;
+                int br = bits & 31;
+                int i;
+                int w;
+                uint32_t v;
+                unsigned char* s;
+                if (FST_UNLIKELY(bits > xc->outval_alloc_siz))
+                {
+                        xc->outval_alloc_siz = bits*2 + 1;
+                        xc->outval_mem = (unsigned 
char*)realloc(xc->outval_mem, xc->outval_alloc_siz);
+                        if (FST_UNLIKELY(!xc->outval_mem))
+                        {
+                                fprintf(stderr,
+                                        FST_APIMESS "Could not realloc() in 
fstWriterEmitValueChangeVec32, exiting.\n");
+                                exit(255);
+                        }
+                }
+                s = xc->outval_mem;
+                {
+                        w = bq;
+                        v = val[w];
+                        for (i = 0; i < br; ++i)
+                        {
+                                *s++ = '0' + ((v >> (br - i - 1)) & 1);
+                        }
+                }
+                for (w = bq - 1; w >= 0; --w)
+                {
+                        v = val[w];
+                        for (i = (32 - 4); i >= 0; i -= 4) {
+                                s[0] = '0' + ((v >> (i + 3)) & 1);
+                                s[1] = '0' + ((v >> (i + 2)) & 1);
+                                s[2] = '0' + ((v >> (i + 1)) & 1);
+                                s[3] = '0' + ((v >> (i + 0)) & 1);
+                                s += 4;
+                        }
+                }
+                fstWriterEmitValueChange(ctx, handle, xc->outval_mem);
+        }
+}
+void fstWriterEmitValueChangeVec64(void *ctx, fstHandle handle,
+                                   uint32_t bits, const uint64_t *val) {
+        struct fstWriterContext *xc = (struct fstWriterContext *)ctx;
+        if (FST_UNLIKELY(bits <= 64))
+        {
+                fstWriterEmitValueChange64(ctx, handle, bits, val[0]);
+        }
+        else if(FST_LIKELY(xc))
+        {
+                int bq = bits / 64;
+                int br = bits & 63;
+                int i;
+                int w;
+                uint32_t v;
+                unsigned char* s;
+                if (FST_UNLIKELY(bits > xc->outval_alloc_siz))
+                {
+                        xc->outval_alloc_siz = bits*2 + 1;
+                        xc->outval_mem = (unsigned 
char*)realloc(xc->outval_mem, xc->outval_alloc_siz);
+                        if (FST_UNLIKELY(!xc->outval_mem))
+                        {
+                                fprintf(stderr,
+                                        FST_APIMESS "Could not realloc() in 
fstWriterEmitValueChangeVec64, exiting.\n");
+                                exit(255);
+                        }
+                }
+                s = xc->outval_mem;
+                {
+                        w = bq;
+                        v = val[w];
+                        for (i = 0; i < br; ++i)
+                        {
+                                *s++ = '0' + ((v >> (br - i - 1)) & 1);
+                        }
+                }
+                for (w = bq - 1; w >= 0; --w) {
+                        v = val[w];
+                        for (i = (64 - 4); i >= 0; i -= 4)
+                        {
+                                s[0] = '0' + ((v >> (i + 3)) & 1);
+                                s[1] = '0' + ((v >> (i + 2)) & 1);
+                                s[2] = '0' + ((v >> (i + 1)) & 1);
+                                s[3] = '0' + ((v >> (i + 0)) & 1);
+                                s += 4;
+                        }
+                }
+                fstWriterEmitValueChange(ctx, handle, xc->outval_mem);
+        }
+}
+
 
 void fstWriterEmitVariableLengthValueChange(void *ctx, fstHandle handle, const 
void *val, uint32_t len)
 {
 struct fstWriterContext *xc = (struct fstWriterContext *)ctx;
 const unsigned char *buf = (const unsigned char *)val;
 
-if((xc) && (handle <= xc->maxhandle))
+if(FST_LIKELY((xc) && (handle <= xc->maxhandle)))
         {
         uint32_t fpos;
         uint32_t *vm4ip;
 
-        if(!xc->valpos_mem)
+        if(FST_UNLIKELY(!xc->valpos_mem))
                 {
                 xc->vc_emitted = 1;
                 fstWriterCreateMmaps(xc);
@@ -2974,15 +3148,15 @@
         vm4ip = &(xc->valpos_mem[4*handle]);
 
         /* there is no initial time dump for variable length value changes */
-        if(!vm4ip[1]) /* len of zero = variable length */
+        if(FST_LIKELY(!vm4ip[1])) /* len of zero = variable length */
                 {
                 fpos = xc->vchg_siz;
 
-                if((fpos + len + 10 + 5) > xc->vchg_alloc_siz)
+                if(FST_UNLIKELY((fpos + len + 10 + 5) > xc->vchg_alloc_siz))
                         {
                         xc->vchg_alloc_siz += (xc->fst_break_add_size + len + 
5); /* +len added in the case of extremely long vectors and small break add 
sizes */
                         xc->vchg_mem = (unsigned char *)realloc(xc->vchg_mem, 
xc->vchg_alloc_siz);
-                        if(!xc->vchg_mem)
+                        if(FST_UNLIKELY(!xc->vchg_mem))
                                 {
                                 fprintf(stderr, FST_APIMESS "Could not 
realloc() in fstWriterEmitVariableLengthValueChange, exiting.\n");
                                 exit(255);
@@ -3004,7 +3178,7 @@
 int skip = 0;
 if(xc)
         {
-        if(xc->is_initial_time)
+        if(FST_UNLIKELY(xc->is_initial_time))
                 {
                 if(xc->size_limit_locked)       /* this resets 
xc->is_initial_time to one */
                         {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/src/helpers/fst/fstapi.h 
new/gtkwave-3.3.104/src/helpers/fst/fstapi.h
--- old/gtkwave-3.3.101/src/helpers/fst/fstapi.h        2019-05-23 
05:15:27.000000000 +0200
+++ new/gtkwave-3.3.104/src/helpers/fst/fstapi.h        2020-02-14 
06:07:29.000000000 +0100
@@ -355,6 +355,14 @@
 void            fstWriterEmitDumpActive(void *ctx, int enable);
 void           fstWriterEmitEnumTableRef(void *ctx, fstEnumHandle handle);
 void            fstWriterEmitValueChange(void *ctx, fstHandle handle, const 
void *val);
+void            fstWriterEmitValueChange32(void *ctx, fstHandle handle,
+                        uint32_t bits, uint32_t val);
+void            fstWriterEmitValueChange64(void *ctx, fstHandle handle,
+                        uint32_t bits, uint64_t val);
+void            fstWriterEmitValueChangeVec32(void *ctx, fstHandle handle,
+                        uint32_t bits, const uint32_t *val);
+void            fstWriterEmitValueChangeVec64(void *ctx, fstHandle handle,
+                        uint32_t bits, const uint64_t *val);
 void            fstWriterEmitVariableLengthValueChange(void *ctx, fstHandle 
handle, const void *val, uint32_t len);
 void            fstWriterEmitTimeChange(void *ctx, uint64_t tim);
 void            fstWriterFlushContext(void *ctx);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/src/main.c 
new/gtkwave-3.3.104/src/main.c
--- old/gtkwave-3.3.101/src/main.c      2019-05-23 05:15:27.000000000 +0200
+++ new/gtkwave-3.3.104/src/main.c      2020-02-14 06:07:29.000000000 +0100
@@ -1467,6 +1467,7 @@
 #if defined(EXTLOAD_SUFFIX)
 if(
    (suffix_check(GLOBALS->loaded_file_name, "."EXTLOAD_SUFFIX      ) && 
!opt_vcd) ||
+   (suffix_check(GLOBALS->loaded_file_name, ".vf"                  ) && 
!opt_vcd) ||   /* virtual file */
    (suffix_check(GLOBALS->loaded_file_name, "."EXTLOAD_SUFFIX".gz" ) && 
!opt_vcd) ||   /* loader automatically does gzip -cd */
    (suffix_check(GLOBALS->loaded_file_name, "."EXTLOAD_SUFFIX".bz2") && 
!opt_vcd)      /* loader automatically does bzip2 -cd */
   )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/src/savefile.c 
new/gtkwave-3.3.104/src/savefile.c
--- old/gtkwave-3.3.101/src/savefile.c  2019-05-23 05:15:27.000000000 +0200
+++ new/gtkwave-3.3.104/src/savefile.c  2020-02-14 06:07:29.000000000 +0100
@@ -995,6 +995,7 @@
   char *prefix, *suffix, *new;
   char *prefix_init, *w2_init;
   unsigned int mode;
+  int current_grp_depth = -1;
 
   if(!(len=strlen(w))) return(0);
   if(*(w+len-1)=='\n')
@@ -1249,6 +1250,8 @@
 
        b = maketyp ? makevec(prefix+1,w2) : makevec_annotated(prefix+1,w2);    
/* '#' vs ':' cases... */
 
+       if(GLOBALS->default_flags&TR_GRP_BEGIN) { current_grp_depth = 
GLOBALS->group_depth; }
+
        if(b)
                {
                if((v=bits2vector(b)))
@@ -1257,7 +1260,7 @@
                        AddVector(v, alias);
                        free_2(b->name);
                        b->name=NULL;
-                       return(v!=NULL);
+                       goto grp_bot;
                        }
                        else
                        {
@@ -1312,6 +1315,8 @@
                        }
                }
 
+grp_bot:
+        if((GLOBALS->default_flags&TR_GRP_BEGIN) && (current_grp_depth >= 0) 
&& (current_grp_depth == GLOBALS->group_depth)) { AddBlankTrace(prefix+1); }
        return(v!=NULL);
        }
 else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/src/tcl_commands.c 
new/gtkwave-3.3.104/src/tcl_commands.c
--- old/gtkwave-3.3.101/src/tcl_commands.c      2019-05-23 05:15:27.000000000 
+0200
+++ new/gtkwave-3.3.104/src/tcl_commands.c      2020-02-14 06:07:29.000000000 
+0100
@@ -1168,6 +1168,44 @@
 return(TCL_OK);
 }
 
+static int gtkwavetcl_addCommentTracesFromList(ClientData clientData, 
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
+{
+char reportString[33];
+Tcl_Obj *aobj;
+
+if(objc==2)
+        {
+       char *s = Tcl_GetString(objv[1]);
+        char** elem = NULL;
+        int i, l = 0;
+
+        elem = zSplitTclList(s, &l);
+        if(elem)
+                {
+                for(i=0;i<l;i++)
+                        {
+                        InsertBlankTrace(elem[i], 0);
+                        }
+                free_2(elem);
+                }
+
+        GLOBALS->signalwindow_width_dirty=1;
+        MaxSignalLength();
+        signalarea_configure_event(GLOBALS->signalarea, NULL);
+        wavearea_configure_event(GLOBALS->wavearea, NULL);
+
+        sprintf(reportString, "%d", l);
+
+        aobj = Tcl_NewStringObj(reportString, -1);
+        Tcl_SetObjResult(interp, aobj);
+        }
+        else
+        {
+        return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1));
+        }
+
+return(TCL_OK);
+}
 
 static int gtkwavetcl_addSignalsFromList(ClientData clientData, Tcl_Interp 
*interp, int objc, Tcl_Obj *CONST objv[])
 {
@@ -2244,6 +2282,7 @@
 
 tcl_cmdstruct gtkwave_commands[] =
        {
+       {"addCommentTracesFromList",            
gtkwavetcl_addCommentTracesFromList},
        {"addSignalsFromList",                  gtkwavetcl_addSignalsFromList},
        {"deleteSignalsFromList",               
gtkwavetcl_deleteSignalsFromList},
        {"deleteSignalsFromListIncludingDuplicates", 
gtkwavetcl_deleteSignalsFromListIncludingDuplicates},
@@ -2295,7 +2334,11 @@
        {"installFileFilter",                   gtkwavetcl_installFileFilter},
        {"installProcFilter",                   gtkwavetcl_installProcFilter},
        {"installTransFilter",                  gtkwavetcl_installTransFilter},
+       {"loadFile",                            gtkwavetcl_loadFile},
        {"nop",                                 gtkwavetcl_nop},
+       {"presentWindow",                       gtkwavetcl_presentWindow},
+       {"processTclList",                      gtkwavetcl_processTclList}, /* 
not for general-purpose use */
+       {"reLoadFile",                          gtkwavetcl_reLoadFile},
        {"setBaselineMarker",                   gtkwavetcl_setBaselineMarker},
        {"setCurrentTranslateEnums",            
gtkwavetcl_setCurrentTranslateEnums},
        {"setCurrentTranslateFile",             
gtkwavetcl_setCurrentTranslateFile},
@@ -2313,13 +2356,9 @@
        {"setWindowStartTime",                  gtkwavetcl_setWindowStartTime},
        {"setZoomFactor",                       gtkwavetcl_setZoomFactor},
        {"setZoomRangeTimes",                   gtkwavetcl_setZoomRangeTimes},
-       {"loadFile",                            gtkwavetcl_loadFile},
-       {"reLoadFile",                          gtkwavetcl_reLoadFile},
-       {"presentWindow",                       gtkwavetcl_presentWindow},
        {"showSignal",                          gtkwavetcl_showSignal},
-       {"unhighlightSignalsFromList",          
gtkwavetcl_unhighlightSignalsFromList},
        {"signalChangeList",                    gtkwavetcl_signalChangeList},   
/* changed from signal_change_list for consistency! */
-       {"processTclList",                      gtkwavetcl_processTclList}, /* 
not for general-purpose use */
+       {"unhighlightSignalsFromList",          
gtkwavetcl_unhighlightSignalsFromList},
        {"",                                    NULL} /* sentinel */
        };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/src/tree.c 
new/gtkwave-3.3.104/src/tree.c
--- old/gtkwave-3.3.101/src/tree.c      2019-05-23 05:15:27.000000000 +0200
+++ new/gtkwave-3.3.104/src/tree.c      2020-02-14 06:07:29.000000000 +0100
@@ -1121,7 +1121,6 @@
                                                        else if(!strcmp(p, 
"VHDL_ST_GENFOR")) { exclhier |= exclone << TREE_VHDL_ST_GENFOR; }
                                                        else if(!strcmp(p, 
"VHDL_ST_INSTANCE")) { exclhier |= exclone << TREE_VHDL_ST_INSTANCE; }
                                                        else if(!strcmp(p, 
"VHDL_ST_PACKAGE")) { exclhier |= exclone << TREE_VHDL_ST_PACKAGE; }
-                                                       else if(!strcmp(p, 
"VHDL_ST_PACKAGE")) { exclhier |= exclone << TREE_VHDL_ST_PACKAGE; }
 
                                                        else if(!strcmp(p, 
"VHDL_ST_SIGNAL")) { exclhier |= exclone << TREE_VHDL_ST_SIGNAL; }
                                                        else if(!strcmp(p, 
"VHDL_ST_PORTIN")) { exclhier |= exclone << TREE_VHDL_ST_PORTIN; }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/src/vcd_saver.c 
new/gtkwave-3.3.104/src/vcd_saver.c
--- old/gtkwave-3.3.101/src/vcd_saver.c 2019-05-23 05:15:27.000000000 +0200
+++ new/gtkwave-3.3.104/src/vcd_saver.c 2020-02-14 06:07:29.000000000 +0100
@@ -15,6 +15,8 @@
 #include "hierpack.h"
 #include <time.h>
 
+WAVE_NODEVARTYPE_STR
+
 static void w32redirect_fprintf(int is_trans, FILE *sfd, const char *format, 
...)
 {
 #if defined _MSC_VER || defined __MINGW32__
@@ -608,7 +610,7 @@
                                }
                                else
                                {
-                               w32redirect_fprintf(is_trans, 
GLOBALS->f_vcd_saver_c_1, "$var wire 1 %s %s $end\n", 
vcdid(GLOBALS->hp_vcd_saver_c_1[i]->val, export_typ), netname);
+                               w32redirect_fprintf(is_trans, 
GLOBALS->f_vcd_saver_c_1, "$var %s 1 %s %s $end\n", 
vartype_strings[GLOBALS->hp_vcd_saver_c_1[i]->item->vartype], 
vcdid(GLOBALS->hp_vcd_saver_c_1[i]->val, export_typ), netname);
                                }
                        }
                        else
@@ -620,7 +622,7 @@
                                }
                                else
                                {
-                               w32redirect_fprintf(is_trans, 
GLOBALS->f_vcd_saver_c_1, "$var wire %d %s %s $end\n", len, 
vcdid(GLOBALS->hp_vcd_saver_c_1[i]->val, export_typ), netname);
+                               w32redirect_fprintf(is_trans, 
GLOBALS->f_vcd_saver_c_1, "$var %s %d %s %s $end\n", 
vartype_strings[GLOBALS->hp_vcd_saver_c_1[i]->item->vartype], len, 
vcdid(GLOBALS->hp_vcd_saver_c_1[i]->val, export_typ), netname);
                                }
                        GLOBALS->hp_vcd_saver_c_1[i]->len = len;
                        if(len > max_len) max_len = len;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/src/version.h 
new/gtkwave-3.3.104/src/version.h
--- old/gtkwave-3.3.101/src/version.h   2019-05-23 05:15:28.000000000 +0200
+++ new/gtkwave-3.3.104/src/version.h   2020-02-14 06:07:29.000000000 +0100
@@ -10,6 +10,6 @@
 #ifndef WAVE_VERSION_H
 #define WAVE_VERSION_H
 
-#define WAVE_VERSION_INFO "GTKWave Analyzer v" PACKAGE_VERSION " (w)1999-2019 
BSI"
+#define WAVE_VERSION_INFO "GTKWave Analyzer v" PACKAGE_VERSION " (w)1999-2020 
BSI"
 
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gtkwave-3.3.101/src/wavewindow.c 
new/gtkwave-3.3.104/src/wavewindow.c
--- old/gtkwave-3.3.101/src/wavewindow.c        2019-05-23 05:15:27.000000000 
+0200
+++ new/gtkwave-3.3.104/src/wavewindow.c        2020-02-14 06:07:29.000000000 
+0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) Tony Bybell 1999-2012.
+ * Copyright (c) Tony Bybell 1999-2019.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -4184,7 +4184,7 @@
                }
                else
                {
-               if(type != AN_X)
+               if((type != AN_X) && (type != AN_U))
                        {
                        c = GLOBALS->gc.gc_vbox_wavewindow_c_1;
                        }
@@ -4997,7 +4997,7 @@
                }
                else
                {
-               if(type != AN_X)
+               if((type != AN_X) && (type != AN_U))
                        {
                        c = GLOBALS->gc.gc_vbox_wavewindow_c_1;
                        }


Reply via email to