From 81ec900749ae0420cb5bec045ad373bdf04091de Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 23 Oct 2024 16:21:52 -0700 Subject: [PATCH 1/7] Add ReportRouteStatus utility Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/MainEntrypoint.java | 4 +- .../rapidwright/util/ReportRouteStatus.java | 112 ++++++++++++++++++ 2 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 src/com/xilinx/rapidwright/util/ReportRouteStatus.java diff --git a/src/com/xilinx/rapidwright/MainEntrypoint.java b/src/com/xilinx/rapidwright/MainEntrypoint.java index 12d80c350..6daad6dd1 100644 --- a/src/com/xilinx/rapidwright/MainEntrypoint.java +++ b/src/com/xilinx/rapidwright/MainEntrypoint.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2021-2022, Xilinx, Inc. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. + * Copyright (c) 2022-2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Jakob Wenzel, Xilinx Research Labs. @@ -103,6 +103,7 @@ import com.xilinx.rapidwright.util.PartPrinter; import com.xilinx.rapidwright.util.PerformanceExplorer; import com.xilinx.rapidwright.util.ReplaceEDIFInDCP; +import com.xilinx.rapidwright.util.ReportRouteStatus; import com.xilinx.rapidwright.util.StringTools; import com.xilinx.rapidwright.util.Unzip; import com.xilinx.rapidwright.util.performance_evaluation.PerformanceEvaluation; @@ -186,6 +187,7 @@ private static void addFunction(String name, MainStyleFunction func) { addFunction("RelocationTools", RelocationTools::main); addFunction("ReplaceEDIFInDCP", ReplaceEDIFInDCP::main); addFunction("ReportDevicePerformance", ReportDevicePerformance::main); + addFunction("ReportRouteStatus", ReportRouteStatus::main); addFunction("ReportTimingExample", ReportTimingExample::main); addFunction("Router", Router::main); addFunction("RouteThruHelper", RouteThruHelper::main); diff --git a/src/com/xilinx/rapidwright/util/ReportRouteStatus.java b/src/com/xilinx/rapidwright/util/ReportRouteStatus.java new file mode 100644 index 000000000..2851731ba --- /dev/null +++ b/src/com/xilinx/rapidwright/util/ReportRouteStatus.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2024, Advanced Micro Devices, Inc. + * All rights reserved. + * + * Author: Eddie Hung, Advanced Micro Devices, Inc. + * + * This file is part of RapidWright. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.xilinx.rapidwright.util; + +import com.xilinx.rapidwright.design.Design; +import com.xilinx.rapidwright.design.DesignTools; +import com.xilinx.rapidwright.design.Net; +import com.xilinx.rapidwright.design.SitePinInst; +import com.xilinx.rapidwright.device.Node; +import com.xilinx.rapidwright.device.PIP; +import com.xilinx.rapidwright.rwroute.RouterHelper; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class ReportRouteStatus { + public static void main(String[] args) { + if (args.length != 1) { + System.out.println("USAGE: ReportRouteStatus "); + System.exit(1); + } + + Design design = Design.readCheckpoint(args[0]); + + DesignTools.updatePinsIsRouted(design); + + Map nodesUsedByDesign = new HashMap<>(); + Set conflictingNets = new HashSet<>(); + + Collection nets = design.getNets(); + int numPhysicalNets = nets.size(); + int numRoutableNets = 0; + int numUnroutedNets = 0; + int numNetsWithUnroutedPins = 0; + for (Net net : nets) { + if (!RouterHelper.isRoutableNetWithSourceSinks(net)) { + continue; + } + numRoutableNets++; + + boolean isFullyRouted = true; + boolean isPartiallyRouted = false; + for (SitePinInst spi : net.getPins()) { + if (spi.isRouted()) { + isPartiallyRouted = true; + continue; + } + isFullyRouted = false; + } + + boolean isConflictFree = true; + for (PIP pip : net.getPIPs()) { + Node endNode = pip.isReversed() ? pip.getStartNode() : pip.getEndNode(); + Net conflictingNet = nodesUsedByDesign.putIfAbsent(endNode, net); + if (conflictingNet != null && conflictingNet != net) { + conflictingNets.add(conflictingNet); + isConflictFree = false; + } + } + + if (!isConflictFree) { + conflictingNets.add(net); + } else if (!isFullyRouted) { + if (isPartiallyRouted) { + numNetsWithUnroutedPins++; + } else { + numUnroutedNets++; + } + } + } + + int numConflictingNets = conflictingNets.size(); + System.out.println(); + System.out.println("Design Route Status"); + System.out.println(" : # nets :"); + System.out.println(" ------------------------------------------- : ----------- :"); + System.out.printf (" # of physical nets......................... : %11d :\n", numPhysicalNets); + System.out.printf (" # of nets not needing routing.......... : %11d :\n", numPhysicalNets - numRoutableNets); + System.out.printf (" # of routable nets..................... : %11d :\n", numRoutableNets); + System.out.printf (" # of unrouted nets................. : %11d :\n", numUnroutedNets); + System.out.printf (" # of fully routed nets............. : %11d :\n", numRoutableNets - numUnroutedNets - numNetsWithUnroutedPins - numConflictingNets); + System.out.printf (" # of nets with routing errors.......... : %11d :\n", numNetsWithUnroutedPins + numConflictingNets); + System.out.printf (" # of nets with some unrouted pins.. : %11d :\n", numNetsWithUnroutedPins); + System.out.printf (" # of nets with resource conflicts.. : %11d :\n", numConflictingNets); + System.out.println(" ------------------------------------------- : ----------- :"); + + System.exit((numNetsWithUnroutedPins == 0 && numConflictingNets == 0) ? 0 : 1); + } +} From 0824d66673155ce41b1e4a9eed9779f94e77ceb3 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 23 Oct 2024 19:47:23 -0700 Subject: [PATCH 2/7] Address review comments Signed-off-by: Eddie Hung --- .../rapidwright/util/ReportRouteStatus.java | 68 +++++++++++-------- .../util/ReportRouteStatusResult.java | 31 +++++---- 2 files changed, 57 insertions(+), 42 deletions(-) diff --git a/src/com/xilinx/rapidwright/util/ReportRouteStatus.java b/src/com/xilinx/rapidwright/util/ReportRouteStatus.java index 2851731ba..cebb93a30 100644 --- a/src/com/xilinx/rapidwright/util/ReportRouteStatus.java +++ b/src/com/xilinx/rapidwright/util/ReportRouteStatus.java @@ -30,36 +30,29 @@ import com.xilinx.rapidwright.device.PIP; import com.xilinx.rapidwright.rwroute.RouterHelper; -import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class ReportRouteStatus { - public static void main(String[] args) { - if (args.length != 1) { - System.out.println("USAGE: ReportRouteStatus "); - System.exit(1); - } - - Design design = Design.readCheckpoint(args[0]); - - DesignTools.updatePinsIsRouted(design); + /** + * Compute the route status of given Design's physical nets by examining the SitePinInst.isRouted() + * state of each net's pins, as well as to discovering node conflicts between each net's PIPs. + * @param design Design to examine. + * @return ReportRouteStatusResult object. + */ + public static ReportRouteStatusResult reportRouteStatus(Design design) { + ReportRouteStatusResult rrs = new ReportRouteStatusResult(); Map nodesUsedByDesign = new HashMap<>(); Set conflictingNets = new HashSet<>(); - Collection nets = design.getNets(); - int numPhysicalNets = nets.size(); - int numRoutableNets = 0; - int numUnroutedNets = 0; - int numNetsWithUnroutedPins = 0; - for (Net net : nets) { + for (Net net : design.getNets()) { if (!RouterHelper.isRoutableNetWithSourceSinks(net)) { continue; } - numRoutableNets++; + rrs.routableNets++; boolean isFullyRouted = true; boolean isPartiallyRouted = false; @@ -85,28 +78,45 @@ public static void main(String[] args) { conflictingNets.add(net); } else if (!isFullyRouted) { if (isPartiallyRouted) { - numNetsWithUnroutedPins++; + rrs.netsWithSomeUnroutedPins++; } else { - numUnroutedNets++; + rrs.unroutedNets++; } } } - int numConflictingNets = conflictingNets.size(); + rrs.netsWithResourceConflicts = conflictingNets.size(); + rrs.netsWithRoutingErrors = rrs.netsWithSomeUnroutedPins + rrs.netsWithResourceConflicts; + rrs.fullyRoutedNets = rrs.routableNets - rrs.unroutedNets - rrs.netsWithRoutingErrors; + return rrs; + } + + public static void main(String[] args) { + if (args.length != 1) { + System.out.println("USAGE: ReportRouteStatus "); + System.exit(1); + } + + Design design = Design.readCheckpoint(args[0]); + + DesignTools.updatePinsIsRouted(design); + + ReportRouteStatusResult rrs = reportRouteStatus(design); + int numPhysicalNets = design.getNets().size(); System.out.println(); - System.out.println("Design Route Status"); + System.out.println("RapidWright Design Route Status"); System.out.println(" : # nets :"); System.out.println(" ------------------------------------------- : ----------- :"); System.out.printf (" # of physical nets......................... : %11d :\n", numPhysicalNets); - System.out.printf (" # of nets not needing routing.......... : %11d :\n", numPhysicalNets - numRoutableNets); - System.out.printf (" # of routable nets..................... : %11d :\n", numRoutableNets); - System.out.printf (" # of unrouted nets................. : %11d :\n", numUnroutedNets); - System.out.printf (" # of fully routed nets............. : %11d :\n", numRoutableNets - numUnroutedNets - numNetsWithUnroutedPins - numConflictingNets); - System.out.printf (" # of nets with routing errors.......... : %11d :\n", numNetsWithUnroutedPins + numConflictingNets); - System.out.printf (" # of nets with some unrouted pins.. : %11d :\n", numNetsWithUnroutedPins); - System.out.printf (" # of nets with resource conflicts.. : %11d :\n", numConflictingNets); + System.out.printf (" # of nets not needing routing.......... : %11d :\n", numPhysicalNets - rrs.routableNets); + System.out.printf (" # of routable nets..................... : %11d :\n", rrs.routableNets); + System.out.printf (" # of unrouted nets................. : %11d :\n", rrs.unroutedNets); + System.out.printf (" # of fully routed nets............. : %11d :\n", rrs.fullyRoutedNets); + System.out.printf (" # of nets with routing errors.......... : %11d :\n", rrs.netsWithRoutingErrors); + System.out.printf (" # of nets with some unrouted pins.. : %11d :\n", rrs.netsWithSomeUnroutedPins); + System.out.printf (" # of nets with resource conflicts.. : %11d :\n", rrs.netsWithResourceConflicts); System.out.println(" ------------------------------------------- : ----------- :"); - System.exit((numNetsWithUnroutedPins == 0 && numConflictingNets == 0) ? 0 : 1); + System.exit(rrs.isFullyRouted() ? 0 : 1); } } diff --git a/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java b/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java index a0de23aa7..6b6dec0dc 100644 --- a/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java +++ b/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java @@ -26,19 +26,20 @@ public class ReportRouteStatusResult { - public final int logicalNets; - public final int netsWithNoPlacedPins; - public final int netsNotNeedingRouting; - public final int internallyRoutedNets; - public final int netsWithNoLoads; - public final int implicitlyRoutedPorts; - public final int routableNets; - public final int unroutedNets; - public final int fullyRoutedNets; - public final int netsWithNoDriver; - public final int netsWithRoutingErrors; - public final int netsWithSomeUnplacedPins; - public final int netsWithSomeUnroutedPins; + public int logicalNets; + public int netsWithNoPlacedPins; + public int netsNotNeedingRouting; + public int internallyRoutedNets; + public int netsWithNoLoads; + public int implicitlyRoutedPorts; + public int routableNets; + public int unroutedNets; + public int fullyRoutedNets; + public int netsWithNoDriver; + public int netsWithRoutingErrors; + public int netsWithSomeUnplacedPins; + public int netsWithSomeUnroutedPins; + public int netsWithResourceConflicts; private static int parseLog(List log, String key) { List matchingLines = VivadoTools.searchVivadoLog(log, key); @@ -49,6 +50,9 @@ private static int parseLog(List log, String key) { return Integer.parseInt(matchingLines.get(0).replaceAll("[^\\d]", "")); } + public ReportRouteStatusResult() { + } + /** * Analyze a log file produced by Vivado's `report_route_status` * command. @@ -69,6 +73,7 @@ public ReportRouteStatusResult(List log) { netsWithRoutingErrors = parseLog(log, "# of nets with routing errors"); netsWithSomeUnplacedPins = parseLog(log, "# of nets with some unplaced pins"); netsWithSomeUnroutedPins = parseLog(log, "# of nets with some unrouted pins"); + netsWithResourceConflicts = parseLog(log, "# of nets with resource conflicts"); } public boolean isFullyRouted() { From e7504ed97170dd044ea9c454b8a77d90ed3fd9dc Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 23 Oct 2024 19:56:18 -0700 Subject: [PATCH 3/7] Update comments Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/util/ReportRouteStatus.java | 12 ++++++++++-- .../rapidwright/util/ReportRouteStatusResult.java | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/com/xilinx/rapidwright/util/ReportRouteStatus.java b/src/com/xilinx/rapidwright/util/ReportRouteStatus.java index cebb93a30..9e66b7fe5 100644 --- a/src/com/xilinx/rapidwright/util/ReportRouteStatus.java +++ b/src/com/xilinx/rapidwright/util/ReportRouteStatus.java @@ -37,8 +37,13 @@ public class ReportRouteStatus { /** - * Compute the route status of given Design's physical nets by examining the SitePinInst.isRouted() - * state of each net's pins, as well as to discovering node conflicts between each net's PIPs. + * Compute the route status of given Design's physical nets by examining the + * {@link SitePinInst#isRouted()} state of each net's pins, as well as to discovering node conflicts + * between each net's PIPs. + * Freshly loaded designs, as well as designs that are not up-to-date, can call + * {@link DesignTools#updatePinsIsRouted(Design)} for recomputing the SitePinInst.isRouted() state. + * Note that currently this method does not check the Design's logical netlist nor its physical + * placement --- these are assumed to be correct. * @param design Design to examine. * @return ReportRouteStatusResult object. */ @@ -102,6 +107,9 @@ public static void main(String[] args) { DesignTools.updatePinsIsRouted(design); ReportRouteStatusResult rrs = reportRouteStatus(design); + + // Print out the result in Vivado's style -- note that this analysis differs from Vivado in that + // only physical nets are examined. int numPhysicalNets = design.getNets().size(); System.out.println(); System.out.println("RapidWright Design Route Status"); diff --git a/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java b/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java index 6b6dec0dc..7024a39b1 100644 --- a/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java +++ b/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Advanced Micro Devices, Inc. + * Copyright (c) 2023-2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Zak Nafziger, Advanced Micro Devices, Inc. From 35058e915d9b2501638f74afcb539573811acd84 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 23 Oct 2024 20:09:59 -0700 Subject: [PATCH 4/7] Add test Signed-off-by: Eddie Hung --- .../rapidwright/util/ReportRouteStatus.java | 7 ++- .../util/ReportRouteStatusResult.java | 2 +- .../util/TestReportRouteStatus.java | 48 +++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 test/src/com/xilinx/rapidwright/util/TestReportRouteStatus.java diff --git a/src/com/xilinx/rapidwright/util/ReportRouteStatus.java b/src/com/xilinx/rapidwright/util/ReportRouteStatus.java index 9e66b7fe5..4392547db 100644 --- a/src/com/xilinx/rapidwright/util/ReportRouteStatus.java +++ b/src/com/xilinx/rapidwright/util/ReportRouteStatus.java @@ -90,6 +90,9 @@ public static ReportRouteStatusResult reportRouteStatus(Design design) { } } + // Since we do not analyze logical nets, set it to -1 + rrs.logicalNets = -1; + rrs.netsWithResourceConflicts = conflictingNets.size(); rrs.netsWithRoutingErrors = rrs.netsWithSomeUnroutedPins + rrs.netsWithResourceConflicts; rrs.fullyRoutedNets = rrs.routableNets - rrs.unroutedNets - rrs.netsWithRoutingErrors; @@ -125,6 +128,8 @@ public static void main(String[] args) { System.out.printf (" # of nets with resource conflicts.. : %11d :\n", rrs.netsWithResourceConflicts); System.out.println(" ------------------------------------------- : ----------- :"); - System.exit(rrs.isFullyRouted() ? 0 : 1); + if (!rrs.isFullyRouted()) { + throw new RuntimeException("Design is not fully routed"); + } } } diff --git a/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java b/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java index 7024a39b1..871190bdf 100644 --- a/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java +++ b/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java @@ -77,7 +77,7 @@ public ReportRouteStatusResult(List log) { } public boolean isFullyRouted() { - return logicalNets > 0 && unroutedNets == 0 && netsWithRoutingErrors == 0; + return logicalNets != 0 && unroutedNets == 0 && netsWithRoutingErrors == 0; } } diff --git a/test/src/com/xilinx/rapidwright/util/TestReportRouteStatus.java b/test/src/com/xilinx/rapidwright/util/TestReportRouteStatus.java new file mode 100644 index 000000000..973d3da72 --- /dev/null +++ b/test/src/com/xilinx/rapidwright/util/TestReportRouteStatus.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2024, Advanced Micro Devices, Inc. + * All rights reserved. + * + * Author: Eddie Hung, Advanced Micro Devices, Inc. + * + * This file is part of RapidWright. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.xilinx.rapidwright.util; + +import com.xilinx.rapidwright.design.Design; +import com.xilinx.rapidwright.design.DesignTools; +import com.xilinx.rapidwright.support.RapidWrightDCP; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TestReportRouteStatus { + @Test + public void testReportRouteStatusMain() { + String path = RapidWrightDCP.getString("picoblaze_ooc_X10Y235.dcp"); + ReportRouteStatus.main(new String[]{path}); + } + + @Test + public void testReportRouteStatus() { + Design design = RapidWrightDCP.loadDCP("optical-flow.dcp"); + DesignTools.createMissingSitePinInsts(design); + ReportRouteStatusResult rrs = ReportRouteStatus.reportRouteStatus(design); + Assertions.assertEquals(-1, rrs.logicalNets); + Assertions.assertEquals(58863, rrs.routableNets); + Assertions.assertEquals(58863, rrs.unroutedNets); + Assertions.assertEquals(0, rrs.netsWithRoutingErrors); + } +} From 3edd3171b8876b55607a026d97947efbcf9f2489 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 23 Oct 2024 20:29:14 -0700 Subject: [PATCH 5/7] Populate ReportRouteStatusResult.logicalNets Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/util/ReportRouteStatus.java | 14 +++++++------- .../rapidwright/util/ReportRouteStatusResult.java | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/com/xilinx/rapidwright/util/ReportRouteStatus.java b/src/com/xilinx/rapidwright/util/ReportRouteStatus.java index 4392547db..228d28dd1 100644 --- a/src/com/xilinx/rapidwright/util/ReportRouteStatus.java +++ b/src/com/xilinx/rapidwright/util/ReportRouteStatus.java @@ -30,6 +30,7 @@ import com.xilinx.rapidwright.device.PIP; import com.xilinx.rapidwright.rwroute.RouterHelper; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -53,8 +54,10 @@ public static ReportRouteStatusResult reportRouteStatus(Design design) { Map nodesUsedByDesign = new HashMap<>(); Set conflictingNets = new HashSet<>(); - for (Net net : design.getNets()) { + Collection nets = design.getNets(); + for (Net net : nets) { if (!RouterHelper.isRoutableNetWithSourceSinks(net)) { + rrs.netsNotNeedingRouting++; continue; } rrs.routableNets++; @@ -90,9 +93,7 @@ public static ReportRouteStatusResult reportRouteStatus(Design design) { } } - // Since we do not analyze logical nets, set it to -1 - rrs.logicalNets = -1; - + rrs.logicalNets = nets.size(); rrs.netsWithResourceConflicts = conflictingNets.size(); rrs.netsWithRoutingErrors = rrs.netsWithSomeUnroutedPins + rrs.netsWithResourceConflicts; rrs.fullyRoutedNets = rrs.routableNets - rrs.unroutedNets - rrs.netsWithRoutingErrors; @@ -113,13 +114,12 @@ public static void main(String[] args) { // Print out the result in Vivado's style -- note that this analysis differs from Vivado in that // only physical nets are examined. - int numPhysicalNets = design.getNets().size(); System.out.println(); System.out.println("RapidWright Design Route Status"); System.out.println(" : # nets :"); System.out.println(" ------------------------------------------- : ----------- :"); - System.out.printf (" # of physical nets......................... : %11d :\n", numPhysicalNets); - System.out.printf (" # of nets not needing routing.......... : %11d :\n", numPhysicalNets - rrs.routableNets); + System.out.printf (" # of physical nets......................... : %11d :\n", rrs.logicalNets); + System.out.printf (" # of nets not needing routing.......... : %11d :\n", rrs.netsNotNeedingRouting); System.out.printf (" # of routable nets..................... : %11d :\n", rrs.routableNets); System.out.printf (" # of unrouted nets................. : %11d :\n", rrs.unroutedNets); System.out.printf (" # of fully routed nets............. : %11d :\n", rrs.fullyRoutedNets); diff --git a/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java b/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java index 871190bdf..7024a39b1 100644 --- a/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java +++ b/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java @@ -77,7 +77,7 @@ public ReportRouteStatusResult(List log) { } public boolean isFullyRouted() { - return logicalNets != 0 && unroutedNets == 0 && netsWithRoutingErrors == 0; + return logicalNets > 0 && unroutedNets == 0 && netsWithRoutingErrors == 0; } } From bc2f65aafdeb3c3accbaa1214b9829c5bd62c89a Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 23 Oct 2024 20:47:47 -0700 Subject: [PATCH 6/7] Address review comments Signed-off-by: Eddie Hung --- .../rapidwright/util/ReportRouteStatus.java | 16 +------- .../util/ReportRouteStatusResult.java | 37 +++++++++++++++++++ .../util/TestReportRouteStatus.java | 6 +-- 3 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/com/xilinx/rapidwright/util/ReportRouteStatus.java b/src/com/xilinx/rapidwright/util/ReportRouteStatus.java index 228d28dd1..84a270211 100644 --- a/src/com/xilinx/rapidwright/util/ReportRouteStatus.java +++ b/src/com/xilinx/rapidwright/util/ReportRouteStatus.java @@ -56,7 +56,7 @@ public static ReportRouteStatusResult reportRouteStatus(Design design) { Collection nets = design.getNets(); for (Net net : nets) { - if (!RouterHelper.isRoutableNetWithSourceSinks(net)) { + if (!net.isStaticNet() && !RouterHelper.isRoutableNetWithSourceSinks(net)) { rrs.netsNotNeedingRouting++; continue; } @@ -115,19 +115,7 @@ public static void main(String[] args) { // Print out the result in Vivado's style -- note that this analysis differs from Vivado in that // only physical nets are examined. System.out.println(); - System.out.println("RapidWright Design Route Status"); - System.out.println(" : # nets :"); - System.out.println(" ------------------------------------------- : ----------- :"); - System.out.printf (" # of physical nets......................... : %11d :\n", rrs.logicalNets); - System.out.printf (" # of nets not needing routing.......... : %11d :\n", rrs.netsNotNeedingRouting); - System.out.printf (" # of routable nets..................... : %11d :\n", rrs.routableNets); - System.out.printf (" # of unrouted nets................. : %11d :\n", rrs.unroutedNets); - System.out.printf (" # of fully routed nets............. : %11d :\n", rrs.fullyRoutedNets); - System.out.printf (" # of nets with routing errors.......... : %11d :\n", rrs.netsWithRoutingErrors); - System.out.printf (" # of nets with some unrouted pins.. : %11d :\n", rrs.netsWithSomeUnroutedPins); - System.out.printf (" # of nets with resource conflicts.. : %11d :\n", rrs.netsWithResourceConflicts); - System.out.println(" ------------------------------------------- : ----------- :"); - + System.out.println(rrs.toString("RapidWright ")); if (!rrs.isFullyRouted()) { throw new RuntimeException("Design is not fully routed"); } diff --git a/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java b/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java index 7024a39b1..34aa3ba39 100644 --- a/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java +++ b/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java @@ -80,4 +80,41 @@ public boolean isFullyRouted() { return logicalNets > 0 && unroutedNets == 0 && netsWithRoutingErrors == 0; } + @Override + public String toString() { + return toString(""); + } + + public String toString(String prefix) { + StringBuilder sb = new StringBuilder(); + sb.append(String.format("%sDesign Route Status\n", prefix)); + sb.append(" : # nets :\n"); + sb.append(" ------------------------------------------- : ----------- :\n"); + sb.append(String.format(" # of physical nets......................... : %11d :\n", logicalNets)); + sb.append(String.format(" # of nets not needing routing.......... : %11d :\n", netsNotNeedingRouting)); + if (internallyRoutedNets > 0) { + sb.append(String.format(" # of internally routed nets........ : %11d :\n", internallyRoutedNets)); + } + if (netsWithNoLoads > 0) { + sb.append(String.format(" # of nets with no loads............ : %11d :\n", netsWithNoLoads)); + } + if (implicitlyRoutedPorts > 0) { + sb.append(String.format(" # of implicitly routed ports....... : %11d :\n", implicitlyRoutedPorts)); + } + sb.append(String.format(" # of routable nets..................... : %11d :\n", routableNets)); + if (unroutedNets > 0) { + sb.append(String.format(" # of unrouted nets................. : %11d :\n", unroutedNets)); + } + sb.append(String.format(" # of fully routed nets............. : %11d :\n", fullyRoutedNets)); + sb.append(String.format(" # of nets with routing errors.......... : %11d :\n", netsWithRoutingErrors)); + if (netsWithSomeUnroutedPins > 0) { + sb.append(String.format(" # of nets with some unrouted pins.. : %11d :\n", netsWithSomeUnroutedPins)); + } + if (netsWithResourceConflicts > 0) { + sb.append(String.format(" # of nets with resource conflicts.. : %11d :\n", netsWithResourceConflicts)); + } + sb.append(" ------------------------------------------- : ----------- :\n"); + return sb.toString(); + } + } diff --git a/test/src/com/xilinx/rapidwright/util/TestReportRouteStatus.java b/test/src/com/xilinx/rapidwright/util/TestReportRouteStatus.java index 973d3da72..2b67bf4bf 100644 --- a/test/src/com/xilinx/rapidwright/util/TestReportRouteStatus.java +++ b/test/src/com/xilinx/rapidwright/util/TestReportRouteStatus.java @@ -40,9 +40,9 @@ public void testReportRouteStatus() { Design design = RapidWrightDCP.loadDCP("optical-flow.dcp"); DesignTools.createMissingSitePinInsts(design); ReportRouteStatusResult rrs = ReportRouteStatus.reportRouteStatus(design); - Assertions.assertEquals(-1, rrs.logicalNets); - Assertions.assertEquals(58863, rrs.routableNets); - Assertions.assertEquals(58863, rrs.unroutedNets); + Assertions.assertEquals(185996, rrs.logicalNets); + Assertions.assertEquals(58865, rrs.routableNets); + Assertions.assertEquals(58865, rrs.unroutedNets); Assertions.assertEquals(0, rrs.netsWithRoutingErrors); } } From 1a7f216b8b1b5ae74b9441f61d91773c7acc7301 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Thu, 24 Oct 2024 10:57:34 -0700 Subject: [PATCH 7/7] Tidy up Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/util/ReportRouteStatus.java | 4 +--- .../rapidwright/util/ReportRouteStatusResult.java | 11 ++++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/com/xilinx/rapidwright/util/ReportRouteStatus.java b/src/com/xilinx/rapidwright/util/ReportRouteStatus.java index 84a270211..74cf22f43 100644 --- a/src/com/xilinx/rapidwright/util/ReportRouteStatus.java +++ b/src/com/xilinx/rapidwright/util/ReportRouteStatus.java @@ -112,10 +112,8 @@ public static void main(String[] args) { ReportRouteStatusResult rrs = reportRouteStatus(design); - // Print out the result in Vivado's style -- note that this analysis differs from Vivado in that - // only physical nets are examined. System.out.println(); - System.out.println(rrs.toString("RapidWright ")); + System.out.println(rrs.toString("RapidWright Design Route Status")); if (!rrs.isFullyRouted()) { throw new RuntimeException("Design is not fully routed"); } diff --git a/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java b/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java index 34aa3ba39..0c3ee8228 100644 --- a/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java +++ b/src/com/xilinx/rapidwright/util/ReportRouteStatusResult.java @@ -82,15 +82,16 @@ public boolean isFullyRouted() { @Override public String toString() { - return toString(""); + return toString("Design Route Status"); } - public String toString(String prefix) { + public String toString(String title) { StringBuilder sb = new StringBuilder(); - sb.append(String.format("%sDesign Route Status\n", prefix)); + sb.append(title); + sb.append("\n"); sb.append(" : # nets :\n"); sb.append(" ------------------------------------------- : ----------- :\n"); - sb.append(String.format(" # of physical nets......................... : %11d :\n", logicalNets)); + sb.append(String.format(" # of logical nets.......................... : %11d :\n", logicalNets)); sb.append(String.format(" # of nets not needing routing.......... : %11d :\n", netsNotNeedingRouting)); if (internallyRoutedNets > 0) { sb.append(String.format(" # of internally routed nets........ : %11d :\n", internallyRoutedNets)); @@ -113,7 +114,7 @@ public String toString(String prefix) { if (netsWithResourceConflicts > 0) { sb.append(String.format(" # of nets with resource conflicts.. : %11d :\n", netsWithResourceConflicts)); } - sb.append(" ------------------------------------------- : ----------- :\n"); + sb.append(" ------------------------------------------- : ----------- :"); return sb.toString(); }