aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2014-12-29 00:12:36 +0100
committerClifford Wolf <clifford@clifford.at>2014-12-29 00:12:36 +0100
commita2226e530791ec9dea45cd905f812de28d2c1c06 (patch)
treedc074d315113278178c14bcbec5c19a96ae372c5 /kernel
parentdede5353b10c1d8fb887fbfd3a46cb1fc0413082 (diff)
downloadyosys-a2226e530791ec9dea45cd905f812de28d2c1c06.tar.gz
yosys-a2226e530791ec9dea45cd905f812de28d2c1c06.tar.bz2
yosys-a2226e530791ec9dea45cd905f812de28d2c1c06.zip
Added mkhash_xorshift()
Diffstat (limited to 'kernel')
-rw-r--r--kernel/hashlib.h20
-rw-r--r--kernel/rtlil.cc25
-rw-r--r--kernel/rtlil.h5
-rw-r--r--kernel/yosys.h1
4 files changed, 38 insertions, 13 deletions
diff --git a/kernel/hashlib.h b/kernel/hashlib.h
index 24a1dbf6d..021cc66ee 100644
--- a/kernel/hashlib.h
+++ b/kernel/hashlib.h
@@ -31,6 +31,20 @@ inline unsigned int mkhash_add(unsigned int a, unsigned int b) {
return ((a << 5) + a) + b;
}
+inline unsigned int mkhash_xorshift(unsigned int a) {
+ if (sizeof(a) == 4) {
+ a ^= a << 13;
+ a ^= a >> 17;
+ a ^= a << 5;
+ } else if (sizeof(a) == 8) {
+ a ^= a << 13;
+ a ^= a >> 7;
+ a ^= a << 17;
+ } else
+ throw std::runtime_error("mkhash_xorshift() only implemented for 32 bit and 64 bit ints");
+ return a;
+}
+
template<typename T> struct hash_ops {
bool cmp(const T &a, const T &b) const {
return a == b;
@@ -122,7 +136,11 @@ inline int hashtable_size(int old_size)
if (old_size < 250999999) return 250999999;
if (old_size < 503000009) return 503000009;
if (old_size < 1129999999) return 1129999999;
- throw std::length_error("hash table exceeded maximum size");
+
+ if (sizeof(old_size) == 4)
+ throw std::length_error("hash table exceeded maximum size. recompile with -mint64.");
+
+ return old_size * 2;
}
template<typename K, typename T, typename OPS = hash_ops<K>>
diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc
index cdbaa5bbf..f25df175d 100644
--- a/kernel/rtlil.cc
+++ b/kernel/rtlil.cc
@@ -236,8 +236,9 @@ void RTLIL::Selection::optimize(RTLIL::Design *design)
RTLIL::Design::Design()
{
- static unsigned int hashidx_count = 0;
- hashidx_ = hashidx_count++;
+ static unsigned int hashidx_count = 123456789;
+ hashidx_count = mkhash_xorshift(hashidx_count);
+ hashidx_ = hashidx_count;
refcount_modules_ = 0;
selection_stack.push_back(RTLIL::Selection());
@@ -450,8 +451,9 @@ std::vector<RTLIL::Module*> RTLIL::Design::selected_whole_modules_warn() const
RTLIL::Module::Module()
{
- static unsigned int hashidx_count = 0;
- hashidx_ = hashidx_count++;
+ static unsigned int hashidx_count = 123456789;
+ hashidx_count = mkhash_xorshift(hashidx_count);
+ hashidx_ = hashidx_count;
design = nullptr;
refcount_wires_ = 0;
@@ -1741,8 +1743,9 @@ RTLIL::Cell* RTLIL::Module::addDlatchsrGate(RTLIL::IdString name, RTLIL::SigSpec
RTLIL::Wire::Wire()
{
- static unsigned int hashidx_count = 0;
- hashidx_ = hashidx_count++;
+ static unsigned int hashidx_count = 123456789;
+ hashidx_count = mkhash_xorshift(hashidx_count);
+ hashidx_ = hashidx_count;
module = nullptr;
width = 1;
@@ -1755,8 +1758,9 @@ RTLIL::Wire::Wire()
RTLIL::Memory::Memory()
{
- static unsigned int hashidx_count = 0;
- hashidx_ = hashidx_count++;
+ static unsigned int hashidx_count = 123456789;
+ hashidx_count = mkhash_xorshift(hashidx_count);
+ hashidx_ = hashidx_count;
width = 1;
size = 0;
@@ -1764,8 +1768,9 @@ RTLIL::Memory::Memory()
RTLIL::Cell::Cell() : module(nullptr)
{
- static unsigned int hashidx_count = 0;
- hashidx_ = hashidx_count++;
+ static unsigned int hashidx_count = 123456789;
+ hashidx_count = mkhash_xorshift(hashidx_count);
+ hashidx_ = hashidx_count;
// log("#memtrace# %p\n", this);
memhasher();
diff --git a/kernel/rtlil.h b/kernel/rtlil.h
index f759a014f..5bca060f4 100644
--- a/kernel/rtlil.h
+++ b/kernel/rtlil.h
@@ -712,8 +712,9 @@ struct RTLIL::Monitor
unsigned int hash() const { return hashidx_; }
Monitor() {
- static unsigned int hashidx_count = 0;
- hashidx_ = hashidx_count++;
+ static unsigned int hashidx_count = 123456789;
+ hashidx_count = mkhash_xorshift(hashidx_count);
+ hashidx_ = hashidx_count;
}
virtual ~Monitor() { }
diff --git a/kernel/yosys.h b/kernel/yosys.h
index bbcbd5fed..8ddd6f540 100644
--- a/kernel/yosys.h
+++ b/kernel/yosys.h
@@ -136,6 +136,7 @@ using std::vector;
using std::string;
using hashlib::mkhash;
using hashlib::mkhash_add;
+using hashlib::mkhash_xorshift;
using hashlib::hash_ops;
using hashlib::hash_cstr_ops;
using hashlib::hash_ptr_ops;