diff options
author | Clifford Wolf <clifford@clifford.at> | 2014-12-28 21:27:51 +0100 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2014-12-28 21:27:51 +0100 |
commit | 8773fd5897d1057dc8f87d4ffd13c96a708080e8 (patch) | |
tree | a64b70c41d5962694969da7a6bef7ebf553999b2 /kernel/yosys.cc | |
parent | 445686cba38e949e85031ff95858c21afd1e1463 (diff) |
Added memhasher (yosys -M)
Diffstat (limited to 'kernel/yosys.cc')
-rw-r--r-- | kernel/yosys.cc | 37 |
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; |