3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-04-23 09:05:32 +00:00

Start restoring memory state from VCD/FST

This commit is contained in:
Miodrag Milanovic 2022-05-04 10:41:04 +02:00
parent 3fb32540ea
commit ad48639cdd
3 changed files with 50 additions and 3 deletions

View file

@ -85,6 +85,13 @@ fstHandle FstData::getHandle(std::string name) {
return 0;
};
dict<int,fstHandle> FstData::getMemoryHandles(std::string name) {
if (memory_to_handle.find(name) != memory_to_handle.end())
return memory_to_handle[name];
else
return dict<int,fstHandle>();
};
static std::string remove_spaces(std::string str)
{
str.erase(std::remove(str.begin(), str.end(), ' '), str.end());
@ -126,7 +133,30 @@ void FstData::extractVarNames()
}
if (clean_name[0]=='\\')
clean_name = clean_name.substr(1);
size_t pos = clean_name.find_last_of("<");
if (pos != std::string::npos) {
std::string mem_cell = clean_name.substr(0, pos);
std::string addr = clean_name.substr(pos+1);
addr.pop_back(); // remove closing bracket
char *endptr;
int mem_addr = strtol(addr.c_str(), &endptr, 16);
if (*endptr) {
log_error("Error parsing memory address in : %s\n", clean_name.c_str());
}
memory_to_handle[var.scope+"."+mem_cell][mem_addr] = var.id;
}
pos = clean_name.find_last_of("[");
if (pos != std::string::npos) {
std::string mem_cell = clean_name.substr(0, pos);
std::string addr = clean_name.substr(pos+1);
addr.pop_back(); // remove closing bracket
char *endptr;
int mem_addr = strtol(addr.c_str(), &endptr, 10);
if (*endptr) {
log_error("Error parsing memory address in : %s\n", clean_name.c_str());
}
memory_to_handle[var.scope+"."+mem_cell][mem_addr] = var.id;
}
name_to_handle[var.scope+"."+clean_name] = h->u.var.handle;
break;
}

View file

@ -54,6 +54,7 @@ class FstData
std::string valueOf(fstHandle signal);
fstHandle getHandle(std::string name);
dict<int,fstHandle> getMemoryHandles(std::string name);
double getTimescale() { return timescale; }
const char *getTimescaleString() { return timescale_str.c_str(); }
private:
@ -63,6 +64,7 @@ private:
std::vector<FstVar> vars;
std::map<fstHandle, FstVar> handle_to_var;
std::map<std::string, fstHandle> name_to_handle;
std::map<std::string, dict<int, fstHandle>> memory_to_handle;
std::map<fstHandle, std::string> last_data;
uint64_t last_time;
std::map<fstHandle, std::string> past_data;