Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RWRoute] Yet more cleanup #1107

Merged
merged 107 commits into from
Nov 19, 2024
Merged
Show file tree
Hide file tree
Changes from 105 commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
1298a39
Tighten TestRWRoute.testSLRCrossingNonTimingDriven()
eddieh-xlnx Oct 4, 2024
a206c2c
[RWRoute] Tidy up, no functional change
eddieh-xlnx Oct 4, 2024
ccdddee
[RWRoute] Fix SLR crossing distance estimation
eddieh-xlnx Oct 4, 2024
4c1546b
Remove unused RouteNode.driverCounts; down from 80 -> 72 bytes
eddieh-xlnx Oct 4, 2024
69a22c1
Update another test
eddieh-xlnx Oct 4, 2024
d8afb12
Remove unused import
eddieh-xlnx Oct 4, 2024
ec288a1
[RouteNodeGraph] Limit size of preservedMap/nodesMap value array
eddieh-xlnx Oct 4, 2024
a3bc056
[PartialRouter] unpreserveNet() to return new NetWrapper
eddieh-xlnx Oct 4, 2024
008377f
[PartialRouter] When overused sinks found, unroute on top of unpreser…
eddieh-xlnx Oct 4, 2024
36c9e43
Add asserts, remove ripUp()
eddieh-xlnx Oct 4, 2024
728b983
[RWRoute] ripUp() to not release exclusive sink nodes
eddieh-xlnx Oct 4, 2024
fbccb34
Fix spacing
eddieh-xlnx Oct 4, 2024
22decc1
Fix broken cherry-pick
eddieh-xlnx Oct 4, 2024
ad76a4e
Remove commented out code
eddieh-xlnx Oct 4, 2024
fd88782
Sink is only exclusive if no alt sinks
eddieh-xlnx Oct 5, 2024
e82e56a
RouteNode from 72 bytes to 64; use array/AtomicReferenceArray for ...
eddieh-xlnx Oct 5, 2024
8c5c6e8
Add and use Connection.hasAltSinks()
eddieh-xlnx Oct 5, 2024
e91ed20
Fix sink rip up, tidy
eddieh-xlnx Oct 5, 2024
0bb302b
Fix assertions for alternate sinks
eddieh-xlnx Oct 6, 2024
b5d16c7
Use Net.addPIP() for trackChanges()
eddieh-xlnx Oct 6, 2024
037584c
[DesignTools] Cleanup createCeSrRstPinsToVCC()
eddieh-xlnx Oct 6, 2024
3160382
[RouteNode] setBaseCost() to be more robust
eddieh-xlnx Oct 7, 2024
e7b8d6e
Mark zero-length nodes with downhill PIP as being inaccessible
eddieh-xlnx Oct 7, 2024
ef66def
Only warn about RCLKs if timing-driven
eddieh-xlnx Oct 7, 2024
bf1593d
Do not add as child if INACCESSIBLE
eddieh-xlnx Oct 7, 2024
6821a07
Update golden values
eddieh-xlnx Oct 7, 2024
f9069d1
[DesignTools] Fix createCeSrRstPinsToVCC() for US BRAMs
eddieh-xlnx Oct 7, 2024
790e797
Apply suggestions from code review
eddieh-xlnx Oct 7, 2024
d4e94b7
[DesignTools] Add LDCE/LDPE to flop types that need site pins
eddieh-xlnx Oct 7, 2024
07d8f12
Ignore rnodes created before iteration 0, make abandoning message cle…
eddieh-xlnx Oct 7, 2024
ab908c2
Merge branch 'master' into rwroute_cleanup2
eddieh-xlnx Oct 23, 2024
d9927c2
RouteNodeGraph.allowRoutethru() to ignore NODE_PINFEED targets
eddieh-xlnx Oct 23, 2024
e00bd91
Add comment
eddieh-xlnx Oct 23, 2024
f89c96e
Add optimization of signal routing
WenhaoLin-AMD Nov 4, 2024
57f39df
Merge new method into RoutingGraph.isAccessible()
eddieh-xlnx Nov 4, 2024
74df324
Fix typo
eddieh-xlnx Nov 4, 2024
3bf9cb9
Add TestNode.testNodeReachabilityVersal() to check assumptions
eddieh-xlnx Nov 4, 2024
bf4d076
Add NODE_CLE_OUTPUT too
eddieh-xlnx Nov 4, 2024
1f8a9d3
Expand TestNode.testNodeReachabilityUltraScale()
eddieh-xlnx Nov 4, 2024
bba91e1
More
eddieh-xlnx Nov 5, 2024
4356b03
Add and use RouteNodeType.LOCAL
eddieh-xlnx Nov 5, 2024
7e7015a
Merge RouteNodeType.PINBOUNCE into LOCAL; rename WIRE, PINFEED_{I,O}
eddieh-xlnx Nov 5, 2024
b9ff45f
LUT routethru fixes
eddieh-xlnx Nov 5, 2024
aabab3c
Add testNodeReachabilityVersal()
eddieh-xlnx Nov 5, 2024
9929603
Support UltraScale
eddieh-xlnx Nov 5, 2024
e47cd18
Merge branch 'us_node_reach' into signal_router_optimize_eh
eddieh-xlnx Nov 5, 2024
9aba0ac
Extend RouteNodeType.LOCAL to Versal
eddieh-xlnx Nov 5, 2024
c197f08
Exclude Versal's NODE_IMUX/NODE_{CLE,INTF}_CTRL if not in RRG
eddieh-xlnx Nov 5, 2024
9717cd4
Merge branch 'master' into signal_router_optimize
eddieh-xlnx Nov 6, 2024
7274b33
More explanatory approach; no difference
eddieh-xlnx Nov 7, 2024
14955fe
Improvement?
eddieh-xlnx Nov 7, 2024
56afd4b
Cleanup
eddieh-xlnx Nov 7, 2024
cac787e
Update comments
eddieh-xlnx Nov 7, 2024
ef4227c
Add NODE_INTF_{CNODE,BNODE}
eddieh-xlnx Nov 7, 2024
cd631ac
[TestNode] Expand testNodeReachabilityUltraScale
eddieh-xlnx Nov 7, 2024
038aa80
Expand testNodeReachabilityVersal too
eddieh-xlnx Nov 7, 2024
77fa308
UltraScale+: Sub-divide LOCALs into _EAST/_WEST and stick to sink's side
eddieh-xlnx Nov 8, 2024
6229dbe
Re-add EXCLUSIVE_SINK (non-sided) for CTRL sinks
eddieh-xlnx Nov 8, 2024
74fdf59
Support UltraScale
eddieh-xlnx Nov 8, 2024
a1dca37
Print
eddieh-xlnx Nov 8, 2024
977b068
Expand testNodeReachabilityVersal
eddieh-xlnx Nov 8, 2024
967890d
Do not error out for Versal
eddieh-xlnx Nov 8, 2024
9a48765
Fix failing assertions
eddieh-xlnx Nov 8, 2024
95bba95
Remove unused import
eddieh-xlnx Nov 8, 2024
3a25ead
Fix another typo
eddieh-xlnx Nov 8, 2024
0d60f48
Fix SLR crossings
eddieh-xlnx Nov 8, 2024
d4e0ea5
More Versal fixes
eddieh-xlnx Nov 8, 2024
07935a4
Update testSLRCrossingNonTimingDriven golden values
eddieh-xlnx Nov 8, 2024
bb9db76
Tidy up and comments
eddieh-xlnx Nov 8, 2024
9e7d383
Add a few more testcases
eddieh-xlnx Nov 8, 2024
4f43cf5
[RWRoute] Non-verbose mode to print out nodes popped
eddieh-xlnx Nov 8, 2024
7890b5a
Update comments/asserts
eddieh-xlnx Nov 8, 2024
15b7453
Clean up RouteNodeGraph.isAccessible()
eddieh-xlnx Nov 8, 2024
b61a199
Fixes for UltraScale
eddieh-xlnx Nov 8, 2024
a937982
Skip another assert for Versal
eddieh-xlnx Nov 8, 2024
da6c175
Merge branch 'master' into signal_router_optimize
eddieh-xlnx Nov 12, 2024
6f0b9ae
Merge branch 'rwroute_east_west' into signal_router_optimize
eddieh-xlnx Nov 12, 2024
b07f2db
Fix Versal assertion
eddieh-xlnx Nov 12, 2024
90e8d80
Fix assertion
eddieh-xlnx Nov 12, 2024
bdf791f
Expand test
eddieh-xlnx Nov 12, 2024
c1e8274
Apply #1098 to Versal too
eddieh-xlnx Nov 12, 2024
50287fe
Assign CNODEs to be LOCAL_{EAST,WEST} (opposite to name)
eddieh-xlnx Nov 13, 2024
b048ef3
Merge branch 'master' into signal_router_optimize
eddieh-xlnx Nov 13, 2024
f4df052
Fix merge
eddieh-xlnx Nov 13, 2024
003a051
Resolve FIXMEs
eddieh-xlnx Nov 13, 2024
c057226
Restore comment
eddieh-xlnx Nov 13, 2024
353775c
Fix continue
eddieh-xlnx Nov 13, 2024
a9f5161
On Versal, make all NODE_PINFEEDs RouteNodeType.LOCAL
eddieh-xlnx Nov 13, 2024
76bc5cc
Handle NODE_INTF_CNODE too
eddieh-xlnx Nov 13, 2024
7b190bf
Add comment
eddieh-xlnx Nov 13, 2024
e877503
Simplify if
eddieh-xlnx Nov 13, 2024
ce90eb7
Introduce LOCAL_RESERVED
eddieh-xlnx Nov 13, 2024
1c2b471
Allow INODE and PINBOUNCE either side of CTRL sink to be used
eddieh-xlnx Nov 13, 2024
5414206
Update comment
eddieh-xlnx Nov 13, 2024
57ed051
Clearer names
eddieh-xlnx Nov 13, 2024
8c0acba
Fix
eddieh-xlnx Nov 13, 2024
d1e843a
Tidy up
eddieh-xlnx Nov 13, 2024
fb08d82
Merge branch 'master' into signal_router_optimize
eddieh-xlnx Nov 14, 2024
3bfcdf4
Merge branch 'signal_router_optimize' into rwroute_cleanup2
eddieh-xlnx Nov 14, 2024
1ebc503
Cleanup
eddieh-xlnx Nov 14, 2024
0cf3118
Reduce SLR crossing goldens
eddieh-xlnx Nov 14, 2024
c207dbc
Reduce one more
eddieh-xlnx Nov 14, 2024
0b57ffa
More accurate message
eddieh-xlnx Nov 14, 2024
062e4d9
Simplify and comment
eddieh-xlnx Nov 14, 2024
88145ed
Merge branch 'master' into rwroute_cleanup2
eddieh-xlnx Nov 18, 2024
425b0b7
Update src/com/xilinx/rapidwright/rwroute/PartialRouter.java
eddieh-xlnx Nov 18, 2024
c9ec130
Add two testcases that needed fixing (requires Vivado)
eddieh-xlnx Nov 18, 2024
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
4 changes: 2 additions & 2 deletions src/com/xilinx/rapidwright/rwroute/CUFR.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public CUFR(Design design, RWRouteConfig config) {

public static class RouteNodeGraphCUFR extends RouteNodeGraph {
public RouteNodeGraphCUFR(Design design, RWRouteConfig config) {
super(design, config, new ConcurrentHashMap<>());
super(design, config);
}

// Do not track createRnodeTime since it is meaningless when multithreading
Expand All @@ -92,7 +92,7 @@ protected void addCreateRnodeTime(long time) {}

public static class RouteNodeGraphCUFRTimingDriven extends RouteNodeGraphTimingDriven {
public RouteNodeGraphCUFRTimingDriven(Design design, RWRouteConfig config, DelayEstimatorBase delayEstimator) {
super(design, config, delayEstimator, new ConcurrentHashMap<>());
super(design, config, delayEstimator);
}

// Do not track createRnodeTime since it is meaningless when multithreading
Expand Down
31 changes: 17 additions & 14 deletions src/com/xilinx/rapidwright/rwroute/Connection.java
Original file line number Diff line number Diff line change
Expand Up @@ -215,19 +215,6 @@ public boolean isCongested() {
return false;
}

/**
* Checks if a connection is routed through any rnodes that have multiple drivers.
* @return
*/
public boolean useRnodesWithMultiDrivers() {
for (RouteNode rn : getRnodes()) {
if (rn.hasMultiDrivers()) {
return true;
}
}
return false;
}

/**
* Add the give RouteNode to the list of those used by this Connection.
* Expand the bounding box accordingly, since this node could describe an
Expand Down Expand Up @@ -299,6 +286,10 @@ public List<RouteNode> getAltSinkRnodes() {
return altSinkRnodes == null ? Collections.emptyList() : altSinkRnodes;
}

public boolean hasAltSinks() {
return altSinkRnodes != null && !altSinkRnodes.isEmpty();
}

public void addAltSinkRnode(RouteNode sinkRnode) {
if (altSinkRnodes == null) {
altSinkRnodes = new ArrayList<>(1);
Expand Down Expand Up @@ -351,6 +342,10 @@ public NetWrapper getNetWrapper() {
return this.netWrapper;
}

public Net getNet() {
return netWrapper.getNet();
}

public SitePinInst getSource() {
return source;
}
Expand Down Expand Up @@ -469,7 +464,7 @@ public String toString() {
}

public void setAllTargets(RWRoute.ConnectionState state) {
if (sinkRnode.countConnectionsOfUser(netWrapper) == 0 ||
if (sinkRnode.countConnectionsOfUser(netWrapper) == 1 ||
sinkRnode.getIntentCode() == IntentCode.NODE_PINBOUNCE) {
// Since this connection will have been ripped up, only mark a node
// as a target if it's not already used by this net.
Expand Down Expand Up @@ -515,4 +510,12 @@ protected Pair<SitePinInst,RouteNode> getOrCreateAlternateSource(RouteNodeGraph
assert(altSourceRnode != null);
return new Pair<>(altSource, altSourceRnode);
}

public boolean isRouted() {
return sink.isRouted();
}

public void setRouted(boolean isRouted) {
sink.setRouted(isRouted);
}
}
30 changes: 30 additions & 0 deletions src/com/xilinx/rapidwright/rwroute/NetWrapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -180,4 +180,34 @@ public SitePinInst getOrCreateAlternateSource(RouteNodeGraph routingGraph) {
public RouteNode getAltSourceRnode() {
return altSourceRnode;
}

public boolean hasMultipleDrivers(int sequence) {
eddieh-xlnx marked this conversation as resolved.
Show resolved Hide resolved
for (Connection connection : connections) {
List<RouteNode> rnodes = connection.getRnodes();
if (rnodes.isEmpty()) {
continue;
}

RouteNode driver = rnodes.get(rnodes.size() - 2);
for (int i = rnodes.size() - 1; i >= 0; i--) {
assert(driver != null);
RouteNode rnode = rnodes.get(i);
if (rnode.isVisited(sequence)) {
// Rnode has already been visited by a prior connection;
// check if driver is same as this connection
RouteNode prev = rnode.getPrev();
if (prev != driver) {
return true;
}
} else {
// Rnode has not been visited by this net yet,
// set initial prev
rnode.setVisited(sequence);
rnode.setPrev(driver);
}
driver = rnode;
}
}
return false;
}
}
9 changes: 5 additions & 4 deletions src/com/xilinx/rapidwright/rwroute/PartialCUFR.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public PartialCUFR(Design design, RWRouteConfig config, Collection<SitePinInst>

public static class RouteNodeGraphPartialCUFR extends RouteNodeGraphPartial {
public RouteNodeGraphPartialCUFR(Design design, RWRouteConfig config) {
super(design, config, new ConcurrentHashMap<>());
super(design, config);
}

// Do not track createRnodeTime since it is meaningless when multithreading
Expand All @@ -72,7 +72,7 @@ protected void addCreateRnodeTime(long time) {}

public static class RouteNodeGraphPartialCUFRTimingDriven extends RouteNodeGraphPartialTimingDriven {
public RouteNodeGraphPartialCUFRTimingDriven(Design design, RWRouteConfig config, DelayEstimatorBase delayEstimator) {
super(design, config, delayEstimator, new ConcurrentHashMap<>());
super(design, config, delayEstimator);
}

// Do not track createRnodeTime since it is meaningless when multithreading
Expand Down Expand Up @@ -137,9 +137,10 @@ protected void routeIndirectConnections(Collection<Connection> connections) {
}

@Override
protected void unpreserveNet(Net net) {
super.unpreserveNet(net);
protected NetWrapper unpreserveNet(Net net) {
NetWrapper netWrapper = super.unpreserveNet(net);
needsRepartitioning = true;
return netWrapper;
}

@Override
Expand Down
81 changes: 36 additions & 45 deletions src/com/xilinx/rapidwright/rwroute/PartialRouter.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
Expand All @@ -44,7 +43,6 @@
import com.xilinx.rapidwright.device.Node;
import com.xilinx.rapidwright.device.PIP;
import com.xilinx.rapidwright.device.Series;
import com.xilinx.rapidwright.device.Tile;
import com.xilinx.rapidwright.router.UltraScaleClockRouting;
import com.xilinx.rapidwright.tests.CodePerfTracker;
import com.xilinx.rapidwright.timing.ClkRouteTiming;
Expand All @@ -71,12 +69,8 @@ public class PartialRouter extends RWRoute {

protected static class RouteNodeGraphPartial extends RouteNodeGraph {

public RouteNodeGraphPartial(Design design, RWRouteConfig config, Map<Tile, RouteNode[]> nodesMap) {
super(design, config, nodesMap);
}

public RouteNodeGraphPartial(Design design, RWRouteConfig config) {
this(design, config, new HashMap<>());
super(design, config);
}

@Override
Expand All @@ -90,17 +84,10 @@ protected boolean isExcluded(RouteNode parent, Node child) {
}

protected static class RouteNodeGraphPartialTimingDriven extends RouteNodeGraphTimingDriven {
public RouteNodeGraphPartialTimingDriven(Design design,
RWRouteConfig config,
DelayEstimatorBase delayEstimator,
Map<Tile, RouteNode[]> nodesMap) {
super(design, config, delayEstimator, nodesMap);
}

public RouteNodeGraphPartialTimingDriven(Design design,
RWRouteConfig config,
DelayEstimatorBase delayEstimator) {
this(design, config, delayEstimator, new HashMap<>());
super(design, config, delayEstimator);
}

@Override
Expand Down Expand Up @@ -168,7 +155,7 @@ protected static boolean isPartOfExistingRoute(RouteNodeGraph routingGraph, Rout
return false;
}

if (prev.equals(start) && routingGraph.isPreserved(end)) {
if (prev == start && routingGraph.isPreserved(end)) {
// Arc matches start node and end node is preserved
// This implies that both start and end nodes must be preserved for the same net
// (which assumedly is the net we're currently routing, and is asserted upstream)
Expand Down Expand Up @@ -202,7 +189,7 @@ protected TimingManager createTimingManager(ClkRouteTiming clkTiming, Collection
protected int getNumIndirectConnectionPins() {
int totalSitePins = 0;
for (Connection connection : indirectConnections) {
totalSitePins += (connection.getSink().isRouted() && !connection.isCongested()) ? 0 : 1;
totalSitePins += (connection.isRouted() && !connection.isCongested()) ? 0 : 1;
}
return totalSitePins;
}
Expand All @@ -211,7 +198,7 @@ protected int getNumIndirectConnectionPins() {
protected int getNumConnectionsCrossingSLRs() {
int numCrossingSLRs = 0;
for (Connection c : indirectConnections) {
numCrossingSLRs += (!c.isCrossSLR() || (c.getSink().isRouted() && !c.isCongested())) ? 0 : 1;
numCrossingSLRs += (!c.isCrossSLR() || (c.isRouted() && !c.isCongested())) ? 0 : 1;
}
return numCrossingSLRs;
}
Expand Down Expand Up @@ -249,7 +236,7 @@ protected void determineRoutingTargets() {
// if so, unpreserve that blocking net
Set<Net> unpreserveNets = new HashSet<>();
for (Connection connection : indirectConnections) {
Net net = connection.getNetWrapper().getNet();
Net net = connection.getNet();
Net preservedNet;
assert((preservedNet = routingGraph.getPreservedNet(connection.getSourceRnode())) == null || preservedNet == net);
RouteNode sinkRnode = connection.getSinkRnode();
Expand All @@ -261,11 +248,33 @@ protected void determineRoutingTargets() {
}

if (!unpreserveNets.isEmpty()) {
System.out.println("INFO: Unpreserving " + unpreserveNets.size() + " nets to improve sink routability");
System.out.println("INFO: Unpreserving " + unpreserveNets.size() + " nets to ensure sink routability");
for (Net net : unpreserveNets) {
System.out.println("\t" + net);
assert(!net.isStaticNet());
unpreserveNet(net);
NetWrapper netWrapper = unpreserveNet(net);
for (Connection connection : netWrapper.getConnections()) {
List<RouteNode> rnodes = connection.getRnodes();
if (rnodes.size() < 3) {
continue;
}
// Look for overused exclusive sinks (with type PINFEED_I) within
eddieh-xlnx marked this conversation as resolved.
Show resolved Hide resolved
// this connection's used nodes (except for the first and last used node,
// corresponding to source and sink)
for (RouteNode rnode : rnodes.subList(1, rnodes.size() - 1)) {
if (!rnode.getType().isAnyExclusiveSink() || !rnode.isOverUsed()) {
continue;
}

// If an overused exclusive sink is found -- it must also be used
// by the net to which that sink belongs to, so rip up this connection's
// routing
ripUp(connection);
connection.resetRoute();
connection.setRouted(false);
break;
}
}
}
}
}
Expand Down Expand Up @@ -407,13 +416,6 @@ protected void addNetConnectionToRoutingTargets(Net net) {
continue;
}

// Even though this connection is not expected to have any routing yet,
// perform a rip up anyway in order to release any exclusive sinks
// ahead of finishRouteConnection()
assert(connection.getRnodes().isEmpty());
connection.getSink().setRouted(false);
ripUp(connection);

RouteNode sinkRnode = connection.getSinkRnode();
finishRouteConnection(connection, sinkRnode);
}
Expand Down Expand Up @@ -444,7 +446,7 @@ protected boolean saveRouting(Connection connection, RouteNode rnode) {
assert(rnodes.size() > 1);

// Check if alternate source exists (without creating one if it doesn't)
if (connection.getNetWrapper().getNet().getAlternateSource() != null) {
if (connection.getNet().getAlternateSource() != null) {
Pair<SitePinInst,RouteNode> altSourceAndRnode = connection.getOrCreateAlternateSource(routingGraph);
assert(altSourceAndRnode != null);
RouteNode altSourceRnode = altSourceAndRnode.getSecond();
Expand All @@ -463,13 +465,8 @@ protected boolean saveRouting(Connection connection, RouteNode rnode) {
protected void finishRouteConnection(Connection connection, RouteNode rnode) {
super.finishRouteConnection(connection, rnode);

if (!connection.getSink().isRouted()) {
if (!connection.isRouted()) {
connection.resetRoute();
if (connection.getAltSinkRnodes().isEmpty()) {
// Undo what ripUp() would have done for this connection which has a single exclusive sink
rnode.incrementUser(connection.getNetWrapper());
rnode.updatePresentCongestionCost(presentCongestionFactor);
}
}
}

Expand Down Expand Up @@ -537,7 +534,7 @@ protected int unpreserveNetsAndReleaseResources(Connection connection) {
return unpreserveNets.size();
}

protected void unpreserveNet(Net net) {
protected NetWrapper unpreserveNet(Net net) {
assert(!net.getName().equals(Net.Z_NET));

Set<RouteNode> rnodes = new HashSet<>();
Expand Down Expand Up @@ -614,13 +611,6 @@ protected void unpreserveNet(Net net) {
assert(sourceRnode.getType() == RouteNodeType.EXCLUSIVE_SOURCE);
assert(sinkRnode.getType().isAnyExclusiveSink());

// Even though this connection is not expected to have any routing yet,
// perform a rip up anyway in order to release any exclusive sinks
// ahead of finishRouteConnection()
assert(connection.getRnodes().isEmpty());
connection.getSink().setRouted(false);
ripUp(connection);

finishRouteConnection(connection, sinkRnode);
}

Expand Down Expand Up @@ -655,6 +645,7 @@ protected void unpreserveNet(Net net) {

numPreservedWire--;
numPreservedRoutableNets--;
return netWrapper;
}

@Override
Expand All @@ -665,9 +656,9 @@ protected boolean handleUnroutableConnection(Connection connection) {
}
if (softPreserve && (
// First iteration, without alternate source
(routeIteration == 1 && connection.getNetWrapper().getNet().getAlternateSource() == null) ||
(routeIteration == 1 && connection.getNet().getAlternateSource() == null) ||
// Second iteration, with alternate source
(routeIteration == 2 && connection.getNetWrapper().getNet().getAlternateSource() != null))
(routeIteration == 2 && connection.getNet().getAlternateSource() != null))
) {
int netsUnpreserved = unpreserveNetsAndReleaseResources(connection);
if (netsUnpreserved > 0) {
Expand Down
Loading
Loading