Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 8 additions & 11 deletions src/com/xilinx/rapidwright/rwroute/Connection.java
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ public void computeHpwl() {
* @param prevLagunaColumn Array mapping arbitrary tile columns to the previous Laguna column
*/
public void computeConnectionBoundingBox(short boundingBoxExtensionX, short boundingBoxExtensionY,
int[] nextLagunaColumn, int[] prevLagunaColumn) {
RouteNodeGraph routingGraph) {
short xMin, xMax, yMin, yMax;
short xNetCenter = (short) Math.ceil(netWrapper.getXCenter());
short yNetCenter = (short) Math.ceil(netWrapper.getYCenter());
Expand All @@ -127,11 +127,12 @@ public void computeConnectionBoundingBox(short boundingBoxExtensionX, short boun
yMax = maxOfThree(sourceRnode.getEndTileYCoordinate(), sinkRnode.getEndTileYCoordinate(), yNetCenter);
yMin = minOfThree(sourceRnode.getEndTileYCoordinate(), sinkRnode.getEndTileYCoordinate(), yNetCenter);

if (isCrossSLR()) {
if (isCrossSLR()
&& !routingGraph.isVersal) { // FIXME: Update this for Versal
// For SLR-crossing connections, ensure the bounding box width contains at least one Laguna column
// before bounding box extension
int nextLaguna = nextLagunaColumn[xMin];
int prevLaguna = prevLagunaColumn[xMax];
int nextLaguna = routingGraph.nextLagunaColumn[xMin];
int prevLaguna = routingGraph.prevLagunaColumn[xMax];
if (nextLaguna != Integer.MAX_VALUE) {
xMax = (short) Math.max(xMax, nextLaguna);
}
Expand All @@ -148,16 +149,16 @@ public void computeConnectionBoundingBox(short boundingBoxExtensionX, short boun
if (isCrossSLR()) {
// Equivalently, ensure that cross-SLR connections are at least as high as a SLL;
// if necessary, expand the sink side of the bounding box
short heightMinusSLL = (short) ((yMaxBB - yMinBB - 1) - RouteNodeGraph.SUPER_LONG_LINE_LENGTH_IN_TILES);
short heightMinusSLL = (short) ((yMaxBB - yMinBB - 1) - routingGraph.SUPER_LONG_LINE_LENGTH_IN_TILES);
if (heightMinusSLL < 0) {
if (sourceRnode.getEndTileYCoordinate() <= sinkRnode.getEndTileYCoordinate()) {
// Upwards
short newYMaxBB = (short) (yMin + RouteNodeGraph.SUPER_LONG_LINE_LENGTH_IN_TILES + 1);
short newYMaxBB = (short) (yMin + routingGraph.SUPER_LONG_LINE_LENGTH_IN_TILES + 1);
assert(newYMaxBB > yMaxBB);
yMaxBB = newYMaxBB;
} else {
// Downwards
short newYMinBB = (short) (yMax - RouteNodeGraph.SUPER_LONG_LINE_LENGTH_IN_TILES - 1);
short newYMinBB = (short) (yMax - routingGraph.SUPER_LONG_LINE_LENGTH_IN_TILES - 1);
assert(newYMinBB < yMinBB);
yMinBB = newYMinBB;
}
Expand Down Expand Up @@ -282,10 +283,6 @@ public void setSinkRnode(RouteNode sinkRnode) {

assert(sourceRnode != null);
if (!sourceRnode.getTile().getSLR().equals(sinkRnode.getTile().getSLR())) {
if (source.getSiteInst().getDesign().getSeries() == Series.Versal) {
throw new RuntimeException("ERROR: Cross-SLR connections not yet supported on Versal.");
}

if (sourceRnode.getTile().getTileYCoordinate() < sinkRnode.getTile().getTileYCoordinate()) {
crossSLRnorth = true;
assert(!crossSLRsouth);
Expand Down
9 changes: 5 additions & 4 deletions src/com/xilinx/rapidwright/rwroute/NetWrapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public NetWrapper(int id, Net net) {
noAltSourceFound = false;
}

public void computeHPWLAndCenterCoordinates(int[] nextLagunaColumn, int[] prevLagunaColumn) {
public void computeHPWLAndCenterCoordinates(RouteNodeGraph routingGraph) {
int xMin = Integer.MAX_VALUE;
int yMin = Integer.MAX_VALUE;
int xMax = Integer.MIN_VALUE;
Expand All @@ -77,10 +77,11 @@ public void computeHPWLAndCenterCoordinates(int[] nextLagunaColumn, int[] prevLa
xMax = Integer.max(xMax, x);
yMax = Integer.max(yMax, y);

if (connection.isCrossSLR()) {
if (connection.isCrossSLR()
&& !routingGraph.isVersal) { // FIXME: Update this for Versal
// For SLR-crossing connections, ensure it contains at least one Laguna column
int nextLaguna = nextLagunaColumn[xMin];
int prevLaguna = prevLagunaColumn[xMax];
int nextLaguna = routingGraph.nextLagunaColumn[xMin];
int prevLaguna = routingGraph.prevLagunaColumn[xMax];
xMin = (short) Math.min(xMin, prevLaguna);
xMax = (short) Math.max(xMax, nextLaguna);
}
Expand Down
121 changes: 64 additions & 57 deletions src/com/xilinx/rapidwright/rwroute/RWRoute.java
Original file line number Diff line number Diff line change
Expand Up @@ -755,14 +755,13 @@ protected NetWrapper createNetWrapperAndConnections(Net net) {
}

if (indirect > 0) {
netWrapper.computeHPWLAndCenterCoordinates(routingGraph.nextLagunaColumn, routingGraph.prevLagunaColumn);
netWrapper.computeHPWLAndCenterCoordinates(routingGraph);
if (config.isUseBoundingBox()) {
for (Connection connection : netWrapper.getConnections()) {
if (connection.isDirect()) continue;
connection.computeConnectionBoundingBox(config.getBoundingBoxExtensionX(),
config.getBoundingBoxExtensionY(),
routingGraph.nextLagunaColumn,
routingGraph.prevLagunaColumn);
routingGraph);
}
}
}
Expand Down Expand Up @@ -1469,9 +1468,7 @@ private void computesNodeUsageAndTotalWirelength() {
nodeUsageForVersal.add(IntentCode.NODE_IMUX);
// NODE_PINFEED exists on Versal but is behind a NODE_IMUX
// and gets projectInputPinToINTNode() -ed away

// TODO: Enable when SLR crossings are supported
// nodeUsageForVersal.add(IntentCode.NODE_SLL_DATA);
nodeUsageForVersal.add(IntentCode.NODE_SLL_DATA);
}

/**
Expand Down Expand Up @@ -1940,9 +1937,13 @@ private void exploreAndExpand(ConnectionState state, RouteNode rnode) {
// Verify invariant that east/west wires stay east/west ...
assert(!rnodeType.isEastLocal() || childType.isEastLocal() ||
// ... unless it's an exclusive sink using a LOCAL_RESERVED node
(childType == RouteNodeType.LOCAL_RESERVED && connection.getSinkRnode().getType() == RouteNodeType.EXCLUSIVE_SINK_BOTH));
(childType == RouteNodeType.LOCAL_RESERVED && connection.getSinkRnode().getType() == RouteNodeType.EXCLUSIVE_SINK_BOTH) ||
// ... or unless it's a Versal SLL input
childRNode.getIntentCode() == IntentCode.NODE_SLL_INPUT);
assert(!rnodeType.isWestLocal() || childType.isWestLocal() ||
(childType == RouteNodeType.LOCAL_RESERVED && connection.getSinkRnode().getType() == RouteNodeType.EXCLUSIVE_SINK_BOTH));
(childType == RouteNodeType.LOCAL_RESERVED && connection.getSinkRnode().getType() == RouteNodeType.EXCLUSIVE_SINK_BOTH) ||
// ... or unless it's a Versal SLL input
childRNode.getIntentCode() == IntentCode.NODE_SLL_INPUT);
break;
case NON_LOCAL_LEADING_TO_NORTHBOUND_LAGUNA:
case NON_LOCAL_LEADING_TO_SOUTHBOUND_LAGUNA:
Expand All @@ -1959,7 +1960,11 @@ private void exploreAndExpand(ConnectionState state, RouteNode rnode) {
// (a) IMUX (LOCAL_*_LEADING_TO_*_LAGUNA) -> LAG_MUX_ATOM_\\d+_TXOUT
// (b) via a LUT routethru: IMUX (LOCAL*) -> CLE_CLE_*_SITE_0_[A-H]_O
assert(!rnodeType.isAnyLocal() || rnodeType.isLocalLeadingToLaguna() ||
(routingGraph.lutRoutethru && rnode.getIntentCode() == IntentCode.NODE_PINFEED));
(routingGraph.lutRoutethru && rnode.getIntentCode() == IntentCode.NODE_PINFEED) ||
// Allow CLE/*LAG*_PIN -> CLE/*[A-H]Q2?_PIN
(routingGraph.isVersal && connection.isCrossSLR() &&
routingGraph.isVersalLagOutRoutethru(rnode, childRNode))
);

if (!routingGraph.isAccessible(childRNode, rnode, connection)) {
continue;
Expand Down Expand Up @@ -2096,61 +2101,63 @@ protected void evaluateCostAndPush(ConnectionState state,
// Check for overshooting which occurs when child and sink node are in
// adjacent SLRs and less than a SLL wire's length apart in the Y axis.
if (deltaSLR == 1) {
int overshootByY = deltaY - RouteNodeGraph.SUPER_LONG_LINE_LENGTH_IN_TILES;
int overshootByY = deltaY - routingGraph.SUPER_LONG_LINE_LENGTH_IN_TILES;
if (overshootByY < 0) {
assert(deltaY < RouteNodeGraph.SUPER_LONG_LINE_LENGTH_IN_TILES);
deltaY = RouteNodeGraph.SUPER_LONG_LINE_LENGTH_IN_TILES - overshootByY;
assert(deltaY < routingGraph.SUPER_LONG_LINE_LENGTH_IN_TILES);
deltaY = routingGraph.SUPER_LONG_LINE_LENGTH_IN_TILES - overshootByY;
}
}

// Account for any detours that must be taken to get to the closest Laguna column
// and from there onto the sink
int nextLagunaColumn = routingGraph.nextLagunaColumn[childX];
int prevLagunaColumn = routingGraph.prevLagunaColumn[childX];
if (nextLagunaColumn == prevLagunaColumn) {
// On top of the column
assert(deltaX == Math.abs(sinkX - nextLagunaColumn));
} else {
assert(rnode.getType() != RouteNodeType.SUPER_LONG_LINE);

final int deltaXToNextColumn;
final int deltaXToPrevColumn;
final int deltaXToAndFromNextColumn;
final int deltaXToAndFromPrevColumn;
if (nextLagunaColumn == Integer.MAX_VALUE || nextLagunaColumn >= connection.getXMaxBB()) {
deltaXToNextColumn = Integer.MAX_VALUE;
deltaXToAndFromNextColumn = Integer.MAX_VALUE;
} else {
deltaXToNextColumn = Math.abs(nextLagunaColumn - childX);
deltaXToAndFromNextColumn = deltaXToNextColumn + Math.abs(sinkX - nextLagunaColumn);
}
if (prevLagunaColumn == Integer.MIN_VALUE || prevLagunaColumn <= connection.getXMinBB()) {
deltaXToPrevColumn = Integer.MAX_VALUE;
deltaXToAndFromPrevColumn = Integer.MAX_VALUE;
if (!routingGraph.isVersal) { // FIXME: Update this for Versal
// Account for any detours that must be taken to get to the closest Laguna column
// and from there onto the sink
int nextLagunaColumn = routingGraph.nextLagunaColumn[childX];
int prevLagunaColumn = routingGraph.prevLagunaColumn[childX];
if (nextLagunaColumn == prevLagunaColumn) {
// On top of the column
assert(deltaX == Math.abs(sinkX - nextLagunaColumn));
} else {
deltaXToPrevColumn = Math.abs(prevLagunaColumn - childX);
deltaXToAndFromPrevColumn = deltaXToPrevColumn + Math.abs(sinkX - prevLagunaColumn);
}
if (deltaXToNextColumn == deltaXToPrevColumn) {
// Equidistant from both columns, prefer the one closer when considering to/from the sink
deltaX = Math.min(deltaXToAndFromNextColumn, deltaXToAndFromPrevColumn);
} else if (deltaXToNextColumn < deltaXToPrevColumn &&
deltaXToAndFromNextColumn <= deltaXToAndFromPrevColumn + maxDetourToSnapBackToPrevLagunaColumn) {
// Closer to the next column and not detouring more than 4 tiles extra to/from using the prev column
assert(deltaX <= deltaXToAndFromNextColumn);
deltaX = deltaXToAndFromNextColumn;
} else if (deltaXToPrevColumn < deltaXToNextColumn &&
deltaXToAndFromPrevColumn <= deltaXToAndFromNextColumn + maxDetourToSnapBackToPrevLagunaColumn) {
// Closer to the next column and not detouring more than 4 tiles extra to/from using the prev column
assert(deltaX <= deltaXToAndFromPrevColumn);
deltaX = deltaXToAndFromPrevColumn;
} else {
// Pretty much same distance to/from both columns; prefer the closer to column
deltaX = (deltaXToNextColumn < deltaXToPrevColumn) ? deltaXToAndFromNextColumn
: deltaXToAndFromPrevColumn;
assert(rnode.getType() != RouteNodeType.SUPER_LONG_LINE);

final int deltaXToNextColumn;
final int deltaXToPrevColumn;
final int deltaXToAndFromNextColumn;
final int deltaXToAndFromPrevColumn;
if (nextLagunaColumn == Integer.MAX_VALUE || nextLagunaColumn >= connection.getXMaxBB()) {
deltaXToNextColumn = Integer.MAX_VALUE;
deltaXToAndFromNextColumn = Integer.MAX_VALUE;
} else {
deltaXToNextColumn = Math.abs(nextLagunaColumn - childX);
deltaXToAndFromNextColumn = deltaXToNextColumn + Math.abs(sinkX - nextLagunaColumn);
}
if (prevLagunaColumn == Integer.MIN_VALUE || prevLagunaColumn <= connection.getXMinBB()) {
deltaXToPrevColumn = Integer.MAX_VALUE;
deltaXToAndFromPrevColumn = Integer.MAX_VALUE;
} else {
deltaXToPrevColumn = Math.abs(prevLagunaColumn - childX);
deltaXToAndFromPrevColumn = deltaXToPrevColumn + Math.abs(sinkX - prevLagunaColumn);
}
if (deltaXToNextColumn == deltaXToPrevColumn) {
// Equidistant from both columns, prefer the one closer when considering to/from the sink
deltaX = Math.min(deltaXToAndFromNextColumn, deltaXToAndFromPrevColumn);
} else if (deltaXToNextColumn < deltaXToPrevColumn &&
deltaXToAndFromNextColumn <= deltaXToAndFromPrevColumn + maxDetourToSnapBackToPrevLagunaColumn) {
// Closer to the next column and not detouring more than 4 tiles extra to/from using the prev column
assert(deltaX <= deltaXToAndFromNextColumn);
deltaX = deltaXToAndFromNextColumn;
} else if (deltaXToPrevColumn < deltaXToNextColumn &&
deltaXToAndFromPrevColumn <= deltaXToAndFromNextColumn + maxDetourToSnapBackToPrevLagunaColumn) {
// Closer to the next column and not detouring more than 4 tiles extra to/from using the prev column
assert(deltaX <= deltaXToAndFromPrevColumn);
deltaX = deltaXToAndFromPrevColumn;
} else {
// Pretty much same distance to/from both columns; prefer the closer to column
deltaX = (deltaXToNextColumn < deltaXToPrevColumn) ? deltaXToAndFromNextColumn
: deltaXToAndFromPrevColumn;
}
}
assert(deltaX >= 0 && deltaX < Integer.MAX_VALUE);
}
assert(deltaX >= 0 && deltaX < Integer.MAX_VALUE);
}
}

Expand Down
10 changes: 6 additions & 4 deletions src/com/xilinx/rapidwright/rwroute/RouteNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ protected RouteNode(RouteNodeGraph routingGraph, Node node, RouteNodeType type)
endTileYCoordinate = nodeInfo.endTileYCoordinate;
length = nodeInfo.length;
children = null;
setBaseCost(routingGraph.design.getSeries());
setBaseCost(routingGraph);
historicalCongestionCost = initialHistoricalCongestionCost;
usersConnectionCounts = null;
visited = 0;
Expand All @@ -110,7 +110,8 @@ public int compareTo(RouteNode that) {
return (int) Math.signum(this.lowerBoundTotalPathCost - that.lowerBoundTotalPathCost);
}

private void setBaseCost(Series series) {
private void setBaseCost(RouteNodeGraph routingGraph) {
final Series series = routingGraph.design.getSeries();
baseCost = 0.4f;
switch (getType()) {
case EXCLUSIVE_SOURCE:
Expand Down Expand Up @@ -151,8 +152,8 @@ private void setBaseCost(Series series) {
break;
case SUPER_LONG_LINE:
assert(length == 0 ||
length == RouteNodeGraph.SUPER_LONG_LINE_LENGTH_IN_TILES);
baseCost = 0.3f * RouteNodeGraph.SUPER_LONG_LINE_LENGTH_IN_TILES;
length == routingGraph.SUPER_LONG_LINE_LENGTH_IN_TILES);
baseCost = 0.3f * routingGraph.SUPER_LONG_LINE_LENGTH_IN_TILES;
break;
case NON_LOCAL_LEADING_TO_NORTHBOUND_LAGUNA:
case NON_LOCAL_LEADING_TO_SOUTHBOUND_LAGUNA:
Expand All @@ -171,6 +172,7 @@ private void setBaseCost(Series series) {
case NODE_LAGUNA_OUTPUT: // LAG_LAG.{LAG_MUX_ATOM_*_TXOUT,RXD*} (US+)
case NODE_LAGUNA_DATA: // LAG_LAG.UBUMP* super long lines for u-turns at the boundary of the device (US+)
case NODE_SLL_INPUT: // Versal only
case NODE_SLL_OUTPUT: // Versal only
case INTENT_DEFAULT: // INT.VCC_WIRE
assert(length == 0);
break;
Expand Down
Loading