Added mkhash_xorshift()
authorClifford Wolf <clifford@clifford.at>
Sun, 28 Dec 2014 23:12:36 +0000 (00:12 +0100)
committerClifford Wolf <clifford@clifford.at>
Sun, 28 Dec 2014 23:12:36 +0000 (00:12 +0100)
kernel/hashlib.h
kernel/rtlil.cc
kernel/rtlil.h
kernel/yosys.h

index 24a1dbf6d47c4fe1d9ffd567c332f33b0f7fbe16..021cc66ee3aa273c8f21ce35d50b212db24f66a7 100644 (file)
@@ -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>>
index cdbaa5bbff1ab56c32c0614115769eb21b4cf6b6..f25df175d99de6a5ed202a299c464eb4f1d0c0c1 100644 (file)
@@ -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();
index f759a014f58188d75e90c9f04d1e3bda40d69dab..5bca060f465b068bad576b40863e98dbf0317aa5 100644 (file)
@@ -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() { }
index bbcbd5fed1b5b372718d7329722b1475d457965a..8ddd6f54059ac7dbaf410cf8ca1d68207878d458 100644 (file)
@@ -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;