mirror of
https://github.com/YosysHQ/yosys
synced 2025-11-08 23:35:08 +00:00
Remove direct RTLIL access from gate_t
This commit is contained in:
parent
222f457a04
commit
38f8165c80
1 changed files with 30 additions and 24 deletions
|
|
@ -104,8 +104,10 @@ struct gate_t
|
||||||
gate_type_t type;
|
gate_type_t type;
|
||||||
int in1, in2, in3, in4;
|
int in1, in2, in3, in4;
|
||||||
bool is_port;
|
bool is_port;
|
||||||
RTLIL::SigBit bit;
|
bool bit_is_wire;
|
||||||
|
bool bit_is_1;
|
||||||
RTLIL::State init;
|
RTLIL::State init;
|
||||||
|
std::string bit_str;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool map_mux4;
|
bool map_mux4;
|
||||||
|
|
@ -156,6 +158,7 @@ struct AbcModuleState {
|
||||||
|
|
||||||
int map_autoidx = 0;
|
int map_autoidx = 0;
|
||||||
std::vector<gate_t> signal_list;
|
std::vector<gate_t> signal_list;
|
||||||
|
std::vector<RTLIL::SigBit> signal_bits;
|
||||||
dict<RTLIL::SigBit, int> signal_map;
|
dict<RTLIL::SigBit, int> signal_map;
|
||||||
FfInitVals &initvals;
|
FfInitVals &initvals;
|
||||||
bool had_init = false;
|
bool had_init = false;
|
||||||
|
|
@ -204,10 +207,13 @@ int AbcModuleState::map_signal(const AbcSigMap &assign_map, RTLIL::SigBit bit, g
|
||||||
gate.in3 = -1;
|
gate.in3 = -1;
|
||||||
gate.in4 = -1;
|
gate.in4 = -1;
|
||||||
gate.is_port = bit.wire != nullptr && val.is_port;
|
gate.is_port = bit.wire != nullptr && val.is_port;
|
||||||
gate.bit = bit;
|
gate.bit_is_wire = bit.wire != nullptr;
|
||||||
|
gate.bit_is_1 = bit == State::S1;
|
||||||
gate.init = initvals(bit);
|
gate.init = initvals(bit);
|
||||||
signal_list.push_back(gate);
|
gate.bit_str = std::string(log_signal(bit));
|
||||||
signal_map[bit] = gate.id;
|
signal_map[bit] = gate.id;
|
||||||
|
signal_list.push_back(std::move(gate));
|
||||||
|
signal_bits.push_back(bit);
|
||||||
}
|
}
|
||||||
|
|
||||||
gate_t &gate = signal_list[signal_map[bit]];
|
gate_t &gate = signal_list[signal_map[bit]];
|
||||||
|
|
@ -463,17 +469,17 @@ std::string AbcModuleState::remap_name(RTLIL::IdString abc_name, RTLIL::Wire **o
|
||||||
|
|
||||||
if (sid < GetSize(signal_list))
|
if (sid < GetSize(signal_list))
|
||||||
{
|
{
|
||||||
auto sig = signal_list.at(sid);
|
const auto &bit = signal_bits.at(sid);
|
||||||
if (sig.bit.wire != nullptr)
|
if (bit.wire != nullptr)
|
||||||
{
|
{
|
||||||
std::string s = stringf("$abc$%d$%s", map_autoidx, sig.bit.wire->name.c_str()+1);
|
std::string s = stringf("$abc$%d$%s", map_autoidx, bit.wire->name.c_str()+1);
|
||||||
if (sig.bit.wire->width != 1)
|
if (bit.wire->width != 1)
|
||||||
s += stringf("[%d]", sig.bit.offset);
|
s += stringf("[%d]", bit.offset);
|
||||||
if (isnew)
|
if (isnew)
|
||||||
s += "_new";
|
s += "_new";
|
||||||
s += postfix;
|
s += postfix;
|
||||||
if (orig_wire != nullptr)
|
if (orig_wire != nullptr)
|
||||||
*orig_wire = sig.bit.wire;
|
*orig_wire = bit.wire;
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -501,7 +507,7 @@ void AbcModuleState::dump_loop_graph(FILE *f, int &nr, dict<int, pool<int>> &edg
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto n : nodes)
|
for (auto n : nodes)
|
||||||
fprintf(f, " ys__n%d [label=\"%s\\nid=%d, count=%d\"%s];\n", n, log_signal(signal_list[n].bit),
|
fprintf(f, " ys__n%d [label=\"%s\\nid=%d, count=%d\"%s];\n", n, signal_list[n].bit_str.c_str(),
|
||||||
n, in_counts[n], workpool.count(n) ? ", shape=box" : "");
|
n, in_counts[n], workpool.count(n) ? ", shape=box" : "");
|
||||||
|
|
||||||
for (auto &e : edges)
|
for (auto &e : edges)
|
||||||
|
|
@ -562,7 +568,7 @@ void AbcModuleState::handle_loops(AbcSigMap &assign_map, RTLIL::Module *module)
|
||||||
int id = *workpool.begin();
|
int id = *workpool.begin();
|
||||||
workpool.erase(id);
|
workpool.erase(id);
|
||||||
|
|
||||||
// log("Removing non-loop node %d from graph: %s\n", id, log_signal(signal_list[id].bit));
|
// log("Removing non-loop node %d from graph: %s\n", id, signal_list[id].bit_str);
|
||||||
|
|
||||||
for (int id2 : edges[id]) {
|
for (int id2 : edges[id]) {
|
||||||
log_assert(in_edges_count[id2] > 0);
|
log_assert(in_edges_count[id2] > 0);
|
||||||
|
|
@ -582,8 +588,8 @@ void AbcModuleState::handle_loops(AbcSigMap &assign_map, RTLIL::Module *module)
|
||||||
|
|
||||||
for (auto &edge_it : edges) {
|
for (auto &edge_it : edges) {
|
||||||
int id2 = edge_it.first;
|
int id2 = edge_it.first;
|
||||||
RTLIL::Wire *w1 = signal_list[id1].bit.wire;
|
RTLIL::Wire *w1 = signal_bits[id1].wire;
|
||||||
RTLIL::Wire *w2 = signal_list[id2].bit.wire;
|
RTLIL::Wire *w2 = signal_bits[id2].wire;
|
||||||
if (w1 == nullptr)
|
if (w1 == nullptr)
|
||||||
id1 = id2;
|
id1 = id2;
|
||||||
else if (w2 == nullptr)
|
else if (w2 == nullptr)
|
||||||
|
|
@ -605,7 +611,7 @@ void AbcModuleState::handle_loops(AbcSigMap &assign_map, RTLIL::Module *module)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_assert(signal_list[id1].bit.wire != nullptr);
|
log_assert(signal_bits[id1].wire != nullptr);
|
||||||
|
|
||||||
std::stringstream sstr;
|
std::stringstream sstr;
|
||||||
sstr << "$abcloop$" << (autoidx++);
|
sstr << "$abcloop$" << (autoidx++);
|
||||||
|
|
@ -615,10 +621,10 @@ void AbcModuleState::handle_loops(AbcSigMap &assign_map, RTLIL::Module *module)
|
||||||
for (int id2 : edges[id1]) {
|
for (int id2 : edges[id1]) {
|
||||||
if (first_line)
|
if (first_line)
|
||||||
log("Breaking loop using new signal %s: %s -> %s\n", log_signal(RTLIL::SigSpec(wire)),
|
log("Breaking loop using new signal %s: %s -> %s\n", log_signal(RTLIL::SigSpec(wire)),
|
||||||
log_signal(signal_list[id1].bit), log_signal(signal_list[id2].bit));
|
signal_list[id1].bit_str, signal_list[id2].bit_str);
|
||||||
else
|
else
|
||||||
log(" %*s %s -> %s\n", int(strlen(log_signal(RTLIL::SigSpec(wire)))), "",
|
log(" %*s %s -> %s\n", int(strlen(log_signal(RTLIL::SigSpec(wire)))), "",
|
||||||
log_signal(signal_list[id1].bit), log_signal(signal_list[id2].bit));
|
signal_list[id1].bit_str, signal_list[id2].bit_str);
|
||||||
first_line = false;
|
first_line = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -641,7 +647,7 @@ void AbcModuleState::handle_loops(AbcSigMap &assign_map, RTLIL::Module *module)
|
||||||
}
|
}
|
||||||
edges[id1].swap(edges[id3]);
|
edges[id1].swap(edges[id3]);
|
||||||
|
|
||||||
connect(assign_map, module, RTLIL::SigSig(signal_list[id3].bit, signal_list[id1].bit));
|
connect(assign_map, module, RTLIL::SigSig(signal_bits[id3], signal_bits[id1]));
|
||||||
dump_loop_graph(dot_f, dot_nr, edges, workpool, in_edges_count);
|
dump_loop_graph(dot_f, dot_nr, edges, workpool, in_edges_count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1006,7 +1012,7 @@ void AbcModuleState::run_abc()
|
||||||
if (!si.is_port || si.type != G(NONE))
|
if (!si.is_port || si.type != G(NONE))
|
||||||
continue;
|
continue;
|
||||||
fprintf(f, " ys__n%d", si.id);
|
fprintf(f, " ys__n%d", si.id);
|
||||||
pi_map[count_input++] = log_signal(si.bit);
|
pi_map[count_input++] = si.bit_str;
|
||||||
}
|
}
|
||||||
if (count_input == 0)
|
if (count_input == 0)
|
||||||
fprintf(f, " dummy_input\n");
|
fprintf(f, " dummy_input\n");
|
||||||
|
|
@ -1018,17 +1024,17 @@ void AbcModuleState::run_abc()
|
||||||
if (!si.is_port || si.type == G(NONE))
|
if (!si.is_port || si.type == G(NONE))
|
||||||
continue;
|
continue;
|
||||||
fprintf(f, " ys__n%d", si.id);
|
fprintf(f, " ys__n%d", si.id);
|
||||||
po_map[count_output++] = log_signal(si.bit);
|
po_map[count_output++] = si.bit_str;
|
||||||
}
|
}
|
||||||
fprintf(f, "\n");
|
fprintf(f, "\n");
|
||||||
|
|
||||||
for (auto &si : signal_list)
|
for (auto &si : signal_list)
|
||||||
fprintf(f, "# ys__n%-5d %s\n", si.id, log_signal(si.bit));
|
fprintf(f, "# ys__n%-5d %s\n", si.id, si.bit_str.c_str());
|
||||||
|
|
||||||
for (auto &si : signal_list) {
|
for (auto &si : signal_list) {
|
||||||
if (si.bit.wire == nullptr) {
|
if (!si.bit_is_wire) {
|
||||||
fprintf(f, ".names ys__n%d\n", si.id);
|
fprintf(f, ".names ys__n%d\n", si.id);
|
||||||
if (si.bit == RTLIL::State::S1)
|
if (si.bit_is_1)
|
||||||
fprintf(f, "1\n");
|
fprintf(f, "1\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1503,12 +1509,12 @@ void AbcModuleState::extract(AbcSigMap &assign_map, RTLIL::Design *design, RTLIL
|
||||||
snprintf(buffer, 100, "\\ys__n%d", si.id);
|
snprintf(buffer, 100, "\\ys__n%d", si.id);
|
||||||
RTLIL::SigSig conn;
|
RTLIL::SigSig conn;
|
||||||
if (si.type != G(NONE)) {
|
if (si.type != G(NONE)) {
|
||||||
conn.first = si.bit;
|
conn.first = signal_bits[si.id];
|
||||||
conn.second = module->wire(remap_name(buffer));
|
conn.second = module->wire(remap_name(buffer));
|
||||||
out_wires++;
|
out_wires++;
|
||||||
} else {
|
} else {
|
||||||
conn.first = module->wire(remap_name(buffer));
|
conn.first = module->wire(remap_name(buffer));
|
||||||
conn.second = si.bit;
|
conn.second = signal_bits[si.id];
|
||||||
in_wires++;
|
in_wires++;
|
||||||
}
|
}
|
||||||
connect(assign_map, module, conn);
|
connect(assign_map, module, conn);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue