From d78f5a1d5b3e1dcc87767519ed9661fafce34885 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Mon, 3 Sep 2018 22:59:34 -0700 Subject: [PATCH] Build a pip_to_dst_wire lookup to speedup routing --- xc7/arch.cc | 13 +++++++++++++ xc7/arch.h | 7 ++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/xc7/arch.cc b/xc7/arch.cc index 1c4bc99e..7d9a4e78 100644 --- a/xc7/arch.cc +++ b/xc7/arch.cc @@ -37,6 +37,12 @@ std::unique_ptr torc_info; TorcInfo::TorcInfo(Arch *ctx, const std::string &inDeviceName, const std::string &inPackageName) : ddb(new DDB(inDeviceName, inPackageName)), sites(ddb->getSites()), tiles(ddb->getTiles()), segments(ddb->getSegments()), bel_to_site_index(construct_bel_to_site_index(ctx, sites)), num_bels(bel_to_site_index.size()), site_index_to_type(construct_site_index_to_type(ctx, sites)), bel_to_loc(construct_bel_to_loc(sites, tiles, num_bels, site_index_to_type)), wire_to_tilewire(construct_wire_to_tilewire(segments, tiles, segment_to_wire, trivial_to_wire)), num_wires(wire_to_tilewire.size()), pip_to_arc(construct_pip_to_arc(wire_to_tilewire, *ddb, wire_to_pips_uphill, wire_to_pips_downhill)), num_pips(pip_to_arc.size()) { + pip_to_dst_wire.reserve(num_pips); + + for (const auto& arc : pip_to_arc) { + const auto &tw = arc.getSinkTilewire(); + pip_to_dst_wire.push_back(tilewire_to_wire(tw)); + } } std::vector TorcInfo::construct_bel_to_site_index(Arch* ctx, const Sites &sites) { @@ -186,6 +192,13 @@ std::vector TorcInfo::construct_pip_to_arc(const std::vector& wir return pip_to_arc; } +std::vector +construct_pip_to_dst_wire(const std::vector& pip_to_arc) +{ + std::vector pip_to_wire; + return pip_to_wire; +} + // ----------------------------------------------------------------------- diff --git a/xc7/arch.h b/xc7/arch.h index bd91b79c..37523bb8 100644 --- a/xc7/arch.h +++ b/xc7/arch.h @@ -317,6 +317,7 @@ struct TorcInfo { std::vector> wire_to_pips_downhill; const std::vector pip_to_arc; const int num_pips; + std::vector pip_to_dst_wire; private: static std::vector construct_bel_to_site_index(Arch *ctx, const Sites &sites); @@ -811,11 +812,7 @@ struct Arch : BaseCtx { WireId wire; NPNR_ASSERT(pip != PipId()); - - const auto &arc = torc_info->pip_to_arc[pip.index]; - const auto &tw = arc.getSinkTilewire(); - wire.index = torc_info->tilewire_to_wire(tw); - + wire.index = torc_info->pip_to_dst_wire[pip.index]; return wire; }