Skip to content

Commit fc2cb32

Browse files
KrystalDelusionwidlarizer
authored andcommitted
autoname.cc: Avoid int overflow
1 parent f45255f commit fc2cb32

File tree

1 file changed

+42
-25
lines changed

1 file changed

+42
-25
lines changed

passes/cmds/autoname.cc

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,24 @@
2222
USING_YOSYS_NAMESPACE
2323
PRIVATE_NAMESPACE_BEGIN
2424

25-
int autoname_worker(Module *module, const dict<Wire*, int>& wire_score)
25+
typedef struct name_proposal {
26+
string name;
27+
unsigned int score;
28+
name_proposal() : name(""), score(-1) { }
29+
name_proposal(string name, unsigned int score) : name(name), score(score) { }
30+
bool operator<(const name_proposal &other) const {
31+
if (score != other.score)
32+
return score < other.score;
33+
else
34+
return name.length() < other.name.length();
35+
}
36+
} name_proposal;
37+
38+
int autoname_worker(Module *module, const dict<Wire*, unsigned int>& wire_score)
2639
{
27-
dict<Cell*, pair<int, string>> proposed_cell_names;
28-
dict<Wire*, pair<int, string>> proposed_wire_names;
29-
int best_score = -1;
40+
dict<Cell*, name_proposal> proposed_cell_names;
41+
dict<Wire*, name_proposal> proposed_wire_names;
42+
name_proposal best_name;
3043

3144
for (auto cell : module->selected_cells()) {
3245
if (cell->name[0] == '$') {
@@ -36,14 +49,14 @@ int autoname_worker(Module *module, const dict<Wire*, int>& wire_score)
3649
if (bit.wire != nullptr && bit.wire->name[0] != '$') {
3750
if (suffix.empty())
3851
suffix = stringf("_%s_%s", log_id(cell->type), log_id(conn.first));
39-
string new_name(bit.wire->name.str() + suffix);
40-
int score = wire_score.at(bit.wire);
41-
if (cell->output(conn.first)) score = 0;
42-
score = 10000*score + new_name.size();
43-
if (!proposed_cell_names.count(cell) || score < proposed_cell_names.at(cell).first) {
44-
if (best_score < 0 || score < best_score)
45-
best_score = score;
46-
proposed_cell_names[cell] = make_pair(score, new_name);
52+
name_proposal proposed_name(
53+
bit.wire->name.str() + suffix,
54+
cell->output(conn.first) ? 0 : wire_score.at(bit.wire)
55+
);
56+
if (!proposed_cell_names.count(cell) || proposed_name < proposed_cell_names.at(cell)) {
57+
if (proposed_name < best_name)
58+
best_name = proposed_name;
59+
proposed_cell_names[cell] = proposed_name;
4760
}
4861
}
4962
}
@@ -54,32 +67,36 @@ int autoname_worker(Module *module, const dict<Wire*, int>& wire_score)
5467
if (bit.wire != nullptr && bit.wire->name[0] == '$' && !bit.wire->port_id) {
5568
if (suffix.empty())
5669
suffix = stringf("_%s", log_id(conn.first));
57-
string new_name(cell->name.str() + suffix);
58-
int score = wire_score.at(bit.wire);
59-
if (cell->output(conn.first)) score = 0;
60-
score = 10000*score + new_name.size();
61-
if (!proposed_wire_names.count(bit.wire) || score < proposed_wire_names.at(bit.wire).first) {
62-
if (best_score < 0 || score < best_score)
63-
best_score = score;
64-
proposed_wire_names[bit.wire] = make_pair(score, new_name);
70+
name_proposal proposed_name(
71+
cell->name.str() + suffix,
72+
cell->output(conn.first) ? 0 : wire_score.at(bit.wire)
73+
);
74+
if (!proposed_wire_names.count(bit.wire) || proposed_name < proposed_wire_names.at(bit.wire)) {
75+
if (proposed_name < best_name)
76+
best_name = proposed_name;
77+
proposed_wire_names[bit.wire] = proposed_name;
6578
}
6679
}
6780
}
6881
}
6982
}
7083

84+
// compare against double best score for following comparisons so we don't
85+
// pre-empt a future iteration
86+
best_name.score *= 2;
87+
7188
for (auto &it : proposed_cell_names) {
72-
if (best_score*2 < it.second.first)
89+
if (best_name < it.second)
7390
continue;
74-
IdString n = module->uniquify(IdString(it.second.second));
91+
IdString n = module->uniquify(IdString(it.second.name));
7592
log_debug("Rename cell %s in %s to %s.\n", log_id(it.first), log_id(module), log_id(n));
7693
module->rename(it.first, n);
7794
}
7895

7996
for (auto &it : proposed_wire_names) {
80-
if (best_score*2 < it.second.first)
97+
if (best_name < it.second)
8198
continue;
82-
IdString n = module->uniquify(IdString(it.second.second));
99+
IdString n = module->uniquify(IdString(it.second.name));
83100
log_debug("Rename wire %s in %s to %s.\n", log_id(it.first), log_id(module), log_id(n));
84101
module->rename(it.first, n);
85102
}
@@ -115,7 +132,7 @@ struct AutonamePass : public Pass {
115132

116133
for (auto module : design->selected_modules())
117134
{
118-
dict<Wire*, int> wire_score;
135+
dict<Wire*, unsigned int> wire_score;
119136
for (auto cell : module->selected_cells())
120137
for (auto &conn : cell->connections())
121138
for (auto bit : conn.second)

0 commit comments

Comments
 (0)