@@ -497,7 +497,8 @@ struct RR_Graph_Builder {
497
497
}
498
498
}
499
499
existing_nodes.erase (vertex->loc );
500
- delete (vertex);
500
+ VTR_ASSERT (vertex != root_node);
501
+ delete vertex;
501
502
}
502
503
503
504
for (auto & node : existing_nodes) {
@@ -518,11 +519,11 @@ struct RR_Graph_Builder {
518
519
* Removes dangling nodes from a graph represented by the root node.
519
520
* Dangling nodes are nodes that do not connect to a pin, a pip or other non-dangling node.
520
521
*/
521
- int reduce_graph_and_count_nodes (node_* root) {
522
+ int reduce_graph_and_count_nodes (node_*& root) {
522
523
int cnt = 0 ;
523
524
std::queue<node_*> walker;
524
525
std::stack<node_*> back_walker;
525
- walker.push (root);
526
+ walker.emplace (root);
526
527
root->visited = root;
527
528
bool all_nulls;
528
529
while (!walker.empty ()) {
@@ -559,7 +560,9 @@ struct RR_Graph_Builder {
559
560
temp->links [(i + 2 ) % 4 ] = nullptr ;
560
561
}
561
562
}
562
- delete (vertex);
563
+ if (vertex == root)
564
+ root = nullptr ;
565
+ delete vertex;
563
566
} else if (vertex->on_route ) {
564
567
vertex->visited ->on_route = true ;
565
568
if (vertex->visited ->segment_id == -1 )
@@ -577,12 +580,12 @@ struct RR_Graph_Builder {
577
580
578
581
std::queue<node_*> walker;
579
582
std::stack<node_*> back_walker;
580
- walker.emplace (root);
583
+ walker.push (root);
581
584
bool all_nulls, is_chanx, is_chany;
582
585
while (!walker.empty ()) {
583
586
node_* vertex = walker.front ();
584
587
walker.pop ();
585
- back_walker.emplace (vertex);
588
+ back_walker.push (vertex);
586
589
is_chany = false ;
587
590
is_chanx = vertex->has_pins ;
588
591
all_nulls = true ;
@@ -594,7 +597,7 @@ struct RR_Graph_Builder {
594
597
is_chany = i == 1 ? true : is_chany;
595
598
}
596
599
if (vertex->links [i]->visited == vertex) {
597
- walker.emplace (vertex->links [i]);
600
+ walker.push (vertex->links [i]);
598
601
}
599
602
}
600
603
}
@@ -717,17 +720,18 @@ struct RR_Graph_Builder {
717
720
* Clean up of earlier stages
718
721
*/
719
722
void delete_nodes (node_* root) {
720
- std::queue<node_*> walker;
721
- std::stack<node_*> back_walker;
722
- walker.emplace (root);
723
+ std::queue<node_*, std::list<node_*> > walker;
724
+ std::stack<node_*, std::list<node_*> > back_walker;
725
+ walker.push (root);
723
726
while (!walker.empty ()) {
724
727
node_* vertex = walker.front ();
725
728
walker.pop ();
726
- back_walker.emplace (vertex);
729
+ back_walker.push (vertex);
730
+ location loc = vertex->loc ;
727
731
for (int i = 0 ; i < 4 ; ++i) {
728
732
if (vertex->links [i] != nullptr ) {
729
733
if (vertex->links [i]->visited == vertex) {
730
- walker.emplace (vertex->links [i]);
734
+ walker.push (vertex->links [i]);
731
735
}
732
736
}
733
737
}
@@ -742,7 +746,7 @@ struct RR_Graph_Builder {
742
746
temp->links [(i + 2 ) % 4 ] = nullptr ;
743
747
}
744
748
}
745
- delete ( vertex) ;
749
+ delete vertex;
746
750
}
747
751
}
748
752
@@ -752,7 +756,7 @@ struct RR_Graph_Builder {
752
756
void process_nodes () {
753
757
auto wires = ar_.getWires ();
754
758
for (auto const & node : ar_.getNodes ()) {
755
- std::tuple<int , int > base_wire_{ wires[node.getWires ()[0 ]].getTile (), wires[node.getWires ()[0 ]].getWire ()} ;
759
+ std::tuple<int , int > base_wire_ ( wires[node.getWires ()[0 ]].getTile (), wires[node.getWires ()[0 ]].getWire ()) ;
756
760
int node_id = wire_to_node_[base_wire_];
757
761
std::set<location> all_possible_tiles = node_to_locs_[node_id];
758
762
int root_x, root_y;
@@ -766,6 +770,8 @@ struct RR_Graph_Builder {
766
770
767
771
node_* root = build_node_graph (node_id, all_possible_tiles, empties, root_x, root_y);
768
772
int div = reduce_graph_and_count_nodes (root);
773
+ if (root == nullptr )
774
+ continue ;
769
775
float capacitance, resistance;
770
776
auto model = ar_.getNodeTimings ()[node.getNodeTiming ()];
771
777
capacitance = get_corner_value (model.getCapacitance (), " slow" , " typ" ) / div;
0 commit comments