summaryrefslogtreecommitdiff
path: root/kernel/yosys.cc
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2014-12-28 21:27:51 +0100
committerClifford Wolf <clifford@clifford.at>2014-12-28 21:27:51 +0100
commit8773fd5897d1057dc8f87d4ffd13c96a708080e8 (patch)
treea64b70c41d5962694969da7a6bef7ebf553999b2 /kernel/yosys.cc
parent445686cba38e949e85031ff95858c21afd1e1463 (diff)
Added memhasher (yosys -M)
Diffstat (limited to 'kernel/yosys.cc')
-rw-r--r--kernel/yosys.cc37
1 files changed, 37 insertions, 0 deletions
diff --git a/kernel/yosys.cc b/kernel/yosys.cc
index 6cc64315..52bd066b 100644
--- a/kernel/yosys.cc
+++ b/kernel/yosys.cc
@@ -55,6 +55,43 @@ RTLIL::Design *yosys_design = NULL;
Tcl_Interp *yosys_tcl_interp = NULL;
#endif
+bool memhasher_active = false;
+uint32_t memhasher_rng;
+std::vector<void*> memhasher_store;
+
+void memhasher_on()
+{
+ memhasher_rng += time(NULL) << 16 ^ getpid();
+ memhasher_store.resize(0x10000);
+ memhasher_active = true;
+}
+
+void memhasher_off()
+{
+ for (auto p : memhasher_store)
+ if (p) free(p);
+ memhasher_store.clear();
+ memhasher_active = false;
+}
+
+void memhasher_do()
+{
+ memhasher_rng ^= memhasher_rng << 13;
+ memhasher_rng ^= memhasher_rng >> 17;
+ memhasher_rng ^= memhasher_rng << 5;
+
+ int size, index = (memhasher_rng >> 4) & 0xffff;
+ switch (memhasher_rng & 7) {
+ case 0: size = 16; break;
+ case 1: size = 256; break;
+ case 2: size = 1024; break;
+ case 3: size = 4096; break;
+ default: size = 0;
+ }
+ if (index < 16) size *= 16;
+ memhasher_store[index] = realloc(memhasher_store[index], size);
+}
+
std::string stringf(const char *fmt, ...)
{
std::string string;