Skip to content

Commit

Permalink
Speed up OptMergePass by 1.7x.
Browse files Browse the repository at this point in the history
The main speedup comes from swithing from using a SHA1 hash to std::hash<std::string>. There is no need to use an expensive cryptographic hash for fingerprinting in this context.
  • Loading branch information
rmlarsen committed Oct 2, 2023
1 parent 7aa26b3 commit bce984f
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 12 deletions.
10 changes: 5 additions & 5 deletions kernel/celltypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ struct CellTypes
setup_stdcells_mem();
}

void setup_type(RTLIL::IdString type, const pool<RTLIL::IdString> &inputs, const pool<RTLIL::IdString> &outputs, bool is_evaluable = false)
void setup_type(const RTLIL::IdString& type, const pool<RTLIL::IdString> &inputs, const pool<RTLIL::IdString> &outputs, bool is_evaluable = false)
{
CellType ct = {type, inputs, outputs, is_evaluable};
cell_types[ct.type] = ct;
Expand Down Expand Up @@ -298,24 +298,24 @@ struct CellTypes
cell_types.clear();
}

bool cell_known(RTLIL::IdString type) const
bool cell_known(const RTLIL::IdString& type) const
{
return cell_types.count(type) != 0;
}

bool cell_output(RTLIL::IdString type, RTLIL::IdString port) const
bool cell_output(const RTLIL::IdString& type, const RTLIL::IdString& port) const
{
auto it = cell_types.find(type);
return it != cell_types.end() && it->second.outputs.count(port) != 0;
}

bool cell_input(RTLIL::IdString type, RTLIL::IdString port) const
bool cell_input(const RTLIL::IdString& type, const RTLIL::IdString& port) const
{
auto it = cell_types.find(type);
return it != cell_types.end() && it->second.inputs.count(port) != 0;
}

bool cell_evaluable(RTLIL::IdString type) const
bool cell_evaluable(const RTLIL::IdString& type) const
{
auto it = cell_types.find(type);
return it != cell_types.end() && it->second.is_evaluable;
Expand Down
6 changes: 5 additions & 1 deletion kernel/rtlil.h
Original file line number Diff line number Diff line change
Expand Up @@ -308,10 +308,14 @@ namespace RTLIL
bool operator!=(const char *rhs) const { return strcmp(c_str(), rhs) != 0; }

char operator[](size_t i) const {
const char *p = c_str();
const char *p = c_str();
#ifndef NDEBUG
for (; i != 0; i--, p++)
log_assert(*p != 0);
return *p;
#else
return *(p + i);
#endif
}

std::string substr(size_t pos = 0, size_t len = std::string::npos) const {
Expand Down
11 changes: 5 additions & 6 deletions passes/opt/opt_merge.cc
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ struct OptMergeWorker

CellTypes ct;
int total_count;
SHA1 checksum;
using FingerPrint = std::hash<std::string>::result_type;

static void sort_pmux_conn(dict<RTLIL::IdString, RTLIL::SigSpec> &conn)
{
Expand Down Expand Up @@ -78,7 +78,7 @@ struct OptMergeWorker
return str;
}

std::string hash_cell_parameters_and_connections(const RTLIL::Cell *cell)
FingerPrint hash_cell_parameters_and_connections(const RTLIL::Cell *cell)
{
vector<string> hash_conn_strings;
std::string hash_string = cell->type.str() + "\n";
Expand Down Expand Up @@ -149,8 +149,7 @@ struct OptMergeWorker
for (auto it : hash_conn_strings)
hash_string += it;

checksum.update(hash_string);
return checksum.final();
return std::hash<std::string>{}(hash_string);
}

bool compare_cell_parameters_and_connections(const RTLIL::Cell *cell1, const RTLIL::Cell *cell2)
Expand Down Expand Up @@ -268,13 +267,13 @@ struct OptMergeWorker
}

did_something = false;
dict<std::string, RTLIL::Cell*> sharemap;
std::unordered_map<FingerPrint, RTLIL::Cell*> sharemap;
for (auto cell : cells)
{
if ((!mode_share_all && !ct.cell_known(cell->type)) || !cell->known())
continue;

auto hash = hash_cell_parameters_and_connections(cell);
FingerPrint hash = hash_cell_parameters_and_connections(cell);
auto r = sharemap.insert(std::make_pair(hash, cell));
if (!r.second) {
if (compare_cell_parameters_and_connections(cell, r.first->second)) {
Expand Down

0 comments on commit bce984f

Please sign in to comment.