aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/bitpattern.h26
-rw-r--r--kernel/hashlib.h16
-rw-r--r--kernel/yosys.h4
3 files changed, 32 insertions, 14 deletions
diff --git a/kernel/bitpattern.h b/kernel/bitpattern.h
index 4d88c8e34..7416a488d 100644
--- a/kernel/bitpattern.h
+++ b/kernel/bitpattern.h
@@ -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();
}
};
diff --git a/kernel/hashlib.h b/kernel/hashlib.h
index 0b6e94a32..3164282f2 100644
--- a/kernel/hashlib.h
+++ b/kernel/hashlib.h
@@ -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++)
diff --git a/kernel/yosys.h b/kernel/yosys.h
index 5f3c3577d..2c9ca0dd9 100644
--- a/kernel/yosys.h
+++ b/kernel/yosys.h
@@ -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();