@@ -118,26 +118,28 @@ void add_edges_opin_chanz_per_side(const RRGraphView& rr_graph,
118118
119119 std::vector<RRNodeId> opin_nodes = node_lookup.find_pin_nodes_at_side (layer, x, y, e_rr_type::OPIN, side);
120120
121- t_physical_tile_loc sb_loc0, sb_loc1;
121+ // Two switch-block location adjacent to this channel segment
122+ std::array<t_physical_tile_loc, 2 > adjacent_sb_loc;
123+
122124 switch (side) {
123125 case TOP:
124- sb_loc0 = {x, y, layer};
125- sb_loc1 = {x - 1 , y, layer};
126+ adjacent_sb_loc[ 0 ] = {x, y, layer};
127+ adjacent_sb_loc[ 1 ] = {x - 1 , y, layer};
126128 break ;
127129
128130 case BOTTOM:
129- sb_loc0 = {x, y - 1 , layer};
130- sb_loc1 = {x - 1 , y - 1 , layer};
131+ adjacent_sb_loc[ 0 ] = {x, y - 1 , layer};
132+ adjacent_sb_loc[ 1 ] = {x - 1 , y - 1 , layer};
131133 break ;
132134
133135 case RIGHT:
134- sb_loc0 = {x, y, layer};
135- sb_loc1 = {x, y - 1 , layer};
136+ adjacent_sb_loc[ 0 ] = {x, y, layer};
137+ adjacent_sb_loc[ 1 ] = {x, y - 1 , layer};
136138 break ;
137139
138140 case LEFT:
139- sb_loc0 = {x - 1 , y, layer};
140- sb_loc1 = {x - 1 , y - 1 , layer};
141+ adjacent_sb_loc[ 0 ] = {x - 1 , y, layer};
142+ adjacent_sb_loc[ 1 ] = {x - 1 , y - 1 , layer};
141143 break ;
142144
143145 default :
@@ -147,11 +149,11 @@ void add_edges_opin_chanz_per_side(const RRGraphView& rr_graph,
147149 const int grid_width = grid.width ();
148150 const int grid_height = grid.height ();
149151
150- sb_loc0 .x = std::clamp (sb_loc0 .x , 0 , grid_width - 1 );
151- sb_loc0 .y = std::clamp (sb_loc0 .y , 0 , grid_height - 1 );
152+ adjacent_sb_loc[ 0 ] .x = std::clamp (adjacent_sb_loc[ 0 ] .x , 0 , grid_width - 1 );
153+ adjacent_sb_loc[ 0 ] .y = std::clamp (adjacent_sb_loc[ 0 ] .y , 0 , grid_height - 1 );
152154
153- sb_loc1 .x = std::clamp (sb_loc1 .x , 0 , grid_width - 1 );
154- sb_loc1 .y = std::clamp (sb_loc1 .y , 0 , grid_height - 1 );
155+ adjacent_sb_loc[ 1 ] .x = std::clamp (adjacent_sb_loc[ 1 ] .x , 0 , grid_width - 1 );
156+ adjacent_sb_loc[ 1 ] .y = std::clamp (adjacent_sb_loc[ 1 ] .y , 0 , grid_height - 1 );
155157
156158 std::vector<std::pair<RRNodeId, short >> selected_chanz_nodes0;
157159 std::vector<std::pair<RRNodeId, short >> selected_chanz_nodes1;
@@ -163,19 +165,19 @@ void add_edges_opin_chanz_per_side(const RRGraphView& rr_graph,
163165 }
164166
165167 selected_chanz_nodes0.clear ();
166- for (size_t track_num = 0 ; track_num < interdie_3d_links[sb_loc0 .x ][sb_loc0 .y ].size (); track_num++) {
167- const t_bottleneck_link& bottleneck_link = interdie_3d_links[sb_loc0 .x ][sb_loc0 .y ][track_num];
168+ for (size_t track_num = 0 ; track_num < interdie_3d_links[adjacent_sb_loc[ 0 ] .x ][adjacent_sb_loc[ 0 ] .y ].size (); track_num++) {
169+ const t_bottleneck_link& bottleneck_link = interdie_3d_links[adjacent_sb_loc[ 0 ] .x ][adjacent_sb_loc[ 0 ] .y ][track_num];
168170 if (bottleneck_link.parallel_segment_index == seg_index && bottleneck_link.gather_loc .layer_num == layer) {
169- RRNodeId node_id = node_lookup.find_node (sb_loc0 .layer_num , sb_loc0 .x , sb_loc0 .y , e_rr_type::CHANZ, track_num);
171+ RRNodeId node_id = node_lookup.find_node (adjacent_sb_loc[ 0 ] .layer_num , adjacent_sb_loc[ 0 ] .x , adjacent_sb_loc[ 0 ] .y , e_rr_type::CHANZ, track_num);
170172 selected_chanz_nodes0.emplace_back (node_id, bottleneck_link.arch_wire_switch );
171173 }
172174 }
173175
174176 selected_chanz_nodes1.clear ();
175- for (size_t track_num = 0 ; track_num < interdie_3d_links[sb_loc1 .x ][sb_loc1 .y ].size (); track_num++) {
176- const t_bottleneck_link& bottleneck_link = interdie_3d_links[sb_loc1 .x ][sb_loc1 .y ][track_num];
177+ for (size_t track_num = 0 ; track_num < interdie_3d_links[adjacent_sb_loc[ 1 ] .x ][adjacent_sb_loc[ 1 ] .y ].size (); track_num++) {
178+ const t_bottleneck_link& bottleneck_link = interdie_3d_links[adjacent_sb_loc[ 1 ] .x ][adjacent_sb_loc[ 1 ] .y ][track_num];
177179 if (bottleneck_link.parallel_segment_index == seg_index && bottleneck_link.gather_loc .layer_num == layer) {
178- RRNodeId node_id = node_lookup.find_node (sb_loc1 .layer_num , sb_loc1 .x , sb_loc1 .y , e_rr_type::CHANZ, track_num);
180+ RRNodeId node_id = node_lookup.find_node (adjacent_sb_loc[ 1 ] .layer_num , adjacent_sb_loc[ 1 ] .x , adjacent_sb_loc[ 1 ] .y , e_rr_type::CHANZ, track_num);
179181 selected_chanz_nodes1.emplace_back (node_id, bottleneck_link.arch_wire_switch );
180182 }
181183 }
@@ -188,16 +190,16 @@ void add_edges_opin_chanz_per_side(const RRGraphView& rr_graph,
188190
189191 RRNodeId chanz_node_id;
190192 short switch_id;
191- if (Fc_zofs[sb_loc0 .x ][sb_loc0 .y ][seg_index] < Fc_zofs[sb_loc1 .x ][sb_loc1 .y ][seg_index]) {
192- int chanz_idx = Fc_zofs[sb_loc0 .x ][sb_loc0 .y ][seg_index];
193+ if (Fc_zofs[adjacent_sb_loc[ 0 ] .x ][adjacent_sb_loc[ 0 ] .y ][seg_index] < Fc_zofs[adjacent_sb_loc[ 1 ] .x ][adjacent_sb_loc[ 1 ] .y ][seg_index]) {
194+ int chanz_idx = Fc_zofs[adjacent_sb_loc[ 0 ] .x ][adjacent_sb_loc[ 0 ] .y ][seg_index];
193195 chanz_node_id = selected_chanz_nodes0[chanz_idx % selected_chanz_nodes0.size ()].first ;
194196 switch_id = selected_chanz_nodes0[chanz_idx % selected_chanz_nodes0.size ()].second ;
195- Fc_zofs[sb_loc0 .x ][sb_loc0 .y ][seg_index]++;
197+ Fc_zofs[adjacent_sb_loc[ 0 ] .x ][adjacent_sb_loc[ 0 ] .y ][seg_index]++;
196198 } else {
197- int chanz_idx = Fc_zofs[sb_loc1 .x ][sb_loc1 .y ][seg_index];
199+ int chanz_idx = Fc_zofs[adjacent_sb_loc[ 1 ] .x ][adjacent_sb_loc[ 1 ] .y ][seg_index];
198200 chanz_node_id = selected_chanz_nodes1[chanz_idx % selected_chanz_nodes1.size ()].first ;
199201 switch_id = selected_chanz_nodes1[chanz_idx % selected_chanz_nodes1.size ()].second ;
200- Fc_zofs[sb_loc1 .x ][sb_loc1 .y ][seg_index]++;
202+ Fc_zofs[adjacent_sb_loc[ 1 ] .x ][adjacent_sb_loc[ 1 ] .y ][seg_index]++;
201203 }
202204
203205 rr_edges_to_create.emplace_back (opin_node_id, chanz_node_id, switch_id, false );
0 commit comments