@@ -27,7 +27,8 @@ static void walk_cluster_recursive(const RRGraphView& rr_graph,
27
27
VTR_ASSERT_SAFE (parent != RRNodeId::INVALID ());
28
28
29
29
if (rr_graph.node_type (parent) == e_rr_type::CHANX || rr_graph.node_type (parent) == e_rr_type::CHANY) { /* Outside of origin cluster */
30
- VTR_ASSERT_SAFE (rr_graph.node_type (curr) == e_rr_type::IPIN);
30
+ if (rr_graph.node_type (curr) != e_rr_type::IPIN)
31
+ return ;
31
32
32
33
// If the parent node isn't in the origin's cluster, the current node is a "cluster-edge" pin,
33
34
// so add it to sink_ipins
@@ -140,13 +141,20 @@ void set_sink_locs(const RRGraphView& rr_graph, RRGraphBuilder& rr_graph_builder
140
141
std::unordered_map<t_physical_tile_type_ptr, std::unordered_map<size_t , Offset>> physical_type_offsets;
141
142
142
143
// Helper fn. to remove old sink locations from RRSpatialLookup
143
- auto remove_sink_locs_from_lookup = [&](Offset bottom_left, Offset top_right, Offset exclude, RRNodeId node, size_t layer, size_t ptc) {
144
+ auto remove_sink_locs_from_lookup = [&](Offset bottom_left, Offset top_right, Offset new_sink_loc, RRNodeId node, size_t layer, size_t ptc) {
145
+ if (rr_graph_builder.node_lookup ().find_node ((int )layer, (int )new_sink_loc.x (), (int )new_sink_loc.y (), SINK, (int )ptc) == RRNodeId::INVALID ()) {
146
+ rr_graph_builder.node_lookup ().add_node (node, (int )layer, (int )new_sink_loc.x (), (int )new_sink_loc.y (), SINK, ptc);
147
+ }
148
+
144
149
for (size_t x = bottom_left.x (); x <= top_right.x (); ++x) {
145
150
for (size_t y = bottom_left.y (); y <= top_right.y (); ++y) {
146
- if (x == exclude .x () && y == exclude .y ()) /* The new sink location */
151
+ if (x == new_sink_loc .x () && y == new_sink_loc .y ()) /* The new sink location */
147
152
continue ;
148
153
149
- rr_graph_builder.node_lookup ().remove_node (node, (int )layer, (int )x, (int )y, SINK, ptc);
154
+ if (rr_graph_builder.node_lookup ().find_node ((int )layer, (int )x, (int )y, SINK, (int )ptc) == RRNodeId::INVALID ())
155
+ continue ;
156
+
157
+ rr_graph_builder.node_lookup ().remove_node (node, (int )layer, (int )x, (int )y, SINK, (int )ptc);
150
158
}
151
159
}
152
160
};
@@ -159,10 +167,16 @@ void set_sink_locs(const RRGraphView& rr_graph, RRGraphBuilder& rr_graph_builder
159
167
continue ;
160
168
161
169
// Skip 1x1 tiles
162
- size_t tile_xlow = rr_graph.node_xlow (node_id);
163
- size_t tile_ylow = rr_graph.node_ylow (node_id);
164
- size_t tile_xhigh = rr_graph.node_xhigh (node_id);
165
- size_t tile_yhigh = rr_graph.node_yhigh (node_id);
170
+ size_t node_xlow = rr_graph.node_xlow (node_id);
171
+ size_t node_ylow = rr_graph.node_ylow (node_id);
172
+
173
+ size_t tile_layer = rr_graph.node_layer (node_id);
174
+ t_physical_tile_type_ptr tile_type = grid.get_physical_type ({(int )node_xlow, (int )node_ylow, (int )tile_layer});
175
+
176
+ size_t tile_xlow = node_xlow - grid.get_width_offset ({(int )node_xlow, (int )node_ylow, (int )tile_layer});
177
+ size_t tile_ylow = node_ylow - grid.get_height_offset ({(int )node_xlow, (int )node_ylow, (int )tile_layer});
178
+ size_t tile_xhigh = tile_xlow + tile_type->width - 1 ;
179
+ size_t tile_yhigh = tile_ylow + tile_type->height - 1 ;
166
180
167
181
size_t tile_width = tile_xhigh - tile_xlow;
168
182
size_t tile_height = tile_yhigh - tile_ylow;
@@ -171,9 +185,6 @@ void set_sink_locs(const RRGraphView& rr_graph, RRGraphBuilder& rr_graph_builder
171
185
continue ;
172
186
173
187
// See if we have encountered this tile type/ptc combo before, and used saved offset if so
174
- size_t tile_layer = rr_graph.node_layer (node_id);
175
- t_physical_tile_type_ptr tile_type = grid.get_physical_type ({(int )tile_xlow, (int )tile_ylow, (int )tile_layer});
176
-
177
188
size_t sink_ptc = rr_graph.node_ptc_num (node_id);
178
189
179
190
if ((physical_type_offsets.find (tile_type) != physical_type_offsets.end ()) && (physical_type_offsets[tile_type].find (sink_ptc) != physical_type_offsets[tile_type].end ())) {
0 commit comments