From a3af7dcae51ed2c92e6440a21977931b71631683 Mon Sep 17 00:00:00 2001 From: eddieh-xlnx Date: Tue, 12 Nov 2024 11:12:02 -0800 Subject: [PATCH] [RWRoute] Further divide LOCAL nodes into EAST/WEST for UltraScale(+) (#1098) * [TestNode] Expand testNodeReachabilityUltraScale Signed-off-by: Eddie Hung * Expand testNodeReachabilityVersal too Signed-off-by: Eddie Hung * UltraScale+: Sub-divide LOCALs into _EAST/_WEST and stick to sink's side Signed-off-by: Eddie Hung * Re-add EXCLUSIVE_SINK (non-sided) for CTRL sinks Signed-off-by: Eddie Hung * Support UltraScale Signed-off-by: Eddie Hung * Print Signed-off-by: Eddie Hung * Expand testNodeReachabilityVersal Signed-off-by: Eddie Hung * Do not error out for Versal Signed-off-by: Eddie Hung * Fix failing assertions Signed-off-by: Eddie Hung * Remove unused import Signed-off-by: Eddie Hung * Fix another typo Signed-off-by: Eddie Hung * Fix SLR crossings Signed-off-by: Eddie Hung * More Versal fixes Signed-off-by: Eddie Hung * Update testSLRCrossingNonTimingDriven golden values Signed-off-by: Eddie Hung * Tidy up and comments Signed-off-by: Eddie Hung * Add a few more testcases Signed-off-by: Eddie Hung * [RWRoute] Non-verbose mode to print out nodes popped Signed-off-by: Eddie Hung * Update comments/asserts Signed-off-by: Eddie Hung * Clean up RouteNodeGraph.isAccessible() Signed-off-by: Eddie Hung * Fixes for UltraScale Signed-off-by: Eddie Hung * Skip another assert for Versal Signed-off-by: Eddie Hung * Another assertion Signed-off-by: Eddie Hung --------- Signed-off-by: Eddie Hung --- .../rapidwright/rwroute/Connection.java | 4 +- .../rapidwright/rwroute/PartialRouter.java | 4 +- .../xilinx/rapidwright/rwroute/RWRoute.java | 42 +++- .../xilinx/rapidwright/rwroute/RouteNode.java | 12 +- .../rapidwright/rwroute/RouteNodeGraph.java | 201 +++++++++++++----- .../rapidwright/rwroute/RouteNodeInfo.java | 37 +++- .../rapidwright/rwroute/RouteNodeType.java | 14 +- .../xilinx/rapidwright/device/TestNode.java | 162 ++++++++++---- .../rapidwright/rwroute/TestRWRoute.java | 4 +- .../rapidwright/rwroute/TestRouterHelper.java | 3 + 10 files changed, 352 insertions(+), 131 deletions(-) diff --git a/src/com/xilinx/rapidwright/rwroute/Connection.java b/src/com/xilinx/rapidwright/rwroute/Connection.java index 6c08342dc..95a7f87e0 100644 --- a/src/com/xilinx/rapidwright/rwroute/Connection.java +++ b/src/com/xilinx/rapidwright/rwroute/Connection.java @@ -305,7 +305,7 @@ public void addAltSinkRnode(RouteNode sinkRnode) { } else { assert(!altSinkRnodes.contains(sinkRnode)); } - assert(sinkRnode.getType() == RouteNodeType.EXCLUSIVE_SINK || + assert(sinkRnode.getType().isExclusiveSink() || // Can be a WIRE if node is not exclusive a sink sinkRnode.getType() == RouteNodeType.NON_LOCAL); altSinkRnodes.add(sinkRnode); @@ -487,7 +487,7 @@ public void setAllTargets(RWRoute.ConnectionState state) { // where the same physical pin services more than one logical pin if (rnode.countConnectionsOfUser(netWrapper) == 0 || // Except if it is not an EXCLUSIVE_SINK - rnode.getType() != RouteNodeType.EXCLUSIVE_SINK) { + rnode.getType().isExclusiveSink()) { assert(rnode.getIntentCode() != IntentCode.NODE_PINBOUNCE); rnode.markTarget(state); } diff --git a/src/com/xilinx/rapidwright/rwroute/PartialRouter.java b/src/com/xilinx/rapidwright/rwroute/PartialRouter.java index 871637153..90435b794 100644 --- a/src/com/xilinx/rapidwright/rwroute/PartialRouter.java +++ b/src/com/xilinx/rapidwright/rwroute/PartialRouter.java @@ -256,7 +256,7 @@ protected void determineRoutingTargets() { preservedNet = routingGraph.getPreservedNet(sinkRnode); if (preservedNet != null && preservedNet != net) { unpreserveNets.add(preservedNet); - assert(sinkRnode.getType() == RouteNodeType.EXCLUSIVE_SINK); + assert(sinkRnode.getType().isExclusiveSink()); } } @@ -599,7 +599,7 @@ protected void unpreserveNet(Net net) { RouteNode sourceRnode = connection.getSourceRnode(); RouteNode sinkRnode = connection.getSinkRnode(); assert(sourceRnode.getType() == RouteNodeType.EXCLUSIVE_SOURCE); - assert(sinkRnode.getType() == RouteNodeType.EXCLUSIVE_SINK); + assert(sinkRnode.getType().isExclusiveSink()); // Even though this connection is not expected to have any routing yet, // perform a rip up anyway in order to release any exclusive sinks diff --git a/src/com/xilinx/rapidwright/rwroute/RWRoute.java b/src/com/xilinx/rapidwright/rwroute/RWRoute.java index 4d2f363d5..e7c3723d5 100644 --- a/src/com/xilinx/rapidwright/rwroute/RWRoute.java +++ b/src/com/xilinx/rapidwright/rwroute/RWRoute.java @@ -59,6 +59,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.BitSet; import java.util.Collection; import java.util.Collections; import java.util.EnumMap; @@ -600,8 +601,19 @@ protected NetWrapper createNetWrapperAndConnections(Net net) { } indirectConnections.add(connection); - RouteNode sinkRnode = routingGraph.getOrCreate(sinkINTNode, RouteNodeType.EXCLUSIVE_SINK); - sinkRnode.setType(RouteNodeType.EXCLUSIVE_SINK); + BitSet[] eastWestWires = (routingGraph.eastWestWires == null) ? null : + routingGraph.eastWestWires.get(sinkINTNode.getTile().getTileTypeEnum()); + RouteNode sinkRnode; + if (eastWestWires != null && eastWestWires[0].get(sinkINTNode.getWireIndex())) { + sinkRnode = routingGraph.getOrCreate(sinkINTNode, RouteNodeType.EXCLUSIVE_SINK_EAST); + sinkRnode.setType(RouteNodeType.EXCLUSIVE_SINK_EAST); + } else if (eastWestWires != null && eastWestWires[1].get(sinkINTNode.getWireIndex())) { + sinkRnode = routingGraph.getOrCreate(sinkINTNode, RouteNodeType.EXCLUSIVE_SINK_WEST); + sinkRnode.setType(RouteNodeType.EXCLUSIVE_SINK_WEST); + } else { + sinkRnode = routingGraph.getOrCreate(sinkINTNode, RouteNodeType.EXCLUSIVE_SINK); + sinkRnode.setType(RouteNodeType.EXCLUSIVE_SINK); + } connection.setSinkRnode(sinkRnode); // Where appropriate, allow all 6 LUT pins to be swapped to begin with @@ -609,6 +621,8 @@ protected NetWrapper createNetWrapperAndConnections(Net net) { int numberOfSwappablePins = (lutPinSwapping && sink.isLUTInputPin()) ? LUTTools.MAX_LUT_SIZE : 0; if (numberOfSwappablePins > 0) { + assert(sinkRnode.getType() == RouteNodeType.EXCLUSIVE_SINK_EAST || sinkRnode.getType() == RouteNodeType.EXCLUSIVE_SINK_WEST); + for (Cell cell : DesignTools.getConnectedCells(sink)) { BEL bel = cell.getBEL(); assert(bel.isLUT()); @@ -650,8 +664,8 @@ protected NetWrapper createNetWrapperAndConnections(Net net) { if (routingGraph.isPreserved(node)) { continue; } - RouteNode altSinkRnode = routingGraph.getOrCreate(node, RouteNodeType.EXCLUSIVE_SINK); - assert(altSinkRnode.getType() == RouteNodeType.EXCLUSIVE_SINK); + RouteNode altSinkRnode = routingGraph.getOrCreate(node, sinkRnode.getType()); + assert(altSinkRnode.getType().isExclusiveSink()); connection.addAltSinkRnode(altSinkRnode); } @@ -1798,13 +1812,18 @@ private void exploreAndExpand(ConnectionState state, RouteNode rnode) { } switch (childRNode.getType()) { case LOCAL: + case LOCAL_EAST: + case LOCAL_WEST: if (!routingGraph.isAccessible(childRNode, connection)) { continue; } + // Verify invariant that east/west wires stay east/west + assert(rnode.getType() != RouteNodeType.LOCAL_EAST || childRNode.getType() == RouteNodeType.LOCAL_EAST); + assert(rnode.getType() != RouteNodeType.LOCAL_WEST || childRNode.getType() == RouteNodeType.LOCAL_WEST); break; case NON_LOCAL: // LOCALs cannot connect to NON_LOCALs except via a LUT routethru - assert(rnode.getType() != RouteNodeType.LOCAL || + assert(!rnode.getType().isLocal() || routingGraph.lutRoutethru && rnode.getIntentCode() == IntentCode.NODE_PINFEED || // FIXME: design.getSeries() == Series.Versal); @@ -1819,6 +1838,13 @@ private void exploreAndExpand(ConnectionState state, RouteNode rnode) { } break; case EXCLUSIVE_SINK: + case EXCLUSIVE_SINK_EAST: + case EXCLUSIVE_SINK_WEST: + assert(childRNode.getType() != RouteNodeType.EXCLUSIVE_SINK_EAST || rnode.getType() == RouteNodeType.LOCAL_EAST); + assert(childRNode.getType() != RouteNodeType.EXCLUSIVE_SINK_WEST || rnode.getType() == RouteNodeType.LOCAL_WEST); + assert(childRNode.getType() != RouteNodeType.EXCLUSIVE_SINK || rnode.getType() == RouteNodeType.LOCAL || + // FIXME: + design.getSeries() == Series.Versal); if (!isAccessibleSink(childRNode, connection)) { continue; } @@ -1863,7 +1889,7 @@ protected boolean isAccessibleSink(RouteNode child, Connection connection) { } protected boolean isAccessibleSink(RouteNode child, Connection connection, boolean assertOnOveruse) { - assert(child.getType() == RouteNodeType.EXCLUSIVE_SINK); + assert(child.getType().isExclusiveSink()); assert(!assertOnOveruse || !child.isOverUsed()); if (child.isTarget()) { @@ -2142,7 +2168,9 @@ protected void printRoutingStatistics() { printFormattedString("Num iterations:", routeIteration); printFormattedString("Connections routed:", connectionsRouted.get()); printFormattedString("Nodes pushed:", nodesPushed.get()); - printFormattedString("Nodes popped:", nodesPopped.get()); + } + printFormattedString("Nodes popped:", nodesPopped.get()); + if (config.isVerbose()) { System.out.printf("------------------------------------------------------------------------------\n"); } diff --git a/src/com/xilinx/rapidwright/rwroute/RouteNode.java b/src/com/xilinx/rapidwright/rwroute/RouteNode.java index c70a18000..8f8f78d12 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouteNode.java +++ b/src/com/xilinx/rapidwright/rwroute/RouteNode.java @@ -93,7 +93,7 @@ public class RouteNode extends Node implements Comparable { protected RouteNode(RouteNodeGraph routingGraph, Node node, RouteNodeType type) { super(node); - RouteNodeInfo nodeInfo = RouteNodeInfo.get(this, routingGraph); + RouteNodeInfo nodeInfo = RouteNodeInfo.get(node, routingGraph); this.type = (type == null) ? nodeInfo.type : type; endTileXCoordinate = nodeInfo.endTileXCoordinate; endTileYCoordinate = nodeInfo.endTileYCoordinate; @@ -124,10 +124,16 @@ private void setBaseCost(Series series) { (length <= 3 && series == Series.Versal)); break; case EXCLUSIVE_SINK: + case EXCLUSIVE_SINK_EAST: + case EXCLUSIVE_SINK_WEST: assert(length == 0 || (length == 1 && (series == Series.UltraScalePlus || series == Series.UltraScale) && getIntentCode() == IntentCode.NODE_PINBOUNCE)); break; case LOCAL: + assert(length == 0); + break; + case LOCAL_EAST: + case LOCAL_WEST: assert(length == 0 || (length == 1 && ( ((series == Series.UltraScalePlus || series == Series.UltraScale) && getIntentCode() == IntentCode.NODE_PINBOUNCE) || @@ -361,10 +367,10 @@ public RouteNodeType getType() { public void setType(RouteNodeType type) { assert(this.type == type || // Support demotion from EXCLUSIVE_SINK to LOCAL since they have the same base cost - (this.type == RouteNodeType.EXCLUSIVE_SINK && type == RouteNodeType.LOCAL) || + (this.type.isExclusiveSink() && type == RouteNodeType.LOCAL) || // Or promotion from LOCAL to EXCLUSIVE_SINK (by PartialRouter when NODE_PINBOUNCE on // a newly unpreserved net becomes a sink) - (this.type == RouteNodeType.LOCAL && type == RouteNodeType.EXCLUSIVE_SINK)); + (this.type == RouteNodeType.LOCAL && type.isExclusiveSink())); this.type = type; } diff --git a/src/com/xilinx/rapidwright/rwroute/RouteNodeGraph.java b/src/com/xilinx/rapidwright/rwroute/RouteNodeGraph.java index 324be57e3..ece65969e 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouteNodeGraph.java +++ b/src/com/xilinx/rapidwright/rwroute/RouteNodeGraph.java @@ -35,6 +35,8 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import com.xilinx.rapidwright.design.Design; import com.xilinx.rapidwright.design.Net; @@ -92,14 +94,21 @@ public class RouteNodeGraph { */ protected final Map lagunaI; - /** Map indicating the wire indices corresponding to the [A-H]MUX output */ - protected final Map muxWires; + /** Map indicating (for UltraScale/UltraScale+ only) the wire indices corresponding to the [A-H]MUX output + * to be blocked during LUT routethrus + */ + protected final Map ultraScalesMuxWiresToBlockWhenLutRoutethru; /** Flag for whether LUT routethrus are to be considered */ protected final boolean lutRoutethru; - /** Map indicating the wire indices that have a local intent code, but is what RWRoute considers to be non-local */ - protected final Map ultraScaleNonLocalWires; + /** Map indicating (for UltraScale/UltraScale+ only) the wire indices that have a local intent code, + * but is what RWRoute will consider to be non-local, e.g. INT_NODE_SDQ_* + */ + protected final Map ultraScalesNonLocalWires; + + /** Map indicating the wire indices corresponding to the east/west side of interconnect tiles */ + protected final Map eastWestWires; public RouteNodeGraph(Design design, RWRouteConfig config) { this(design, config, new HashMap<>()); @@ -132,69 +141,116 @@ protected RouteNodeGraph(Design design, RWRouteConfig config, Map(TileTypeEnum.class); - BitSet wires = new BitSet(); - Tile intTile = device.getArbitraryTileOfType(TileTypeEnum.INT); - // Device.getArbitraryTileOfType() typically gives you the North-Western-most - // tile (with minimum X, maximum Y). Analyze the tile just below that. - intTile = intTile.getTileXYNeighbor(0, -1); - ultraScaleNonLocalWires.put(intTile.getTileTypeEnum(), wires); - for (int wireIndex = 0; wireIndex < intTile.getWireCount(); wireIndex++) { - Node baseNode = Node.getNode(intTile, wireIndex); - if (baseNode == null) { - continue; - } - if (baseNode.getIntentCode() != IntentCode.NODE_LOCAL) { - continue; - } + ultraScalesNonLocalWires = new EnumMap<>(TileTypeEnum.class); + ultraScalesNonLocalWires.put(intTile.getTileTypeEnum(), wires); + eastWestPattern = Pattern.compile("(((BOUNCE|BYPASS|IMUX|INODE(_[12])?)_([EW]))|INT_NODE_IMUX_(\\d+)_).*"); + eastWestWires = new EnumMap<>(TileTypeEnum.class); + eastWestWires.put(intTile.getTileTypeEnum(), new BitSet[]{eastWires, westWires}); + } else { + assert(series == Series.Versal); + ultraScalesNonLocalWires = null; + + // FIXME: + eastWestPattern = null; + eastWestWires = null; + } + + for (int wireIndex = 0; wireIndex < intTile.getWireCount(); wireIndex++) { + Node baseNode = Node.getNode(intTile, wireIndex); + if (baseNode == null) { + continue; + } + + String baseWireName = baseNode.getWireName(); + IntentCode baseIntentCode = baseNode.getIntentCode(); + if (baseIntentCode == IntentCode.NODE_LOCAL) { Tile baseTile = baseNode.getTile(); - String wireName = baseNode.getWireName(); + assert(baseTile.getTileTypeEnum() == intTile.getTileTypeEnum()); if (isUltraScalePlus) { - if (!wireName.startsWith("INT_NODE_SDQ_") && !wireName.startsWith("SDQNODE_")) { + if (baseWireName.startsWith("INT_NODE_SDQ_") || baseWireName.startsWith("SDQNODE_")) { + if (baseTile != intTile) { + if (baseWireName.endsWith("_FT0")) { + assert(baseTile.getTileYCoordinate() == intTile.getTileYCoordinate() - 1); + } else { + assert(baseWireName.endsWith("_FT1")); + assert(baseTile.getTileYCoordinate() == intTile.getTileYCoordinate() + 1); + } + } + wires.set(baseNode.getWireIndex()); continue; } - if (baseTile != intTile) { - if (wireName.endsWith("_FT0")) { - assert(baseTile.getTileYCoordinate() == intTile.getTileYCoordinate() - 1); - } else { - assert(wireName.endsWith("_FT1")); - assert(baseTile.getTileYCoordinate() == intTile.getTileYCoordinate() + 1); + } else if (isUltraScale) { + if (baseWireName.startsWith("INT_NODE_SINGLE_DOUBLE_") || baseWireName.startsWith("SDND") || + baseWireName.startsWith("INT_NODE_QUAD_LONG") || baseWireName.startsWith("QLND")) { + if (baseTile != intTile) { + if (baseWireName.endsWith("_FTN")) { + assert (baseTile.getTileYCoordinate() == intTile.getTileYCoordinate() - 1); + } else { + assert (baseWireName.endsWith("_FTS")); + assert (baseTile.getTileYCoordinate() == intTile.getTileYCoordinate() + 1); + } } + wires.set(baseNode.getWireIndex()); + continue; } - } else { - assert(isUltraScale); + } + } else if (baseIntentCode != IntentCode.NODE_PINFEED && baseIntentCode != IntentCode.NODE_PINBOUNCE) { + continue; + } - if (!wireName.startsWith("INT_NODE_SINGLE_DOUBLE_") && !wireName.startsWith("SDND") && - !wireName.startsWith("INT_NODE_QUAD_LONG") && !wireName.startsWith("QLND")) { - continue; + if (eastWestPattern == null) { + // FIXME: + assert(series == Series.Versal); + continue; + } + + Matcher m = eastWestPattern.matcher(baseWireName); + if (m.matches()) { + if (m.group(5) != null) { + if (m.group(5).equals("E")) { + eastWires.set(baseNode.getWireIndex()); + } else { + assert(m.group(5).equals("W")); + westWires.set(baseNode.getWireIndex()); } - if (baseTile != intTile) { - if (wireName.endsWith("_FTN")) { - assert(baseTile.getTileYCoordinate() == intTile.getTileYCoordinate() - 1); - } else { - assert(wireName.endsWith("_FTS")); - assert(baseTile.getTileYCoordinate() == intTile.getTileYCoordinate() + 1); - } + } else if (m.group(6) != null) { + int i = Integer.valueOf(m.group(6)); + if (i < 32 || (isUltraScale && (i >= 64 && i < 96))) { + eastWires.set(baseNode.getWireIndex()); + } else { + assert(i < 64 || (isUltraScale && (i >= 96 && i < 128))); + westWires.set(baseNode.getWireIndex()); } } - wires.set(baseNode.getWireIndex()); + } else { + assert(baseWireName.matches("CTRL_[EW](_B)?\\d+|INT_NODE_GLOBAL_\\d+(_INT)?_OUT[01]?") + // FIXME: + || series == Series.Versal); } - } else { - ultraScaleNonLocalWires = null; } if (lutRoutethru) { assert(isUltraScalePlus || isUltraScale); - muxWires = new EnumMap<>(TileTypeEnum.class); + ultraScalesMuxWiresToBlockWhenLutRoutethru = new EnumMap<>(TileTypeEnum.class); for (TileTypeEnum tileTypeEnum : Utils.getCLBTileTypes()) { Tile clbTile = device.getArbitraryTileOfType(tileTypeEnum); if (clbTile == null) { continue; } - BitSet wires = new BitSet(); + wires = new BitSet(); for (int wireIndex = 0; wireIndex < clbTile.getWireCount(); wireIndex++) { String wireName = clbTile.getWireName(wireIndex); if (wireName.endsWith("MUX")) { @@ -206,10 +262,10 @@ protected RouteNodeGraph(Design design, RWRouteConfig config, Map [A-H]MUX routethrus since Vivado does not support the LUT // being fractured to support more than one routethru net diff --git a/src/com/xilinx/rapidwright/rwroute/RouteNodeInfo.java b/src/com/xilinx/rapidwright/rwroute/RouteNodeInfo.java index 8a64cbeab..2387dd745 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouteNodeInfo.java +++ b/src/com/xilinx/rapidwright/rwroute/RouteNodeInfo.java @@ -24,6 +24,7 @@ import com.xilinx.rapidwright.device.IntentCode; import com.xilinx.rapidwright.device.Node; +import com.xilinx.rapidwright.device.Series; import com.xilinx.rapidwright.device.Tile; import com.xilinx.rapidwright.device.TileTypeEnum; import com.xilinx.rapidwright.device.Wire; @@ -128,40 +129,56 @@ private static short getEndTileXCoordinate(Node node, RouteNodeType type, short private static RouteNodeType getType(Node node, Tile endTile, RouteNodeGraph routingGraph) { // NOTE: IntentCode is device-dependent IntentCode ic = node.getIntentCode(); + TileTypeEnum tileTypeEnum = node.getTile().getTileTypeEnum(); switch (ic) { case NODE_LOCAL: { // US/US+ - assert(node.getTile().getTileTypeEnum() == TileTypeEnum.INT); + assert(tileTypeEnum == TileTypeEnum.INT); if (routingGraph != null) { - BitSet bs = routingGraph.ultraScaleNonLocalWires.get(node.getTile().getTileTypeEnum()); + BitSet bs = routingGraph.ultraScalesNonLocalWires.get(tileTypeEnum); if (!bs.get(node.getWireIndex())) { + BitSet[] eastWestWires = routingGraph.eastWestWires.get(tileTypeEnum); + if (eastWestWires[0].get(node.getWireIndex())) { + return RouteNodeType.LOCAL_EAST; + } else if (eastWestWires[1].get(node.getWireIndex())) { + return RouteNodeType.LOCAL_WEST; + } return RouteNodeType.LOCAL; } break; } } - case NODE_PINBOUNCE: - return RouteNodeType.LOCAL; - - case NODE_PINFEED: { + case NODE_PINFEED: if (routingGraph != null && routingGraph.lagunaI != null) { BitSet bs = routingGraph.lagunaI.get(node.getTile()); if (bs != null && bs.get(node.getWireIndex())) { return RouteNodeType.LAGUNA_PINFEED; } } + // Fall through + case NODE_PINBOUNCE: + if (routingGraph != null && routingGraph.eastWestWires != null) { + BitSet[] eastWestWires = routingGraph.eastWestWires.get(tileTypeEnum); + if (eastWestWires[0].get(node.getWireIndex())) { + return RouteNodeType.LOCAL_EAST; + } else if (eastWestWires[1].get(node.getWireIndex())) { + return RouteNodeType.LOCAL_WEST; + } + assert(node.getWireName().startsWith("CTRL_") || + // FIXME: + routingGraph.design.getSeries() == Series.Versal); + } return RouteNodeType.LOCAL; - } case NODE_LAGUNA_OUTPUT: // UltraScale+ only - assert(node.getTile().getTileTypeEnum() == TileTypeEnum.LAG_LAG); + assert(tileTypeEnum == TileTypeEnum.LAG_LAG); if (node.getWireName().endsWith("_TXOUT")) { return RouteNodeType.LAGUNA_PINFEED; } break; case NODE_LAGUNA_DATA: // UltraScale+ only - assert(node.getTile().getTileTypeEnum() == TileTypeEnum.LAG_LAG); + assert(tileTypeEnum == TileTypeEnum.LAG_LAG); if (node.getTile() != endTile) { return RouteNodeType.SUPER_LONG_LINE; } @@ -170,7 +187,7 @@ private static RouteNodeType getType(Node node, Tile endTile, RouteNodeGraph rou break; case INTENT_DEFAULT: - if (node.getTile().getTileTypeEnum() == TileTypeEnum.LAGUNA_TILE) { // UltraScale only + if (tileTypeEnum == TileTypeEnum.LAGUNA_TILE) { // UltraScale only String wireName = node.getWireName(); if (wireName.startsWith("UBUMP")) { assert(node.getTile() != endTile); diff --git a/src/com/xilinx/rapidwright/rwroute/RouteNodeType.java b/src/com/xilinx/rapidwright/rwroute/RouteNodeType.java index 2510b4701..0c024bb0b 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouteNodeType.java +++ b/src/com/xilinx/rapidwright/rwroute/RouteNodeType.java @@ -29,6 +29,8 @@ public enum RouteNodeType { EXCLUSIVE_SOURCE, EXCLUSIVE_SINK, + EXCLUSIVE_SINK_EAST, + EXCLUSIVE_SINK_WEST, /** * Denotes {@link RouteNode} objects that correspond to a super long line {@link Node}, @@ -44,5 +46,15 @@ public enum RouteNodeType { NON_LOCAL, - LOCAL + LOCAL, + LOCAL_EAST, + LOCAL_WEST; + + public boolean isExclusiveSink() { + return this == EXCLUSIVE_SINK || this == EXCLUSIVE_SINK_EAST || this == EXCLUSIVE_SINK_WEST; + } + + public boolean isLocal() { + return this == LOCAL || this == LOCAL_EAST || this == LOCAL_WEST; + } } diff --git a/test/src/com/xilinx/rapidwright/device/TestNode.java b/test/src/com/xilinx/rapidwright/device/TestNode.java index e72e0cd4a..175172258 100644 --- a/test/src/com/xilinx/rapidwright/device/TestNode.java +++ b/test/src/com/xilinx/rapidwright/device/TestNode.java @@ -84,16 +84,23 @@ public void testUphillNodeIsInvalid() { @ParameterizedTest @CsvSource({ // UltraScale+ part - "xcvu3p,INT_X37Y220,BOUNCE_.*,true", - "xcvu3p,INT_X37Y220,BYPASS_.*,true", + "xcvu3p,INT_X37Y220,BOUNCE_E_.*,true", + "xcvu3p,INT_X37Y220,BOUNCE_W_.*,true", + "xcvu3p,INT_X37Y220,BYPASS_E.*,true", + "xcvu3p,INT_X37Y220,BYPASS_W.*,true", "xcvu3p,INT_X37Y220,INT_NODE_GLOBAL_.*,true", - "xcvu3p,INT_X37Y220,INT_NODE_IMUX_.*,true", - "xcvu3p,INT_X37Y220,INODE_.*,true", + "xcvu3p,INT_X37Y220,INT_NODE_IMUX_([0-9]|1[0-9]|2[0-9]|3[01])_.*,true", + "xcvu3p,INT_X37Y220,INT_NODE_IMUX_(3[2-9]|4[0-9]|5[0-9]|6[0-3])_.*,true", + "xcvu3p,INT_X37Y220,INODE_E_.*,true", + "xcvu3p,INT_X37Y220,INODE_W_.*,true", "xcvu3p,INT_X37Y220,INT_INT_SDQ_.*,false", // IntentCode.NODE_SINGLE "xcvu3p,INT_X37Y220,INT_NODE_SDQ_.*,false", - "xcvu3p,INT_X37Y220,SDQNODE_.*,false", - "xcvu3p,INT_X37Y220,IMUX_.*,true", - "xcvu3p,INT_X37Y220,CTRL_.*,true", + "xcvu3p,INT_X37Y220,SDQNODE_E_.*,false", + "xcvu3p,INT_X37Y220,SDQNODE_W_.*,false", + "xcvu3p,INT_X37Y220,IMUX_E.*,true", + "xcvu3p,INT_X37Y220,IMUX_W.*,true", + "xcvu3p,INT_X37Y220,CTRL_E.*,true", + "xcvu3p,INT_X37Y220,CTRL_W.*,true", "xcvu3p,INT_X37Y220,(NN|EE|SS|WW)1_.*,false", "xcvu3p,INT_X37Y220,(NN|EE|SS|WW)2_.*,false", "xcvu3p,INT_X37Y220,(NN|EE|SS|WW)4_.*,false", @@ -101,16 +108,22 @@ public void testUphillNodeIsInvalid() { "xcvu3p,CLEM_X37Y220,CLE_CLE_M_SITE_0_[A-H](_O|Q|Q2|MUX),false", // UltraScale part - "xcvu065,INT_X38Y220,BOUNCE_.*,true", - "xcvu065,INT_X38Y220,BYPASS_.*,true", + "xcvu065,INT_X38Y220,BOUNCE_E_.*,true", + "xcvu065,INT_X38Y220,BOUNCE_W_.*,true", + "xcvu065,INT_X38Y220,BYPASS_E.*,true", + "xcvu065,INT_X38Y220,BYPASS_W.*,true", "xcvu065,INT_X38Y220,INT_NODE_GLOBAL_.*,true", - "xcvu065,INT_X38Y220,INT_NODE_IMUX_.*,true", - "xcvu065,INT_X38Y220,INODE_.*,true", + "xcvu065,INT_X38Y220,INT_NODE_IMUX_([0-9]|1[0-9]|2[0-9]|3[01]|6[4-9]|7[0-9]|8[0-9]|9[0-5])_.*,true", + "xcvu065,INT_X38Y220,INT_NODE_IMUX_(3[2-9]|4[0-9]|5[0-9]|6[0-3]|9[6-9]|10[0-9]|11[0-9]|12[0-7])_.*,true", + "xcvu065,INT_X38Y220,INODE_[12]_E_.*,true", + "xcvu065,INT_X38Y220,INODE_[12]_W_.*,true", "xcvu065,INT_X38Y220,INT_INT_SINGLE_.*,false", // IntentCode.NODE_SINGLE "xcvu065,INT_X38Y220,INT_NODE_SINGLE_DOUBLE_.*,false", "xcvu065,INT_X38Y220,INT_NODE_QUAD_LONG_.*,false", - "xcvu065,INT_X38Y220,IMUX_.*,true", - "xcvu065,INT_X38Y220,CTRL_.*,true", + "xcvu065,INT_X38Y220,IMUX_E.*,true", + "xcvu065,INT_X38Y220,IMUX_W.*,true", + "xcvu065,INT_X38Y220,CTRL_E.*,true", + "xcvu065,INT_X38Y220,CTRL_W.*,true", "xcvu065,INT_X37Y220,(NN|EE|SS|WW)1_.*,false", "xcvu065,INT_X37Y220,(NN|EE|SS|WW)2_.*,false", "xcvu065,INT_X37Y220,(NN|EE|SS|WW)4_.*,false", @@ -135,6 +148,7 @@ public void testNodeReachabilityUltraScale(String partName, String tileName, Str intentCodes.add(node.getIntentCode()); } System.out.println("Initial queue.size() = " + queue.size()); + System.out.println("Initial queue = " + queue); System.out.println("Intent codes = " + intentCodes); // Print out the prefixes of nodes that are immediately uphill of these wire prefixes @@ -143,13 +157,18 @@ public void testNodeReachabilityUltraScale(String partName, String tileName, Str boolean ultraScalePlus = partName.endsWith("p"); queue.stream().map(Node::getAllUphillNodes).flatMap(List::stream) .map(n -> n.getWireName() + " (" + n.getIntentCode() + ")") - .map(s -> s.replaceFirst("((BOUNCE|BYPASS|CTRL|INT_NODE_[^_]+|INODE|IMUX|SDQNODE)_)[^\\(]+", "$1")) + .map(s -> s.replaceFirst("^((BOUNCE|BYPASS|CTRL|INODE(_[12])?|IMUX|SDQNODE)_([EW]_?)?)[^ ]+", "$1")) + .map(s -> s.replaceFirst("(INT_NODE_(GLOBAL|SDQ|SINGLE_DOUBLE|QUAD_LONG)_)[^ ]+", "$1")) + .map(s -> ultraScalePlus ? s.replaceFirst("(INT_NODE_IMUX_)([0-9]|1[0-9]|2[0-9]|3[01])_INT_OUT[01]", "$1<0-31>") + : s.replaceFirst("(INT_NODE_IMUX_)([0-9]|1[0-9]|2[0-9]|3[01]|6[4-9]|7[0-9]|8[0-9]|9[0-5])_INT_OUT", "$1<0-31,64-95>")) + .map(s -> ultraScalePlus ? s.replaceFirst("(INT_NODE_IMUX_)(3[2-9]|4[0-9]|5[0-9]|6[0-3])_INT_OUT[01]", "$1<32-63>") + : s.replaceFirst("(INT_NODE_IMUX_)(3[2-9]|4[0-9]|5[0-9]|6[0-3]|9[6-9]|10[0-9]|11[0-9]|12[0-7])_INT_OUT", "$1<32-63,96-127>")) .map(s -> s.replaceFirst( // UltraScale+ - ultraScalePlus ? "((CLE_CLE_[LM]_SITE_0|CLK_LEAF_SITES|INT_INT_SDQ|(NN|EE|SS|WW)(1|2|4|12))_)[^\\(]+" + ultraScalePlus ? "((CLE_CLE_[LM]_SITE_0|CLK_LEAF_SITES|INT_INT_SDQ|(NN|EE|SS|WW)(1|2|4|12)(_[EW])?)_)[^\\(]+" // UltraScale - : "((CLE_CLE_[LM]_SITE_0|CLK_BUFCE_LEAF_X16_1_CLK|EE[124]|INT_INT_SINGLE|(NN|SS)(1|2|4|5|12|16)|(EE|WW)(1|2|4|12)|QLND(NW|SE|SW)|SDND[NS]W)_)[^\\(]+", - "$1")) + : "((CLE_CLE_[LM]_SITE_0|CLK_BUFCE_LEAF_X16_1_CLK|EE[124]|INT_INT_SINGLE|(NN|SS)(1|2|4|5|12|16)(_[EW])?|(EE|WW)(1|2|4|12)|QLND(NW|SE|SW)|SDND[NS]W)_)[^\\(]+", + "$1 ")) .distinct() .sorted() .forEachOrdered(s -> System.out.println("\t" + s)); @@ -158,12 +177,17 @@ public void testNodeReachabilityUltraScale(String partName, String tileName, Str System.out.println("Immediately downhill:"); queue.stream().map(Node::getAllDownhillNodes).flatMap(List::stream) .map(n -> n.getWireName() + " (" + n.getIntentCode() + ")") - .map(s -> s.replaceFirst("((BOUNCE|BYPASS|CTRL|IMUX|INT_NODE_[^_]+|INODE|SDQNODE)_)[^\\(]+", "$1")) + .map(s -> s.replaceFirst("^((BOUNCE|BYPASS|CTRL|INODE(_[12])?|IMUX|SDQNODE)_([EW]_?)?)[^ ]+", "$1")) + .map(s -> s.replaceFirst("(INT_NODE_(GLOBAL|SDQ|SINGLE_DOUBLE|QUAD_LONG)_)[^ ]+", "$1")) + .map(s -> ultraScalePlus ? s.replaceFirst("(INT_NODE_IMUX_)([0-9]|1[0-9]|2[0-9]|3[01])_INT_OUT[01]", "$1<0-31>") + : s.replaceFirst("(INT_NODE_IMUX_)([0-9]|1[0-9]|2[0-9]|3[01]|6[4-9]|7[0-9]|8[0-9]|9[0-5])_INT_OUT", "$1<0-31,64-95>")) + .map(s -> ultraScalePlus ? s.replaceFirst("(INT_NODE_IMUX_)(3[2-9]|4[0-9]|5[0-9]|6[0-3])_INT_OUT[01]", "$1<32-63>") + : s.replaceFirst("(INT_NODE_IMUX_)(3[2-9]|4[0-9]|5[0-9]|6[0-3]|9[6-9]|10[0-9]|11[0-9]|12[0-7])_INT_OUT", "$1<32-63,96-127>")) .map(s -> s.replaceFirst( // UltraScale+ - ultraScalePlus ? "((CLE_CLE_[LM]_SITE_0|INT_INT_SDQ|(NN|EE|SS|WW)(1|2|4|12))_)[^\\(]+" + ultraScalePlus ? "((CLE_CLE_[LM]_SITE_0|INT_INT_SDQ|(NN|EE|SS|WW)(1|2|4|12)(_[EW])?)_)[^\\(]+" // UltraScale - : "((CLE_CLE_[LM]_SITE_0|INT_INT_SINGLE|(NN|SS)(1|2|4|5|12|16)|(EE|WW)(1|2|4|12)|QLND(NW|S[EW])|SDND[NS]W)_)[^\\(]+", + : "((CLE_CLE_[LM]_SITE_0|INT_INT_SINGLE|(NN|SS)(1|2|4|5|12|16)|(EE|WW)(1|2|4|12)(_[EW])?|QLND(NW|S[EW])|SDND[NS]W)_)[^ ]+", "$1")) .distinct() .sorted() @@ -204,28 +228,36 @@ public void testNodeReachabilityUltraScale(String partName, String tileName, Str @ParameterizedTest @CsvSource({ - "xcvp1002,INT_X38Y220,NODE_PINBOUNCE,true", - "xcvp1002,INT_X38Y220,NODE_INODE,true", - "xcvp1002,INT_X38Y220,NODE_IMUX,true", - "xcvp1002,INT_X38Y220,NODE_SDQNODE,false", - "xcvp1002,INT_X38Y220,NODE_HSINGLE,false", - "xcvp1002,INT_X38Y220,NODE_VSINGLE,false", - "xcvp1002,INT_X38Y220,NODE_HDOUBLE,false", - "xcvp1002,INT_X38Y220,NODE_VDOUBLE,false", - "xcvp1002,INT_X38Y220,NODE_HQUAD,false", - "xcvp1002,INT_X38Y220,NODE_VQUAD,false", - "xcvp1002,INT_X38Y220,NODE_HLONG6,false", - "xcvp1002,INT_X38Y220,NODE_HLONG10,false", - "xcvp1002,INT_X38Y220,NODE_VLONG7,false", - "xcvp1002,INT_X38Y220,NODE_VLONG12,false", - "xcvp1002,CLE_BC_CORE_X37Y220,NODE_CLE_BNODE,true", - "xcvp1002,CLE_BC_CORE_X37Y220,NODE_CLE_CNODE,true", - "xcvp1002,CLE_BC_CORE_X37Y220,NODE_CLE_CTRL,true", - "xcvp1002,CLE_W_CORE_X38Y220,NODE_PINFEED,true", - "xcvp1002,CLE_E_CORE_X38Y220,NODE_CLE_OUTPUT,false", - "xcvp1002,CLE_W_CORE_X38Y220,NODE_CLE_OUTPUT,false", + "xcvp1002,INT_X38Y220,NODE_PINBOUNCE,BOUNCE_E.*,true", + "xcvp1002,INT_X38Y220,NODE_PINBOUNCE,BOUNCE_W.*,true", + "xcvp1002,INT_X38Y220,NODE_INODE,INT_NODE_IMUX_ATOM_([0-9]|1[0-9]|2[0-9]|3[01]|6[4-9]|7[0-9]|8[0-9]|9[0-5])_.*,true", + "xcvp1002,INT_X38Y220,NODE_INODE,INT_NODE_IMUX_ATOM_(3[2-9]|4[0-9]|5[0-9]|6[0-3]|9[6-9]|10[0-9]|11[0-9]|12[0-7])_.*,true", + "xcvp1002,INT_X38Y220,NODE_IMUX,IMUX_B_E.*,true", + "xcvp1002,INT_X38Y220,NODE_IMUX,IMUX_B_W.*,true", + "xcvp1002,INT_X38Y220,NODE_SDQNODE,,false", + "xcvp1002,INT_X38Y220,NODE_HSINGLE,,false", + "xcvp1002,INT_X38Y220,NODE_VSINGLE,,false", + "xcvp1002,INT_X38Y220,NODE_HDOUBLE,,false", + "xcvp1002,INT_X38Y220,NODE_VDOUBLE,,false", + "xcvp1002,INT_X38Y220,NODE_HQUAD,,false", + "xcvp1002,INT_X38Y220,NODE_VQUAD,,false", + "xcvp1002,INT_X38Y220,NODE_HLONG6,,false", + "xcvp1002,INT_X38Y220,NODE_HLONG10,,false", + "xcvp1002,INT_X38Y220,NODE_VLONG7,,false", + "xcvp1002,INT_X38Y220,NODE_VLONG12,,false", + "xcvp1002,CLE_BC_CORE_X37Y220,NODE_CLE_BNODE,BNODE_OUTS_E.*,true", + "xcvp1002,CLE_BC_CORE_X37Y220,NODE_CLE_BNODE,BNODE_OUTS_W.*,true", + "xcvp1002,CLE_BC_CORE_X37Y220,NODE_CLE_CNODE,CNODE_OUTS_E.*,true", + "xcvp1002,CLE_BC_CORE_X37Y220,NODE_CLE_CNODE,CNODE_OUTS_W.*,true", + "xcvp1002,CLE_BC_CORE_X37Y220,NODE_CLE_CTRL,CTRL_L_B.*,true", + "xcvp1002,CLE_BC_CORE_X37Y220,NODE_CLE_CTRL,CTRL_R_B.*,true", + "xcvp1002,CLE_W_CORE_X38Y220,NODE_PINFEED,,true", + "xcvp1002,CLE_E_CORE_X38Y220,NODE_CLE_OUTPUT,,false", + "xcvp1002,CLE_W_CORE_X38Y220,NODE_CLE_OUTPUT,,false", + "xcvp1002,INTF_ROCF_TR_TILE_X39Y153,NODE_INTF_CNODE,,true", + "xcvp1002,INTF_ROCF_TR_TILE_X39Y153,NODE_INTF_BNODE,,true", }) - public void testNodeReachabilityVersal(String partName, String tileName, String intentCodeName, boolean local) { + public void testNodeReachabilityVersal(String partName, String tileName, String intentCodeName, String wireNameRegex, boolean local) { Device device = Device.getDevice(partName); Tile baseTile = device.getTile(tileName); IntentCode baseIntentCode = IntentCode.valueOf(intentCodeName); @@ -234,21 +266,48 @@ public void testNodeReachabilityVersal(String partName, String tileName, String if (baseTile.getWireIntentCode(wireIdx) != baseIntentCode) { continue; } - queue.add(Node.getNode(baseTile, wireIdx)); + + Node node = Node.getNode(baseTile, wireIdx); + if (wireNameRegex != null && !node.getWireName().matches(wireNameRegex)) { + continue; + } + queue.add(node); } System.out.println("Initial queue.size() = " + queue.size()); System.out.println("Initial queue = " + queue); - // Print out the intent code of nodes that are immediately uphill of this intent code + // Print out the prefixes of nodes that are immediately uphill of these wire prefixes + // (i.e. "BOUNCE_E_0_FT1" -> "BOUNCE_") System.out.println("Immediately uphill:"); - queue.stream().map(Node::getAllUphillNodes).flatMap(List::stream).map(Node::getIntentCode) + boolean ultraScalePlus = partName.endsWith("p"); + queue.stream().map(Node::getAllUphillNodes).flatMap(List::stream) + .map(n -> n.getWireName() + " (" + n.getIntentCode() + ")") + .map(s -> s.replaceFirst("^((BOUNCE|IMUX_B)_[EW])[^ ]+", "$1")) + .map(s -> s.replaceFirst("^(CTRL_[LR]_)B\\d+", "$1")) + .map(s -> s.replaceFirst("(INT_NODE_SDQ_|INT_SDQ_RED_ATOM_)[^ ]+", "$1")) + .map(s -> s.replaceFirst("(INT_NODE_IMUX_ATOM_)([0-9]|1[0-9]|2[0-9]|3[01]|6[4-9]|7[0-9]|8[0-9]|9[0-5])_INT_OUT[01]", "$1<0-31,64-95>")) + .map(s -> s.replaceFirst("(INT_NODE_IMUX_ATOM_)(3[2-9]|4[0-9]|5[0-9]|6[0-3]|9[6-9]|10[0-9]|11[0-9]|12[0-7])_INT_OUT[01]", "$1<32-63,96-127>")) + .map(s -> s.replaceFirst("([BC]NODE_OUTS_[EW])\\d+", "$1")) + .map(s -> s.replaceFirst("((CLE_SLICE[LM]_TOP_[01]|OUT_[NESW]NODE|(NN|EE|SS|WW)(1|2|4|6|7|10|12)(_[EW])?)_)[^ ]+", "$1")) + .map(s -> s.replaceFirst("(CLK_LEAF_SITES_)\\d+_O", "$1")) + .map(s -> s.replaceFirst("(VCC_WIRE)\\d+", "$1")) .distinct() .sorted() .forEachOrdered(s -> System.out.println("\t" + s)); - // Print out the intent code of nodes that are immediately downhill of this intent code + // Print out the prefixes of nodes that are immediately downhill of these wire prefixes System.out.println("Immediately downhill:"); - queue.stream().map(Node::getAllDownhillNodes).flatMap(List::stream).map(Node::getIntentCode) + queue.stream().map(Node::getAllDownhillNodes).flatMap(List::stream) + .map(n -> n.getWireName() + " (" + n.getIntentCode() + ")") + .map(s -> s.replaceFirst("^((BOUNCE|IMUX_B)_[EW])[^ ]+", "$1")) + .map(s -> s.replaceFirst("^(CTRL_[LR]_)B\\d+", "$1")) + .map(s -> s.replaceFirst("(INT_NODE_SDQ_|INT_SDQ_RED_ATOM_)[^ ]+", "$1")) + .map(s -> s.replaceFirst("(INT_NODE_IMUX_ATOM_)([0-9]|1[0-9]|2[0-9]|3[01]|6[4-9]|7[0-9]|8[0-9]|9[0-5])_INT_OUT[01]", "$1<0-31,64-95>")) + .map(s -> s.replaceFirst("(INT_NODE_IMUX_ATOM_)(3[2-9]|4[0-9]|5[0-9]|6[0-3]|9[6-9]|10[0-9]|11[0-9]|12[0-7])_INT_OUT[01]", "$1<32-63,96-127>")) + .map(s -> s.replaceFirst("([BC]NODE_OUTS_[EW])\\d+", "$1")) + .map(s -> s.replaceFirst("((CLE_SLICE[LM]_TOP_[01]|OUT_[NESW]NODE|(NN|EE|SS|WW)(1|2|4|6|7|10|12)(_[EW])?)_)[^ ]+", "$1")) + .map(s -> s.replaceFirst("(IF_INT_BNODE_OUTS)\\d+", "$1")) + .map(s -> s.replaceFirst("(INTF_IRI_QUADRANT_(GREEN|RED))_\\d+_[^ ]+", "$1")) .distinct() .sorted() .forEachOrdered(s -> System.out.println("\t" + s)); @@ -289,7 +348,16 @@ public void testNodeReachabilityVersal(String partName, String tileName, String } } // All INT-to-INT connections should be to the same tile - else if (baseTileTypeEnum == TileTypeEnum.CLE_BC_CORE) { + else if (EnumSet.of(TileTypeEnum.CLE_BC_CORE, + TileTypeEnum.INTF_LOCF_TL_TILE, + TileTypeEnum.INTF_LOCF_TR_TILE, + TileTypeEnum.INTF_LOCF_BL_TILE, + TileTypeEnum.INTF_LOCF_BR_TILE, + TileTypeEnum.INTF_ROCF_TL_TILE, + TileTypeEnum.INTF_ROCF_TR_TILE, + TileTypeEnum.INTF_ROCF_BL_TILE, + TileTypeEnum.INTF_ROCF_BR_TILE) + .contains(baseTileTypeEnum)) { // Except CLE_BC_CORE tiles which spans two adjacent INT tiles if (baseTile != downhill.getTile()) { Assertions.assertTrue(1 >= Math.abs(baseTile.getTileXCoordinate() - downhill.getTile().getTileXCoordinate())); diff --git a/test/src/com/xilinx/rapidwright/rwroute/TestRWRoute.java b/test/src/com/xilinx/rapidwright/rwroute/TestRWRoute.java index 071468658..97bb28c56 100644 --- a/test/src/com/xilinx/rapidwright/rwroute/TestRWRoute.java +++ b/test/src/com/xilinx/rapidwright/rwroute/TestRWRoute.java @@ -401,7 +401,7 @@ void testSingleConnectionHelper(String partName, // One SLR crossing // (Too) Close "SLICE_X9Y299,SLICE_X9Y300,500", // On Laguna column - "SLICE_X9Y300,SLICE_X9Y299,400", + "SLICE_X9Y300,SLICE_X9Y299,500", "SLICE_X0Y299,SLICE_X0Y300,200", // Far from Laguna column "SLICE_X0Y300,SLICE_X0Y299,200", "SLICE_X53Y299,SLICE_X53Y300,200", // Equidistant from two Laguna columns @@ -422,7 +422,7 @@ void testSingleConnectionHelper(String partName, "SLICE_X0Y430,SLICE_X12Y240,200", // Two SLR crossings - "SLICE_X162Y299,SLICE_X162Y599,200", + "SLICE_X162Y299,SLICE_X162Y599,600", "SLICE_X162Y599,SLICE_X162Y299,100", // Three SLR crossings diff --git a/test/src/com/xilinx/rapidwright/rwroute/TestRouterHelper.java b/test/src/com/xilinx/rapidwright/rwroute/TestRouterHelper.java index 41efaf567..9aa04840e 100644 --- a/test/src/com/xilinx/rapidwright/rwroute/TestRouterHelper.java +++ b/test/src/com/xilinx/rapidwright/rwroute/TestRouterHelper.java @@ -60,6 +60,9 @@ public class TestRouterHelper { "xcvu3p,GTYE4_CHANNEL_X0Y12,TXOUTCLK_INT,null", "xcvu3p,IOB_X1Y95,I,INT_INTF_L_IO_X72Y109/LOGIC_OUTS_R23", "xcvu3p,IOB_X1Y80,I,INT_INTF_L_IO_X72Y92/LOGIC_OUTS_R22", + "xcvu3p,IOB_X1Y179,I,INT_INTF_L_CMT_X72Y208/LOGIC_OUTS_R18", + "xcvu3p,IOB_X1Y75,I,INT_INTF_L_CMT_X72Y88/LOGIC_OUTS_R18", + "xcvu3p,IOB_X1Y184,I,INT_INTF_L_IO_X72Y212/LOGIC_OUTS_R22", "xcvu3p,MMCM_X0Y0,LOCKED,INT_INTF_L_IO_X36Y54/LOGIC_OUTS_R0", "xcvp1002,MMCM_X2Y0,LOCKED,BLI_CLE_BOT_CORE_X27Y0/LOGIC_OUTS_D23" })