ice40: Include I3 connectivity in chain

Thanks @smunaut

Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
David Shah 2018-12-04 12:02:26 +00:00
parent 12aca1558f
commit 0c93b55650

View File

@ -163,29 +163,31 @@ class ChainConstrainer
void process_carries() void process_carries()
{ {
std::vector<CellChain> carry_chains = std::vector<CellChain> carry_chains = find_chains(
find_chains(ctx, [](const Context *ctx, const CellInfo *cell) { return is_lc(ctx, cell); }, ctx, [](const Context *ctx, const CellInfo *cell) { return is_lc(ctx, cell); },
[](const Context *ctx, const [](const Context *ctx, const
CellInfo *cell) { CellInfo *cell) {
CellInfo *carry_prev = CellInfo *carry_prev =
net_driven_by(ctx, cell->ports.at(ctx->id("CIN")).net, is_lc, ctx->id("COUT")); net_driven_by(ctx, cell->ports.at(ctx->id("CIN")).net, is_lc, ctx->id("COUT"));
if (carry_prev != nullptr) if (carry_prev != nullptr)
return carry_prev; return carry_prev;
/*CellInfo *i3_prev = net_driven_by(ctx, cell->ports.at(ctx->id("I3")).net, is_lc, CellInfo *i3_prev = net_driven_by(ctx, cell->ports.at(ctx->id("I3")).net, is_lc, ctx->id("COUT"));
ctx->id("COUT")); if (i3_prev != nullptr) return i3_prev;*/ if (i3_prev != nullptr)
return (CellInfo *)nullptr; return i3_prev;
}, return (CellInfo *)nullptr;
[](const Context *ctx, const CellInfo *cell) { },
CellInfo *carry_next = net_only_drives(ctx, cell->ports.at(ctx->id("COUT")).net, is_lc, [](const Context *ctx, const CellInfo *cell) {
ctx->id("CIN"), false); CellInfo *carry_next =
if (carry_next != nullptr) net_only_drives(ctx, cell->ports.at(ctx->id("COUT")).net, is_lc, ctx->id("CIN"), false);
return carry_next; if (carry_next != nullptr)
/*CellInfo *i3_next = return carry_next;
net_only_drives(ctx, cell->ports.at(ctx->id("COUT")).net, is_lc, ctx->id("I3"), CellInfo *i3_next =
false); if (i3_next != nullptr) return i3_next;*/ net_only_drives(ctx, cell->ports.at(ctx->id("COUT")).net, is_lc, ctx->id("I3"), false);
return (CellInfo *)nullptr; if (i3_next != nullptr)
}); return i3_next;
return (CellInfo *)nullptr;
});
std::unordered_set<IdString> chained; std::unordered_set<IdString> chained;
for (auto &base_chain : carry_chains) { for (auto &base_chain : carry_chains) {
for (auto c : base_chain.cells) for (auto c : base_chain.cells)