verilator/include/fstcpp/fstcpp_file.h

84 lines
3.1 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 <cstdint>
// Other libraries' .h files.
// Your project's .h files.
namespace fst {
// Original block types from fstapi.h
// 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,
// FST_BL_SKIP = 255
enum class BlockType : uint8_t {
HEADER = 0,
WAVE_DATA_VERSION1 = 1, // not implemented
BLACKOUT = 2,
GEOMETRY = 3,
HIERARCHY_GZ_COMPRESSED = 4, // not implemented
WAVE_DATA_VERSION2 = 5, // not implemented
HIERARCHY_LZ4_COMPRESSED = 6,
HIERARCHY_LZ4_COMPRESSED_TWICE = 7, // not implemented
WAVE_DATA_VERSION3 = 8,
ZWRAPPER = 254, // not implemented
SKIP = 255 // not implemented
};
constexpr unsigned kSharedBlockHeaderSize = 1 /* BlockType */ + 8 /* size (u64) */;
struct HeaderInfo {
struct Size {
static constexpr unsigned start_time = 0;
static constexpr unsigned end_time = 8;
static constexpr unsigned real_endianness = 8;
static constexpr unsigned writer_memory_use = 8;
static constexpr unsigned num_scopes = 8;
static constexpr unsigned num_vars = 8;
static constexpr unsigned num_handles = 8;
static constexpr unsigned num_wave_data_blocks = 8;
static constexpr unsigned timescale = 1;
static constexpr unsigned writer = 128;
static constexpr unsigned date = 26;
static constexpr unsigned reserved = 93;
static constexpr unsigned filetype = 1;
static constexpr unsigned timezero = 8;
};
struct Offset {
static constexpr unsigned start_time = 0;
static constexpr unsigned end_time = start_time + Size::end_time;
static constexpr unsigned real_endianness = end_time + Size::real_endianness;
static constexpr unsigned writer_memory_use = real_endianness + Size::writer_memory_use;
static constexpr unsigned num_scopes = writer_memory_use + Size::num_scopes;
static constexpr unsigned num_vars = num_scopes + Size::num_vars;
static constexpr unsigned num_handles = num_vars + Size::num_vars;
static constexpr unsigned num_wave_data_blocks = num_handles + Size::num_handles;
static constexpr unsigned timescale = num_wave_data_blocks + Size::num_wave_data_blocks;
static constexpr unsigned writer = timescale + Size::timescale;
static constexpr unsigned date = writer + Size::writer;
static constexpr unsigned reserved = date + Size::date;
static constexpr unsigned filetype = reserved + Size::reserved;
static constexpr unsigned timezero = filetype + Size::filetype;
};
static constexpr unsigned total_size = Offset::timezero + Size::timezero;
static constexpr double kEndianessMagicIdentifier = 2.7182818284590452354;
static_assert(total_size == 321, "Total size of HeaderInfo must be 321 bytes");
};
} // namespace fst