aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2016-08-30 14:49:47 +0200
committerClifford Wolf <clifford@clifford.at>2016-08-30 14:49:47 +0200
commita8124c137e2bfa3605dacadfe469ea22934b4cb3 (patch)
treee651a924a2999eb359da04f37facb23e41b9ff79
parentb04a40d9fe6725dbe1b97a63931b0c0710e3149d (diff)
downloadyosys-a8124c137e2bfa3605dacadfe469ea22934b4cb3.tar.gz
yosys-a8124c137e2bfa3605dacadfe469ea22934b4cb3.tar.bz2
yosys-a8124c137e2bfa3605dacadfe469ea22934b4cb3.zip
Fixed memory bug in write_smt2
-rw-r--r--backends/smt2/smt2.cc32
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)