Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 81b5aa2

Browse files
authoredFeb 4, 2022
Merge pull request #1952 from RapidSilicon/metadata
Data structure rr_node_metadata/rr_edge_metadata owner change
2 parents d15ed67 + 8ed65ce commit 81b5aa2

File tree

10 files changed

+144
-66
lines changed

10 files changed

+144
-66
lines changed
 

‎vpr/src/base/vpr_context.h

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -163,12 +163,19 @@ struct DeviceContext : public Context {
163163
/* A writeable view of routing resource graph to be the ONLY database
164164
* for routing resource graph builder functions.
165165
*/
166-
RRGraphBuilder rr_graph_builder{&rr_nodes, &rr_node_metadata, &rr_edge_metadata};
166+
RRGraphBuilder rr_graph_builder{&rr_nodes};
167167

168168
/* A read-only view of routing resource graph to be the ONLY database
169169
* for client functions: GUI, placer, router, timing analyzer etc.
170170
*/
171-
RRGraphView rr_graph{rr_nodes, rr_graph_builder.node_lookup(), rr_indexed_data, rr_graph_builder.rr_segments(), rr_graph_builder.rr_switch()};
171+
RRGraphView rr_graph{rr_nodes,
172+
rr_graph_builder.node_lookup(),
173+
rr_graph_builder.rr_node_metadata(),
174+
rr_graph_builder.rr_edge_metadata(),
175+
rr_indexed_data,
176+
rr_graph_builder.rr_segments(),
177+
rr_graph_builder.rr_switch()};
178+
172179
int num_arch_switches;
173180
t_arch_switch_inf* arch_switch_inf; // [0..(num_arch_switches-1)]
174181

@@ -188,25 +195,6 @@ struct DeviceContext : public Context {
188195
*/
189196
int virtual_clock_network_root_idx;
190197

191-
/**
192-
* @brief Attributes for each rr_node.
193-
*
194-
* key: rr_node index
195-
* value: map of <attribute_name, attribute_value>
196-
*/
197-
MetadataStorage<int> rr_node_metadata;
198-
/**
199-
* @brief Attributes for each rr_edge
200-
*
201-
* key: <source rr_node_index, sink rr_node_index, iswitch>
202-
* iswitch: Index of the switch type used to go from this rr_node to
203-
* the next one in the routing. OPEN if there is no next node
204-
* (i.e. this node is the last one (a SINK) in a branch of the
205-
* net's routing).
206-
* value: map of <attribute_name, attribute_value>
207-
*/
208-
MetadataStorage<std::tuple<int, int, short>> rr_edge_metadata;
209-
210198
/**
211199
* @brief switch_fanin_remap is only used for printing out switch fanin stats
212200
* (the -switch_stats option)

‎vpr/src/device/rr_graph_builder.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,8 @@
77

88
//#include "globals.h"
99

10-
RRGraphBuilder::RRGraphBuilder(t_rr_graph_storage* node_storage,
11-
MetadataStorage<int>* rr_node_metadata,
12-
MetadataStorage<std::tuple<int, int, short>>* rr_edge_metadata)
13-
: node_storage_(*node_storage)
14-
, rr_node_metadata_(*rr_node_metadata)
15-
, rr_edge_metadata_(*rr_edge_metadata) {
10+
RRGraphBuilder::RRGraphBuilder(t_rr_graph_storage* node_storage)
11+
: node_storage_(*node_storage) {
1612
}
1713

1814
t_rr_graph_storage& RRGraphBuilder::node_storage() {
@@ -23,6 +19,14 @@ RRSpatialLookup& RRGraphBuilder::node_lookup() {
2319
return node_lookup_;
2420
}
2521

22+
MetadataStorage<int>& RRGraphBuilder::rr_node_metadata() {
23+
return rr_node_metadata_;
24+
}
25+
26+
MetadataStorage<std::tuple<int, int, short>>& RRGraphBuilder::rr_edge_metadata() {
27+
return rr_edge_metadata_;
28+
}
29+
2630
void RRGraphBuilder::add_node_to_all_locs(RRNodeId node) {
2731
t_rr_type node_type = node_storage_.node_type(node);
2832
short node_ptc_num = node_storage_.node_ptc_num(node);
@@ -59,6 +63,8 @@ void RRGraphBuilder::add_node_to_all_locs(RRNodeId node) {
5963

6064
void RRGraphBuilder::clear() {
6165
node_lookup_.clear();
66+
rr_node_metadata_.clear();
67+
rr_edge_metadata_.clear();
6268
rr_segments_.clear();
6369
rr_switch_inf_.clear();
6470
}
@@ -123,8 +129,8 @@ void RRGraphBuilder::reorder_nodes(e_rr_node_reorder_algorithm reorder_rr_graph_
123129

124130
node_lookup().reorder(dest_order);
125131

126-
rr_node_metadata_.remap_keys([&](int node) { return size_t(dest_order[RRNodeId(node)]); });
127-
rr_edge_metadata_.remap_keys([&](std::tuple<int, int, short> edge) {
132+
rr_node_metadata().remap_keys([&](int node) { return size_t(dest_order[RRNodeId(node)]); });
133+
rr_edge_metadata().remap_keys([&](std::tuple<int, int, short> edge) {
128134
return std::make_tuple(size_t(dest_order[RRNodeId(std::get<0>(edge))]),
129135
size_t(dest_order[RRNodeId(std::get<1>(edge))]),
130136
std::get<2>(edge));

‎vpr/src/device/rr_graph_builder.h

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ class RRGraphBuilder {
2121
/* -- Constructors -- */
2222
public:
2323
/* See detailed comments about the data structures in the internal data storage section of this file */
24-
RRGraphBuilder(t_rr_graph_storage* node_storage,
25-
MetadataStorage<int>* rr_node_metadata,
26-
MetadataStorage<std::tuple<int, int, short>>* rr_edge_metadata);
24+
RRGraphBuilder(t_rr_graph_storage* node_storage);
2725

2826
/* Disable copy constructors and copy assignment operator
2927
* This is to avoid accidental copy because it could be an expensive operation considering that the
@@ -40,6 +38,38 @@ class RRGraphBuilder {
4038
t_rr_graph_storage& node_storage();
4139
/** @brief Return a writable object for update the fast look-up of rr_node */
4240
RRSpatialLookup& node_lookup();
41+
/** .. warning:: The Metadata should stay as an independent data structure than rest of the internal data,
42+
* e.g., node_lookup! */
43+
/** @brief Return a writable object for the meta data on the nodes */
44+
MetadataStorage<int>& rr_node_metadata();
45+
/** @brief Return a writable object for the meta data on the edge */
46+
MetadataStorage<std::tuple<int, int, short>>& rr_edge_metadata();
47+
48+
/** @brief Return the size for rr_node_metadata */
49+
inline size_t rr_node_metadata_size() const {
50+
return rr_node_metadata_.size();
51+
}
52+
/** @brief Return the size for rr_edge_metadata */
53+
inline size_t rr_edge_metadata_size() const {
54+
return rr_edge_metadata_.size();
55+
}
56+
/** @brief Find the node in rr_node_metadata */
57+
inline vtr::flat_map<int, t_metadata_dict>::const_iterator find_rr_node_metadata(const int& lookup_key) const {
58+
return rr_node_metadata_.find(lookup_key);
59+
}
60+
/** @brief Find the edge in rr_edge_metadata */
61+
inline vtr::flat_map<std::tuple<int, int, short int>, t_metadata_dict>::const_iterator find_rr_edge_metadata(const std::tuple<int, int, short int>& lookup_key) const {
62+
return rr_edge_metadata_.find(lookup_key);
63+
}
64+
/** @brief Return the last node in rr_node_metadata */
65+
inline vtr::flat_map<int, t_metadata_dict>::const_iterator end_rr_node_metadata() const {
66+
return rr_node_metadata_.end();
67+
}
68+
69+
/** @brief Return the last edge in rr_edge_metadata */
70+
inline vtr::flat_map<std::tuple<int, int, short int>, t_metadata_dict>::const_iterator end_rr_edge_metadata() const {
71+
return rr_edge_metadata_.end();
72+
}
4373

4474
/** @brief Add a rr_segment to the routing resource graph. Return an valid id if successful.
4575
* - Each rr_segment contains the detailed information of a routing track, which is denoted by a node in CHANX or CHANY type.
@@ -304,13 +334,30 @@ class RRGraphBuilder {
304334
/* Detailed information about the switches, which are used in the RRGraph */
305335
vtr::vector<RRSwitchId, t_rr_switch_inf> rr_switch_inf_;
306336

337+
/** .. warning:: The Metadata should stay as an independent data structure than rest of the internal data,
338+
* e.g., node_lookup! */
307339
/* Metadata is an extra data on rr-nodes and edges, respectively, that is not used by vpr
308340
* but simply passed through the flow so that it can be used by downstream tools.
309341
* The main (perhaps only) current use of this metadata is the fasm tool of symbiflow,
310342
* which needs extra metadata on which programming bits control which switch in order to produce a bitstream.*/
311-
312-
MetadataStorage<int>& rr_node_metadata_;
313-
MetadataStorage<std::tuple<int, int, short>>& rr_edge_metadata_;
343+
/**
344+
* @brief Attributes for each rr_node.
345+
*
346+
* key: rr_node index
347+
* value: map of <attribute_name, attribute_value>
348+
*/
349+
MetadataStorage<int> rr_node_metadata_;
350+
/**
351+
* @brief Attributes for each rr_edge
352+
*
353+
* key: <source rr_node_index, sink rr_node_index, iswitch>
354+
* iswitch: Index of the switch type used to go from this rr_node to
355+
* the next one in the routing. OPEN if there is no next node
356+
* (i.e. this node is the last one (a SINK) in a branch of the
357+
* net's routing).
358+
* value: map of <attribute_name, attribute_value>
359+
*/
360+
MetadataStorage<std::tuple<int, int, short>> rr_edge_metadata_;
314361
};
315362

316363
#endif

‎vpr/src/device/rr_graph_view.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,17 @@
22
#include "rr_node.h"
33
#include "physical_types.h"
44

5-
RRGraphView::RRGraphView(const t_rr_graph_storage& node_storage, const RRSpatialLookup& node_lookup, const vtr::vector<RRIndexedDataId, t_rr_indexed_data>& rr_indexed_data, const vtr::vector<RRSegmentId, t_segment_inf>& rr_segments, const vtr::vector<RRSwitchId, t_rr_switch_inf>& rr_switch_inf)
5+
RRGraphView::RRGraphView(const t_rr_graph_storage& node_storage,
6+
const RRSpatialLookup& node_lookup,
7+
const MetadataStorage<int>& rr_node_metadata,
8+
const MetadataStorage<std::tuple<int, int, short>>& rr_edge_metadata,
9+
const vtr::vector<RRIndexedDataId, t_rr_indexed_data>& rr_indexed_data,
10+
const vtr::vector<RRSegmentId, t_segment_inf>& rr_segments,
11+
const vtr::vector<RRSwitchId, t_rr_switch_inf>& rr_switch_inf)
612
: node_storage_(node_storage)
713
, node_lookup_(node_lookup)
14+
, rr_node_metadata_(rr_node_metadata)
15+
, rr_edge_metadata_(rr_edge_metadata)
816
, rr_indexed_data_(rr_indexed_data)
917
, rr_segments_(rr_segments)
1018
, rr_switch_inf_(rr_switch_inf) {

‎vpr/src/device/rr_graph_view.h

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class RRGraphView {
3737
/* See detailed comments about the data structures in the internal data storage section of this file */
3838
RRGraphView(const t_rr_graph_storage& node_storage,
3939
const RRSpatialLookup& node_lookup,
40+
const MetadataStorage<int>& rr_node_metadata,
41+
const MetadataStorage<std::tuple<int, int, short>>& rr_edge_metadata,
4042
const vtr::vector<RRIndexedDataId, t_rr_indexed_data>& rr_indexed_data,
4143
const vtr::vector<RRSegmentId, t_segment_inf>& rr_segments,
4244
const vtr::vector<RRSwitchId, t_rr_switch_inf>& rr_switch_inf);
@@ -419,6 +421,15 @@ class RRGraphView {
419421
const RRSpatialLookup& node_lookup() const {
420422
return node_lookup_;
421423
}
424+
/** .. warning:: The Metadata should stay as an independent data structure than rest of the internal data,
425+
* e.g., node_lookup! */
426+
MetadataStorage<int> rr_node_metadata_data() const {
427+
return rr_node_metadata_;
428+
}
429+
430+
MetadataStorage<std::tuple<int, int, short>> rr_edge_metadata_data() const {
431+
return rr_edge_metadata_;
432+
}
422433

423434
/* -- Internal data storage -- */
424435
/* Note: only read-only object or data structures are allowed!!! */
@@ -427,10 +438,32 @@ class RRGraphView {
427438
const t_rr_graph_storage& node_storage_;
428439
/* Fast look-up for rr nodes */
429440
const RRSpatialLookup& node_lookup_;
430-
441+
/** .. warning:: The Metadata should stay as an independent data structure than rest of the internal data,
442+
* e.g., node_lookup! */
443+
/* Metadata is an extra data on rr-nodes and edges, respectively, that is not used by vpr
444+
* but simply passed through the flow so that it can be used by downstream tools.
445+
* The main (perhaps only) current use of this metadata is the fasm tool of symbiflow,
446+
* which needs extra metadata on which programming bits control which switch in order to produce a bitstream.*/
447+
/**
448+
* @brief Attributes for each rr_node.
449+
*
450+
* key: rr_node index
451+
* value: map of <attribute_name, attribute_value>
452+
*/
453+
const MetadataStorage<int>& rr_node_metadata_;
454+
/**
455+
* @brief Attributes for each rr_edge
456+
*
457+
* key: <source rr_node_index, sink rr_node_index, iswitch>
458+
* iswitch: Index of the switch type used to go from this rr_node to
459+
* the next one in the routing. OPEN if there is no next node
460+
* (i.e. this node is the last one (a SINK) in a branch of the
461+
* net's routing).
462+
* value: map of <attribute_name, attribute_value>
463+
*/
464+
const MetadataStorage<std::tuple<int, int, short>>& rr_edge_metadata_;
431465
/* rr_indexed_data_ and rr_segments_ are needed to lookup the segment information in node_coordinate_to_string() */
432466
const vtr::vector<RRIndexedDataId, t_rr_indexed_data>& rr_indexed_data_;
433-
434467
/* Segment info for rr nodes */
435468
const vtr::vector<RRSegmentId, t_segment_inf>& rr_segments_;
436469
/* switch info for rr nodes */

‎vpr/src/route/rr_graph.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1413,10 +1413,6 @@ void free_rr_graph() {
14131413

14141414
device_ctx.switch_fanin_remap.clear();
14151415

1416-
device_ctx.rr_node_metadata.clear();
1417-
1418-
device_ctx.rr_edge_metadata.clear();
1419-
14201416
invalidate_router_lookahead_cache();
14211417
}
14221418

‎vpr/src/route/rr_graph_reader.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ void load_rr_file(const t_graph_type graph_type,
7272
device_ctx.rr_graph.rr_segments(),
7373
device_ctx.physical_tile_types,
7474
grid,
75-
&device_ctx.rr_node_metadata,
76-
&device_ctx.rr_edge_metadata,
75+
&device_ctx.rr_graph_builder.rr_node_metadata(),
76+
&device_ctx.rr_graph_builder.rr_edge_metadata(),
7777
&device_ctx.arch->strings);
7878

7979
if (vtr::check_file_name_extension(read_rr_graph_name, ".xml")) {

‎vpr/src/route/rr_graph_writer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ void write_rr_graph(const char* file_name) {
4545
device_ctx.rr_graph.rr_segments(),
4646
device_ctx.physical_tile_types,
4747
device_ctx.grid,
48-
&device_ctx.rr_node_metadata,
49-
&device_ctx.rr_edge_metadata,
48+
&device_ctx.rr_graph_builder.rr_node_metadata(),
49+
&device_ctx.rr_graph_builder.rr_edge_metadata(),
5050
&device_ctx.arch->strings);
5151

5252
if (vtr::check_file_name_extension(file_name, ".xml")) {

‎vpr/src/route/rr_metadata.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,33 @@ namespace vpr {
77
const t_metadata_value* rr_node_metadata(int src_node, vtr::interned_string key) {
88
auto& device_ctx = g_vpr_ctx.device();
99

10-
auto iter = device_ctx.rr_node_metadata.find(src_node);
11-
if (iter == device_ctx.rr_node_metadata.end()) {
10+
auto iter = device_ctx.rr_graph_builder.find_rr_node_metadata(src_node);
11+
if (iter == device_ctx.rr_graph_builder.end_rr_node_metadata()) {
1212
return nullptr;
1313
}
1414
return iter->second.one(key);
1515
}
1616

1717
void add_rr_node_metadata(int src_node, vtr::interned_string key, vtr::interned_string value) {
1818
auto& device_ctx = g_vpr_ctx.mutable_device();
19-
device_ctx.rr_node_metadata.add_metadata(src_node,
20-
key,
21-
value);
19+
device_ctx.rr_graph_builder.rr_node_metadata().add_metadata(src_node,
20+
key,
21+
value);
2222
}
2323

2424
void add_rr_node_metadata(int src_node, vtr::string_view key, vtr::string_view value) {
2525
auto& device_ctx = g_vpr_ctx.mutable_device();
26-
device_ctx.rr_node_metadata.add_metadata(src_node,
27-
device_ctx.arch->strings.intern_string(key),
28-
device_ctx.arch->strings.intern_string(value));
26+
device_ctx.rr_graph_builder.rr_node_metadata().add_metadata(src_node,
27+
device_ctx.arch->strings.intern_string(key),
28+
device_ctx.arch->strings.intern_string(value));
2929
}
3030

3131
const t_metadata_value* rr_edge_metadata(int src_node, int sink_id, short switch_id, vtr::interned_string key) {
3232
const auto& device_ctx = g_vpr_ctx.device();
3333
auto rr_edge = std::make_tuple(src_node, sink_id, switch_id);
3434

35-
auto iter = device_ctx.rr_edge_metadata.find(rr_edge);
36-
if (iter == device_ctx.rr_edge_metadata.end()) {
35+
auto iter = device_ctx.rr_graph_builder.find_rr_edge_metadata(rr_edge);
36+
if (iter == device_ctx.rr_graph_builder.end_rr_edge_metadata()) {
3737
return nullptr;
3838
}
3939

@@ -43,17 +43,17 @@ const t_metadata_value* rr_edge_metadata(int src_node, int sink_id, short switch
4343
void add_rr_edge_metadata(int src_node, int sink_id, short switch_id, vtr::string_view key, vtr::string_view value) {
4444
auto& device_ctx = g_vpr_ctx.mutable_device();
4545
auto rr_edge = std::make_tuple(src_node, sink_id, switch_id);
46-
device_ctx.rr_edge_metadata.add_metadata(rr_edge,
47-
device_ctx.arch->strings.intern_string(key),
48-
device_ctx.arch->strings.intern_string(value));
46+
device_ctx.rr_graph_builder.rr_edge_metadata().add_metadata(rr_edge,
47+
device_ctx.arch->strings.intern_string(key),
48+
device_ctx.arch->strings.intern_string(value));
4949
}
5050

5151
void add_rr_edge_metadata(int src_node, int sink_id, short switch_id, vtr::interned_string key, vtr::interned_string value) {
5252
auto& device_ctx = g_vpr_ctx.mutable_device();
5353
auto rr_edge = std::make_tuple(src_node, sink_id, switch_id);
54-
device_ctx.rr_edge_metadata.add_metadata(rr_edge,
55-
key,
56-
value);
54+
device_ctx.rr_graph_builder.rr_edge_metadata().add_metadata(rr_edge,
55+
key,
56+
value);
5757
}
5858

5959
} // namespace vpr

‎vpr/test/test_vpr.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,21 +188,21 @@ TEST_CASE("read_rr_graph_metadata", "[vpr]") {
188188
std::mt19937 g(1);
189189
std::shuffle(src_order.begin(), src_order.end(), g);
190190

191-
CHECK(device_ctx.rr_node_metadata.size() == 1);
192-
CHECK(device_ctx.rr_edge_metadata.size() == 1);
191+
CHECK(device_ctx.rr_graph_builder.rr_node_metadata_size() == 1);
192+
CHECK(device_ctx.rr_graph_builder.rr_edge_metadata_size() == 1);
193193

194194
auto node = arch.strings.intern_string(vtr::string_view("node"));
195195
auto edge = arch.strings.intern_string(vtr::string_view("edge"));
196196

197-
for (const auto& node_meta : device_ctx.rr_node_metadata) {
197+
for (const auto& node_meta : device_ctx.rr_graph.rr_node_metadata_data()) {
198198
CHECK(src_order[node_meta.first] == src_inode);
199199
REQUIRE(node_meta.second.has(node));
200200
auto* value = node_meta.second.one(node);
201201
REQUIRE(value != nullptr);
202202
CHECK_THAT(value->as_string().get(&arch.strings), Equals("test node"));
203203
}
204204

205-
for (const auto& edge_meta : device_ctx.rr_edge_metadata) {
205+
for (const auto& edge_meta : device_ctx.rr_graph.rr_edge_metadata_data()) {
206206
CHECK(src_order[std::get<0>(edge_meta.first)] == src_inode);
207207
CHECK(src_order[std::get<1>(edge_meta.first)] == sink_inode);
208208
CHECK(std::get<2>(edge_meta.first) == switch_id);

0 commit comments

Comments
 (0)
Please sign in to comment.