refactor to use create_cell_ptr only
This commit is contained in:
parent
f88532147b
commit
ea478eec2c
@ -25,31 +25,6 @@
|
|||||||
|
|
||||||
NEXTPNR_NAMESPACE_BEGIN
|
NEXTPNR_NAMESPACE_BEGIN
|
||||||
|
|
||||||
std::unique_ptr<CellInfo> NgUltraPacker::create_cell(IdString type, IdString name)
|
|
||||||
{
|
|
||||||
auto cell = std::make_unique<CellInfo>(ctx, name, type);
|
|
||||||
|
|
||||||
auto add_port = [&](const IdString id, PortType dir) {
|
|
||||||
cell->ports[id].name = id;
|
|
||||||
cell->ports[id].type = dir;
|
|
||||||
};
|
|
||||||
if (type == id_BEYOND_FE) {
|
|
||||||
add_port(id_I1, PORT_IN);
|
|
||||||
add_port(id_I2, PORT_IN);
|
|
||||||
add_port(id_I3, PORT_IN);
|
|
||||||
add_port(id_I4, PORT_IN);
|
|
||||||
add_port(id_LO, PORT_OUT);
|
|
||||||
add_port(id_DI, PORT_IN);
|
|
||||||
add_port(id_L, PORT_IN);
|
|
||||||
add_port(id_CK, PORT_IN);
|
|
||||||
add_port(id_R, PORT_IN);
|
|
||||||
add_port(id_DO, PORT_OUT);
|
|
||||||
} else {
|
|
||||||
log_error("Trying to create unknown cell type %s\n", type.c_str(ctx));
|
|
||||||
}
|
|
||||||
return cell;
|
|
||||||
}
|
|
||||||
|
|
||||||
CellInfo *NgUltraPacker::create_cell_ptr(IdString type, IdString name)
|
CellInfo *NgUltraPacker::create_cell_ptr(IdString type, IdString name)
|
||||||
{
|
{
|
||||||
CellInfo *cell = ctx->createCell(name, type);
|
CellInfo *cell = ctx->createCell(name, type);
|
||||||
|
@ -65,11 +65,7 @@ void NgUltraPacker::flush_cells()
|
|||||||
}
|
}
|
||||||
ctx->cells.erase(pcell);
|
ctx->cells.erase(pcell);
|
||||||
}
|
}
|
||||||
for (auto &ncell : new_cells) {
|
|
||||||
ctx->cells[ncell->name] = std::move(ncell);
|
|
||||||
}
|
|
||||||
packed_cells.clear();
|
packed_cells.clear();
|
||||||
new_cells.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NgUltraPacker::pack_constants(void)
|
void NgUltraPacker::pack_constants(void)
|
||||||
@ -581,26 +577,29 @@ void NgUltraPacker::pack_lut_dffs(void)
|
|||||||
log_info("Pack LUT-DFFs...\n");
|
log_info("Pack LUT-DFFs...\n");
|
||||||
|
|
||||||
int lut_only = 0, lut_and_ff = 0;
|
int lut_only = 0, lut_and_ff = 0;
|
||||||
|
std::vector<CellInfo*> lut_list;
|
||||||
for (auto &cell : ctx->cells) {
|
for (auto &cell : ctx->cells) {
|
||||||
CellInfo &ci = *cell.second;
|
CellInfo &ci = *cell.second;
|
||||||
if (!ci.type.in(id_NX_LUT))
|
if (!ci.type.in(id_NX_LUT))
|
||||||
continue;
|
continue;
|
||||||
if (!ci.params.count(id_lut_table))
|
if (!ci.params.count(id_lut_table))
|
||||||
log_error("Cell '%s' missing lut_table\n", ci.name.c_str(ctx));
|
log_error("Cell '%s' missing lut_table\n", ci.name.c_str(ctx));
|
||||||
|
|
||||||
std::unique_ptr<CellInfo> packed = create_cell(id_BEYOND_FE, ctx->idf("%s$fe", ci.name.c_str(ctx)));
|
|
||||||
packed_cells.insert(ci.name);
|
packed_cells.insert(ci.name);
|
||||||
bind_attr_loc(packed.get(), &ci.attrs);
|
lut_list.push_back(&ci);
|
||||||
|
}
|
||||||
|
for (auto ci : lut_list) {
|
||||||
|
CellInfo *packed = create_cell_ptr(id_BEYOND_FE, ctx->idf("%s$fe", ci->name.c_str(ctx)));
|
||||||
|
bind_attr_loc(packed, &ci->attrs);
|
||||||
|
|
||||||
bool packed_dff = false;
|
bool packed_dff = false;
|
||||||
NetInfo *o = ci.getPort(id_O);
|
NetInfo *o = ci->getPort(id_O);
|
||||||
if (o) {
|
if (o) {
|
||||||
CellInfo *dff = net_only_drives(ctx, o, is_dff, id_I, true);
|
CellInfo *dff = net_only_drives(ctx, o, is_dff, id_I, true);
|
||||||
if (dff) {
|
if (dff) {
|
||||||
if (ctx->verbose)
|
if (ctx->verbose)
|
||||||
log_info("found attached dff %s\n", dff->name.c_str(ctx));
|
log_info("found attached dff %s\n", dff->name.c_str(ctx));
|
||||||
lut_to_fe(&ci, packed.get(), false, ci.params[id_lut_table]);
|
lut_to_fe(ci, packed, false, ci->params[id_lut_table]);
|
||||||
dff_to_fe(dff, packed.get(), false);
|
dff_to_fe(dff, packed, false);
|
||||||
++lut_and_ff;
|
++lut_and_ff;
|
||||||
packed_cells.insert(dff->name);
|
packed_cells.insert(dff->name);
|
||||||
if (ctx->verbose)
|
if (ctx->verbose)
|
||||||
@ -609,10 +608,9 @@ void NgUltraPacker::pack_lut_dffs(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!packed_dff) {
|
if (!packed_dff) {
|
||||||
lut_to_fe(&ci, packed.get(), true, ci.params[id_lut_table]);
|
lut_to_fe(ci, packed, true, ci->params[id_lut_table]);
|
||||||
++lut_only;
|
++lut_only;
|
||||||
}
|
}
|
||||||
new_cells.push_back(std::move(packed));
|
|
||||||
}
|
}
|
||||||
if (lut_only)
|
if (lut_only)
|
||||||
log_info(" %6d FEs used as LUT only\n", lut_only);
|
log_info(" %6d FEs used as LUT only\n", lut_only);
|
||||||
@ -624,16 +622,19 @@ void NgUltraPacker::pack_lut_dffs(void)
|
|||||||
void NgUltraPacker::pack_dffs(void)
|
void NgUltraPacker::pack_dffs(void)
|
||||||
{
|
{
|
||||||
int dff_only = 0;
|
int dff_only = 0;
|
||||||
|
std::vector<CellInfo*> dff_list;
|
||||||
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, id_NX_BFF))
|
if (!ci.type.in(id_NX_DFF, id_NX_BFF))
|
||||||
continue;
|
continue;
|
||||||
std::unique_ptr<CellInfo> packed = create_cell(id_BEYOND_FE, ctx->idf("%s$fe", ci.name.c_str(ctx)));
|
|
||||||
packed_cells.insert(ci.name);
|
packed_cells.insert(ci.name);
|
||||||
dff_to_fe(&ci, packed.get(), true);
|
dff_list.push_back(&ci);
|
||||||
bind_attr_loc(packed.get(), &ci.attrs);
|
}
|
||||||
|
for (auto ci : dff_list) {
|
||||||
|
CellInfo *packed = create_cell_ptr(id_BEYOND_FE, ctx->idf("%s$fe", ci->name.c_str(ctx)));
|
||||||
|
dff_to_fe(ci, packed, true);
|
||||||
|
bind_attr_loc(packed, &ci->attrs);
|
||||||
++dff_only;
|
++dff_only;
|
||||||
new_cells.push_back(std::move(packed));
|
|
||||||
}
|
}
|
||||||
if (dff_only)
|
if (dff_only)
|
||||||
log_info(" %6d FEs used as DFF only\n", dff_only);
|
log_info(" %6d FEs used as DFF only\n", dff_only);
|
||||||
|
@ -112,14 +112,12 @@ TESTABLE_PRIVATE:
|
|||||||
void constrain_location(CellInfo *cell);
|
void constrain_location(CellInfo *cell);
|
||||||
void extract_lowskew_signals(CellInfo *cell, dict<IdString,dict<IdString,std::vector<PortRef>>> &lowskew_signals);
|
void extract_lowskew_signals(CellInfo *cell, dict<IdString,dict<IdString,std::vector<PortRef>>> &lowskew_signals);
|
||||||
// Cell creating
|
// Cell creating
|
||||||
std::unique_ptr<CellInfo> create_cell(IdString type, IdString name);
|
|
||||||
CellInfo *create_cell_ptr(IdString type, IdString name);
|
CellInfo *create_cell_ptr(IdString type, IdString name);
|
||||||
|
|
||||||
Context *ctx;
|
Context *ctx;
|
||||||
NgUltraImpl *uarch;
|
NgUltraImpl *uarch;
|
||||||
|
|
||||||
pool<IdString> packed_cells;
|
pool<IdString> packed_cells;
|
||||||
std::vector<std::unique_ptr<CellInfo>> new_cells;
|
|
||||||
pool<IdString> global_lowskew;
|
pool<IdString> global_lowskew;
|
||||||
|
|
||||||
HimbaechelHelpers h;
|
HimbaechelHelpers h;
|
||||||
|
Loading…
Reference in New Issue
Block a user