archcheck: Use old connectivity check for CycloneV
Signed-off-by: gatecat <gatecat@ds0.me>
This commit is contained in:
parent
8677d59b92
commit
b1d3eb07c3
@ -28,6 +28,12 @@
|
|||||||
|
|
||||||
USING_NEXTPNR_NAMESPACE
|
USING_NEXTPNR_NAMESPACE
|
||||||
|
|
||||||
|
#ifndef ARCH_CYCLONEV
|
||||||
|
// The LRU cache to reduce memory usage during the connectivity check relies on getPips() having some spacial locality,
|
||||||
|
// which the current CycloneV arch impl doesn't have. This may be fixed in the future, though.
|
||||||
|
#define USING_LRU_CACHE
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
void archcheck_names(const Context *ctx)
|
void archcheck_names(const Context *ctx)
|
||||||
@ -248,6 +254,11 @@ void archcheck_conn(const Context *ctx)
|
|||||||
|
|
||||||
log_info("Checking all wires...\n");
|
log_info("Checking all wires...\n");
|
||||||
|
|
||||||
|
#ifndef USING_LRU_CACHE
|
||||||
|
std::unordered_map<PipId, WireId> pips_downhill;
|
||||||
|
std::unordered_map<PipId, WireId> pips_uphill;
|
||||||
|
#endif
|
||||||
|
|
||||||
for (WireId wire : ctx->getWires()) {
|
for (WireId wire : ctx->getWires()) {
|
||||||
for (BelPin belpin : ctx->getWireBelPins(wire)) {
|
for (BelPin belpin : ctx->getWireBelPins(wire)) {
|
||||||
WireId wire2 = ctx->getBelPinWire(belpin.bel, belpin.pin);
|
WireId wire2 = ctx->getBelPinWire(belpin.bel, belpin.pin);
|
||||||
@ -257,11 +268,19 @@ void archcheck_conn(const Context *ctx)
|
|||||||
for (PipId pip : ctx->getPipsDownhill(wire)) {
|
for (PipId pip : ctx->getPipsDownhill(wire)) {
|
||||||
WireId wire2 = ctx->getPipSrcWire(pip);
|
WireId wire2 = ctx->getPipSrcWire(pip);
|
||||||
log_assert(wire == wire2);
|
log_assert(wire == wire2);
|
||||||
|
#ifndef USING_LRU_CACHE
|
||||||
|
auto result = pips_downhill.emplace(pip, wire);
|
||||||
|
log_assert(result.second);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
for (PipId pip : ctx->getPipsUphill(wire)) {
|
for (PipId pip : ctx->getPipsUphill(wire)) {
|
||||||
WireId wire2 = ctx->getPipDstWire(pip);
|
WireId wire2 = ctx->getPipDstWire(pip);
|
||||||
log_assert(wire == wire2);
|
log_assert(wire == wire2);
|
||||||
|
#ifndef USING_LRU_CACHE
|
||||||
|
auto result = pips_uphill.emplace(pip, wire);
|
||||||
|
log_assert(result.second);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -285,7 +304,7 @@ void archcheck_conn(const Context *ctx)
|
|||||||
log_assert(found_belpin);
|
log_assert(found_belpin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef USING_LRU_CACHE
|
||||||
// This cache is used to meet two goals:
|
// This cache is used to meet two goals:
|
||||||
// - Avoid linear scan by invoking getPipsDownhill/getPipsUphill directly.
|
// - Avoid linear scan by invoking getPipsDownhill/getPipsUphill directly.
|
||||||
// - Avoid having pip -> wire maps for the entire part.
|
// - Avoid having pip -> wire maps for the entire part.
|
||||||
@ -295,16 +314,25 @@ void archcheck_conn(const Context *ctx)
|
|||||||
// pip -> wire, assuming that pips are returned from getPips with some
|
// pip -> wire, assuming that pips are returned from getPips with some
|
||||||
// chip locality.
|
// chip locality.
|
||||||
LruWireCacheMap pip_cache(ctx, /*cache_size=*/64 * 1024);
|
LruWireCacheMap pip_cache(ctx, /*cache_size=*/64 * 1024);
|
||||||
|
#endif
|
||||||
log_info("Checking all PIPs...\n");
|
log_info("Checking all PIPs...\n");
|
||||||
for (PipId pip : ctx->getPips()) {
|
for (PipId pip : ctx->getPips()) {
|
||||||
WireId src_wire = ctx->getPipSrcWire(pip);
|
WireId src_wire = ctx->getPipSrcWire(pip);
|
||||||
if (src_wire != WireId()) {
|
if (src_wire != WireId()) {
|
||||||
|
#ifdef USING_LRU_CACHE
|
||||||
log_assert(pip_cache.isPipDownhill(pip, src_wire));
|
log_assert(pip_cache.isPipDownhill(pip, src_wire));
|
||||||
|
#else
|
||||||
|
log_assert(pips_downhill.at(pip) == src_wire);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
WireId dst_wire = ctx->getPipDstWire(pip);
|
WireId dst_wire = ctx->getPipDstWire(pip);
|
||||||
if (dst_wire != WireId()) {
|
if (dst_wire != WireId()) {
|
||||||
|
#ifdef USING_LRU_CACHE
|
||||||
log_assert(pip_cache.isPipUphill(pip, dst_wire));
|
log_assert(pip_cache.isPipUphill(pip, dst_wire));
|
||||||
|
#else
|
||||||
|
log_assert(pips_uphill.at(pip) == dst_wire);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user