78 const char *sigNameBlob = info->traceTapNames;
79 auto nameRefVector = std::vector<SignalNameRef>();
81 uint64_t sigOffset = 0;
83 uint64_t sigOffsetNext = info->traceTaps[0].nameOffset + 1;
84 uint64_t signalIndex = 0;
85 while (signalIndex < info->numTraceTaps) {
86 nameRefVector.emplace_back(signalIndex, sigOffset);
87 auto nameLen = nameRefVector.back().getStringView(sigNameBlob).length();
89 sigOffset += nameLen + 1;
90 if (sigOffset >= sigOffsetNext) {
92 assert(sigOffset == sigOffsetNext);
95 if (signalIndex < info->numTraceTaps)
96 sigOffsetNext = info->traceTaps[signalIndex].nameOffset + 1;
102 nameRefVector.begin(), nameRefVector.end(),
103 [sigNameBlob](
const SignalNameRef &a,
const SignalNameRef &b) {
104 return a.getStringView(sigNameBlob) < b.getStringView(sigNameBlob);
107 std::vector<std::string> currentScope;
108 for (
auto &name : nameRefVector) {
109 auto nameStr = name.getStringView(sigNameBlob);
110 std::vector<std::string> sigScope;
111 size_t charOffset = 0;
113 auto newOffset = std::string::npos;
114 while ((newOffset = nameStr.find(
'/', charOffset)) != std::string::npos) {
115 std::string scopeName(nameStr.substr(charOffset, newOffset - charOffset));
116 std::string legalizedScope;
118 sigScope.push_back(legalizedScope);
119 charOffset = newOffset + 1;
122 unsigned commonScopes = 0;
123 for (
size_t i = 0; i < std::min(currentScope.size(), sigScope.size());
125 if (sigScope[i] == currentScope[i])
131 while (commonScopes < currentScope.size()) {
132 currentScope.pop_back();
136 while (sigScope.size() > currentScope.size()) {
137 fstWriterSetScope(
fstWriter, FST_ST_VCD_MODULE,
138 sigScope[currentScope.size()].c_str(),
nullptr);
139 currentScope.push_back(sigScope[currentScope.size()]);
144 uint32_t handle = fstWriterCreateVar(
145 fstWriter, FST_VT_VCD_WIRE, FST_VD_IMPLICIT,
146 signalTable[name.signalIndex].numBits, sigName.c_str(),