Take preferred CSC
This commit is contained in:
parent
6593101d8c
commit
a22ace5e18
@ -2458,33 +2458,33 @@ void NgUltraImpl::postPlace()
|
|||||||
ctx->assignArchInfo();
|
ctx->assignArchInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
BelId getCSC(Context *ctx, Loc l) {
|
BelId getCSC(Context *ctx, Loc l, int row) {
|
||||||
BelId bel = ctx->getBelByLocation(Loc(l.x+1,l.y+2,0));
|
BelId bel = ctx->getBelByLocation(Loc(l.x+1,l.y+2,0));
|
||||||
if (!ctx->getBoundBelCell(bel)) return bel;
|
if (!ctx->getBoundBelCell(bel) && (row==0 || row==1)) return bel;
|
||||||
bel = ctx->getBelByLocation(Loc(l.x+1,l.y+2,15));
|
bel = ctx->getBelByLocation(Loc(l.x+1,l.y+2,15));
|
||||||
if (!ctx->getBoundBelCell(bel)) return bel;
|
if (!ctx->getBoundBelCell(bel) && (row==0 || row==2)) return bel;
|
||||||
bel = ctx->getBelByLocation(Loc(l.x+1,l.y+2,16));
|
bel = ctx->getBelByLocation(Loc(l.x+1,l.y+2,16));
|
||||||
if (!ctx->getBoundBelCell(bel)) return bel;
|
if (!ctx->getBoundBelCell(bel) && (row==0 || row==3)) return bel;
|
||||||
bel = ctx->getBelByLocation(Loc(l.x+1,l.y+2,31));
|
bel = ctx->getBelByLocation(Loc(l.x+1,l.y+2,31));
|
||||||
if (!ctx->getBoundBelCell(bel)) return bel;
|
if (!ctx->getBoundBelCell(bel) && (row==0 || row==4)) return bel;
|
||||||
|
|
||||||
bel = ctx->getBelByLocation(Loc(l.x+2,l.y+3,0));
|
bel = ctx->getBelByLocation(Loc(l.x+2,l.y+3,0));
|
||||||
if (!ctx->getBoundBelCell(bel)) return bel;
|
if (!ctx->getBoundBelCell(bel) && (row==0 || row==1)) return bel;
|
||||||
bel = ctx->getBelByLocation(Loc(l.x+2,l.y+3,15));
|
bel = ctx->getBelByLocation(Loc(l.x+2,l.y+3,15));
|
||||||
if (!ctx->getBoundBelCell(bel)) return bel;
|
if (!ctx->getBoundBelCell(bel) && (row==0 || row==2)) return bel;
|
||||||
bel = ctx->getBelByLocation(Loc(l.x+2,l.y+3,16));
|
bel = ctx->getBelByLocation(Loc(l.x+2,l.y+3,16));
|
||||||
if (!ctx->getBoundBelCell(bel)) return bel;
|
if (!ctx->getBoundBelCell(bel) && (row==0 || row==3)) return bel;
|
||||||
bel = ctx->getBelByLocation(Loc(l.x+2,l.y+3,31));
|
bel = ctx->getBelByLocation(Loc(l.x+2,l.y+3,31));
|
||||||
if (!ctx->getBoundBelCell(bel)) return bel;
|
if (!ctx->getBoundBelCell(bel) && (row==0 || row==4)) return bel;
|
||||||
|
|
||||||
bel = ctx->getBelByLocation(Loc(l.x+3,l.y+2,0));
|
bel = ctx->getBelByLocation(Loc(l.x+3,l.y+2,0));
|
||||||
if (!ctx->getBoundBelCell(bel)) return bel;
|
if (!ctx->getBoundBelCell(bel) && (row==0 || row==1)) return bel;
|
||||||
bel = ctx->getBelByLocation(Loc(l.x+3,l.y+2,15));
|
bel = ctx->getBelByLocation(Loc(l.x+3,l.y+2,15));
|
||||||
if (!ctx->getBoundBelCell(bel)) return bel;
|
if (!ctx->getBoundBelCell(bel) && (row==0 || row==2)) return bel;
|
||||||
bel = ctx->getBelByLocation(Loc(l.x+3,l.y+2,16));
|
bel = ctx->getBelByLocation(Loc(l.x+3,l.y+2,16));
|
||||||
if (!ctx->getBoundBelCell(bel)) return bel;
|
if (!ctx->getBoundBelCell(bel) && (row==0 || row==3)) return bel;
|
||||||
bel = ctx->getBelByLocation(Loc(l.x+3,l.y+2,31));
|
bel = ctx->getBelByLocation(Loc(l.x+3,l.y+2,31));
|
||||||
if (!ctx->getBoundBelCell(bel)) return bel;
|
if (!ctx->getBoundBelCell(bel) && (row==0 || row==4)) return bel;
|
||||||
return BelId();
|
return BelId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2514,12 +2514,13 @@ void NgUltraPacker::insert_csc()
|
|||||||
for (std::size_t i = 0; i < std::min<std::size_t>(fanout.size(),available_csc ); i++) {
|
for (std::size_t i = 0; i < std::min<std::size_t>(fanout.size(),available_csc ); i++) {
|
||||||
auto &n = fanout.at(i);
|
auto &n = fanout.at(i);
|
||||||
if (lsm.second[n.second].size() < 4) break;
|
if (lsm.second[n.second].size() < 4) break;
|
||||||
BelId newbel = getCSC(ctx,loc);
|
|
||||||
if (newbel==BelId()) break;
|
|
||||||
|
|
||||||
NetInfo *net = ctx->nets.at(n.second).get();
|
NetInfo *net = ctx->nets.at(n.second).get();
|
||||||
CellInfo *cell = net->driver.cell;
|
CellInfo *cell = net->driver.cell;
|
||||||
if (uarch->tile_name(cell->bel.tile) == lsm.first.c_str(ctx) && !cell->params.count(id_dff_used) && cell->cluster == ClusterId()) {
|
if (uarch->tile_name(cell->bel.tile) == lsm.first.c_str(ctx) && !cell->params.count(id_dff_used) && cell->cluster == ClusterId()) {
|
||||||
|
BelId newbel = getCSC(ctx,loc,0);
|
||||||
|
if (newbel==BelId()) break;
|
||||||
|
|
||||||
ctx->unbindBel(cell->bel);
|
ctx->unbindBel(cell->bel);
|
||||||
cell->disconnectPort(id_LO);
|
cell->disconnectPort(id_LO);
|
||||||
NetInfo *new_out = ctx->createNet(ctx->id(cell->name.str(ctx) + "$o"));
|
NetInfo *new_out = ctx->createNet(ctx->id(cell->name.str(ctx) + "$o"));
|
||||||
@ -2534,7 +2535,10 @@ void NgUltraPacker::insert_csc()
|
|||||||
change_to_csc++;
|
change_to_csc++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
Loc cell_loc = ctx->getBelLocation(cell->bel);
|
||||||
|
BelId newbel = getCSC(ctx,loc,(cell_loc.y & 3)+1); // Take CSC from pefered row
|
||||||
|
if (newbel==BelId()) newbel = getCSC(ctx,loc,0); // Try getting any other CSC
|
||||||
|
if (newbel==BelId()) break;
|
||||||
|
|
||||||
CellInfo *fe = create_cell_ptr(id_BEYOND_FE, ctx->id(net->name.str(ctx) + "$" + lsm.first.c_str(ctx) + "$csc"));
|
CellInfo *fe = create_cell_ptr(id_BEYOND_FE, ctx->id(net->name.str(ctx) + "$" + lsm.first.c_str(ctx) + "$csc"));
|
||||||
NetInfo *new_out = ctx->createNet(ctx->id(fe->name.str(ctx) + "$o"));
|
NetInfo *new_out = ctx->createNet(ctx->id(fe->name.str(ctx) + "$o"));
|
||||||
|
Loading…
Reference in New Issue
Block a user