mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	Merge branch 'YosysHQ:main' into main
This commit is contained in:
		
						commit
						0e3adb38fc
					
				
					 12 changed files with 9084 additions and 6596 deletions
				
			
		
							
								
								
									
										1
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1143,6 +1143,7 @@ vcxsrc: $(GENFILES) $(EXTRA_TARGETS)
 | 
			
		|||
	rm -rf yosys-win32-vcxsrc-$(YOSYS_VER){,.zip}
 | 
			
		||||
	set -e; for f in `ls $(filter %.cc %.cpp,$(GENFILES)) $(addsuffix .cc,$(basename $(OBJS))) $(addsuffix .cpp,$(basename $(OBJS))) 2> /dev/null`; do \
 | 
			
		||||
		echo "Analyse: $$f" >&2; cpp -std=c++17 -MM -I. -D_YOSYS_ $$f; done | sed 's,.*:,,; s,//*,/,g; s,/[^/]*/\.\./,/,g; y, \\,\n\n,;' | grep '^[^/]' | sort -u | grep -v kernel/version_ > srcfiles.txt
 | 
			
		||||
	echo "libs/fst/fst_win_unistd.h" >> srcfiles.txt
 | 
			
		||||
	bash misc/create_vcxsrc.sh yosys-win32-vcxsrc $(YOSYS_VER) $(GIT_REV)
 | 
			
		||||
	echo "namespace Yosys { extern const char *yosys_version_str; const char *yosys_version_str=\"Yosys (Version Information Unavailable)\"; }" > kernel/version.cc
 | 
			
		||||
	zip yosys-win32-vcxsrc-$(YOSYS_VER)/genfiles.zip $(GENFILES) kernel/version.cc
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										58
									
								
								libs/fst/00_PATCH_win_io.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								libs/fst/00_PATCH_win_io.patch
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,58 @@
 | 
			
		|||
--- fst_win_unistd.h
 | 
			
		||||
+++ fst_win_unistd.h
 | 
			
		||||
@@ -26,7 +26,7 @@
 | 
			
		||||
 #define WIN_UNISTD_H
 | 
			
		||||
 
 | 
			
		||||
 #include <stdlib.h>
 | 
			
		||||
-#ifdef _WIN64
 | 
			
		||||
+#if defined(_MSC_VER)
 | 
			
		||||
 #include <io.h>
 | 
			
		||||
 #else
 | 
			
		||||
 #include <sys/io.h>
 | 
			
		||||
--- fstapi.cc
 | 
			
		||||
+++ fstapi.cc
 | 
			
		||||
@@ -56,7 +56,7 @@
 | 
			
		||||
 #include <pthread.h>
 | 
			
		||||
 #endif
 | 
			
		||||
 
 | 
			
		||||
-#ifdef __MINGW32__
 | 
			
		||||
+#if defined __CYGWIN__ || defined __MINGW32__ || defined _MSC_VER
 | 
			
		||||
 #define WIN32_LEAN_AND_MEAN
 | 
			
		||||
 #include <windows.h>
 | 
			
		||||
 #endif
 | 
			
		||||
@@ -137,7 +137,7 @@ void **JenkinsIns(void *base_i, const unsigned char *mem, uint32_t length, uint3
 | 
			
		||||
 #include <sys/sysctl.h>
 | 
			
		||||
 #endif
 | 
			
		||||
 
 | 
			
		||||
-#if defined(FST_MACOSX) || defined(__MINGW32__) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
 | 
			
		||||
+#if defined(FST_MACOSX) || defined(__MINGW32__) || defined(_MSC_VER) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
 | 
			
		||||
 #define FST_UNBUFFERED_IO
 | 
			
		||||
 #endif
 | 
			
		||||
 
 | 
			
		||||
@@ -159,7 +159,7 @@ void **JenkinsIns(void *base_i, const unsigned char *mem, uint32_t length, uint3
 | 
			
		||||
 /***                 ***/
 | 
			
		||||
 /***********************/
 | 
			
		||||
 
 | 
			
		||||
-#ifdef __MINGW32__
 | 
			
		||||
+#if defined(__MINGW32__) || defined(_MSC_VER)
 | 
			
		||||
 #include <io.h>
 | 
			
		||||
 #ifndef HAVE_FSEEKO
 | 
			
		||||
 #define ftello _ftelli64
 | 
			
		||||
@@ -341,7 +341,7 @@ return(NULL);
 | 
			
		||||
 /*
 | 
			
		||||
  * mmap compatibility
 | 
			
		||||
  */
 | 
			
		||||
-#if defined __MINGW32__
 | 
			
		||||
+#if defined __CYGWIN__ || defined __MINGW32__ || defined _MSC_VER
 | 
			
		||||
 #include <limits.h>
 | 
			
		||||
 #define fstMmap(__addr,__len,__prot,__flags,__fd,__off) fstMmap2((__len), (__fd), (__off))
 | 
			
		||||
 #define fstMunmap(__addr,__len)                         UnmapViewOfFile((LPCVOID)__addr)
 | 
			
		||||
@@ -4638,7 +4638,7 @@ if(sectype == FST_BL_ZWRAPPER)
 | 
			
		||||
 #endif
 | 
			
		||||
 
 | 
			
		||||
         fstReaderFseeko(xc, xc->f, FST_ZWRAPPER_HDR_SIZE, SEEK_SET);
 | 
			
		||||
-#ifndef __MINGW32__
 | 
			
		||||
+#if !defined(__MINGW32__) && !defined(_MSC_VER)
 | 
			
		||||
         fflush(xc->f);
 | 
			
		||||
 #else
 | 
			
		||||
 	/* Windows UCRT runtime library reads one byte ahead in the file
 | 
			
		||||
							
								
								
									
										16
									
								
								libs/fst/00_PATCH_win_zlib.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								libs/fst/00_PATCH_win_zlib.patch
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
--- fstapi.h
 | 
			
		||||
+++ fstapi.h
 | 
			
		||||
@@ -33,11 +33,12 @@ extern "C" {
 | 
			
		||||
 #include <stdlib.h>
 | 
			
		||||
 #include <string.h>
 | 
			
		||||
 #include <ctype.h>
 | 
			
		||||
-#include <zlib.h>
 | 
			
		||||
 #include <inttypes.h>
 | 
			
		||||
 #if defined(_MSC_VER)
 | 
			
		||||
+    #include "libs/zlib/zlib.h"
 | 
			
		||||
     #include "fst_win_unistd.h"
 | 
			
		||||
 #else
 | 
			
		||||
+    #include <zlib.h>
 | 
			
		||||
     #include <unistd.h>
 | 
			
		||||
 #endif
 | 
			
		||||
 #include <time.h>
 | 
			
		||||
							
								
								
									
										19
									
								
								libs/fst/00_UPDATE.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										19
									
								
								libs/fst/00_UPDATE.sh
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,19 @@
 | 
			
		|||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
mv config.h config.h.bak
 | 
			
		||||
rm -f *.txt *.cc *.h
 | 
			
		||||
git clone --depth 1 https://github.com/gtkwave/gtkwave fst_upstream
 | 
			
		||||
rm fst_upstream/lib/libfst/CMakeLists.txt
 | 
			
		||||
mv fst_upstream/lib/libfst/*.{h,c,txt} .
 | 
			
		||||
rm -rf fst_upstream
 | 
			
		||||
 | 
			
		||||
for src in *.c; do
 | 
			
		||||
    mv -- "$src" "${src%.c}.cc"
 | 
			
		||||
done
 | 
			
		||||
mv config.h.bak config.h
 | 
			
		||||
 | 
			
		||||
sed -i -e 's,<config.h>,"config.h",' *.cc *.h
 | 
			
		||||
sed -i -e 's,"fastlz.c","fastlz.cc",' *.cc *.h
 | 
			
		||||
 | 
			
		||||
patch -p0 < 00_PATCH_win_zlib.patch
 | 
			
		||||
patch -p0 < 00_PATCH_win_io.patch
 | 
			
		||||
| 
						 | 
				
			
			@ -36,15 +36,16 @@
 | 
			
		|||
 */
 | 
			
		||||
#define FASTLZ_SAFE
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Give hints to the compiler for branch prediction optimization.
 | 
			
		||||
 */
 | 
			
		||||
#if defined(__GNUC__) && (__GNUC__ > 2)
 | 
			
		||||
#define FASTLZ_EXPECT_CONDITIONAL(c) (__builtin_expect((c), 1))
 | 
			
		||||
#define FASTLZ_UNEXPECT_CONDITIONAL(c) (__builtin_expect((c), 0))
 | 
			
		||||
#define FASTLZ_EXPECT_CONDITIONAL(c)    (__builtin_expect((c), 1))
 | 
			
		||||
#define FASTLZ_UNEXPECT_CONDITIONAL(c)  (__builtin_expect((c), 0))
 | 
			
		||||
#else
 | 
			
		||||
#define FASTLZ_EXPECT_CONDITIONAL(c) (c)
 | 
			
		||||
#define FASTLZ_UNEXPECT_CONDITIONAL(c) (c)
 | 
			
		||||
#define FASTLZ_EXPECT_CONDITIONAL(c)    (c)
 | 
			
		||||
#define FASTLZ_UNEXPECT_CONDITIONAL(c)  (c)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			@ -63,7 +64,7 @@
 | 
			
		|||
 */
 | 
			
		||||
#if !defined(FASTLZ_STRICT_ALIGN)
 | 
			
		||||
#define FASTLZ_STRICT_ALIGN
 | 
			
		||||
#if defined(__i386__) || defined(__386) /* GNU C, Sun Studio */
 | 
			
		||||
#if defined(__i386__) || defined(__386)  /* GNU C, Sun Studio */
 | 
			
		||||
#undef FASTLZ_STRICT_ALIGN
 | 
			
		||||
#elif defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(__amd64) /* GNU C */
 | 
			
		||||
#undef FASTLZ_STRICT_ALIGN
 | 
			
		||||
| 
						 | 
				
			
			@ -79,29 +80,24 @@
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/* prototypes */
 | 
			
		||||
int fastlz_compress(const void *input, int length, void *output);
 | 
			
		||||
int fastlz_compress_level(int level, const void *input, int length, void *output);
 | 
			
		||||
int fastlz_decompress(const void *input, int length, void *output, int maxout);
 | 
			
		||||
int fastlz_compress(const void* input, int length, void* output);
 | 
			
		||||
int fastlz_compress_level(int level, const void* input, int length, void* output);
 | 
			
		||||
int fastlz_decompress(const void* input, int length, void* output, int maxout);
 | 
			
		||||
 | 
			
		||||
#define MAX_COPY 32
 | 
			
		||||
#define MAX_LEN 264 /* 256 + 8 */
 | 
			
		||||
#define MAX_COPY       32
 | 
			
		||||
#define MAX_LEN       264  /* 256 + 8 */
 | 
			
		||||
#define MAX_DISTANCE 8192
 | 
			
		||||
 | 
			
		||||
#if !defined(FASTLZ_STRICT_ALIGN)
 | 
			
		||||
#define FASTLZ_READU16(p) *((const flzuint16 *)(p))
 | 
			
		||||
#define FASTLZ_READU16(p) *((const flzuint16*)(p))
 | 
			
		||||
#else
 | 
			
		||||
#define FASTLZ_READU16(p) ((p)[0] | (p)[1] << 8)
 | 
			
		||||
#define FASTLZ_READU16(p) ((p)[0] | (p)[1]<<8)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HASH_LOG 13
 | 
			
		||||
#define HASH_SIZE (1 << HASH_LOG)
 | 
			
		||||
#define HASH_MASK (HASH_SIZE - 1)
 | 
			
		||||
#define HASH_FUNCTION(v, p)                                                                                            \
 | 
			
		||||
    {                                                                                                                  \
 | 
			
		||||
        v = FASTLZ_READU16(p);                                                                                         \
 | 
			
		||||
        v ^= FASTLZ_READU16(p + 1) ^ (v >> (16 - HASH_LOG));                                                           \
 | 
			
		||||
        v &= HASH_MASK;                                                                                                \
 | 
			
		||||
    }
 | 
			
		||||
#define HASH_LOG  13
 | 
			
		||||
#define HASH_SIZE (1<< HASH_LOG)
 | 
			
		||||
#define HASH_MASK  (HASH_SIZE-1)
 | 
			
		||||
#define HASH_FUNCTION(v,p) { v = FASTLZ_READU16(p); v ^= FASTLZ_READU16(p+1)^(v>>(16-HASH_LOG));v &= HASH_MASK; }
 | 
			
		||||
 | 
			
		||||
#undef FASTLZ_LEVEL
 | 
			
		||||
#define FASTLZ_LEVEL 1
 | 
			
		||||
| 
						 | 
				
			
			@ -110,8 +106,8 @@ int fastlz_decompress(const void *input, int length, void *output, int maxout);
 | 
			
		|||
#undef FASTLZ_DECOMPRESSOR
 | 
			
		||||
#define FASTLZ_COMPRESSOR fastlz1_compress
 | 
			
		||||
#define FASTLZ_DECOMPRESSOR fastlz1_decompress
 | 
			
		||||
static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void *input, int length, void *output);
 | 
			
		||||
static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void *input, int length, void *output, int maxout);
 | 
			
		||||
static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output);
 | 
			
		||||
static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout);
 | 
			
		||||
#include "fastlz.cc"
 | 
			
		||||
 | 
			
		||||
#undef FASTLZ_LEVEL
 | 
			
		||||
| 
						 | 
				
			
			@ -119,410 +115,435 @@ static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void *input, int length, void
 | 
			
		|||
 | 
			
		||||
#undef MAX_DISTANCE
 | 
			
		||||
#define MAX_DISTANCE 8191
 | 
			
		||||
