mirror of https://github.com/YosysHQ/yosys.git
abc9: fix abc9_arrival for flops
This commit is contained in:
parent
00d41905df
commit
f7c0dbecee
|
@ -643,7 +643,6 @@ struct XAigerWriter
|
||||||
write_s_buffer(ff_bits.size());
|
write_s_buffer(ff_bits.size());
|
||||||
|
|
||||||
for (const auto &i : ff_bits) {
|
for (const auto &i : ff_bits) {
|
||||||
const SigBit &d = i.first;
|
|
||||||
const Cell *cell = i.second;
|
const Cell *cell = i.second;
|
||||||
|
|
||||||
int mergeability = cell->attributes.at(ID(abc9_mergeability)).as_int();
|
int mergeability = cell->attributes.at(ID(abc9_mergeability)).as_int();
|
||||||
|
@ -661,7 +660,11 @@ struct XAigerWriter
|
||||||
write_s_buffer(0);
|
write_s_buffer(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
write_i_buffer(arrival_times.at(d, 0));
|
auto it = cell->attributes.find(ID(abc9_arrival));
|
||||||
|
if (it != cell->attributes.end())
|
||||||
|
write_i_buffer(it->second.as_int());
|
||||||
|
else
|
||||||
|
write_i_buffer(0);
|
||||||
//write_o_buffer(0);
|
//write_o_buffer(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -254,13 +254,19 @@ void prep_xaiger(RTLIL::Module *module, bool dff)
|
||||||
|
|
||||||
SigMap sigmap(module);
|
SigMap sigmap(module);
|
||||||
|
|
||||||
|
dict<SigBit, Cell*> abc9_ff_d;
|
||||||
dict<SigBit, pool<IdString>> bit_drivers, bit_users;
|
dict<SigBit, pool<IdString>> bit_drivers, bit_users;
|
||||||
TopoSort<IdString, RTLIL::sort_by_id_str> toposort;
|
TopoSort<IdString, RTLIL::sort_by_id_str> toposort;
|
||||||
dict<IdString, std::vector<IdString>> box_ports;
|
dict<IdString, std::vector<IdString>> box_ports;
|
||||||
|
|
||||||
for (auto cell : module->cells()) {
|
for (auto cell : module->cells()) {
|
||||||
if (cell->type == "$__ABC9_FF_")
|
if (cell->type == "$__ABC9_FF_") {
|
||||||
|
auto d = sigmap(cell->getPort(ID(D)));
|
||||||
|
auto r = abc9_ff_d.insert(d);
|
||||||
|
log_assert(r.second);
|
||||||
|
r.first->second = cell;
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
if (cell->has_keep_attr())
|
if (cell->has_keep_attr())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -357,6 +363,7 @@ void prep_xaiger(RTLIL::Module *module, bool dff)
|
||||||
|
|
||||||
IdString derived_type = box_module->derive(design, cell->parameters);
|
IdString derived_type = box_module->derive(design, cell->parameters);
|
||||||
box_module = design->module(derived_type);
|
box_module = design->module(derived_type);
|
||||||
|
auto abc9_flop = box_module->get_bool_attribute("\\abc9_flop");
|
||||||
|
|
||||||
auto r = cell_cache.insert(derived_type);
|
auto r = cell_cache.insert(derived_type);
|
||||||
auto &holes_cell = r.first->second;
|
auto &holes_cell = r.first->second;
|
||||||
|
@ -395,7 +402,7 @@ void prep_xaiger(RTLIL::Module *module, bool dff)
|
||||||
|
|
||||||
// For flops only, create an extra 1-bit input that drives a new wire
|
// For flops only, create an extra 1-bit input that drives a new wire
|
||||||
// called "<cell>.abc9_ff.Q" that is used below
|
// called "<cell>.abc9_ff.Q" that is used below
|
||||||
if (box_module->get_bool_attribute("\\abc9_flop")) {
|
if (abc9_flop) {
|
||||||
box_inputs++;
|
box_inputs++;
|
||||||
Wire *holes_wire = holes_module->wire(stringf("\\i%d", box_inputs));
|
Wire *holes_wire = holes_module->wire(stringf("\\i%d", box_inputs));
|
||||||
if (!holes_wire) {
|
if (!holes_wire) {
|
||||||
|
@ -425,6 +432,28 @@ void prep_xaiger(RTLIL::Module *module, bool dff)
|
||||||
holes_module->connect(holes_wire, holes_cell->getPort(port_name));
|
holes_module->connect(holes_wire, holes_cell->getPort(port_name));
|
||||||
else // blackbox
|
else // blackbox
|
||||||
holes_module->connect(holes_wire, Const(State::S0, GetSize(w)));
|
holes_module->connect(holes_wire, Const(State::S0, GetSize(w)));
|
||||||
|
|
||||||
|
// Transfer abc9_arrival value from flop box output to $__ABC9_FF_ cell
|
||||||
|
if (abc9_flop) {
|
||||||
|
auto it = w->attributes.find(ID(abc9_arrival));
|
||||||
|
if (it == w->attributes.end())
|
||||||
|
continue;
|
||||||
|
auto jt = cell->connections_.find(port_name);
|
||||||
|
if (jt == cell->connections_.end())
|
||||||
|
continue;
|
||||||
|
auto kt = abc9_ff_d.find(jt->second);
|
||||||
|
if (kt == abc9_ff_d.end())
|
||||||
|
continue;
|
||||||
|
#ifndef NDEBUG
|
||||||
|
if (ys_debug(1)) {
|
||||||
|
static std::set<std::pair<IdString,IdString>> seen;
|
||||||
|
if (seen.emplace(cell->type, port_name).second) log("%s.%s abc9_arrival = %d\n", log_id(cell->type), log_id(port_name), it->second.as_int());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
auto r = kt->second->attributes.insert(ID(abc9_arrival));
|
||||||
|
log_assert(r.second);
|
||||||
|
r.first->second = it->second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue