diff --git a/vpr/src/base/metadata_storage.h b/vpr/src/base/metadata_storage.h index f6c8c8d6fb0..c261ff28aa8 100644 --- a/vpr/src/base/metadata_storage.h +++ b/vpr/src/base/metadata_storage.h @@ -28,6 +28,26 @@ class MetadataStorage { data_.push_back(std::make_tuple(lookup_key, meta_key, meta_value)); } + // Use the given mapping function to change the keys + void remap_keys(std::function key_map) { + if (map_.empty()) { + for (auto& entry : data_) { + std::get<0>(entry) = key_map(std::get<0>(entry)); + } + } else { + VTR_ASSERT(data_.empty()); + for (auto& dict : map_) { + for (auto& entry : dict.second) { + for (auto& value : entry.second) { + data_.push_back(std::make_tuple(key_map(dict.first), entry.first, value.as_string())); + } + } + } + map_.clear(); + build_map(); + } + } + typename vtr::flat_map::const_iterator find(const LookupKey& lookup_key) const { check_for_map(); diff --git a/vpr/src/route/rr_graph_util.cpp b/vpr/src/route/rr_graph_util.cpp index 3bd3270b000..9c7f5ef1488 100644 --- a/vpr/src/route/rr_graph_util.cpp +++ b/vpr/src/route/rr_graph_util.cpp @@ -169,4 +169,11 @@ void reorder_rr_graph_nodes(const t_router_opts& router_opts) { } } } + + device_ctx.rr_node_metadata.remap_keys([&](int node) { return size_t(dest_order[RRNodeId(node)]); }); + device_ctx.rr_edge_metadata.remap_keys([&](std::tuple edge) { + return std::make_tuple(size_t(dest_order[RRNodeId(std::get<0>(edge))]), + size_t(dest_order[RRNodeId(std::get<1>(edge))]), + std::get<2>(edge)); + }); } diff --git a/vpr/test/test_vpr.cpp b/vpr/test/test_vpr.cpp index aa63736e9c4..608afdc67c5 100644 --- a/vpr/test/test_vpr.cpp +++ b/vpr/test/test_vpr.cpp @@ -125,8 +125,7 @@ TEST_CASE("read_rr_graph_metadata", "[vpr]") { kArchFile, "wire.eblif", "--route_chan_width", - "100", - }; + "100"}; vpr_init(sizeof(argv) / sizeof(argv[0]), argv, &options, &vpr_setup, &arch); vpr_setup.RouterOpts.read_rr_edge_metadata = true; @@ -165,6 +164,10 @@ TEST_CASE("read_rr_graph_metadata", "[vpr]") { "wire.eblif", "--route_chan_width", "100", + "--reorder_rr_graph_nodes_seed", + "1", + "--reorder_rr_graph_nodes_algorithm", + "random_shuffle", // Tests node reordering with metadata "--read_rr_graph", kRrGraphFile, }; @@ -175,6 +178,13 @@ TEST_CASE("read_rr_graph_metadata", "[vpr]") { vpr_create_device(vpr_setup, arch); const auto& device_ctx = g_vpr_ctx.device(); + + // recompute ordering from 'random_shuffle' + std::vector src_order(device_ctx.rr_nodes.size()); // new id -> old id + std::iota(src_order.begin(), src_order.end(), 0); // Initialize to [0, 1, 2 ...] + std::mt19937 g(1); + std::shuffle(src_order.begin(), src_order.end(), g); + CHECK(device_ctx.rr_node_metadata.size() == 1); CHECK(device_ctx.rr_edge_metadata.size() == 1); @@ -182,7 +192,7 @@ TEST_CASE("read_rr_graph_metadata", "[vpr]") { auto edge = arch.strings.intern_string(vtr::string_view("edge")); for (const auto& node_meta : device_ctx.rr_node_metadata) { - CHECK(node_meta.first == src_inode); + CHECK(src_order[node_meta.first] == src_inode); REQUIRE(node_meta.second.has(node)); auto* value = node_meta.second.one(node); REQUIRE(value != nullptr); @@ -190,8 +200,8 @@ TEST_CASE("read_rr_graph_metadata", "[vpr]") { } for (const auto& edge_meta : device_ctx.rr_edge_metadata) { - CHECK(std::get<0>(edge_meta.first) == src_inode); - CHECK(std::get<1>(edge_meta.first) == sink_inode); + CHECK(src_order[std::get<0>(edge_meta.first)] == src_inode); + CHECK(src_order[std::get<1>(edge_meta.first)] == sink_inode); CHECK(std::get<2>(edge_meta.first) == switch_id); REQUIRE(edge_meta.second.has(edge));