diff options
author | Clifford Wolf <clifford@clifford.at> | 2016-08-30 14:49:47 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2016-08-30 14:49:47 +0200 |
commit | a8124c137e2bfa3605dacadfe469ea22934b4cb3 (patch) | |
tree | e651a924a2999eb359da04f37facb23e41b9ff79 | |
parent | b04a40d9fe6725dbe1b97a63931b0c0710e3149d (diff) | |
download | yosys-a8124c137e2bfa3605dacadfe469ea22934b4cb3.tar.gz yosys-a8124c137e2bfa3605dacadfe469ea22934b4cb3.tar.bz2 yosys-a8124c137e2bfa3605dacadfe469ea22934b4cb3.zip |
Fixed memory bug in write_smt2
-rw-r--r-- | backends/smt2/smt2.cc | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/backends/smt2/smt2.cc b/backends/smt2/smt2.cc index 1885cf59a..9668a6425 100644 --- a/backends/smt2/smt2.cc +++ b/backends/smt2/smt2.cc @@ -43,7 +43,25 @@ struct Smt2Worker std::map<RTLIL::SigBit, std::pair<int, int>> fcache; std::map<Cell*, int> memarrays; std::map<int, int> bvsizes; - std::vector<string> ids; + dict<IdString, char*> ids; + + const char *get_id(IdString n) + { + if (ids.count(n) == 0) { + std::string str = log_id(n); + for (int i = 0; i < GetSize(str); i++) { + if (str[i] == '\\') + str[i] = '/'; + } + ids[n] = strdup(str.c_str()); + } + return ids[n]; + } + + template<typename T> + const char *get_id(T *obj) { + return get_id(obj->name); + } Smt2Worker(RTLIL::Module *module, bool bvmode, bool memmode, bool wiresmode, bool verbose) : ct(module->design), sigmap(module), module(module), bvmode(bvmode), memmode(memmode), @@ -68,15 +86,11 @@ struct Smt2Worker } } - const char *get_id(IdString n) + ~Smt2Worker() { - std::string str = log_id(n); - for (int i = 0; i < GetSize(str); i++) { - if (str[i] == '\\') - str[i] = '/'; - } - ids.push_back(str); - return ids.back().c_str(); + for (auto &it : ids) + free(it.second); + ids.clear(); } const char *get_id(Module *m) |