write_s_buffer(ff_bits.size());
dict<SigBit, int> clk_to_mergeability;
+ for (const auto &i : ff_bits) {
+ const Cell *cell = i.second;
+ log_assert(cell->type.in(ID($_DFF_N_), ID($_DFF_P_)));
+
+ SigBit clock = sigmap(cell->getPort(ID::C));
+ clk_to_mergeability.insert(std::make_pair(clock, clk_to_mergeability.size()*2+1));
+ }
for (const auto &i : ff_bits) {
const SigBit &d = i.first;
const Cell *cell = i.second;
- log_assert(cell->type.in(ID($_DFF_N_), ID($_DFF_P_)));
-
SigBit clock = sigmap(cell->getPort(ID::C));
- auto r = clk_to_mergeability.insert(std::make_pair(clock, clk_to_mergeability.size() + 1));
- int mergeability = r.first->second;
+ int mergeability = clk_to_mergeability.at(clock);
log_assert(mergeability > 0);
if (cell->type == ID($_DFF_N_))
- write_r_buffer(-mergeability);
- else if (cell->type == ID($_DFF_P_))
write_r_buffer(mergeability);
+ else if (cell->type == ID($_DFF_P_))
+ write_r_buffer(mergeability+1);
else log_abort();
SigBit Q = sigmap(cell->getPort(ID::Q));
Cell* ff;
int clock_index = mergeability[i];
- if (clock_index < 0) {
+ if (clock_index & 1) {
ff = module->addCell(NEW_ID, ID($_DFF_N_));
- clock_index = -clock_index;
+ clock_index--;
}
- else if (clock_index > 0)
+ else
ff = module->addCell(NEW_ID, ID($_DFF_P_));
- else log_abort();
auto r = mergeability_to_clock.insert(clock_index);
if (r.second)
r.first->second = module->addWire(NEW_ID);