Skip to content

Commit 7f01e64

Browse files
authored
Merge pull request #1516 from HackerFoo/reorder-metadata
Apply reordering to node and edge metadata
2 parents 1c1212a + 7811b27 commit 7f01e64

File tree

3 files changed

+42
-5
lines changed

3 files changed

+42
-5
lines changed

vpr/src/base/metadata_storage.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,26 @@ class MetadataStorage {
2828
data_.push_back(std::make_tuple(lookup_key, meta_key, meta_value));
2929
}
3030

31+
// Use the given mapping function to change the keys
32+
void remap_keys(std::function<LookupKey(LookupKey)> key_map) {
33+
if (map_.empty()) {
34+
for (auto& entry : data_) {
35+
std::get<0>(entry) = key_map(std::get<0>(entry));
36+
}
37+
} else {
38+
VTR_ASSERT(data_.empty());
39+
for (auto& dict : map_) {
40+
for (auto& entry : dict.second) {
41+
for (auto& value : entry.second) {
42+
data_.push_back(std::make_tuple(key_map(dict.first), entry.first, value.as_string()));
43+
}
44+
}
45+
}
46+
map_.clear();
47+
build_map();
48+
}
49+
}
50+
3151
typename vtr::flat_map<LookupKey, t_metadata_dict>::const_iterator find(const LookupKey& lookup_key) const {
3252
check_for_map();
3353

vpr/src/route/rr_graph_util.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,11 @@ void reorder_rr_graph_nodes(const t_router_opts& router_opts) {
169169
}
170170
}
171171
}
172+
173+
device_ctx.rr_node_metadata.remap_keys([&](int node) { return size_t(dest_order[RRNodeId(node)]); });
174+
device_ctx.rr_edge_metadata.remap_keys([&](std::tuple<int, int, short> edge) {
175+
return std::make_tuple(size_t(dest_order[RRNodeId(std::get<0>(edge))]),
176+
size_t(dest_order[RRNodeId(std::get<1>(edge))]),
177+
std::get<2>(edge));
178+
});
172179
}

vpr/test/test_vpr.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,7 @@ TEST_CASE("read_rr_graph_metadata", "[vpr]") {
125125
kArchFile,
126126
"wire.eblif",
127127
"--route_chan_width",
128-
"100",
129-
};
128+
"100"};
130129
vpr_init(sizeof(argv) / sizeof(argv[0]), argv,
131130
&options, &vpr_setup, &arch);
132131
vpr_setup.RouterOpts.read_rr_edge_metadata = true;
@@ -165,6 +164,10 @@ TEST_CASE("read_rr_graph_metadata", "[vpr]") {
165164
"wire.eblif",
166165
"--route_chan_width",
167166
"100",
167+
"--reorder_rr_graph_nodes_seed",
168+
"1",
169+
"--reorder_rr_graph_nodes_algorithm",
170+
"random_shuffle", // Tests node reordering with metadata
168171
"--read_rr_graph",
169172
kRrGraphFile,
170173
};
@@ -175,23 +178,30 @@ TEST_CASE("read_rr_graph_metadata", "[vpr]") {
175178
vpr_create_device(vpr_setup, arch);
176179

177180
const auto& device_ctx = g_vpr_ctx.device();
181+
182+
// recompute ordering from 'random_shuffle'
183+
std::vector<int> src_order(device_ctx.rr_nodes.size()); // new id -> old id
184+
std::iota(src_order.begin(), src_order.end(), 0); // Initialize to [0, 1, 2 ...]
185+
std::mt19937 g(1);
186+
std::shuffle(src_order.begin(), src_order.end(), g);
187+
178188
CHECK(device_ctx.rr_node_metadata.size() == 1);
179189
CHECK(device_ctx.rr_edge_metadata.size() == 1);
180190

181191
auto node = arch.strings.intern_string(vtr::string_view("node"));
182192
auto edge = arch.strings.intern_string(vtr::string_view("edge"));
183193

184194
for (const auto& node_meta : device_ctx.rr_node_metadata) {
185-
CHECK(node_meta.first == src_inode);
195+
CHECK(src_order[node_meta.first] == src_inode);
186196
REQUIRE(node_meta.second.has(node));
187197
auto* value = node_meta.second.one(node);
188198
REQUIRE(value != nullptr);
189199
CHECK_THAT(value->as_string().get(&arch.strings), Equals("test node"));
190200
}
191201

192202
for (const auto& edge_meta : device_ctx.rr_edge_metadata) {
193-
CHECK(std::get<0>(edge_meta.first) == src_inode);
194-
CHECK(std::get<1>(edge_meta.first) == sink_inode);
203+
CHECK(src_order[std::get<0>(edge_meta.first)] == src_inode);
204+
CHECK(src_order[std::get<1>(edge_meta.first)] == sink_inode);
195205
CHECK(std::get<2>(edge_meta.first) == switch_id);
196206

197207
REQUIRE(edge_meta.second.has(edge));

0 commit comments

Comments
 (0)