From 830c4dc280a0d96aad7334089d54519981137360 Mon Sep 17 00:00:00 2001 From: eddieh-xlnx Date: Wed, 5 Jul 2023 09:07:17 -0700 Subject: [PATCH] PartialRouter's global router to not unpreserve sink nodes (#736) * PartialRouter's global router to not unpreserve sinks nodes Signed-off-by: Eddie Hung * Only disallow if input pin Signed-off-by: Eddie Hung * Update comment Signed-off-by: Eddie Hung * Refactor PartialRouter.getGlobalRoutingNodeStatus() Signed-off-by: Eddie Hung * Remove extra char Signed-off-by: Eddie Hung --------- Signed-off-by: Eddie Hung --- .../rapidwright/rwroute/PartialRouter.java | 56 ++++++++++--------- .../xilinx/rapidwright/rwroute/RWRoute.java | 12 +++- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/com/xilinx/rapidwright/rwroute/PartialRouter.java b/src/com/xilinx/rapidwright/rwroute/PartialRouter.java index 733853108..74b6a42da 100644 --- a/src/com/xilinx/rapidwright/rwroute/PartialRouter.java +++ b/src/com/xilinx/rapidwright/rwroute/PartialRouter.java @@ -191,21 +191,24 @@ protected int getNumConnectionsCrossingSLRs() { @Override protected NodeStatus getGlobalRoutingNodeStatus(Net net, Node node) { - // In softPreserve mode, allow global router to use all nodes -- including - // those already preserved by another net - Net preservedNet = routingGraph.getPreservedNet(node); - if (preservedNet != null) { - // Unavailable only if it isn't carrying the net undergoing routing - return preservedNet == net ? NodeStatus.INUSE : - softPreserve ? NodeStatus.AVAILABLE : - NodeStatus.UNAVAILABLE; + if (preservedNet == net) { + return NodeStatus.INUSE; + } + if (!softPreserve && preservedNet != null) { + return NodeStatus.UNAVAILABLE; + } + + RouteNode rnode = routingGraph.getNode(node); + if (rnode != null) { + // In softPreserve mode, allow global router to use all nodes -- including + // those already preserved by another net, unless it's an input pin + if (!softPreserve || rnode.getType() == RouteNodeType.PINFEED_I) { + return NodeStatus.UNAVAILABLE; + } } - // A RouteNode will only be created if the net is necessary for - // a to-be-routed connection - return softPreserve || routingGraph.getNode(node) == null ? NodeStatus.AVAILABLE - : NodeStatus.UNAVAILABLE; + return NodeStatus.AVAILABLE; } @Override @@ -226,21 +229,22 @@ protected void routeGlobalClkNets() { for (PIP pip : clk.getPIPs()) { for (Node node : Arrays.asList(pip.getStartNode(), pip.getEndNode())) { Net preservedNet = routingGraph.getPreservedNet(node); - if (preservedNet != clk) { - if (preservedNet != null) { - unpreserveNet(preservedNet); - unpreserveNets.add(preservedNet); - } - // Redo preserving clk - Net oldNet = routingGraph.preserve(node, clk); - assert(oldNet == null); - - // Clear preservedNode's prev pointer so that it doesn't get misinterpreted - // by RouteNodeGraph.mustInclude as being part of an existing route - RouteNode rnode = routingGraph.getNode(node); - assert(rnode.getPrev() != null); - rnode.clearPrev(); + if (preservedNet == clk) { + continue; } + assert(preservedNet != null); + + unpreserveNet(preservedNet); + unpreserveNets.add(preservedNet); + // Redo preserving clk + Net oldNet = routingGraph.preserve(node, clk); + assert(oldNet == null); + + // Clear preservedNode's prev pointer so that it doesn't get misinterpreted + // by RouteNodeGraph.mustInclude as being part of an existing route + RouteNode rnode = routingGraph.getNode(node); + assert(rnode.getPrev() != null); + rnode.clearPrev(); } } } diff --git a/src/com/xilinx/rapidwright/rwroute/RWRoute.java b/src/com/xilinx/rapidwright/rwroute/RWRoute.java index 6741cae68..2156afa77 100644 --- a/src/com/xilinx/rapidwright/rwroute/RWRoute.java +++ b/src/com/xilinx/rapidwright/rwroute/RWRoute.java @@ -302,6 +302,14 @@ private void categorizeNets() { addNetConnectionToRoutingTargets(net); } else if (RouterHelper.isDriverLessOrLoadLessNet(net)) { preserveNet(net, true); + if (DesignTools.isNetDrivenByHierPort(net)) { + // For the case of nets driven by hierarchical ports (out of context designs) + // create a RouteNode for all its sink ports in order to prevent them from + // being unpreserved + for (SitePinInst spi : net.getSinkPins()) { + getOrCreateRouteNode(spi.getConnectedNode(), RouteNodeType.PINFEED_I); + } + } numNotNeedingRoutingNets++; } else if (RouterHelper.isInternallyRoutedNet(net)) { preserveNet(net, true); @@ -371,8 +379,8 @@ protected void addGlobalClkRoutingTargets(Net clk) { protected NodeStatus getGlobalRoutingNodeStatus(Net net, Node node) { if (routingGraph.isPreserved(node)) { // Node is preserved by any net -- for base RWRoute, we don't need - // to check which net it is because global/static nets are routed - // fully in one pass + // to check which net it is nor whether it is already in use + // because global/static nets are routed from scratch return NodeStatus.UNAVAILABLE; }