Improve large DFF chains
This commit is contained in:
parent
dddf12a42b
commit
f1137764cd
@ -385,7 +385,7 @@ void NgUltraPacker::pack_xluts(void)
|
|||||||
void NgUltraPacker::pack_multi_dffs(void)
|
void NgUltraPacker::pack_multi_dffs(void)
|
||||||
{
|
{
|
||||||
log_info("Pack multi DFFs...\n");
|
log_info("Pack multi DFFs...\n");
|
||||||
std::vector<CellInfo*> dff_chain_start;
|
std::vector<std::pair<CellInfo*, std::vector<CellInfo*>>> dff_chain_start;
|
||||||
for (auto &cell : ctx->cells) {
|
for (auto &cell : ctx->cells) {
|
||||||
CellInfo &ci = *cell.second;
|
CellInfo &ci = *cell.second;
|
||||||
if (!ci.type.in(id_NX_DFF))
|
if (!ci.type.in(id_NX_DFF))
|
||||||
@ -394,24 +394,34 @@ void NgUltraPacker::pack_multi_dffs(void)
|
|||||||
if (!inp || (inp->driver.cell && inp->driver.cell->type.in(id_NX_DFF))) continue;
|
if (!inp || (inp->driver.cell && inp->driver.cell->type.in(id_NX_DFF))) continue;
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
CellInfo *dff = &ci;
|
CellInfo *dff = &ci;
|
||||||
|
std::vector<CellInfo*> chain;
|
||||||
|
CellInfo* start_dff = &ci;
|
||||||
while(1) {
|
while(1) {
|
||||||
NetInfo *o = dff->getPort(id_O);
|
NetInfo *o = dff->getPort(id_O);
|
||||||
if (o->users.entries() != 1) break;
|
if (o->users.entries() != 1) break;
|
||||||
dff = (*o->users.begin()).cell;
|
dff = (*o->users.begin()).cell;
|
||||||
if (dff->type == id_NX_DFF && (*o->users.begin()).port == id_I) {
|
if (dff->type == id_NX_DFF && (*o->users.begin()).port == id_I) {
|
||||||
|
if (cnt==95) { // note that start_dff is also part of chain
|
||||||
|
dff_chain_start.push_back(make_pair(start_dff, chain));
|
||||||
|
cnt = 0;
|
||||||
|
start_dff = dff;
|
||||||
|
chain.clear();
|
||||||
|
} else {
|
||||||
|
chain.push_back(dff);
|
||||||
cnt++;
|
cnt++;
|
||||||
|
}
|
||||||
} else break;
|
} else break;
|
||||||
}
|
}
|
||||||
if (cnt)
|
if (cnt)
|
||||||
dff_chain_start.push_back(&ci);
|
dff_chain_start.push_back(make_pair(start_dff, chain));
|
||||||
}
|
}
|
||||||
|
|
||||||
int dff_only = 0, lut_and_ff = 0;
|
int dff_only = 0, lut_and_ff = 0;
|
||||||
for (auto dff : dff_chain_start) {
|
for (auto ch : dff_chain_start) {
|
||||||
|
CellInfo *dff = ch.first;
|
||||||
CellInfo *root = create_cell_ptr(id_BEYOND_FE, ctx->id(dff->name.str(ctx) + "$fe"));
|
CellInfo *root = create_cell_ptr(id_BEYOND_FE, ctx->id(dff->name.str(ctx) + "$fe"));
|
||||||
root->cluster = root->name;
|
root->cluster = root->name;
|
||||||
NetInfo *net = dff->getPort(id_I);
|
NetInfo *net = dff->getPort(id_I);
|
||||||
NetInfo *o = dff->getPort(id_O);
|
|
||||||
if (net && net->driver.cell->type == id_NX_LUT && net->users.entries()==1) {
|
if (net && net->driver.cell->type == id_NX_LUT && net->users.entries()==1) {
|
||||||
CellInfo *lut = net->driver.cell;
|
CellInfo *lut = net->driver.cell;
|
||||||
if (!lut->params.count(id_lut_table))
|
if (!lut->params.count(id_lut_table))
|
||||||
@ -426,11 +436,7 @@ void NgUltraPacker::pack_multi_dffs(void)
|
|||||||
packed_cells.insert(dff->name);
|
packed_cells.insert(dff->name);
|
||||||
++dff_only;
|
++dff_only;
|
||||||
}
|
}
|
||||||
while(1) {
|
for(auto dff : ch.second) {
|
||||||
if (o->users.entries() != 1) break;
|
|
||||||
dff = (*o->users.begin()).cell;
|
|
||||||
if (!(dff->type == id_NX_DFF && (*o->users.begin()).port == id_I)) break;
|
|
||||||
o = dff->getPort(id_O);
|
|
||||||
CellInfo *new_cell = create_cell_ptr(id_BEYOND_FE, ctx->id(dff->name.str(ctx) + "$fe"));
|
CellInfo *new_cell = create_cell_ptr(id_BEYOND_FE, ctx->id(dff->name.str(ctx) + "$fe"));
|
||||||
dff_to_fe(dff, new_cell, true);
|
dff_to_fe(dff, new_cell, true);
|
||||||
++dff_only;
|
++dff_only;
|
||||||
|
Loading…
Reference in New Issue
Block a user