ecp5: Working on packer
Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
parent
ac4cdd6604
commit
eb773f246d
83
ecp5/pack.cc
83
ecp5/pack.cc
@ -39,11 +39,22 @@ class Ecp5Packer
|
|||||||
Ecp5Packer(Context *ctx) : ctx(ctx){};
|
Ecp5Packer(Context *ctx) : ctx(ctx){};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Simple "packer" to remove nextpnr IOBUFs, this assumes IOBUFs are manually instantiated
|
// Process the contents of packed_cells and new_cells
|
||||||
void pack_io(Context *ctx)
|
void flush_cells()
|
||||||
|
{
|
||||||
|
for (auto pcell : packed_cells) {
|
||||||
|
ctx->cells.erase(pcell);
|
||||||
|
}
|
||||||
|
for (auto &ncell : new_cells) {
|
||||||
|
ctx->cells[ncell->name] = std::move(ncell);
|
||||||
|
}
|
||||||
|
packed_cells.clear();
|
||||||
|
new_cells.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simple "packer" to remove nextpnr IOBUFs, this assumes IOBUFs are manually instantiated
|
||||||
|
void pack_io()
|
||||||
{
|
{
|
||||||
std::unordered_set<IdString> packed_cells;
|
|
||||||
std::vector<std::unique_ptr<CellInfo>> new_cells;
|
|
||||||
log_info("Packing IOs..\n");
|
log_info("Packing IOs..\n");
|
||||||
|
|
||||||
for (auto cell : sorted(ctx->cells)) {
|
for (auto cell : sorted(ctx->cells)) {
|
||||||
@ -79,19 +90,73 @@ class Ecp5Packer
|
|||||||
std::copy(ci->attrs.begin(), ci->attrs.end(), std::inserter(trio->attrs, trio->attrs.begin()));
|
std::copy(ci->attrs.begin(), ci->attrs.end(), std::inserter(trio->attrs, trio->attrs.begin()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (auto pcell : packed_cells) {
|
flush_cells();
|
||||||
ctx->cells.erase(pcell);
|
|
||||||
}
|
}
|
||||||
for (auto &ncell : new_cells) {
|
|
||||||
ctx->cells[ncell->name] = std::move(ncell);
|
// Pass to pack LUT5s into a newly created slice
|
||||||
|
void pack_lut5s()
|
||||||
|
{
|
||||||
|
log_info("Packing LUT5s...\n");
|
||||||
|
for (auto cell : sorted(ctx->cells)) {
|
||||||
|
CellInfo *ci = cell.second;
|
||||||
|
if (is_pfumx(ctx, ci)) {
|
||||||
|
std::unique_ptr<CellInfo> packed =
|
||||||
|
create_ecp5_cell(ctx, ctx->id("TRELLIS_SLICE"), ci->name.str(ctx) + "_SLICE");
|
||||||
|
NetInfo *f0 = ci->ports.at(ctx->id("BLUT")).net;
|
||||||
|
if (f0 == nullptr)
|
||||||
|
log_error("PFUMX '%s' has disconnected port 'BLUT'\n", ci->name.c_str(ctx));
|
||||||
|
NetInfo *f1 = ci->ports.at(ctx->id("ALUT")).net;
|
||||||
|
if (f1 == nullptr)
|
||||||
|
log_error("PFUMX '%s' has disconnected port 'ALUT'\n", ci->name.c_str(ctx));
|
||||||
|
CellInfo *lc0 = net_driven_by(ctx, f0, is_lut, ctx->id("Z"));
|
||||||
|
CellInfo *lc1 = net_driven_by(ctx, f1, is_lut, ctx->id("Z"));
|
||||||
|
if (lc0 == nullptr)
|
||||||
|
log_error("PFUMX '%s' has BLUT driven by cell other than a LUT\n", ci->name.c_str(ctx));
|
||||||
|
if (lc1 == nullptr)
|
||||||
|
log_error("PFUMX '%s' has ALUT driven by cell other than a LUT\n", ci->name.c_str(ctx));
|
||||||
|
replace_port(lc0, ctx->id("A"), packed.get(), ctx->id("A0"));
|
||||||
|
replace_port(lc0, ctx->id("B"), packed.get(), ctx->id("B0"));
|
||||||
|
replace_port(lc0, ctx->id("C"), packed.get(), ctx->id("C0"));
|
||||||
|
replace_port(lc0, ctx->id("D"), packed.get(), ctx->id("D0"));
|
||||||
|
replace_port(lc1, ctx->id("A"), packed.get(), ctx->id("A1"));
|
||||||
|
replace_port(lc1, ctx->id("B"), packed.get(), ctx->id("B1"));
|
||||||
|
replace_port(lc1, ctx->id("C"), packed.get(), ctx->id("C1"));
|
||||||
|
replace_port(lc1, ctx->id("D"), packed.get(), ctx->id("D1"));
|
||||||
|
replace_port(ci, ctx->id("C0"), packed.get(), ctx->id("M0"));
|
||||||
|
replace_port(ci, ctx->id("Z"), packed.get(), ctx->id("OFX0"));
|
||||||
|
ctx->nets.erase(f0->name);
|
||||||
|
ctx->nets.erase(f1->name);
|
||||||
|
new_cells.push_back(std::move(packed));
|
||||||
|
packed_cells.insert(lc0->name);
|
||||||
|
packed_cells.insert(lc1->name);
|
||||||
|
packed_cells.insert(ci->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
flush_cells();
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void pack() { pack_io(ctx); }
|
void pack()
|
||||||
|
{
|
||||||
|
pack_io();
|
||||||
|
pack_lut5s();
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Context *ctx;
|
Context *ctx;
|
||||||
|
|
||||||
|
std::unordered_set<IdString> packed_cells;
|
||||||
|
std::vector<std::unique_ptr<CellInfo>> new_cells;
|
||||||
|
|
||||||
|
struct SliceUsage
|
||||||
|
{
|
||||||
|
bool lut0_used = false, lut1_used = false;
|
||||||
|
bool ccu2_used = false, dpram_used = false, ramw_used = false;
|
||||||
|
bool ff0_used = false, ff1_used = false;
|
||||||
|
bool mux5_used = false, muxx_used = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::unordered_map<IdString, SliceUsage> sliceUsage;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Main pack function
|
// Main pack function
|
||||||
|
Loading…
Reference in New Issue
Block a user