250 lines
5.5 KiB
C++
250 lines
5.5 KiB
C++
// SPDX-FileCopyrightText: 2025-2026 Yu-Sheng Lin <johnjohnlys@gmail.com>
|
|
// SPDX-FileCopyrightText: 2025-2026 Yoda Lee <lc85301@gmail.com>
|
|
// SPDX-License-Identifier: MIT
|
|
// Project: libfstwriter
|
|
// Website: https://github.com/gtkwave/libfstwriter
|
|
#pragma once
|
|
// direct include
|
|
// C system headers
|
|
// C++ standard library headers
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
#include <string>
|
|
// Other libraries' .h files.
|
|
// Your project's .h files.
|
|
|
|
// Remove these when we upgrade to C++20
|
|
#pragma GCC diagnostic ignored "-Wpragmas"
|
|
#pragma GCC diagnostic ignored "-Wc++17-attribute-extensions"
|
|
#pragma GCC diagnostic ignored "-Wc++20-attribute-extensions"
|
|
|
|
namespace fst {
|
|
|
|
typedef uint32_t Handle;
|
|
typedef uint32_t EnumHandle;
|
|
struct string_view_pair {
|
|
const char *m_data = nullptr;
|
|
size_t m_size = 0;
|
|
|
|
// implicit conversion from const char*, std::string, std::string_view
|
|
string_view_pair(const char *data)
|
|
: m_data{data}, m_size{data == nullptr ? 0 : std::strlen(data)} {}
|
|
string_view_pair(const char *data, size_t size) : m_data{data}, m_size{size} {}
|
|
string_view_pair(const std::string &s) : m_data{s.c_str()}, m_size{s.size()} {}
|
|
#if __cplusplus >= 201703L
|
|
string_view_pair(std::string_view s) : m_data{s.data()}, m_size{s.size()} {}
|
|
#endif
|
|
};
|
|
|
|
[[maybe_unused]]
|
|
static inline string_view_pair make_string_view_pair(const char *data) {
|
|
if (!data) {
|
|
return {nullptr, 0};
|
|
}
|
|
return {data, std::strlen(data)};
|
|
}
|
|
|
|
[[maybe_unused]]
|
|
static inline string_view_pair make_string_view_pair(const char *data, std::size_t size) {
|
|
return {data, size};
|
|
}
|
|
|
|
enum class WriterPackType : uint8_t {
|
|
ZLIB = 0, // not supported
|
|
FASTLZ = 1, // not supported
|
|
LZ4 = 2,
|
|
// usually for testing, you should use eLz4
|
|
// This will turn off compression for geometry/hierarchy/wave data
|
|
NO_COMPRESSION = 3,
|
|
};
|
|
|
|
enum class FileType : uint8_t {
|
|
VERILOG = 0,
|
|
VHDL,
|
|
VERILOG_VHDL,
|
|
};
|
|
|
|
enum class EncodingType : uint8_t {
|
|
BINARY = 0, // 1 bit per bit to represent 0,1
|
|
VERILOG = 1, // 2 bits per bit to represent X,Z
|
|
VHDL = 2, // 4 bits per bit to represent H,U,W,L,-,?
|
|
};
|
|
|
|
[[maybe_unused]]
|
|
static inline constexpr unsigned bitPerEncodedBit(EncodingType type) {
|
|
return 1 << static_cast<uint8_t>(type);
|
|
}
|
|
|
|
[[maybe_unused]]
|
|
static const char* kEncodedBitToCharTable = (
|
|
"01" // Binary
|
|
"xzhu" // Verilog
|
|
"wl-? " // Vhdl (padded with ' ')
|
|
);
|
|
|
|
struct Hierarchy {
|
|
enum class ScopeType : uint8_t {
|
|
VCD_MODULE = 0,
|
|
VCD_TASK = 1,
|
|
VCD_FUNCTION = 2,
|
|
VCD_BEGIN = 3,
|
|
VCD_FORK = 4,
|
|
VCD_GENERATE = 5,
|
|
VCD_STRUCT = 6,
|
|
VCD_UNION = 7,
|
|
VCD_CLASS = 8,
|
|
VCD_INTERFACE = 9,
|
|
VCD_PACKAGE = 10,
|
|
VCD_PROGRAM = 11,
|
|
VHDL_ARCHITECTURE = 12,
|
|
VHDL_PROCEDURE = 13,
|
|
VHDL_FUNCTION = 14,
|
|
VHDL_RECORD = 15,
|
|
VHDL_PROCESS = 16,
|
|
VHDL_BLOCK = 17,
|
|
VHDL_FORGENERATE = 18,
|
|
VHDL_IFGENERATE = 19,
|
|
VHDL_GENERATE = 20,
|
|
VHDL_PACKAGE = 21,
|
|
SV_ARRAY = 22,
|
|
};
|
|
|
|
enum class ScopeControlType : uint8_t {
|
|
GEN_ATTR_BEGIN = 252,
|
|
GEN_ATTR_END = 253,
|
|
VCD_SCOPE = 254,
|
|
VCD_UPSCOPE = 255,
|
|
};
|
|
|
|
enum class VarType : uint8_t {
|
|
VCD_EVENT = 0,
|
|
VCD_INTEGER = 1,
|
|
VCD_PARAMETER = 2,
|
|
VCD_REAL = 3,
|
|
VCD_REAL_PARAMETER = 4,
|
|
VCD_REG = 5,
|
|
VCD_SUPPLY0 = 6,
|
|
VCD_SUPPLY1 = 7,
|
|
VCD_TIME = 8,
|
|
VCD_TRI = 9,
|
|
VCD_TRIAND = 10,
|
|
VCD_TRIOR = 11,
|
|
VCD_TRIREG = 12,
|
|
VCD_TRI0 = 13,
|
|
VCD_TRI1 = 14,
|
|
VCD_WAND = 15,
|
|
VCD_WIRE = 16,
|
|
VCD_WOR = 17,
|
|
VCD_PORT = 18,
|
|
VCD_SPARRAY = 19,
|
|
VCD_REALTIME = 20,
|
|
GEN_STRING = 21,
|
|
SV_BIT = 22,
|
|
SV_LOGIC = 23,
|
|
SV_INT = 24,
|
|
SV_SHORTINT = 25,
|
|
SV_LONGINT = 26,
|
|
SV_BYTE = 27,
|
|
SV_ENUM = 28,
|
|
SV_SHORTREAL = 29,
|
|
};
|
|
|
|
enum class VarDirection : uint8_t {
|
|
MIN = 0,
|
|
|
|
IMPLICIT = 0,
|
|
INPUT = 1,
|
|
OUTPUT = 2,
|
|
INOUT = 3,
|
|
BUFFER = 4,
|
|
LINKAGE = 5,
|
|
|
|
MAX = 5,
|
|
};
|
|
|
|
enum class AttrType : uint8_t {
|
|
MIN = 0,
|
|
MISC = 0,
|
|
ARRAY = 1,
|
|
ENUM = 2,
|
|
PACK = 3,
|
|
MAX = 3,
|
|
};
|
|
|
|
enum class AttrSubType : uint8_t {
|
|
// For AttrType::eMisc
|
|
MISC_MIN = 0,
|
|
MISC_COMMENT = 0,
|
|
MISC_ENVVAR = 1,
|
|
MISC_SUPVAR = 2,
|
|
MISC_PATHNAME = 3,
|
|
MISC_SOURCESTEM = 4,
|
|
MISC_SOURCEISTEM = 5,
|
|
MISC_VALUELIST = 6,
|
|
MISC_ENUMTABLE = 7,
|
|
MISC_UNKNOWN = 8,
|
|
MISC_MAX = 8,
|
|
|
|
// For AttrType::eArray
|
|
ARRAY_MIN = 0,
|
|
ARRAY_NONE = 0,
|
|
ARRAY_UNPACKED = 1,
|
|
ARRAY_PACKED = 2,
|
|
ARRAY_SPARSE = 3,
|
|
ARRAY_MAX = 3,
|
|
|
|
// For AttrType::eEnum
|
|
ENUM_MIN = 0,
|
|
ENUM_SV_INTEGER = 0,
|
|
ENUM_SV_BIT = 1,
|
|
ENUM_SV_LOGIC = 2,
|
|
ENUM_SV_INT = 3,
|
|
ENUM_SV_SHORTINT = 4,
|
|
ENUM_SV_LONGINT = 5,
|
|
ENUM_SV_BYTE = 6,
|
|
ENUM_SV_UNSIGNED_INTEGER = 7,
|
|
ENUM_SV_UNSIGNED_BIT = 8,
|
|
ENUM_SV_UNSIGNED_LOGIC = 9,
|
|
ENUM_SV_UNSIGNED_INT = 10,
|
|
ENUM_SV_UNSIGNED_SHORTINT = 11,
|
|
ENUM_SV_UNSIGNED_LONGINT = 12,
|
|
ENUM_SV_UNSIGNED_BYTE = 13,
|
|
ENUM_REG = 14,
|
|
ENUM_TIME = 15,
|
|
ENUM_MAX = 15,
|
|
|
|
// For AttrType::ePack
|
|
PACK_MIN = 0,
|
|
PACK_NONE = 0,
|
|
PACK_UNPACKED = 1,
|
|
PACK_PACKED = 2,
|
|
PACK_SPARSE = 3,
|
|
PACK_MAX = 3,
|
|
};
|
|
|
|
enum class SupplementalVarType : uint8_t {};
|
|
|
|
enum class SupplementalDataType : uint8_t {};
|
|
};
|
|
|
|
struct Header {
|
|
uint64_t m_start_time{uint64_t(-1)};
|
|
uint64_t m_end_time{0};
|
|
int64_t m_timezero{0};
|
|
// Match the original fstapi.c. Just for information, not used in FST.
|
|
uint64_t m_writer_memory_use{1ull << 27};
|
|
uint64_t m_num_scopes{0};
|
|
uint64_t m_num_vars{0}; // #CreateVar calls, including aliases
|
|
uint64_t m_num_handles{0}; // #unique handles, excluding aliases, shall be <= m_num_vars
|
|
uint64_t m_num_value_change_data_blocks{0};
|
|
char m_writer[128]{};
|
|
char m_date[26]{};
|
|
FileType m_filetype{FileType::VERILOG};
|
|
int8_t m_timescale{-9};
|
|
};
|
|
|
|
static constexpr uint64_t kInvalidTime = uint64_t(-1);
|
|
|
|
} // namespace fst
|