ecp5: Improve mixed no-FF/FF placement
Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
parent
3e399c9f20
commit
6a1b49c311
@ -39,25 +39,27 @@ bool Arch::slicesCompatible(const std::vector<const CellInfo *> &cells) const
|
||||
IdString CLKMUX, LSRMUX, SRMODE;
|
||||
bool first = true;
|
||||
for (auto cell : cells) {
|
||||
if (first) {
|
||||
clk_sig = cell->sliceInfo.clk_sig;
|
||||
lsr_sig = cell->sliceInfo.lsr_sig;
|
||||
CLKMUX = cell->sliceInfo.clkmux;
|
||||
LSRMUX = cell->sliceInfo.lsrmux;
|
||||
SRMODE = cell->sliceInfo.srmode;
|
||||
} else {
|
||||
if (cell->sliceInfo.clk_sig != clk_sig)
|
||||
return false;
|
||||
if (cell->sliceInfo.lsr_sig != lsr_sig)
|
||||
return false;
|
||||
if (cell->sliceInfo.clkmux != CLKMUX)
|
||||
return false;
|
||||
if (cell->sliceInfo.lsrmux != LSRMUX)
|
||||
return false;
|
||||
if (cell->sliceInfo.srmode != SRMODE)
|
||||
return false;
|
||||
if (cell->sliceInfo.using_dff) {
|
||||
if (first) {
|
||||
clk_sig = cell->sliceInfo.clk_sig;
|
||||
lsr_sig = cell->sliceInfo.lsr_sig;
|
||||
CLKMUX = cell->sliceInfo.clkmux;
|
||||
LSRMUX = cell->sliceInfo.lsrmux;
|
||||
SRMODE = cell->sliceInfo.srmode;
|
||||
} else {
|
||||
if (cell->sliceInfo.clk_sig != clk_sig)
|
||||
return false;
|
||||
if (cell->sliceInfo.lsr_sig != lsr_sig)
|
||||
return false;
|
||||
if (cell->sliceInfo.clkmux != CLKMUX)
|
||||
return false;
|
||||
if (cell->sliceInfo.lsrmux != LSRMUX)
|
||||
return false;
|
||||
if (cell->sliceInfo.srmode != SRMODE)
|
||||
return false;
|
||||
}
|
||||
first = false;
|
||||
}
|
||||
first = false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -143,6 +143,7 @@ struct ArchCellInfo
|
||||
{
|
||||
struct
|
||||
{
|
||||
bool using_dff;
|
||||
IdString clk_sig, lsr_sig, clkmux, lsrmux, srmode;
|
||||
} sliceInfo;
|
||||
};
|
||||
|
@ -244,17 +244,22 @@ void write_bitstream(Context *ctx, std::string base_config_file, std::string tex
|
||||
cc.tiles[tname].add_enum(slice + ".REG1.REGSET",
|
||||
str_or_default(ci->params, ctx->id("REG1_REGSET"), "RESET"));
|
||||
cc.tiles[tname].add_enum(slice + ".CEMUX", str_or_default(ci->params, ctx->id("CEMUX"), "1"));
|
||||
NetInfo *lsrnet = nullptr;
|
||||
if (ci->ports.find(ctx->id("LSR")) != ci->ports.end() && ci->ports.at(ctx->id("LSR")).net != nullptr)
|
||||
lsrnet = ci->ports.at(ctx->id("LSR")).net;
|
||||
if (ctx->getBoundWireNet(ctx->getWireByName(
|
||||
ctx->id(fmt_str("X" << bel.location.x << "/Y" << bel.location.y << "/LSR0")))) == lsrnet) {
|
||||
cc.tiles[tname].add_enum("LSR0.SRMODE", str_or_default(ci->params, ctx->id("SRMODE"), "LSR_OVER_CE"));
|
||||
cc.tiles[tname].add_enum("LSR0.LSRMUX", str_or_default(ci->params, ctx->id("LSRMUX"), "LSR"));
|
||||
} else if (ctx->getBoundWireNet(ctx->getWireByName(ctx->id(
|
||||
fmt_str("X" << bel.location.x << "/Y" << bel.location.y << "/LSR1")))) == lsrnet) {
|
||||
cc.tiles[tname].add_enum("LSR1.SRMODE", str_or_default(ci->params, ctx->id("SRMODE"), "LSR_OVER_CE"));
|
||||
cc.tiles[tname].add_enum("LSR1.LSRMUX", str_or_default(ci->params, ctx->id("LSRMUX"), "LSR"));
|
||||
|
||||
if (ci->sliceInfo.using_dff) {
|
||||
NetInfo *lsrnet = nullptr;
|
||||
if (ci->ports.find(ctx->id("LSR")) != ci->ports.end() && ci->ports.at(ctx->id("LSR")).net != nullptr)
|
||||
lsrnet = ci->ports.at(ctx->id("LSR")).net;
|
||||
if (ctx->getBoundWireNet(ctx->getWireByName(
|
||||
ctx->id(fmt_str("X" << bel.location.x << "/Y" << bel.location.y << "/LSR0")))) == lsrnet) {
|
||||
cc.tiles[tname].add_enum("LSR0.SRMODE",
|
||||
str_or_default(ci->params, ctx->id("SRMODE"), "LSR_OVER_CE"));
|
||||
cc.tiles[tname].add_enum("LSR0.LSRMUX", str_or_default(ci->params, ctx->id("LSRMUX"), "LSR"));
|
||||
} else if (ctx->getBoundWireNet(ctx->getWireByName(ctx->id(
|
||||
fmt_str("X" << bel.location.x << "/Y" << bel.location.y << "/LSR1")))) == lsrnet) {
|
||||
cc.tiles[tname].add_enum("LSR1.SRMODE",
|
||||
str_or_default(ci->params, ctx->id("SRMODE"), "LSR_OVER_CE"));
|
||||
cc.tiles[tname].add_enum("LSR1.LSRMUX", str_or_default(ci->params, ctx->id("LSRMUX"), "LSR"));
|
||||
}
|
||||
}
|
||||
|
||||
if (str_or_default(ci->params, ctx->id("MODE"), "LOGIC") == "CCU2") {
|
||||
|
@ -493,7 +493,7 @@ class Ecp5Packer
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<std::vector<CellInfo*>> packed_chains;
|
||||
std::vector<std::vector<CellInfo *>> packed_chains;
|
||||
|
||||
// Chain packing
|
||||
for (auto &chain : all_chains) {
|
||||
@ -797,6 +797,13 @@ void Arch::assignArchInfo()
|
||||
for (auto cell : sorted(cells)) {
|
||||
CellInfo *ci = cell.second;
|
||||
if (ci->type == id_TRELLIS_SLICE) {
|
||||
|
||||
ci->sliceInfo.using_dff = false;
|
||||
if (ci->ports.count(id_Q0) && ci->ports[id_Q0].net != nullptr)
|
||||
ci->sliceInfo.using_dff = true;
|
||||
if (ci->ports.count(id_Q1) && ci->ports[id_Q1].net != nullptr)
|
||||
ci->sliceInfo.using_dff = true;
|
||||
|
||||
if (ci->ports.count(id_CLK) && ci->ports[id_CLK].net != nullptr)
|
||||
ci->sliceInfo.clk_sig = ci->ports[id_CLK].net->name;
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user