using pool<> in bitpattern.h
authorClifford Wolf <clifford@clifford.at>
Tue, 30 Dec 2014 22:45:43 +0000 (23:45 +0100)
committerClifford Wolf <clifford@clifford.at>
Tue, 30 Dec 2014 22:45:43 +0000 (23:45 +0100)
kernel/bitpattern.h
kernel/hashlib.h
kernel/yosys.h

index 4d88c8e347a196cdb60f915451f7cc24280f5b09..7416a488d79a360c44aac1f61b6fe19a67dec9f8 100644 (file)
@@ -29,7 +29,7 @@ struct BitPatternPool
 {
        int width;
        typedef std::vector<RTLIL::State> bits_t;
-       std::set<bits_t> pool;
+       pool<bits_t> database;
 
        BitPatternPool(RTLIL::SigSpec sig)
        {
@@ -42,7 +42,7 @@ struct BitPatternPool
                                else
                                        pattern[i] = RTLIL::State::Sa;
                        }
-                       pool.insert(pattern);
+                       database.insert(pattern);
                }
        }
 
@@ -53,7 +53,7 @@ struct BitPatternPool
                        std::vector<RTLIL::State> pattern(width);
                        for (int i = 0; i < width; i++)
                                pattern[i] = RTLIL::State::Sa;
-                       pool.insert(pattern);
+                       database.insert(pattern);
                }
        }
 
@@ -79,7 +79,7 @@ struct BitPatternPool
        bool has_any(RTLIL::SigSpec sig)
        {
                bits_t bits = sig2bits(sig);
-               for (auto &it : pool)
+               for (auto &it : database)
                        if (match(it, bits))
                                return true;
                return false;
@@ -88,13 +88,13 @@ struct BitPatternPool
        bool has_all(RTLIL::SigSpec sig)
        {
                bits_t bits = sig2bits(sig);
-               for (auto &it : pool)
+               for (auto &it : database)
                        if (match(it, bits)) {
                                for (int i = 0; i < width; i++)
                                        if (bits[i] > RTLIL::State::S1 && it[i] <= RTLIL::State::S1)
-                                               goto next_pool_entry;
+                                               goto next_database_entry;
                                return true;
-       next_pool_entry:;
+       next_database_entry:;
                        }
                return false;
        }
@@ -104,17 +104,17 @@ struct BitPatternPool
                bool status = false;
                bits_t bits = sig2bits(sig);
                std::vector<bits_t> pattern_list;
-               for (auto &it : pool)
+               for (auto &it : database)
                        if (match(it, bits))
                                pattern_list.push_back(it);
                for (auto pattern : pattern_list) {
-                       pool.erase(pattern);
+                       database.erase(pattern);
                        for (int i = 0; i < width; i++) {
                                if (pattern[i] != RTLIL::State::Sa || bits[i] == RTLIL::State::Sa)
                                        continue;
                                bits_t new_pattern = pattern;
                                new_pattern[i] = bits[i] == RTLIL::State::S1 ? RTLIL::State::S0 : RTLIL::State::S1;
-                               pool.insert(new_pattern);
+                               database.insert(new_pattern);
                        }
                        status = true;
                }
@@ -123,15 +123,15 @@ struct BitPatternPool
 
        bool take_all()
        {
-               if (pool.empty())
+               if (database.empty())
                        return false;
-               pool.clear();
+               database.clear();
                return true;
        }
 
        bool empty()
        {
-               return pool.empty();
+               return database.empty();
        }
 }; 
 
index 0b6e94a32a4c26a3ab41368661c272e8b8c20aa2..3164282f26fbc5ffed7944f8bf36aef176a2ef6c 100644 (file)
@@ -62,7 +62,8 @@ template<> struct hash_ops<int> {
        bool cmp(T a, T b) const {
                return a == b;
        }
-       unsigned int hash(unsigned int a) const {
+       template<typename T>
+       unsigned int hash(T a) const {
                return a;
        }
 };
@@ -90,6 +91,19 @@ template<typename P, typename Q> struct hash_ops<std::pair<P, Q>> {
        }
 };
 
+template<typename T> struct hash_ops<std::vector<T>> {
+       bool cmp(std::vector<T> a, std::vector<T> b) const {
+               return a == b;
+       }
+       unsigned int hash(std::vector<T> a) const {
+               hash_ops<T> t_ops;
+               unsigned int h = mkhash_init;
+               for (auto k : a)
+                       h = mkhash(h, t_ops.hash(k));
+               return h;
+       }
+};
+
 struct hash_cstr_ops {
        bool cmp(const char *a, const char *b) const {
                for (int i = 0; a[i] || b[i]; i++)
index 5f3c3577df266c93aa6aaa296fa2f13beb20cd54..2c9ca0dd92cbb91023d363cf3a89ce5d19771b1c 100644 (file)
@@ -221,6 +221,10 @@ YOSYS_NAMESPACE_END
 
 YOSYS_NAMESPACE_BEGIN
 
+namespace hashlib {
+       template<> struct hash_ops<RTLIL::State> : hash_ops<int> {};
+}
+
 void yosys_setup();
 void yosys_shutdown();