@@ -55,6 +55,7 @@ struct intermediate_node {
55
55
visited = nullptr ;
56
56
on_route = false ;
57
57
has_pins = false ;
58
+ segment_id = -1 ;
58
59
}
59
60
};
60
61
@@ -83,14 +84,6 @@ struct RR_Graph_Builder {
83
84
wire_name_to_seg_idx_[segment_inf_[RRSegmentId (i)].name ] = i;
84
85
}
85
86
86
- for (size_t i = 1 ; i < grid.width () - 1 ; ++i) {
87
- for (size_t j = 1 ; j < grid.height () - 1 ; ++j) {
88
- location loc (i, j);
89
- if (grid[i][j].type ->index == 0 )
90
- empty_tiles.insert (loc);
91
- }
92
- }
93
-
94
87
auto primLib = ar_.getPrimLibs ();
95
88
auto portList = primLib.getPortList ();
96
89
@@ -158,15 +151,13 @@ struct RR_Graph_Builder {
158
151
159
152
std::unordered_map<std::string, int > wire_name_to_seg_idx_;
160
153
161
- std::set<location> empty_tiles;
162
-
163
154
std::set<uint32_t > bel_cell_mappings_;
164
155
165
156
std::unordered_map<int /* tile_id(name)*/ , location> tile_to_loc_;
166
- std::map <location, int /* tile_id(name)*/ > loc_to_tile_;
157
+ std::unordered_map <location, int /* tile_id(name)*/ , hash_tuple::hash<location> > loc_to_tile_;
167
158
168
- std::map <std::tuple<int /* timing_model*/ , bool /* buffered*/ >, int /* idx*/ > pips_models_;
169
- std::map <std::tuple<int /* node_id*/ , int /* node_id*/ >, std::tuple<int /* switch_id*/ , int /* tile_id */ , std::tuple<int /* name*/ , int /* wire0*/ , int /* wire1*/ , bool /* forward*/ >>> pips_;
159
+ std::unordered_map <std::tuple<int /* timing_model*/ , bool /* buffered*/ >, int /* idx*/ , hash_tuple::hash<std::tuple< int , bool >> > pips_models_;
160
+ std::unordered_map <std::tuple<int /* node_id*/ , int /* node_id*/ >, std::tuple<int /* switch_id*/ , int /* tile_id */ , std::tuple<int /* name*/ , int /* wire0*/ , int /* wire1*/ , bool /* forward*/ >>, hash_tuple::hash<std::tuple< int , int >>> pips_;
170
161
171
162
std::map<std::tuple<int , int >, int > wire_to_node_;
172
163
std::unordered_map<int , std::set<location>> node_to_locs_;
@@ -192,9 +183,9 @@ struct RR_Graph_Builder {
192
183
* Sets contain tuples of node ids and location.
193
184
* Each value <n,l> correspondence to node id n being used by either pip or pin at location l.
194
185
*/
195
- std::set <std::tuple<int /* node_id*/ , location>> used_by_pip_;
196
- std::set <std::tuple<int /* node_id*/ , location>> used_by_pin_;
197
- std::set <int /* node_id*/ > usefull_node_;
186
+ std::unordered_set <std::tuple<int /* node_id*/ , location>, hash_tuple::hash<std::tuple< int , location> >> used_by_pip_;
187
+ std::unordered_set <std::tuple<int /* node_id*/ , location>, hash_tuple::hash<std::tuple< int , location> >> used_by_pin_;
188
+ std::unordered_set <int /* node_id*/ > usefull_node_;
198
189
199
190
/* Sink_source_loc_map is used to create ink/source and ipin/opin rr_nodes,
200
191
* rr_edges from sink/source to ipin/opin and from ipin/opin to their coresponding segments
@@ -423,6 +414,10 @@ struct RR_Graph_Builder {
423
414
const auto & wire = ar_.getWires ()[wire_id_];
424
415
int tile_id = wire.getTile ();
425
416
int wire_id = wire.getWire ();
417
+ if (tile_id == 6038 && wire_id == 5471 ) {
418
+ VTR_LOG (" id:%d, wire_id_:%d\n " , id, (int )wire_id_);
419
+ VTR_LOG (" tile:%s wire:%s\n " , str (tile_id).c_str (), str (wire_id).c_str ());
420
+ }
426
421
wire_to_node_[std::make_tuple (tile_id, wire_id)] = id;
427
422
node_to_locs_[id].insert (tile_to_loc_[tile_id]);
428
423
if (wire_name_to_seg_idx_.find (str (wire_id)) == wire_name_to_seg_idx_.end ())
@@ -494,15 +489,19 @@ struct RR_Graph_Builder {
494
489
* Build graph of FPGA Interchange node for further computations
495
490
*/
496
491
std::set<intermediate_node*> build_node_graph (int node_id,
497
- std::set<location> nodes) {
492
+ std::set<location> nodes,
493
+ int & seg_id) {
494
+
498
495
std::set<intermediate_node*> roots;
499
496
std::map<location, intermediate_node*> existing_nodes;
500
497
do {
501
498
intermediate_node* root_node = new intermediate_node ((*nodes.begin ()).first ,
502
499
(*nodes.begin ()).second );
503
500
location key = *nodes.begin ();
504
501
505
- root_node->segment_id = node_tile_to_segment_[std::make_tuple (node_id, loc_to_tile_[key])];
502
+ if (node_tile_to_segment_[std::make_tuple (node_id, loc_to_tile_[key])] != -1 )
503
+ seg_id = node_tile_to_segment_[std::make_tuple (node_id, loc_to_tile_[key])];
504
+
506
505
nodes.erase (key);
507
506
508
507
existing_nodes.emplace (key, root_node);
@@ -523,7 +522,8 @@ struct RR_Graph_Builder {
523
522
temp = existing_nodes[other_loc];
524
523
} else if (nodes.find (other_loc) != nodes.end ()) {
525
524
temp = new intermediate_node (other_loc.first , other_loc.second );
526
- temp->segment_id = node_tile_to_segment_[std::make_tuple (node_id, loc_to_tile_[other_loc])];
525
+ if (node_tile_to_segment_[std::make_tuple (node_id, loc_to_tile_[other_loc])] != -1 )
526
+ seg_id = node_tile_to_segment_[std::make_tuple (node_id, loc_to_tile_[other_loc])];
527
527
nodes.erase (other_loc);
528
528
existing_nodes.emplace (other_loc, temp);
529
529
builder.push (temp);
@@ -550,7 +550,7 @@ struct RR_Graph_Builder {
550
550
* Removes dangling nodes from a graph represented by the root node.
551
551
* Dangling nodes are nodes that do not connect to a pin, a pip or other non-dangling node.
552
552
*/
553
- int reduce_graph_and_count_nodes_left (std::set<intermediate_node*>& roots) {
553
+ int reduce_graph_and_count_nodes_left (std::set<intermediate_node*>& roots, int seg_id ) {
554
554
int cnt = 0 ;
555
555
std::queue<intermediate_node*> walker;
556
556
std::stack<intermediate_node*> back_walker;
@@ -564,6 +564,7 @@ struct RR_Graph_Builder {
564
564
intermediate_node* vertex = walker.front ();
565
565
walker.pop ();
566
566
back_walker.push (vertex);
567
+ vertex->segment_id = seg_id;
567
568
for (auto i : NODESIDES) {
568
569
if (vertex->links [i] != nullptr ) {
569
570
all_nulls = false ;
@@ -581,9 +582,6 @@ struct RR_Graph_Builder {
581
582
intermediate_node* vertex = back_walker.top ();
582
583
back_walker.pop ();
583
584
if (!vertex->has_pins && !vertex->on_route ) {
584
- if (vertex->visited ->segment_id == -1 ) {
585
- vertex->visited ->segment_id = vertex->segment_id ;
586
- }
587
585
for (auto i : NODESIDES) {
588
586
intermediate_node* temp = nullptr ;
589
587
if (vertex->links [i] != nullptr ) {
@@ -598,8 +596,6 @@ struct RR_Graph_Builder {
598
596
delete vertex;
599
597
} else if (vertex->on_route ) {
600
598
vertex->visited ->on_route = true ;
601
- if (vertex->visited ->segment_id == -1 )
602
- vertex->visited ->segment_id = vertex->segment_id ;
603
599
}
604
600
}
605
601
return cnt;
@@ -642,7 +638,10 @@ struct RR_Graph_Builder {
642
638
std::tuple<location, e_rr_type> key1 (vertex->loc , e_rr_type::CHANY);
643
639
std::tuple<location, e_rr_type> key2 (location (vertex->loc .first , vertex->loc .second - 1 ), e_rr_type::CHANX);
644
640
645
- VTR_ASSERT (vertex->segment_id != -1 );
641
+ if (vertex->segment_id == -1 ) {
642
+ VTR_LOG (" node_id:%d X:%d Y:%d\n " , node_id, vertex->loc .first , vertex->loc .second );
643
+ VTR_ASSERT (false );
644
+ }
646
645
647
646
if (is_chany) {
648
647
loc_chan_idx[key1] = chan_loc_map_[key1].size ();
@@ -818,13 +817,14 @@ struct RR_Graph_Builder {
818
817
for (auto const & node : ar_.getNodes ()) {
819
818
std::tuple<int , int > base_wire_ (wires[node.getWires ()[0 ]].getTile (), wires[node.getWires ()[0 ]].getWire ());
820
819
int node_id = wire_to_node_[base_wire_];
820
+ int seg_id;
821
821
if (usefull_node_.find (node_id) == usefull_node_.end ()) {
822
822
continue ;
823
823
}
824
824
std::set<location> all_possible_tiles = node_to_locs_[node_id];
825
825
826
- std::set<intermediate_node*> roots = build_node_graph (node_id, all_possible_tiles);
827
- int div = reduce_graph_and_count_nodes_left (roots);
826
+ std::set<intermediate_node*> roots = build_node_graph (node_id, all_possible_tiles, seg_id );
827
+ int div = reduce_graph_and_count_nodes_left (roots, seg_id );
828
828
if (roots.empty ()) {
829
829
continue ;
830
830
}
@@ -900,8 +900,11 @@ struct RR_Graph_Builder {
900
900
int pin_id = sub_tile.sub_tile_to_tile_pin_indices [port.index ];
901
901
std::tuple<int , int , std::string> key{tile_type_id, it, std::string (port.name )};
902
902
std::tie<float , int >(value, wire_id) = tile_type_site_num_pin_name_model[key];
903
- VTR_ASSERT (wire_to_node_.find (std::make_tuple (tile_id, wire_id)) != wire_to_node_.end ());
904
- node_id = wire_to_node_[std::make_tuple (tile_id, wire_id)];
903
+ if (wire_to_node_.find (std::make_tuple (tile_id, wire_id)) == wire_to_node_.end ()) {
904
+ node_id = -1 ;
905
+ } else {
906
+ node_id = wire_to_node_[std::make_tuple (tile_id, wire_id)];
907
+ }
905
908
906
909
location loc = tile_to_loc_[tile_id];
907
910
@@ -965,18 +968,23 @@ struct RR_Graph_Builder {
965
968
float R, C;
966
969
std::tie (R, C) = input ? std::tuple<float , float >(0 , RC) : std::tuple<float , float >(RC, 0 );
967
970
968
- location track_loc;
969
- e_rr_type track_type;
970
- int track_idx;
971
- VTR_ASSERT (redirect_.find (std::make_tuple (FPGA_Interchange_node_id, loc)) != redirect_.end ());
972
- std::tie (track_loc, track_type, track_idx) = redirect_[std::make_tuple (FPGA_Interchange_node_id, loc)];
973
- auto val = chan_loc_map_[std::make_tuple (track_loc, track_type)][track_idx];
974
- int track_seg;
975
- float track_R, track_C;
976
- std::tie (track_seg, track_R, track_C) = val;
977
- track_R += R;
978
- track_C += C;
979
- chan_loc_map_[std::make_tuple (track_loc, track_type)][track_idx] = std::make_tuple (track_seg, track_R, track_C);
971
+ if (FPGA_Interchange_node_id != -1 ) {
972
+ location track_loc;
973
+ e_rr_type track_type;
974
+ int track_idx;
975
+ if (redirect_.find (std::make_tuple (FPGA_Interchange_node_id, loc)) == redirect_.end ()) {
976
+ VTR_LOG (" node_id:%d, loc->X:%d Y:%d\n " , FPGA_Interchange_node_id, loc.first , loc.second );
977
+ VTR_ASSERT (false );
978
+ }
979
+ std::tie (track_loc, track_type, track_idx) = redirect_[std::make_tuple (FPGA_Interchange_node_id, loc)];
980
+ auto val = chan_loc_map_[std::make_tuple (track_loc, track_type)][track_idx];
981
+ int track_seg;
982
+ float track_R, track_C;
983
+ std::tie (track_seg, track_R, track_C) = val;
984
+ track_R += R;
985
+ track_C += C;
986
+ chan_loc_map_[std::make_tuple (track_loc, track_type)][track_idx] = std::make_tuple (track_seg, track_R, track_C);
987
+ }
980
988
981
989
device_ctx_.rr_nodes .make_room_for_node (RRNodeId (rr_idx));
982
990
loc_type_idx_to_rr_idx_[std::make_tuple (loc, pin, j)] = rr_idx;
@@ -996,7 +1004,10 @@ struct RR_Graph_Builder {
996
1004
}
997
1005
for (size_t j = 0 ; j < pin_vec.size (); ++j) {
998
1006
bool input;
999
- std::tie (input, std::ignore, std::ignore) = pin_vec[j];
1007
+ int FPGA_Interchange_node_id;
1008
+ std::tie (input, std::ignore, FPGA_Interchange_node_id) = pin_vec[j];
1009
+ if (FPGA_Interchange_node_id == -1 )
1010
+ continue ;
1000
1011
e_rr_type pin = input ? e_rr_type::IPIN : e_rr_type::OPIN;
1001
1012
1002
1013
device_ctx_.rr_nodes .make_room_for_node (RRNodeId (rr_idx));
@@ -1076,6 +1087,8 @@ struct RR_Graph_Builder {
1076
1087
bool input;
1077
1088
int node_id;
1078
1089
std::tie (input, std::ignore, node_id) = pin_vec[j];
1090
+ if (node_id == -1 )
1091
+ continue ;
1079
1092
VTR_ASSERT (redirect_.find (std::make_tuple (node_id, loc)) != redirect_.end ());
1080
1093
auto chan_key = redirect_[std::make_tuple (node_id, loc)];
1081
1094
e_rr_type pin = input ? e_rr_type::SINK : e_rr_type::SOURCE;
@@ -1162,10 +1175,7 @@ struct RR_Graph_Builder {
1162
1175
temp = int_to_string (temp, forward ? 1 : 0 );
1163
1176
*temp++ = 0 ;
1164
1177
1165
- vtr::interned_string name_ (device_ctx_.arch ->strings .intern_string (vtr::string_view (" FPGAInterchange" )));
1166
- vtr::interned_string value_ (device_ctx_.arch ->strings .intern_string (vtr::string_view (metadata_)));
1167
-
1168
- vpr::add_rr_edge_metadata (src, sink, sw_id, name_, value_);
1178
+ vpr::add_rr_edge_metadata (src, sink, sw_id, vtr::string_view (" FPGAInterchange" ), vtr::string_view (metadata_));
1169
1179
}
1170
1180
}
1171
1181
0 commit comments