From 2d95ee31d197464855be890d991856a511fd55b9 Mon Sep 17 00:00:00 2001 From: luis201420 Date: Tue, 27 Feb 2024 13:23:38 +0000 Subject: [PATCH 01/45] grt: saving dirty nets in a vector inside FastRouter to avoid checking all nets Signed-off-by: luis201420 --- src/grt/src/fastroute/include/FastRoute.h | 1 + src/grt/src/fastroute/src/FastRoute.cpp | 35 +++---- src/grt/src/fastroute/src/RSMT.cpp | 5 +- src/grt/src/fastroute/src/maze.cpp | 25 ++--- src/grt/src/fastroute/src/maze3D.cpp | 4 - src/grt/src/fastroute/src/route.cpp | 58 +++-------- src/grt/src/fastroute/src/utility.cpp | 121 ++++++---------------- 7 files changed, 72 insertions(+), 177 deletions(-) diff --git a/src/grt/src/fastroute/include/FastRoute.h b/src/grt/src/fastroute/include/FastRoute.h index ad93f988ce9..df2eb409d67 100644 --- a/src/grt/src/fastroute/include/FastRoute.h +++ b/src/grt/src/fastroute/include/FastRoute.h @@ -622,6 +622,7 @@ class FastRouteCore std::set> h_used_ggrid_; std::set> v_used_ggrid_; + std::vector dirty_net_ids_; }; } // namespace grt diff --git a/src/grt/src/fastroute/src/FastRoute.cpp b/src/grt/src/fastroute/src/FastRoute.cpp index 30dbbb26c89..46ff3f2f907 100644 --- a/src/grt/src/fastroute/src/FastRoute.cpp +++ b/src/grt/src/fastroute/src/FastRoute.cpp @@ -665,10 +665,7 @@ void FastRouteCore::initNetAuxVars() NetRouteMap FastRouteCore::getRoutes() { NetRouteMap routes; - for (int netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { nets_[netID]->setIsRouted(true); odb::dbNet* db_net = nets_[netID]->getDbNet(); @@ -728,10 +725,7 @@ NetRouteMap FastRouteCore::getPlanarRoutes() // Get routes before layer assignment - for (int netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { auto fr_net = nets_[netID]; odb::dbNet* db_net = fr_net->getDbNet(); @@ -883,6 +877,13 @@ NetRouteMap FastRouteCore::run() v_used_ggrid_.clear(); h_used_ggrid_.clear(); + dirty_net_ids_.clear(); + for (int netID = 0; netID < netCount(); netID++) { + if (!skipNet(netID)) { + dirty_net_ids_.push_back(netID); + } + } + int tUsage; int cost_step; int maxOverflow = 0; @@ -1002,10 +1003,8 @@ NetRouteMap FastRouteCore::run() // debug mode Rectilinear Steiner Tree before overflow iterations if (debug_->isOn() && debug_->rectilinearSTree_) { - for (int netID = 0; netID < netCount(); netID++) { - if (nets_[netID]->getDbNet() == debug_->net_ && !skipNet(netID)) { - StTreeVisualization(sttrees_[netID], nets_[netID], false); - } + for (int & netID : dirty_net_ids_) { + StTreeVisualization(sttrees_[netID], nets_[netID], false); } } @@ -1253,10 +1252,8 @@ NetRouteMap FastRouteCore::run() // Debug mode Tree 2D after overflow iterations if (debug_->isOn() && debug_->tree2D_) { - for (int netID = 0; netID < netCount(); netID++) { - if (nets_[netID]->getDbNet() == debug_->net_ && !skipNet(netID)) { - StTreeVisualization(sttrees_[netID], nets_[netID], false); - } + for (int & netID : dirty_net_ids_) { + StTreeVisualization(sttrees_[netID], nets_[netID], false); } } @@ -1310,10 +1307,8 @@ NetRouteMap FastRouteCore::run() // Debug mode Tree 3D after layer assignament if (debug_->isOn() && debug_->tree3D_) { - for (int netID = 0; netID < netCount(); netID++) { - if (nets_[netID]->getDbNet() == debug_->net_ && !skipNet(netID)) { - StTreeVisualization(sttrees_[netID], nets_[netID], true); - } + for (int & netID : dirty_net_ids_) { + StTreeVisualization(sttrees_[netID], nets_[netID], true); } } diff --git a/src/grt/src/fastroute/src/RSMT.cpp b/src/grt/src/fastroute/src/RSMT.cpp index 4ab2949bed3..bbe5f66ff19 100644 --- a/src/grt/src/fastroute/src/RSMT.cpp +++ b/src/grt/src/fastroute/src/RSMT.cpp @@ -654,10 +654,7 @@ void FastRouteCore::gen_brk_RSMT(const bool congestionDriven, const int flute_accuracy = 2; - for (int i = 0; i < netCount(); i++) { - if (skipNet(i)) { - continue; - } + for (int & i : dirty_net_ids_) { FrNet* net = nets_[i]; diff --git a/src/grt/src/fastroute/src/maze.cpp b/src/grt/src/fastroute/src/maze.cpp index 088372e76aa..fc27d0da1bd 100644 --- a/src/grt/src/fastroute/src/maze.cpp +++ b/src/grt/src/fastroute/src/maze.cpp @@ -60,10 +60,8 @@ void FastRouteCore::fixEmbeddedTrees() // check embedded trees only when maze router is called // i.e., when running overflow iterations if (overflow_iterations_ > 0) { - for (int netID = 0; netID < netCount(); netID++) { - if (!skipNet(netID)) { - checkAndFixEmbeddedTree(netID); - } + for (int & netID : dirty_net_ids_) { + checkAndFixEmbeddedTree(netID); } } } @@ -499,10 +497,8 @@ void FastRouteCore::convertToMazerouteNet(const int netID) void FastRouteCore::convertToMazeroute() { - for (int netID = 0; netID < netCount(); netID++) { - if (!skipNet(netID)) { - convertToMazerouteNet(netID); - } + for (int & netID : dirty_net_ids_) { + convertToMazerouteNet(netID); } for (int i = 0; i < y_grid_; i++) { @@ -1360,12 +1356,8 @@ void FastRouteCore::mazeRouteMSMD(const int iter, std::vector pop_heap2(y_grid_ * x_range_, false); - for (int nidRPC = 0; nidRPC < netCount(); nidRPC++) { - const int netID = ordering ? tree_order_cong_[nidRPC].treeIndex : nidRPC; - - if (skipNet(netID)) { - continue; - } + for (int nidRPC = 0; nidRPC < dirty_net_ids_.size(); nidRPC++) { + const int netID = ordering ? tree_order_cong_[nidRPC].treeIndex : dirty_net_ids_[nidRPC]; const int num_terminals = sttrees_[netID].num_terminals; @@ -2566,10 +2558,7 @@ void FastRouteCore::InitLastUsage(const int upType) void FastRouteCore::SaveLastRouteLen() { - for (int netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; // loop for all the tree edges const int num_edges = sttrees_[netID].num_edges(); diff --git a/src/grt/src/fastroute/src/maze3D.cpp b/src/grt/src/fastroute/src/maze3D.cpp index 52b50849834..edce512d656 100644 --- a/src/grt/src/fastroute/src/maze3D.cpp +++ b/src/grt/src/fastroute/src/maze3D.cpp @@ -817,10 +817,6 @@ void FastRouteCore::mazeRouteMSMDOrder3D(int expand, for (int orderIndex = 0; orderIndex < endIND; orderIndex++) { const int netID = tree_order_pv_[orderIndex].treeIndex; - if (skipNet(netID)) { - continue; - } - FrNet* net = nets_[netID]; int enlarge = expand; diff --git a/src/grt/src/fastroute/src/route.cpp b/src/grt/src/fastroute/src/route.cpp index bf274cf98b7..9662ba32ace 100644 --- a/src/grt/src/fastroute/src/route.cpp +++ b/src/grt/src/fastroute/src/route.cpp @@ -229,20 +229,14 @@ void FastRouteCore::routeLAll(bool firstTime) { if (firstTime) { // no previous route // estimate congestion with 0.5+0.5 L - for (int i = 0; i < netCount(); i++) { - if (skipNet(i)) { - continue; - } + for (int & i : dirty_net_ids_) { for (auto& seg : seglist_[i]) { estimateOneSeg(&seg); } } // L route - for (int i = 0; i < netCount(); i++) { - if (skipNet(i)) { - continue; - } + for (int & i : dirty_net_ids_) { for (auto& seg : seglist_[i]) { // no need to reroute the H or V segs @@ -251,10 +245,7 @@ void FastRouteCore::routeLAll(bool firstTime) } } } else { // previous is L-route - for (int i = 0; i < netCount(); i++) { - if (skipNet(i)) { - continue; - } + for (int & i : dirty_net_ids_) { for (auto& seg : seglist_[i]) { // no need to reroute the H or V segs @@ -418,16 +409,12 @@ void FastRouteCore::newrouteL(int netID, RouteType ripuptype, bool viaGuided) void FastRouteCore::newrouteLAll(bool firstTime, bool viaGuided) { if (firstTime) { - for (int i = 0; i < netCount(); i++) { - if (!skipNet(i)) { - newrouteL(i, RouteType::NoRoute, viaGuided); // do L-routing - } + for (int & i : dirty_net_ids_) { + newrouteL(i, RouteType::NoRoute, viaGuided); // do L-routing } } else { - for (int i = 0; i < netCount(); i++) { - if (!skipNet(i)) { - newrouteL(i, RouteType::LRoute, viaGuided); - } + for (int & i : dirty_net_ids_) { + newrouteL(i, RouteType::LRoute, viaGuided); } } } @@ -858,10 +845,8 @@ void FastRouteCore::newrouteZ(int netID, int threshold) // first void FastRouteCore::newrouteZAll(int threshold) { - for (int i = 0; i < netCount(); i++) { - if (!skipNet(i)) { - newrouteZ(i, threshold); // ripup previous route and do Z-routing - } + for (int & i : dirty_net_ids_) { + newrouteZ(i, threshold); // ripup previous route and do Z-routing } } @@ -1037,10 +1022,7 @@ void FastRouteCore::spiralRoute(int netID, int edgeID) void FastRouteCore::spiralRouteAll() { - for (int netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { auto& treenodes = sttrees_[netID].nodes; const int num_terminals = sttrees_[netID].num_terminals; @@ -1088,10 +1070,7 @@ void FastRouteCore::spiralRouteAll() } } - for (int netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; auto& treenodes = sttrees_[netID].nodes; @@ -1118,10 +1097,7 @@ void FastRouteCore::spiralRouteAll() } std::queue edgeQueue; - for (int netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { newRipupNet(netID); @@ -1174,10 +1150,7 @@ void FastRouteCore::spiralRouteAll() } } - for (int netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { auto& treenodes = sttrees_[netID].nodes; @@ -1514,10 +1487,7 @@ void FastRouteCore::routeMonotonicAll(int threshold, multi_array d1(boost::extents[y_range_][x_range_]); multi_array d2(boost::extents[y_range_][x_range_]); - for (int netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { const int numEdges = sttrees_[netID].num_edges(); for (int edgeID = 0; edgeID < numEdges; edgeID++) { diff --git a/src/grt/src/fastroute/src/utility.cpp b/src/grt/src/fastroute/src/utility.cpp index 816e3202aea..5e84614f732 100644 --- a/src/grt/src/fastroute/src/utility.cpp +++ b/src/grt/src/fastroute/src/utility.cpp @@ -64,10 +64,7 @@ void FastRouteCore::printEdge(int const netID, int const edgeID) void FastRouteCore::ConvertToFull3DType2() { - for (int netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; const int num_edges = sttrees_[netID].num_edges(); @@ -151,10 +148,7 @@ void FastRouteCore::netpinOrderInc() { tree_order_pv_.clear(); - for (int j = 0; j < netCount(); j++) { - if (skipNet(j)) { - continue; - } + for (int & j : dirty_net_ids_) { int xmin = BIG_INT; int totalLength = 0; @@ -182,10 +176,7 @@ void FastRouteCore::fillVIA() int numVIAT1 = 0; int numVIAT2 = 0; - for (int netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; int num_terminals = sttrees_[netID].num_terminals; @@ -405,10 +396,7 @@ int FastRouteCore::threeDVIA() { int numVIA = 0; - for (int netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; int num_edges = sttrees_[netID].num_edges(); @@ -847,7 +835,7 @@ void FastRouteCore::assignEdge(int netID, int edgeID, bool processDIR) void FastRouteCore::layerAssignmentV4() { - int i, k, netID, edgeID, nodeID, routeLen; + int i, k, edgeID, nodeID, routeLen; int n1, n2, connectionCNT; int n1a, n2a; @@ -855,10 +843,7 @@ void FastRouteCore::layerAssignmentV4() TreeEdge* treeedge; - for (netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; for (edgeID = 0; edgeID < sttrees_[netID].num_edges(); edgeID++) { @@ -873,11 +858,7 @@ void FastRouteCore::layerAssignmentV4() netpinOrderInc(); for (i = 0; i < tree_order_pv_.size(); i++) { - netID = tree_order_pv_[i].treeIndex; - - if (skipNet(netID)) { - continue; - } + int netID = tree_order_pv_[i].treeIndex; auto& treeedges = sttrees_[netID].edges; auto& treenodes = sttrees_[netID].nodes; @@ -993,14 +974,11 @@ void FastRouteCore::layerAssignmentV4() void FastRouteCore::layerAssignment() { - int netID, d, k, edgeID, numpoints, n1, n2; + int d, k, edgeID, numpoints, n1, n2; bool redundant; TreeEdge* treeedge; - for (netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { auto& treenodes = sttrees_[netID].nodes; @@ -1048,10 +1026,7 @@ void FastRouteCore::layerAssignment() } } - for (netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; auto& treenodes = sttrees_[netID].nodes; @@ -1127,15 +1102,12 @@ void FastRouteCore::printTree3D(int netID) void FastRouteCore::checkRoute3D() { - int i, netID, edgeID, nodeID, edgelength; + int i, edgeID, nodeID, edgelength; int n1, n2, x1, y1, x2, y2; int distance; bool gridFlag; - for (netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { const auto& treenodes = sttrees_[netID].nodes; const int num_terminals = sttrees_[netID].num_terminals; @@ -1245,23 +1217,22 @@ static bool compareTEL(const OrderTree a, const OrderTree b) void FastRouteCore::StNetOrder() { - int i, j, ind, min_x, min_y; + int i, ind, min_x, min_y; StTree* stree; tree_order_cong_.clear(); - tree_order_cong_.resize(netCount()); + tree_order_cong_.resize(dirty_net_ids_.size());//netCount()); i = 0; - for (j = 0; j < netCount(); j++) { + for (int j = 0; j < dirty_net_ids_.size(); j++) { // if the net is routed - if (skipNet(j)) { - continue; - } - stree = &(sttrees_[j]); + int netID = dirty_net_ids_[j]; + + stree = &(sttrees_[netID]); tree_order_cong_[j].xmin = 0; - tree_order_cong_[j].treeIndex = j; + tree_order_cong_[j].treeIndex = netID; for (ind = 0; ind < stree->num_edges(); ind++) { const auto& treeedges = stree->edges; @@ -1273,13 +1244,13 @@ void FastRouteCore::StNetOrder() if (gridsX[i] == gridsX[i + 1]) { // a vertical edge min_y = std::min(gridsY[i], gridsY[i + 1]); const int cap = getEdgeCapacity( - nets_[j], gridsX[i], min_y, EdgeDirection::Vertical); + nets_[netID], gridsX[i], min_y, EdgeDirection::Vertical); tree_order_cong_[j].xmin += std::max(0, v_edges_[min_y][gridsX[i]].usage - cap); } else { // a horizontal edge min_x = std::min(gridsX[i], gridsX[i + 1]); const int cap = getEdgeCapacity( - nets_[j], min_x, gridsY[i], EdgeDirection::Horizontal); + nets_[netID], min_x, gridsY[i], EdgeDirection::Horizontal); tree_order_cong_[j].xmin += std::max(0, h_edges_[gridsY[i]][min_x].usage - cap); } @@ -1292,7 +1263,7 @@ void FastRouteCore::StNetOrder() // Set the 70% (or less) of non critical nets that doesn't have overflow // with the lowest priority - for (int ord_elID = 0; ord_elID < netCount(); ord_elID++) { + for (int ord_elID = 0; ord_elID < dirty_net_ids_.size(); ord_elID++) { auto order_element = tree_order_cong_[ord_elID]; if (nets_[order_element.treeIndex]->getSlack() == std::ceil(std::numeric_limits::lowest())) { @@ -1327,10 +1298,7 @@ float FastRouteCore::CalculatePartialSlack() parasitics_builder_->estimateParasitcs(db_net, route); } } - for (int netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { auto fr_net = nets_[netID]; odb::dbNet* db_net = fr_net->getDbNet(); float slack = parasitics_builder_->getNetSlack(db_net); @@ -1348,10 +1316,7 @@ float FastRouteCore::CalculatePartialSlack() // Set the non critical nets slack as the lowest float, so they can be // ordered by overflow (and ordered first than the critical nets) - for (int netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { if (nets_[netID]->getSlack() > slack_th) { nets_[netID]->setSlack(std::ceil(std::numeric_limits::lowest())); } @@ -1438,10 +1403,7 @@ void FastRouteCore::recoverEdge(int netID, int edgeID) void FastRouteCore::removeLoops() { - for (int netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; @@ -1870,13 +1832,10 @@ bool FastRouteCore::checkRoute2DTree(int netID) // Copy Routing Solution for the best routing solution so far void FastRouteCore::copyRS(void) { - int i, j, netID, edgeID, numEdges, numNodes; + int i, j, edgeID, numEdges, numNodes; if (!sttrees_bk_.empty()) { - for (netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { numEdges = sttrees_bk_[netID].num_edges(); for (edgeID = 0; edgeID < numEdges; edgeID++) { @@ -1891,10 +1850,7 @@ void FastRouteCore::copyRS(void) sttrees_bk_.resize(netCount()); - for (netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { numNodes = sttrees_[netID].num_nodes(); numEdges = sttrees_[netID].num_edges(); @@ -1942,13 +1898,10 @@ void FastRouteCore::copyRS(void) void FastRouteCore::copyBR(void) { - int i, j, netID, edgeID, numEdges, numNodes, min_y, min_x; + int i, j, edgeID, numEdges, numNodes, min_y, min_x; if (!sttrees_bk_.empty()) { - for (netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { numEdges = sttrees_[netID].num_edges(); for (edgeID = 0; edgeID < numEdges; edgeID++) { @@ -1959,10 +1912,7 @@ void FastRouteCore::copyBR(void) } } - for (netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { numNodes = sttrees_bk_[netID].num_nodes(); numEdges = sttrees_bk_[netID].num_edges(); @@ -2022,7 +1972,7 @@ void FastRouteCore::copyBR(void) v_edges_[i][j].usage = 0; } } - for (netID = 0; netID < netCount(); netID++) { + for (int netID = 0; netID < netCount(); netID++) { numEdges = sttrees_[netID].num_edges(); int edgeCost = nets_[netID]->getEdgeCost(); @@ -2056,12 +2006,9 @@ void FastRouteCore::copyBR(void) void FastRouteCore::freeRR(void) { - int netID, edgeID, numEdges; + int edgeID, numEdges; if (!sttrees_bk_.empty()) { - for (netID = 0; netID < netCount(); netID++) { - if (skipNet(netID)) { - continue; - } + for (int & netID : dirty_net_ids_) { numEdges = sttrees_bk_[netID].num_edges(); for (edgeID = 0; edgeID < numEdges; edgeID++) { From 9800f9941ddb3b6440e776187a2b3fa034e77bc6 Mon Sep 17 00:00:00 2001 From: luis201420 Date: Tue, 27 Feb 2024 10:33:30 -0300 Subject: [PATCH 02/45] grt: clang-format Signed-off-by: luis201420 --- src/grt/src/fastroute/src/FastRoute.cpp | 12 +++---- src/grt/src/fastroute/src/RSMT.cpp | 3 +- src/grt/src/fastroute/src/maze.cpp | 9 ++--- src/grt/src/fastroute/src/route.cpp | 30 ++++++---------- src/grt/src/fastroute/src/utility.cpp | 47 +++++++++---------------- 5 files changed, 39 insertions(+), 62 deletions(-) diff --git a/src/grt/src/fastroute/src/FastRoute.cpp b/src/grt/src/fastroute/src/FastRoute.cpp index 46ff3f2f907..3812c2678a0 100644 --- a/src/grt/src/fastroute/src/FastRoute.cpp +++ b/src/grt/src/fastroute/src/FastRoute.cpp @@ -665,8 +665,7 @@ void FastRouteCore::initNetAuxVars() NetRouteMap FastRouteCore::getRoutes() { NetRouteMap routes; - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { nets_[netID]->setIsRouted(true); odb::dbNet* db_net = nets_[netID]->getDbNet(); GRoute& route = routes[db_net]; @@ -725,8 +724,7 @@ NetRouteMap FastRouteCore::getPlanarRoutes() // Get routes before layer assignment - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { auto fr_net = nets_[netID]; odb::dbNet* db_net = fr_net->getDbNet(); GRoute& route = routes[db_net]; @@ -1003,7 +1001,7 @@ NetRouteMap FastRouteCore::run() // debug mode Rectilinear Steiner Tree before overflow iterations if (debug_->isOn() && debug_->rectilinearSTree_) { - for (int & netID : dirty_net_ids_) { + for (int& netID : dirty_net_ids_) { StTreeVisualization(sttrees_[netID], nets_[netID], false); } } @@ -1252,7 +1250,7 @@ NetRouteMap FastRouteCore::run() // Debug mode Tree 2D after overflow iterations if (debug_->isOn() && debug_->tree2D_) { - for (int & netID : dirty_net_ids_) { + for (int& netID : dirty_net_ids_) { StTreeVisualization(sttrees_[netID], nets_[netID], false); } } @@ -1307,7 +1305,7 @@ NetRouteMap FastRouteCore::run() // Debug mode Tree 3D after layer assignament if (debug_->isOn() && debug_->tree3D_) { - for (int & netID : dirty_net_ids_) { + for (int& netID : dirty_net_ids_) { StTreeVisualization(sttrees_[netID], nets_[netID], true); } } diff --git a/src/grt/src/fastroute/src/RSMT.cpp b/src/grt/src/fastroute/src/RSMT.cpp index bbe5f66ff19..30792469446 100644 --- a/src/grt/src/fastroute/src/RSMT.cpp +++ b/src/grt/src/fastroute/src/RSMT.cpp @@ -654,8 +654,7 @@ void FastRouteCore::gen_brk_RSMT(const bool congestionDriven, const int flute_accuracy = 2; - for (int & i : dirty_net_ids_) { - + for (int& i : dirty_net_ids_) { FrNet* net = nets_[i]; int d = net->getNumPins(); diff --git a/src/grt/src/fastroute/src/maze.cpp b/src/grt/src/fastroute/src/maze.cpp index fc27d0da1bd..fd99d431647 100644 --- a/src/grt/src/fastroute/src/maze.cpp +++ b/src/grt/src/fastroute/src/maze.cpp @@ -60,7 +60,7 @@ void FastRouteCore::fixEmbeddedTrees() // check embedded trees only when maze router is called // i.e., when running overflow iterations if (overflow_iterations_ > 0) { - for (int & netID : dirty_net_ids_) { + for (int& netID : dirty_net_ids_) { checkAndFixEmbeddedTree(netID); } } @@ -497,7 +497,7 @@ void FastRouteCore::convertToMazerouteNet(const int netID) void FastRouteCore::convertToMazeroute() { - for (int & netID : dirty_net_ids_) { + for (int& netID : dirty_net_ids_) { convertToMazerouteNet(netID); } @@ -1357,7 +1357,8 @@ void FastRouteCore::mazeRouteMSMD(const int iter, std::vector pop_heap2(y_grid_ * x_range_, false); for (int nidRPC = 0; nidRPC < dirty_net_ids_.size(); nidRPC++) { - const int netID = ordering ? tree_order_cong_[nidRPC].treeIndex : dirty_net_ids_[nidRPC]; + const int netID = ordering ? tree_order_cong_[nidRPC].treeIndex + : dirty_net_ids_[nidRPC]; const int num_terminals = sttrees_[netID].num_terminals; @@ -2558,7 +2559,7 @@ void FastRouteCore::InitLastUsage(const int upType) void FastRouteCore::SaveLastRouteLen() { - for (int & netID : dirty_net_ids_) { + for (int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; // loop for all the tree edges const int num_edges = sttrees_[netID].num_edges(); diff --git a/src/grt/src/fastroute/src/route.cpp b/src/grt/src/fastroute/src/route.cpp index 9662ba32ace..78e8d63511b 100644 --- a/src/grt/src/fastroute/src/route.cpp +++ b/src/grt/src/fastroute/src/route.cpp @@ -229,15 +229,13 @@ void FastRouteCore::routeLAll(bool firstTime) { if (firstTime) { // no previous route // estimate congestion with 0.5+0.5 L - for (int & i : dirty_net_ids_) { - + for (int& i : dirty_net_ids_) { for (auto& seg : seglist_[i]) { estimateOneSeg(&seg); } } // L route - for (int & i : dirty_net_ids_) { - + for (int& i : dirty_net_ids_) { for (auto& seg : seglist_[i]) { // no need to reroute the H or V segs if (seg.x1 != seg.x2 || seg.y1 != seg.y2) @@ -245,8 +243,7 @@ void FastRouteCore::routeLAll(bool firstTime) } } } else { // previous is L-route - for (int & i : dirty_net_ids_) { - + for (int& i : dirty_net_ids_) { for (auto& seg : seglist_[i]) { // no need to reroute the H or V segs if (seg.x1 != seg.x2 || seg.y1 != seg.y2) { @@ -409,11 +406,11 @@ void FastRouteCore::newrouteL(int netID, RouteType ripuptype, bool viaGuided) void FastRouteCore::newrouteLAll(bool firstTime, bool viaGuided) { if (firstTime) { - for (int & i : dirty_net_ids_) { + for (int& i : dirty_net_ids_) { newrouteL(i, RouteType::NoRoute, viaGuided); // do L-routing } } else { - for (int & i : dirty_net_ids_) { + for (int& i : dirty_net_ids_) { newrouteL(i, RouteType::LRoute, viaGuided); } } @@ -845,7 +842,7 @@ void FastRouteCore::newrouteZ(int netID, int threshold) // first void FastRouteCore::newrouteZAll(int threshold) { - for (int & i : dirty_net_ids_) { + for (int& i : dirty_net_ids_) { newrouteZ(i, threshold); // ripup previous route and do Z-routing } } @@ -1022,8 +1019,7 @@ void FastRouteCore::spiralRoute(int netID, int edgeID) void FastRouteCore::spiralRouteAll() { - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { auto& treenodes = sttrees_[netID].nodes; const int num_terminals = sttrees_[netID].num_terminals; @@ -1070,8 +1066,7 @@ void FastRouteCore::spiralRouteAll() } } - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; auto& treenodes = sttrees_[netID].nodes; const int num_edges = sttrees_[netID].num_edges(); @@ -1097,8 +1092,7 @@ void FastRouteCore::spiralRouteAll() } std::queue edgeQueue; - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { newRipupNet(netID); auto& treeedges = sttrees_[netID].edges; @@ -1150,8 +1144,7 @@ void FastRouteCore::spiralRouteAll() } } - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { auto& treenodes = sttrees_[netID].nodes; for (int d = 0; d < sttrees_[netID].num_nodes(); d++) { @@ -1487,8 +1480,7 @@ void FastRouteCore::routeMonotonicAll(int threshold, multi_array d1(boost::extents[y_range_][x_range_]); multi_array d2(boost::extents[y_range_][x_range_]); - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { const int numEdges = sttrees_[netID].num_edges(); for (int edgeID = 0; edgeID < numEdges; edgeID++) { routeMonotonic(netID, diff --git a/src/grt/src/fastroute/src/utility.cpp b/src/grt/src/fastroute/src/utility.cpp index 5e84614f732..773bef0dcca 100644 --- a/src/grt/src/fastroute/src/utility.cpp +++ b/src/grt/src/fastroute/src/utility.cpp @@ -64,8 +64,7 @@ void FastRouteCore::printEdge(int const netID, int const edgeID) void FastRouteCore::ConvertToFull3DType2() { - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; const int num_edges = sttrees_[netID].num_edges(); @@ -148,8 +147,7 @@ void FastRouteCore::netpinOrderInc() { tree_order_pv_.clear(); - for (int & j : dirty_net_ids_) { - + for (int& j : dirty_net_ids_) { int xmin = BIG_INT; int totalLength = 0; const auto& treenodes = sttrees_[j].nodes; @@ -176,8 +174,7 @@ void FastRouteCore::fillVIA() int numVIAT1 = 0; int numVIAT2 = 0; - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; int num_terminals = sttrees_[netID].num_terminals; const auto& treenodes = sttrees_[netID].nodes; @@ -396,7 +393,7 @@ int FastRouteCore::threeDVIA() { int numVIA = 0; - for (int & netID : dirty_net_ids_) { + for (int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; int num_edges = sttrees_[netID].num_edges(); @@ -843,8 +840,7 @@ void FastRouteCore::layerAssignmentV4() TreeEdge* treeedge; - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; for (edgeID = 0; edgeID < sttrees_[netID].num_edges(); edgeID++) { treeedge = &(treeedges[edgeID]); @@ -978,8 +974,7 @@ void FastRouteCore::layerAssignment() bool redundant; TreeEdge* treeedge; - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { auto& treenodes = sttrees_[netID].nodes; numpoints = 0; @@ -1026,8 +1021,7 @@ void FastRouteCore::layerAssignment() } } - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; auto& treenodes = sttrees_[netID].nodes; @@ -1107,8 +1101,7 @@ void FastRouteCore::checkRoute3D() int distance; bool gridFlag; - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { const auto& treenodes = sttrees_[netID].nodes; const int num_terminals = sttrees_[netID].num_terminals; @@ -1222,7 +1215,7 @@ void FastRouteCore::StNetOrder() tree_order_cong_.clear(); - tree_order_cong_.resize(dirty_net_ids_.size());//netCount()); + tree_order_cong_.resize(dirty_net_ids_.size()); // netCount()); i = 0; for (int j = 0; j < dirty_net_ids_.size(); j++) { @@ -1298,7 +1291,7 @@ float FastRouteCore::CalculatePartialSlack() parasitics_builder_->estimateParasitcs(db_net, route); } } - for (int & netID : dirty_net_ids_) { + for (int& netID : dirty_net_ids_) { auto fr_net = nets_[netID]; odb::dbNet* db_net = fr_net->getDbNet(); float slack = parasitics_builder_->getNetSlack(db_net); @@ -1316,7 +1309,7 @@ float FastRouteCore::CalculatePartialSlack() // Set the non critical nets slack as the lowest float, so they can be // ordered by overflow (and ordered first than the critical nets) - for (int & netID : dirty_net_ids_) { + for (int& netID : dirty_net_ids_) { if (nets_[netID]->getSlack() > slack_th) { nets_[netID]->setSlack(std::ceil(std::numeric_limits::lowest())); } @@ -1403,8 +1396,7 @@ void FastRouteCore::recoverEdge(int netID, int edgeID) void FastRouteCore::removeLoops() { - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; const int edgeCost = nets_[netID]->getEdgeCost(); @@ -1835,8 +1827,7 @@ void FastRouteCore::copyRS(void) int i, j, edgeID, numEdges, numNodes; if (!sttrees_bk_.empty()) { - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { numEdges = sttrees_bk_[netID].num_edges(); for (edgeID = 0; edgeID < numEdges; edgeID++) { if (sttrees_bk_[netID].edges[edgeID].len > 0) { @@ -1850,8 +1841,7 @@ void FastRouteCore::copyRS(void) sttrees_bk_.resize(netCount()); - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { numNodes = sttrees_[netID].num_nodes(); numEdges = sttrees_[netID].num_edges(); @@ -1901,8 +1891,7 @@ void FastRouteCore::copyBR(void) int i, j, edgeID, numEdges, numNodes, min_y, min_x; if (!sttrees_bk_.empty()) { - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { numEdges = sttrees_[netID].num_edges(); for (edgeID = 0; edgeID < numEdges; edgeID++) { if (sttrees_[netID].edges[edgeID].len > 0) { @@ -1912,8 +1901,7 @@ void FastRouteCore::copyBR(void) } } - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { numNodes = sttrees_bk_[netID].num_nodes(); numEdges = sttrees_bk_[netID].num_edges(); @@ -2008,8 +1996,7 @@ void FastRouteCore::freeRR(void) { int edgeID, numEdges; if (!sttrees_bk_.empty()) { - for (int & netID : dirty_net_ids_) { - + for (int& netID : dirty_net_ids_) { numEdges = sttrees_bk_[netID].num_edges(); for (edgeID = 0; edgeID < numEdges; edgeID++) { if (sttrees_bk_[netID].edges[edgeID].len > 0) { From 729b91cbc0230207ff7b0b959438341e29f78aec Mon Sep 17 00:00:00 2001 From: luis201420 Date: Thu, 29 Feb 2024 13:02:03 +0000 Subject: [PATCH 03/45] grt: avoiding calling the checkPinPlacement function in incremental GRT iterations Signed-off-by: luis201420 --- src/grt/src/GlobalRouter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grt/src/GlobalRouter.cpp b/src/grt/src/GlobalRouter.cpp index 96804233757..321a47fe10a 100644 --- a/src/grt/src/GlobalRouter.cpp +++ b/src/grt/src/GlobalRouter.cpp @@ -194,6 +194,7 @@ std::vector GlobalRouter::initFastRoute(int min_routing_layer, } std::vector nets = initNetlist(); + checkPinPlacement(); initNets(nets); applyAdjustments(min_routing_layer, max_routing_layer); @@ -755,7 +756,6 @@ float GlobalRouter::getNetSlack(Net* net) void GlobalRouter::initNets(std::vector& nets) { - checkPinPlacement(); pad_pins_connections_.clear(); int min_degree = std::numeric_limits::max(); From 62dd88f00f8d09e67ab086183354d53e9f854946 Mon Sep 17 00:00:00 2001 From: luis201420 Date: Thu, 29 Feb 2024 13:03:03 +0000 Subject: [PATCH 04/45] grt: modifying variable names Signed-off-by: luis201420 --- src/grt/src/fastroute/src/RSMT.cpp | 46 +++++++++++++-------------- src/grt/src/fastroute/src/route.cpp | 24 +++++++------- src/grt/src/fastroute/src/utility.cpp | 10 +++--- 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/src/grt/src/fastroute/src/RSMT.cpp b/src/grt/src/fastroute/src/RSMT.cpp index 30792469446..9141c65e759 100644 --- a/src/grt/src/fastroute/src/RSMT.cpp +++ b/src/grt/src/fastroute/src/RSMT.cpp @@ -654,18 +654,18 @@ void FastRouteCore::gen_brk_RSMT(const bool congestionDriven, const int flute_accuracy = 2; - for (int& i : dirty_net_ids_) { - FrNet* net = nets_[i]; + for (int& netID : dirty_net_ids_) { + FrNet* net = nets_[netID]; int d = net->getNumPins(); if (reRoute) { if (newType) { - const auto& treeedges = sttrees_[i].edges; - const auto& treenodes = sttrees_[i].nodes; - for (int j = 0; j < sttrees_[i].num_edges(); j++) { + const auto& treeedges = sttrees_[netID].edges; + const auto& treenodes = sttrees_[netID].nodes; + for (int j = 0; j < sttrees_[netID].num_edges(); j++) { // only route the non-degraded edges (len>0) - if (sttrees_[i].edges[j].len > 0) { + if (sttrees_[netID].edges[j].len > 0) { const TreeEdge* treeedge = &(treeedges[j]); const int n1 = treeedge->n1; const int n2 = treeedge->n2; @@ -673,12 +673,12 @@ void FastRouteCore::gen_brk_RSMT(const bool congestionDriven, const int y1 = treenodes[n1].y; const int x2 = treenodes[n2].x; const int y2 = treenodes[n2].y; - newRipup(treeedge, x1, y1, x2, y2, i); + newRipup(treeedge, x1, y1, x2, y2, netID); } } } else { // remove the est_usage due to the segments in this net - for (auto& seg : seglist_[i]) { + for (auto& seg : seglist_[netID]) { ripupSegL(&seg); } } @@ -696,25 +696,25 @@ void FastRouteCore::gen_brk_RSMT(const bool congestionDriven, if (congestionDriven) { // call congestion driven flute to generate RSMT bool cong; - coeffV = noADJ ? 1.2 : coeffADJ(i); - cong = netCongestion(i); + coeffV = noADJ ? 1.2 : coeffADJ(netID); + cong = netCongestion(netID); if (cong) { fluteCongest( - i, net->getPinX(), net->getPinY(), flute_accuracy, coeffV, rsmt); + netID, net->getPinX(), net->getPinY(), flute_accuracy, coeffV, rsmt); } else { fluteNormal( - i, net->getPinX(), net->getPinY(), flute_accuracy, coeffV, rsmt); + netID, net->getPinX(), net->getPinY(), flute_accuracy, coeffV, rsmt); } if (d > 3) { - numShift += edgeShiftNew(rsmt, i); + numShift += edgeShiftNew(rsmt, netID); } } else { // call FLUTE to generate RSMT for each net - if (noADJ || HTreeSuite(i)) { + if (noADJ || HTreeSuite(netID)) { coeffV = 1.2; } fluteNormal( - i, net->getPinX(), net->getPinY(), flute_accuracy, coeffV, rsmt); + netID, net->getPinX(), net->getPinY(), flute_accuracy, coeffV, rsmt); } } if (debug_->isOn() && debug_->steinerTree_ @@ -723,7 +723,7 @@ void FastRouteCore::gen_brk_RSMT(const bool congestionDriven, } if (genTree) { - copyStTree(i, rsmt); + copyStTree(netID, rsmt); } if (net->getNumPins() != rsmt.deg) { @@ -731,8 +731,8 @@ void FastRouteCore::gen_brk_RSMT(const bool congestionDriven, } if (congestionDriven) { - for (int j = 0; j < sttrees_[i].num_edges(); j++) - wl1 += sttrees_[i].edges[j].len; + for (int j = 0; j < sttrees_[netID].num_edges(); j++) + wl1 += sttrees_[netID].edges[j].len; } for (int j = 0; j < rsmt.branchCount(); j++) { @@ -746,8 +746,8 @@ void FastRouteCore::gen_brk_RSMT(const bool congestionDriven, if (x1 != x2 || y1 != y2) { // the branch is not degraded (a point) // the position of this segment in seglist - seglist_[i].push_back(Segment()); - auto& seg = seglist_[i].back(); + seglist_[netID].push_back(Segment()); + auto& seg = seglist_[netID].back(); if (x1 < x2) { seg.x1 = x1; seg.x2 = x2; @@ -760,16 +760,16 @@ void FastRouteCore::gen_brk_RSMT(const bool congestionDriven, seg.y2 = y1; } - seg.netID = i; + seg.netID = netID; } } // loop j - totalNumSeg += seglist_[i].size(); + totalNumSeg += seglist_[netID].size(); if (reRoute) { // update the est_usage due to the segments in this net newrouteL( - i, + netID, RouteType::NoRoute, true); // route the net with no previous route for each tree edge } diff --git a/src/grt/src/fastroute/src/route.cpp b/src/grt/src/fastroute/src/route.cpp index 78e8d63511b..98d1457fd2d 100644 --- a/src/grt/src/fastroute/src/route.cpp +++ b/src/grt/src/fastroute/src/route.cpp @@ -229,22 +229,22 @@ void FastRouteCore::routeLAll(bool firstTime) { if (firstTime) { // no previous route // estimate congestion with 0.5+0.5 L - for (int& i : dirty_net_ids_) { - for (auto& seg : seglist_[i]) { + for (int& netID : dirty_net_ids_) { + for (auto& seg : seglist_[netID]) { estimateOneSeg(&seg); } } // L route - for (int& i : dirty_net_ids_) { - for (auto& seg : seglist_[i]) { + for (int& netID : dirty_net_ids_) { + for (auto& seg : seglist_[netID]) { // no need to reroute the H or V segs if (seg.x1 != seg.x2 || seg.y1 != seg.y2) routeSegLFirstTime(&seg); } } } else { // previous is L-route - for (int& i : dirty_net_ids_) { - for (auto& seg : seglist_[i]) { + for (int& netID : dirty_net_ids_) { + for (auto& seg : seglist_[netID]) { // no need to reroute the H or V segs if (seg.x1 != seg.x2 || seg.y1 != seg.y2) { ripupSegL(&seg); @@ -406,12 +406,12 @@ void FastRouteCore::newrouteL(int netID, RouteType ripuptype, bool viaGuided) void FastRouteCore::newrouteLAll(bool firstTime, bool viaGuided) { if (firstTime) { - for (int& i : dirty_net_ids_) { - newrouteL(i, RouteType::NoRoute, viaGuided); // do L-routing + for (int& netID : dirty_net_ids_) { + newrouteL(netID, RouteType::NoRoute, viaGuided); // do L-routing } } else { - for (int& i : dirty_net_ids_) { - newrouteL(i, RouteType::LRoute, viaGuided); + for (int& netID : dirty_net_ids_) { + newrouteL(netID, RouteType::LRoute, viaGuided); } } } @@ -842,8 +842,8 @@ void FastRouteCore::newrouteZ(int netID, int threshold) // first void FastRouteCore::newrouteZAll(int threshold) { - for (int& i : dirty_net_ids_) { - newrouteZ(i, threshold); // ripup previous route and do Z-routing + for (int& netID : dirty_net_ids_) { + newrouteZ(netID, threshold); // ripup previous route and do Z-routing } } diff --git a/src/grt/src/fastroute/src/utility.cpp b/src/grt/src/fastroute/src/utility.cpp index 773bef0dcca..1096d0ac155 100644 --- a/src/grt/src/fastroute/src/utility.cpp +++ b/src/grt/src/fastroute/src/utility.cpp @@ -147,11 +147,11 @@ void FastRouteCore::netpinOrderInc() { tree_order_pv_.clear(); - for (int& j : dirty_net_ids_) { + for (int& netID : dirty_net_ids_) { int xmin = BIG_INT; int totalLength = 0; - const auto& treenodes = sttrees_[j].nodes; - StTree* stree = &(sttrees_[j]); + const auto& treenodes = sttrees_[netID].nodes; + StTree* stree = &(sttrees_[netID]); const int num_edges = stree->num_edges(); for (int ind = 0; ind < num_edges; ind++) { totalLength += stree->edges[ind].len; @@ -162,7 +162,7 @@ void FastRouteCore::netpinOrderInc() float npvalue = (float) totalLength / stree->num_terminals; - tree_order_pv_.push_back({j, xmin, npvalue}); + tree_order_pv_.push_back({netID, xmin, npvalue}); } std::stable_sort(tree_order_pv_.begin(), tree_order_pv_.end(), comparePVMINX); @@ -1215,7 +1215,7 @@ void FastRouteCore::StNetOrder() tree_order_cong_.clear(); - tree_order_cong_.resize(dirty_net_ids_.size()); // netCount()); + tree_order_cong_.resize(dirty_net_ids_.size()); i = 0; for (int j = 0; j < dirty_net_ids_.size(); j++) { From 6d488592df25b277c3165267d048db15eeac0ef9 Mon Sep 17 00:00:00 2001 From: luis201420 Date: Sat, 2 Mar 2024 03:09:32 +0000 Subject: [PATCH 05/45] grt: using const variables Signed-off-by: luis201420 --- src/grt/src/fastroute/include/DataType.h | 3 -- src/grt/src/fastroute/include/FastRoute.h | 1 - src/grt/src/fastroute/src/FastRoute.cpp | 22 +++++--------- src/grt/src/fastroute/src/RSMT.cpp | 2 +- src/grt/src/fastroute/src/maze.cpp | 6 ++-- src/grt/src/fastroute/src/route.cpp | 22 +++++++------- src/grt/src/fastroute/src/utility.cpp | 37 ++++++++++------------- 7 files changed, 39 insertions(+), 54 deletions(-) diff --git a/src/grt/src/fastroute/include/DataType.h b/src/grt/src/fastroute/include/DataType.h index 86356664f5e..e61422ab0f6 100644 --- a/src/grt/src/fastroute/include/DataType.h +++ b/src/grt/src/fastroute/include/DataType.h @@ -87,7 +87,6 @@ struct Segment // A Segment is a 2-pin connection struct FrNet // A Net is a set of connected MazePoints { bool isClock() const { return is_clock_; } - bool isRouted() const { return is_routed_; } bool isCritical() { return is_critical_; } float getSlack() const { return slack_; } odb::dbNet* getDbNet() const { return db_net_; } @@ -115,7 +114,6 @@ struct FrNet // A Net is a set of connected MazePoints int max_layer, float slack, std::vector* edge_cost_per_layer); - void setIsRouted(bool is_routed) { is_routed_ = is_routed; } void setMaxLayer(int max_layer) { max_layer_ = max_layer; } void setMinLayer(int min_layer) { min_layer_ = min_layer; } void setSlack(float slack) { slack_ = slack; } @@ -135,7 +133,6 @@ struct FrNet // A Net is a set of connected MazePoints float slack_; // Non-null when an NDR has been applied to the net. std::unique_ptr> edge_cost_per_layer_; - bool is_routed_ = false; }; struct Edge // An Edge is the routing track holder between two adjacent diff --git a/src/grt/src/fastroute/include/FastRoute.h b/src/grt/src/fastroute/include/FastRoute.h index df2eb409d67..8b62e8d43dc 100644 --- a/src/grt/src/fastroute/include/FastRoute.h +++ b/src/grt/src/fastroute/include/FastRoute.h @@ -483,7 +483,6 @@ class FastRouteCore bool horizontal, int& best_cost, multi_array& layer_grid); - bool skipNet(int netID); void assignEdge(int netID, int edgeID, bool processDIR); void recoverEdge(int netID, int edgeID); void layerAssignmentV4(); diff --git a/src/grt/src/fastroute/src/FastRoute.cpp b/src/grt/src/fastroute/src/FastRoute.cpp index 3812c2678a0..240d3cf8f72 100644 --- a/src/grt/src/fastroute/src/FastRoute.cpp +++ b/src/grt/src/fastroute/src/FastRoute.cpp @@ -274,6 +274,8 @@ FrNet* FastRouteCore::addNet(odb::dbNet* db_net, slack, edge_cost_per_layer); + dirty_net_ids_.push_back(netID); + return net; } @@ -665,8 +667,7 @@ void FastRouteCore::initNetAuxVars() NetRouteMap FastRouteCore::getRoutes() { NetRouteMap routes; - for (int& netID : dirty_net_ids_) { - nets_[netID]->setIsRouted(true); + for (const int& netID : dirty_net_ids_) { odb::dbNet* db_net = nets_[netID]->getDbNet(); GRoute& route = routes[db_net]; std::unordered_set net_segs; @@ -724,7 +725,7 @@ NetRouteMap FastRouteCore::getPlanarRoutes() // Get routes before layer assignment - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { auto fr_net = nets_[netID]; odb::dbNet* db_net = fr_net->getDbNet(); GRoute& route = routes[db_net]; @@ -875,13 +876,6 @@ NetRouteMap FastRouteCore::run() v_used_ggrid_.clear(); h_used_ggrid_.clear(); - dirty_net_ids_.clear(); - for (int netID = 0; netID < netCount(); netID++) { - if (!skipNet(netID)) { - dirty_net_ids_.push_back(netID); - } - } - int tUsage; int cost_step; int maxOverflow = 0; @@ -1001,7 +995,7 @@ NetRouteMap FastRouteCore::run() // debug mode Rectilinear Steiner Tree before overflow iterations if (debug_->isOn() && debug_->rectilinearSTree_) { - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { StTreeVisualization(sttrees_[netID], nets_[netID], false); } } @@ -1250,7 +1244,7 @@ NetRouteMap FastRouteCore::run() // Debug mode Tree 2D after overflow iterations if (debug_->isOn() && debug_->tree2D_) { - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { StTreeVisualization(sttrees_[netID], nets_[netID], false); } } @@ -1305,13 +1299,14 @@ NetRouteMap FastRouteCore::run() // Debug mode Tree 3D after layer assignament if (debug_->isOn() && debug_->tree3D_) { - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { StTreeVisualization(sttrees_[netID], nets_[netID], true); } } NetRouteMap routes = getRoutes(); net_eo_.clear(); + dirty_net_ids_.clear(); return routes; } @@ -1534,7 +1529,6 @@ void FrNet::reset(odb::dbNet* db_net, std::vector* edge_cost_per_layer) { db_net_ = db_net; - is_routed_ = false; is_critical_ = false; is_clock_ = is_clock; driver_idx_ = driver_idx; diff --git a/src/grt/src/fastroute/src/RSMT.cpp b/src/grt/src/fastroute/src/RSMT.cpp index 9141c65e759..a35ebfe0ee8 100644 --- a/src/grt/src/fastroute/src/RSMT.cpp +++ b/src/grt/src/fastroute/src/RSMT.cpp @@ -654,7 +654,7 @@ void FastRouteCore::gen_brk_RSMT(const bool congestionDriven, const int flute_accuracy = 2; - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { FrNet* net = nets_[netID]; int d = net->getNumPins(); diff --git a/src/grt/src/fastroute/src/maze.cpp b/src/grt/src/fastroute/src/maze.cpp index fd99d431647..a73b003a19f 100644 --- a/src/grt/src/fastroute/src/maze.cpp +++ b/src/grt/src/fastroute/src/maze.cpp @@ -60,7 +60,7 @@ void FastRouteCore::fixEmbeddedTrees() // check embedded trees only when maze router is called // i.e., when running overflow iterations if (overflow_iterations_ > 0) { - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { checkAndFixEmbeddedTree(netID); } } @@ -497,7 +497,7 @@ void FastRouteCore::convertToMazerouteNet(const int netID) void FastRouteCore::convertToMazeroute() { - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { convertToMazerouteNet(netID); } @@ -2559,7 +2559,7 @@ void FastRouteCore::InitLastUsage(const int upType) void FastRouteCore::SaveLastRouteLen() { - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; // loop for all the tree edges const int num_edges = sttrees_[netID].num_edges(); diff --git a/src/grt/src/fastroute/src/route.cpp b/src/grt/src/fastroute/src/route.cpp index 98d1457fd2d..9571a84b5ee 100644 --- a/src/grt/src/fastroute/src/route.cpp +++ b/src/grt/src/fastroute/src/route.cpp @@ -229,13 +229,13 @@ void FastRouteCore::routeLAll(bool firstTime) { if (firstTime) { // no previous route // estimate congestion with 0.5+0.5 L - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { for (auto& seg : seglist_[netID]) { estimateOneSeg(&seg); } } // L route - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { for (auto& seg : seglist_[netID]) { // no need to reroute the H or V segs if (seg.x1 != seg.x2 || seg.y1 != seg.y2) @@ -243,7 +243,7 @@ void FastRouteCore::routeLAll(bool firstTime) } } } else { // previous is L-route - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { for (auto& seg : seglist_[netID]) { // no need to reroute the H or V segs if (seg.x1 != seg.x2 || seg.y1 != seg.y2) { @@ -406,11 +406,11 @@ void FastRouteCore::newrouteL(int netID, RouteType ripuptype, bool viaGuided) void FastRouteCore::newrouteLAll(bool firstTime, bool viaGuided) { if (firstTime) { - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { newrouteL(netID, RouteType::NoRoute, viaGuided); // do L-routing } } else { - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { newrouteL(netID, RouteType::LRoute, viaGuided); } } @@ -842,7 +842,7 @@ void FastRouteCore::newrouteZ(int netID, int threshold) // first void FastRouteCore::newrouteZAll(int threshold) { - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { newrouteZ(netID, threshold); // ripup previous route and do Z-routing } } @@ -1019,7 +1019,7 @@ void FastRouteCore::spiralRoute(int netID, int edgeID) void FastRouteCore::spiralRouteAll() { - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { auto& treenodes = sttrees_[netID].nodes; const int num_terminals = sttrees_[netID].num_terminals; @@ -1066,7 +1066,7 @@ void FastRouteCore::spiralRouteAll() } } - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; auto& treenodes = sttrees_[netID].nodes; const int num_edges = sttrees_[netID].num_edges(); @@ -1092,7 +1092,7 @@ void FastRouteCore::spiralRouteAll() } std::queue edgeQueue; - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { newRipupNet(netID); auto& treeedges = sttrees_[netID].edges; @@ -1144,7 +1144,7 @@ void FastRouteCore::spiralRouteAll() } } - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { auto& treenodes = sttrees_[netID].nodes; for (int d = 0; d < sttrees_[netID].num_nodes(); d++) { @@ -1480,7 +1480,7 @@ void FastRouteCore::routeMonotonicAll(int threshold, multi_array d1(boost::extents[y_range_][x_range_]); multi_array d2(boost::extents[y_range_][x_range_]); - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { const int numEdges = sttrees_[netID].num_edges(); for (int edgeID = 0; edgeID < numEdges; edgeID++) { routeMonotonic(netID, diff --git a/src/grt/src/fastroute/src/utility.cpp b/src/grt/src/fastroute/src/utility.cpp index 1096d0ac155..c170b75e695 100644 --- a/src/grt/src/fastroute/src/utility.cpp +++ b/src/grt/src/fastroute/src/utility.cpp @@ -64,7 +64,7 @@ void FastRouteCore::printEdge(int const netID, int const edgeID) void FastRouteCore::ConvertToFull3DType2() { - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; const int num_edges = sttrees_[netID].num_edges(); @@ -147,7 +147,7 @@ void FastRouteCore::netpinOrderInc() { tree_order_pv_.clear(); - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { int xmin = BIG_INT; int totalLength = 0; const auto& treenodes = sttrees_[netID].nodes; @@ -174,7 +174,7 @@ void FastRouteCore::fillVIA() int numVIAT1 = 0; int numVIAT2 = 0; - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; int num_terminals = sttrees_[netID].num_terminals; const auto& treenodes = sttrees_[netID].nodes; @@ -393,7 +393,7 @@ int FastRouteCore::threeDVIA() { int numVIA = 0; - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; int num_edges = sttrees_[netID].num_edges(); @@ -840,7 +840,7 @@ void FastRouteCore::layerAssignmentV4() TreeEdge* treeedge; - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; for (edgeID = 0; edgeID < sttrees_[netID].num_edges(); edgeID++) { treeedge = &(treeedges[edgeID]); @@ -974,7 +974,7 @@ void FastRouteCore::layerAssignment() bool redundant; TreeEdge* treeedge; - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { auto& treenodes = sttrees_[netID].nodes; numpoints = 0; @@ -1021,7 +1021,7 @@ void FastRouteCore::layerAssignment() } } - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; auto& treenodes = sttrees_[netID].nodes; @@ -1101,7 +1101,7 @@ void FastRouteCore::checkRoute3D() int distance; bool gridFlag; - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { const auto& treenodes = sttrees_[netID].nodes; const int num_terminals = sttrees_[netID].num_terminals; @@ -1291,7 +1291,7 @@ float FastRouteCore::CalculatePartialSlack() parasitics_builder_->estimateParasitcs(db_net, route); } } - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { auto fr_net = nets_[netID]; odb::dbNet* db_net = fr_net->getDbNet(); float slack = parasitics_builder_->getNetSlack(db_net); @@ -1309,7 +1309,7 @@ float FastRouteCore::CalculatePartialSlack() // Set the non critical nets slack as the lowest float, so they can be // ordered by overflow (and ordered first than the critical nets) - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { if (nets_[netID]->getSlack() > slack_th) { nets_[netID]->setSlack(std::ceil(std::numeric_limits::lowest())); } @@ -1396,7 +1396,7 @@ void FastRouteCore::recoverEdge(int netID, int edgeID) void FastRouteCore::removeLoops() { - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { auto& treeedges = sttrees_[netID].edges; const int edgeCost = nets_[netID]->getEdgeCost(); @@ -1724,11 +1724,6 @@ void FastRouteCore::printTree2D(int netID) } } -bool FastRouteCore::skipNet(int netID) -{ - return nets_[netID] == nullptr || nets_[netID]->isRouted(); -} - bool FastRouteCore::checkRoute2DTree(int netID) { bool STHwrong = false; @@ -1827,7 +1822,7 @@ void FastRouteCore::copyRS(void) int i, j, edgeID, numEdges, numNodes; if (!sttrees_bk_.empty()) { - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { numEdges = sttrees_bk_[netID].num_edges(); for (edgeID = 0; edgeID < numEdges; edgeID++) { if (sttrees_bk_[netID].edges[edgeID].len > 0) { @@ -1841,7 +1836,7 @@ void FastRouteCore::copyRS(void) sttrees_bk_.resize(netCount()); - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { numNodes = sttrees_[netID].num_nodes(); numEdges = sttrees_[netID].num_edges(); @@ -1891,7 +1886,7 @@ void FastRouteCore::copyBR(void) int i, j, edgeID, numEdges, numNodes, min_y, min_x; if (!sttrees_bk_.empty()) { - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { numEdges = sttrees_[netID].num_edges(); for (edgeID = 0; edgeID < numEdges; edgeID++) { if (sttrees_[netID].edges[edgeID].len > 0) { @@ -1901,7 +1896,7 @@ void FastRouteCore::copyBR(void) } } - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { numNodes = sttrees_bk_[netID].num_nodes(); numEdges = sttrees_bk_[netID].num_edges(); @@ -1996,7 +1991,7 @@ void FastRouteCore::freeRR(void) { int edgeID, numEdges; if (!sttrees_bk_.empty()) { - for (int& netID : dirty_net_ids_) { + for (const int& netID : dirty_net_ids_) { numEdges = sttrees_bk_[netID].num_edges(); for (edgeID = 0; edgeID < numEdges; edgeID++) { if (sttrees_bk_[netID].edges[edgeID].len > 0) { From add8d747c4638a84cdc4afb01c8384d27ad4b8d7 Mon Sep 17 00:00:00 2001 From: luis201420 Date: Sat, 2 Mar 2024 00:24:49 -0300 Subject: [PATCH 06/45] grt: adding clang-format Signed-off-by: luis201420 --- src/grt/src/fastroute/src/RSMT.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/grt/src/fastroute/src/RSMT.cpp b/src/grt/src/fastroute/src/RSMT.cpp index a35ebfe0ee8..f1b41d83f5f 100644 --- a/src/grt/src/fastroute/src/RSMT.cpp +++ b/src/grt/src/fastroute/src/RSMT.cpp @@ -699,11 +699,19 @@ void FastRouteCore::gen_brk_RSMT(const bool congestionDriven, coeffV = noADJ ? 1.2 : coeffADJ(netID); cong = netCongestion(netID); if (cong) { - fluteCongest( - netID, net->getPinX(), net->getPinY(), flute_accuracy, coeffV, rsmt); + fluteCongest(netID, + net->getPinX(), + net->getPinY(), + flute_accuracy, + coeffV, + rsmt); } else { - fluteNormal( - netID, net->getPinX(), net->getPinY(), flute_accuracy, coeffV, rsmt); + fluteNormal(netID, + net->getPinX(), + net->getPinY(), + flute_accuracy, + coeffV, + rsmt); } if (d > 3) { numShift += edgeShiftNew(rsmt, netID); @@ -713,8 +721,12 @@ void FastRouteCore::gen_brk_RSMT(const bool congestionDriven, if (noADJ || HTreeSuite(netID)) { coeffV = 1.2; } - fluteNormal( - netID, net->getPinX(), net->getPinY(), flute_accuracy, coeffV, rsmt); + fluteNormal(netID, + net->getPinX(), + net->getPinY(), + flute_accuracy, + coeffV, + rsmt); } } if (debug_->isOn() && debug_->steinerTree_ From a935e6fa78673d333cde78a4931c102d9fe59a05 Mon Sep 17 00:00:00 2001 From: luis201420 Date: Sat, 2 Mar 2024 01:27:01 -0300 Subject: [PATCH 07/45] grt: adding suggested changes Signed-off-by: luis201420 --- src/grt/src/fastroute/src/RSMT.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/grt/src/fastroute/src/RSMT.cpp b/src/grt/src/fastroute/src/RSMT.cpp index f1b41d83f5f..2c7c9f9fe79 100644 --- a/src/grt/src/fastroute/src/RSMT.cpp +++ b/src/grt/src/fastroute/src/RSMT.cpp @@ -743,8 +743,9 @@ void FastRouteCore::gen_brk_RSMT(const bool congestionDriven, } if (congestionDriven) { - for (int j = 0; j < sttrees_[netID].num_edges(); j++) + for (int j = 0; j < sttrees_[netID].num_edges(); j++) { wl1 += sttrees_[netID].edges[j].len; + } } for (int j = 0; j < rsmt.branchCount(); j++) { From b53da7e381d4ba071a5cb887deb32576f20e59db Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Tue, 5 Mar 2024 13:34:02 -0300 Subject: [PATCH 08/45] grt: rename class member Signed-off-by: Eder Monteiro --- src/grt/src/fastroute/include/FastRoute.h | 2 +- src/grt/src/fastroute/src/FastRoute.cpp | 14 +++---- src/grt/src/fastroute/src/RSMT.cpp | 2 +- src/grt/src/fastroute/src/maze.cpp | 10 ++--- src/grt/src/fastroute/src/route.cpp | 22 +++++------ src/grt/src/fastroute/src/utility.cpp | 46 +++++++++++------------ 6 files changed, 48 insertions(+), 48 deletions(-) diff --git a/src/grt/src/fastroute/include/FastRoute.h b/src/grt/src/fastroute/include/FastRoute.h index 8b62e8d43dc..e2eba885d49 100644 --- a/src/grt/src/fastroute/include/FastRoute.h +++ b/src/grt/src/fastroute/include/FastRoute.h @@ -621,7 +621,7 @@ class FastRouteCore std::set> h_used_ggrid_; std::set> v_used_ggrid_; - std::vector dirty_net_ids_; + std::vector net_ids_; }; } // namespace grt diff --git a/src/grt/src/fastroute/src/FastRoute.cpp b/src/grt/src/fastroute/src/FastRoute.cpp index 240d3cf8f72..c3f81a7da13 100644 --- a/src/grt/src/fastroute/src/FastRoute.cpp +++ b/src/grt/src/fastroute/src/FastRoute.cpp @@ -274,7 +274,7 @@ FrNet* FastRouteCore::addNet(odb::dbNet* db_net, slack, edge_cost_per_layer); - dirty_net_ids_.push_back(netID); + net_ids_.push_back(netID); return net; } @@ -667,7 +667,7 @@ void FastRouteCore::initNetAuxVars() NetRouteMap FastRouteCore::getRoutes() { NetRouteMap routes; - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { odb::dbNet* db_net = nets_[netID]->getDbNet(); GRoute& route = routes[db_net]; std::unordered_set net_segs; @@ -725,7 +725,7 @@ NetRouteMap FastRouteCore::getPlanarRoutes() // Get routes before layer assignment - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { auto fr_net = nets_[netID]; odb::dbNet* db_net = fr_net->getDbNet(); GRoute& route = routes[db_net]; @@ -995,7 +995,7 @@ NetRouteMap FastRouteCore::run() // debug mode Rectilinear Steiner Tree before overflow iterations if (debug_->isOn() && debug_->rectilinearSTree_) { - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { StTreeVisualization(sttrees_[netID], nets_[netID], false); } } @@ -1244,7 +1244,7 @@ NetRouteMap FastRouteCore::run() // Debug mode Tree 2D after overflow iterations if (debug_->isOn() && debug_->tree2D_) { - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { StTreeVisualization(sttrees_[netID], nets_[netID], false); } } @@ -1299,14 +1299,14 @@ NetRouteMap FastRouteCore::run() // Debug mode Tree 3D after layer assignament if (debug_->isOn() && debug_->tree3D_) { - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { StTreeVisualization(sttrees_[netID], nets_[netID], true); } } NetRouteMap routes = getRoutes(); net_eo_.clear(); - dirty_net_ids_.clear(); + net_ids_.clear(); return routes; } diff --git a/src/grt/src/fastroute/src/RSMT.cpp b/src/grt/src/fastroute/src/RSMT.cpp index 2c7c9f9fe79..fbc7a484517 100644 --- a/src/grt/src/fastroute/src/RSMT.cpp +++ b/src/grt/src/fastroute/src/RSMT.cpp @@ -654,7 +654,7 @@ void FastRouteCore::gen_brk_RSMT(const bool congestionDriven, const int flute_accuracy = 2; - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { FrNet* net = nets_[netID]; int d = net->getNumPins(); diff --git a/src/grt/src/fastroute/src/maze.cpp b/src/grt/src/fastroute/src/maze.cpp index a73b003a19f..81ce1ae5121 100644 --- a/src/grt/src/fastroute/src/maze.cpp +++ b/src/grt/src/fastroute/src/maze.cpp @@ -60,7 +60,7 @@ void FastRouteCore::fixEmbeddedTrees() // check embedded trees only when maze router is called // i.e., when running overflow iterations if (overflow_iterations_ > 0) { - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { checkAndFixEmbeddedTree(netID); } } @@ -497,7 +497,7 @@ void FastRouteCore::convertToMazerouteNet(const int netID) void FastRouteCore::convertToMazeroute() { - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { convertToMazerouteNet(netID); } @@ -1356,9 +1356,9 @@ void FastRouteCore::mazeRouteMSMD(const int iter, std::vector pop_heap2(y_grid_ * x_range_, false); - for (int nidRPC = 0; nidRPC < dirty_net_ids_.size(); nidRPC++) { + for (int nidRPC = 0; nidRPC < net_ids_.size(); nidRPC++) { const int netID = ordering ? tree_order_cong_[nidRPC].treeIndex - : dirty_net_ids_[nidRPC]; + : net_ids_[nidRPC]; const int num_terminals = sttrees_[netID].num_terminals; @@ -2559,7 +2559,7 @@ void FastRouteCore::InitLastUsage(const int upType) void FastRouteCore::SaveLastRouteLen() { - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { auto& treeedges = sttrees_[netID].edges; // loop for all the tree edges const int num_edges = sttrees_[netID].num_edges(); diff --git a/src/grt/src/fastroute/src/route.cpp b/src/grt/src/fastroute/src/route.cpp index 9571a84b5ee..b1992c2ca14 100644 --- a/src/grt/src/fastroute/src/route.cpp +++ b/src/grt/src/fastroute/src/route.cpp @@ -229,13 +229,13 @@ void FastRouteCore::routeLAll(bool firstTime) { if (firstTime) { // no previous route // estimate congestion with 0.5+0.5 L - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { for (auto& seg : seglist_[netID]) { estimateOneSeg(&seg); } } // L route - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { for (auto& seg : seglist_[netID]) { // no need to reroute the H or V segs if (seg.x1 != seg.x2 || seg.y1 != seg.y2) @@ -243,7 +243,7 @@ void FastRouteCore::routeLAll(bool firstTime) } } } else { // previous is L-route - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { for (auto& seg : seglist_[netID]) { // no need to reroute the H or V segs if (seg.x1 != seg.x2 || seg.y1 != seg.y2) { @@ -406,11 +406,11 @@ void FastRouteCore::newrouteL(int netID, RouteType ripuptype, bool viaGuided) void FastRouteCore::newrouteLAll(bool firstTime, bool viaGuided) { if (firstTime) { - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { newrouteL(netID, RouteType::NoRoute, viaGuided); // do L-routing } } else { - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { newrouteL(netID, RouteType::LRoute, viaGuided); } } @@ -842,7 +842,7 @@ void FastRouteCore::newrouteZ(int netID, int threshold) // first void FastRouteCore::newrouteZAll(int threshold) { - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { newrouteZ(netID, threshold); // ripup previous route and do Z-routing } } @@ -1019,7 +1019,7 @@ void FastRouteCore::spiralRoute(int netID, int edgeID) void FastRouteCore::spiralRouteAll() { - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { auto& treenodes = sttrees_[netID].nodes; const int num_terminals = sttrees_[netID].num_terminals; @@ -1066,7 +1066,7 @@ void FastRouteCore::spiralRouteAll() } } - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { auto& treeedges = sttrees_[netID].edges; auto& treenodes = sttrees_[netID].nodes; const int num_edges = sttrees_[netID].num_edges(); @@ -1092,7 +1092,7 @@ void FastRouteCore::spiralRouteAll() } std::queue edgeQueue; - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { newRipupNet(netID); auto& treeedges = sttrees_[netID].edges; @@ -1144,7 +1144,7 @@ void FastRouteCore::spiralRouteAll() } } - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { auto& treenodes = sttrees_[netID].nodes; for (int d = 0; d < sttrees_[netID].num_nodes(); d++) { @@ -1480,7 +1480,7 @@ void FastRouteCore::routeMonotonicAll(int threshold, multi_array d1(boost::extents[y_range_][x_range_]); multi_array d2(boost::extents[y_range_][x_range_]); - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { const int numEdges = sttrees_[netID].num_edges(); for (int edgeID = 0; edgeID < numEdges; edgeID++) { routeMonotonic(netID, diff --git a/src/grt/src/fastroute/src/utility.cpp b/src/grt/src/fastroute/src/utility.cpp index c170b75e695..0c1cacc3c63 100644 --- a/src/grt/src/fastroute/src/utility.cpp +++ b/src/grt/src/fastroute/src/utility.cpp @@ -64,7 +64,7 @@ void FastRouteCore::printEdge(int const netID, int const edgeID) void FastRouteCore::ConvertToFull3DType2() { - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { auto& treeedges = sttrees_[netID].edges; const int num_edges = sttrees_[netID].num_edges(); @@ -147,7 +147,7 @@ void FastRouteCore::netpinOrderInc() { tree_order_pv_.clear(); - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { int xmin = BIG_INT; int totalLength = 0; const auto& treenodes = sttrees_[netID].nodes; @@ -174,7 +174,7 @@ void FastRouteCore::fillVIA() int numVIAT1 = 0; int numVIAT2 = 0; - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { auto& treeedges = sttrees_[netID].edges; int num_terminals = sttrees_[netID].num_terminals; const auto& treenodes = sttrees_[netID].nodes; @@ -393,7 +393,7 @@ int FastRouteCore::threeDVIA() { int numVIA = 0; - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { auto& treeedges = sttrees_[netID].edges; int num_edges = sttrees_[netID].num_edges(); @@ -840,7 +840,7 @@ void FastRouteCore::layerAssignmentV4() TreeEdge* treeedge; - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { auto& treeedges = sttrees_[netID].edges; for (edgeID = 0; edgeID < sttrees_[netID].num_edges(); edgeID++) { treeedge = &(treeedges[edgeID]); @@ -974,7 +974,7 @@ void FastRouteCore::layerAssignment() bool redundant; TreeEdge* treeedge; - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { auto& treenodes = sttrees_[netID].nodes; numpoints = 0; @@ -1021,7 +1021,7 @@ void FastRouteCore::layerAssignment() } } - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { auto& treeedges = sttrees_[netID].edges; auto& treenodes = sttrees_[netID].nodes; @@ -1101,7 +1101,7 @@ void FastRouteCore::checkRoute3D() int distance; bool gridFlag; - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { const auto& treenodes = sttrees_[netID].nodes; const int num_terminals = sttrees_[netID].num_terminals; @@ -1215,13 +1215,13 @@ void FastRouteCore::StNetOrder() tree_order_cong_.clear(); - tree_order_cong_.resize(dirty_net_ids_.size()); + tree_order_cong_.resize(net_ids_.size()); i = 0; - for (int j = 0; j < dirty_net_ids_.size(); j++) { + for (int j = 0; j < net_ids_.size(); j++) { // if the net is routed - int netID = dirty_net_ids_[j]; + int netID = net_ids_[j]; stree = &(sttrees_[netID]); tree_order_cong_[j].xmin = 0; @@ -1256,11 +1256,11 @@ void FastRouteCore::StNetOrder() // Set the 70% (or less) of non critical nets that doesn't have overflow // with the lowest priority - for (int ord_elID = 0; ord_elID < dirty_net_ids_.size(); ord_elID++) { - auto order_element = tree_order_cong_[ord_elID]; + for (int net_id : net_ids_) { + auto order_element = tree_order_cong_[net_id]; if (nets_[order_element.treeIndex]->getSlack() == std::ceil(std::numeric_limits::lowest())) { - if (order_element.xmin == 0 && (ord_elID >= (netCount() * 30 / 100))) { + if (order_element.xmin == 0 && (net_id >= (netCount() * 30 / 100))) { nets_[order_element.treeIndex]->setSlack( std::numeric_limits::max()); } @@ -1291,7 +1291,7 @@ float FastRouteCore::CalculatePartialSlack() parasitics_builder_->estimateParasitcs(db_net, route); } } - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { auto fr_net = nets_[netID]; odb::dbNet* db_net = fr_net->getDbNet(); float slack = parasitics_builder_->getNetSlack(db_net); @@ -1309,7 +1309,7 @@ float FastRouteCore::CalculatePartialSlack() // Set the non critical nets slack as the lowest float, so they can be // ordered by overflow (and ordered first than the critical nets) - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { if (nets_[netID]->getSlack() > slack_th) { nets_[netID]->setSlack(std::ceil(std::numeric_limits::lowest())); } @@ -1396,7 +1396,7 @@ void FastRouteCore::recoverEdge(int netID, int edgeID) void FastRouteCore::removeLoops() { - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { auto& treeedges = sttrees_[netID].edges; const int edgeCost = nets_[netID]->getEdgeCost(); @@ -1822,7 +1822,7 @@ void FastRouteCore::copyRS(void) int i, j, edgeID, numEdges, numNodes; if (!sttrees_bk_.empty()) { - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { numEdges = sttrees_bk_[netID].num_edges(); for (edgeID = 0; edgeID < numEdges; edgeID++) { if (sttrees_bk_[netID].edges[edgeID].len > 0) { @@ -1836,7 +1836,7 @@ void FastRouteCore::copyRS(void) sttrees_bk_.resize(netCount()); - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { numNodes = sttrees_[netID].num_nodes(); numEdges = sttrees_[netID].num_edges(); @@ -1886,7 +1886,7 @@ void FastRouteCore::copyBR(void) int i, j, edgeID, numEdges, numNodes, min_y, min_x; if (!sttrees_bk_.empty()) { - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { numEdges = sttrees_[netID].num_edges(); for (edgeID = 0; edgeID < numEdges; edgeID++) { if (sttrees_[netID].edges[edgeID].len > 0) { @@ -1896,7 +1896,7 @@ void FastRouteCore::copyBR(void) } } - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { numNodes = sttrees_bk_[netID].num_nodes(); numEdges = sttrees_bk_[netID].num_edges(); @@ -1955,7 +1955,7 @@ void FastRouteCore::copyBR(void) v_edges_[i][j].usage = 0; } } - for (int netID = 0; netID < netCount(); netID++) { + for (int netID : net_ids_) { numEdges = sttrees_[netID].num_edges(); int edgeCost = nets_[netID]->getEdgeCost(); @@ -1991,7 +1991,7 @@ void FastRouteCore::freeRR(void) { int edgeID, numEdges; if (!sttrees_bk_.empty()) { - for (const int& netID : dirty_net_ids_) { + for (const int& netID : net_ids_) { numEdges = sttrees_bk_[netID].num_edges(); for (edgeID = 0; edgeID < numEdges; edgeID++) { if (sttrees_bk_[netID].edges[edgeID].len > 0) { From 45def0fc5d9f569b6431c460e3a58fc45b1bd070 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Tue, 5 Mar 2024 14:02:38 -0300 Subject: [PATCH 09/45] grt: clear net_ids vector Signed-off-by: Eder Monteiro --- src/grt/src/fastroute/src/FastRoute.cpp | 16 +++++++++++----- src/grt/src/fastroute/src/utility.cpp | 14 +++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/grt/src/fastroute/src/FastRoute.cpp b/src/grt/src/fastroute/src/FastRoute.cpp index c3f81a7da13..5e646fb3c11 100644 --- a/src/grt/src/fastroute/src/FastRoute.cpp +++ b/src/grt/src/fastroute/src/FastRoute.cpp @@ -163,6 +163,7 @@ void FastRouteCore::clearNets() delete net; } nets_.clear(); + net_ids_.clear(); seglist_.clear(); db_net_id_map_.clear(); } @@ -262,6 +263,7 @@ FrNet* FastRouteCore::addNet(odb::dbNet* db_net, net = new FrNet; nets_.push_back(net); netID = nets_.size() - 1; + net_ids_.push_back(netID); db_net_id_map_[db_net] = netID; // at most (2*num_pins-2) nodes -> (2*num_pins-3) segs_ for a net } @@ -274,8 +276,6 @@ FrNet* FastRouteCore::addNet(odb::dbNet* db_net, slack, edge_cost_per_layer); - net_ids_.push_back(netID); - return net; } @@ -996,7 +996,9 @@ NetRouteMap FastRouteCore::run() // debug mode Rectilinear Steiner Tree before overflow iterations if (debug_->isOn() && debug_->rectilinearSTree_) { for (const int& netID : net_ids_) { - StTreeVisualization(sttrees_[netID], nets_[netID], false); + if (nets_[netID]->getDbNet() == debug_->net_) { + StTreeVisualization(sttrees_[netID], nets_[netID], false); + } } } @@ -1245,7 +1247,9 @@ NetRouteMap FastRouteCore::run() // Debug mode Tree 2D after overflow iterations if (debug_->isOn() && debug_->tree2D_) { for (const int& netID : net_ids_) { - StTreeVisualization(sttrees_[netID], nets_[netID], false); + if (nets_[netID]->getDbNet() == debug_->net_) { + StTreeVisualization(sttrees_[netID], nets_[netID], false); + } } } @@ -1300,7 +1304,9 @@ NetRouteMap FastRouteCore::run() // Debug mode Tree 3D after layer assignament if (debug_->isOn() && debug_->tree3D_) { for (const int& netID : net_ids_) { - StTreeVisualization(sttrees_[netID], nets_[netID], true); + if (nets_[netID]->getDbNet() == debug_->net_) { + StTreeVisualization(sttrees_[netID], nets_[netID], true); + } } } diff --git a/src/grt/src/fastroute/src/utility.cpp b/src/grt/src/fastroute/src/utility.cpp index 0c1cacc3c63..c3a3b57cd7d 100644 --- a/src/grt/src/fastroute/src/utility.cpp +++ b/src/grt/src/fastroute/src/utility.cpp @@ -1218,14 +1218,10 @@ void FastRouteCore::StNetOrder() tree_order_cong_.resize(net_ids_.size()); i = 0; - for (int j = 0; j < net_ids_.size(); j++) { - // if the net is routed - - int netID = net_ids_[j]; - + for (const int& netID : net_ids_) { stree = &(sttrees_[netID]); - tree_order_cong_[j].xmin = 0; - tree_order_cong_[j].treeIndex = netID; + tree_order_cong_[netID].xmin = 0; + tree_order_cong_[netID].treeIndex = netID; for (ind = 0; ind < stree->num_edges(); ind++) { const auto& treeedges = stree->edges; @@ -1238,13 +1234,13 @@ void FastRouteCore::StNetOrder() min_y = std::min(gridsY[i], gridsY[i + 1]); const int cap = getEdgeCapacity( nets_[netID], gridsX[i], min_y, EdgeDirection::Vertical); - tree_order_cong_[j].xmin + tree_order_cong_[netID].xmin += std::max(0, v_edges_[min_y][gridsX[i]].usage - cap); } else { // a horizontal edge min_x = std::min(gridsX[i], gridsX[i + 1]); const int cap = getEdgeCapacity( nets_[netID], min_x, gridsY[i], EdgeDirection::Horizontal); - tree_order_cong_[j].xmin + tree_order_cong_[netID].xmin += std::max(0, h_edges_[gridsY[i]][min_x].usage - cap); } } From c888f7b94fc3db301d9f8c57722114c87be4f319 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Tue, 5 Mar 2024 14:18:28 -0300 Subject: [PATCH 10/45] grt: small bug fix Signed-off-by: Eder Monteiro --- src/grt/src/fastroute/src/FastRoute.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grt/src/fastroute/src/FastRoute.cpp b/src/grt/src/fastroute/src/FastRoute.cpp index 5e646fb3c11..b79419a72f8 100644 --- a/src/grt/src/fastroute/src/FastRoute.cpp +++ b/src/grt/src/fastroute/src/FastRoute.cpp @@ -263,7 +263,6 @@ FrNet* FastRouteCore::addNet(odb::dbNet* db_net, net = new FrNet; nets_.push_back(net); netID = nets_.size() - 1; - net_ids_.push_back(netID); db_net_id_map_[db_net] = netID; // at most (2*num_pins-2) nodes -> (2*num_pins-3) segs_ for a net } @@ -275,6 +274,7 @@ FrNet* FastRouteCore::addNet(odb::dbNet* db_net, max_layer, slack, edge_cost_per_layer); + net_ids_.push_back(netID); return net; } From aeaed595d9181f7b668eb761369be25dfc636723 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Tue, 5 Mar 2024 14:23:36 -0300 Subject: [PATCH 11/45] grt: clang-format Signed-off-by: Eder Monteiro --- src/grt/src/fastroute/src/maze.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/grt/src/fastroute/src/maze.cpp b/src/grt/src/fastroute/src/maze.cpp index 81ce1ae5121..adcbf2e3eab 100644 --- a/src/grt/src/fastroute/src/maze.cpp +++ b/src/grt/src/fastroute/src/maze.cpp @@ -1357,8 +1357,8 @@ void FastRouteCore::mazeRouteMSMD(const int iter, std::vector pop_heap2(y_grid_ * x_range_, false); for (int nidRPC = 0; nidRPC < net_ids_.size(); nidRPC++) { - const int netID = ordering ? tree_order_cong_[nidRPC].treeIndex - : net_ids_[nidRPC]; + const int netID + = ordering ? tree_order_cong_[nidRPC].treeIndex : net_ids_[nidRPC]; const int num_terminals = sttrees_[netID].num_terminals; From 47a928b4be1bd6509d907c413635a5e00384c6cb Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Tue, 5 Mar 2024 17:31:01 -0300 Subject: [PATCH 12/45] grt: fix invalid index when accessing tree order vector Signed-off-by: Eder Monteiro --- src/grt/src/fastroute/src/utility.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/grt/src/fastroute/src/utility.cpp b/src/grt/src/fastroute/src/utility.cpp index c3a3b57cd7d..c5178b87532 100644 --- a/src/grt/src/fastroute/src/utility.cpp +++ b/src/grt/src/fastroute/src/utility.cpp @@ -1218,10 +1218,12 @@ void FastRouteCore::StNetOrder() tree_order_cong_.resize(net_ids_.size()); i = 0; - for (const int& netID : net_ids_) { + for (int j = 0; j < net_ids_.size(); j++) { + int netID = net_ids_[j]; + stree = &(sttrees_[netID]); - tree_order_cong_[netID].xmin = 0; - tree_order_cong_[netID].treeIndex = netID; + tree_order_cong_[j].xmin = 0; + tree_order_cong_[j].treeIndex = netID; for (ind = 0; ind < stree->num_edges(); ind++) { const auto& treeedges = stree->edges; @@ -1234,13 +1236,13 @@ void FastRouteCore::StNetOrder() min_y = std::min(gridsY[i], gridsY[i + 1]); const int cap = getEdgeCapacity( nets_[netID], gridsX[i], min_y, EdgeDirection::Vertical); - tree_order_cong_[netID].xmin + tree_order_cong_[j].xmin += std::max(0, v_edges_[min_y][gridsX[i]].usage - cap); } else { // a horizontal edge min_x = std::min(gridsX[i], gridsX[i + 1]); const int cap = getEdgeCapacity( nets_[netID], min_x, gridsY[i], EdgeDirection::Horizontal); - tree_order_cong_[netID].xmin + tree_order_cong_[j].xmin += std::max(0, h_edges_[gridsY[i]][min_x].usage - cap); } } @@ -1252,11 +1254,11 @@ void FastRouteCore::StNetOrder() // Set the 70% (or less) of non critical nets that doesn't have overflow // with the lowest priority - for (int net_id : net_ids_) { - auto order_element = tree_order_cong_[net_id]; + for (int ord_elID = 0; ord_elID < net_ids_.size(); ord_elID++) { + auto order_element = tree_order_cong_[ord_elID]; if (nets_[order_element.treeIndex]->getSlack() == std::ceil(std::numeric_limits::lowest())) { - if (order_element.xmin == 0 && (net_id >= (netCount() * 30 / 100))) { + if (order_element.xmin == 0 && (ord_elID >= (netCount() * 30 / 100))) { nets_[order_element.treeIndex]->setSlack( std::numeric_limits::max()); } From 0f3b595ae5ed761d4e0ed9e34f531be81a2f85cc Mon Sep 17 00:00:00 2001 From: Osama Date: Tue, 12 Mar 2024 00:10:57 +0200 Subject: [PATCH 13/45] drt: init support lef58_minstep minadjlen/noadjeol/exceptrect options Signed-off-by: Osama --- src/drt/src/db/tech/frConstraint.h | 6 ++ src/drt/src/gc/FlexGC_impl.h | 2 + src/drt/src/gc/FlexGC_main.cpp | 97 +++++++++++++++++++++++++++++- src/drt/src/io/io.cpp | 21 ++++++- src/drt/test/fixture.cpp | 6 +- src/drt/test/fixture.h | 2 +- src/drt/test/gcTest.cpp | 35 ++++++++++- 7 files changed, 158 insertions(+), 11 deletions(-) diff --git a/src/drt/src/db/tech/frConstraint.h b/src/drt/src/db/tech/frConstraint.h index ba293f227f0..6657badb034 100644 --- a/src/drt/src/db/tech/frConstraint.h +++ b/src/drt/src/db/tech/frConstraint.h @@ -208,6 +208,8 @@ class frLef58MinStepConstraint : public frConstraint frCoord getMinAdjacentLength() const { return minAdjLength_; } bool hasEolWidth() const { return (eolWidth_ != -1); } frCoord getEolWidth() const { return eolWidth_; } + frCoord getNoAdjEol() const { return noAdjEol_; } + bool isExceptRectangle() const { return exceptRectangle_; } // setter void setMinStepLength(frCoord in) { minStepLength_ = in; } @@ -220,6 +222,8 @@ class frLef58MinStepConstraint : public frConstraint return frConstraintTypeEnum::frcLef58MinStepConstraint; } void report(utl::Logger* logger) const override; + void setNoAdjEol(frCoord value) { noAdjEol_ = value; } + void setExceptRectangle(bool value) { exceptRectangle_ = value; } protected: frCoord minStepLength_{-1}; @@ -239,6 +243,8 @@ class frLef58MinStepConstraint : public frConstraint bool exceptSameCorners_{false}; frCoord eolWidth_{-1}; bool concaveCorners_{false}; + frCoord noAdjEol_{-1}; + bool exceptRectangle_{false}; }; // minStep diff --git a/src/drt/src/gc/FlexGC_impl.h b/src/drt/src/gc/FlexGC_impl.h index cde04c7578e..ea184649f64 100644 --- a/src/drt/src/gc/FlexGC_impl.h +++ b/src/drt/src/gc/FlexGC_impl.h @@ -496,6 +496,8 @@ class FlexGCWorker::Impl void checkMetalShape_lef58MinStep(gcPin* pin); void checkMetalShape_lef58MinStep_noBetweenEol(gcPin* pin, frLef58MinStepConstraint* con); + void checkMetalShape_lef58MinStep_minAdjLength(gcPin* pin, + frLef58MinStepConstraint* con); void checkMetalSpacingTableInfluence(); void checkPinMetSpcTblInf(gcPin*); void checkRectMetSpcTblInf(gcRect*, frSpacingTableInfluenceConstraint*); diff --git a/src/drt/src/gc/FlexGC_main.cpp b/src/drt/src/gc/FlexGC_main.cpp index 1a52ed14072..c7f5ed8f862 100644 --- a/src/drt/src/gc/FlexGC_main.cpp +++ b/src/drt/src/gc/FlexGC_main.cpp @@ -1624,6 +1624,95 @@ void FlexGCWorker::Impl::checkMetalShape_lef58MinStep_noBetweenEol( } } +inline void joinSegmentCoords(gcSegment* seg, + frCoord& llx, + frCoord& lly, + frCoord& urx, + frCoord& ury) +{ + llx = std::min(llx, seg->low().x()); + lly = std::min(lly, seg->low().y()); + urx = std::max(urx, seg->low().x()); + ury = std::max(ury, seg->low().y()); + + llx = std::min(llx, seg->high().x()); + lly = std::min(lly, seg->high().y()); + urx = std::max(urx, seg->high().x()); + ury = std::max(ury, seg->high().y()); +} + +void FlexGCWorker::Impl::checkMetalShape_lef58MinStep_minAdjLength( + gcPin* pin, + frLef58MinStepConstraint* con) +{ + auto poly = pin->getPolygon(); + auto layerNum = poly->getLayerNum(); + auto net = poly->getNet(); + if (poly->size() == 4 && con->isExceptRectangle()) { + return; + } + + std::vector startEdges; + auto minStepLength = con->getMinStepLength(); + for (auto& edges : pin->getPolygonEdges()) { + // get the first edge that is >= minstep length + for (auto& e : edges) { + if (gtl::length(*e) < minStepLength) { + startEdges.push_back(e.get()); + } + } + } + for (auto startEdge : startEdges) { + bool violating = false; + auto nextEdge = startEdge->getNextEdge(); + auto prevEdge = startEdge->getPrevEdge(); + if (gtl::length(*(nextEdge)) < con->getMinAdjacentLength() + || gtl::length(*(prevEdge)) < con->getMinAdjacentLength()) { + violating = true; + } + if (con->getNoAdjEol() > -1) { + if (nextEdge->getLowCorner()->getType() == frCornerTypeEnum::CONVEX + && nextEdge->getHighCorner()->getType() == frCornerTypeEnum::CONVEX + && gtl::length(*(nextEdge)) < con->getNoAdjEol()) { + violating = true; + } + if (prevEdge->getLowCorner()->getType() == frCornerTypeEnum::CONVEX + && prevEdge->getHighCorner()->getType() == frCornerTypeEnum::CONVEX + && gtl::length(*(prevEdge)) < con->getNoAdjEol()) { + violating = true; + } + } + // skip if all edges are fixed + if (startEdge->isFixed() && nextEdge->isFixed() && prevEdge->isFixed()) { + continue; + } + if (!violating) { + continue; + } + + // real violation + frCoord llx = startEdge->low().x(); + frCoord lly = startEdge->low().y(); + frCoord urx = startEdge->low().x(); + frCoord ury = startEdge->low().y(); + + joinSegmentCoords(startEdge, llx, lly, urx, ury); + joinSegmentCoords(nextEdge, llx, lly, urx, ury); + joinSegmentCoords(prevEdge, llx, lly, urx, ury); + + auto marker = std::make_unique(); + Rect box(llx, lly, urx, ury); + marker->setBBox(box); + marker->setLayerNum(layerNum); + marker->setConstraint(con); + marker->addSrc(net->getOwner()); + marker->addVictim(net->getOwner(), std::make_tuple(layerNum, box, false)); + marker->addAggressor(net->getOwner(), + std::make_tuple(layerNum, box, false)); + addMarker(std::move(marker)); + } +} + // currently only support nobetweeneol void FlexGCWorker::Impl::checkMetalShape_lef58MinStep(gcPin* pin) { @@ -1632,10 +1721,12 @@ void FlexGCWorker::Impl::checkMetalShape_lef58MinStep(gcPin* pin) // auto net = poly->getNet(); for (auto con : getTech()->getLayer(layerNum)->getLef58MinStepConstraints()) { - if (!con->hasEolWidth()) { - continue; + if (con->hasEolWidth()) { + checkMetalShape_lef58MinStep_noBetweenEol(pin, con); + } + if (con->hasMinAdjacentLength()) { + checkMetalShape_lef58MinStep_minAdjLength(pin, con); } - checkMetalShape_lef58MinStep_noBetweenEol(pin, con); } } diff --git a/src/drt/src/io/io.cpp b/src/drt/src/io/io.cpp index 8bc39fb7d90..f2e3c129464 100644 --- a/src/drt/src/io/io.cpp +++ b/src/drt/src/io/io.cpp @@ -778,7 +778,16 @@ void io::Parser::setNets(odb::dbBlock* block) } tmpP->addToNet(netIn); tmpP->setLayerNum(layerNum); - + auto layer = tech_->name2layer_[layerName]; + auto styleWidth = width; + if (!(styleWidth)) { + if ((layer->isHorizontal() && beginY != endY) + || (!layer->isHorizontal() && beginX != endX)) { + styleWidth = layer->getWrongDirWidth(); + } else { + styleWidth = layer->getWidth(); + } + } width = (width) ? width : tech_->name2layer_[layerName]->getWidth(); auto defaultBeginExt = width / 2; auto defaultEndExt = width / 2; @@ -804,7 +813,7 @@ void io::Parser::setNets(odb::dbBlock* block) frEndStyle tmpEndStyle(tmpEndEnum); frSegStyle tmpSegStyle; - tmpSegStyle.setWidth(width); + tmpSegStyle.setWidth(styleWidth); tmpSegStyle.setBeginStyle( tmpBeginStyle, tmpBeginEnum == frcExtendEndStyle ? defaultBeginExt : beginExt); @@ -1476,11 +1485,19 @@ void io::Parser::setRoutingLayerProperties(odb::dbTechLayer* layer, tech_->addUConstraint(std::move(rightWayOnGridOnlyConstraint)); } for (auto rule : layer->getTechLayerMinStepRules()) { + if (rule->getMaxEdges() > 1) { + logger_->warn(DRT, + 335, + "LEF58_MINSTEP MAXEDGES {} is not supported", + rule->getMaxEdges()); + continue; + } auto con = std::make_unique(); con->setMinStepLength(rule->getMinStepLength()); con->setMaxEdges(rule->isMaxEdgesValid() ? rule->getMaxEdges() : -1); con->setMinAdjacentLength( rule->isMinAdjLength1Valid() ? rule->getMinAdjLength1() : -1); + con->setNoAdjEol(rule->isNoAdjacentEol() ? rule->getEolWidth() : -1); con->setEolWidth(rule->isNoBetweenEol() ? rule->getEolWidth() : -1); tmpLayer->addLef58MinStepConstraint(con.get()); tech_->addUConstraint(std::move(con)); diff --git a/src/drt/test/fixture.cpp b/src/drt/test/fixture.cpp index 03f3ed1ac12..470dcefd9ae 100644 --- a/src/drt/test/fixture.cpp +++ b/src/drt/test/fixture.cpp @@ -276,18 +276,18 @@ void Fixture::makeMinStepConstraint(frLayerNum layer_num) tech->addUConstraint(std::move(con)); } -void Fixture::makeMinStep58Constraint(frLayerNum layer_num) +frLef58MinStepConstraint* Fixture::makeMinStep58Constraint(frLayerNum layer_num) { auto con = std::make_unique(); con->setMinStepLength(50); con->setMaxEdges(1); - con->setEolWidth(200); - + auto rptr = con.get(); frTechObject* tech = design->getTech(); frLayer* layer = tech->getLayer(layer_num); layer->addLef58MinStepConstraint(con.get()); tech->addUConstraint(std::move(con)); + return rptr; } void Fixture::makeRectOnlyConstraint(frLayerNum layer_num) diff --git a/src/drt/test/fixture.h b/src/drt/test/fixture.h index 0da3a29779e..a4dcb699147 100644 --- a/src/drt/test/fixture.h +++ b/src/drt/test/fixture.h @@ -89,7 +89,7 @@ class Fixture void makeMinStepConstraint(frLayerNum layer_num); - void makeMinStep58Constraint(frLayerNum layer_num); + frLef58MinStepConstraint* makeMinStep58Constraint(frLayerNum layer_num); void makeRectOnlyConstraint(frLayerNum layer_num); diff --git a/src/drt/test/gcTest.cpp b/src/drt/test/gcTest.cpp index 0c2539a8ff5..f90057880d0 100644 --- a/src/drt/test/gcTest.cpp +++ b/src/drt/test/gcTest.cpp @@ -489,10 +489,11 @@ BOOST_AUTO_TEST_CASE(min_step) // Check for a lef58 style min step violation. The checker is very // limited and just supports NOBETWEENEOL style. -BOOST_AUTO_TEST_CASE(min_step58) +BOOST_AUTO_TEST_CASE(min_step58_nobetweeneol) { // Setup - makeMinStep58Constraint(2); + auto con = makeMinStep58Constraint(2); + con->setEolWidth(200); frNet* n1 = makeNet("n1"); @@ -510,6 +511,36 @@ BOOST_AUTO_TEST_CASE(min_step58) Rect(200, 50, 300, 70)); } +// Check for a lef58 style min step violation. The checker is very +// limited and just supports NOBETWEENEOL style. +BOOST_AUTO_TEST_CASE(min_step58_minadjlength) +{ + // Setup + auto con = makeMinStep58Constraint(2); + con->setMinAdjacentLength(100); + con->setNoAdjEol(200); + con->setMaxEdges(1); + + frNet* n1 = makeNet("n1"); + + makePathseg(n1, 2, {0, 0}, {500, 0}); + makePathseg(n1, 2, {200, -30}, {200, 70}); + + runGC(); + + // Test the results + auto& markers = worker.getMarkers(); + BOOST_TEST(markers.size() == 2); + testMarker(markers[0].get(), + 2, + frConstraintTypeEnum::frcLef58MinStepConstraint, + Rect(150, 50, 500, 70)); + testMarker(markers[1].get(), + 2, + frConstraintTypeEnum::frcLef58MinStepConstraint, + Rect(0, 50, 250, 70)); +} + // Check for a lef58 rect only violation. The markers are // the concave corners expanded by min-width and intersected // with the metal shapes. From ed1428228cb88a5108094bd2db97829aaeb0ced8 Mon Sep 17 00:00:00 2001 From: Osama Date: Tue, 12 Mar 2024 19:46:43 +0200 Subject: [PATCH 14/45] drt: read exceptrectangle in io Signed-off-by: Osama --- src/drt/src/io/io.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/drt/src/io/io.cpp b/src/drt/src/io/io.cpp index f2e3c129464..b7a6cb17e5e 100644 --- a/src/drt/src/io/io.cpp +++ b/src/drt/src/io/io.cpp @@ -1499,6 +1499,7 @@ void io::Parser::setRoutingLayerProperties(odb::dbTechLayer* layer, rule->isMinAdjLength1Valid() ? rule->getMinAdjLength1() : -1); con->setNoAdjEol(rule->isNoAdjacentEol() ? rule->getEolWidth() : -1); con->setEolWidth(rule->isNoBetweenEol() ? rule->getEolWidth() : -1); + con->setExceptRectangle(rule->isExceptRectangle()); tmpLayer->addLef58MinStepConstraint(con.get()); tech_->addUConstraint(std::move(con)); } From 04ce8d74c6daedba49f65f7b35bbefd7e348821e Mon Sep 17 00:00:00 2001 From: Ethan Mahintorabi Date: Mon, 11 Mar 2024 18:58:25 +0000 Subject: [PATCH 15/45] meta: Moving tool tests to ctest Now we can run all the regression tests in parallel. ``` $ ctest -j 128 ... 721/740 Test #501: grt.congestion5 ............................................... Passed 64.21 sec 722/740 Test #503: grt.congestion7 ............................................... Passed 70.06 sec 723/740 Test #488: cts.array_no_blockages ........................................ Passed 71.07 sec 724/740 Test #342: dpo.aes ....................................................... Passed 61.13 sec 725/740 Test #177: rsz.repair_fanout6 ............................................ Passed 73.91 sec 726/740 Test #240: rsz.repair_design3_verbose .................................... Passed 81.89 sec 100% tests passed Label Time Summary: IntegrationTest = 4664.65 sec*proc (714 tests) Total Test time (real) = 354.23 sec ``` Flow tests haven't been moved, because I'm not sure how they should be handled. I figure someone else can figure that out. Signed-off-by: Ethan Mahintorabi --- CMakeLists.txt | 11 +++ src/ant/CMakeLists.txt | 1 + src/ant/test/CMakeLists.txt | 13 ++++ src/cts/test/CMakeLists.txt | 26 +++++++ src/dbSta/CMakeLists.txt | 1 + src/dbSta/test/CMakeLists.txt | 45 ++++++++++++ src/dft/CMakeLists.txt | 2 +- src/dft/test/CMakeLists.txt | 15 +++- src/dpl/test/CMakeLists.txt | 68 ++++++++++++++++++ src/dpo/CMakeLists.txt | 2 + src/dpo/test/CMakeLists.txt | 15 ++++ src/drt/CMakeLists.txt | 2 + src/drt/test/CMakeLists.txt | 18 +++++ src/dst/test/cpp/CMakeLists.txt | 21 ++++++ src/fin/CMakeLists.txt | 2 + src/fin/test/CMakeLists.txt | 9 +++ src/gpl/test/CMakeLists.txt | 66 ++++++++---------- src/grt/CMakeLists.txt | 2 + src/grt/test/CMakeLists.txt | 71 +++++++++++++++++++ src/gui/CMakeLists.txt | 2 + src/gui/test/CMakeLists.txt | 9 +++ src/ifp/CMakeLists.txt | 1 + src/ifp/test/CMakeLists.txt | 33 +++++++++ src/mpl/CMakeLists.txt | 2 + src/mpl/test/CMakeLists.txt | 13 ++++ src/mpl2/CMakeLists.txt | 2 +- src/mpl2/test/CMakeLists.txt | 11 +++ src/odb/CMakeLists.txt | 2 +- src/odb/test/CMakeLists.txt | 45 ++++++++++++ src/pad/CMakeLists.txt | 2 + src/pad/test/CMakeLists.txt | 32 +++++++++ src/par/CMakeLists.txt | 2 + src/par/test/CMakeLists.txt | 10 +++ src/pdn/CMakeLists.txt | 1 + src/pdn/test/CMakeLists.txt | 99 ++++++++++++++++++++++++++ src/ppl/CMakeLists.txt | 2 + src/ppl/test/CMakeLists.txt | 120 ++++++++++++++++++++++++++++++++ src/psm/CMakeLists.txt | 1 + src/psm/test/CMakeLists.txt | 32 +++++++++ src/rcx/CMakeLists.txt | 2 + src/rcx/test/CMakeLists.txt | 13 ++++ src/rmp/CMakeLists.txt | 1 + src/rmp/test/CMakeLists.txt | 18 +++++ src/rsz/CMakeLists.txt | 1 + src/rsz/test/CMakeLists.txt | 118 +++++++++++++++++++++++++++++++ src/stt/CMakeLists.txt | 2 + src/stt/test/CMakeLists.txt | 15 ++++ src/tap/CMakeLists.txt | 3 +- src/tap/test/CMakeLists.txt | 29 ++++++++ src/upf/CMakeLists.txt | 3 +- src/upf/test/CMakeLists.txt | 10 +++ src/utl/CMakeLists.txt | 2 + src/utl/test/CMakeLists.txt | 12 ++++ test/regression_vars.tcl | 3 + 54 files changed, 999 insertions(+), 44 deletions(-) create mode 100644 src/ant/test/CMakeLists.txt create mode 100644 src/dbSta/test/CMakeLists.txt create mode 100644 src/dpo/test/CMakeLists.txt create mode 100644 src/drt/test/CMakeLists.txt create mode 100644 src/fin/test/CMakeLists.txt create mode 100644 src/grt/test/CMakeLists.txt create mode 100644 src/gui/test/CMakeLists.txt create mode 100644 src/ifp/test/CMakeLists.txt create mode 100644 src/mpl/test/CMakeLists.txt create mode 100644 src/mpl2/test/CMakeLists.txt create mode 100644 src/odb/test/CMakeLists.txt create mode 100644 src/pad/test/CMakeLists.txt create mode 100644 src/par/test/CMakeLists.txt create mode 100644 src/pdn/test/CMakeLists.txt create mode 100644 src/ppl/test/CMakeLists.txt create mode 100644 src/psm/test/CMakeLists.txt create mode 100644 src/rcx/test/CMakeLists.txt create mode 100644 src/rmp/test/CMakeLists.txt create mode 100644 src/rsz/test/CMakeLists.txt create mode 100644 src/stt/test/CMakeLists.txt create mode 100644 src/tap/test/CMakeLists.txt create mode 100644 src/upf/test/CMakeLists.txt create mode 100644 src/utl/test/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 65bf62053cb..0eba46bc15a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -142,7 +142,18 @@ configure_file( # Ask CMake to output a compile_commands.json file for use with things like clang-tidy set(CMAKE_EXPORT_COMPILE_COMMANDS 1) +# Integration Test Macro +find_program (BASH_PROGRAM bash REQUIRED) +function(or_integration_test tool_name test_name regression_binary) + add_test ( + NAME ${tool_name}.${test_name} + COMMAND ${BASH_PROGRAM} ${regression_binary} ${test_name} + ) + set_property(TEST ${tool_name}.${test_name} PROPERTY ENVIRONMENT "DIFF_LOCATION=${CMAKE_CURRENT_LIST_DIR}/results/${test_name}.diff") + set_tests_properties(${tool_name}.${test_name} PROPERTIES LABELS "IntegrationTest") +endfunction() +# End Integration Test Macro add_subdirectory(third-party) diff --git a/src/ant/CMakeLists.txt b/src/ant/CMakeLists.txt index 521a2b66b46..68290ee3033 100644 --- a/src/ant/CMakeLists.txt +++ b/src/ant/CMakeLists.txt @@ -30,3 +30,4 @@ # POSSIBILITY OF SUCH DAMAGE. add_subdirectory(src) +add_subdirectory(test) \ No newline at end of file diff --git a/src/ant/test/CMakeLists.txt b/src/ant/test/CMakeLists.txt new file mode 100644 index 00000000000..e1dfd857255 --- /dev/null +++ b/src/ant/test/CMakeLists.txt @@ -0,0 +1,13 @@ +include("openroad") + +set(TEST_NAMES + check_api1 + check_drt1 + check_grt1 + ant_check + ant_report +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("ant" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() \ No newline at end of file diff --git a/src/cts/test/CMakeLists.txt b/src/cts/test/CMakeLists.txt index 86c41f885e5..e3781819ad0 100644 --- a/src/cts/test/CMakeLists.txt +++ b/src/cts/test/CMakeLists.txt @@ -6,6 +6,32 @@ include("openroad") +set(TEST_NAMES + check_buffers + check_buffers_blockages + check_charBuf + find_clock + find_clock_pad + no_clocks + no_sinks + simple_test + simple_test_clustered + simple_test_clustered_max_cap + check_wire_rc_cts + post_cts_opt + balance_levels + max_cap + array + array_no_blockages + array_ins_delay + insertion_delay + dummy_load +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("cts" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() + add_executable(cts_unittest cts_unittest.cc) target_include_directories(cts_unittest PUBLIC diff --git a/src/dbSta/CMakeLists.txt b/src/dbSta/CMakeLists.txt index 84335f37c92..a2117215a10 100644 --- a/src/dbSta/CMakeLists.txt +++ b/src/dbSta/CMakeLists.txt @@ -34,3 +34,4 @@ ############################################################################### add_subdirectory(src) +add_subdirectory(test) \ No newline at end of file diff --git a/src/dbSta/test/CMakeLists.txt b/src/dbSta/test/CMakeLists.txt new file mode 100644 index 00000000000..1ecd4952a28 --- /dev/null +++ b/src/dbSta/test/CMakeLists.txt @@ -0,0 +1,45 @@ +include("openroad") + +set(TEST_NAMES + constant1 + make_port + network_edit1 + sdc_names1 + sdc_names2 + sdc_get1 + sta1 + sta2 + sta3 + sta4 + sta5 + block_sta1 + find_clks1 + find_clks2 + report_json1 + power1 + read_liberty1 + read_verilog1 + read_verilog2 + read_verilog3 + read_verilog4 + read_verilog5 + read_verilog6 + read_verilog7 + read_verilog8 + read_verilog9 + read_verilog10 + report_cell_usage + write_verilog1 + write_verilog2 + write_verilog3 + write_verilog4 + write_verilog5 + write_verilog6 + write_verilog7 + write_verilog8 + write_sdc1 +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("ant" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() \ No newline at end of file diff --git a/src/dft/CMakeLists.txt b/src/dft/CMakeLists.txt index c1937cc59b9..f2c1b524dfb 100644 --- a/src/dft/CMakeLists.txt +++ b/src/dft/CMakeLists.txt @@ -108,7 +108,7 @@ add_subdirectory(src/replace) add_subdirectory(src/stitch) add_subdirectory(src/utils) if(ENABLE_TESTS) - add_subdirectory(test/cpp) + add_subdirectory(test) endif() messages( diff --git a/src/dft/test/CMakeLists.txt b/src/dft/test/CMakeLists.txt index 0aa1867b3df..bb15f33c7cc 100644 --- a/src/dft/test/CMakeLists.txt +++ b/src/dft/test/CMakeLists.txt @@ -1,4 +1,17 @@ # Tests +include("openroad") -find_package(Boost) +set(TEST_NAMES + one_cell_sky130 + one_cell_nangate45 + sub_modules_sky130 + scan_architect_no_mix_sky130 + scan_architect_clock_mix_sky130 +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("dft" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() +find_package(Boost) +add_subdirectory(cpp) diff --git a/src/dpl/test/CMakeLists.txt b/src/dpl/test/CMakeLists.txt index 67a5266511e..8f00f200333 100644 --- a/src/dpl/test/CMakeLists.txt +++ b/src/dpl/test/CMakeLists.txt @@ -6,6 +6,74 @@ include("openroad") +set(TEST_NAMES + aes + cell_on_block1 + cell_on_block2 + check1 + check2 + check3 + check4 + check5 + check6 + check7 + check8 + check9 + fence01 + fence02 + fence03 + fillers1 + fillers2 + fillers3 + fillers4 + fillers5 + fillers6 + fillers7 + fillers8 + fragmented_row01 + fragmented_row02 + fragmented_row03 + fragmented_row04 + gcd + hybrid_cells + hybrid_cells2 + ibex + max_disp1 + mirror1 + mirror2 + mirror3 + multi_height_one_site_gap_disallow + multi_height_rows + obstruction1 + obstruction2 + one_site_gap_disallow + pad01 + pad02 + pad03 + pad04 + pad05 + pad06 + pad07 + pad08 + regions1 + regions2 + regions3 + report_failures + simple01 + simple02 + simple03 + simple04 + simple05 + simple07 + simple08 + simple09 + simple10 +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("dpl" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() + add_executable(dpl_test dpl_test.cc) target_link_libraries(dpl_test diff --git a/src/dpo/CMakeLists.txt b/src/dpo/CMakeLists.txt index 9d9e7d8a497..db19fd57c1b 100644 --- a/src/dpo/CMakeLists.txt +++ b/src/dpo/CMakeLists.txt @@ -113,3 +113,5 @@ if (Python3_FOUND AND BUILD_PYTHON) ) endif() + +add_subdirectory(test) \ No newline at end of file diff --git a/src/dpo/test/CMakeLists.txt b/src/dpo/test/CMakeLists.txt new file mode 100644 index 00000000000..39b11608b42 --- /dev/null +++ b/src/dpo/test/CMakeLists.txt @@ -0,0 +1,15 @@ +include("openroad") + +set(TEST_NAMES + aes + gcd + ibex + multi_height1 + gcd_no_one_site_gaps + regions1 + regions2 +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("dpo" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() diff --git a/src/drt/CMakeLists.txt b/src/drt/CMakeLists.txt index d6078c44faa..de812063562 100644 --- a/src/drt/CMakeLists.txt +++ b/src/drt/CMakeLists.txt @@ -257,3 +257,5 @@ if (Python3_FOUND AND BUILD_PYTHON) ) endif() + +add_subdirectory(test) \ No newline at end of file diff --git a/src/drt/test/CMakeLists.txt b/src/drt/test/CMakeLists.txt new file mode 100644 index 00000000000..f860df48f31 --- /dev/null +++ b/src/drt/test/CMakeLists.txt @@ -0,0 +1,18 @@ +include("openroad") + +set(TEST_NAMES + ispd18_sample + ndr_vias1 + ndr_vias2 + obstruction + single_step + ta_ap_aligned + ta_pin_aligned + top_level_term + top_level_term2 + drc_test +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("drt" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() diff --git a/src/dst/test/cpp/CMakeLists.txt b/src/dst/test/cpp/CMakeLists.txt index 8693fbaab54..c23bb8a8218 100644 --- a/src/dst/test/cpp/CMakeLists.txt +++ b/src/dst/test/cpp/CMakeLists.txt @@ -28,3 +28,24 @@ target_include_directories(TestDistributed ${DST_HOME}/src ${OPENROAD_HOME}/include ) + +add_test( + NAME "dst.TestWorker" + COMMAND TestWorker +) + +add_test( + NAME "dst.TestBalancer" + COMMAND TestBalancer +) + +add_test( + NAME "dst.TestDistributed" + COMMAND TestDistributed +) + +add_dependencies(build_and_test + TestWorker + TestBalancer + TestDistributed +) \ No newline at end of file diff --git a/src/fin/CMakeLists.txt b/src/fin/CMakeLists.txt index 274737c5185..0b1127a811e 100644 --- a/src/fin/CMakeLists.txt +++ b/src/fin/CMakeLists.txt @@ -80,3 +80,5 @@ if (Python3_FOUND AND BUILD_PYTHON) ) endif() + +add_subdirectory(test) \ No newline at end of file diff --git a/src/fin/test/CMakeLists.txt b/src/fin/test/CMakeLists.txt new file mode 100644 index 00000000000..ee1ecde82b7 --- /dev/null +++ b/src/fin/test/CMakeLists.txt @@ -0,0 +1,9 @@ +include("openroad") + +set(TEST_NAMES + gcd_fill +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("fin" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() diff --git a/src/gpl/test/CMakeLists.txt b/src/gpl/test/CMakeLists.txt index 4c2c908ab6d..ac2b0697818 100644 --- a/src/gpl/test/CMakeLists.txt +++ b/src/gpl/test/CMakeLists.txt @@ -1,47 +1,37 @@ include("openroad") -find_program (BASH_PROGRAM bash REQUIRED) - -function(gpl_test test_name) - add_test ( - NAME gpl.${test_name} - COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/regression ${test_name} - ) - set_tests_properties(gpl.${test_name} PROPERTIES LABELS "IntegrationTest") -endfunction() - set(TEST_NAMES -simple01 -simple01-obs -simple01-td -simple01-td-tune -simple01-uniform -simple01-ref -simple01-skip-io -simple02 -simple03 -simple04 -simple05 -simple06 -simple07 -simple08 -simple09 -core01 -ar01 -ar02 -incremental01 -incremental02 -error01 -diverge01 -density01 -convergence01 -nograd01 -clust01 -clust02 + simple01 + simple01-obs + simple01-td + simple01-td-tune + simple01-uniform + simple01-ref + simple01-skip-io + simple02 + simple03 + simple04 + simple05 + simple06 + simple07 + simple08 + simple09 + core01 + ar01 + ar02 + incremental01 + incremental02 + error01 + diverge01 + density01 + convergence01 + nograd01 + clust01 + clust02 ) foreach(TEST_NAME IN LISTS TEST_NAMES) - gpl_test(${TEST_NAME}) + or_integration_test("gpl" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) endforeach() add_executable(fft_test fft_test.cc) diff --git a/src/grt/CMakeLists.txt b/src/grt/CMakeLists.txt index 70f9c4ace8f..c02e9d4a032 100644 --- a/src/grt/CMakeLists.txt +++ b/src/grt/CMakeLists.txt @@ -134,3 +134,5 @@ endif() messages( TARGET grt ) + +add_subdirectory(test) \ No newline at end of file diff --git a/src/grt/test/CMakeLists.txt b/src/grt/test/CMakeLists.txt new file mode 100644 index 00000000000..0be4e9deed6 --- /dev/null +++ b/src/grt/test/CMakeLists.txt @@ -0,0 +1,71 @@ +include("openroad") + +set(TEST_NAMES + bus_route + clock_route + clock_route_alpha + clock_route_error1 + clock_route_error2 + congestion1 + congestion2 + congestion3 + congestion4 + congestion5 + congestion6 + congestion7 + critical_nets_percentage + est_rc1 + est_rc2 + est_rc3 + est_rc4 + gcd + gcd_flute + inst_pin_out_of_die + invalid_routing_layer + invalid_pin_placement + macro_obs_not_aligned + multiple_calls + ndr_1w_3s + ndr_2w_3s + no_tracks + obstruction + obs_out_of_die + overlapping_edges + pd1 + pd2 + pd3 + pd4 + pin_access1 + pin_access2 + pin_edge + pin_track_not_aligned + pre_routed1 + region_adjustment + repair_antennas1 + repair_antennas2 + repair_antennas3 + repair_antennas4 + repair_antennas_error1 + repair_antennas_error2 + report_wire_length1 + report_wire_length2 + report_wire_length3 + report_wire_length4 + report_wire_length5 + report_wire_length6 + set_nets_to_route1 + silence + single_row + top_level_term1 + top_level_term2 + top_level_term3 + tracks1 + tracks2 + tracks3 + upper_layer_net + modeling_instance_obs +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("grt" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 77cf1b19b55..1707876c36f 100755 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -115,3 +115,5 @@ target_include_directories(gui ${OPENSTA_HOME}/include ${DBSTA_HOME}/include ) + +add_subdirectory(test) \ No newline at end of file diff --git a/src/gui/test/CMakeLists.txt b/src/gui/test/CMakeLists.txt new file mode 100644 index 00000000000..3fad41973ec --- /dev/null +++ b/src/gui/test/CMakeLists.txt @@ -0,0 +1,9 @@ +include("openroad") + +set(TEST_NAMES + supported +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("gui" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() diff --git a/src/ifp/CMakeLists.txt b/src/ifp/CMakeLists.txt index 84335f37c92..a2117215a10 100644 --- a/src/ifp/CMakeLists.txt +++ b/src/ifp/CMakeLists.txt @@ -34,3 +34,4 @@ ############################################################################### add_subdirectory(src) +add_subdirectory(test) \ No newline at end of file diff --git a/src/ifp/test/CMakeLists.txt b/src/ifp/test/CMakeLists.txt new file mode 100644 index 00000000000..4faeb54197c --- /dev/null +++ b/src/ifp/test/CMakeLists.txt @@ -0,0 +1,33 @@ +include("openroad") + +set(TEST_NAMES + hybrid_rows + hybrid_rows2 + init_floorplan1 + init_floorplan2 + init_floorplan3 + init_floorplan4 + init_floorplan5 + init_floorplan6 + init_floorplan7 + init_floorplan8 + init_floorplan9 + make_tracks1 + make_tracks2 + make_tracks3 + make_tracks4 + make_tracks5 + make_tracks6 + make_tracks7 + multi_height1 + multi_height2 + placement_blockage1 + placement_blockage2 + tiecells + upf_test + upf_shifter_test +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("ifp" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() diff --git a/src/mpl/CMakeLists.txt b/src/mpl/CMakeLists.txt index a65d8930e17..8f042744ebc 100644 --- a/src/mpl/CMakeLists.txt +++ b/src/mpl/CMakeLists.txt @@ -87,3 +87,5 @@ if (Python3_FOUND AND BUILD_PYTHON) ) endif() + +add_subdirectory(test) diff --git a/src/mpl/test/CMakeLists.txt b/src/mpl/test/CMakeLists.txt new file mode 100644 index 00000000000..0b52c691446 --- /dev/null +++ b/src/mpl/test/CMakeLists.txt @@ -0,0 +1,13 @@ +include("openroad") + +set(TEST_NAMES + level3_01 + level3_02 + east_west1 + east_west2 + snap_layer1 +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("mpl" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() diff --git a/src/mpl2/CMakeLists.txt b/src/mpl2/CMakeLists.txt index a677113bde6..9406a52806a 100644 --- a/src/mpl2/CMakeLists.txt +++ b/src/mpl2/CMakeLists.txt @@ -91,5 +91,5 @@ target_link_libraries(mpl2 ) if(ENABLE_TESTS) - add_subdirectory(test/cpp) + add_subdirectory(test) endif() diff --git a/src/mpl2/test/CMakeLists.txt b/src/mpl2/test/CMakeLists.txt new file mode 100644 index 00000000000..cb04709bab0 --- /dev/null +++ b/src/mpl2/test/CMakeLists.txt @@ -0,0 +1,11 @@ +include("openroad") + +set(TEST_NAMES + macro_only +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("mpl2" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() + +add_subdirectory(cpp) diff --git a/src/odb/CMakeLists.txt b/src/odb/CMakeLists.txt index 9bd1a419e48..a8085374442 100644 --- a/src/odb/CMakeLists.txt +++ b/src/odb/CMakeLists.txt @@ -29,7 +29,7 @@ add_subdirectory(src/zutil) add_subdirectory(src/cdl) if(ENABLE_TESTS) - add_subdirectory(test/cpp) + add_subdirectory(test) endif() add_library(odb INTERFACE) diff --git a/src/odb/test/CMakeLists.txt b/src/odb/test/CMakeLists.txt new file mode 100644 index 00000000000..8ff7fd04b2b --- /dev/null +++ b/src/odb/test/CMakeLists.txt @@ -0,0 +1,45 @@ +include("openroad") + +set(TEST_NAMES + bterm_hier_create + multi_tech + transform + rounding + sky130hd_multi_patterned + dont_touch + import_package + read_lef + read_db + read_zipped + create_sboxes + dump_via_rules + dump_vias + read_def + read_def58 + write_def58 + dump_nets + lef_mask + write_lef_and_def + lef_data_access + gcd_def_access + gcd_pdn_def_access + edit_def + wire_encoder + edit_via_params + row_settings + db_read_write + check_routing_tracks + polygon + def_parser + ndr + gcd_abstract_lef + gcd_abstract_lef_with_power + abstract_origin + write_macro_placement +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("odb" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() + +add_subdirectory(cpp) \ No newline at end of file diff --git a/src/pad/CMakeLists.txt b/src/pad/CMakeLists.txt index dfa6a32f360..d3d3960fd6d 100644 --- a/src/pad/CMakeLists.txt +++ b/src/pad/CMakeLists.txt @@ -71,3 +71,5 @@ target_link_libraries(pad messages( TARGET pad ) + +add_subdirectory(test) diff --git a/src/pad/test/CMakeLists.txt b/src/pad/test/CMakeLists.txt new file mode 100644 index 00000000000..7d40e790171 --- /dev/null +++ b/src/pad/test/CMakeLists.txt @@ -0,0 +1,32 @@ +include("openroad") + +set(TEST_NAMES + bump_array_make + bump_array_remove + bump_array_remove_single + make_corner_sites + make_io_sites + non_top_layer + place_pad + place_pad_outsideofrow + place_bondpad + place_bondpad_stagger + place_pad_no_master + place_pad_wrong_master + assign_bumps + connect_by_abutment + rdl_route + rdl_route_failed + rdl_route_assignments + rdl_route_45 + rdl_route_45_cost + rdl_route_via + rdl_route_bump_via + skywater130_overlapping_filler + skywater130_caravel + skywater130_coyote_tc +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("pad" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() diff --git a/src/par/CMakeLists.txt b/src/par/CMakeLists.txt index e4e72917164..da78b853f76 100644 --- a/src/par/CMakeLists.txt +++ b/src/par/CMakeLists.txt @@ -157,3 +157,5 @@ if (Python3_FOUND AND BUILD_PYTHON) ) endif() + +add_subdirectory(test) \ No newline at end of file diff --git a/src/par/test/CMakeLists.txt b/src/par/test/CMakeLists.txt new file mode 100644 index 00000000000..5edfb1d75dc --- /dev/null +++ b/src/par/test/CMakeLists.txt @@ -0,0 +1,10 @@ +include("openroad") + +set(TEST_NAMES + read_part + partition_gcd +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("par" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() diff --git a/src/pdn/CMakeLists.txt b/src/pdn/CMakeLists.txt index 89d322ee53d..9f8a240b934 100644 --- a/src/pdn/CMakeLists.txt +++ b/src/pdn/CMakeLists.txt @@ -34,3 +34,4 @@ ############################################################################### add_subdirectory(src) +add_subdirectory(test) \ No newline at end of file diff --git a/src/pdn/test/CMakeLists.txt b/src/pdn/test/CMakeLists.txt new file mode 100644 index 00000000000..eb53ff631af --- /dev/null +++ b/src/pdn/test/CMakeLists.txt @@ -0,0 +1,99 @@ +include("openroad") + +set(TEST_NAMES + reset + report + ripup + convert + names + min_width + max_width + min_spacing + widthtable + design_width + offgrid + core_grid + core_grid_with_rings + core_grid_start_power + core_grid_start_power_strap_ground + core_grid_with_rings_with_straps + core_grid_dual_followpins + core_grid_dual_followpins_error + core_grid_with_dual_rings + core_grid_with_rings_connect + core_grid_cut_pitch + core_grid_snap + core_grid_via_snap + core_grid_split_cuts + core_grid_with_rings_with_straps_rings_over_core + core_grid_with_routing_obstructions + core_grid_adjacentcuts + core_grid_obstruction + core_grid_auto_domain + core_grid_auto_domain_multiple_nets + core_grid_extend_to_boundary + core_grid_extend_to_boundary_no_pins + core_grid_with_M7_pins + core_grid_with_M6_min_area + core_grid_strap_count + core_grid_no_trim + core_grid_offset_strap + core_grid_with_rings_with_limit_straps + core_grid_failed_via_report + macros + macros_with_halo + macros_cells + macros_cells_orient + macros_with_rings + macros_narrow_channel + macros_narrow_channel_large_spacing + macros_narrow_channel_repair_overlap + macros_add_twice + macros_cells_extend_boundary + macros_cells_no_grid + macros_narrow_channel_jog + macros_different_nets + macros_grid_through + macros_grid_through_without_middle + macros_cells_dont_touch + macros_cells_overlapping_ports + macros_cells_not_fixed + macros_cells_via_failure + region_temp_sensor + region_secondary_nets + region_non_rect + pads_black_parrot + pads_black_parrot_offset + pads_black_parrot_no_connect + pads_black_parrot_limit_connect + pads_black_parrot_flipchip + pads_black_parrot_flipchip_connect_bumps + pads_black_parrot_flipchip_connect_overpads + pads_black_parrot_max_width + asap7_vias + asap7_vias_cutclass + asap7_no_via_generate + asap7_vias_arrayspacing + asap7_vias_arrayspacing_notfirst + asap7_vias_arrayspacing_partial + asap7_vias_arrayspacing_3_layer + asap7_vias_max_rows_columns + asap7_vias_dont_use + asap7_taper + asap7_offcenter_via + asap7_no_via_generate_v1_snapped + asap7_failed_macro_grid + asap7_vias_fixed_vias + existing + power_switch + power_switch_star + power_switch_daisy + power_switch_regions + power_switch_cut_rows + repair_vias + sroute_test +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("pdn" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() diff --git a/src/ppl/CMakeLists.txt b/src/ppl/CMakeLists.txt index 1d5c42c955e..97a94fdb378 100644 --- a/src/ppl/CMakeLists.txt +++ b/src/ppl/CMakeLists.txt @@ -99,3 +99,5 @@ if (Python3_FOUND AND BUILD_PYTHON) ) endif() + +add_subdirectory(test) \ No newline at end of file diff --git a/src/ppl/test/CMakeLists.txt b/src/ppl/test/CMakeLists.txt new file mode 100644 index 00000000000..912f2e615ad --- /dev/null +++ b/src/ppl/test/CMakeLists.txt @@ -0,0 +1,120 @@ +include("openroad") + +set(TEST_NAMES + add_constraint_debug + add_constraint1 + add_constraint2 + add_constraint3 + add_constraint4 + add_constraint5 + add_constraint6 + add_constraint7 + add_constraint8 + add_constraint9 + add_constraint10 + add_constraint11 + add_constraint12 + add_constraint13 + add_constraint14 + add_constraint15 + add_constraint16 + add_constraint_error1 + add_constraint_error2 + add_constraint_error3 + add_constraint_error4 + add_constraint_error5 + add_constraint_error6 + add_constraint_error7 + annealing1 + annealing2 + annealing3 + annealing4 + annealing_constraint1 + annealing_constraint2 + annealing_constraint3 + annealing_constraint4 + annealing_constraint5 + annealing_constraint6 + annealing_constraint7 + annealing_constraint8 + annealing_large_groups1 + annealing_large_groups2 + annealing_mirrored1 + annealing_mirrored2 + annealing_mirrored3 + annealing_mirrored4 + annealing_mirrored5 + blocked_region + cells_not_placed + exclude1 + exclude2 + exclude3 + gcd + group_pins1 + group_pins2 + group_pins3 + group_pins4 + group_pins5 + group_pins6 + group_pins7 + group_pins8 + group_pins9 + group_pins10 + group_pins_error1 + group_pins_warn1 + invalid_layer + large_groups1 + large_groups2 + large_groups3 + large_groups4 + macro_not_placed + macro_not_placed_random + min_dist_in_tracks1 + min_dist_in_tracks2 + multi_layers + multiple_calls + no_instance_pins + no_pins + no_tracks + on_grid + pin_length + pin_length_error + pin_extension + pin_thick_multiplier + place_pin1 + place_pin2 + place_pin3 + place_pin4 + place_pin5 + place_pin6 + place_pin7 + place_pin_error1 + place_pin_error2 + place_pin_error3 + random1 + random2 + random3 + random4 + random5 + random6 + random7 + random8 + random9 + top_layer1 + top_layer2 + top_layer3 + top_layer4 + top_layer5 + top_layer6 + top_layer7 + top_layer_error + top_layer_error2 + write_pin_placement1 + write_pin_placement2 + write_pin_placement3 + write_pin_placement4 +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("ppl" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() diff --git a/src/psm/CMakeLists.txt b/src/psm/CMakeLists.txt index ac311bb40ce..950e20afd0d 100644 --- a/src/psm/CMakeLists.txt +++ b/src/psm/CMakeLists.txt @@ -30,3 +30,4 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. add_subdirectory(src) +add_subdirectory(test) \ No newline at end of file diff --git a/src/psm/test/CMakeLists.txt b/src/psm/test/CMakeLists.txt new file mode 100644 index 00000000000..cc9492b5d0c --- /dev/null +++ b/src/psm/test/CMakeLists.txt @@ -0,0 +1,32 @@ +include("openroad") + +set(TEST_NAMES + aes_test_vdd + aes_test_vdd_set_node_density + aes_test_vdd_set_node_density_fact + aes_test_vss + gcd_test_vdd + gcd_no_vsrc + gcd_write_sp_test_vdd + gcd_em_test_vdd + gcd_all_vss + gcd_vss_no_vsrc + gcd_sky130_vdd + aes_asap7_vdd + check_power_grid + check_power_grid_disconnected + check_power_grid_ok_disconnected + check_power_grid_macros + check_power_grid_disconnected_macro + corners + aes_test_bterms + aes_test_multiple_bterms + zerosoc_pads + zerosoc_pads_check_only + zerosoc_pads_check_only_disconnected + pad_connected_by_abutment +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("psm" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() diff --git a/src/rcx/CMakeLists.txt b/src/rcx/CMakeLists.txt index 2824ff8c8dd..346aeb71584 100644 --- a/src/rcx/CMakeLists.txt +++ b/src/rcx/CMakeLists.txt @@ -35,3 +35,5 @@ project(OpenRCX VERSION 0.0.1 LANGUAGES CXX) add_subdirectory(src) +add_subdirectory(test) + diff --git a/src/rcx/test/CMakeLists.txt b/src/rcx/test/CMakeLists.txt new file mode 100644 index 00000000000..c503d9e70fb --- /dev/null +++ b/src/rcx/test/CMakeLists.txt @@ -0,0 +1,13 @@ +include("openroad") + +set(TEST_NAMES + generate_pattern + ext_pattern + gcd + 45_gcd + names +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("rcx" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() \ No newline at end of file diff --git a/src/rmp/CMakeLists.txt b/src/rmp/CMakeLists.txt index 89d322ee53d..9f8a240b934 100644 --- a/src/rmp/CMakeLists.txt +++ b/src/rmp/CMakeLists.txt @@ -34,3 +34,4 @@ ############################################################################### add_subdirectory(src) +add_subdirectory(test) \ No newline at end of file diff --git a/src/rmp/test/CMakeLists.txt b/src/rmp/test/CMakeLists.txt new file mode 100644 index 00000000000..c420457d9df --- /dev/null +++ b/src/rmp/test/CMakeLists.txt @@ -0,0 +1,18 @@ +include("openroad") + +set(TEST_NAMES + gcd_restructure + const_cell_removal + blif_writer + blif_writer_input_output + blif_writer_consts + blif_writer_hanging + blif_writer_sequential + blif_reader + blif_reader_const + blif_reader_sequential +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("rmp" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() \ No newline at end of file diff --git a/src/rsz/CMakeLists.txt b/src/rsz/CMakeLists.txt index 84335f37c92..a2117215a10 100644 --- a/src/rsz/CMakeLists.txt +++ b/src/rsz/CMakeLists.txt @@ -34,3 +34,4 @@ ############################################################################### add_subdirectory(src) +add_subdirectory(test) \ No newline at end of file diff --git a/src/rsz/test/CMakeLists.txt b/src/rsz/test/CMakeLists.txt new file mode 100644 index 00000000000..761008eb2a4 --- /dev/null +++ b/src/rsz/test/CMakeLists.txt @@ -0,0 +1,118 @@ +include("openroad") + +set(TEST_NAMES + buffer_ports1 + buffer_ports3 + buffer_ports4 + buffer_ports5 + buffer_ports6 + buffer_ports7 + buffer_ports8 + buffer_varying_lengths + eqy_repair_setup2 + eqy_repair_setup5 + fanin_fanout1 + make_parasitics1 + make_parasitics2 + make_parasitics3 + make_parasitics4 + make_parasitics5 + make_parasitics6 + pin_swap1 + resize1 + resize4 + resize5 + resize6 + resize_slack1 + resize_slack2 + resize_slack3 + remove_buffers1 + remove_buffers2 + repair_clk_nets1 + repair_clk_inverters1 + repair_cap1 + repair_cap2 + repair_cap3 + repair_design1 + repair_design2 + repair_design3 + repair_design4 + repair_design5 + repair_fanout1 + repair_fanout2 + repair_fanout3 + repair_fanout4 + repair_fanout5 + repair_fanout6 + repair_fanout7 + repair_fanout8 + repair_hold1 + repair_hold2 + repair_hold3 + repair_hold4 + repair_hold5 + repair_hold6 + repair_hold7 + repair_hold8 + repair_hold9 + repair_hold10 + repair_hold11 + repair_hold12 + repair_hold13 + repair_hold14 + repair_setup1 + repair_setup2 + repair_setup3 + repair_setup4 + repair_setup5 + repair_setup6 + repair_slew1 + repair_slew2 + repair_slew3 + repair_slew4 + repair_slew5 + repair_slew6 + repair_slew7 + repair_slew8 + repair_slew9 + repair_slew10 + repair_slew11 + repair_slew12 + repair_slew13 + repair_slew14 + repair_slew15 + repair_slew16 + repair_slew17 + report_floating_nets1 + report_floating_nets2 + report_floating_nets3 + repair_tie1 + repair_tie2 + repair_tie3 + repair_tie4 + repair_tie5 + repair_tie6 + repair_tie7 + repair_tie8 + repair_wire1 + repair_wire2 + repair_wire3 + repair_wire4 + repair_wire5 + repair_wire6 + repair_wire7 + repair_wire8 + repair_wire9 + repair_wire10 + repair_wire11 + gcd_resize + repair_design3_verbose + repair_setup4_verbose + repair_hold9_verbose + set_dont_touch1 + set_dont_use1 +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("rsz" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() \ No newline at end of file diff --git a/src/stt/CMakeLists.txt b/src/stt/CMakeLists.txt index 8c51043ae4d..9664a6297e2 100644 --- a/src/stt/CMakeLists.txt +++ b/src/stt/CMakeLists.txt @@ -126,3 +126,5 @@ if (Python3_FOUND AND BUILD_PYTHON) ) endif() + +add_subdirectory(test) \ No newline at end of file diff --git a/src/stt/test/CMakeLists.txt b/src/stt/test/CMakeLists.txt new file mode 100644 index 00000000000..19dc39e808c --- /dev/null +++ b/src/stt/test/CMakeLists.txt @@ -0,0 +1,15 @@ +include("openroad") + +set(TEST_NAMES + flute1 + flute_gcd + check + parse_clocks + pd1 + pd2 + pd_gcd +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("stt" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() \ No newline at end of file diff --git a/src/tap/CMakeLists.txt b/src/tap/CMakeLists.txt index 51490fcf276..4411cf92e2e 100644 --- a/src/tap/CMakeLists.txt +++ b/src/tap/CMakeLists.txt @@ -33,4 +33,5 @@ ## POSSIBILITY OF SUCH DAMAGE. ################################################################################ -add_subdirectory(src) \ No newline at end of file +add_subdirectory(src) +add_subdirectory(test) \ No newline at end of file diff --git a/src/tap/test/CMakeLists.txt b/src/tap/test/CMakeLists.txt new file mode 100644 index 00000000000..6ddddaa41f0 --- /dev/null +++ b/src/tap/test/CMakeLists.txt @@ -0,0 +1,29 @@ +include("openroad") + +set(TEST_NAMES + disallow_one_site_gaps + gcd_fakeram + gcd_nangate45 + gcd_sky130 + gcd_asap7 + invalid_cells + multiple_calls + avoid_overlap + boundary_macros + gcd_prefix + gcd_ripup + no_endcap + symmetry + cut_rows + cut_rows_with_endcaps + boundary_macros_separate + boundary_macros_auto_select + boundary_macros_tapcell + gcd_sky130_separate + jpeg_gf180 + aes_gf180 +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("tap" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() \ No newline at end of file diff --git a/src/upf/CMakeLists.txt b/src/upf/CMakeLists.txt index ed491fa4d90..95d7593beec 100644 --- a/src/upf/CMakeLists.txt +++ b/src/upf/CMakeLists.txt @@ -29,4 +29,5 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -add_subdirectory(src) \ No newline at end of file +add_subdirectory(src) +add_subdirectory(test) \ No newline at end of file diff --git a/src/upf/test/CMakeLists.txt b/src/upf/test/CMakeLists.txt new file mode 100644 index 00000000000..ef6120f8f1b --- /dev/null +++ b/src/upf/test/CMakeLists.txt @@ -0,0 +1,10 @@ +include("openroad") + +set(TEST_NAMES + upf_test + levelshifter +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("upf" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() \ No newline at end of file diff --git a/src/utl/CMakeLists.txt b/src/utl/CMakeLists.txt index 162e96e3252..be9a032e21e 100644 --- a/src/utl/CMakeLists.txt +++ b/src/utl/CMakeLists.txt @@ -131,3 +131,5 @@ if(ENABLE_TESTS) utl ) endif() + +add_subdirectory(test) \ No newline at end of file diff --git a/src/utl/test/CMakeLists.txt b/src/utl/test/CMakeLists.txt new file mode 100644 index 00000000000..32edda1791f --- /dev/null +++ b/src/utl/test/CMakeLists.txt @@ -0,0 +1,12 @@ +include("openroad") + +set(TEST_NAMES +test_info + test_error + test_suppress_message + test_metrics +) + +foreach(TEST_NAME IN LISTS TEST_NAMES) + or_integration_test("utl" ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/regression) +endforeach() \ No newline at end of file diff --git a/test/regression_vars.tcl b/test/regression_vars.tcl index d7cb4712ef7..a013bbb6c9f 100644 --- a/test/regression_vars.tcl +++ b/test/regression_vars.tcl @@ -29,6 +29,9 @@ set app_options "-no_init -no_splash -exit" set result_dir [file join $test_dir "results"] # Collective diffs. set diff_file [file join $result_dir "diffs"] +if { [info exist ::env(DIFF_LOCATION)] } { + set diff_file "$::env(DIFF_LOCATION)" +} # File containing list of failed tests. set failure_file [file join $result_dir "failures"] # Use the DIFF_OPTIONS envar to change the diff options From 30eb33463514d9bdcc248c8a93d583dd2801653f Mon Sep 17 00:00:00 2001 From: Ethan Mahintorabi Date: Tue, 12 Mar 2024 00:28:05 +0000 Subject: [PATCH 16/45] make ctest unreliant on test names regression_vars Signed-off-by: Ethan Mahintorabi --- CMakeLists.txt | 3 ++- test/regression_vars.tcl | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0eba46bc15a..b3995631f8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -149,8 +149,9 @@ function(or_integration_test tool_name test_name regression_binary) add_test ( NAME ${tool_name}.${test_name} COMMAND ${BASH_PROGRAM} ${regression_binary} ${test_name} + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} ) - set_property(TEST ${tool_name}.${test_name} PROPERTY ENVIRONMENT "DIFF_LOCATION=${CMAKE_CURRENT_LIST_DIR}/results/${test_name}.diff") + set_property(TEST ${tool_name}.${test_name} PROPERTY ENVIRONMENT "TEST_TYPE=compare_logfile;CTEST_TESTNAME=${test_name};DIFF_LOCATION=${CMAKE_CURRENT_LIST_DIR}/results/${test_name}.diff") set_tests_properties(${tool_name}.${test_name} PROPERTIES LABELS "IntegrationTest") endfunction() # End Integration Test Macro diff --git a/test/regression_vars.tcl b/test/regression_vars.tcl index a013bbb6c9f..d22026d1ec8 100644 --- a/test/regression_vars.tcl +++ b/test/regression_vars.tcl @@ -72,6 +72,10 @@ proc record_flow_tests { tests } { proc record_tests1 { tests cmp_logfile } { global test_dir + if { [info exist ::env(CTEST_TESTNAME)]} { + set tests "$::env(CTEST_TESTNAME)" + set cmp_logfile "$::env(TEST_TYPE)" + } foreach test $tests { # Prune commented tests from the list. if { [string index $test 0] != "#" } { From 2f96579a55866f67bc7c28a5dca56bea81f2d3ce Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Tue, 12 Mar 2024 18:02:35 -0300 Subject: [PATCH 17/45] grt: fix non critical nets calculation Signed-off-by: Eder Monteiro --- src/grt/src/fastroute/src/utility.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/grt/src/fastroute/src/utility.cpp b/src/grt/src/fastroute/src/utility.cpp index c5178b87532..7cb218b90d5 100644 --- a/src/grt/src/fastroute/src/utility.cpp +++ b/src/grt/src/fastroute/src/utility.cpp @@ -1258,7 +1258,8 @@ void FastRouteCore::StNetOrder() auto order_element = tree_order_cong_[ord_elID]; if (nets_[order_element.treeIndex]->getSlack() == std::ceil(std::numeric_limits::lowest())) { - if (order_element.xmin == 0 && (ord_elID >= (netCount() * 30 / 100))) { + if (order_element.xmin == 0 + && (ord_elID >= (net_ids_.size() * 30 / 100))) { nets_[order_element.treeIndex]->setSlack( std::numeric_limits::max()); } From 1a54a30617a1094fed5aa4b41b3fec9d1919e4cc Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Tue, 12 Mar 2024 18:03:00 -0300 Subject: [PATCH 18/45] grt: clang-format Signed-off-by: Eder Monteiro --- src/grt/src/GlobalRouter.cpp | 5 +---- src/grt/src/fastroute/src/maze.cpp | 22 +++++++++++----------- src/grt/src/fastroute/src/maze3D.cpp | 18 +++++++++--------- src/grt/src/fastroute/src/route.cpp | 4 ++-- src/grt/src/fastroute/src/utility.cpp | 14 +++++++------- 5 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/grt/src/GlobalRouter.cpp b/src/grt/src/GlobalRouter.cpp index 9bf41cf9e08..fcc476a7f8f 100644 --- a/src/grt/src/GlobalRouter.cpp +++ b/src/grt/src/GlobalRouter.cpp @@ -3793,10 +3793,7 @@ void GlobalRouter::reportNetDetailedRouteWL(odb::dbWire* wire, void GlobalRouter::createWLReportFile(const char* file_name, bool verbose) { std::ofstream out(file_name); - out << "tool " - << "net " - << "total_wl " - << "#pins "; + out << "tool " << "net " << "total_wl " << "#pins "; if (verbose) { out << "#vias "; diff --git a/src/grt/src/fastroute/src/maze.cpp b/src/grt/src/fastroute/src/maze.cpp index adcbf2e3eab..417ce3695d8 100644 --- a/src/grt/src/fastroute/src/maze.cpp +++ b/src/grt/src/fastroute/src/maze.cpp @@ -837,7 +837,7 @@ void FastRouteCore::setupHeap(const int netID, queue[queuetail] = nbr; queuetail++; } // loop i (3 neighbors for cur node) - } // while queue is not empty + } // while queue is not empty // find all the grids on subtree t2 (connect to n2) and put them into // dest_heap find all the grids on tree edges in subtree t2 (connecting to @@ -907,8 +907,8 @@ void FastRouteCore::setupHeap(const int netID, queue[queuetail] = nbr; queuetail++; } // loop i (3 neigbors for cur node) - } // while queue is not empty - } // net with more than two pins + } // while queue is not empty + } // net with more than two pins for (int i = regionY1; i <= regionY2; i++) { for (int j = regionX1; j <= regionX2; j++) @@ -938,7 +938,7 @@ int FastRouteCore::copyGrids(const std::vector& treenodes, gridsY_n1n2[cnt] = treeedges[edge_n1n2].route.gridsY[i]; cnt++; } - } // MazeRoute + } // MazeRoute else // NoRoute { gridsX_n1n2.resize(1); @@ -947,7 +947,7 @@ int FastRouteCore::copyGrids(const std::vector& treenodes, gridsY_n1n2[cnt] = n1y; cnt++; } - } // if n1 is the first node of (n1, n2) + } // if n1 is the first node of (n1, n2) else // n2 is the first node of (n1, n2) { if (treeedges[edge_n1n2].route.type == RouteType::MazeRoute) { @@ -958,7 +958,7 @@ int FastRouteCore::copyGrids(const std::vector& treenodes, gridsY_n1n2[cnt] = treeedges[edge_n1n2].route.gridsY[i]; cnt++; } - } // MazeRoute + } // MazeRoute else // NoRoute { gridsX_n1n2.resize(1); @@ -1846,7 +1846,7 @@ void FastRouteCore::mazeRouteMSMD(const int iter, // update position for n1 treenodes[n1].x = E1x; treenodes[n1].y = E1y; - } // if E1 is on (n1, A1) or (n1, A2) + } // if E1 is on (n1, A1) or (n1, A2) else // E1 is not on (n1, A1) or (n1, A2), but on (C1, C2) { const int C1 = endpt1; @@ -1933,7 +1933,7 @@ void FastRouteCore::mazeRouteMSMD(const int iter, } } // else E1 is not on (n1, A1) or (n1, A2), but on (C1, C2) - } // n1 is not a pin and E1!=n1 + } // n1 is not a pin and E1!=n1 // (2) consider subtree2 if (n2 < num_terminals && (E2x != n2x || E2y != n2y)) { @@ -2002,7 +2002,7 @@ void FastRouteCore::mazeRouteMSMD(const int iter, // update position for n2 treenodes[n2].x = E2x; treenodes[n2].y = E2y; - } // if E2 is on (n2, B1) or (n2, B2) + } // if E2 is on (n2, B1) or (n2, B2) else // E2 is not on (n2, B1) or (n2, B2), but on (D1, D2) { const int D1 = endpt1; @@ -2088,7 +2088,7 @@ void FastRouteCore::mazeRouteMSMD(const int iter, } } } // else E2 is not on (n2, B1) or (n2, B2), but on (D1, D2) - } // n2 is not a pin and E2!=n2 + } // n2 is not a pin and E2!=n2 // update route for edge (n1, n2) and edge usage if (treeedges[edge_n1n2].route.type == RouteType::MazeRoute) { @@ -2123,7 +2123,7 @@ void FastRouteCore::mazeRouteMSMD(const int iter, } } } // loop edgeID - } // loop netID + } // loop netID h_cost_table_.clear(); v_cost_table_.clear(); diff --git a/src/grt/src/fastroute/src/maze3D.cpp b/src/grt/src/fastroute/src/maze3D.cpp index edce512d656..d7ce41abd4f 100644 --- a/src/grt/src/fastroute/src/maze3D.cpp +++ b/src/grt/src/fastroute/src/maze3D.cpp @@ -200,14 +200,14 @@ void FastRouteCore::addNeighborPoints(const int netID, } } // if MazeRoute - } // if not a degraded edge (len>0) + } // if not a degraded edge (len>0) // add the neighbor of cur node into heapQueue heapQueue[queuetail] = nbr; queuetail++; } // loop i (neigbors for cur node) - } // while heapQueue is not empty + } // while heapQueue is not empty } void FastRouteCore::setupHeap3D(int netID, @@ -333,7 +333,7 @@ int FastRouteCore::copyGrids3D(std::vector& treenodes, gridsL_n1n2.push_back(n1l); cnt++; } - } // if n1 is the first node of (n1, n2) + } // if n1 is the first node of (n1, n2) else // n2 is the first node of (n1, n2) { if (treeedges[edge_n1n2].route.routelen > 0) { @@ -343,7 +343,7 @@ int FastRouteCore::copyGrids3D(std::vector& treenodes, gridsL_n1n2.push_back(treeedges[edge_n1n2].route.gridsL[i]); cnt++; } - } // MazeRoute + } // MazeRoute else // NoRoute { gridsX_n1n2.push_back(n1x); @@ -1267,7 +1267,7 @@ void FastRouteCore::mazeRouteMSMDOrder3D(int expand, // treenodes[n1].l = E1l; treenodes[n1].assigned = true; - } // if E1 is on (n1, A1) or (n1, A2) + } // if E1 is on (n1, A1) or (n1, A2) else // E1 is not on (n1, A1) or (n1, A2), but on (C1, C2) { const int C1 = endpt1; @@ -1344,7 +1344,7 @@ void FastRouteCore::mazeRouteMSMDOrder3D(int expand, } } } // else E1 is not on (n1, A1) or (n1, A2), but on (C1, C2) - } // n1 is not a pin and E1!=n1 + } // n1 is not a pin and E1!=n1 else { newUpdateNodeLayers(treenodes, edge_n1n2, n1a, lastL); } @@ -1423,7 +1423,7 @@ void FastRouteCore::mazeRouteMSMDOrder3D(int expand, // update position for n2 treenodes[n2].assigned = true; - } // if E2 is on (n2, B1) or (n2, B2) + } // if E2 is on (n2, B1) or (n2, B2) else // E2 is not on (n2, B1) or (n2, B2), but on (d1_3D, d2_3D) { const int D1 = endpt1; @@ -1499,8 +1499,8 @@ void FastRouteCore::mazeRouteMSMDOrder3D(int expand, break; } } - } // else E2 is not on (n2, B1) or (n2, B2), but on (d1_3D, - // d2_3D) + } // else E2 is not on (n2, B1) or (n2, B2), but on (d1_3D, + // d2_3D) } else // n2 is not a pin and E2!=n2 { newUpdateNodeLayers(treenodes, edge_n1n2, n2a, lastL); diff --git a/src/grt/src/fastroute/src/route.cpp b/src/grt/src/fastroute/src/route.cpp index b1992c2ca14..3f5ed7e9417 100644 --- a/src/grt/src/fastroute/src/route.cpp +++ b/src/grt/src/fastroute/src/route.cpp @@ -395,7 +395,7 @@ void FastRouteCore::newrouteL(int netID, RouteType ripuptype, bool viaGuided) } } // else L-routing - } // if non-degraded edge + } // if non-degraded edge else sttrees_[netID].edges[i].route.type = RouteType::NoRoute; } // loop i @@ -1585,7 +1585,7 @@ void FastRouteCore::newrouteLInMaze(int netID) treeedge->route.xFirst = true; } } // else L-routing - } // loop i + } // loop i } } // namespace grt diff --git a/src/grt/src/fastroute/src/utility.cpp b/src/grt/src/fastroute/src/utility.cpp index 7cb218b90d5..9a3c78e944a 100644 --- a/src/grt/src/fastroute/src/utility.cpp +++ b/src/grt/src/fastroute/src/utility.cpp @@ -964,7 +964,7 @@ void FastRouteCore::layerAssignmentV4() treenodes[n2a].assigned = true; } // edge len > 0 - } // eunmerating edges + } // eunmerating edges } } @@ -2153,7 +2153,7 @@ int FastRouteCore::edgeShift(Tree& t, int net) } costH[j] += std::min(cost1, cost2); } // if(n3!=n2) - } // loop l + } // loop l for (l = 0; l < nbrCnt[n2]; l++) { n3 = nbr[n2][l]; if (n3 != n1) // exclude current edge n1-n2 @@ -2183,8 +2183,8 @@ int FastRouteCore::edgeShift(Tree& t, int net) } costH[j] += std::min(cost1, cost2); } // if(n3!=n1) - } // loop l - } // loop j + } // loop l + } // loop j bestCost = BIG_INT; Pos = t.branch[n1].y; for (j = minY; j <= maxY; j++) { @@ -2264,7 +2264,7 @@ int FastRouteCore::edgeShift(Tree& t, int net) } costV[j] += std::min(cost1, cost2); } // if(n3!=n2) - } // loop l + } // loop l for (l = 0; l < nbrCnt[n2]; l++) { n3 = nbr[n2][l]; if (n3 != n1) // exclude current edge n1-n2 @@ -2294,8 +2294,8 @@ int FastRouteCore::edgeShift(Tree& t, int net) } costV[j] += std::min(cost1, cost2); } // if(n3!=n1) - } // loop l - } // loop j + } // loop l + } // loop j bestCost = BIG_INT; Pos = t.branch[n1].x; for (j = minX; j <= maxX; j++) { From 5529c17a33b486538225e0f004fe600ea4fc7601 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Tue, 12 Mar 2024 17:47:23 -0700 Subject: [PATCH 19/45] test: update aes_sky130hs metrics Signed-off-by: Eder Monteiro --- test/aes_sky130hs.metrics | 78 ++++++++++++++++---------------- test/aes_sky130hs.metrics_limits | 22 ++++----- 2 files changed, 49 insertions(+), 51 deletions(-) diff --git a/test/aes_sky130hs.metrics b/test/aes_sky130hs.metrics index f31c7f26c1f..2926331164f 100644 --- a/test/aes_sky130hs.metrics +++ b/test/aes_sky130hs.metrics @@ -8,62 +8,60 @@ "design__instance__displacement__max": 17.474, "route__wirelength__estimated": 1.3173e+06, "RSZ::repair_design_buffer_count": "518", - "RSZ::max_slew_slack": "19.69558447599411", + "RSZ::max_slew_slack": "19.68039721250534", "RSZ::max_fanout_slack": "100.0", "RSZ::max_capacitance_slack": "56.280056146899526", - "design__instance__displacement__total": 213.084, + "design__instance__displacement__total": 208.702, "design__instance__displacement__mean": 0.004, "design__instance__displacement__max": 5.928, - "route__wirelength__estimated": 1.33444e+06, - "design__instance__count__setup_buffer": 841, - "design__instance__count__hold_buffer": 630, - "RSZ::worst_slack_min": "0.0005018208213230328", - "RSZ::worst_slack_max": "-0.6879021991187272", - "RSZ::tns_max": "-97.86111398227129", - "RSZ::hold_buffer_count": "630", - "design__instance__displacement__total": 7598.82, - "design__instance__displacement__mean": 0.155, - "design__instance__displacement__max": 16.235, - "route__wirelength__estimated": 1.3884e+06, + "route__wirelength__estimated": 1.33431e+06, + "design__instance__count__setup_buffer": 846, + "design__instance__count__hold_buffer": 601, + "RSZ::worst_slack_min": "0.0005530021042057581", + "RSZ::worst_slack_max": "-0.6879061959217289", + "RSZ::tns_max": "-98.9044039106941", + "RSZ::hold_buffer_count": "601", + "design__instance__displacement__total": 7480.57, + "design__instance__displacement__mean": 0.153, + "design__instance__displacement__max": 17.25, + "route__wirelength__estimated": 1.38716e+06, "DPL::utilization": "10.2", - "DPL::design_area": "307836", - "route__net": 16603, + "DPL::design_area": "307348", + "route__net": 16579, "route__net__special": 2, "antenna__violating__nets": 0, "antenna__violating__pins": 0, "GRT::ANT::errors": "0", "design__violations": 0, - "route__net": 16603, + "route__net": 16579, "route__net__special": 2, - "route__drc_errors__iter:1": 13659, - "route__wirelength__iter:1": 1712986, - "route__drc_errors__iter:2": 3067, - "route__wirelength__iter:2": 1707016, - "route__drc_errors__iter:3": 2467, - "route__wirelength__iter:3": 1703968, - "route__drc_errors__iter:4": 61, - "route__wirelength__iter:4": 1704367, - "route__drc_errors__iter:5": 1, - "route__wirelength__iter:5": 1704356, - "route__drc_errors__iter:6": 0, - "route__wirelength__iter:6": 1704359, + "route__drc_errors__iter:1": 11079, + "route__wirelength__iter:1": 1706754, + "route__drc_errors__iter:2": 1570, + "route__wirelength__iter:2": 1700615, + "route__drc_errors__iter:3": 1213, + "route__wirelength__iter:3": 1697715, + "route__drc_errors__iter:4": 10, + "route__wirelength__iter:4": 1697727, + "route__drc_errors__iter:5": 0, + "route__wirelength__iter:5": 1697713, "route__drc_errors": 0, - "route__wirelength": 1704359, - "route__vias": 149586, - "route__vias__singlecut": 149586, + "route__wirelength": 1697713, + "route__vias": 149601, + "route__vias__singlecut": 149601, "route__vias__multicut": 0, "DRT::drv": "0", - "antenna__violating__nets": 111, - "antenna__violating__pins": 112, - "DRT::ANT::errors": "111", + "antenna__violating__nets": 109, + "antenna__violating__pins": 109, + "DRT::ANT::errors": "109", "timing__drv__floating__nets": 0, "timing__drv__floating__pins": 0, - "DRT::worst_slack_min": "-0.21183999598543343", - "DRT::worst_slack_max": "-1.0203118638768833", - "DRT::tns_max": "-136.2589795118327", - "DRT::clock_skew": "0.5525905445188898", - "DRT::max_slew_slack": "-8.156697452068329", + "DRT::worst_slack_min": "-0.1664590734589077", + "DRT::worst_slack_max": "-0.9967604801448263", + "DRT::tns_max": "-134.4156326511716", + "DRT::clock_skew": "0.5093865473606167", + "DRT::max_slew_slack": "-10.26289090514183", "DRT::max_fanout_slack": "100.0", - "DRT::max_capacitance_slack": "-10.2105758345311", + "DRT::max_capacitance_slack": "-12.415987695807061", "DRT::clock_period": "2.811000" } \ No newline at end of file diff --git a/test/aes_sky130hs.metrics_limits b/test/aes_sky130hs.metrics_limits index df2c6511190..3448fbe80f9 100644 --- a/test/aes_sky130hs.metrics_limits +++ b/test/aes_sky130hs.metrics_limits @@ -1,23 +1,23 @@ { "IFP::instance_count" : "19588.8" - ,"DPL::design_area" : "369403.2" + ,"DPL::design_area" : "368817.6" ,"DPL::utilization" : "12.239999999999998" ,"RSZ::repair_design_buffer_count" : "621" ,"RSZ::max_slew_slack" : "0" ,"RSZ::max_capacitance_slack" : "0" ,"RSZ::max_fanout_slack" : "0" - ,"RSZ::worst_slack_min" : "-0.28059817917867697" - ,"RSZ::worst_slack_max" : "-0.9690021991187272" - ,"RSZ::tns_max" : "-556.7287539822713" - ,"RSZ::hold_buffer_count" : "756" + ,"RSZ::worst_slack_min" : "-0.28054699789579424" + ,"RSZ::worst_slack_max" : "-0.9690061959217289" + ,"RSZ::tns_max" : "-557.7720439106942" + ,"RSZ::hold_buffer_count" : "721" ,"GRT::ANT::errors" : "0" ,"DRT::drv" : "0" - ,"DRT::worst_slack_min" : "-0.4929399959854335" - ,"DRT::worst_slack_max" : "-1.3014118638768832" - ,"DRT::tns_max" : "-595.1266195118328" - ,"DRT::clock_skew" : "0.6631086534226677" - ,"DRT::max_slew_slack" : "-9.788036942481995" - ,"DRT::max_capacitance_slack" : "-12.25269100143732" + ,"DRT::worst_slack_min" : "-0.4475590734589077" + ,"DRT::worst_slack_max" : "-1.2778604801448263" + ,"DRT::tns_max" : "-593.2832726511716" + ,"DRT::clock_skew" : "0.6112638568327401" + ,"DRT::max_slew_slack" : "-12.315469086170197" + ,"DRT::max_capacitance_slack" : "-14.899185234968472" ,"DRT::max_fanout_slack" : "0" ,"DRT::clock_period" : "2.811" } From 04f21e22cf7c97ae1a4cb353d5b6d2b99ee369b7 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Tue, 12 Mar 2024 19:08:08 -0700 Subject: [PATCH 20/45] grt: clang-format again Signed-off-by: Eder Monteiro --- src/grt/src/GlobalRouter.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/grt/src/GlobalRouter.cpp b/src/grt/src/GlobalRouter.cpp index fcc476a7f8f..9bf41cf9e08 100644 --- a/src/grt/src/GlobalRouter.cpp +++ b/src/grt/src/GlobalRouter.cpp @@ -3793,7 +3793,10 @@ void GlobalRouter::reportNetDetailedRouteWL(odb::dbWire* wire, void GlobalRouter::createWLReportFile(const char* file_name, bool verbose) { std::ofstream out(file_name); - out << "tool " << "net " << "total_wl " << "#pins "; + out << "tool " + << "net " + << "total_wl " + << "#pins "; if (verbose) { out << "#vias "; From 3de489b33d538e265d7ac9b37a60a53e8ac4f90d Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Tue, 12 Mar 2024 19:14:59 -0700 Subject: [PATCH 21/45] grt: fix more clang-format Signed-off-by: Eder Monteiro --- src/grt/src/fastroute/src/maze.cpp | 22 +++++++++++----------- src/grt/src/fastroute/src/maze3D.cpp | 18 +++++++++--------- src/grt/src/fastroute/src/route.cpp | 4 ++-- src/grt/src/fastroute/src/utility.cpp | 14 +++++++------- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/grt/src/fastroute/src/maze.cpp b/src/grt/src/fastroute/src/maze.cpp index 417ce3695d8..adcbf2e3eab 100644 --- a/src/grt/src/fastroute/src/maze.cpp +++ b/src/grt/src/fastroute/src/maze.cpp @@ -837,7 +837,7 @@ void FastRouteCore::setupHeap(const int netID, queue[queuetail] = nbr; queuetail++; } // loop i (3 neighbors for cur node) - } // while queue is not empty + } // while queue is not empty // find all the grids on subtree t2 (connect to n2) and put them into // dest_heap find all the grids on tree edges in subtree t2 (connecting to @@ -907,8 +907,8 @@ void FastRouteCore::setupHeap(const int netID, queue[queuetail] = nbr; queuetail++; } // loop i (3 neigbors for cur node) - } // while queue is not empty - } // net with more than two pins + } // while queue is not empty + } // net with more than two pins for (int i = regionY1; i <= regionY2; i++) { for (int j = regionX1; j <= regionX2; j++) @@ -938,7 +938,7 @@ int FastRouteCore::copyGrids(const std::vector& treenodes, gridsY_n1n2[cnt] = treeedges[edge_n1n2].route.gridsY[i]; cnt++; } - } // MazeRoute + } // MazeRoute else // NoRoute { gridsX_n1n2.resize(1); @@ -947,7 +947,7 @@ int FastRouteCore::copyGrids(const std::vector& treenodes, gridsY_n1n2[cnt] = n1y; cnt++; } - } // if n1 is the first node of (n1, n2) + } // if n1 is the first node of (n1, n2) else // n2 is the first node of (n1, n2) { if (treeedges[edge_n1n2].route.type == RouteType::MazeRoute) { @@ -958,7 +958,7 @@ int FastRouteCore::copyGrids(const std::vector& treenodes, gridsY_n1n2[cnt] = treeedges[edge_n1n2].route.gridsY[i]; cnt++; } - } // MazeRoute + } // MazeRoute else // NoRoute { gridsX_n1n2.resize(1); @@ -1846,7 +1846,7 @@ void FastRouteCore::mazeRouteMSMD(const int iter, // update position for n1 treenodes[n1].x = E1x; treenodes[n1].y = E1y; - } // if E1 is on (n1, A1) or (n1, A2) + } // if E1 is on (n1, A1) or (n1, A2) else // E1 is not on (n1, A1) or (n1, A2), but on (C1, C2) { const int C1 = endpt1; @@ -1933,7 +1933,7 @@ void FastRouteCore::mazeRouteMSMD(const int iter, } } // else E1 is not on (n1, A1) or (n1, A2), but on (C1, C2) - } // n1 is not a pin and E1!=n1 + } // n1 is not a pin and E1!=n1 // (2) consider subtree2 if (n2 < num_terminals && (E2x != n2x || E2y != n2y)) { @@ -2002,7 +2002,7 @@ void FastRouteCore::mazeRouteMSMD(const int iter, // update position for n2 treenodes[n2].x = E2x; treenodes[n2].y = E2y; - } // if E2 is on (n2, B1) or (n2, B2) + } // if E2 is on (n2, B1) or (n2, B2) else // E2 is not on (n2, B1) or (n2, B2), but on (D1, D2) { const int D1 = endpt1; @@ -2088,7 +2088,7 @@ void FastRouteCore::mazeRouteMSMD(const int iter, } } } // else E2 is not on (n2, B1) or (n2, B2), but on (D1, D2) - } // n2 is not a pin and E2!=n2 + } // n2 is not a pin and E2!=n2 // update route for edge (n1, n2) and edge usage if (treeedges[edge_n1n2].route.type == RouteType::MazeRoute) { @@ -2123,7 +2123,7 @@ void FastRouteCore::mazeRouteMSMD(const int iter, } } } // loop edgeID - } // loop netID + } // loop netID h_cost_table_.clear(); v_cost_table_.clear(); diff --git a/src/grt/src/fastroute/src/maze3D.cpp b/src/grt/src/fastroute/src/maze3D.cpp index d7ce41abd4f..edce512d656 100644 --- a/src/grt/src/fastroute/src/maze3D.cpp +++ b/src/grt/src/fastroute/src/maze3D.cpp @@ -200,14 +200,14 @@ void FastRouteCore::addNeighborPoints(const int netID, } } // if MazeRoute - } // if not a degraded edge (len>0) + } // if not a degraded edge (len>0) // add the neighbor of cur node into heapQueue heapQueue[queuetail] = nbr; queuetail++; } // loop i (neigbors for cur node) - } // while heapQueue is not empty + } // while heapQueue is not empty } void FastRouteCore::setupHeap3D(int netID, @@ -333,7 +333,7 @@ int FastRouteCore::copyGrids3D(std::vector& treenodes, gridsL_n1n2.push_back(n1l); cnt++; } - } // if n1 is the first node of (n1, n2) + } // if n1 is the first node of (n1, n2) else // n2 is the first node of (n1, n2) { if (treeedges[edge_n1n2].route.routelen > 0) { @@ -343,7 +343,7 @@ int FastRouteCore::copyGrids3D(std::vector& treenodes, gridsL_n1n2.push_back(treeedges[edge_n1n2].route.gridsL[i]); cnt++; } - } // MazeRoute + } // MazeRoute else // NoRoute { gridsX_n1n2.push_back(n1x); @@ -1267,7 +1267,7 @@ void FastRouteCore::mazeRouteMSMDOrder3D(int expand, // treenodes[n1].l = E1l; treenodes[n1].assigned = true; - } // if E1 is on (n1, A1) or (n1, A2) + } // if E1 is on (n1, A1) or (n1, A2) else // E1 is not on (n1, A1) or (n1, A2), but on (C1, C2) { const int C1 = endpt1; @@ -1344,7 +1344,7 @@ void FastRouteCore::mazeRouteMSMDOrder3D(int expand, } } } // else E1 is not on (n1, A1) or (n1, A2), but on (C1, C2) - } // n1 is not a pin and E1!=n1 + } // n1 is not a pin and E1!=n1 else { newUpdateNodeLayers(treenodes, edge_n1n2, n1a, lastL); } @@ -1423,7 +1423,7 @@ void FastRouteCore::mazeRouteMSMDOrder3D(int expand, // update position for n2 treenodes[n2].assigned = true; - } // if E2 is on (n2, B1) or (n2, B2) + } // if E2 is on (n2, B1) or (n2, B2) else // E2 is not on (n2, B1) or (n2, B2), but on (d1_3D, d2_3D) { const int D1 = endpt1; @@ -1499,8 +1499,8 @@ void FastRouteCore::mazeRouteMSMDOrder3D(int expand, break; } } - } // else E2 is not on (n2, B1) or (n2, B2), but on (d1_3D, - // d2_3D) + } // else E2 is not on (n2, B1) or (n2, B2), but on (d1_3D, + // d2_3D) } else // n2 is not a pin and E2!=n2 { newUpdateNodeLayers(treenodes, edge_n1n2, n2a, lastL); diff --git a/src/grt/src/fastroute/src/route.cpp b/src/grt/src/fastroute/src/route.cpp index 3f5ed7e9417..b1992c2ca14 100644 --- a/src/grt/src/fastroute/src/route.cpp +++ b/src/grt/src/fastroute/src/route.cpp @@ -395,7 +395,7 @@ void FastRouteCore::newrouteL(int netID, RouteType ripuptype, bool viaGuided) } } // else L-routing - } // if non-degraded edge + } // if non-degraded edge else sttrees_[netID].edges[i].route.type = RouteType::NoRoute; } // loop i @@ -1585,7 +1585,7 @@ void FastRouteCore::newrouteLInMaze(int netID) treeedge->route.xFirst = true; } } // else L-routing - } // loop i + } // loop i } } // namespace grt diff --git a/src/grt/src/fastroute/src/utility.cpp b/src/grt/src/fastroute/src/utility.cpp index 9a3c78e944a..7cb218b90d5 100644 --- a/src/grt/src/fastroute/src/utility.cpp +++ b/src/grt/src/fastroute/src/utility.cpp @@ -964,7 +964,7 @@ void FastRouteCore::layerAssignmentV4() treenodes[n2a].assigned = true; } // edge len > 0 - } // eunmerating edges + } // eunmerating edges } } @@ -2153,7 +2153,7 @@ int FastRouteCore::edgeShift(Tree& t, int net) } costH[j] += std::min(cost1, cost2); } // if(n3!=n2) - } // loop l + } // loop l for (l = 0; l < nbrCnt[n2]; l++) { n3 = nbr[n2][l]; if (n3 != n1) // exclude current edge n1-n2 @@ -2183,8 +2183,8 @@ int FastRouteCore::edgeShift(Tree& t, int net) } costH[j] += std::min(cost1, cost2); } // if(n3!=n1) - } // loop l - } // loop j + } // loop l + } // loop j bestCost = BIG_INT; Pos = t.branch[n1].y; for (j = minY; j <= maxY; j++) { @@ -2264,7 +2264,7 @@ int FastRouteCore::edgeShift(Tree& t, int net) } costV[j] += std::min(cost1, cost2); } // if(n3!=n2) - } // loop l + } // loop l for (l = 0; l < nbrCnt[n2]; l++) { n3 = nbr[n2][l]; if (n3 != n1) // exclude current edge n1-n2 @@ -2294,8 +2294,8 @@ int FastRouteCore::edgeShift(Tree& t, int net) } costV[j] += std::min(cost1, cost2); } // if(n3!=n1) - } // loop l - } // loop j + } // loop l + } // loop j bestCost = BIG_INT; Pos = t.branch[n1].x; for (j = minX; j <= maxX; j++) { From 01b7bed206c3118a2867690569ba1e477350af68 Mon Sep 17 00:00:00 2001 From: Ethan Mahintorabi Date: Wed, 14 Feb 2024 23:00:53 +0000 Subject: [PATCH 22/45] rsz: Makes pin swap equivalence algorithm more robst Replaces the existing symbolic manipulation code with truth table evaluation. Also changes the code to keep track of pin equivalence instead of "cell pin group" equivalence. Not all pins are equal to other pins as sky130_fd_sc_hd__o311ai_1 shows. The code would allow a more broad set of swapping to occur. No functional change should be observed since the pin swap is limited to two term cells which would have worked under the old scheme. Signed-off-by: Ethan Mahintorabi Signed-off-by: Matt Liberty --- src/rsz/src/CMakeLists.txt | 1 + src/rsz/src/RepairSetup.cc | 208 +++-- src/rsz/src/RepairSetup.hh | 27 +- src/rsz/test/pin_swap1.ok | 1741 +++++++++++++++++++++++++++--------- 4 files changed, 1468 insertions(+), 509 deletions(-) diff --git a/src/rsz/src/CMakeLists.txt b/src/rsz/src/CMakeLists.txt index f6eb7da7a72..02f00eb4e01 100644 --- a/src/rsz/src/CMakeLists.txt +++ b/src/rsz/src/CMakeLists.txt @@ -78,6 +78,7 @@ target_link_libraries(rsz_lib dbSta_lib grt_lib utl_lib + Boost::boost ) target_link_libraries(rsz diff --git a/src/rsz/src/RepairSetup.cc b/src/rsz/src/RepairSetup.cc index d3a778022d8..8e66cf8dbfc 100644 --- a/src/rsz/src/RepairSetup.cc +++ b/src/rsz/src/RepairSetup.cc @@ -513,7 +513,7 @@ bool RepairSetup::swapPins(PathRef *drvr_path, } } if (input_port_count > 2) { - return false; + return false; } // Check if we have already dealt with this instance @@ -527,11 +527,12 @@ bool RepairSetup::swapPins(PathRef *drvr_path, // Find the equivalent pins for a cell (simple implementation for now) // stash them - if (equiv_pin_map_.find(cell) == equiv_pin_map_.end()) { - equivCellPins(cell, ports); - equiv_pin_map_.insert(cell, ports); + auto cell_port_pair = std::pair(cell, input_port); + if (equiv_pin_map_.find(cell_port_pair) == equiv_pin_map_.end()) { + equivCellPins(cell, input_port, ports); + equiv_pin_map_.insert(cell_port_pair, ports); } - ports = equiv_pin_map_[cell]; + ports = equiv_pin_map_[cell_port_pair]; if (ports.size() > 1) { resizer_->findSwapPinCandidate(input_port, drvr_port, load_cap, dcalc_ap, &swap_port); @@ -887,76 +888,117 @@ RepairSetup::fanout(Vertex *vertex) return fanout; } -void -RepairSetup::getEquivPortList2(sta::FuncExpr *expr, - sta::LibertyPortSet &ports, - sta::LibertyPortSet &inv_ports, - sta::FuncExpr::Operator &status) +bool RepairSetup::simulateExpr( + sta::FuncExpr* expr, + sta::UnorderedMap>& port_stimulus, + size_t table_index) { - using Operator = sta::FuncExpr::Operator ; - const Operator curr_op = expr->op(); + using Operator = sta::FuncExpr::Operator; + const Operator curr_op = expr->op(); + + switch (curr_op) { + case Operator::op_not: + return !simulateExpr(expr->left(), port_stimulus, table_index); + case Operator::op_and: + return simulateExpr(expr->left(), port_stimulus, table_index) + && simulateExpr(expr->right(), port_stimulus, table_index); + case Operator::op_or: + return simulateExpr(expr->left(), port_stimulus, table_index) + || simulateExpr(expr->right(), port_stimulus, table_index); + case Operator::op_xor: + return simulateExpr(expr->left(), port_stimulus, table_index) + ^ simulateExpr(expr->right(), port_stimulus, table_index); + case Operator::op_one: + return true; + case Operator::op_zero: + return false; + case Operator::op_port: + return port_stimulus[expr->port()][table_index]; + } - if (curr_op == Operator::op_not) { - getEquivPortList2(expr->left(), inv_ports, ports, status); - } - else if (status == Operator::op_zero && - (curr_op == Operator::op_and || - curr_op == Operator::op_or || - curr_op == Operator::op_xor)) { - // Start parsing the equivalent pins (if it is simple or/and/xor) - status = curr_op; - getEquivPortList2(expr->left(), ports, inv_ports, status); - if (status == Operator::op_port) { - return; - } - getEquivPortList2(expr->right(), ports, inv_ports, status); - if (status == Operator::op_port) { - return; - } - status = Operator::op_one; - } - else if (status == curr_op) { - // handle > 2 input scenarios (up to any arbitrary number) - getEquivPortList2(expr->left(), ports, inv_ports, status); - if (status == Operator::op_port) { - return; - } - getEquivPortList2(expr->right(), ports, inv_ports, status); - if (status == Operator::op_port) { - return; - } - } - else if (curr_op == Operator::op_port && expr->port() != nullptr) { - ports.insert(expr->port()); - } - else { - status = Operator::op_port; // moved to some other operator. - ports.clear(); - inv_ports.clear(); - } + logger_->error(RSZ, 91, "unrecognized expr op from OpenSTA"); } -void -RepairSetup::getEquivPortList(sta::FuncExpr *expr, sta::LibertyPortSet &ports) +std::vector RepairSetup::simulateExpr( + sta::FuncExpr* expr, + sta::UnorderedMap>& port_stimulus) +{ + size_t table_length = 0x1 << port_stimulus.size(); + std::vector result; + result.resize(table_length); + for (size_t i = 0; i < table_length; i++) { + result[i] = simulateExpr(expr, port_stimulus, i); + } + + return result; +} + +bool RepairSetup::isPortEqiv(sta::FuncExpr* expr, + const LibertyCell* cell, + const LibertyPort* port_a, + const LibertyPort* port_b) { - sta::FuncExpr::Operator status = sta::FuncExpr::op_zero; - ports.clear(); - sta::LibertyPortSet inv_ports; - getEquivPortList2(expr, ports, inv_ports, status); - if (inv_ports.size() > ports.size()) { - ports = inv_ports; + sta::LibertyCellPortIterator port_iter(cell); + sta::UnorderedMap> port_stimulus; + size_t input_port_count = 0; + while (port_iter.hasNext()) { + LibertyPort* port = port_iter.next(); + if (port->direction()->isInput()) { + ++input_port_count; + port_stimulus[port] = {}; } - if (status == sta::FuncExpr::op_port || ports.size() == 1) { - ports.clear(); + } + + if (input_port_count > 16) { + // Not worth manually simulating all these values. + // Probably need to do SAT solving or something else instead. + return false; + } + + // Generate stimulus for the ports + size_t var_index = 0; + for (auto& it : port_stimulus) { + size_t truth_table_length = 0x1 << input_port_count; + std::vector& variable_stimulus = it.second; + variable_stimulus.resize(truth_table_length, false); + for (int i = 0; i < truth_table_length; i++) { + variable_stimulus[i] = static_cast((i >> var_index) & 0x1); } + var_index++; + } + + if (port_stimulus.find(port_a) == port_stimulus.end()) { + return false; + } + if (port_stimulus.find(port_b) == port_stimulus.end()) { + return false; + } + + std::vector result_no_swap = simulateExpr(expr, port_stimulus); + + // Swap pins + std::swap(port_stimulus.at(port_a), port_stimulus.at(port_b)); + + std::vector result_with_swap = simulateExpr(expr, port_stimulus); + + // Check if truth tables are equivalent post swap. If they are then pins + // are equivalent. + for (size_t i = 0; i < result_no_swap.size(); i++) { + if (result_no_swap[i] != result_with_swap[i]) { + return false; + } + } + + return true; } // Lets just look at the first list for now. // We may want to cache this information somwhere (by building it up for the whole // library). // Or just generate it when the cell is being created (depending on agreement). -void -RepairSetup::equivCellPins(const LibertyCell *cell, sta::LibertyPortSet &ports) +void RepairSetup::equivCellPins(const LibertyCell* cell, + LibertyPort* input_port, + sta::LibertyPortSet& ports) { if (cell->hasSequentials() || cell->isIsolationCell()) { ports.clear(); @@ -967,23 +1009,34 @@ RepairSetup::equivCellPins(const LibertyCell *cell, sta::LibertyPortSet &ports) int inputs = 0; // count number of output ports. Skip ports with > 1 output for now. + LibertyPort* output_port = nullptr; while (port_iter.hasNext()) { LibertyPort *port = port_iter.next(); if (port->direction()->isOutput()) { - ++outputs; + output_port = port; + ++outputs; } else { ++inputs; } } + if (output_port == nullptr) { + return; + } + + sta::FuncExpr* expr = output_port->function(); if (outputs == 1 && inputs >= 2) { sta::LibertyCellPortIterator port_iter2(cell); while (port_iter2.hasNext()) { - LibertyPort *port = port_iter2.next(); - sta::FuncExpr *expr = port->function(); - if (expr != nullptr) { - getEquivPortList(expr, ports); - } + LibertyPort* candidate_port = port_iter2.next(); + if (!candidate_port->direction()->isInput()) { + continue; + } + + if (expr != nullptr && input_port != candidate_port + && isPortEqiv(expr, cell, input_port, candidate_port)) { + ports.insert(candidate_port); + } } } } @@ -999,13 +1052,20 @@ RepairSetup::reportSwappablePins() sta::LibertyCellIterator cell_iter(library); while (cell_iter.hasNext()) { sta::LibertyCell* cell = cell_iter.next(); - sta::LibertyPortSet ports; - equivCellPins(cell, ports); - std::ostringstream ostr; - for (auto port : ports) { - ostr << ' ' << port->name(); + sta::LibertyCellPortIterator port_iter(cell); + while (port_iter.hasNext()) { + LibertyPort* port = port_iter.next(); + if (!port->direction()->isInput()) { + continue; + } + sta::LibertyPortSet ports; + equivCellPins(cell, port, ports); + std::ostringstream ostr; + for (auto port : ports) { + ostr << ' ' << port->name(); + } + logger_->report("{}/{} ->{}", cell->name(), port->name(), ostr.str()); } - logger_->report("{} ->{}", cell->name(), ostr.str()); } } } diff --git a/src/rsz/src/RepairSetup.hh b/src/rsz/src/RepairSetup.hh index 4ab9476d5c3..71502b412c0 100644 --- a/src/rsz/src/RepairSetup.hh +++ b/src/rsz/src/RepairSetup.hh @@ -34,7 +34,9 @@ /////////////////////////////////////////////////////////////////////////////// #pragma once +#include #include + #include "db_sta/dbNetwork.hh" #include "db_sta/dbSta.hh" #include "sta/FuncExpr.hh" @@ -104,12 +106,20 @@ private: bool skip_gate_cloning); void debugCheckMultipleBuffers(PathRef &path, PathExpanded *expanded); - - void getEquivPortList2(sta::FuncExpr *expr, sta::LibertyPortSet &ports, - sta::LibertyPortSet &inv_ports, - sta::FuncExpr::Operator &status); - void getEquivPortList(sta::FuncExpr *expr, sta::LibertyPortSet &ports); - void equivCellPins(const LibertyCell *cell, sta::LibertyPortSet &ports); + bool simulateExpr( + sta::FuncExpr* expr, + sta::UnorderedMap>& port_stimulus, + size_t table_index); + std::vector simulateExpr( + sta::FuncExpr* expr, + sta::UnorderedMap>& port_stimulus); + bool isPortEqiv(sta::FuncExpr* expr, + const LibertyCell* cell, + const LibertyPort* port_a, + const LibertyPort* port_b); + void equivCellPins(const LibertyCell* cell, + LibertyPort* input_port, + sta::LibertyPortSet& ports); bool swapPins(PathRef *drvr_path, int drvr_index, PathExpanded *expanded); bool upsizeDrvr(PathRef *drvr_path, int drvr_index, @@ -168,7 +178,10 @@ private: const MinMax *min_; const MinMax *max_; - sta::UnorderedMap equiv_pin_map_; + sta::UnorderedMap, + sta::LibertyPortSet, + boost::hash>> + equiv_pin_map_; static constexpr int decreasing_slack_max_passes_ = 50; static constexpr int rebuffer_max_fanout_ = 20; diff --git a/src/rsz/test/pin_swap1.ok b/src/rsz/test/pin_swap1.ok index 16a21fdc0c9..fe2fe53c643 100644 --- a/src/rsz/test/pin_swap1.ok +++ b/src/rsz/test/pin_swap1.ok @@ -10,431 +10,1316 @@ [INFO ODB-0131] Created 3 components and 14 component-terminals. [INFO ODB-0132] Created 2 special nets and 0 connections. [INFO ODB-0133] Created 4 nets and 6 connections. -sky130_fd_sc_hd__a2111o_1 -> -sky130_fd_sc_hd__a2111o_2 -> -sky130_fd_sc_hd__a2111o_4 -> -sky130_fd_sc_hd__a2111oi_0 -> -sky130_fd_sc_hd__a2111oi_1 -> -sky130_fd_sc_hd__a2111oi_2 -> -sky130_fd_sc_hd__a2111oi_4 -> -sky130_fd_sc_hd__a211o_1 -> -sky130_fd_sc_hd__a211o_2 -> -sky130_fd_sc_hd__a211o_4 -> -sky130_fd_sc_hd__a211oi_1 -> -sky130_fd_sc_hd__a211oi_2 -> -sky130_fd_sc_hd__a211oi_4 -> -sky130_fd_sc_hd__a21bo_1 -> -sky130_fd_sc_hd__a21bo_2 -> -sky130_fd_sc_hd__a21bo_4 -> -sky130_fd_sc_hd__a21boi_0 -> -sky130_fd_sc_hd__a21boi_1 -> -sky130_fd_sc_hd__a21boi_2 -> -sky130_fd_sc_hd__a21boi_4 -> -sky130_fd_sc_hd__a21o_1 -> -sky130_fd_sc_hd__a21o_2 -> -sky130_fd_sc_hd__a21o_4 -> -sky130_fd_sc_hd__a21oi_1 -> -sky130_fd_sc_hd__a21oi_2 -> -sky130_fd_sc_hd__a21oi_4 -> -sky130_fd_sc_hd__a221o_1 -> -sky130_fd_sc_hd__a221o_2 -> -sky130_fd_sc_hd__a221o_4 -> -sky130_fd_sc_hd__a221oi_1 -> -sky130_fd_sc_hd__a221oi_2 -> -sky130_fd_sc_hd__a221oi_4 -> -sky130_fd_sc_hd__a222oi_1 -> -sky130_fd_sc_hd__a22o_1 -> -sky130_fd_sc_hd__a22o_2 -> -sky130_fd_sc_hd__a22o_4 -> -sky130_fd_sc_hd__a22oi_1 -> -sky130_fd_sc_hd__a22oi_2 -> -sky130_fd_sc_hd__a22oi_4 -> -sky130_fd_sc_hd__a2bb2o_1 -> -sky130_fd_sc_hd__a2bb2o_2 -> -sky130_fd_sc_hd__a2bb2o_4 -> -sky130_fd_sc_hd__a2bb2oi_1 -> -sky130_fd_sc_hd__a2bb2oi_2 -> -sky130_fd_sc_hd__a2bb2oi_4 -> -sky130_fd_sc_hd__a311o_1 -> -sky130_fd_sc_hd__a311o_2 -> -sky130_fd_sc_hd__a311o_4 -> -sky130_fd_sc_hd__a311oi_1 -> -sky130_fd_sc_hd__a311oi_2 -> -sky130_fd_sc_hd__a311oi_4 -> -sky130_fd_sc_hd__a31o_1 -> -sky130_fd_sc_hd__a31o_2 -> -sky130_fd_sc_hd__a31o_4 -> -sky130_fd_sc_hd__a31oi_1 -> -sky130_fd_sc_hd__a31oi_2 -> -sky130_fd_sc_hd__a31oi_4 -> -sky130_fd_sc_hd__a32o_1 -> -sky130_fd_sc_hd__a32o_2 -> -sky130_fd_sc_hd__a32o_4 -> -sky130_fd_sc_hd__a32oi_1 -> -sky130_fd_sc_hd__a32oi_2 -> -sky130_fd_sc_hd__a32oi_4 -> -sky130_fd_sc_hd__a41o_1 -> -sky130_fd_sc_hd__a41o_2 -> -sky130_fd_sc_hd__a41o_4 -> -sky130_fd_sc_hd__a41oi_1 -> -sky130_fd_sc_hd__a41oi_2 -> -sky130_fd_sc_hd__a41oi_4 -> -sky130_fd_sc_hd__and2_0 -> A B -sky130_fd_sc_hd__and2_1 -> A B -sky130_fd_sc_hd__and2_2 -> A B -sky130_fd_sc_hd__and2_4 -> A B -sky130_fd_sc_hd__and2b_1 -> -sky130_fd_sc_hd__and2b_2 -> -sky130_fd_sc_hd__and2b_4 -> -sky130_fd_sc_hd__and3_1 -> A B C -sky130_fd_sc_hd__and3_2 -> A B C -sky130_fd_sc_hd__and3_4 -> A B C -sky130_fd_sc_hd__and3b_1 -> B C -sky130_fd_sc_hd__and3b_2 -> B C -sky130_fd_sc_hd__and3b_4 -> B C -sky130_fd_sc_hd__and4_1 -> A B C D -sky130_fd_sc_hd__and4_2 -> A B C D -sky130_fd_sc_hd__and4_4 -> A B C D -sky130_fd_sc_hd__and4b_1 -> B C D -sky130_fd_sc_hd__and4b_2 -> B C D -sky130_fd_sc_hd__and4b_4 -> B C D -sky130_fd_sc_hd__and4bb_1 -> C D -sky130_fd_sc_hd__and4bb_2 -> C D -sky130_fd_sc_hd__and4bb_4 -> C D -sky130_fd_sc_hd__buf_1 -> -sky130_fd_sc_hd__buf_12 -> -sky130_fd_sc_hd__buf_16 -> -sky130_fd_sc_hd__buf_2 -> -sky130_fd_sc_hd__buf_4 -> -sky130_fd_sc_hd__buf_6 -> -sky130_fd_sc_hd__buf_8 -> -sky130_fd_sc_hd__bufbuf_16 -> -sky130_fd_sc_hd__bufbuf_8 -> -sky130_fd_sc_hd__bufinv_16 -> -sky130_fd_sc_hd__bufinv_8 -> -sky130_fd_sc_hd__clkbuf_1 -> -sky130_fd_sc_hd__clkbuf_16 -> -sky130_fd_sc_hd__clkbuf_2 -> -sky130_fd_sc_hd__clkbuf_4 -> -sky130_fd_sc_hd__clkbuf_8 -> -sky130_fd_sc_hd__clkdlybuf4s15_1 -> -sky130_fd_sc_hd__clkdlybuf4s15_2 -> -sky130_fd_sc_hd__clkdlybuf4s18_1 -> -sky130_fd_sc_hd__clkdlybuf4s18_2 -> -sky130_fd_sc_hd__clkdlybuf4s25_1 -> -sky130_fd_sc_hd__clkdlybuf4s25_2 -> -sky130_fd_sc_hd__clkdlybuf4s50_1 -> -sky130_fd_sc_hd__clkdlybuf4s50_2 -> -sky130_fd_sc_hd__clkinv_1 -> -sky130_fd_sc_hd__clkinv_16 -> -sky130_fd_sc_hd__clkinv_2 -> -sky130_fd_sc_hd__clkinv_4 -> -sky130_fd_sc_hd__clkinv_8 -> -sky130_fd_sc_hd__clkinvlp_2 -> -sky130_fd_sc_hd__clkinvlp_4 -> -sky130_fd_sc_hd__conb_1 -> -sky130_fd_sc_hd__decap_12 -> -sky130_fd_sc_hd__decap_3 -> -sky130_fd_sc_hd__decap_4 -> -sky130_fd_sc_hd__decap_6 -> -sky130_fd_sc_hd__decap_8 -> -sky130_fd_sc_hd__dfbbn_1 -> -sky130_fd_sc_hd__dfbbn_2 -> -sky130_fd_sc_hd__dfbbp_1 -> -sky130_fd_sc_hd__dfrbp_1 -> -sky130_fd_sc_hd__dfrbp_2 -> -sky130_fd_sc_hd__dfrtn_1 -> -sky130_fd_sc_hd__dfrtp_1 -> -sky130_fd_sc_hd__dfrtp_2 -> -sky130_fd_sc_hd__dfrtp_4 -> -sky130_fd_sc_hd__dfsbp_1 -> -sky130_fd_sc_hd__dfsbp_2 -> -sky130_fd_sc_hd__dfstp_1 -> -sky130_fd_sc_hd__dfstp_2 -> -sky130_fd_sc_hd__dfstp_4 -> -sky130_fd_sc_hd__dfxbp_1 -> -sky130_fd_sc_hd__dfxbp_2 -> -sky130_fd_sc_hd__dfxtp_1 -> -sky130_fd_sc_hd__dfxtp_2 -> -sky130_fd_sc_hd__dfxtp_4 -> -sky130_fd_sc_hd__diode_2 -> -sky130_fd_sc_hd__dlclkp_1 -> -sky130_fd_sc_hd__dlclkp_2 -> -sky130_fd_sc_hd__dlclkp_4 -> -sky130_fd_sc_hd__dlrbn_1 -> -sky130_fd_sc_hd__dlrbn_2 -> -sky130_fd_sc_hd__dlrbp_1 -> -sky130_fd_sc_hd__dlrbp_2 -> -sky130_fd_sc_hd__dlrtn_1 -> -sky130_fd_sc_hd__dlrtn_2 -> -sky130_fd_sc_hd__dlrtn_4 -> -sky130_fd_sc_hd__dlrtp_1 -> -sky130_fd_sc_hd__dlrtp_2 -> -sky130_fd_sc_hd__dlrtp_4 -> -sky130_fd_sc_hd__dlxbn_1 -> -sky130_fd_sc_hd__dlxbn_2 -> -sky130_fd_sc_hd__dlxbp_1 -> -sky130_fd_sc_hd__dlxtn_1 -> -sky130_fd_sc_hd__dlxtn_2 -> -sky130_fd_sc_hd__dlxtn_4 -> -sky130_fd_sc_hd__dlxtp_1 -> -sky130_fd_sc_hd__dlygate4sd1_1 -> -sky130_fd_sc_hd__dlygate4sd2_1 -> -sky130_fd_sc_hd__dlygate4sd3_1 -> -sky130_fd_sc_hd__dlymetal6s2s_1 -> -sky130_fd_sc_hd__dlymetal6s4s_1 -> -sky130_fd_sc_hd__dlymetal6s6s_1 -> -sky130_fd_sc_hd__ebufn_1 -> -sky130_fd_sc_hd__ebufn_2 -> -sky130_fd_sc_hd__ebufn_4 -> -sky130_fd_sc_hd__ebufn_8 -> -sky130_fd_sc_hd__edfxbp_1 -> -sky130_fd_sc_hd__edfxtp_1 -> -sky130_fd_sc_hd__einvn_0 -> -sky130_fd_sc_hd__einvn_1 -> -sky130_fd_sc_hd__einvn_2 -> -sky130_fd_sc_hd__einvn_4 -> -sky130_fd_sc_hd__einvn_8 -> -sky130_fd_sc_hd__einvp_1 -> -sky130_fd_sc_hd__einvp_2 -> -sky130_fd_sc_hd__einvp_4 -> -sky130_fd_sc_hd__einvp_8 -> -sky130_fd_sc_hd__fa_1 -> -sky130_fd_sc_hd__fa_2 -> -sky130_fd_sc_hd__fa_4 -> -sky130_fd_sc_hd__fah_1 -> -sky130_fd_sc_hd__fahcin_1 -> -sky130_fd_sc_hd__fahcon_1 -> -sky130_fd_sc_hd__ha_1 -> -sky130_fd_sc_hd__ha_2 -> -sky130_fd_sc_hd__ha_4 -> -sky130_fd_sc_hd__inv_1 -> -sky130_fd_sc_hd__inv_12 -> -sky130_fd_sc_hd__inv_16 -> -sky130_fd_sc_hd__inv_2 -> -sky130_fd_sc_hd__inv_4 -> -sky130_fd_sc_hd__inv_6 -> -sky130_fd_sc_hd__inv_8 -> -sky130_fd_sc_hd__lpflow_bleeder_1 -> -sky130_fd_sc_hd__lpflow_clkbufkapwr_1 -> -sky130_fd_sc_hd__lpflow_clkbufkapwr_16 -> -sky130_fd_sc_hd__lpflow_clkbufkapwr_2 -> -sky130_fd_sc_hd__lpflow_clkbufkapwr_4 -> -sky130_fd_sc_hd__lpflow_clkbufkapwr_8 -> -sky130_fd_sc_hd__lpflow_clkinvkapwr_1 -> -sky130_fd_sc_hd__lpflow_clkinvkapwr_16 -> -sky130_fd_sc_hd__lpflow_clkinvkapwr_2 -> -sky130_fd_sc_hd__lpflow_clkinvkapwr_4 -> -sky130_fd_sc_hd__lpflow_clkinvkapwr_8 -> -sky130_fd_sc_hd__lpflow_decapkapwr_12 -> -sky130_fd_sc_hd__lpflow_decapkapwr_3 -> -sky130_fd_sc_hd__lpflow_decapkapwr_4 -> -sky130_fd_sc_hd__lpflow_decapkapwr_6 -> -sky130_fd_sc_hd__lpflow_decapkapwr_8 -> -sky130_fd_sc_hd__lpflow_inputiso0n_1 -> -sky130_fd_sc_hd__lpflow_inputiso0p_1 -> -sky130_fd_sc_hd__lpflow_inputiso1n_1 -> -sky130_fd_sc_hd__lpflow_inputiso1p_1 -> -sky130_fd_sc_hd__lpflow_inputisolatch_1 -> -sky130_fd_sc_hd__lpflow_isobufsrc_1 -> -sky130_fd_sc_hd__lpflow_isobufsrc_16 -> -sky130_fd_sc_hd__lpflow_isobufsrc_2 -> -sky130_fd_sc_hd__lpflow_isobufsrc_4 -> -sky130_fd_sc_hd__lpflow_isobufsrc_8 -> -sky130_fd_sc_hd__lpflow_isobufsrckapwr_16 -> -sky130_fd_sc_hd__lpflow_lsbuf_lh_hl_isowell_tap_1 -> -sky130_fd_sc_hd__lpflow_lsbuf_lh_hl_isowell_tap_2 -> -sky130_fd_sc_hd__lpflow_lsbuf_lh_hl_isowell_tap_4 -> -sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_4 -> -sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_tap_1 -> -sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_tap_2 -> -sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_tap_4 -> -sky130_fd_sc_hd__macro_sparecell -> -sky130_fd_sc_hd__maj3_1 -> -sky130_fd_sc_hd__maj3_2 -> -sky130_fd_sc_hd__maj3_4 -> -sky130_fd_sc_hd__mux2_1 -> -sky130_fd_sc_hd__mux2_2 -> -sky130_fd_sc_hd__mux2_4 -> -sky130_fd_sc_hd__mux2_8 -> -sky130_fd_sc_hd__mux2i_1 -> -sky130_fd_sc_hd__mux2i_2 -> -sky130_fd_sc_hd__mux2i_4 -> -sky130_fd_sc_hd__mux4_1 -> -sky130_fd_sc_hd__mux4_2 -> -sky130_fd_sc_hd__mux4_4 -> -sky130_fd_sc_hd__nand2_1 -> A B -sky130_fd_sc_hd__nand2_2 -> A B -sky130_fd_sc_hd__nand2_4 -> A B -sky130_fd_sc_hd__nand2_8 -> A B -sky130_fd_sc_hd__nand2b_1 -> -sky130_fd_sc_hd__nand2b_2 -> -sky130_fd_sc_hd__nand2b_4 -> -sky130_fd_sc_hd__nand3_1 -> A B C -sky130_fd_sc_hd__nand3_2 -> A B C -sky130_fd_sc_hd__nand3_4 -> A B C -sky130_fd_sc_hd__nand3b_1 -> B C -sky130_fd_sc_hd__nand3b_2 -> B C -sky130_fd_sc_hd__nand3b_4 -> B C -sky130_fd_sc_hd__nand4_1 -> A B C D -sky130_fd_sc_hd__nand4_2 -> A B C D -sky130_fd_sc_hd__nand4_4 -> A B C D -sky130_fd_sc_hd__nand4b_1 -> B C D -sky130_fd_sc_hd__nand4b_2 -> B C D -sky130_fd_sc_hd__nand4b_4 -> B C D -sky130_fd_sc_hd__nand4bb_1 -> A_N B_N -sky130_fd_sc_hd__nand4bb_2 -> A_N B_N -sky130_fd_sc_hd__nand4bb_4 -> A_N B_N -sky130_fd_sc_hd__nor2_1 -> A B -sky130_fd_sc_hd__nor2_2 -> A B -sky130_fd_sc_hd__nor2_4 -> A B -sky130_fd_sc_hd__nor2_8 -> A B -sky130_fd_sc_hd__nor2b_1 -> -sky130_fd_sc_hd__nor2b_2 -> -sky130_fd_sc_hd__nor2b_4 -> -sky130_fd_sc_hd__nor3_1 -> A B C -sky130_fd_sc_hd__nor3_2 -> A B C -sky130_fd_sc_hd__nor3_4 -> A B C -sky130_fd_sc_hd__nor3b_1 -> A B -sky130_fd_sc_hd__nor3b_2 -> A B -sky130_fd_sc_hd__nor3b_4 -> A B -sky130_fd_sc_hd__nor4_1 -> A B C D -sky130_fd_sc_hd__nor4_2 -> A B C D -sky130_fd_sc_hd__nor4_4 -> A B C D -sky130_fd_sc_hd__nor4b_1 -> A B C -sky130_fd_sc_hd__nor4b_2 -> A B C -sky130_fd_sc_hd__nor4b_4 -> A B C -sky130_fd_sc_hd__nor4bb_1 -> C_N D_N -sky130_fd_sc_hd__nor4bb_2 -> C_N D_N -sky130_fd_sc_hd__nor4bb_4 -> C_N D_N -sky130_fd_sc_hd__o2111a_1 -> -sky130_fd_sc_hd__o2111a_2 -> -sky130_fd_sc_hd__o2111a_4 -> -sky130_fd_sc_hd__o2111ai_1 -> -sky130_fd_sc_hd__o2111ai_2 -> -sky130_fd_sc_hd__o2111ai_4 -> -sky130_fd_sc_hd__o211a_1 -> -sky130_fd_sc_hd__o211a_2 -> -sky130_fd_sc_hd__o211a_4 -> -sky130_fd_sc_hd__o211ai_1 -> -sky130_fd_sc_hd__o211ai_2 -> -sky130_fd_sc_hd__o211ai_4 -> -sky130_fd_sc_hd__o21a_1 -> -sky130_fd_sc_hd__o21a_2 -> -sky130_fd_sc_hd__o21a_4 -> -sky130_fd_sc_hd__o21ai_0 -> -sky130_fd_sc_hd__o21ai_1 -> -sky130_fd_sc_hd__o21ai_2 -> -sky130_fd_sc_hd__o21ai_4 -> -sky130_fd_sc_hd__o21ba_1 -> -sky130_fd_sc_hd__o21ba_2 -> -sky130_fd_sc_hd__o21ba_4 -> -sky130_fd_sc_hd__o21bai_1 -> -sky130_fd_sc_hd__o21bai_2 -> -sky130_fd_sc_hd__o21bai_4 -> -sky130_fd_sc_hd__o221a_1 -> -sky130_fd_sc_hd__o221a_2 -> -sky130_fd_sc_hd__o221a_4 -> -sky130_fd_sc_hd__o221ai_1 -> -sky130_fd_sc_hd__o221ai_2 -> -sky130_fd_sc_hd__o221ai_4 -> -sky130_fd_sc_hd__o22a_1 -> -sky130_fd_sc_hd__o22a_2 -> -sky130_fd_sc_hd__o22a_4 -> -sky130_fd_sc_hd__o22ai_1 -> -sky130_fd_sc_hd__o22ai_2 -> -sky130_fd_sc_hd__o22ai_4 -> -sky130_fd_sc_hd__o2bb2a_1 -> -sky130_fd_sc_hd__o2bb2a_2 -> -sky130_fd_sc_hd__o2bb2a_4 -> -sky130_fd_sc_hd__o2bb2ai_1 -> -sky130_fd_sc_hd__o2bb2ai_2 -> -sky130_fd_sc_hd__o2bb2ai_4 -> -sky130_fd_sc_hd__o311a_1 -> -sky130_fd_sc_hd__o311a_2 -> -sky130_fd_sc_hd__o311a_4 -> -sky130_fd_sc_hd__o311ai_0 -> -sky130_fd_sc_hd__o311ai_1 -> -sky130_fd_sc_hd__o311ai_2 -> -sky130_fd_sc_hd__o311ai_4 -> -sky130_fd_sc_hd__o31a_1 -> -sky130_fd_sc_hd__o31a_2 -> -sky130_fd_sc_hd__o31a_4 -> -sky130_fd_sc_hd__o31ai_1 -> -sky130_fd_sc_hd__o31ai_2 -> -sky130_fd_sc_hd__o31ai_4 -> -sky130_fd_sc_hd__o32a_1 -> -sky130_fd_sc_hd__o32a_2 -> -sky130_fd_sc_hd__o32a_4 -> -sky130_fd_sc_hd__o32ai_1 -> -sky130_fd_sc_hd__o32ai_2 -> -sky130_fd_sc_hd__o32ai_4 -> -sky130_fd_sc_hd__o41a_1 -> -sky130_fd_sc_hd__o41a_2 -> -sky130_fd_sc_hd__o41a_4 -> -sky130_fd_sc_hd__o41ai_1 -> -sky130_fd_sc_hd__o41ai_2 -> -sky130_fd_sc_hd__o41ai_4 -> -sky130_fd_sc_hd__or2_0 -> A B -sky130_fd_sc_hd__or2_1 -> A B -sky130_fd_sc_hd__or2_2 -> A B -sky130_fd_sc_hd__or2_4 -> A B -sky130_fd_sc_hd__or2b_1 -> -sky130_fd_sc_hd__or2b_2 -> -sky130_fd_sc_hd__or2b_4 -> -sky130_fd_sc_hd__or3_1 -> A B C -sky130_fd_sc_hd__or3_2 -> A B C -sky130_fd_sc_hd__or3_4 -> A B C -sky130_fd_sc_hd__or3b_1 -> A B -sky130_fd_sc_hd__or3b_2 -> A B -sky130_fd_sc_hd__or3b_4 -> A B -sky130_fd_sc_hd__or4_1 -> A B C D -sky130_fd_sc_hd__or4_2 -> A B C D -sky130_fd_sc_hd__or4_4 -> A B C D -sky130_fd_sc_hd__or4b_1 -> A B C -sky130_fd_sc_hd__or4b_2 -> A B C -sky130_fd_sc_hd__or4b_4 -> A B C -sky130_fd_sc_hd__or4bb_1 -> A B -sky130_fd_sc_hd__or4bb_2 -> A B -sky130_fd_sc_hd__or4bb_4 -> A B -sky130_fd_sc_hd__probe_p_8 -> -sky130_fd_sc_hd__probec_p_8 -> -sky130_fd_sc_hd__sdfbbn_1 -> -sky130_fd_sc_hd__sdfbbn_2 -> -sky130_fd_sc_hd__sdfbbp_1 -> -sky130_fd_sc_hd__sdfrbp_1 -> -sky130_fd_sc_hd__sdfrbp_2 -> -sky130_fd_sc_hd__sdfrtn_1 -> -sky130_fd_sc_hd__sdfrtp_1 -> -sky130_fd_sc_hd__sdfrtp_2 -> -sky130_fd_sc_hd__sdfrtp_4 -> -sky130_fd_sc_hd__sdfsbp_1 -> -sky130_fd_sc_hd__sdfsbp_2 -> -sky130_fd_sc_hd__sdfstp_1 -> -sky130_fd_sc_hd__sdfstp_2 -> -sky130_fd_sc_hd__sdfstp_4 -> -sky130_fd_sc_hd__sdfxbp_1 -> -sky130_fd_sc_hd__sdfxbp_2 -> -sky130_fd_sc_hd__sdfxtp_1 -> -sky130_fd_sc_hd__sdfxtp_2 -> -sky130_fd_sc_hd__sdfxtp_4 -> -sky130_fd_sc_hd__sdlclkp_1 -> -sky130_fd_sc_hd__sdlclkp_2 -> -sky130_fd_sc_hd__sdlclkp_4 -> -sky130_fd_sc_hd__sedfxbp_1 -> -sky130_fd_sc_hd__sedfxbp_2 -> -sky130_fd_sc_hd__sedfxtp_1 -> -sky130_fd_sc_hd__sedfxtp_2 -> -sky130_fd_sc_hd__sedfxtp_4 -> -sky130_fd_sc_hd__xnor2_1 -> -sky130_fd_sc_hd__xnor2_2 -> -sky130_fd_sc_hd__xnor2_4 -> -sky130_fd_sc_hd__xnor3_1 -> -sky130_fd_sc_hd__xnor3_2 -> -sky130_fd_sc_hd__xnor3_4 -> -sky130_fd_sc_hd__xor2_1 -> -sky130_fd_sc_hd__xor2_2 -> -sky130_fd_sc_hd__xor2_4 -> -sky130_fd_sc_hd__xor3_1 -> -sky130_fd_sc_hd__xor3_2 -> -sky130_fd_sc_hd__xor3_4 -> +sky130_fd_sc_hd__a2111o_1/A1 -> A2 +sky130_fd_sc_hd__a2111o_1/A2 -> A1 +sky130_fd_sc_hd__a2111o_1/B1 -> C1 D1 +sky130_fd_sc_hd__a2111o_1/C1 -> B1 D1 +sky130_fd_sc_hd__a2111o_1/D1 -> B1 C1 +sky130_fd_sc_hd__a2111o_2/A1 -> A2 +sky130_fd_sc_hd__a2111o_2/A2 -> A1 +sky130_fd_sc_hd__a2111o_2/B1 -> C1 D1 +sky130_fd_sc_hd__a2111o_2/C1 -> B1 D1 +sky130_fd_sc_hd__a2111o_2/D1 -> B1 C1 +sky130_fd_sc_hd__a2111o_4/A1 -> A2 +sky130_fd_sc_hd__a2111o_4/A2 -> A1 +sky130_fd_sc_hd__a2111o_4/B1 -> C1 D1 +sky130_fd_sc_hd__a2111o_4/C1 -> B1 D1 +sky130_fd_sc_hd__a2111o_4/D1 -> B1 C1 +sky130_fd_sc_hd__a2111oi_0/A1 -> A2 +sky130_fd_sc_hd__a2111oi_0/A2 -> A1 +sky130_fd_sc_hd__a2111oi_0/B1 -> C1 D1 +sky130_fd_sc_hd__a2111oi_0/C1 -> B1 D1 +sky130_fd_sc_hd__a2111oi_0/D1 -> B1 C1 +sky130_fd_sc_hd__a2111oi_1/A1 -> A2 +sky130_fd_sc_hd__a2111oi_1/A2 -> A1 +sky130_fd_sc_hd__a2111oi_1/B1 -> C1 D1 +sky130_fd_sc_hd__a2111oi_1/C1 -> B1 D1 +sky130_fd_sc_hd__a2111oi_1/D1 -> B1 C1 +sky130_fd_sc_hd__a2111oi_2/A1 -> A2 +sky130_fd_sc_hd__a2111oi_2/A2 -> A1 +sky130_fd_sc_hd__a2111oi_2/B1 -> C1 D1 +sky130_fd_sc_hd__a2111oi_2/C1 -> B1 D1 +sky130_fd_sc_hd__a2111oi_2/D1 -> B1 C1 +sky130_fd_sc_hd__a2111oi_4/A1 -> A2 +sky130_fd_sc_hd__a2111oi_4/A2 -> A1 +sky130_fd_sc_hd__a2111oi_4/B1 -> C1 D1 +sky130_fd_sc_hd__a2111oi_4/C1 -> B1 D1 +sky130_fd_sc_hd__a2111oi_4/D1 -> B1 C1 +sky130_fd_sc_hd__a211o_1/A1 -> A2 +sky130_fd_sc_hd__a211o_1/A2 -> A1 +sky130_fd_sc_hd__a211o_1/B1 -> C1 +sky130_fd_sc_hd__a211o_1/C1 -> B1 +sky130_fd_sc_hd__a211o_2/A1 -> A2 +sky130_fd_sc_hd__a211o_2/A2 -> A1 +sky130_fd_sc_hd__a211o_2/B1 -> C1 +sky130_fd_sc_hd__a211o_2/C1 -> B1 +sky130_fd_sc_hd__a211o_4/A1 -> A2 +sky130_fd_sc_hd__a211o_4/A2 -> A1 +sky130_fd_sc_hd__a211o_4/B1 -> C1 +sky130_fd_sc_hd__a211o_4/C1 -> B1 +sky130_fd_sc_hd__a211oi_1/A1 -> A2 +sky130_fd_sc_hd__a211oi_1/A2 -> A1 +sky130_fd_sc_hd__a211oi_1/B1 -> C1 +sky130_fd_sc_hd__a211oi_1/C1 -> B1 +sky130_fd_sc_hd__a211oi_2/A1 -> A2 +sky130_fd_sc_hd__a211oi_2/A2 -> A1 +sky130_fd_sc_hd__a211oi_2/B1 -> C1 +sky130_fd_sc_hd__a211oi_2/C1 -> B1 +sky130_fd_sc_hd__a211oi_4/A1 -> A2 +sky130_fd_sc_hd__a211oi_4/A2 -> A1 +sky130_fd_sc_hd__a211oi_4/B1 -> C1 +sky130_fd_sc_hd__a211oi_4/C1 -> B1 +sky130_fd_sc_hd__a21bo_1/A1 -> A2 +sky130_fd_sc_hd__a21bo_1/A2 -> A1 +sky130_fd_sc_hd__a21bo_1/B1_N -> +sky130_fd_sc_hd__a21bo_2/A1 -> A2 +sky130_fd_sc_hd__a21bo_2/A2 -> A1 +sky130_fd_sc_hd__a21bo_2/B1_N -> +sky130_fd_sc_hd__a21bo_4/A1 -> A2 +sky130_fd_sc_hd__a21bo_4/A2 -> A1 +sky130_fd_sc_hd__a21bo_4/B1_N -> +sky130_fd_sc_hd__a21boi_0/A1 -> A2 +sky130_fd_sc_hd__a21boi_0/A2 -> A1 +sky130_fd_sc_hd__a21boi_0/B1_N -> +sky130_fd_sc_hd__a21boi_1/A1 -> A2 +sky130_fd_sc_hd__a21boi_1/A2 -> A1 +sky130_fd_sc_hd__a21boi_1/B1_N -> +sky130_fd_sc_hd__a21boi_2/A1 -> A2 +sky130_fd_sc_hd__a21boi_2/A2 -> A1 +sky130_fd_sc_hd__a21boi_2/B1_N -> +sky130_fd_sc_hd__a21boi_4/A1 -> A2 +sky130_fd_sc_hd__a21boi_4/A2 -> A1 +sky130_fd_sc_hd__a21boi_4/B1_N -> +sky130_fd_sc_hd__a21o_1/A1 -> A2 +sky130_fd_sc_hd__a21o_1/A2 -> A1 +sky130_fd_sc_hd__a21o_1/B1 -> +sky130_fd_sc_hd__a21o_2/A1 -> A2 +sky130_fd_sc_hd__a21o_2/A2 -> A1 +sky130_fd_sc_hd__a21o_2/B1 -> +sky130_fd_sc_hd__a21o_4/A1 -> A2 +sky130_fd_sc_hd__a21o_4/A2 -> A1 +sky130_fd_sc_hd__a21o_4/B1 -> +sky130_fd_sc_hd__a21oi_1/A1 -> A2 +sky130_fd_sc_hd__a21oi_1/A2 -> A1 +sky130_fd_sc_hd__a21oi_1/B1 -> +sky130_fd_sc_hd__a21oi_2/A1 -> A2 +sky130_fd_sc_hd__a21oi_2/A2 -> A1 +sky130_fd_sc_hd__a21oi_2/B1 -> +sky130_fd_sc_hd__a21oi_4/A1 -> A2 +sky130_fd_sc_hd__a21oi_4/A2 -> A1 +sky130_fd_sc_hd__a21oi_4/B1 -> +sky130_fd_sc_hd__a221o_1/A1 -> A2 +sky130_fd_sc_hd__a221o_1/A2 -> A1 +sky130_fd_sc_hd__a221o_1/B1 -> B2 +sky130_fd_sc_hd__a221o_1/B2 -> B1 +sky130_fd_sc_hd__a221o_1/C1 -> +sky130_fd_sc_hd__a221o_2/A1 -> A2 +sky130_fd_sc_hd__a221o_2/A2 -> A1 +sky130_fd_sc_hd__a221o_2/B1 -> B2 +sky130_fd_sc_hd__a221o_2/B2 -> B1 +sky130_fd_sc_hd__a221o_2/C1 -> +sky130_fd_sc_hd__a221o_4/A1 -> A2 +sky130_fd_sc_hd__a221o_4/A2 -> A1 +sky130_fd_sc_hd__a221o_4/B1 -> B2 +sky130_fd_sc_hd__a221o_4/B2 -> B1 +sky130_fd_sc_hd__a221o_4/C1 -> +sky130_fd_sc_hd__a221oi_1/A1 -> A2 +sky130_fd_sc_hd__a221oi_1/A2 -> A1 +sky130_fd_sc_hd__a221oi_1/B1 -> B2 +sky130_fd_sc_hd__a221oi_1/B2 -> B1 +sky130_fd_sc_hd__a221oi_1/C1 -> +sky130_fd_sc_hd__a221oi_2/A1 -> A2 +sky130_fd_sc_hd__a221oi_2/A2 -> A1 +sky130_fd_sc_hd__a221oi_2/B1 -> B2 +sky130_fd_sc_hd__a221oi_2/B2 -> B1 +sky130_fd_sc_hd__a221oi_2/C1 -> +sky130_fd_sc_hd__a221oi_4/A1 -> A2 +sky130_fd_sc_hd__a221oi_4/A2 -> A1 +sky130_fd_sc_hd__a221oi_4/B1 -> B2 +sky130_fd_sc_hd__a221oi_4/B2 -> B1 +sky130_fd_sc_hd__a221oi_4/C1 -> +sky130_fd_sc_hd__a222oi_1/A1 -> A2 +sky130_fd_sc_hd__a222oi_1/A2 -> A1 +sky130_fd_sc_hd__a222oi_1/B1 -> B2 +sky130_fd_sc_hd__a222oi_1/B2 -> B1 +sky130_fd_sc_hd__a222oi_1/C1 -> C2 +sky130_fd_sc_hd__a222oi_1/C2 -> C1 +sky130_fd_sc_hd__a22o_1/A1 -> A2 +sky130_fd_sc_hd__a22o_1/A2 -> A1 +sky130_fd_sc_hd__a22o_1/B1 -> B2 +sky130_fd_sc_hd__a22o_1/B2 -> B1 +sky130_fd_sc_hd__a22o_2/A1 -> A2 +sky130_fd_sc_hd__a22o_2/A2 -> A1 +sky130_fd_sc_hd__a22o_2/B1 -> B2 +sky130_fd_sc_hd__a22o_2/B2 -> B1 +sky130_fd_sc_hd__a22o_4/A1 -> A2 +sky130_fd_sc_hd__a22o_4/A2 -> A1 +sky130_fd_sc_hd__a22o_4/B1 -> B2 +sky130_fd_sc_hd__a22o_4/B2 -> B1 +sky130_fd_sc_hd__a22oi_1/A1 -> A2 +sky130_fd_sc_hd__a22oi_1/A2 -> A1 +sky130_fd_sc_hd__a22oi_1/B1 -> B2 +sky130_fd_sc_hd__a22oi_1/B2 -> B1 +sky130_fd_sc_hd__a22oi_2/A1 -> A2 +sky130_fd_sc_hd__a22oi_2/A2 -> A1 +sky130_fd_sc_hd__a22oi_2/B1 -> B2 +sky130_fd_sc_hd__a22oi_2/B2 -> B1 +sky130_fd_sc_hd__a22oi_4/A1 -> A2 +sky130_fd_sc_hd__a22oi_4/A2 -> A1 +sky130_fd_sc_hd__a22oi_4/B1 -> B2 +sky130_fd_sc_hd__a22oi_4/B2 -> B1 +sky130_fd_sc_hd__a2bb2o_1/A1_N -> A2_N +sky130_fd_sc_hd__a2bb2o_1/A2_N -> A1_N +sky130_fd_sc_hd__a2bb2o_1/B1 -> B2 +sky130_fd_sc_hd__a2bb2o_1/B2 -> B1 +sky130_fd_sc_hd__a2bb2o_2/A1_N -> A2_N +sky130_fd_sc_hd__a2bb2o_2/A2_N -> A1_N +sky130_fd_sc_hd__a2bb2o_2/B1 -> B2 +sky130_fd_sc_hd__a2bb2o_2/B2 -> B1 +sky130_fd_sc_hd__a2bb2o_4/A1_N -> A2_N +sky130_fd_sc_hd__a2bb2o_4/A2_N -> A1_N +sky130_fd_sc_hd__a2bb2o_4/B1 -> B2 +sky130_fd_sc_hd__a2bb2o_4/B2 -> B1 +sky130_fd_sc_hd__a2bb2oi_1/A1_N -> A2_N +sky130_fd_sc_hd__a2bb2oi_1/A2_N -> A1_N +sky130_fd_sc_hd__a2bb2oi_1/B1 -> B2 +sky130_fd_sc_hd__a2bb2oi_1/B2 -> B1 +sky130_fd_sc_hd__a2bb2oi_2/A1_N -> A2_N +sky130_fd_sc_hd__a2bb2oi_2/A2_N -> A1_N +sky130_fd_sc_hd__a2bb2oi_2/B1 -> B2 +sky130_fd_sc_hd__a2bb2oi_2/B2 -> B1 +sky130_fd_sc_hd__a2bb2oi_4/A1_N -> A2_N +sky130_fd_sc_hd__a2bb2oi_4/A2_N -> A1_N +sky130_fd_sc_hd__a2bb2oi_4/B1 -> B2 +sky130_fd_sc_hd__a2bb2oi_4/B2 -> B1 +sky130_fd_sc_hd__a311o_1/A1 -> A2 A3 +sky130_fd_sc_hd__a311o_1/A2 -> A1 A3 +sky130_fd_sc_hd__a311o_1/A3 -> A1 A2 +sky130_fd_sc_hd__a311o_1/B1 -> C1 +sky130_fd_sc_hd__a311o_1/C1 -> B1 +sky130_fd_sc_hd__a311o_2/A1 -> A2 A3 +sky130_fd_sc_hd__a311o_2/A2 -> A1 A3 +sky130_fd_sc_hd__a311o_2/A3 -> A1 A2 +sky130_fd_sc_hd__a311o_2/B1 -> C1 +sky130_fd_sc_hd__a311o_2/C1 -> B1 +sky130_fd_sc_hd__a311o_4/A1 -> A2 A3 +sky130_fd_sc_hd__a311o_4/A2 -> A1 A3 +sky130_fd_sc_hd__a311o_4/A3 -> A1 A2 +sky130_fd_sc_hd__a311o_4/B1 -> C1 +sky130_fd_sc_hd__a311o_4/C1 -> B1 +sky130_fd_sc_hd__a311oi_1/A1 -> A2 A3 +sky130_fd_sc_hd__a311oi_1/A2 -> A1 A3 +sky130_fd_sc_hd__a311oi_1/A3 -> A1 A2 +sky130_fd_sc_hd__a311oi_1/B1 -> C1 +sky130_fd_sc_hd__a311oi_1/C1 -> B1 +sky130_fd_sc_hd__a311oi_2/A1 -> A2 A3 +sky130_fd_sc_hd__a311oi_2/A2 -> A1 A3 +sky130_fd_sc_hd__a311oi_2/A3 -> A1 A2 +sky130_fd_sc_hd__a311oi_2/B1 -> C1 +sky130_fd_sc_hd__a311oi_2/C1 -> B1 +sky130_fd_sc_hd__a311oi_4/A1 -> A2 A3 +sky130_fd_sc_hd__a311oi_4/A2 -> A1 A3 +sky130_fd_sc_hd__a311oi_4/A3 -> A1 A2 +sky130_fd_sc_hd__a311oi_4/B1 -> C1 +sky130_fd_sc_hd__a311oi_4/C1 -> B1 +sky130_fd_sc_hd__a31o_1/A1 -> A2 A3 +sky130_fd_sc_hd__a31o_1/A2 -> A1 A3 +sky130_fd_sc_hd__a31o_1/A3 -> A1 A2 +sky130_fd_sc_hd__a31o_1/B1 -> +sky130_fd_sc_hd__a31o_2/A1 -> A2 A3 +sky130_fd_sc_hd__a31o_2/A2 -> A1 A3 +sky130_fd_sc_hd__a31o_2/A3 -> A1 A2 +sky130_fd_sc_hd__a31o_2/B1 -> +sky130_fd_sc_hd__a31o_4/A1 -> A2 A3 +sky130_fd_sc_hd__a31o_4/A2 -> A1 A3 +sky130_fd_sc_hd__a31o_4/A3 -> A1 A2 +sky130_fd_sc_hd__a31o_4/B1 -> +sky130_fd_sc_hd__a31oi_1/A1 -> A2 A3 +sky130_fd_sc_hd__a31oi_1/A2 -> A1 A3 +sky130_fd_sc_hd__a31oi_1/A3 -> A1 A2 +sky130_fd_sc_hd__a31oi_1/B1 -> +sky130_fd_sc_hd__a31oi_2/A1 -> A2 A3 +sky130_fd_sc_hd__a31oi_2/A2 -> A1 A3 +sky130_fd_sc_hd__a31oi_2/A3 -> A1 A2 +sky130_fd_sc_hd__a31oi_2/B1 -> +sky130_fd_sc_hd__a31oi_4/A1 -> A2 A3 +sky130_fd_sc_hd__a31oi_4/A2 -> A1 A3 +sky130_fd_sc_hd__a31oi_4/A3 -> A1 A2 +sky130_fd_sc_hd__a31oi_4/B1 -> +sky130_fd_sc_hd__a32o_1/A1 -> A2 A3 +sky130_fd_sc_hd__a32o_1/A2 -> A1 A3 +sky130_fd_sc_hd__a32o_1/A3 -> A1 A2 +sky130_fd_sc_hd__a32o_1/B1 -> B2 +sky130_fd_sc_hd__a32o_1/B2 -> B1 +sky130_fd_sc_hd__a32o_2/A1 -> A2 A3 +sky130_fd_sc_hd__a32o_2/A2 -> A1 A3 +sky130_fd_sc_hd__a32o_2/A3 -> A1 A2 +sky130_fd_sc_hd__a32o_2/B1 -> B2 +sky130_fd_sc_hd__a32o_2/B2 -> B1 +sky130_fd_sc_hd__a32o_4/A1 -> A2 A3 +sky130_fd_sc_hd__a32o_4/A2 -> A1 A3 +sky130_fd_sc_hd__a32o_4/A3 -> A1 A2 +sky130_fd_sc_hd__a32o_4/B1 -> B2 +sky130_fd_sc_hd__a32o_4/B2 -> B1 +sky130_fd_sc_hd__a32oi_1/A1 -> A2 A3 +sky130_fd_sc_hd__a32oi_1/A2 -> A1 A3 +sky130_fd_sc_hd__a32oi_1/A3 -> A1 A2 +sky130_fd_sc_hd__a32oi_1/B1 -> B2 +sky130_fd_sc_hd__a32oi_1/B2 -> B1 +sky130_fd_sc_hd__a32oi_2/A1 -> A2 A3 +sky130_fd_sc_hd__a32oi_2/A2 -> A1 A3 +sky130_fd_sc_hd__a32oi_2/A3 -> A1 A2 +sky130_fd_sc_hd__a32oi_2/B1 -> B2 +sky130_fd_sc_hd__a32oi_2/B2 -> B1 +sky130_fd_sc_hd__a32oi_4/A1 -> A2 A3 +sky130_fd_sc_hd__a32oi_4/A2 -> A1 A3 +sky130_fd_sc_hd__a32oi_4/A3 -> A1 A2 +sky130_fd_sc_hd__a32oi_4/B1 -> B2 +sky130_fd_sc_hd__a32oi_4/B2 -> B1 +sky130_fd_sc_hd__a41o_1/A1 -> A2 A3 A4 +sky130_fd_sc_hd__a41o_1/A2 -> A1 A3 A4 +sky130_fd_sc_hd__a41o_1/A3 -> A1 A2 A4 +sky130_fd_sc_hd__a41o_1/A4 -> A1 A2 A3 +sky130_fd_sc_hd__a41o_1/B1 -> +sky130_fd_sc_hd__a41o_2/A1 -> A2 A3 A4 +sky130_fd_sc_hd__a41o_2/A2 -> A1 A3 A4 +sky130_fd_sc_hd__a41o_2/A3 -> A1 A2 A4 +sky130_fd_sc_hd__a41o_2/A4 -> A1 A2 A3 +sky130_fd_sc_hd__a41o_2/B1 -> +sky130_fd_sc_hd__a41o_4/A1 -> A2 A3 A4 +sky130_fd_sc_hd__a41o_4/A2 -> A1 A3 A4 +sky130_fd_sc_hd__a41o_4/A3 -> A1 A2 A4 +sky130_fd_sc_hd__a41o_4/A4 -> A1 A2 A3 +sky130_fd_sc_hd__a41o_4/B1 -> +sky130_fd_sc_hd__a41oi_1/A1 -> A2 A3 A4 +sky130_fd_sc_hd__a41oi_1/A2 -> A1 A3 A4 +sky130_fd_sc_hd__a41oi_1/A3 -> A1 A2 A4 +sky130_fd_sc_hd__a41oi_1/A4 -> A1 A2 A3 +sky130_fd_sc_hd__a41oi_1/B1 -> +sky130_fd_sc_hd__a41oi_2/A1 -> A2 A3 A4 +sky130_fd_sc_hd__a41oi_2/A2 -> A1 A3 A4 +sky130_fd_sc_hd__a41oi_2/A3 -> A1 A2 A4 +sky130_fd_sc_hd__a41oi_2/A4 -> A1 A2 A3 +sky130_fd_sc_hd__a41oi_2/B1 -> +sky130_fd_sc_hd__a41oi_4/A1 -> A2 A3 A4 +sky130_fd_sc_hd__a41oi_4/A2 -> A1 A3 A4 +sky130_fd_sc_hd__a41oi_4/A3 -> A1 A2 A4 +sky130_fd_sc_hd__a41oi_4/A4 -> A1 A2 A3 +sky130_fd_sc_hd__a41oi_4/B1 -> +[INFO RSZ-1000] sup +sky130_fd_sc_hd__and2_0/A -> B +[INFO RSZ-1000] sup +sky130_fd_sc_hd__and2_0/B -> A +sky130_fd_sc_hd__and2_1/A -> B +sky130_fd_sc_hd__and2_1/B -> A +sky130_fd_sc_hd__and2_2/A -> B +sky130_fd_sc_hd__and2_2/B -> A +sky130_fd_sc_hd__and2_4/A -> B +sky130_fd_sc_hd__and2_4/B -> A +sky130_fd_sc_hd__and2b_1/A_N -> +sky130_fd_sc_hd__and2b_1/B -> +sky130_fd_sc_hd__and2b_2/A_N -> +sky130_fd_sc_hd__and2b_2/B -> +sky130_fd_sc_hd__and2b_4/A_N -> +sky130_fd_sc_hd__and2b_4/B -> +sky130_fd_sc_hd__and3_1/A -> B C +sky130_fd_sc_hd__and3_1/B -> A C +sky130_fd_sc_hd__and3_1/C -> A B +sky130_fd_sc_hd__and3_2/A -> B C +sky130_fd_sc_hd__and3_2/B -> A C +sky130_fd_sc_hd__and3_2/C -> A B +sky130_fd_sc_hd__and3_4/A -> B C +sky130_fd_sc_hd__and3_4/B -> A C +sky130_fd_sc_hd__and3_4/C -> A B +sky130_fd_sc_hd__and3b_1/A_N -> +sky130_fd_sc_hd__and3b_1/B -> C +sky130_fd_sc_hd__and3b_1/C -> B +sky130_fd_sc_hd__and3b_2/A_N -> +sky130_fd_sc_hd__and3b_2/B -> C +sky130_fd_sc_hd__and3b_2/C -> B +sky130_fd_sc_hd__and3b_4/A_N -> +sky130_fd_sc_hd__and3b_4/B -> C +sky130_fd_sc_hd__and3b_4/C -> B +sky130_fd_sc_hd__and4_1/A -> B C D +sky130_fd_sc_hd__and4_1/B -> A C D +sky130_fd_sc_hd__and4_1/C -> A B D +sky130_fd_sc_hd__and4_1/D -> A B C +sky130_fd_sc_hd__and4_2/A -> B C D +sky130_fd_sc_hd__and4_2/B -> A C D +sky130_fd_sc_hd__and4_2/C -> A B D +sky130_fd_sc_hd__and4_2/D -> A B C +sky130_fd_sc_hd__and4_4/A -> B C D +sky130_fd_sc_hd__and4_4/B -> A C D +sky130_fd_sc_hd__and4_4/C -> A B D +sky130_fd_sc_hd__and4_4/D -> A B C +sky130_fd_sc_hd__and4b_1/A_N -> +sky130_fd_sc_hd__and4b_1/B -> C D +sky130_fd_sc_hd__and4b_1/C -> B D +sky130_fd_sc_hd__and4b_1/D -> B C +sky130_fd_sc_hd__and4b_2/A_N -> +sky130_fd_sc_hd__and4b_2/B -> C D +sky130_fd_sc_hd__and4b_2/C -> B D +sky130_fd_sc_hd__and4b_2/D -> B C +sky130_fd_sc_hd__and4b_4/A_N -> +sky130_fd_sc_hd__and4b_4/B -> C D +sky130_fd_sc_hd__and4b_4/C -> B D +sky130_fd_sc_hd__and4b_4/D -> B C +sky130_fd_sc_hd__and4bb_1/A_N -> B_N +sky130_fd_sc_hd__and4bb_1/B_N -> A_N +sky130_fd_sc_hd__and4bb_1/C -> D +sky130_fd_sc_hd__and4bb_1/D -> C +sky130_fd_sc_hd__and4bb_2/A_N -> B_N +sky130_fd_sc_hd__and4bb_2/B_N -> A_N +sky130_fd_sc_hd__and4bb_2/C -> D +sky130_fd_sc_hd__and4bb_2/D -> C +sky130_fd_sc_hd__and4bb_4/A_N -> B_N +sky130_fd_sc_hd__and4bb_4/B_N -> A_N +sky130_fd_sc_hd__and4bb_4/C -> D +sky130_fd_sc_hd__and4bb_4/D -> C +sky130_fd_sc_hd__buf_1/A -> +sky130_fd_sc_hd__buf_12/A -> +sky130_fd_sc_hd__buf_16/A -> +sky130_fd_sc_hd__buf_2/A -> +sky130_fd_sc_hd__buf_4/A -> +sky130_fd_sc_hd__buf_6/A -> +sky130_fd_sc_hd__buf_8/A -> +sky130_fd_sc_hd__bufbuf_16/A -> +sky130_fd_sc_hd__bufbuf_8/A -> +sky130_fd_sc_hd__bufinv_16/A -> +sky130_fd_sc_hd__bufinv_8/A -> +sky130_fd_sc_hd__clkbuf_1/A -> +sky130_fd_sc_hd__clkbuf_16/A -> +sky130_fd_sc_hd__clkbuf_2/A -> +sky130_fd_sc_hd__clkbuf_4/A -> +sky130_fd_sc_hd__clkbuf_8/A -> +sky130_fd_sc_hd__clkdlybuf4s15_1/A -> +sky130_fd_sc_hd__clkdlybuf4s15_2/A -> +sky130_fd_sc_hd__clkdlybuf4s18_1/A -> +sky130_fd_sc_hd__clkdlybuf4s18_2/A -> +sky130_fd_sc_hd__clkdlybuf4s25_1/A -> +sky130_fd_sc_hd__clkdlybuf4s25_2/A -> +sky130_fd_sc_hd__clkdlybuf4s50_1/A -> +sky130_fd_sc_hd__clkdlybuf4s50_2/A -> +sky130_fd_sc_hd__clkinv_1/A -> +sky130_fd_sc_hd__clkinv_16/A -> +sky130_fd_sc_hd__clkinv_2/A -> +sky130_fd_sc_hd__clkinv_4/A -> +sky130_fd_sc_hd__clkinv_8/A -> +sky130_fd_sc_hd__clkinvlp_2/A -> +sky130_fd_sc_hd__clkinvlp_4/A -> +sky130_fd_sc_hd__dfbbn_1/CLK_N -> +sky130_fd_sc_hd__dfbbn_1/D -> +sky130_fd_sc_hd__dfbbn_1/RESET_B -> +sky130_fd_sc_hd__dfbbn_1/SET_B -> +sky130_fd_sc_hd__dfbbn_2/CLK_N -> +sky130_fd_sc_hd__dfbbn_2/D -> +sky130_fd_sc_hd__dfbbn_2/RESET_B -> +sky130_fd_sc_hd__dfbbn_2/SET_B -> +sky130_fd_sc_hd__dfbbp_1/CLK -> +sky130_fd_sc_hd__dfbbp_1/D -> +sky130_fd_sc_hd__dfbbp_1/RESET_B -> +sky130_fd_sc_hd__dfbbp_1/SET_B -> +sky130_fd_sc_hd__dfrbp_1/CLK -> +sky130_fd_sc_hd__dfrbp_1/D -> +sky130_fd_sc_hd__dfrbp_1/RESET_B -> +sky130_fd_sc_hd__dfrbp_2/CLK -> +sky130_fd_sc_hd__dfrbp_2/D -> +sky130_fd_sc_hd__dfrbp_2/RESET_B -> +sky130_fd_sc_hd__dfrtn_1/CLK_N -> +sky130_fd_sc_hd__dfrtn_1/D -> +sky130_fd_sc_hd__dfrtn_1/RESET_B -> +sky130_fd_sc_hd__dfrtp_1/CLK -> +sky130_fd_sc_hd__dfrtp_1/D -> +sky130_fd_sc_hd__dfrtp_1/RESET_B -> +sky130_fd_sc_hd__dfrtp_2/CLK -> +sky130_fd_sc_hd__dfrtp_2/D -> +sky130_fd_sc_hd__dfrtp_2/RESET_B -> +sky130_fd_sc_hd__dfrtp_4/CLK -> +sky130_fd_sc_hd__dfrtp_4/D -> +sky130_fd_sc_hd__dfrtp_4/RESET_B -> +sky130_fd_sc_hd__dfsbp_1/CLK -> +sky130_fd_sc_hd__dfsbp_1/D -> +sky130_fd_sc_hd__dfsbp_1/SET_B -> +sky130_fd_sc_hd__dfsbp_2/CLK -> +sky130_fd_sc_hd__dfsbp_2/D -> +sky130_fd_sc_hd__dfsbp_2/SET_B -> +sky130_fd_sc_hd__dfstp_1/CLK -> +sky130_fd_sc_hd__dfstp_1/D -> +sky130_fd_sc_hd__dfstp_1/SET_B -> +sky130_fd_sc_hd__dfstp_2/CLK -> +sky130_fd_sc_hd__dfstp_2/D -> +sky130_fd_sc_hd__dfstp_2/SET_B -> +sky130_fd_sc_hd__dfstp_4/CLK -> +sky130_fd_sc_hd__dfstp_4/D -> +sky130_fd_sc_hd__dfstp_4/SET_B -> +sky130_fd_sc_hd__dfxbp_1/CLK -> +sky130_fd_sc_hd__dfxbp_1/D -> +sky130_fd_sc_hd__dfxbp_2/CLK -> +sky130_fd_sc_hd__dfxbp_2/D -> +sky130_fd_sc_hd__dfxtp_1/CLK -> +sky130_fd_sc_hd__dfxtp_1/D -> +sky130_fd_sc_hd__dfxtp_2/CLK -> +sky130_fd_sc_hd__dfxtp_2/D -> +sky130_fd_sc_hd__dfxtp_4/CLK -> +sky130_fd_sc_hd__dfxtp_4/D -> +sky130_fd_sc_hd__diode_2/DIODE -> +sky130_fd_sc_hd__dlclkp_1/CLK -> +sky130_fd_sc_hd__dlclkp_1/GATE -> +sky130_fd_sc_hd__dlclkp_2/CLK -> +sky130_fd_sc_hd__dlclkp_2/GATE -> +sky130_fd_sc_hd__dlclkp_4/CLK -> +sky130_fd_sc_hd__dlclkp_4/GATE -> +sky130_fd_sc_hd__dlrbn_1/D -> +sky130_fd_sc_hd__dlrbn_1/GATE_N -> +sky130_fd_sc_hd__dlrbn_1/RESET_B -> +sky130_fd_sc_hd__dlrbn_2/D -> +sky130_fd_sc_hd__dlrbn_2/GATE_N -> +sky130_fd_sc_hd__dlrbn_2/RESET_B -> +sky130_fd_sc_hd__dlrbp_1/D -> +sky130_fd_sc_hd__dlrbp_1/GATE -> +sky130_fd_sc_hd__dlrbp_1/RESET_B -> +sky130_fd_sc_hd__dlrbp_2/D -> +sky130_fd_sc_hd__dlrbp_2/GATE -> +sky130_fd_sc_hd__dlrbp_2/RESET_B -> +sky130_fd_sc_hd__dlrtn_1/D -> +sky130_fd_sc_hd__dlrtn_1/GATE_N -> +sky130_fd_sc_hd__dlrtn_1/RESET_B -> +sky130_fd_sc_hd__dlrtn_2/D -> +sky130_fd_sc_hd__dlrtn_2/GATE_N -> +sky130_fd_sc_hd__dlrtn_2/RESET_B -> +sky130_fd_sc_hd__dlrtn_4/D -> +sky130_fd_sc_hd__dlrtn_4/GATE_N -> +sky130_fd_sc_hd__dlrtn_4/RESET_B -> +sky130_fd_sc_hd__dlrtp_1/D -> +sky130_fd_sc_hd__dlrtp_1/GATE -> +sky130_fd_sc_hd__dlrtp_1/RESET_B -> +sky130_fd_sc_hd__dlrtp_2/D -> +sky130_fd_sc_hd__dlrtp_2/GATE -> +sky130_fd_sc_hd__dlrtp_2/RESET_B -> +sky130_fd_sc_hd__dlrtp_4/D -> +sky130_fd_sc_hd__dlrtp_4/GATE -> +sky130_fd_sc_hd__dlrtp_4/RESET_B -> +sky130_fd_sc_hd__dlxbn_1/D -> +sky130_fd_sc_hd__dlxbn_1/GATE_N -> +sky130_fd_sc_hd__dlxbn_2/D -> +sky130_fd_sc_hd__dlxbn_2/GATE_N -> +sky130_fd_sc_hd__dlxbp_1/D -> +sky130_fd_sc_hd__dlxbp_1/GATE -> +sky130_fd_sc_hd__dlxtn_1/D -> +sky130_fd_sc_hd__dlxtn_1/GATE_N -> +sky130_fd_sc_hd__dlxtn_2/D -> +sky130_fd_sc_hd__dlxtn_2/GATE_N -> +sky130_fd_sc_hd__dlxtn_4/D -> +sky130_fd_sc_hd__dlxtn_4/GATE_N -> +sky130_fd_sc_hd__dlxtp_1/D -> +sky130_fd_sc_hd__dlxtp_1/GATE -> +sky130_fd_sc_hd__dlygate4sd1_1/A -> +sky130_fd_sc_hd__dlygate4sd2_1/A -> +sky130_fd_sc_hd__dlygate4sd3_1/A -> +sky130_fd_sc_hd__dlymetal6s2s_1/A -> +sky130_fd_sc_hd__dlymetal6s4s_1/A -> +sky130_fd_sc_hd__dlymetal6s6s_1/A -> +sky130_fd_sc_hd__ebufn_1/A -> +sky130_fd_sc_hd__ebufn_1/TE_B -> +sky130_fd_sc_hd__ebufn_2/A -> +sky130_fd_sc_hd__ebufn_2/TE_B -> +sky130_fd_sc_hd__ebufn_4/A -> +sky130_fd_sc_hd__ebufn_4/TE_B -> +sky130_fd_sc_hd__ebufn_8/A -> +sky130_fd_sc_hd__ebufn_8/TE_B -> +sky130_fd_sc_hd__edfxbp_1/CLK -> +sky130_fd_sc_hd__edfxbp_1/D -> +sky130_fd_sc_hd__edfxbp_1/DE -> +sky130_fd_sc_hd__edfxtp_1/CLK -> +sky130_fd_sc_hd__edfxtp_1/D -> +sky130_fd_sc_hd__edfxtp_1/DE -> +sky130_fd_sc_hd__einvn_0/A -> +sky130_fd_sc_hd__einvn_0/TE_B -> +sky130_fd_sc_hd__einvn_1/A -> +sky130_fd_sc_hd__einvn_1/TE_B -> +sky130_fd_sc_hd__einvn_2/A -> +sky130_fd_sc_hd__einvn_2/TE_B -> +sky130_fd_sc_hd__einvn_4/A -> +sky130_fd_sc_hd__einvn_4/TE_B -> +sky130_fd_sc_hd__einvn_8/A -> +sky130_fd_sc_hd__einvn_8/TE_B -> +sky130_fd_sc_hd__einvp_1/A -> +sky130_fd_sc_hd__einvp_1/TE -> +sky130_fd_sc_hd__einvp_2/A -> +sky130_fd_sc_hd__einvp_2/TE -> +sky130_fd_sc_hd__einvp_4/A -> +sky130_fd_sc_hd__einvp_4/TE -> +sky130_fd_sc_hd__einvp_8/A -> +sky130_fd_sc_hd__einvp_8/TE -> +sky130_fd_sc_hd__fa_1/A -> +sky130_fd_sc_hd__fa_1/B -> +sky130_fd_sc_hd__fa_1/CIN -> +sky130_fd_sc_hd__fa_2/A -> +sky130_fd_sc_hd__fa_2/B -> +sky130_fd_sc_hd__fa_2/CIN -> +sky130_fd_sc_hd__fa_4/A -> +sky130_fd_sc_hd__fa_4/B -> +sky130_fd_sc_hd__fa_4/CIN -> +sky130_fd_sc_hd__fah_1/A -> +sky130_fd_sc_hd__fah_1/B -> +sky130_fd_sc_hd__fah_1/CI -> +sky130_fd_sc_hd__fahcin_1/A -> +sky130_fd_sc_hd__fahcin_1/B -> +sky130_fd_sc_hd__fahcin_1/CIN -> +sky130_fd_sc_hd__fahcon_1/A -> +sky130_fd_sc_hd__fahcon_1/B -> +sky130_fd_sc_hd__fahcon_1/CI -> +sky130_fd_sc_hd__ha_1/A -> +sky130_fd_sc_hd__ha_1/B -> +sky130_fd_sc_hd__ha_2/A -> +sky130_fd_sc_hd__ha_2/B -> +sky130_fd_sc_hd__ha_4/A -> +sky130_fd_sc_hd__ha_4/B -> +sky130_fd_sc_hd__inv_1/A -> +sky130_fd_sc_hd__inv_12/A -> +sky130_fd_sc_hd__inv_16/A -> +sky130_fd_sc_hd__inv_2/A -> +sky130_fd_sc_hd__inv_4/A -> +sky130_fd_sc_hd__inv_6/A -> +sky130_fd_sc_hd__inv_8/A -> +sky130_fd_sc_hd__lpflow_bleeder_1/SHORT -> +sky130_fd_sc_hd__lpflow_clkbufkapwr_1/A -> +sky130_fd_sc_hd__lpflow_clkbufkapwr_16/A -> +sky130_fd_sc_hd__lpflow_clkbufkapwr_2/A -> +sky130_fd_sc_hd__lpflow_clkbufkapwr_4/A -> +sky130_fd_sc_hd__lpflow_clkbufkapwr_8/A -> +sky130_fd_sc_hd__lpflow_clkinvkapwr_1/A -> +sky130_fd_sc_hd__lpflow_clkinvkapwr_16/A -> +sky130_fd_sc_hd__lpflow_clkinvkapwr_2/A -> +sky130_fd_sc_hd__lpflow_clkinvkapwr_4/A -> +sky130_fd_sc_hd__lpflow_clkinvkapwr_8/A -> +sky130_fd_sc_hd__lpflow_inputiso0n_1/A -> +sky130_fd_sc_hd__lpflow_inputiso0n_1/SLEEP_B -> +sky130_fd_sc_hd__lpflow_inputiso0p_1/A -> +sky130_fd_sc_hd__lpflow_inputiso0p_1/SLEEP -> +sky130_fd_sc_hd__lpflow_inputiso1n_1/A -> +sky130_fd_sc_hd__lpflow_inputiso1n_1/SLEEP_B -> +sky130_fd_sc_hd__lpflow_inputiso1p_1/A -> +sky130_fd_sc_hd__lpflow_inputiso1p_1/SLEEP -> +sky130_fd_sc_hd__lpflow_inputisolatch_1/D -> +sky130_fd_sc_hd__lpflow_inputisolatch_1/SLEEP_B -> +sky130_fd_sc_hd__lpflow_isobufsrc_1/A -> +sky130_fd_sc_hd__lpflow_isobufsrc_1/SLEEP -> +sky130_fd_sc_hd__lpflow_isobufsrc_16/A -> +sky130_fd_sc_hd__lpflow_isobufsrc_16/SLEEP -> +sky130_fd_sc_hd__lpflow_isobufsrc_2/A -> +sky130_fd_sc_hd__lpflow_isobufsrc_2/SLEEP -> +sky130_fd_sc_hd__lpflow_isobufsrc_4/A -> +sky130_fd_sc_hd__lpflow_isobufsrc_4/SLEEP -> +sky130_fd_sc_hd__lpflow_isobufsrc_8/A -> +sky130_fd_sc_hd__lpflow_isobufsrc_8/SLEEP -> +sky130_fd_sc_hd__lpflow_isobufsrckapwr_16/A -> +sky130_fd_sc_hd__lpflow_isobufsrckapwr_16/SLEEP -> +sky130_fd_sc_hd__lpflow_lsbuf_lh_hl_isowell_tap_1/A -> +sky130_fd_sc_hd__lpflow_lsbuf_lh_hl_isowell_tap_2/A -> +sky130_fd_sc_hd__lpflow_lsbuf_lh_hl_isowell_tap_4/A -> +sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_4/A -> +sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_tap_1/A -> +sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_tap_2/A -> +sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_tap_4/A -> +sky130_fd_sc_hd__maj3_1/A -> B C +sky130_fd_sc_hd__maj3_1/B -> A C +sky130_fd_sc_hd__maj3_1/C -> A B +sky130_fd_sc_hd__maj3_2/A -> B C +sky130_fd_sc_hd__maj3_2/B -> A C +sky130_fd_sc_hd__maj3_2/C -> A B +sky130_fd_sc_hd__maj3_4/A -> B C +sky130_fd_sc_hd__maj3_4/B -> A C +sky130_fd_sc_hd__maj3_4/C -> A B +sky130_fd_sc_hd__mux2_1/A0 -> +sky130_fd_sc_hd__mux2_1/A1 -> +sky130_fd_sc_hd__mux2_1/S -> +sky130_fd_sc_hd__mux2_2/A0 -> +sky130_fd_sc_hd__mux2_2/A1 -> +sky130_fd_sc_hd__mux2_2/S -> +sky130_fd_sc_hd__mux2_4/A0 -> +sky130_fd_sc_hd__mux2_4/A1 -> +sky130_fd_sc_hd__mux2_4/S -> +sky130_fd_sc_hd__mux2_8/A0 -> +sky130_fd_sc_hd__mux2_8/A1 -> +sky130_fd_sc_hd__mux2_8/S -> +sky130_fd_sc_hd__mux2i_1/A0 -> +sky130_fd_sc_hd__mux2i_1/A1 -> +sky130_fd_sc_hd__mux2i_1/S -> +sky130_fd_sc_hd__mux2i_2/A0 -> +sky130_fd_sc_hd__mux2i_2/A1 -> +sky130_fd_sc_hd__mux2i_2/S -> +sky130_fd_sc_hd__mux2i_4/A0 -> +sky130_fd_sc_hd__mux2i_4/A1 -> +sky130_fd_sc_hd__mux2i_4/S -> +sky130_fd_sc_hd__mux4_1/A0 -> +sky130_fd_sc_hd__mux4_1/A1 -> +sky130_fd_sc_hd__mux4_1/A2 -> +sky130_fd_sc_hd__mux4_1/A3 -> +sky130_fd_sc_hd__mux4_1/S0 -> +sky130_fd_sc_hd__mux4_1/S1 -> +sky130_fd_sc_hd__mux4_2/A0 -> +sky130_fd_sc_hd__mux4_2/A1 -> +sky130_fd_sc_hd__mux4_2/A2 -> +sky130_fd_sc_hd__mux4_2/A3 -> +sky130_fd_sc_hd__mux4_2/S0 -> +sky130_fd_sc_hd__mux4_2/S1 -> +sky130_fd_sc_hd__mux4_4/A0 -> +sky130_fd_sc_hd__mux4_4/A1 -> +sky130_fd_sc_hd__mux4_4/A2 -> +sky130_fd_sc_hd__mux4_4/A3 -> +sky130_fd_sc_hd__mux4_4/S0 -> +sky130_fd_sc_hd__mux4_4/S1 -> +sky130_fd_sc_hd__nand2_1/A -> B +sky130_fd_sc_hd__nand2_1/B -> A +sky130_fd_sc_hd__nand2_2/A -> B +sky130_fd_sc_hd__nand2_2/B -> A +sky130_fd_sc_hd__nand2_4/A -> B +sky130_fd_sc_hd__nand2_4/B -> A +sky130_fd_sc_hd__nand2_8/A -> B +sky130_fd_sc_hd__nand2_8/B -> A +sky130_fd_sc_hd__nand2b_1/A_N -> +sky130_fd_sc_hd__nand2b_1/B -> +sky130_fd_sc_hd__nand2b_2/A_N -> +sky130_fd_sc_hd__nand2b_2/B -> +sky130_fd_sc_hd__nand2b_4/A_N -> +sky130_fd_sc_hd__nand2b_4/B -> +sky130_fd_sc_hd__nand3_1/A -> B C +sky130_fd_sc_hd__nand3_1/B -> A C +sky130_fd_sc_hd__nand3_1/C -> A B +sky130_fd_sc_hd__nand3_2/A -> B C +sky130_fd_sc_hd__nand3_2/B -> A C +sky130_fd_sc_hd__nand3_2/C -> A B +sky130_fd_sc_hd__nand3_4/A -> B C +sky130_fd_sc_hd__nand3_4/B -> A C +sky130_fd_sc_hd__nand3_4/C -> A B +sky130_fd_sc_hd__nand3b_1/A_N -> +sky130_fd_sc_hd__nand3b_1/B -> C +sky130_fd_sc_hd__nand3b_1/C -> B +sky130_fd_sc_hd__nand3b_2/A_N -> +sky130_fd_sc_hd__nand3b_2/B -> C +sky130_fd_sc_hd__nand3b_2/C -> B +sky130_fd_sc_hd__nand3b_4/A_N -> +sky130_fd_sc_hd__nand3b_4/B -> C +sky130_fd_sc_hd__nand3b_4/C -> B +sky130_fd_sc_hd__nand4_1/A -> B C D +sky130_fd_sc_hd__nand4_1/B -> A C D +sky130_fd_sc_hd__nand4_1/C -> A B D +sky130_fd_sc_hd__nand4_1/D -> A B C +sky130_fd_sc_hd__nand4_2/A -> B C D +sky130_fd_sc_hd__nand4_2/B -> A C D +sky130_fd_sc_hd__nand4_2/C -> A B D +sky130_fd_sc_hd__nand4_2/D -> A B C +sky130_fd_sc_hd__nand4_4/A -> B C D +sky130_fd_sc_hd__nand4_4/B -> A C D +sky130_fd_sc_hd__nand4_4/C -> A B D +sky130_fd_sc_hd__nand4_4/D -> A B C +sky130_fd_sc_hd__nand4b_1/A_N -> +sky130_fd_sc_hd__nand4b_1/B -> C D +sky130_fd_sc_hd__nand4b_1/C -> B D +sky130_fd_sc_hd__nand4b_1/D -> B C +sky130_fd_sc_hd__nand4b_2/A_N -> +sky130_fd_sc_hd__nand4b_2/B -> C D +sky130_fd_sc_hd__nand4b_2/C -> B D +sky130_fd_sc_hd__nand4b_2/D -> B C +sky130_fd_sc_hd__nand4b_4/A_N -> +sky130_fd_sc_hd__nand4b_4/B -> C D +sky130_fd_sc_hd__nand4b_4/C -> B D +sky130_fd_sc_hd__nand4b_4/D -> B C +sky130_fd_sc_hd__nand4bb_1/A_N -> B_N +sky130_fd_sc_hd__nand4bb_1/B_N -> A_N +sky130_fd_sc_hd__nand4bb_1/C -> D +sky130_fd_sc_hd__nand4bb_1/D -> C +sky130_fd_sc_hd__nand4bb_2/A_N -> B_N +sky130_fd_sc_hd__nand4bb_2/B_N -> A_N +sky130_fd_sc_hd__nand4bb_2/C -> D +sky130_fd_sc_hd__nand4bb_2/D -> C +sky130_fd_sc_hd__nand4bb_4/A_N -> B_N +sky130_fd_sc_hd__nand4bb_4/B_N -> A_N +sky130_fd_sc_hd__nand4bb_4/C -> D +sky130_fd_sc_hd__nand4bb_4/D -> C +sky130_fd_sc_hd__nor2_1/A -> B +sky130_fd_sc_hd__nor2_1/B -> A +sky130_fd_sc_hd__nor2_2/A -> B +sky130_fd_sc_hd__nor2_2/B -> A +sky130_fd_sc_hd__nor2_4/A -> B +sky130_fd_sc_hd__nor2_4/B -> A +sky130_fd_sc_hd__nor2_8/A -> B +sky130_fd_sc_hd__nor2_8/B -> A +sky130_fd_sc_hd__nor2b_1/A -> +sky130_fd_sc_hd__nor2b_1/B_N -> +sky130_fd_sc_hd__nor2b_2/A -> +sky130_fd_sc_hd__nor2b_2/B_N -> +sky130_fd_sc_hd__nor2b_4/A -> +sky130_fd_sc_hd__nor2b_4/B_N -> +sky130_fd_sc_hd__nor3_1/A -> B C +sky130_fd_sc_hd__nor3_1/B -> A C +sky130_fd_sc_hd__nor3_1/C -> A B +sky130_fd_sc_hd__nor3_2/A -> B C +sky130_fd_sc_hd__nor3_2/B -> A C +sky130_fd_sc_hd__nor3_2/C -> A B +sky130_fd_sc_hd__nor3_4/A -> B C +sky130_fd_sc_hd__nor3_4/B -> A C +sky130_fd_sc_hd__nor3_4/C -> A B +sky130_fd_sc_hd__nor3b_1/A -> B +sky130_fd_sc_hd__nor3b_1/B -> A +sky130_fd_sc_hd__nor3b_1/C_N -> +sky130_fd_sc_hd__nor3b_2/A -> B +sky130_fd_sc_hd__nor3b_2/B -> A +sky130_fd_sc_hd__nor3b_2/C_N -> +sky130_fd_sc_hd__nor3b_4/A -> B +sky130_fd_sc_hd__nor3b_4/B -> A +sky130_fd_sc_hd__nor3b_4/C_N -> +sky130_fd_sc_hd__nor4_1/A -> B C D +sky130_fd_sc_hd__nor4_1/B -> A C D +sky130_fd_sc_hd__nor4_1/C -> A B D +sky130_fd_sc_hd__nor4_1/D -> A B C +sky130_fd_sc_hd__nor4_2/A -> B C D +sky130_fd_sc_hd__nor4_2/B -> A C D +sky130_fd_sc_hd__nor4_2/C -> A B D +sky130_fd_sc_hd__nor4_2/D -> A B C +sky130_fd_sc_hd__nor4_4/A -> B C D +sky130_fd_sc_hd__nor4_4/B -> A C D +sky130_fd_sc_hd__nor4_4/C -> A B D +sky130_fd_sc_hd__nor4_4/D -> A B C +sky130_fd_sc_hd__nor4b_1/A -> B C +sky130_fd_sc_hd__nor4b_1/B -> A C +sky130_fd_sc_hd__nor4b_1/C -> A B +sky130_fd_sc_hd__nor4b_1/D_N -> +sky130_fd_sc_hd__nor4b_2/A -> B C +sky130_fd_sc_hd__nor4b_2/B -> A C +sky130_fd_sc_hd__nor4b_2/C -> A B +sky130_fd_sc_hd__nor4b_2/D_N -> +sky130_fd_sc_hd__nor4b_4/A -> B C +sky130_fd_sc_hd__nor4b_4/B -> A C +sky130_fd_sc_hd__nor4b_4/C -> A B +sky130_fd_sc_hd__nor4b_4/D_N -> +sky130_fd_sc_hd__nor4bb_1/A -> B +sky130_fd_sc_hd__nor4bb_1/B -> A +sky130_fd_sc_hd__nor4bb_1/C_N -> D_N +sky130_fd_sc_hd__nor4bb_1/D_N -> C_N +sky130_fd_sc_hd__nor4bb_2/A -> B +sky130_fd_sc_hd__nor4bb_2/B -> A +sky130_fd_sc_hd__nor4bb_2/C_N -> D_N +sky130_fd_sc_hd__nor4bb_2/D_N -> C_N +sky130_fd_sc_hd__nor4bb_4/A -> B +sky130_fd_sc_hd__nor4bb_4/B -> A +sky130_fd_sc_hd__nor4bb_4/C_N -> D_N +sky130_fd_sc_hd__nor4bb_4/D_N -> C_N +sky130_fd_sc_hd__o2111a_1/A1 -> A2 +sky130_fd_sc_hd__o2111a_1/A2 -> A1 +sky130_fd_sc_hd__o2111a_1/B1 -> C1 D1 +sky130_fd_sc_hd__o2111a_1/C1 -> B1 D1 +sky130_fd_sc_hd__o2111a_1/D1 -> B1 C1 +sky130_fd_sc_hd__o2111a_2/A1 -> A2 +sky130_fd_sc_hd__o2111a_2/A2 -> A1 +sky130_fd_sc_hd__o2111a_2/B1 -> C1 D1 +sky130_fd_sc_hd__o2111a_2/C1 -> B1 D1 +sky130_fd_sc_hd__o2111a_2/D1 -> B1 C1 +sky130_fd_sc_hd__o2111a_4/A1 -> A2 +sky130_fd_sc_hd__o2111a_4/A2 -> A1 +sky130_fd_sc_hd__o2111a_4/B1 -> C1 D1 +sky130_fd_sc_hd__o2111a_4/C1 -> B1 D1 +sky130_fd_sc_hd__o2111a_4/D1 -> B1 C1 +sky130_fd_sc_hd__o2111ai_1/A1 -> A2 +sky130_fd_sc_hd__o2111ai_1/A2 -> A1 +sky130_fd_sc_hd__o2111ai_1/B1 -> C1 D1 +sky130_fd_sc_hd__o2111ai_1/C1 -> B1 D1 +sky130_fd_sc_hd__o2111ai_1/D1 -> B1 C1 +sky130_fd_sc_hd__o2111ai_2/A1 -> A2 +sky130_fd_sc_hd__o2111ai_2/A2 -> A1 +sky130_fd_sc_hd__o2111ai_2/B1 -> C1 D1 +sky130_fd_sc_hd__o2111ai_2/C1 -> B1 D1 +sky130_fd_sc_hd__o2111ai_2/D1 -> B1 C1 +sky130_fd_sc_hd__o2111ai_4/A1 -> A2 +sky130_fd_sc_hd__o2111ai_4/A2 -> A1 +sky130_fd_sc_hd__o2111ai_4/B1 -> C1 D1 +sky130_fd_sc_hd__o2111ai_4/C1 -> B1 D1 +sky130_fd_sc_hd__o2111ai_4/D1 -> B1 C1 +sky130_fd_sc_hd__o211a_1/A1 -> A2 +sky130_fd_sc_hd__o211a_1/A2 -> A1 +sky130_fd_sc_hd__o211a_1/B1 -> C1 +sky130_fd_sc_hd__o211a_1/C1 -> B1 +sky130_fd_sc_hd__o211a_2/A1 -> A2 +sky130_fd_sc_hd__o211a_2/A2 -> A1 +sky130_fd_sc_hd__o211a_2/B1 -> C1 +sky130_fd_sc_hd__o211a_2/C1 -> B1 +sky130_fd_sc_hd__o211a_4/A1 -> A2 +sky130_fd_sc_hd__o211a_4/A2 -> A1 +sky130_fd_sc_hd__o211a_4/B1 -> C1 +sky130_fd_sc_hd__o211a_4/C1 -> B1 +sky130_fd_sc_hd__o211ai_1/A1 -> A2 +sky130_fd_sc_hd__o211ai_1/A2 -> A1 +sky130_fd_sc_hd__o211ai_1/B1 -> C1 +sky130_fd_sc_hd__o211ai_1/C1 -> B1 +sky130_fd_sc_hd__o211ai_2/A1 -> A2 +sky130_fd_sc_hd__o211ai_2/A2 -> A1 +sky130_fd_sc_hd__o211ai_2/B1 -> C1 +sky130_fd_sc_hd__o211ai_2/C1 -> B1 +sky130_fd_sc_hd__o211ai_4/A1 -> A2 +sky130_fd_sc_hd__o211ai_4/A2 -> A1 +sky130_fd_sc_hd__o211ai_4/B1 -> C1 +sky130_fd_sc_hd__o211ai_4/C1 -> B1 +sky130_fd_sc_hd__o21a_1/A1 -> A2 +sky130_fd_sc_hd__o21a_1/A2 -> A1 +sky130_fd_sc_hd__o21a_1/B1 -> +sky130_fd_sc_hd__o21a_2/A1 -> A2 +sky130_fd_sc_hd__o21a_2/A2 -> A1 +sky130_fd_sc_hd__o21a_2/B1 -> +sky130_fd_sc_hd__o21a_4/A1 -> A2 +sky130_fd_sc_hd__o21a_4/A2 -> A1 +sky130_fd_sc_hd__o21a_4/B1 -> +sky130_fd_sc_hd__o21ai_0/A1 -> A2 +sky130_fd_sc_hd__o21ai_0/A2 -> A1 +sky130_fd_sc_hd__o21ai_0/B1 -> +sky130_fd_sc_hd__o21ai_1/A1 -> A2 +sky130_fd_sc_hd__o21ai_1/A2 -> A1 +sky130_fd_sc_hd__o21ai_1/B1 -> +sky130_fd_sc_hd__o21ai_2/A1 -> A2 +sky130_fd_sc_hd__o21ai_2/A2 -> A1 +sky130_fd_sc_hd__o21ai_2/B1 -> +sky130_fd_sc_hd__o21ai_4/A1 -> A2 +sky130_fd_sc_hd__o21ai_4/A2 -> A1 +sky130_fd_sc_hd__o21ai_4/B1 -> +sky130_fd_sc_hd__o21ba_1/A1 -> A2 +sky130_fd_sc_hd__o21ba_1/A2 -> A1 +sky130_fd_sc_hd__o21ba_1/B1_N -> +sky130_fd_sc_hd__o21ba_2/A1 -> A2 +sky130_fd_sc_hd__o21ba_2/A2 -> A1 +sky130_fd_sc_hd__o21ba_2/B1_N -> +sky130_fd_sc_hd__o21ba_4/A1 -> A2 +sky130_fd_sc_hd__o21ba_4/A2 -> A1 +sky130_fd_sc_hd__o21ba_4/B1_N -> +sky130_fd_sc_hd__o21bai_1/A1 -> A2 +sky130_fd_sc_hd__o21bai_1/A2 -> A1 +sky130_fd_sc_hd__o21bai_1/B1_N -> +sky130_fd_sc_hd__o21bai_2/A1 -> A2 +sky130_fd_sc_hd__o21bai_2/A2 -> A1 +sky130_fd_sc_hd__o21bai_2/B1_N -> +sky130_fd_sc_hd__o21bai_4/A1 -> A2 +sky130_fd_sc_hd__o21bai_4/A2 -> A1 +sky130_fd_sc_hd__o21bai_4/B1_N -> +sky130_fd_sc_hd__o221a_1/A1 -> A2 +sky130_fd_sc_hd__o221a_1/A2 -> A1 +sky130_fd_sc_hd__o221a_1/B1 -> B2 +sky130_fd_sc_hd__o221a_1/B2 -> B1 +sky130_fd_sc_hd__o221a_1/C1 -> +sky130_fd_sc_hd__o221a_2/A1 -> A2 +sky130_fd_sc_hd__o221a_2/A2 -> A1 +sky130_fd_sc_hd__o221a_2/B1 -> B2 +sky130_fd_sc_hd__o221a_2/B2 -> B1 +sky130_fd_sc_hd__o221a_2/C1 -> +sky130_fd_sc_hd__o221a_4/A1 -> A2 +sky130_fd_sc_hd__o221a_4/A2 -> A1 +sky130_fd_sc_hd__o221a_4/B1 -> B2 +sky130_fd_sc_hd__o221a_4/B2 -> B1 +sky130_fd_sc_hd__o221a_4/C1 -> +sky130_fd_sc_hd__o221ai_1/A1 -> A2 +sky130_fd_sc_hd__o221ai_1/A2 -> A1 +sky130_fd_sc_hd__o221ai_1/B1 -> B2 +sky130_fd_sc_hd__o221ai_1/B2 -> B1 +sky130_fd_sc_hd__o221ai_1/C1 -> +sky130_fd_sc_hd__o221ai_2/A1 -> A2 +sky130_fd_sc_hd__o221ai_2/A2 -> A1 +sky130_fd_sc_hd__o221ai_2/B1 -> B2 +sky130_fd_sc_hd__o221ai_2/B2 -> B1 +sky130_fd_sc_hd__o221ai_2/C1 -> +sky130_fd_sc_hd__o221ai_4/A1 -> A2 +sky130_fd_sc_hd__o221ai_4/A2 -> A1 +sky130_fd_sc_hd__o221ai_4/B1 -> B2 +sky130_fd_sc_hd__o221ai_4/B2 -> B1 +sky130_fd_sc_hd__o221ai_4/C1 -> +sky130_fd_sc_hd__o22a_1/A1 -> A2 +sky130_fd_sc_hd__o22a_1/A2 -> A1 +sky130_fd_sc_hd__o22a_1/B1 -> B2 +sky130_fd_sc_hd__o22a_1/B2 -> B1 +sky130_fd_sc_hd__o22a_2/A1 -> A2 +sky130_fd_sc_hd__o22a_2/A2 -> A1 +sky130_fd_sc_hd__o22a_2/B1 -> B2 +sky130_fd_sc_hd__o22a_2/B2 -> B1 +sky130_fd_sc_hd__o22a_4/A1 -> A2 +sky130_fd_sc_hd__o22a_4/A2 -> A1 +sky130_fd_sc_hd__o22a_4/B1 -> B2 +sky130_fd_sc_hd__o22a_4/B2 -> B1 +sky130_fd_sc_hd__o22ai_1/A1 -> A2 +sky130_fd_sc_hd__o22ai_1/A2 -> A1 +sky130_fd_sc_hd__o22ai_1/B1 -> B2 +sky130_fd_sc_hd__o22ai_1/B2 -> B1 +sky130_fd_sc_hd__o22ai_2/A1 -> A2 +sky130_fd_sc_hd__o22ai_2/A2 -> A1 +sky130_fd_sc_hd__o22ai_2/B1 -> B2 +sky130_fd_sc_hd__o22ai_2/B2 -> B1 +sky130_fd_sc_hd__o22ai_4/A1 -> A2 +sky130_fd_sc_hd__o22ai_4/A2 -> A1 +sky130_fd_sc_hd__o22ai_4/B1 -> B2 +sky130_fd_sc_hd__o22ai_4/B2 -> B1 +sky130_fd_sc_hd__o2bb2a_1/A1_N -> A2_N +sky130_fd_sc_hd__o2bb2a_1/A2_N -> A1_N +sky130_fd_sc_hd__o2bb2a_1/B1 -> B2 +sky130_fd_sc_hd__o2bb2a_1/B2 -> B1 +sky130_fd_sc_hd__o2bb2a_2/A1_N -> A2_N +sky130_fd_sc_hd__o2bb2a_2/A2_N -> A1_N +sky130_fd_sc_hd__o2bb2a_2/B1 -> B2 +sky130_fd_sc_hd__o2bb2a_2/B2 -> B1 +sky130_fd_sc_hd__o2bb2a_4/A1_N -> A2_N +sky130_fd_sc_hd__o2bb2a_4/A2_N -> A1_N +sky130_fd_sc_hd__o2bb2a_4/B1 -> B2 +sky130_fd_sc_hd__o2bb2a_4/B2 -> B1 +sky130_fd_sc_hd__o2bb2ai_1/A1_N -> A2_N +sky130_fd_sc_hd__o2bb2ai_1/A2_N -> A1_N +sky130_fd_sc_hd__o2bb2ai_1/B1 -> B2 +sky130_fd_sc_hd__o2bb2ai_1/B2 -> B1 +sky130_fd_sc_hd__o2bb2ai_2/A1_N -> A2_N +sky130_fd_sc_hd__o2bb2ai_2/A2_N -> A1_N +sky130_fd_sc_hd__o2bb2ai_2/B1 -> B2 +sky130_fd_sc_hd__o2bb2ai_2/B2 -> B1 +sky130_fd_sc_hd__o2bb2ai_4/A1_N -> A2_N +sky130_fd_sc_hd__o2bb2ai_4/A2_N -> A1_N +sky130_fd_sc_hd__o2bb2ai_4/B1 -> B2 +sky130_fd_sc_hd__o2bb2ai_4/B2 -> B1 +sky130_fd_sc_hd__o311a_1/A1 -> A2 A3 +sky130_fd_sc_hd__o311a_1/A2 -> A1 A3 +sky130_fd_sc_hd__o311a_1/A3 -> A1 A2 +sky130_fd_sc_hd__o311a_1/B1 -> C1 +sky130_fd_sc_hd__o311a_1/C1 -> B1 +sky130_fd_sc_hd__o311a_2/A1 -> A2 A3 +sky130_fd_sc_hd__o311a_2/A2 -> A1 A3 +sky130_fd_sc_hd__o311a_2/A3 -> A1 A2 +sky130_fd_sc_hd__o311a_2/B1 -> C1 +sky130_fd_sc_hd__o311a_2/C1 -> B1 +sky130_fd_sc_hd__o311a_4/A1 -> A2 A3 +sky130_fd_sc_hd__o311a_4/A2 -> A1 A3 +sky130_fd_sc_hd__o311a_4/A3 -> A1 A2 +sky130_fd_sc_hd__o311a_4/B1 -> C1 +sky130_fd_sc_hd__o311a_4/C1 -> B1 +sky130_fd_sc_hd__o311ai_0/A1 -> A2 A3 +sky130_fd_sc_hd__o311ai_0/A2 -> A1 A3 +sky130_fd_sc_hd__o311ai_0/A3 -> A1 A2 +sky130_fd_sc_hd__o311ai_0/B1 -> C1 +sky130_fd_sc_hd__o311ai_0/C1 -> B1 +sky130_fd_sc_hd__o311ai_1/A1 -> A2 A3 +sky130_fd_sc_hd__o311ai_1/A2 -> A1 A3 +sky130_fd_sc_hd__o311ai_1/A3 -> A1 A2 +sky130_fd_sc_hd__o311ai_1/B1 -> C1 +sky130_fd_sc_hd__o311ai_1/C1 -> B1 +sky130_fd_sc_hd__o311ai_2/A1 -> A2 A3 +sky130_fd_sc_hd__o311ai_2/A2 -> A1 A3 +sky130_fd_sc_hd__o311ai_2/A3 -> A1 A2 +sky130_fd_sc_hd__o311ai_2/B1 -> C1 +sky130_fd_sc_hd__o311ai_2/C1 -> B1 +sky130_fd_sc_hd__o311ai_4/A1 -> A2 A3 +sky130_fd_sc_hd__o311ai_4/A2 -> A1 A3 +sky130_fd_sc_hd__o311ai_4/A3 -> A1 A2 +sky130_fd_sc_hd__o311ai_4/B1 -> C1 +sky130_fd_sc_hd__o311ai_4/C1 -> B1 +sky130_fd_sc_hd__o31a_1/A1 -> A2 A3 +sky130_fd_sc_hd__o31a_1/A2 -> A1 A3 +sky130_fd_sc_hd__o31a_1/A3 -> A1 A2 +sky130_fd_sc_hd__o31a_1/B1 -> +sky130_fd_sc_hd__o31a_2/A1 -> A2 A3 +sky130_fd_sc_hd__o31a_2/A2 -> A1 A3 +sky130_fd_sc_hd__o31a_2/A3 -> A1 A2 +sky130_fd_sc_hd__o31a_2/B1 -> +sky130_fd_sc_hd__o31a_4/A1 -> A2 A3 +sky130_fd_sc_hd__o31a_4/A2 -> A1 A3 +sky130_fd_sc_hd__o31a_4/A3 -> A1 A2 +sky130_fd_sc_hd__o31a_4/B1 -> +sky130_fd_sc_hd__o31ai_1/A1 -> A2 A3 +sky130_fd_sc_hd__o31ai_1/A2 -> A1 A3 +sky130_fd_sc_hd__o31ai_1/A3 -> A1 A2 +sky130_fd_sc_hd__o31ai_1/B1 -> +sky130_fd_sc_hd__o31ai_2/A1 -> A2 A3 +sky130_fd_sc_hd__o31ai_2/A2 -> A1 A3 +sky130_fd_sc_hd__o31ai_2/A3 -> A1 A2 +sky130_fd_sc_hd__o31ai_2/B1 -> +sky130_fd_sc_hd__o31ai_4/A1 -> A2 A3 +sky130_fd_sc_hd__o31ai_4/A2 -> A1 A3 +sky130_fd_sc_hd__o31ai_4/A3 -> A1 A2 +sky130_fd_sc_hd__o31ai_4/B1 -> +sky130_fd_sc_hd__o32a_1/A1 -> A2 A3 +sky130_fd_sc_hd__o32a_1/A2 -> A1 A3 +sky130_fd_sc_hd__o32a_1/A3 -> A1 A2 +sky130_fd_sc_hd__o32a_1/B1 -> B2 +sky130_fd_sc_hd__o32a_1/B2 -> B1 +sky130_fd_sc_hd__o32a_2/A1 -> A2 A3 +sky130_fd_sc_hd__o32a_2/A2 -> A1 A3 +sky130_fd_sc_hd__o32a_2/A3 -> A1 A2 +sky130_fd_sc_hd__o32a_2/B1 -> B2 +sky130_fd_sc_hd__o32a_2/B2 -> B1 +sky130_fd_sc_hd__o32a_4/A1 -> A2 A3 +sky130_fd_sc_hd__o32a_4/A2 -> A1 A3 +sky130_fd_sc_hd__o32a_4/A3 -> A1 A2 +sky130_fd_sc_hd__o32a_4/B1 -> B2 +sky130_fd_sc_hd__o32a_4/B2 -> B1 +sky130_fd_sc_hd__o32ai_1/A1 -> A2 A3 +sky130_fd_sc_hd__o32ai_1/A2 -> A1 A3 +sky130_fd_sc_hd__o32ai_1/A3 -> A1 A2 +sky130_fd_sc_hd__o32ai_1/B1 -> B2 +sky130_fd_sc_hd__o32ai_1/B2 -> B1 +sky130_fd_sc_hd__o32ai_2/A1 -> A2 A3 +sky130_fd_sc_hd__o32ai_2/A2 -> A1 A3 +sky130_fd_sc_hd__o32ai_2/A3 -> A1 A2 +sky130_fd_sc_hd__o32ai_2/B1 -> B2 +sky130_fd_sc_hd__o32ai_2/B2 -> B1 +sky130_fd_sc_hd__o32ai_4/A1 -> A2 A3 +sky130_fd_sc_hd__o32ai_4/A2 -> A1 A3 +sky130_fd_sc_hd__o32ai_4/A3 -> A1 A2 +sky130_fd_sc_hd__o32ai_4/B1 -> B2 +sky130_fd_sc_hd__o32ai_4/B2 -> B1 +sky130_fd_sc_hd__o41a_1/A1 -> A2 A3 A4 +sky130_fd_sc_hd__o41a_1/A2 -> A1 A3 A4 +sky130_fd_sc_hd__o41a_1/A3 -> A1 A2 A4 +sky130_fd_sc_hd__o41a_1/A4 -> A1 A2 A3 +sky130_fd_sc_hd__o41a_1/B1 -> +sky130_fd_sc_hd__o41a_2/A1 -> A2 A3 A4 +sky130_fd_sc_hd__o41a_2/A2 -> A1 A3 A4 +sky130_fd_sc_hd__o41a_2/A3 -> A1 A2 A4 +sky130_fd_sc_hd__o41a_2/A4 -> A1 A2 A3 +sky130_fd_sc_hd__o41a_2/B1 -> +sky130_fd_sc_hd__o41a_4/A1 -> A2 A3 A4 +sky130_fd_sc_hd__o41a_4/A2 -> A1 A3 A4 +sky130_fd_sc_hd__o41a_4/A3 -> A1 A2 A4 +sky130_fd_sc_hd__o41a_4/A4 -> A1 A2 A3 +sky130_fd_sc_hd__o41a_4/B1 -> +sky130_fd_sc_hd__o41ai_1/A1 -> A2 A3 A4 +sky130_fd_sc_hd__o41ai_1/A2 -> A1 A3 A4 +sky130_fd_sc_hd__o41ai_1/A3 -> A1 A2 A4 +sky130_fd_sc_hd__o41ai_1/A4 -> A1 A2 A3 +sky130_fd_sc_hd__o41ai_1/B1 -> +sky130_fd_sc_hd__o41ai_2/A1 -> A2 A3 A4 +sky130_fd_sc_hd__o41ai_2/A2 -> A1 A3 A4 +sky130_fd_sc_hd__o41ai_2/A3 -> A1 A2 A4 +sky130_fd_sc_hd__o41ai_2/A4 -> A1 A2 A3 +sky130_fd_sc_hd__o41ai_2/B1 -> +sky130_fd_sc_hd__o41ai_4/A1 -> A2 A3 A4 +sky130_fd_sc_hd__o41ai_4/A2 -> A1 A3 A4 +sky130_fd_sc_hd__o41ai_4/A3 -> A1 A2 A4 +sky130_fd_sc_hd__o41ai_4/A4 -> A1 A2 A3 +sky130_fd_sc_hd__o41ai_4/B1 -> +sky130_fd_sc_hd__or2_0/A -> B +sky130_fd_sc_hd__or2_0/B -> A +sky130_fd_sc_hd__or2_1/A -> B +sky130_fd_sc_hd__or2_1/B -> A +sky130_fd_sc_hd__or2_2/A -> B +sky130_fd_sc_hd__or2_2/B -> A +sky130_fd_sc_hd__or2_4/A -> B +sky130_fd_sc_hd__or2_4/B -> A +sky130_fd_sc_hd__or2b_1/A -> +sky130_fd_sc_hd__or2b_1/B_N -> +sky130_fd_sc_hd__or2b_2/A -> +sky130_fd_sc_hd__or2b_2/B_N -> +sky130_fd_sc_hd__or2b_4/A -> +sky130_fd_sc_hd__or2b_4/B_N -> +sky130_fd_sc_hd__or3_1/A -> B C +sky130_fd_sc_hd__or3_1/B -> A C +sky130_fd_sc_hd__or3_1/C -> A B +sky130_fd_sc_hd__or3_2/A -> B C +sky130_fd_sc_hd__or3_2/B -> A C +sky130_fd_sc_hd__or3_2/C -> A B +sky130_fd_sc_hd__or3_4/A -> B C +sky130_fd_sc_hd__or3_4/B -> A C +sky130_fd_sc_hd__or3_4/C -> A B +sky130_fd_sc_hd__or3b_1/A -> B +sky130_fd_sc_hd__or3b_1/B -> A +sky130_fd_sc_hd__or3b_1/C_N -> +sky130_fd_sc_hd__or3b_2/A -> B +sky130_fd_sc_hd__or3b_2/B -> A +sky130_fd_sc_hd__or3b_2/C_N -> +sky130_fd_sc_hd__or3b_4/A -> B +sky130_fd_sc_hd__or3b_4/B -> A +sky130_fd_sc_hd__or3b_4/C_N -> +sky130_fd_sc_hd__or4_1/A -> B C D +sky130_fd_sc_hd__or4_1/B -> A C D +sky130_fd_sc_hd__or4_1/C -> A B D +sky130_fd_sc_hd__or4_1/D -> A B C +sky130_fd_sc_hd__or4_2/A -> B C D +sky130_fd_sc_hd__or4_2/B -> A C D +sky130_fd_sc_hd__or4_2/C -> A B D +sky130_fd_sc_hd__or4_2/D -> A B C +sky130_fd_sc_hd__or4_4/A -> B C D +sky130_fd_sc_hd__or4_4/B -> A C D +sky130_fd_sc_hd__or4_4/C -> A B D +sky130_fd_sc_hd__or4_4/D -> A B C +sky130_fd_sc_hd__or4b_1/A -> B C +sky130_fd_sc_hd__or4b_1/B -> A C +sky130_fd_sc_hd__or4b_1/C -> A B +sky130_fd_sc_hd__or4b_1/D_N -> +sky130_fd_sc_hd__or4b_2/A -> B C +sky130_fd_sc_hd__or4b_2/B -> A C +sky130_fd_sc_hd__or4b_2/C -> A B +sky130_fd_sc_hd__or4b_2/D_N -> +sky130_fd_sc_hd__or4b_4/A -> B C +sky130_fd_sc_hd__or4b_4/B -> A C +sky130_fd_sc_hd__or4b_4/C -> A B +sky130_fd_sc_hd__or4b_4/D_N -> +sky130_fd_sc_hd__or4bb_1/A -> B +sky130_fd_sc_hd__or4bb_1/B -> A +sky130_fd_sc_hd__or4bb_1/C_N -> D_N +sky130_fd_sc_hd__or4bb_1/D_N -> C_N +sky130_fd_sc_hd__or4bb_2/A -> B +sky130_fd_sc_hd__or4bb_2/B -> A +sky130_fd_sc_hd__or4bb_2/C_N -> D_N +sky130_fd_sc_hd__or4bb_2/D_N -> C_N +sky130_fd_sc_hd__or4bb_4/A -> B +sky130_fd_sc_hd__or4bb_4/B -> A +sky130_fd_sc_hd__or4bb_4/C_N -> D_N +sky130_fd_sc_hd__or4bb_4/D_N -> C_N +sky130_fd_sc_hd__probe_p_8/A -> +sky130_fd_sc_hd__probec_p_8/A -> +sky130_fd_sc_hd__sdfbbn_1/CLK_N -> +sky130_fd_sc_hd__sdfbbn_1/D -> +sky130_fd_sc_hd__sdfbbn_1/RESET_B -> +sky130_fd_sc_hd__sdfbbn_1/SCD -> +sky130_fd_sc_hd__sdfbbn_1/SCE -> +sky130_fd_sc_hd__sdfbbn_1/SET_B -> +sky130_fd_sc_hd__sdfbbn_2/CLK_N -> +sky130_fd_sc_hd__sdfbbn_2/D -> +sky130_fd_sc_hd__sdfbbn_2/RESET_B -> +sky130_fd_sc_hd__sdfbbn_2/SCD -> +sky130_fd_sc_hd__sdfbbn_2/SCE -> +sky130_fd_sc_hd__sdfbbn_2/SET_B -> +sky130_fd_sc_hd__sdfbbp_1/CLK -> +sky130_fd_sc_hd__sdfbbp_1/D -> +sky130_fd_sc_hd__sdfbbp_1/RESET_B -> +sky130_fd_sc_hd__sdfbbp_1/SCD -> +sky130_fd_sc_hd__sdfbbp_1/SCE -> +sky130_fd_sc_hd__sdfbbp_1/SET_B -> +sky130_fd_sc_hd__sdfrbp_1/CLK -> +sky130_fd_sc_hd__sdfrbp_1/D -> +sky130_fd_sc_hd__sdfrbp_1/RESET_B -> +sky130_fd_sc_hd__sdfrbp_1/SCD -> +sky130_fd_sc_hd__sdfrbp_1/SCE -> +sky130_fd_sc_hd__sdfrbp_2/CLK -> +sky130_fd_sc_hd__sdfrbp_2/D -> +sky130_fd_sc_hd__sdfrbp_2/RESET_B -> +sky130_fd_sc_hd__sdfrbp_2/SCD -> +sky130_fd_sc_hd__sdfrbp_2/SCE -> +sky130_fd_sc_hd__sdfrtn_1/CLK_N -> +sky130_fd_sc_hd__sdfrtn_1/D -> +sky130_fd_sc_hd__sdfrtn_1/RESET_B -> +sky130_fd_sc_hd__sdfrtn_1/SCD -> +sky130_fd_sc_hd__sdfrtn_1/SCE -> +sky130_fd_sc_hd__sdfrtp_1/CLK -> +sky130_fd_sc_hd__sdfrtp_1/D -> +sky130_fd_sc_hd__sdfrtp_1/RESET_B -> +sky130_fd_sc_hd__sdfrtp_1/SCD -> +sky130_fd_sc_hd__sdfrtp_1/SCE -> +sky130_fd_sc_hd__sdfrtp_2/CLK -> +sky130_fd_sc_hd__sdfrtp_2/D -> +sky130_fd_sc_hd__sdfrtp_2/RESET_B -> +sky130_fd_sc_hd__sdfrtp_2/SCD -> +sky130_fd_sc_hd__sdfrtp_2/SCE -> +sky130_fd_sc_hd__sdfrtp_4/CLK -> +sky130_fd_sc_hd__sdfrtp_4/D -> +sky130_fd_sc_hd__sdfrtp_4/RESET_B -> +sky130_fd_sc_hd__sdfrtp_4/SCD -> +sky130_fd_sc_hd__sdfrtp_4/SCE -> +sky130_fd_sc_hd__sdfsbp_1/CLK -> +sky130_fd_sc_hd__sdfsbp_1/D -> +sky130_fd_sc_hd__sdfsbp_1/SCD -> +sky130_fd_sc_hd__sdfsbp_1/SCE -> +sky130_fd_sc_hd__sdfsbp_1/SET_B -> +sky130_fd_sc_hd__sdfsbp_2/CLK -> +sky130_fd_sc_hd__sdfsbp_2/D -> +sky130_fd_sc_hd__sdfsbp_2/SCD -> +sky130_fd_sc_hd__sdfsbp_2/SCE -> +sky130_fd_sc_hd__sdfsbp_2/SET_B -> +sky130_fd_sc_hd__sdfstp_1/CLK -> +sky130_fd_sc_hd__sdfstp_1/D -> +sky130_fd_sc_hd__sdfstp_1/SCD -> +sky130_fd_sc_hd__sdfstp_1/SCE -> +sky130_fd_sc_hd__sdfstp_1/SET_B -> +sky130_fd_sc_hd__sdfstp_2/CLK -> +sky130_fd_sc_hd__sdfstp_2/D -> +sky130_fd_sc_hd__sdfstp_2/SCD -> +sky130_fd_sc_hd__sdfstp_2/SCE -> +sky130_fd_sc_hd__sdfstp_2/SET_B -> +sky130_fd_sc_hd__sdfstp_4/CLK -> +sky130_fd_sc_hd__sdfstp_4/D -> +sky130_fd_sc_hd__sdfstp_4/SCD -> +sky130_fd_sc_hd__sdfstp_4/SCE -> +sky130_fd_sc_hd__sdfstp_4/SET_B -> +sky130_fd_sc_hd__sdfxbp_1/CLK -> +sky130_fd_sc_hd__sdfxbp_1/D -> +sky130_fd_sc_hd__sdfxbp_1/SCD -> +sky130_fd_sc_hd__sdfxbp_1/SCE -> +sky130_fd_sc_hd__sdfxbp_2/CLK -> +sky130_fd_sc_hd__sdfxbp_2/D -> +sky130_fd_sc_hd__sdfxbp_2/SCD -> +sky130_fd_sc_hd__sdfxbp_2/SCE -> +sky130_fd_sc_hd__sdfxtp_1/CLK -> +sky130_fd_sc_hd__sdfxtp_1/D -> +sky130_fd_sc_hd__sdfxtp_1/SCD -> +sky130_fd_sc_hd__sdfxtp_1/SCE -> +sky130_fd_sc_hd__sdfxtp_2/CLK -> +sky130_fd_sc_hd__sdfxtp_2/D -> +sky130_fd_sc_hd__sdfxtp_2/SCD -> +sky130_fd_sc_hd__sdfxtp_2/SCE -> +sky130_fd_sc_hd__sdfxtp_4/CLK -> +sky130_fd_sc_hd__sdfxtp_4/D -> +sky130_fd_sc_hd__sdfxtp_4/SCD -> +sky130_fd_sc_hd__sdfxtp_4/SCE -> +sky130_fd_sc_hd__sdlclkp_1/CLK -> +sky130_fd_sc_hd__sdlclkp_1/GATE -> +sky130_fd_sc_hd__sdlclkp_1/SCE -> +sky130_fd_sc_hd__sdlclkp_2/CLK -> +sky130_fd_sc_hd__sdlclkp_2/GATE -> +sky130_fd_sc_hd__sdlclkp_2/SCE -> +sky130_fd_sc_hd__sdlclkp_4/CLK -> +sky130_fd_sc_hd__sdlclkp_4/GATE -> +sky130_fd_sc_hd__sdlclkp_4/SCE -> +sky130_fd_sc_hd__sedfxbp_1/CLK -> +sky130_fd_sc_hd__sedfxbp_1/D -> +sky130_fd_sc_hd__sedfxbp_1/DE -> +sky130_fd_sc_hd__sedfxbp_1/SCD -> +sky130_fd_sc_hd__sedfxbp_1/SCE -> +sky130_fd_sc_hd__sedfxbp_2/CLK -> +sky130_fd_sc_hd__sedfxbp_2/D -> +sky130_fd_sc_hd__sedfxbp_2/DE -> +sky130_fd_sc_hd__sedfxbp_2/SCD -> +sky130_fd_sc_hd__sedfxbp_2/SCE -> +sky130_fd_sc_hd__sedfxtp_1/CLK -> +sky130_fd_sc_hd__sedfxtp_1/D -> +sky130_fd_sc_hd__sedfxtp_1/DE -> +sky130_fd_sc_hd__sedfxtp_1/SCD -> +sky130_fd_sc_hd__sedfxtp_1/SCE -> +sky130_fd_sc_hd__sedfxtp_2/CLK -> +sky130_fd_sc_hd__sedfxtp_2/D -> +sky130_fd_sc_hd__sedfxtp_2/DE -> +sky130_fd_sc_hd__sedfxtp_2/SCD -> +sky130_fd_sc_hd__sedfxtp_2/SCE -> +sky130_fd_sc_hd__sedfxtp_4/CLK -> +sky130_fd_sc_hd__sedfxtp_4/D -> +sky130_fd_sc_hd__sedfxtp_4/DE -> +sky130_fd_sc_hd__sedfxtp_4/SCD -> +sky130_fd_sc_hd__sedfxtp_4/SCE -> +sky130_fd_sc_hd__xnor2_1/A -> B +sky130_fd_sc_hd__xnor2_1/B -> A +sky130_fd_sc_hd__xnor2_2/A -> B +sky130_fd_sc_hd__xnor2_2/B -> A +sky130_fd_sc_hd__xnor2_4/A -> B +sky130_fd_sc_hd__xnor2_4/B -> A +sky130_fd_sc_hd__xnor3_1/A -> B C +sky130_fd_sc_hd__xnor3_1/B -> A C +sky130_fd_sc_hd__xnor3_1/C -> A B +sky130_fd_sc_hd__xnor3_2/A -> B C +sky130_fd_sc_hd__xnor3_2/B -> A C +sky130_fd_sc_hd__xnor3_2/C -> A B +sky130_fd_sc_hd__xnor3_4/A -> B C +sky130_fd_sc_hd__xnor3_4/B -> A C +sky130_fd_sc_hd__xnor3_4/C -> A B +sky130_fd_sc_hd__xor2_1/A -> B +sky130_fd_sc_hd__xor2_1/B -> A +sky130_fd_sc_hd__xor2_2/A -> B +sky130_fd_sc_hd__xor2_2/B -> A +sky130_fd_sc_hd__xor2_4/A -> B +sky130_fd_sc_hd__xor2_4/B -> A +sky130_fd_sc_hd__xor3_1/A -> B C +sky130_fd_sc_hd__xor3_1/B -> A C +sky130_fd_sc_hd__xor3_1/C -> A B +sky130_fd_sc_hd__xor3_2/A -> B C +sky130_fd_sc_hd__xor3_2/B -> A C +sky130_fd_sc_hd__xor3_2/C -> A B +sky130_fd_sc_hd__xor3_4/A -> B C +sky130_fd_sc_hd__xor3_4/B -> A C +sky130_fd_sc_hd__xor3_4/C -> A B From db347cf43dd75ccea1d59dd5b4d8d5f4973fbff4 Mon Sep 17 00:00:00 2001 From: Ethan Mahintorabi Date: Thu, 15 Feb 2024 22:37:10 +0000 Subject: [PATCH 23/45] fixes ok file in pin_swap from spurious logging Signed-off-by: Ethan Mahintorabi Signed-off-by: Matt Liberty --- src/rsz/test/pin_swap1.ok | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/rsz/test/pin_swap1.ok b/src/rsz/test/pin_swap1.ok index fe2fe53c643..b7c4d56b174 100644 --- a/src/rsz/test/pin_swap1.ok +++ b/src/rsz/test/pin_swap1.ok @@ -306,9 +306,7 @@ sky130_fd_sc_hd__a41oi_4/A2 -> A1 A3 A4 sky130_fd_sc_hd__a41oi_4/A3 -> A1 A2 A4 sky130_fd_sc_hd__a41oi_4/A4 -> A1 A2 A3 sky130_fd_sc_hd__a41oi_4/B1 -> -[INFO RSZ-1000] sup sky130_fd_sc_hd__and2_0/A -> B -[INFO RSZ-1000] sup sky130_fd_sc_hd__and2_0/B -> A sky130_fd_sc_hd__and2_1/A -> B sky130_fd_sc_hd__and2_1/B -> A From 1f12ce64953611ca8a63e57ed4e7d0f95b274aec Mon Sep 17 00:00:00 2001 From: Ethan Mahintorabi Date: Fri, 16 Feb 2024 06:59:41 +0000 Subject: [PATCH 24/45] Adding multi-output cell and cleaning up PR comments Signed-off-by: Ethan Mahintorabi Signed-off-by: Matt Liberty --- src/rsz/src/RepairSetup.cc | 78 ++++++++++++++++++++++++-------------- src/rsz/src/RepairSetup.hh | 5 +-- src/rsz/test/pin_swap1.ok | 46 +++++++++++----------- 3 files changed, 74 insertions(+), 55 deletions(-) diff --git a/src/rsz/src/RepairSetup.cc b/src/rsz/src/RepairSetup.cc index 8e66cf8dbfc..85476f7f125 100644 --- a/src/rsz/src/RepairSetup.cc +++ b/src/rsz/src/RepairSetup.cc @@ -526,13 +526,13 @@ bool RepairSetup::swapPins(PathRef *drvr_path, } // Find the equivalent pins for a cell (simple implementation for now) - // stash them - auto cell_port_pair = std::pair(cell, input_port); - if (equiv_pin_map_.find(cell_port_pair) == equiv_pin_map_.end()) { + // stash them. Ports are unique to a cell so we can just cache by port + // and that should apply to all instances of that cell with this input_port. + if (equiv_pin_map_.find(input_port) == equiv_pin_map_.end()) { equivCellPins(cell, input_port, ports); - equiv_pin_map_.insert(cell_port_pair, ports); + equiv_pin_map_.insert(input_port, ports); } - ports = equiv_pin_map_[cell_port_pair]; + ports = equiv_pin_map_[input_port]; if (ports.size() > 1) { resizer_->findSwapPinCandidate(input_port, drvr_port, load_cap, dcalc_ap, &swap_port); @@ -938,6 +938,10 @@ bool RepairSetup::isPortEqiv(sta::FuncExpr* expr, const LibertyPort* port_a, const LibertyPort* port_b) { + if (port_a->libertyCell() != cell || port_a->libertyCell() != cell) { + return false; + } + sta::LibertyCellPortIterator port_iter(cell); sta::UnorderedMap> port_stimulus; size_t input_port_count = 0; @@ -966,14 +970,7 @@ bool RepairSetup::isPortEqiv(sta::FuncExpr* expr, } var_index++; } - - if (port_stimulus.find(port_a) == port_stimulus.end()) { - return false; - } - if (port_stimulus.find(port_b) == port_stimulus.end()) { - return false; - } - + std::vector result_no_swap = simulateExpr(expr, port_stimulus); // Swap pins @@ -1008,36 +1005,61 @@ void RepairSetup::equivCellPins(const LibertyCell* cell, int outputs = 0; int inputs = 0; - // count number of output ports. Skip ports with > 1 output for now. - LibertyPort* output_port = nullptr; + // count number of output ports. while (port_iter.hasNext()) { LibertyPort *port = port_iter.next(); if (port->direction()->isOutput()) { - output_port = port; ++outputs; } else { ++inputs; } } - if (output_port == nullptr) { - return; - } + if (outputs >= 1 && inputs >= 2) { + sta::LibertyCellPortIterator port_iter2(cell); + while (port_iter2.hasNext()) { + LibertyPort* candidate_port = port_iter2.next(); + if (!candidate_port->direction()->isInput()) { + continue; + } - sta::FuncExpr* expr = output_port->function(); - if (outputs == 1 && inputs >= 2) { - sta::LibertyCellPortIterator port_iter2(cell); - while (port_iter2.hasNext()) { - LibertyPort* candidate_port = port_iter2.next(); - if (!candidate_port->direction()->isInput()) { + sta::LibertyCellPortIterator output_port_iter(cell); + std::optional is_equivalent; + // Loop through all the output ports and make sure they are equivalent + // under swaps of candidate_port and input_port. For multi-ouput gates + // like full adders. + while (output_port_iter.hasNext()) { + LibertyPort* output_candidate_port = output_port_iter.next(); + sta::FuncExpr* output_expr = output_candidate_port->function(); + if (!output_candidate_port->direction()->isOutput()) { continue; } - if (expr != nullptr && input_port != candidate_port - && isPortEqiv(expr, cell, input_port, candidate_port)) { - ports.insert(candidate_port); + if (output_expr == nullptr) { + continue; + } + + if (input_port == candidate_port) { + continue; } + + bool is_equivalent_result + = isPortEqiv(output_expr, cell, input_port, candidate_port); + + if (!is_equivalent.has_value()) { + is_equivalent = is_equivalent_result; + continue; + } + + is_equivalent = is_equivalent.value() && is_equivalent_result; } + + // candidate_port is equivalent to input_port under all output ports + // of this cell. + if (is_equivalent.has_value() && is_equivalent.value()) { + ports.insert(candidate_port); + } + } } } diff --git a/src/rsz/src/RepairSetup.hh b/src/rsz/src/RepairSetup.hh index 71502b412c0..f16827af5fb 100644 --- a/src/rsz/src/RepairSetup.hh +++ b/src/rsz/src/RepairSetup.hh @@ -178,10 +178,7 @@ private: const MinMax *min_; const MinMax *max_; - sta::UnorderedMap, - sta::LibertyPortSet, - boost::hash>> - equiv_pin_map_; + sta::UnorderedMap equiv_pin_map_; static constexpr int decreasing_slack_max_passes_ = 50; static constexpr int rebuffer_max_fanout_ = 20; diff --git a/src/rsz/test/pin_swap1.ok b/src/rsz/test/pin_swap1.ok index b7c4d56b174..84285679f14 100644 --- a/src/rsz/test/pin_swap1.ok +++ b/src/rsz/test/pin_swap1.ok @@ -549,30 +549,30 @@ sky130_fd_sc_hd__einvp_4/A -> sky130_fd_sc_hd__einvp_4/TE -> sky130_fd_sc_hd__einvp_8/A -> sky130_fd_sc_hd__einvp_8/TE -> -sky130_fd_sc_hd__fa_1/A -> -sky130_fd_sc_hd__fa_1/B -> -sky130_fd_sc_hd__fa_1/CIN -> -sky130_fd_sc_hd__fa_2/A -> -sky130_fd_sc_hd__fa_2/B -> -sky130_fd_sc_hd__fa_2/CIN -> -sky130_fd_sc_hd__fa_4/A -> -sky130_fd_sc_hd__fa_4/B -> -sky130_fd_sc_hd__fa_4/CIN -> -sky130_fd_sc_hd__fah_1/A -> -sky130_fd_sc_hd__fah_1/B -> -sky130_fd_sc_hd__fah_1/CI -> -sky130_fd_sc_hd__fahcin_1/A -> -sky130_fd_sc_hd__fahcin_1/B -> +sky130_fd_sc_hd__fa_1/A -> B CIN +sky130_fd_sc_hd__fa_1/B -> A CIN +sky130_fd_sc_hd__fa_1/CIN -> A B +sky130_fd_sc_hd__fa_2/A -> B CIN +sky130_fd_sc_hd__fa_2/B -> A CIN +sky130_fd_sc_hd__fa_2/CIN -> A B +sky130_fd_sc_hd__fa_4/A -> B CIN +sky130_fd_sc_hd__fa_4/B -> A CIN +sky130_fd_sc_hd__fa_4/CIN -> A B +sky130_fd_sc_hd__fah_1/A -> B CI +sky130_fd_sc_hd__fah_1/B -> A CI +sky130_fd_sc_hd__fah_1/CI -> A B +sky130_fd_sc_hd__fahcin_1/A -> B +sky130_fd_sc_hd__fahcin_1/B -> A sky130_fd_sc_hd__fahcin_1/CIN -> -sky130_fd_sc_hd__fahcon_1/A -> -sky130_fd_sc_hd__fahcon_1/B -> -sky130_fd_sc_hd__fahcon_1/CI -> -sky130_fd_sc_hd__ha_1/A -> -sky130_fd_sc_hd__ha_1/B -> -sky130_fd_sc_hd__ha_2/A -> -sky130_fd_sc_hd__ha_2/B -> -sky130_fd_sc_hd__ha_4/A -> -sky130_fd_sc_hd__ha_4/B -> +sky130_fd_sc_hd__fahcon_1/A -> B CI +sky130_fd_sc_hd__fahcon_1/B -> A CI +sky130_fd_sc_hd__fahcon_1/CI -> A B +sky130_fd_sc_hd__ha_1/A -> B +sky130_fd_sc_hd__ha_1/B -> A +sky130_fd_sc_hd__ha_2/A -> B +sky130_fd_sc_hd__ha_2/B -> A +sky130_fd_sc_hd__ha_4/A -> B +sky130_fd_sc_hd__ha_4/B -> A sky130_fd_sc_hd__inv_1/A -> sky130_fd_sc_hd__inv_12/A -> sky130_fd_sc_hd__inv_16/A -> From b5bbf64eb1f6ea9ede663072535543e29503f72c Mon Sep 17 00:00:00 2001 From: Ethan Mahintorabi Date: Fri, 16 Feb 2024 07:05:51 +0000 Subject: [PATCH 25/45] removing boost dep Signed-off-by: Ethan Mahintorabi Signed-off-by: Matt Liberty --- src/rsz/src/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/rsz/src/CMakeLists.txt b/src/rsz/src/CMakeLists.txt index 02f00eb4e01..f6eb7da7a72 100644 --- a/src/rsz/src/CMakeLists.txt +++ b/src/rsz/src/CMakeLists.txt @@ -78,7 +78,6 @@ target_link_libraries(rsz_lib dbSta_lib grt_lib utl_lib - Boost::boost ) target_link_libraries(rsz From db116cf91fa4e1dc5a510e47cc40f48f8c744142 Mon Sep 17 00:00:00 2001 From: Ethan Mahintorabi Date: Tue, 20 Feb 2024 16:39:07 +0000 Subject: [PATCH 26/45] fixing off by one error on change to new equivalence algo Signed-off-by: Ethan Mahintorabi Signed-off-by: Matt Liberty --- src/rsz/src/RepairSetup.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rsz/src/RepairSetup.cc b/src/rsz/src/RepairSetup.cc index 85476f7f125..4e941512876 100644 --- a/src/rsz/src/RepairSetup.cc +++ b/src/rsz/src/RepairSetup.cc @@ -533,7 +533,7 @@ bool RepairSetup::swapPins(PathRef *drvr_path, equiv_pin_map_.insert(input_port, ports); } ports = equiv_pin_map_[input_port]; - if (ports.size() > 1) { + if (!ports.empty()) { resizer_->findSwapPinCandidate(input_port, drvr_port, load_cap, dcalc_ap, &swap_port); if (!sta::LibertyPort::equiv(swap_port, input_port)) { From b484fcbc14e222bde218fc8d44c1fe5b509684b8 Mon Sep 17 00:00:00 2001 From: Ethan Mahintorabi Date: Wed, 21 Feb 2024 05:21:35 +0000 Subject: [PATCH 27/45] fixes bugs in pin swapping output to output arcs Signed-off-by: Ethan Mahintorabi Signed-off-by: Matt Liberty --- src/rsz/src/RepairSetup.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/rsz/src/RepairSetup.cc b/src/rsz/src/RepairSetup.cc index 4e941512876..14f792a39cc 100644 --- a/src/rsz/src/RepairSetup.cc +++ b/src/rsz/src/RepairSetup.cc @@ -502,6 +502,11 @@ bool RepairSetup::swapPins(PathRef *drvr_path, LibertyPort *swap_port = input_port; sta::LibertyPortSet ports; + //Skip output to output paths + if (input_port->direction()->isOutput()) { + return false; + } + // Results for > 2 input gates are unpredictable. Only swap pins for // 2 input gates for now. int input_port_count = 0; @@ -938,7 +943,7 @@ bool RepairSetup::isPortEqiv(sta::FuncExpr* expr, const LibertyPort* port_a, const LibertyPort* port_b) { - if (port_a->libertyCell() != cell || port_a->libertyCell() != cell) { + if (port_a->libertyCell() != cell || port_b->libertyCell() != cell) { return false; } From e881a843f73c1a2394ec9026e320faebe7a518a9 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Wed, 13 Mar 2024 16:36:50 -0700 Subject: [PATCH 28/45] rm old comment in test/regression_tests.tcl Signed-off-by: Matt Liberty --- test/regression_tests.tcl | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/regression_tests.tcl b/test/regression_tests.tcl index 93293693aa7..5b1e1f7049a 100644 --- a/test/regression_tests.tcl +++ b/test/regression_tests.tcl @@ -33,6 +33,3 @@ record_flow_tests { jpeg_sky130hs jpeg_sky130hd } - -# sidelined because drt blows chow - From 551f0f7cecbdb424712fd839bd16a1cda983fd68 Mon Sep 17 00:00:00 2001 From: Peter Gadfort Date: Wed, 13 Mar 2024 22:36:37 -0400 Subject: [PATCH 29/45] pdn: switch initial building of rtrees to vectors and use bulk loading Signed-off-by: Peter Gadfort --- src/pdn/src/PdnGen.cc | 48 +++++++++++++++++----------- src/pdn/src/grid.cpp | 68 ++++++++++++++++++++++------------------ src/pdn/src/grid.h | 17 +++++----- src/pdn/src/renderer.cpp | 35 ++++++++++----------- src/pdn/src/shape.cpp | 21 +++++++++++-- src/pdn/src/shape.h | 6 +++- src/pdn/src/sroute.cpp | 14 +++------ 7 files changed, 121 insertions(+), 88 deletions(-) diff --git a/src/pdn/src/PdnGen.cc b/src/pdn/src/PdnGen.cc index 63b0d765a46..47b84d9effa 100644 --- a/src/pdn/src/PdnGen.cc +++ b/src/pdn/src/PdnGen.cc @@ -109,22 +109,34 @@ void PdnGen::buildGrids(bool trim) insts_in_grids.insert(insts_in_grid.begin(), insts_in_grid.end()); } - ShapeTreeMap block_obs; - Grid::makeInitialObstructions(block, block_obs, insts_in_grids, logger_); + ShapeVectorMap block_obs_vec; + Grid::makeInitialObstructions(block, block_obs_vec, insts_in_grids, logger_); for (auto* grid : grids) { - grid->getGridLevelObstructions(block_obs); + grid->getGridLevelObstructions(block_obs_vec); } - ShapeTreeMap all_shapes; + ShapeVectorMap all_shapes_vec; // get special shapes - Grid::makeInitialShapes(block, all_shapes, logger_); - for (const auto& [layer, layer_shapes] : all_shapes) { - auto& layer_obs = block_obs[layer]; + Grid::makeInitialShapes(block, all_shapes_vec, logger_); + for (const auto& [layer, layer_shapes] : all_shapes_vec) { + auto& layer_obs = block_obs_vec[layer]; for (const auto& [box, shape] : layer_shapes) { - layer_obs.insert({shape->getObstructionBox(), shape}); + layer_obs.emplace_back(shape->getObstructionBox(), shape); } } + ShapeTreeMap block_obs; + for (const auto& [layer, shapes] : block_obs_vec) { + block_obs[layer] = ShapeTree(shapes.begin(), shapes.end()); + } + block_obs_vec.clear(); + + ShapeTreeMap all_shapes; + for (const auto& [layer, shapes] : all_shapes_vec) { + all_shapes[layer] = ShapeTree(shapes.begin(), shapes.end()); + } + all_shapes_vec.clear(); + for (auto* grid : grids) { debugPrint( logger_, utl::PDN, "Make", 2, "Build start grid - {}", grid->getName()); @@ -754,17 +766,12 @@ void PdnGen::writeToDb(bool add_pins, const std::string& report_file) const // collect all the SWires from the block auto* block = db_->getChip()->getBlock(); - ShapeTreeMap obstructions; + ShapeVectorMap net_shapes_vec; for (auto* net : block->getNets()) { - ShapeTreeMap net_shapes; - Shape::populateMapFromDb(net, net_shapes); - for (const auto& [layer, net_obs_layer] : net_shapes) { - auto& obs_layer = obstructions[layer]; - for (const auto& [box, shape] : net_obs_layer) { - obs_layer.insert({shape->getObstructionBox(), shape}); - } - } + Shape::populateMapFromDb(net, net_shapes_vec); } + const ShapeTreeMap obstructions(net_shapes_vec.begin(), net_shapes_vec.end()); + net_shapes_vec.clear(); for (auto* domain : domains) { for (const auto& grid : domain->getGrids()) { @@ -812,8 +819,11 @@ void PdnGen::ripUp(odb::dbNet* net) return; } - ShapeTreeMap net_shapes; - Shape::populateMapFromDb(net, net_shapes); + ShapeVectorMap net_shapes_vec; + Shape::populateMapFromDb(net, net_shapes_vec); + ShapeTreeMap net_shapes = Shape::convertVectorToTree(net_shapes_vec); + net_shapes_vec.clear(); + // remove bterms that connect to swires std::set terms; for (auto* bterm : net->getBTerms()) { diff --git a/src/pdn/src/grid.cpp b/src/pdn/src/grid.cpp index c848afa9207..af247ac44c7 100644 --- a/src/pdn/src/grid.cpp +++ b/src/pdn/src/grid.cpp @@ -363,18 +363,17 @@ bool Grid::repairVias(const ShapeTreeMap& global_shapes, ShapeTreeMap Grid::getShapes() const { - ShapeTreeMap shapes; + ShapeVectorMap shapes; for (auto* component : getGridComponents()) { for (const auto& [layer, component_shapes] : component->getShapes()) { - auto& layer_shapes = shapes[layer]; - for (const auto& shape : component_shapes) { - layer_shapes.insert(shape); - } + shapes[layer].insert(shapes[layer].end(), + component_shapes.begin(), + component_shapes.end()); } } - return shapes; + return Shape::convertVectorToTree(shapes); } odb::Rect Grid::getDomainArea() const @@ -903,7 +902,7 @@ void Grid::writeToDb(const std::map& net_map, } } -void Grid::getGridLevelObstructions(ShapeTreeMap& obstructions) const +void Grid::getGridLevelObstructions(ShapeVectorMap& obstructions) const { debugPrint(getLogger(), utl::PDN, @@ -934,7 +933,7 @@ void Grid::getGridLevelObstructions(ShapeTreeMap& obstructions) const "Adding obstruction on layer {} covering {}", layer->getName(), Shape::getRectText(core, getBlock()->getDbUnitsPerMicron())); - obstructions[layer].insert({obs->getObstructionBox(), obs}); + obstructions[layer].emplace_back(obs->getObstructionBox(), obs); } for (const auto& ring : rings_) { @@ -957,13 +956,13 @@ void Grid::getGridLevelObstructions(ShapeTreeMap& obstructions) const "Adding obstruction on layer {} covering {}", layer->getName(), Shape::getRectText(ring_rect, getBlock()->getDbUnitsPerMicron())); - obstructions[layer].insert({obs->getObstructionBox(), obs}); + obstructions[layer].emplace_back(obs->getObstructionBox(), obs); } } } void Grid::makeInitialObstructions(odb::dbBlock* block, - ShapeTreeMap& obs, + ShapeVectorMap& obs, const std::set& skip_insts, utl::Logger* logger) { @@ -983,13 +982,13 @@ void Grid::makeInitialObstructions(odb::dbBlock* block, if (box->getTechLayer() == nullptr) { for (auto* layer : block->getDb()->getTech()->getLayers()) { auto shape = std::make_shared(layer, obs_rect, Shape::BLOCK_OBS); - obs[shape->getLayer()].insert({shape->getObstructionBox(), shape}); + obs[shape->getLayer()].emplace_back(shape->getObstructionBox(), shape); } } else { auto shape = std::make_shared( box->getTechLayer(), obs_rect, Shape::BLOCK_OBS); - obs[shape->getLayer()].insert({shape->getObstructionBox(), shape}); + obs[shape->getLayer()].emplace_back(shape->getObstructionBox(), shape); } } @@ -1030,14 +1029,14 @@ void Grid::makeInitialObstructions(odb::dbBlock* block, for (const auto& [layer, shapes] : InstanceGrid::getInstanceObstructions(inst)) { - obs[layer].insert(shapes.begin(), shapes.end()); + obs[layer].insert(obs[layer].end(), shapes.begin(), shapes.end()); } } debugPrint(logger, utl::PDN, "Make", 2, "Get initial obstructions - end"); } void Grid::makeInitialShapes(odb::dbBlock* block, - ShapeTreeMap& shapes, + ShapeVectorMap& shapes, utl::Logger* logger) { debugPrint(logger, utl::PDN, "Make", 2, "Get initial shapes - start"); @@ -1185,7 +1184,7 @@ void CoreGrid::setupDirectConnect( } } -void CoreGrid::getGridLevelObstructions(ShapeTreeMap& obstructions) const +void CoreGrid::getGridLevelObstructions(ShapeVectorMap& obstructions) const { if (getDomain()->hasRegion()) { // core grids only have grid level obstructions if they have a region @@ -1345,11 +1344,11 @@ odb::Rect InstanceGrid::getGridBoundary() const return getDomainBoundary(); } -ShapeTreeMap InstanceGrid::getInstanceObstructions( +ShapeVectorMap InstanceGrid::getInstanceObstructions( odb::dbInst* inst, const InstanceGrid::Halo& halo) { - ShapeTreeMap obs; + ShapeVectorMap obs; const odb::dbTransform transform = inst->getTransform(); @@ -1368,7 +1367,7 @@ ShapeTreeMap InstanceGrid::getInstanceObstructions( transform.apply(obs_rect); auto shape = std::make_shared(layer, obs_rect, Shape::BLOCK_OBS); - obs[layer].insert({shape->getObstructionBox(), shape}); + obs[layer].emplace_back(shape->getObstructionBox(), shape); } // generate obstructions based on pins @@ -1383,16 +1382,16 @@ ShapeTreeMap InstanceGrid::getInstanceObstructions( pin_shape->setRect(applyHalo( pin_shape->getObstruction(), halo, true, is_horizontal, is_vertical)); pin_shape->setObstruction(pin_shape->getRect()); - obs[layer].insert({pin_shape->getObstructionBox(), pin_shape}); + obs[layer].emplace_back(pin_shape->getObstructionBox(), pin_shape); } } return obs; } -void InstanceGrid::getGridLevelObstructions(ShapeTreeMap& obstructions) const +void InstanceGrid::getGridLevelObstructions(ShapeVectorMap& obstructions) const { - ShapeTreeMap local_obs; + ShapeVectorMap local_obs; Grid::getGridLevelObstructions(local_obs); const odb::Rect inst_box = getGridArea(); @@ -1400,24 +1399,25 @@ void InstanceGrid::getGridLevelObstructions(ShapeTreeMap& obstructions) const // copy layer obs for (const auto& [layer, shapes] : local_obs) { auto obs = std::make_shared(layer, inst_box, this); - local_obs[layer].insert({obs->getObstructionBox(), obs}); + local_obs[layer].emplace_back(obs->getObstructionBox(), obs); } // copy instance obstructions for (const auto& [layer, shapes] : getInstanceObstructions(inst_, halos_)) { for (const auto& [box, shape] : shapes) { auto obs = std::make_shared(layer, shape->getRect(), this); - local_obs[layer].insert({box, obs}); + local_obs[layer].emplace_back(box, obs); } } // merge local and global obs for (const auto& [layer, obs] : local_obs) { - obstructions[layer].insert(obs.begin(), obs.end()); + obstructions[layer].insert( + obstructions[layer].end(), obs.begin(), obs.end()); } } -ShapeTreeMap InstanceGrid::getInstancePins(odb::dbInst* inst) +ShapeVectorMap InstanceGrid::getInstancePins(odb::dbInst* inst) { // add instance pins std::vector pins; @@ -1454,9 +1454,9 @@ ShapeTreeMap InstanceGrid::getInstancePins(odb::dbInst* inst) } } - ShapeTreeMap shapes; + ShapeVectorMap shapes; for (auto& pin : pins) { - shapes[pin->getLayer()].insert({pin->getRectBox(), pin}); + shapes[pin->getLayer()].emplace_back(pin->getRectBox(), pin); } return shapes; @@ -1562,7 +1562,8 @@ bool BumpGrid::isRouted() const { odb::dbNet* net = *getNets(startsWithPower()).begin(); - const auto pins = InstanceGrid::getInstancePins(getInstance()); + const auto pins = Shape::convertVectorToTree( + InstanceGrid::getInstancePins(getInstance())); for (auto* swire : net->getSWires()) { for (auto* sbox : swire->getWires()) { @@ -1660,15 +1661,20 @@ ExistingGrid::ExistingGrid( void ExistingGrid::populate() { - Grid::makeInitialShapes(domain_->getBlock(), shapes_, getLogger()); + ShapeVectorMap shapes; + Grid::makeInitialShapes(domain_->getBlock(), shapes, getLogger()); for (auto* inst : getBlock()->getInsts()) { if (inst->getPlacementStatus().isFixed()) { - for (const auto& [layer, shapes] : InstanceGrid::getInstancePins(inst)) { - shapes_[layer].insert(shapes.begin(), shapes.end()); + for (const auto& [layer, inst_shapes] : + InstanceGrid::getInstancePins(inst)) { + shapes[layer].insert( + shapes[layer].end(), inst_shapes.begin(), inst_shapes.end()); } } } + + shapes_ = Shape::convertVectorToTree(shapes); } void ExistingGrid::addRing(std::unique_ptr ring) diff --git a/src/pdn/src/grid.h b/src/pdn/src/grid.h index ac701995f00..0e499c2cda6 100644 --- a/src/pdn/src/grid.h +++ b/src/pdn/src/grid.h @@ -169,7 +169,7 @@ class Grid // returns the obstructions the other grids should be aware of, // such as the outline of an instance or layers in use - virtual void getGridLevelObstructions(ShapeTreeMap& obstructions) const; + virtual void getGridLevelObstructions(ShapeVectorMap& obstructions) const; void getObstructions(ShapeTreeMap& obstructions) const; void resetShapes(); @@ -180,11 +180,11 @@ class Grid void makeRoutingObstructions(odb::dbBlock* block) const; static void makeInitialObstructions(odb::dbBlock* block, - ShapeTreeMap& obs, + ShapeVectorMap& obs, const std::set& skip_insts, utl::Logger* logger); static void makeInitialShapes(odb::dbBlock* block, - ShapeTreeMap& shapes, + ShapeVectorMap& shapes, utl::Logger* logger); virtual bool isReplaceable() const { return false; } @@ -246,7 +246,7 @@ class CoreGrid : public Grid void setupDirectConnect( const std::vector& connect_pad_layers); - void getGridLevelObstructions(ShapeTreeMap& obstructions) const override; + void getGridLevelObstructions(ShapeVectorMap& obstructions) const override; protected: void cleanupShapes() override; @@ -280,16 +280,17 @@ class InstanceGrid : public Grid odb::Rect getDomainBoundary() const override; odb::Rect getGridBoundary() const override; - void getGridLevelObstructions(ShapeTreeMap& obstructions) const override; + void getGridLevelObstructions(ShapeVectorMap& obstructions) const override; void setReplaceable(bool replaceable) { replaceable_ = replaceable; } bool isReplaceable() const override { return replaceable_; } virtual bool isValid() const; - static ShapeTreeMap getInstanceObstructions(odb::dbInst* inst, - const Halo& halo = {0, 0, 0, 0}); - static ShapeTreeMap getInstancePins(odb::dbInst* inst); + static ShapeVectorMap getInstanceObstructions(odb::dbInst* inst, + const Halo& halo + = {0, 0, 0, 0}); + static ShapeVectorMap getInstancePins(odb::dbInst* inst); protected: // find all intersections that also overlap with the power/ground pins based diff --git a/src/pdn/src/renderer.cpp b/src/pdn/src/renderer.cpp index 069f04975d3..06be6acb2af 100644 --- a/src/pdn/src/renderer.cpp +++ b/src/pdn/src/renderer.cpp @@ -74,32 +74,26 @@ void PDNRenderer::update() vias_.clear(); repair_.clear(); + ShapeVectorMap shapes; + ShapeVectorMap obs; + std::vector vias; for (const auto& domain : pdn_->getDomains()) { for (auto* net : domain->getBlock()->getNets()) { - ShapeTreeMap net_shapes; - Shape::populateMapFromDb(net, net_shapes); - for (const auto& [layer, net_obs_layer] : net_shapes) { - auto& obs_layer = grid_obstructions_[layer]; - for (const auto& [box, shape] : net_obs_layer) { - obs_layer.insert({shape->getObstructionBox(), shape}); - } - } + Shape::populateMapFromDb(net, obs); } for (const auto& grid : domain->getGrids()) { - grid->getGridLevelObstructions(grid_obstructions_); + grid->getGridLevelObstructions(obs); - for (const auto& [layer, shapes] : grid->getShapes()) { - auto& save_shapes = shapes_[layer]; - for (const auto& shape : shapes) { - save_shapes.insert(shape); - } + for (const auto& [layer, grid_shapes] : grid->getShapes()) { + shapes[layer].insert( + shapes[layer].end(), grid_shapes.begin(), grid_shapes.end()); } - std::vector vias; - grid->getVias(vias); - for (const auto& via : vias) { - vias_.insert({via->getBox(), via}); + std::vector grid_vias; + grid->getVias(grid_vias); + for (auto& via : grid_vias) { + vias.emplace_back(via->getBox(), via); } for (const auto& repair : @@ -125,6 +119,11 @@ void PDNRenderer::update() } } + shapes_ = Shape::convertVectorToTree(shapes); + grid_obstructions_ = Shape::convertVectorToTree(obs); + shapes_ = Shape::convertVectorToTree(shapes); + vias_ = Shape::convertVectorToTree(vias); + redraw(); } diff --git a/src/pdn/src/shape.cpp b/src/pdn/src/shape.cpp index 538428e1192..67ed7852632 100644 --- a/src/pdn/src/shape.cpp +++ b/src/pdn/src/shape.cpp @@ -444,7 +444,7 @@ void Shape::addBPinToDb(const odb::Rect& rect) const pin->setPlacementStatus(odb::dbPlacementStatus::FIRM); } -void Shape::populateMapFromDb(odb::dbNet* net, ShapeTreeMap& map) +void Shape::populateMapFromDb(odb::dbNet* net, ShapeVectorMap& map) { for (auto* swire : net->getSWires()) { for (auto* box : swire->getWires()) { @@ -464,7 +464,7 @@ void Shape::populateMapFromDb(odb::dbNet* net, ShapeTreeMap& map) shape->setShapeType(Shape::OBS); } shape->generateObstruction(); - map[layer].insert({shape->getRectBox(), shape}); + map[layer].emplace_back(shape->getRectBox(), shape); } } } @@ -617,6 +617,23 @@ Shape* Shape::extendTo( return new_shape.release(); } +ShapeTreeMap Shape::convertVectorToTree(const ShapeVectorMap& vec) +{ + ShapeTreeMap trees; + + for (auto& [layer, vals] : vec) { + trees[layer] = ShapeTree(vals.begin(), vals.end()); + } + + return trees; +} + +ViaTree Shape::convertVectorToTree(const std::vector& vec) +{ + ViaTree tree(vec.begin(), vec.end()); + return tree; +} + ///////// FollowPinShape::FollowPinShape(odb::dbTechLayer* layer, diff --git a/src/pdn/src/shape.h b/src/pdn/src/shape.h index be3d6c6cd15..12a1436e6b6 100644 --- a/src/pdn/src/shape.h +++ b/src/pdn/src/shape.h @@ -77,6 +77,7 @@ using ViaValue = std::pair; using ShapeTree = bgi::rtree>; using ViaTree = bgi::rtree>; using ShapeTreeMap = std::map; +using ShapeVectorMap = std::map>; class Grid; class GridComponent; @@ -221,7 +222,7 @@ class Shape bool add_pins, bool make_rect_as_pin) const; // copy existing shapes into the map - static void populateMapFromDb(odb::dbNet* net, ShapeTreeMap& map); + static void populateMapFromDb(odb::dbNet* net, ShapeVectorMap& map); static Box rectToBox(const odb::Rect& rect); @@ -234,6 +235,9 @@ class Shape allow_non_preferred_change_ = true; } + static ShapeTreeMap convertVectorToTree(const ShapeVectorMap& vec); + static ViaTree convertVectorToTree(const std::vector& vec); + protected: bool cut(const ShapeTree& obstructions, std::vector& replacements, diff --git a/src/pdn/src/sroute.cpp b/src/pdn/src/sroute.cpp index 998cda564ee..89ed21f6182 100644 --- a/src/pdn/src/sroute.cpp +++ b/src/pdn/src/sroute.cpp @@ -666,15 +666,11 @@ void SRoute::createSrouteWires( auto domains = getDomains(); // collect the the SWires from the block - ShapeTreeMap obstructions; - ShapeTreeMap net_shapes; - Shape::populateMapFromDb(net, net_shapes); - for (const auto& [layer, net_obs_layer] : net_shapes) { - auto& obs_layer = obstructions[layer]; - for (const auto& [box, shape] : net_obs_layer) { - obs_layer.insert({shape->getObstructionBox(), shape}); - } - } + ShapeVectorMap obstructions_vec; + Shape::populateMapFromDb(net, obstructions_vec); + const ShapeTreeMap obstructions + = Shape::convertVectorToTree(obstructions_vec); + obstructions_vec.clear(); for (auto* domain : domains) { for (const auto& grid : domain->getGrids()) { From 97393ad9ce3c0262c5260fa920121670f4bd4f5a Mon Sep 17 00:00:00 2001 From: Peter Gadfort Date: Wed, 13 Mar 2024 22:53:16 -0400 Subject: [PATCH 30/45] pdn: only limit iterms and not bterms Signed-off-by: Peter Gadfort --- src/pdn/src/connect.cpp | 4 ++-- src/pdn/src/shape.cpp | 2 +- src/pdn/src/shape.h | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/pdn/src/connect.cpp b/src/pdn/src/connect.cpp index e518fec040e..0b9c364441b 100644 --- a/src/pdn/src/connect.cpp +++ b/src/pdn/src/connect.cpp @@ -491,7 +491,7 @@ void Connect::makeVia(odb::dbSWire* wire, ViaGenerator::Constraint lower_constraint{false, false, true}; if (lower->getLayer() == l0) { - if (!lower->isModifiable() || lower->hasTermConnections()) { + if (!lower->isModifiable() || lower->hasITermConnections()) { // lower is not modifiable to all sides must fit skip_caching = true; lower_constraint.must_fit_x = true; @@ -504,7 +504,7 @@ void Connect::makeVia(odb::dbSWire* wire, } ViaGenerator::Constraint upper_constraint{false, false, true}; if (upper->getLayer() == l1) { - if (!upper->isModifiable() || upper->hasTermConnections()) { + if (!upper->isModifiable() || upper->hasITermConnections()) { // upper is not modifiable to all sides must fit skip_caching = true; upper_constraint.must_fit_x = true; diff --git a/src/pdn/src/shape.cpp b/src/pdn/src/shape.cpp index 538428e1192..385d8c3180f 100644 --- a/src/pdn/src/shape.cpp +++ b/src/pdn/src/shape.cpp @@ -208,7 +208,7 @@ void Shape::updateTermConnections() bool Shape::hasTermConnections() const { - return !bterm_connections_.empty() || !iterm_connections_.empty(); + return hasITermConnections() || hasBTermConnections(); } odb::Rect Shape::getMinimumRect() const diff --git a/src/pdn/src/shape.h b/src/pdn/src/shape.h index be3d6c6cd15..7863064aa0b 100644 --- a/src/pdn/src/shape.h +++ b/src/pdn/src/shape.h @@ -183,6 +183,8 @@ class Shape // connected virtual void updateTermConnections(); bool hasTermConnections() const; + bool hasITermConnections() const { return !iterm_connections_.empty(); } + bool hasBTermConnections() const { return !bterm_connections_.empty(); }; // returns the smallest shape possible when attempting to trim virtual odb::Rect getMinimumRect() const; From 319a5a1891dd65eec9ac81634c71701a3cf390a0 Mon Sep 17 00:00:00 2001 From: Peter Gadfort Date: Wed, 13 Mar 2024 23:17:01 -0400 Subject: [PATCH 31/45] pdn: ensure bterms created will have the correct width Signed-off-by: Peter Gadfort --- src/pdn/src/shape.cpp | 14 +++++++++++++- src/pdn/test/core_grid_extend_to_boundary.defok | 4 ++-- .../core_grid_extend_to_boundary_no_pins.defok | 4 ++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/pdn/src/shape.cpp b/src/pdn/src/shape.cpp index 385d8c3180f..c25fca5a14a 100644 --- a/src/pdn/src/shape.cpp +++ b/src/pdn/src/shape.cpp @@ -399,8 +399,20 @@ void Shape::writeToDb(odb::dbSWire* swire, if (make_rect_as_pin) { addBPinToDb(rect_); } + const odb::Rect block_area = getGridComponent()->getBlock()->getDieArea(); for (const auto& bterm : bterm_connections_) { - addBPinToDb(bterm); + odb::Rect bterm_shape = bterm; + // Adjust width of shape when bterm is on the edge of the die area + if (bterm.xMin() == block_area.xMin() + || bterm.xMax() == block_area.xMax()) { + bterm_shape.set_ylo(rect_.yMin()); + bterm_shape.set_yhi(rect_.yMax()); + } else if (bterm.yMin() == block_area.yMin() + || bterm.yMax() == block_area.yMax()) { + bterm_shape.set_xlo(rect_.xMin()); + bterm_shape.set_xhi(rect_.xMax()); + } + addBPinToDb(bterm_shape); } } } diff --git a/src/pdn/test/core_grid_extend_to_boundary.defok b/src/pdn/test/core_grid_extend_to_boundary.defok index cd7626f7b94..2420d424687 100644 --- a/src/pdn/test/core_grid_extend_to_boundary.defok +++ b/src/pdn/test/core_grid_extend_to_boundary.defok @@ -83,8 +83,8 @@ VIAS 6 ; - via2_3_4000_340_1_12_320_320 + VIARULE Via2Array-0 + CUTSIZE 140 140 + LAYERS metal2 via2 metal3 + CUTSPACING 180 180 + ENCLOSURE 70 70 70 70 + ROWCOL 1 12 ; - via3_4_4000_340_1_12_320_320 + VIARULE Via3Array-0 + CUTSIZE 140 140 + LAYERS metal3 via3 metal4 + CUTSPACING 180 180 + ENCLOSURE 70 70 70 70 + ROWCOL 1 12 ; - via4_5_4000_340_1_7_600_600 + VIARULE Via4Array-0 + CUTSIZE 280 280 + LAYERS metal4 via4 metal5 + CUTSPACING 320 320 + ENCLOSURE 0 0 0 0 + ROWCOL 1 7 ; - - via5_6_4000_340_1_7_600_600 + VIARULE Via5Array-0 + CUTSIZE 280 280 + LAYERS metal5 via5 metal6 + CUTSPACING 320 320 + ENCLOSURE 0 0 60 30 + ROWCOL 1 7 ; - - via5_6_4000_4000_7_7_600_600 + VIARULE Via5Array-0 + CUTSIZE 280 280 + LAYERS metal5 via5 metal6 + CUTSPACING 320 320 + ENCLOSURE 60 60 60 60 + ROWCOL 7 7 ; + - via5_6_4000_340_1_7_600_600 + VIARULE Via5Array-0 + CUTSIZE 280 280 + LAYERS metal5 via5 metal6 + CUTSPACING 320 320 + ENCLOSURE 0 0 60 0 + ROWCOL 1 7 ; + - via5_6_4000_4000_7_7_600_600 + VIARULE Via5Array-0 + CUTSIZE 280 280 + LAYERS metal5 via5 metal6 + CUTSPACING 320 320 + ENCLOSURE 0 60 60 0 + ROWCOL 7 7 ; END VIAS COMPONENTS 482 ; - PHY_1 FILLCELL_X1 + SOURCE DIST + FIXED ( 100320 22400 ) FS ; diff --git a/src/pdn/test/core_grid_extend_to_boundary_no_pins.defok b/src/pdn/test/core_grid_extend_to_boundary_no_pins.defok index 990c842bf45..ec56fe0ae0f 100644 --- a/src/pdn/test/core_grid_extend_to_boundary_no_pins.defok +++ b/src/pdn/test/core_grid_extend_to_boundary_no_pins.defok @@ -83,8 +83,8 @@ VIAS 6 ; - via2_3_4000_340_1_12_320_320 + VIARULE Via2Array-0 + CUTSIZE 140 140 + LAYERS metal2 via2 metal3 + CUTSPACING 180 180 + ENCLOSURE 70 70 70 70 + ROWCOL 1 12 ; - via3_4_4000_340_1_12_320_320 + VIARULE Via3Array-0 + CUTSIZE 140 140 + LAYERS metal3 via3 metal4 + CUTSPACING 180 180 + ENCLOSURE 70 70 70 70 + ROWCOL 1 12 ; - via4_5_4000_340_1_7_600_600 + VIARULE Via4Array-0 + CUTSIZE 280 280 + LAYERS metal4 via4 metal5 + CUTSPACING 320 320 + ENCLOSURE 0 0 0 0 + ROWCOL 1 7 ; - - via5_6_4000_340_1_7_600_600 + VIARULE Via5Array-0 + CUTSIZE 280 280 + LAYERS metal5 via5 metal6 + CUTSPACING 320 320 + ENCLOSURE 0 0 60 30 + ROWCOL 1 7 ; - - via5_6_4000_4000_7_7_600_600 + VIARULE Via5Array-0 + CUTSIZE 280 280 + LAYERS metal5 via5 metal6 + CUTSPACING 320 320 + ENCLOSURE 60 60 60 60 + ROWCOL 7 7 ; + - via5_6_4000_340_1_7_600_600 + VIARULE Via5Array-0 + CUTSIZE 280 280 + LAYERS metal5 via5 metal6 + CUTSPACING 320 320 + ENCLOSURE 0 0 60 0 + ROWCOL 1 7 ; + - via5_6_4000_4000_7_7_600_600 + VIARULE Via5Array-0 + CUTSIZE 280 280 + LAYERS metal5 via5 metal6 + CUTSPACING 320 320 + ENCLOSURE 0 60 60 0 + ROWCOL 7 7 ; END VIAS COMPONENTS 482 ; - PHY_1 FILLCELL_X1 + SOURCE DIST + FIXED ( 100320 22400 ) FS ; From 282e1408d6ab244f8cba232f5e0bd465ac5268d4 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Wed, 13 Mar 2024 14:35:15 -0700 Subject: [PATCH 32/45] Update the metrics for pin swapping robustness Accept: aes_sky130hs DRT::max_slew_slack -26% < -10% DRT::max_capacitance_slack -29% < -12% aes_sky130hd GRT::ANT::errors 4 > 2 ; DRT::worst_slack_max -1.95 <= -1.78 ; DRT::max_slew_slack -57% < -19% ; DRT::max_capacitance_slack -64% < -22% ibex_sky130hd DRT::max_slew_slack -13% < -1% Signed-off-by: Matt Liberty --- test/aes_sky130hd.metrics | 84 +++++++++++++++---------------- test/aes_sky130hd.metrics_limits | 24 ++++----- test/aes_sky130hs.metrics | 76 ++++++++++++++-------------- test/aes_sky130hs.metrics_limits | 24 ++++----- test/ibex_sky130hd.metrics | 84 +++++++++++++++---------------- test/ibex_sky130hd.metrics_limits | 18 +++---- 6 files changed, 150 insertions(+), 160 deletions(-) diff --git a/test/aes_sky130hd.metrics b/test/aes_sky130hd.metrics index 2b6035230e7..85289f17a62 100644 --- a/test/aes_sky130hd.metrics +++ b/test/aes_sky130hd.metrics @@ -8,66 +8,62 @@ "design__instance__displacement__max": 13.233, "route__wirelength__estimated": 1.17088e+06, "RSZ::repair_design_buffer_count": "281", - "RSZ::max_slew_slack": "20.003902912139893", + "RSZ::max_slew_slack": "20.003910859425865", "RSZ::max_fanout_slack": "100.0", "RSZ::max_capacitance_slack": "81.39344276789393", "design__instance__displacement__total": 197.112, "design__instance__displacement__mean": 0.003, "design__instance__displacement__max": 9.05, "route__wirelength__estimated": 1.18573e+06, - "design__instance__count__setup_buffer": 1081, + "design__instance__count__setup_buffer": 954, "design__instance__count__hold_buffer": 333, - "RSZ::worst_slack_min": "0.0005067058027695403", - "RSZ::worst_slack_max": "-0.5759526352198947", - "RSZ::tns_max": "-78.18505530964731", + "RSZ::worst_slack_min": "0.0005062617135471305", + "RSZ::worst_slack_max": "-0.6463043616556046", + "RSZ::tns_max": "-85.86547538252458", "RSZ::hold_buffer_count": "333", - "design__instance__displacement__total": 6660.01, - "design__instance__displacement__mean": 0.117, - "design__instance__displacement__max": 13.635, - "route__wirelength__estimated": 1.28658e+06, - "DPL::utilization": "7.4", - "DPL::design_area": "222431", - "route__net": 16791, + "design__instance__displacement__total": 5837.85, + "design__instance__displacement__mean": 0.102, + "design__instance__displacement__max": 14.767, + "route__wirelength__estimated": 1.27657e+06, + "DPL::utilization": "7.3", + "DPL::design_area": "220994", + "route__net": 16664, "route__net__special": 2, - "antenna__violating__nets": 2, - "antenna__violating__pins": 2, - "GRT::ANT::errors": "2", + "antenna__violating__nets": 4, + "antenna__violating__pins": 4, + "GRT::ANT::errors": "4", "design__violations": 0, - "route__net": 16791, + "route__net": 16664, "route__net__special": 2, - "route__drc_errors__iter:1": 15985, - "route__wirelength__iter:1": 1630419, - "route__drc_errors__iter:2": 4907, - "route__wirelength__iter:2": 1624443, - "route__drc_errors__iter:3": 4319, - "route__wirelength__iter:3": 1621538, - "route__drc_errors__iter:4": 333, - "route__wirelength__iter:4": 1622283, - "route__drc_errors__iter:5": 46, - "route__wirelength__iter:5": 1622217, - "route__drc_errors__iter:6": 27, - "route__wirelength__iter:6": 1622221, - "route__drc_errors__iter:7": 14, - "route__wirelength__iter:7": 1622225, - "route__drc_errors__iter:8": 0, - "route__wirelength__iter:8": 1622218, + "route__drc_errors__iter:1": 13062, + "route__wirelength__iter:1": 1614494, + "route__drc_errors__iter:2": 3073, + "route__wirelength__iter:2": 1607769, + "route__drc_errors__iter:3": 2280, + "route__wirelength__iter:3": 1604834, + "route__drc_errors__iter:4": 153, + "route__wirelength__iter:4": 1605172, + "route__drc_errors__iter:5": 6, + "route__wirelength__iter:5": 1605168, + "route__drc_errors__iter:6": 0, + "route__wirelength__iter:6": 1605166, "route__drc_errors": 0, - "route__wirelength": 1622218, - "route__vias": 160226, - "route__vias__singlecut": 160226, + "route__wirelength": 1605166, + "route__vias": 159126, + "route__vias__singlecut": 159126, "route__vias__multicut": 0, "DRT::drv": "0", - "antenna__violating__nets": 99, - "antenna__violating__pins": 101, - "DRT::ANT::errors": "99", + "antenna__violating__nets": 93, + "antenna__violating__pins": 96, + "DRT::ANT::errors": "93", "timing__drv__floating__nets": 0, "timing__drv__floating__pins": 0, - "DRT::worst_slack_min": "-0.18114499302169298", - "DRT::worst_slack_max": "-1.4094996679877951", - "DRT::tns_max": "-157.54720995950018", - "DRT::clock_skew": "0.6833649395333666", - "DRT::max_slew_slack": "-15.645448366800943", + "DRT::worst_slack_min": "-0.26316471968699706", + "DRT::worst_slack_max": "-1.9527340297466504", + "DRT::tns_max": "-162.78936703852108", + "DRT::clock_skew": "0.7300389388532439", + "DRT::max_slew_slack": "-57.365993658701576", "DRT::max_fanout_slack": "100.0", - "DRT::max_capacitance_slack": "-17.951310626834886", + "DRT::max_capacitance_slack": "-64.29223093140345", "DRT::clock_period": "3.740000" } \ No newline at end of file diff --git a/test/aes_sky130hd.metrics_limits b/test/aes_sky130hd.metrics_limits index 558010e77d2..ab09adae8fd 100644 --- a/test/aes_sky130hd.metrics_limits +++ b/test/aes_sky130hd.metrics_limits @@ -1,23 +1,23 @@ { "IFP::instance_count" : "20652.0" - ,"DPL::design_area" : "266917.2" - ,"DPL::utilization" : "8.88" + ,"DPL::design_area" : "265192.8" + ,"DPL::utilization" : "8.76" ,"RSZ::repair_design_buffer_count" : "337" ,"RSZ::max_slew_slack" : "0" ,"RSZ::max_capacitance_slack" : "0" ,"RSZ::max_fanout_slack" : "0" - ,"RSZ::worst_slack_min" : "-0.37349329419723054" - ,"RSZ::worst_slack_max" : "-0.9499526352198948" - ,"RSZ::tns_max" : "-721.8390553096474" + ,"RSZ::worst_slack_min" : "-0.37349373828645294" + ,"RSZ::worst_slack_max" : "-1.0203043616556047" + ,"RSZ::tns_max" : "-729.5194753825247" ,"RSZ::hold_buffer_count" : "399" - ,"GRT::ANT::errors" : "2" + ,"GRT::ANT::errors" : "4" ,"DRT::drv" : "0" - ,"DRT::worst_slack_min" : "-0.5551449930216931" - ,"DRT::worst_slack_max" : "-1.7834996679877952" - ,"DRT::tns_max" : "-801.2012099595003" - ,"DRT::clock_skew" : "0.8200379274400399" - ,"DRT::max_slew_slack" : "-18.774538040161133" - ,"DRT::max_capacitance_slack" : "-21.541572752201862" + ,"DRT::worst_slack_min" : "-0.6371647196869972" + ,"DRT::worst_slack_max" : "-2.3267340297466506" + ,"DRT::tns_max" : "-806.4433670385212" + ,"DRT::clock_skew" : "0.8760467266238926" + ,"DRT::max_slew_slack" : "-68.8391923904419" + ,"DRT::max_capacitance_slack" : "-77.15067711768414" ,"DRT::max_fanout_slack" : "0" ,"DRT::clock_period" : "3.74" } diff --git a/test/aes_sky130hs.metrics b/test/aes_sky130hs.metrics index f31c7f26c1f..8497b52a03b 100644 --- a/test/aes_sky130hs.metrics +++ b/test/aes_sky130hs.metrics @@ -8,62 +8,60 @@ "design__instance__displacement__max": 17.474, "route__wirelength__estimated": 1.3173e+06, "RSZ::repair_design_buffer_count": "518", - "RSZ::max_slew_slack": "19.69558447599411", + "RSZ::max_slew_slack": "19.68039721250534", "RSZ::max_fanout_slack": "100.0", "RSZ::max_capacitance_slack": "56.280056146899526", - "design__instance__displacement__total": 213.084, + "design__instance__displacement__total": 208.702, "design__instance__displacement__mean": 0.004, "design__instance__displacement__max": 5.928, - "route__wirelength__estimated": 1.33444e+06, - "design__instance__count__setup_buffer": 841, - "design__instance__count__hold_buffer": 630, - "RSZ::worst_slack_min": "0.0005018208213230328", - "RSZ::worst_slack_max": "-0.6879021991187272", - "RSZ::tns_max": "-97.86111398227129", - "RSZ::hold_buffer_count": "630", - "design__instance__displacement__total": 7598.82, - "design__instance__displacement__mean": 0.155, - "design__instance__displacement__max": 16.235, - "route__wirelength__estimated": 1.3884e+06, - "DPL::utilization": "10.2", - "DPL::design_area": "307836", - "route__net": 16603, + "route__wirelength__estimated": 1.33431e+06, + "design__instance__count__setup_buffer": 1048, + "design__instance__count__hold_buffer": 603, + "RSZ::worst_slack_min": "0.0005535572157337702", + "RSZ::worst_slack_max": "-0.6330927072889141", + "RSZ::tns_max": "-92.18982460585138", + "RSZ::hold_buffer_count": "603", + "design__instance__displacement__total": 8845.2, + "design__instance__displacement__mean": 0.18, + "design__instance__displacement__max": 15.665, + "route__wirelength__estimated": 1.39611e+06, + "DPL::utilization": "10.3", + "DPL::design_area": "310555", + "route__net": 16783, "route__net__special": 2, "antenna__violating__nets": 0, "antenna__violating__pins": 0, "GRT::ANT::errors": "0", "design__violations": 0, - "route__net": 16603, + "route__net": 16783, "route__net__special": 2, - "route__drc_errors__iter:1": 13659, - "route__wirelength__iter:1": 1712986, - "route__drc_errors__iter:2": 3067, - "route__wirelength__iter:2": 1707016, - "route__drc_errors__iter:3": 2467, - "route__wirelength__iter:3": 1703968, - "route__drc_errors__iter:4": 61, - "route__wirelength__iter:4": 1704367, - "route__drc_errors__iter:5": 1, - "route__wirelength__iter:5": 1704356, - "route__drc_errors__iter:6": 0, - "route__wirelength__iter:6": 1704359, + "route__drc_errors__iter:1": 11211, + "route__wirelength__iter:1": 1713337, + "route__drc_errors__iter:2": 1493, + "route__wirelength__iter:2": 1707352, + "route__drc_errors__iter:3": 901, + "route__wirelength__iter:3": 1704609, + "route__drc_errors__iter:4": 33, + "route__wirelength__iter:4": 1704493, + "route__drc_errors__iter:5": 0, + "route__wirelength__iter:5": 1704502, "route__drc_errors": 0, - "route__wirelength": 1704359, - "route__vias": 149586, - "route__vias__singlecut": 149586, + "route__wirelength": 1704502, + "route__vias": 150275, + "route__vias__singlecut": 150275, "route__vias__multicut": 0, "DRT::drv": "0", "antenna__violating__nets": 111, - "antenna__violating__pins": 112, + "antenna__violating__pins": 113, "DRT::ANT::errors": "111", "timing__drv__floating__nets": 0, "timing__drv__floating__pins": 0, - "DRT::worst_slack_min": "-0.21183999598543343", - "DRT::worst_slack_max": "-1.0203118638768833", - "DRT::tns_max": "-136.2589795118327", - "DRT::clock_skew": "0.5525905445188898", - "DRT::max_slew_slack": "-8.156697452068329", + "DRT::worst_slack_min": "-0.13649493033294813", + "DRT::worst_slack_max": "-0.9857133166481611", + "DRT::tns_max": "-128.08198242317061", + "DRT::clock_skew": "0.4610624235125703", + "DRT::max_slew_slack": "-25.67313015460968", "DRT::max_fanout_slack": "100.0", - "DRT::max_capacitance_slack": "-10.2105758345311", + "DRT::max_capacitance_slack": "-28.645552976871397", "DRT::clock_period": "2.811000" } \ No newline at end of file diff --git a/test/aes_sky130hs.metrics_limits b/test/aes_sky130hs.metrics_limits index df2c6511190..0f73c835cae 100644 --- a/test/aes_sky130hs.metrics_limits +++ b/test/aes_sky130hs.metrics_limits @@ -1,23 +1,23 @@ { "IFP::instance_count" : "19588.8" - ,"DPL::design_area" : "369403.2" - ,"DPL::utilization" : "12.239999999999998" + ,"DPL::design_area" : "372666.0" + ,"DPL::utilization" : "12.360000000000001" ,"RSZ::repair_design_buffer_count" : "621" ,"RSZ::max_slew_slack" : "0" ,"RSZ::max_capacitance_slack" : "0" ,"RSZ::max_fanout_slack" : "0" - ,"RSZ::worst_slack_min" : "-0.28059817917867697" - ,"RSZ::worst_slack_max" : "-0.9690021991187272" - ,"RSZ::tns_max" : "-556.7287539822713" - ,"RSZ::hold_buffer_count" : "756" + ,"RSZ::worst_slack_min" : "-0.28054644278426627" + ,"RSZ::worst_slack_max" : "-0.9141927072889141" + ,"RSZ::tns_max" : "-551.0574646058515" + ,"RSZ::hold_buffer_count" : "723" ,"GRT::ANT::errors" : "0" ,"DRT::drv" : "0" - ,"DRT::worst_slack_min" : "-0.4929399959854335" - ,"DRT::worst_slack_max" : "-1.3014118638768832" - ,"DRT::tns_max" : "-595.1266195118328" - ,"DRT::clock_skew" : "0.6631086534226677" - ,"DRT::max_slew_slack" : "-9.788036942481995" - ,"DRT::max_capacitance_slack" : "-12.25269100143732" + ,"DRT::worst_slack_min" : "-0.41759493033294814" + ,"DRT::worst_slack_max" : "-1.266813316648161" + ,"DRT::tns_max" : "-586.9496224231707" + ,"DRT::clock_skew" : "0.5532749082150844" + ,"DRT::max_slew_slack" : "-30.807756185531616" + ,"DRT::max_capacitance_slack" : "-34.37466357224567" ,"DRT::max_fanout_slack" : "0" ,"DRT::clock_period" : "2.811" } diff --git a/test/ibex_sky130hd.metrics b/test/ibex_sky130hd.metrics index 852f25c133a..fb8c4cb3cd1 100644 --- a/test/ibex_sky130hd.metrics +++ b/test/ibex_sky130hd.metrics @@ -15,65 +15,61 @@ "design__instance__displacement__mean": 0.021, "design__instance__displacement__max": 9.898, "route__wirelength__estimated": 714611, - "design__instance__count__setup_buffer": 238, + "design__instance__count__setup_buffer": 242, "design__instance__count__hold_buffer": 332, - "RSZ::worst_slack_min": "0.00044364513318735383", - "RSZ::worst_slack_max": "-2.296500832278714", - "RSZ::tns_max": "-30.69140406468204", + "RSZ::worst_slack_min": "0.00044386717779855867", + "RSZ::worst_slack_max": "-2.284226206171308", + "RSZ::tns_max": "-30.56044748206407", "RSZ::hold_buffer_count": "332", - "design__instance__displacement__total": 3574.86, - "design__instance__displacement__mean": 0.151, + "design__instance__displacement__total": 3617.02, + "design__instance__displacement__mean": 0.153, "design__instance__displacement__max": 26.68, - "route__wirelength__estimated": 749610, + "route__wirelength__estimated": 750257, "DPL::utilization": "27.9", - "DPL::design_area": "169196", - "route__net": 15627, + "DPL::design_area": "169240", + "route__net": 15631, "route__net__special": 2, "antenna__violating__nets": 0, "antenna__violating__pins": 0, "GRT::ANT::errors": "0", "design__violations": 0, - "route__net": 15627, + "route__net": 15631, "route__net__special": 2, - "route__drc_errors__iter:1": 13484, - "route__wirelength__iter:1": 967591, - "route__drc_errors__iter:2": 3417, - "route__wirelength__iter:2": 962824, - "route__drc_errors__iter:3": 3050, - "route__wirelength__iter:3": 960646, - "route__drc_errors__iter:4": 469, - "route__wirelength__iter:4": 960990, - "route__drc_errors__iter:5": 161, - "route__wirelength__iter:5": 960913, - "route__drc_errors__iter:6": 64, - "route__wirelength__iter:6": 960918, - "route__drc_errors__iter:7": 27, - "route__wirelength__iter:7": 960922, - "route__drc_errors__iter:8": 13, - "route__wirelength__iter:8": 960909, - "route__drc_errors__iter:9": 12, - "route__wirelength__iter:9": 960911, - "route__drc_errors__iter:10": 7, - "route__wirelength__iter:10": 960906, - "route__drc_errors__iter:11": 0, - "route__wirelength__iter:11": 960906, + "route__drc_errors__iter:1": 11621, + "route__wirelength__iter:1": 963634, + "route__drc_errors__iter:2": 2003, + "route__wirelength__iter:2": 958270, + "route__drc_errors__iter:3": 1625, + "route__wirelength__iter:3": 956308, + "route__drc_errors__iter:4": 284, + "route__wirelength__iter:4": 956338, + "route__drc_errors__iter:5": 67, + "route__wirelength__iter:5": 956386, + "route__drc_errors__iter:6": 29, + "route__wirelength__iter:6": 956406, + "route__drc_errors__iter:7": 6, + "route__wirelength__iter:7": 956393, + "route__drc_errors__iter:8": 2, + "route__wirelength__iter:8": 956394, + "route__drc_errors__iter:9": 0, + "route__wirelength__iter:9": 956393, "route__drc_errors": 0, - "route__wirelength": 960906, - "route__vias": 130733, - "route__vias__singlecut": 130733, + "route__wirelength": 956393, + "route__vias": 130527, + "route__vias__singlecut": 130527, "route__vias__multicut": 0, "DRT::drv": "0", - "antenna__violating__nets": 41, - "antenna__violating__pins": 45, - "DRT::ANT::errors": "41", + "antenna__violating__nets": 42, + "antenna__violating__pins": 47, + "DRT::ANT::errors": "42", "timing__drv__floating__nets": 0, "timing__drv__floating__pins": 0, - "DRT::worst_slack_min": "-0.5978602226952019", - "DRT::worst_slack_max": "-3.491694143762117", - "DRT::tns_max": "-158.27543101912147", - "DRT::clock_skew": "2.9047698402133673", - "DRT::max_slew_slack": "-1.1719662696123123", + "DRT::worst_slack_min": "-0.533850756489337", + "DRT::worst_slack_max": "-3.34448211924706", + "DRT::tns_max": "-140.02018074653395", + "DRT::clock_skew": "2.8205421019342416", + "DRT::max_slew_slack": "-13.06274433930715", "DRT::max_fanout_slack": "100.0", - "DRT::max_capacitance_slack": "2.5332389361563186", + "DRT::max_capacitance_slack": "21.05764955915588", "DRT::clock_period": "15.155000" } \ No newline at end of file diff --git a/test/ibex_sky130hd.metrics_limits b/test/ibex_sky130hd.metrics_limits index 8d72e1ab3fd..3196f7d3965 100644 --- a/test/ibex_sky130hd.metrics_limits +++ b/test/ibex_sky130hd.metrics_limits @@ -1,22 +1,22 @@ { "IFP::instance_count" : "18835.2" - ,"DPL::design_area" : "203035.19999999998" + ,"DPL::design_area" : "203088.0" ,"DPL::utilization" : "33.48" ,"RSZ::repair_design_buffer_count" : "430" ,"RSZ::max_slew_slack" : "0" ,"RSZ::max_capacitance_slack" : "0" ,"RSZ::max_fanout_slack" : "0" - ,"RSZ::worst_slack_min" : "-1.5150563548668128" - ,"RSZ::worst_slack_max" : "-3.812000832278714" - ,"RSZ::tns_max" : "-2409.4202040646824" + ,"RSZ::worst_slack_min" : "-1.5150561328222014" + ,"RSZ::worst_slack_max" : "-3.799726206171308" + ,"RSZ::tns_max" : "-2409.289247482064" ,"RSZ::hold_buffer_count" : "398" ,"GRT::ANT::errors" : "0" ,"DRT::drv" : "0" - ,"DRT::worst_slack_min" : "-2.113360222695202" - ,"DRT::worst_slack_max" : "-5.007194143762117" - ,"DRT::tns_max" : "-2537.004231019122" - ,"DRT::clock_skew" : "3.4857238082560404" - ,"DRT::max_slew_slack" : "-1.4063595235347748" + ,"DRT::worst_slack_min" : "-2.049350756489337" + ,"DRT::worst_slack_max" : "-4.85998211924706" + ,"DRT::tns_max" : "-2518.7489807465345" + ,"DRT::clock_skew" : "3.3846505223210896" + ,"DRT::max_slew_slack" : "-15.675293207168579" ,"DRT::max_capacitance_slack" : "0" ,"DRT::max_fanout_slack" : "0" ,"DRT::clock_period" : "15.155" From cc7e50e3e088dd0baa52e8e95c8a228be7366597 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Thu, 14 Mar 2024 13:39:36 -0700 Subject: [PATCH 33/45] gui: fix problems when saving a CTS clock tree view Sometimes the view would come out as a uselessly small image. I've added what should be a no-op but empirically fixes the problem for reasons I don't understand. Signed-off-by: Matt Liberty --- src/gui/src/clockWidget.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/src/clockWidget.cpp b/src/gui/src/clockWidget.cpp index 90236393d45..07bb7523640 100644 --- a/src/gui/src/clockWidget.cpp +++ b/src/gui/src/clockWidget.cpp @@ -1495,6 +1495,7 @@ void ClockWidget::saveImage(const std::string& clock_name, if (height_px.has_value()) { view_size.setHeight(height_px.value()); } + print_view.scale(1, 1); // mysteriously necessary sometimes print_view.resize(view_size); // Ensure the new view is sized correctly by Qt by processing the event // so fit will work From fcf540b0974f2c9edc4726977b7434faeccdcaa8 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Thu, 14 Mar 2024 14:05:19 -0700 Subject: [PATCH 34/45] Split out testing.cmake Signed-off-by: Matt Liberty --- CMakeLists.txt | 16 ++-------------- src/cmake/openroad.cmake | 1 + src/cmake/testing.cmake | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 14 deletions(-) create mode 100644 src/cmake/testing.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index b3995631f8b..faddf8797a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -142,23 +142,11 @@ configure_file( # Ask CMake to output a compile_commands.json file for use with things like clang-tidy set(CMAKE_EXPORT_COMPILE_COMMANDS 1) -# Integration Test Macro -find_program (BASH_PROGRAM bash REQUIRED) - -function(or_integration_test tool_name test_name regression_binary) - add_test ( - NAME ${tool_name}.${test_name} - COMMAND ${BASH_PROGRAM} ${regression_binary} ${test_name} - WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} - ) - set_property(TEST ${tool_name}.${test_name} PROPERTY ENVIRONMENT "TEST_TYPE=compare_logfile;CTEST_TESTNAME=${test_name};DIFF_LOCATION=${CMAKE_CURRENT_LIST_DIR}/results/${test_name}.diff") - set_tests_properties(${tool_name}.${test_name} PROPERTIES LABELS "IntegrationTest") -endfunction() -# End Integration Test Macro - add_subdirectory(third-party) if(ENABLE_TESTS) + find_program (BASH_PROGRAM bash REQUIRED) + enable_testing() add_custom_target(build_and_test ${CMAKE_CTEST_COMMAND} --parallel --output-on-failure -LE IntegrationTest) include(GoogleTest) diff --git a/src/cmake/openroad.cmake b/src/cmake/openroad.cmake index 07a5681f92a..fbedafa34de 100644 --- a/src/cmake/openroad.cmake +++ b/src/cmake/openroad.cmake @@ -1,2 +1,3 @@ include("swig_lib") include("messages") +include("testing") diff --git a/src/cmake/testing.cmake b/src/cmake/testing.cmake new file mode 100644 index 00000000000..f51a0d4b13e --- /dev/null +++ b/src/cmake/testing.cmake @@ -0,0 +1,19 @@ +function(or_integration_test tool_name test_name regression_binary) + add_test ( + NAME ${tool_name}.${test_name} + COMMAND ${BASH_PROGRAM} ${regression_binary} ${test_name} + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + ) + + set(CONCAT ENV + "TEST_TYPE=compare_logfile;" + "CTEST_TESTNAME=${test_name};" + "DIFF_LOCATION=${CMAKE_CURRENT_LIST_DIR}/results/${test_name}.diff" + ) + + set_property(TEST ${tool_name}.${test_name} + PROPERTY ENVIRONMENT ${ENV}) + + set_tests_properties(${tool_name}.${test_name} + PROPERTIES LABELS "IntegrationTest") +endfunction() From 705f34596204fe3e6c57603dea80cd75b0604650 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Thu, 14 Mar 2024 14:18:07 -0700 Subject: [PATCH 35/45] pdn: correct core_grid_with_rings_connect result filename Signed-off-by: Matt Liberty --- src/pdn/test/core_grid_with_rings_connect.tcl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pdn/test/core_grid_with_rings_connect.tcl b/src/pdn/test/core_grid_with_rings_connect.tcl index b01b3710b66..f0639ed2698 100644 --- a/src/pdn/test/core_grid_with_rings_connect.tcl +++ b/src/pdn/test/core_grid_with_rings_connect.tcl @@ -19,6 +19,6 @@ add_pdn_connect -layers {metal1 metal6} pdngen -set def_file [make_result_file core_grid_with_rings.def] +set def_file [make_result_file core_grid_with_rings_connect.def] write_def $def_file diff_files core_grid_with_rings.defok $def_file From 35e09a69ec68a1c302899264809cc45188289986 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Thu, 14 Mar 2024 14:18:36 -0700 Subject: [PATCH 36/45] gpl: correct test_name in test/simple01-uniform Signed-off-by: Matt Liberty --- src/gpl/test/simple01-uniform.tcl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gpl/test/simple01-uniform.tcl b/src/gpl/test/simple01-uniform.tcl index a6235d48f47..e067792e923 100644 --- a/src/gpl/test/simple01-uniform.tcl +++ b/src/gpl/test/simple01-uniform.tcl @@ -1,9 +1,9 @@ source helpers.tcl -set test_name simple01 +set test_name simple01-uniform read_lef ./nangate45.lef read_def ./$test_name.def global_placement -init_density_penalty 0.01 -skip_initial_place -density uniform -set def_file [make_result_file $test_name-uniform.def] +set def_file [make_result_file $test_name.def] write_def $def_file -diff_file $def_file $test_name-uniform.defok +diff_file $def_file $test_name.defok From 1d2e2ccb7d73223dc6b66a9025563367e74463a8 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Thu, 14 Mar 2024 14:19:59 -0700 Subject: [PATCH 37/45] pdn: in macros_cells_via_failure write rpt in results Signed-off-by: Matt Liberty --- src/pdn/test/macros_cells_via_failure.tcl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pdn/test/macros_cells_via_failure.tcl b/src/pdn/test/macros_cells_via_failure.tcl index eb6400aaabb..07fe72693cd 100644 --- a/src/pdn/test/macros_cells_via_failure.tcl +++ b/src/pdn/test/macros_cells_via_failure.tcl @@ -49,7 +49,8 @@ add_pdn_stripe -grid {CORE_macro_grid_2} -layer {metal6} -width {0.93} -pitch {4 add_pdn_connect -grid {CORE_macro_grid_2} -layers {metal4 metal6} add_pdn_connect -grid {CORE_macro_grid_2} -layers {metal6 metal7} -pdngen -failed_via_report test.rpt +set rpt_file [make_result_file macros_cells_via_failure_test.rpt] +pdngen -failed_via_report $rpt_file set def_file [make_result_file macros_cells_via_failure.def] write_def $def_file From 2a06205982718068b5265d504d0297b9ccf2f3e6 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Thu, 14 Mar 2024 14:26:18 -0700 Subject: [PATCH 38/45] gpl: add symlink for simple01-uniform.def Signed-off-by: Matt Liberty --- src/gpl/test/simple01-uniform.def | 1 + 1 file changed, 1 insertion(+) create mode 120000 src/gpl/test/simple01-uniform.def diff --git a/src/gpl/test/simple01-uniform.def b/src/gpl/test/simple01-uniform.def new file mode 120000 index 00000000000..7c6bf5ed94f --- /dev/null +++ b/src/gpl/test/simple01-uniform.def @@ -0,0 +1 @@ +simple01.def \ No newline at end of file From 4fdf971b1071f0786b35a7a92d349e6527af867d Mon Sep 17 00:00:00 2001 From: Peter Gadfort Date: Thu, 14 Mar 2024 18:06:47 -0400 Subject: [PATCH 39/45] pdn: ensure vectors are re-initialized Signed-off-by: Peter Gadfort --- src/pdn/src/PdnGen.cc | 1 - src/pdn/src/grid.cpp | 4 ++-- src/pdn/src/shape.cpp | 9 +++++++-- src/pdn/src/shape.h | 4 ++-- src/pdn/src/sroute.cpp | 1 - 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/pdn/src/PdnGen.cc b/src/pdn/src/PdnGen.cc index 47b84d9effa..20f682f82e3 100644 --- a/src/pdn/src/PdnGen.cc +++ b/src/pdn/src/PdnGen.cc @@ -822,7 +822,6 @@ void PdnGen::ripUp(odb::dbNet* net) ShapeVectorMap net_shapes_vec; Shape::populateMapFromDb(net, net_shapes_vec); ShapeTreeMap net_shapes = Shape::convertVectorToTree(net_shapes_vec); - net_shapes_vec.clear(); // remove bterms that connect to swires std::set terms; diff --git a/src/pdn/src/grid.cpp b/src/pdn/src/grid.cpp index af247ac44c7..646b7cae99d 100644 --- a/src/pdn/src/grid.cpp +++ b/src/pdn/src/grid.cpp @@ -1562,8 +1562,8 @@ bool BumpGrid::isRouted() const { odb::dbNet* net = *getNets(startsWithPower()).begin(); - const auto pins = Shape::convertVectorToTree( - InstanceGrid::getInstancePins(getInstance())); + auto inst_pins = InstanceGrid::getInstancePins(getInstance()); + const auto pins = Shape::convertVectorToTree(inst_pins); for (auto* swire : net->getSWires()) { for (auto* sbox : swire->getWires()) { diff --git a/src/pdn/src/shape.cpp b/src/pdn/src/shape.cpp index 67ed7852632..b874dac6a73 100644 --- a/src/pdn/src/shape.cpp +++ b/src/pdn/src/shape.cpp @@ -617,7 +617,7 @@ Shape* Shape::extendTo( return new_shape.release(); } -ShapeTreeMap Shape::convertVectorToTree(const ShapeVectorMap& vec) +ShapeTreeMap Shape::convertVectorToTree(ShapeVectorMap& vec) { ShapeTreeMap trees; @@ -625,12 +625,17 @@ ShapeTreeMap Shape::convertVectorToTree(const ShapeVectorMap& vec) trees[layer] = ShapeTree(vals.begin(), vals.end()); } + vec = ShapeVectorMap(); + return trees; } -ViaTree Shape::convertVectorToTree(const std::vector& vec) +ViaTree Shape::convertVectorToTree(std::vector& vec) { ViaTree tree(vec.begin(), vec.end()); + + vec = std::vector(); + return tree; } diff --git a/src/pdn/src/shape.h b/src/pdn/src/shape.h index 12a1436e6b6..d70fc7e63b7 100644 --- a/src/pdn/src/shape.h +++ b/src/pdn/src/shape.h @@ -235,8 +235,8 @@ class Shape allow_non_preferred_change_ = true; } - static ShapeTreeMap convertVectorToTree(const ShapeVectorMap& vec); - static ViaTree convertVectorToTree(const std::vector& vec); + static ShapeTreeMap convertVectorToTree(ShapeVectorMap& vec); + static ViaTree convertVectorToTree(std::vector& vec); protected: bool cut(const ShapeTree& obstructions, diff --git a/src/pdn/src/sroute.cpp b/src/pdn/src/sroute.cpp index 89ed21f6182..dea8bdf9a87 100644 --- a/src/pdn/src/sroute.cpp +++ b/src/pdn/src/sroute.cpp @@ -670,7 +670,6 @@ void SRoute::createSrouteWires( Shape::populateMapFromDb(net, obstructions_vec); const ShapeTreeMap obstructions = Shape::convertVectorToTree(obstructions_vec); - obstructions_vec.clear(); for (auto* domain : domains) { for (const auto& grid : domain->getGrids()) { From f41936731f8ff945a63f70834e2a10bec9814ce4 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Thu, 14 Mar 2024 15:22:04 -0700 Subject: [PATCH 40/45] fix bug in testing.cmake Signed-off-by: Matt Liberty --- src/cmake/testing.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmake/testing.cmake b/src/cmake/testing.cmake index f51a0d4b13e..7b74a4e8fc2 100644 --- a/src/cmake/testing.cmake +++ b/src/cmake/testing.cmake @@ -5,7 +5,7 @@ function(or_integration_test tool_name test_name regression_binary) WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} ) - set(CONCAT ENV + string(CONCAT ENV "TEST_TYPE=compare_logfile;" "CTEST_TESTNAME=${test_name};" "DIFF_LOCATION=${CMAKE_CURRENT_LIST_DIR}/results/${test_name}.diff" From 5674cb7b59b0e04b013751e4b3fa13fa318e8533 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Thu, 14 Mar 2024 15:33:28 -0700 Subject: [PATCH 41/45] pdn: use swap in Shape::convertVectorToTree Assignment doesn't guarantee a capacity reduction. Signed-off-by: Matt Liberty --- src/pdn/src/shape.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pdn/src/shape.cpp b/src/pdn/src/shape.cpp index b874dac6a73..c8875f7d0d0 100644 --- a/src/pdn/src/shape.cpp +++ b/src/pdn/src/shape.cpp @@ -625,7 +625,8 @@ ShapeTreeMap Shape::convertVectorToTree(ShapeVectorMap& vec) trees[layer] = ShapeTree(vals.begin(), vals.end()); } - vec = ShapeVectorMap(); + ShapeVectorMap empty; + vec.swap(empty); return trees; } From 9889bee83c91666057cce580c4a2747b78bfd265 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Thu, 14 Mar 2024 15:55:52 -0700 Subject: [PATCH 42/45] dst: disable dst.TestDistributed Signed-off-by: Matt Liberty --- src/dst/test/cpp/CMakeLists.txt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/dst/test/cpp/CMakeLists.txt b/src/dst/test/cpp/CMakeLists.txt index c23bb8a8218..0beb1e33b16 100644 --- a/src/dst/test/cpp/CMakeLists.txt +++ b/src/dst/test/cpp/CMakeLists.txt @@ -39,13 +39,14 @@ add_test( COMMAND TestBalancer ) -add_test( - NAME "dst.TestDistributed" - COMMAND TestDistributed -) +# This test case appears to have an internal race condition +#add_test( +# NAME "dst.TestDistributed" +# COMMAND TestDistributed +#) add_dependencies(build_and_test TestWorker TestBalancer TestDistributed -) \ No newline at end of file +) From 824f47e3e1d4c89a06f40db56a6b9f7c90e9d7df Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Fri, 15 Mar 2024 14:00:03 -0300 Subject: [PATCH 43/45] Revert "Merge pull request #4673 from QuantamHD/tt_rsz_swap" This reverts commit 41d6ebc11bccacc539dae808187874c9d0804d4e, reversing changes made to 72fe7db9d0497c814f4b63db118da0973de76709. Signed-off-by: Eder Monteiro --- src/rsz/src/RepairSetup.cc | 247 ++-- src/rsz/src/RepairSetup.hh | 24 +- src/rsz/test/pin_swap1.ok | 1739 +++++++---------------------- test/aes_sky130hd.metrics | 84 +- test/aes_sky130hd.metrics_limits | 24 +- test/aes_sky130hs.metrics | 70 +- test/aes_sky130hs.metrics_limits | 24 +- test/ibex_sky130hd.metrics | 84 +- test/ibex_sky130hd.metrics_limits | 18 +- 9 files changed, 671 insertions(+), 1643 deletions(-) diff --git a/src/rsz/src/RepairSetup.cc b/src/rsz/src/RepairSetup.cc index 14f792a39cc..d3a778022d8 100644 --- a/src/rsz/src/RepairSetup.cc +++ b/src/rsz/src/RepairSetup.cc @@ -502,11 +502,6 @@ bool RepairSetup::swapPins(PathRef *drvr_path, LibertyPort *swap_port = input_port; sta::LibertyPortSet ports; - //Skip output to output paths - if (input_port->direction()->isOutput()) { - return false; - } - // Results for > 2 input gates are unpredictable. Only swap pins for // 2 input gates for now. int input_port_count = 0; @@ -518,7 +513,7 @@ bool RepairSetup::swapPins(PathRef *drvr_path, } } if (input_port_count > 2) { - return false; + return false; } // Check if we have already dealt with this instance @@ -531,14 +526,13 @@ bool RepairSetup::swapPins(PathRef *drvr_path, } // Find the equivalent pins for a cell (simple implementation for now) - // stash them. Ports are unique to a cell so we can just cache by port - // and that should apply to all instances of that cell with this input_port. - if (equiv_pin_map_.find(input_port) == equiv_pin_map_.end()) { - equivCellPins(cell, input_port, ports); - equiv_pin_map_.insert(input_port, ports); + // stash them + if (equiv_pin_map_.find(cell) == equiv_pin_map_.end()) { + equivCellPins(cell, ports); + equiv_pin_map_.insert(cell, ports); } - ports = equiv_pin_map_[input_port]; - if (!ports.empty()) { + ports = equiv_pin_map_[cell]; + if (ports.size() > 1) { resizer_->findSwapPinCandidate(input_port, drvr_port, load_cap, dcalc_ap, &swap_port); if (!sta::LibertyPort::equiv(swap_port, input_port)) { @@ -893,114 +887,76 @@ RepairSetup::fanout(Vertex *vertex) return fanout; } -bool RepairSetup::simulateExpr( - sta::FuncExpr* expr, - sta::UnorderedMap>& port_stimulus, - size_t table_index) -{ - using Operator = sta::FuncExpr::Operator; - const Operator curr_op = expr->op(); - - switch (curr_op) { - case Operator::op_not: - return !simulateExpr(expr->left(), port_stimulus, table_index); - case Operator::op_and: - return simulateExpr(expr->left(), port_stimulus, table_index) - && simulateExpr(expr->right(), port_stimulus, table_index); - case Operator::op_or: - return simulateExpr(expr->left(), port_stimulus, table_index) - || simulateExpr(expr->right(), port_stimulus, table_index); - case Operator::op_xor: - return simulateExpr(expr->left(), port_stimulus, table_index) - ^ simulateExpr(expr->right(), port_stimulus, table_index); - case Operator::op_one: - return true; - case Operator::op_zero: - return false; - case Operator::op_port: - return port_stimulus[expr->port()][table_index]; - } - - logger_->error(RSZ, 91, "unrecognized expr op from OpenSTA"); -} - -std::vector RepairSetup::simulateExpr( - sta::FuncExpr* expr, - sta::UnorderedMap>& port_stimulus) +void +RepairSetup::getEquivPortList2(sta::FuncExpr *expr, + sta::LibertyPortSet &ports, + sta::LibertyPortSet &inv_ports, + sta::FuncExpr::Operator &status) { - size_t table_length = 0x1 << port_stimulus.size(); - std::vector result; - result.resize(table_length); - for (size_t i = 0; i < table_length; i++) { - result[i] = simulateExpr(expr, port_stimulus, i); - } + using Operator = sta::FuncExpr::Operator ; + const Operator curr_op = expr->op(); - return result; + if (curr_op == Operator::op_not) { + getEquivPortList2(expr->left(), inv_ports, ports, status); + } + else if (status == Operator::op_zero && + (curr_op == Operator::op_and || + curr_op == Operator::op_or || + curr_op == Operator::op_xor)) { + // Start parsing the equivalent pins (if it is simple or/and/xor) + status = curr_op; + getEquivPortList2(expr->left(), ports, inv_ports, status); + if (status == Operator::op_port) { + return; + } + getEquivPortList2(expr->right(), ports, inv_ports, status); + if (status == Operator::op_port) { + return; + } + status = Operator::op_one; + } + else if (status == curr_op) { + // handle > 2 input scenarios (up to any arbitrary number) + getEquivPortList2(expr->left(), ports, inv_ports, status); + if (status == Operator::op_port) { + return; + } + getEquivPortList2(expr->right(), ports, inv_ports, status); + if (status == Operator::op_port) { + return; + } + } + else if (curr_op == Operator::op_port && expr->port() != nullptr) { + ports.insert(expr->port()); + } + else { + status = Operator::op_port; // moved to some other operator. + ports.clear(); + inv_ports.clear(); + } } -bool RepairSetup::isPortEqiv(sta::FuncExpr* expr, - const LibertyCell* cell, - const LibertyPort* port_a, - const LibertyPort* port_b) +void +RepairSetup::getEquivPortList(sta::FuncExpr *expr, sta::LibertyPortSet &ports) { - if (port_a->libertyCell() != cell || port_b->libertyCell() != cell) { - return false; - } - - sta::LibertyCellPortIterator port_iter(cell); - sta::UnorderedMap> port_stimulus; - size_t input_port_count = 0; - while (port_iter.hasNext()) { - LibertyPort* port = port_iter.next(); - if (port->direction()->isInput()) { - ++input_port_count; - port_stimulus[port] = {}; - } - } - - if (input_port_count > 16) { - // Not worth manually simulating all these values. - // Probably need to do SAT solving or something else instead. - return false; - } - - // Generate stimulus for the ports - size_t var_index = 0; - for (auto& it : port_stimulus) { - size_t truth_table_length = 0x1 << input_port_count; - std::vector& variable_stimulus = it.second; - variable_stimulus.resize(truth_table_length, false); - for (int i = 0; i < truth_table_length; i++) { - variable_stimulus[i] = static_cast((i >> var_index) & 0x1); + sta::FuncExpr::Operator status = sta::FuncExpr::op_zero; + ports.clear(); + sta::LibertyPortSet inv_ports; + getEquivPortList2(expr, ports, inv_ports, status); + if (inv_ports.size() > ports.size()) { + ports = inv_ports; } - var_index++; - } - - std::vector result_no_swap = simulateExpr(expr, port_stimulus); - - // Swap pins - std::swap(port_stimulus.at(port_a), port_stimulus.at(port_b)); - - std::vector result_with_swap = simulateExpr(expr, port_stimulus); - - // Check if truth tables are equivalent post swap. If they are then pins - // are equivalent. - for (size_t i = 0; i < result_no_swap.size(); i++) { - if (result_no_swap[i] != result_with_swap[i]) { - return false; + if (status == sta::FuncExpr::op_port || ports.size() == 1) { + ports.clear(); } - } - - return true; } // Lets just look at the first list for now. // We may want to cache this information somwhere (by building it up for the whole // library). // Or just generate it when the cell is being created (depending on agreement). -void RepairSetup::equivCellPins(const LibertyCell* cell, - LibertyPort* input_port, - sta::LibertyPortSet& ports) +void +RepairSetup::equivCellPins(const LibertyCell *cell, sta::LibertyPortSet &ports) { if (cell->hasSequentials() || cell->isIsolationCell()) { ports.clear(); @@ -1010,61 +966,25 @@ void RepairSetup::equivCellPins(const LibertyCell* cell, int outputs = 0; int inputs = 0; - // count number of output ports. + // count number of output ports. Skip ports with > 1 output for now. while (port_iter.hasNext()) { LibertyPort *port = port_iter.next(); if (port->direction()->isOutput()) { - ++outputs; + ++outputs; } else { ++inputs; } } - if (outputs >= 1 && inputs >= 2) { - sta::LibertyCellPortIterator port_iter2(cell); - while (port_iter2.hasNext()) { - LibertyPort* candidate_port = port_iter2.next(); - if (!candidate_port->direction()->isInput()) { - continue; - } - - sta::LibertyCellPortIterator output_port_iter(cell); - std::optional is_equivalent; - // Loop through all the output ports and make sure they are equivalent - // under swaps of candidate_port and input_port. For multi-ouput gates - // like full adders. - while (output_port_iter.hasNext()) { - LibertyPort* output_candidate_port = output_port_iter.next(); - sta::FuncExpr* output_expr = output_candidate_port->function(); - if (!output_candidate_port->direction()->isOutput()) { - continue; - } - - if (output_expr == nullptr) { - continue; - } - - if (input_port == candidate_port) { - continue; - } - - bool is_equivalent_result - = isPortEqiv(output_expr, cell, input_port, candidate_port); - - if (!is_equivalent.has_value()) { - is_equivalent = is_equivalent_result; - continue; - } - - is_equivalent = is_equivalent.value() && is_equivalent_result; - } - - // candidate_port is equivalent to input_port under all output ports - // of this cell. - if (is_equivalent.has_value() && is_equivalent.value()) { - ports.insert(candidate_port); + if (outputs == 1 && inputs >= 2) { + sta::LibertyCellPortIterator port_iter2(cell); + while (port_iter2.hasNext()) { + LibertyPort *port = port_iter2.next(); + sta::FuncExpr *expr = port->function(); + if (expr != nullptr) { + getEquivPortList(expr, ports); + } } - } } } @@ -1079,20 +999,13 @@ RepairSetup::reportSwappablePins() sta::LibertyCellIterator cell_iter(library); while (cell_iter.hasNext()) { sta::LibertyCell* cell = cell_iter.next(); - sta::LibertyCellPortIterator port_iter(cell); - while (port_iter.hasNext()) { - LibertyPort* port = port_iter.next(); - if (!port->direction()->isInput()) { - continue; - } - sta::LibertyPortSet ports; - equivCellPins(cell, port, ports); - std::ostringstream ostr; - for (auto port : ports) { - ostr << ' ' << port->name(); - } - logger_->report("{}/{} ->{}", cell->name(), port->name(), ostr.str()); + sta::LibertyPortSet ports; + equivCellPins(cell, ports); + std::ostringstream ostr; + for (auto port : ports) { + ostr << ' ' << port->name(); } + logger_->report("{} ->{}", cell->name(), ostr.str()); } } } diff --git a/src/rsz/src/RepairSetup.hh b/src/rsz/src/RepairSetup.hh index f16827af5fb..4ab9476d5c3 100644 --- a/src/rsz/src/RepairSetup.hh +++ b/src/rsz/src/RepairSetup.hh @@ -34,9 +34,7 @@ /////////////////////////////////////////////////////////////////////////////// #pragma once -#include #include - #include "db_sta/dbNetwork.hh" #include "db_sta/dbSta.hh" #include "sta/FuncExpr.hh" @@ -106,20 +104,12 @@ private: bool skip_gate_cloning); void debugCheckMultipleBuffers(PathRef &path, PathExpanded *expanded); - bool simulateExpr( - sta::FuncExpr* expr, - sta::UnorderedMap>& port_stimulus, - size_t table_index); - std::vector simulateExpr( - sta::FuncExpr* expr, - sta::UnorderedMap>& port_stimulus); - bool isPortEqiv(sta::FuncExpr* expr, - const LibertyCell* cell, - const LibertyPort* port_a, - const LibertyPort* port_b); - void equivCellPins(const LibertyCell* cell, - LibertyPort* input_port, - sta::LibertyPortSet& ports); + + void getEquivPortList2(sta::FuncExpr *expr, sta::LibertyPortSet &ports, + sta::LibertyPortSet &inv_ports, + sta::FuncExpr::Operator &status); + void getEquivPortList(sta::FuncExpr *expr, sta::LibertyPortSet &ports); + void equivCellPins(const LibertyCell *cell, sta::LibertyPortSet &ports); bool swapPins(PathRef *drvr_path, int drvr_index, PathExpanded *expanded); bool upsizeDrvr(PathRef *drvr_path, int drvr_index, @@ -178,7 +168,7 @@ private: const MinMax *min_; const MinMax *max_; - sta::UnorderedMap equiv_pin_map_; + sta::UnorderedMap equiv_pin_map_; static constexpr int decreasing_slack_max_passes_ = 50; static constexpr int rebuffer_max_fanout_ = 20; diff --git a/src/rsz/test/pin_swap1.ok b/src/rsz/test/pin_swap1.ok index 84285679f14..16a21fdc0c9 100644 --- a/src/rsz/test/pin_swap1.ok +++ b/src/rsz/test/pin_swap1.ok @@ -10,1314 +10,431 @@ [INFO ODB-0131] Created 3 components and 14 component-terminals. [INFO ODB-0132] Created 2 special nets and 0 connections. [INFO ODB-0133] Created 4 nets and 6 connections. -sky130_fd_sc_hd__a2111o_1/A1 -> A2 -sky130_fd_sc_hd__a2111o_1/A2 -> A1 -sky130_fd_sc_hd__a2111o_1/B1 -> C1 D1 -sky130_fd_sc_hd__a2111o_1/C1 -> B1 D1 -sky130_fd_sc_hd__a2111o_1/D1 -> B1 C1 -sky130_fd_sc_hd__a2111o_2/A1 -> A2 -sky130_fd_sc_hd__a2111o_2/A2 -> A1 -sky130_fd_sc_hd__a2111o_2/B1 -> C1 D1 -sky130_fd_sc_hd__a2111o_2/C1 -> B1 D1 -sky130_fd_sc_hd__a2111o_2/D1 -> B1 C1 -sky130_fd_sc_hd__a2111o_4/A1 -> A2 -sky130_fd_sc_hd__a2111o_4/A2 -> A1 -sky130_fd_sc_hd__a2111o_4/B1 -> C1 D1 -sky130_fd_sc_hd__a2111o_4/C1 -> B1 D1 -sky130_fd_sc_hd__a2111o_4/D1 -> B1 C1 -sky130_fd_sc_hd__a2111oi_0/A1 -> A2 -sky130_fd_sc_hd__a2111oi_0/A2 -> A1 -sky130_fd_sc_hd__a2111oi_0/B1 -> C1 D1 -sky130_fd_sc_hd__a2111oi_0/C1 -> B1 D1 -sky130_fd_sc_hd__a2111oi_0/D1 -> B1 C1 -sky130_fd_sc_hd__a2111oi_1/A1 -> A2 -sky130_fd_sc_hd__a2111oi_1/A2 -> A1 -sky130_fd_sc_hd__a2111oi_1/B1 -> C1 D1 -sky130_fd_sc_hd__a2111oi_1/C1 -> B1 D1 -sky130_fd_sc_hd__a2111oi_1/D1 -> B1 C1 -sky130_fd_sc_hd__a2111oi_2/A1 -> A2 -sky130_fd_sc_hd__a2111oi_2/A2 -> A1 -sky130_fd_sc_hd__a2111oi_2/B1 -> C1 D1 -sky130_fd_sc_hd__a2111oi_2/C1 -> B1 D1 -sky130_fd_sc_hd__a2111oi_2/D1 -> B1 C1 -sky130_fd_sc_hd__a2111oi_4/A1 -> A2 -sky130_fd_sc_hd__a2111oi_4/A2 -> A1 -sky130_fd_sc_hd__a2111oi_4/B1 -> C1 D1 -sky130_fd_sc_hd__a2111oi_4/C1 -> B1 D1 -sky130_fd_sc_hd__a2111oi_4/D1 -> B1 C1 -sky130_fd_sc_hd__a211o_1/A1 -> A2 -sky130_fd_sc_hd__a211o_1/A2 -> A1 -sky130_fd_sc_hd__a211o_1/B1 -> C1 -sky130_fd_sc_hd__a211o_1/C1 -> B1 -sky130_fd_sc_hd__a211o_2/A1 -> A2 -sky130_fd_sc_hd__a211o_2/A2 -> A1 -sky130_fd_sc_hd__a211o_2/B1 -> C1 -sky130_fd_sc_hd__a211o_2/C1 -> B1 -sky130_fd_sc_hd__a211o_4/A1 -> A2 -sky130_fd_sc_hd__a211o_4/A2 -> A1 -sky130_fd_sc_hd__a211o_4/B1 -> C1 -sky130_fd_sc_hd__a211o_4/C1 -> B1 -sky130_fd_sc_hd__a211oi_1/A1 -> A2 -sky130_fd_sc_hd__a211oi_1/A2 -> A1 -sky130_fd_sc_hd__a211oi_1/B1 -> C1 -sky130_fd_sc_hd__a211oi_1/C1 -> B1 -sky130_fd_sc_hd__a211oi_2/A1 -> A2 -sky130_fd_sc_hd__a211oi_2/A2 -> A1 -sky130_fd_sc_hd__a211oi_2/B1 -> C1 -sky130_fd_sc_hd__a211oi_2/C1 -> B1 -sky130_fd_sc_hd__a211oi_4/A1 -> A2 -sky130_fd_sc_hd__a211oi_4/A2 -> A1 -sky130_fd_sc_hd__a211oi_4/B1 -> C1 -sky130_fd_sc_hd__a211oi_4/C1 -> B1 -sky130_fd_sc_hd__a21bo_1/A1 -> A2 -sky130_fd_sc_hd__a21bo_1/A2 -> A1 -sky130_fd_sc_hd__a21bo_1/B1_N -> -sky130_fd_sc_hd__a21bo_2/A1 -> A2 -sky130_fd_sc_hd__a21bo_2/A2 -> A1 -sky130_fd_sc_hd__a21bo_2/B1_N -> -sky130_fd_sc_hd__a21bo_4/A1 -> A2 -sky130_fd_sc_hd__a21bo_4/A2 -> A1 -sky130_fd_sc_hd__a21bo_4/B1_N -> -sky130_fd_sc_hd__a21boi_0/A1 -> A2 -sky130_fd_sc_hd__a21boi_0/A2 -> A1 -sky130_fd_sc_hd__a21boi_0/B1_N -> -sky130_fd_sc_hd__a21boi_1/A1 -> A2 -sky130_fd_sc_hd__a21boi_1/A2 -> A1 -sky130_fd_sc_hd__a21boi_1/B1_N -> -sky130_fd_sc_hd__a21boi_2/A1 -> A2 -sky130_fd_sc_hd__a21boi_2/A2 -> A1 -sky130_fd_sc_hd__a21boi_2/B1_N -> -sky130_fd_sc_hd__a21boi_4/A1 -> A2 -sky130_fd_sc_hd__a21boi_4/A2 -> A1 -sky130_fd_sc_hd__a21boi_4/B1_N -> -sky130_fd_sc_hd__a21o_1/A1 -> A2 -sky130_fd_sc_hd__a21o_1/A2 -> A1 -sky130_fd_sc_hd__a21o_1/B1 -> -sky130_fd_sc_hd__a21o_2/A1 -> A2 -sky130_fd_sc_hd__a21o_2/A2 -> A1 -sky130_fd_sc_hd__a21o_2/B1 -> -sky130_fd_sc_hd__a21o_4/A1 -> A2 -sky130_fd_sc_hd__a21o_4/A2 -> A1 -sky130_fd_sc_hd__a21o_4/B1 -> -sky130_fd_sc_hd__a21oi_1/A1 -> A2 -sky130_fd_sc_hd__a21oi_1/A2 -> A1 -sky130_fd_sc_hd__a21oi_1/B1 -> -sky130_fd_sc_hd__a21oi_2/A1 -> A2 -sky130_fd_sc_hd__a21oi_2/A2 -> A1 -sky130_fd_sc_hd__a21oi_2/B1 -> -sky130_fd_sc_hd__a21oi_4/A1 -> A2 -sky130_fd_sc_hd__a21oi_4/A2 -> A1 -sky130_fd_sc_hd__a21oi_4/B1 -> -sky130_fd_sc_hd__a221o_1/A1 -> A2 -sky130_fd_sc_hd__a221o_1/A2 -> A1 -sky130_fd_sc_hd__a221o_1/B1 -> B2 -sky130_fd_sc_hd__a221o_1/B2 -> B1 -sky130_fd_sc_hd__a221o_1/C1 -> -sky130_fd_sc_hd__a221o_2/A1 -> A2 -sky130_fd_sc_hd__a221o_2/A2 -> A1 -sky130_fd_sc_hd__a221o_2/B1 -> B2 -sky130_fd_sc_hd__a221o_2/B2 -> B1 -sky130_fd_sc_hd__a221o_2/C1 -> -sky130_fd_sc_hd__a221o_4/A1 -> A2 -sky130_fd_sc_hd__a221o_4/A2 -> A1 -sky130_fd_sc_hd__a221o_4/B1 -> B2 -sky130_fd_sc_hd__a221o_4/B2 -> B1 -sky130_fd_sc_hd__a221o_4/C1 -> -sky130_fd_sc_hd__a221oi_1/A1 -> A2 -sky130_fd_sc_hd__a221oi_1/A2 -> A1 -sky130_fd_sc_hd__a221oi_1/B1 -> B2 -sky130_fd_sc_hd__a221oi_1/B2 -> B1 -sky130_fd_sc_hd__a221oi_1/C1 -> -sky130_fd_sc_hd__a221oi_2/A1 -> A2 -sky130_fd_sc_hd__a221oi_2/A2 -> A1 -sky130_fd_sc_hd__a221oi_2/B1 -> B2 -sky130_fd_sc_hd__a221oi_2/B2 -> B1 -sky130_fd_sc_hd__a221oi_2/C1 -> -sky130_fd_sc_hd__a221oi_4/A1 -> A2 -sky130_fd_sc_hd__a221oi_4/A2 -> A1 -sky130_fd_sc_hd__a221oi_4/B1 -> B2 -sky130_fd_sc_hd__a221oi_4/B2 -> B1 -sky130_fd_sc_hd__a221oi_4/C1 -> -sky130_fd_sc_hd__a222oi_1/A1 -> A2 -sky130_fd_sc_hd__a222oi_1/A2 -> A1 -sky130_fd_sc_hd__a222oi_1/B1 -> B2 -sky130_fd_sc_hd__a222oi_1/B2 -> B1 -sky130_fd_sc_hd__a222oi_1/C1 -> C2 -sky130_fd_sc_hd__a222oi_1/C2 -> C1 -sky130_fd_sc_hd__a22o_1/A1 -> A2 -sky130_fd_sc_hd__a22o_1/A2 -> A1 -sky130_fd_sc_hd__a22o_1/B1 -> B2 -sky130_fd_sc_hd__a22o_1/B2 -> B1 -sky130_fd_sc_hd__a22o_2/A1 -> A2 -sky130_fd_sc_hd__a22o_2/A2 -> A1 -sky130_fd_sc_hd__a22o_2/B1 -> B2 -sky130_fd_sc_hd__a22o_2/B2 -> B1 -sky130_fd_sc_hd__a22o_4/A1 -> A2 -sky130_fd_sc_hd__a22o_4/A2 -> A1 -sky130_fd_sc_hd__a22o_4/B1 -> B2 -sky130_fd_sc_hd__a22o_4/B2 -> B1 -sky130_fd_sc_hd__a22oi_1/A1 -> A2 -sky130_fd_sc_hd__a22oi_1/A2 -> A1 -sky130_fd_sc_hd__a22oi_1/B1 -> B2 -sky130_fd_sc_hd__a22oi_1/B2 -> B1 -sky130_fd_sc_hd__a22oi_2/A1 -> A2 -sky130_fd_sc_hd__a22oi_2/A2 -> A1 -sky130_fd_sc_hd__a22oi_2/B1 -> B2 -sky130_fd_sc_hd__a22oi_2/B2 -> B1 -sky130_fd_sc_hd__a22oi_4/A1 -> A2 -sky130_fd_sc_hd__a22oi_4/A2 -> A1 -sky130_fd_sc_hd__a22oi_4/B1 -> B2 -sky130_fd_sc_hd__a22oi_4/B2 -> B1 -sky130_fd_sc_hd__a2bb2o_1/A1_N -> A2_N -sky130_fd_sc_hd__a2bb2o_1/A2_N -> A1_N -sky130_fd_sc_hd__a2bb2o_1/B1 -> B2 -sky130_fd_sc_hd__a2bb2o_1/B2 -> B1 -sky130_fd_sc_hd__a2bb2o_2/A1_N -> A2_N -sky130_fd_sc_hd__a2bb2o_2/A2_N -> A1_N -sky130_fd_sc_hd__a2bb2o_2/B1 -> B2 -sky130_fd_sc_hd__a2bb2o_2/B2 -> B1 -sky130_fd_sc_hd__a2bb2o_4/A1_N -> A2_N -sky130_fd_sc_hd__a2bb2o_4/A2_N -> A1_N -sky130_fd_sc_hd__a2bb2o_4/B1 -> B2 -sky130_fd_sc_hd__a2bb2o_4/B2 -> B1 -sky130_fd_sc_hd__a2bb2oi_1/A1_N -> A2_N -sky130_fd_sc_hd__a2bb2oi_1/A2_N -> A1_N -sky130_fd_sc_hd__a2bb2oi_1/B1 -> B2 -sky130_fd_sc_hd__a2bb2oi_1/B2 -> B1 -sky130_fd_sc_hd__a2bb2oi_2/A1_N -> A2_N -sky130_fd_sc_hd__a2bb2oi_2/A2_N -> A1_N -sky130_fd_sc_hd__a2bb2oi_2/B1 -> B2 -sky130_fd_sc_hd__a2bb2oi_2/B2 -> B1 -sky130_fd_sc_hd__a2bb2oi_4/A1_N -> A2_N -sky130_fd_sc_hd__a2bb2oi_4/A2_N -> A1_N -sky130_fd_sc_hd__a2bb2oi_4/B1 -> B2 -sky130_fd_sc_hd__a2bb2oi_4/B2 -> B1 -sky130_fd_sc_hd__a311o_1/A1 -> A2 A3 -sky130_fd_sc_hd__a311o_1/A2 -> A1 A3 -sky130_fd_sc_hd__a311o_1/A3 -> A1 A2 -sky130_fd_sc_hd__a311o_1/B1 -> C1 -sky130_fd_sc_hd__a311o_1/C1 -> B1 -sky130_fd_sc_hd__a311o_2/A1 -> A2 A3 -sky130_fd_sc_hd__a311o_2/A2 -> A1 A3 -sky130_fd_sc_hd__a311o_2/A3 -> A1 A2 -sky130_fd_sc_hd__a311o_2/B1 -> C1 -sky130_fd_sc_hd__a311o_2/C1 -> B1 -sky130_fd_sc_hd__a311o_4/A1 -> A2 A3 -sky130_fd_sc_hd__a311o_4/A2 -> A1 A3 -sky130_fd_sc_hd__a311o_4/A3 -> A1 A2 -sky130_fd_sc_hd__a311o_4/B1 -> C1 -sky130_fd_sc_hd__a311o_4/C1 -> B1 -sky130_fd_sc_hd__a311oi_1/A1 -> A2 A3 -sky130_fd_sc_hd__a311oi_1/A2 -> A1 A3 -sky130_fd_sc_hd__a311oi_1/A3 -> A1 A2 -sky130_fd_sc_hd__a311oi_1/B1 -> C1 -sky130_fd_sc_hd__a311oi_1/C1 -> B1 -sky130_fd_sc_hd__a311oi_2/A1 -> A2 A3 -sky130_fd_sc_hd__a311oi_2/A2 -> A1 A3 -sky130_fd_sc_hd__a311oi_2/A3 -> A1 A2 -sky130_fd_sc_hd__a311oi_2/B1 -> C1 -sky130_fd_sc_hd__a311oi_2/C1 -> B1 -sky130_fd_sc_hd__a311oi_4/A1 -> A2 A3 -sky130_fd_sc_hd__a311oi_4/A2 -> A1 A3 -sky130_fd_sc_hd__a311oi_4/A3 -> A1 A2 -sky130_fd_sc_hd__a311oi_4/B1 -> C1 -sky130_fd_sc_hd__a311oi_4/C1 -> B1 -sky130_fd_sc_hd__a31o_1/A1 -> A2 A3 -sky130_fd_sc_hd__a31o_1/A2 -> A1 A3 -sky130_fd_sc_hd__a31o_1/A3 -> A1 A2 -sky130_fd_sc_hd__a31o_1/B1 -> -sky130_fd_sc_hd__a31o_2/A1 -> A2 A3 -sky130_fd_sc_hd__a31o_2/A2 -> A1 A3 -sky130_fd_sc_hd__a31o_2/A3 -> A1 A2 -sky130_fd_sc_hd__a31o_2/B1 -> -sky130_fd_sc_hd__a31o_4/A1 -> A2 A3 -sky130_fd_sc_hd__a31o_4/A2 -> A1 A3 -sky130_fd_sc_hd__a31o_4/A3 -> A1 A2 -sky130_fd_sc_hd__a31o_4/B1 -> -sky130_fd_sc_hd__a31oi_1/A1 -> A2 A3 -sky130_fd_sc_hd__a31oi_1/A2 -> A1 A3 -sky130_fd_sc_hd__a31oi_1/A3 -> A1 A2 -sky130_fd_sc_hd__a31oi_1/B1 -> -sky130_fd_sc_hd__a31oi_2/A1 -> A2 A3 -sky130_fd_sc_hd__a31oi_2/A2 -> A1 A3 -sky130_fd_sc_hd__a31oi_2/A3 -> A1 A2 -sky130_fd_sc_hd__a31oi_2/B1 -> -sky130_fd_sc_hd__a31oi_4/A1 -> A2 A3 -sky130_fd_sc_hd__a31oi_4/A2 -> A1 A3 -sky130_fd_sc_hd__a31oi_4/A3 -> A1 A2 -sky130_fd_sc_hd__a31oi_4/B1 -> -sky130_fd_sc_hd__a32o_1/A1 -> A2 A3 -sky130_fd_sc_hd__a32o_1/A2 -> A1 A3 -sky130_fd_sc_hd__a32o_1/A3 -> A1 A2 -sky130_fd_sc_hd__a32o_1/B1 -> B2 -sky130_fd_sc_hd__a32o_1/B2 -> B1 -sky130_fd_sc_hd__a32o_2/A1 -> A2 A3 -sky130_fd_sc_hd__a32o_2/A2 -> A1 A3 -sky130_fd_sc_hd__a32o_2/A3 -> A1 A2 -sky130_fd_sc_hd__a32o_2/B1 -> B2 -sky130_fd_sc_hd__a32o_2/B2 -> B1 -sky130_fd_sc_hd__a32o_4/A1 -> A2 A3 -sky130_fd_sc_hd__a32o_4/A2 -> A1 A3 -sky130_fd_sc_hd__a32o_4/A3 -> A1 A2 -sky130_fd_sc_hd__a32o_4/B1 -> B2 -sky130_fd_sc_hd__a32o_4/B2 -> B1 -sky130_fd_sc_hd__a32oi_1/A1 -> A2 A3 -sky130_fd_sc_hd__a32oi_1/A2 -> A1 A3 -sky130_fd_sc_hd__a32oi_1/A3 -> A1 A2 -sky130_fd_sc_hd__a32oi_1/B1 -> B2 -sky130_fd_sc_hd__a32oi_1/B2 -> B1 -sky130_fd_sc_hd__a32oi_2/A1 -> A2 A3 -sky130_fd_sc_hd__a32oi_2/A2 -> A1 A3 -sky130_fd_sc_hd__a32oi_2/A3 -> A1 A2 -sky130_fd_sc_hd__a32oi_2/B1 -> B2 -sky130_fd_sc_hd__a32oi_2/B2 -> B1 -sky130_fd_sc_hd__a32oi_4/A1 -> A2 A3 -sky130_fd_sc_hd__a32oi_4/A2 -> A1 A3 -sky130_fd_sc_hd__a32oi_4/A3 -> A1 A2 -sky130_fd_sc_hd__a32oi_4/B1 -> B2 -sky130_fd_sc_hd__a32oi_4/B2 -> B1 -sky130_fd_sc_hd__a41o_1/A1 -> A2 A3 A4 -sky130_fd_sc_hd__a41o_1/A2 -> A1 A3 A4 -sky130_fd_sc_hd__a41o_1/A3 -> A1 A2 A4 -sky130_fd_sc_hd__a41o_1/A4 -> A1 A2 A3 -sky130_fd_sc_hd__a41o_1/B1 -> -sky130_fd_sc_hd__a41o_2/A1 -> A2 A3 A4 -sky130_fd_sc_hd__a41o_2/A2 -> A1 A3 A4 -sky130_fd_sc_hd__a41o_2/A3 -> A1 A2 A4 -sky130_fd_sc_hd__a41o_2/A4 -> A1 A2 A3 -sky130_fd_sc_hd__a41o_2/B1 -> -sky130_fd_sc_hd__a41o_4/A1 -> A2 A3 A4 -sky130_fd_sc_hd__a41o_4/A2 -> A1 A3 A4 -sky130_fd_sc_hd__a41o_4/A3 -> A1 A2 A4 -sky130_fd_sc_hd__a41o_4/A4 -> A1 A2 A3 -sky130_fd_sc_hd__a41o_4/B1 -> -sky130_fd_sc_hd__a41oi_1/A1 -> A2 A3 A4 -sky130_fd_sc_hd__a41oi_1/A2 -> A1 A3 A4 -sky130_fd_sc_hd__a41oi_1/A3 -> A1 A2 A4 -sky130_fd_sc_hd__a41oi_1/A4 -> A1 A2 A3 -sky130_fd_sc_hd__a41oi_1/B1 -> -sky130_fd_sc_hd__a41oi_2/A1 -> A2 A3 A4 -sky130_fd_sc_hd__a41oi_2/A2 -> A1 A3 A4 -sky130_fd_sc_hd__a41oi_2/A3 -> A1 A2 A4 -sky130_fd_sc_hd__a41oi_2/A4 -> A1 A2 A3 -sky130_fd_sc_hd__a41oi_2/B1 -> -sky130_fd_sc_hd__a41oi_4/A1 -> A2 A3 A4 -sky130_fd_sc_hd__a41oi_4/A2 -> A1 A3 A4 -sky130_fd_sc_hd__a41oi_4/A3 -> A1 A2 A4 -sky130_fd_sc_hd__a41oi_4/A4 -> A1 A2 A3 -sky130_fd_sc_hd__a41oi_4/B1 -> -sky130_fd_sc_hd__and2_0/A -> B -sky130_fd_sc_hd__and2_0/B -> A -sky130_fd_sc_hd__and2_1/A -> B -sky130_fd_sc_hd__and2_1/B -> A -sky130_fd_sc_hd__and2_2/A -> B -sky130_fd_sc_hd__and2_2/B -> A -sky130_fd_sc_hd__and2_4/A -> B -sky130_fd_sc_hd__and2_4/B -> A -sky130_fd_sc_hd__and2b_1/A_N -> -sky130_fd_sc_hd__and2b_1/B -> -sky130_fd_sc_hd__and2b_2/A_N -> -sky130_fd_sc_hd__and2b_2/B -> -sky130_fd_sc_hd__and2b_4/A_N -> -sky130_fd_sc_hd__and2b_4/B -> -sky130_fd_sc_hd__and3_1/A -> B C -sky130_fd_sc_hd__and3_1/B -> A C -sky130_fd_sc_hd__and3_1/C -> A B -sky130_fd_sc_hd__and3_2/A -> B C -sky130_fd_sc_hd__and3_2/B -> A C -sky130_fd_sc_hd__and3_2/C -> A B -sky130_fd_sc_hd__and3_4/A -> B C -sky130_fd_sc_hd__and3_4/B -> A C -sky130_fd_sc_hd__and3_4/C -> A B -sky130_fd_sc_hd__and3b_1/A_N -> -sky130_fd_sc_hd__and3b_1/B -> C -sky130_fd_sc_hd__and3b_1/C -> B -sky130_fd_sc_hd__and3b_2/A_N -> -sky130_fd_sc_hd__and3b_2/B -> C -sky130_fd_sc_hd__and3b_2/C -> B -sky130_fd_sc_hd__and3b_4/A_N -> -sky130_fd_sc_hd__and3b_4/B -> C -sky130_fd_sc_hd__and3b_4/C -> B -sky130_fd_sc_hd__and4_1/A -> B C D -sky130_fd_sc_hd__and4_1/B -> A C D -sky130_fd_sc_hd__and4_1/C -> A B D -sky130_fd_sc_hd__and4_1/D -> A B C -sky130_fd_sc_hd__and4_2/A -> B C D -sky130_fd_sc_hd__and4_2/B -> A C D -sky130_fd_sc_hd__and4_2/C -> A B D -sky130_fd_sc_hd__and4_2/D -> A B C -sky130_fd_sc_hd__and4_4/A -> B C D -sky130_fd_sc_hd__and4_4/B -> A C D -sky130_fd_sc_hd__and4_4/C -> A B D -sky130_fd_sc_hd__and4_4/D -> A B C -sky130_fd_sc_hd__and4b_1/A_N -> -sky130_fd_sc_hd__and4b_1/B -> C D -sky130_fd_sc_hd__and4b_1/C -> B D -sky130_fd_sc_hd__and4b_1/D -> B C -sky130_fd_sc_hd__and4b_2/A_N -> -sky130_fd_sc_hd__and4b_2/B -> C D -sky130_fd_sc_hd__and4b_2/C -> B D -sky130_fd_sc_hd__and4b_2/D -> B C -sky130_fd_sc_hd__and4b_4/A_N -> -sky130_fd_sc_hd__and4b_4/B -> C D -sky130_fd_sc_hd__and4b_4/C -> B D -sky130_fd_sc_hd__and4b_4/D -> B C -sky130_fd_sc_hd__and4bb_1/A_N -> B_N -sky130_fd_sc_hd__and4bb_1/B_N -> A_N -sky130_fd_sc_hd__and4bb_1/C -> D -sky130_fd_sc_hd__and4bb_1/D -> C -sky130_fd_sc_hd__and4bb_2/A_N -> B_N -sky130_fd_sc_hd__and4bb_2/B_N -> A_N -sky130_fd_sc_hd__and4bb_2/C -> D -sky130_fd_sc_hd__and4bb_2/D -> C -sky130_fd_sc_hd__and4bb_4/A_N -> B_N -sky130_fd_sc_hd__and4bb_4/B_N -> A_N -sky130_fd_sc_hd__and4bb_4/C -> D -sky130_fd_sc_hd__and4bb_4/D -> C -sky130_fd_sc_hd__buf_1/A -> -sky130_fd_sc_hd__buf_12/A -> -sky130_fd_sc_hd__buf_16/A -> -sky130_fd_sc_hd__buf_2/A -> -sky130_fd_sc_hd__buf_4/A -> -sky130_fd_sc_hd__buf_6/A -> -sky130_fd_sc_hd__buf_8/A -> -sky130_fd_sc_hd__bufbuf_16/A -> -sky130_fd_sc_hd__bufbuf_8/A -> -sky130_fd_sc_hd__bufinv_16/A -> -sky130_fd_sc_hd__bufinv_8/A -> -sky130_fd_sc_hd__clkbuf_1/A -> -sky130_fd_sc_hd__clkbuf_16/A -> -sky130_fd_sc_hd__clkbuf_2/A -> -sky130_fd_sc_hd__clkbuf_4/A -> -sky130_fd_sc_hd__clkbuf_8/A -> -sky130_fd_sc_hd__clkdlybuf4s15_1/A -> -sky130_fd_sc_hd__clkdlybuf4s15_2/A -> -sky130_fd_sc_hd__clkdlybuf4s18_1/A -> -sky130_fd_sc_hd__clkdlybuf4s18_2/A -> -sky130_fd_sc_hd__clkdlybuf4s25_1/A -> -sky130_fd_sc_hd__clkdlybuf4s25_2/A -> -sky130_fd_sc_hd__clkdlybuf4s50_1/A -> -sky130_fd_sc_hd__clkdlybuf4s50_2/A -> -sky130_fd_sc_hd__clkinv_1/A -> -sky130_fd_sc_hd__clkinv_16/A -> -sky130_fd_sc_hd__clkinv_2/A -> -sky130_fd_sc_hd__clkinv_4/A -> -sky130_fd_sc_hd__clkinv_8/A -> -sky130_fd_sc_hd__clkinvlp_2/A -> -sky130_fd_sc_hd__clkinvlp_4/A -> -sky130_fd_sc_hd__dfbbn_1/CLK_N -> -sky130_fd_sc_hd__dfbbn_1/D -> -sky130_fd_sc_hd__dfbbn_1/RESET_B -> -sky130_fd_sc_hd__dfbbn_1/SET_B -> -sky130_fd_sc_hd__dfbbn_2/CLK_N -> -sky130_fd_sc_hd__dfbbn_2/D -> -sky130_fd_sc_hd__dfbbn_2/RESET_B -> -sky130_fd_sc_hd__dfbbn_2/SET_B -> -sky130_fd_sc_hd__dfbbp_1/CLK -> -sky130_fd_sc_hd__dfbbp_1/D -> -sky130_fd_sc_hd__dfbbp_1/RESET_B -> -sky130_fd_sc_hd__dfbbp_1/SET_B -> -sky130_fd_sc_hd__dfrbp_1/CLK -> -sky130_fd_sc_hd__dfrbp_1/D -> -sky130_fd_sc_hd__dfrbp_1/RESET_B -> -sky130_fd_sc_hd__dfrbp_2/CLK -> -sky130_fd_sc_hd__dfrbp_2/D -> -sky130_fd_sc_hd__dfrbp_2/RESET_B -> -sky130_fd_sc_hd__dfrtn_1/CLK_N -> -sky130_fd_sc_hd__dfrtn_1/D -> -sky130_fd_sc_hd__dfrtn_1/RESET_B -> -sky130_fd_sc_hd__dfrtp_1/CLK -> -sky130_fd_sc_hd__dfrtp_1/D -> -sky130_fd_sc_hd__dfrtp_1/RESET_B -> -sky130_fd_sc_hd__dfrtp_2/CLK -> -sky130_fd_sc_hd__dfrtp_2/D -> -sky130_fd_sc_hd__dfrtp_2/RESET_B -> -sky130_fd_sc_hd__dfrtp_4/CLK -> -sky130_fd_sc_hd__dfrtp_4/D -> -sky130_fd_sc_hd__dfrtp_4/RESET_B -> -sky130_fd_sc_hd__dfsbp_1/CLK -> -sky130_fd_sc_hd__dfsbp_1/D -> -sky130_fd_sc_hd__dfsbp_1/SET_B -> -sky130_fd_sc_hd__dfsbp_2/CLK -> -sky130_fd_sc_hd__dfsbp_2/D -> -sky130_fd_sc_hd__dfsbp_2/SET_B -> -sky130_fd_sc_hd__dfstp_1/CLK -> -sky130_fd_sc_hd__dfstp_1/D -> -sky130_fd_sc_hd__dfstp_1/SET_B -> -sky130_fd_sc_hd__dfstp_2/CLK -> -sky130_fd_sc_hd__dfstp_2/D -> -sky130_fd_sc_hd__dfstp_2/SET_B -> -sky130_fd_sc_hd__dfstp_4/CLK -> -sky130_fd_sc_hd__dfstp_4/D -> -sky130_fd_sc_hd__dfstp_4/SET_B -> -sky130_fd_sc_hd__dfxbp_1/CLK -> -sky130_fd_sc_hd__dfxbp_1/D -> -sky130_fd_sc_hd__dfxbp_2/CLK -> -sky130_fd_sc_hd__dfxbp_2/D -> -sky130_fd_sc_hd__dfxtp_1/CLK -> -sky130_fd_sc_hd__dfxtp_1/D -> -sky130_fd_sc_hd__dfxtp_2/CLK -> -sky130_fd_sc_hd__dfxtp_2/D -> -sky130_fd_sc_hd__dfxtp_4/CLK -> -sky130_fd_sc_hd__dfxtp_4/D -> -sky130_fd_sc_hd__diode_2/DIODE -> -sky130_fd_sc_hd__dlclkp_1/CLK -> -sky130_fd_sc_hd__dlclkp_1/GATE -> -sky130_fd_sc_hd__dlclkp_2/CLK -> -sky130_fd_sc_hd__dlclkp_2/GATE -> -sky130_fd_sc_hd__dlclkp_4/CLK -> -sky130_fd_sc_hd__dlclkp_4/GATE -> -sky130_fd_sc_hd__dlrbn_1/D -> -sky130_fd_sc_hd__dlrbn_1/GATE_N -> -sky130_fd_sc_hd__dlrbn_1/RESET_B -> -sky130_fd_sc_hd__dlrbn_2/D -> -sky130_fd_sc_hd__dlrbn_2/GATE_N -> -sky130_fd_sc_hd__dlrbn_2/RESET_B -> -sky130_fd_sc_hd__dlrbp_1/D -> -sky130_fd_sc_hd__dlrbp_1/GATE -> -sky130_fd_sc_hd__dlrbp_1/RESET_B -> -sky130_fd_sc_hd__dlrbp_2/D -> -sky130_fd_sc_hd__dlrbp_2/GATE -> -sky130_fd_sc_hd__dlrbp_2/RESET_B -> -sky130_fd_sc_hd__dlrtn_1/D -> -sky130_fd_sc_hd__dlrtn_1/GATE_N -> -sky130_fd_sc_hd__dlrtn_1/RESET_B -> -sky130_fd_sc_hd__dlrtn_2/D -> -sky130_fd_sc_hd__dlrtn_2/GATE_N -> -sky130_fd_sc_hd__dlrtn_2/RESET_B -> -sky130_fd_sc_hd__dlrtn_4/D -> -sky130_fd_sc_hd__dlrtn_4/GATE_N -> -sky130_fd_sc_hd__dlrtn_4/RESET_B -> -sky130_fd_sc_hd__dlrtp_1/D -> -sky130_fd_sc_hd__dlrtp_1/GATE -> -sky130_fd_sc_hd__dlrtp_1/RESET_B -> -sky130_fd_sc_hd__dlrtp_2/D -> -sky130_fd_sc_hd__dlrtp_2/GATE -> -sky130_fd_sc_hd__dlrtp_2/RESET_B -> -sky130_fd_sc_hd__dlrtp_4/D -> -sky130_fd_sc_hd__dlrtp_4/GATE -> -sky130_fd_sc_hd__dlrtp_4/RESET_B -> -sky130_fd_sc_hd__dlxbn_1/D -> -sky130_fd_sc_hd__dlxbn_1/GATE_N -> -sky130_fd_sc_hd__dlxbn_2/D -> -sky130_fd_sc_hd__dlxbn_2/GATE_N -> -sky130_fd_sc_hd__dlxbp_1/D -> -sky130_fd_sc_hd__dlxbp_1/GATE -> -sky130_fd_sc_hd__dlxtn_1/D -> -sky130_fd_sc_hd__dlxtn_1/GATE_N -> -sky130_fd_sc_hd__dlxtn_2/D -> -sky130_fd_sc_hd__dlxtn_2/GATE_N -> -sky130_fd_sc_hd__dlxtn_4/D -> -sky130_fd_sc_hd__dlxtn_4/GATE_N -> -sky130_fd_sc_hd__dlxtp_1/D -> -sky130_fd_sc_hd__dlxtp_1/GATE -> -sky130_fd_sc_hd__dlygate4sd1_1/A -> -sky130_fd_sc_hd__dlygate4sd2_1/A -> -sky130_fd_sc_hd__dlygate4sd3_1/A -> -sky130_fd_sc_hd__dlymetal6s2s_1/A -> -sky130_fd_sc_hd__dlymetal6s4s_1/A -> -sky130_fd_sc_hd__dlymetal6s6s_1/A -> -sky130_fd_sc_hd__ebufn_1/A -> -sky130_fd_sc_hd__ebufn_1/TE_B -> -sky130_fd_sc_hd__ebufn_2/A -> -sky130_fd_sc_hd__ebufn_2/TE_B -> -sky130_fd_sc_hd__ebufn_4/A -> -sky130_fd_sc_hd__ebufn_4/TE_B -> -sky130_fd_sc_hd__ebufn_8/A -> -sky130_fd_sc_hd__ebufn_8/TE_B -> -sky130_fd_sc_hd__edfxbp_1/CLK -> -sky130_fd_sc_hd__edfxbp_1/D -> -sky130_fd_sc_hd__edfxbp_1/DE -> -sky130_fd_sc_hd__edfxtp_1/CLK -> -sky130_fd_sc_hd__edfxtp_1/D -> -sky130_fd_sc_hd__edfxtp_1/DE -> -sky130_fd_sc_hd__einvn_0/A -> -sky130_fd_sc_hd__einvn_0/TE_B -> -sky130_fd_sc_hd__einvn_1/A -> -sky130_fd_sc_hd__einvn_1/TE_B -> -sky130_fd_sc_hd__einvn_2/A -> -sky130_fd_sc_hd__einvn_2/TE_B -> -sky130_fd_sc_hd__einvn_4/A -> -sky130_fd_sc_hd__einvn_4/TE_B -> -sky130_fd_sc_hd__einvn_8/A -> -sky130_fd_sc_hd__einvn_8/TE_B -> -sky130_fd_sc_hd__einvp_1/A -> -sky130_fd_sc_hd__einvp_1/TE -> -sky130_fd_sc_hd__einvp_2/A -> -sky130_fd_sc_hd__einvp_2/TE -> -sky130_fd_sc_hd__einvp_4/A -> -sky130_fd_sc_hd__einvp_4/TE -> -sky130_fd_sc_hd__einvp_8/A -> -sky130_fd_sc_hd__einvp_8/TE -> -sky130_fd_sc_hd__fa_1/A -> B CIN -sky130_fd_sc_hd__fa_1/B -> A CIN -sky130_fd_sc_hd__fa_1/CIN -> A B -sky130_fd_sc_hd__fa_2/A -> B CIN -sky130_fd_sc_hd__fa_2/B -> A CIN -sky130_fd_sc_hd__fa_2/CIN -> A B -sky130_fd_sc_hd__fa_4/A -> B CIN -sky130_fd_sc_hd__fa_4/B -> A CIN -sky130_fd_sc_hd__fa_4/CIN -> A B -sky130_fd_sc_hd__fah_1/A -> B CI -sky130_fd_sc_hd__fah_1/B -> A CI -sky130_fd_sc_hd__fah_1/CI -> A B -sky130_fd_sc_hd__fahcin_1/A -> B -sky130_fd_sc_hd__fahcin_1/B -> A -sky130_fd_sc_hd__fahcin_1/CIN -> -sky130_fd_sc_hd__fahcon_1/A -> B CI -sky130_fd_sc_hd__fahcon_1/B -> A CI -sky130_fd_sc_hd__fahcon_1/CI -> A B -sky130_fd_sc_hd__ha_1/A -> B -sky130_fd_sc_hd__ha_1/B -> A -sky130_fd_sc_hd__ha_2/A -> B -sky130_fd_sc_hd__ha_2/B -> A -sky130_fd_sc_hd__ha_4/A -> B -sky130_fd_sc_hd__ha_4/B -> A -sky130_fd_sc_hd__inv_1/A -> -sky130_fd_sc_hd__inv_12/A -> -sky130_fd_sc_hd__inv_16/A -> -sky130_fd_sc_hd__inv_2/A -> -sky130_fd_sc_hd__inv_4/A -> -sky130_fd_sc_hd__inv_6/A -> -sky130_fd_sc_hd__inv_8/A -> -sky130_fd_sc_hd__lpflow_bleeder_1/SHORT -> -sky130_fd_sc_hd__lpflow_clkbufkapwr_1/A -> -sky130_fd_sc_hd__lpflow_clkbufkapwr_16/A -> -sky130_fd_sc_hd__lpflow_clkbufkapwr_2/A -> -sky130_fd_sc_hd__lpflow_clkbufkapwr_4/A -> -sky130_fd_sc_hd__lpflow_clkbufkapwr_8/A -> -sky130_fd_sc_hd__lpflow_clkinvkapwr_1/A -> -sky130_fd_sc_hd__lpflow_clkinvkapwr_16/A -> -sky130_fd_sc_hd__lpflow_clkinvkapwr_2/A -> -sky130_fd_sc_hd__lpflow_clkinvkapwr_4/A -> -sky130_fd_sc_hd__lpflow_clkinvkapwr_8/A -> -sky130_fd_sc_hd__lpflow_inputiso0n_1/A -> -sky130_fd_sc_hd__lpflow_inputiso0n_1/SLEEP_B -> -sky130_fd_sc_hd__lpflow_inputiso0p_1/A -> -sky130_fd_sc_hd__lpflow_inputiso0p_1/SLEEP -> -sky130_fd_sc_hd__lpflow_inputiso1n_1/A -> -sky130_fd_sc_hd__lpflow_inputiso1n_1/SLEEP_B -> -sky130_fd_sc_hd__lpflow_inputiso1p_1/A -> -sky130_fd_sc_hd__lpflow_inputiso1p_1/SLEEP -> -sky130_fd_sc_hd__lpflow_inputisolatch_1/D -> -sky130_fd_sc_hd__lpflow_inputisolatch_1/SLEEP_B -> -sky130_fd_sc_hd__lpflow_isobufsrc_1/A -> -sky130_fd_sc_hd__lpflow_isobufsrc_1/SLEEP -> -sky130_fd_sc_hd__lpflow_isobufsrc_16/A -> -sky130_fd_sc_hd__lpflow_isobufsrc_16/SLEEP -> -sky130_fd_sc_hd__lpflow_isobufsrc_2/A -> -sky130_fd_sc_hd__lpflow_isobufsrc_2/SLEEP -> -sky130_fd_sc_hd__lpflow_isobufsrc_4/A -> -sky130_fd_sc_hd__lpflow_isobufsrc_4/SLEEP -> -sky130_fd_sc_hd__lpflow_isobufsrc_8/A -> -sky130_fd_sc_hd__lpflow_isobufsrc_8/SLEEP -> -sky130_fd_sc_hd__lpflow_isobufsrckapwr_16/A -> -sky130_fd_sc_hd__lpflow_isobufsrckapwr_16/SLEEP -> -sky130_fd_sc_hd__lpflow_lsbuf_lh_hl_isowell_tap_1/A -> -sky130_fd_sc_hd__lpflow_lsbuf_lh_hl_isowell_tap_2/A -> -sky130_fd_sc_hd__lpflow_lsbuf_lh_hl_isowell_tap_4/A -> -sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_4/A -> -sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_tap_1/A -> -sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_tap_2/A -> -sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_tap_4/A -> -sky130_fd_sc_hd__maj3_1/A -> B C -sky130_fd_sc_hd__maj3_1/B -> A C -sky130_fd_sc_hd__maj3_1/C -> A B -sky130_fd_sc_hd__maj3_2/A -> B C -sky130_fd_sc_hd__maj3_2/B -> A C -sky130_fd_sc_hd__maj3_2/C -> A B -sky130_fd_sc_hd__maj3_4/A -> B C -sky130_fd_sc_hd__maj3_4/B -> A C -sky130_fd_sc_hd__maj3_4/C -> A B -sky130_fd_sc_hd__mux2_1/A0 -> -sky130_fd_sc_hd__mux2_1/A1 -> -sky130_fd_sc_hd__mux2_1/S -> -sky130_fd_sc_hd__mux2_2/A0 -> -sky130_fd_sc_hd__mux2_2/A1 -> -sky130_fd_sc_hd__mux2_2/S -> -sky130_fd_sc_hd__mux2_4/A0 -> -sky130_fd_sc_hd__mux2_4/A1 -> -sky130_fd_sc_hd__mux2_4/S -> -sky130_fd_sc_hd__mux2_8/A0 -> -sky130_fd_sc_hd__mux2_8/A1 -> -sky130_fd_sc_hd__mux2_8/S -> -sky130_fd_sc_hd__mux2i_1/A0 -> -sky130_fd_sc_hd__mux2i_1/A1 -> -sky130_fd_sc_hd__mux2i_1/S -> -sky130_fd_sc_hd__mux2i_2/A0 -> -sky130_fd_sc_hd__mux2i_2/A1 -> -sky130_fd_sc_hd__mux2i_2/S -> -sky130_fd_sc_hd__mux2i_4/A0 -> -sky130_fd_sc_hd__mux2i_4/A1 -> -sky130_fd_sc_hd__mux2i_4/S -> -sky130_fd_sc_hd__mux4_1/A0 -> -sky130_fd_sc_hd__mux4_1/A1 -> -sky130_fd_sc_hd__mux4_1/A2 -> -sky130_fd_sc_hd__mux4_1/A3 -> -sky130_fd_sc_hd__mux4_1/S0 -> -sky130_fd_sc_hd__mux4_1/S1 -> -sky130_fd_sc_hd__mux4_2/A0 -> -sky130_fd_sc_hd__mux4_2/A1 -> -sky130_fd_sc_hd__mux4_2/A2 -> -sky130_fd_sc_hd__mux4_2/A3 -> -sky130_fd_sc_hd__mux4_2/S0 -> -sky130_fd_sc_hd__mux4_2/S1 -> -sky130_fd_sc_hd__mux4_4/A0 -> -sky130_fd_sc_hd__mux4_4/A1 -> -sky130_fd_sc_hd__mux4_4/A2 -> -sky130_fd_sc_hd__mux4_4/A3 -> -sky130_fd_sc_hd__mux4_4/S0 -> -sky130_fd_sc_hd__mux4_4/S1 -> -sky130_fd_sc_hd__nand2_1/A -> B -sky130_fd_sc_hd__nand2_1/B -> A -sky130_fd_sc_hd__nand2_2/A -> B -sky130_fd_sc_hd__nand2_2/B -> A -sky130_fd_sc_hd__nand2_4/A -> B -sky130_fd_sc_hd__nand2_4/B -> A -sky130_fd_sc_hd__nand2_8/A -> B -sky130_fd_sc_hd__nand2_8/B -> A -sky130_fd_sc_hd__nand2b_1/A_N -> -sky130_fd_sc_hd__nand2b_1/B -> -sky130_fd_sc_hd__nand2b_2/A_N -> -sky130_fd_sc_hd__nand2b_2/B -> -sky130_fd_sc_hd__nand2b_4/A_N -> -sky130_fd_sc_hd__nand2b_4/B -> -sky130_fd_sc_hd__nand3_1/A -> B C -sky130_fd_sc_hd__nand3_1/B -> A C -sky130_fd_sc_hd__nand3_1/C -> A B -sky130_fd_sc_hd__nand3_2/A -> B C -sky130_fd_sc_hd__nand3_2/B -> A C -sky130_fd_sc_hd__nand3_2/C -> A B -sky130_fd_sc_hd__nand3_4/A -> B C -sky130_fd_sc_hd__nand3_4/B -> A C -sky130_fd_sc_hd__nand3_4/C -> A B -sky130_fd_sc_hd__nand3b_1/A_N -> -sky130_fd_sc_hd__nand3b_1/B -> C -sky130_fd_sc_hd__nand3b_1/C -> B -sky130_fd_sc_hd__nand3b_2/A_N -> -sky130_fd_sc_hd__nand3b_2/B -> C -sky130_fd_sc_hd__nand3b_2/C -> B -sky130_fd_sc_hd__nand3b_4/A_N -> -sky130_fd_sc_hd__nand3b_4/B -> C -sky130_fd_sc_hd__nand3b_4/C -> B -sky130_fd_sc_hd__nand4_1/A -> B C D -sky130_fd_sc_hd__nand4_1/B -> A C D -sky130_fd_sc_hd__nand4_1/C -> A B D -sky130_fd_sc_hd__nand4_1/D -> A B C -sky130_fd_sc_hd__nand4_2/A -> B C D -sky130_fd_sc_hd__nand4_2/B -> A C D -sky130_fd_sc_hd__nand4_2/C -> A B D -sky130_fd_sc_hd__nand4_2/D -> A B C -sky130_fd_sc_hd__nand4_4/A -> B C D -sky130_fd_sc_hd__nand4_4/B -> A C D -sky130_fd_sc_hd__nand4_4/C -> A B D -sky130_fd_sc_hd__nand4_4/D -> A B C -sky130_fd_sc_hd__nand4b_1/A_N -> -sky130_fd_sc_hd__nand4b_1/B -> C D -sky130_fd_sc_hd__nand4b_1/C -> B D -sky130_fd_sc_hd__nand4b_1/D -> B C -sky130_fd_sc_hd__nand4b_2/A_N -> -sky130_fd_sc_hd__nand4b_2/B -> C D -sky130_fd_sc_hd__nand4b_2/C -> B D -sky130_fd_sc_hd__nand4b_2/D -> B C -sky130_fd_sc_hd__nand4b_4/A_N -> -sky130_fd_sc_hd__nand4b_4/B -> C D -sky130_fd_sc_hd__nand4b_4/C -> B D -sky130_fd_sc_hd__nand4b_4/D -> B C -sky130_fd_sc_hd__nand4bb_1/A_N -> B_N -sky130_fd_sc_hd__nand4bb_1/B_N -> A_N -sky130_fd_sc_hd__nand4bb_1/C -> D -sky130_fd_sc_hd__nand4bb_1/D -> C -sky130_fd_sc_hd__nand4bb_2/A_N -> B_N -sky130_fd_sc_hd__nand4bb_2/B_N -> A_N -sky130_fd_sc_hd__nand4bb_2/C -> D -sky130_fd_sc_hd__nand4bb_2/D -> C -sky130_fd_sc_hd__nand4bb_4/A_N -> B_N -sky130_fd_sc_hd__nand4bb_4/B_N -> A_N -sky130_fd_sc_hd__nand4bb_4/C -> D -sky130_fd_sc_hd__nand4bb_4/D -> C -sky130_fd_sc_hd__nor2_1/A -> B -sky130_fd_sc_hd__nor2_1/B -> A -sky130_fd_sc_hd__nor2_2/A -> B -sky130_fd_sc_hd__nor2_2/B -> A -sky130_fd_sc_hd__nor2_4/A -> B -sky130_fd_sc_hd__nor2_4/B -> A -sky130_fd_sc_hd__nor2_8/A -> B -sky130_fd_sc_hd__nor2_8/B -> A -sky130_fd_sc_hd__nor2b_1/A -> -sky130_fd_sc_hd__nor2b_1/B_N -> -sky130_fd_sc_hd__nor2b_2/A -> -sky130_fd_sc_hd__nor2b_2/B_N -> -sky130_fd_sc_hd__nor2b_4/A -> -sky130_fd_sc_hd__nor2b_4/B_N -> -sky130_fd_sc_hd__nor3_1/A -> B C -sky130_fd_sc_hd__nor3_1/B -> A C -sky130_fd_sc_hd__nor3_1/C -> A B -sky130_fd_sc_hd__nor3_2/A -> B C -sky130_fd_sc_hd__nor3_2/B -> A C -sky130_fd_sc_hd__nor3_2/C -> A B -sky130_fd_sc_hd__nor3_4/A -> B C -sky130_fd_sc_hd__nor3_4/B -> A C -sky130_fd_sc_hd__nor3_4/C -> A B -sky130_fd_sc_hd__nor3b_1/A -> B -sky130_fd_sc_hd__nor3b_1/B -> A -sky130_fd_sc_hd__nor3b_1/C_N -> -sky130_fd_sc_hd__nor3b_2/A -> B -sky130_fd_sc_hd__nor3b_2/B -> A -sky130_fd_sc_hd__nor3b_2/C_N -> -sky130_fd_sc_hd__nor3b_4/A -> B -sky130_fd_sc_hd__nor3b_4/B -> A -sky130_fd_sc_hd__nor3b_4/C_N -> -sky130_fd_sc_hd__nor4_1/A -> B C D -sky130_fd_sc_hd__nor4_1/B -> A C D -sky130_fd_sc_hd__nor4_1/C -> A B D -sky130_fd_sc_hd__nor4_1/D -> A B C -sky130_fd_sc_hd__nor4_2/A -> B C D -sky130_fd_sc_hd__nor4_2/B -> A C D -sky130_fd_sc_hd__nor4_2/C -> A B D -sky130_fd_sc_hd__nor4_2/D -> A B C -sky130_fd_sc_hd__nor4_4/A -> B C D -sky130_fd_sc_hd__nor4_4/B -> A C D -sky130_fd_sc_hd__nor4_4/C -> A B D -sky130_fd_sc_hd__nor4_4/D -> A B C -sky130_fd_sc_hd__nor4b_1/A -> B C -sky130_fd_sc_hd__nor4b_1/B -> A C -sky130_fd_sc_hd__nor4b_1/C -> A B -sky130_fd_sc_hd__nor4b_1/D_N -> -sky130_fd_sc_hd__nor4b_2/A -> B C -sky130_fd_sc_hd__nor4b_2/B -> A C -sky130_fd_sc_hd__nor4b_2/C -> A B -sky130_fd_sc_hd__nor4b_2/D_N -> -sky130_fd_sc_hd__nor4b_4/A -> B C -sky130_fd_sc_hd__nor4b_4/B -> A C -sky130_fd_sc_hd__nor4b_4/C -> A B -sky130_fd_sc_hd__nor4b_4/D_N -> -sky130_fd_sc_hd__nor4bb_1/A -> B -sky130_fd_sc_hd__nor4bb_1/B -> A -sky130_fd_sc_hd__nor4bb_1/C_N -> D_N -sky130_fd_sc_hd__nor4bb_1/D_N -> C_N -sky130_fd_sc_hd__nor4bb_2/A -> B -sky130_fd_sc_hd__nor4bb_2/B -> A -sky130_fd_sc_hd__nor4bb_2/C_N -> D_N -sky130_fd_sc_hd__nor4bb_2/D_N -> C_N -sky130_fd_sc_hd__nor4bb_4/A -> B -sky130_fd_sc_hd__nor4bb_4/B -> A -sky130_fd_sc_hd__nor4bb_4/C_N -> D_N -sky130_fd_sc_hd__nor4bb_4/D_N -> C_N -sky130_fd_sc_hd__o2111a_1/A1 -> A2 -sky130_fd_sc_hd__o2111a_1/A2 -> A1 -sky130_fd_sc_hd__o2111a_1/B1 -> C1 D1 -sky130_fd_sc_hd__o2111a_1/C1 -> B1 D1 -sky130_fd_sc_hd__o2111a_1/D1 -> B1 C1 -sky130_fd_sc_hd__o2111a_2/A1 -> A2 -sky130_fd_sc_hd__o2111a_2/A2 -> A1 -sky130_fd_sc_hd__o2111a_2/B1 -> C1 D1 -sky130_fd_sc_hd__o2111a_2/C1 -> B1 D1 -sky130_fd_sc_hd__o2111a_2/D1 -> B1 C1 -sky130_fd_sc_hd__o2111a_4/A1 -> A2 -sky130_fd_sc_hd__o2111a_4/A2 -> A1 -sky130_fd_sc_hd__o2111a_4/B1 -> C1 D1 -sky130_fd_sc_hd__o2111a_4/C1 -> B1 D1 -sky130_fd_sc_hd__o2111a_4/D1 -> B1 C1 -sky130_fd_sc_hd__o2111ai_1/A1 -> A2 -sky130_fd_sc_hd__o2111ai_1/A2 -> A1 -sky130_fd_sc_hd__o2111ai_1/B1 -> C1 D1 -sky130_fd_sc_hd__o2111ai_1/C1 -> B1 D1 -sky130_fd_sc_hd__o2111ai_1/D1 -> B1 C1 -sky130_fd_sc_hd__o2111ai_2/A1 -> A2 -sky130_fd_sc_hd__o2111ai_2/A2 -> A1 -sky130_fd_sc_hd__o2111ai_2/B1 -> C1 D1 -sky130_fd_sc_hd__o2111ai_2/C1 -> B1 D1 -sky130_fd_sc_hd__o2111ai_2/D1 -> B1 C1 -sky130_fd_sc_hd__o2111ai_4/A1 -> A2 -sky130_fd_sc_hd__o2111ai_4/A2 -> A1 -sky130_fd_sc_hd__o2111ai_4/B1 -> C1 D1 -sky130_fd_sc_hd__o2111ai_4/C1 -> B1 D1 -sky130_fd_sc_hd__o2111ai_4/D1 -> B1 C1 -sky130_fd_sc_hd__o211a_1/A1 -> A2 -sky130_fd_sc_hd__o211a_1/A2 -> A1 -sky130_fd_sc_hd__o211a_1/B1 -> C1 -sky130_fd_sc_hd__o211a_1/C1 -> B1 -sky130_fd_sc_hd__o211a_2/A1 -> A2 -sky130_fd_sc_hd__o211a_2/A2 -> A1 -sky130_fd_sc_hd__o211a_2/B1 -> C1 -sky130_fd_sc_hd__o211a_2/C1 -> B1 -sky130_fd_sc_hd__o211a_4/A1 -> A2 -sky130_fd_sc_hd__o211a_4/A2 -> A1 -sky130_fd_sc_hd__o211a_4/B1 -> C1 -sky130_fd_sc_hd__o211a_4/C1 -> B1 -sky130_fd_sc_hd__o211ai_1/A1 -> A2 -sky130_fd_sc_hd__o211ai_1/A2 -> A1 -sky130_fd_sc_hd__o211ai_1/B1 -> C1 -sky130_fd_sc_hd__o211ai_1/C1 -> B1 -sky130_fd_sc_hd__o211ai_2/A1 -> A2 -sky130_fd_sc_hd__o211ai_2/A2 -> A1 -sky130_fd_sc_hd__o211ai_2/B1 -> C1 -sky130_fd_sc_hd__o211ai_2/C1 -> B1 -sky130_fd_sc_hd__o211ai_4/A1 -> A2 -sky130_fd_sc_hd__o211ai_4/A2 -> A1 -sky130_fd_sc_hd__o211ai_4/B1 -> C1 -sky130_fd_sc_hd__o211ai_4/C1 -> B1 -sky130_fd_sc_hd__o21a_1/A1 -> A2 -sky130_fd_sc_hd__o21a_1/A2 -> A1 -sky130_fd_sc_hd__o21a_1/B1 -> -sky130_fd_sc_hd__o21a_2/A1 -> A2 -sky130_fd_sc_hd__o21a_2/A2 -> A1 -sky130_fd_sc_hd__o21a_2/B1 -> -sky130_fd_sc_hd__o21a_4/A1 -> A2 -sky130_fd_sc_hd__o21a_4/A2 -> A1 -sky130_fd_sc_hd__o21a_4/B1 -> -sky130_fd_sc_hd__o21ai_0/A1 -> A2 -sky130_fd_sc_hd__o21ai_0/A2 -> A1 -sky130_fd_sc_hd__o21ai_0/B1 -> -sky130_fd_sc_hd__o21ai_1/A1 -> A2 -sky130_fd_sc_hd__o21ai_1/A2 -> A1 -sky130_fd_sc_hd__o21ai_1/B1 -> -sky130_fd_sc_hd__o21ai_2/A1 -> A2 -sky130_fd_sc_hd__o21ai_2/A2 -> A1 -sky130_fd_sc_hd__o21ai_2/B1 -> -sky130_fd_sc_hd__o21ai_4/A1 -> A2 -sky130_fd_sc_hd__o21ai_4/A2 -> A1 -sky130_fd_sc_hd__o21ai_4/B1 -> -sky130_fd_sc_hd__o21ba_1/A1 -> A2 -sky130_fd_sc_hd__o21ba_1/A2 -> A1 -sky130_fd_sc_hd__o21ba_1/B1_N -> -sky130_fd_sc_hd__o21ba_2/A1 -> A2 -sky130_fd_sc_hd__o21ba_2/A2 -> A1 -sky130_fd_sc_hd__o21ba_2/B1_N -> -sky130_fd_sc_hd__o21ba_4/A1 -> A2 -sky130_fd_sc_hd__o21ba_4/A2 -> A1 -sky130_fd_sc_hd__o21ba_4/B1_N -> -sky130_fd_sc_hd__o21bai_1/A1 -> A2 -sky130_fd_sc_hd__o21bai_1/A2 -> A1 -sky130_fd_sc_hd__o21bai_1/B1_N -> -sky130_fd_sc_hd__o21bai_2/A1 -> A2 -sky130_fd_sc_hd__o21bai_2/A2 -> A1 -sky130_fd_sc_hd__o21bai_2/B1_N -> -sky130_fd_sc_hd__o21bai_4/A1 -> A2 -sky130_fd_sc_hd__o21bai_4/A2 -> A1 -sky130_fd_sc_hd__o21bai_4/B1_N -> -sky130_fd_sc_hd__o221a_1/A1 -> A2 -sky130_fd_sc_hd__o221a_1/A2 -> A1 -sky130_fd_sc_hd__o221a_1/B1 -> B2 -sky130_fd_sc_hd__o221a_1/B2 -> B1 -sky130_fd_sc_hd__o221a_1/C1 -> -sky130_fd_sc_hd__o221a_2/A1 -> A2 -sky130_fd_sc_hd__o221a_2/A2 -> A1 -sky130_fd_sc_hd__o221a_2/B1 -> B2 -sky130_fd_sc_hd__o221a_2/B2 -> B1 -sky130_fd_sc_hd__o221a_2/C1 -> -sky130_fd_sc_hd__o221a_4/A1 -> A2 -sky130_fd_sc_hd__o221a_4/A2 -> A1 -sky130_fd_sc_hd__o221a_4/B1 -> B2 -sky130_fd_sc_hd__o221a_4/B2 -> B1 -sky130_fd_sc_hd__o221a_4/C1 -> -sky130_fd_sc_hd__o221ai_1/A1 -> A2 -sky130_fd_sc_hd__o221ai_1/A2 -> A1 -sky130_fd_sc_hd__o221ai_1/B1 -> B2 -sky130_fd_sc_hd__o221ai_1/B2 -> B1 -sky130_fd_sc_hd__o221ai_1/C1 -> -sky130_fd_sc_hd__o221ai_2/A1 -> A2 -sky130_fd_sc_hd__o221ai_2/A2 -> A1 -sky130_fd_sc_hd__o221ai_2/B1 -> B2 -sky130_fd_sc_hd__o221ai_2/B2 -> B1 -sky130_fd_sc_hd__o221ai_2/C1 -> -sky130_fd_sc_hd__o221ai_4/A1 -> A2 -sky130_fd_sc_hd__o221ai_4/A2 -> A1 -sky130_fd_sc_hd__o221ai_4/B1 -> B2 -sky130_fd_sc_hd__o221ai_4/B2 -> B1 -sky130_fd_sc_hd__o221ai_4/C1 -> -sky130_fd_sc_hd__o22a_1/A1 -> A2 -sky130_fd_sc_hd__o22a_1/A2 -> A1 -sky130_fd_sc_hd__o22a_1/B1 -> B2 -sky130_fd_sc_hd__o22a_1/B2 -> B1 -sky130_fd_sc_hd__o22a_2/A1 -> A2 -sky130_fd_sc_hd__o22a_2/A2 -> A1 -sky130_fd_sc_hd__o22a_2/B1 -> B2 -sky130_fd_sc_hd__o22a_2/B2 -> B1 -sky130_fd_sc_hd__o22a_4/A1 -> A2 -sky130_fd_sc_hd__o22a_4/A2 -> A1 -sky130_fd_sc_hd__o22a_4/B1 -> B2 -sky130_fd_sc_hd__o22a_4/B2 -> B1 -sky130_fd_sc_hd__o22ai_1/A1 -> A2 -sky130_fd_sc_hd__o22ai_1/A2 -> A1 -sky130_fd_sc_hd__o22ai_1/B1 -> B2 -sky130_fd_sc_hd__o22ai_1/B2 -> B1 -sky130_fd_sc_hd__o22ai_2/A1 -> A2 -sky130_fd_sc_hd__o22ai_2/A2 -> A1 -sky130_fd_sc_hd__o22ai_2/B1 -> B2 -sky130_fd_sc_hd__o22ai_2/B2 -> B1 -sky130_fd_sc_hd__o22ai_4/A1 -> A2 -sky130_fd_sc_hd__o22ai_4/A2 -> A1 -sky130_fd_sc_hd__o22ai_4/B1 -> B2 -sky130_fd_sc_hd__o22ai_4/B2 -> B1 -sky130_fd_sc_hd__o2bb2a_1/A1_N -> A2_N -sky130_fd_sc_hd__o2bb2a_1/A2_N -> A1_N -sky130_fd_sc_hd__o2bb2a_1/B1 -> B2 -sky130_fd_sc_hd__o2bb2a_1/B2 -> B1 -sky130_fd_sc_hd__o2bb2a_2/A1_N -> A2_N -sky130_fd_sc_hd__o2bb2a_2/A2_N -> A1_N -sky130_fd_sc_hd__o2bb2a_2/B1 -> B2 -sky130_fd_sc_hd__o2bb2a_2/B2 -> B1 -sky130_fd_sc_hd__o2bb2a_4/A1_N -> A2_N -sky130_fd_sc_hd__o2bb2a_4/A2_N -> A1_N -sky130_fd_sc_hd__o2bb2a_4/B1 -> B2 -sky130_fd_sc_hd__o2bb2a_4/B2 -> B1 -sky130_fd_sc_hd__o2bb2ai_1/A1_N -> A2_N -sky130_fd_sc_hd__o2bb2ai_1/A2_N -> A1_N -sky130_fd_sc_hd__o2bb2ai_1/B1 -> B2 -sky130_fd_sc_hd__o2bb2ai_1/B2 -> B1 -sky130_fd_sc_hd__o2bb2ai_2/A1_N -> A2_N -sky130_fd_sc_hd__o2bb2ai_2/A2_N -> A1_N -sky130_fd_sc_hd__o2bb2ai_2/B1 -> B2 -sky130_fd_sc_hd__o2bb2ai_2/B2 -> B1 -sky130_fd_sc_hd__o2bb2ai_4/A1_N -> A2_N -sky130_fd_sc_hd__o2bb2ai_4/A2_N -> A1_N -sky130_fd_sc_hd__o2bb2ai_4/B1 -> B2 -sky130_fd_sc_hd__o2bb2ai_4/B2 -> B1 -sky130_fd_sc_hd__o311a_1/A1 -> A2 A3 -sky130_fd_sc_hd__o311a_1/A2 -> A1 A3 -sky130_fd_sc_hd__o311a_1/A3 -> A1 A2 -sky130_fd_sc_hd__o311a_1/B1 -> C1 -sky130_fd_sc_hd__o311a_1/C1 -> B1 -sky130_fd_sc_hd__o311a_2/A1 -> A2 A3 -sky130_fd_sc_hd__o311a_2/A2 -> A1 A3 -sky130_fd_sc_hd__o311a_2/A3 -> A1 A2 -sky130_fd_sc_hd__o311a_2/B1 -> C1 -sky130_fd_sc_hd__o311a_2/C1 -> B1 -sky130_fd_sc_hd__o311a_4/A1 -> A2 A3 -sky130_fd_sc_hd__o311a_4/A2 -> A1 A3 -sky130_fd_sc_hd__o311a_4/A3 -> A1 A2 -sky130_fd_sc_hd__o311a_4/B1 -> C1 -sky130_fd_sc_hd__o311a_4/C1 -> B1 -sky130_fd_sc_hd__o311ai_0/A1 -> A2 A3 -sky130_fd_sc_hd__o311ai_0/A2 -> A1 A3 -sky130_fd_sc_hd__o311ai_0/A3 -> A1 A2 -sky130_fd_sc_hd__o311ai_0/B1 -> C1 -sky130_fd_sc_hd__o311ai_0/C1 -> B1 -sky130_fd_sc_hd__o311ai_1/A1 -> A2 A3 -sky130_fd_sc_hd__o311ai_1/A2 -> A1 A3 -sky130_fd_sc_hd__o311ai_1/A3 -> A1 A2 -sky130_fd_sc_hd__o311ai_1/B1 -> C1 -sky130_fd_sc_hd__o311ai_1/C1 -> B1 -sky130_fd_sc_hd__o311ai_2/A1 -> A2 A3 -sky130_fd_sc_hd__o311ai_2/A2 -> A1 A3 -sky130_fd_sc_hd__o311ai_2/A3 -> A1 A2 -sky130_fd_sc_hd__o311ai_2/B1 -> C1 -sky130_fd_sc_hd__o311ai_2/C1 -> B1 -sky130_fd_sc_hd__o311ai_4/A1 -> A2 A3 -sky130_fd_sc_hd__o311ai_4/A2 -> A1 A3 -sky130_fd_sc_hd__o311ai_4/A3 -> A1 A2 -sky130_fd_sc_hd__o311ai_4/B1 -> C1 -sky130_fd_sc_hd__o311ai_4/C1 -> B1 -sky130_fd_sc_hd__o31a_1/A1 -> A2 A3 -sky130_fd_sc_hd__o31a_1/A2 -> A1 A3 -sky130_fd_sc_hd__o31a_1/A3 -> A1 A2 -sky130_fd_sc_hd__o31a_1/B1 -> -sky130_fd_sc_hd__o31a_2/A1 -> A2 A3 -sky130_fd_sc_hd__o31a_2/A2 -> A1 A3 -sky130_fd_sc_hd__o31a_2/A3 -> A1 A2 -sky130_fd_sc_hd__o31a_2/B1 -> -sky130_fd_sc_hd__o31a_4/A1 -> A2 A3 -sky130_fd_sc_hd__o31a_4/A2 -> A1 A3 -sky130_fd_sc_hd__o31a_4/A3 -> A1 A2 -sky130_fd_sc_hd__o31a_4/B1 -> -sky130_fd_sc_hd__o31ai_1/A1 -> A2 A3 -sky130_fd_sc_hd__o31ai_1/A2 -> A1 A3 -sky130_fd_sc_hd__o31ai_1/A3 -> A1 A2 -sky130_fd_sc_hd__o31ai_1/B1 -> -sky130_fd_sc_hd__o31ai_2/A1 -> A2 A3 -sky130_fd_sc_hd__o31ai_2/A2 -> A1 A3 -sky130_fd_sc_hd__o31ai_2/A3 -> A1 A2 -sky130_fd_sc_hd__o31ai_2/B1 -> -sky130_fd_sc_hd__o31ai_4/A1 -> A2 A3 -sky130_fd_sc_hd__o31ai_4/A2 -> A1 A3 -sky130_fd_sc_hd__o31ai_4/A3 -> A1 A2 -sky130_fd_sc_hd__o31ai_4/B1 -> -sky130_fd_sc_hd__o32a_1/A1 -> A2 A3 -sky130_fd_sc_hd__o32a_1/A2 -> A1 A3 -sky130_fd_sc_hd__o32a_1/A3 -> A1 A2 -sky130_fd_sc_hd__o32a_1/B1 -> B2 -sky130_fd_sc_hd__o32a_1/B2 -> B1 -sky130_fd_sc_hd__o32a_2/A1 -> A2 A3 -sky130_fd_sc_hd__o32a_2/A2 -> A1 A3 -sky130_fd_sc_hd__o32a_2/A3 -> A1 A2 -sky130_fd_sc_hd__o32a_2/B1 -> B2 -sky130_fd_sc_hd__o32a_2/B2 -> B1 -sky130_fd_sc_hd__o32a_4/A1 -> A2 A3 -sky130_fd_sc_hd__o32a_4/A2 -> A1 A3 -sky130_fd_sc_hd__o32a_4/A3 -> A1 A2 -sky130_fd_sc_hd__o32a_4/B1 -> B2 -sky130_fd_sc_hd__o32a_4/B2 -> B1 -sky130_fd_sc_hd__o32ai_1/A1 -> A2 A3 -sky130_fd_sc_hd__o32ai_1/A2 -> A1 A3 -sky130_fd_sc_hd__o32ai_1/A3 -> A1 A2 -sky130_fd_sc_hd__o32ai_1/B1 -> B2 -sky130_fd_sc_hd__o32ai_1/B2 -> B1 -sky130_fd_sc_hd__o32ai_2/A1 -> A2 A3 -sky130_fd_sc_hd__o32ai_2/A2 -> A1 A3 -sky130_fd_sc_hd__o32ai_2/A3 -> A1 A2 -sky130_fd_sc_hd__o32ai_2/B1 -> B2 -sky130_fd_sc_hd__o32ai_2/B2 -> B1 -sky130_fd_sc_hd__o32ai_4/A1 -> A2 A3 -sky130_fd_sc_hd__o32ai_4/A2 -> A1 A3 -sky130_fd_sc_hd__o32ai_4/A3 -> A1 A2 -sky130_fd_sc_hd__o32ai_4/B1 -> B2 -sky130_fd_sc_hd__o32ai_4/B2 -> B1 -sky130_fd_sc_hd__o41a_1/A1 -> A2 A3 A4 -sky130_fd_sc_hd__o41a_1/A2 -> A1 A3 A4 -sky130_fd_sc_hd__o41a_1/A3 -> A1 A2 A4 -sky130_fd_sc_hd__o41a_1/A4 -> A1 A2 A3 -sky130_fd_sc_hd__o41a_1/B1 -> -sky130_fd_sc_hd__o41a_2/A1 -> A2 A3 A4 -sky130_fd_sc_hd__o41a_2/A2 -> A1 A3 A4 -sky130_fd_sc_hd__o41a_2/A3 -> A1 A2 A4 -sky130_fd_sc_hd__o41a_2/A4 -> A1 A2 A3 -sky130_fd_sc_hd__o41a_2/B1 -> -sky130_fd_sc_hd__o41a_4/A1 -> A2 A3 A4 -sky130_fd_sc_hd__o41a_4/A2 -> A1 A3 A4 -sky130_fd_sc_hd__o41a_4/A3 -> A1 A2 A4 -sky130_fd_sc_hd__o41a_4/A4 -> A1 A2 A3 -sky130_fd_sc_hd__o41a_4/B1 -> -sky130_fd_sc_hd__o41ai_1/A1 -> A2 A3 A4 -sky130_fd_sc_hd__o41ai_1/A2 -> A1 A3 A4 -sky130_fd_sc_hd__o41ai_1/A3 -> A1 A2 A4 -sky130_fd_sc_hd__o41ai_1/A4 -> A1 A2 A3 -sky130_fd_sc_hd__o41ai_1/B1 -> -sky130_fd_sc_hd__o41ai_2/A1 -> A2 A3 A4 -sky130_fd_sc_hd__o41ai_2/A2 -> A1 A3 A4 -sky130_fd_sc_hd__o41ai_2/A3 -> A1 A2 A4 -sky130_fd_sc_hd__o41ai_2/A4 -> A1 A2 A3 -sky130_fd_sc_hd__o41ai_2/B1 -> -sky130_fd_sc_hd__o41ai_4/A1 -> A2 A3 A4 -sky130_fd_sc_hd__o41ai_4/A2 -> A1 A3 A4 -sky130_fd_sc_hd__o41ai_4/A3 -> A1 A2 A4 -sky130_fd_sc_hd__o41ai_4/A4 -> A1 A2 A3 -sky130_fd_sc_hd__o41ai_4/B1 -> -sky130_fd_sc_hd__or2_0/A -> B -sky130_fd_sc_hd__or2_0/B -> A -sky130_fd_sc_hd__or2_1/A -> B -sky130_fd_sc_hd__or2_1/B -> A -sky130_fd_sc_hd__or2_2/A -> B -sky130_fd_sc_hd__or2_2/B -> A -sky130_fd_sc_hd__or2_4/A -> B -sky130_fd_sc_hd__or2_4/B -> A -sky130_fd_sc_hd__or2b_1/A -> -sky130_fd_sc_hd__or2b_1/B_N -> -sky130_fd_sc_hd__or2b_2/A -> -sky130_fd_sc_hd__or2b_2/B_N -> -sky130_fd_sc_hd__or2b_4/A -> -sky130_fd_sc_hd__or2b_4/B_N -> -sky130_fd_sc_hd__or3_1/A -> B C -sky130_fd_sc_hd__or3_1/B -> A C -sky130_fd_sc_hd__or3_1/C -> A B -sky130_fd_sc_hd__or3_2/A -> B C -sky130_fd_sc_hd__or3_2/B -> A C -sky130_fd_sc_hd__or3_2/C -> A B -sky130_fd_sc_hd__or3_4/A -> B C -sky130_fd_sc_hd__or3_4/B -> A C -sky130_fd_sc_hd__or3_4/C -> A B -sky130_fd_sc_hd__or3b_1/A -> B -sky130_fd_sc_hd__or3b_1/B -> A -sky130_fd_sc_hd__or3b_1/C_N -> -sky130_fd_sc_hd__or3b_2/A -> B -sky130_fd_sc_hd__or3b_2/B -> A -sky130_fd_sc_hd__or3b_2/C_N -> -sky130_fd_sc_hd__or3b_4/A -> B -sky130_fd_sc_hd__or3b_4/B -> A -sky130_fd_sc_hd__or3b_4/C_N -> -sky130_fd_sc_hd__or4_1/A -> B C D -sky130_fd_sc_hd__or4_1/B -> A C D -sky130_fd_sc_hd__or4_1/C -> A B D -sky130_fd_sc_hd__or4_1/D -> A B C -sky130_fd_sc_hd__or4_2/A -> B C D -sky130_fd_sc_hd__or4_2/B -> A C D -sky130_fd_sc_hd__or4_2/C -> A B D -sky130_fd_sc_hd__or4_2/D -> A B C -sky130_fd_sc_hd__or4_4/A -> B C D -sky130_fd_sc_hd__or4_4/B -> A C D -sky130_fd_sc_hd__or4_4/C -> A B D -sky130_fd_sc_hd__or4_4/D -> A B C -sky130_fd_sc_hd__or4b_1/A -> B C -sky130_fd_sc_hd__or4b_1/B -> A C -sky130_fd_sc_hd__or4b_1/C -> A B -sky130_fd_sc_hd__or4b_1/D_N -> -sky130_fd_sc_hd__or4b_2/A -> B C -sky130_fd_sc_hd__or4b_2/B -> A C -sky130_fd_sc_hd__or4b_2/C -> A B -sky130_fd_sc_hd__or4b_2/D_N -> -sky130_fd_sc_hd__or4b_4/A -> B C -sky130_fd_sc_hd__or4b_4/B -> A C -sky130_fd_sc_hd__or4b_4/C -> A B -sky130_fd_sc_hd__or4b_4/D_N -> -sky130_fd_sc_hd__or4bb_1/A -> B -sky130_fd_sc_hd__or4bb_1/B -> A -sky130_fd_sc_hd__or4bb_1/C_N -> D_N -sky130_fd_sc_hd__or4bb_1/D_N -> C_N -sky130_fd_sc_hd__or4bb_2/A -> B -sky130_fd_sc_hd__or4bb_2/B -> A -sky130_fd_sc_hd__or4bb_2/C_N -> D_N -sky130_fd_sc_hd__or4bb_2/D_N -> C_N -sky130_fd_sc_hd__or4bb_4/A -> B -sky130_fd_sc_hd__or4bb_4/B -> A -sky130_fd_sc_hd__or4bb_4/C_N -> D_N -sky130_fd_sc_hd__or4bb_4/D_N -> C_N -sky130_fd_sc_hd__probe_p_8/A -> -sky130_fd_sc_hd__probec_p_8/A -> -sky130_fd_sc_hd__sdfbbn_1/CLK_N -> -sky130_fd_sc_hd__sdfbbn_1/D -> -sky130_fd_sc_hd__sdfbbn_1/RESET_B -> -sky130_fd_sc_hd__sdfbbn_1/SCD -> -sky130_fd_sc_hd__sdfbbn_1/SCE -> -sky130_fd_sc_hd__sdfbbn_1/SET_B -> -sky130_fd_sc_hd__sdfbbn_2/CLK_N -> -sky130_fd_sc_hd__sdfbbn_2/D -> -sky130_fd_sc_hd__sdfbbn_2/RESET_B -> -sky130_fd_sc_hd__sdfbbn_2/SCD -> -sky130_fd_sc_hd__sdfbbn_2/SCE -> -sky130_fd_sc_hd__sdfbbn_2/SET_B -> -sky130_fd_sc_hd__sdfbbp_1/CLK -> -sky130_fd_sc_hd__sdfbbp_1/D -> -sky130_fd_sc_hd__sdfbbp_1/RESET_B -> -sky130_fd_sc_hd__sdfbbp_1/SCD -> -sky130_fd_sc_hd__sdfbbp_1/SCE -> -sky130_fd_sc_hd__sdfbbp_1/SET_B -> -sky130_fd_sc_hd__sdfrbp_1/CLK -> -sky130_fd_sc_hd__sdfrbp_1/D -> -sky130_fd_sc_hd__sdfrbp_1/RESET_B -> -sky130_fd_sc_hd__sdfrbp_1/SCD -> -sky130_fd_sc_hd__sdfrbp_1/SCE -> -sky130_fd_sc_hd__sdfrbp_2/CLK -> -sky130_fd_sc_hd__sdfrbp_2/D -> -sky130_fd_sc_hd__sdfrbp_2/RESET_B -> -sky130_fd_sc_hd__sdfrbp_2/SCD -> -sky130_fd_sc_hd__sdfrbp_2/SCE -> -sky130_fd_sc_hd__sdfrtn_1/CLK_N -> -sky130_fd_sc_hd__sdfrtn_1/D -> -sky130_fd_sc_hd__sdfrtn_1/RESET_B -> -sky130_fd_sc_hd__sdfrtn_1/SCD -> -sky130_fd_sc_hd__sdfrtn_1/SCE -> -sky130_fd_sc_hd__sdfrtp_1/CLK -> -sky130_fd_sc_hd__sdfrtp_1/D -> -sky130_fd_sc_hd__sdfrtp_1/RESET_B -> -sky130_fd_sc_hd__sdfrtp_1/SCD -> -sky130_fd_sc_hd__sdfrtp_1/SCE -> -sky130_fd_sc_hd__sdfrtp_2/CLK -> -sky130_fd_sc_hd__sdfrtp_2/D -> -sky130_fd_sc_hd__sdfrtp_2/RESET_B -> -sky130_fd_sc_hd__sdfrtp_2/SCD -> -sky130_fd_sc_hd__sdfrtp_2/SCE -> -sky130_fd_sc_hd__sdfrtp_4/CLK -> -sky130_fd_sc_hd__sdfrtp_4/D -> -sky130_fd_sc_hd__sdfrtp_4/RESET_B -> -sky130_fd_sc_hd__sdfrtp_4/SCD -> -sky130_fd_sc_hd__sdfrtp_4/SCE -> -sky130_fd_sc_hd__sdfsbp_1/CLK -> -sky130_fd_sc_hd__sdfsbp_1/D -> -sky130_fd_sc_hd__sdfsbp_1/SCD -> -sky130_fd_sc_hd__sdfsbp_1/SCE -> -sky130_fd_sc_hd__sdfsbp_1/SET_B -> -sky130_fd_sc_hd__sdfsbp_2/CLK -> -sky130_fd_sc_hd__sdfsbp_2/D -> -sky130_fd_sc_hd__sdfsbp_2/SCD -> -sky130_fd_sc_hd__sdfsbp_2/SCE -> -sky130_fd_sc_hd__sdfsbp_2/SET_B -> -sky130_fd_sc_hd__sdfstp_1/CLK -> -sky130_fd_sc_hd__sdfstp_1/D -> -sky130_fd_sc_hd__sdfstp_1/SCD -> -sky130_fd_sc_hd__sdfstp_1/SCE -> -sky130_fd_sc_hd__sdfstp_1/SET_B -> -sky130_fd_sc_hd__sdfstp_2/CLK -> -sky130_fd_sc_hd__sdfstp_2/D -> -sky130_fd_sc_hd__sdfstp_2/SCD -> -sky130_fd_sc_hd__sdfstp_2/SCE -> -sky130_fd_sc_hd__sdfstp_2/SET_B -> -sky130_fd_sc_hd__sdfstp_4/CLK -> -sky130_fd_sc_hd__sdfstp_4/D -> -sky130_fd_sc_hd__sdfstp_4/SCD -> -sky130_fd_sc_hd__sdfstp_4/SCE -> -sky130_fd_sc_hd__sdfstp_4/SET_B -> -sky130_fd_sc_hd__sdfxbp_1/CLK -> -sky130_fd_sc_hd__sdfxbp_1/D -> -sky130_fd_sc_hd__sdfxbp_1/SCD -> -sky130_fd_sc_hd__sdfxbp_1/SCE -> -sky130_fd_sc_hd__sdfxbp_2/CLK -> -sky130_fd_sc_hd__sdfxbp_2/D -> -sky130_fd_sc_hd__sdfxbp_2/SCD -> -sky130_fd_sc_hd__sdfxbp_2/SCE -> -sky130_fd_sc_hd__sdfxtp_1/CLK -> -sky130_fd_sc_hd__sdfxtp_1/D -> -sky130_fd_sc_hd__sdfxtp_1/SCD -> -sky130_fd_sc_hd__sdfxtp_1/SCE -> -sky130_fd_sc_hd__sdfxtp_2/CLK -> -sky130_fd_sc_hd__sdfxtp_2/D -> -sky130_fd_sc_hd__sdfxtp_2/SCD -> -sky130_fd_sc_hd__sdfxtp_2/SCE -> -sky130_fd_sc_hd__sdfxtp_4/CLK -> -sky130_fd_sc_hd__sdfxtp_4/D -> -sky130_fd_sc_hd__sdfxtp_4/SCD -> -sky130_fd_sc_hd__sdfxtp_4/SCE -> -sky130_fd_sc_hd__sdlclkp_1/CLK -> -sky130_fd_sc_hd__sdlclkp_1/GATE -> -sky130_fd_sc_hd__sdlclkp_1/SCE -> -sky130_fd_sc_hd__sdlclkp_2/CLK -> -sky130_fd_sc_hd__sdlclkp_2/GATE -> -sky130_fd_sc_hd__sdlclkp_2/SCE -> -sky130_fd_sc_hd__sdlclkp_4/CLK -> -sky130_fd_sc_hd__sdlclkp_4/GATE -> -sky130_fd_sc_hd__sdlclkp_4/SCE -> -sky130_fd_sc_hd__sedfxbp_1/CLK -> -sky130_fd_sc_hd__sedfxbp_1/D -> -sky130_fd_sc_hd__sedfxbp_1/DE -> -sky130_fd_sc_hd__sedfxbp_1/SCD -> -sky130_fd_sc_hd__sedfxbp_1/SCE -> -sky130_fd_sc_hd__sedfxbp_2/CLK -> -sky130_fd_sc_hd__sedfxbp_2/D -> -sky130_fd_sc_hd__sedfxbp_2/DE -> -sky130_fd_sc_hd__sedfxbp_2/SCD -> -sky130_fd_sc_hd__sedfxbp_2/SCE -> -sky130_fd_sc_hd__sedfxtp_1/CLK -> -sky130_fd_sc_hd__sedfxtp_1/D -> -sky130_fd_sc_hd__sedfxtp_1/DE -> -sky130_fd_sc_hd__sedfxtp_1/SCD -> -sky130_fd_sc_hd__sedfxtp_1/SCE -> -sky130_fd_sc_hd__sedfxtp_2/CLK -> -sky130_fd_sc_hd__sedfxtp_2/D -> -sky130_fd_sc_hd__sedfxtp_2/DE -> -sky130_fd_sc_hd__sedfxtp_2/SCD -> -sky130_fd_sc_hd__sedfxtp_2/SCE -> -sky130_fd_sc_hd__sedfxtp_4/CLK -> -sky130_fd_sc_hd__sedfxtp_4/D -> -sky130_fd_sc_hd__sedfxtp_4/DE -> -sky130_fd_sc_hd__sedfxtp_4/SCD -> -sky130_fd_sc_hd__sedfxtp_4/SCE -> -sky130_fd_sc_hd__xnor2_1/A -> B -sky130_fd_sc_hd__xnor2_1/B -> A -sky130_fd_sc_hd__xnor2_2/A -> B -sky130_fd_sc_hd__xnor2_2/B -> A -sky130_fd_sc_hd__xnor2_4/A -> B -sky130_fd_sc_hd__xnor2_4/B -> A -sky130_fd_sc_hd__xnor3_1/A -> B C -sky130_fd_sc_hd__xnor3_1/B -> A C -sky130_fd_sc_hd__xnor3_1/C -> A B -sky130_fd_sc_hd__xnor3_2/A -> B C -sky130_fd_sc_hd__xnor3_2/B -> A C -sky130_fd_sc_hd__xnor3_2/C -> A B -sky130_fd_sc_hd__xnor3_4/A -> B C -sky130_fd_sc_hd__xnor3_4/B -> A C -sky130_fd_sc_hd__xnor3_4/C -> A B -sky130_fd_sc_hd__xor2_1/A -> B -sky130_fd_sc_hd__xor2_1/B -> A -sky130_fd_sc_hd__xor2_2/A -> B -sky130_fd_sc_hd__xor2_2/B -> A -sky130_fd_sc_hd__xor2_4/A -> B -sky130_fd_sc_hd__xor2_4/B -> A -sky130_fd_sc_hd__xor3_1/A -> B C -sky130_fd_sc_hd__xor3_1/B -> A C -sky130_fd_sc_hd__xor3_1/C -> A B -sky130_fd_sc_hd__xor3_2/A -> B C -sky130_fd_sc_hd__xor3_2/B -> A C -sky130_fd_sc_hd__xor3_2/C -> A B -sky130_fd_sc_hd__xor3_4/A -> B C -sky130_fd_sc_hd__xor3_4/B -> A C -sky130_fd_sc_hd__xor3_4/C -> A B +sky130_fd_sc_hd__a2111o_1 -> +sky130_fd_sc_hd__a2111o_2 -> +sky130_fd_sc_hd__a2111o_4 -> +sky130_fd_sc_hd__a2111oi_0 -> +sky130_fd_sc_hd__a2111oi_1 -> +sky130_fd_sc_hd__a2111oi_2 -> +sky130_fd_sc_hd__a2111oi_4 -> +sky130_fd_sc_hd__a211o_1 -> +sky130_fd_sc_hd__a211o_2 -> +sky130_fd_sc_hd__a211o_4 -> +sky130_fd_sc_hd__a211oi_1 -> +sky130_fd_sc_hd__a211oi_2 -> +sky130_fd_sc_hd__a211oi_4 -> +sky130_fd_sc_hd__a21bo_1 -> +sky130_fd_sc_hd__a21bo_2 -> +sky130_fd_sc_hd__a21bo_4 -> +sky130_fd_sc_hd__a21boi_0 -> +sky130_fd_sc_hd__a21boi_1 -> +sky130_fd_sc_hd__a21boi_2 -> +sky130_fd_sc_hd__a21boi_4 -> +sky130_fd_sc_hd__a21o_1 -> +sky130_fd_sc_hd__a21o_2 -> +sky130_fd_sc_hd__a21o_4 -> +sky130_fd_sc_hd__a21oi_1 -> +sky130_fd_sc_hd__a21oi_2 -> +sky130_fd_sc_hd__a21oi_4 -> +sky130_fd_sc_hd__a221o_1 -> +sky130_fd_sc_hd__a221o_2 -> +sky130_fd_sc_hd__a221o_4 -> +sky130_fd_sc_hd__a221oi_1 -> +sky130_fd_sc_hd__a221oi_2 -> +sky130_fd_sc_hd__a221oi_4 -> +sky130_fd_sc_hd__a222oi_1 -> +sky130_fd_sc_hd__a22o_1 -> +sky130_fd_sc_hd__a22o_2 -> +sky130_fd_sc_hd__a22o_4 -> +sky130_fd_sc_hd__a22oi_1 -> +sky130_fd_sc_hd__a22oi_2 -> +sky130_fd_sc_hd__a22oi_4 -> +sky130_fd_sc_hd__a2bb2o_1 -> +sky130_fd_sc_hd__a2bb2o_2 -> +sky130_fd_sc_hd__a2bb2o_4 -> +sky130_fd_sc_hd__a2bb2oi_1 -> +sky130_fd_sc_hd__a2bb2oi_2 -> +sky130_fd_sc_hd__a2bb2oi_4 -> +sky130_fd_sc_hd__a311o_1 -> +sky130_fd_sc_hd__a311o_2 -> +sky130_fd_sc_hd__a311o_4 -> +sky130_fd_sc_hd__a311oi_1 -> +sky130_fd_sc_hd__a311oi_2 -> +sky130_fd_sc_hd__a311oi_4 -> +sky130_fd_sc_hd__a31o_1 -> +sky130_fd_sc_hd__a31o_2 -> +sky130_fd_sc_hd__a31o_4 -> +sky130_fd_sc_hd__a31oi_1 -> +sky130_fd_sc_hd__a31oi_2 -> +sky130_fd_sc_hd__a31oi_4 -> +sky130_fd_sc_hd__a32o_1 -> +sky130_fd_sc_hd__a32o_2 -> +sky130_fd_sc_hd__a32o_4 -> +sky130_fd_sc_hd__a32oi_1 -> +sky130_fd_sc_hd__a32oi_2 -> +sky130_fd_sc_hd__a32oi_4 -> +sky130_fd_sc_hd__a41o_1 -> +sky130_fd_sc_hd__a41o_2 -> +sky130_fd_sc_hd__a41o_4 -> +sky130_fd_sc_hd__a41oi_1 -> +sky130_fd_sc_hd__a41oi_2 -> +sky130_fd_sc_hd__a41oi_4 -> +sky130_fd_sc_hd__and2_0 -> A B +sky130_fd_sc_hd__and2_1 -> A B +sky130_fd_sc_hd__and2_2 -> A B +sky130_fd_sc_hd__and2_4 -> A B +sky130_fd_sc_hd__and2b_1 -> +sky130_fd_sc_hd__and2b_2 -> +sky130_fd_sc_hd__and2b_4 -> +sky130_fd_sc_hd__and3_1 -> A B C +sky130_fd_sc_hd__and3_2 -> A B C +sky130_fd_sc_hd__and3_4 -> A B C +sky130_fd_sc_hd__and3b_1 -> B C +sky130_fd_sc_hd__and3b_2 -> B C +sky130_fd_sc_hd__and3b_4 -> B C +sky130_fd_sc_hd__and4_1 -> A B C D +sky130_fd_sc_hd__and4_2 -> A B C D +sky130_fd_sc_hd__and4_4 -> A B C D +sky130_fd_sc_hd__and4b_1 -> B C D +sky130_fd_sc_hd__and4b_2 -> B C D +sky130_fd_sc_hd__and4b_4 -> B C D +sky130_fd_sc_hd__and4bb_1 -> C D +sky130_fd_sc_hd__and4bb_2 -> C D +sky130_fd_sc_hd__and4bb_4 -> C D +sky130_fd_sc_hd__buf_1 -> +sky130_fd_sc_hd__buf_12 -> +sky130_fd_sc_hd__buf_16 -> +sky130_fd_sc_hd__buf_2 -> +sky130_fd_sc_hd__buf_4 -> +sky130_fd_sc_hd__buf_6 -> +sky130_fd_sc_hd__buf_8 -> +sky130_fd_sc_hd__bufbuf_16 -> +sky130_fd_sc_hd__bufbuf_8 -> +sky130_fd_sc_hd__bufinv_16 -> +sky130_fd_sc_hd__bufinv_8 -> +sky130_fd_sc_hd__clkbuf_1 -> +sky130_fd_sc_hd__clkbuf_16 -> +sky130_fd_sc_hd__clkbuf_2 -> +sky130_fd_sc_hd__clkbuf_4 -> +sky130_fd_sc_hd__clkbuf_8 -> +sky130_fd_sc_hd__clkdlybuf4s15_1 -> +sky130_fd_sc_hd__clkdlybuf4s15_2 -> +sky130_fd_sc_hd__clkdlybuf4s18_1 -> +sky130_fd_sc_hd__clkdlybuf4s18_2 -> +sky130_fd_sc_hd__clkdlybuf4s25_1 -> +sky130_fd_sc_hd__clkdlybuf4s25_2 -> +sky130_fd_sc_hd__clkdlybuf4s50_1 -> +sky130_fd_sc_hd__clkdlybuf4s50_2 -> +sky130_fd_sc_hd__clkinv_1 -> +sky130_fd_sc_hd__clkinv_16 -> +sky130_fd_sc_hd__clkinv_2 -> +sky130_fd_sc_hd__clkinv_4 -> +sky130_fd_sc_hd__clkinv_8 -> +sky130_fd_sc_hd__clkinvlp_2 -> +sky130_fd_sc_hd__clkinvlp_4 -> +sky130_fd_sc_hd__conb_1 -> +sky130_fd_sc_hd__decap_12 -> +sky130_fd_sc_hd__decap_3 -> +sky130_fd_sc_hd__decap_4 -> +sky130_fd_sc_hd__decap_6 -> +sky130_fd_sc_hd__decap_8 -> +sky130_fd_sc_hd__dfbbn_1 -> +sky130_fd_sc_hd__dfbbn_2 -> +sky130_fd_sc_hd__dfbbp_1 -> +sky130_fd_sc_hd__dfrbp_1 -> +sky130_fd_sc_hd__dfrbp_2 -> +sky130_fd_sc_hd__dfrtn_1 -> +sky130_fd_sc_hd__dfrtp_1 -> +sky130_fd_sc_hd__dfrtp_2 -> +sky130_fd_sc_hd__dfrtp_4 -> +sky130_fd_sc_hd__dfsbp_1 -> +sky130_fd_sc_hd__dfsbp_2 -> +sky130_fd_sc_hd__dfstp_1 -> +sky130_fd_sc_hd__dfstp_2 -> +sky130_fd_sc_hd__dfstp_4 -> +sky130_fd_sc_hd__dfxbp_1 -> +sky130_fd_sc_hd__dfxbp_2 -> +sky130_fd_sc_hd__dfxtp_1 -> +sky130_fd_sc_hd__dfxtp_2 -> +sky130_fd_sc_hd__dfxtp_4 -> +sky130_fd_sc_hd__diode_2 -> +sky130_fd_sc_hd__dlclkp_1 -> +sky130_fd_sc_hd__dlclkp_2 -> +sky130_fd_sc_hd__dlclkp_4 -> +sky130_fd_sc_hd__dlrbn_1 -> +sky130_fd_sc_hd__dlrbn_2 -> +sky130_fd_sc_hd__dlrbp_1 -> +sky130_fd_sc_hd__dlrbp_2 -> +sky130_fd_sc_hd__dlrtn_1 -> +sky130_fd_sc_hd__dlrtn_2 -> +sky130_fd_sc_hd__dlrtn_4 -> +sky130_fd_sc_hd__dlrtp_1 -> +sky130_fd_sc_hd__dlrtp_2 -> +sky130_fd_sc_hd__dlrtp_4 -> +sky130_fd_sc_hd__dlxbn_1 -> +sky130_fd_sc_hd__dlxbn_2 -> +sky130_fd_sc_hd__dlxbp_1 -> +sky130_fd_sc_hd__dlxtn_1 -> +sky130_fd_sc_hd__dlxtn_2 -> +sky130_fd_sc_hd__dlxtn_4 -> +sky130_fd_sc_hd__dlxtp_1 -> +sky130_fd_sc_hd__dlygate4sd1_1 -> +sky130_fd_sc_hd__dlygate4sd2_1 -> +sky130_fd_sc_hd__dlygate4sd3_1 -> +sky130_fd_sc_hd__dlymetal6s2s_1 -> +sky130_fd_sc_hd__dlymetal6s4s_1 -> +sky130_fd_sc_hd__dlymetal6s6s_1 -> +sky130_fd_sc_hd__ebufn_1 -> +sky130_fd_sc_hd__ebufn_2 -> +sky130_fd_sc_hd__ebufn_4 -> +sky130_fd_sc_hd__ebufn_8 -> +sky130_fd_sc_hd__edfxbp_1 -> +sky130_fd_sc_hd__edfxtp_1 -> +sky130_fd_sc_hd__einvn_0 -> +sky130_fd_sc_hd__einvn_1 -> +sky130_fd_sc_hd__einvn_2 -> +sky130_fd_sc_hd__einvn_4 -> +sky130_fd_sc_hd__einvn_8 -> +sky130_fd_sc_hd__einvp_1 -> +sky130_fd_sc_hd__einvp_2 -> +sky130_fd_sc_hd__einvp_4 -> +sky130_fd_sc_hd__einvp_8 -> +sky130_fd_sc_hd__fa_1 -> +sky130_fd_sc_hd__fa_2 -> +sky130_fd_sc_hd__fa_4 -> +sky130_fd_sc_hd__fah_1 -> +sky130_fd_sc_hd__fahcin_1 -> +sky130_fd_sc_hd__fahcon_1 -> +sky130_fd_sc_hd__ha_1 -> +sky130_fd_sc_hd__ha_2 -> +sky130_fd_sc_hd__ha_4 -> +sky130_fd_sc_hd__inv_1 -> +sky130_fd_sc_hd__inv_12 -> +sky130_fd_sc_hd__inv_16 -> +sky130_fd_sc_hd__inv_2 -> +sky130_fd_sc_hd__inv_4 -> +sky130_fd_sc_hd__inv_6 -> +sky130_fd_sc_hd__inv_8 -> +sky130_fd_sc_hd__lpflow_bleeder_1 -> +sky130_fd_sc_hd__lpflow_clkbufkapwr_1 -> +sky130_fd_sc_hd__lpflow_clkbufkapwr_16 -> +sky130_fd_sc_hd__lpflow_clkbufkapwr_2 -> +sky130_fd_sc_hd__lpflow_clkbufkapwr_4 -> +sky130_fd_sc_hd__lpflow_clkbufkapwr_8 -> +sky130_fd_sc_hd__lpflow_clkinvkapwr_1 -> +sky130_fd_sc_hd__lpflow_clkinvkapwr_16 -> +sky130_fd_sc_hd__lpflow_clkinvkapwr_2 -> +sky130_fd_sc_hd__lpflow_clkinvkapwr_4 -> +sky130_fd_sc_hd__lpflow_clkinvkapwr_8 -> +sky130_fd_sc_hd__lpflow_decapkapwr_12 -> +sky130_fd_sc_hd__lpflow_decapkapwr_3 -> +sky130_fd_sc_hd__lpflow_decapkapwr_4 -> +sky130_fd_sc_hd__lpflow_decapkapwr_6 -> +sky130_fd_sc_hd__lpflow_decapkapwr_8 -> +sky130_fd_sc_hd__lpflow_inputiso0n_1 -> +sky130_fd_sc_hd__lpflow_inputiso0p_1 -> +sky130_fd_sc_hd__lpflow_inputiso1n_1 -> +sky130_fd_sc_hd__lpflow_inputiso1p_1 -> +sky130_fd_sc_hd__lpflow_inputisolatch_1 -> +sky130_fd_sc_hd__lpflow_isobufsrc_1 -> +sky130_fd_sc_hd__lpflow_isobufsrc_16 -> +sky130_fd_sc_hd__lpflow_isobufsrc_2 -> +sky130_fd_sc_hd__lpflow_isobufsrc_4 -> +sky130_fd_sc_hd__lpflow_isobufsrc_8 -> +sky130_fd_sc_hd__lpflow_isobufsrckapwr_16 -> +sky130_fd_sc_hd__lpflow_lsbuf_lh_hl_isowell_tap_1 -> +sky130_fd_sc_hd__lpflow_lsbuf_lh_hl_isowell_tap_2 -> +sky130_fd_sc_hd__lpflow_lsbuf_lh_hl_isowell_tap_4 -> +sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_4 -> +sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_tap_1 -> +sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_tap_2 -> +sky130_fd_sc_hd__lpflow_lsbuf_lh_isowell_tap_4 -> +sky130_fd_sc_hd__macro_sparecell -> +sky130_fd_sc_hd__maj3_1 -> +sky130_fd_sc_hd__maj3_2 -> +sky130_fd_sc_hd__maj3_4 -> +sky130_fd_sc_hd__mux2_1 -> +sky130_fd_sc_hd__mux2_2 -> +sky130_fd_sc_hd__mux2_4 -> +sky130_fd_sc_hd__mux2_8 -> +sky130_fd_sc_hd__mux2i_1 -> +sky130_fd_sc_hd__mux2i_2 -> +sky130_fd_sc_hd__mux2i_4 -> +sky130_fd_sc_hd__mux4_1 -> +sky130_fd_sc_hd__mux4_2 -> +sky130_fd_sc_hd__mux4_4 -> +sky130_fd_sc_hd__nand2_1 -> A B +sky130_fd_sc_hd__nand2_2 -> A B +sky130_fd_sc_hd__nand2_4 -> A B +sky130_fd_sc_hd__nand2_8 -> A B +sky130_fd_sc_hd__nand2b_1 -> +sky130_fd_sc_hd__nand2b_2 -> +sky130_fd_sc_hd__nand2b_4 -> +sky130_fd_sc_hd__nand3_1 -> A B C +sky130_fd_sc_hd__nand3_2 -> A B C +sky130_fd_sc_hd__nand3_4 -> A B C +sky130_fd_sc_hd__nand3b_1 -> B C +sky130_fd_sc_hd__nand3b_2 -> B C +sky130_fd_sc_hd__nand3b_4 -> B C +sky130_fd_sc_hd__nand4_1 -> A B C D +sky130_fd_sc_hd__nand4_2 -> A B C D +sky130_fd_sc_hd__nand4_4 -> A B C D +sky130_fd_sc_hd__nand4b_1 -> B C D +sky130_fd_sc_hd__nand4b_2 -> B C D +sky130_fd_sc_hd__nand4b_4 -> B C D +sky130_fd_sc_hd__nand4bb_1 -> A_N B_N +sky130_fd_sc_hd__nand4bb_2 -> A_N B_N +sky130_fd_sc_hd__nand4bb_4 -> A_N B_N +sky130_fd_sc_hd__nor2_1 -> A B +sky130_fd_sc_hd__nor2_2 -> A B +sky130_fd_sc_hd__nor2_4 -> A B +sky130_fd_sc_hd__nor2_8 -> A B +sky130_fd_sc_hd__nor2b_1 -> +sky130_fd_sc_hd__nor2b_2 -> +sky130_fd_sc_hd__nor2b_4 -> +sky130_fd_sc_hd__nor3_1 -> A B C +sky130_fd_sc_hd__nor3_2 -> A B C +sky130_fd_sc_hd__nor3_4 -> A B C +sky130_fd_sc_hd__nor3b_1 -> A B +sky130_fd_sc_hd__nor3b_2 -> A B +sky130_fd_sc_hd__nor3b_4 -> A B +sky130_fd_sc_hd__nor4_1 -> A B C D +sky130_fd_sc_hd__nor4_2 -> A B C D +sky130_fd_sc_hd__nor4_4 -> A B C D +sky130_fd_sc_hd__nor4b_1 -> A B C +sky130_fd_sc_hd__nor4b_2 -> A B C +sky130_fd_sc_hd__nor4b_4 -> A B C +sky130_fd_sc_hd__nor4bb_1 -> C_N D_N +sky130_fd_sc_hd__nor4bb_2 -> C_N D_N +sky130_fd_sc_hd__nor4bb_4 -> C_N D_N +sky130_fd_sc_hd__o2111a_1 -> +sky130_fd_sc_hd__o2111a_2 -> +sky130_fd_sc_hd__o2111a_4 -> +sky130_fd_sc_hd__o2111ai_1 -> +sky130_fd_sc_hd__o2111ai_2 -> +sky130_fd_sc_hd__o2111ai_4 -> +sky130_fd_sc_hd__o211a_1 -> +sky130_fd_sc_hd__o211a_2 -> +sky130_fd_sc_hd__o211a_4 -> +sky130_fd_sc_hd__o211ai_1 -> +sky130_fd_sc_hd__o211ai_2 -> +sky130_fd_sc_hd__o211ai_4 -> +sky130_fd_sc_hd__o21a_1 -> +sky130_fd_sc_hd__o21a_2 -> +sky130_fd_sc_hd__o21a_4 -> +sky130_fd_sc_hd__o21ai_0 -> +sky130_fd_sc_hd__o21ai_1 -> +sky130_fd_sc_hd__o21ai_2 -> +sky130_fd_sc_hd__o21ai_4 -> +sky130_fd_sc_hd__o21ba_1 -> +sky130_fd_sc_hd__o21ba_2 -> +sky130_fd_sc_hd__o21ba_4 -> +sky130_fd_sc_hd__o21bai_1 -> +sky130_fd_sc_hd__o21bai_2 -> +sky130_fd_sc_hd__o21bai_4 -> +sky130_fd_sc_hd__o221a_1 -> +sky130_fd_sc_hd__o221a_2 -> +sky130_fd_sc_hd__o221a_4 -> +sky130_fd_sc_hd__o221ai_1 -> +sky130_fd_sc_hd__o221ai_2 -> +sky130_fd_sc_hd__o221ai_4 -> +sky130_fd_sc_hd__o22a_1 -> +sky130_fd_sc_hd__o22a_2 -> +sky130_fd_sc_hd__o22a_4 -> +sky130_fd_sc_hd__o22ai_1 -> +sky130_fd_sc_hd__o22ai_2 -> +sky130_fd_sc_hd__o22ai_4 -> +sky130_fd_sc_hd__o2bb2a_1 -> +sky130_fd_sc_hd__o2bb2a_2 -> +sky130_fd_sc_hd__o2bb2a_4 -> +sky130_fd_sc_hd__o2bb2ai_1 -> +sky130_fd_sc_hd__o2bb2ai_2 -> +sky130_fd_sc_hd__o2bb2ai_4 -> +sky130_fd_sc_hd__o311a_1 -> +sky130_fd_sc_hd__o311a_2 -> +sky130_fd_sc_hd__o311a_4 -> +sky130_fd_sc_hd__o311ai_0 -> +sky130_fd_sc_hd__o311ai_1 -> +sky130_fd_sc_hd__o311ai_2 -> +sky130_fd_sc_hd__o311ai_4 -> +sky130_fd_sc_hd__o31a_1 -> +sky130_fd_sc_hd__o31a_2 -> +sky130_fd_sc_hd__o31a_4 -> +sky130_fd_sc_hd__o31ai_1 -> +sky130_fd_sc_hd__o31ai_2 -> +sky130_fd_sc_hd__o31ai_4 -> +sky130_fd_sc_hd__o32a_1 -> +sky130_fd_sc_hd__o32a_2 -> +sky130_fd_sc_hd__o32a_4 -> +sky130_fd_sc_hd__o32ai_1 -> +sky130_fd_sc_hd__o32ai_2 -> +sky130_fd_sc_hd__o32ai_4 -> +sky130_fd_sc_hd__o41a_1 -> +sky130_fd_sc_hd__o41a_2 -> +sky130_fd_sc_hd__o41a_4 -> +sky130_fd_sc_hd__o41ai_1 -> +sky130_fd_sc_hd__o41ai_2 -> +sky130_fd_sc_hd__o41ai_4 -> +sky130_fd_sc_hd__or2_0 -> A B +sky130_fd_sc_hd__or2_1 -> A B +sky130_fd_sc_hd__or2_2 -> A B +sky130_fd_sc_hd__or2_4 -> A B +sky130_fd_sc_hd__or2b_1 -> +sky130_fd_sc_hd__or2b_2 -> +sky130_fd_sc_hd__or2b_4 -> +sky130_fd_sc_hd__or3_1 -> A B C +sky130_fd_sc_hd__or3_2 -> A B C +sky130_fd_sc_hd__or3_4 -> A B C +sky130_fd_sc_hd__or3b_1 -> A B +sky130_fd_sc_hd__or3b_2 -> A B +sky130_fd_sc_hd__or3b_4 -> A B +sky130_fd_sc_hd__or4_1 -> A B C D +sky130_fd_sc_hd__or4_2 -> A B C D +sky130_fd_sc_hd__or4_4 -> A B C D +sky130_fd_sc_hd__or4b_1 -> A B C +sky130_fd_sc_hd__or4b_2 -> A B C +sky130_fd_sc_hd__or4b_4 -> A B C +sky130_fd_sc_hd__or4bb_1 -> A B +sky130_fd_sc_hd__or4bb_2 -> A B +sky130_fd_sc_hd__or4bb_4 -> A B +sky130_fd_sc_hd__probe_p_8 -> +sky130_fd_sc_hd__probec_p_8 -> +sky130_fd_sc_hd__sdfbbn_1 -> +sky130_fd_sc_hd__sdfbbn_2 -> +sky130_fd_sc_hd__sdfbbp_1 -> +sky130_fd_sc_hd__sdfrbp_1 -> +sky130_fd_sc_hd__sdfrbp_2 -> +sky130_fd_sc_hd__sdfrtn_1 -> +sky130_fd_sc_hd__sdfrtp_1 -> +sky130_fd_sc_hd__sdfrtp_2 -> +sky130_fd_sc_hd__sdfrtp_4 -> +sky130_fd_sc_hd__sdfsbp_1 -> +sky130_fd_sc_hd__sdfsbp_2 -> +sky130_fd_sc_hd__sdfstp_1 -> +sky130_fd_sc_hd__sdfstp_2 -> +sky130_fd_sc_hd__sdfstp_4 -> +sky130_fd_sc_hd__sdfxbp_1 -> +sky130_fd_sc_hd__sdfxbp_2 -> +sky130_fd_sc_hd__sdfxtp_1 -> +sky130_fd_sc_hd__sdfxtp_2 -> +sky130_fd_sc_hd__sdfxtp_4 -> +sky130_fd_sc_hd__sdlclkp_1 -> +sky130_fd_sc_hd__sdlclkp_2 -> +sky130_fd_sc_hd__sdlclkp_4 -> +sky130_fd_sc_hd__sedfxbp_1 -> +sky130_fd_sc_hd__sedfxbp_2 -> +sky130_fd_sc_hd__sedfxtp_1 -> +sky130_fd_sc_hd__sedfxtp_2 -> +sky130_fd_sc_hd__sedfxtp_4 -> +sky130_fd_sc_hd__xnor2_1 -> +sky130_fd_sc_hd__xnor2_2 -> +sky130_fd_sc_hd__xnor2_4 -> +sky130_fd_sc_hd__xnor3_1 -> +sky130_fd_sc_hd__xnor3_2 -> +sky130_fd_sc_hd__xnor3_4 -> +sky130_fd_sc_hd__xor2_1 -> +sky130_fd_sc_hd__xor2_2 -> +sky130_fd_sc_hd__xor2_4 -> +sky130_fd_sc_hd__xor3_1 -> +sky130_fd_sc_hd__xor3_2 -> +sky130_fd_sc_hd__xor3_4 -> diff --git a/test/aes_sky130hd.metrics b/test/aes_sky130hd.metrics index 85289f17a62..2b6035230e7 100644 --- a/test/aes_sky130hd.metrics +++ b/test/aes_sky130hd.metrics @@ -8,62 +8,66 @@ "design__instance__displacement__max": 13.233, "route__wirelength__estimated": 1.17088e+06, "RSZ::repair_design_buffer_count": "281", - "RSZ::max_slew_slack": "20.003910859425865", + "RSZ::max_slew_slack": "20.003902912139893", "RSZ::max_fanout_slack": "100.0", "RSZ::max_capacitance_slack": "81.39344276789393", "design__instance__displacement__total": 197.112, "design__instance__displacement__mean": 0.003, "design__instance__displacement__max": 9.05, "route__wirelength__estimated": 1.18573e+06, - "design__instance__count__setup_buffer": 954, + "design__instance__count__setup_buffer": 1081, "design__instance__count__hold_buffer": 333, - "RSZ::worst_slack_min": "0.0005062617135471305", - "RSZ::worst_slack_max": "-0.6463043616556046", - "RSZ::tns_max": "-85.86547538252458", + "RSZ::worst_slack_min": "0.0005067058027695403", + "RSZ::worst_slack_max": "-0.5759526352198947", + "RSZ::tns_max": "-78.18505530964731", "RSZ::hold_buffer_count": "333", - "design__instance__displacement__total": 5837.85, - "design__instance__displacement__mean": 0.102, - "design__instance__displacement__max": 14.767, - "route__wirelength__estimated": 1.27657e+06, - "DPL::utilization": "7.3", - "DPL::design_area": "220994", - "route__net": 16664, + "design__instance__displacement__total": 6660.01, + "design__instance__displacement__mean": 0.117, + "design__instance__displacement__max": 13.635, + "route__wirelength__estimated": 1.28658e+06, + "DPL::utilization": "7.4", + "DPL::design_area": "222431", + "route__net": 16791, "route__net__special": 2, - "antenna__violating__nets": 4, - "antenna__violating__pins": 4, - "GRT::ANT::errors": "4", + "antenna__violating__nets": 2, + "antenna__violating__pins": 2, + "GRT::ANT::errors": "2", "design__violations": 0, - "route__net": 16664, + "route__net": 16791, "route__net__special": 2, - "route__drc_errors__iter:1": 13062, - "route__wirelength__iter:1": 1614494, - "route__drc_errors__iter:2": 3073, - "route__wirelength__iter:2": 1607769, - "route__drc_errors__iter:3": 2280, - "route__wirelength__iter:3": 1604834, - "route__drc_errors__iter:4": 153, - "route__wirelength__iter:4": 1605172, - "route__drc_errors__iter:5": 6, - "route__wirelength__iter:5": 1605168, - "route__drc_errors__iter:6": 0, - "route__wirelength__iter:6": 1605166, + "route__drc_errors__iter:1": 15985, + "route__wirelength__iter:1": 1630419, + "route__drc_errors__iter:2": 4907, + "route__wirelength__iter:2": 1624443, + "route__drc_errors__iter:3": 4319, + "route__wirelength__iter:3": 1621538, + "route__drc_errors__iter:4": 333, + "route__wirelength__iter:4": 1622283, + "route__drc_errors__iter:5": 46, + "route__wirelength__iter:5": 1622217, + "route__drc_errors__iter:6": 27, + "route__wirelength__iter:6": 1622221, + "route__drc_errors__iter:7": 14, + "route__wirelength__iter:7": 1622225, + "route__drc_errors__iter:8": 0, + "route__wirelength__iter:8": 1622218, "route__drc_errors": 0, - "route__wirelength": 1605166, - "route__vias": 159126, - "route__vias__singlecut": 159126, + "route__wirelength": 1622218, + "route__vias": 160226, + "route__vias__singlecut": 160226, "route__vias__multicut": 0, "DRT::drv": "0", - "antenna__violating__nets": 93, - "antenna__violating__pins": 96, - "DRT::ANT::errors": "93", + "antenna__violating__nets": 99, + "antenna__violating__pins": 101, + "DRT::ANT::errors": "99", "timing__drv__floating__nets": 0, "timing__drv__floating__pins": 0, - "DRT::worst_slack_min": "-0.26316471968699706", - "DRT::worst_slack_max": "-1.9527340297466504", - "DRT::tns_max": "-162.78936703852108", - "DRT::clock_skew": "0.7300389388532439", - "DRT::max_slew_slack": "-57.365993658701576", + "DRT::worst_slack_min": "-0.18114499302169298", + "DRT::worst_slack_max": "-1.4094996679877951", + "DRT::tns_max": "-157.54720995950018", + "DRT::clock_skew": "0.6833649395333666", + "DRT::max_slew_slack": "-15.645448366800943", "DRT::max_fanout_slack": "100.0", - "DRT::max_capacitance_slack": "-64.29223093140345", + "DRT::max_capacitance_slack": "-17.951310626834886", "DRT::clock_period": "3.740000" } \ No newline at end of file diff --git a/test/aes_sky130hd.metrics_limits b/test/aes_sky130hd.metrics_limits index ab09adae8fd..558010e77d2 100644 --- a/test/aes_sky130hd.metrics_limits +++ b/test/aes_sky130hd.metrics_limits @@ -1,23 +1,23 @@ { "IFP::instance_count" : "20652.0" - ,"DPL::design_area" : "265192.8" - ,"DPL::utilization" : "8.76" + ,"DPL::design_area" : "266917.2" + ,"DPL::utilization" : "8.88" ,"RSZ::repair_design_buffer_count" : "337" ,"RSZ::max_slew_slack" : "0" ,"RSZ::max_capacitance_slack" : "0" ,"RSZ::max_fanout_slack" : "0" - ,"RSZ::worst_slack_min" : "-0.37349373828645294" - ,"RSZ::worst_slack_max" : "-1.0203043616556047" - ,"RSZ::tns_max" : "-729.5194753825247" + ,"RSZ::worst_slack_min" : "-0.37349329419723054" + ,"RSZ::worst_slack_max" : "-0.9499526352198948" + ,"RSZ::tns_max" : "-721.8390553096474" ,"RSZ::hold_buffer_count" : "399" - ,"GRT::ANT::errors" : "4" + ,"GRT::ANT::errors" : "2" ,"DRT::drv" : "0" - ,"DRT::worst_slack_min" : "-0.6371647196869972" - ,"DRT::worst_slack_max" : "-2.3267340297466506" - ,"DRT::tns_max" : "-806.4433670385212" - ,"DRT::clock_skew" : "0.8760467266238926" - ,"DRT::max_slew_slack" : "-68.8391923904419" - ,"DRT::max_capacitance_slack" : "-77.15067711768414" + ,"DRT::worst_slack_min" : "-0.5551449930216931" + ,"DRT::worst_slack_max" : "-1.7834996679877952" + ,"DRT::tns_max" : "-801.2012099595003" + ,"DRT::clock_skew" : "0.8200379274400399" + ,"DRT::max_slew_slack" : "-18.774538040161133" + ,"DRT::max_capacitance_slack" : "-21.541572752201862" ,"DRT::max_fanout_slack" : "0" ,"DRT::clock_period" : "3.74" } diff --git a/test/aes_sky130hs.metrics b/test/aes_sky130hs.metrics index 4c13629d3a7..2926331164f 100644 --- a/test/aes_sky130hs.metrics +++ b/test/aes_sky130hs.metrics @@ -15,53 +15,53 @@ "design__instance__displacement__mean": 0.004, "design__instance__displacement__max": 5.928, "route__wirelength__estimated": 1.33431e+06, - "design__instance__count__setup_buffer": 1048, - "design__instance__count__hold_buffer": 603, - "RSZ::worst_slack_min": "0.0005535572157337702", - "RSZ::worst_slack_max": "-0.6330927072889141", - "RSZ::tns_max": "-92.18982460585138", - "RSZ::hold_buffer_count": "603", - "design__instance__displacement__total": 8845.2, - "design__instance__displacement__mean": 0.18, - "design__instance__displacement__max": 15.665, - "route__wirelength__estimated": 1.39611e+06, - "DPL::utilization": "10.3", - "DPL::design_area": "310555", - "route__net": 16783, + "design__instance__count__setup_buffer": 846, + "design__instance__count__hold_buffer": 601, + "RSZ::worst_slack_min": "0.0005530021042057581", + "RSZ::worst_slack_max": "-0.6879061959217289", + "RSZ::tns_max": "-98.9044039106941", + "RSZ::hold_buffer_count": "601", + "design__instance__displacement__total": 7480.57, + "design__instance__displacement__mean": 0.153, + "design__instance__displacement__max": 17.25, + "route__wirelength__estimated": 1.38716e+06, + "DPL::utilization": "10.2", + "DPL::design_area": "307348", + "route__net": 16579, "route__net__special": 2, "antenna__violating__nets": 0, "antenna__violating__pins": 0, "GRT::ANT::errors": "0", "design__violations": 0, - "route__net": 16783, + "route__net": 16579, "route__net__special": 2, - "route__drc_errors__iter:1": 11011, - "route__wirelength__iter:1": 1713472, - "route__drc_errors__iter:2": 1515, - "route__wirelength__iter:2": 1707532, - "route__drc_errors__iter:3": 992, - "route__wirelength__iter:3": 1704630, - "route__drc_errors__iter:4": 25, - "route__wirelength__iter:4": 1704500, + "route__drc_errors__iter:1": 11079, + "route__wirelength__iter:1": 1706754, + "route__drc_errors__iter:2": 1570, + "route__wirelength__iter:2": 1700615, + "route__drc_errors__iter:3": 1213, + "route__wirelength__iter:3": 1697715, + "route__drc_errors__iter:4": 10, + "route__wirelength__iter:4": 1697727, "route__drc_errors__iter:5": 0, - "route__wirelength__iter:5": 1704498, + "route__wirelength__iter:5": 1697713, "route__drc_errors": 0, - "route__wirelength": 1704498, - "route__vias": 150422, - "route__vias__singlecut": 150422, + "route__wirelength": 1697713, + "route__vias": 149601, + "route__vias__singlecut": 149601, "route__vias__multicut": 0, "DRT::drv": "0", - "antenna__violating__nets": 112, - "antenna__violating__pins": 114, - "DRT::ANT::errors": "112", + "antenna__violating__nets": 109, + "antenna__violating__pins": 109, + "DRT::ANT::errors": "109", "timing__drv__floating__nets": 0, "timing__drv__floating__pins": 0, - "DRT::worst_slack_min": "-0.14550050465189013", - "DRT::worst_slack_max": "-0.9857785977638553", - "DRT::tns_max": "-127.80502706779322", - "DRT::clock_skew": "0.4667061313955648", - "DRT::max_slew_slack": "-22.951307892799377", + "DRT::worst_slack_min": "-0.1664590734589077", + "DRT::worst_slack_max": "-0.9967604801448263", + "DRT::tns_max": "-134.4156326511716", + "DRT::clock_skew": "0.5093865473606167", + "DRT::max_slew_slack": "-10.26289090514183", "DRT::max_fanout_slack": "100.0", - "DRT::max_capacitance_slack": "-25.77419541943123", + "DRT::max_capacitance_slack": "-12.415987695807061", "DRT::clock_period": "2.811000" } \ No newline at end of file diff --git a/test/aes_sky130hs.metrics_limits b/test/aes_sky130hs.metrics_limits index 1f6eaba966e..3448fbe80f9 100644 --- a/test/aes_sky130hs.metrics_limits +++ b/test/aes_sky130hs.metrics_limits @@ -1,23 +1,23 @@ { "IFP::instance_count" : "19588.8" - ,"DPL::design_area" : "372666.0" - ,"DPL::utilization" : "12.360000000000001" + ,"DPL::design_area" : "368817.6" + ,"DPL::utilization" : "12.239999999999998" ,"RSZ::repair_design_buffer_count" : "621" ,"RSZ::max_slew_slack" : "0" ,"RSZ::max_capacitance_slack" : "0" ,"RSZ::max_fanout_slack" : "0" - ,"RSZ::worst_slack_min" : "-0.28054644278426627" - ,"RSZ::worst_slack_max" : "-0.9141927072889141" - ,"RSZ::tns_max" : "-551.0574646058515" - ,"RSZ::hold_buffer_count" : "723" + ,"RSZ::worst_slack_min" : "-0.28054699789579424" + ,"RSZ::worst_slack_max" : "-0.9690061959217289" + ,"RSZ::tns_max" : "-557.7720439106942" + ,"RSZ::hold_buffer_count" : "721" ,"GRT::ANT::errors" : "0" ,"DRT::drv" : "0" - ,"DRT::worst_slack_min" : "-0.42660050465189014" - ,"DRT::worst_slack_max" : "-1.2668785977638555" - ,"DRT::tns_max" : "-586.6726670677933" - ,"DRT::clock_skew" : "0.5600473576746777" - ,"DRT::max_slew_slack" : "-27.541569471359253" - ,"DRT::max_capacitance_slack" : "-30.929034503317475" + ,"DRT::worst_slack_min" : "-0.4475590734589077" + ,"DRT::worst_slack_max" : "-1.2778604801448263" + ,"DRT::tns_max" : "-593.2832726511716" + ,"DRT::clock_skew" : "0.6112638568327401" + ,"DRT::max_slew_slack" : "-12.315469086170197" + ,"DRT::max_capacitance_slack" : "-14.899185234968472" ,"DRT::max_fanout_slack" : "0" ,"DRT::clock_period" : "2.811" } diff --git a/test/ibex_sky130hd.metrics b/test/ibex_sky130hd.metrics index fb8c4cb3cd1..852f25c133a 100644 --- a/test/ibex_sky130hd.metrics +++ b/test/ibex_sky130hd.metrics @@ -15,61 +15,65 @@ "design__instance__displacement__mean": 0.021, "design__instance__displacement__max": 9.898, "route__wirelength__estimated": 714611, - "design__instance__count__setup_buffer": 242, + "design__instance__count__setup_buffer": 238, "design__instance__count__hold_buffer": 332, - "RSZ::worst_slack_min": "0.00044386717779855867", - "RSZ::worst_slack_max": "-2.284226206171308", - "RSZ::tns_max": "-30.56044748206407", + "RSZ::worst_slack_min": "0.00044364513318735383", + "RSZ::worst_slack_max": "-2.296500832278714", + "RSZ::tns_max": "-30.69140406468204", "RSZ::hold_buffer_count": "332", - "design__instance__displacement__total": 3617.02, - "design__instance__displacement__mean": 0.153, + "design__instance__displacement__total": 3574.86, + "design__instance__displacement__mean": 0.151, "design__instance__displacement__max": 26.68, - "route__wirelength__estimated": 750257, + "route__wirelength__estimated": 749610, "DPL::utilization": "27.9", - "DPL::design_area": "169240", - "route__net": 15631, + "DPL::design_area": "169196", + "route__net": 15627, "route__net__special": 2, "antenna__violating__nets": 0, "antenna__violating__pins": 0, "GRT::ANT::errors": "0", "design__violations": 0, - "route__net": 15631, + "route__net": 15627, "route__net__special": 2, - "route__drc_errors__iter:1": 11621, - "route__wirelength__iter:1": 963634, - "route__drc_errors__iter:2": 2003, - "route__wirelength__iter:2": 958270, - "route__drc_errors__iter:3": 1625, - "route__wirelength__iter:3": 956308, - "route__drc_errors__iter:4": 284, - "route__wirelength__iter:4": 956338, - "route__drc_errors__iter:5": 67, - "route__wirelength__iter:5": 956386, - "route__drc_errors__iter:6": 29, - "route__wirelength__iter:6": 956406, - "route__drc_errors__iter:7": 6, - "route__wirelength__iter:7": 956393, - "route__drc_errors__iter:8": 2, - "route__wirelength__iter:8": 956394, - "route__drc_errors__iter:9": 0, - "route__wirelength__iter:9": 956393, + "route__drc_errors__iter:1": 13484, + "route__wirelength__iter:1": 967591, + "route__drc_errors__iter:2": 3417, + "route__wirelength__iter:2": 962824, + "route__drc_errors__iter:3": 3050, + "route__wirelength__iter:3": 960646, + "route__drc_errors__iter:4": 469, + "route__wirelength__iter:4": 960990, + "route__drc_errors__iter:5": 161, + "route__wirelength__iter:5": 960913, + "route__drc_errors__iter:6": 64, + "route__wirelength__iter:6": 960918, + "route__drc_errors__iter:7": 27, + "route__wirelength__iter:7": 960922, + "route__drc_errors__iter:8": 13, + "route__wirelength__iter:8": 960909, + "route__drc_errors__iter:9": 12, + "route__wirelength__iter:9": 960911, + "route__drc_errors__iter:10": 7, + "route__wirelength__iter:10": 960906, + "route__drc_errors__iter:11": 0, + "route__wirelength__iter:11": 960906, "route__drc_errors": 0, - "route__wirelength": 956393, - "route__vias": 130527, - "route__vias__singlecut": 130527, + "route__wirelength": 960906, + "route__vias": 130733, + "route__vias__singlecut": 130733, "route__vias__multicut": 0, "DRT::drv": "0", - "antenna__violating__nets": 42, - "antenna__violating__pins": 47, - "DRT::ANT::errors": "42", + "antenna__violating__nets": 41, + "antenna__violating__pins": 45, + "DRT::ANT::errors": "41", "timing__drv__floating__nets": 0, "timing__drv__floating__pins": 0, - "DRT::worst_slack_min": "-0.533850756489337", - "DRT::worst_slack_max": "-3.34448211924706", - "DRT::tns_max": "-140.02018074653395", - "DRT::clock_skew": "2.8205421019342416", - "DRT::max_slew_slack": "-13.06274433930715", + "DRT::worst_slack_min": "-0.5978602226952019", + "DRT::worst_slack_max": "-3.491694143762117", + "DRT::tns_max": "-158.27543101912147", + "DRT::clock_skew": "2.9047698402133673", + "DRT::max_slew_slack": "-1.1719662696123123", "DRT::max_fanout_slack": "100.0", - "DRT::max_capacitance_slack": "21.05764955915588", + "DRT::max_capacitance_slack": "2.5332389361563186", "DRT::clock_period": "15.155000" } \ No newline at end of file diff --git a/test/ibex_sky130hd.metrics_limits b/test/ibex_sky130hd.metrics_limits index 3196f7d3965..8d72e1ab3fd 100644 --- a/test/ibex_sky130hd.metrics_limits +++ b/test/ibex_sky130hd.metrics_limits @@ -1,22 +1,22 @@ { "IFP::instance_count" : "18835.2" - ,"DPL::design_area" : "203088.0" + ,"DPL::design_area" : "203035.19999999998" ,"DPL::utilization" : "33.48" ,"RSZ::repair_design_buffer_count" : "430" ,"RSZ::max_slew_slack" : "0" ,"RSZ::max_capacitance_slack" : "0" ,"RSZ::max_fanout_slack" : "0" - ,"RSZ::worst_slack_min" : "-1.5150561328222014" - ,"RSZ::worst_slack_max" : "-3.799726206171308" - ,"RSZ::tns_max" : "-2409.289247482064" + ,"RSZ::worst_slack_min" : "-1.5150563548668128" + ,"RSZ::worst_slack_max" : "-3.812000832278714" + ,"RSZ::tns_max" : "-2409.4202040646824" ,"RSZ::hold_buffer_count" : "398" ,"GRT::ANT::errors" : "0" ,"DRT::drv" : "0" - ,"DRT::worst_slack_min" : "-2.049350756489337" - ,"DRT::worst_slack_max" : "-4.85998211924706" - ,"DRT::tns_max" : "-2518.7489807465345" - ,"DRT::clock_skew" : "3.3846505223210896" - ,"DRT::max_slew_slack" : "-15.675293207168579" + ,"DRT::worst_slack_min" : "-2.113360222695202" + ,"DRT::worst_slack_max" : "-5.007194143762117" + ,"DRT::tns_max" : "-2537.004231019122" + ,"DRT::clock_skew" : "3.4857238082560404" + ,"DRT::max_slew_slack" : "-1.4063595235347748" ,"DRT::max_capacitance_slack" : "0" ,"DRT::max_fanout_slack" : "0" ,"DRT::clock_period" : "15.155" From c1f71cc7a824932863a9b6018d9d30366a8d8f2c Mon Sep 17 00:00:00 2001 From: Arthur Koucher Date: Fri, 15 Mar 2024 15:15:42 -0300 Subject: [PATCH 44/45] gui: 1) add alternative to convert point to string in property 2) add origin field to master inspector Signed-off-by: Arthur Koucher --- src/gui/src/dbDescriptors.cpp | 1 + src/gui/src/gui.cpp | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/gui/src/dbDescriptors.cpp b/src/gui/src/dbDescriptors.cpp index d69ad95f645..070f26c56b7 100644 --- a/src/gui/src/dbDescriptors.cpp +++ b/src/gui/src/dbDescriptors.cpp @@ -816,6 +816,7 @@ Descriptor::Properties DbMasterDescriptor::getProperties(std::any object) const instances.insert(gui->makeSelected(inst)); } props.push_back({"Instances", instances}); + props.push_back({"Origin", master->getOrigin()}); populateODBProperties(props, master); diff --git a/src/gui/src/gui.cpp b/src/gui/src/gui.cpp index ddfdd967a7e..f5115722824 100644 --- a/src/gui/src/gui.cpp +++ b/src/gui/src/gui.cpp @@ -1492,6 +1492,10 @@ std::string Descriptor::Property::toString(const std::any& value) text += convert_dbu(v->xMax(), false) + ","; text += convert_dbu(v->yMax(), false) + ")"; return text; + } else if (auto v = std::any_cast(&value)) { + std::string text = fmt::format( + "({},{})", convert_dbu(v->x(), false), convert_dbu(v->y(), false)); + return text; } return ""; From dc0b908ec4e61533721504cd41b63f65680f6397 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Fri, 15 Mar 2024 15:43:05 -0300 Subject: [PATCH 45/45] drt: fix bug when checking if pin has tracks in its center Signed-off-by: Eder Monteiro --- src/drt/src/io/io_parser_helper.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/drt/src/io/io_parser_helper.cpp b/src/drt/src/io/io_parser_helper.cpp index c90f1b4f9b1..93c63385147 100644 --- a/src/drt/src/io/io_parser_helper.cpp +++ b/src/drt/src/io/io_parser_helper.cpp @@ -686,7 +686,7 @@ void io::Parser::checkFig(frPinFig* uFig, foundCenterTracks |= horzTracks.find(box.yCenter()) != horzTracks.end(); } else { foundTracks |= !vertTracks.empty(); - foundCenterTracks |= vertTracks.find(box.yCenter()) != vertTracks.end(); + foundCenterTracks |= vertTracks.find(box.xCenter()) != vertTracks.end(); } } if (foundTracks && box.minDXDY() > layer->getMinWidth()) { @@ -773,7 +773,7 @@ void io::Parser::checkPins() } else if (!foundCenterTracks && !hasPolys) { logger_->warn(DRT, 422, - "No routing tracks pass through the center of Term {}", + "No routing tracks pass through the center of Term {}.", bTerm->getName()); } }