@@ -584,7 +584,8 @@ void RepairAntennas::addJumperAndVias(GRoute& route,
584584 const int & init_y,
585585 const int & final_x,
586586 const int & final_y,
587- const int & layer_level)
587+ const int & layer_level,
588+ odb::dbNet* db_net)
588589{
589590 // Create vias (at the start and end of the jumper)
590591 for (int layer = layer_level; layer < layer_level + 2 ; layer++) {
@@ -601,17 +602,22 @@ void RepairAntennas::addJumperAndVias(GRoute& route,
601602 layer_level + 2 ,
602603 true ));
603604 // Reducing usage in the layer level
604- grouter_->updateResources (init_x, init_y, final_x, final_y, layer_level, -1 );
605+ grouter_->updateResources (
606+ init_x, init_y, final_x, final_y, layer_level, -1 , db_net);
605607 // Increasing usage in the layer level + 2
606608 grouter_->updateResources (
607- init_x, init_y, final_x, final_y, layer_level + 2 , 1 );
609+ init_x, init_y, final_x, final_y, layer_level + 2 , 1 , db_net);
610+ // Update FastRoute Tree Edges
611+ grouter_->updateFastRouteGridsLayer (
612+ init_x, init_y, final_x, final_y, layer_level, layer_level + 2 , db_net);
608613}
609614
610615void RepairAntennas::addJumperToRoute (GRoute& route,
611616 const int & seg_id,
612617 const int & jumper_init_pos,
613618 const int & jumper_final_pos,
614- const int & layer_level)
619+ const int & layer_level,
620+ odb::dbNet* db_net)
615621{
616622 const int seg_init_x = route[seg_id].init_x ;
617623 const int seg_init_y = route[seg_id].init_y ;
@@ -639,7 +645,8 @@ void RepairAntennas::addJumperToRoute(GRoute& route,
639645 jumper_init_y,
640646 jumper_final_x,
641647 jumper_final_y,
642- layer_level);
648+ layer_level,
649+ db_net);
643650 // Divide segment (new segment is added before jumper insertion)
644651 route.push_back (GSegment (seg_init_x,
645652 seg_init_y,
@@ -654,7 +661,8 @@ void RepairAntennas::addJumperToRoute(GRoute& route,
654661
655662void RepairAntennas::addJumper (GRoute& route,
656663 const int & segment_id,
657- const int & jumper_pos)
664+ const int & jumper_pos,
665+ odb::dbNet* db_net)
658666{
659667 odb::dbTech* tech = db_->getTech ();
660668 const int segment_layer_level = route[segment_id].init_layer ;
@@ -666,14 +674,22 @@ void RepairAntennas::addJumper(GRoute& route,
666674 // Get start and final X position of jumper
667675 const int jumper_start_x = jumper_pos;
668676 const int jumper_final_x = jumper_start_x + jumper_size_;
669- addJumperToRoute (
670- route, segment_id, jumper_start_x, jumper_final_x, segment_layer_level);
677+ addJumperToRoute (route,
678+ segment_id,
679+ jumper_start_x,
680+ jumper_final_x,
681+ segment_layer_level,
682+ db_net);
671683 } else {
672684 // Get start and final Y position jumper
673685 const int jumper_start_y = jumper_pos;
674686 const int jumper_final_y = jumper_start_y + jumper_size_;
675- addJumperToRoute (
676- route, segment_id, jumper_start_y, jumper_final_y, segment_layer_level);
687+ addJumperToRoute (route,
688+ segment_id,
689+ jumper_start_y,
690+ jumper_final_y,
691+ segment_layer_level,
692+ db_net);
677693 }
678694}
679695
@@ -902,7 +918,8 @@ bool RepairAntennas::findPosToJumper(const GRoute& route,
902918 LayerToSegmentNodeVector& segment_graph,
903919 const SegmentNode& seg_node,
904920 const odb::Point& parent_pos,
905- int & jumper_position)
921+ int & jumper_position,
922+ odb::dbNet* db_net)
906923{
907924 jumper_position = -1 ;
908925 const GSegment& seg = route[seg_node.seg_id ];
@@ -936,7 +953,7 @@ bool RepairAntennas::findPosToJumper(const GRoute& route,
936953 while (pos_x <= seg_final_x && pos_y <= seg_final_y) {
937954 // Check if the position has resources available
938955 has_available_resources = grouter_->hasAvailableResources (
939- is_horizontal, pos_x, pos_y, layer_level + 2 );
956+ is_horizontal, pos_x, pos_y, layer_level + 2 , db_net );
940957 is_via = (is_horizontal && via_pos.find (pos_x) != via_pos.end ())
941958 || (!is_horizontal && via_pos.find (pos_y) != via_pos.end ());
942959 // If the position has vias or does not have resources
@@ -987,7 +1004,8 @@ void RepairAntennas::findSegments(const GRoute& route,
9871004 LayerToSegmentNodeVector& segment_graph,
9881005 const int & num_nodes,
9891006 const int & violation_layer,
990- SegmentToJumperPos& segments_to_repair)
1007+ SegmentToJumperPos& segments_to_repair,
1008+ odb::dbNet* db_net)
9911009{
9921010 // Init stack and vector of visited and parent position
9931011 std::stack<std::pair<odb::dbTechLayer*, SegmentNode>> node_stack;
@@ -1033,7 +1051,8 @@ void RepairAntennas::findSegments(const GRoute& route,
10331051 segment_graph,
10341052 cur_node,
10351053 parent_pos[cur_node.node_id ],
1036- jumper_pos);
1054+ jumper_pos,
1055+ db_net);
10371056 // If jumper wasnt added, then explore adjacent segment nodes
10381057 if (is_found) {
10391058 segments_to_repair[cur_node.seg_id ].insert (jumper_pos);
@@ -1084,7 +1103,8 @@ void RepairAntennas::getViolations(
10841103
10851104int RepairAntennas::addJumperOnSegments (
10861105 const SegmentToJumperPos& segments_to_repair,
1087- GRoute& route)
1106+ GRoute& route,
1107+ odb::dbNet* db_net)
10881108{
10891109 int jumper_by_net = 0 ;
10901110 // Iterate all jumper positions on segments
@@ -1099,11 +1119,11 @@ int RepairAntennas::addJumperOnSegments(
10991119 // Avoid overlap with last jumper position
11001120 const int dist = abs (last_pos_aux - pos_it);
11011121 if (dist > jumper_size_) {
1102- addJumper (route, seg_it.first , pos_it);
1122+ addJumper (route, seg_it.first , pos_it, db_net );
11031123 jumper_by_net++;
11041124 }
11051125 } else {
1106- addJumper (route, seg_it.first , pos_it);
1126+ addJumper (route, seg_it.first , pos_it, db_net );
11071127 jumper_by_net++;
11081128 }
11091129 last_pos_aux = pos_it;
@@ -1160,14 +1180,16 @@ void RepairAntennas::jumperInsertion(NetRouteMap& routing,
11601180 segment_graph,
11611181 num_nodes,
11621182 layer_level,
1163- segments_to_repair);
1183+ segments_to_repair,
1184+ db_net);
11641185 }
11651186 }
11661187 required_jumper_by_net = segments_to_repair.size ();
11671188 }
11681189 if (required_jumper_by_net > 0 ) {
11691190 // Add jumper in found segment positions
1170- jumper_by_net = addJumperOnSegments (segments_to_repair, routing[db_net]);
1191+ jumper_by_net
1192+ = addJumperOnSegments (segments_to_repair, routing[db_net], db_net);
11711193 if (jumper_by_net > 0 ) {
11721194 db_net->setJumpers (true );
11731195 net_with_jumpers++;
0 commit comments