Improving debugability
Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
parent
998ab2b20a
commit
92ddc31003
@ -185,6 +185,19 @@ void Context::check() const
|
|||||||
assert(c.first == c.second->name);
|
assert(c.first == c.second->name);
|
||||||
if (c.second->bel != BelId())
|
if (c.second->bel != BelId())
|
||||||
assert(getBoundBelCell(c.second->bel) == c.first);
|
assert(getBoundBelCell(c.second->bel) == c.first);
|
||||||
|
for (auto &port : c.second->ports) {
|
||||||
|
NetInfo *net = port.second.net;
|
||||||
|
if (net != nullptr) {
|
||||||
|
assert(nets.find(net->name) != nets.end());
|
||||||
|
if (port.second.type == PORT_OUT) {
|
||||||
|
assert(net->driver.cell == c.second.get() && net->driver.port == port.first);
|
||||||
|
} else if (port.second.type == PORT_IN) {
|
||||||
|
assert(std::count_if(net->users.begin(), net->users.end(), [&](const PortRef &pr) {
|
||||||
|
return pr.cell == c.second.get() && pr.port == port.first;
|
||||||
|
}) == 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -372,6 +372,7 @@ int main(int argc, char *argv[])
|
|||||||
if (!place_design_sa(&ctx, timing_driven) && !ctx.force)
|
if (!place_design_sa(&ctx, timing_driven) && !ctx.force)
|
||||||
log_error("Placing design failed.\n");
|
log_error("Placing design failed.\n");
|
||||||
legalise_design(&ctx);
|
legalise_design(&ctx);
|
||||||
|
ctx.check();
|
||||||
if (!route_design(&ctx) && !ctx.force)
|
if (!route_design(&ctx) && !ctx.force)
|
||||||
log_error("Routing design failed.\n");
|
log_error("Routing design failed.\n");
|
||||||
}
|
}
|
||||||
|
@ -260,10 +260,12 @@ class PlacementLegaliser
|
|||||||
start_of_chain = true;
|
start_of_chain = true;
|
||||||
} else {
|
} else {
|
||||||
NetInfo *carry_net = cell->ports.at(ctx->id("COUT")).net;
|
NetInfo *carry_net = cell->ports.at(ctx->id("COUT")).net;
|
||||||
if (carry_net != nullptr && carry_net->users.size() > 1) {
|
bool at_end = (curr_cell == carryc.cells.end() - 1);
|
||||||
|
if (carry_net != nullptr && (carry_net->users.size() > 1 || at_end)) {
|
||||||
if (carry_net->users.size() > 2 ||
|
if (carry_net->users.size() > 2 ||
|
||||||
(net_only_drives(ctx, carry_net, is_lc, ctx->id("I3"), false) !=
|
(net_only_drives(ctx, carry_net, is_lc, ctx->id("I3"), false) !=
|
||||||
net_only_drives(ctx, carry_net, is_lc, ctx->id("CIN"), false))) {
|
net_only_drives(ctx, carry_net, is_lc, ctx->id("CIN"), false)) ||
|
||||||
|
(at_end && !net_only_drives(ctx, carry_net, is_lc, ctx->id("I3"), true))) {
|
||||||
CellInfo *passout = make_carry_pass_out(cell->ports.at(ctx->id("COUT")));
|
CellInfo *passout = make_carry_pass_out(cell->ports.at(ctx->id("COUT")));
|
||||||
chains.back().cells.push_back(passout);
|
chains.back().cells.push_back(passout);
|
||||||
tile.push_back(passout);
|
tile.push_back(passout);
|
||||||
@ -324,6 +326,7 @@ class PlacementLegaliser
|
|||||||
i1_r.cell = lc.get();
|
i1_r.cell = lc.get();
|
||||||
ctx->nets.at(ctx->id("$PACKER_VCC_NET"))->users.push_back(i1_r);
|
ctx->nets.at(ctx->id("$PACKER_VCC_NET"))->users.push_back(i1_r);
|
||||||
IdString co_i3_name = co_i3_net->name;
|
IdString co_i3_name = co_i3_net->name;
|
||||||
|
assert(ctx->nets.find(co_i3_name) == ctx->nets.end());
|
||||||
ctx->nets[co_i3_name] = std::move(co_i3_net);
|
ctx->nets[co_i3_name] = std::move(co_i3_net);
|
||||||
IdString name = lc->name;
|
IdString name = lc->name;
|
||||||
ctx->cells[lc->name] = std::move(lc);
|
ctx->cells[lc->name] = std::move(lc);
|
||||||
@ -366,6 +369,7 @@ class PlacementLegaliser
|
|||||||
cin_cell->ports.at(cin_port.name).net = out_net.get();
|
cin_cell->ports.at(cin_port.name).net = out_net.get();
|
||||||
|
|
||||||
IdString out_net_name = out_net->name;
|
IdString out_net_name = out_net->name;
|
||||||
|
assert(ctx->nets.find(out_net_name) == ctx->nets.end());
|
||||||
ctx->nets[out_net_name] = std::move(out_net);
|
ctx->nets[out_net_name] = std::move(out_net);
|
||||||
|
|
||||||
IdString name = lc->name;
|
IdString name = lc->name;
|
||||||
|
Loading…
Reference in New Issue
Block a user