我想写一个可以解析VCD(Value Change Dump)文件的软件。我正在尝试使用C++进行文件I/O操作,逐行读取VCD文件,并处理字符串。我应该使用什么数据结构来存储读取信号?目前,我对 Bison 和 Flex 不太熟悉。也许是嵌套字典或类似地图的结构
我正在寻找一种更简单的数据结构。我在 GitHub 上发现了很多 VCD 解析项目,例如 verilog-vcd-parser,但它们不存储确切的值和时间戳。
C++和简化操作的数据结构可用于解析VCD(Value Change Dump)文件并存储读取信号。将信号名称与其值和时间戳相关联的类似地图的结构是适合此作业的数据结构。您可以使用
std::unordered_map
将信号名称映射到包含其值和时间戳的数据结构。
#include <iostream>
#include <unordered_map>
#include <string>
#include <vector>
struct SignalValue {
char value; // Store '0', '1', 'x', 'z', etc.
long long timestamp; // Store the timestamp of the signal change
};
int main() {
std::unordered_map<std::string, std::vector<SignalValue>> signalData;
// Example of adding data to the map
signalData["signal_name"].push_back({'0', 100});
signalData["signal_name"].push_back({'1', 200});
signalData["another_signal"].push_back({'x', 300});
// Example of accessing and iterating through the data
for (const auto& kv : signalData) {
std::cout << "Signal Name: " << kv.first << std::endl;
for (const auto& value : kv.second) {
std::cout << "Value: " << value.value << " at timestamp: " << value.timestamp << std::endl;
}
}
return 0;
}
要将信号名称(字符串)映射到
SignalValue
结构向量,请使用 std::unordered_map
。 SignalValue
结构保存信号的值(例如,0
、1
、x
、z
)及其时间戳。当您解析 VCD 文件时,您可以通过将信号名称映射到 SignalValue
对象向量来创建数据结构,每个对象都反映随日期变化的值。这个数据结构很简单,足以解析 VCD 文件以及存储信号值和时间戳。