aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/yosys.cc
diff options
context:
space:
mode:
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 6cc643152..52bd066b7 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;