mirror of https://github.com/YosysHQ/yosys.git
More hashtable finetuning
This commit is contained in:
parent
88d08e8f24
commit
66ab88d7b0
|
@ -23,6 +23,8 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#define YOSYS_HASHTABLE_SIZE_FACTOR 3
|
||||||
|
|
||||||
inline unsigned int mkhash(unsigned int a, unsigned int b) {
|
inline unsigned int mkhash(unsigned int a, unsigned int b) {
|
||||||
return ((a << 5) + a) ^ b;
|
return ((a << 5) + a) ^ b;
|
||||||
}
|
}
|
||||||
|
@ -81,8 +83,19 @@ struct hash_ptr_ops {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct hash_obj_ops {
|
||||||
|
bool cmp(const void *a, const void *b) const {
|
||||||
|
return a == b;
|
||||||
|
}
|
||||||
|
template<typename T>
|
||||||
|
unsigned int hash(const T *a) const {
|
||||||
|
return a->name.hash();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
inline int hashtable_size(int old_size)
|
inline int hashtable_size(int old_size)
|
||||||
{
|
{
|
||||||
|
// prime numbers, approx. in powers of two
|
||||||
if (old_size < 53) return 53;
|
if (old_size < 53) return 53;
|
||||||
if (old_size < 113) return 113;
|
if (old_size < 113) return 113;
|
||||||
if (old_size < 251) return 251;
|
if (old_size < 251) return 251;
|
||||||
|
@ -144,7 +157,9 @@ class dict
|
||||||
entries.clear();
|
entries.clear();
|
||||||
|
|
||||||
counter = other.size();
|
counter = other.size();
|
||||||
int new_size = hashtable_size(counter);
|
int new_size = hashtable_size(YOSYS_HASHTABLE_SIZE_FACTOR * counter);
|
||||||
|
hashtable.resize(new_size);
|
||||||
|
new_size = new_size / YOSYS_HASHTABLE_SIZE_FACTOR + 1;
|
||||||
entries.reserve(new_size);
|
entries.reserve(new_size);
|
||||||
|
|
||||||
for (auto &it : other)
|
for (auto &it : other)
|
||||||
|
@ -165,7 +180,6 @@ class dict
|
||||||
{
|
{
|
||||||
free_list = -1;
|
free_list = -1;
|
||||||
|
|
||||||
hashtable.resize(entries.size());
|
|
||||||
for (auto &h : hashtable)
|
for (auto &h : hashtable)
|
||||||
h = -1;
|
h = -1;
|
||||||
|
|
||||||
|
@ -221,7 +235,9 @@ class dict
|
||||||
if (free_list < 0)
|
if (free_list < 0)
|
||||||
{
|
{
|
||||||
int i = entries.size();
|
int i = entries.size();
|
||||||
entries.resize(hashtable_size(i));
|
int new_size = hashtable_size(YOSYS_HASHTABLE_SIZE_FACTOR * entries.size());
|
||||||
|
hashtable.resize(new_size);
|
||||||
|
entries.resize(new_size / YOSYS_HASHTABLE_SIZE_FACTOR + 1);
|
||||||
entries[i].udata = value;
|
entries[i].udata = value;
|
||||||
entries[i].set_next_used(0);
|
entries[i].set_next_used(0);
|
||||||
counter++;
|
counter++;
|
||||||
|
@ -473,7 +489,9 @@ class pool
|
||||||
entries.clear();
|
entries.clear();
|
||||||
|
|
||||||
counter = other.size();
|
counter = other.size();
|
||||||
int new_size = hashtable_size(counter);
|
int new_size = hashtable_size(YOSYS_HASHTABLE_SIZE_FACTOR * counter);
|
||||||
|
hashtable.resize(new_size);
|
||||||
|
new_size = new_size / YOSYS_HASHTABLE_SIZE_FACTOR + 1;
|
||||||
entries.reserve(new_size);
|
entries.reserve(new_size);
|
||||||
|
|
||||||
for (auto &it : other)
|
for (auto &it : other)
|
||||||
|
@ -494,7 +512,6 @@ class pool
|
||||||
{
|
{
|
||||||
free_list = -1;
|
free_list = -1;
|
||||||
|
|
||||||
hashtable.resize(entries.size());
|
|
||||||
for (auto &h : hashtable)
|
for (auto &h : hashtable)
|
||||||
h = -1;
|
h = -1;
|
||||||
|
|
||||||
|
@ -550,7 +567,9 @@ class pool
|
||||||
if (free_list < 0)
|
if (free_list < 0)
|
||||||
{
|
{
|
||||||
int i = entries.size();
|
int i = entries.size();
|
||||||
entries.resize(hashtable_size(i));
|
int new_size = hashtable_size(YOSYS_HASHTABLE_SIZE_FACTOR * entries.size());
|
||||||
|
hashtable.resize(new_size);
|
||||||
|
entries.resize(new_size / YOSYS_HASHTABLE_SIZE_FACTOR + 1);
|
||||||
entries[i].key = key;
|
entries[i].key = key;
|
||||||
entries[i].set_next_used(0);
|
entries[i].set_next_used(0);
|
||||||
counter++;
|
counter++;
|
||||||
|
|
|
@ -1132,7 +1132,7 @@ namespace {
|
||||||
struct DeleteWireWorker
|
struct DeleteWireWorker
|
||||||
{
|
{
|
||||||
RTLIL::Module *module;
|
RTLIL::Module *module;
|
||||||
const pool<RTLIL::Wire*, hash_ptr_ops> *wires_p;
|
const pool<RTLIL::Wire*, hash_obj_ops> *wires_p;
|
||||||
|
|
||||||
void operator()(RTLIL::SigSpec &sig) {
|
void operator()(RTLIL::SigSpec &sig) {
|
||||||
std::vector<RTLIL::SigChunk> chunks = sig;
|
std::vector<RTLIL::SigChunk> chunks = sig;
|
||||||
|
@ -1146,7 +1146,7 @@ namespace {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void RTLIL::Module::remove(const pool<RTLIL::Wire*, hash_ptr_ops> &wires)
|
void RTLIL::Module::remove(const pool<RTLIL::Wire*, hash_obj_ops> &wires)
|
||||||
{
|
{
|
||||||
log_assert(refcount_wires_ == 0);
|
log_assert(refcount_wires_ == 0);
|
||||||
|
|
||||||
|
|
|
@ -708,6 +708,8 @@ struct RTLIL::Selection
|
||||||
|
|
||||||
struct RTLIL::Monitor
|
struct RTLIL::Monitor
|
||||||
{
|
{
|
||||||
|
RTLIL::IdString name;
|
||||||
|
Monitor() { name = stringf("$%d", autoidx++); }
|
||||||
virtual ~Monitor() { }
|
virtual ~Monitor() { }
|
||||||
virtual void notify_module_add(RTLIL::Module*) { }
|
virtual void notify_module_add(RTLIL::Module*) { }
|
||||||
virtual void notify_module_del(RTLIL::Module*) { }
|
virtual void notify_module_del(RTLIL::Module*) { }
|
||||||
|
@ -719,7 +721,7 @@ struct RTLIL::Monitor
|
||||||
|
|
||||||
struct RTLIL::Design
|
struct RTLIL::Design
|
||||||
{
|
{
|
||||||
pool<RTLIL::Monitor*, hash_ptr_ops> monitors;
|
pool<RTLIL::Monitor*, hash_obj_ops> monitors;
|
||||||
dict<std::string, std::string> scratchpad;
|
dict<std::string, std::string> scratchpad;
|
||||||
|
|
||||||
int refcount_modules_;
|
int refcount_modules_;
|
||||||
|
@ -806,7 +808,7 @@ protected:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RTLIL::Design *design;
|
RTLIL::Design *design;
|
||||||
pool<RTLIL::Monitor*, hash_ptr_ops> monitors;
|
pool<RTLIL::Monitor*, hash_obj_ops> monitors;
|
||||||
|
|
||||||
int refcount_wires_;
|
int refcount_wires_;
|
||||||
int refcount_cells_;
|
int refcount_cells_;
|
||||||
|
@ -860,7 +862,7 @@ public:
|
||||||
RTLIL::ObjRange<RTLIL::Cell*> cells() { return RTLIL::ObjRange<RTLIL::Cell*>(&cells_, &refcount_cells_); }
|
RTLIL::ObjRange<RTLIL::Cell*> cells() { return RTLIL::ObjRange<RTLIL::Cell*>(&cells_, &refcount_cells_); }
|
||||||
|
|
||||||
// Removing wires is expensive. If you have to remove wires, remove them all at once.
|
// Removing wires is expensive. If you have to remove wires, remove them all at once.
|
||||||
void remove(const pool<RTLIL::Wire*, hash_ptr_ops> &wires);
|
void remove(const pool<RTLIL::Wire*, hash_obj_ops> &wires);
|
||||||
void remove(RTLIL::Cell *cell);
|
void remove(RTLIL::Cell *cell);
|
||||||
|
|
||||||
void rename(RTLIL::Wire *wire, RTLIL::IdString new_name);
|
void rename(RTLIL::Wire *wire, RTLIL::IdString new_name);
|
||||||
|
|
|
@ -149,6 +149,8 @@ void remove_directory(std::string dirname);
|
||||||
template<typename T> int GetSize(const T &obj) { return obj.size(); }
|
template<typename T> int GetSize(const T &obj) { return obj.size(); }
|
||||||
int GetSize(RTLIL::Wire *wire);
|
int GetSize(RTLIL::Wire *wire);
|
||||||
|
|
||||||
|
extern int autoidx;
|
||||||
|
|
||||||
YOSYS_NAMESPACE_END
|
YOSYS_NAMESPACE_END
|
||||||
|
|
||||||
#include "kernel/log.h"
|
#include "kernel/log.h"
|
||||||
|
@ -164,7 +166,6 @@ void yosys_shutdown();
|
||||||
Tcl_Interp *yosys_get_tcl_interp();
|
Tcl_Interp *yosys_get_tcl_interp();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int autoidx;
|
|
||||||
extern RTLIL::Design *yosys_design;
|
extern RTLIL::Design *yosys_design;
|
||||||
|
|
||||||
RTLIL::IdString new_id(std::string file, int line, std::string func);
|
RTLIL::IdString new_id(std::string file, int line, std::string func);
|
||||||
|
|
|
@ -91,8 +91,8 @@ struct DeletePass : public Pass {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pool<RTLIL::Wire*, hash_ptr_ops> delete_wires;
|
pool<RTLIL::Wire*, hash_obj_ops> delete_wires;
|
||||||
pool<RTLIL::Cell*, hash_ptr_ops> delete_cells;
|
pool<RTLIL::Cell*, hash_obj_ops> delete_cells;
|
||||||
pool<RTLIL::IdString> delete_procs;
|
pool<RTLIL::IdString> delete_procs;
|
||||||
pool<RTLIL::IdString> delete_mems;
|
pool<RTLIL::IdString> delete_mems;
|
||||||
|
|
||||||
|
|
|
@ -176,7 +176,7 @@ struct SplitnetsPass : public Pass {
|
||||||
|
|
||||||
module->rewrite_sigspecs(worker);
|
module->rewrite_sigspecs(worker);
|
||||||
|
|
||||||
pool<RTLIL::Wire*, hash_ptr_ops> delete_wires;
|
pool<RTLIL::Wire*, hash_obj_ops> delete_wires;
|
||||||
for (auto &it : worker.splitmap)
|
for (auto &it : worker.splitmap)
|
||||||
delete_wires.insert(it.first);
|
delete_wires.insert(it.first);
|
||||||
module->remove(delete_wires);
|
module->remove(delete_wires);
|
||||||
|
|
|
@ -262,7 +262,7 @@ void rmunused_module_signals(RTLIL::Module *module, bool purge_mode, bool verbos
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pool<RTLIL::Wire*, hash_ptr_ops> del_wires;
|
pool<RTLIL::Wire*, hash_obj_ops> del_wires;
|
||||||
|
|
||||||
int del_wires_count = 0;
|
int del_wires_count = 0;
|
||||||
for (auto wire : maybe_del_wires)
|
for (auto wire : maybe_del_wires)
|
||||||
|
|
|
@ -199,7 +199,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
||||||
dict<RTLIL::SigSpec, RTLIL::SigSpec> invert_map;
|
dict<RTLIL::SigSpec, RTLIL::SigSpec> invert_map;
|
||||||
|
|
||||||
TopoSort<RTLIL::Cell*, RTLIL::IdString::compare_ptr_by_name<RTLIL::Cell>> cells;
|
TopoSort<RTLIL::Cell*, RTLIL::IdString::compare_ptr_by_name<RTLIL::Cell>> cells;
|
||||||
dict<RTLIL::Cell*, std::set<RTLIL::SigBit>, hash_ptr_ops> cell_to_inbit;
|
dict<RTLIL::Cell*, std::set<RTLIL::SigBit>, hash_obj_ops> cell_to_inbit;
|
||||||
dict<RTLIL::SigBit, std::set<RTLIL::Cell*>> outbit_to_cell;
|
dict<RTLIL::SigBit, std::set<RTLIL::Cell*>> outbit_to_cell;
|
||||||
|
|
||||||
for (auto cell : module->cells())
|
for (auto cell : module->cells())
|
||||||
|
|
|
@ -41,7 +41,7 @@ struct OptShareWorker
|
||||||
CellTypes ct;
|
CellTypes ct;
|
||||||
int total_count;
|
int total_count;
|
||||||
#ifdef USE_CELL_HASH_CACHE
|
#ifdef USE_CELL_HASH_CACHE
|
||||||
dict<const RTLIL::Cell*, std::string, hash_ptr_ops> cell_hash_cache;
|
dict<const RTLIL::Cell*, std::string, hash_obj_ops> cell_hash_cache;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_CELL_HASH_CACHE
|
#ifdef USE_CELL_HASH_CACHE
|
||||||
|
|
Loading…
Reference in New Issue