mirror of https://github.com/YosysHQ/yosys.git
Improve determinism of IdString DB for similar scripts
Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
parent
d9bb5f3637
commit
20c6a8c9b0
|
@ -1673,6 +1673,8 @@ struct VerilogBackend : public Backend {
|
||||||
bool blackboxes = false;
|
bool blackboxes = false;
|
||||||
bool selected = false;
|
bool selected = false;
|
||||||
|
|
||||||
|
auto_name_map.clear();
|
||||||
|
reg_wires.clear();
|
||||||
reg_ct.clear();
|
reg_ct.clear();
|
||||||
|
|
||||||
reg_ct.insert("$dff");
|
reg_ct.insert("$dff");
|
||||||
|
@ -1779,6 +1781,8 @@ struct VerilogBackend : public Backend {
|
||||||
dump_module(*f, "", it->second);
|
dump_module(*f, "", it->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto_name_map.clear();
|
||||||
|
reg_wires.clear();
|
||||||
reg_ct.clear();
|
reg_ct.clear();
|
||||||
}
|
}
|
||||||
} VerilogBackend;
|
} VerilogBackend;
|
||||||
|
|
|
@ -196,7 +196,11 @@ void logv_header(RTLIL::Design *design, const char *format, va_list ap)
|
||||||
if (log_hdump.count(header_id) && design != nullptr)
|
if (log_hdump.count(header_id) && design != nullptr)
|
||||||
for (auto &filename : log_hdump.at(header_id)) {
|
for (auto &filename : log_hdump.at(header_id)) {
|
||||||
log("Dumping current design to '%s'.\n", filename.c_str());
|
log("Dumping current design to '%s'.\n", filename.c_str());
|
||||||
|
if (yosys_xtrace)
|
||||||
|
IdString::xtrace_db_dump();
|
||||||
Pass::call(design, {"dump", "-o", filename});
|
Pass::call(design, {"dump", "-o", filename});
|
||||||
|
if (yosys_xtrace)
|
||||||
|
log("#X# -- end of dump --\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pop_errfile)
|
if (pop_errfile)
|
||||||
|
|
|
@ -86,6 +86,8 @@ Pass::pre_post_exec_state_t Pass::pre_execute()
|
||||||
|
|
||||||
void Pass::post_execute(Pass::pre_post_exec_state_t state)
|
void Pass::post_execute(Pass::pre_post_exec_state_t state)
|
||||||
{
|
{
|
||||||
|
IdString::checkpoint();
|
||||||
|
|
||||||
int64_t time_ns = PerformanceTimer::query() - state.begin_ns;
|
int64_t time_ns = PerformanceTimer::query() - state.begin_ns;
|
||||||
runtime_ns += time_ns;
|
runtime_ns += time_ns;
|
||||||
current_pass = state.parent_pass;
|
current_pass = state.parent_pass;
|
||||||
|
|
|
@ -33,6 +33,8 @@ std::vector<int> RTLIL::IdString::global_refcount_storage_;
|
||||||
std::vector<char*> RTLIL::IdString::global_id_storage_;
|
std::vector<char*> RTLIL::IdString::global_id_storage_;
|
||||||
dict<char*, int, hash_cstr_ops> RTLIL::IdString::global_id_index_;
|
dict<char*, int, hash_cstr_ops> RTLIL::IdString::global_id_index_;
|
||||||
std::vector<int> RTLIL::IdString::global_free_idx_list_;
|
std::vector<int> RTLIL::IdString::global_free_idx_list_;
|
||||||
|
int RTLIL::IdString::last_created_idx_[8];
|
||||||
|
int RTLIL::IdString::last_created_idx_ptr_;
|
||||||
|
|
||||||
RTLIL::Const::Const()
|
RTLIL::Const::Const()
|
||||||
{
|
{
|
||||||
|
|
|
@ -76,6 +76,9 @@ namespace RTLIL
|
||||||
|
|
||||||
struct IdString
|
struct IdString
|
||||||
{
|
{
|
||||||
|
#undef YOSYS_XTRACE_GET_PUT
|
||||||
|
#undef YOSYS_SORT_ID_FREE_LIST
|
||||||
|
|
||||||
// the global id string cache
|
// the global id string cache
|
||||||
|
|
||||||
static struct destruct_guard_t {
|
static struct destruct_guard_t {
|
||||||
|
@ -89,9 +92,43 @@ namespace RTLIL
|
||||||
static dict<char*, int, hash_cstr_ops> global_id_index_;
|
static dict<char*, int, hash_cstr_ops> global_id_index_;
|
||||||
static std::vector<int> global_free_idx_list_;
|
static std::vector<int> global_free_idx_list_;
|
||||||
|
|
||||||
|
static int last_created_idx_ptr_;
|
||||||
|
static int last_created_idx_[8];
|
||||||
|
|
||||||
|
static inline void xtrace_db_dump()
|
||||||
|
{
|
||||||
|
#ifdef YOSYS_XTRACE_GET_PUT
|
||||||
|
for (int idx = 0; idx < GetSize(global_id_storage_); idx++)
|
||||||
|
{
|
||||||
|
if (global_id_storage_.at(idx) == nullptr)
|
||||||
|
log("#X# DB-DUMP index %d: FREE\n", idx);
|
||||||
|
else
|
||||||
|
log("#X# DB-DUMP index %d: '%s' (ref %d)\n", idx, global_id_storage_.at(idx), global_refcount_storage_.at(idx));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void checkpoint()
|
||||||
|
{
|
||||||
|
last_created_idx_ptr_ = 0;
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
if (last_created_idx_[i])
|
||||||
|
put_reference(last_created_idx_[i]);
|
||||||
|
last_created_idx_[i] = 0;
|
||||||
|
}
|
||||||
|
#ifdef YOSYS_SORT_ID_FREE_LIST
|
||||||
|
std::sort(global_free_idx_list_.begin(), global_free_idx_list_.end(), std::greater<int>());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static inline int get_reference(int idx)
|
static inline int get_reference(int idx)
|
||||||
{
|
{
|
||||||
global_refcount_storage_.at(idx)++;
|
global_refcount_storage_.at(idx)++;
|
||||||
|
#ifdef YOSYS_XTRACE_GET_PUT
|
||||||
|
if (yosys_xtrace) {
|
||||||
|
log("#X# GET-BY-INDEX '%s' (index %d, refcount %d)\n", global_id_storage_.at(idx), idx, global_refcount_storage_.at(idx));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return idx;
|
return idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,6 +144,11 @@ namespace RTLIL
|
||||||
auto it = global_id_index_.find((char*)p);
|
auto it = global_id_index_.find((char*)p);
|
||||||
if (it != global_id_index_.end()) {
|
if (it != global_id_index_.end()) {
|
||||||
global_refcount_storage_.at(it->second)++;
|
global_refcount_storage_.at(it->second)++;
|
||||||
|
#ifdef YOSYS_XTRACE_GET_PUT
|
||||||
|
if (yosys_xtrace) {
|
||||||
|
log("#X# GET-BY-NAME '%s' (index %d, refcount %d)\n", global_id_storage_.at(it->second), it->second, global_refcount_storage_.at(it->second));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,16 +166,22 @@ namespace RTLIL
|
||||||
global_refcount_storage_.at(idx)++;
|
global_refcount_storage_.at(idx)++;
|
||||||
|
|
||||||
// Avoid Create->Delete->Create pattern
|
// Avoid Create->Delete->Create pattern
|
||||||
static IdString last_created_id;
|
if (last_created_idx_[last_created_idx_ptr_])
|
||||||
put_reference(last_created_id.index_);
|
put_reference(last_created_idx_[last_created_idx_ptr_]);
|
||||||
last_created_id.index_ = idx;
|
last_created_idx_[last_created_idx_ptr_] = idx;
|
||||||
get_reference(last_created_id.index_);
|
get_reference(last_created_idx_[last_created_idx_ptr_]);
|
||||||
|
last_created_idx_ptr_ = (last_created_idx_ptr_ + 1) & 7;
|
||||||
|
|
||||||
if (yosys_xtrace) {
|
if (yosys_xtrace) {
|
||||||
log("#X# New IdString '%s' with index %d.\n", p, idx);
|
log("#X# New IdString '%s' with index %d.\n", p, idx);
|
||||||
log_backtrace("-X- ", yosys_xtrace-1);
|
log_backtrace("-X- ", yosys_xtrace-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef YOSYS_XTRACE_GET_PUT
|
||||||
|
if (yosys_xtrace) {
|
||||||
|
log("#X# GET-BY-NAME '%s' (index %d, refcount %d)\n", global_id_storage_.at(idx), idx, global_refcount_storage_.at(idx));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return idx;
|
return idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,6 +192,12 @@ namespace RTLIL
|
||||||
if (!destruct_guard.ok)
|
if (!destruct_guard.ok)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#ifdef YOSYS_XTRACE_GET_PUT
|
||||||
|
if (yosys_xtrace) {
|
||||||
|
log("#X# PUT '%s' (index %d, refcount %d)\n", global_id_storage_.at(idx), idx, global_refcount_storage_.at(idx));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
log_assert(global_refcount_storage_.at(idx) > 0);
|
log_assert(global_refcount_storage_.at(idx) > 0);
|
||||||
|
|
||||||
if (--global_refcount_storage_.at(idx) != 0)
|
if (--global_refcount_storage_.at(idx) != 0)
|
||||||
|
@ -1282,7 +1336,7 @@ inline bool RTLIL::SigBit::operator<(const RTLIL::SigBit &other) const {
|
||||||
return wire ? (offset < other.offset) : (data < other.data);
|
return wire ? (offset < other.offset) : (data < other.data);
|
||||||
if (wire != nullptr && other.wire != nullptr)
|
if (wire != nullptr && other.wire != nullptr)
|
||||||
return wire->name < other.wire->name;
|
return wire->name < other.wire->name;
|
||||||
return wire < other.wire;
|
return (wire != nullptr) < (other.wire != nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool RTLIL::SigBit::operator==(const RTLIL::SigBit &other) const {
|
inline bool RTLIL::SigBit::operator==(const RTLIL::SigBit &other) const {
|
||||||
|
|
Loading…
Reference in New Issue