diff --git a/CHANGELOG.TXT b/CHANGELOG.TXT index c1d3a32..0ced70c 100644 --- a/CHANGELOG.TXT +++ b/CHANGELOG.TXT @@ -438,3 +438,34 @@ combined vector. (Cut and paste typo from strace.c.) Added support for DND from regex search window to the signal/waveareas. +3.1.11 18jun08 Compile fix for tla2vcd in MinGW. + Added #ifdef for HAVE_BZERO for MinGW. + Compiler warning fixes. + Added time = -1 endcaps in LXT2+VZT+AET loaders. +3.1.12 14jul08 Compiler warning fixes. + Fixed crash in vcd recoder for b vs 01xz mixups in + malformed VCD files. + Fixed abort on VCD load for malformed size vs + [msi:lsi] syntax. NC does this on arrays of wires. + Fix to vlist reader with --giga enabled in order to + handle reads which go off the end of the file. + (Possible due to how only the amount used in a block + is actually written to the file in order to save + space, so the vlist blocks can be overlapping yet + usable.) +3.1.13 20aug08 Adding compressed hierarchy handling in order to + reduce memory usage on large bitblasted models. + This is currently only enabled for the VCD recoder, + LXT, LXT2, and VZT loaders. + Fixed some buffer overflows in vectorization code + (and when vectorization is enabled) in vzt_read.c. + Modification to autoconf handling for rpc.h. + Fix for DnD to directly under an expanded comment + trace. + Make step_increment equal to 1/10 page_increment + for the horizontal scroller in the wavewindow. + Added sticky click semantics for clicks in signal + window. To do this in the treesearch_gtk2 file + will require some additional future work with + view_selection_func() and/or signal handling and + trapping. diff --git a/LICENSE.TXT b/LICENSE.TXT index a4f77a8..b1c8442 100644 --- a/LICENSE.TXT +++ b/LICENSE.TXT @@ -1,6 +1,6 @@ ########################################################################## -GTKWave 3.1.8 Wave Viewer is Copyright (C) 1999-2008 Tony Bybell. +GTKWave 3.1.13 Wave Viewer is Copyright (C) 1999-2008 Tony Bybell. Portions of GTKWave are Copyright (C) 1999-2008 Udi Finkelstein. Context support is Copyright (C) 2007-2008 Kermin Elliott Fleming. GHW and additional GUI support is Copyright (C) 2005-2008 Tristan Gingold. diff --git a/config.h.in b/config.h.in index 7f787ba..93ac825 100644 --- a/config.h.in +++ b/config.h.in @@ -119,6 +119,9 @@ /* Define to 1 if you have the `re_comp' function. */ #undef HAVE_RE_COMP + +/* Define to 1 if you have the header file. */ +#undef HAVE_RPC_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_RPC_XDR_H diff --git a/configure b/configure index 87870c0..4b73acd 100755 --- a/configure +++ b/configure @@ -5560,8 +5560,7 @@ - -for ac_header in fcntl.h inttypes.h libintl.h limits.h malloc.h stddef.h stdint.h stdlib.h string.h strings.h sys/time.h unistd.h wchar.h wctype.h rpc/xdr.h getopt.h +for ac_header in fcntl.h inttypes.h libintl.h limits.h malloc.h stddef.h stdint.h stdlib.h string.h strings.h sys/time.h unistd.h wchar.h wctype.h getopt.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then @@ -5709,6 +5708,74 @@ fi done + + +# rpc workaround for cygwin + + +for ac_header in rpc/types.h rpc/xdr.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef HAVE_RPC_TYPES_H + # include + #endif + + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + # Checks for typedefs, structures, and compiler characteristics. diff --git a/configure.ac b/configure.ac index 7b1783b..c9f1284 100644 --- a/configure.ac +++ b/configure.ac @@ -235,7 +235,15 @@ AC_HEADER_DIRENT AC_HEADER_STDC AC_HEADER_SYS_WAIT -AC_CHECK_HEADERS([fcntl.h inttypes.h libintl.h limits.h malloc.h stddef.h stdint.h stdlib.h string.h strings.h sys/time.h unistd.h wchar.h wctype.h rpc/xdr.h getopt.h]) +AC_CHECK_HEADERS([fcntl.h inttypes.h libintl.h limits.h malloc.h stddef.h stdint.h stdlib.h string.h strings.h sys/time.h unistd.h wchar.h wctype.h getopt.h]) + +# rpc workaround for cygwin +AC_CHECK_HEADERS([rpc/types.h rpc/xdr.h], [], [], + [[#ifdef HAVE_RPC_TYPES_H + # include + #endif + ]]) + # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST diff --git a/contrib/rtlbrowse/logfile.c b/contrib/rtlbrowse/logfile.c index 05e87f6..bbe0e97 100644 --- a/contrib/rtlbrowse/logfile.c +++ b/contrib/rtlbrowse/logfile.c @@ -642,22 +642,8 @@ GtkWidget *ctext; GtkWidget *text; FILE *handle; - int lx; - int lx_module_line = 0; - int lx_module_line_locked = 0; - int lx_endmodule_line_locked = 0; - - struct wave_logfile_lines_t *wlog_head=NULL, *wlog_curr=NULL; - int wlog_size = 0; - int line_no; - int s_line_find = -1, e_line_find = -1; struct logfile_context_t *ctx; - struct text_find_t *text_curr; - char *default_text = t->filename; - char *design_unit = t->item; - int s_line = t->s_line; - int e_line = t->e_line; handle = fopen(default_text, "rb"); if(!handle) @@ -1468,8 +1454,11 @@ } /* - * $Id: logfile.c,v 1.4 2008/02/05 07:20:24 gtkwave Exp $ + * $Id: logfile.c,v 1.5 2008/06/11 08:01:40 gtkwave Exp $ * $Log: logfile.c,v $ + * Revision 1.5 2008/06/11 08:01:40 gtkwave + * gcc 4.3.x compiler warning fixes + * * Revision 1.4 2008/02/05 07:20:24 gtkwave * added realtime rtlbrowse updates (follows marker at 100ms intervals) * diff --git a/man/gtkwave.1 b/man/gtkwave.1 index 7d30fed..10a0b7a 100644 --- a/man/gtkwave.1 +++ b/man/gtkwave.1 @@ -1,4 +1,4 @@ -.TH "GTKWAVE" "1" "3.1.5" "Anthony Bybell" "Simulation Wave Viewer" +.TH "GTKWAVE" "1" "3.1.13" "Anthony Bybell" "Simulation Wave Viewer" .SH "NAME" .LP gtkwave \- Visualization tool for VCD, LXT, and VZT files @@ -97,6 +97,10 @@ specifies that the viewer should use gigabyte mempacking when recoding (possibly slower). This is equivalent to setting the vlist_spill and vlist_prepack flags in the rc file. .TP +\fB\-C\fR,\fB\-\-comphier\fR +specifies that the viewer should use compressed hierarchy names when loading the dumpfile (available for VCD recoder, LXT, LXT2, and VZT). +This will use less memory at the expense of compression/decompression delay. +.TP \fB\-v\fR,\fB\-\-vcd\fR Use stdin as a VCD dumpfile. .TP diff --git a/src/Makefile.am b/src/Makefile.am index 391cfb3..651caf6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -21,7 +21,7 @@ debug.c debug.h discardbuttons.c edgebuttons.c \ entry.c fetchbuttons.c fgetdynamic.c fgetdynamic.h file.c fonts.c fonts.h getopt.c \ getopt1.c ghw.c ghw.h ghwlib.c ghwlib.h gnu-getopt.h gnu_regex.h gtk12compat.h \ - help.c helpers/lxt2_read.c \ + hierpack.c hierpack.h jrb.c jrb.h help.c helpers/lxt2_read.c \ helpers/lxt_write.c helpers/vzt_read.c hiersearch.c interp.c \ logfile.c lx2.c lx2.h lxt.c lxt.h main.c main.h markerbox.c menu.c menu.h mouseover.c \ pagebuttons.c pipeio.c pipeio.h pixmaps.c pixmaps.h print.c print.h \ diff --git a/src/Makefile.in b/src/Makefile.in index 6e65526..81023b7 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -54,15 +54,15 @@ discardbuttons.$(OBJEXT) edgebuttons.$(OBJEXT) entry.$(OBJEXT) \ fetchbuttons.$(OBJEXT) fgetdynamic.$(OBJEXT) file.$(OBJEXT) \ fonts.$(OBJEXT) getopt.$(OBJEXT) getopt1.$(OBJEXT) \ - ghw.$(OBJEXT) ghwlib.$(OBJEXT) help.$(OBJEXT) \ - lxt2_read.$(OBJEXT) lxt_write.$(OBJEXT) vzt_read.$(OBJEXT) \ - hiersearch.$(OBJEXT) interp.$(OBJEXT) logfile.$(OBJEXT) \ - lx2.$(OBJEXT) lxt.$(OBJEXT) main.$(OBJEXT) markerbox.$(OBJEXT) \ - menu.$(OBJEXT) mouseover.$(OBJEXT) pagebuttons.$(OBJEXT) \ - pipeio.$(OBJEXT) pixmaps.$(OBJEXT) print.$(OBJEXT) \ - ptranslate.$(OBJEXT) rc.$(OBJEXT) regex.$(OBJEXT) \ - renderopt.$(OBJEXT) rgb.$(OBJEXT) search.$(OBJEXT) \ - shiftbuttons.$(OBJEXT) showchange.$(OBJEXT) \ + ghw.$(OBJEXT) ghwlib.$(OBJEXT) hierpack.$(OBJEXT) \ + jrb.$(OBJEXT) help.$(OBJEXT) lxt2_read.$(OBJEXT) \ + lxt_write.$(OBJEXT) vzt_read.$(OBJEXT) hiersearch.$(OBJEXT) \ + interp.$(OBJEXT) logfile.$(OBJEXT) lx2.$(OBJEXT) lxt.$(OBJEXT) \ + main.$(OBJEXT) markerbox.$(OBJEXT) menu.$(OBJEXT) \ + mouseover.$(OBJEXT) pagebuttons.$(OBJEXT) pipeio.$(OBJEXT) \ + pixmaps.$(OBJEXT) print.$(OBJEXT) ptranslate.$(OBJEXT) \ + rc.$(OBJEXT) regex.$(OBJEXT) renderopt.$(OBJEXT) rgb.$(OBJEXT) \ + search.$(OBJEXT) shiftbuttons.$(OBJEXT) showchange.$(OBJEXT) \ signalwindow.$(OBJEXT) simplereq.$(OBJEXT) splash.$(OBJEXT) \ status.$(OBJEXT) strace.$(OBJEXT) symbol.$(OBJEXT) \ timeentry.$(OBJEXT) translate.$(OBJEXT) tree.$(OBJEXT) \ @@ -202,7 +202,7 @@ debug.c debug.h discardbuttons.c edgebuttons.c \ entry.c fetchbuttons.c fgetdynamic.c fgetdynamic.h file.c fonts.c fonts.h getopt.c \ getopt1.c ghw.c ghw.h ghwlib.c ghwlib.h gnu-getopt.h gnu_regex.h gtk12compat.h \ - help.c helpers/lxt2_read.c \ + hierpack.c hierpack.h jrb.c jrb.h help.c helpers/lxt2_read.c \ helpers/lxt_write.c helpers/vzt_read.c hiersearch.c interp.c \ logfile.c lx2.c lx2.h lxt.c lxt.h main.c main.h markerbox.c menu.c menu.h mouseover.c \ pagebuttons.c pipeio.c pipeio.h pixmaps.c pixmaps.h print.c print.h \ @@ -314,8 +314,10 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ghwlib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globals.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/help.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hierpack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hiersearch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jrb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logfile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lx2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxt.Po@am__quote@ diff --git a/src/ae2.c b/src/ae2.c index 8b2cb4d..49599b5 100644 --- a/src/ae2.c +++ b/src/ae2.c @@ -1031,6 +1031,15 @@ if((1)||(f->row <= 1)) /* sorry, arrays not supported yet in the viewer */ { fprintf(stderr, "Import: %s\n", np->nname); + if(nr<1) nr=1; + if(!GLOBALS->ae2_lx2_table[txidx]) + { + GLOBALS->ae2_lx2_table[txidx] = calloc_2(nr, sizeof(struct lx2_entry)); + for(r=0;rae2_lx2_table[txidx][r].np = &np[r]; + } + } aet2_rd_set_fac_process_mask(txidx); ae2_iterator(GLOBALS->ae2_start_limit_cyc, GLOBALS->ae2_end_limit_cyc); @@ -1042,9 +1051,9 @@ } -if(nr<1) nr=1; for(r = 0; r < nr; r++) { + histent_tail = htemp = histent_calloc(); if(len>1) { @@ -1085,6 +1094,23 @@ { np[r].head.v.h_val = AN_X; /* x */ } + + + { + struct HistEnt *htemp2 = calloc_2(1, sizeof(struct HistEnt)); + htemp2->time = -1; + if(len>1) + { + htemp2->v.h_vector = htemp->v.h_vector; + } + else + { + htemp2->v.h_val = htemp->v.h_val; + } + htemp2->next = htemp; + htemp = htemp2; + GLOBALS->ae2_lx2_table[txidx][r].numtrans++; + } np[r].head.time = -2; np[r].head.next = htemp; @@ -1194,6 +1220,23 @@ htemp = GLOBALS->ae2_lx2_table[txidx][r].histent_head; } + + { + struct HistEnt *htemp2 = calloc_2(1, sizeof(struct HistEnt)); + htemp2->time = -1; + if(len>1) + { + htemp2->v.h_vector = htemp->v.h_vector; + } + else + { + htemp2->v.h_val = htemp->v.h_val; + } + htemp2->next = htemp; + htemp = htemp2; + GLOBALS->ae2_lx2_table[txidx][r].numtrans++; + } + if(len>1) { np->head.v.h_vector = (char *)malloc_2(len); @@ -1222,8 +1265,11 @@ /* ...of AET2_IS_PRESENT */ /* - * $Id: ae2.c,v 1.6 2008/02/19 22:00:28 gtkwave Exp $ + * $Id: ae2.c,v 1.7 2008/06/17 18:03:45 gtkwave Exp $ * $Log: ae2.c,v $ + * Revision 1.7 2008/06/17 18:03:45 gtkwave + * added time = -1 endcaps + * * Revision 1.6 2008/02/19 22:00:28 gtkwave * added aetinfo support * diff --git a/src/analyzer.c b/src/analyzer.c index 1a08399..cb34480 100644 --- a/src/analyzer.c +++ b/src/analyzer.c @@ -24,6 +24,7 @@ #include "strace.h" #include "translate.h" #include "ptranslate.h" +#include "hierpack.h" #ifdef _MSC_VER #define strcasecmp _stricmp @@ -306,11 +307,25 @@ { if(!GLOBALS->hier_max_level) { - t->name = nd->nname; + int flagged; + + t->name = hier_decompress_flagged(nd->nname, &flagged); + t->is_depacked = (flagged != 0); } else { - t->name = hier_extract(nd->nname, GLOBALS->hier_max_level); + int flagged; + char *tbuff = hier_decompress_flagged(nd->nname, &flagged); + if(!flagged) + { + t->name = hier_extract(nd->nname, GLOBALS->hier_max_level); + } + else + { + t->name = strdup_2(hier_extract(tbuff, GLOBALS->hier_max_level)); + free_2(tbuff); + t->is_depacked = 1; + } } } @@ -455,7 +470,7 @@ } if(t->asciivalue) free_2(t->asciivalue); -if((t->is_alias)&&(t->name)) free_2(t->name); +if(((t->is_alias)||(t->is_depacked))&&(t->name)) free_2(t->name); free_2( t ); } @@ -637,7 +652,7 @@ { if(t->flags&TR_HIGHLIGHT) { - if((t->flags & (TR_BLANK|TR_COLLAPSED)) && (t->name)) + if(((t->flags & TR_ISCOLLAPSED)==(TR_ISCOLLAPSED)) && (t->name)) { tinsert=t; t=t->t_next; @@ -688,7 +703,7 @@ */ Trptr PrependBuffer(void) { -Trptr t, prev; +Trptr t, prev = NULL; if(!GLOBALS->traces.buffer) return(NULL); @@ -1088,8 +1103,17 @@ } /* - * $Id: analyzer.c,v 1.3 2008/01/02 18:17:26 gtkwave Exp $ + * $Id: analyzer.c,v 1.6 2008/08/05 17:49:39 gtkwave Exp $ * $Log: analyzer.c,v $ + * Revision 1.6 2008/08/05 17:49:39 gtkwave + * comment trace dnd fix + * + * Revision 1.5 2008/07/18 17:27:00 gtkwave + * adding hierpack code + * + * Revision 1.4 2008/06/11 08:01:40 gtkwave + * gcc 4.3.x compiler warning fixes + * * Revision 1.3 2008/01/02 18:17:26 gtkwave * added standard click semantics with user_standard_clicking rc variable * diff --git a/src/analyzer.h b/src/analyzer.h index b605991..ec6d31d 100644 --- a/src/analyzer.h +++ b/src/analyzer.h @@ -233,6 +233,7 @@ double d_minval, d_maxval; /* cached value for when auto scaling is turned off */ unsigned is_alias : 1; /* set when it's an alias (safe to free t->name then) */ + unsigned is_depacked : 1; /* set when it's been depacked from a compressed entry (safe to free t->name then) */ unsigned vector : 1; /* 1 if bit vector, 0 if node */ unsigned shift_drag_valid : 1; /* qualifies shift_drag above */ unsigned interactive_vector_needs_regeneration : 1; /* for interactive VCDs */ @@ -328,8 +329,11 @@ #endif /* - * $Id: analyzer.h,v 1.7 2008/03/25 03:22:05 gtkwave Exp $ + * $Id: analyzer.h,v 1.8 2008/07/18 17:27:00 gtkwave Exp $ * $Log: analyzer.h,v $ + * Revision 1.8 2008/07/18 17:27:00 gtkwave + * adding hierpack code + * * Revision 1.7 2008/03/25 03:22:05 gtkwave * expanded zero fill to include also a one fill (for pre-inverted nets) * diff --git a/src/baseconvert.c b/src/baseconvert.c index ccd83e6..eb8b707 100644 --- a/src/baseconvert.c +++ b/src/baseconvert.c @@ -91,7 +91,7 @@ pnt[i]=whichfill; } - bits = pnt; + bits = (unsigned char *)pnt; nbits = msi + 1; } } @@ -108,7 +108,7 @@ memcpy(pnt+i, bits, nbits); - bits = pnt; + bits = (unsigned char *)pnt; nbits = lsi + 1; } } @@ -1526,8 +1526,11 @@ } /* - * $Id: baseconvert.c,v 1.7 2008/03/25 03:22:06 gtkwave Exp $ + * $Id: baseconvert.c,v 1.8 2008/06/11 08:01:42 gtkwave Exp $ * $Log: baseconvert.c,v $ + * Revision 1.8 2008/06/11 08:01:42 gtkwave + * gcc 4.3.x compiler warning fixes + * * Revision 1.7 2008/03/25 03:22:06 gtkwave * expanded zero fill to include also a one fill (for pre-inverted nets) * diff --git a/src/bitvec.c b/src/bitvec.c index e9ad56d..144e526 100644 --- a/src/bitvec.c +++ b/src/bitvec.c @@ -28,12 +28,13 @@ #include "main.h" #include "menu.h" #include "busy.h" +#include "hierpack.h" #include /* * attempt to match top vs bottom rather than emit */ -char *attempt_vecmatch(char *s1, char *s2) +char *attempt_vecmatch_2(char *s1, char *s2) { char *s; char *p1, *p2; @@ -47,8 +48,6 @@ int totlen; int idx; -if((!s1)||(!*s1)||(!s2)||(!*s2)) return(NULL); - if(!strcmp(s1, s2)) { s = malloc_2(strlen(s1)+1); strcpy(s, s1); return(s); } p1 = s1; p2 = s2; @@ -147,20 +146,51 @@ s = malloc_2(totlen); memcpy(s, s1, pfxlen); idx = pfxlen; -s[idx] = '['; -idx++; +if(!(pfxlen && (s1[pfxlen-1]=='['))) + { + s[idx] = '['; + idx++; + } memcpy(s+idx, n1, n1len); idx += n1len; s[idx] = ':'; idx++; memcpy(s+idx, n2, n2len); idx += n2len; -s[idx] = ']'; -idx++; +if(*sfx != ']') + { + s[idx] = ']'; + idx++; + } if(sfxlen) { memcpy(s+idx, sfx, sfxlen); idx+=sfxlen; } s[idx] = 0; return(s); +} + + +char *attempt_vecmatch(char *s1, char *s2) +{ +char *pnt; + +if((!s1)||(!*s1)||(!s2)||(!*s2)) + { + return(NULL); + } + else + { + int ns1_was_decompressed; + char *ns1 = hier_decompress_flagged(s1, &ns1_was_decompressed); + int ns2_was_decompressed; + char *ns2 = hier_decompress_flagged(s2, &ns2_was_decompressed); + + pnt = attempt_vecmatch_2(ns1, ns2); + + if(ns1_was_decompressed) free_2(ns1); + if(ns2_was_decompressed) free_2(ns2); + + return(pnt); + } } @@ -1438,6 +1468,7 @@ char hier_delimeter2; char *name=NULL; char *s1, *s2; +int s1_was_packed, s2_was_packed; int root1len=0, root2len=0; int l1, l2; @@ -1470,8 +1501,8 @@ } -s1=symhi->n->nname; -s2=symlo->n->nname; +s1=hier_decompress_flagged(symhi->n->nname, &s1_was_packed); +s2=hier_decompress_flagged(symlo->n->nname, &s2_was_packed); l1=strlen(s1); @@ -1569,6 +1600,9 @@ } } } + +if(s1_was_packed) { free_2(s1); } +if(s2_was_packed) { free_2(s2); } return(name); } @@ -2825,8 +2859,14 @@ /****************/ /* - * $Id: bitvec.c,v 1.4 2007/09/23 18:33:53 gtkwave Exp $ + * $Id: bitvec.c,v 1.6 2008/07/18 19:54:56 gtkwave Exp $ * $Log: bitvec.c,v $ + * Revision 1.6 2008/07/18 19:54:56 gtkwave + * hierpack and vecmatch fixes with removal of extra brackets + * + * Revision 1.5 2008/07/18 19:37:00 gtkwave + * hierpack fix for makename + * * Revision 1.4 2007/09/23 18:33:53 gtkwave * warnings cleanups from sun compile * diff --git a/src/bsearch.c b/src/bsearch.c index ba75a9d..b588a8c 100644 --- a/src/bsearch.c +++ b/src/bsearch.c @@ -14,8 +14,8 @@ #include "symbol.h" #include "bsearch.h" #include "strace.h" +#include "hierpack.h" #include - static int compar_timechain(const void *s1, const void *s2) { @@ -213,6 +213,7 @@ s2=*((struct symbol **)v2); rc=sigcmp((char *)key,s2->name); + return(rc); } @@ -220,11 +221,18 @@ { struct symbol **rc; int len; +int was_packed = 0; if ((!ascii)||(!(len=strlen(ascii)))) return(NULL); if(rows_return) { *rows_return = 0; + } + +if(GLOBALS->hier_pfx) + { + ascii = hier_compress(ascii, HIERPACK_DO_NOT_ADD, &was_packed); + len = strlen(ascii); } if(ascii[len-1]=='}') @@ -247,6 +255,7 @@ if(whichrow <= (*rc)->n->array_height) { + if(was_packed) { free_2(ascii); } return(*rc); } } @@ -257,12 +266,16 @@ } rc=(struct symbol **)bsearch(ascii, GLOBALS->facs, GLOBALS->numfacs, sizeof(struct symbol *), compar_facs); +if(was_packed) { free_2(ascii); } if(rc) return(*rc); else return(NULL); } /* - * $Id: bsearch.c,v 1.5 2008/02/19 22:56:11 gtkwave Exp $ + * $Id: bsearch.c,v 1.6 2008/07/18 17:27:00 gtkwave Exp $ * $Log: bsearch.c,v $ + * Revision 1.6 2008/07/18 17:27:00 gtkwave + * adding hierpack code + * * Revision 1.5 2008/02/19 22:56:11 gtkwave * rtlbrowse update to handle aet time substitutions * diff --git a/src/currenttime.h b/src/currenttime.h index a6a4eb7..5a8c4c1 100644 --- a/src/currenttime.h +++ b/src/currenttime.h @@ -20,7 +20,7 @@ #include "regex_wave.h" #include "translate.h" -#define WAVE_VERSION_INFO "GTKWave Analyzer v3.1.10 (w)1999-2008 BSI" +#define WAVE_VERSION_INFO "GTKWave Analyzer v3.1.13 (w)1999-2008 BSI" #define WAVE_INF_SCALING (0.5) @@ -168,8 +168,29 @@ #endif /* - * $Id: currenttime.h,v 1.38 2008/05/14 21:08:19 gtkwave Exp $ + * $Id: currenttime.h,v 1.45 2008/08/21 03:48:45 gtkwave Exp $ * $Log: currenttime.h,v $ + * Revision 1.45 2008/08/21 03:48:45 gtkwave + * promote to 3.1.13 + * + * Revision 1.44 2008/07/20 01:29:36 gtkwave + * added command line option --comphier + * + * Revision 1.43 2008/07/14 22:39:22 gtkwave + * promote to 3.1.12 + * + * Revision 1.42 2008/07/12 22:54:12 gtkwave + * array of wires malformed vcd dump load abort fixed + * + * Revision 1.41 2008/07/01 18:51:06 gtkwave + * compiler warning fixes for amd64 + * + * Revision 1.40 2008/06/18 19:56:07 gtkwave + * 3.0.11 release building + * + * Revision 1.39 2008/06/11 08:01:47 gtkwave + * gcc 4.3.x compiler warning fixes + * * Revision 1.38 2008/05/14 21:08:19 gtkwave * revision bump to 3.1.10 * diff --git a/src/debug.h b/src/debug.h index 7fb8134..cfe3600 100644 --- a/src/debug.h +++ b/src/debug.h @@ -14,6 +14,12 @@ #include #include #include + +#ifndef _MSC_VER +#ifndef __MINGW32__ +#include +#endif +#endif #define WAVE_MAX_CLIST_LENGTH 15000 @@ -31,11 +37,11 @@ * types... */ #ifdef G_HAVE_GINT64 - typedef long long int TimeType; - typedef unsigned long long int UTimeType; - - /* typedef gint64 TimeType; */ - /* typedef guint64 UTimeType; */ + /* typedef long long int TimeType; */ + /* typedef unsigned long long int UTimeType; */ + + typedef gint64 TimeType; + typedef guint64 UTimeType; #ifndef _MSC_VER #define LLDescriptor(x) x##LL @@ -44,8 +50,13 @@ #define TTFormat "%I64d" #define UTTFormat "%I64u" #else - #define TTFormat "%lld" - #define UTTFormat "%llu" + #if __WORDSIZE == 64 + #define TTFormat "%ld" + #define UTTFormat "%lu" + #else + #define TTFormat "%lld" + #define UTTFormat "%llu" + #endif #endif #else #define LLDescriptor(x) x##i64 @@ -180,8 +191,11 @@ #endif /* - * $Id: debug.h,v 1.3 2007/08/26 21:35:40 gtkwave Exp $ + * $Id: debug.h,v 1.4 2008/07/01 18:51:06 gtkwave Exp $ * $Log: debug.h,v $ + * Revision 1.4 2008/07/01 18:51:06 gtkwave + * compiler warning fixes for amd64 + * * Revision 1.3 2007/08/26 21:35:40 gtkwave * integrated global context management from SystemOfCode2007 branch * diff --git a/src/edgebuttons.c b/src/edgebuttons.c index 683e22b..2beac71 100644 --- a/src/edgebuttons.c +++ b/src/edgebuttons.c @@ -479,10 +479,6 @@ void service_left_edge(GtkWidget *text, gpointer data) { -GtkAdjustment *hadj; -gfloat inc; -TimeType ntinc; - if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nFind Next Edge Left"); @@ -501,10 +497,6 @@ void service_right_edge(GtkWidget *text, gpointer data) { -GtkAdjustment *hadj; -gfloat inc; -TimeType ntinc, pageinc; - if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nFind Next Edge Right"); @@ -581,8 +573,11 @@ } /* - * $Id: edgebuttons.c,v 1.5 2008/05/01 02:53:37 gtkwave Exp $ + * $Id: edgebuttons.c,v 1.6 2008/06/11 08:01:48 gtkwave Exp $ * $Log: edgebuttons.c,v $ + * Revision 1.6 2008/06/11 08:01:48 gtkwave + * gcc 4.3.x compiler warning fixes + * * Revision 1.5 2008/05/01 02:53:37 gtkwave * edgebutton fix (went back two edges on a concat vector instead of one) * diff --git a/src/fonts.c b/src/fonts.c index 13b2b45..17e6e1f 100644 --- a/src/fonts.c +++ b/src/fonts.c @@ -168,7 +168,7 @@ (struct font_engine_font_t *font, const gchar *string) { -gint rc; +gint rc = 1; /* dummy value */ if(!font->is_pango) { @@ -336,8 +336,11 @@ /* - * $Id: fonts.c,v 1.9 2008/02/20 18:55:14 gtkwave Exp $ + * $Id: fonts.c,v 1.10 2008/07/01 18:51:06 gtkwave Exp $ * $Log: fonts.c,v $ + * Revision 1.10 2008/07/01 18:51:06 gtkwave + * compiler warning fixes for amd64 + * * Revision 1.9 2008/02/20 18:55:14 gtkwave * strncmp length fix from previous update * diff --git a/src/ghwlib.c b/src/ghwlib.c index b4be7b7..44c8835 100644 --- a/src/ghwlib.c +++ b/src/ghwlib.c @@ -1161,7 +1161,7 @@ return -1; h->snap_time = ghw_get_i64 (h, (unsigned char *)&hdr[4]); if (h->flag_verbose > 1) - printf ("Time is %lld fs\n", h->snap_time); + printf ("Time is "GHWLLD" fs\n", h->snap_time); for (i = 0; i < h->nbr_sigs; i++) { @@ -1294,7 +1294,7 @@ printf ("%d", val->i32); break; case ghdl_rtik_type_p64: - printf ("%lld", val->i64); + printf (GHWLLD, val->i64); break; case ghdl_rtik_type_f64: printf ("%g", val->f64); @@ -1348,7 +1348,7 @@ snprintf (buf, len, "%d", val->i32); break; case ghdl_rtik_type_p64: - snprintf (buf, len, "%lld", val->i64); + snprintf (buf, len, GHWLLD, val->i64); break; case ghdl_rtik_type_f64: snprintf (buf, len, "%g", val->f64); @@ -1505,7 +1505,7 @@ break; case ghw_sm_cycle: if (0) - printf ("Time is %lld fs\n", h->snap_time); + printf ("Time is "GHWLLD" fs\n", h->snap_time); if (0) ghw_disp_values (h); @@ -1543,7 +1543,7 @@ return res; if (0) - printf ("Time is %lld fs\n", h->snap_time); + printf ("Time is "GHWLLD" fs\n", h->snap_time); if (0) ghw_disp_values (h); @@ -1670,7 +1670,7 @@ break; case ghdl_rtik_type_i64: case ghdl_rtik_type_p64: - printf ("%lld %s %lld", + printf (GHWLLD" %s "GHWLLD, rng->i64.left, ghw_get_dir (rng->i64.dir), rng->i64.right); break; case ghdl_rtik_type_f64: @@ -1723,7 +1723,7 @@ for (i = 0; i < p->nbr_units; i++) { struct ghw_unit *u = &p->units[i]; - printf (" %s = %lld %s;\n", u->name, u->val, p->units[0].name); + printf (" %s = "GHWLLD" %s;\n", u->name, u->val, p->units[0].name); } printf ("end units\n"); } @@ -1804,8 +1804,11 @@ } /* - * $Id: ghwlib.c,v 1.2 2007/08/26 21:35:40 gtkwave Exp $ + * $Id: ghwlib.c,v 1.3 2008/07/01 18:51:06 gtkwave Exp $ * $Log: ghwlib.c,v $ + * Revision 1.3 2008/07/01 18:51:06 gtkwave + * compiler warning fixes for amd64 + * * Revision 1.2 2007/08/26 21:35:40 gtkwave * integrated global context management from SystemOfCode2007 branch * diff --git a/src/ghwlib.h b/src/ghwlib.h index f8cfe27..a33e32e 100644 --- a/src/ghwlib.h +++ b/src/ghwlib.h @@ -26,9 +26,21 @@ #if HAVE_STDINT_H #include +#if __WORDSIZE == 64 + #define GHWLLD "%ld" +#else + #define GHWLLD "%lld" +#endif #endif #if HAVE_INTTYPES_H #include +#ifndef GHWLLD +#if __WORDSIZE == 64 + #define GHWLLD "%ld" +#else + #define GHWLLD "%lld" +#endif +#endif #endif enum ghdl_rtik { @@ -405,8 +417,11 @@ #endif /* _GHWLIB_H_ */ /* - * $Id: ghwlib.h,v 1.2 2007/08/26 21:35:41 gtkwave Exp $ + * $Id: ghwlib.h,v 1.3 2008/07/01 18:51:06 gtkwave Exp $ * $Log: ghwlib.h,v $ + * Revision 1.3 2008/07/01 18:51:06 gtkwave + * compiler warning fixes for amd64 + * * Revision 1.2 2007/08/26 21:35:41 gtkwave * integrated global context management from SystemOfCode2007 branch * diff --git a/src/globals.c b/src/globals.c index 10f22a0..5a5e518 100644 --- a/src/globals.c +++ b/src/globals.c @@ -827,6 +827,14 @@ /* * vcd.c */ +0, /* do_hier_compress */ +NULL, /* hier_pfx */ +0, /* hier_pfx_cnt */ +NULL, /* prev_hier_pfx */ +0, /* prev_hier_pfx_len */ +0, /* prev_hier_pfx_cnt */ +NULL, /* pfx_hier_array */ +NULL, /* prev_hier_uncompressed_name */ NULL, /* vcd_jmp_buf */ -1, /* vcd_warning_filesize 472 */ 1, /* autocoalesce 473 */ @@ -1177,12 +1185,11 @@ { FILE *statefile; struct Global *new_globals, *setjmp_globals; - int i; gint tree_frame_x = -1, tree_frame_y = -1; gdouble tree_vadj_value = 0.0; gdouble tree_hadj_value = 0.0; int fix_from_time = 0, fix_to_time = 0; - TimeType from_time, to_time; + TimeType from_time = LLDescriptor(0), to_time = LLDescriptor(0); char timestr[32]; struct stringchain_t *hier_head = NULL, *hier_curr = NULL; int load_was_success = 0; @@ -1446,6 +1453,7 @@ new_globals->convert_to_reals = GLOBALS->convert_to_reals; new_globals->disable_mouseover = GLOBALS->disable_mouseover; new_globals->disable_tooltips = GLOBALS->disable_tooltips; + new_globals->do_hier_compress = GLOBALS->do_hier_compress; new_globals->do_initial_zoom_fit = GLOBALS->do_initial_zoom_fit; new_globals->do_resize_signals = GLOBALS->do_resize_signals; new_globals->enable_fast_exit = GLOBALS->enable_fast_exit; @@ -1497,6 +1505,10 @@ strcpy2_into_new_context(new_globals, &new_globals->fontname_signals, &GLOBALS->fontname_signals); strcpy2_into_new_context(new_globals, &new_globals->fontname_waves, &GLOBALS->fontname_waves); + /* hierarchy handling from vcd.c */ + if(GLOBALS->hier_pfx) { jrb_free_tree(GLOBALS->hier_pfx); GLOBALS->hier_pfx = NULL; } + + /* vlist.c */ if(GLOBALS->vlist_handle) { @@ -1591,6 +1603,7 @@ #endif break; + case NO_FILE: case GHW_FILE: case VCD_FILE: case VCD_RECODER_FILE: /* do nothing */ break; @@ -1773,6 +1786,7 @@ case LXT_FILE: lxt_main(GLOBALS->loaded_file_name); break; case VCD_FILE: vcd_main(GLOBALS->loaded_file_name); break; case VCD_RECODER_FILE: vcd_recoder_main(GLOBALS->loaded_file_name); break; + default: break; } t = (void **)setjmp_globals->alloc2_chain; @@ -1819,6 +1833,8 @@ /* now try again, jump through recovery sequence below */ } break; + default: + break; } set_window_idle(NULL); @@ -2086,6 +2102,7 @@ #endif break; + case NO_FILE: case GHW_FILE: case VCD_FILE: case VCD_RECODER_FILE: /* do nothing */ break; diff --git a/src/globals.h b/src/globals.h index 3920a30..d4238ef 100644 --- a/src/globals.h +++ b/src/globals.h @@ -52,7 +52,7 @@ #include"vlist.h" #include"vzt.h" #include"wavealloca.h" - +#include"jrb.h" struct Global{ @@ -822,6 +822,14 @@ /* * vcd.c */ +unsigned char do_hier_compress; /* from vcd.c */ +JRB hier_pfx; /* from vcd.c */ +unsigned int hier_pfx_cnt; /* from vcd.c */ +char *prev_hier_pfx; /* from vcd.c */ +int prev_hier_pfx_len; /* from vcd.c */ +unsigned int prev_hier_pfx_cnt; /* from vcd.c */ +char **pfx_hier_array; /* from vcd.c */ +char *prev_hier_uncompressed_name; /* from vcd.c */ jmp_buf *vcd_jmp_buf; /* from vcd.c */ int vcd_warning_filesize; /* from vcd.c 502 */ char autocoalesce; /* from vcd.c 503 */ diff --git a/src/helpers/ghwdump.c b/src/helpers/ghwdump.c index 6216dee..8ba9837 100644 --- a/src/helpers/ghwdump.c +++ b/src/helpers/ghwdump.c @@ -176,7 +176,7 @@ case ghw_res_snapshot: case ghw_res_cycle: if (flag_disp_time) - printf ("Time is %lld fs\n", hp->snap_time); + printf ("Time is "GHWLLD" fs\n", hp->snap_time); if (flag_disp_signals) ghw_disp_values (hp); break; @@ -202,8 +202,11 @@ } /* - * $Id: ghwdump.c,v 1.1.1.1 2007/05/30 04:28:15 gtkwave Exp $ + * $Id: ghwdump.c,v 1.2 2008/07/01 18:51:07 gtkwave Exp $ * $Log: ghwdump.c,v $ + * Revision 1.2 2008/07/01 18:51:07 gtkwave + * compiler warning fixes for amd64 + * * Revision 1.1.1.1 2007/05/30 04:28:15 gtkwave * Imported sources * diff --git a/src/helpers/lxt2_read.h b/src/helpers/lxt2_read.h index c7548bc..174c61e 100644 --- a/src/helpers/lxt2_read.h +++ b/src/helpers/lxt2_read.h @@ -73,7 +73,11 @@ typedef uint32_t lxtint32_t; typedef uint64_t lxtint64_t; #ifndef __MINGW32__ -#define LXT2_RD_LLD "%lld" +#if __WORDSIZE == 64 + #define LXT2_RD_LLD "%ld" +#else + #define LXT2_RD_LLD "%lld" +#endif #else #define LXT2_RD_LLD "%I64d" #endif @@ -283,8 +287,11 @@ #endif /* - * $Id: lxt2_read.h,v 1.1.1.1 2007/05/30 04:28:18 gtkwave Exp $ + * $Id: lxt2_read.h,v 1.2 2008/07/01 18:51:07 gtkwave Exp $ * $Log: lxt2_read.h,v $ + * Revision 1.2 2008/07/01 18:51:07 gtkwave + * compiler warning fixes for amd64 + * * Revision 1.1.1.1 2007/05/30 04:28:18 gtkwave * Imported sources * diff --git a/src/helpers/lxt2miner.c b/src/helpers/lxt2miner.c index 802d4d5..f1c60f1 100644 --- a/src/helpers/lxt2miner.c +++ b/src/helpers/lxt2miner.c @@ -43,7 +43,7 @@ { struct lxt2_rd_geometry *g = lxt2_rd_get_fac_geometry(*lt, *pnt_facidx); -/* fprintf(stderr, "%lld %d %s\n", *pnt_time, *pnt_facidx, *pnt_value); */ +/* fprintf(stderr, LXT2_RD_LLD" %d %s\n", *pnt_time, *pnt_facidx, *pnt_value); */ if(!(*pnt_value)[0]) { @@ -74,7 +74,7 @@ { if(!names_only) { - printf("#%lld %s[%d:%d] %s\n", *pnt_time, lxt2_rd_get_facname(*lt, *pnt_facidx), g->msb, g->lsb, *pnt_value); + printf("#"LXT2_RD_LLD" %s[%d:%d] %s\n", *pnt_time, lxt2_rd_get_facname(*lt, *pnt_facidx), g->msb, g->lsb, *pnt_value); } else { @@ -87,7 +87,7 @@ { if(!names_only) { - printf("#%lld %s %s\n", *pnt_time, lxt2_rd_get_facname(*lt, *pnt_facidx), *pnt_value); + printf("#"LXT2_RD_LLD" %s %s\n", *pnt_time, lxt2_rd_get_facname(*lt, *pnt_facidx), *pnt_value); } else { @@ -98,7 +98,7 @@ { if(!names_only) { - printf("#%lld %s[%d] %s\n", *pnt_time, lxt2_rd_get_facname(*lt, *pnt_facidx), g->msb, *pnt_value); + printf("#"LXT2_RD_LLD" %s[%d] %s\n", *pnt_time, lxt2_rd_get_facname(*lt, *pnt_facidx), g->msb, *pnt_value); } else { @@ -306,8 +306,11 @@ } /* - * $Id: lxt2miner.c,v 1.1.1.1 2007/05/30 04:28:25 gtkwave Exp $ + * $Id: lxt2miner.c,v 1.2 2008/07/01 18:51:07 gtkwave Exp $ * $Log: lxt2miner.c,v $ + * Revision 1.2 2008/07/01 18:51:07 gtkwave + * compiler warning fixes for amd64 + * * Revision 1.1.1.1 2007/05/30 04:28:25 gtkwave * Imported sources * diff --git a/src/helpers/lxt2vcd.c b/src/helpers/lxt2vcd.c index b87ac7a..4f0452d 100644 --- a/src/helpers/lxt2vcd.c +++ b/src/helpers/lxt2vcd.c @@ -88,12 +88,12 @@ { struct lxt2_rd_geometry *g = lxt2_rd_get_fac_geometry(*lt, *pnt_facidx); -/* fprintf(stderr, "%lld %d %s\n", *pnt_time, *pnt_facidx, *pnt_value); */ +/* fprintf(stderr, LXT2_RD_LLD" %d %s\n", *pnt_time, *pnt_facidx, *pnt_value); */ if(vcd_prevtime != *pnt_time) { vcd_prevtime = *pnt_time; - printf("#%lld\n", *pnt_time); + printf("#"LXT2_RD_LLD"\n", *pnt_time); } if(!(*pnt_value)[0]) @@ -257,7 +257,7 @@ if(vcd_prevtime!=lxt2_rd_get_end_time(lt)) { - printf("#%lld\n", lxt2_rd_get_end_time(lt)); + printf("#"LXT2_RD_LLD"\n", lxt2_rd_get_end_time(lt)); } lxt2_rd_close(lt); @@ -381,8 +381,11 @@ } /* - * $Id: lxt2vcd.c,v 1.1.1.1 2007/05/30 04:28:25 gtkwave Exp $ + * $Id: lxt2vcd.c,v 1.2 2008/07/01 18:51:07 gtkwave Exp $ * $Log: lxt2vcd.c,v $ + * Revision 1.2 2008/07/01 18:51:07 gtkwave + * compiler warning fixes for amd64 + * * Revision 1.1.1.1 2007/05/30 04:28:25 gtkwave * Imported sources * diff --git a/src/helpers/tla2vcd.c b/src/helpers/tla2vcd.c index 2b46402..3913bbc 100644 --- a/src/helpers/tla2vcd.c +++ b/src/helpers/tla2vcd.c @@ -23,6 +23,13 @@ #include #include #include + +#ifdef __MINGW32__ +#ifndef REGEX_MAY_COMPILE +#define REGEX_MAY_COMPILE +#include "../gnu_regex.c" +#endif +#endif #include "../gnu_regex.h" @@ -553,8 +560,14 @@ } /* - * $Id: tla2vcd.c,v 1.2 2007/08/31 22:42:44 gtkwave Exp $ + * $Id: tla2vcd.c,v 1.4 2008/05/23 07:02:44 gtkwave Exp $ * $Log: tla2vcd.c,v $ + * Revision 1.4 2008/05/23 07:02:44 gtkwave + * path fix on gnu_regex.c + * + * Revision 1.3 2008/05/23 04:50:28 gtkwave + * mingw compile fix + * * Revision 1.2 2007/08/31 22:42:44 gtkwave * 3.1.0 RC3 updates * diff --git a/src/helpers/vzt2vcd.c b/src/helpers/vzt2vcd.c index 48039f8..cdeb94b 100644 --- a/src/helpers/vzt2vcd.c +++ b/src/helpers/vzt2vcd.c @@ -90,12 +90,12 @@ { struct vzt_rd_geometry *g = vzt_rd_get_fac_geometry(*lt, *pnt_facidx); -/* fprintf(stderr, "%lld %d %s\n", *pnt_time, *pnt_facidx, *pnt_value); */ +/* fprintf(stderr, VZT_RD_LLD" %d %s\n", *pnt_time, *pnt_facidx, *pnt_value); */ if(vcd_prevtime != *pnt_time) { vcd_prevtime = *pnt_time; - printf("#%lld\n", *pnt_time); + printf("#"VZT_RD_LLD"\n", *pnt_time); } if(!(*pnt_value)[0]) @@ -241,7 +241,7 @@ { if(!(g->flags & VZT_RD_SYM_F_INTEGER)) { - printf("$var wire %d %s %s[%d:%d] $end\n", g->len, vcdid(newindx), netname, g->msb, g->lsb); + if(g->len) printf("$var wire %d %s %s[%d:%d] $end\n", g->len, vcdid(newindx), netname, g->msb, g->lsb); } else { @@ -266,7 +266,7 @@ if(vcd_prevtime!=vzt_rd_get_end_time(lt)) { - printf("#%lld\n", vzt_rd_get_end_time(lt)); + printf("#"VZT_RD_LLD"\n", vzt_rd_get_end_time(lt)); } vzt_rd_close(lt); @@ -396,8 +396,14 @@ } /* - * $Id: vzt2vcd.c,v 1.1.1.1 2007/05/30 04:28:25 gtkwave Exp $ + * $Id: vzt2vcd.c,v 1.3 2008/07/19 23:26:49 gtkwave Exp $ * $Log: vzt2vcd.c,v $ + * Revision 1.3 2008/07/19 23:26:49 gtkwave + * fixed buffer overflow in vectorization code + * + * Revision 1.2 2008/07/01 18:51:07 gtkwave + * compiler warning fixes for amd64 + * * Revision 1.1.1.1 2007/05/30 04:28:25 gtkwave * Imported sources * diff --git a/src/helpers/vzt_read.c b/src/helpers/vzt_read.c index bbead0e..4faa1f5 100644 --- a/src/helpers/vzt_read.c +++ b/src/helpers/vzt_read.c @@ -578,6 +578,8 @@ { for(i=0;i=lt->numfacs) break; + vindex_offset = lt->vindex_offset[facidx+i]; vindex_offset_x = vindex_offset + lt->total_values; @@ -591,6 +593,8 @@ { for(i=0;i=lt->numfacs) break; + vindex_offset = lt->vindex_offset[facidx+i]; valpnt = b->change_dict + (b->vindex[vindex_offset] * row_size + word); @@ -665,8 +669,10 @@ vztint32_t *valpnt_x; int which; - for(i=0;i=lt->numfacs) break; + vindex_offset = lt->vindex_offset[facidx+i]; vindex_offset_x = vindex_offset + lt->total_values; @@ -681,6 +687,8 @@ { for(i=0;i=lt->numfacs) break; + vindex_offset = lt->vindex_offset[facidx+i]; valpnt = val_base + (b->vindex[vindex_offset] * row_size); @@ -2045,7 +2053,10 @@ lt->vindex_offset[i] = lt->vindex_offset[j]; for(k=1;klen[i];k++) { - lt->vindex_offset[k+i] = lt->vindex_offset[vzt_rd_get_alias_root(lt, k+i)]; + if((k+i) <= (lt->numfacs-1)) + { + lt->vindex_offset[k+i] = lt->vindex_offset[vzt_rd_get_alias_root(lt, k+i)]; + } } if(synvec_chain[j]) @@ -2060,7 +2071,10 @@ { for(l=0;llen[i];l++) { - if(lt->vindex_offset[idx+l] != lt->vindex_offset[i+l]) break; + if((idx+l)<=(lt->numfacs-1)) + { + if(lt->vindex_offset[idx+l] != lt->vindex_offset[i+l]) break; + } } if(l == (lt->len[i])) @@ -2332,8 +2346,11 @@ } /* - * $Id: vzt_read.c,v 1.1.1.1 2007/05/30 04:28:22 gtkwave Exp $ + * $Id: vzt_read.c,v 1.2 2008/07/19 23:26:49 gtkwave Exp $ * $Log: vzt_read.c,v $ + * Revision 1.2 2008/07/19 23:26:49 gtkwave + * fixed buffer overflow in vectorization code + * * Revision 1.1.1.1 2007/05/30 04:28:22 gtkwave * Imported sources * diff --git a/src/helpers/vzt_read.h b/src/helpers/vzt_read.h index 31ccd40..ed4754c 100644 --- a/src/helpers/vzt_read.h +++ b/src/helpers/vzt_read.h @@ -74,7 +74,11 @@ typedef uint32_t vztint32_t; typedef uint64_t vztint64_t; #ifndef __MINGW32__ -#define VZT_RD_LLD "%lld" +#if __WORDSIZE == 64 + #define VZT_RD_LLD "%ld" +#else + #define VZT_RD_LLD "%lld" +#endif #else #define VZT_RD_LLD "%I64d" #endif @@ -269,8 +273,11 @@ #endif /* - * $Id: vzt_read.h,v 1.1.1.1 2007/05/30 04:28:18 gtkwave Exp $ + * $Id: vzt_read.h,v 1.2 2008/07/01 18:51:07 gtkwave Exp $ * $Log: vzt_read.h,v $ + * Revision 1.2 2008/07/01 18:51:07 gtkwave + * compiler warning fixes for amd64 + * * Revision 1.1.1.1 2007/05/30 04:28:18 gtkwave * Imported sources * diff --git a/src/helpers/vztminer.c b/src/helpers/vztminer.c index 384ea22..7dff420 100644 --- a/src/helpers/vztminer.c +++ b/src/helpers/vztminer.c @@ -44,7 +44,7 @@ { struct vzt_rd_geometry *g = vzt_rd_get_fac_geometry(*lt, *pnt_facidx); -/* fprintf(stderr, "%lld %d %s\n", *pnt_time, *pnt_facidx, *pnt_value); */ +/* fprintf(stderr, VZT_RD_LLD" %d %s\n", *pnt_time, *pnt_facidx, *pnt_value); */ if(!(*pnt_value)[0]) { @@ -75,7 +75,7 @@ { if(!names_only) { - printf("#%lld %s[%d:%d] %s\n", *pnt_time, vzt_rd_get_facname(*lt, *pnt_facidx), g->msb, g->lsb, *pnt_value); + printf("#"VZT_RD_LLD" %s[%d:%d] %s\n", *pnt_time, vzt_rd_get_facname(*lt, *pnt_facidx), g->msb, g->lsb, *pnt_value); } else { @@ -88,7 +88,7 @@ { if(!names_only) { - printf("#%lld %s %s\n", *pnt_time, vzt_rd_get_facname(*lt, *pnt_facidx), *pnt_value); + printf("#"VZT_RD_LLD" %s %s\n", *pnt_time, vzt_rd_get_facname(*lt, *pnt_facidx), *pnt_value); } else { @@ -99,7 +99,7 @@ { if(!names_only) { - printf("#%lld %s[%d] %s\n", *pnt_time, vzt_rd_get_facname(*lt, *pnt_facidx), g->msb, *pnt_value); + printf("#"VZT_RD_LLD" %s[%d] %s\n", *pnt_time, vzt_rd_get_facname(*lt, *pnt_facidx), g->msb, *pnt_value); } else { @@ -308,8 +308,11 @@ } /* - * $Id: vztminer.c,v 1.1.1.1 2007/05/30 04:28:22 gtkwave Exp $ + * $Id: vztminer.c,v 1.2 2008/07/01 18:51:07 gtkwave Exp $ * $Log: vztminer.c,v $ + * Revision 1.2 2008/07/01 18:51:07 gtkwave + * compiler warning fixes for amd64 + * * Revision 1.1.1.1 2007/05/30 04:28:22 gtkwave * Imported sources * diff --git a/src/hierpack.c b/src/hierpack.c new file mode 100644 index 0000000..72778c2 --- /dev/null +++ b/src/hierpack.c @@ -0,0 +1,178 @@ +/* + * Copyright (c) Tony Bybell 2008. + * + * 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 Software Foundation; either version 2 + * of the License, or (at your option) any later version. + */ + +#include "hierpack.h" + +char *hier_decompress(char *n) +{ +char *recon; + +if(*n & 0x80) + { + unsigned char varbuff[5]; + int idx = 0; + int lhs, rhs, tot; + unsigned int idxval = 0; + while(*n & 0x80) + { + varbuff[idx] = *n & 0x7f; + n++; + idx++; + } + while(--idx >= 0) + { + idxval <<= 7; + idxval |= (unsigned int)varbuff[idx]; + } + + lhs = strlen(GLOBALS->pfx_hier_array[idxval]); + rhs = strlen(n); + tot = lhs + rhs + 1; + recon = malloc_2(tot); + strcpy(recon, GLOBALS->pfx_hier_array[idxval]); + strcpy(recon + lhs, n); + } + else + { + recon = n; + } + +return(recon); +} + + +char *hier_decompress_flagged(char *n, int *was_packed) +{ +if(n) + { + *was_packed = ((*n & 0x80) != 0); + return(hier_decompress(n)); + } + else + { + return(n); + } +} + + +char *hier_compress(char *name, int add_missing_pfx_to_tree, int *was_packed) +{ +char *pnt = name; +char *last_h = NULL; +int curr_pfx_len; +JRB node; + +*was_packed = 0; + +while(*pnt) + { + if(*pnt == GLOBALS->hier_delimeter) last_h = pnt; + pnt++; + } +pnt = name; + +if(last_h) + { + unsigned char varidx[5]; + unsigned int shiftval; + unsigned int shiftidx; + unsigned int shiftmasked; + unsigned int pfxlen, sfxlen; + + if(!GLOBALS->hier_pfx) + { + GLOBALS->hier_pfx = make_jrb(); + GLOBALS->prev_hier_pfx = strdup_2(""); + GLOBALS->prev_hier_pfx_len = 0; + + fprintf(stderr, "MEMPACK | Using compressed hierarchy names\n"); + } + curr_pfx_len = last_h - pnt + 1; + *last_h = 0; + if(GLOBALS->prev_hier_pfx_len && (GLOBALS->prev_hier_pfx_len == curr_pfx_len) && !strcmp(GLOBALS->prev_hier_pfx, pnt)) + { + /* pfx matches so reuse */ + } + else + { + node = jrb_find_str(GLOBALS->hier_pfx, pnt); + if(!node) + { + Jval val; + val.ui = GLOBALS->prev_hier_pfx_cnt = GLOBALS->hier_pfx_cnt; + if(add_missing_pfx_to_tree) + { + node = jrb_insert_str(GLOBALS->hier_pfx, strdup_2(pnt), val); + GLOBALS->hier_pfx_cnt++; + /* printf("Add %d: '%s' %d\n", node->val.ui, node->key.s, GLOBALS->hier_pfx_cnt); */ + } + } + else + { + GLOBALS->prev_hier_pfx_cnt = node->val.ui; + } + } + + shiftval = GLOBALS->prev_hier_pfx_cnt; + shiftidx = 0; + + for(shiftidx=0;;shiftidx++) + { + shiftmasked = (shiftval & 0x7f) | 0x80; /* 0x80 = hier idx marker */ + shiftval >>= 7; + if(!shiftval) + { + varidx[shiftidx] = shiftmasked; + shiftidx++; + break; + } + varidx[shiftidx] = shiftmasked; + } + + pfxlen = shiftidx; + sfxlen = strlen(last_h+1); + if(curr_pfx_len > pfxlen) + { + static int savecnt = 0; + char *namereplace = malloc_2(pfxlen + 1 + sfxlen + 1); + memcpy(namereplace, varidx, pfxlen); + namereplace[pfxlen] = GLOBALS->hier_delimeter; + strcpy(namereplace+pfxlen+1, last_h+1); + *was_packed = 1; + name = namereplace; + savecnt += curr_pfx_len+1-pfxlen; + } + + *last_h = GLOBALS->hier_delimeter; + } + else + { + /* no leading hier */ + } + +return(name); +} + +/* + * $Id: hierpack.c,v 1.4 2008/07/20 20:48:08 gtkwave Exp $ + * $Log: hierpack.c,v $ + * Revision 1.4 2008/07/20 20:48:08 gtkwave + * compressed hierarchy support + * + * Revision 1.3 2008/07/20 01:29:36 gtkwave + * added command line option --comphier + * + * Revision 1.2 2008/07/18 17:29:50 gtkwave + * adding cvs headers + * + * Revision 1.1 2008/07/18 17:27:01 gtkwave + * adding hierpack code + * + */ + diff --git a/src/hierpack.h b/src/hierpack.h new file mode 100644 index 0000000..e508059 --- /dev/null +++ b/src/hierpack.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) Tony Bybell 2008. + * + * 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 Software Foundation; either version 2 + * of the License, or (at your option) any later version. + */ + +#ifndef WAVE_HIERPACK_H +#define WAVE_HIERPACK_H + +#include "globals.h" + +char *hier_decompress(char *n); +char *hier_decompress_flagged(char *n, int *was_packed); + +char *hier_compress(char *name, int add_missing_pfx_to_tree, int *was_packed); + +enum { HIERPACK_DO_NOT_ADD = 0, HIERPACK_ADD }; + +#endif + +/* + * $Id: hierpack.h,v 1.2 2008/07/18 17:29:50 gtkwave Exp $ + * $Log: hierpack.h,v $ + * Revision 1.2 2008/07/18 17:29:50 gtkwave + * adding cvs headers + * + * Revision 1.1 2008/07/18 17:27:01 gtkwave + * adding hierpack code + * + */ + diff --git a/src/interp.c b/src/interp.c index c9291ed..7d82552 100644 --- a/src/interp.c +++ b/src/interp.c @@ -34,7 +34,7 @@ #include #include -#ifdef __MINGW32__ +#ifndef HAVE_BZERO #define bcopy(a,b,c) memcpy((b),(a),(c)) #define bzero(a,b) memset((a),0,(b)) #define bcmp(a,b,c) memcmp((a),(b),(c)) @@ -355,8 +355,11 @@ } /* - * $Id: interp.c,v 1.1 2008/02/15 16:30:58 gtkwave Exp $ + * $Id: interp.c,v 1.2 2008/05/29 15:54:16 gtkwave Exp $ * $Log: interp.c,v $ + * Revision 1.2 2008/05/29 15:54:16 gtkwave + * added HAVE_BZERO patches for MinGW + * * Revision 1.1 2008/02/15 16:30:58 gtkwave * re-added after permission fix * diff --git a/src/jrb.c b/src/jrb.c new file mode 100644 index 0000000..1fb17b4 --- /dev/null +++ b/src/jrb.c @@ -0,0 +1,619 @@ +/* + * Libraries for fields, doubly-linked lists and red-black trees. + * Copyright (C) 2001 James S. Plank + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + */ + +/* Revision 1.2. Jim Plank */ + +/* Original code by Jim Plank (plank@cs.utk.edu) */ +/* modified for THINK C 6.0 for Macintosh by Chris Bartley */ + +#include +#include +#include +#include +#include "jrb.h" + +static void mk_new_int(JRB l, JRB r, JRB p, int il); +static JRB lprev(JRB n); +static JRB rprev(JRB n); +static void recolor(JRB n); +static void single_rotate(JRB y, int l); + +#define isred(n) (n->red) +#define isblack(n) (!isred(n)) +#define isleft(n) (n->left) +#define isright(n) (!isleft(n)) +#define isint(n) (n->internal) +#define isext(n) (!isint(n)) +#define ishead(n) (n->roothead & 2) +#define isroot(n) (n->roothead & 1) +#define getlext(n) ((struct jrb_node *)(n->key.v)) +#define setlext(node, val) node->key.v = (void *) (val) +#define getrext(n) ((struct jrb_node *)(n->val.v)) +#define setrext(node, value) node->val.v = (void *) (value) +#define setred(n) n->red = 1 +#define setblack(n) n->red = 0 +#define setleft(n) n->left = 1 +#define setright(n) n->left = 0 +#define sethead(n) (n->roothead |= 2) +#define setroot(n) (n->roothead |= 1) +#define setint(n) n->internal = 1 +#define setext(n) n->internal = 0 +#define setnormal(n) n->roothead = 0 +#define sibling(n) ((isleft(n)) ? n->parent->blink : n->parent->flink) + +static void insert(JRB item, JRB list) /* Inserts to the end of a list */ +{ + JRB last_node; + + last_node = list->blink; + + list->blink = item; + last_node->flink = item; + item->blink = last_node; + item->flink = list; +} + +static void delete_item(JRB item) /* Deletes an arbitrary iterm */ +{ + item->flink->blink = item->blink; + item->blink->flink = item->flink; +} + +#define mk_new_ext(new, kkkey, vvval) {\ + new = (JRB) calloc(1, sizeof(struct jrb_node));\ + new->val = vvval;\ + new->key = kkkey;\ + setext(new);\ + setblack(new);\ + setnormal(new);\ +} + +static void mk_new_int(JRB l, JRB r, JRB p, int il) +{ + JRB newnode; + + newnode = (JRB) calloc(1, sizeof(struct jrb_node)); + setint(newnode); + setred(newnode); + setnormal(newnode); + newnode->flink = l; + newnode->blink = r; + newnode->parent = p; + setlext(newnode, l); + setrext(newnode, r); + l->parent = newnode; + r->parent = newnode; + setleft(l); + setright(r); + if (ishead(p)) { + p->parent = newnode; + setroot(newnode); + } else if (il) { + setleft(newnode); + p->flink = newnode; + } else { + setright(newnode); + p->blink = newnode; + } + recolor(newnode); +} + + +JRB lprev(JRB n) +{ + if (ishead(n)) return n; + while (!isroot(n)) { + if (isright(n)) return n->parent; + n = n->parent; + } + return n->parent; +} + +JRB rprev(JRB n) +{ + if (ishead(n)) return n; + while (!isroot(n)) { + if (isleft(n)) return n->parent; + n = n->parent; + } + return n->parent; +} + +JRB make_jrb() +{ + JRB head; + + head = (JRB) calloc (1, sizeof(struct jrb_node)); + head->flink = head; + head->blink = head; + head->parent = head; + head->key.s = ""; + sethead(head); + return head; +} + +JRB jrb_find_gte_str(JRB n, char *key, int *fnd) +{ + int cmp; + + *fnd = 0; + if (!ishead(n)) { + fprintf(stderr, "jrb_find_gte_str called on non-head 0x%p\n", n); + exit(1); + } + if (n->parent == n) return n; + cmp = strcmp(key, n->blink->key.s); + if (cmp == 0) { + *fnd = 1; + return n->blink; + } + if (cmp > 0) return n; + else n = n->parent; + while (1) { + if (isext(n)) return n; + cmp = strcmp(key, getlext(n)->key.s); + if (cmp == 0) { + *fnd = 1; + return getlext(n); + } + if (cmp < 0) n = n->flink ; else n = n->blink; + } +} + +JRB jrb_find_str(JRB n, char *key) +{ + int fnd; + JRB j; + j = jrb_find_gte_str(n, key, &fnd); + if (fnd) return j; else return NULL; +} + +JRB jrb_find_gte_int(JRB n, int ikey, int *fnd) +{ + *fnd = 0; + if (!ishead(n)) { + fprintf(stderr, "jrb_find_gte_int called on non-head 0x%p\n", n); + exit(1); + } + if (n->parent == n) return n; + if (ikey == n->blink->key.i) { + *fnd = 1; + return n->blink; + } + if (ikey > n->blink->key.i) return n; + else n = n->parent; + while (1) { + if (isext(n)) return n; + if (ikey == getlext(n)->key.i) { + *fnd = 1; + return getlext(n); + } + n = (ikey < getlext(n)->key.i) ? n->flink : n->blink; + } +} + +JRB jrb_find_int(JRB n, int ikey) +{ + int fnd; + JRB j; + + j = jrb_find_gte_int(n, ikey, &fnd); + if (fnd) return j; else return NULL; +} + +JRB jrb_find_gte_vptr(JRB n, void *vkey, int *fnd) +{ + *fnd = 0; + if (!ishead(n)) { + fprintf(stderr, "jrb_find_gte_int called on non-head 0x%p\n", n); + exit(1); + } + if (n->parent == n) return n; + if ((char *)vkey == (char *)n->blink->key.v) { + *fnd = 1; + return n->blink; + } + if ((char *)vkey > (char *)n->blink->key.v) return n; + else n = n->parent; + while (1) { + if (isext(n)) return n; + if ((char *)vkey == (char *)getlext(n)->key.v) { + *fnd = 1; + return getlext(n); + } + n = ((char *)vkey < (char *)getlext(n)->key.v) ? n->flink : n->blink; + } +} + +JRB jrb_find_vptr(JRB n, void *vkey) +{ + int fnd; + JRB j; + + j = jrb_find_gte_vptr(n, vkey, &fnd); + if (fnd) return j; else return NULL; +} + +JRB jrb_find_gte_gen(JRB n, Jval key,int (*fxn)(Jval, Jval), int *fnd) +{ + int cmp; + + *fnd = 0; + if (!ishead(n)) { + fprintf(stderr, "jrb_find_gte_str called on non-head 0x%p\n", n); + exit(1); + } + if (n->parent == n) return n; + cmp = (*fxn)(key, n->blink->key); + if (cmp == 0) { + *fnd = 1; + return n->blink; + } + if (cmp > 0) return n; + else n = n->parent; + while (1) { + if (isext(n)) return n; + cmp = (*fxn)(key, getlext(n)->key); + if (cmp == 0) { + *fnd = 1; + return getlext(n); + } + if (cmp < 0) n = n->flink ; else n = n->blink; + } +} + +JRB jrb_find_gen(JRB n, Jval key, int (*fxn)(Jval, Jval)) +{ + int fnd; + JRB j; + + j = jrb_find_gte_gen(n, key, fxn, &fnd); + if (fnd) return j; else return NULL; +} + +static JRB jrb_insert_b(JRB n, Jval key, Jval val) +{ + JRB newleft, newright, newnode, p; + + if (ishead(n)) { + if (n->parent == n) { /* Tree is empty */ + mk_new_ext(newnode, key, val); + insert(newnode, n); + n->parent = newnode; + newnode->parent = n; + setroot(newnode); + return newnode; + } else { + mk_new_ext(newright, key, val); + insert(newright, n); + newleft = newright->blink; + setnormal(newleft); + mk_new_int(newleft, newright, newleft->parent, isleft(newleft)); + p = rprev(newright); + if (!ishead(p)) setlext(p, newright); + return newright; + } + } else { + mk_new_ext(newleft, key, val); + insert(newleft, n); + setnormal(n); + mk_new_int(newleft, n, n->parent, isleft(n)); + p = lprev(newleft); + if (!ishead(p)) setrext(p, newleft); + return newleft; + } +} + +static void recolor(JRB n) +{ + JRB p, gp, s; + int done = 0; + + while(!done) { + if (isroot(n)) { + setblack(n); + return; + } + + p = n->parent; + + if (isblack(p)) return; + + if (isroot(p)) { + setblack(p); + return; + } + + gp = p->parent; + s = sibling(p); + if (isred(s)) { + setblack(p); + setred(gp); + setblack(s); + n = gp; + } else { + done = 1; + } + } + /* p's sibling is black, p is red, gp is black */ + + if ((isleft(n) == 0) == (isleft(p) == 0)) { + single_rotate(gp, isleft(n)); + setblack(p); + setred(gp); + } else { + single_rotate(p, isleft(n)); + single_rotate(gp, isleft(n)); + setblack(n); + setred(gp); + } +} + +static void single_rotate(JRB y, int l) +{ + int rl = 0, ir; + JRB x, yp; + + ir = isroot(y); + yp = y->parent; + if (!ir) { + rl = isleft(y); + } + + if (l) { + x = y->flink; + y->flink = x->blink; + setleft(y->flink); + y->flink->parent = y; + x->blink = y; + setright(y); + } else { + x = y->blink; + y->blink = x->flink; + setright(y->blink); + y->blink->parent = y; + x->flink = y; + setleft(y); + } + + x->parent = yp; + y->parent = x; + if (ir) { + yp->parent = x; + setnormal(y); + setroot(x); + } else { + if (rl) { + yp->flink = x; + setleft(x); + } else { + yp->blink = x; + setright(x); + } + } +} + +void jrb_delete_node(JRB n) +{ + JRB s, p, gp; + char ir; + + if (isint(n)) { + fprintf(stderr, "Cannot delete an internal node: 0x%p\n", n); + exit(1); + } + if (ishead(n)) { + fprintf(stderr, "Cannot delete the head of an jrb_tree: 0x%p\n", n); + exit(1); + } + delete_item(n); /* Delete it from the list */ + p = n->parent; /* The only node */ + if (isroot(n)) { + p->parent = p; + free(n); + return; + } + s = sibling(n); /* The only node after deletion */ + if (isroot(p)) { + s->parent = p->parent; + s->parent->parent = s; + setroot(s); + free(p); + free(n); + return; + } + gp = p->parent; /* Set parent to sibling */ + s->parent = gp; + if (isleft(p)) { + gp->flink = s; + setleft(s); + } else { + gp->blink = s; + setright(s); + } + ir = isred(p); + free(p); + free(n); + + if (isext(s)) { /* Update proper rext and lext values */ + p = lprev(s); + if (!ishead(p)) setrext(p, s); + p = rprev(s); + if (!ishead(p)) setlext(p, s); + } else if (isblack(s)) { + fprintf(stderr, "DELETION PROB -- sib is black, internal\n"); + exit(1); + } else { + p = lprev(s); + if (!ishead(p)) setrext(p, s->flink); + p = rprev(s); + if (!ishead(p)) setlext(p, s->blink); + setblack(s); + return; + } + + if (ir) return; + + /* Recolor */ + + n = s; + p = n->parent; + s = sibling(n); + while(isblack(p) && isblack(s) && isint(s) && + isblack(s->flink) && isblack(s->blink)) { + setred(s); + n = p; + if (isroot(n)) return; + p = n->parent; + s = sibling(n); + } + + if (isblack(p) && isred(s)) { /* Rotation 2.3b */ + single_rotate(p, isright(n)); + setred(p); + setblack(s); + s = sibling(n); + } + + { JRB x, z; char il; + + if (isext(s)) { + fprintf(stderr, "DELETION ERROR: sibling not internal\n"); + exit(1); + } + + il = isleft(n); + x = il ? s->flink : s->blink ; + z = sibling(x); + + if (isred(z)) { /* Rotation 2.3f */ + single_rotate(p, !il); + setblack(z); + if (isred(p)) setred(s); else setblack(s); + setblack(p); + } else if (isblack(x)) { /* Recoloring only (2.3c) */ + if (isred(s) || isblack(p)) { + fprintf(stderr, "DELETION ERROR: 2.3c not quite right\n"); + exit(1); + } + setblack(p); + setred(s); + return; + } else if (isred(p)) { /* 2.3d */ + single_rotate(s, il); + single_rotate(p, !il); + setblack(x); + setred(s); + return; + } else { /* 2.3e */ + single_rotate(s, il); + single_rotate(p, !il); + setblack(x); + return; + } + } +} + +int jrb_nblack(JRB n) +{ + int nb; + if (ishead(n) || isint(n)) { + fprintf(stderr, "ERROR: jrb_nblack called on a non-external node 0x%p\n", + n); + exit(1); + } + nb = 0; + while(!ishead(n)) { + if (isblack(n)) nb++; + n = n->parent; + } + return nb; +} + +int jrb_plength(JRB n) +{ + int pl; + if (ishead(n) || isint(n)) { + fprintf(stderr, "ERROR: jrb_plength called on a non-external node 0x%p\n", + n); + exit(1); + } + pl = 0; + while(!ishead(n)) { + pl++; + n = n->parent; + } + return pl; +} + +void jrb_free_tree(JRB n) +{ + if (!ishead(n)) { + fprintf(stderr, "ERROR: Rb_free_tree called on a non-head node\n"); + exit(1); + } + + while(jrb_first(n) != jrb_nil(n)) { + jrb_delete_node(jrb_first(n)); + } + free(n); +} + +Jval jrb_val(JRB n) +{ + return n->val; +} + +JRB jrb_insert_str(JRB tree, char *key, Jval val) +{ + Jval k; + int fnd; + + k.s = key; + return jrb_insert_b(jrb_find_gte_str(tree, key, &fnd), k, val); +} + +JRB jrb_insert_int(JRB tree, int ikey, Jval val) +{ + Jval k; + int fnd; + + k.i = ikey; + return jrb_insert_b(jrb_find_gte_int(tree, ikey, &fnd), k, val); +} + +JRB jrb_insert_vptr(JRB tree, void *vkey, Jval val) +{ + Jval k; + int fnd; + + k.v = vkey; + return jrb_insert_b(jrb_find_gte_vptr(tree, vkey, &fnd), k, val); +} + +JRB jrb_insert_gen(JRB tree, Jval key, Jval val, + int (*func)(Jval, Jval)) +{ + int fnd; + + return jrb_insert_b(jrb_find_gte_gen(tree, key, func, &fnd), key, val); +} + +/* + * $Id: jrb.c,v 1.2 2008/07/18 17:30:58 gtkwave Exp $ + * $Log: jrb.c,v $ + * Revision 1.2 2008/07/18 17:30:58 gtkwave + * adding cvs headers + * + * Revision 1.1 2008/07/18 17:27:01 gtkwave + * adding hierpack code + * + */ + diff --git a/src/jrb.h b/src/jrb.h new file mode 100644 index 0000000..481b626 --- /dev/null +++ b/src/jrb.h @@ -0,0 +1,123 @@ +#ifndef _JRB_H_ +#define _JRB_H_ + +/* The Jval -- a type that can hold any 8-byte type */ + +typedef union { + int i; + long l; + float f; + double d; + void *v; + char *s; + char c; + unsigned char uc; + short sh; + unsigned short ush; + unsigned int ui; + int iarray[2]; + float farray[2]; + char carray[8]; + unsigned char ucarray[8]; + } Jval; + +struct jrb_chain { /* added for rtlbrowse */ + struct jrb_chain *next; + Jval val; +}; + +/* Main jrb_node. You only ever use the fields + flink + blink + k.key or k.ikey + v.val +*/ +typedef struct jrb_node { + unsigned char red; + unsigned char internal; + unsigned char left; + unsigned char roothead; /* (bit 1 is root, bit 2 is head) */ + struct jrb_node *flink; + struct jrb_node *blink; + struct jrb_node *parent; + Jval key; + Jval val; +} *JRB; + + +extern JRB make_jrb(); /* Creates a new rb-tree */ + + +/* Creates a node with key key and val val and inserts it into the tree. + jrb_insert uses strcmp() as comparison funcion. jrb_inserti uses <>=, + jrb_insertg uses func() */ + +extern JRB jrb_insert_str(JRB tree, char *key, Jval val); +extern JRB jrb_insert_int(JRB tree, int ikey, Jval val); +extern JRB jrb_insert_vptr(JRB tree, void *vkey, Jval val); +extern JRB jrb_insert_gen(JRB tree, Jval key, Jval val, int (*func)(Jval,Jval)); + +/* returns an external node in t whose value is equal k. Returns NULL if + there is no such node in the tree */ + +extern JRB jrb_find_str(JRB root, char *key); +extern JRB jrb_find_int(JRB root, int ikey); +extern JRB jrb_find_vptr(JRB root, void *vkey); +extern JRB jrb_find_gen(JRB root, Jval, int (*func)(Jval, Jval)); + + +/* returns an external node in t whose value is equal + k or whose value is the smallest value greater than k. Sets found to + 1 if the key was found, and 0 otherwise. */ + +extern JRB jrb_find_gte_str(JRB root, char *key, int *found); +extern JRB jrb_find_gte_int(JRB root, int ikey, int *found); +extern JRB jrb_find_gte_vptr(JRB root, void *vkey, int *found); +extern JRB jrb_find_gte_gen(JRB root, Jval key, + int (*func)(Jval, Jval), int *found); + + +/* Creates a node with key key and val val and inserts it into the + tree before/after node nd. Does not check to ensure that you are + keeping the correct order */ + +extern void jrb_delete_node(JRB node); /* Deletes and frees a node (but + not the key or val) */ +extern void jrb_free_tree(JRB root); /* Deletes and frees an entire tree */ + +extern Jval jrb_val(JRB node); /* Returns node->v.val -- this is to shut + lint up */ + +extern int jrb_nblack(JRB n); /* returns # of black nodes in path from + n to the root */ +int jrb_plength(JRB n); /* returns the # of nodes in path from + n to the root */ + +#define jrb_first(n) (n->flink) +#define jrb_last(n) (n->blink) +#define jrb_next(n) (n->flink) +#define jrb_prev(n) (n->blink) +#define jrb_empty(t) (t->flink == t) +#ifndef jrb_nil +#define jrb_nil(t) (t) +#endif + +#define jrb_traverse(ptr, lst) \ + for(ptr = jrb_first(lst); ptr != jrb_nil(lst); ptr = jrb_next(ptr)) + +#define jrb_rtraverse(ptr, lst) \ + for(ptr = jrb_last(lst); ptr != jrb_nil(lst); ptr = jrb_prev(ptr)) + +#endif + +/* + * $Id: jrb.h,v 1.2 2008/07/18 17:30:58 gtkwave Exp $ + * $Log: jrb.h,v $ + * Revision 1.2 2008/07/18 17:30:58 gtkwave + * adding cvs headers + * + * Revision 1.1 2008/07/18 17:27:01 gtkwave + * adding hierpack code + * + */ + diff --git a/src/lx2.c b/src/lx2.c index b9bb70f..36d68dc 100644 --- a/src/lx2.c +++ b/src/lx2.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Tony Bybell 2003-2006. + * Copyright (c) Tony Bybell 2003-2008. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -26,6 +26,7 @@ #include "lxt2_read.h" #include "debug.h" #include "busy.h" +#include "hierpack.h" /* @@ -40,6 +41,7 @@ unsigned int numalias = 0; struct symbol *sym_block = NULL; struct Node *node_block = NULL; +JRB ptr, lst; GLOBALS->lx2_lx2_c_1 = lxt2_rd_init(fname); if(!GLOBALS->lx2_lx2_c_1) @@ -86,10 +88,24 @@ if(GLOBALS->numfacs) { char *fnam = lxt2_rd_get_facname(GLOBALS->lx2_lx2_c_1, 0); - int flen = strlen(fnam); - - GLOBALS->mvlfacs_lx2_c_1[0].name=malloc_2(flen+1); - strcpy(GLOBALS->mvlfacs_lx2_c_1[0].name, fnam); + char *pnt; + int was_packed = 0; + + if(GLOBALS->do_hier_compress) + { + pnt = hier_compress(fnam, HIERPACK_ADD, &was_packed); + } + + if(was_packed) + { + GLOBALS->mvlfacs_lx2_c_1[0].name = pnt; + } + else + { + int flen = strlen(fnam); + GLOBALS->mvlfacs_lx2_c_1[0].name=malloc_2(flen+1); + strcpy(GLOBALS->mvlfacs_lx2_c_1[0].name, fnam); + } } for(i=0;inumfacs;i++) @@ -101,10 +117,24 @@ if(i!=(GLOBALS->numfacs-1)) { char *fnam = lxt2_rd_get_facname(GLOBALS->lx2_lx2_c_1, i+1); - int flen = strlen(fnam); - - GLOBALS->mvlfacs_lx2_c_1[i+1].name=malloc_2(flen+1); - strcpy(GLOBALS->mvlfacs_lx2_c_1[i+1].name, fnam); + char *pnt; + int was_packed = 0; + + if(GLOBALS->do_hier_compress) + { + pnt = hier_compress(fnam, HIERPACK_ADD, &was_packed); + } + + if(was_packed) + { + GLOBALS->mvlfacs_lx2_c_1[i+1].name = pnt; + } + else + { + int flen = strlen(fnam); + GLOBALS->mvlfacs_lx2_c_1[i+1].name=malloc_2(flen+1); + strcpy(GLOBALS->mvlfacs_lx2_c_1[i+1].name, fnam); + } } if(i>1) @@ -238,11 +268,21 @@ } } +GLOBALS->pfx_hier_array = calloc_2(GLOBALS->hier_pfx_cnt ? GLOBALS->hier_pfx_cnt : 1, sizeof(char *)); + +lst = GLOBALS->hier_pfx; +if(lst) + { + jrb_traverse(ptr, lst) + { + GLOBALS->pfx_hier_array[ptr->val.ui] = ptr->key.s; + } + } /* SPLASH */ splash_sync(2, 5); GLOBALS->facs=(struct symbol **)malloc_2(GLOBALS->numfacs*sizeof(struct symbol *)); -if(GLOBALS->fast_tree_sort) +if((GLOBALS->fast_tree_sort) && (!GLOBALS->do_hier_compress)) { GLOBALS->curnode=GLOBALS->firstnode; for(i=0;inumfacs;i++) @@ -353,11 +393,29 @@ init_tree(); for(i=0;inumfacs;i++) { - build_tree_from_name(GLOBALS->facs[i]->name, i); + char *n = GLOBALS->facs[i]->name; + int was_packed; + char *recon = hier_decompress_flagged(n, &was_packed); + + if(was_packed) + { + build_tree_from_name(recon, i); + free_2(recon); + } + else + { + build_tree_from_name(n, i); + } } /* SPLASH */ splash_sync(5, 5); treegraft(GLOBALS->treeroot); treesort(GLOBALS->treeroot, NULL); + } + +if(GLOBALS->prev_hier_uncompressed_name) + { + free_2(GLOBALS->prev_hier_uncompressed_name); + GLOBALS->prev_hier_uncompressed_name = NULL; } GLOBALS->min_time = GLOBALS->first_cycle_lx2_c_1; GLOBALS->max_time=GLOBALS->last_cycle_lx2_c_1; @@ -581,6 +639,22 @@ if(f->flags&LXT2_RD_SYM_F_STRING) np->head.flags |= HIST_STRING; } + { + struct HistEnt *htemp2 = calloc_2(1, sizeof(struct HistEnt)); + htemp2->time = -1; + if(len>1) + { + htemp2->v.h_vector = htemp->v.h_vector; + } + else + { + htemp2->v.h_val = htemp->v.h_val; + } + htemp2->next = htemp; + htemp = htemp2; + GLOBALS->lx2_table_lx2_c_1[txidx].numtrans++; + } + np->head.time = -2; np->head.next = htemp; np->numhist=GLOBALS->lx2_table_lx2_c_1[txidx].numtrans +2 /*endcap*/ +1 /*frontcap*/; @@ -728,6 +802,22 @@ if(f->flags&LXT2_RD_SYM_F_STRING) np->head.flags |= HIST_STRING; } + { + struct HistEnt *htemp2 = calloc_2(1, sizeof(struct HistEnt)); + htemp2->time = -1; + if(len>1) + { + htemp2->v.h_vector = htemp->v.h_vector; + } + else + { + htemp2->v.h_val = htemp->v.h_val; + } + htemp2->next = htemp; + htemp = htemp2; + GLOBALS->lx2_table_lx2_c_1[txidx].numtrans++; + } + np->head.time = -2; np->head.next = htemp; np->numhist=GLOBALS->lx2_table_lx2_c_1[txidx].numtrans +2 /*endcap*/ +1 /*frontcap*/; @@ -742,8 +832,14 @@ } /* - * $Id: lx2.c,v 1.2 2007/08/26 21:35:41 gtkwave Exp $ + * $Id: lx2.c,v 1.4 2008/07/20 20:48:08 gtkwave Exp $ * $Log: lx2.c,v $ + * Revision 1.4 2008/07/20 20:48:08 gtkwave + * compressed hierarchy support + * + * Revision 1.3 2008/06/15 21:26:45 gtkwave + * time -1 endcap add for LXT2 + VZT loaders + * * Revision 1.2 2007/08/26 21:35:41 gtkwave * integrated global context management from SystemOfCode2007 branch * diff --git a/src/lxt.c b/src/lxt.c index 65ded7f..525fed8 100644 --- a/src/lxt.c +++ b/src/lxt.c @@ -31,6 +31,7 @@ #include "lxt.h" #include "bsearch.h" #include "debug.h" +#include "hierpack.h" /****************************************************************************/ @@ -146,25 +147,26 @@ */ inline static unsigned int get_byte(offset) { - return ((unsigned int)(*((unsigned char *)mm+(offset)))); -} - -inline static unsigned int define get_16(offset) { - return ((unsigned int)(*((unsigned short *)(((unsigned char *)mm)+(offset)))) -} - -inline static usigned int get_32(offset) { - return (*(unsigned int *)(((unsigned char *)mm)+(offset))); + return ((unsigned int)(*((unsigned char *)(GLOBALS->mm_lxt_c_1)+(offset)))); +} + +inline static unsigned int get_16(offset) { + return ((unsigned int)(*((unsigned short *)(((unsigned char *)(GLOBALS->mm_lxt_c_1)) + +(offset))))); +} + +inline static unsigned int get_32(offset) { + return (*(unsigned int *)(((unsigned char *)(GLOBALS->mm_lxt_c_1))+(offset))); } inline static unsigned int get_24(offset) { return ((get_32((offset)-1)<<8)>>8); } -inline static usigned int get_64(offset) { - return ((((UTimeType)get_32(offset))<<32)|((UTimeType)get_32((offset)+4))) -} - +inline static unsigned int get_64(offset) { + return ((((UTimeType)get_32(offset))<<32)|((UTimeType)get_32((offset)+4))); +} + #else /* @@ -432,13 +434,18 @@ int total_mem = get_32(GLOBALS->facname_offset_lxt_c_1+4); gzFile zhandle = NULL; char *decmem=NULL; +JRB ptr, lst; + #if defined __MINGW32__ || defined _MSC_VER FILE *tmp; #endif -buf=malloc_2(total_mem); -pnt=bufprev=buf; +if(!GLOBALS->do_hier_compress) + { + buf=malloc_2(total_mem); + pnt=bufprev=buf; + } if(GLOBALS->zfacname_size_lxt_c_1) { @@ -464,20 +471,60 @@ offs=0; /* we're in our new memory region now.. */ } -fprintf(stderr, LXTHDR"Building %d facilities.\n", GLOBALS->numfacs); -for(i=0;inumfacs;i++) - { - clone=get_16(offs); offs+=2; - bufcurr=pnt; - for(j=0;jmvlfacs_lxt_c_2[i].name=bufcurr; - DEBUG(printf(LXTHDR"Encountered facility %d: '%s'\n", i, bufcurr)); - bufprev=bufcurr; +if(GLOBALS->do_hier_compress) + { + char workspace[4097]; + int was_packed; + char *string_ret; + + workspace[0] = 0; + + fprintf(stderr, LXTHDR"Building %d compressed facilities.\n", GLOBALS->numfacs); + for(i=0;inumfacs;i++) + { + clone=get_16(offs); offs+=2; + pnt=workspace+clone; + while((*(pnt++)=get_byte(offs++))); + string_ret = hier_compress(workspace, HIERPACK_ADD, &was_packed); + if(was_packed) + { + GLOBALS->mvlfacs_lxt_c_2[i].name=string_ret; + } + else + { + GLOBALS->mvlfacs_lxt_c_2[i].name=strdup_2(workspace); + } + } + } + else + { + fprintf(stderr, LXTHDR"Building %d facilities.\n", GLOBALS->numfacs); + for(i=0;inumfacs;i++) + { + clone=get_16(offs); offs+=2; + bufcurr=pnt; + for(j=0;jmvlfacs_lxt_c_2[i].name=bufcurr; + DEBUG(printf(LXTHDR"Encountered facility %d: '%s'\n", i, bufcurr)); + bufprev=bufcurr; + } + } + +GLOBALS->pfx_hier_array = calloc_2(GLOBALS->hier_pfx_cnt ? GLOBALS->hier_pfx_cnt : 1, sizeof(char *)); +lst = GLOBALS->hier_pfx; +if(lst) + { + jrb_traverse(ptr, lst) + { + GLOBALS->pfx_hier_array[ptr->val.ui] = ptr->key.s; + } } + +if(GLOBALS->prev_hier_uncompressed_name) { free_2(GLOBALS->prev_hier_uncompressed_name); GLOBALS->prev_hier_uncompressed_name = NULL; } if(GLOBALS->zfacname_size_lxt_c_1) { @@ -1741,7 +1788,19 @@ init_tree(); for(i=0;inumfacs;i++) { -build_tree_from_name(GLOBALS->facs[i]->name, i); +char *n = GLOBALS->facs[i]->name; +int was_packed; +char *recon = hier_decompress_flagged(n, &was_packed); + +if(was_packed) + { + build_tree_from_name(recon, i); + free_2(recon); + } + else + { + build_tree_from_name(n, i); + } } /* SPLASH */ splash_sync(5, 5); treegraft(GLOBALS->treeroot); @@ -2317,8 +2376,14 @@ } /* - * $Id: lxt.c,v 1.3 2008/02/22 22:08:06 gtkwave Exp $ + * $Id: lxt.c,v 1.5 2008/07/22 18:46:16 gtkwave Exp $ * $Log: lxt.c,v $ + * Revision 1.5 2008/07/22 18:46:16 gtkwave + * add compressed hierarchy handling to lxt reader + * + * Revision 1.4 2008/07/18 18:22:58 gtkwave + * fixes for aix + * * Revision 1.3 2008/02/22 22:08:06 gtkwave * fix of previously undetected linear lxt reader bug involving integers * diff --git a/src/main.c b/src/main.c index b38088f..f7edc51 100644 --- a/src/main.c +++ b/src/main.c @@ -70,7 +70,6 @@ guint page_num, gpointer user_data) { -int i; char timestr[32]; struct Global *g_old = GLOBALS; @@ -199,6 +198,7 @@ " -S, --script=FILE specify GUI command script file for execution\n" XID_GETOPT INTR_GETOPT +" -C, --comphier use compressed hierarchy names (slower)\n" " -g, --giga use gigabyte mempacking when recoding (slower)\n" " -L, --legacy use legacy VCD mode rather than the VCD recoder\n" " -v, --vcd use stdin as a VCD dumpfile\n" @@ -251,6 +251,11 @@ int main(int argc, char *argv[]) +{ +return(main_2(argc, argv)); +} + +int main_2(int argc, char *argv[]) { static char *winprefix="GTKWave - "; static char *winstd="GTKWave (stdio) "; @@ -272,7 +277,7 @@ FILE *wave = NULL; FILE *vcd_save_handle_cached = NULL; -GtkWidget *main_vbox, *top_table, *whole_table; +GtkWidget *main_vbox = NULL, *top_table = NULL, *whole_table = NULL; GtkWidget *menubar; GtkWidget *text1; GtkWidget *zoombuttons; @@ -499,11 +504,12 @@ {"dualid", 1, 0, 'D'}, {"interactive", 0, 0, 'I'}, {"giga", 0, 0, 'g'}, + {"comphier", 0, 0, 'C'}, {"legacy", 0, 0, 'L'}, {0, 0, 0, 0} }; - c = getopt_long (argc, argv, "f:on:a:Ar:di:l:s:e:c:t:NS:vVhxX:MD:IgL", long_options, &option_index); + c = getopt_long (argc, argv, "f:on:a:Ar:di:l:s:e:c:t:NS:vVhxX:MD:IgCL", long_options, &option_index); if (c == -1) break; /* no more args */ @@ -700,6 +706,10 @@ case 'g': is_giga = 1; + break; + + case 'C': + GLOBALS->do_hier_compress = 1; break; case '?': @@ -1160,13 +1170,6 @@ } } - if(GLOBALS->force_toolbars) - { - toolhandle=gtk_handle_box_new(); - gtk_widget_show(toolhandle); - gtk_container_add(GTK_CONTAINER(toolhandle), top_table); - } - whole_table = gtk_table_new (256, 16, FALSE); tb = gtk_toolbar_new(); @@ -1174,6 +1177,13 @@ gtk_toolbar_set_style(GTK_TOOLBAR(tb), GTK_TOOLBAR_ICONS); tb_pos = 0; + + if(GLOBALS->force_toolbars) + { + toolhandle=gtk_handle_box_new(); + gtk_widget_show(toolhandle); + gtk_container_add(GTK_CONTAINER(toolhandle), top_table); + } stock = gtk_toolbar_insert_stock(GTK_TOOLBAR(tb), GTK_STOCK_CUT, @@ -2038,8 +2048,17 @@ #endif /* - * $Id: main.c,v 1.28 2008/04/03 16:45:06 gtkwave Exp $ + * $Id: main.c,v 1.31 2008/07/20 01:29:36 gtkwave Exp $ * $Log: main.c,v $ + * Revision 1.31 2008/07/20 01:29:36 gtkwave + * added command line option --comphier + * + * Revision 1.30 2008/07/01 18:51:06 gtkwave + * compiler warning fixes for amd64 + * + * Revision 1.29 2008/06/11 08:01:50 gtkwave + * gcc 4.3.x compiler warning fixes + * * Revision 1.28 2008/04/03 16:45:06 gtkwave * removed call to time_trunc with marker setting on initialization * diff --git a/src/main.h b/src/main.h index 70ad9c5..5f28f5e 100644 --- a/src/main.h +++ b/src/main.h @@ -22,6 +22,7 @@ char *name; }; +int main_2(int argc, char *argv[]); GtkWidget *create_text(void); GtkWidget *create_zoom_buttons(void); @@ -73,8 +74,11 @@ #endif /* - * $Id: main.h,v 1.3 2007/12/30 04:27:39 gtkwave Exp $ + * $Id: main.h,v 1.4 2008/07/01 18:51:07 gtkwave Exp $ * $Log: main.h,v $ + * Revision 1.4 2008/07/01 18:51:07 gtkwave + * compiler warning fixes for amd64 + * * Revision 1.3 2007/12/30 04:27:39 gtkwave * added edge buttons to main window * diff --git a/src/menu.c b/src/menu.c index dd88047..00a1ed7 100644 --- a/src/menu.c +++ b/src/menu.c @@ -24,6 +24,7 @@ #include "translate.h" #include "ptranslate.h" #include "lx2.h" +#include "hierpack.h" #if !defined __MINGW32__ && !defined _MSC_VER #include @@ -598,11 +599,28 @@ { if(!GLOBALS->hier_max_level) { - t->name = t->n.nd->nname; + int flagged; + + if(t->is_depacked) { free_2(t->name); } + t->name = hier_decompress_flagged(t->n.nd->nname, &flagged); + t->is_depacked = (flagged != 0); } else { - t->name = hier_extract(t->n.nd->nname, GLOBALS->hier_max_level); + int flagged; + char *tbuff = hier_decompress_flagged(t->n.nd->nname, &flagged); + + if(t->is_depacked) { free_2(t->name); } + t->is_depacked = (flagged != 0); + if(!flagged) + { + t->name = hier_extract(t->n.nd->nname, GLOBALS->hier_max_level); + } + else + { + t->name = strdup_2(hier_extract(tbuff, GLOBALS->hier_max_level)); + free_2(tbuff); + } } } } @@ -1052,7 +1070,7 @@ unsigned np = GLOBALS->num_notebook_pages; unsigned int new_page = (this_page != np-1) ? this_page : (this_page-1); GtkWidget *n = GLOBALS->notebook; -struct Global *old_g, *saved_g; +struct Global *old_g = NULL, *saved_g; dead_context_sweep(); @@ -1859,8 +1877,6 @@ void menu_new_viewer_tab_cleanup(GtkWidget *widget, gpointer data) { -pid_t pid; - if(GLOBALS->filesel_ok) { char *argv[2]; @@ -1877,7 +1893,7 @@ if(!setjmp(*(GLOBALS->vcd_jmp_buf))) { - main(2, argv); + main_2(2, argv); g_now = GLOBALS; set_GLOBALS(g_old); @@ -2561,15 +2577,22 @@ static char *append_array_row(nptr n) { +int was_packed; +char *hname = hier_decompress_flagged(n->nname, &was_packed); + + if(!n->array_height) { - return(n->nname); + strcpy(GLOBALS->buf_menu_c_1, hname); } else { - sprintf(GLOBALS->buf_menu_c_1, "%s{%d}", n->nname, n->this_row); - return(GLOBALS->buf_menu_c_1); - } + sprintf(GLOBALS->buf_menu_c_1, "%s{%d}", hname, n->this_row); + } + +if(was_packed) free_2(hname); + +return(GLOBALS->buf_menu_c_1); } @@ -4754,8 +4777,17 @@ /* - * $Id: menu.c,v 1.32 2008/04/03 16:56:10 gtkwave Exp $ + * $Id: menu.c,v 1.35 2008/07/18 17:27:01 gtkwave Exp $ * $Log: menu.c,v $ + * Revision 1.35 2008/07/18 17:27:01 gtkwave + * adding hierpack code + * + * Revision 1.34 2008/07/01 18:51:07 gtkwave + * compiler warning fixes for amd64 + * + * Revision 1.33 2008/06/11 08:01:51 gtkwave + * gcc 4.3.x compiler warning fixes + * * Revision 1.32 2008/04/03 16:56:10 gtkwave * more time_trunc() removals * diff --git a/src/mouseover.c b/src/mouseover.c index 975d7fa..50c402d 100644 --- a/src/mouseover.c +++ b/src/mouseover.c @@ -234,7 +234,7 @@ gint xd = 0, yd = 0; char *asciivalue = NULL; int nmaxlen = 0, vmaxlen = 0; -int totalmax; +int totalmax = 0; int name_charlen = 0, value_charlen = 0; int num_info_rows = 2; char *flagged_name = NULL; @@ -385,8 +385,11 @@ } /* - * $Id: mouseover.c,v 1.8 2008/04/25 21:31:10 gtkwave Exp $ + * $Id: mouseover.c,v 1.9 2008/07/01 18:51:07 gtkwave Exp $ * $Log: mouseover.c,v $ + * Revision 1.9 2008/07/01 18:51:07 gtkwave + * compiler warning fixes for amd64 + * * Revision 1.8 2008/04/25 21:31:10 gtkwave * added missing t->shift in mouseover time calculation * diff --git a/src/regex.c b/src/regex.c index 1c9bd74..5dfd78c 100644 --- a/src/regex.c +++ b/src/regex.c @@ -21,22 +21,22 @@ #endif #endif -#ifdef __CYGWIN__ -#include -#include -#define REGEX_MAY_COMPILE -#include "gnu_regex.c" -#else -#if defined __linux__ +#ifdef __linux__ #include #include #include -#else /* or for any other compiler that doesn't support POSIX.2 regexs properly like xlc or vc++ */ -#ifdef __MINGW32__ +#else +#if defined __CYGWIN__ || defined __MINGW32__ +#include +#include +#ifndef HAVE_BZERO #define bcopy(a,b,c) memcpy((b),(a),(c)) #define bzero(a,b) memset((a),0,(b)) #define bcmp(a,b,c) memcmp((a),(b),(c)) #endif +#define REGEX_MAY_COMPILE +#include "gnu_regex.c" +#else /* or for any other compiler that doesn't support POSIX.2 regexs properly like xlc or vc++ */ #ifdef _MSC_VER #include #define STDC_HEADERS @@ -132,8 +132,11 @@ } /* - * $Id: regex.c,v 1.2 2007/08/26 21:35:44 gtkwave Exp $ + * $Id: regex.c,v 1.3 2008/05/29 15:54:16 gtkwave Exp $ * $Log: regex.c,v $ + * Revision 1.3 2008/05/29 15:54:16 gtkwave + * added HAVE_BZERO patches for MinGW + * * Revision 1.2 2007/08/26 21:35:44 gtkwave * integrated global context management from SystemOfCode2007 branch * diff --git a/src/renderopt.c b/src/renderopt.c index a628a16..611677d 100644 --- a/src/renderopt.c +++ b/src/renderopt.c @@ -45,7 +45,6 @@ static void pagesize_clicked(GtkWidget *widget, gpointer which) { int i; -char *which_char; for(i=0;i<5;i++) GLOBALS->page_mutex_renderopt_c_1[i]=0; @@ -58,7 +57,6 @@ static void rendertype_clicked(GtkWidget *widget, gpointer which) { int i; -char *which_char; for(i=0;i<2;i++) GLOBALS->render_mutex_renderopt_c_1[i]=0; @@ -315,8 +313,11 @@ } /* - * $Id: renderopt.c,v 1.5 2007/09/12 17:26:45 gtkwave Exp $ + * $Id: renderopt.c,v 1.6 2008/06/11 08:01:53 gtkwave Exp $ * $Log: renderopt.c,v $ + * Revision 1.6 2008/06/11 08:01:53 gtkwave + * gcc 4.3.x compiler warning fixes + * * Revision 1.5 2007/09/12 17:26:45 gtkwave * experimental ctx_swap_watchdog added...still tracking down mouse thrash crashes * diff --git a/src/search.c b/src/search.c index d6280e0..187f562 100644 --- a/src/search.c +++ b/src/search.c @@ -24,6 +24,63 @@ #include "ghw.h" #include "debug.h" #include "busy.h" +#include "hierpack.h" + +static gint +clist_sigcmp (GtkCList *clist, + gconstpointer ptr1, + gconstpointer ptr2) +{ + char *text1 = NULL; + char *text2 = NULL; + + GtkCListRow *row1 = (GtkCListRow *) ptr1; + GtkCListRow *row2 = (GtkCListRow *) ptr2; + + char *nd1, *nd2; + int was_packed1=0, was_packed2=0; + int rc; + + switch (row1->cell[clist->sort_column].type) + { + case GTK_CELL_TEXT: + text1 = GTK_CELL_TEXT (row1->cell[clist->sort_column])->text; + break; + case GTK_CELL_PIXTEXT: + text1 = GTK_CELL_PIXTEXT (row1->cell[clist->sort_column])->text; + break; + default: + break; + } + + switch (row2->cell[clist->sort_column].type) + { + case GTK_CELL_TEXT: + text2 = GTK_CELL_TEXT (row2->cell[clist->sort_column])->text; + break; + case GTK_CELL_PIXTEXT: + text2 = GTK_CELL_PIXTEXT (row2->cell[clist->sort_column])->text; + break; + default: + break; + } + + if (!text2) + return (text1 != NULL); + + if (!text1) + return -1; + + nd1 = hier_decompress_flagged(text1, &was_packed1); + nd2 = hier_decompress_flagged(text2, &was_packed2); + rc = sigcmp(nd1, nd2); + + if(was_packed1) free_2(nd1); + if(was_packed2) free_2(nd2); + + return (rc); +} + int searchbox_is_active(void) @@ -636,10 +693,10 @@ GtkCList *cl; G_CONST_RETURN gchar *entry_text; char *entry_suffixed; -int len; int i, row; char *s, *tmp2; gfloat interval; +int depack_cnt = 0; if(GLOBALS->is_searching_running_search_c_1) return; GLOBALS->is_searching_running_search_c_1 = ~0; @@ -680,6 +737,9 @@ for(i=0;inumfacs;i++) { + int was_packed; + char *hfacname = NULL; + GLOBALS->pdata->value = i; if(((int)(GLOBALS->pdata->value/interval))!=((int)(GLOBALS->pdata->oldvalue/interval))) { @@ -688,12 +748,15 @@ } GLOBALS->pdata->oldvalue = i; - if(wave_regex_match(GLOBALS->facs[i]->name, WAVE_REGEX_SEARCH)) - if((!GLOBALS->is_ghw)||(strcmp(WAVE_GHW_DUMMYFACNAME, GLOBALS->facs[i]->name))) + hfacname = hier_decompress_flagged(GLOBALS->facs[i]->name, &was_packed); + depack_cnt += was_packed; + + if(wave_regex_match(hfacname, WAVE_REGEX_SEARCH)) + if((!GLOBALS->is_ghw)||(strcmp(WAVE_GHW_DUMMYFACNAME, hfacname))) { if(!GLOBALS->facs[i]->vec_root) { - row=gtk_clist_append(cl,(gchar **)&(GLOBALS->facs[i]->name)); + row=gtk_clist_append(cl,(gchar **)&(hfacname)); } else { @@ -709,9 +772,9 @@ } else { - s=(char *)malloc_2(strlen(GLOBALS->facs[i]->name)+4); + s=(char *)malloc_2(strlen(hfacname)+4); strcpy(s,"[] "); - strcpy(s+3, GLOBALS->facs[i]->name); + strcpy(s+3, hfacname); } row=gtk_clist_append(cl,(gchar **)&s); @@ -720,8 +783,20 @@ gtk_clist_set_row_data(cl, row,GLOBALS->facs[i]); GLOBALS->num_rows_search_c_2++; - if(GLOBALS->num_rows_search_c_2==WAVE_MAX_CLIST_LENGTH) break; + if(GLOBALS->num_rows_search_c_2==WAVE_MAX_CLIST_LENGTH) + { + if(was_packed) { free_2(hfacname); } + break; + } } + + if(was_packed) { free_2(hfacname); } + } + +if(depack_cnt) + { + gtk_clist_set_compare_func(cl, clist_sigcmp); + gtk_clist_sort (cl); } gtk_clist_set_column_width(GTK_CLIST(GLOBALS->clist_search_c_3),0,gtk_clist_optimal_column_width(GTK_CLIST(GLOBALS->clist_search_c_3),0)); @@ -1031,8 +1106,14 @@ } /* - * $Id: search.c,v 1.7 2008/05/08 20:10:04 gtkwave Exp $ + * $Id: search.c,v 1.9 2008/07/18 17:27:01 gtkwave Exp $ * $Log: search.c,v $ + * Revision 1.9 2008/07/18 17:27:01 gtkwave + * adding hierpack code + * + * Revision 1.8 2008/06/11 08:01:54 gtkwave + * gcc 4.3.x compiler warning fixes + * * Revision 1.7 2008/05/08 20:10:04 gtkwave * 2.4 not required for dnd so requirement relaxed * @@ -1097,4 +1178,3 @@ * initial release * */ - diff --git a/src/signalwindow.c b/src/signalwindow.c index adf2288..ffde65f 100644 --- a/src/signalwindow.c +++ b/src/signalwindow.c @@ -370,7 +370,7 @@ /* printf("drop to %d of %d: '%s'\n", which, GLOBALS->traces.total, t ? t->name : "undef"); */ } - bot: 1; + bot: return(FALSE); } return(FALSE); @@ -752,7 +752,7 @@ t->flags |= TR_HIGHLIGHT; } } - else + else if(!(t->flags & TR_HIGHLIGHT)) /* Ben Sferrazza suggested fix rather than a regular "else" */ { GLOBALS->starting_unshifted_trace = t; @@ -1177,11 +1177,13 @@ } +/* static gint popup_event (GtkWidget *widget) { do_popup_menu(widget, NULL); return(TRUE); } +*/ /*** gtkwave click routines turned on with "use_standard_clicking"=0 ***/ /**************************************************************************/ @@ -1303,7 +1305,7 @@ { gint rc; gint page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(GLOBALS->notebook)); -struct Global *g_old = GLOBALS; +/* struct Global *g_old = GLOBALS; */ set_GLOBALS((*GLOBALS->contexts)[page_num]); @@ -1492,8 +1494,17 @@ /* - * $Id: signalwindow.c,v 1.30 2008/03/26 01:23:52 gtkwave Exp $ + * $Id: signalwindow.c,v 1.33 2008/08/18 16:10:54 gtkwave Exp $ * $Log: signalwindow.c,v $ + * Revision 1.33 2008/08/18 16:10:54 gtkwave + * adding sticky click semantics on already selected entries + * + * Revision 1.32 2008/07/01 18:51:07 gtkwave + * compiler warning fixes for amd64 + * + * Revision 1.31 2008/06/11 08:01:55 gtkwave + * gcc 4.3.x compiler warning fixes + * * Revision 1.30 2008/03/26 01:23:52 gtkwave * reduce drag and drop visual noise * diff --git a/src/strace.c b/src/strace.c index 0080a5c..6c6b62d 100644 --- a/src/strace.c +++ b/src/strace.c @@ -1343,7 +1343,7 @@ basetime=GLOBALS->named_markers[GLOBALS->mark_idx_start-1]; else { - status_text(item_mark_start_strings[GLOBALS->mark_idx_start].str); + status_text(item_mark_start_strings[(unsigned int)GLOBALS->mark_idx_start].str); status_text(" not in use.\n"); } } @@ -1354,7 +1354,7 @@ endtime=GLOBALS->named_markers[GLOBALS->mark_idx_end-1]; else { - status_text(item_mark_end_strings[GLOBALS->mark_idx_end].str); + status_text(item_mark_end_strings[(unsigned int)GLOBALS->mark_idx_end].str); status_text(" not in use.\n"); } } @@ -1639,8 +1639,11 @@ } /* - * $Id: strace.c,v 1.7 2007/12/31 17:11:58 gtkwave Exp $ + * $Id: strace.c,v 1.8 2008/07/01 18:51:07 gtkwave Exp $ * $Log: strace.c,v $ + * Revision 1.8 2008/07/01 18:51:07 gtkwave + * compiler warning fixes for amd64 + * * Revision 1.7 2007/12/31 17:11:58 gtkwave * fixed backward seek bug in pattern/edge search * diff --git a/src/treesearch_gtk2.c b/src/treesearch_gtk2.c index 03f2eb7..a1f91b5 100644 --- a/src/treesearch_gtk2.c +++ b/src/treesearch_gtk2.c @@ -19,6 +19,7 @@ #include "lx2.h" #include "busy.h" #include "debug.h" + enum { VIEW_DRAG_INACTIVE, TREE_TO_VIEW_DRAG_ACTIVE, SEARCH_TO_VIEW_DRAG_ACTIVE }; @@ -1004,7 +1005,42 @@ } } - +/**********************************************************************/ + +/* view_selection_func is commented out for now... */ + +static gboolean + view_selection_func (GtkTreeSelection *selection, + GtkTreeModel *model, + GtkTreePath *path, + gboolean path_currently_selected, + gpointer userdata) + { +/* + GtkTreeIter iter; + + if (gtk_tree_model_get_iter(model, &iter, path)) + { + gchar *name; + + gtk_tree_model_get(model, &iter, 0, &name, -1); + + if (!path_currently_selected) + { + g_print ("%s is going to be selected.\n", name); + } + else + { + g_print ("%s is going to be unselected.\n", name); + } + + g_free(name); + } +*/ + return TRUE; /* allow selection state to change */ + } + +/**********************************************************************/ /* * mainline.. @@ -1129,6 +1165,8 @@ /* Setup the selection handler */ GLOBALS->sig_selection_treesearch_gtk2_c_1 = gtk_tree_view_get_selection (GTK_TREE_VIEW (sig_view)); gtk_tree_selection_set_mode (GLOBALS->sig_selection_treesearch_gtk2_c_1, GTK_SELECTION_MULTIPLE); + /* gtk_tree_selection_set_select_function (GLOBALS->sig_selection_treesearch_gtk2_c_1, + view_selection_func, NULL, NULL); */ } GLOBALS->dnd_sigview = sig_view; @@ -1362,6 +1400,8 @@ /* Setup the selection handler */ GLOBALS->sig_selection_treesearch_gtk2_c_1 = gtk_tree_view_get_selection (GTK_TREE_VIEW (sig_view)); gtk_tree_selection_set_mode (GLOBALS->sig_selection_treesearch_gtk2_c_1, GTK_SELECTION_MULTIPLE); + /* gtk_tree_selection_set_select_function (GLOBALS->sig_selection_treesearch_gtk2_c_1, + view_selection_func, NULL, NULL); */ } GLOBALS->dnd_sigview = sig_view; @@ -1852,8 +1892,11 @@ } /* - * $Id: treesearch_gtk2.c,v 1.15 2008/05/11 03:05:25 gtkwave Exp $ + * $Id: treesearch_gtk2.c,v 1.16 2008/08/18 16:10:54 gtkwave Exp $ * $Log: treesearch_gtk2.c,v $ + * Revision 1.16 2008/08/18 16:10:54 gtkwave + * adding sticky click semantics on already selected entries + * * Revision 1.15 2008/05/11 03:05:25 gtkwave * add gating flag on dnd data request so moving in/out of search window * doesn't cause spurious insert ops into the signal/wavewindow diff --git a/src/vcd.c b/src/vcd.c index 94a7d60..23be4bd 100644 --- a/src/vcd.c +++ b/src/vcd.c @@ -38,6 +38,7 @@ #include #include "globals.h" #include "vcd.h" +#include "hierpack.h" #undef VCD_BSEARCH_IS_PERFECT /* bsearch is imperfect under linux, but OK under AIX */ @@ -336,7 +337,7 @@ return((int)(*(GLOBALS->vst_vcd_c_1++))); } -static char getch() { +static signed char getch() { return ((GLOBALS->vst_vcd_c_1!=GLOBALS->vend_vcd_c_1)?((int)(*(GLOBALS->vst_vcd_c_1++))):(getch_fetch())); } @@ -1387,14 +1388,28 @@ else if((v->msi>v->lsi)&&((v->msi-v->lsi+1)!=v->size)) { - if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) goto err; - v->size=v->msi-v->lsi+1; + if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) + { + v->msi = v->size-1; v->lsi = 0; + /* all this formerly was goto err; */ + } + else + { + v->size=v->msi-v->lsi+1; + } } else if((v->lsi>=v->msi)&&((v->lsi-v->msi+1)!=v->size)) { - if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) goto err; - v->size=v->msi-v->lsi+1; + if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) + { + v->lsi = v->size-1; v->msi = 0; + /* all this formerly was goto err; */ + } + else + { + v->size=v->lsi-v->msi+1; + } } /* initial conditions */ @@ -2165,6 +2180,17 @@ void vcd_sortfacs(void) { int i; +JRB ptr, lst; + +GLOBALS->pfx_hier_array = calloc_2(GLOBALS->hier_pfx_cnt ? GLOBALS->hier_pfx_cnt : 1, sizeof(char *)); +lst = GLOBALS->hier_pfx; +if(lst) + { + jrb_traverse(ptr, lst) + { + GLOBALS->pfx_hier_array[ptr->val.ui] = ptr->key.s; + } + } GLOBALS->facs=(struct symbol **)malloc_2(GLOBALS->numfacs*sizeof(struct symbol *)); GLOBALS->curnode=GLOBALS->firstnode; @@ -2207,7 +2233,19 @@ init_tree(); for(i=0;inumfacs;i++) { -build_tree_from_name(GLOBALS->facs[i]->name, i); +char *n = GLOBALS->facs[i]->name; +int was_packed; +char *recon = hier_decompress_flagged(n, &was_packed); + +if(was_packed) + { + build_tree_from_name(recon, i); + free_2(recon); + } + else + { + build_tree_from_name(n, i); + } if(GLOBALS->escaped_names_found_vcd_c_1) { @@ -2423,8 +2461,23 @@ /*******************************************************************************/ /* - * $Id: vcd.c,v 1.4 2008/01/22 20:11:47 gtkwave Exp $ + * $Id: vcd.c,v 1.9 2008/07/20 01:29:36 gtkwave Exp $ * $Log: vcd.c,v $ + * Revision 1.9 2008/07/20 01:29:36 gtkwave + * added command line option --comphier + * + * Revision 1.8 2008/07/18 18:46:11 gtkwave + * bitblasted vector relinking fix, disable hier pack in legacy+partial vcdload + * + * Revision 1.7 2008/07/18 18:22:58 gtkwave + * fixes for aix + * + * Revision 1.6 2008/07/18 17:27:01 gtkwave + * adding hierpack code + * + * Revision 1.5 2008/07/12 22:54:12 gtkwave + * array of wires malformed vcd dump load abort fixed + * * Revision 1.4 2008/01/22 20:11:47 gtkwave * track and hold experimentation * diff --git a/src/vcd.h b/src/vcd.h index 875a86a..64b7045 100644 --- a/src/vcd.h +++ b/src/vcd.h @@ -33,6 +33,7 @@ #include "wavealloca.h" #include "debug.h" #include "tree.h" +#include "jrb.h" #define VCD_SIZE_WARN (256) /* number of MB size where converter warning message appears */ #define VCD_BSIZ 32768 /* size of getch() emulation buffer--this val should be ok */ @@ -128,8 +129,11 @@ #endif /* - * $Id: vcd.h,v 1.2 2007/08/26 21:35:46 gtkwave Exp $ + * $Id: vcd.h,v 1.3 2008/07/18 17:27:01 gtkwave Exp $ * $Log: vcd.h,v $ + * Revision 1.3 2008/07/18 17:27:01 gtkwave + * adding hierpack code + * * Revision 1.2 2007/08/26 21:35:46 gtkwave * integrated global context management from SystemOfCode2007 branch * diff --git a/src/vcd_partial.c b/src/vcd_partial.c index be4f520..4e157c5 100644 --- a/src/vcd_partial.c +++ b/src/vcd_partial.c @@ -33,6 +33,7 @@ #include #include "globals.h" #include "vcd.h" +#include "hierpack.h" #if !defined _MSC_VER && !defined __MINGW32__ #include @@ -340,7 +341,7 @@ return((int)(*(GLOBALS->vst_vcd_partial_c_2++))); } -static char getch() { +static signed char getch() { return ((GLOBALS->vst_vcd_partial_c_2!=GLOBALS->vend_vcd_partial_c_2)?((int)(*(GLOBALS->vst_vcd_partial_c_2++))):(getch_fetch())); } @@ -1381,14 +1382,28 @@ else if((v->msi>v->lsi)&&((v->msi-v->lsi+1)!=v->size)) { - if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) goto err; - v->size=v->msi-v->lsi+1; + if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) + { + v->msi = v->size-1; v->lsi = 0; + /* all this formerly was goto err; */ + } + else + { + v->size=v->msi-v->lsi+1; + } } else if((v->lsi>=v->msi)&&((v->lsi-v->msi+1)!=v->size)) { - if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) goto err; - v->size=v->msi-v->lsi+1; + if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) + { + v->lsi = v->size-1; v->msi = 0; + /* all this formerly was goto err; */ + } + else + { + v->size=v->lsi-v->msi+1; + } } /* initial conditions */ @@ -2365,8 +2380,20 @@ } /* - * $Id: vcd_partial.c,v 1.3 2007/09/11 02:12:50 gtkwave Exp $ + * $Id: vcd_partial.c,v 1.7 2008/07/18 18:46:11 gtkwave Exp $ * $Log: vcd_partial.c,v $ + * Revision 1.7 2008/07/18 18:46:11 gtkwave + * bitblasted vector relinking fix, disable hier pack in legacy+partial vcdload + * + * Revision 1.6 2008/07/18 18:23:06 gtkwave + * fixes for aix + * + * Revision 1.5 2008/07/18 17:27:01 gtkwave + * adding hierpack code + * + * Revision 1.4 2008/07/12 22:54:12 gtkwave + * array of wires malformed vcd dump load abort fixed + * * Revision 1.3 2007/09/11 02:12:50 gtkwave * context locking in busy spinloops (gtk_main_iteration() calls) * diff --git a/src/vcd_recoder.c b/src/vcd_recoder.c index f8d7c84..eab1d81 100644 --- a/src/vcd_recoder.c +++ b/src/vcd_recoder.c @@ -36,6 +36,7 @@ #include "vcd.h" #include "vlist.h" #include "lx2.h" +#include "hierpack.h" /**/ @@ -519,7 +520,7 @@ return((int)(*(GLOBALS->vst_vcd_recoder_c_3++))); } -static char getch() { +static signed char getch() { return ((GLOBALS->vst_vcd_recoder_c_3!=GLOBALS->vend_vcd_recoder_c_3)?((int)(*(GLOBALS->vst_vcd_recoder_c_3++))):(getch_fetch())); } @@ -1248,7 +1249,7 @@ if(GLOBALS->pv_vcd_recoder_c_3) { - if(!strcmp(GLOBALS->pv_vcd_recoder_c_3->name,v->name)) + if(!strcmp(GLOBALS->prev_hier_uncompressed_name,v->name)) { GLOBALS->pv_vcd_recoder_c_3->chain=v; v->root=GLOBALS->rootv_vcd_recoder_c_3; @@ -1258,12 +1259,16 @@ { GLOBALS->rootv_vcd_recoder_c_3=v; } + + free_2(GLOBALS->prev_hier_uncompressed_name); } else { GLOBALS->rootv_vcd_recoder_c_3=v; } + GLOBALS->pv_vcd_recoder_c_3=v; + GLOBALS->prev_hier_uncompressed_name; } else /* regular vcd var, not an evcd port var */ { @@ -1327,7 +1332,7 @@ if(GLOBALS->pv_vcd_recoder_c_3) { - if(!strcmp(GLOBALS->pv_vcd_recoder_c_3->name,v->name)) + if(!strcmp(GLOBALS->prev_hier_uncompressed_name,v->name)) { GLOBALS->pv_vcd_recoder_c_3->chain=v; v->root=GLOBALS->rootv_vcd_recoder_c_3; @@ -1337,13 +1342,16 @@ { GLOBALS->rootv_vcd_recoder_c_3=v; } + + free_2(GLOBALS->prev_hier_uncompressed_name); } else { GLOBALS->rootv_vcd_recoder_c_3=v; } GLOBALS->pv_vcd_recoder_c_3=v; - + GLOBALS->prev_hier_uncompressed_name = strdup_2(v->name); + vtok=get_vartoken(1); if(vtok==V_END) goto dumpv; if(vtok!=V_LB) goto err; @@ -1390,14 +1398,28 @@ else if((v->msi>v->lsi)&&((v->msi-v->lsi+1)!=v->size)) { - if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) goto err; - v->size=v->msi-v->lsi+1; + if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) + { + v->msi = v->size-1; v->lsi = 0; + /* all this formerly was goto err; */ + } + else + { + v->size=v->msi-v->lsi+1; + } } else if((v->lsi>=v->msi)&&((v->lsi-v->msi+1)!=v->size)) { - if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) goto err; - v->size=v->msi-v->lsi+1; + if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) + { + v->lsi = v->size-1; v->msi = 0; + /* all this formerly was goto err; */ + } + else + { + v->size=v->lsi-v->msi+1; + } } /* initial conditions */ @@ -1464,11 +1486,19 @@ fprintf(stderr, "Near byte %d, $VAR parse error encountered\n", (int)(GLOBALS->vcdbyteno_vcd_recoder_c_3+(GLOBALS->vst_vcd_recoder_c_3-GLOBALS->vcdbuf_vcd_recoder_c_3))); } if(v->id) free_2(v->id); - free_2(v); + free_2(v); v=NULL; GLOBALS->pv_vcd_recoder_c_3 = NULL; } bail: + if((v) && (GLOBALS->do_hier_compress)) + { + char *old_name = v->name; + int was_packed; + v->name = hier_compress(v->name, HIERPACK_ADD, &was_packed); + if(was_packed) free_2(old_name); + } + if(vtok!=V_END) sync_end(NULL); break; } @@ -1576,6 +1606,10 @@ { GLOBALS->blackout_regions->bend = GLOBALS->current_time_vcd_recoder_c_3; } + + GLOBALS->pv_vcd_recoder_c_3 = NULL; + if(GLOBALS->prev_hier_uncompressed_name) { free_2(GLOBALS->prev_hier_uncompressed_name); GLOBALS->prev_hier_uncompressed_name = NULL; } + return; default: DEBUG(fprintf(stderr,"UNKNOWN TOKEN\n")); @@ -2295,14 +2329,14 @@ unsigned int accum; unsigned char ch; double *d; -unsigned char *depacked; +unsigned char *depacked = NULL; if(!v) return; vlist_uncompress(&v); if(GLOBALS->vlist_prepack) { - depacked = vlist_packer_decompress(v, &list_size); + depacked = vlist_packer_decompress(v, (unsigned int *)&list_size); vlist_destroy(v); } else @@ -2407,6 +2441,12 @@ time_idx += delta; curtime_pnt = vlist_locate(GLOBALS->time_vlist_vcd_recoder_c_1, time_idx ? time_idx-1 : 0); + if(!curtime_pnt) + { + fprintf(stderr, "GTKWAVE | malformed bitwise signal data for '%s' after time_idx = %d\n", + np->nname, time_idx - delta); + exit(255); + } if(vartype != V_EVENT) { @@ -2460,6 +2500,12 @@ time_idx += delta; curtime_pnt = vlist_locate(GLOBALS->time_vlist_vcd_recoder_c_1, time_idx ? time_idx-1 : 0); + if(!curtime_pnt) + { + fprintf(stderr, "GTKWAVE | malformed 'b' signal data for '%s' after time_idx = %d\n", + np->nname, time_idx - delta); + exit(255); + } dst_len = 0; for(;;) @@ -2541,6 +2587,12 @@ time_idx += delta; curtime_pnt = vlist_locate(GLOBALS->time_vlist_vcd_recoder_c_1, time_idx ? time_idx-1 : 0); + if(!curtime_pnt) + { + fprintf(stderr, "GTKWAVE | malformed 'r' signal data for '%s' after time_idx = %d\n", + np->nname, time_idx - delta); + exit(255); + } dst_len = 0; do @@ -2596,6 +2648,12 @@ time_idx += delta; curtime_pnt = vlist_locate(GLOBALS->time_vlist_vcd_recoder_c_1, time_idx ? time_idx-1 : 0); + if(!curtime_pnt) + { + fprintf(stderr, "GTKWAVE | malformed 's' signal data for '%s' after time_idx = %d\n", + np->nname, time_idx - delta); + exit(255); + } dst_len = 0; do @@ -2631,7 +2689,7 @@ if(GLOBALS->vlist_prepack) { - vlist_packer_decompress_destroy(depacked); + vlist_packer_decompress_destroy((char *)depacked); } else { @@ -2650,7 +2708,7 @@ if(GLOBALS->vlist_prepack) { - vlist_packer_decompress_destroy(depacked); + vlist_packer_decompress_destroy((char *)depacked); } else { @@ -2660,8 +2718,26 @@ } /* - * $Id: vcd_recoder.c,v 1.8 2007/12/24 19:56:03 gtkwave Exp $ + * $Id: vcd_recoder.c,v 1.14 2008/07/18 18:46:11 gtkwave Exp $ * $Log: vcd_recoder.c,v $ + * Revision 1.14 2008/07/18 18:46:11 gtkwave + * bitblasted vector relinking fix, disable hier pack in legacy+partial vcdload + * + * Revision 1.13 2008/07/18 18:23:07 gtkwave + * fixes for aix + * + * Revision 1.12 2008/07/18 17:27:01 gtkwave + * adding hierpack code + * + * Revision 1.11 2008/07/12 22:54:12 gtkwave + * array of wires malformed vcd dump load abort fixed + * + * Revision 1.10 2008/07/11 07:02:54 gtkwave + * recoder fix for malformed files + * + * Revision 1.9 2008/06/11 08:01:55 gtkwave + * gcc 4.3.x compiler warning fixes + * * Revision 1.8 2007/12/24 19:56:03 gtkwave * preparing for 3.1.2 version bump * diff --git a/src/vcd_saver.c b/src/vcd_saver.c index 5e3c960..f7594a3 100644 --- a/src/vcd_saver.c +++ b/src/vcd_saver.c @@ -12,6 +12,7 @@ #include "vcd_saver.h" #include "helpers/lxt_write.h" #include "ghw.h" +#include "hierpack.h" #include @@ -460,7 +461,9 @@ for(i=0;ihp_vcd_saver_c_1[i]->item->nname : output_hier(GLOBALS->hp_vcd_saver_c_1[i]->item->nname); + int was_packed = 0; + char *hname = hier_decompress_flagged(GLOBALS->hp_vcd_saver_c_1[i]->item->nname, &was_packed); + char *netname = lxt ? hname : output_hier(hname); if(GLOBALS->hp_vcd_saver_c_1[i]->flags & (HIST_REAL|HIST_STRING)) { @@ -515,6 +518,10 @@ } } + if(was_packed) + { + free_2(hname); + } } row_data = malloc_2(max_len + 1); @@ -848,8 +855,11 @@ } /* - * $Id: vcd_saver.c,v 1.2 2007/08/26 21:35:46 gtkwave Exp $ + * $Id: vcd_saver.c,v 1.3 2008/07/18 17:27:01 gtkwave Exp $ * $Log: vcd_saver.c,v $ + * Revision 1.3 2008/07/18 17:27:01 gtkwave + * adding hierpack code + * * Revision 1.2 2007/08/26 21:35:46 gtkwave * integrated global context management from SystemOfCode2007 branch * diff --git a/src/vlist.c b/src/vlist.c index c451181..ea25b72 100644 --- a/src/vlist.c +++ b/src/vlist.c @@ -144,9 +144,16 @@ exit(255); } + /* args are reversed to fread (compared to above) to handle short read at end of file! */ + /* (this can happen because of how we write out only the used size of a block) */ vrebuild = malloc_2(sizeof(struct vlist_t) + vhdr.siz); memcpy(vrebuild, &vhdr, sizeof(struct vlist_t)); - fread(vrebuild+1, vrebuild->siz, 1, GLOBALS->vlist_handle); + rc = fread(vrebuild+1, 1, vrebuild->siz, GLOBALS->vlist_handle); + if(!rc) + { + printf("Error in reading from VList spill file!\n"); + exit(255); + } if(vprev) { @@ -767,8 +774,14 @@ /* - * $Id: vlist.c,v 1.10 2007/12/24 19:56:03 gtkwave Exp $ + * $Id: vlist.c,v 1.12 2008/07/13 00:15:41 gtkwave Exp $ * $Log: vlist.c,v $ + * Revision 1.12 2008/07/13 00:15:41 gtkwave + * fix for short reads when --giga option is enabled + * + * Revision 1.11 2008/06/11 08:01:57 gtkwave + * gcc 4.3.x compiler warning fixes + * * Revision 1.10 2007/12/24 19:56:03 gtkwave * preparing for 3.1.2 version bump * diff --git a/src/vzt.c b/src/vzt.c index 8386977..823324b 100644 --- a/src/vzt.c +++ b/src/vzt.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Tony Bybell 2003-2006. + * Copyright (c) Tony Bybell 2003-2008. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -27,7 +27,7 @@ #include "vzt_read.h" #include "debug.h" #include "busy.h" - +#include "hierpack.h" /* * mainline @@ -41,6 +41,7 @@ unsigned int numalias = 0; struct symbol *sym_block = NULL; struct Node *node_block = NULL; +JRB ptr, lst; GLOBALS->vzt_vzt_c_1 = vzt_rd_init_smp(fname, GLOBALS->num_cpus); if(!GLOBALS->vzt_vzt_c_1) @@ -87,10 +88,24 @@ if(GLOBALS->numfacs) { char *fnam = vzt_rd_get_facname(GLOBALS->vzt_vzt_c_1, 0); - int flen = strlen(fnam); - - GLOBALS->mvlfacs_vzt_c_3[0].name=malloc_2(flen+1); - strcpy(GLOBALS->mvlfacs_vzt_c_3[0].name, fnam); + char *pnt; + int was_packed = 0; + + if(GLOBALS->do_hier_compress) + { + pnt = hier_compress(fnam, HIERPACK_ADD, &was_packed); + } + + if(was_packed) + { + GLOBALS->mvlfacs_vzt_c_3[0].name = pnt; + } + else + { + int flen = strlen(fnam); + GLOBALS->mvlfacs_vzt_c_3[0].name=malloc_2(flen+1); + strcpy(GLOBALS->mvlfacs_vzt_c_3[0].name, fnam); + } } for(i=0;inumfacs;i++) @@ -102,10 +117,24 @@ if(i!=(GLOBALS->numfacs-1)) { char *fnam = vzt_rd_get_facname(GLOBALS->vzt_vzt_c_1, i+1); - int flen = strlen(fnam); - - GLOBALS->mvlfacs_vzt_c_3[i+1].name=malloc_2(flen+1); - strcpy(GLOBALS->mvlfacs_vzt_c_3[i+1].name, fnam); + char *pnt; + int was_packed = 0; + + if(GLOBALS->do_hier_compress) + { + pnt = hier_compress(fnam, HIERPACK_ADD, &was_packed); + } + + if(was_packed) + { + GLOBALS->mvlfacs_vzt_c_3[i+1].name = pnt; + } + else + { + int flen = strlen(fnam); + GLOBALS->mvlfacs_vzt_c_3[i+1].name=malloc_2(flen+1); + strcpy(GLOBALS->mvlfacs_vzt_c_3[i+1].name, fnam); + } } if(i>1) @@ -244,7 +273,18 @@ /* SPLASH */ splash_sync(2, 5); GLOBALS->facs=(struct symbol **)malloc_2(GLOBALS->numfacs*sizeof(struct symbol *)); -if(GLOBALS->fast_tree_sort) +GLOBALS->pfx_hier_array = calloc_2(GLOBALS->hier_pfx_cnt ? GLOBALS->hier_pfx_cnt : 1, sizeof(char *)); + +lst = GLOBALS->hier_pfx; +if(lst) + { + jrb_traverse(ptr, lst) + { + GLOBALS->pfx_hier_array[ptr->val.ui] = ptr->key.s; + } + } + +if((GLOBALS->fast_tree_sort) && (!GLOBALS->do_hier_compress)) { GLOBALS->curnode=GLOBALS->firstnode; for(i=0;inumfacs;i++) @@ -301,7 +341,7 @@ init_tree(); for(i=0;inumfacs;i++) { - build_tree_from_name(GLOBALS->facs[i]->name, i); + build_tree_from_name(GLOBALS->facs[i]->name, i); } /* SPLASH */ splash_sync(4, 5); treegraft(GLOBALS->treeroot); @@ -355,11 +395,29 @@ init_tree(); for(i=0;inumfacs;i++) { - build_tree_from_name(GLOBALS->facs[i]->name, i); + char *n = GLOBALS->facs[i]->name; + int was_packed; + char *recon = hier_decompress_flagged(n, &was_packed); + + if(was_packed) + { + build_tree_from_name(recon, i); + free_2(recon); + } + else + { + build_tree_from_name(n, i); + } } /* SPLASH */ splash_sync(5, 5); treegraft(GLOBALS->treeroot); treesort(GLOBALS->treeroot, NULL); + } + +if(GLOBALS->prev_hier_uncompressed_name) + { + free_2(GLOBALS->prev_hier_uncompressed_name); + GLOBALS->prev_hier_uncompressed_name = NULL; } GLOBALS->min_time = GLOBALS->first_cycle_vzt_c_3; GLOBALS->max_time=GLOBALS->last_cycle_vzt_c_3; @@ -573,6 +631,22 @@ if(f->flags&VZT_RD_SYM_F_STRING) np->head.flags |= HIST_STRING; } + { + struct HistEnt *htemp2 = calloc_2(1, sizeof(struct HistEnt)); + htemp2->time = -1; + if(len>1) + { + htemp2->v.h_vector = htemp->v.h_vector; + } + else + { + htemp2->v.h_val = htemp->v.h_val; + } + htemp2->next = htemp; + htemp = htemp2; + GLOBALS->vzt_table_vzt_c_1[txidx].numtrans++; + } + np->head.time = -2; np->head.next = htemp; np->numhist=GLOBALS->vzt_table_vzt_c_1[txidx].numtrans +2 /*endcap*/ +1 /*frontcap*/; @@ -699,6 +773,22 @@ if(f->flags&VZT_RD_SYM_F_STRING) np->head.flags |= HIST_STRING; } + { + struct HistEnt *htemp2 = calloc_2(1, sizeof(struct HistEnt)); + htemp2->time = -1; + if(len>1) + { + htemp2->v.h_vector = htemp->v.h_vector; + } + else + { + htemp2->v.h_val = htemp->v.h_val; + } + htemp2->next = htemp; + htemp = htemp2; + GLOBALS->vzt_table_vzt_c_1[txidx].numtrans++; + } + np->head.time = -2; np->head.next = htemp; np->numhist=GLOBALS->vzt_table_vzt_c_1[txidx].numtrans +2 /*endcap*/ +1 /*frontcap*/; @@ -713,8 +803,14 @@ } /* - * $Id: vzt.c,v 1.2 2007/08/26 21:35:46 gtkwave Exp $ + * $Id: vzt.c,v 1.4 2008/07/20 20:48:08 gtkwave Exp $ * $Log: vzt.c,v $ + * Revision 1.4 2008/07/20 20:48:08 gtkwave + * compressed hierarchy support + * + * Revision 1.3 2008/06/15 21:26:45 gtkwave + * time -1 endcap add for LXT2 + VZT loaders + * * Revision 1.2 2007/08/26 21:35:46 gtkwave * integrated global context management from SystemOfCode2007 branch * diff --git a/src/wavewindow.c b/src/wavewindow.c index 4096ea9..8893154 100644 --- a/src/wavewindow.c +++ b/src/wavewindow.c @@ -1238,7 +1238,7 @@ { gint rc; gint page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(GLOBALS->notebook)); -struct Global *g_old = GLOBALS; +/* struct Global *g_old = GLOBALS; */ set_GLOBALS((*GLOBALS->contexts)[page_num]); @@ -3115,7 +3115,7 @@ GdkGC *cinf = GLOBALS->gc_w_wavewindow_c_1; GdkGC *cfixed; double mynan = strtod("NaN", NULL); -double tmin = mynan, tmax = mynan, tv, tv2; +double tmin = mynan, tmax = mynan, tv=0.0, tv2; gint rmargin; int is_nan = 0, is_nan2 = 0, is_inf = 0, is_inf2 = 0; int any_infs = 0, any_infp = 0, any_infm = 0; @@ -3752,8 +3752,14 @@ } /* - * $Id: wavewindow.c,v 1.34 2008/04/03 16:56:11 gtkwave Exp $ + * $Id: wavewindow.c,v 1.36 2008/07/01 18:51:07 gtkwave Exp $ * $Log: wavewindow.c,v $ + * Revision 1.36 2008/07/01 18:51:07 gtkwave + * compiler warning fixes for amd64 + * + * Revision 1.35 2008/06/11 08:01:57 gtkwave + * gcc 4.3.x compiler warning fixes + * * Revision 1.34 2008/04/03 16:56:11 gtkwave * more time_trunc() removals * diff --git a/src/zoombuttons.c b/src/zoombuttons.c index 2439b2f..68bffad 100644 --- a/src/zoombuttons.c +++ b/src/zoombuttons.c @@ -25,7 +25,11 @@ pageinc=(gfloat)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); hadj->page_size=hadj->page_increment=(pageinc>=1.0)?pageinc:1.0; -hadj->step_increment=(GLOBALS->nspx>=1.0)?GLOBALS->nspx:1.0; + +/* hadj->step_increment=(GLOBALS->nspx>=1.0)?GLOBALS->nspx:1.0; */ + +hadj->step_increment = pageinc / 10.0; +if(hadj->step_increment < 1.0) hadj->step_increment = 1.0; if(hadj->page_size >= (hadj->upper-hadj->lower)) hadj->value=hadj->lower; if(hadj->value+hadj->page_size>hadj->upper) @@ -471,8 +475,11 @@ } /* - * $Id: zoombuttons.c,v 1.4 2007/09/12 19:24:45 gtkwave Exp $ + * $Id: zoombuttons.c,v 1.5 2008/08/05 20:14:26 gtkwave Exp $ * $Log: zoombuttons.c,v $ + * Revision 1.5 2008/08/05 20:14:26 gtkwave + * make step_increment equal to 1/10 of the page inc rather than pixel level + * * Revision 1.4 2007/09/12 19:24:45 gtkwave * more ctx_swap_watchdog updates *