#define MAX_FARDISTANCE (65535 + MAX_DISTANCE - 1)
 | 
			
		||||
#define MAX_FARDISTANCE (65535+MAX_DISTANCE-1)
 | 
			
		||||
 | 
			
		||||
#undef FASTLZ_COMPRESSOR
 | 
			
		||||
#undef FASTLZ_DECOMPRESSOR
 | 
			
		||||
#define FASTLZ_COMPRESSOR fastlz2_compress
 | 
			
		||||
#define FASTLZ_DECOMPRESSOR fastlz2_decompress
 | 
			
		||||
static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void *input, int length, void *output);
 | 
			
		||||
static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void *input, int length, void *output, int maxout);
 | 
			
		||||
static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output);
 | 
			
		||||
static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout);
 | 
			
		||||
#include "fastlz.cc"
 | 
			
		||||
 | 
			
		||||
int fastlz_compress(const void *input, int length, void *output)
 | 
			
		||||
int fastlz_compress(const void* input, int length, void* output)
 | 
			
		||||
{
 | 
			
		||||
    /* for short block, choose fastlz1 */
 | 
			
		||||
    if (length < 65536)
 | 
			
		||||
        return fastlz1_compress(input, length, output);
 | 
			
		||||
  /* for short block, choose fastlz1 */
 | 
			
		||||
  if(length < 65536)
 | 
			
		||||
    return fastlz1_compress(input, length, output);
 | 
			
		||||
 | 
			
		||||
    /* else... */
 | 
			
		||||
  /* else... */
 | 
			
		||||
  return fastlz2_compress(input, length, output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int fastlz_decompress(const void* input, int length, void* output, int maxout)
 | 
			
		||||
{
 | 
			
		||||
  /* magic identifier for compression level */
 | 
			
		||||
  int level = ((*(const flzuint8*)input) >> 5) + 1;
 | 
			
		||||
 | 
			
		||||
  if(level == 1)
 | 
			
		||||
    return fastlz1_decompress(input, length, output, maxout);
 | 
			
		||||
  if(level == 2)
 | 
			
		||||
    return fastlz2_decompress(input, length, output, maxout);
 | 
			
		||||
 | 
			
		||||
  /* unknown level, trigger error */
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int fastlz_compress_level(int level, const void* input, int length, void* output)
 | 
			
		||||
{
 | 
			
		||||
  if(level == 1)
 | 
			
		||||
    return fastlz1_compress(input, length, output);
 | 
			
		||||
  if(level == 2)
 | 
			
		||||
    return fastlz2_compress(input, length, output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int fastlz_decompress(const void *input, int length, void *output, int maxout)
 | 
			
		||||
{
 | 
			
		||||
    /* magic identifier for compression level */
 | 
			
		||||
    int level = ((*(const flzuint8 *)input) >> 5) + 1;
 | 
			
		||||
 | 
			
		||||
    if (level == 1)
 | 
			
		||||
        return fastlz1_decompress(input, length, output, maxout);
 | 
			
		||||
    if (level == 2)
 | 
			
		||||
        return fastlz2_decompress(input, length, output, maxout);
 | 
			
		||||
 | 
			
		||||
    /* unknown level, trigger error */
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int fastlz_compress_level(int level, const void *input, int length, void *output)
 | 
			
		||||
{
 | 
			
		||||
    if (level == 1)
 | 
			
		||||
        return fastlz1_compress(input, length, output);
 | 
			
		||||
    if (level == 2)
 | 
			
		||||
        return fastlz2_compress(input, length, output);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else /* !defined(FASTLZ_COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR) */
 | 
			
		||||
 | 
			
		||||
static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void *input, int length, void *output)
 | 
			
		||||
static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output)
 | 
			
		||||
{
 | 
			
		||||
    const flzuint8 *ip = (const flzuint8 *)input;
 | 
			
		||||
    const flzuint8 *ip_bound = ip + length - 2;
 | 
			
		||||
    const flzuint8 *ip_limit = ip + length - 12;
 | 
			
		||||
    flzuint8 *op = (flzuint8 *)output;
 | 
			
		||||
  const flzuint8* ip = (const flzuint8*) input;
 | 
			
		||||
  const flzuint8* ip_bound = ip + length - 2;
 | 
			
		||||
  const flzuint8* ip_limit = ip + length - 12;
 | 
			
		||||
  flzuint8* op = (flzuint8*) output;
 | 
			
		||||
 | 
			
		||||
    const flzuint8 *htab[HASH_SIZE];
 | 
			
		||||
    const flzuint8 **hslot;
 | 
			
		||||
    flzuint32 hval;
 | 
			
		||||
  const flzuint8* htab[HASH_SIZE];
 | 
			
		||||
  const flzuint8** hslot;
 | 
			
		||||
  flzuint32 hval;
 | 
			
		||||
 | 
			
		||||
    flzuint32 copy;
 | 
			
		||||
  flzuint32 copy;
 | 
			
		||||
 | 
			
		||||
    /* sanity check */
 | 
			
		||||
    if (FASTLZ_UNEXPECT_CONDITIONAL(length < 4)) {
 | 
			
		||||
        if (length) {
 | 
			
		||||
            /* create literal copy only */
 | 
			
		||||
            *op++ = length - 1;
 | 
			
		||||
            ip_bound++;
 | 
			
		||||
            while (ip <= ip_bound)
 | 
			
		||||
                *op++ = *ip++;
 | 
			
		||||
            return length + 1;
 | 
			
		||||
        } else
 | 
			
		||||
            return 0;
 | 
			
		||||
  /* sanity check */
 | 
			
		||||
  if(FASTLZ_UNEXPECT_CONDITIONAL(length < 4))
 | 
			
		||||
  {
 | 
			
		||||
    if(length)
 | 
			
		||||
    {
 | 
			
		||||
      /* create literal copy only */
 | 
			
		||||
      *op++ = length-1;
 | 
			
		||||
      ip_bound++;
 | 
			
		||||
      while(ip <= ip_bound)
 | 
			
		||||
        *op++ = *ip++;
 | 
			
		||||
      return length+1;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
      return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    /* initializes hash table */
 | 
			
		||||
    for (hslot = htab; hslot < htab + HASH_SIZE; hslot++)
 | 
			
		||||
        *hslot = ip;
 | 
			
		||||
  /* initializes hash table */
 | 
			
		||||
  for (hslot = htab; hslot < htab + HASH_SIZE; hslot++)
 | 
			
		||||
    *hslot = ip;
 | 
			
		||||
 | 
			
		||||
    /* we start with literal copy */
 | 
			
		||||
    copy = 2;
 | 
			
		||||
    *op++ = MAX_COPY - 1;
 | 
			
		||||
    *op++ = *ip++;
 | 
			
		||||
    *op++ = *ip++;
 | 
			
		||||
  /* we start with literal copy */
 | 
			
		||||
  copy = 2;
 | 
			
		||||
  *op++ = MAX_COPY-1;
 | 
			
		||||
  *op++ = *ip++;
 | 
			
		||||
  *op++ = *ip++;
 | 
			
		||||
 | 
			
		||||
    /* main loop */
 | 
			
		||||
    while (FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit)) {
 | 
			
		||||
        const flzuint8 *ref;
 | 
			
		||||
        flzuint32 distance;
 | 
			
		||||
  /* main loop */
 | 
			
		||||
  while(FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit))
 | 
			
		||||
  {
 | 
			
		||||
    const flzuint8* ref;
 | 
			
		||||
    flzuint32 distance;
 | 
			
		||||
 | 
			
		||||
        /* minimum match length */
 | 
			
		||||
        flzuint32 len = 3;
 | 
			
		||||
    /* minimum match length */
 | 
			
		||||
    flzuint32 len = 3;
 | 
			
		||||
 | 
			
		||||
        /* comparison starting-point */
 | 
			
		||||
        const flzuint8 *anchor = ip;
 | 
			
		||||
    /* comparison starting-point */
 | 
			
		||||
    const flzuint8* anchor = ip;
 | 
			
		||||
 | 
			
		||||
        /* check for a run */
 | 
			
		||||
#if FASTLZ_LEVEL == 2
 | 
			
		||||
        if (ip[0] == ip[-1] && FASTLZ_READU16(ip - 1) == FASTLZ_READU16(ip + 1)) {
 | 
			
		||||
            distance = 1;
 | 
			
		||||
            /* ip += 3; */ /* scan-build, never used */
 | 
			
		||||
            ref = anchor - 1 + 3;
 | 
			
		||||
            goto match;
 | 
			
		||||
        }
 | 
			
		||||
    /* check for a run */
 | 
			
		||||
#if FASTLZ_LEVEL==2
 | 
			
		||||
    if(ip[0] == ip[-1] && FASTLZ_READU16(ip-1)==FASTLZ_READU16(ip+1))
 | 
			
		||||
    {
 | 
			
		||||
      distance = 1;
 | 
			
		||||
      /* ip += 3; */ /* scan-build, never used */
 | 
			
		||||
      ref = anchor - 1 + 3;
 | 
			
		||||
      goto match;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        /* find potential match */
 | 
			
		||||
        HASH_FUNCTION(hval, ip);
 | 
			
		||||
        hslot = htab + hval;
 | 
			
		||||
        ref = htab[hval];
 | 
			
		||||
    /* find potential match */
 | 
			
		||||
    HASH_FUNCTION(hval,ip);
 | 
			
		||||
    hslot = htab + hval;
 | 
			
		||||
    ref = htab[hval];
 | 
			
		||||
 | 
			
		||||
        /* calculate distance to the match */
 | 
			
		||||
        distance = anchor - ref;
 | 
			
		||||
    /* calculate distance to the match */
 | 
			
		||||
    distance = anchor - ref;
 | 
			
		||||
 | 
			
		||||
        /* update hash table */
 | 
			
		||||
        *hslot = anchor;
 | 
			
		||||
    /* update hash table */
 | 
			
		||||
    *hslot = anchor;
 | 
			
		||||
 | 
			
		||||
        /* is this a match? check the first 3 bytes */
 | 
			
		||||
        if (distance == 0 ||
 | 
			
		||||
#if FASTLZ_LEVEL == 1
 | 
			
		||||
            (distance >= MAX_DISTANCE) ||
 | 
			
		||||
    /* is this a match? check the first 3 bytes */
 | 
			
		||||
    if(distance==0 ||
 | 
			
		||||
#if FASTLZ_LEVEL==1
 | 
			
		||||
    (distance >= MAX_DISTANCE) ||
 | 
			
		||||
#else
 | 
			
		||||
            (distance >= MAX_FARDISTANCE) ||
 | 
			
		||||
    (distance >= MAX_FARDISTANCE) ||
 | 
			
		||||
#endif
 | 
			
		||||
            *ref++ != *ip++ || *ref++ != *ip++ || *ref++ != *ip++)
 | 
			
		||||
            goto literal;
 | 
			
		||||
    *ref++ != *ip++ || *ref++!=*ip++ || *ref++!=*ip++)
 | 
			
		||||
      goto literal;
 | 
			
		||||
 | 
			
		||||
#if FASTLZ_LEVEL == 2
 | 
			
		||||
        /* far, needs at least 5-byte match */
 | 
			
		||||
        if (distance >= MAX_DISTANCE) {
 | 
			
		||||
            if (*ip++ != *ref++ || *ip++ != *ref++)
 | 
			
		||||
                goto literal;
 | 
			
		||||
            len += 2;
 | 
			
		||||
        }
 | 
			
		||||
#if FASTLZ_LEVEL==2
 | 
			
		||||
    /* far, needs at least 5-byte match */
 | 
			
		||||
    if(distance >= MAX_DISTANCE)
 | 
			
		||||
    {
 | 
			
		||||
      if(*ip++ != *ref++ || *ip++!= *ref++)
 | 
			
		||||
        goto literal;
 | 
			
		||||
      len += 2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    match:
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        /* last matched byte */
 | 
			
		||||
        ip = anchor + len;
 | 
			
		||||
    /* last matched byte */
 | 
			
		||||
    ip = anchor + len;
 | 
			
		||||
 | 
			
		||||
        /* distance is biased */
 | 
			
		||||
        distance--;
 | 
			
		||||
    /* distance is biased */
 | 
			
		||||
    distance--;
 | 
			
		||||
 | 
			
		||||
        if (!distance) {
 | 
			
		||||
            /* zero distance means a run */
 | 
			
		||||
            flzuint8 x = ip[-1];
 | 
			
		||||
            while (ip < ip_bound)
 | 
			
		||||
                if (*ref++ != x)
 | 
			
		||||
                    break;
 | 
			
		||||
                else
 | 
			
		||||
                    ip++;
 | 
			
		||||
        } else
 | 
			
		||||
            for (;;) {
 | 
			
		||||
                /* safe because the outer check against ip limit */
 | 
			
		||||
                if (*ref++ != *ip++)
 | 
			
		||||
                    break;
 | 
			
		||||
                if (*ref++ != *ip++)
 | 
			
		||||
                    break;
 | 
			
		||||
                if (*ref++ != *ip++)
 | 
			
		||||
                    break;
 | 
			
		||||
                if (*ref++ != *ip++)
 | 
			
		||||
                    break;
 | 
			
		||||
                if (*ref++ != *ip++)
 | 
			
		||||
                    break;
 | 
			
		||||
                if (*ref++ != *ip++)
 | 
			
		||||
                    break;
 | 
			
		||||
                if (*ref++ != *ip++)
 | 
			
		||||
                    break;
 | 
			
		||||
                if (*ref++ != *ip++)
 | 
			
		||||
                    break;
 | 
			
		||||
                while (ip < ip_bound)
 | 
			
		||||
                    if (*ref++ != *ip++)
 | 
			
		||||
                        break;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
    if(!distance)
 | 
			
		||||
    {
 | 
			
		||||
      /* zero distance means a run */
 | 
			
		||||
      flzuint8 x = ip[-1];
 | 
			
		||||
      while(ip < ip_bound)
 | 
			
		||||
        if(*ref++ != x) break; else ip++;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    for(;;)
 | 
			
		||||
    {
 | 
			
		||||
      /* safe because the outer check against ip limit */
 | 
			
		||||
      if(*ref++ != *ip++) break;
 | 
			
		||||
      if(*ref++ != *ip++) break;
 | 
			
		||||
      if(*ref++ != *ip++) break;
 | 
			
		||||
      if(*ref++ != *ip++) break;
 | 
			
		||||
      if(*ref++ != *ip++) break;
 | 
			
		||||
      if(*ref++ != *ip++) break;
 | 
			
		||||
      if(*ref++ != *ip++) break;
 | 
			
		||||
      if(*ref++ != *ip++) break;
 | 
			
		||||
      while(ip < ip_bound)
 | 
			
		||||
        if(*ref++ != *ip++) break;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        /* if we have copied something, adjust the copy count */
 | 
			
		||||
        if (copy)
 | 
			
		||||
            /* copy is biased, '0' means 1 byte copy */
 | 
			
		||||
            *(op - copy - 1) = copy - 1;
 | 
			
		||||
        else
 | 
			
		||||
            /* back, to overwrite the copy count */
 | 
			
		||||
            op--;
 | 
			
		||||
    /* if we have copied something, adjust the copy count */
 | 
			
		||||
    if(copy)
 | 
			
		||||
      /* copy is biased, '0' means 1 byte copy */
 | 
			
		||||
      *(op-copy-1) = copy-1;
 | 
			
		||||
    else
 | 
			
		||||
      /* back, to overwrite the copy count */
 | 
			
		||||
      op--;
 | 
			
		||||
 | 
			
		||||
        /* reset literal counter */
 | 
			
		||||
        copy = 0;
 | 
			
		||||
    /* reset literal counter */
 | 
			
		||||
    copy = 0;
 | 
			
		||||
 | 
			
		||||
        /* length is biased, '1' means a match of 3 bytes */
 | 
			
		||||
        ip -= 3;
 | 
			
		||||
        len = ip - anchor;
 | 
			
		||||
    /* length is biased, '1' means a match of 3 bytes */
 | 
			
		||||
    ip -= 3;
 | 
			
		||||
    len = ip - anchor;
 | 
			
		||||
 | 
			
		||||
        /* encode the match */
 | 
			
		||||
#if FASTLZ_LEVEL == 2
 | 
			
		||||
        if (distance < MAX_DISTANCE) {
 | 
			
		||||
            if (len < 7) {
 | 
			
		||||
                *op++ = (len << 5) + (distance >> 8);
 | 
			
		||||
                *op++ = (distance & 255);
 | 
			
		||||
            } else {
 | 
			
		||||
                *op++ = (7 << 5) + (distance >> 8);
 | 
			
		||||
                for (len -= 7; len >= 255; len -= 255)
 | 
			
		||||
                    *op++ = 255;
 | 
			
		||||
                *op++ = len;
 | 
			
		||||
                *op++ = (distance & 255);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            /* far away, but not yet in the another galaxy... */
 | 
			
		||||
            if (len < 7) {
 | 
			
		||||
                distance -= MAX_DISTANCE;
 | 
			
		||||
                *op++ = (len << 5) + 31;
 | 
			
		||||
                *op++ = 255;
 | 
			
		||||
                *op++ = distance >> 8;
 | 
			
		||||
                *op++ = distance & 255;
 | 
			
		||||
            } else {
 | 
			
		||||
                distance -= MAX_DISTANCE;
 | 
			
		||||
                *op++ = (7 << 5) + 31;
 | 
			
		||||
                for (len -= 7; len >= 255; len -= 255)
 | 
			
		||||
                    *op++ = 255;
 | 
			
		||||
                *op++ = len;
 | 
			
		||||
                *op++ = 255;
 | 
			
		||||
                *op++ = distance >> 8;
 | 
			
		||||
                *op++ = distance & 255;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    /* encode the match */
 | 
			
		||||
#if FASTLZ_LEVEL==2
 | 
			
		||||
    if(distance < MAX_DISTANCE)
 | 
			
		||||
    {
 | 
			
		||||
      if(len < 7)
 | 
			
		||||
      {
 | 
			
		||||
        *op++ = (len << 5) + (distance >> 8);
 | 
			
		||||
        *op++ = (distance & 255);
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
        *op++ = (7 << 5) + (distance >> 8);
 | 
			
		||||
        for(len-=7; len >= 255; len-= 255)
 | 
			
		||||
          *op++ = 255;
 | 
			
		||||
        *op++ = len;
 | 
			
		||||
        *op++ = (distance & 255);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      /* far away, but not yet in the another galaxy... */
 | 
			
		||||
      if(len < 7)
 | 
			
		||||
      {
 | 
			
		||||
        distance -= MAX_DISTANCE;
 | 
			
		||||
        *op++ = (len << 5) + 31;
 | 
			
		||||
        *op++ = 255;
 | 
			
		||||
        *op++ = distance >> 8;
 | 
			
		||||
        *op++ = distance & 255;
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
        distance -= MAX_DISTANCE;
 | 
			
		||||
        *op++ = (7 << 5) + 31;
 | 
			
		||||
        for(len-=7; len >= 255; len-= 255)
 | 
			
		||||
          *op++ = 255;
 | 
			
		||||
        *op++ = len;
 | 
			
		||||
        *op++ = 255;
 | 
			
		||||
        *op++ = distance >> 8;
 | 
			
		||||
        *op++ = distance & 255;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        if (FASTLZ_UNEXPECT_CONDITIONAL(len > MAX_LEN - 2))
 | 
			
		||||
            while (len > MAX_LEN - 2) {
 | 
			
		||||
                *op++ = (7 << 5) + (distance >> 8);
 | 
			
		||||
                *op++ = MAX_LEN - 2 - 7 - 2;
 | 
			
		||||
                *op++ = (distance & 255);
 | 
			
		||||
                len -= MAX_LEN - 2;
 | 
			
		||||
            }
 | 
			
		||||
    if(FASTLZ_UNEXPECT_CONDITIONAL(len > MAX_LEN-2))
 | 
			
		||||
      while(len > MAX_LEN-2)
 | 
			
		||||
      {
 | 
			
		||||
        *op++ = (7 << 5) + (distance >> 8);
 | 
			
		||||
        *op++ = MAX_LEN - 2 - 7 -2;
 | 
			
		||||
        *op++ = (distance & 255);
 | 
			
		||||
        len -= MAX_LEN-2;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
        if (len < 7) {
 | 
			
		||||
            *op++ = (len << 5) + (distance >> 8);
 | 
			
		||||
            *op++ = (distance & 255);
 | 
			
		||||
        } else {
 | 
			
		||||
            *op++ = (7 << 5) + (distance >> 8);
 | 
			
		||||
            *op++ = len - 7;
 | 
			
		||||
            *op++ = (distance & 255);
 | 
			
		||||
        }
 | 
			
		||||
    if(len < 7)
 | 
			
		||||
    {
 | 
			
		||||
      *op++ = (len << 5) + (distance >> 8);
 | 
			
		||||
      *op++ = (distance & 255);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      *op++ = (7 << 5) + (distance >> 8);
 | 
			
		||||
      *op++ = len - 7;
 | 
			
		||||
      *op++ = (distance & 255);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        /* update the hash at match boundary */
 | 
			
		||||
        HASH_FUNCTION(hval, ip);
 | 
			
		||||
        htab[hval] = ip++;
 | 
			
		||||
        HASH_FUNCTION(hval, ip);
 | 
			
		||||
        htab[hval] = ip++;
 | 
			
		||||
    /* update the hash at match boundary */
 | 
			
		||||
    HASH_FUNCTION(hval,ip);
 | 
			
		||||
    htab[hval] = ip++;
 | 
			
		||||
    HASH_FUNCTION(hval,ip);
 | 
			
		||||
    htab[hval] = ip++;
 | 
			
		||||
 | 
			
		||||
        /* assuming literal copy */
 | 
			
		||||
        *op++ = MAX_COPY - 1;
 | 
			
		||||
    /* assuming literal copy */
 | 
			
		||||
    *op++ = MAX_COPY-1;
 | 
			
		||||
 | 
			
		||||
        continue;
 | 
			
		||||
    continue;
 | 
			
		||||
 | 
			
		||||
    literal:
 | 
			
		||||
        *op++ = *anchor++;
 | 
			
		||||
        ip = anchor;
 | 
			
		||||
        copy++;
 | 
			
		||||
        if (FASTLZ_UNEXPECT_CONDITIONAL(copy == MAX_COPY)) {
 | 
			
		||||
            copy = 0;
 | 
			
		||||
            *op++ = MAX_COPY - 1;
 | 
			
		||||
        }
 | 
			
		||||
      *op++ = *anchor++;
 | 
			
		||||
      ip = anchor;
 | 
			
		||||
      copy++;
 | 
			
		||||
      if(FASTLZ_UNEXPECT_CONDITIONAL(copy == MAX_COPY))
 | 
			
		||||
      {
 | 
			
		||||
        copy = 0;
 | 
			
		||||
        *op++ = MAX_COPY-1;
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* left-over as literal copy */
 | 
			
		||||
  ip_bound++;
 | 
			
		||||
  while(ip <= ip_bound)
 | 
			
		||||
  {
 | 
			
		||||
    *op++ = *ip++;
 | 
			
		||||
    copy++;
 | 
			
		||||
    if(copy == MAX_COPY)
 | 
			
		||||
    {
 | 
			
		||||
      copy = 0;
 | 
			
		||||
      *op++ = MAX_COPY-1;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    /* left-over as literal copy */
 | 
			
		||||
    ip_bound++;
 | 
			
		||||
    while (ip <= ip_bound) {
 | 
			
		||||
        *op++ = *ip++;
 | 
			
		||||
        copy++;
 | 
			
		||||
        if (copy == MAX_COPY) {
 | 
			
		||||
            copy = 0;
 | 
			
		||||
            *op++ = MAX_COPY - 1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
  /* if we have copied something, adjust the copy length */
 | 
			
		||||
  if(copy)
 | 
			
		||||
    *(op-copy-1) = copy-1;
 | 
			
		||||
  else
 | 
			
		||||
    op--;
 | 
			
		||||
 | 
			
		||||
    /* if we have copied something, adjust the copy length */
 | 
			
		||||
    if (copy)
 | 
			
		||||
        *(op - copy - 1) = copy - 1;
 | 
			
		||||
    else
 | 
			
		||||
        op--;
 | 
			
		||||
 | 
			
		||||
#if FASTLZ_LEVEL == 2
 | 
			
		||||
    /* marker for fastlz2 */
 | 
			
		||||
    *(flzuint8 *)output |= (1 << 5);
 | 
			
		||||
#if FASTLZ_LEVEL==2
 | 
			
		||||
  /* marker for fastlz2 */
 | 
			
		||||
  *(flzuint8*)output |= (1 << 5);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    return op - (flzuint8 *)output;
 | 
			
		||||
  return op - (flzuint8*)output;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void *input, int length, void *output, int maxout)
 | 
			
		||||
static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout)
 | 
			
		||||
{
 | 
			
		||||
    const flzuint8 *ip = (const flzuint8 *)input;
 | 
			
		||||
    const flzuint8 *ip_limit = ip + length;
 | 
			
		||||
    flzuint8 *op = (flzuint8 *)output;
 | 
			
		||||
    flzuint8 *op_limit = op + maxout;
 | 
			
		||||
    flzuint32 ctrl = (*ip++) & 31;
 | 
			
		||||
    int loop = 1;
 | 
			
		||||
  const flzuint8* ip = (const flzuint8*) input;
 | 
			
		||||
  const flzuint8* ip_limit  = ip + length;
 | 
			
		||||
  flzuint8* op = (flzuint8*) output;
 | 
			
		||||
  flzuint8* op_limit = op + maxout;
 | 
			
		||||
  flzuint32 ctrl = (*ip++) & 31;
 | 
			
		||||
  int loop = 1;
 | 
			
		||||
 | 
			
		||||
    do {
 | 
			
		||||
        const flzuint8 *ref = op;
 | 
			
		||||
        flzuint32 len = ctrl >> 5;
 | 
			
		||||
        flzuint32 ofs = (ctrl & 31) << 8;
 | 
			
		||||
  do
 | 
			
		||||
  {
 | 
			
		||||
    const flzuint8* ref = op;
 | 
			
		||||
    flzuint32 len = ctrl >> 5;
 | 
			
		||||
    flzuint32 ofs = (ctrl & 31) << 8;
 | 
			
		||||
 | 
			
		||||
        if (ctrl >= 32) {
 | 
			
		||||
#if FASTLZ_LEVEL == 2
 | 
			
		||||
            flzuint8 code;
 | 
			
		||||
    if(ctrl >= 32)
 | 
			
		||||
    {
 | 
			
		||||
#if FASTLZ_LEVEL==2
 | 
			
		||||
      flzuint8 code;
 | 
			
		||||
#endif
 | 
			
		||||
            len--;
 | 
			
		||||
            ref -= ofs;
 | 
			
		||||
            if (len == 7 - 1)
 | 
			
		||||
#if FASTLZ_LEVEL == 1
 | 
			
		||||
                len += *ip++;
 | 
			
		||||
            ref -= *ip++;
 | 
			
		||||
      len--;
 | 
			
		||||
      ref -= ofs;
 | 
			
		||||
      if (len == 7-1)
 | 
			
		||||
#if FASTLZ_LEVEL==1
 | 
			
		||||
        len += *ip++;
 | 
			
		||||
      ref -= *ip++;
 | 
			
		||||
#else
 | 
			
		||||
                do {
 | 
			
		||||
                    code = *ip++;
 | 
			
		||||
                    len += code;
 | 
			
		||||
                } while (code == 255);
 | 
			
		||||
            code = *ip++;
 | 
			
		||||
            ref -= code;
 | 
			
		||||
        do
 | 
			
		||||
        {
 | 
			
		||||
          code = *ip++;
 | 
			
		||||
          len += code;
 | 
			
		||||
        } while (code==255);
 | 
			
		||||
      code = *ip++;
 | 
			
		||||
      ref -= code;
 | 
			
		||||
 | 
			
		||||
            /* match from 16-bit distance */
 | 
			
		||||
            if (FASTLZ_UNEXPECT_CONDITIONAL(code == 255))
 | 
			
		||||
                if (FASTLZ_EXPECT_CONDITIONAL(ofs == (31 << 8))) {
 | 
			
		||||
                    ofs = (*ip++) << 8;
 | 
			
		||||
                    ofs += *ip++;
 | 
			
		||||
                    ref = op - ofs - MAX_DISTANCE;
 | 
			
		||||
                }
 | 
			
		||||
      /* match from 16-bit distance */
 | 
			
		||||
      if(FASTLZ_UNEXPECT_CONDITIONAL(code==255))
 | 
			
		||||
      if(FASTLZ_EXPECT_CONDITIONAL(ofs==(31 << 8)))
 | 
			
		||||
      {
 | 
			
		||||
        ofs = (*ip++) << 8;
 | 
			
		||||
        ofs += *ip++;
 | 
			
		||||
        ref = op - ofs - MAX_DISTANCE;
 | 
			
		||||
      }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef FASTLZ_SAFE
 | 
			
		||||
            if (FASTLZ_UNEXPECT_CONDITIONAL(op + len + 3 > op_limit))
 | 
			
		||||
                return 0;
 | 
			
		||||
      if (FASTLZ_UNEXPECT_CONDITIONAL(op + len + 3 > op_limit))
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
            if (FASTLZ_UNEXPECT_CONDITIONAL(ref - 1 < (flzuint8 *)output))
 | 
			
		||||
                return 0;
 | 
			
		||||
      if (FASTLZ_UNEXPECT_CONDITIONAL(ref-1 < (flzuint8 *)output))
 | 
			
		||||
        return 0;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
            if (FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit))
 | 
			
		||||
                ctrl = *ip++;
 | 
			
		||||
            else
 | 
			
		||||
                loop = 0;
 | 
			
		||||
      if(FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit))
 | 
			
		||||
        ctrl = *ip++;
 | 
			
		||||
      else
 | 
			
		||||
        loop = 0;
 | 
			
		||||
 | 
			
		||||
            if (ref == op) {
 | 
			
		||||
                /* optimize copy for a run */
 | 
			
		||||
                flzuint8 b = ref[-1];
 | 
			
		||||
                *op++ = b;
 | 
			
		||||
                *op++ = b;
 | 
			
		||||
                *op++ = b;
 | 
			
		||||
                for (; len; --len)
 | 
			
		||||
                    *op++ = b;
 | 
			
		||||
            } else {
 | 
			
		||||
      if(ref == op)
 | 
			
		||||
      {
 | 
			
		||||
        /* optimize copy for a run */
 | 
			
		||||
        flzuint8 b = ref[-1];
 | 
			
		||||
        *op++ = b;
 | 
			
		||||
        *op++ = b;
 | 
			
		||||
        *op++ = b;
 | 
			
		||||
        for(; len; --len)
 | 
			
		||||
          *op++ = b;
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
#if !defined(FASTLZ_STRICT_ALIGN)
 | 
			
		||||
                const flzuint16 *p;
 | 
			
		||||
                flzuint16 *q;
 | 
			
		||||
        const flzuint16* p;
 | 
			
		||||
        flzuint16* q;
 | 
			
		||||
#endif
 | 
			
		||||
                /* copy from reference */
 | 
			
		||||
                ref--;
 | 
			
		||||
                *op++ = *ref++;
 | 
			
		||||
                *op++ = *ref++;
 | 
			
		||||
                *op++ = *ref++;
 | 
			
		||||
        /* copy from reference */
 | 
			
		||||
        ref--;
 | 
			
		||||
        *op++ = *ref++;
 | 
			
		||||
        *op++ = *ref++;
 | 
			
		||||
        *op++ = *ref++;
 | 
			
		||||
 | 
			
		||||
#if !defined(FASTLZ_STRICT_ALIGN)
 | 
			
		||||
                /* copy a byte, so that now it's word aligned */
 | 
			
		||||
                if (len & 1) {
 | 
			
		||||
                    *op++ = *ref++;
 | 
			
		||||
                    len--;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                /* copy 16-bit at once */
 | 
			
		||||
                q = (flzuint16 *)op;
 | 
			
		||||
                op += len;
 | 
			
		||||
                p = (const flzuint16 *)ref;
 | 
			
		||||
                for (len >>= 1; len > 4; len -= 4) {
 | 
			
		||||
                    *q++ = *p++;
 | 
			
		||||
                    *q++ = *p++;
 | 
			
		||||
                    *q++ = *p++;
 | 
			
		||||
                    *q++ = *p++;
 | 
			
		||||
                }
 | 
			
		||||
                for (; len; --len)
 | 
			
		||||
                    *q++ = *p++;
 | 
			
		||||
#else
 | 
			
		||||
                for (; len; --len)
 | 
			
		||||
                    *op++ = *ref++;
 | 
			
		||||
#endif
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            ctrl++;
 | 
			
		||||
#ifdef FASTLZ_SAFE
 | 
			
		||||
            if (FASTLZ_UNEXPECT_CONDITIONAL(op + ctrl > op_limit))
 | 
			
		||||
                return 0;
 | 
			
		||||
            if (FASTLZ_UNEXPECT_CONDITIONAL(ip + ctrl > ip_limit))
 | 
			
		||||
                return 0;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
            *op++ = *ip++;
 | 
			
		||||
            for (--ctrl; ctrl; ctrl--)
 | 
			
		||||
                *op++ = *ip++;
 | 
			
		||||
 | 
			
		||||
            loop = FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit);
 | 
			
		||||
            if (loop)
 | 
			
		||||
                ctrl = *ip++;
 | 
			
		||||
        /* copy a byte, so that now it's word aligned */
 | 
			
		||||
        if(len & 1)
 | 
			
		||||
        {
 | 
			
		||||
          *op++ = *ref++;
 | 
			
		||||
          len--;
 | 
			
		||||
        }
 | 
			
		||||
    } while (FASTLZ_EXPECT_CONDITIONAL(loop));
 | 
			
		||||
 | 
			
		||||
    return op - (flzuint8 *)output;
 | 
			
		||||
        /* copy 16-bit at once */
 | 
			
		||||
        q = (flzuint16*) op;
 | 
			
		||||
        op += len;
 | 
			
		||||
        p = (const flzuint16*) ref;
 | 
			
		||||
        for(len>>=1; len > 4; len-=4)
 | 
			
		||||
        {
 | 
			
		||||
          *q++ = *p++;
 | 
			
		||||
          *q++ = *p++;
 | 
			
		||||
          *q++ = *p++;
 | 
			
		||||
          *q++ = *p++;
 | 
			
		||||
        }
 | 
			
		||||
        for(; len; --len)
 | 
			
		||||
          *q++ = *p++;
 | 
			
		||||
#else
 | 
			
		||||
        for(; len; --len)
 | 
			
		||||
          *op++ = *ref++;
 | 
			
		||||
#endif
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      ctrl++;
 | 
			
		||||
#ifdef FASTLZ_SAFE
 | 
			
		||||
      if (FASTLZ_UNEXPECT_CONDITIONAL(op + ctrl > op_limit))
 | 
			
		||||
        return 0;
 | 
			
		||||
      if (FASTLZ_UNEXPECT_CONDITIONAL(ip + ctrl > ip_limit))
 | 
			
		||||
        return 0;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
      *op++ = *ip++;
 | 
			
		||||
      for(--ctrl; ctrl; ctrl--)
 | 
			
		||||
        *op++ = *ip++;
 | 
			
		||||
 | 
			
		||||
      loop = FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit);
 | 
			
		||||
      if(loop)
 | 
			
		||||
        ctrl = *ip++;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  while(FASTLZ_EXPECT_CONDITIONAL(loop));
 | 
			
		||||
 | 
			
		||||
  return op - (flzuint8*)output;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* !defined(FASTLZ_COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR) */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										52
									
								
								libs/fst/fst_win_unistd.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								libs/fst/fst_win_unistd.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,52 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2009-2018 Tony Bybell.
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 * copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 | 
			
		||||
 * DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: MIT
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef WIN_UNISTD_H
 | 
			
		||||
#define WIN_UNISTD_H
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#if defined(_MSC_VER)
 | 
			
		||||
#include <io.h>
 | 
			
		||||
#else
 | 
			
		||||
#include <sys/io.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <process.h>
 | 
			
		||||
 | 
			
		||||
#define ftruncate _chsize_s
 | 
			
		||||
#define unlink _unlink
 | 
			
		||||
#define fileno _fileno
 | 
			
		||||
#define lseek _lseeki64
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN64
 | 
			
		||||
#define ssize_t __int64
 | 
			
		||||
#define SSIZE_MAX 9223372036854775807i64
 | 
			
		||||
#else
 | 
			
		||||
#define ssize_t long
 | 
			
		||||
#define SSIZE_MAX 2147483647L
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "stdint.h"
 | 
			
		||||
 | 
			
		||||
#endif //WIN_UNISTD_H
 | 
			
		||||
							
								
								
									
										9535
									
								
								libs/fst/fstapi.cc
									
										
									
									
									
								
							
							
						
						
									
										9535
									
								
								libs/fst/fstapi.cc
									
										
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -35,28 +35,11 @@ extern "C" {
 | 
			
		|||
#include <ctype.h>
 | 
			
		||||
#include <inttypes.h>
 | 
			
		||||
#if defined(_MSC_VER)
 | 
			
		||||
#include "libs/zlib/zlib.h"
 | 
			
		||||
#include <io.h>
 | 
			
		||||
 | 
			
		||||
#include <process.h>
 | 
			
		||||
 | 
			
		||||
#define ftruncate _chsize_s
 | 
			
		||||
#define unlink _unlink
 | 
			
		||||
#define fileno _fileno
 | 
			
		||||
#define lseek _lseeki64
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN64
 | 
			
		||||
#define ssize_t __int64
 | 
			
		||||
#define SSIZE_MAX 9223372036854775807i64
 | 
			
		||||
    #include "libs/zlib/zlib.h"
 | 
			
		||||
    #include "fst_win_unistd.h"
 | 
			
		||||
#else
 | 
			
		||||
#define ssize_t long
 | 
			
		||||
#define SSIZE_MAX 2147483647L
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "stdint.h"
 | 
			
		||||
#else
 | 
			
		||||
#include <zlib.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
    #include <zlib.h>
 | 
			
		||||
    #include <unistd.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -65,433 +48,417 @@ extern "C" {
 | 
			
		|||
typedef uint32_t fstHandle;
 | 
			
		||||
typedef uint32_t fstEnumHandle;
 | 
			
		||||
 | 
			
		||||
enum fstWriterPackType
 | 
			
		||||
{
 | 
			
		||||
    FST_WR_PT_ZLIB = 0,
 | 
			
		||||
    FST_WR_PT_FASTLZ = 1,
 | 
			
		||||
    FST_WR_PT_LZ4 = 2
 | 
			
		||||
enum fstWriterPackType {
 | 
			
		||||
    FST_WR_PT_ZLIB             = 0,
 | 
			
		||||
    FST_WR_PT_FASTLZ           = 1,
 | 
			
		||||
    FST_WR_PT_LZ4              = 2
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum fstFileType
 | 
			
		||||
{
 | 
			
		||||
    FST_FT_MIN = 0,
 | 
			
		||||
enum fstFileType {
 | 
			
		||||
    FST_FT_MIN                 = 0,
 | 
			
		||||
 | 
			
		||||
    FST_FT_VERILOG = 0,
 | 
			
		||||
    FST_FT_VHDL = 1,
 | 
			
		||||
    FST_FT_VERILOG_VHDL = 2,
 | 
			
		||||
    FST_FT_VERILOG             = 0,
 | 
			
		||||
    FST_FT_VHDL                = 1,
 | 
			
		||||
    FST_FT_VERILOG_VHDL        = 2,
 | 
			
		||||
 | 
			
		||||
    FST_FT_MAX = 2
 | 
			
		||||
    FST_FT_MAX                 = 2
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum fstBlockType
 | 
			
		||||
{
 | 
			
		||||
    FST_BL_HDR = 0,
 | 
			
		||||
    FST_BL_VCDATA = 1,
 | 
			
		||||
    FST_BL_BLACKOUT = 2,
 | 
			
		||||
    FST_BL_GEOM = 3,
 | 
			
		||||
    FST_BL_HIER = 4,
 | 
			
		||||
    FST_BL_VCDATA_DYN_ALIAS = 5,
 | 
			
		||||
    FST_BL_HIER_LZ4 = 6,
 | 
			
		||||
    FST_BL_HIER_LZ4DUO = 7,
 | 
			
		||||
    FST_BL_VCDATA_DYN_ALIAS2 = 8,
 | 
			
		||||
enum fstBlockType {
 | 
			
		||||
    FST_BL_HDR                 = 0,
 | 
			
		||||
    FST_BL_VCDATA              = 1,
 | 
			
		||||
    FST_BL_BLACKOUT            = 2,
 | 
			
		||||
    FST_BL_GEOM                = 3,
 | 
			
		||||
    FST_BL_HIER                = 4,
 | 
			
		||||
    FST_BL_VCDATA_DYN_ALIAS    = 5,
 | 
			
		||||
    FST_BL_HIER_LZ4            = 6,
 | 
			
		||||
    FST_BL_HIER_LZ4DUO         = 7,
 | 
			
		||||
    FST_BL_VCDATA_DYN_ALIAS2   = 8,
 | 
			
		||||
 | 
			
		||||
    FST_BL_ZWRAPPER = 254, /* indicates that whole trace is gz wrapped */
 | 
			
		||||
    FST_BL_SKIP = 255      /* used while block is being written */
 | 
			
		||||
    FST_BL_ZWRAPPER            = 254,   /* indicates that whole trace is gz wrapped */
 | 
			
		||||
    FST_BL_SKIP                = 255    /* used while block is being written */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum fstScopeType
 | 
			
		||||
{
 | 
			
		||||
    FST_ST_MIN = 0,
 | 
			
		||||
enum fstScopeType {
 | 
			
		||||
    FST_ST_MIN                 = 0,
 | 
			
		||||
 | 
			
		||||
    FST_ST_VCD_MODULE = 0,
 | 
			
		||||
    FST_ST_VCD_TASK = 1,
 | 
			
		||||
    FST_ST_VCD_FUNCTION = 2,
 | 
			
		||||
    FST_ST_VCD_BEGIN = 3,
 | 
			
		||||
    FST_ST_VCD_FORK = 4,
 | 
			
		||||
    FST_ST_VCD_GENERATE = 5,
 | 
			
		||||
    FST_ST_VCD_STRUCT = 6,
 | 
			
		||||
    FST_ST_VCD_UNION = 7,
 | 
			
		||||
    FST_ST_VCD_CLASS = 8,
 | 
			
		||||
    FST_ST_VCD_INTERFACE = 9,
 | 
			
		||||
    FST_ST_VCD_PACKAGE = 10,
 | 
			
		||||
    FST_ST_VCD_PROGRAM = 11,
 | 
			
		||||
    FST_ST_VCD_MODULE          = 0,
 | 
			
		||||
    FST_ST_VCD_TASK            = 1,
 | 
			
		||||
    FST_ST_VCD_FUNCTION        = 2,
 | 
			
		||||
    FST_ST_VCD_BEGIN           = 3,
 | 
			
		||||
    FST_ST_VCD_FORK            = 4,
 | 
			
		||||
    FST_ST_VCD_GENERATE        = 5,
 | 
			
		||||
    FST_ST_VCD_STRUCT          = 6,
 | 
			
		||||
    FST_ST_VCD_UNION           = 7,
 | 
			
		||||
    FST_ST_VCD_CLASS           = 8,
 | 
			
		||||
    FST_ST_VCD_INTERFACE       = 9,
 | 
			
		||||
    FST_ST_VCD_PACKAGE         = 10,
 | 
			
		||||
    FST_ST_VCD_PROGRAM         = 11,
 | 
			
		||||
 | 
			
		||||
    FST_ST_VHDL_ARCHITECTURE = 12,
 | 
			
		||||
    FST_ST_VHDL_PROCEDURE = 13,
 | 
			
		||||
    FST_ST_VHDL_FUNCTION = 14,
 | 
			
		||||
    FST_ST_VHDL_RECORD = 15,
 | 
			
		||||
    FST_ST_VHDL_PROCESS = 16,
 | 
			
		||||
    FST_ST_VHDL_BLOCK = 17,
 | 
			
		||||
    FST_ST_VHDL_FOR_GENERATE = 18,
 | 
			
		||||
    FST_ST_VHDL_IF_GENERATE = 19,
 | 
			
		||||
    FST_ST_VHDL_GENERATE = 20,
 | 
			
		||||
    FST_ST_VHDL_PACKAGE = 21,
 | 
			
		||||
    FST_ST_VHDL_ARCHITECTURE   = 12,
 | 
			
		||||
    FST_ST_VHDL_PROCEDURE      = 13,
 | 
			
		||||
    FST_ST_VHDL_FUNCTION       = 14,
 | 
			
		||||
    FST_ST_VHDL_RECORD         = 15,
 | 
			
		||||
    FST_ST_VHDL_PROCESS        = 16,
 | 
			
		||||
    FST_ST_VHDL_BLOCK          = 17,
 | 
			
		||||
    FST_ST_VHDL_FOR_GENERATE   = 18,
 | 
			
		||||
    FST_ST_VHDL_IF_GENERATE    = 19,
 | 
			
		||||
    FST_ST_VHDL_GENERATE       = 20,
 | 
			
		||||
    FST_ST_VHDL_PACKAGE        = 21,
 | 
			
		||||
 | 
			
		||||
    FST_ST_MAX = 21,
 | 
			
		||||
    FST_ST_MAX                 = 21,
 | 
			
		||||
 | 
			
		||||
    FST_ST_GEN_ATTRBEGIN = 252,
 | 
			
		||||
    FST_ST_GEN_ATTREND = 253,
 | 
			
		||||
    FST_ST_GEN_ATTRBEGIN       = 252,
 | 
			
		||||
    FST_ST_GEN_ATTREND         = 253,
 | 
			
		||||
 | 
			
		||||
    FST_ST_VCD_SCOPE = 254,
 | 
			
		||||
    FST_ST_VCD_UPSCOPE = 255
 | 
			
		||||
    FST_ST_VCD_SCOPE           = 254,
 | 
			
		||||
    FST_ST_VCD_UPSCOPE         = 255
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum fstVarType
 | 
			
		||||
{
 | 
			
		||||
    FST_VT_MIN = 0, /* start of vartypes */
 | 
			
		||||
enum fstVarType {
 | 
			
		||||
    FST_VT_MIN                 = 0,     /* start of vartypes */
 | 
			
		||||
 | 
			
		||||
    FST_VT_VCD_EVENT = 0,
 | 
			
		||||
    FST_VT_VCD_INTEGER = 1,
 | 
			
		||||
    FST_VT_VCD_PARAMETER = 2,
 | 
			
		||||
    FST_VT_VCD_REAL = 3,
 | 
			
		||||
    FST_VT_VCD_REAL_PARAMETER = 4,
 | 
			
		||||
    FST_VT_VCD_REG = 5,
 | 
			
		||||
    FST_VT_VCD_SUPPLY0 = 6,
 | 
			
		||||
    FST_VT_VCD_SUPPLY1 = 7,
 | 
			
		||||
    FST_VT_VCD_TIME = 8,
 | 
			
		||||
    FST_VT_VCD_TRI = 9,
 | 
			
		||||
    FST_VT_VCD_TRIAND = 10,
 | 
			
		||||
    FST_VT_VCD_TRIOR = 11,
 | 
			
		||||
    FST_VT_VCD_TRIREG = 12,
 | 
			
		||||
    FST_VT_VCD_TRI0 = 13,
 | 
			
		||||
    FST_VT_VCD_TRI1 = 14,
 | 
			
		||||
    FST_VT_VCD_WAND = 15,
 | 
			
		||||
    FST_VT_VCD_WIRE = 16,
 | 
			
		||||
    FST_VT_VCD_WOR = 17,
 | 
			
		||||
    FST_VT_VCD_PORT = 18,
 | 
			
		||||
    FST_VT_VCD_SPARRAY = 19, /* used to define the rownum (index) port for a sparse array */
 | 
			
		||||
    FST_VT_VCD_REALTIME = 20,
 | 
			
		||||
    FST_VT_VCD_EVENT           = 0,
 | 
			
		||||
    FST_VT_VCD_INTEGER         = 1,
 | 
			
		||||
    FST_VT_VCD_PARAMETER       = 2,
 | 
			
		||||
    FST_VT_VCD_REAL            = 3,
 | 
			
		||||
    FST_VT_VCD_REAL_PARAMETER  = 4,
 | 
			
		||||
    FST_VT_VCD_REG             = 5,
 | 
			
		||||
    FST_VT_VCD_SUPPLY0         = 6,
 | 
			
		||||
    FST_VT_VCD_SUPPLY1         = 7,
 | 
			
		||||
    FST_VT_VCD_TIME            = 8,
 | 
			
		||||
    FST_VT_VCD_TRI             = 9,
 | 
			
		||||
    FST_VT_VCD_TRIAND          = 10,
 | 
			
		||||
    FST_VT_VCD_TRIOR           = 11,
 | 
			
		||||
    FST_VT_VCD_TRIREG          = 12,
 | 
			
		||||
    FST_VT_VCD_TRI0            = 13,
 | 
			
		||||
    FST_VT_VCD_TRI1            = 14,
 | 
			
		||||
    FST_VT_VCD_WAND            = 15,
 | 
			
		||||
    FST_VT_VCD_WIRE            = 16,
 | 
			
		||||
    FST_VT_VCD_WOR             = 17,
 | 
			
		||||
    FST_VT_VCD_PORT            = 18,
 | 
			
		||||
    FST_VT_VCD_SPARRAY         = 19,    /* used to define the rownum (index) port for a sparse array */
 | 
			
		||||
    FST_VT_VCD_REALTIME        = 20,
 | 
			
		||||
 | 
			
		||||
    FST_VT_GEN_STRING =
 | 
			
		||||
            21, /* generic string type   (max len is defined dynamically via fstWriterEmitVariableLengthValueChange) */
 | 
			
		||||
    FST_VT_GEN_STRING          = 21,    /* generic string type   (max len is defined dynamically via fstWriterEmitVariableLengthValueChange) */
 | 
			
		||||
 | 
			
		||||
    FST_VT_SV_BIT = 22,
 | 
			
		||||
    FST_VT_SV_LOGIC = 23,
 | 
			
		||||
    FST_VT_SV_INT = 24,      /* declare as size = 32 */
 | 
			
		||||
    FST_VT_SV_SHORTINT = 25, /* declare as size = 16 */
 | 
			
		||||
    FST_VT_SV_LONGINT = 26,  /* declare as size = 64 */
 | 
			
		||||
    FST_VT_SV_BYTE = 27,     /* declare as size = 8  */
 | 
			
		||||
    FST_VT_SV_ENUM = 28,     /* declare as appropriate type range */
 | 
			
		||||
    FST_VT_SV_SHORTREAL =
 | 
			
		||||
            29, /* declare and emit same as FST_VT_VCD_REAL (needs to be emitted as double, not a float) */
 | 
			
		||||
    FST_VT_SV_BIT              = 22,
 | 
			
		||||
    FST_VT_SV_LOGIC            = 23,
 | 
			
		||||
    FST_VT_SV_INT              = 24,    /* declare as size = 32 */
 | 
			
		||||
    FST_VT_SV_SHORTINT         = 25,    /* declare as size = 16 */
 | 
			
		||||
    FST_VT_SV_LONGINT          = 26,    /* declare as size = 64 */
 | 
			
		||||
    FST_VT_SV_BYTE             = 27,    /* declare as size = 8  */
 | 
			
		||||
    FST_VT_SV_ENUM             = 28,    /* declare as appropriate type range */
 | 
			
		||||
    FST_VT_SV_SHORTREAL        = 29,    /* declare and emit same as FST_VT_VCD_REAL (needs to be emitted as double, not a float) */
 | 
			
		||||
 | 
			
		||||
    FST_VT_MAX = 29 /* end of vartypes */
 | 
			
		||||
    FST_VT_MAX                 = 29     /* end of vartypes */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum fstVarDir
 | 
			
		||||
{
 | 
			
		||||
    FST_VD_MIN = 0,
 | 
			
		||||
enum fstVarDir {
 | 
			
		||||
    FST_VD_MIN         = 0,
 | 
			
		||||
 | 
			
		||||
    FST_VD_IMPLICIT = 0,
 | 
			
		||||
    FST_VD_INPUT = 1,
 | 
			
		||||
    FST_VD_OUTPUT = 2,
 | 
			
		||||
    FST_VD_INOUT = 3,
 | 
			
		||||
    FST_VD_BUFFER = 4,
 | 
			
		||||
    FST_VD_LINKAGE = 5,
 | 
			
		||||
    FST_VD_IMPLICIT    = 0,
 | 
			
		||||
    FST_VD_INPUT       = 1,
 | 
			
		||||
    FST_VD_OUTPUT      = 2,
 | 
			
		||||
    FST_VD_INOUT       = 3,
 | 
			
		||||
    FST_VD_BUFFER      = 4,
 | 
			
		||||
    FST_VD_LINKAGE     = 5,
 | 
			
		||||
 | 
			
		||||
    FST_VD_MAX = 5
 | 
			
		||||
    FST_VD_MAX         = 5
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum fstHierType
 | 
			
		||||
{
 | 
			
		||||
    FST_HT_MIN = 0,
 | 
			
		||||
enum fstHierType {
 | 
			
		||||
    FST_HT_MIN         = 0,
 | 
			
		||||
 | 
			
		||||
    FST_HT_SCOPE = 0,
 | 
			
		||||
    FST_HT_UPSCOPE = 1,
 | 
			
		||||
    FST_HT_VAR = 2,
 | 
			
		||||
    FST_HT_ATTRBEGIN = 3,
 | 
			
		||||
    FST_HT_ATTREND = 4,
 | 
			
		||||
    FST_HT_SCOPE       = 0,
 | 
			
		||||
    FST_HT_UPSCOPE     = 1,
 | 
			
		||||
    FST_HT_VAR         = 2,
 | 
			
		||||
    FST_HT_ATTRBEGIN   = 3,
 | 
			
		||||
    FST_HT_ATTREND     = 4,
 | 
			
		||||
 | 
			
		||||
    /* FST_HT_TREEBEGIN and FST_HT_TREEEND are not yet used by FST but are currently used when fstHier bridges other
 | 
			
		||||
       formats */
 | 
			
		||||
    FST_HT_TREEBEGIN = 5,
 | 
			
		||||
    FST_HT_TREEEND = 6,
 | 
			
		||||
    /* FST_HT_TREEBEGIN and FST_HT_TREEEND are not yet used by FST but are currently used when fstHier bridges other formats */
 | 
			
		||||
    FST_HT_TREEBEGIN   = 5,
 | 
			
		||||
    FST_HT_TREEEND     = 6,
 | 
			
		||||
 | 
			
		||||
    FST_HT_MAX = 6
 | 
			
		||||
    FST_HT_MAX         = 6
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum fstAttrType
 | 
			
		||||
{
 | 
			
		||||
    FST_AT_MIN = 0,
 | 
			
		||||
enum fstAttrType {
 | 
			
		||||
    FST_AT_MIN         = 0,
 | 
			
		||||
 | 
			
		||||
    FST_AT_MISC = 0, /* self-contained: does not need matching FST_HT_ATTREND */
 | 
			
		||||
    FST_AT_ARRAY = 1,
 | 
			
		||||
    FST_AT_ENUM = 2,
 | 
			
		||||
    FST_AT_PACK = 3,
 | 
			
		||||
    FST_AT_MISC        = 0,     /* self-contained: does not need matching FST_HT_ATTREND */
 | 
			
		||||
    FST_AT_ARRAY       = 1,
 | 
			
		||||
    FST_AT_ENUM        = 2,
 | 
			
		||||
    FST_AT_PACK        = 3,
 | 
			
		||||
 | 
			
		||||
    FST_AT_MAX = 3
 | 
			
		||||
    FST_AT_MAX         = 3
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum fstMiscType
 | 
			
		||||
{
 | 
			
		||||
    FST_MT_MIN = 0,
 | 
			
		||||
enum fstMiscType {
 | 
			
		||||
    FST_MT_MIN         = 0,
 | 
			
		||||
 | 
			
		||||
    FST_MT_COMMENT = 0,     /* use fstWriterSetComment() to emit */
 | 
			
		||||
    FST_MT_ENVVAR = 1,      /* use fstWriterSetEnvVar() to emit */
 | 
			
		||||
    FST_MT_SUPVAR = 2,      /* use fstWriterCreateVar2() to emit */
 | 
			
		||||
    FST_MT_PATHNAME = 3,    /* reserved for fstWriterSetSourceStem() string -> number management */
 | 
			
		||||
    FST_MT_SOURCESTEM = 4,  /* use fstWriterSetSourceStem() to emit */
 | 
			
		||||
    FST_MT_SOURCEISTEM = 5, /* use fstWriterSetSourceInstantiationStem() to emit */
 | 
			
		||||
    FST_MT_VALUELIST = 6,   /* use fstWriterSetValueList() to emit, followed by fstWriterCreateVar*() */
 | 
			
		||||
    FST_MT_ENUMTABLE = 7,   /* use fstWriterCreateEnumTable() and fstWriterEmitEnumTableRef() to emit */
 | 
			
		||||
    FST_MT_UNKNOWN = 8,
 | 
			
		||||
    FST_MT_COMMENT     = 0,     /* use fstWriterSetComment() to emit */
 | 
			
		||||
    FST_MT_ENVVAR      = 1,     /* use fstWriterSetEnvVar() to emit */
 | 
			
		||||
    FST_MT_SUPVAR      = 2,     /* use fstWriterCreateVar2() to emit */
 | 
			
		||||
    FST_MT_PATHNAME    = 3,     /* reserved for fstWriterSetSourceStem() string -> number management */
 | 
			
		||||
    FST_MT_SOURCESTEM  = 4,     /* use fstWriterSetSourceStem() to emit */
 | 
			
		||||
    FST_MT_SOURCEISTEM = 5,     /* use fstWriterSetSourceInstantiationStem() to emit */
 | 
			
		||||
    FST_MT_VALUELIST   = 6,	/* use fstWriterSetValueList() to emit, followed by fstWriterCreateVar*() */
 | 
			
		||||
    FST_MT_ENUMTABLE   = 7,	/* use fstWriterCreateEnumTable() and fstWriterEmitEnumTableRef() to emit */
 | 
			
		||||
    FST_MT_UNKNOWN     = 8,
 | 
			
		||||
 | 
			
		||||
    FST_MT_MAX = 8
 | 
			
		||||
    FST_MT_MAX         = 8
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum fstArrayType
 | 
			
		||||
{
 | 
			
		||||
    FST_AR_MIN = 0,
 | 
			
		||||
enum fstArrayType {
 | 
			
		||||
    FST_AR_MIN         = 0,
 | 
			
		||||
 | 
			
		||||
    FST_AR_NONE = 0,
 | 
			
		||||
    FST_AR_UNPACKED = 1,
 | 
			
		||||
    FST_AR_PACKED = 2,
 | 
			
		||||
    FST_AR_SPARSE = 3,
 | 
			
		||||
    FST_AR_NONE        = 0,
 | 
			
		||||
    FST_AR_UNPACKED    = 1,
 | 
			
		||||
    FST_AR_PACKED      = 2,
 | 
			
		||||
    FST_AR_SPARSE      = 3,
 | 
			
		||||
 | 
			
		||||
    FST_AR_MAX = 3
 | 
			
		||||
    FST_AR_MAX         = 3
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum fstEnumValueType
 | 
			
		||||
{
 | 
			
		||||
    FST_EV_SV_INTEGER = 0,
 | 
			
		||||
    FST_EV_SV_BIT = 1,
 | 
			
		||||
    FST_EV_SV_LOGIC = 2,
 | 
			
		||||
    FST_EV_SV_INT = 3,
 | 
			
		||||
    FST_EV_SV_SHORTINT = 4,
 | 
			
		||||
    FST_EV_SV_LONGINT = 5,
 | 
			
		||||
    FST_EV_SV_BYTE = 6,
 | 
			
		||||
    FST_EV_SV_UNSIGNED_INTEGER = 7,
 | 
			
		||||
    FST_EV_SV_UNSIGNED_BIT = 8,
 | 
			
		||||
    FST_EV_SV_UNSIGNED_LOGIC = 9,
 | 
			
		||||
    FST_EV_SV_UNSIGNED_INT = 10,
 | 
			
		||||
enum fstEnumValueType {
 | 
			
		||||
    FST_EV_SV_INTEGER           = 0,
 | 
			
		||||
    FST_EV_SV_BIT               = 1,
 | 
			
		||||
    FST_EV_SV_LOGIC             = 2,
 | 
			
		||||
    FST_EV_SV_INT               = 3,
 | 
			
		||||
    FST_EV_SV_SHORTINT          = 4,
 | 
			
		||||
    FST_EV_SV_LONGINT           = 5,
 | 
			
		||||
    FST_EV_SV_BYTE              = 6,
 | 
			
		||||
    FST_EV_SV_UNSIGNED_INTEGER  = 7,
 | 
			
		||||
    FST_EV_SV_UNSIGNED_BIT      = 8,
 | 
			
		||||
    FST_EV_SV_UNSIGNED_LOGIC    = 9,
 | 
			
		||||
    FST_EV_SV_UNSIGNED_INT      = 10,
 | 
			
		||||
    FST_EV_SV_UNSIGNED_SHORTINT = 11,
 | 
			
		||||
    FST_EV_SV_UNSIGNED_LONGINT = 12,
 | 
			
		||||
    FST_EV_SV_UNSIGNED_BYTE = 13,
 | 
			
		||||
    FST_EV_SV_UNSIGNED_LONGINT  = 12,
 | 
			
		||||
    FST_EV_SV_UNSIGNED_BYTE     = 13,
 | 
			
		||||
 | 
			
		||||
    FST_EV_REG = 14,
 | 
			
		||||
    FST_EV_TIME = 15,
 | 
			
		||||
    FST_EV_REG			= 14,
 | 
			
		||||
    FST_EV_TIME			= 15,
 | 
			
		||||
 | 
			
		||||
    FST_EV_MAX = 15
 | 
			
		||||
    FST_EV_MAX                  = 15
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum fstPackType
 | 
			
		||||
{
 | 
			
		||||
    FST_PT_NONE = 0,
 | 
			
		||||
    FST_PT_UNPACKED = 1,
 | 
			
		||||
    FST_PT_PACKED = 2,
 | 
			
		||||
enum fstPackType {
 | 
			
		||||
    FST_PT_NONE          = 0,
 | 
			
		||||
    FST_PT_UNPACKED      = 1,
 | 
			
		||||
    FST_PT_PACKED        = 2,
 | 
			
		||||
    FST_PT_TAGGED_PACKED = 3,
 | 
			
		||||
 | 
			
		||||
    FST_PT_MAX = 3
 | 
			
		||||
    FST_PT_MAX           = 3
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum fstSupplementalVarType
 | 
			
		||||
{
 | 
			
		||||
    FST_SVT_MIN = 0,
 | 
			
		||||
enum fstSupplementalVarType {
 | 
			
		||||
    FST_SVT_MIN                    = 0,
 | 
			
		||||
 | 
			
		||||
    FST_SVT_NONE = 0,
 | 
			
		||||
    FST_SVT_NONE                   = 0,
 | 
			
		||||
 | 
			
		||||
    FST_SVT_VHDL_SIGNAL = 1,
 | 
			
		||||
    FST_SVT_VHDL_VARIABLE = 2,
 | 
			
		||||
    FST_SVT_VHDL_CONSTANT = 3,
 | 
			
		||||
    FST_SVT_VHDL_FILE = 4,
 | 
			
		||||
    FST_SVT_VHDL_MEMORY = 5,
 | 
			
		||||
    FST_SVT_VHDL_SIGNAL            = 1,
 | 
			
		||||
    FST_SVT_VHDL_VARIABLE          = 2,
 | 
			
		||||
    FST_SVT_VHDL_CONSTANT          = 3,
 | 
			
		||||
    FST_SVT_VHDL_FILE              = 4,
 | 
			
		||||
    FST_SVT_VHDL_MEMORY            = 5,
 | 
			
		||||
 | 
			
		||||
    FST_SVT_MAX = 5
 | 
			
		||||
    FST_SVT_MAX                    = 5
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum fstSupplementalDataType
 | 
			
		||||
{
 | 
			
		||||
    FST_SDT_MIN = 0,
 | 
			
		||||
enum fstSupplementalDataType {
 | 
			
		||||
    FST_SDT_MIN                    = 0,
 | 
			
		||||
 | 
			
		||||
    FST_SDT_NONE = 0,
 | 
			
		||||
    FST_SDT_NONE                   = 0,
 | 
			
		||||
 | 
			
		||||
    FST_SDT_VHDL_BOOLEAN = 1,
 | 
			
		||||
    FST_SDT_VHDL_BIT = 2,
 | 
			
		||||
    FST_SDT_VHDL_BIT_VECTOR = 3,
 | 
			
		||||
    FST_SDT_VHDL_STD_ULOGIC = 4,
 | 
			
		||||
    FST_SDT_VHDL_BOOLEAN           = 1,
 | 
			
		||||
    FST_SDT_VHDL_BIT               = 2,
 | 
			
		||||
    FST_SDT_VHDL_BIT_VECTOR        = 3,
 | 
			
		||||
    FST_SDT_VHDL_STD_ULOGIC        = 4,
 | 
			
		||||
    FST_SDT_VHDL_STD_ULOGIC_VECTOR = 5,
 | 
			
		||||
    FST_SDT_VHDL_STD_LOGIC = 6,
 | 
			
		||||
    FST_SDT_VHDL_STD_LOGIC_VECTOR = 7,
 | 
			
		||||
    FST_SDT_VHDL_UNSIGNED = 8,
 | 
			
		||||
    FST_SDT_VHDL_SIGNED = 9,
 | 
			
		||||
    FST_SDT_VHDL_INTEGER = 10,
 | 
			
		||||
    FST_SDT_VHDL_REAL = 11,
 | 
			
		||||
    FST_SDT_VHDL_NATURAL = 12,
 | 
			
		||||
    FST_SDT_VHDL_POSITIVE = 13,
 | 
			
		||||
    FST_SDT_VHDL_TIME = 14,
 | 
			
		||||
    FST_SDT_VHDL_CHARACTER = 15,
 | 
			
		||||
    FST_SDT_VHDL_STRING = 16,
 | 
			
		||||
    FST_SDT_VHDL_STD_LOGIC         = 6,
 | 
			
		||||
    FST_SDT_VHDL_STD_LOGIC_VECTOR  = 7,
 | 
			
		||||
    FST_SDT_VHDL_UNSIGNED          = 8,
 | 
			
		||||
    FST_SDT_VHDL_SIGNED            = 9,
 | 
			
		||||
    FST_SDT_VHDL_INTEGER           = 10,
 | 
			
		||||
    FST_SDT_VHDL_REAL              = 11,
 | 
			
		||||
    FST_SDT_VHDL_NATURAL           = 12,
 | 
			
		||||
    FST_SDT_VHDL_POSITIVE          = 13,
 | 
			
		||||
    FST_SDT_VHDL_TIME              = 14,
 | 
			
		||||
    FST_SDT_VHDL_CHARACTER         = 15,
 | 
			
		||||
    FST_SDT_VHDL_STRING            = 16,
 | 
			
		||||
 | 
			
		||||
    FST_SDT_MAX = 16,
 | 
			
		||||
    FST_SDT_MAX                    = 16,
 | 
			
		||||
 | 
			
		||||
    FST_SDT_SVT_SHIFT_COUNT =
 | 
			
		||||
            10, /* FST_SVT_* is ORed in by fstWriterCreateVar2() to the left after shifting FST_SDT_SVT_SHIFT_COUNT */
 | 
			
		||||
    FST_SDT_ABS_MAX = ((1 << (FST_SDT_SVT_SHIFT_COUNT)) - 1)
 | 
			
		||||
    FST_SDT_SVT_SHIFT_COUNT        = 10, /* FST_SVT_* is ORed in by fstWriterCreateVar2() to the left after shifting FST_SDT_SVT_SHIFT_COUNT */
 | 
			
		||||
    FST_SDT_ABS_MAX                = ((1<<(FST_SDT_SVT_SHIFT_COUNT))-1)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct fstHier
 | 
			
		||||
{
 | 
			
		||||
    unsigned char htyp;
 | 
			
		||||
unsigned char htyp;
 | 
			
		||||
 | 
			
		||||
    union
 | 
			
		||||
    {
 | 
			
		||||
union {
 | 
			
		||||
        /* if htyp == FST_HT_SCOPE */
 | 
			
		||||
        struct fstHierScope
 | 
			
		||||
        {
 | 
			
		||||
            unsigned char typ; /* FST_ST_MIN ... FST_ST_MAX */
 | 
			
		||||
            const char *name;
 | 
			
		||||
            const char *component;
 | 
			
		||||
            uint32_t name_length;      /* strlen(u.scope.name) */
 | 
			
		||||
            uint32_t component_length; /* strlen(u.scope.component) */
 | 
			
		||||
        } scope;
 | 
			
		||||
        struct fstHierScope {
 | 
			
		||||
                unsigned char typ; /* FST_ST_MIN ... FST_ST_MAX */
 | 
			
		||||
                const char *name;
 | 
			
		||||
                const char *component;
 | 
			
		||||
                uint32_t name_length;           /* strlen(u.scope.name) */
 | 
			
		||||
                uint32_t component_length;      /* strlen(u.scope.component) */
 | 
			
		||||
                } scope;
 | 
			
		||||
 | 
			
		||||
        /* if htyp == FST_HT_VAR */
 | 
			
		||||
        struct fstHierVar
 | 
			
		||||
        {
 | 
			
		||||
            unsigned char typ;           /* FST_VT_MIN ... FST_VT_MAX */
 | 
			
		||||
            unsigned char direction;     /* FST_VD_MIN ... FST_VD_MAX */
 | 
			
		||||
            unsigned char svt_workspace; /* zeroed out by FST reader, for client code use */
 | 
			
		||||
            unsigned char sdt_workspace; /* zeroed out by FST reader, for client code use */
 | 
			
		||||
            unsigned int sxt_workspace;  /* zeroed out by FST reader, for client code use */
 | 
			
		||||
            const char *name;
 | 
			
		||||
            uint32_t length;
 | 
			
		||||
            fstHandle handle;
 | 
			
		||||
            uint32_t name_length; /* strlen(u.var.name) */
 | 
			
		||||
            unsigned is_alias : 1;
 | 
			
		||||
        } var;
 | 
			
		||||
        struct fstHierVar {
 | 
			
		||||
                unsigned char typ; /* FST_VT_MIN ... FST_VT_MAX */
 | 
			
		||||
                unsigned char direction; /* FST_VD_MIN ... FST_VD_MAX */
 | 
			
		||||
                unsigned char svt_workspace; /* zeroed out by FST reader, for client code use */
 | 
			
		||||
                unsigned char sdt_workspace; /* zeroed out by FST reader, for client code use */
 | 
			
		||||
                unsigned int  sxt_workspace; /* zeroed out by FST reader, for client code use */
 | 
			
		||||
                const char *name;
 | 
			
		||||
                uint32_t length;
 | 
			
		||||
                fstHandle handle;
 | 
			
		||||
                uint32_t name_length; /* strlen(u.var.name) */
 | 
			
		||||
                unsigned is_alias : 1;
 | 
			
		||||
                } var;
 | 
			
		||||
 | 
			
		||||
        /* if htyp == FST_HT_ATTRBEGIN */
 | 
			
		||||
        struct fstHierAttr
 | 
			
		||||
        {
 | 
			
		||||
            unsigned char typ;     /* FST_AT_MIN ... FST_AT_MAX */
 | 
			
		||||
            unsigned char subtype; /* from fstMiscType, fstArrayType, fstEnumValueType, fstPackType */
 | 
			
		||||
            const char *name;
 | 
			
		||||
            uint64_t arg; /* number of array elements, struct members, or some other payload (possibly ignored) */
 | 
			
		||||
            uint64_t arg_from_name; /* for when name is overloaded as a variable-length integer (FST_AT_MISC +
 | 
			
		||||
                                       FST_MT_SOURCESTEM) */
 | 
			
		||||
            uint32_t name_length;   /* strlen(u.attr.name) */
 | 
			
		||||
        } attr;
 | 
			
		||||
    } u;
 | 
			
		||||
        struct fstHierAttr {
 | 
			
		||||
                unsigned char typ; /* FST_AT_MIN ... FST_AT_MAX */
 | 
			
		||||
                unsigned char subtype; /* from fstMiscType, fstArrayType, fstEnumValueType, fstPackType */
 | 
			
		||||
                const char *name;
 | 
			
		||||
                uint64_t arg; /* number of array elements, struct members, or some other payload (possibly ignored) */
 | 
			
		||||
                uint64_t arg_from_name; /* for when name is overloaded as a variable-length integer (FST_AT_MISC + FST_MT_SOURCESTEM) */
 | 
			
		||||
                uint32_t name_length; /* strlen(u.attr.name) */
 | 
			
		||||
                } attr;
 | 
			
		||||
        } u;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct fstETab
 | 
			
		||||
{
 | 
			
		||||
    char *name;
 | 
			
		||||
    uint32_t elem_count;
 | 
			
		||||
    char **literal_arr;
 | 
			
		||||
    char **val_arr;
 | 
			
		||||
char *name;
 | 
			
		||||
uint32_t elem_count;
 | 
			
		||||
char **literal_arr;
 | 
			
		||||
char **val_arr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * writer functions
 | 
			
		||||
 */
 | 
			
		||||
void fstWriterClose(void *ctx);
 | 
			
		||||
void *fstWriterCreate(const char *nam, int use_compressed_hier);
 | 
			
		||||
fstEnumHandle fstWriterCreateEnumTable(void *ctx, const char *name, uint32_t elem_count, unsigned int min_valbits,
 | 
			
		||||
                                       const char **literal_arr, const char **val_arr);
 | 
			
		||||
/* used for Verilog/SV */
 | 
			
		||||
fstHandle fstWriterCreateVar(void *ctx, enum fstVarType vt, enum fstVarDir vd, uint32_t len, const char *nam,
 | 
			
		||||
                             fstHandle aliasHandle);
 | 
			
		||||
/* future expansion for VHDL and other languages.  The variable type, data type, etc map onto
 | 
			
		||||
   the current Verilog/SV one.  The "type" string is optional for a more verbose or custom description */
 | 
			
		||||
fstHandle fstWriterCreateVar2(void *ctx, enum fstVarType vt, enum fstVarDir vd, uint32_t len, const char *nam,
 | 
			
		||||
                              fstHandle aliasHandle, const char *type, enum fstSupplementalVarType svt,
 | 
			
		||||
                              enum fstSupplementalDataType sdt);
 | 
			
		||||
void fstWriterEmitDumpActive(void *ctx, int enable);
 | 
			
		||||
void fstWriterEmitEnumTableRef(void *ctx, fstEnumHandle handle);
 | 
			
		||||
void fstWriterEmitValueChange(void *ctx, fstHandle handle, const void *val);
 | 
			
		||||
void fstWriterEmitValueChange32(void *ctx, fstHandle handle, uint32_t bits, uint32_t val);
 | 
			
		||||
void fstWriterEmitValueChange64(void *ctx, fstHandle handle, uint32_t bits, uint64_t val);
 | 
			
		||||
void fstWriterEmitValueChangeVec32(void *ctx, fstHandle handle, uint32_t bits, const uint32_t *val);
 | 
			
		||||
void fstWriterEmitValueChangeVec64(void *ctx, fstHandle handle, uint32_t bits, const uint64_t *val);
 | 
			
		||||
void fstWriterEmitVariableLengthValueChange(void *ctx, fstHandle handle, const void *val, uint32_t len);
 | 
			
		||||
void fstWriterEmitTimeChange(void *ctx, uint64_t tim);
 | 
			
		||||
void fstWriterFlushContext(void *ctx);
 | 
			
		||||
int fstWriterGetDumpSizeLimitReached(void *ctx);
 | 
			
		||||
int fstWriterGetFseekFailed(void *ctx);
 | 
			
		||||
void fstWriterSetAttrBegin(void *ctx, enum fstAttrType attrtype, int subtype, const char *attrname, uint64_t arg);
 | 
			
		||||
void fstWriterSetAttrEnd(void *ctx);
 | 
			
		||||
void fstWriterSetComment(void *ctx, const char *comm);
 | 
			
		||||
void fstWriterSetDate(void *ctx, const char *dat);
 | 
			
		||||
void fstWriterSetDumpSizeLimit(void *ctx, uint64_t numbytes);
 | 
			
		||||
void fstWriterSetEnvVar(void *ctx, const char *envvar);
 | 
			
		||||
void fstWriterSetFileType(void *ctx, enum fstFileType filetype);
 | 
			
		||||
void fstWriterSetPackType(void *ctx, enum fstWriterPackType typ);
 | 
			
		||||
void fstWriterSetParallelMode(void *ctx, int enable);
 | 
			
		||||
void fstWriterSetRepackOnClose(void *ctx, int enable); /* type = 0 (none), 1 (libz) */
 | 
			
		||||
void fstWriterSetScope(void *ctx, enum fstScopeType scopetype, const char *scopename, const char *scopecomp);
 | 
			
		||||
void fstWriterSetSourceInstantiationStem(void *ctx, const char *path, unsigned int line, unsigned int use_realpath);
 | 
			
		||||
void fstWriterSetSourceStem(void *ctx, const char *path, unsigned int line, unsigned int use_realpath);
 | 
			
		||||
void fstWriterSetTimescale(void *ctx, int ts);
 | 
			
		||||
void fstWriterSetTimescaleFromString(void *ctx, const char *s);
 | 
			
		||||
void fstWriterSetTimezero(void *ctx, int64_t tim);
 | 
			
		||||
void fstWriterSetUpscope(void *ctx);
 | 
			
		||||
void fstWriterSetValueList(void *ctx, const char *vl);
 | 
			
		||||
void fstWriterSetVersion(void *ctx, const char *vers);
 | 
			
		||||
void            fstWriterClose(void *ctx);
 | 
			
		||||
void *          fstWriterCreate(const char *nam, int use_compressed_hier);
 | 
			
		||||
fstEnumHandle   fstWriterCreateEnumTable(void *ctx, const char *name, uint32_t elem_count, unsigned int min_valbits, const char **literal_arr, const char **val_arr);
 | 
			
		||||
                /* used for Verilog/SV */
 | 
			
		||||
fstHandle       fstWriterCreateVar(void *ctx, enum fstVarType vt, enum fstVarDir vd,
 | 
			
		||||
                        uint32_t len, const char *nam, fstHandle aliasHandle);
 | 
			
		||||
                /* future expansion for VHDL and other languages.  The variable type, data type, etc map onto
 | 
			
		||||
                   the current Verilog/SV one.  The "type" string is optional for a more verbose or custom description */
 | 
			
		||||
fstHandle       fstWriterCreateVar2(void *ctx, enum fstVarType vt, enum fstVarDir vd,
 | 
			
		||||
                        uint32_t len, const char *nam, fstHandle aliasHandle,
 | 
			
		||||
                        const char *type, enum fstSupplementalVarType svt, enum fstSupplementalDataType sdt);
 | 
			
		||||
void            fstWriterEmitDumpActive(void *ctx, int enable);
 | 
			
		||||
void 		fstWriterEmitEnumTableRef(void *ctx, fstEnumHandle handle);
 | 
			
		||||
void            fstWriterEmitValueChange(void *ctx, fstHandle handle, const void *val);
 | 
			
		||||
void            fstWriterEmitValueChange32(void *ctx, fstHandle handle,
 | 
			
		||||
                        uint32_t bits, uint32_t val);
 | 
			
		||||
void            fstWriterEmitValueChange64(void *ctx, fstHandle handle,
 | 
			
		||||
                        uint32_t bits, uint64_t val);
 | 
			
		||||
void            fstWriterEmitValueChangeVec32(void *ctx, fstHandle handle,
 | 
			
		||||
                        uint32_t bits, const uint32_t *val);
 | 
			
		||||
void            fstWriterEmitValueChangeVec64(void *ctx, fstHandle handle,
 | 
			
		||||
                        uint32_t bits, const uint64_t *val);
 | 
			
		||||
void            fstWriterEmitVariableLengthValueChange(void *ctx, fstHandle handle, const void *val, uint32_t len);
 | 
			
		||||
void            fstWriterEmitTimeChange(void *ctx, uint64_t tim);
 | 
			
		||||
void            fstWriterFlushContext(void *ctx);
 | 
			
		||||
int             fstWriterGetDumpSizeLimitReached(void *ctx);
 | 
			
		||||
int             fstWriterGetFseekFailed(void *ctx);
 | 
			
		||||
void            fstWriterSetAttrBegin(void *ctx, enum fstAttrType attrtype, int subtype,
 | 
			
		||||
                        const char *attrname, uint64_t arg);
 | 
			
		||||
void            fstWriterSetAttrEnd(void *ctx);
 | 
			
		||||
void            fstWriterSetComment(void *ctx, const char *comm);
 | 
			
		||||
void            fstWriterSetDate(void *ctx, const char *dat);
 | 
			
		||||
void            fstWriterSetDumpSizeLimit(void *ctx, uint64_t numbytes);
 | 
			
		||||
void            fstWriterSetEnvVar(void *ctx, const char *envvar);
 | 
			
		||||
void            fstWriterSetFileType(void *ctx, enum fstFileType filetype);
 | 
			
		||||
void            fstWriterSetPackType(void *ctx, enum fstWriterPackType typ);
 | 
			
		||||
void            fstWriterSetParallelMode(void *ctx, int enable);
 | 
			
		||||
void            fstWriterSetRepackOnClose(void *ctx, int enable);       /* type = 0 (none), 1 (libz) */
 | 
			
		||||
void            fstWriterSetScope(void *ctx, enum fstScopeType scopetype,
 | 
			
		||||
                        const char *scopename, const char *scopecomp);
 | 
			
		||||
void            fstWriterSetSourceInstantiationStem(void *ctx, const char *path, unsigned int line, unsigned int use_realpath);
 | 
			
		||||
void            fstWriterSetSourceStem(void *ctx, const char *path, unsigned int line, unsigned int use_realpath);
 | 
			
		||||
void            fstWriterSetTimescale(void *ctx, int ts);
 | 
			
		||||
void            fstWriterSetTimescaleFromString(void *ctx, const char *s);
 | 
			
		||||
void            fstWriterSetTimezero(void *ctx, int64_t tim);
 | 
			
		||||
void            fstWriterSetUpscope(void *ctx);
 | 
			
		||||
void		fstWriterSetValueList(void *ctx, const char *vl);
 | 
			
		||||
void            fstWriterSetVersion(void *ctx, const char *vers);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * reader functions
 | 
			
		||||
 */
 | 
			
		||||
void fstReaderClose(void *ctx);
 | 
			
		||||
void fstReaderClrFacProcessMask(void *ctx, fstHandle facidx);
 | 
			
		||||
void fstReaderClrFacProcessMaskAll(void *ctx);
 | 
			
		||||
uint64_t fstReaderGetAliasCount(void *ctx);
 | 
			
		||||
const char *fstReaderGetCurrentFlatScope(void *ctx);
 | 
			
		||||
void *fstReaderGetCurrentScopeUserInfo(void *ctx);
 | 
			
		||||
int fstReaderGetCurrentScopeLen(void *ctx);
 | 
			
		||||
const char *fstReaderGetDateString(void *ctx);
 | 
			
		||||
int fstReaderGetDoubleEndianMatchState(void *ctx);
 | 
			
		||||
uint64_t fstReaderGetDumpActivityChangeTime(void *ctx, uint32_t idx);
 | 
			
		||||
unsigned char fstReaderGetDumpActivityChangeValue(void *ctx, uint32_t idx);
 | 
			
		||||
uint64_t fstReaderGetEndTime(void *ctx);
 | 
			
		||||
int fstReaderGetFacProcessMask(void *ctx, fstHandle facidx);
 | 
			
		||||
int fstReaderGetFileType(void *ctx);
 | 
			
		||||
int fstReaderGetFseekFailed(void *ctx);
 | 
			
		||||
fstHandle fstReaderGetMaxHandle(void *ctx);
 | 
			
		||||
uint64_t fstReaderGetMemoryUsedByWriter(void *ctx);
 | 
			
		||||
uint32_t fstReaderGetNumberDumpActivityChanges(void *ctx);
 | 
			
		||||
uint64_t fstReaderGetScopeCount(void *ctx);
 | 
			
		||||
uint64_t fstReaderGetStartTime(void *ctx);
 | 
			
		||||
signed char fstReaderGetTimescale(void *ctx);
 | 
			
		||||
int64_t fstReaderGetTimezero(void *ctx);
 | 
			
		||||
uint64_t fstReaderGetValueChangeSectionCount(void *ctx);
 | 
			
		||||
char *fstReaderGetValueFromHandleAtTime(void *ctx, uint64_t tim, fstHandle facidx, char *buf);
 | 
			
		||||
uint64_t fstReaderGetVarCount(void *ctx);
 | 
			
		||||
const char *fstReaderGetVersionString(void *ctx);
 | 
			
		||||
void            fstReaderClose(void *ctx);
 | 
			
		||||
void            fstReaderClrFacProcessMask(void *ctx, fstHandle facidx);
 | 
			
		||||
void            fstReaderClrFacProcessMaskAll(void *ctx);
 | 
			
		||||
uint64_t        fstReaderGetAliasCount(void *ctx);
 | 
			
		||||
const char *    fstReaderGetCurrentFlatScope(void *ctx);
 | 
			
		||||
void *          fstReaderGetCurrentScopeUserInfo(void *ctx);
 | 
			
		||||
int             fstReaderGetCurrentScopeLen(void *ctx);
 | 
			
		||||
const char *    fstReaderGetDateString(void *ctx);
 | 
			
		||||
int             fstReaderGetDoubleEndianMatchState(void *ctx);
 | 
			
		||||
uint64_t        fstReaderGetDumpActivityChangeTime(void *ctx, uint32_t idx);
 | 
			
		||||
unsigned char   fstReaderGetDumpActivityChangeValue(void *ctx, uint32_t idx);
 | 
			
		||||
uint64_t        fstReaderGetEndTime(void *ctx);
 | 
			
		||||
int             fstReaderGetFacProcessMask(void *ctx, fstHandle facidx);
 | 
			
		||||
int             fstReaderGetFileType(void *ctx);
 | 
			
		||||
int             fstReaderGetFseekFailed(void *ctx);
 | 
			
		||||
fstHandle       fstReaderGetMaxHandle(void *ctx);
 | 
			
		||||
uint64_t        fstReaderGetMemoryUsedByWriter(void *ctx);
 | 
			
		||||
uint32_t        fstReaderGetNumberDumpActivityChanges(void *ctx);
 | 
			
		||||
uint64_t        fstReaderGetScopeCount(void *ctx);
 | 
			
		||||
uint64_t        fstReaderGetStartTime(void *ctx);
 | 
			
		||||
signed char     fstReaderGetTimescale(void *ctx);
 | 
			
		||||
int64_t         fstReaderGetTimezero(void *ctx);
 | 
			
		||||
uint64_t        fstReaderGetValueChangeSectionCount(void *ctx);
 | 
			
		||||
char *          fstReaderGetValueFromHandleAtTime(void *ctx, uint64_t tim, fstHandle facidx, char *buf);
 | 
			
		||||
uint64_t        fstReaderGetVarCount(void *ctx);
 | 
			
		||||
const char *    fstReaderGetVersionString(void *ctx);
 | 
			
		||||
struct fstHier *fstReaderIterateHier(void *ctx);
 | 
			
		||||
int fstReaderIterateHierRewind(void *ctx);
 | 
			
		||||
int fstReaderIterBlocks(void *ctx,
 | 
			
		||||
                        void (*value_change_callback)(void *user_callback_data_pointer, uint64_t time, fstHandle facidx,
 | 
			
		||||
                                                      const unsigned char *value),
 | 
			
		||||
int             fstReaderIterateHierRewind(void *ctx);
 | 
			
		||||
int             fstReaderIterBlocks(void *ctx,
 | 
			
		||||
                        void (*value_change_callback)(void *user_callback_data_pointer, uint64_t time, fstHandle facidx, const unsigned char *value),
 | 
			
		||||
                        void *user_callback_data_pointer, FILE *vcdhandle);
 | 
			
		||||
int fstReaderIterBlocks2(void *ctx,
 | 
			
		||||
                         void (*value_change_callback)(void *user_callback_data_pointer, uint64_t time,
 | 
			
		||||
                                                       fstHandle facidx, const unsigned char *value),
 | 
			
		||||
                         void (*value_change_callback_varlen)(void *user_callback_data_pointer, uint64_t time,
 | 
			
		||||
                                                              fstHandle facidx, const unsigned char *value,
 | 
			
		||||
                                                              uint32_t len),
 | 
			
		||||
                         void *user_callback_data_pointer, FILE *vcdhandle);
 | 
			
		||||
void fstReaderIterBlocksSetNativeDoublesOnCallback(void *ctx, int enable);
 | 
			
		||||
void *fstReaderOpen(const char *nam);
 | 
			
		||||
void *fstReaderOpenForUtilitiesOnly(void);
 | 
			
		||||
const char *fstReaderPopScope(void *ctx);
 | 
			
		||||
int fstReaderProcessHier(void *ctx, FILE *vcdhandle);
 | 
			
		||||
const char *fstReaderPushScope(void *ctx, const char *nam, void *user_info);
 | 
			
		||||
void fstReaderResetScope(void *ctx);
 | 
			
		||||
void fstReaderSetFacProcessMask(void *ctx, fstHandle facidx);
 | 
			
		||||
void fstReaderSetFacProcessMaskAll(void *ctx);
 | 
			
		||||
void fstReaderSetLimitTimeRange(void *ctx, uint64_t start_time, uint64_t end_time);
 | 
			
		||||
void fstReaderSetUnlimitedTimeRange(void *ctx);
 | 
			
		||||
void fstReaderSetVcdExtensions(void *ctx, int enable);
 | 
			
		||||
int             fstReaderIterBlocks2(void *ctx,
 | 
			
		||||
                        void (*value_change_callback)(void *user_callback_data_pointer, uint64_t time, fstHandle facidx, const unsigned char *value),
 | 
			
		||||
                        void (*value_change_callback_varlen)(void *user_callback_data_pointer, uint64_t time, fstHandle facidx, const unsigned char *value, uint32_t len),
 | 
			
		||||
                        void *user_callback_data_pointer, FILE *vcdhandle);
 | 
			
		||||
void            fstReaderIterBlocksSetNativeDoublesOnCallback(void *ctx, int enable);
 | 
			
		||||
void *          fstReaderOpen(const char *nam);
 | 
			
		||||
void *          fstReaderOpenForUtilitiesOnly(void);
 | 
			
		||||
const char *    fstReaderPopScope(void *ctx);
 | 
			
		||||
int             fstReaderProcessHier(void *ctx, FILE *vcdhandle);
 | 
			
		||||
const char *    fstReaderPushScope(void *ctx, const char *nam, void *user_info);
 | 
			
		||||
void            fstReaderResetScope(void *ctx);
 | 
			
		||||
void            fstReaderSetFacProcessMask(void *ctx, fstHandle facidx);
 | 
			
		||||
void            fstReaderSetFacProcessMaskAll(void *ctx);
 | 
			
		||||
void            fstReaderSetLimitTimeRange(void *ctx, uint64_t start_time, uint64_t end_time);
 | 
			
		||||
void            fstReaderSetUnlimitedTimeRange(void *ctx);
 | 
			
		||||
void            fstReaderSetVcdExtensions(void *ctx, int enable);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * utility functions
 | 
			
		||||
 */
 | 
			
		||||
int fstUtilityBinToEscConvertedLen(const unsigned char *s, int len); /* used for mallocs for fstUtilityBinToEsc() */
 | 
			
		||||
int fstUtilityBinToEsc(unsigned char *d, const unsigned char *s, int len);
 | 
			
		||||
int fstUtilityEscToBin(unsigned char *d, unsigned char *s, int len);
 | 
			
		||||
int             fstUtilityBinToEscConvertedLen(const unsigned char *s, int len); /* used for mallocs for fstUtilityBinToEsc() */
 | 
			
		||||
int             fstUtilityBinToEsc(unsigned char *d, const unsigned char *s, int len);
 | 
			
		||||
int             fstUtilityEscToBin(unsigned char *d, unsigned char *s, int len);
 | 
			
		||||
struct fstETab *fstUtilityExtractEnumTableFromString(const char *s);
 | 
			
		||||
void fstUtilityFreeEnumTable(struct fstETab *etab); /* must use to free fstETab properly */
 | 
			
		||||
void 		fstUtilityFreeEnumTable(struct fstETab *etab); /* must use to free fstETab properly */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										3488
									
								
								libs/fst/lz4.cc
									
										
									
									
									
								
							
							
						
						
									
										3488
									
								
								libs/fst/lz4.cc
									
										
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										1095
									
								
								libs/fst/lz4.h
									
										
									
									
									
								
							
							
						
						
									
										1095
									
								
								libs/fst/lz4.h
									
										
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -438,8 +438,13 @@ struct BufnormPass : public Pass {
 | 
			
		|||
				bool chain_this_wire = chain_this_wire_f(wire);
 | 
			
		||||
 | 
			
		||||
				SigSpec keysig = sigmap(wire), insig = wire, outsig = wire;
 | 
			
		||||
				for (int i = 0; i < GetSize(insig); i++)
 | 
			
		||||
					insig[i] = mapped_bits.at(keysig[i], State::Sx);
 | 
			
		||||
				for (int i = 0; i < GetSize(insig); i++) {
 | 
			
		||||
					if (keysig[i].is_wire())
 | 
			
		||||
						insig[i] = mapped_bits.at(keysig[i], State::Sx);
 | 
			
		||||
					else
 | 
			
		||||
						insig[i] = keysig[i];
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if (chain_this_wire) {
 | 
			
		||||
					for (int i = 0; i < GetSize(outsig); i++)
 | 
			
		||||
						mapped_bits[keysig[i]] = outsig[i];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										11
									
								
								tests/techmap/bufnorm.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								tests/techmap/bufnorm.ys
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
# Check wires driven by constants are kept
 | 
			
		||||
read_verilog <<EOT
 | 
			
		||||
module top(output wire [7:0] y);
 | 
			
		||||
assign y = 27;
 | 
			
		||||
endmodule
 | 
			
		||||
EOT
 | 
			
		||||
 | 
			
		||||
equiv_opt -assert bufnorm
 | 
			
		||||
design -load postopt
 | 
			
		||||
select -assert-count 1 t:$buf
 | 
			
		||||
select -assert-count 1 w:y %ci t:$buf %i
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue