From 435152a03c734d10fa41b606b0575c797cc3a922 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 11:35:29 -0800 Subject: [PATCH 01/41] [IntentCode] Add isVersalCnode() helper method Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/device/IntentCode.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/com/xilinx/rapidwright/device/IntentCode.java b/src/com/xilinx/rapidwright/device/IntentCode.java index 4e92c8726..e68f6306d 100644 --- a/src/com/xilinx/rapidwright/device/IntentCode.java +++ b/src/com/xilinx/rapidwright/device/IntentCode.java @@ -164,6 +164,10 @@ public boolean isVersalClocking() { NODE_GLOBAL_GCLK == this || NODE_GLOBAL_LEAF == this || NODE_GLOBAL_BUFG == this; } + public boolean isVersalCnode() { + return NODE_CLE_CNODE == this || NODE_INTF_CNODE == this; + } + private static final int SERIES7_START_IDX = 23; private static final int SERIES7_END_IDX = SERIES7_START_IDX + 33 - 1; From 76b0ba98d6cef02a973b9f25762053221fc3f9b7 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 11:36:53 -0800 Subject: [PATCH 02/41] [GlobalSignalRouting] Allow INTF CNODEs, all CNODEs even if reserved Signed-off-by: Eddie Hung --- .../rwroute/GlobalSignalRouting.java | 23 +++++++++++-------- .../xilinx/rapidwright/rwroute/RWRoute.java | 9 +++++--- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java b/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java index f5dc73cf4..df1a26faf 100644 --- a/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java +++ b/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java @@ -506,15 +506,6 @@ public static void routeStaticNet(List pins, } IntentCode uphillIntentCode = uphillNode.getIntentCode(); - if (uphillIntentCode == IntentCode.NODE_CLE_CNODE && intentCode != IntentCode.NODE_CLE_CTRL) { - assert(isVersal); - // Only allow PIPs from NODE_CLE_CNODE to NODE_CLE_CTRL intent codes - // (NODE_CLE_NODEs can also be used to re-enter the INT tile --- do not allow this - // so that these precious resources are not consumed by the static router thereby - // blocking the signal router from using them) - continue; - } - switch(uphillIntentCode) { case NODE_GLOBAL_VDISTR: case NODE_GLOBAL_HROUTE: @@ -531,6 +522,20 @@ public static void routeStaticNet(List pins, case NODE_VLONG7: case NODE_VLONG12: continue; + case NODE_CLE_CNODE: + // Only allow PIPs from NODE_{CLE,INTF}_CNODE to NODE_{CLE,INTF}_CTRL intent codes + // (NODE_CLE_NODEs can also be used to re-enter the INT tile --- do not allow this + // so that these precious resources are not consumed by the static router thereby + // blocking the signal router from using them) + if (intentCode != IntentCode.NODE_CLE_CTRL) { + continue; + } + break; + case NODE_INTF_CNODE: + if (intentCode != IntentCode.NODE_INTF_CTRL) { + continue; + } + break; // VCC net should never need to use S/D/Q nodes ... case NODE_SINGLE: diff --git a/src/com/xilinx/rapidwright/rwroute/RWRoute.java b/src/com/xilinx/rapidwright/rwroute/RWRoute.java index c533c14af..09e26b087 100644 --- a/src/com/xilinx/rapidwright/rwroute/RWRoute.java +++ b/src/com/xilinx/rapidwright/rwroute/RWRoute.java @@ -458,9 +458,12 @@ protected NodeStatus getGlobalRoutingNodeStatus(Net net, Node node) { RouteNode rnode = routingGraph.getNode(node); if (rnode != null) { - // A RouteNode will only be created if the net is necessary for - // a to-be-routed connection - return NodeStatus.UNAVAILABLE; + if (rnode.getType() != RouteNodeType.LOCAL_RESERVED) { + // Typically a RouteNode will only be created if the net is necessary for + // a to-be-routed connection + return NodeStatus.UNAVAILABLE; + } + assert(routingGraph.isVersal && rnode.getIntentCode().isVersalCnode()); } return NodeStatus.AVAILABLE; } From 71740fe8b4d4adb413586110fa209e4bbc863cd5 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 12:19:48 -0800 Subject: [PATCH 03/41] Revert "[IntentCode] Add isVersalCnode() helper method" This reverts commit 435152a03c734d10fa41b606b0575c797cc3a922. Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/device/IntentCode.java | 4 ---- src/com/xilinx/rapidwright/rwroute/RWRoute.java | 9 +++------ 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/com/xilinx/rapidwright/device/IntentCode.java b/src/com/xilinx/rapidwright/device/IntentCode.java index e68f6306d..4e92c8726 100644 --- a/src/com/xilinx/rapidwright/device/IntentCode.java +++ b/src/com/xilinx/rapidwright/device/IntentCode.java @@ -164,10 +164,6 @@ public boolean isVersalClocking() { NODE_GLOBAL_GCLK == this || NODE_GLOBAL_LEAF == this || NODE_GLOBAL_BUFG == this; } - public boolean isVersalCnode() { - return NODE_CLE_CNODE == this || NODE_INTF_CNODE == this; - } - private static final int SERIES7_START_IDX = 23; private static final int SERIES7_END_IDX = SERIES7_START_IDX + 33 - 1; diff --git a/src/com/xilinx/rapidwright/rwroute/RWRoute.java b/src/com/xilinx/rapidwright/rwroute/RWRoute.java index 09e26b087..c533c14af 100644 --- a/src/com/xilinx/rapidwright/rwroute/RWRoute.java +++ b/src/com/xilinx/rapidwright/rwroute/RWRoute.java @@ -458,12 +458,9 @@ protected NodeStatus getGlobalRoutingNodeStatus(Net net, Node node) { RouteNode rnode = routingGraph.getNode(node); if (rnode != null) { - if (rnode.getType() != RouteNodeType.LOCAL_RESERVED) { - // Typically a RouteNode will only be created if the net is necessary for - // a to-be-routed connection - return NodeStatus.UNAVAILABLE; - } - assert(routingGraph.isVersal && rnode.getIntentCode().isVersalCnode()); + // A RouteNode will only be created if the net is necessary for + // a to-be-routed connection + return NodeStatus.UNAVAILABLE; } return NodeStatus.AVAILABLE; } From bc247dc776ea1b42993b83e9d840cc8c27de8e44 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 12:22:25 -0800 Subject: [PATCH 04/41] Move Versal {B,C}NODE heuristic from determineRoutingTargets() to initializeRouting(), which is after route{GlobalClock,Static}Nets() Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/rwroute/RWRoute.java | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/com/xilinx/rapidwright/rwroute/RWRoute.java b/src/com/xilinx/rapidwright/rwroute/RWRoute.java index c533c14af..acba903d4 100644 --- a/src/com/xilinx/rapidwright/rwroute/RWRoute.java +++ b/src/com/xilinx/rapidwright/rwroute/RWRoute.java @@ -326,32 +326,6 @@ protected void determineRoutingTargets() { // Wait for all outstanding RouteNodeGraph.preserveAsync() calls to complete routingGraph.awaitPreserve(); - - // On Versal only, reserve all uphills of NODE_(CLE|INTF)_CTRL sinks since - // their [BC]NODEs can also be used to reach NODE_INODEs --- not applying this - // heuristic can lead to avoidable congestion - if (routingGraph.isVersal) { - for (Connection connection : indirectConnections) { - RouteNode sinkRnode = connection.getSinkRnode(); - if (sinkRnode.getType() == RouteNodeType.EXCLUSIVE_SINK_BOTH) { - for (Node uphill : sinkRnode.getAllUphillNodes()) { - if (uphill.isTiedToVcc()) { - continue; - } - Net preservedNet = routingGraph.getPreservedNet(uphill); - if (preservedNet != null && preservedNet != connection.getNet()) { - continue; - } - assert((sinkRnode.getIntentCode() == IntentCode.NODE_CLE_CTRL && - (uphill.getIntentCode() == IntentCode.NODE_CLE_CNODE || uphill.getIntentCode() == IntentCode.NODE_CLE_BNODE)) || - (sinkRnode.getIntentCode() == IntentCode.NODE_INTF_CTRL && - (uphill.getIntentCode() == IntentCode.NODE_INTF_CNODE || uphill.getIntentCode() == IntentCode.NODE_INTF_BNODE))); - RouteNode rnode = routingGraph.getOrCreate(uphill, RouteNodeType.LOCAL_RESERVED); - rnode.setType(RouteNodeType.LOCAL_RESERVED); - } - } - } - } } private void categorizeNets() { @@ -804,6 +778,32 @@ private void initializeRouting() { oneMinusTimingWeight = 1 - timingWeight; oneMinusWlWeight = 1 - wlWeight; printIterationHeader(config.isTimingDriven()); + + // On Versal only, reserve all uphills of NODE_(CLE|INTF)_CTRL sinks since + // their [BC]NODEs can also be used to reach NODE_INODEs --- not applying this + // heuristic can lead to avoidable congestion + if (routingGraph.isVersal) { + for (Connection connection : indirectConnections) { + RouteNode sinkRnode = connection.getSinkRnode(); + if (sinkRnode.getType() == RouteNodeType.EXCLUSIVE_SINK_BOTH) { + for (Node uphill : sinkRnode.getAllUphillNodes()) { + if (uphill.isTiedToVcc()) { + continue; + } + Net preservedNet = routingGraph.getPreservedNet(uphill); + if (preservedNet != null && preservedNet != connection.getNet()) { + continue; + } + assert((sinkRnode.getIntentCode() == IntentCode.NODE_CLE_CTRL && + (uphill.getIntentCode() == IntentCode.NODE_CLE_CNODE || uphill.getIntentCode() == IntentCode.NODE_CLE_BNODE)) || + (sinkRnode.getIntentCode() == IntentCode.NODE_INTF_CTRL && + (uphill.getIntentCode() == IntentCode.NODE_INTF_CNODE || uphill.getIntentCode() == IntentCode.NODE_INTF_BNODE))); + RouteNode rnode = routingGraph.getOrCreate(uphill, RouteNodeType.LOCAL_RESERVED); + rnode.setType(RouteNodeType.LOCAL_RESERVED); + } + } + } + } } /** From 91cbe035e1302a6cbd2447e8c8d88aefa8e6bc42 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 12:26:06 -0800 Subject: [PATCH 05/41] [RouterHelper] invertPossibleGndPinsToVccPins() exception for DSP58 Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/rwroute/RouterHelper.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java index 1f61cf225..99e4eec5c 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java +++ b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java @@ -53,6 +53,7 @@ import com.xilinx.rapidwright.device.Node; import com.xilinx.rapidwright.device.PIP; import com.xilinx.rapidwright.device.Series; +import com.xilinx.rapidwright.device.SiteTypeEnum; import com.xilinx.rapidwright.device.Tile; import com.xilinx.rapidwright.device.TileTypeEnum; import com.xilinx.rapidwright.edif.EDIFHierCellInst; @@ -410,7 +411,11 @@ public static Set invertPossibleGndPinsToVccPins(Design design, } else { BELPin[] belPins = si.getSiteWirePins(siteWireName); if (belPins.length != 2) { - continue; + if (belPins.length == 3 && si.getSiteTypeEnum() == SiteTypeEnum.DSP58 && siteWireName.equals("RSTD")) { + assert(belPins[1].toString().equals("SRCMXINV.RSTAD_UNUSED")); + } else { + continue; + } } for (BELPin belPin : belPins) { if (belPin.isSitePort()) { From 658a7a4d4a4e01e2404f1515f22a35786814fea6 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 12:47:05 -0800 Subject: [PATCH 06/41] [DesignTools] getAllRoutedSitePinsFromPhysicalPin() handle SLICE_FF_CLK_MOD Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/design/DesignTools.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/com/xilinx/rapidwright/design/DesignTools.java b/src/com/xilinx/rapidwright/design/DesignTools.java index 54d747d44..88fdbe2da 100644 --- a/src/com/xilinx/rapidwright/design/DesignTools.java +++ b/src/com/xilinx/rapidwright/design/DesignTools.java @@ -2296,11 +2296,19 @@ public static List getAllRoutedSitePinsFromPhysicalPin(Cell cell, Net ne } else if (bel.isLUT() || bel.getBELType().endsWith("MUX") || // F[789]MUX // Versal + bel.isSliceFFClkMod() || bel.getName().endsWith("_IMR")) { Cell possibleRouteThru = inst.getCell(bel); - if (possibleRouteThru != null && possibleRouteThru.isRoutethru()) { - String routeThru = possibleRouteThru.getPinMappingsP2L().keySet().iterator().next(); - queue.add(bel.getPin(routeThru)); + if (possibleRouteThru == null) { + BELPin clkBelPin = bel.isSliceFFClkMod() ? bel.getPin("CLK") : null; + if (clkBelPin != null && inst.getNetFromSiteWire(clkBelPin.getSiteWireName()) == net) { + queue.add(clkBelPin); + } + } else { + if (possibleRouteThru.isRoutethru()) { + String routeThru = possibleRouteThru.getPinMappingsP2L().keySet().iterator().next(); + queue.add(bel.getPin(routeThru)); + } } } } From 3427a33eff1ac38c7306b957a33343bf9d766fa4 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 13:48:58 -0800 Subject: [PATCH 07/41] [DesignTools] getAllRoutedSitePinsFromPhysicalPin() to handle DSP_CAS_DELAY Signed-off-by: Eddie Hung --- .../rapidwright/design/DesignTools.java | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/com/xilinx/rapidwright/design/DesignTools.java b/src/com/xilinx/rapidwright/design/DesignTools.java index 88fdbe2da..34528051b 100644 --- a/src/com/xilinx/rapidwright/design/DesignTools.java +++ b/src/com/xilinx/rapidwright/design/DesignTools.java @@ -2317,20 +2317,40 @@ public static List getAllRoutedSitePinsFromPhysicalPin(Cell cell, Net ne if (!siteWires.contains(sink.getSiteWireName())) continue; if (sink.isSitePort()) { sitePins.add(sink.getName()); - } else if (sink.getBEL().getBELClass() == BELClass.RBEL) { + continue; + } + BEL bel = sink.getBEL(); + if (bel.getBELClass() == BELClass.RBEL) { // Check if the SitePIP is being used - SitePIP sitePIP = inst.getUsedSitePIP(sink.getBELName()); - if (sitePIP == null) continue; - // Don't proceed if it's configured for a different pin - if (!sitePIP.getInputPinName().equals(sink.getName())) continue; + SitePIP sitePIP = inst.getUsedSitePIP(sink); + if (sitePIP == null) { + continue; + } + assert(sitePIP.getInputPinName().equals(sink.getName())); // Make this the new source to search from and keep looking... queue.add(sitePIP.getOutputPin()); - } else if (sink.getBEL().isFF()) { + } else if (bel.isFF()) { // FF pass thru option (not a site PIP) - siteWireName = sink.getBEL().getPin("Q").getSiteWireName(); + siteWireName = bel.getPin("Q").getSiteWireName(); if (siteWires.contains(siteWireName)) { sitePins.add(siteWireName); } + } else if (bel.getBELType().equals("DSP_CAS_DELAY")) { + // Versal only + SitePIP sitePIP = inst.getUsedSitePIP(sink); + if (sitePIP == null) { + continue; + } + assert(sitePIP.getInputPinName().equals(sink.getName())); + // For an unknown reason, it appears that the sitewire is not painted correctly ... + // Make this the new source to search from and keep looking... + // queue.add(sitePIP.getOutputPin()); + // ... so assume it is and workaround + BELPin source = sitePIP.getOutputPin(); + assert(source.getSiteConns().size() == 1); + BELPin port = source.getSiteConns().get(0); + assert(port.isSitePort()); + sitePins.add(port.getName()); } } } @@ -3378,14 +3398,16 @@ public static void createCeSrRstPinsToVCC(Design design) { Net net = si.getNetFromSiteWire(sitePinName); if (net != null) { if (belPinName == CE) { + if (!net.isVCCNet()) { + continue; + } // CE: it is possible for sitewire to be assigned to a non VCC net, but a SitePinInst to not yet exist - assert(!net.isVCCNet()); - continue; } else { - // SR: it is possible for sitewire to be assigned the GND net, yet still be routed to VCC + assert(belPinName == SR); if (!net.isStaticNet()) { continue; } + // SR: it is possible for sitewire to be assigned the GND net, yet still be routed to VCC } } From eeae81d0df4f39f37c413f55911716172d3cb253 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 15:49:20 -0800 Subject: [PATCH 08/41] [CUFR] CUFR and PartialCUFR to default to --hus Emit warning if not enabled Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/rwroute/CUFR.java | 28 +++++++++- .../rapidwright/rwroute/PartialCUFR.java | 51 +++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/com/xilinx/rapidwright/rwroute/CUFR.java b/src/com/xilinx/rapidwright/rwroute/CUFR.java index 208776f7b..6bc362292 100644 --- a/src/com/xilinx/rapidwright/rwroute/CUFR.java +++ b/src/com/xilinx/rapidwright/rwroute/CUFR.java @@ -163,7 +163,28 @@ protected void routeIndirectConnections(Collection connections) { } /** - * Routes a {@link Design} instance. + * Routes a design in the full timing-driven routing mode using CUFR. + * @param design The {@link Design} instance to be routed. + */ + public static Design routeDesignFullTimingDriven(Design design) { + return routeDesignWithUserDefinedArguments(design, new String[] { + "--hus" + }); + } + + /** + * Routes a design in the full non-timing-driven routing mode using CUFR. + * @param design The {@link Design} instance to be routed. + */ + public static Design routeDesignFullNonTimingDriven(Design design) { + return routeDesignWithUserDefinedArguments(design, new String[] { + "--hus", + "--nonTimingDriven" + }); + } + + /** + * Routes a {@link Design} instance using CUFR. * @param design The {@link Design} instance to be routed. * @param args An array of string arguments, can be null. * If null, the design will be routed in the full timing-driven routing mode with default a {@link RWRouteConfig} instance. @@ -174,6 +195,11 @@ public static Design routeDesignWithUserDefinedArguments(Design design, String[] // Instantiates a RWRouteConfig Object and parses the arguments. // Uses the default configuration if basic usage only. RWRouteConfig config = new RWRouteConfig(args); + + if (!config.isHus()) { + System.err.println("WARNING: Hybrid Updating Strategy (HUS) is not enabled."); + } + return routeDesign(design, new CUFR(design, config)); } diff --git a/src/com/xilinx/rapidwright/rwroute/PartialCUFR.java b/src/com/xilinx/rapidwright/rwroute/PartialCUFR.java index 0d70a3965..2f435d0f9 100644 --- a/src/com/xilinx/rapidwright/rwroute/PartialCUFR.java +++ b/src/com/xilinx/rapidwright/rwroute/PartialCUFR.java @@ -151,6 +151,53 @@ protected void printRoutingStatistics() { super.printRoutingStatistics(); } + /** + * Routes a design in the partial non-timing-driven routing mode. + * @param design The {@link Design} instance to be routed. + * @param pinsToRoute Collection of {@link SitePinInst}-s to be routed. If null, route all unrouted pins in the design. + */ + public static Design routeDesignPartialNonTimingDriven(Design design, Collection pinsToRoute) { + boolean softPreserve = false; + return routeDesignPartialNonTimingDriven(design, pinsToRoute, softPreserve); + } + + /** + * Routes a design in the partial non-timing-driven routing mode using CUFR. + * @param design The {@link Design} instance to be routed. + * @param pinsToRoute Collection of {@link SitePinInst}-s to be routed. If null, route all unrouted pins in the design. + * @param softPreserve Allow routed nets to be unrouted and subsequently rerouted in order to improve routability. + */ + public static Design routeDesignPartialNonTimingDriven(Design design, Collection pinsToRoute, boolean softPreserve) { + return routeDesignWithUserDefinedArguments(design, new String[] { + "--hus", + "--fixBoundingBox", + // use U-turn nodes and no masking of nodes cross RCLK + // Pros: maximum routability + // Con: might result in delay optimism and a slight increase in runtime + "--useUTurnNodes", + "--nonTimingDriven", + "--verbose"}, + pinsToRoute, softPreserve); + } + + /** + * Routes a design in the partial timing-driven routing mode using CUFR. + * @param design The {@link Design} instance to be routed. + * @param pinsToRoute Collection of {@link SitePinInst}-s to be routed. If null, route all unrouted pins in the design. + * @param softPreserve Allow routed nets to be unrouted and subsequently rerouted in order to improve routability. + */ + public static Design routeDesignPartialTimingDriven(Design design, Collection pinsToRoute, boolean softPreserve) { + return routeDesignWithUserDefinedArguments(design, new String[] { + "--hus", + "--fixBoundingBox", + // use U-turn nodes and no masking of nodes cross RCLK + // Pros: maximum routability + // Con: might result in delay optimism and a slight increase in runtime + "--useUTurnNodes", + "--verbose"}, + pinsToRoute, softPreserve); + } + /** * Partially routes a {@link Design} instance; specifically, all nets with no routing PIPs already present. * @param design The {@link Design} instance to be routed. @@ -194,6 +241,10 @@ public static Design routeDesignWithUserDefinedArguments(Design design, System.out.println("WARNING: Masking nodes across RCLK for partial routing could result in routability problems."); } + if (!config.isHus()) { + System.err.println("WARNING: Hybrid Updating Strategy (HUS) is not enabled."); + } + return routeDesign(design, new PartialCUFR(design, config, pinsToRoute, softPreserve)); } From 618f1cea085c54c5e9aa9c3c2425c48729e660dc Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 16:01:35 -0800 Subject: [PATCH 09/41] [RouterHelper] invertPossibleGndPinsToVccPins() to invert Versal BRAM.CLK Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/rwroute/RouterHelper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java index 99e4eec5c..9ca2569d1 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java +++ b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java @@ -412,6 +412,7 @@ public static Set invertPossibleGndPinsToVccPins(Design design, BELPin[] belPins = si.getSiteWirePins(siteWireName); if (belPins.length != 2) { if (belPins.length == 3 && si.getSiteTypeEnum() == SiteTypeEnum.DSP58 && siteWireName.equals("RSTD")) { + assert(isVersal); assert(belPins[1].toString().equals("SRCMXINV.RSTAD_UNUSED")); } else { continue; @@ -426,7 +427,8 @@ public static Set invertPossibleGndPinsToVccPins(Design design, } // Emulate Vivado's behaviour and do not invert CLK* site pins if (Utils.isBRAM(spi.getSiteInst()) && - belPin.getBELName().startsWith("CLK")) { + belPin.getBELName().startsWith("CLK") && + !isVersal) { continue; } toInvertPins.add(spi); From 4e45bc0e788b17ed837aee70ed9ecda596ddebcc Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 20:06:55 -0800 Subject: [PATCH 10/41] [RouterHelper] invertPossibleGndPinsToVccPins() to use correct sitewire Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/rwroute/RouterHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java index 9ca2569d1..4eea6d50d 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java +++ b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java @@ -351,7 +351,7 @@ public static Set invertPossibleGndPinsToVccPins(Design design, } Collection connectedCells = DesignTools.getConnectedCells(spiBelPin, si); if (connectedCells.isEmpty()) { - for (BELPin belPin : si.getSiteWirePins(siteWireName)) { + for (BELPin belPin : si.getSiteWirePins(spiBelPin.getSiteWireName())) { if (belPin.isSitePort()) { continue; } From ffded937a35b5795ee01c6ae2fb63d7277d4c8e7 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 20:35:48 -0800 Subject: [PATCH 11/41] [DesignTools] createA1A6ToStaticNets() to handle SRL16s on LUT5+6 Signed-off-by: Eddie Hung --- .../rapidwright/design/DesignTools.java | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/com/xilinx/rapidwright/design/DesignTools.java b/src/com/xilinx/rapidwright/design/DesignTools.java index 34528051b..d8bc6b769 100644 --- a/src/com/xilinx/rapidwright/design/DesignTools.java +++ b/src/com/xilinx/rapidwright/design/DesignTools.java @@ -3272,7 +3272,24 @@ public static void createA1A6ToStaticNets(Design design) { } String belName = bel.getName(); - if ("SRL16E".equals(cell.getType()) || "SRLC32E".equals(cell.getType())) { + char fiveOrSix = belName.charAt(1); + if (fiveOrSix == '5') { + // Assume that only 5LUT can use O5 + assert(cell.getLogicalPinMapping("O5") != null); + if (LUTTools.getCompanionLUTCell(cell) != null) { + // 5LUT is used, but 6LUT also exists; let the 6LUT deal with things + continue; + } + } else { + assert(fiveOrSix == '6'); + + if (cell.getLogicalPinMapping("A6") != null) { + // A6 pin is being used by LUT + continue; + } + } + + if (("SRL16E".equals(cell.getType())) || "SRLC32E".equals(cell.getType())) { String pinName = belName.charAt(0) + "1"; SitePinInst spi = si.getSitePinInst(pinName); if (spi != null) { @@ -3282,15 +3299,7 @@ public static void createA1A6ToStaticNets(Design design) { vccNet.createPin(pinName, si); } - if (cell.getLogicalPinMapping("A6") != null) { - // A6 pin is being used by LUT - continue; - } - - char fiveOrSix = belName.charAt(1); - assert(fiveOrSix == '5' || fiveOrSix == '6'); Net staticNet = vccNet; - BEL lut6Bel = (fiveOrSix == '5') ? si.getBEL(belName.charAt(0) + "6LUT") : bel; Net a6Net = si.getNetFromSiteWire(lut6Bel.getPin("A6").getSiteWireName()); @@ -3310,15 +3319,7 @@ public static void createA1A6ToStaticNets(Design design) { if (cell.getLogicalPinMapping("O5") != null) { // LUT output comes out on O5 - if (fiveOrSix == '5') { - // It's a 5LUT - if (si.getCell(belName.charAt(0) + "6LUT") != null) { - // But 6LUT exists; let the 6LUT deal with it - continue; - } - } else { - throw new RuntimeException("Assumption that only 5LUTs can use O5 failed here."); - } + assert(fiveOrSix == '5'); } else { if (fiveOrSix != '6') { // Assume that O6 is only driven by 6LUT, even though possible for 5LUT, unless @@ -3326,7 +3327,6 @@ public static void createA1A6ToStaticNets(Design design) { assert (cell.isRoutethru()); continue; } - assert(fiveOrSix == '6'); } From 69365c3d78e8e51ea10e2126852db0e0afedc27e Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 23:42:16 -0800 Subject: [PATCH 12/41] Fix DesignTools.createA1A6ToStaticNets() Signed-off-by: Eddie Hung --- .../rapidwright/design/DesignTools.java | 57 ++++++++++++------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/src/com/xilinx/rapidwright/design/DesignTools.java b/src/com/xilinx/rapidwright/design/DesignTools.java index d8bc6b769..1de9b7ec1 100644 --- a/src/com/xilinx/rapidwright/design/DesignTools.java +++ b/src/com/xilinx/rapidwright/design/DesignTools.java @@ -3275,7 +3275,7 @@ public static void createA1A6ToStaticNets(Design design) { char fiveOrSix = belName.charAt(1); if (fiveOrSix == '5') { // Assume that only 5LUT can use O5 - assert(cell.getLogicalPinMapping("O5") != null); + assert(cell.getLogicalPinMapping("O5") != null || cell.isRoutethru()); if (LUTTools.getCompanionLUTCell(cell) != null) { // 5LUT is used, but 6LUT also exists; let the 6LUT deal with things continue; @@ -3283,40 +3283,53 @@ public static void createA1A6ToStaticNets(Design design) { } else { assert(fiveOrSix == '6'); - if (cell.getLogicalPinMapping("A6") != null) { - // A6 pin is being used by LUT - continue; + if ("SRLC32E".equals(cell.getType())) { + // For SRLC32Es, only the A1 needs to be tied to VCC + String pinName = belName.charAt(0) + "1"; + SitePinInst spi = si.getSitePinInst(pinName); + if (spi == null) { + vccNet.createPin(pinName, si); + } else { + assert(spi.getNet().isVCCNet()); + } + // A6 is needed as a logical pin + assert(cell.getLogicalPinMapping("A6") != null); } - } - if (("SRL16E".equals(cell.getType())) || "SRLC32E".equals(cell.getType())) { - String pinName = belName.charAt(0) + "1"; - SitePinInst spi = si.getSitePinInst(pinName); - if (spi != null) { - assert(spi.getNet().isVCCNet()); + if (cell.getLogicalPinMapping("A6") != null) { + // A6 pin is being used by LUT/SRL; no need to tie it to VCC continue; } - vccNet.createPin(pinName, si); } Net staticNet = vccNet; BEL lut6Bel = (fiveOrSix == '5') ? si.getBEL(belName.charAt(0) + "6LUT") : bel; Net a6Net = si.getNetFromSiteWire(lut6Bel.getPin("A6").getSiteWireName()); - // SRL16Es that have been transformed from SRLC32E require GND on their A6 pin - if (cell.getType().equals("SRL16E") && "SRLC32E".equals(cell.getPropertyValueString("XILINX_LEGACY_PRIM"))) { - staticNet = gndNet; - // Expect sitewire to be VCC and GND - if (!a6Net.isStaticNet()) { - throw new RuntimeException("ERROR: Site pin " + si.getSiteName() + "/" + belName.charAt(0) + "6 is not a static net"); + boolean expectGndNet = false; + if ("SRL16E".equals(cell.getType())) { + String pinName = belName.charAt(0) + "1"; + SitePinInst spi = si.getSitePinInst(pinName); + if (spi == null) { + vccNet.createPin(pinName, si); } - } else { - // Tie A6 to staticNet only if sitewire says so - if (a6Net != staticNet) { - continue; + + // SRL16Es that have been transformed from SRLC32E require GND on their A6 pin + if ("SRLC32E".equals(cell.getPropertyValueString("XILINX_LEGACY_PRIM"))) { + expectGndNet = true; + staticNet = gndNet; + // Expect sitewire to be VCC or GND + if (!a6Net.isStaticNet()) { + throw new RuntimeException("ERROR: Site pin " + si.getSiteName() + "/" + belName.charAt(0) + "6 is not a static net"); + } } } + // Tie A6 to staticNet only if sitewire says so + if (a6Net != staticNet && !expectGndNet) { + continue; + } + if (cell.getLogicalPinMapping("O5") != null) { // LUT output comes out on O5 assert(fiveOrSix == '5'); @@ -3324,7 +3337,7 @@ public static void createA1A6ToStaticNets(Design design) { if (fiveOrSix != '6') { // Assume that O6 is only driven by 6LUT, even though possible for 5LUT, unless // it's a routethru - assert (cell.isRoutethru()); + assert(cell.isRoutethru()); continue; } assert(fiveOrSix == '6'); From 4930800afc8c666cac8f6641b3dfdd62f77accd3 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Thu, 21 Nov 2024 11:37:18 -0800 Subject: [PATCH 13/41] [RouteNode] Correct assertions in setBaseCost() for Versal Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/rwroute/RouteNode.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/com/xilinx/rapidwright/rwroute/RouteNode.java b/src/com/xilinx/rapidwright/rwroute/RouteNode.java index a5fb5af8c..46e61f721 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouteNode.java +++ b/src/com/xilinx/rapidwright/rwroute/RouteNode.java @@ -165,6 +165,12 @@ private void setBaseCost(Series series) { break; case NODE_VSINGLE: // Versal-only case NODE_HSINGLE: // Versal-only + if (length == 0 && getAllWiresInNode().length == 1) { + assert(getAllDownhillPIPs().isEmpty() || // e.g. INT_X3Y383/OUT_NN1_E_BEG6 and INT_X19Y384/OUT_EE1_E_BEG8 on vp1002 + getWireName().startsWith("INT_SDQ_RED_ATOM_")); + break; + } + // Fall through case NODE_SINGLE: // US and US+ if (length <= 1) { assert(!getAllDownhillPIPs().isEmpty()); @@ -175,6 +181,14 @@ private void setBaseCost(Series series) { break; case NODE_VDOUBLE: // Versal only case NODE_HDOUBLE: // Versal only + if (length == 0 && getAllWiresInNode().length == 1) { + // e.g. INT_X2Y382/OUT_NN2_W_BEG2 and INT_X18Y384/OUT_WW2_W_BEG4 on vp1002 + assert(getAllDownhillPIPs().isEmpty()); + // This node has no downhill PIPs, mark these as inaccessible so that it will never be queued + type = (byte) RouteNodeType.INACCESSIBLE.ordinal(); + break; + } + // Fall through case NODE_DOUBLE: // US and US+ if (length == 0) { assert(!getAllDownhillPIPs().isEmpty()); @@ -194,9 +208,9 @@ private void setBaseCost(Series series) { } } break; - case NODE_HQUAD: + case NODE_HQUAD: // US/US+/Versal if (length == 0) { - // Since this node has zero length (and by extension no downhill PIPs) + // Since this node has zero length (and asserted to have no downhill PIPs) // mark it as being inacccessible so that it will never be queued assert(getAllDownhillPIPs().isEmpty()); type = (byte) RouteNodeType.INACCESSIBLE.ordinal(); @@ -204,9 +218,11 @@ private void setBaseCost(Series series) { baseCost = 0.35f * length; } break; - case NODE_VQUAD: + case NODE_VQUAD: // US/US+/Versal if (length == 0) { - assert(!getAllDownhillPIPs().isEmpty()); + // On Versal, INT_X1Y380/OUT_NN4_W_BEG6 on vp1002 has no downhill PIPs + assert((series == Series.Versal && getAllWiresInNode().length == 1) || + !getAllDownhillPIPs().isEmpty()); } else { // VQUADs have length 4 and 5 baseCost = 0.15f * length; @@ -219,7 +235,7 @@ private void setBaseCost(Series series) { break; case NODE_HLONG: // US/US+ if (length == 0) { - // Since this node has zero length (and by extension no downhill PIPs) + // Since this node has zero length (and asserted to have no downhill PIPs) // mark it as being inacccessible so that it will never be queued assert(getAllDownhillPIPs().isEmpty()); type = (byte) RouteNodeType.INACCESSIBLE.ordinal(); From 6da582b472af2c17535ec47fa4d978022c8562f6 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Thu, 21 Nov 2024 11:37:39 -0800 Subject: [PATCH 14/41] [TestNode] Extend testNodeReachabilityVersal Signed-off-by: Eddie Hung --- test/src/com/xilinx/rapidwright/device/TestNode.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/src/com/xilinx/rapidwright/device/TestNode.java b/test/src/com/xilinx/rapidwright/device/TestNode.java index b45964650..350e16937 100644 --- a/test/src/com/xilinx/rapidwright/device/TestNode.java +++ b/test/src/com/xilinx/rapidwright/device/TestNode.java @@ -237,7 +237,8 @@ public void testNodeReachabilityUltraScale(String partName, String tileName, Str "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_HSINGLE,OUT_.*,false", + "xcvp1002,INT_X38Y220,NODE_HSINGLE,INT_SDQ_RED_ATOM_.*,false", "xcvp1002,INT_X38Y220,NODE_VSINGLE,,false", "xcvp1002,INT_X38Y220,NODE_HDOUBLE,,false", "xcvp1002,INT_X38Y220,NODE_VDOUBLE,,false", From 25c3ee9bc417ba13768dbc70dd5e29846b03f7e2 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Thu, 21 Nov 2024 13:31:00 -0800 Subject: [PATCH 15/41] Update comment Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/rwroute/RouteNode.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/com/xilinx/rapidwright/rwroute/RouteNode.java b/src/com/xilinx/rapidwright/rwroute/RouteNode.java index 46e61f721..d4391f7a9 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouteNode.java +++ b/src/com/xilinx/rapidwright/rwroute/RouteNode.java @@ -167,7 +167,10 @@ private void setBaseCost(Series series) { case NODE_HSINGLE: // Versal-only if (length == 0 && getAllWiresInNode().length == 1) { assert(getAllDownhillPIPs().isEmpty() || // e.g. INT_X3Y383/OUT_NN1_E_BEG6 and INT_X19Y384/OUT_EE1_E_BEG8 on vp1002 - getWireName().startsWith("INT_SDQ_RED_ATOM_")); + (ic == IntentCode.NODE_HSINGLE && getWireName().startsWith("INT_SDQ_"))); + // HSINGLE nodes that have a wirename INT_SDQ_* do not travel to any other + // tiles but still have downhill PIPs (and thus we cannot mark as being + // inaccessible without checking getAllDownhillPIPs() or getWireName()) break; } // Fall through From 994b86926d63371718dd7b9294d9f6a753502dbd Mon Sep 17 00:00:00 2001 From: Chris Lavin Date: Thu, 21 Nov 2024 18:45:31 -0700 Subject: [PATCH 16/41] 2024.2.0 generated files update Signed-off-by: Chris Lavin --- src/com/xilinx/rapidwright/design/Unisim.java | 33 ++++++++++++++++++- .../xilinx/rapidwright/device/FamilyType.java | 4 ++- .../xilinx/rapidwright/device/IOBankType.java | 6 ++-- .../xilinx/rapidwright/device/IOStandard.java | 18 ++++++++-- src/com/xilinx/rapidwright/device/Part.java | 4 ++- .../rapidwright/device/PartNameTools.java | 8 ++++- .../rapidwright/device/SiteTypeEnum.java | 5 +-- .../rapidwright/device/TileTypeEnum.java | 7 +++- src/com/xilinx/rapidwright/edif/EDIFCell.java | 2 +- 9 files changed, 75 insertions(+), 12 deletions(-) diff --git a/src/com/xilinx/rapidwright/design/Unisim.java b/src/com/xilinx/rapidwright/design/Unisim.java index ae3cf10ea..568becef2 100644 --- a/src/com/xilinx/rapidwright/design/Unisim.java +++ b/src/com/xilinx/rapidwright/design/Unisim.java @@ -33,12 +33,32 @@ import com.xilinx.rapidwright.edif.EDIFLibrary; /** - * Generated on: Wed May 01 19:57:08 MDT 2024 + * Generated on: Thu Nov 21 13:34:09 MST 2024 * by: com.xilinx.rapidwright.release.UnisimParser * * Enumerates supported Unisim primitives that map to Xilinx devices. */ public enum Unisim { + AIE2PS_NOC_M_AXI, + AIE2PS_NOC_M_AXIS, + AIE2PS_NOC_S_AXI, + AIE2PS_NOC_S_AXIS, + AIE2PS_PL_M_AXIS128, + AIE2PS_PL_M_AXIS32, + AIE2PS_PL_M_AXIS64, + AIE2PS_PL_M_EVENTS, + AIE2PS_PL_S_AXIS128, + AIE2PS_PL_S_AXIS32, + AIE2PS_PL_S_AXIS64, + AIE2PS_PL_S_EVENTS, + AIE2P_PL_M_AXIS128, + AIE2P_PL_M_AXIS32, + AIE2P_PL_M_AXIS64, + AIE2P_PL_M_EVENTS, + AIE2P_PL_S_AXIS128, + AIE2P_PL_S_AXIS32, + AIE2P_PL_S_AXIS64, + AIE2P_PL_S_EVENTS, AIE_ML_NOC_M_AXI, AIE_ML_NOC_M_AXIS, AIE_ML_NOC_S_AXI, @@ -85,6 +105,8 @@ public enum Unisim { AND5B4, AND5B5, AUTOBUF, + AXI32, + BFR_FT, BFR_MATMULX, BIBUF, BITSLICE_CONTROL, @@ -157,8 +179,10 @@ public enum Unisim { DDRMC, DDRMC5, DDRMC5C, + DDRMC5E, DDRMC_RIU, DFE_CFR, + DFE_CHANNELIZER, DFE_DUC_DDC, DFE_FFT, DFE_FIR, @@ -258,6 +282,7 @@ public enum Unisim { FRAME_ECCE3, FRAME_ECCE4, FRAME_ECC_VIRTEX6, + FUSE_CLK, GND, GTF_CHANNEL, GTF_COMMON, @@ -769,6 +794,7 @@ public enum Unisim { NOC2_NMU256, NOC2_NMU512, NOC2_NPS5555, + NOC2_NPS6X, NOC2_NPS7575, NOC2_NSU128, NOC2_NSU256, @@ -1193,6 +1219,7 @@ public enum Unisim { PLLE4_BASE, PLL_ADV, PLL_BASE, + PS11, PS7, PS8, PS9, @@ -1290,9 +1317,11 @@ public enum Unisim { RAMS64E1, RAMS64E5, RFADC, + RFADCE5, RFADC_13B4W_M0, RFADC_13B4W_M1, RFDAC, + RFDACE5, RIU_OR, ROM128X1, ROM16X1, @@ -1301,8 +1330,10 @@ public enum Unisim { ROM64X1, RXTX_BITSLICE, RX_BITSLICE, + SDFEC_LD, SIM_CONFIGE2, SIM_CONFIGE3, + SIM_CONFIGE4, SRL16, SRL16E, SRL16E_1, diff --git a/src/com/xilinx/rapidwright/device/FamilyType.java b/src/com/xilinx/rapidwright/device/FamilyType.java index 45f4b124f..10840389d 100644 --- a/src/com/xilinx/rapidwright/device/FamilyType.java +++ b/src/com/xilinx/rapidwright/device/FamilyType.java @@ -27,7 +27,7 @@ /** - * Generated on: Wed May 01 19:03:12 MDT 2024 + * Generated on: Thu Nov 21 13:06:39 MST 2024 * by: com.xilinx.rapidwright.release.PartNamePopulator * * Set of all Supported Xilinx families in RapidWright @@ -54,7 +54,9 @@ public enum FamilyType { QKINTEXUPLUS, QRKINTEXU, QRVERSALAICORE, + QRVERSALAIEDGE, QVERSALAICORE, + QVERSALAIEDGE, QVERSALPREMIUM, QVERSALPRIME, QVIRTEX7, diff --git a/src/com/xilinx/rapidwright/device/IOBankType.java b/src/com/xilinx/rapidwright/device/IOBankType.java index 07fc63e3d..6d789054b 100644 --- a/src/com/xilinx/rapidwright/device/IOBankType.java +++ b/src/com/xilinx/rapidwright/device/IOBankType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Advanced Micro Devices, Inc. + * Copyright (c) 2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Chris Lavin, Advanced Micro Devices, Inc. @@ -27,7 +27,7 @@ /** - * Generated on: Wed May 17 23:03:43 2023 + * Generated on: Thu Nov 21 13:34:08 MST 2024 * by: com.xilinx.rapidwright.release.SiteAndTileTypeUpdater * * Enumeration of IOBankType type for all valid devices within Vivado. @@ -41,5 +41,7 @@ public enum IOBankType { BT_MGT, BT_NO_USER_IO, BT_PSS, + BT_X5, + BT_X5IO, BT_XP, } diff --git a/src/com/xilinx/rapidwright/device/IOStandard.java b/src/com/xilinx/rapidwright/device/IOStandard.java index e2c2b1f13..67d865c5b 100644 --- a/src/com/xilinx/rapidwright/device/IOStandard.java +++ b/src/com/xilinx/rapidwright/device/IOStandard.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Advanced Micro Devices, Inc. + * Copyright (c) 2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Chris Lavin, Advanced Micro Devices, Inc. @@ -27,7 +27,7 @@ /** - * Generated on: Wed May 17 23:03:43 2023 + * Generated on: Thu Nov 21 13:34:08 MST 2024 * by: com.xilinx.rapidwright.release.SiteAndTileTypeUpdater * * Enumeration of IOStandard type for all valid devices within Vivado. @@ -53,13 +53,18 @@ public enum IOStandard { DIFF_HSTL_I_DCI_18, DIFF_HSUL_12, DIFF_HSUL_12_DCI, + DIFF_LVSTL05_10, + DIFF_LVSTL05_10_HS, DIFF_LVSTL06_12, DIFF_LVSTL_11, DIFF_MOBILE_DDR, DIFF_POD10, DIFF_POD10_DCI, + DIFF_POD11, DIFF_POD12, DIFF_POD12_DCI, + DIFF_SSTL10, + DIFF_SSTL11, DIFF_SSTL12, DIFF_SSTL12_DCI, DIFF_SSTL12_LVAUX, @@ -96,6 +101,8 @@ public enum IOStandard { HSTL_I_DCI_18, HSUL_12, HSUL_12_DCI, + LVCMOS10, + LVCMOS11, LVCMOS12, LVCMOS12_LVAUX, LVCMOS15, @@ -107,14 +114,18 @@ public enum IOStandard { LVDCI_DV2_15, LVDCI_DV2_18, LVDS, + LVDS12, LVDS12_LVAUX, LVDS15, LVDS_25, LVPECL, + LVSTL05_10, + LVSTL05_10_HS, LVSTL06_12, LVSTL_11, LVTTL, MINI_LVDS_25, + MIPI_CPHY, MIPI_DPHY, MIPI_DPHY_DCI, MIPI_DPHY_LVAUX, @@ -122,12 +133,15 @@ public enum IOStandard { PCI33_3, POD10, POD10_DCI, + POD11, POD12, POD12_DCI, PPDS_25, RSDS_25, SLVS_400_18, SLVS_400_25, + SSTL10, + SSTL11, SSTL12, SSTL12_DCI, SSTL12_LVAUX, diff --git a/src/com/xilinx/rapidwright/device/Part.java b/src/com/xilinx/rapidwright/device/Part.java index a2e5f899b..5d58b6db8 100644 --- a/src/com/xilinx/rapidwright/device/Part.java +++ b/src/com/xilinx/rapidwright/device/Part.java @@ -30,7 +30,7 @@ import java.util.HashSet; /** - * Generated on: Wed May 01 19:03:12 MDT 2024 + * Generated on: Thu Nov 21 13:06:39 MST 2024 * by: com.xilinx.rapidwright.release.PartNamePopulator * * Class used to uniquely represent a Xilinx part. @@ -260,7 +260,9 @@ public Series getSeries() { versalTypes = new FamilyType[] { FamilyType.AVERSALAIEDGE, FamilyType.QRVERSALAICORE, + FamilyType.QRVERSALAIEDGE, FamilyType.QVERSALAICORE, + FamilyType.QVERSALAIEDGE, FamilyType.QVERSALPREMIUM, FamilyType.QVERSALPRIME, FamilyType.VERSAL, diff --git a/src/com/xilinx/rapidwright/device/PartNameTools.java b/src/com/xilinx/rapidwright/device/PartNameTools.java index c40e6c3a1..714282645 100644 --- a/src/com/xilinx/rapidwright/device/PartNameTools.java +++ b/src/com/xilinx/rapidwright/device/PartNameTools.java @@ -36,7 +36,7 @@ import com.xilinx.rapidwright.util.FileTools; /** - * Generated on: Wed May 01 19:03:12 MDT 2024 + * Generated on: Thu Nov 21 13:06:39 MST 2024 * by: com.xilinx.rapidwright.release.PartNamePopulator * * Class to hold utility APIs dealing with Parts and device names. @@ -146,7 +146,9 @@ public static FamilyType getArchitectureFromFamilyType(FamilyType type) { case QKINTEXUPLUS: return FamilyType.KINTEXUPLUS; case QRKINTEXU: return FamilyType.KINTEXU; case QRVERSALAICORE: return FamilyType.VERSAL; + case QRVERSALAIEDGE: return FamilyType.VERSAL; case QVERSALAICORE: return FamilyType.VERSAL; + case QVERSALAIEDGE: return FamilyType.VERSAL; case QVERSALPREMIUM: return FamilyType.VERSAL; case QVERSALPRIME: return FamilyType.VERSAL; case QVIRTEX7: return FamilyType.VIRTEX7; @@ -200,7 +202,9 @@ public static String getFullArchitectureName(FamilyType type) { case QKINTEXUPLUS: return "Kintex UltraScale+"; case QRKINTEXU: return "Kintex UltraScale"; case QRVERSALAICORE: return "Versal ACAP"; + case QRVERSALAIEDGE: return "Versal ACAP"; case QVERSALAICORE: return "Versal ACAP"; + case QVERSALAIEDGE: return "Versal ACAP"; case QVERSALPREMIUM: return "Versal ACAP"; case QVERSALPRIME: return "Versal ACAP"; case QVIRTEX7: return "Virtex-7"; @@ -255,7 +259,9 @@ public static Series getSeriesFromFamilyType(FamilyType type) { case QKINTEXUPLUS: return Series.UltraScalePlus; case QRKINTEXU: return Series.UltraScale; case QRVERSALAICORE: return Series.Versal; + case QRVERSALAIEDGE: return Series.Versal; case QVERSALAICORE: return Series.Versal; + case QVERSALAIEDGE: return Series.Versal; case QVERSALPREMIUM: return Series.Versal; case QVERSALPRIME: return Series.Versal; case QVIRTEX7: return Series.Series7; diff --git a/src/com/xilinx/rapidwright/device/SiteTypeEnum.java b/src/com/xilinx/rapidwright/device/SiteTypeEnum.java index 1a0cf2547..5b54799bd 100644 --- a/src/com/xilinx/rapidwright/device/SiteTypeEnum.java +++ b/src/com/xilinx/rapidwright/device/SiteTypeEnum.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Advanced Micro Devices, Inc. + * Copyright (c) 2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Chris Lavin, Advanced Micro Devices, Inc. @@ -27,7 +27,7 @@ /** - * Generated on: Wed May 17 23:03:43 2023 + * Generated on: Thu Nov 21 13:34:08 MST 2024 * by: com.xilinx.rapidwright.release.SiteAndTileTypeUpdater * * Enumeration of SiteTypeEnum type for all valid devices within Vivado. @@ -124,6 +124,7 @@ public enum SiteTypeEnum { DCMAC, DDRMC, DDRMC5, + DDRMC5C, DDRMC_RIU, DFE_A, DFE_B, diff --git a/src/com/xilinx/rapidwright/device/TileTypeEnum.java b/src/com/xilinx/rapidwright/device/TileTypeEnum.java index 63d910dd5..bf89b2ab4 100644 --- a/src/com/xilinx/rapidwright/device/TileTypeEnum.java +++ b/src/com/xilinx/rapidwright/device/TileTypeEnum.java @@ -27,7 +27,7 @@ /** - * Generated on: Wed May 01 19:57:08 MDT 2024 + * Generated on: Thu Nov 21 13:34:08 MST 2024 * by: com.xilinx.rapidwright.release.SiteAndTileTypeUpdater * * Enumeration of TileTypeEnum type for all valid devices within Vivado. @@ -533,6 +533,8 @@ public enum TileTypeEnum { CPM_G5N2X_TILE, CPM_G5_TILE, DCMAC_TILE, + DDRMC5C_DMC_CORE, + DDRMC5C_DMC_CORE_MY, DDRMC5_DMC_CORE, DDRMC5_DMC_CORE_MY, DDRMC_DMC_CORE, @@ -1201,6 +1203,7 @@ public enum TileTypeEnum { NOC_XPIO_NCRB_CORE, NOC_XPIO_NCRB_CORE_MX, NPI2_NIR_TILE, + NPI2_RPTR_CORE, NPI_VNPI_BOT_NOLS_TILE, NPI_VNPI_BOT_TILE, NPI_VNPI_BOT_TILE_MY, @@ -1339,6 +1342,7 @@ public enum TileTypeEnum { RBRK_XPIPE_CORE, RCLK_AMS_CFGIO, RCLK_BRAM_CLKBUF_CORE, + RCLK_BRAM_CLKBUF_NOPD_CORE, RCLK_BRAM_CORE, RCLK_BRAM_CORE_MY, RCLK_BRAM_INTF_L, @@ -1567,6 +1571,7 @@ public enum TileTypeEnum { TERM_B_CIDB_CORE, TERM_B_CLE_LAG_CORE, TERM_B_CPIPE_CORE, + TERM_B_CPIPE_TERMR_CORE, TERM_B_CPIPE_TERMR_XPIO_CORE, TERM_B_DSP_CORE, TERM_B_GTCLK_CORE, diff --git a/src/com/xilinx/rapidwright/edif/EDIFCell.java b/src/com/xilinx/rapidwright/edif/EDIFCell.java index 00270d628..f742aded8 100644 --- a/src/com/xilinx/rapidwright/edif/EDIFCell.java +++ b/src/com/xilinx/rapidwright/edif/EDIFCell.java @@ -497,7 +497,7 @@ public void setLibrary(EDIFLibrary library) { this.library = library; } - protected void clearLibrary() { + public void clearLibrary() { this.library = null; } From 4eddf4869cd22a31dbd07c9b43c55877a26aba8f Mon Sep 17 00:00:00 2001 From: Chris Lavin Date: Thu, 21 Nov 2024 18:56:38 -0700 Subject: [PATCH 17/41] Updated device/data files for 2024.2.0 Signed-off-by: Chris Lavin --- .../xilinx/rapidwright/util/DataVersions.java | 681 +++++++++--------- 1 file changed, 347 insertions(+), 334 deletions(-) diff --git a/src/com/xilinx/rapidwright/util/DataVersions.java b/src/com/xilinx/rapidwright/util/DataVersions.java index c7e0645c7..032a8e193 100644 --- a/src/com/xilinx/rapidwright/util/DataVersions.java +++ b/src/com/xilinx/rapidwright/util/DataVersions.java @@ -29,7 +29,7 @@ import java.util.Map; /** - * Generated on: Mon Jul 01 15:12:48 MDT 2024 + * Generated on: Thu Nov 21 18:52:53 MST 2024 * by: com.xilinx.rapidwright.release.UploadFilesToAzure * * Versioned list of data files to use in current RapidWright environment @@ -38,338 +38,351 @@ public class DataVersions { public static Map> dataVersionMap; static { dataVersionMap = new HashMap<>(); - dataVersionMap.put("data/cell_pin_defaults.dat", new Pair<>("cell-pin-defaults-dat", "eaf0585297cd82e43ec7786eee34a13b")); - dataVersionMap.put("data/devices/artix7/xa7a100t_db.dat", new Pair<>("xa7a100t-db-dat", "c462dd564961e834b232a0781d9a7f67")); - dataVersionMap.put("data/devices/artix7/xa7a12t_db.dat", new Pair<>("xa7a12t-db-dat", "d722e08c269fe653c7e56d5d72c8751f")); - dataVersionMap.put("data/devices/artix7/xa7a15t_db.dat", new Pair<>("xa7a15t-db-dat", "efed28db2139f369e35345f3d2687e99")); - dataVersionMap.put("data/devices/artix7/xa7a25t_db.dat", new Pair<>("xa7a25t-db-dat", "7a4891a8a52d5aada8c0d887f6d91c1e")); - dataVersionMap.put("data/devices/artix7/xa7a35t_db.dat", new Pair<>("xa7a35t-db-dat", "20f791600525512495ddf575223a3e2b")); - dataVersionMap.put("data/devices/artix7/xa7a50t_db.dat", new Pair<>("xa7a50t-db-dat", "2ed92875aaeca32788f0348d870b1f01")); - dataVersionMap.put("data/devices/artix7/xa7a75t_db.dat", new Pair<>("xa7a75t-db-dat", "108ffadd9e481cd2b3c3af54ff3541b6")); - dataVersionMap.put("data/devices/artix7/xc7a100t_db.dat", new Pair<>("xc7a100t-db-dat", "89a6b3b0adf37c20e5ea6f5ed7ddaf0e")); - dataVersionMap.put("data/devices/artix7/xc7a100ti_db.dat", new Pair<>("xc7a100ti-db-dat", "13399c29157eb3c71d80d92bdaedd426")); - dataVersionMap.put("data/devices/artix7/xc7a100tl_db.dat", new Pair<>("xc7a100tl-db-dat", "20fd5ffed5267d4248631e474b3527ff")); - dataVersionMap.put("data/devices/artix7/xc7a12t_db.dat", new Pair<>("xc7a12t-db-dat", "318e5ffb3fbf3f73aa973c2b2fbaf115")); - dataVersionMap.put("data/devices/artix7/xc7a12ti_db.dat", new Pair<>("xc7a12ti-db-dat", "eb26c3f7cdd49fa1ce4d686dab3b15ed")); - dataVersionMap.put("data/devices/artix7/xc7a12tl_db.dat", new Pair<>("xc7a12tl-db-dat", "f73af6bd6aa0cfd99a4753c9d4f7a399")); - dataVersionMap.put("data/devices/artix7/xc7a15t_db.dat", new Pair<>("xc7a15t-db-dat", "a6ba7398ebddad033c3c9edebc0887ed")); - dataVersionMap.put("data/devices/artix7/xc7a15ti_db.dat", new Pair<>("xc7a15ti-db-dat", "b82d776cd3319b15e37313c6fd7dc91d")); - dataVersionMap.put("data/devices/artix7/xc7a15tl_db.dat", new Pair<>("xc7a15tl-db-dat", "50217e1c8515e2a76a060f4c35531755")); - dataVersionMap.put("data/devices/artix7/xc7a200t_db.dat", new Pair<>("xc7a200t-db-dat", "ec5f934346106b0480140cfdfcc631c4")); - dataVersionMap.put("data/devices/artix7/xc7a200ti_db.dat", new Pair<>("xc7a200ti-db-dat", "9a571754cc710135994c69ce73d0bc30")); - dataVersionMap.put("data/devices/artix7/xc7a200tl_db.dat", new Pair<>("xc7a200tl-db-dat", "d9e3ffb848d406ffaa013dd42541df6f")); - dataVersionMap.put("data/devices/artix7/xc7a25t_db.dat", new Pair<>("xc7a25t-db-dat", "56fd1cee45942cdefa44164bc2092e30")); - dataVersionMap.put("data/devices/artix7/xc7a25ti_db.dat", new Pair<>("xc7a25ti-db-dat", "c0626c42a74d35d4387f54b93506384c")); - dataVersionMap.put("data/devices/artix7/xc7a25tl_db.dat", new Pair<>("xc7a25tl-db-dat", "972fe0f507edec0acf7328b13a4d3ead")); - dataVersionMap.put("data/devices/artix7/xc7a35t_db.dat", new Pair<>("xc7a35t-db-dat", "16183e2ffa5e66b530ca049d4595496a")); - dataVersionMap.put("data/devices/artix7/xc7a35ti_db.dat", new Pair<>("xc7a35ti-db-dat", "4b83ea9792676d3fc1e65e1138de80ed")); - dataVersionMap.put("data/devices/artix7/xc7a35tl_db.dat", new Pair<>("xc7a35tl-db-dat", "d64a8c15aafee7d4e835ff01f0e71c6e")); - dataVersionMap.put("data/devices/artix7/xc7a50t_db.dat", new Pair<>("xc7a50t-db-dat", "d8b4894507c995fd8246a40165e2e82c")); - dataVersionMap.put("data/devices/artix7/xc7a50ti_db.dat", new Pair<>("xc7a50ti-db-dat", "8d0e5e31e0d43d0803d6bd4d2fca12e9")); - dataVersionMap.put("data/devices/artix7/xc7a50tl_db.dat", new Pair<>("xc7a50tl-db-dat", "8fb582a0aefbb1b2d38e2917b8bba2ad")); - dataVersionMap.put("data/devices/artix7/xc7a75t_db.dat", new Pair<>("xc7a75t-db-dat", "f05568a070cb3567c648c24965f31316")); - dataVersionMap.put("data/devices/artix7/xc7a75ti_db.dat", new Pair<>("xc7a75ti-db-dat", "0c75a673be05a7cd5c112693a29555d8")); - dataVersionMap.put("data/devices/artix7/xc7a75tl_db.dat", new Pair<>("xc7a75tl-db-dat", "f99114deda83af2e00d0b2b1b89c665c")); - dataVersionMap.put("data/devices/artix7/xq7a100t_db.dat", new Pair<>("xq7a100t-db-dat", "63490f3b3f0b67bf2cbdc0c1ac299f10")); - dataVersionMap.put("data/devices/artix7/xq7a200t_db.dat", new Pair<>("xq7a200t-db-dat", "17c70c4e493bbf1f608ed0aebe5e88f3")); - dataVersionMap.put("data/devices/artix7/xq7a50t_db.dat", new Pair<>("xq7a50t-db-dat", "45b7a9dcbb19493f2c4995927c3d231f")); - dataVersionMap.put("data/devices/kintex7/xa7k160t_db.dat", new Pair<>("xa7k160t-db-dat", "a6e8b276c510f90c23f5ed9ed92803ea")); - dataVersionMap.put("data/devices/kintex7/xc7k160t_db.dat", new Pair<>("xc7k160t-db-dat", "b43f565dacd96c58d3f6a89a4caf8f71")); - dataVersionMap.put("data/devices/kintex7/xc7k160ti_db.dat", new Pair<>("xc7k160ti-db-dat", "b1aaa2268eb8eff42f5180e6735e3da9")); - dataVersionMap.put("data/devices/kintex7/xc7k160tl_db.dat", new Pair<>("xc7k160tl-db-dat", "48173313170dc3db30abd6fbd8d81f5c")); - dataVersionMap.put("data/devices/kintex7/xc7k325t_db.dat", new Pair<>("xc7k325t-db-dat", "6108bd9a169ee6f603df7e8ebf4a8739")); - dataVersionMap.put("data/devices/kintex7/xc7k325ti_db.dat", new Pair<>("xc7k325ti-db-dat", "74fb7324efbee35aea9f134363e811a2")); - dataVersionMap.put("data/devices/kintex7/xc7k325tl_db.dat", new Pair<>("xc7k325tl-db-dat", "06c3559b4359d6ad1131ccf138fbce40")); - dataVersionMap.put("data/devices/kintex7/xc7k355t_db.dat", new Pair<>("xc7k355t-db-dat", "db6aab39fb967f57c4eafbd789fb3e00")); - dataVersionMap.put("data/devices/kintex7/xc7k355ti_db.dat", new Pair<>("xc7k355ti-db-dat", "38d8f830628e43654d380e49885a75ec")); - dataVersionMap.put("data/devices/kintex7/xc7k355tl_db.dat", new Pair<>("xc7k355tl-db-dat", "acc5c15ce611fc1a4742cabbb31dc033")); - dataVersionMap.put("data/devices/kintex7/xc7k410t_db.dat", new Pair<>("xc7k410t-db-dat", "a7cbedf6ada3cb666a60c92fbc1f43ce")); - dataVersionMap.put("data/devices/kintex7/xc7k410ti_db.dat", new Pair<>("xc7k410ti-db-dat", "2ab984f40a14bccc067287ceada40898")); - dataVersionMap.put("data/devices/kintex7/xc7k410tl_db.dat", new Pair<>("xc7k410tl-db-dat", "cc3941b61a756b225d7cdfe30d2c0721")); - dataVersionMap.put("data/devices/kintex7/xc7k420t_db.dat", new Pair<>("xc7k420t-db-dat", "f488697534f5731eee83e4261a86e0f2")); - dataVersionMap.put("data/devices/kintex7/xc7k420ti_db.dat", new Pair<>("xc7k420ti-db-dat", "ce3927c58712adb7f19a3b834bbc0e2e")); - dataVersionMap.put("data/devices/kintex7/xc7k420tl_db.dat", new Pair<>("xc7k420tl-db-dat", "3b880396e4d8c49eb7375686142510c2")); - dataVersionMap.put("data/devices/kintex7/xc7k480t_db.dat", new Pair<>("xc7k480t-db-dat", "2ed6efd1590fdfc0329b21e7388282e1")); - dataVersionMap.put("data/devices/kintex7/xc7k480ti_db.dat", new Pair<>("xc7k480ti-db-dat", "9485d66e1b67021f56c4da46d5d85057")); - dataVersionMap.put("data/devices/kintex7/xc7k480tl_db.dat", new Pair<>("xc7k480tl-db-dat", "4a7927025133e534638eb881c948e685")); - dataVersionMap.put("data/devices/kintex7/xc7k70t_db.dat", new Pair<>("xc7k70t-db-dat", "fe9291ad2c62c77645c99426d5ad5f65")); - dataVersionMap.put("data/devices/kintex7/xc7k70tl_db.dat", new Pair<>("xc7k70tl-db-dat", "458549ee0d33abbc668c72daa482bb30")); - dataVersionMap.put("data/devices/kintex7/xq7k325t_db.dat", new Pair<>("xq7k325t-db-dat", "ddbbb5570b11cad7fc7fd2f4ab09094f")); - dataVersionMap.put("data/devices/kintex7/xq7k325tl_db.dat", new Pair<>("xq7k325tl-db-dat", "ebdcff8b94e993a32ea2c52b27df8f8f")); - dataVersionMap.put("data/devices/kintex7/xq7k410t_db.dat", new Pair<>("xq7k410t-db-dat", "e0857e8c6dbbb6cca741ca52a4a3ab73")); - dataVersionMap.put("data/devices/kintex7/xq7k410tl_db.dat", new Pair<>("xq7k410tl-db-dat", "8b9dbc52d0fb0dc3b7a57d3f28f7ab72")); - dataVersionMap.put("data/devices/kintexu/xcku025_db.dat", new Pair<>("xcku025-db-dat", "bfc8f57bf09c9c5e1f45125ff05fd574")); - dataVersionMap.put("data/devices/kintexu/xcku035_db.dat", new Pair<>("xcku035-db-dat", "738d51e6b8432626133dacb1e05fb2bf")); - dataVersionMap.put("data/devices/kintexu/xcku040_db.dat", new Pair<>("xcku040-db-dat", "5447ad976f7de37ab343e5c0d739f37b")); - dataVersionMap.put("data/devices/kintexu/xcku060_CIV_db.dat", new Pair<>("xcku060-civ-db-dat", "dedd66f23e4d6ab8486673d2362a55ff")); - dataVersionMap.put("data/devices/kintexu/xcku060_db.dat", new Pair<>("xcku060-db-dat", "be13359ec1ed700af444fa54882a4448")); - dataVersionMap.put("data/devices/kintexu/xcku085_CIV_db.dat", new Pair<>("xcku085-civ-db-dat", "cf25052d0b53a9290a2b6b3d930f026f")); - dataVersionMap.put("data/devices/kintexu/xcku085_db.dat", new Pair<>("xcku085-db-dat", "45171045071a2c9e1aea9bb34aadfe61")); - dataVersionMap.put("data/devices/kintexu/xcku095_CIV_db.dat", new Pair<>("xcku095-civ-db-dat", "55fe9076d6346b487c589912171815d0")); - dataVersionMap.put("data/devices/kintexu/xcku095_db.dat", new Pair<>("xcku095-db-dat", "01d01d03b0f4def80db50218a0f5f97c")); - dataVersionMap.put("data/devices/kintexu/xcku115_CIV_db.dat", new Pair<>("xcku115-civ-db-dat", "1833c7d564de9ab64710e7cc0457afa5")); - dataVersionMap.put("data/devices/kintexu/xcku115_db.dat", new Pair<>("xcku115-db-dat", "32a27e811cdc6560944ffeea24f5fd3c")); - dataVersionMap.put("data/devices/kintexu/xqku040_db.dat", new Pair<>("xqku040-db-dat", "37c4377376bcdec50e78e545a727d34d")); - dataVersionMap.put("data/devices/kintexu/xqku060_db.dat", new Pair<>("xqku060-db-dat", "ef45b9b5603dfc71db39936893f89527")); - dataVersionMap.put("data/devices/kintexu/xqku095_db.dat", new Pair<>("xqku095-db-dat", "dcb27462df771dcfbb1cc3946bc0e757")); - dataVersionMap.put("data/devices/kintexu/xqku115_db.dat", new Pair<>("xqku115-db-dat", "b19ba11c93db0dfc7de5cf19a62bfe4f")); - dataVersionMap.put("data/devices/kintexu/xqrku060_db.dat", new Pair<>("xqrku060-db-dat", "8ba0a00dcbf9dc32ec880d637ae90191")); - dataVersionMap.put("data/devices/kintexuplus/xaau10p_db.dat", new Pair<>("xaau10p-db-dat", "59524b97601a9472a1677619130e2c77")); - dataVersionMap.put("data/devices/kintexuplus/xaau15p_db.dat", new Pair<>("xaau15p-db-dat", "13f2f636162171ea31fd1608cfee6c36")); - dataVersionMap.put("data/devices/kintexuplus/xaau7p_db.dat", new Pair<>("xaau7p-db-dat", "36e075516dac2ec7bb3f6597c1436614")); - dataVersionMap.put("data/devices/kintexuplus/xcau10p_db.dat", new Pair<>("xcau10p-db-dat", "8fd293ba069eabd24a626146e7dde04c")); - dataVersionMap.put("data/devices/kintexuplus/xcau15p_db.dat", new Pair<>("xcau15p-db-dat", "3abd941c71b0eeab0920e77282964b30")); - dataVersionMap.put("data/devices/kintexuplus/xcau20p_db.dat", new Pair<>("xcau20p-db-dat", "e138a4ee79d5269e5399a7ebf9076829")); - dataVersionMap.put("data/devices/kintexuplus/xcau25p_db.dat", new Pair<>("xcau25p-db-dat", "280cd3c6ecce172ef8af46f51994a922")); - dataVersionMap.put("data/devices/kintexuplus/xcau7p_db.dat", new Pair<>("xcau7p-db-dat", "23ecb7b87c0ed9913233be132a1331ca")); - dataVersionMap.put("data/devices/kintexuplus/xcku11p_CIV_db.dat", new Pair<>("xcku11p-civ-db-dat", "585450536bf1714546cd0d35dcde8a90")); - dataVersionMap.put("data/devices/kintexuplus/xcku11p_db.dat", new Pair<>("xcku11p-db-dat", "dbcf86fb83e456bf48f02d36153b81ad")); - dataVersionMap.put("data/devices/kintexuplus/xcku13p_db.dat", new Pair<>("xcku13p-db-dat", "bed8d33493e0984bb157ef200be16a96")); - dataVersionMap.put("data/devices/kintexuplus/xcku15p_CIV_db.dat", new Pair<>("xcku15p-civ-db-dat", "3e6e1376a0b3cfccf21cde03d0ed0fbc")); - dataVersionMap.put("data/devices/kintexuplus/xcku15p_db.dat", new Pair<>("xcku15p-db-dat", "a9dfe7349fad1de425bf6973085e29a9")); - dataVersionMap.put("data/devices/kintexuplus/xcku19p_CIV_db.dat", new Pair<>("xcku19p-civ-db-dat", "6f4cbd7137c1af75c4051d4c7340c99c")); - dataVersionMap.put("data/devices/kintexuplus/xcku19p_db.dat", new Pair<>("xcku19p-db-dat", "4dbe9d2a1f9c52bfd31238bc75ff0b1b")); - dataVersionMap.put("data/devices/kintexuplus/xcku3p_db.dat", new Pair<>("xcku3p-db-dat", "ad2d43b0152546657dbb62114953e070")); - dataVersionMap.put("data/devices/kintexuplus/xcku5p_db.dat", new Pair<>("xcku5p-db-dat", "9086c97154cac1804f3145b60c69a050")); - dataVersionMap.put("data/devices/kintexuplus/xcku9p_db.dat", new Pair<>("xcku9p-db-dat", "bdacb15f9f97ec6c80209951f72f2d18")); - dataVersionMap.put("data/devices/kintexuplus/xqku15p_db.dat", new Pair<>("xqku15p-db-dat", "ea16079501211f6a56776a7f647ea793")); - dataVersionMap.put("data/devices/kintexuplus/xqku5p_db.dat", new Pair<>("xqku5p-db-dat", "32d5ba2f7858c8f6a2837555e6092b61")); - dataVersionMap.put("data/devices/spartan7/xa7s100_db.dat", new Pair<>("xa7s100-db-dat", "67ab253f14bb7ce65358d90b3ed2be90")); - dataVersionMap.put("data/devices/spartan7/xa7s15_db.dat", new Pair<>("xa7s15-db-dat", "b242ff8589e5d85cdf1777de430294e3")); - dataVersionMap.put("data/devices/spartan7/xa7s25_db.dat", new Pair<>("xa7s25-db-dat", "e044ef45ea5d2a67ec75741d905288da")); - dataVersionMap.put("data/devices/spartan7/xa7s50_db.dat", new Pair<>("xa7s50-db-dat", "85603a88c4ef3a41d0aaf5c2b7a610ac")); - dataVersionMap.put("data/devices/spartan7/xa7s6_db.dat", new Pair<>("xa7s6-db-dat", "882b26a45bdaf0195bd83d3053b87c17")); - dataVersionMap.put("data/devices/spartan7/xa7s75_db.dat", new Pair<>("xa7s75-db-dat", "dcc679fa39d68c2947277da070aaebb6")); - dataVersionMap.put("data/devices/spartan7/xc7s100_db.dat", new Pair<>("xc7s100-db-dat", "b91c71f1a0c2df6a6e0fa2e9ea20dac2")); - dataVersionMap.put("data/devices/spartan7/xc7s15_db.dat", new Pair<>("xc7s15-db-dat", "1dd2e45130df98f90835ddf59940f1bb")); - dataVersionMap.put("data/devices/spartan7/xc7s25_db.dat", new Pair<>("xc7s25-db-dat", "bb970c50c0076f10bb399447c61a8a73")); - dataVersionMap.put("data/devices/spartan7/xc7s50_db.dat", new Pair<>("xc7s50-db-dat", "718533451f74816516f848aed05a4ac9")); - dataVersionMap.put("data/devices/spartan7/xc7s6_db.dat", new Pair<>("xc7s6-db-dat", "1ced054c4c07cd1fe0f30c4aec966220")); - dataVersionMap.put("data/devices/spartan7/xc7s75_db.dat", new Pair<>("xc7s75-db-dat", "0222b0141daa170330b7ea13f8229561")); - dataVersionMap.put("data/devices/versal/xave1752_db.dat", new Pair<>("xave1752-db-dat", "9647d8c3c02da18d248115186ab1f309")); - dataVersionMap.put("data/devices/versal/xcv80_db.dat", new Pair<>("xcv80-db-dat", "beff67d91d75d48d8f6bf7df9a24faaf")); - dataVersionMap.put("data/devices/versal/xcvc1502_db.dat", new Pair<>("xcvc1502-db-dat", "095de11fa44a560bf4b8369e2304ccf2")); - dataVersionMap.put("data/devices/versal/xcvc1702_db.dat", new Pair<>("xcvc1702-db-dat", "1a23a849a9c0e0a2b1ef0885e9817d7e")); - dataVersionMap.put("data/devices/versal/xcvc1802_db.dat", new Pair<>("xcvc1802-db-dat", "98e3a90ff0079f29600f497503503c38")); - dataVersionMap.put("data/devices/versal/xcvc1902_db.dat", new Pair<>("xcvc1902-db-dat", "a61a878106984675b70ec9d5d2f73f28")); - dataVersionMap.put("data/devices/versal/xcvc2602_db.dat", new Pair<>("xcvc2602-db-dat", "2d3d85a216146d926c91ef905314f40c")); - dataVersionMap.put("data/devices/versal/xcvc2802_db.dat", new Pair<>("xcvc2802-db-dat", "10cb5900515037a0d7fd446b5cd5f1f3")); - dataVersionMap.put("data/devices/versal/xcve1752_db.dat", new Pair<>("xcve1752-db-dat", "3dd190a91517bc2e749d64b31cd8c58a")); - dataVersionMap.put("data/devices/versal/xcve2002_db.dat", new Pair<>("xcve2002-db-dat", "e8ffb30d328d961ca7be17518666f399")); - dataVersionMap.put("data/devices/versal/xcve2102_db.dat", new Pair<>("xcve2102-db-dat", "7a141875eacff72fdc5adc0bdf27713c")); - dataVersionMap.put("data/devices/versal/xcve2202_db.dat", new Pair<>("xcve2202-db-dat", "55b240329ed8c99f06f63bb60345ba42")); - dataVersionMap.put("data/devices/versal/xcve2302_db.dat", new Pair<>("xcve2302-db-dat", "787dfa93d3621ffe603b02a553ee339a")); - dataVersionMap.put("data/devices/versal/xcve2602_db.dat", new Pair<>("xcve2602-db-dat", "d2f263072de3eda5d8fce0c375f12d41")); - dataVersionMap.put("data/devices/versal/xcve2802_db.dat", new Pair<>("xcve2802-db-dat", "9a64655af770531a9109c147202d7842")); - dataVersionMap.put("data/devices/versal/xcvh1522_db.dat", new Pair<>("xcvh1522-db-dat", "48399b6242055b6045e4a5865b5ba923")); - dataVersionMap.put("data/devices/versal/xcvh1542_db.dat", new Pair<>("xcvh1542-db-dat", "fd104d6b565130654f4b10f047901a11")); - dataVersionMap.put("data/devices/versal/xcvh1582_db.dat", new Pair<>("xcvh1582-db-dat", "b3d5809413dbf9fe5faf329f53455712")); - dataVersionMap.put("data/devices/versal/xcvh1742_db.dat", new Pair<>("xcvh1742-db-dat", "42ee694090074973df8bae88e41963ad")); - dataVersionMap.put("data/devices/versal/xcvh1782_db.dat", new Pair<>("xcvh1782-db-dat", "21eb6ae143da4179a887fdd9bb60bd04")); - dataVersionMap.put("data/devices/versal/xcvm1102_db.dat", new Pair<>("xcvm1102-db-dat", "830e2c7022da5ae7996317411491f825")); - dataVersionMap.put("data/devices/versal/xcvm1302_db.dat", new Pair<>("xcvm1302-db-dat", "c262310de1ce097d09f5b3caebc9b74f")); - dataVersionMap.put("data/devices/versal/xcvm1402_db.dat", new Pair<>("xcvm1402-db-dat", "53a071baa129237927d0686dc8d1b173")); - dataVersionMap.put("data/devices/versal/xcvm1502_db.dat", new Pair<>("xcvm1502-db-dat", "340c2d570e6943baefab1069919e1837")); - dataVersionMap.put("data/devices/versal/xcvm1802_db.dat", new Pair<>("xcvm1802-db-dat", "512acb1d095d4f6a018a47a264be614d")); - dataVersionMap.put("data/devices/versal/xcvm2202_db.dat", new Pair<>("xcvm2202-db-dat", "ace765c3daad25c1c5c804d8ffa57f8b")); - dataVersionMap.put("data/devices/versal/xcvm2302_db.dat", new Pair<>("xcvm2302-db-dat", "9301da8d54f7c3a39e25a9dc4c277a9c")); - dataVersionMap.put("data/devices/versal/xcvm2502_db.dat", new Pair<>("xcvm2502-db-dat", "168343a213c0901c32bba7974b9150d7")); - dataVersionMap.put("data/devices/versal/xcvm2902_db.dat", new Pair<>("xcvm2902-db-dat", "780eeebe663c17699676d3ac9eedbe36")); - dataVersionMap.put("data/devices/versal/xcvp1002_db.dat", new Pair<>("xcvp1002-db-dat", "93614d27e616ad00c0f09063f60b00bf")); - dataVersionMap.put("data/devices/versal/xcvp1052_db.dat", new Pair<>("xcvp1052-db-dat", "b6efaa8d9bbc266953c36c71108cddf5")); - dataVersionMap.put("data/devices/versal/xcvp1102_db.dat", new Pair<>("xcvp1102-db-dat", "8632dfccbe341abef9f3504fbf0b5bce")); - dataVersionMap.put("data/devices/versal/xcvp1202_db.dat", new Pair<>("xcvp1202-db-dat", "0d3d43ad85ecfd8a370144653c0dcae4")); - dataVersionMap.put("data/devices/versal/xcvp1402_db.dat", new Pair<>("xcvp1402-db-dat", "4a96e13eccf7efb2eea45586ff4eecab")); - dataVersionMap.put("data/devices/versal/xcvp1502_db.dat", new Pair<>("xcvp1502-db-dat", "664eaae2420cfcce9c38e3a65907fe6e")); - dataVersionMap.put("data/devices/versal/xcvp1552_db.dat", new Pair<>("xcvp1552-db-dat", "b638dd9fa21c9bf1b32ff244b2fc8097")); - dataVersionMap.put("data/devices/versal/xcvp1702_db.dat", new Pair<>("xcvp1702-db-dat", "e45eeae7f2c446b747d2c32b1e740966")); - dataVersionMap.put("data/devices/versal/xcvp1802_db.dat", new Pair<>("xcvp1802-db-dat", "5193742d00799abca9e09cc4d420cf96")); - dataVersionMap.put("data/devices/versal/xcvp1902_db.dat", new Pair<>("xcvp1902-db-dat", "75bc9e93b9f51779f8fde3090f049a1c")); - dataVersionMap.put("data/devices/versal/xcvp2502_db.dat", new Pair<>("xcvp2502-db-dat", "6df88f501601c922a76a91dfa8fdbe40")); - dataVersionMap.put("data/devices/versal/xcvp2802_db.dat", new Pair<>("xcvp2802-db-dat", "6190c436f390d434fd5d3b6c11663dec")); - dataVersionMap.put("data/devices/versal/xqrvc1902_db.dat", new Pair<>("xqrvc1902-db-dat", "d8b094b89dc88d7d5ee95ecf072eb745")); - dataVersionMap.put("data/devices/versal/xqvc1702_db.dat", new Pair<>("xqvc1702-db-dat", "f53ba0b4a08339e7cde0ec246235f3ee")); - dataVersionMap.put("data/devices/versal/xqvc1902_db.dat", new Pair<>("xqvc1902-db-dat", "b83164afbc5f38024d28f551cc3a1901")); - dataVersionMap.put("data/devices/versal/xqvm1402_db.dat", new Pair<>("xqvm1402-db-dat", "ea17c682326443b3bd365d94557b7861")); - dataVersionMap.put("data/devices/versal/xqvm1502_db.dat", new Pair<>("xqvm1502-db-dat", "b1408f8ecabe3a96af1430697d2a293e")); - dataVersionMap.put("data/devices/versal/xqvm1802_db.dat", new Pair<>("xqvm1802-db-dat", "8573f43ba22cb1770984a0375165fe76")); - dataVersionMap.put("data/devices/versal/xqvp1202_db.dat", new Pair<>("xqvp1202-db-dat", "8ce42b96c01868c1c9a846f62bf690db")); - dataVersionMap.put("data/devices/versal/xqvp1402_db.dat", new Pair<>("xqvp1402-db-dat", "94b19c5b58aa96f8f7ad8a824dc46d3b")); - dataVersionMap.put("data/devices/versal/xqvp1502_db.dat", new Pair<>("xqvp1502-db-dat", "3fb790fe4fd1934bff38cb3166d651db")); - dataVersionMap.put("data/devices/virtex7/xc7v2000t_db.dat", new Pair<>("xc7v2000t-db-dat", "92d0393f7face5876bb50a053ec4feca")); - dataVersionMap.put("data/devices/virtex7/xc7v585t_db.dat", new Pair<>("xc7v585t-db-dat", "c1f34b8edfecbad5175ae15a001a5a0e")); - dataVersionMap.put("data/devices/virtex7/xc7vh580t_db.dat", new Pair<>("xc7vh580t-db-dat", "78d8cb5036dac18446cfe7ee9385ff5c")); - dataVersionMap.put("data/devices/virtex7/xc7vh870t_db.dat", new Pair<>("xc7vh870t-db-dat", "f926445f11f764566091d7bd17be504a")); - dataVersionMap.put("data/devices/virtex7/xc7vx1140t_db.dat", new Pair<>("xc7vx1140t-db-dat", "8e043da034346ced8ac74d3466590dde")); - dataVersionMap.put("data/devices/virtex7/xc7vx330t_db.dat", new Pair<>("xc7vx330t-db-dat", "f15cfb07c59972149a04052092089ece")); - dataVersionMap.put("data/devices/virtex7/xc7vx415t_CIV_db.dat", new Pair<>("xc7vx415t-civ-db-dat", "29071f4d73bb2b27c0890a21c6782132")); - dataVersionMap.put("data/devices/virtex7/xc7vx415t_db.dat", new Pair<>("xc7vx415t-db-dat", "56499db6ea7ef4836a5b286b5cce91ab")); - dataVersionMap.put("data/devices/virtex7/xc7vx485t_db.dat", new Pair<>("xc7vx485t-db-dat", "3c1d751df7f0457d715739597b484a48")); - dataVersionMap.put("data/devices/virtex7/xc7vx550t_CIV_db.dat", new Pair<>("xc7vx550t-civ-db-dat", "a518d9ae5cfbf43776260fd8f49f0fa1")); - dataVersionMap.put("data/devices/virtex7/xc7vx550t_db.dat", new Pair<>("xc7vx550t-db-dat", "d5aad888cba247f788478cfdc615d897")); - dataVersionMap.put("data/devices/virtex7/xc7vx690t_CIV_db.dat", new Pair<>("xc7vx690t-civ-db-dat", "4c59f34584c56f22181e6ae8219f539a")); - dataVersionMap.put("data/devices/virtex7/xc7vx690t_db.dat", new Pair<>("xc7vx690t-db-dat", "b665906e7979c0633e612e8b557bdf20")); - dataVersionMap.put("data/devices/virtex7/xc7vx980t_db.dat", new Pair<>("xc7vx980t-db-dat", "878b9d14fced5e55a6671312cd7907bb")); - dataVersionMap.put("data/devices/virtex7/xq7v585t_db.dat", new Pair<>("xq7v585t-db-dat", "9b3767f09398312811f2d049a01f3388")); - dataVersionMap.put("data/devices/virtex7/xq7vx330t_db.dat", new Pair<>("xq7vx330t-db-dat", "3d9d11729b0afa0928ea6ec226f998e5")); - dataVersionMap.put("data/devices/virtex7/xq7vx485t_db.dat", new Pair<>("xq7vx485t-db-dat", "3ee6a7714d60ae81ef8ebfcee11cb3d2")); - dataVersionMap.put("data/devices/virtex7/xq7vx690t_db.dat", new Pair<>("xq7vx690t-db-dat", "514f776fd60d1941316392832f83d438")); - dataVersionMap.put("data/devices/virtex7/xq7vx980t_db.dat", new Pair<>("xq7vx980t-db-dat", "5d3523e34d29438bbc2867da4046a623")); - dataVersionMap.put("data/devices/virtexu/xcvu065_CIV_db.dat", new Pair<>("xcvu065-civ-db-dat", "0452e6f1de6a12bedbb54aa2fe572726")); - dataVersionMap.put("data/devices/virtexu/xcvu065_db.dat", new Pair<>("xcvu065-db-dat", "e9024fd561d499f131f3d8593bc0c3fb")); - dataVersionMap.put("data/devices/virtexu/xcvu080_CIV_db.dat", new Pair<>("xcvu080-civ-db-dat", "30c60ef49287b5a455b6a7e874823b26")); - dataVersionMap.put("data/devices/virtexu/xcvu080_db.dat", new Pair<>("xcvu080-db-dat", "fb381473f731a1c93904f9bff217fdc7")); - dataVersionMap.put("data/devices/virtexu/xcvu095_CIV_db.dat", new Pair<>("xcvu095-civ-db-dat", "66224d8e0d7f02e81e18efb06c82ba76")); - dataVersionMap.put("data/devices/virtexu/xcvu095_db.dat", new Pair<>("xcvu095-db-dat", "b194e6fbce0d5020d650c1d152be88a7")); - dataVersionMap.put("data/devices/virtexu/xcvu125_CIV_db.dat", new Pair<>("xcvu125-civ-db-dat", "c1b86231ef81a96b44ed577c4d23959b")); - dataVersionMap.put("data/devices/virtexu/xcvu125_db.dat", new Pair<>("xcvu125-db-dat", "befa7845542b36ca9f213a83ba2dc4bd")); - dataVersionMap.put("data/devices/virtexu/xcvu160_CIV_db.dat", new Pair<>("xcvu160-civ-db-dat", "3c5d9e3b54d494751e5638eae6efe33f")); - dataVersionMap.put("data/devices/virtexu/xcvu160_db.dat", new Pair<>("xcvu160-db-dat", "e75e1364d6ee2db9cef7461c1c3ae9c7")); - dataVersionMap.put("data/devices/virtexu/xcvu190_CIV_db.dat", new Pair<>("xcvu190-civ-db-dat", "f88a35b7382948ed3e683a7ad0a3b49e")); - dataVersionMap.put("data/devices/virtexu/xcvu190_db.dat", new Pair<>("xcvu190-db-dat", "9b62cb1fb4ff8f7f1dfb65917e9a81a5")); - dataVersionMap.put("data/devices/virtexu/xcvu440_CIV_db.dat", new Pair<>("xcvu440-civ-db-dat", "d22ffd26ff6a73f27a632123dcef3e33")); - dataVersionMap.put("data/devices/virtexu/xcvu440_db.dat", new Pair<>("xcvu440-db-dat", "067a1c41071a690b66c378d6c9e7762c")); - dataVersionMap.put("data/devices/virtexuplus/xcu200_db.dat", new Pair<>("xcu200-db-dat", "5d99756969b0a41b050d6de78a321c5e")); - dataVersionMap.put("data/devices/virtexuplus/xcu250_db.dat", new Pair<>("xcu250-db-dat", "274131605e6b130a4bcef99fbf08bd4a")); - dataVersionMap.put("data/devices/virtexuplus/xcvu11p_CIV_db.dat", new Pair<>("xcvu11p-civ-db-dat", "e467ccc8ab779303398b761f43cd53aa")); - dataVersionMap.put("data/devices/virtexuplus/xcvu11p_db.dat", new Pair<>("xcvu11p-db-dat", "1749af62857f4aafa1f213591cb1ea58")); - dataVersionMap.put("data/devices/virtexuplus/xcvu13p_CIV_db.dat", new Pair<>("xcvu13p-civ-db-dat", "5701d014fe5bad6f6743ae0d9ef87115")); - dataVersionMap.put("data/devices/virtexuplus/xcvu13p_db.dat", new Pair<>("xcvu13p-db-dat", "d4c48189ff4e9add69c6653bb7a260af")); - dataVersionMap.put("data/devices/virtexuplus/xcvu19p_CIV_db.dat", new Pair<>("xcvu19p-civ-db-dat", "8e42ccf2301a00e4a90023867e7ec193")); - dataVersionMap.put("data/devices/virtexuplus/xcvu19p_db.dat", new Pair<>("xcvu19p-db-dat", "1bc92e443d2cd769ae96794e4a1d0da1")); - dataVersionMap.put("data/devices/virtexuplus/xcvu3p_CIV_db.dat", new Pair<>("xcvu3p-civ-db-dat", "2ee7a3dee107ebe03edbaf490990f13c")); - dataVersionMap.put("data/devices/virtexuplus/xcvu3p_db.dat", new Pair<>("xcvu3p-db-dat", "f805e161cd76bac1ff913158f20d6d6d")); - dataVersionMap.put("data/devices/virtexuplus/xcvu5p_CIV_db.dat", new Pair<>("xcvu5p-civ-db-dat", "0a50b9f5dbad1071d37cd34bfc59dfaa")); - dataVersionMap.put("data/devices/virtexuplus/xcvu5p_db.dat", new Pair<>("xcvu5p-db-dat", "41162bc914052cd59d24f3d250f2ab04")); - dataVersionMap.put("data/devices/virtexuplus/xcvu7p_CIV_db.dat", new Pair<>("xcvu7p-civ-db-dat", "13d2660ebe5bb2509798467827ecd713")); - dataVersionMap.put("data/devices/virtexuplus/xcvu7p_db.dat", new Pair<>("xcvu7p-db-dat", "356e51a118f9311bfcda74e078f4f7b3")); - dataVersionMap.put("data/devices/virtexuplus/xcvu9p_CIV_db.dat", new Pair<>("xcvu9p-civ-db-dat", "148aedb68120e01253864a25d0f134f0")); - dataVersionMap.put("data/devices/virtexuplus/xcvu9p_db.dat", new Pair<>("xcvu9p-db-dat", "a055fe54f71b077cdc14493f1a3de778")); - dataVersionMap.put("data/devices/virtexuplus/xqvu11p_db.dat", new Pair<>("xqvu11p-db-dat", "badd6c2ec2af3864ac58bf362bfdc5b5")); - dataVersionMap.put("data/devices/virtexuplus/xqvu13p_db.dat", new Pair<>("xqvu13p-db-dat", "a91dee76ae90b430bc54beb00ae149b3")); - dataVersionMap.put("data/devices/virtexuplus/xqvu3p_db.dat", new Pair<>("xqvu3p-db-dat", "02dfd5b15500a3a598d4e13da4dd3d7a")); - dataVersionMap.put("data/devices/virtexuplus/xqvu7p_db.dat", new Pair<>("xqvu7p-db-dat", "fae68aa52ab95b09584ccbc9989ba002")); - dataVersionMap.put("data/devices/virtexuplus/xqvu9p_db.dat", new Pair<>("xqvu9p-db-dat", "0b8d6768fce3b43da9aa9c1d284c161c")); - dataVersionMap.put("data/devices/virtexuplus58g/xcu26_db.dat", new Pair<>("xcu26-db-dat", "16c47a607386d282c88a0819ccb90b06")); - dataVersionMap.put("data/devices/virtexuplus58g/xcux35_db.dat", new Pair<>("xcux35-db-dat", "76d92db8a64a68a4f62f9b1bd77d6b2c")); - dataVersionMap.put("data/devices/virtexuplus58g/xcvu23p_CIV_db.dat", new Pair<>("xcvu23p-civ-db-dat", "532631fd16803d1a9d371867909a15e9")); - dataVersionMap.put("data/devices/virtexuplus58g/xcvu23p_db.dat", new Pair<>("xcvu23p-db-dat", "7a402a8aa1fc19a2ddd345b59c0f92a6")); - dataVersionMap.put("data/devices/virtexuplus58g/xcvu27p_db.dat", new Pair<>("xcvu27p-db-dat", "ae2fe858e3aa6c868dbb521180134ec7")); - dataVersionMap.put("data/devices/virtexuplus58g/xcvu29p_CIV_db.dat", new Pair<>("xcvu29p-civ-db-dat", "21a39c93719cec9782e01118e69c1ddb")); - dataVersionMap.put("data/devices/virtexuplus58g/xcvu29p_db.dat", new Pair<>("xcvu29p-db-dat", "c9adeb4229782a48d628d1e9b79d5f85")); - dataVersionMap.put("data/devices/virtexuplushbm/xcu280_db.dat", new Pair<>("xcu280-db-dat", "ee607e7acc31dd410bb52847db491779")); - dataVersionMap.put("data/devices/virtexuplushbm/xcu50_db.dat", new Pair<>("xcu50-db-dat", "94adbe337bda80262a92fcc91134e526")); - dataVersionMap.put("data/devices/virtexuplushbm/xcu55c_db.dat", new Pair<>("xcu55c-db-dat", "fc3f7906b84a56d87fdb535330631a7f")); - dataVersionMap.put("data/devices/virtexuplushbm/xcu55n_db.dat", new Pair<>("xcu55n-db-dat", "c35073c30c01fa7735d775487fdce538")); - dataVersionMap.put("data/devices/virtexuplushbm/xcvu31p_CIV_db.dat", new Pair<>("xcvu31p-civ-db-dat", "c260523b70d33784a4daec16cd8c6746")); - dataVersionMap.put("data/devices/virtexuplushbm/xcvu31p_db.dat", new Pair<>("xcvu31p-db-dat", "fff4e230b2a9884e55029d4f6586434d")); - dataVersionMap.put("data/devices/virtexuplushbm/xcvu33p_CIV_db.dat", new Pair<>("xcvu33p-civ-db-dat", "cd199c8cfd0ed8066d2ad7169a6c07b1")); - dataVersionMap.put("data/devices/virtexuplushbm/xcvu33p_db.dat", new Pair<>("xcvu33p-db-dat", "5952be515b1d44fab892aba4b0193c2b")); - dataVersionMap.put("data/devices/virtexuplushbm/xcvu35p_CIV_db.dat", new Pair<>("xcvu35p-civ-db-dat", "21eb26cd6f6ea454c1c9e23d2622d273")); - dataVersionMap.put("data/devices/virtexuplushbm/xcvu35p_db.dat", new Pair<>("xcvu35p-db-dat", "5428b2cbd6a3753a33a83bd2dee284cd")); - dataVersionMap.put("data/devices/virtexuplushbm/xcvu37p_CIV_db.dat", new Pair<>("xcvu37p-civ-db-dat", "43f7a97781c2eb90eafdd3640e767b65")); - dataVersionMap.put("data/devices/virtexuplushbm/xcvu37p_db.dat", new Pair<>("xcvu37p-db-dat", "b4a10ab72e1017811281dfc0c8eaec94")); - dataVersionMap.put("data/devices/virtexuplushbm/xcvu45p_CIV_db.dat", new Pair<>("xcvu45p-civ-db-dat", "f231fbc253ae6c415079fa16544b25ff")); - dataVersionMap.put("data/devices/virtexuplushbm/xcvu45p_db.dat", new Pair<>("xcvu45p-db-dat", "db8573aac1d3e88b7c4ef4811faa7acd")); - dataVersionMap.put("data/devices/virtexuplushbm/xcvu47p_CIV_db.dat", new Pair<>("xcvu47p-civ-db-dat", "4ab61a70b3477c7089d0346d3b0f6b3b")); - dataVersionMap.put("data/devices/virtexuplushbm/xcvu47p_db.dat", new Pair<>("xcvu47p-db-dat", "1cf99371b29b0c8aa641d629e06a65f3")); - dataVersionMap.put("data/devices/virtexuplushbm/xcvu57p_CIV_db.dat", new Pair<>("xcvu57p-civ-db-dat", "d8ffecd79281bc83a3d896395a616142")); - dataVersionMap.put("data/devices/virtexuplushbm/xcvu57p_db.dat", new Pair<>("xcvu57p-db-dat", "7c72a0c5bdeff5bdd73bca0417f2cd9e")); - dataVersionMap.put("data/devices/virtexuplushbm/xqvu37p_db.dat", new Pair<>("xqvu37p-db-dat", "92cab74440a204d17a784b09d2a1c326")); - dataVersionMap.put("data/devices/zynq/xa7z010_db.dat", new Pair<>("xa7z010-db-dat", "092bdce0907123acd5cca412d07a3122")); - dataVersionMap.put("data/devices/zynq/xa7z020_db.dat", new Pair<>("xa7z020-db-dat", "d76154945850c125ca02dc53ec004427")); - dataVersionMap.put("data/devices/zynq/xa7z030_db.dat", new Pair<>("xa7z030-db-dat", "6a5eb14fdc1bd5f345d7dfb7f46c0572")); - dataVersionMap.put("data/devices/zynq/xc7z007s_db.dat", new Pair<>("xc7z007s-db-dat", "b666abd637b6156a85e2d256841cfc37")); - dataVersionMap.put("data/devices/zynq/xc7z010_db.dat", new Pair<>("xc7z010-db-dat", "a66bfb860439663cfa24c10f816f70af")); - dataVersionMap.put("data/devices/zynq/xc7z010i_db.dat", new Pair<>("xc7z010i-db-dat", "56a093e1f293c5417bb8c0cb857cd27d")); - dataVersionMap.put("data/devices/zynq/xc7z012s_db.dat", new Pair<>("xc7z012s-db-dat", "a2157b50e4bf143820f1f93362a8cbe8")); - dataVersionMap.put("data/devices/zynq/xc7z014s_db.dat", new Pair<>("xc7z014s-db-dat", "bbbf6b0c8ae79f56cc60deaf17b64671")); - dataVersionMap.put("data/devices/zynq/xc7z015_db.dat", new Pair<>("xc7z015-db-dat", "7c1a3164c7882c19171f752610d5c038")); - dataVersionMap.put("data/devices/zynq/xc7z015i_db.dat", new Pair<>("xc7z015i-db-dat", "6673be982383404c2f3396aa969f3860")); - dataVersionMap.put("data/devices/zynq/xc7z020_db.dat", new Pair<>("xc7z020-db-dat", "fc5bebe46572f592245e4aed441c029e")); - dataVersionMap.put("data/devices/zynq/xc7z020i_db.dat", new Pair<>("xc7z020i-db-dat", "0249d0f1023f154cd1a968a64b1332f6")); - dataVersionMap.put("data/devices/zynq/xc7z030_db.dat", new Pair<>("xc7z030-db-dat", "06c61846a7d995cb03a0658f6928d008")); - dataVersionMap.put("data/devices/zynq/xc7z030i_db.dat", new Pair<>("xc7z030i-db-dat", "0b4b0dc8c010ddb33a9694ef92733eb0")); - dataVersionMap.put("data/devices/zynq/xc7z035_db.dat", new Pair<>("xc7z035-db-dat", "b7cb1c466e37987091f3b595ab818f21")); - dataVersionMap.put("data/devices/zynq/xc7z035i_db.dat", new Pair<>("xc7z035i-db-dat", "1f31559106e7c627e423dd479bef3262")); - dataVersionMap.put("data/devices/zynq/xc7z045_db.dat", new Pair<>("xc7z045-db-dat", "6c836f4fa698ddab028a8609e063336c")); - dataVersionMap.put("data/devices/zynq/xc7z045i_db.dat", new Pair<>("xc7z045i-db-dat", "d5741ded66bdc354e239c99cd9cfd34c")); - dataVersionMap.put("data/devices/zynq/xc7z100_db.dat", new Pair<>("xc7z100-db-dat", "0e81da2a7413068bb53735a1d0c928b4")); - dataVersionMap.put("data/devices/zynq/xc7z100i_db.dat", new Pair<>("xc7z100i-db-dat", "0609a0c20edd5d5f403c56c4671641f0")); - dataVersionMap.put("data/devices/zynq/xq7z020_db.dat", new Pair<>("xq7z020-db-dat", "7853e053b22d1a08f5d993696584415b")); - dataVersionMap.put("data/devices/zynq/xq7z030_db.dat", new Pair<>("xq7z030-db-dat", "de2799d72680d0182c6946b210d53528")); - dataVersionMap.put("data/devices/zynq/xq7z045_db.dat", new Pair<>("xq7z045-db-dat", "7fe706467a4e6b2002b9418fb59bfcbd")); - dataVersionMap.put("data/devices/zynq/xq7z100_db.dat", new Pair<>("xq7z100-db-dat", "0ef14d93d813d9d4aad8c532758c5014")); - dataVersionMap.put("data/devices/zynquplus/xazu11eg_db.dat", new Pair<>("xazu11eg-db-dat", "8e09f078863d76c0f0d3905822774f0a")); - dataVersionMap.put("data/devices/zynquplus/xazu1eg_db.dat", new Pair<>("xazu1eg-db-dat", "119cc5a7544511182a7814284c0c6a1d")); - dataVersionMap.put("data/devices/zynquplus/xazu2eg_db.dat", new Pair<>("xazu2eg-db-dat", "cdfe3c4fb1002069b149268fb3cf312b")); - dataVersionMap.put("data/devices/zynquplus/xazu3eg_db.dat", new Pair<>("xazu3eg-db-dat", "178047a3a9ea48b78a1822f2ce573dd2")); - dataVersionMap.put("data/devices/zynquplus/xazu3teg_db.dat", new Pair<>("xazu3teg-db-dat", "edd9aafa5776632f351deb52fd82aad9")); - dataVersionMap.put("data/devices/zynquplus/xazu4ev_db.dat", new Pair<>("xazu4ev-db-dat", "884a12969e2c02fee0e411c97dc3ddf8")); - dataVersionMap.put("data/devices/zynquplus/xazu5ev_db.dat", new Pair<>("xazu5ev-db-dat", "ee0bf0ddb9d88ce68d7a280571ad91d6")); - dataVersionMap.put("data/devices/zynquplus/xazu7ev_db.dat", new Pair<>("xazu7ev-db-dat", "21624f0ac0aa2efa331073107cbe2f9c")); - dataVersionMap.put("data/devices/zynquplus/xck24_db.dat", new Pair<>("xck24-db-dat", "bf4bb6a50161fe8fd44a5773ae4d7256")); - dataVersionMap.put("data/devices/zynquplus/xck26_db.dat", new Pair<>("xck26-db-dat", "82dee8e70adf8cbc6562c1b7fa33f977")); - dataVersionMap.put("data/devices/zynquplus/xcu25_db.dat", new Pair<>("xcu25-db-dat", "59ab1a1ff5c6a2f49f64014eff10d6e6")); - dataVersionMap.put("data/devices/zynquplus/xcu30_db.dat", new Pair<>("xcu30-db-dat", "4829ba3a398cab16f143c5ae8fc69980")); - dataVersionMap.put("data/devices/zynquplus/xczu11eg_db.dat", new Pair<>("xczu11eg-db-dat", "d73f3caecf1c7d0f82436b1a6347a06d")); - dataVersionMap.put("data/devices/zynquplus/xczu15eg_db.dat", new Pair<>("xczu15eg-db-dat", "091773b1d05b7cf519de04a4f86675bc")); - dataVersionMap.put("data/devices/zynquplus/xczu17eg_db.dat", new Pair<>("xczu17eg-db-dat", "bcbe252a7c570e59cdc9b56aa4ca14ce")); - dataVersionMap.put("data/devices/zynquplus/xczu19eg_db.dat", new Pair<>("xczu19eg-db-dat", "2c449091c0529de78ee7182f6c66b0f8")); - dataVersionMap.put("data/devices/zynquplus/xczu1cg_db.dat", new Pair<>("xczu1cg-db-dat", "5c86df9a5949d2ff51f0e01042b53a9d")); - dataVersionMap.put("data/devices/zynquplus/xczu1eg_db.dat", new Pair<>("xczu1eg-db-dat", "0c047213bf2f01633deb26bfbdcfdb31")); - dataVersionMap.put("data/devices/zynquplus/xczu2cg_db.dat", new Pair<>("xczu2cg-db-dat", "cd1017fb8aa545611e2c0b51de130d3b")); - dataVersionMap.put("data/devices/zynquplus/xczu2eg_db.dat", new Pair<>("xczu2eg-db-dat", "c404f5dd97b87379dada0d6630b47e11")); - dataVersionMap.put("data/devices/zynquplus/xczu3cg_db.dat", new Pair<>("xczu3cg-db-dat", "6a8853ac468e0ecc3990f8e03405b78e")); - dataVersionMap.put("data/devices/zynquplus/xczu3eg_db.dat", new Pair<>("xczu3eg-db-dat", "b5b2daf125c096867612d14c45d60688")); - dataVersionMap.put("data/devices/zynquplus/xczu3tcg_db.dat", new Pair<>("xczu3tcg-db-dat", "224956d66a5234f12948844a735a6a14")); - dataVersionMap.put("data/devices/zynquplus/xczu3teg_db.dat", new Pair<>("xczu3teg-db-dat", "9d0da7857b48d246108815323bc67443")); - dataVersionMap.put("data/devices/zynquplus/xczu4cg_db.dat", new Pair<>("xczu4cg-db-dat", "5a4f5d95cb0a7be253ae0881977137a6")); - dataVersionMap.put("data/devices/zynquplus/xczu4eg_db.dat", new Pair<>("xczu4eg-db-dat", "2676f986833030e6de5c065f0d09d87a")); - dataVersionMap.put("data/devices/zynquplus/xczu4ev_db.dat", new Pair<>("xczu4ev-db-dat", "a11e6149d4f698a16e798cc04eedbc11")); - dataVersionMap.put("data/devices/zynquplus/xczu5cg_db.dat", new Pair<>("xczu5cg-db-dat", "2bdd991f8e0e43c21101504ccbb5863c")); - dataVersionMap.put("data/devices/zynquplus/xczu5eg_db.dat", new Pair<>("xczu5eg-db-dat", "2d2c8082c7c04872cfe5d5d139157adf")); - dataVersionMap.put("data/devices/zynquplus/xczu5ev_db.dat", new Pair<>("xczu5ev-db-dat", "7cbd727a5f9e5cc1ee86fb4ecabdf138")); - dataVersionMap.put("data/devices/zynquplus/xczu6cg_db.dat", new Pair<>("xczu6cg-db-dat", "efd5b1ea19983508da2bab0796959c98")); - dataVersionMap.put("data/devices/zynquplus/xczu6eg_db.dat", new Pair<>("xczu6eg-db-dat", "b9eb6150ba77bff6942a32eb86d2244b")); - dataVersionMap.put("data/devices/zynquplus/xczu7cg_db.dat", new Pair<>("xczu7cg-db-dat", "86f8738a321430e66c1d04503cee4960")); - dataVersionMap.put("data/devices/zynquplus/xczu7eg_db.dat", new Pair<>("xczu7eg-db-dat", "3bf622b6ec0c623e5c44b922ba788548")); - dataVersionMap.put("data/devices/zynquplus/xczu7ev_db.dat", new Pair<>("xczu7ev-db-dat", "f3ae53bdf1c1b9d2ce00bcf76499b72c")); - dataVersionMap.put("data/devices/zynquplus/xczu9cg_db.dat", new Pair<>("xczu9cg-db-dat", "60f1c447b47949130d95e5f9eb561cb7")); - dataVersionMap.put("data/devices/zynquplus/xczu9eg_db.dat", new Pair<>("xczu9eg-db-dat", "18250e4b9735ee21e51b4cd4895856b6")); - dataVersionMap.put("data/devices/zynquplus/xqzu11eg_db.dat", new Pair<>("xqzu11eg-db-dat", "8334c9659089035896ff07c842bb865c")); - dataVersionMap.put("data/devices/zynquplus/xqzu15eg_db.dat", new Pair<>("xqzu15eg-db-dat", "3f81282b9090239c108cd33f85465691")); - dataVersionMap.put("data/devices/zynquplus/xqzu19eg_db.dat", new Pair<>("xqzu19eg-db-dat", "1e368717545941751963f8078d1eef76")); - dataVersionMap.put("data/devices/zynquplus/xqzu3eg_db.dat", new Pair<>("xqzu3eg-db-dat", "bfdccc96cda47d6ef4aff5ec09fe486b")); - dataVersionMap.put("data/devices/zynquplus/xqzu4eg_db.dat", new Pair<>("xqzu4eg-db-dat", "a623fde3083dab1ebe58f20003d5b98a")); - dataVersionMap.put("data/devices/zynquplus/xqzu5ev_db.dat", new Pair<>("xqzu5ev-db-dat", "8ed19803bc456528e04bb6107a8b5da5")); - dataVersionMap.put("data/devices/zynquplus/xqzu7ev_db.dat", new Pair<>("xqzu7ev-db-dat", "7f8a225012f4c9a32d1cac15ec9774a3")); - dataVersionMap.put("data/devices/zynquplus/xqzu9eg_db.dat", new Pair<>("xqzu9eg-db-dat", "e1faf2d2828c86cae6762ec2835e62d2")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu21dr_db.dat", new Pair<>("xczu21dr-db-dat", "89a73b024f8e263c4d50907ea0f386fc")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu25dr_db.dat", new Pair<>("xczu25dr-db-dat", "2b8a32c7fb40856cde10ed0f57f2a2c2")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu27dr_db.dat", new Pair<>("xczu27dr-db-dat", "9257b5751e10d24a3e442b9f6526df5e")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu28dr_db.dat", new Pair<>("xczu28dr-db-dat", "f0a31ab48b54716343ceb4a8b79f323a")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu29dr_db.dat", new Pair<>("xczu29dr-db-dat", "6a4441793068d3ba2f36fae949d746df")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu39dr_db.dat", new Pair<>("xczu39dr-db-dat", "ca2b52361c39e4fdff8fd9944cc2802d")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu42dr_db.dat", new Pair<>("xczu42dr-db-dat", "de7df190ea053052dcc7c08726170f01")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu43dr_db.dat", new Pair<>("xczu43dr-db-dat", "4ff7bc887e1d2656b0a314cf882d1d80")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu46dr_db.dat", new Pair<>("xczu46dr-db-dat", "8b8e3456190e119267a25d98b689c1ef")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu47dr_db.dat", new Pair<>("xczu47dr-db-dat", "bedc4f98154ec578c5b692ea8daa0beb")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu48dr_db.dat", new Pair<>("xczu48dr-db-dat", "f003d622ff5c9be1c45a0831f1ce82a0")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu49dr_db.dat", new Pair<>("xczu49dr-db-dat", "5a599490a93571c56e9fbee972c4ac17")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu63dr_db.dat", new Pair<>("xczu63dr-db-dat", "7f30a1d869b91b91a1d3cc8f53c09d96")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu64dr_db.dat", new Pair<>("xczu64dr-db-dat", "8e3ef8c4420e865189dbc601dba37898")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu65dr_db.dat", new Pair<>("xczu65dr-db-dat", "b3ce53b99ff5ed2d09746c90fd43eca3")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xczu67dr_db.dat", new Pair<>("xczu67dr-db-dat", "240c0f0df5feceeb641a74bb4293a4fe")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xqzu21dr_db.dat", new Pair<>("xqzu21dr-db-dat", "3e25885e218724b1c7819e15dd18ded4")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xqzu28dr_db.dat", new Pair<>("xqzu28dr-db-dat", "2196728df335cde3e249cd48851883d8")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xqzu29dr_db.dat", new Pair<>("xqzu29dr-db-dat", "e3c7e69380c23716bcc39eb93563904c")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xqzu48dr_db.dat", new Pair<>("xqzu48dr-db-dat", "37366cd092792f9cd6f45dca239d09ad")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xqzu49dr_db.dat", new Pair<>("xqzu49dr-db-dat", "7679cff74241eac6a9daee28c5a9966a")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xqzu65dr_db.dat", new Pair<>("xqzu65dr-db-dat", "f15adefc7ab374462079410477aec96b")); - dataVersionMap.put("data/devices/zynquplusrfsoc/xqzu67dr_db.dat", new Pair<>("xqzu67dr-db-dat", "143425fe53e695b473ca16676db07680")); - dataVersionMap.put("data/partdump.csv", new Pair<>("partdump-csv", "7c9bd6bf647f18f869c91944e8cd6b15")); - dataVersionMap.put("data/parts.db", new Pair<>("parts-db", "5600d0879f1c7cd2d8dac6dada2f52aa")); - dataVersionMap.put("data/unisim_data.dat", new Pair<>("unisim-data-dat", "4c693316fa695c9147b6f987f0686446")); + dataVersionMap.put("data/cell_pin_defaults.dat", new Pair<>("cell-pin-defaults-dat", "2d2c9c4a896f51376498054abc650e3c")); + dataVersionMap.put("data/devices/artix7/xa7a100t_db.dat", new Pair<>("xa7a100t-db-dat", "45a46f75b9247d5efa7e1619c2e4ff70")); + dataVersionMap.put("data/devices/artix7/xa7a12t_db.dat", new Pair<>("xa7a12t-db-dat", "b277526a30f077bb1abfa3ade1d0eab9")); + dataVersionMap.put("data/devices/artix7/xa7a15t_db.dat", new Pair<>("xa7a15t-db-dat", "18c3627fef689d88c04ea41e26b5d93f")); + dataVersionMap.put("data/devices/artix7/xa7a25t_db.dat", new Pair<>("xa7a25t-db-dat", "fce72c383b0362fd26015d79cf8c1a7c")); + dataVersionMap.put("data/devices/artix7/xa7a35t_db.dat", new Pair<>("xa7a35t-db-dat", "aaaf82471c2a3562a4911711e47e811e")); + dataVersionMap.put("data/devices/artix7/xa7a50t_db.dat", new Pair<>("xa7a50t-db-dat", "622fd90cd66de6c13b2e35255a1ece86")); + dataVersionMap.put("data/devices/artix7/xa7a75t_db.dat", new Pair<>("xa7a75t-db-dat", "1c7aeddb62c55007ed5a5cd57dc97edd")); + dataVersionMap.put("data/devices/artix7/xc7a100t_db.dat", new Pair<>("xc7a100t-db-dat", "4d99b64a543c695f176b21f32d2f8a9d")); + dataVersionMap.put("data/devices/artix7/xc7a100ti_db.dat", new Pair<>("xc7a100ti-db-dat", "22b084ed0fa1f09b9cc1ea9abb8ae1f7")); + dataVersionMap.put("data/devices/artix7/xc7a100tl_db.dat", new Pair<>("xc7a100tl-db-dat", "2db0391cd0dd802009edb50ef2418643")); + dataVersionMap.put("data/devices/artix7/xc7a12t_db.dat", new Pair<>("xc7a12t-db-dat", "b573cfd27770b825094caf6cbb8378fe")); + dataVersionMap.put("data/devices/artix7/xc7a12ti_db.dat", new Pair<>("xc7a12ti-db-dat", "17c1f0b1b3fb462600a04e5430be2f54")); + dataVersionMap.put("data/devices/artix7/xc7a12tl_db.dat", new Pair<>("xc7a12tl-db-dat", "c7c8278addd88edc695f31de318de3af")); + dataVersionMap.put("data/devices/artix7/xc7a15t_db.dat", new Pair<>("xc7a15t-db-dat", "e8b46327c91427623e4abafcb77a2818")); + dataVersionMap.put("data/devices/artix7/xc7a15ti_db.dat", new Pair<>("xc7a15ti-db-dat", "bdf0c10a5aa0f85c43466542442c4b3b")); + dataVersionMap.put("data/devices/artix7/xc7a15tl_db.dat", new Pair<>("xc7a15tl-db-dat", "36b8abccde0f26bf00bac6fad8d49265")); + dataVersionMap.put("data/devices/artix7/xc7a200t_db.dat", new Pair<>("xc7a200t-db-dat", "c8319bf7c8182f843abd04b0187017b7")); + dataVersionMap.put("data/devices/artix7/xc7a200ti_db.dat", new Pair<>("xc7a200ti-db-dat", "20080e9ab2a1c1e06c07fb64d54a94c5")); + dataVersionMap.put("data/devices/artix7/xc7a200tl_db.dat", new Pair<>("xc7a200tl-db-dat", "37cfec45d2018f41c9661d407086464c")); + dataVersionMap.put("data/devices/artix7/xc7a25t_db.dat", new Pair<>("xc7a25t-db-dat", "afbee8577f7b560789dae9fe776108e3")); + dataVersionMap.put("data/devices/artix7/xc7a25ti_db.dat", new Pair<>("xc7a25ti-db-dat", "2be7a2b7875ca206c55df00a4f1b0735")); + dataVersionMap.put("data/devices/artix7/xc7a25tl_db.dat", new Pair<>("xc7a25tl-db-dat", "14d6bd6bc88caf28630fc1c86837bf33")); + dataVersionMap.put("data/devices/artix7/xc7a35t_db.dat", new Pair<>("xc7a35t-db-dat", "69bf771bda9b8b0f232e4740942bfd8d")); + dataVersionMap.put("data/devices/artix7/xc7a35ti_db.dat", new Pair<>("xc7a35ti-db-dat", "0167d0721be1b0286a2f98b7ab2ee22f")); + dataVersionMap.put("data/devices/artix7/xc7a35tl_db.dat", new Pair<>("xc7a35tl-db-dat", "262eea6f53e036215b65cf2c2f92539e")); + dataVersionMap.put("data/devices/artix7/xc7a50t_db.dat", new Pair<>("xc7a50t-db-dat", "294d8bc00d908a3c5a27c5189f3c5521")); + dataVersionMap.put("data/devices/artix7/xc7a50ti_db.dat", new Pair<>("xc7a50ti-db-dat", "33946d734d119e1c96bcc90e4b213d82")); + dataVersionMap.put("data/devices/artix7/xc7a50tl_db.dat", new Pair<>("xc7a50tl-db-dat", "c28eb101b6f98a865255f96d93f750fc")); + dataVersionMap.put("data/devices/artix7/xc7a75t_db.dat", new Pair<>("xc7a75t-db-dat", "be1b18d113d79c6be5fdbee653247d9c")); + dataVersionMap.put("data/devices/artix7/xc7a75ti_db.dat", new Pair<>("xc7a75ti-db-dat", "e7e6c35ce467dae6c8ee887566f1ef2d")); + dataVersionMap.put("data/devices/artix7/xc7a75tl_db.dat", new Pair<>("xc7a75tl-db-dat", "268ee8a56c213c9ca4cc18ae5617b59f")); + dataVersionMap.put("data/devices/artix7/xq7a100t_db.dat", new Pair<>("xq7a100t-db-dat", "f58516a1c2488366f75164e16cc3926f")); + dataVersionMap.put("data/devices/artix7/xq7a200t_db.dat", new Pair<>("xq7a200t-db-dat", "f997883176ace0f0988239be7c95c390")); + dataVersionMap.put("data/devices/artix7/xq7a50t_db.dat", new Pair<>("xq7a50t-db-dat", "088d6a40a9b67cfddd3bb8be35b2a03e")); + dataVersionMap.put("data/devices/kintex7/xa7k160t_db.dat", new Pair<>("xa7k160t-db-dat", "92a3dda218892ff09ffe3dcecf2218b1")); + dataVersionMap.put("data/devices/kintex7/xc7k160t_db.dat", new Pair<>("xc7k160t-db-dat", "e0fd2836e8143bd8f7a80c1ee7e874cd")); + dataVersionMap.put("data/devices/kintex7/xc7k160ti_db.dat", new Pair<>("xc7k160ti-db-dat", "ce317ec6706e8202c56cb93d9dfed0a6")); + dataVersionMap.put("data/devices/kintex7/xc7k160tl_db.dat", new Pair<>("xc7k160tl-db-dat", "ed04c2ab765109f46e5467d0b85f7625")); + dataVersionMap.put("data/devices/kintex7/xc7k325t_db.dat", new Pair<>("xc7k325t-db-dat", "a500dba1ee744b8846c1240cd86548a3")); + dataVersionMap.put("data/devices/kintex7/xc7k325ti_db.dat", new Pair<>("xc7k325ti-db-dat", "ede191e23a85775d7fdc1bd62a430d0e")); + dataVersionMap.put("data/devices/kintex7/xc7k325tl_db.dat", new Pair<>("xc7k325tl-db-dat", "b1d5662f1a9a4306322eb2dc73088ae7")); + dataVersionMap.put("data/devices/kintex7/xc7k355t_db.dat", new Pair<>("xc7k355t-db-dat", "6b3773a25050c18958b7f63999fcc5fb")); + dataVersionMap.put("data/devices/kintex7/xc7k355ti_db.dat", new Pair<>("xc7k355ti-db-dat", "9ef1f68ac59ec6c6e0b0b30c295ef0e3")); + dataVersionMap.put("data/devices/kintex7/xc7k355tl_db.dat", new Pair<>("xc7k355tl-db-dat", "10c8cbc66b0e5ae44c57f1faa591e1ec")); + dataVersionMap.put("data/devices/kintex7/xc7k410t_db.dat", new Pair<>("xc7k410t-db-dat", "88250cde0a187521efc963cf1a8701f7")); + dataVersionMap.put("data/devices/kintex7/xc7k410ti_db.dat", new Pair<>("xc7k410ti-db-dat", "f0119d74c0581fa5f4bc5fe21ca79d1e")); + dataVersionMap.put("data/devices/kintex7/xc7k410tl_db.dat", new Pair<>("xc7k410tl-db-dat", "0b1f7f3fad2b52b2c436e3a6b21a3b05")); + dataVersionMap.put("data/devices/kintex7/xc7k420t_db.dat", new Pair<>("xc7k420t-db-dat", "98c1a79bd669f153d448f729d6990733")); + dataVersionMap.put("data/devices/kintex7/xc7k420ti_db.dat", new Pair<>("xc7k420ti-db-dat", "6897d79957308a2c67b97b18a3e4b30e")); + dataVersionMap.put("data/devices/kintex7/xc7k420tl_db.dat", new Pair<>("xc7k420tl-db-dat", "414898f015b2d8be9878608727e5cc43")); + dataVersionMap.put("data/devices/kintex7/xc7k480t_db.dat", new Pair<>("xc7k480t-db-dat", "4578b9bcd56b03a32a4cdc33b4106dd0")); + dataVersionMap.put("data/devices/kintex7/xc7k480ti_db.dat", new Pair<>("xc7k480ti-db-dat", "6900d8bc940c0e25f83955e5ba9bd772")); + dataVersionMap.put("data/devices/kintex7/xc7k480tl_db.dat", new Pair<>("xc7k480tl-db-dat", "10c4d464b2f395e04cddf9850cc712fe")); + dataVersionMap.put("data/devices/kintex7/xc7k70t_db.dat", new Pair<>("xc7k70t-db-dat", "98dfcdff69607d0b465421a1705460d8")); + dataVersionMap.put("data/devices/kintex7/xc7k70tl_db.dat", new Pair<>("xc7k70tl-db-dat", "fd9ce48cb712dbf5f4973ad95f4c5190")); + dataVersionMap.put("data/devices/kintex7/xq7k325t_db.dat", new Pair<>("xq7k325t-db-dat", "40f6f1bef73d45f0978d6bce9b3b8dda")); + dataVersionMap.put("data/devices/kintex7/xq7k325tl_db.dat", new Pair<>("xq7k325tl-db-dat", "c02164deb80467c5b92517bcfa4d1207")); + dataVersionMap.put("data/devices/kintex7/xq7k410t_db.dat", new Pair<>("xq7k410t-db-dat", "1235d36d81ebdb079b89564ac66650ad")); + dataVersionMap.put("data/devices/kintex7/xq7k410tl_db.dat", new Pair<>("xq7k410tl-db-dat", "549e6a58301cd9b0faac87ae33a756f6")); + dataVersionMap.put("data/devices/kintexu/xcku025_db.dat", new Pair<>("xcku025-db-dat", "6786ba059c6718c794745f314e9c32d9")); + dataVersionMap.put("data/devices/kintexu/xcku035_db.dat", new Pair<>("xcku035-db-dat", "c70e1b7fb1d9379df150adee3fcacc5a")); + dataVersionMap.put("data/devices/kintexu/xcku040_db.dat", new Pair<>("xcku040-db-dat", "7e1cd10b35fa23eaef5a4ae9187f825b")); + dataVersionMap.put("data/devices/kintexu/xcku060_CIV_db.dat", new Pair<>("xcku060-civ-db-dat", "a0b44ed755c88acc232d13ee5c2eaf5a")); + dataVersionMap.put("data/devices/kintexu/xcku060_db.dat", new Pair<>("xcku060-db-dat", "ed1f0b4f27b60f9e2ab4125a8d0233b3")); + dataVersionMap.put("data/devices/kintexu/xcku085_CIV_db.dat", new Pair<>("xcku085-civ-db-dat", "ab612569cec9246e83ea3dcf506f7b55")); + dataVersionMap.put("data/devices/kintexu/xcku085_db.dat", new Pair<>("xcku085-db-dat", "363c0d1829d167082a52b7378bfd9ec4")); + dataVersionMap.put("data/devices/kintexu/xcku095_CIV_db.dat", new Pair<>("xcku095-civ-db-dat", "83527062f52dd9f8fced9126d39a572f")); + dataVersionMap.put("data/devices/kintexu/xcku095_db.dat", new Pair<>("xcku095-db-dat", "9eded79546c0eca2fc740604a9198f6d")); + dataVersionMap.put("data/devices/kintexu/xcku115_CIV_db.dat", new Pair<>("xcku115-civ-db-dat", "6dee5244bf5a9dc55494b7ff5b6c6202")); + dataVersionMap.put("data/devices/kintexu/xcku115_db.dat", new Pair<>("xcku115-db-dat", "9945f5f69d740fb475d942d8d165b2b2")); + dataVersionMap.put("data/devices/kintexu/xqku040_db.dat", new Pair<>("xqku040-db-dat", "d221fb5bef20f2b275f9c6ba0d97a21f")); + dataVersionMap.put("data/devices/kintexu/xqku060_db.dat", new Pair<>("xqku060-db-dat", "a78b3120af4018d7fe340aa27b9cd915")); + dataVersionMap.put("data/devices/kintexu/xqku095_db.dat", new Pair<>("xqku095-db-dat", "64dcf461b29d1d44a630481dfa2cdf94")); + dataVersionMap.put("data/devices/kintexu/xqku115_db.dat", new Pair<>("xqku115-db-dat", "bc18dabac14c107c24ea44e3a5024594")); + dataVersionMap.put("data/devices/kintexu/xqrku060_db.dat", new Pair<>("xqrku060-db-dat", "2cb5d52dc74ff49a1ed51e20eb2a6458")); + dataVersionMap.put("data/devices/kintexuplus/xaau10p_db.dat", new Pair<>("xaau10p-db-dat", "5c5321c378fe7b8d2b4ce03d6b37c750")); + dataVersionMap.put("data/devices/kintexuplus/xaau15p_db.dat", new Pair<>("xaau15p-db-dat", "dbef66512c40a8a85387ae0e7ceef51f")); + dataVersionMap.put("data/devices/kintexuplus/xaau7p_db.dat", new Pair<>("xaau7p-db-dat", "725c7e60767e749ac2108abb210619cb")); + dataVersionMap.put("data/devices/kintexuplus/xcau10p_db.dat", new Pair<>("xcau10p-db-dat", "4c7ee26359217cb10aa5f75265be8585")); + dataVersionMap.put("data/devices/kintexuplus/xcau15p_db.dat", new Pair<>("xcau15p-db-dat", "04bf3b2a61c66e58ac14fe0c7fdb7df7")); + dataVersionMap.put("data/devices/kintexuplus/xcau20p_db.dat", new Pair<>("xcau20p-db-dat", "c168696d042575a94bc4730814f95855")); + dataVersionMap.put("data/devices/kintexuplus/xcau25p_db.dat", new Pair<>("xcau25p-db-dat", "02113677a50becad7e9aac8d48b22938")); + dataVersionMap.put("data/devices/kintexuplus/xcau7p_db.dat", new Pair<>("xcau7p-db-dat", "622f9504c13c75af0b9877bd3717b006")); + dataVersionMap.put("data/devices/kintexuplus/xcku11p_CIV_db.dat", new Pair<>("xcku11p-civ-db-dat", "5f6b4fb6e81e9f01d998b7099c06e0b1")); + dataVersionMap.put("data/devices/kintexuplus/xcku11p_db.dat", new Pair<>("xcku11p-db-dat", "8e0b79eade305b5781238fe82928e30f")); + dataVersionMap.put("data/devices/kintexuplus/xcku13p_db.dat", new Pair<>("xcku13p-db-dat", "74dd5c9d7de9311101f3800c0e0e8ee1")); + dataVersionMap.put("data/devices/kintexuplus/xcku15p_CIV_db.dat", new Pair<>("xcku15p-civ-db-dat", "2e6d47f192e4868c6b631a94c01c3e97")); + dataVersionMap.put("data/devices/kintexuplus/xcku15p_db.dat", new Pair<>("xcku15p-db-dat", "f47acb026b2cb7ab736769b205d385de")); + dataVersionMap.put("data/devices/kintexuplus/xcku19p_CIV_db.dat", new Pair<>("xcku19p-civ-db-dat", "ec3fd302d132792a967b029a08500676")); + dataVersionMap.put("data/devices/kintexuplus/xcku19p_db.dat", new Pair<>("xcku19p-db-dat", "40dd544f67619a4bad3b89f80f95cfcb")); + dataVersionMap.put("data/devices/kintexuplus/xcku3p_db.dat", new Pair<>("xcku3p-db-dat", "7391d206f088ffe54f89482619672830")); + dataVersionMap.put("data/devices/kintexuplus/xcku5p_db.dat", new Pair<>("xcku5p-db-dat", "0d6af65ecc2248c090683b7600f07276")); + dataVersionMap.put("data/devices/kintexuplus/xcku9p_db.dat", new Pair<>("xcku9p-db-dat", "e721dba79df3981bbe1ec0f16685d1ed")); + dataVersionMap.put("data/devices/kintexuplus/xqku15p_db.dat", new Pair<>("xqku15p-db-dat", "27c1f9e39ef3935060f6facd707b2fb0")); + dataVersionMap.put("data/devices/kintexuplus/xqku5p_db.dat", new Pair<>("xqku5p-db-dat", "f0c65214d29811d744301ccdd326eb5a")); + dataVersionMap.put("data/devices/spartan7/xa7s100_db.dat", new Pair<>("xa7s100-db-dat", "a75b8b95422459558b3152079203a146")); + dataVersionMap.put("data/devices/spartan7/xa7s15_db.dat", new Pair<>("xa7s15-db-dat", "ebb08ed90379836df80e7d7388711650")); + dataVersionMap.put("data/devices/spartan7/xa7s25_db.dat", new Pair<>("xa7s25-db-dat", "de98e43784e13c648ded020c98f4108f")); + dataVersionMap.put("data/devices/spartan7/xa7s50_db.dat", new Pair<>("xa7s50-db-dat", "214d51df7346fad0f7d8b2fce6d24de7")); + dataVersionMap.put("data/devices/spartan7/xa7s6_db.dat", new Pair<>("xa7s6-db-dat", "a6493e840130dc52f5431b919525410f")); + dataVersionMap.put("data/devices/spartan7/xa7s75_db.dat", new Pair<>("xa7s75-db-dat", "072bfb16785271f7d426b5ce7e46dccd")); + dataVersionMap.put("data/devices/spartan7/xc7s100_db.dat", new Pair<>("xc7s100-db-dat", "680e46a3aa2ae6353a89813698f39148")); + dataVersionMap.put("data/devices/spartan7/xc7s15_db.dat", new Pair<>("xc7s15-db-dat", "6fd92b568e4a44106ab101c55c61f98a")); + dataVersionMap.put("data/devices/spartan7/xc7s25_db.dat", new Pair<>("xc7s25-db-dat", "e19af5e8ec2b1037500236f4f85d0a92")); + dataVersionMap.put("data/devices/spartan7/xc7s50_db.dat", new Pair<>("xc7s50-db-dat", "8091436ec2c00f3372dad11077f882e3")); + dataVersionMap.put("data/devices/spartan7/xc7s6_db.dat", new Pair<>("xc7s6-db-dat", "eea51ccde2294ac92adf34878a55c9fa")); + dataVersionMap.put("data/devices/spartan7/xc7s75_db.dat", new Pair<>("xc7s75-db-dat", "4168148faf47a1256a616e2d76508de4")); + dataVersionMap.put("data/devices/versal/xave1752_db.dat", new Pair<>("xave1752-db-dat", "e32ac3e52b19f5e12e771f7730e82c5f")); + dataVersionMap.put("data/devices/versal/xave2002_db.dat", new Pair<>("xave2002-db-dat", "e3b322d94c0197fb6a64120628f7f2ac")); + dataVersionMap.put("data/devices/versal/xave2102_db.dat", new Pair<>("xave2102-db-dat", "49c904e79a37771e4708b566da6788e1")); + dataVersionMap.put("data/devices/versal/xave2202_db.dat", new Pair<>("xave2202-db-dat", "dee6e1c982c28f9754aefd3b62c75a5e")); + dataVersionMap.put("data/devices/versal/xave2302_db.dat", new Pair<>("xave2302-db-dat", "ac9bdb3f8da763eda2a62630561f5079")); + dataVersionMap.put("data/devices/versal/xave2602_db.dat", new Pair<>("xave2602-db-dat", "26a56204a79858d8fe5b59ab9490564c")); + dataVersionMap.put("data/devices/versal/xave2802_db.dat", new Pair<>("xave2802-db-dat", "d76e6960ad0a30261eb262a26217bba9")); + dataVersionMap.put("data/devices/versal/xcv80_db.dat", new Pair<>("xcv80-db-dat", "bdea2557b3626a445c2b7878c6f1486f")); + dataVersionMap.put("data/devices/versal/xcvc1502_db.dat", new Pair<>("xcvc1502-db-dat", "43f40ac8bad4e4f3dd2ab4b53c6d48e6")); + dataVersionMap.put("data/devices/versal/xcvc1702_db.dat", new Pair<>("xcvc1702-db-dat", "bf4618929854d60d729fb2316dde1ed3")); + dataVersionMap.put("data/devices/versal/xcvc1802_db.dat", new Pair<>("xcvc1802-db-dat", "cf7b18a73a50f1be008fd39a42dc3da4")); + dataVersionMap.put("data/devices/versal/xcvc1902_db.dat", new Pair<>("xcvc1902-db-dat", "6e50e5236b82272113b859aa6958cb24")); + dataVersionMap.put("data/devices/versal/xcvc2602_db.dat", new Pair<>("xcvc2602-db-dat", "f8a9219829750f27f097dc4a02e85c87")); + dataVersionMap.put("data/devices/versal/xcvc2802_db.dat", new Pair<>("xcvc2802-db-dat", "bb134d52eb588735b203f89619bd76d1")); + dataVersionMap.put("data/devices/versal/xcve1752_db.dat", new Pair<>("xcve1752-db-dat", "2d5e4e7f461e9bdf5ec24a9bb58704a8")); + dataVersionMap.put("data/devices/versal/xcve2002_db.dat", new Pair<>("xcve2002-db-dat", "e9f676e46286d99e830503fb17b88fa1")); + dataVersionMap.put("data/devices/versal/xcve2102_db.dat", new Pair<>("xcve2102-db-dat", "b002e5744d2365a235da5365c4c9206e")); + dataVersionMap.put("data/devices/versal/xcve2202_db.dat", new Pair<>("xcve2202-db-dat", "264bcfc285aaf237326fcb3bdd9dfff7")); + dataVersionMap.put("data/devices/versal/xcve2302_db.dat", new Pair<>("xcve2302-db-dat", "a1a0f6378e6162278f25c9009873e3bd")); + dataVersionMap.put("data/devices/versal/xcve2602_db.dat", new Pair<>("xcve2602-db-dat", "964322295afde8782d95ca2a44b35d28")); + dataVersionMap.put("data/devices/versal/xcve2802_db.dat", new Pair<>("xcve2802-db-dat", "618fd8979147fb1fb2f141b6023056c0")); + dataVersionMap.put("data/devices/versal/xcvh1522_db.dat", new Pair<>("xcvh1522-db-dat", "054ac352522667a6001c295f70f6be7c")); + dataVersionMap.put("data/devices/versal/xcvh1542_db.dat", new Pair<>("xcvh1542-db-dat", "cc76ec8bbecbf4b0a1f188c8424ba215")); + dataVersionMap.put("data/devices/versal/xcvh1582_db.dat", new Pair<>("xcvh1582-db-dat", "835f75b23b08a3741dcf9fe45018163e")); + dataVersionMap.put("data/devices/versal/xcvh1742_db.dat", new Pair<>("xcvh1742-db-dat", "fbc30dcbe842d0e2fc8661ca0a33283a")); + dataVersionMap.put("data/devices/versal/xcvh1782_db.dat", new Pair<>("xcvh1782-db-dat", "57d8cd62447b3e889d556a9263eb69fc")); + dataVersionMap.put("data/devices/versal/xcvm1102_db.dat", new Pair<>("xcvm1102-db-dat", "35047ac140e1cc0bf4f085694c6cad95")); + dataVersionMap.put("data/devices/versal/xcvm1302_db.dat", new Pair<>("xcvm1302-db-dat", "0312e784c8d5b228899ad50afeca655b")); + dataVersionMap.put("data/devices/versal/xcvm1402_db.dat", new Pair<>("xcvm1402-db-dat", "61c6972d8198367d647ba91315c12158")); + dataVersionMap.put("data/devices/versal/xcvm1502_db.dat", new Pair<>("xcvm1502-db-dat", "0eb4c7edb683887f2b909bb398cfaf85")); + dataVersionMap.put("data/devices/versal/xcvm1802_db.dat", new Pair<>("xcvm1802-db-dat", "26cb89f55f1b8476a868999b29e99ef5")); + dataVersionMap.put("data/devices/versal/xcvm2152_db.dat", new Pair<>("xcvm2152-db-dat", "066f0ff8dc819dd2da8abcafbb45d634")); + dataVersionMap.put("data/devices/versal/xcvm2202_db.dat", new Pair<>("xcvm2202-db-dat", "fd37ab4ce7b0cf16974151b323773cc7")); + dataVersionMap.put("data/devices/versal/xcvm2302_db.dat", new Pair<>("xcvm2302-db-dat", "213a812052a69f945e4ff80946844ddd")); + dataVersionMap.put("data/devices/versal/xcvm2502_db.dat", new Pair<>("xcvm2502-db-dat", "9e41002527c52603ddf73d9d9dd556db")); + dataVersionMap.put("data/devices/versal/xcvm2902_db.dat", new Pair<>("xcvm2902-db-dat", "5d6f041b1af4142d001509f929849369")); + dataVersionMap.put("data/devices/versal/xcvp1002_db.dat", new Pair<>("xcvp1002-db-dat", "373e5d0b917994725adc8247f74fdf23")); + dataVersionMap.put("data/devices/versal/xcvp1052_db.dat", new Pair<>("xcvp1052-db-dat", "152642ff12aab7b30ed844b75e6c5d04")); + dataVersionMap.put("data/devices/versal/xcvp1102_db.dat", new Pair<>("xcvp1102-db-dat", "dad1d46c5fd7e9aff431a72356b3313c")); + dataVersionMap.put("data/devices/versal/xcvp1202_db.dat", new Pair<>("xcvp1202-db-dat", "b0a98414d6c8efefb5ac73c665adb6a5")); + dataVersionMap.put("data/devices/versal/xcvp1402_db.dat", new Pair<>("xcvp1402-db-dat", "9060df7da297bb13b4b71b35e944a852")); + dataVersionMap.put("data/devices/versal/xcvp1502_db.dat", new Pair<>("xcvp1502-db-dat", "5da2a97660f22f2bc975fe2af53d2c40")); + dataVersionMap.put("data/devices/versal/xcvp1552_db.dat", new Pair<>("xcvp1552-db-dat", "b3d9e9b4b603c3f50f6d3293b89ffaff")); + dataVersionMap.put("data/devices/versal/xcvp1702_db.dat", new Pair<>("xcvp1702-db-dat", "29f35bb7909cc39b777c33e15d6e4f95")); + dataVersionMap.put("data/devices/versal/xcvp1802_db.dat", new Pair<>("xcvp1802-db-dat", "0ce2ca0dc7fa41fd91ae6945fc360be0")); + dataVersionMap.put("data/devices/versal/xcvp1902_db.dat", new Pair<>("xcvp1902-db-dat", "1a066d39bff12a95f94f95a5731bdf54")); + dataVersionMap.put("data/devices/versal/xcvp2502_db.dat", new Pair<>("xcvp2502-db-dat", "32308ab881ca23988080e28e143adff3")); + dataVersionMap.put("data/devices/versal/xcvp2802_db.dat", new Pair<>("xcvp2802-db-dat", "e1b0b2c250ef56a03dcab6e501da7e91")); + dataVersionMap.put("data/devices/versal/xqrvc1902_db.dat", new Pair<>("xqrvc1902-db-dat", "80c34a552d3514dc1ad1e4576a513831")); + dataVersionMap.put("data/devices/versal/xqrve2302_db.dat", new Pair<>("xqrve2302-db-dat", "ae4b2a332bafb5e8b2710d20bf8ab1d1")); + dataVersionMap.put("data/devices/versal/xqvc1702_db.dat", new Pair<>("xqvc1702-db-dat", "6e210d13b7f3b778f89e65a756e7849f")); + dataVersionMap.put("data/devices/versal/xqvc1902_db.dat", new Pair<>("xqvc1902-db-dat", "0420e545e1995ca8b51505033c7c2382")); + dataVersionMap.put("data/devices/versal/xqve2102_db.dat", new Pair<>("xqve2102-db-dat", "3793676b65ec019a0385f6fcceb51ad8")); + dataVersionMap.put("data/devices/versal/xqve2302_db.dat", new Pair<>("xqve2302-db-dat", "0beba46125b078b18191ffb188808572")); + dataVersionMap.put("data/devices/versal/xqvm1102_db.dat", new Pair<>("xqvm1102-db-dat", "d3b0ffda9f457e68687c33766084e945")); + dataVersionMap.put("data/devices/versal/xqvm1402_db.dat", new Pair<>("xqvm1402-db-dat", "7507b1733001df21f3c0edd0c3af9bc9")); + dataVersionMap.put("data/devices/versal/xqvm1502_db.dat", new Pair<>("xqvm1502-db-dat", "7be040972308814dec34ffbb587a51b5")); + dataVersionMap.put("data/devices/versal/xqvm1802_db.dat", new Pair<>("xqvm1802-db-dat", "444893da335b3b9868788c0cee8a988a")); + dataVersionMap.put("data/devices/versal/xqvp1052_db.dat", new Pair<>("xqvp1052-db-dat", "0d9e42b14cc4808297f6ab855115b49b")); + dataVersionMap.put("data/devices/versal/xqvp1202_db.dat", new Pair<>("xqvp1202-db-dat", "8e35ecd1d960de4e6e6303d294a7b4c1")); + dataVersionMap.put("data/devices/versal/xqvp1402_db.dat", new Pair<>("xqvp1402-db-dat", "289bf9515a8ae27b6484e7f68ac07e4a")); + dataVersionMap.put("data/devices/versal/xqvp1502_db.dat", new Pair<>("xqvp1502-db-dat", "ce8b9ae5cbf0b87f10bd01c136ccb3d3")); + dataVersionMap.put("data/devices/versal/xqvp1702_db.dat", new Pair<>("xqvp1702-db-dat", "4958c9de7d0611f9ad87563c1cc3de1a")); + dataVersionMap.put("data/devices/versal/xqvp2502_db.dat", new Pair<>("xqvp2502-db-dat", "b264f920c4f3bcfe7e789715616f55ac")); + dataVersionMap.put("data/devices/virtex7/xc7v2000t_db.dat", new Pair<>("xc7v2000t-db-dat", "556c3ec2670c574ace4cbebab0c42b07")); + dataVersionMap.put("data/devices/virtex7/xc7v585t_db.dat", new Pair<>("xc7v585t-db-dat", "03e7b13c6886c2b7276994d322ef6a03")); + dataVersionMap.put("data/devices/virtex7/xc7vh580t_db.dat", new Pair<>("xc7vh580t-db-dat", "1a452484397ae698a7d19f1c381fc739")); + dataVersionMap.put("data/devices/virtex7/xc7vh870t_db.dat", new Pair<>("xc7vh870t-db-dat", "51f711ad36ddb923d5c0098ec813ac5a")); + dataVersionMap.put("data/devices/virtex7/xc7vx1140t_db.dat", new Pair<>("xc7vx1140t-db-dat", "99067d4c65763b19937a98f46f45c527")); + dataVersionMap.put("data/devices/virtex7/xc7vx330t_db.dat", new Pair<>("xc7vx330t-db-dat", "fea297c81e9feac8ce020323d4868b41")); + dataVersionMap.put("data/devices/virtex7/xc7vx415t_CIV_db.dat", new Pair<>("xc7vx415t-civ-db-dat", "1ca1710b8ccefca422a482f5f6b1ef3e")); + dataVersionMap.put("data/devices/virtex7/xc7vx415t_db.dat", new Pair<>("xc7vx415t-db-dat", "7e4f884e8e6a8a04d8e2ca0a14e01cdd")); + dataVersionMap.put("data/devices/virtex7/xc7vx485t_db.dat", new Pair<>("xc7vx485t-db-dat", "11985f4ce6a8726ab2a41d242a55aec9")); + dataVersionMap.put("data/devices/virtex7/xc7vx550t_CIV_db.dat", new Pair<>("xc7vx550t-civ-db-dat", "22c9cde1ef4f2028ea475ca10d24ddae")); + dataVersionMap.put("data/devices/virtex7/xc7vx550t_db.dat", new Pair<>("xc7vx550t-db-dat", "be56195486ed78810affda8d1a40d2d6")); + dataVersionMap.put("data/devices/virtex7/xc7vx690t_CIV_db.dat", new Pair<>("xc7vx690t-civ-db-dat", "a782c570bcf5696d5c55eab9eced0692")); + dataVersionMap.put("data/devices/virtex7/xc7vx690t_db.dat", new Pair<>("xc7vx690t-db-dat", "3356a9a56c4ba5117303216fd031f2e9")); + dataVersionMap.put("data/devices/virtex7/xc7vx980t_db.dat", new Pair<>("xc7vx980t-db-dat", "45c26dbbc2ca5de09f88fa0a002894cf")); + dataVersionMap.put("data/devices/virtex7/xq7v585t_db.dat", new Pair<>("xq7v585t-db-dat", "610c5ef36d92186377d4a6ff0c2da383")); + dataVersionMap.put("data/devices/virtex7/xq7vx330t_db.dat", new Pair<>("xq7vx330t-db-dat", "4f933fab9a3e04139e40d5e597cb1688")); + dataVersionMap.put("data/devices/virtex7/xq7vx485t_db.dat", new Pair<>("xq7vx485t-db-dat", "2bdc76a26b912c78b37115f9cecb08af")); + dataVersionMap.put("data/devices/virtex7/xq7vx690t_db.dat", new Pair<>("xq7vx690t-db-dat", "eb479e4bc70bc27d9fb4be0957b105b9")); + dataVersionMap.put("data/devices/virtex7/xq7vx980t_db.dat", new Pair<>("xq7vx980t-db-dat", "f161ed3423864b58fc8883abe69058c2")); + dataVersionMap.put("data/devices/virtexu/xcvu065_CIV_db.dat", new Pair<>("xcvu065-civ-db-dat", "c281e021c280a7f16fb68a51d5d4b409")); + dataVersionMap.put("data/devices/virtexu/xcvu065_db.dat", new Pair<>("xcvu065-db-dat", "58642796640467c4eb0a37d820b3558d")); + dataVersionMap.put("data/devices/virtexu/xcvu080_CIV_db.dat", new Pair<>("xcvu080-civ-db-dat", "08d75a8191077a24debb91bc7957cf56")); + dataVersionMap.put("data/devices/virtexu/xcvu080_db.dat", new Pair<>("xcvu080-db-dat", "eba8cf47097ce35f50ea5b4e7d294053")); + dataVersionMap.put("data/devices/virtexu/xcvu095_CIV_db.dat", new Pair<>("xcvu095-civ-db-dat", "c83522ccec009af945fc9b39a8d972da")); + dataVersionMap.put("data/devices/virtexu/xcvu095_db.dat", new Pair<>("xcvu095-db-dat", "043cd0fdd3cad0a7fcc97c7e3e593de6")); + dataVersionMap.put("data/devices/virtexu/xcvu125_CIV_db.dat", new Pair<>("xcvu125-civ-db-dat", "da5c33c1165761f0e6f0211a685a787b")); + dataVersionMap.put("data/devices/virtexu/xcvu125_db.dat", new Pair<>("xcvu125-db-dat", "e70fb497bb10e6b9347a2c72a55452ea")); + dataVersionMap.put("data/devices/virtexu/xcvu160_CIV_db.dat", new Pair<>("xcvu160-civ-db-dat", "67c44683eddf66a766513b12663a9cfc")); + dataVersionMap.put("data/devices/virtexu/xcvu160_db.dat", new Pair<>("xcvu160-db-dat", "8546145cd209841883639f15625d0d0e")); + dataVersionMap.put("data/devices/virtexu/xcvu190_CIV_db.dat", new Pair<>("xcvu190-civ-db-dat", "be53aa7965e44c287437e06fdfb4be9a")); + dataVersionMap.put("data/devices/virtexu/xcvu190_db.dat", new Pair<>("xcvu190-db-dat", "d93535c5a731b69455ff6dd5fa72806b")); + dataVersionMap.put("data/devices/virtexu/xcvu440_CIV_db.dat", new Pair<>("xcvu440-civ-db-dat", "197f78c1758c353e1ad634840905f531")); + dataVersionMap.put("data/devices/virtexu/xcvu440_db.dat", new Pair<>("xcvu440-db-dat", "1660bd487d1079420c2afe180eaacceb")); + dataVersionMap.put("data/devices/virtexuplus/xcu200_db.dat", new Pair<>("xcu200-db-dat", "573ddb40ff86e15ff6d88186b8ab8587")); + dataVersionMap.put("data/devices/virtexuplus/xcu250_db.dat", new Pair<>("xcu250-db-dat", "2c7ceade7df60c559d80a690418f5f8d")); + dataVersionMap.put("data/devices/virtexuplus/xcvu11p_CIV_db.dat", new Pair<>("xcvu11p-civ-db-dat", "383db8d639a17b20e0622ac9936b72ed")); + dataVersionMap.put("data/devices/virtexuplus/xcvu11p_db.dat", new Pair<>("xcvu11p-db-dat", "52a8a2700903973fb7eb01f25559523e")); + dataVersionMap.put("data/devices/virtexuplus/xcvu13p_CIV_db.dat", new Pair<>("xcvu13p-civ-db-dat", "2612786474bbe989c445a07b364df4e9")); + dataVersionMap.put("data/devices/virtexuplus/xcvu13p_db.dat", new Pair<>("xcvu13p-db-dat", "d95eab560153727d3e19e76165974a4d")); + dataVersionMap.put("data/devices/virtexuplus/xcvu19p_CIV_db.dat", new Pair<>("xcvu19p-civ-db-dat", "46440b9cdb3dfd22c895929b1a4fffcb")); + dataVersionMap.put("data/devices/virtexuplus/xcvu19p_db.dat", new Pair<>("xcvu19p-db-dat", "d5d0a42ef1021760afb9eea0442b6e89")); + dataVersionMap.put("data/devices/virtexuplus/xcvu3p_CIV_db.dat", new Pair<>("xcvu3p-civ-db-dat", "18ef6de80398bf95b17aa8a46f73df70")); + dataVersionMap.put("data/devices/virtexuplus/xcvu3p_db.dat", new Pair<>("xcvu3p-db-dat", "fdeae797898c54180c82813daac44303")); + dataVersionMap.put("data/devices/virtexuplus/xcvu5p_CIV_db.dat", new Pair<>("xcvu5p-civ-db-dat", "537567a10ca15f128591c243d5892dd1")); + dataVersionMap.put("data/devices/virtexuplus/xcvu5p_db.dat", new Pair<>("xcvu5p-db-dat", "01ff62ea775822a27585345bb7d0efee")); + dataVersionMap.put("data/devices/virtexuplus/xcvu7p_CIV_db.dat", new Pair<>("xcvu7p-civ-db-dat", "ba5b17ffc73cc3b093e20d43c5bee8bb")); + dataVersionMap.put("data/devices/virtexuplus/xcvu7p_db.dat", new Pair<>("xcvu7p-db-dat", "549495d6129141154639dbee2ce1142a")); + dataVersionMap.put("data/devices/virtexuplus/xcvu9p_CIV_db.dat", new Pair<>("xcvu9p-civ-db-dat", "5368f6d841fd69c3cb5ce75b50232357")); + dataVersionMap.put("data/devices/virtexuplus/xcvu9p_db.dat", new Pair<>("xcvu9p-db-dat", "eaffe35c0933142b9cd18a43229e7cd3")); + dataVersionMap.put("data/devices/virtexuplus/xqvu11p_db.dat", new Pair<>("xqvu11p-db-dat", "e9cb2c310d82decb33ed073cae60eae1")); + dataVersionMap.put("data/devices/virtexuplus/xqvu13p_db.dat", new Pair<>("xqvu13p-db-dat", "dce1ccacfc2755a69c278f4d2bab8939")); + dataVersionMap.put("data/devices/virtexuplus/xqvu3p_db.dat", new Pair<>("xqvu3p-db-dat", "19816a751791e17c4251505a4e49ead1")); + dataVersionMap.put("data/devices/virtexuplus/xqvu7p_db.dat", new Pair<>("xqvu7p-db-dat", "b82591b7e93667645e456a3fef423a21")); + dataVersionMap.put("data/devices/virtexuplus/xqvu9p_db.dat", new Pair<>("xqvu9p-db-dat", "370097789eb418fdf01b43bf72f725fb")); + dataVersionMap.put("data/devices/virtexuplus58g/xcu26_db.dat", new Pair<>("xcu26-db-dat", "7f781caabbbfa0f4d670fad828d7d4c6")); + dataVersionMap.put("data/devices/virtexuplus58g/xcux35_db.dat", new Pair<>("xcux35-db-dat", "3364121af3ce9fcf44142c530e499b49")); + dataVersionMap.put("data/devices/virtexuplus58g/xcvu23p_CIV_db.dat", new Pair<>("xcvu23p-civ-db-dat", "d5a6facb62ff5ec58e73448671ac1a9d")); + dataVersionMap.put("data/devices/virtexuplus58g/xcvu23p_db.dat", new Pair<>("xcvu23p-db-dat", "c33f88ff852c02d372cfa3b707e15c62")); + dataVersionMap.put("data/devices/virtexuplus58g/xcvu27p_db.dat", new Pair<>("xcvu27p-db-dat", "2aaca971db9f3a2d30b9aab08adfb53b")); + dataVersionMap.put("data/devices/virtexuplus58g/xcvu29p_CIV_db.dat", new Pair<>("xcvu29p-civ-db-dat", "d704df04735b4e7d319d5dca23a7e600")); + dataVersionMap.put("data/devices/virtexuplus58g/xcvu29p_db.dat", new Pair<>("xcvu29p-db-dat", "d2002671bc66b73ac5a227d228b415d6")); + dataVersionMap.put("data/devices/virtexuplushbm/xcu50_db.dat", new Pair<>("xcu50-db-dat", "9f492044506ac76537b31578b624e8d7")); + dataVersionMap.put("data/devices/virtexuplushbm/xcu55c_db.dat", new Pair<>("xcu55c-db-dat", "71afb75ee5e960b6dd55dd62e9847c00")); + dataVersionMap.put("data/devices/virtexuplushbm/xcu55n_db.dat", new Pair<>("xcu55n-db-dat", "d17a34026add98ab0756ef7510ff0ea9")); + dataVersionMap.put("data/devices/virtexuplushbm/xcvu31p_CIV_db.dat", new Pair<>("xcvu31p-civ-db-dat", "8c4bac7d3c247218f5c9b00db4061574")); + dataVersionMap.put("data/devices/virtexuplushbm/xcvu31p_db.dat", new Pair<>("xcvu31p-db-dat", "097a574d983286c3a17dd252232fb75d")); + dataVersionMap.put("data/devices/virtexuplushbm/xcvu33p_CIV_db.dat", new Pair<>("xcvu33p-civ-db-dat", "7b077edb0964763c6d0f0192cea131a8")); + dataVersionMap.put("data/devices/virtexuplushbm/xcvu33p_db.dat", new Pair<>("xcvu33p-db-dat", "5f4c881c16c2b2b20f9352346ba33cc9")); + dataVersionMap.put("data/devices/virtexuplushbm/xcvu35p_CIV_db.dat", new Pair<>("xcvu35p-civ-db-dat", "a53e66c03a5387024c2220b35580c5ee")); + dataVersionMap.put("data/devices/virtexuplushbm/xcvu35p_db.dat", new Pair<>("xcvu35p-db-dat", "f938e524e0805e77292d610f947c7b4e")); + dataVersionMap.put("data/devices/virtexuplushbm/xcvu37p_CIV_db.dat", new Pair<>("xcvu37p-civ-db-dat", "c6b315411a052af153b7666ed3c27815")); + dataVersionMap.put("data/devices/virtexuplushbm/xcvu37p_db.dat", new Pair<>("xcvu37p-db-dat", "0c9fc1982909e73fcbb30bf2470fc35a")); + dataVersionMap.put("data/devices/virtexuplushbm/xcvu45p_CIV_db.dat", new Pair<>("xcvu45p-civ-db-dat", "47254a85313aef95f0c91186ed654415")); + dataVersionMap.put("data/devices/virtexuplushbm/xcvu45p_db.dat", new Pair<>("xcvu45p-db-dat", "2e8ce776975d5e5f4a1a597e869fdbec")); + dataVersionMap.put("data/devices/virtexuplushbm/xcvu47p_CIV_db.dat", new Pair<>("xcvu47p-civ-db-dat", "f46affa6516d1ebc68374697b48860a1")); + dataVersionMap.put("data/devices/virtexuplushbm/xcvu47p_db.dat", new Pair<>("xcvu47p-db-dat", "0693634916963a2dc52c8a6afe9052b3")); + dataVersionMap.put("data/devices/virtexuplushbm/xcvu57p_CIV_db.dat", new Pair<>("xcvu57p-civ-db-dat", "73b6a83c3c8effa8a660cd17c66e53d1")); + dataVersionMap.put("data/devices/virtexuplushbm/xcvu57p_db.dat", new Pair<>("xcvu57p-db-dat", "743d0e105dfb943b09c7eca89fe7d34b")); + dataVersionMap.put("data/devices/virtexuplushbm/xqvu37p_db.dat", new Pair<>("xqvu37p-db-dat", "0cd5f8abc7bd9023cf511003b50b8a79")); + dataVersionMap.put("data/devices/zynq/xa7z010_db.dat", new Pair<>("xa7z010-db-dat", "ddb4b618e2c87d65fbad4effa5d7fdaa")); + dataVersionMap.put("data/devices/zynq/xa7z020_db.dat", new Pair<>("xa7z020-db-dat", "7a1ea31c8206a2a9ffc918c49a7aa304")); + dataVersionMap.put("data/devices/zynq/xa7z030_db.dat", new Pair<>("xa7z030-db-dat", "4fe120a1f20c685d2f75cbae3cef454a")); + dataVersionMap.put("data/devices/zynq/xc7z007s_db.dat", new Pair<>("xc7z007s-db-dat", "7deaa82447694c0876c07927b0ac03ed")); + dataVersionMap.put("data/devices/zynq/xc7z010_db.dat", new Pair<>("xc7z010-db-dat", "949a510cee9be1bc67b4ce56a3fdf5a5")); + dataVersionMap.put("data/devices/zynq/xc7z010i_db.dat", new Pair<>("xc7z010i-db-dat", "f788bbddbbd14fba45f8f46ac6a43a6f")); + dataVersionMap.put("data/devices/zynq/xc7z012s_db.dat", new Pair<>("xc7z012s-db-dat", "f7be1364f5b8f75f077dcc036e9a83e6")); + dataVersionMap.put("data/devices/zynq/xc7z014s_db.dat", new Pair<>("xc7z014s-db-dat", "d3316a039c929278689faee23037c607")); + dataVersionMap.put("data/devices/zynq/xc7z015_db.dat", new Pair<>("xc7z015-db-dat", "84e2ba28ab3ccbaecfda67f8b09983fa")); + dataVersionMap.put("data/devices/zynq/xc7z015i_db.dat", new Pair<>("xc7z015i-db-dat", "73b96fa7b8191465adb36bfc31bbb9ad")); + dataVersionMap.put("data/devices/zynq/xc7z020_db.dat", new Pair<>("xc7z020-db-dat", "25f5b3f6261205b95368cfa5692921ef")); + dataVersionMap.put("data/devices/zynq/xc7z020i_db.dat", new Pair<>("xc7z020i-db-dat", "59e9f3c577c4d97320223293cd630d4a")); + dataVersionMap.put("data/devices/zynq/xc7z030_db.dat", new Pair<>("xc7z030-db-dat", "b6c1c968495908998decf57b719589d9")); + dataVersionMap.put("data/devices/zynq/xc7z030i_db.dat", new Pair<>("xc7z030i-db-dat", "a470a1f1610f09443895b98063110917")); + dataVersionMap.put("data/devices/zynq/xc7z035_db.dat", new Pair<>("xc7z035-db-dat", "8dd1a94c76abcdb3a2d78ebfbcb25c09")); + dataVersionMap.put("data/devices/zynq/xc7z035i_db.dat", new Pair<>("xc7z035i-db-dat", "6560b60b4c324eab1e57ccff81cb90ea")); + dataVersionMap.put("data/devices/zynq/xc7z045_db.dat", new Pair<>("xc7z045-db-dat", "9dfcd9c1f2690c5a049a29b541a99eec")); + dataVersionMap.put("data/devices/zynq/xc7z045i_db.dat", new Pair<>("xc7z045i-db-dat", "f2076177d1795982615380d8b9f6f206")); + dataVersionMap.put("data/devices/zynq/xc7z100_db.dat", new Pair<>("xc7z100-db-dat", "6a6e6498cfc8ccdf4dfdc63c8987498d")); + dataVersionMap.put("data/devices/zynq/xc7z100i_db.dat", new Pair<>("xc7z100i-db-dat", "9828586f7981f662abf6b672c45c08a7")); + dataVersionMap.put("data/devices/zynq/xq7z020_db.dat", new Pair<>("xq7z020-db-dat", "43c773a0615ebdeb5ccdddeff2767577")); + dataVersionMap.put("data/devices/zynq/xq7z030_db.dat", new Pair<>("xq7z030-db-dat", "dee5a516c21a3daf2890efbf3ff6b8f0")); + dataVersionMap.put("data/devices/zynq/xq7z045_db.dat", new Pair<>("xq7z045-db-dat", "f88c49368b8595e359c2b0f1edb6f9d9")); + dataVersionMap.put("data/devices/zynq/xq7z100_db.dat", new Pair<>("xq7z100-db-dat", "6fa812a1915afe7d6a834c99229b5721")); + dataVersionMap.put("data/devices/zynquplus/xazu11eg_db.dat", new Pair<>("xazu11eg-db-dat", "b0a052978e5f528cec5d236337192eec")); + dataVersionMap.put("data/devices/zynquplus/xazu1eg_db.dat", new Pair<>("xazu1eg-db-dat", "7c6849ad1e878b94a17b3cd0c3fa51c3")); + dataVersionMap.put("data/devices/zynquplus/xazu2eg_db.dat", new Pair<>("xazu2eg-db-dat", "8cafa45f268ea4f61f0d0d551e0878b2")); + dataVersionMap.put("data/devices/zynquplus/xazu3eg_db.dat", new Pair<>("xazu3eg-db-dat", "953fcd6d5d0ce88364d7fe31e194ac4b")); + dataVersionMap.put("data/devices/zynquplus/xazu3teg_db.dat", new Pair<>("xazu3teg-db-dat", "c3aa0af01c0648f132ccdf356a693963")); + dataVersionMap.put("data/devices/zynquplus/xazu4ev_db.dat", new Pair<>("xazu4ev-db-dat", "8dadbae82c9c6a26018dc4374e9ae7d7")); + dataVersionMap.put("data/devices/zynquplus/xazu5ev_db.dat", new Pair<>("xazu5ev-db-dat", "ec22bca4f942395a00d6ee5ba9279c4b")); + dataVersionMap.put("data/devices/zynquplus/xazu7ev_db.dat", new Pair<>("xazu7ev-db-dat", "9e5d18631df348a7cac44785f92e0a0f")); + dataVersionMap.put("data/devices/zynquplus/xck24_db.dat", new Pair<>("xck24-db-dat", "4b72d1ee766020a9af22495ce08ede20")); + dataVersionMap.put("data/devices/zynquplus/xck26_db.dat", new Pair<>("xck26-db-dat", "626b5192d948158389825237d5905494")); + dataVersionMap.put("data/devices/zynquplus/xcu25_db.dat", new Pair<>("xcu25-db-dat", "5f93d518759f0d74b1410a489947d995")); + dataVersionMap.put("data/devices/zynquplus/xcu30_db.dat", new Pair<>("xcu30-db-dat", "8484fa483c0c1b4f39d75717b3e321e2")); + dataVersionMap.put("data/devices/zynquplus/xczu11eg_db.dat", new Pair<>("xczu11eg-db-dat", "ca5deb1a52515025f0b4af34a2f752b5")); + dataVersionMap.put("data/devices/zynquplus/xczu15eg_db.dat", new Pair<>("xczu15eg-db-dat", "4d7736ba5a619eee4b60671ad69c240b")); + dataVersionMap.put("data/devices/zynquplus/xczu17eg_db.dat", new Pair<>("xczu17eg-db-dat", "9e9424db7445ba5adb7d20b5ed0d23fe")); + dataVersionMap.put("data/devices/zynquplus/xczu19eg_db.dat", new Pair<>("xczu19eg-db-dat", "49a4bda3236ea885a648fc2423aa3d9b")); + dataVersionMap.put("data/devices/zynquplus/xczu1cg_db.dat", new Pair<>("xczu1cg-db-dat", "86db609e177954a2b4a781a61fb0cc8c")); + dataVersionMap.put("data/devices/zynquplus/xczu1eg_db.dat", new Pair<>("xczu1eg-db-dat", "20df7abbee1d58ed88ab763e77d08315")); + dataVersionMap.put("data/devices/zynquplus/xczu2cg_db.dat", new Pair<>("xczu2cg-db-dat", "94e84f1c8b9d4b2c5bdd26e891623ada")); + dataVersionMap.put("data/devices/zynquplus/xczu2eg_db.dat", new Pair<>("xczu2eg-db-dat", "15fe41f38cb720a2e78206e490979910")); + dataVersionMap.put("data/devices/zynquplus/xczu3cg_db.dat", new Pair<>("xczu3cg-db-dat", "60a56b4179421dcdfc54031cd375586d")); + dataVersionMap.put("data/devices/zynquplus/xczu3eg_db.dat", new Pair<>("xczu3eg-db-dat", "d6463654898a14ca0eeb09ce078e0bdd")); + dataVersionMap.put("data/devices/zynquplus/xczu3tcg_db.dat", new Pair<>("xczu3tcg-db-dat", "b60c077e8e9dbd96edfeae2edf04dca3")); + dataVersionMap.put("data/devices/zynquplus/xczu3teg_db.dat", new Pair<>("xczu3teg-db-dat", "47e883307bad686d817ecf42c9300c2e")); + dataVersionMap.put("data/devices/zynquplus/xczu4cg_db.dat", new Pair<>("xczu4cg-db-dat", "a0bd4b6980da8d186b72623f523d7b0d")); + dataVersionMap.put("data/devices/zynquplus/xczu4eg_db.dat", new Pair<>("xczu4eg-db-dat", "4a9bdbf1f93beb91f94c77682def919c")); + dataVersionMap.put("data/devices/zynquplus/xczu4ev_db.dat", new Pair<>("xczu4ev-db-dat", "5f92f309356fed135b267e6be106b9df")); + dataVersionMap.put("data/devices/zynquplus/xczu5cg_db.dat", new Pair<>("xczu5cg-db-dat", "6887c516792793fd4accafbb8e4f231c")); + dataVersionMap.put("data/devices/zynquplus/xczu5eg_db.dat", new Pair<>("xczu5eg-db-dat", "b1c74d8a34101da78bb1243a284add4f")); + dataVersionMap.put("data/devices/zynquplus/xczu5ev_db.dat", new Pair<>("xczu5ev-db-dat", "1bd036761452265e02499a789c0ac1eb")); + dataVersionMap.put("data/devices/zynquplus/xczu6cg_db.dat", new Pair<>("xczu6cg-db-dat", "3ad843b77f842d2d78514454d8e5a0aa")); + dataVersionMap.put("data/devices/zynquplus/xczu6eg_db.dat", new Pair<>("xczu6eg-db-dat", "882222759e42795edaa0b372a766def8")); + dataVersionMap.put("data/devices/zynquplus/xczu7cg_db.dat", new Pair<>("xczu7cg-db-dat", "8cd48405e69249c6b379b2de4cd52cfa")); + dataVersionMap.put("data/devices/zynquplus/xczu7eg_db.dat", new Pair<>("xczu7eg-db-dat", "aefa1d855fe548be4a7381bd0d1c5740")); + dataVersionMap.put("data/devices/zynquplus/xczu7ev_db.dat", new Pair<>("xczu7ev-db-dat", "4e6c89ae6af18bee168788ea704c9059")); + dataVersionMap.put("data/devices/zynquplus/xczu9cg_db.dat", new Pair<>("xczu9cg-db-dat", "3fe458abf822c0607808169e9bf6c4be")); + dataVersionMap.put("data/devices/zynquplus/xczu9eg_db.dat", new Pair<>("xczu9eg-db-dat", "de2124026f6ca4e2ddd62464fb9b5527")); + dataVersionMap.put("data/devices/zynquplus/xqzu11eg_db.dat", new Pair<>("xqzu11eg-db-dat", "d8a261239799da55ec154d9c1ae0bd01")); + dataVersionMap.put("data/devices/zynquplus/xqzu15eg_db.dat", new Pair<>("xqzu15eg-db-dat", "af797c5406d43072a93e52b6ac40d6b7")); + dataVersionMap.put("data/devices/zynquplus/xqzu19eg_db.dat", new Pair<>("xqzu19eg-db-dat", "8c9ba1dcc7c07c2dbfc34d0f2137982a")); + dataVersionMap.put("data/devices/zynquplus/xqzu3eg_db.dat", new Pair<>("xqzu3eg-db-dat", "181b30cc55dd585ab7b9b0fac991ea7a")); + dataVersionMap.put("data/devices/zynquplus/xqzu4eg_db.dat", new Pair<>("xqzu4eg-db-dat", "eaee3d2e46ebf136c8bb48a7f674c9fb")); + dataVersionMap.put("data/devices/zynquplus/xqzu5ev_db.dat", new Pair<>("xqzu5ev-db-dat", "4939aa97f67798b171112a51462a6acc")); + dataVersionMap.put("data/devices/zynquplus/xqzu7ev_db.dat", new Pair<>("xqzu7ev-db-dat", "38ba1f539508bd8c231bc78cf3ae4592")); + dataVersionMap.put("data/devices/zynquplus/xqzu9eg_db.dat", new Pair<>("xqzu9eg-db-dat", "0296f59996eb666b72f18dbf0ccabf79")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu21dr_db.dat", new Pair<>("xczu21dr-db-dat", "f7b6b6e269461a2ecaf3a2f8f1458dfb")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu25dr_db.dat", new Pair<>("xczu25dr-db-dat", "40217b16c5286aa11515b8b16ec27828")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu27dr_db.dat", new Pair<>("xczu27dr-db-dat", "77e295a1d8a4f7ffd6785126640fb88d")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu28dr_db.dat", new Pair<>("xczu28dr-db-dat", "f8e93a39c89d60d3bef1886043956aae")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu29dr_db.dat", new Pair<>("xczu29dr-db-dat", "0d09c5db649d11e86a93f5b1e4c72a23")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu39dr_db.dat", new Pair<>("xczu39dr-db-dat", "961882d0c60e580ebf948f2064d9ad79")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu42dr_db.dat", new Pair<>("xczu42dr-db-dat", "02fafc81be319e7d2ff2edb650cf025e")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu43dr_db.dat", new Pair<>("xczu43dr-db-dat", "71b9f83717ec336bd5ddb0c22225b23f")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu46dr_db.dat", new Pair<>("xczu46dr-db-dat", "3c89e1f6e097446d50aa02fa87d23081")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu47dr_db.dat", new Pair<>("xczu47dr-db-dat", "d0314738518fc534f27bed8801a281fa")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu48dr_db.dat", new Pair<>("xczu48dr-db-dat", "3500c9fa725382aecdcc5ce211d526fa")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu49dr_db.dat", new Pair<>("xczu49dr-db-dat", "395614c353cca759ec1e6ba60fbec313")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu63dr_db.dat", new Pair<>("xczu63dr-db-dat", "c518343e62dc44526043a685daf59188")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu64dr_db.dat", new Pair<>("xczu64dr-db-dat", "f91150fff20ea415c163b93021ffa27e")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu65dr_db.dat", new Pair<>("xczu65dr-db-dat", "d2c553f96839b7ad160b041d17adec8b")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xczu67dr_db.dat", new Pair<>("xczu67dr-db-dat", "9ab70626b875a91514c6ad663a923b89")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xqzu21dr_db.dat", new Pair<>("xqzu21dr-db-dat", "e77e3c72577663f3acdb8ea44fbd5549")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xqzu28dr_db.dat", new Pair<>("xqzu28dr-db-dat", "598eda04e22d37374aa820433a6dcf66")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xqzu29dr_db.dat", new Pair<>("xqzu29dr-db-dat", "653a9f3b9be0f18a54aae6c0c93b42a3")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xqzu48dr_db.dat", new Pair<>("xqzu48dr-db-dat", "a448c5d077cfdf005db5bb19c77e8279")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xqzu49dr_db.dat", new Pair<>("xqzu49dr-db-dat", "121002535288bc59b298aea6823a7189")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xqzu65dr_db.dat", new Pair<>("xqzu65dr-db-dat", "cd430b324d1801f503f11d8ade614f70")); + dataVersionMap.put("data/devices/zynquplusrfsoc/xqzu67dr_db.dat", new Pair<>("xqzu67dr-db-dat", "107b58bf104f30ed8a69147cad05040e")); + dataVersionMap.put("data/partdump.csv", new Pair<>("partdump-csv", "cf81a1101fd8aaba1d5e4864dd3b366b")); + dataVersionMap.put("data/parts.db", new Pair<>("parts-db", "fba61ed264bbf6bdc918edf7c523c990")); + dataVersionMap.put("data/unisim_data.dat", new Pair<>("unisim-data-dat", "c0c3f68aaef35bf7a7942f90f51b037f")); } } From 377465b094ebc948ba2ef6138be18b90d75866f0 Mon Sep 17 00:00:00 2001 From: Chris Lavin Date: Thu, 21 Nov 2024 19:32:00 -0700 Subject: [PATCH 18/41] 2024.2.0-rc1 Signed-off-by: Chris Lavin --- .classpath | 4 ++-- .github/workflows/build.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.classpath b/.classpath index 1cb8d151e..73a4ec42f 100644 --- a/.classpath +++ b/.classpath @@ -33,9 +33,9 @@ - + - + diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 65b5d7839..e28dfe98a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,7 +5,7 @@ on: pull_request: env: - RAPIDWRIGHT_VERSION: v2024.1.3-beta + RAPIDWRIGHT_VERSION: v2024.2.0-rc1-beta jobs: build: From 78346a4b00e68e94139d0fcf89e2d3d41205db43 Mon Sep 17 00:00:00 2001 From: Chris Lavin Date: Thu, 21 Nov 2024 22:40:05 -0700 Subject: [PATCH 19/41] Update tests to reflect bug fixes and minor behavior changes (#1110) Signed-off-by: Chris Lavin --- test/src/com/xilinx/rapidwright/design/TestDesign.java | 6 +++--- .../rapidwright/design/compare/TestDesignComparator.java | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/test/src/com/xilinx/rapidwright/design/TestDesign.java b/test/src/com/xilinx/rapidwright/design/TestDesign.java index 61ee595ba..94256afab 100644 --- a/test/src/com/xilinx/rapidwright/design/TestDesign.java +++ b/test/src/com/xilinx/rapidwright/design/TestDesign.java @@ -348,7 +348,7 @@ public void testMovePinsToNewNetDeleteOldNet() { Assertions.assertTrue(si.routeIntraSiteNet(oldNet, si.getBELPin("A1", "A1"), si.getBELPin(unisim.toString(), "DI0"))); Assertions.assertEquals("[IN SLICE_X32Y73.A1, OUT SLICE_X32Y73.HQ]", oldNet.getPins().toString()); - Assertions.assertEquals("[A1, HQ, A5LUT_O5]", si.getSiteWiresFromNet(oldNet).toString()); + Assertions.assertEquals("[A1, A5LUT_O5, HQ]", si.getSiteWiresFromNet(oldNet).toString()); Net newNet = d.createNet("newNet"); SitePinInst h6 = newNet.createPin("H6", si); @@ -362,7 +362,7 @@ public void testMovePinsToNewNetDeleteOldNet() { Assertions.assertNull(d.getNet(oldNet.getName())); Assertions.assertSame(newNet, d.getNet(newNet.getName())); Assertions.assertEquals("[IN SLICE_X32Y73.H6, IN SLICE_X32Y73.A1, OUT SLICE_X32Y73.HQ]", newNet.getPins().toString()); - Assertions.assertEquals("[H6, A1, HQ, A5LUT_O5]", si.getSiteWiresFromNet(newNet).toString()); + Assertions.assertEquals("[A1, A5LUT_O5, H6, HQ]", si.getSiteWiresFromNet(newNet).toString()); Assertions.assertEquals("[INT_X21Y73/INT.VCC_WIRE->>IMUX_E47]", newNet.getPIPs().toString()); } @@ -389,7 +389,7 @@ public void testMovePinsToNewNetDeleteOldNetIntraSiteOnly() { Assertions.assertNull(d.getNet(oldNet.getName())); Assertions.assertSame(newNet, d.getNet(newNet.getName())); Assertions.assertEquals("[IN SLICE_X32Y73.H6]", newNet.getPins().toString()); - Assertions.assertEquals("[H6, B_O, FFMUXB1_OUT1]", si.getSiteWiresFromNet(newNet).toString()); + Assertions.assertEquals("[B_O, FFMUXB1_OUT1, H6]", si.getSiteWiresFromNet(newNet).toString()); Assertions.assertTrue(newNet.getPIPs().isEmpty()); } diff --git a/test/src/com/xilinx/rapidwright/design/compare/TestDesignComparator.java b/test/src/com/xilinx/rapidwright/design/compare/TestDesignComparator.java index 7f417c2d5..61c50208b 100644 --- a/test/src/com/xilinx/rapidwright/design/compare/TestDesignComparator.java +++ b/test/src/com/xilinx/rapidwright/design/compare/TestDesignComparator.java @@ -149,7 +149,7 @@ public void testDesignComparator() { Assertions.assertTrue(net.hasPIPs()); test2.removeNet(net); - compareDesign(22, 1, DesignDiffType.NET_MISSING, dc, gold, test2); + compareDesign(28, 1, DesignDiffType.NET_MISSING, dc, gold, test2); Net extra = new Net("extraNet"); for (PIP p : net.getPIPs()) { @@ -157,17 +157,17 @@ public void testDesignComparator() { } test2.addNet(extra); - compareDesign(23, 1, DesignDiffType.NET_EXTRA, dc, gold, test2); + compareDesign(29, 1, DesignDiffType.NET_EXTRA, dc, gold, test2); Assertions.assertTrue(extra.hasPIPs()); clk.addPIP(extra.getPIPs().get(0)); - compareDesign(24, 1, DesignDiffType.PIP_EXTRA, dc, gold, test2); + compareDesign(30, 1, DesignDiffType.PIP_EXTRA, dc, gold, test2); clk.getPIPs().remove(clk.getPIPs().size() - 1); clk.getPIPs().remove(clk.getPIPs().size() - 1); - compareDesign(24, 1, DesignDiffType.PIP_MISSING, dc, gold, test2); + compareDesign(30, 1, DesignDiffType.PIP_MISSING, dc, gold, test2); if (dc.comparePIPFlags()) { clk.getPIPs().get(clk.getPIPs().size() - 1).setIsStub(true); From 34ab95a6ead55f944da2d27b3d3b1bae95889fe7 Mon Sep 17 00:00:00 2001 From: Chris Lavin Date: Thu, 21 Nov 2024 22:40:33 -0700 Subject: [PATCH 20/41] Changes to support new array-based cell pin mappings (#1101) * Fix some tests, refactor for new APIs Signed-off-by: Chris Lavin * Updates based on review feedback Signed-off-by: Chris Lavin --------- Signed-off-by: Chris Lavin --- .../rapidwright/design/DesignTools.java | 38 +++++++++++-------- .../rapidwright/design/tools/LUTTools.java | 6 +-- .../rapidwright/tests/PinMapTester.java | 29 +++++++------- .../rapidwright/timing/TimingGraph.java | 2 +- .../rapidwright/design/TestDCPSave.java | 20 +++++----- .../rapidwright/design/TestDesignTools.java | 6 +-- .../design/tools/TestLUTTools.java | 33 +++++++++------- 7 files changed, 70 insertions(+), 64 deletions(-) diff --git a/src/com/xilinx/rapidwright/design/DesignTools.java b/src/com/xilinx/rapidwright/design/DesignTools.java index 54d747d44..546b86e28 100644 --- a/src/com/xilinx/rapidwright/design/DesignTools.java +++ b/src/com/xilinx/rapidwright/design/DesignTools.java @@ -289,7 +289,7 @@ public static ArrayList getCorrespondingBELInputPins(BELPin outputPin, S Net net = inst.getNetFromSiteWire(siteWireName); if (net == null) continue; if (net.isStaticNet()) continue; - if (!cell.getPinMappingsP2L().containsKey(pin.getName())) continue; + if (!cell.usesPhysicalPin(pin.getName())) continue; inputs.add(pin); } break; @@ -325,7 +325,8 @@ public static ArrayList getCorrespondingBELOutputPins(BELPin inputPin, S if (net == null) continue; if (net.isStaticNet()) continue; if (net.getName().equals(Net.USED_NET)) continue; - if (!cell.getPinMappingsP2L().containsKey(pin.getName())) continue; + if (!cell.usesPhysicalPin(pin.getName())) + continue; outputs.add(pin); } @@ -445,7 +446,7 @@ public static String invertLutInput (Cell lut, String physicalPinName) { long oldVal = new BigInteger(hexValueStr, 16).longValue(); int numLutRows = Integer.parseInt(numLutRowsStr); int numInput = (int)(Math.log(numLutRows)/Math.log(2)); - String logicalPinName = lut.getPinMappingsP2L().get(physicalPinName); + String logicalPinName = lut.getLogicalPinMapping(physicalPinName); int invertCol = getInvertCol(logicalPinName.substring(logicalPinName.length()-1)); if (invertCol == -1) { System.err.println("Inverted Column is -1 is Function DesignTools.invertLutInput"); @@ -1563,12 +1564,11 @@ public static List unrouteCellPinSiteRouting(Cell cell, String logi if (otherCell.isRoutethru()) { BELPin otherPin = null; if (pin.isOutput()) { - assert(otherCell.getPinMappingsP2L().size() == 1); - String otherPinName = otherCell.getPinMappingsP2L().keySet().iterator().next(); - otherPin = pin.getBEL().getPin(otherPinName); + assert (otherCell.getUsedPhysicalPinsCount() == 1); + otherPin = otherCell.getFirstPhysicalPinMapping().getFirst(); } else { // Make sure we are coming in on the routed-thru pin - String otherPinName = otherCell.getPinMappingsP2L().keySet().iterator().next(); + String otherPinName = otherCell.getFirstPhysicalPinMapping().getFirst().getName(); if (pin.getName().equals(otherPinName)) { otherPin = LUTTools.getLUTOutputPin(pin.getBEL()); } @@ -1777,7 +1777,8 @@ public static void makeBlackBox(Design d, EDIFHierCellInst hierarchicalCell) { } // Remove all physical nets first - for (String logPin : c.getPinMappingsP2L().values()) { + for (String logPin : c.getPhysicalPinMappings()) { + if (logPin == null) continue; List removePins = unrouteCellPinSiteRouting(c, logPin); for (SitePinInst pin : removePins) { pinsToRemove.computeIfAbsent(pin.getNet(), $ -> new HashSet<>()).add(pin); @@ -1971,7 +1972,7 @@ public static boolean stampPlacement(Design design, Module stamp, Map getAllRoutedSitePinsFromPhysicalPin(Cell cell, Net ne bel.getName().endsWith("_IMR")) { Cell possibleRouteThru = inst.getCell(bel); if (possibleRouteThru != null && possibleRouteThru.isRoutethru()) { - String routeThru = possibleRouteThru.getPinMappingsP2L().keySet().iterator().next(); - queue.add(bel.getPin(routeThru)); + BELPin routeThru = possibleRouteThru.getFirstPhysicalPinMapping().getFirst(); + queue.add(routeThru); } } } @@ -2977,14 +2978,19 @@ private static void copySiteRouting(Cell copy, Cell orig, Map src } EDIFHierCellInst cellInst = destNetlist.getHierCellInstFromName(copy.getName()); - for (Entry e : copy.getPinMappingsP2L().entrySet()) { - EDIFPortInst portInst = cellInst.getInst().getPortInst(e.getValue()); + String[] physPinNames = copy.getPhysicalPinMappings(); + for (int i = 0; i < physPinNames.length; i++) { + String logPinName = physPinNames[i]; + if (logPinName == null) continue; + String physPinName = copy.getBEL().getPin(i).getName(); + + EDIFPortInst portInst = cellInst.getInst().getPortInst(logPinName); if (portInst == null) continue; EDIFNet edifNet = portInst.getNet(); String netName = new EDIFHierNet(cellInst.getParent(), edifNet).getHierarchicalNetName(); - String siteWireName = orig.getSiteWireNameFromPhysicalPin(e.getKey()); + String siteWireName = orig.getSiteWireNameFromPhysicalPin(physPinName); Net origNet = origSiteInst.getNetFromSiteWire(siteWireName); if (origNet == null) continue; Net net = null; @@ -3001,7 +3007,7 @@ private static void copySiteRouting(Cell copy, Cell orig, Map src } } - BELPin curr = copy.getBEL().getPin(e.getKey()); + BELPin curr = copy.getBEL().getPin(physPinName); dstSiteInst.routeIntraSiteNet(net, curr, curr); boolean routingForward = curr.isOutput(); Queue q = new LinkedList(); @@ -3040,7 +3046,7 @@ private static void copySiteRouting(Cell copy, Cell orig, Map src Cell rtCopy = tmpCell .copyCell(newCellName, tmpCell.getEDIFHierCellInst(), dstSiteInst); dstSiteInst.getCellMap().put(belName, rtCopy); - for (String belPinName : rtCopy.getPinMappingsP2L().keySet()) { + for (String belPinName : rtCopy.getUsedPhysicalPins()) { BELPin tmp = rtCopy.getBEL().getPin(belPinName); if (tmp.isInput()) { curr = tmp; diff --git a/src/com/xilinx/rapidwright/design/tools/LUTTools.java b/src/com/xilinx/rapidwright/design/tools/LUTTools.java index 3916c1edf..0f8e1bb29 100644 --- a/src/com/xilinx/rapidwright/design/tools/LUTTools.java +++ b/src/com/xilinx/rapidwright/design/tools/LUTTools.java @@ -390,9 +390,9 @@ public static EDIFPropertyValue configureLUT(EDIFCellInst c, String equation) { */ public static String getLUTEquation(Cell c) { if (c.isRoutethru()) { - Set> entrySet = c.getPinMappingsP2L().entrySet(); - assert (entrySet.size() == 1); - return "O" + c.getBELName().charAt(1) + "=" + entrySet.iterator().next().getKey(); + BELPin rtEntry = c.getFirstPhysicalPinMapping().getFirst(); + assert (c.getUsedPhysicalPinsCount() == 1); + return "O" + c.getBELName().charAt(1) + "=" + rtEntry.getName(); } return getLUTEquation(c.getEDIFCellInst()); } diff --git a/src/com/xilinx/rapidwright/tests/PinMapTester.java b/src/com/xilinx/rapidwright/tests/PinMapTester.java index 24c22814a..bdc124609 100644 --- a/src/com/xilinx/rapidwright/tests/PinMapTester.java +++ b/src/com/xilinx/rapidwright/tests/PinMapTester.java @@ -26,30 +26,26 @@ package com.xilinx.rapidwright.tests; import java.util.ArrayList; -import java.util.List; import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.Set; +import com.xilinx.rapidwright.design.Cell; +import com.xilinx.rapidwright.design.Design; +import com.xilinx.rapidwright.design.SiteInst; +import com.xilinx.rapidwright.design.Unisim; +import com.xilinx.rapidwright.design.VivadoProp; import com.xilinx.rapidwright.device.BEL; import com.xilinx.rapidwright.device.Device; import com.xilinx.rapidwright.device.Part; import com.xilinx.rapidwright.device.PartNameTools; import com.xilinx.rapidwright.device.Site; import com.xilinx.rapidwright.device.SiteTypeEnum; - import com.xilinx.rapidwright.edif.EDIFCell; import com.xilinx.rapidwright.edif.EDIFDesign; -import com.xilinx.rapidwright.edif.EDIFCellInst; import com.xilinx.rapidwright.edif.EDIFLibrary; import com.xilinx.rapidwright.edif.EDIFNetlist; -import com.xilinx.rapidwright.design.Design; -import com.xilinx.rapidwright.design.Cell; -import com.xilinx.rapidwright.design.Unisim; -import com.xilinx.rapidwright.design.SiteInst; -import com.xilinx.rapidwright.design.VivadoProp; - public class PinMapTester { public static void main(String[] args) { @@ -127,13 +123,14 @@ public static void main(String[] args) { System.out.printf("Cell type %s at %s/%s in part %s, pin map:\n", cellTypeName, site.getName(), belName, partName); - for (Map.Entry pinMap : physCell.getPinMappingsP2L().entrySet()) { - System.out.printf(" - %s <= %s\n", pinMap.getKey(), pinMap.getValue()); + String[] physPinNames = physCell.getPhysicalPinMappings(); + for (int i = 0; i < physPinNames.length; i++) { + String logPinName = physPinNames[i]; + if (logPinName == null) + continue; + String physPinName = physCell.getBEL().getPin(i).getName(); + System.out.printf(" - %s <= %s\n", physPinName, logPinName); } - - //for (Map.Entry> pinMap : physCell.getPinMappingsL2P().entrySet()) { - // System.out.printf(" - //} } } diff --git a/src/com/xilinx/rapidwright/timing/TimingGraph.java b/src/com/xilinx/rapidwright/timing/TimingGraph.java index d6f4ab6ad..7c5ef55ce 100644 --- a/src/com/xilinx/rapidwright/timing/TimingGraph.java +++ b/src/com/xilinx/rapidwright/timing/TimingGraph.java @@ -1573,7 +1573,7 @@ public int addNetDelayEdges(Net net) { physPinName = cell.getPhysicalPinMapping(portName); } else { BEL lut = cell.getBEL(); - for (String pin : cell.getPinMappingsP2L().keySet()) { + for (String pin : cell.getUsedPhysicalPins()) { BELPin belPin = lut.getPin(pin); if (belPin.isInput()) { physPinName = belPin.getConnectedSitePinName(); diff --git a/test/src/com/xilinx/rapidwright/design/TestDCPSave.java b/test/src/com/xilinx/rapidwright/design/TestDCPSave.java index 3700bf9c1..98c847057 100644 --- a/test/src/com/xilinx/rapidwright/design/TestDCPSave.java +++ b/test/src/com/xilinx/rapidwright/design/TestDCPSave.java @@ -24,22 +24,20 @@ import java.nio.file.Path; -import com.xilinx.rapidwright.edif.EDIFNetlist; -import com.xilinx.rapidwright.edif.EDIFTools; -import com.xilinx.rapidwright.support.RapidWrightDCP; -import com.xilinx.rapidwright.util.VivadoTools; -import com.xilinx.rapidwright.util.VivadoToolsHelper; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import com.xilinx.rapidwright.device.BEL; import com.xilinx.rapidwright.device.SiteTypeEnum; import com.xilinx.rapidwright.edif.EDIFCell; import com.xilinx.rapidwright.edif.EDIFCellInst; import com.xilinx.rapidwright.edif.EDIFLibrary; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; +import com.xilinx.rapidwright.edif.EDIFNetlist; +import com.xilinx.rapidwright.edif.EDIFTools; +import com.xilinx.rapidwright.support.RapidWrightDCP; +import com.xilinx.rapidwright.util.VivadoToolsHelper; public class TestDCPSave { @@ -72,15 +70,15 @@ public void testDCPSave(boolean detachNetlist, @TempDir Path tempDir) { c1.addPinMapping("A3", "I2"); c1.addPinMapping("A4", "I3"); c1.addPinMapping("A5", "I4"); - c1.addPinMapping("O6", "O"); - c1.addPinMapping("GE", "GE"); + c1.addPinMapping("O5", "O"); + c2.addPinMapping("GE", "GE"); c2.addPinMapping("A1", "I0"); c2.addPinMapping("A2", "I1"); c2.addPinMapping("A3", "I2"); c2.addPinMapping("A4", "I3"); c2.addPinMapping("A5", "I4"); - c2.addPinMapping("O5", "O"); + c2.addPinMapping("O6", "O"); if (detachNetlist) { EDIFTools.writeEDIFFile(tempDir.resolve("tmp.edf"), n, d.getPartName()); diff --git a/test/src/com/xilinx/rapidwright/design/TestDesignTools.java b/test/src/com/xilinx/rapidwright/design/TestDesignTools.java index 9c741ad79..62c5ca87a 100644 --- a/test/src/com/xilinx/rapidwright/design/TestDesignTools.java +++ b/test/src/com/xilinx/rapidwright/design/TestDesignTools.java @@ -35,8 +35,6 @@ import java.util.Set; import java.util.stream.Collectors; -import com.xilinx.rapidwright.device.BEL; -import com.xilinx.rapidwright.edif.EDIFHierPortInst; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -45,6 +43,7 @@ import com.xilinx.rapidwright.design.blocks.PBlock; import com.xilinx.rapidwright.design.blocks.UtilizationType; +import com.xilinx.rapidwright.device.BEL; import com.xilinx.rapidwright.device.BELPin; import com.xilinx.rapidwright.device.Device; import com.xilinx.rapidwright.device.PIP; @@ -53,6 +52,7 @@ import com.xilinx.rapidwright.edif.EDIFCell; import com.xilinx.rapidwright.edif.EDIFDirection; import com.xilinx.rapidwright.edif.EDIFHierCellInst; +import com.xilinx.rapidwright.edif.EDIFHierPortInst; import com.xilinx.rapidwright.edif.EDIFNet; import com.xilinx.rapidwright.edif.EDIFNetlist; import com.xilinx.rapidwright.edif.EDIFPort; @@ -1201,7 +1201,7 @@ public void testPlaceCell() { for(Cell c : cells) { DesignTools.placeCell(c, d); - Assertions.assertFalse(c.getPinMappingsP2L().isEmpty()); + Assertions.assertFalse(c.getUsedPhysicalPins().isEmpty()); Assertions.assertNotNull(c.getBEL()); Assertions.assertNotNull(c.getSiteInst()); } diff --git a/test/src/com/xilinx/rapidwright/design/tools/TestLUTTools.java b/test/src/com/xilinx/rapidwright/design/tools/TestLUTTools.java index 7cabb2d9c..d74d59d4f 100644 --- a/test/src/com/xilinx/rapidwright/design/tools/TestLUTTools.java +++ b/test/src/com/xilinx/rapidwright/design/tools/TestLUTTools.java @@ -28,31 +28,31 @@ import java.util.List; import java.util.Set; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + import com.xilinx.rapidwright.design.Cell; import com.xilinx.rapidwright.design.Design; import com.xilinx.rapidwright.design.Net; import com.xilinx.rapidwright.design.SiteInst; import com.xilinx.rapidwright.design.SitePinInst; import com.xilinx.rapidwright.design.Unisim; -import com.xilinx.rapidwright.device.Node; -import com.xilinx.rapidwright.device.PIP; -import com.xilinx.rapidwright.rwroute.RWRoute; -import com.xilinx.rapidwright.rwroute.TestRWRoute; -import com.xilinx.rapidwright.support.LargeTest; -import com.xilinx.rapidwright.support.RapidWrightDCP; -import com.xilinx.rapidwright.util.VivadoToolsHelper; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - import com.xilinx.rapidwright.device.BEL; import com.xilinx.rapidwright.device.Device; +import com.xilinx.rapidwright.device.Node; +import com.xilinx.rapidwright.device.PIP; import com.xilinx.rapidwright.device.Part; import com.xilinx.rapidwright.device.PartNameTools; import com.xilinx.rapidwright.device.Series; import com.xilinx.rapidwright.device.Site; import com.xilinx.rapidwright.device.SiteTypeEnum; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; +import com.xilinx.rapidwright.rwroute.RWRoute; +import com.xilinx.rapidwright.rwroute.TestRWRoute; +import com.xilinx.rapidwright.support.LargeTest; +import com.xilinx.rapidwright.support.RapidWrightDCP; +import com.xilinx.rapidwright.util.VivadoToolsHelper; public class TestLUTTools { @@ -90,9 +90,14 @@ public void testSwapLutPinsFromPIPs() { SiteInst si = design.createSiteInst("SLICE_X0Y0"); // Create and place on both A6LUT and A5LUT Cell cell6 = design.createAndPlaceCell("lut6", Unisim.LUT2, "SLICE_X0Y0/A6LUT"); - cell6.getPinMappingsP2L().clear(); // Clear default pin mappings + // Clear default pin mappings + for (String physPin : cell6.getUsedPhysicalPins()) { + cell6.removePinMapping(physPin); + } Cell cell5 = design.createAndPlaceCell("lut5", Unisim.LUT2, "SLICE_X0Y0/A5LUT"); - cell5.getPinMappingsP2L().clear(); + for (String physPin : cell5.getUsedPhysicalPins()) { + cell5.removePinMapping(physPin); + } // Net with a single sink pin used by both LUTs that needs swapping Net netNeedsPinSwap = design.createNet("netNeedsPinSwap"); From 2c44febcdd3d3183a28eb121029ee204e37da875 Mon Sep 17 00:00:00 2001 From: eddieh-xlnx Date: Fri, 22 Nov 2024 08:35:27 -0800 Subject: [PATCH 21/41] [TestNet] Improve testSetPinsMultiSrcStatic to track many sources (#1082) * [TestNet] Improve testSetPinsMultiSrcStatic to track many sources Signed-off-by: Eddie Hung * Add/improve test Signed-off-by: Eddie Hung * Improve test Signed-off-by: Eddie Hung --------- Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/design/TestNet.java | 53 +++++++++++++++++-- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/test/src/com/xilinx/rapidwright/design/TestNet.java b/test/src/com/xilinx/rapidwright/design/TestNet.java index b2f73cd14..bd38d70e3 100644 --- a/test/src/com/xilinx/rapidwright/design/TestNet.java +++ b/test/src/com/xilinx/rapidwright/design/TestNet.java @@ -37,8 +37,8 @@ public class TestNet { @Test - void testSetPinsMultiSrc() { - Design d = new Design("testSetPinsMultiSrc", Device.KCU105); + void testSetPinsDualSrc() { + Design d = new Design("testSetPinsDualSrc", Device.KCU105); SiteInst si = d.createSiteInst("SLICE_X32Y73"); Net net = new Net("foo"); @@ -52,6 +52,25 @@ void testSetPinsMultiSrc() { Assertions.assertEquals(pins.get(1), net.getAlternateSource()); } + @Test + void testSetPinsMultiSrc() { + Design d = new Design("testSetPinsMultiSrc", "xcvc1902"); + SiteInst si = d.createSiteInst("SLICE_X249Y83"); + + Net net = new Net("foo"); + List pins = Arrays.asList( + new SitePinInst("H_O", si), + new SitePinInst("HQ", si), + new SitePinInst("HQ2", si) + ); + + Assertions.assertTrue(net.setPins(pins)); + Assertions.assertEquals(pins.get(0), net.getSource()); + Assertions.assertEquals(pins.get(1), net.getAlternateSource()); + Assertions.assertSame(pins.get(2), net.getAlternateSources().get(1)); + Assertions.assertEquals(pins.subList(1, 3).toString(), net.getAlternateSources().toString()); + } + @Test void testSetPinsMultiSrcStatic() { Design d = new Design("testSetPinsMultiSrcStatic", Device.KCU105); @@ -60,13 +79,37 @@ void testSetPinsMultiSrcStatic() { Net net = d.getVccNet(); List pins = Arrays.asList( new SitePinInst("A_O", si), - new SitePinInst("B_O", si), + new SitePinInst("BMUX", si), new SitePinInst("C_O", si) ); Assertions.assertTrue(net.setPins(pins)); - Assertions.assertNull(net.getSource()); - Assertions.assertNull(net.getAlternateSource()); + Assertions.assertSame(pins.get(0), net.getSource()); + Assertions.assertSame(pins.get(1), net.getAlternateSource()); + Assertions.assertSame(pins.get(2), net.getAlternateSources().get(1)); + Assertions.assertEquals(pins.subList(1, 3).toString(), net.getAlternateSources().toString()); + } + + @Test + void testAddPinsMultiSrcStatic() { + Design d = new Design("testSetPinsMultiSrcStatic", "xcvc1902"); + SiteInst si = d.createSiteInst("SLICE_X249Y83"); + + Net net = d.getVccNet(); + List pins = Arrays.asList( + new SitePinInst("F_O", si), + new SitePinInst("GQ", si), + new SitePinInst("H_O", si) + ); + for (SitePinInst spi : pins) { + Assertions.assertTrue(net.addPin(spi)); + } + + Assertions.assertTrue(net.setPins(pins)); + Assertions.assertSame(pins.get(0), net.getSource()); + Assertions.assertSame(pins.get(1), net.getAlternateSource()); + Assertions.assertSame(pins.get(2), net.getAlternateSources().get(1)); + Assertions.assertEquals(pins.subList(1, 3).toString(), net.getAlternateSources().toString()); } @Test From 712ff7097690794195c87e0deb28d843a3246ea3 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Fri, 22 Nov 2024 10:46:20 -0800 Subject: [PATCH 22/41] First phase of cleanup; do not pass RouteNode between methods Signed-off-by: Eddie Hung --- .../router/VersalClockRouting.java | 125 ++++++++---------- .../rwroute/GlobalSignalRouting.java | 13 +- .../rapidwright/rwroute/RouterHelper.java | 47 ++++--- 3 files changed, 90 insertions(+), 95 deletions(-) diff --git a/src/com/xilinx/rapidwright/router/VersalClockRouting.java b/src/com/xilinx/rapidwright/router/VersalClockRouting.java index 69ef74e9c..92e3368dc 100644 --- a/src/com/xilinx/rapidwright/router/VersalClockRouting.java +++ b/src/com/xilinx/rapidwright/router/VersalClockRouting.java @@ -34,6 +34,8 @@ import com.xilinx.rapidwright.device.Tile; import com.xilinx.rapidwright.device.Wire; import com.xilinx.rapidwright.rwroute.NodeStatus; +import com.xilinx.rapidwright.rwroute.RouterHelper; +import com.xilinx.rapidwright.rwroute.RouterHelper.NodeWithPrev; import java.util.ArrayList; import java.util.Collection; @@ -58,22 +60,24 @@ */ public class VersalClockRouting { - public static RouteNode routeBUFGToNearestRoutingTrack(Net clk) { - Queue q = new LinkedList<>(); - q.add(new RouteNode(clk.getSource())); + public static Node routeBUFGToNearestRoutingTrack(Net clk) { + Queue q = new LinkedList<>(); + q.add(new NodeWithPrev(clk.getSource().getConnectedNode())); int watchDog = 300; while (!q.isEmpty()) { - RouteNode curr = q.poll(); - Node currNode = Node.getNode(curr); - IntentCode c = currNode.getIntentCode(); + NodeWithPrev curr = q.poll(); + IntentCode c = curr.getIntentCode(); if (c == IntentCode.NODE_GLOBAL_HROUTE_HSR) { - clk.getPIPs().addAll(curr.getPIPsBackToSourceByNodes()); + List path = curr.getPrevPath(); + clk.getPIPs().addAll(RouterHelper.getPIPsFromNodes(path)); return curr; } - for (Node downhill: currNode.getAllDownhillNodes()) { - q.add(new RouteNode(downhill.getTile(), downhill.getWireIndex(), curr, curr.getLevel()+1)); + for (Node downhill: curr.getAllDownhillNodes()) { + q.add(new NodeWithPrev(downhill, curr)); + } + if (watchDog-- == 0) { + break; } - if (watchDog-- == 0) break; } return null; } @@ -82,23 +86,15 @@ public static RouteNode routeBUFGToNearestRoutingTrack(Net clk) { * Routes a clock from a routing track to a transition point where the clock. * fans out and transitions from clock routing tracks to clock distribution. * @param clk The current clock net to contribute routing. - * @param startingRouteNode The intermediate start point of the clock route. + * @param startingNode The intermediate start point of the clock route. * @param clockRegion The center clock region or the clock region that is one row above or below the center. * @param findCentroidHroute The flag to indicate the returned RouteNode should be HROUTE in the center or VROUTE going up or down. */ - public static RouteNode routeToCentroid(Net clk, RouteNode startingRouteNode, ClockRegion clockRegion, boolean findCentroidHroute) { + public static Node routeToCentroid(Net clk, Node startingNode, ClockRegion clockRegion, boolean findCentroidHroute) { Queue q = RouteNode.createPriorityQueue(); - startingRouteNode.setParent(null); - q.add(startingRouteNode); - Set allowedIntentCodes = EnumSet.of( - IntentCode.NODE_GLOBAL_BUFG, - IntentCode.NODE_GLOBAL_GCLK, - IntentCode.NODE_GLOBAL_HROUTE_HSR, - IntentCode.NODE_GLOBAL_VROUTE, - IntentCode.NODE_GLOBAL_VDISTR_LVL2 - ); + q.add(new RouteNode(startingNode)); int watchDog = 10000000; - RouteNode centroidHRouteNode = null; + RouteNode centroidHRouteNode; Set visited = new HashSet<>(); // In Vivado solutions, we can always find the pattern: @@ -130,11 +126,11 @@ public static RouteNode routeToCentroid(Net clk, RouteNode startingRouteNode, Cl centroidHRouteNode = centroidHRouteNode.getParent(); } clk.getPIPs().addAll(centroidHRouteNode.getPIPsBackToSourceByNodes()); - return centroidHRouteNode; + return Node.getNode(centroidHRouteNode); } // assign PIPs based on which RouteNode returned, instead of curr clk.getPIPs().addAll(parent.getPIPsBackToSourceByNodes()); - return parent; + return Node.getNode(parent); } } @@ -156,7 +152,7 @@ public static RouteNode routeToCentroid(Net clk, RouteNode startingRouteNode, Cl q.add(rn); } if (watchDog-- == 0) { - throw new RuntimeException("ERROR: Could not route from " + startingRouteNode + " to clock region " + clockRegion); + throw new RuntimeException("ERROR: Could not route from " + startingNode + " to clock region " + clockRegion); } } @@ -227,18 +223,16 @@ public static Map routeCentroidToVerticalDistributionLin return crToVdist; } - public static Map routeVrouteToVerticalDistributionLines(Net clk, - RouteNode vroute, - Collection clockRegions, - Function getNodeStatus) { - Map crToVdist = new HashMap<>(); - vroute.setParent(null); + public static Map routeVrouteToVerticalDistributionLines(Net clk, + Node vroute, + Collection clockRegions, + Function getNodeStatus) { + Map crToVdist = new HashMap<>(); Queue q = RouteNode.createPriorityQueue(); HashSet visited = new HashSet<>(); Set allPIPs = new HashSet<>(); Set startingPoints = new HashSet<>(); - startingPoints.add(vroute); - assert(vroute.getParent() == null); + startingPoints.add(new RouteNode(vroute)); // Pattern: NODE_GLOBAL_VROUTE -> ... -> NODE_GLOBAL_VDISTR_LVL2 -> ... -> NODE_GLOBAL_VDISTR_LVL1 -> ... -> NODE_GLOBAL_VDISTR Set allowedIntentCodes = EnumSet.of( IntentCode.NODE_GLOBAL_VDISTR, @@ -268,9 +262,7 @@ public static Map routeVrouteToVerticalDistributionLines startingPoints.add(p.getEndRouteNode()); } } - RouteNode currBase = new RouteNode(currNode); - currBase.setParent(null); - crToVdist.put(cr, currBase); + crToVdist.put(cr, currNode); continue nextClockRegion; } @@ -288,7 +280,6 @@ public static Map routeVrouteToVerticalDistributionLines throw new RuntimeException("ERROR: Couldn't route to distribution line in clock region " + cr); } clk.getPIPs().addAll(allPIPs); - vroute.setParent(null); return crToVdist; } @@ -299,21 +290,20 @@ public static Map routeVrouteToVerticalDistributionLines * @param crMap A map of target clock regions and their respective vertical distribution lines * @return The List of nodes from the centroid to the horizontal distribution line. */ - public static Map routeVerticalToHorizontalDistributionLines(Net clk, - Map crMap, - Function getNodeStatus) { - Map distLines = new HashMap<>(); + public static Map routeVerticalToHorizontalDistributionLines(Net clk, + Map crMap, + Function getNodeStatus) { + Map distLines = new HashMap<>(); Queue q = new LinkedList<>(); Set allPIPs = new HashSet<>(); Set visited = new HashSet<>(); - nextClockRegion: for (Entry e : crMap.entrySet()) { + nextClockRegion: for (Entry e : crMap.entrySet()) { q.clear(); - RouteNode vertDistLine = e.getValue(); - vertDistLine.setParent(null); - q.add(vertDistLine); + Node vertDistLine = e.getValue(); + q.add(new RouteNode(vertDistLine)); ClockRegion targetCR = e.getKey(); visited.clear(); - visited.add(Node.getNode(vertDistLine)); + visited.add(vertDistLine); while (!q.isEmpty()) { RouteNode curr = q.poll(); @@ -333,7 +323,7 @@ public static Map routeVerticalToHorizontalDistributionL } parent.setParent(null); - distLines.put(targetCR, parent); + distLines.put(targetCR, Node.getNode(parent)); continue nextClockRegion; } @@ -356,20 +346,22 @@ public static Map routeVerticalToHorizontalDistributionL * @param distLines A map of target clock regions and their respective horizontal distribution lines * @param lcbTargets The target LCB nodes to route the clock */ - public static void routeDistributionToLCBs(Net clk, Map distLines, Set lcbTargets) { - Map> startingPoints = getStartingPoints(distLines); + public static void routeDistributionToLCBs(Net clk, Map distLines, Set lcbTargets) { + Map> startingPoints = getStartingPoints(distLines); routeToLCBs(clk, startingPoints, lcbTargets); } - public static Map> getStartingPoints(Map distLines) { - Map> startingPoints = new HashMap<>(); - for (ClockRegion cr : distLines.keySet()) { - startingPoints.computeIfAbsent(cr, k -> new HashSet<>()).add(distLines.get(cr)); + public static Map> getStartingPoints(Map distLines) { + Map> startingPoints = new HashMap<>(); + for (Entry e : distLines.entrySet()) { + ClockRegion cr = e.getKey(); + Node distLine = e.getValue(); + startingPoints.computeIfAbsent(cr, k -> new HashSet<>()).add(distLine); } return startingPoints; } - public static void routeToLCBs(Net clk, Map> startingPoints, Set lcbTargets) { + public static void routeToLCBs(Net clk, Map> startingPoints, Set lcbTargets) { Queue q = RouteNode.createPriorityQueue(); Set allPIPs = new HashSet<>(); HashSet visited = new HashSet<>(); @@ -378,11 +370,10 @@ public static void routeToLCBs(Net clk, Map> startin q.clear(); visited.clear(); ClockRegion currCR = lcb.getTile().getClockRegion(); - Set starts = startingPoints.getOrDefault(currCR, Collections.emptySet()); - for (RouteNode rn : starts) { - assert(rn.getParent() == null); + Set starts = startingPoints.getOrDefault(currCR, Collections.emptySet()); + for (Node n : starts) { + q.add(new RouteNode(n)); } - q.addAll(starts); while (!q.isEmpty()) { RouteNode curr = q.poll(); visited.add(curr); @@ -390,10 +381,10 @@ public static void routeToLCBs(Net clk, Map> startin List pips = curr.getPIPsBackToSource(); allPIPs.addAll(pips); - Set s = startingPoints.get(currCR); + Set s = startingPoints.get(currCR); for (PIP p : pips) { - s.add(new RouteNode(p.getTile(),p.getStartWireIndex())); - s.add(new RouteNode(p.getTile(),p.getEndWireIndex())); + s.add(p.getStartNode()); + s.add(p.getEndNode()); } continue nextLCB; } @@ -508,14 +499,14 @@ public static void routeLCBsToSinks(Net clk, Map> l * @param down To indicate if it is routing to the group of top clock regions. * @return A list of RouteNodes indicating the reached horizontal distribution lines. */ - public static Map routeToHorizontalDistributionLines(Net clk, - RouteNode vroute, - Collection clockRegions, - boolean down, - Function getNodeStatus) { + public static Map routeToHorizontalDistributionLines(Net clk, + Node vroute, + Collection clockRegions, + boolean down, + Function getNodeStatus) { // First step: map each clock region to a VDISTR node. // The clock region of this VDISTR node should be in the same column of the centroid (X) and the same row of the target clock region (Y). - Map vertDistLines = routeVrouteToVerticalDistributionLines(clk, vroute, clockRegions, getNodeStatus); + Map vertDistLines = routeVrouteToVerticalDistributionLines(clk, vroute, clockRegions, getNodeStatus); // Second step: start from the VDISTR node and try to find a HDISTR node in the target clock region. return routeVerticalToHorizontalDistributionLines(clk, vertDistLines, getNodeStatus); diff --git a/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java b/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java index df1a26faf..0d165198d 100644 --- a/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java +++ b/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java @@ -235,16 +235,15 @@ public static void symmetricClkRouting(Net clk, Device device, Function clockRegions = getClockRegionsOfNet(clk); - Map upDownDistLines = new HashMap<>(); + Map upDownDistLines; SitePinInst source = clk.getSource(); SiteTypeEnum sourceTypeEnum = source.getSiteTypeEnum(); - RouteNode sourceRouteNode = new RouteNode(source); // In US/US+ clock routing, we use two VROUTE nodes to reach the clock regions above and below the centroid. // However, we can see that Vivado only use one VROUTE node in the centroid clock region for Versal clock routing, // and reach the above and below clock regions by VDISTR nodes. ClockRegion centroid; - RouteNode centroidHRouteNode; + Node centroidHRouteNode; // In FPGA '24 routing contest benchmarks, we found that there are only two types of source sites for the clock nets: BUFGCE and BUFG_FABRIC. if (sourceTypeEnum == SiteTypeEnum.BUFG_FABRIC) { @@ -256,7 +255,7 @@ public static void symmetricClkRouting(Net clk, Device device, Function getPrevPath() { + List path = new ArrayList<>(); + NodeWithPrev curr = this; + while (curr != null) { + path.add(curr); + curr = curr.getPrev(); + } + return path; + } } /** @@ -547,14 +564,11 @@ public static boolean routeDirectConnection(Connection directConnection) { * @return A list of nodes making up the path. */ public static List findPathBetweenNodes(Node source, Node sink) { - List path = new ArrayList<>(); if (source.equals(sink)) { - return path; // for pins without additional projected int_node + return Collections.emptyList(); // for pins without additional projected int_node } if (source.getAllDownhillNodes().contains(sink)) { - path.add(sink); - path.add(source); - return path; + return Arrays.asList(sink, source); } NodeWithPrev sourcer = new NodeWithPrev(source); sourcer.setPrev(null); @@ -566,16 +580,10 @@ public static List findPathBetweenNodes(Node source, Node sink) { !Utils.isClocking(sink.getTile().getTileTypeEnum()); int watchdog = 10000; - boolean success = false; while (!queue.isEmpty()) { NodeWithPrev curr = queue.poll(); if (curr.equals(sink)) { - while (curr != null) { - path.add(curr); - curr = curr.getPrev(); - } - success = true; - break; + return curr.getPrevPath(); } for (Node n : curr.getAllDownhillNodes()) { if (blockClocking && Utils.isClocking(n.getTile().getTileTypeEnum())) { @@ -591,11 +599,8 @@ public static List findPathBetweenNodes(Node source, Node sink) { } } - if (!success) { - System.err.println("ERROR: Failed to find a path between two nodes: " + source + ", " + sink); - path.clear(); - } - return path; + System.err.println("ERROR: Failed to find a path between two nodes: " + source + ", " + sink); + return Collections.emptyList(); } /** From 113fc89f4dc415c039728151db7f7ff4ca4b2535 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Fri, 22 Nov 2024 12:31:27 -0800 Subject: [PATCH 23/41] [VersalClockRouting] Rewrite without RouteNode Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/router/RouteNode.java | 26 -- .../router/VersalClockRouting.java | 434 +++++++++--------- .../rwroute/GlobalSignalRouting.java | 5 +- 3 files changed, 210 insertions(+), 255 deletions(-) diff --git a/src/com/xilinx/rapidwright/router/RouteNode.java b/src/com/xilinx/rapidwright/router/RouteNode.java index 93453eb13..061e58068 100644 --- a/src/com/xilinx/rapidwright/router/RouteNode.java +++ b/src/com/xilinx/rapidwright/router/RouteNode.java @@ -381,32 +381,6 @@ public ArrayList getPIPsBackToSource() { return pips; } - public ArrayList getPIPsBackToSourceByNodes() { - ArrayList pips = new ArrayList<>(); - RouteNode curr = this; - while (curr.parent != null) { - PIP pip = PIP.getArbitraryPIP(Node.getNode(curr.parent), Node.getNode(curr)); - if (pip != null) { - pips.add(pip); - } - curr = curr.parent; - } - return pips; - } - - public ArrayList getPIPsForwardToSinkByNodes() { - ArrayList pips = new ArrayList<>(); - RouteNode curr = this; - do { - PIP pip = PIP.getArbitraryPIP(Node.getNode(curr), Node.getNode(curr.parent)); - if (pip != null) { - pips.add(pip); - } - curr = curr.parent; - } while (curr.parent != null); - return pips; - } - public Wire[] getWiresInNode() { return Node.getWiresInNode(getTile(),getWire()); } diff --git a/src/com/xilinx/rapidwright/router/VersalClockRouting.java b/src/com/xilinx/rapidwright/router/VersalClockRouting.java index 92e3368dc..77c7d0d18 100644 --- a/src/com/xilinx/rapidwright/router/VersalClockRouting.java +++ b/src/com/xilinx/rapidwright/router/VersalClockRouting.java @@ -32,21 +32,21 @@ import com.xilinx.rapidwright.device.PIP; import com.xilinx.rapidwright.device.Tile; -import com.xilinx.rapidwright.device.Wire; import com.xilinx.rapidwright.rwroute.NodeStatus; import com.xilinx.rapidwright.rwroute.RouterHelper; import com.xilinx.rapidwright.rwroute.RouterHelper.NodeWithPrev; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.PriorityQueue; import java.util.Queue; import java.util.Set; import java.util.function.Function; @@ -59,9 +59,29 @@ * Created on: Nov 1, 2024 */ public class VersalClockRouting { + public static class NodeWithPrevAndCost extends NodeWithPrev implements Comparable { + protected int cost; + public NodeWithPrevAndCost(Node node) { + super(node); + setCost(0); + } + public NodeWithPrevAndCost(Node node, NodeWithPrev prev, int cost) { + super(node, prev); + setCost(cost); + } + + public void setCost(int cost) { + this.cost = cost; + } + + @Override + public int compareTo(NodeWithPrevAndCost that) { + return Integer.compare(this.cost, that.cost); + } + } public static Node routeBUFGToNearestRoutingTrack(Net clk) { - Queue q = new LinkedList<>(); + Queue q = new ArrayDeque<>(); q.add(new NodeWithPrev(clk.getSource().getConnectedNode())); int watchDog = 300; while (!q.isEmpty()) { @@ -88,68 +108,67 @@ public static Node routeBUFGToNearestRoutingTrack(Net clk) { * @param clk The current clock net to contribute routing. * @param startingNode The intermediate start point of the clock route. * @param clockRegion The center clock region or the clock region that is one row above or below the center. - * @param findCentroidHroute The flag to indicate the returned RouteNode should be HROUTE in the center or VROUTE going up or down. + * @param findCentroidHroute The flag to indicate the returned Node should be HROUTE in the center or VROUTE going up or down. */ public static Node routeToCentroid(Net clk, Node startingNode, ClockRegion clockRegion, boolean findCentroidHroute) { - Queue q = RouteNode.createPriorityQueue(); - q.add(new RouteNode(startingNode)); - int watchDog = 10000000; - RouteNode centroidHRouteNode; + Queue q = new PriorityQueue<>(); + q.add(new NodeWithPrevAndCost(startingNode)); + int watchDog = 10000; Set visited = new HashSet<>(); + Tile crApproxCenterTile = clockRegion.getApproximateCenter(); // In Vivado solutions, we can always find the pattern: // ... -> NODE_GLOBAL_GCLK -> NODE_GLOBAL_VROUTE -> NODE_GLOBAL_VDISTR_LVL2 -> ... // and this is how we locate the VROUTE node while (!q.isEmpty()) { - RouteNode curr = q.poll(); - Node currNode = Node.getNode(curr); - RouteNode parent = curr.getParent(); - for (Node downhill : currNode.getAllDownhillNodes()) { - IntentCode intentCode = downhill.getIntentCode(); - if (parent != null) { - Node parentNode = Node.getNode(parent); - if (parentNode.getIntentCode() == IntentCode.NODE_GLOBAL_VROUTE && - currNode.getIntentCode() == IntentCode.NODE_GLOBAL_HROUTE_HSR) { - // Disallow ability to go from VROUTE back to HROUTE - continue; - } - if (intentCode == IntentCode.NODE_GLOBAL_VDISTR_LVL2 && - currNode.getIntentCode() == IntentCode.NODE_GLOBAL_GCLK && - parentNode.getIntentCode() == IntentCode.NODE_GLOBAL_VROUTE && - clockRegion.equals(currNode.getTile().getClockRegion()) && - clockRegion.equals(parentNode.getTile().getClockRegion()) && - parentNode.getWireName().contains("BOT")) { - if (findCentroidHroute) { - centroidHRouteNode = curr.getParent(); - while (centroidHRouteNode.getIntentCode() != IntentCode.NODE_GLOBAL_HROUTE_HSR) { - centroidHRouteNode = centroidHRouteNode.getParent(); - } - clk.getPIPs().addAll(centroidHRouteNode.getPIPsBackToSourceByNodes()); - return Node.getNode(centroidHRouteNode); + NodeWithPrevAndCost curr = q.poll(); + boolean possibleCentroid = false; + Node parent = curr.getPrev(); + if (parent != null) { + IntentCode parentIntentCode = parent.getIntentCode(); + IntentCode currIntentCode = curr.getIntentCode(); + if (parentIntentCode == IntentCode.NODE_GLOBAL_VROUTE && + currIntentCode == IntentCode.NODE_GLOBAL_HROUTE_HSR) { + // Disallow ability to go from VROUTE back to HROUTE + continue; + } + if (currIntentCode == IntentCode.NODE_GLOBAL_GCLK && + parentIntentCode == IntentCode.NODE_GLOBAL_VROUTE && + clockRegion.equals(curr.getTile().getClockRegion()) && + clockRegion.equals(parent.getTile().getClockRegion()) && + parent.getWireName().contains("BOT")) { + possibleCentroid = true; + } + } + for (Node downhill : curr.getAllDownhillNodes()) { + IntentCode downhillIntentCode = downhill.getIntentCode(); + // Only using routing lines to get to centroid + if (!downhillIntentCode.isVersalClocking()) { + continue; + } + + if (possibleCentroid && downhillIntentCode == IntentCode.NODE_GLOBAL_VDISTR_LVL2) { + NodeWithPrev centroidHRouteNode = curr.getPrev(); + if (findCentroidHroute) { + while (centroidHRouteNode.getIntentCode() != IntentCode.NODE_GLOBAL_HROUTE_HSR) { + centroidHRouteNode = centroidHRouteNode.getPrev(); } - // assign PIPs based on which RouteNode returned, instead of curr - clk.getPIPs().addAll(parent.getPIPsBackToSourceByNodes()); - return Node.getNode(parent); } + List path = centroidHRouteNode.getPrevPath(); + clk.getPIPs().addAll(RouterHelper.getPIPsFromNodes(path)); + return centroidHRouteNode; } - // Only using routing lines to get to centroid - if (!intentCode.isVersalClocking()) { + if (!findCentroidHroute && downhillIntentCode == IntentCode.NODE_GLOBAL_HROUTE_HSR) { continue; } - if (!findCentroidHroute && intentCode == IntentCode.NODE_GLOBAL_HROUTE_HSR) { + if (!visited.add(downhill)) { continue; } - if (!visited.add(downhill)) continue; - RouteNode rn = new RouteNode(downhill.getTile(), downhill.getWireIndex(), curr, curr.getLevel()+1); - - // The clockRegion.getApproximateCenter() may return an INVALID_* tile with huge coordinates. - // Here we use the Manhattan distance to the target clock region as the cost. - ClockRegion rnClockRegion = rn.getTile().getClockRegion(); - int cost = Math.abs(rnClockRegion.getColumn() - clockRegion.getColumn()) + Math.abs(rnClockRegion.getRow() - clockRegion.getRow()); - rn.setCost(cost); - q.add(rn); + + int cost = downhill.getTile().getManhattanDistance(crApproxCenterTile); + q.add(new NodeWithPrevAndCost(downhill, curr, cost)); } if (watchDog-- == 0) { throw new RuntimeException("ERROR: Could not route from " + startingNode + " to clock region " + clockRegion); @@ -159,80 +178,16 @@ public static Node routeToCentroid(Net clk, Node startingNode, ClockRegion clock return null; } - /** - * Routes the vertical distribution path and generates a map between each target clock region and the vertical distribution line to - * start from. - * @param clk The clock net. - * @param centroidDistNode Starting point vertical distribution line - * @param clockRegions The target clock regions. - * @return A map of target clock regions and their respective vertical distribution lines - */ - public static Map routeCentroidToVerticalDistributionLines(Net clk, - RouteNode centroidDistNode, - Collection clockRegions, - Function getNodeStatus) { - Map crToVdist = new HashMap<>(); - centroidDistNode.setParent(null); - Queue q = RouteNode.createPriorityQueue(); - HashSet visited = new HashSet<>(); - Set allPIPs = new HashSet<>(); - Set startingPoints = new HashSet<>(); - startingPoints.add(centroidDistNode); - assert(centroidDistNode.getParent() == null); - nextClockRegion: for (ClockRegion cr : clockRegions) { - q.clear(); - visited.clear(); - q.addAll(startingPoints); - Tile crTarget = cr.getApproximateCenter(); - while (!q.isEmpty()) { - RouteNode curr = q.poll(); - visited.add(curr); - IntentCode c = curr.getIntentCode(); - ClockRegion currCR = curr.getTile().getClockRegion(); - if (currCR != null && cr.equals(currCR) && c == IntentCode.NODE_GLOBAL_VDISTR) { - // Only consider base wires - Node currNode = Node.getNode(curr); - if (getNodeStatus.apply(currNode) == NodeStatus.INUSE) { - startingPoints.add(curr); - } else { - List pips = curr.getPIPsBackToSource(); - allPIPs.addAll(pips); - for (PIP p : pips) { - startingPoints.add(p.getStartRouteNode()); - startingPoints.add(p.getEndRouteNode()); - } - } - RouteNode currBase = new RouteNode(currNode); - currBase.setParent(null); - crToVdist.put(cr, currBase); - continue nextClockRegion; - } - for (Wire w : curr.getWireConnections()) { - if (w.getIntentCode() != IntentCode.NODE_GLOBAL_VDISTR) continue; - Node n = Node.getNode(w); - RouteNode rn = new RouteNode(n.getTile(), n.getWireIndex(), curr, curr.getLevel()+1); - if (visited.contains(rn)) continue; - rn.setCost(w.getTile().getManhattanDistance(crTarget)); - q.add(rn); - } - } - throw new RuntimeException("ERROR: Couldn't route to distribution line in clock region " + cr); - } - clk.getPIPs().addAll(allPIPs); - centroidDistNode.setParent(null); - return crToVdist; - } - public static Map routeVrouteToVerticalDistributionLines(Net clk, Node vroute, Collection clockRegions, Function getNodeStatus) { Map crToVdist = new HashMap<>(); - Queue q = RouteNode.createPriorityQueue(); - HashSet visited = new HashSet<>(); + Queue q = new PriorityQueue<>(); + Set visited = new HashSet<>(); Set allPIPs = new HashSet<>(); - Set startingPoints = new HashSet<>(); - startingPoints.add(new RouteNode(vroute)); + Set startingPoints = new HashSet<>(); + startingPoints.add(new NodeWithPrevAndCost(vroute)); // Pattern: NODE_GLOBAL_VROUTE -> ... -> NODE_GLOBAL_VDISTR_LVL2 -> ... -> NODE_GLOBAL_VDISTR_LVL1 -> ... -> NODE_GLOBAL_VDISTR Set allowedIntentCodes = EnumSet.of( IntentCode.NODE_GLOBAL_VDISTR, @@ -244,37 +199,35 @@ public static Map routeVrouteToVerticalDistributionLines(Net q.clear(); visited.clear(); q.addAll(startingPoints); - Tile crTarget = cr.getApproximateCenter(); + Tile crApproxCenterTile = cr.getApproximateCenter(); while (!q.isEmpty()) { - RouteNode curr = q.poll(); - Node currNode = Node.getNode(curr); - IntentCode c = currNode.getIntentCode(); - ClockRegion currCR = currNode.getTile().getClockRegion(); + NodeWithPrevAndCost curr = q.poll(); + IntentCode c = curr.getIntentCode(); + ClockRegion currCR = curr.getTile().getClockRegion(); if (currCR != null && cr.getRow() == currCR.getRow() && c == IntentCode.NODE_GLOBAL_VDISTR) { // Only consider base wires - if (getNodeStatus.apply(currNode) == NodeStatus.INUSE) { + if (getNodeStatus.apply(curr) == NodeStatus.INUSE) { startingPoints.add(curr); } else { - List pips = curr.getPIPsBackToSourceByNodes(); - allPIPs.addAll(pips); - for (PIP p : pips) { - startingPoints.add(p.getStartRouteNode()); - startingPoints.add(p.getEndRouteNode()); + List path = curr.getPrevPath(); + for (Node node : path) { + startingPoints.add(new NodeWithPrevAndCost(node)); } + allPIPs.addAll(RouterHelper.getPIPsFromNodes(path)); } - crToVdist.put(cr, currNode); + crToVdist.put(cr, curr); continue nextClockRegion; } - for (Node downhill : currNode.getAllDownhillNodes()) { + for (Node downhill : curr.getAllDownhillNodes()) { if (!allowedIntentCodes.contains(downhill.getIntentCode())) { continue; } - if (visited.contains(downhill)) continue; - RouteNode rn = new RouteNode(downhill.getTile(), downhill.getWireIndex(), curr, curr.getLevel()+1); - rn.setCost(downhill.getTile().getManhattanDistance(crTarget)); - q.add(rn); - visited.add(downhill); + if (!visited.add(downhill)) { + continue; + } + int cost = downhill.getTile().getManhattanDistance(crApproxCenterTile); + q.add(new NodeWithPrevAndCost(downhill, curr, cost)); } } throw new RuntimeException("ERROR: Couldn't route to distribution line in clock region " + cr); @@ -294,44 +247,48 @@ public static Map routeVerticalToHorizontalDistributionLines( Map crMap, Function getNodeStatus) { Map distLines = new HashMap<>(); - Queue q = new LinkedList<>(); + Queue q = new ArrayDeque<>(); Set allPIPs = new HashSet<>(); Set visited = new HashSet<>(); nextClockRegion: for (Entry e : crMap.entrySet()) { q.clear(); Node vertDistLine = e.getValue(); - q.add(new RouteNode(vertDistLine)); + q.add(new NodeWithPrev(vertDistLine)); ClockRegion targetCR = e.getKey(); visited.clear(); visited.add(vertDistLine); while (!q.isEmpty()) { - RouteNode curr = q.poll(); - IntentCode c = curr.getIntentCode(); - Node currNode = Node.getNode(curr); - RouteNode parent = curr.getParent(); - if (targetCR.equals(curr.getTile().getClockRegion()) && c == IntentCode.NODE_GLOBAL_GCLK && - parent.getIntentCode() == IntentCode.NODE_GLOBAL_HDISTR_LOCAL) { - List pips = parent.getPIPsBackToSourceByNodes(); - for (PIP pip : pips) { - allPIPs.add(pip); - NodeStatus status = getNodeStatus.apply(pip.getStartNode()); + NodeWithPrev curr = q.poll(); + NodeWithPrev parent = curr.getPrev(); + if (targetCR.equals(curr.getTile().getClockRegion()) && + curr.getIntentCode() == IntentCode.NODE_GLOBAL_GCLK && + parent.getIntentCode() == IntentCode.NODE_GLOBAL_HDISTR_LOCAL) { + List path = curr.getPrevPath(); + int i; + for (i = 1; i < path.size(); i++) { + Node node = path.get(i); + NodeStatus status = getNodeStatus.apply(node); if (status == NodeStatus.INUSE) { break; } assert(status == NodeStatus.AVAILABLE); } - - parent.setParent(null); - distLines.put(targetCR, Node.getNode(parent)); + allPIPs.addAll(RouterHelper.getPIPsFromNodes(path.subList(1, i))); + parent.setPrev(null); + distLines.put(targetCR, parent); continue nextClockRegion; } - for (Node downhill: currNode.getAllDownhillNodes()) { + for (Node downhill: curr.getAllDownhillNodes()) { IntentCode intentCode = downhill.getIntentCode(); - if (intentCode != IntentCode.NODE_PINFEED && !intentCode.isVersalClocking()) continue; - if (!visited.add(downhill)) continue; - q.add(new RouteNode(downhill.getTile(), downhill.getWireIndex(), curr, curr.getLevel()+1)); + if (intentCode != IntentCode.NODE_PINFEED && !intentCode.isVersalClocking()) { + continue; + } + if (!visited.add(downhill)) { + continue; + } + q.add(new NodeWithPrev(downhill, curr)); } } throw new RuntimeException("ERROR: Couldn't route to distribution line in clock region " + targetCR); @@ -346,7 +303,7 @@ public static Map routeVerticalToHorizontalDistributionLines( * @param distLines A map of target clock regions and their respective horizontal distribution lines * @param lcbTargets The target LCB nodes to route the clock */ - public static void routeDistributionToLCBs(Net clk, Map distLines, Set lcbTargets) { + public static void routeDistributionToLCBs(Net clk, Map distLines, Set lcbTargets) { Map> startingPoints = getStartingPoints(distLines); routeToLCBs(clk, startingPoints, lcbTargets); } @@ -361,45 +318,48 @@ public static Map> getStartingPoints(Map> startingPoints, Set lcbTargets) { - Queue q = RouteNode.createPriorityQueue(); + public static void routeToLCBs(Net clk, Map> startingPoints, Set lcbTargets) { + Queue q = new PriorityQueue<>(); Set allPIPs = new HashSet<>(); - HashSet visited = new HashSet<>(); + Set visited = new HashSet<>(); - nextLCB: for (RouteNode lcb : lcbTargets) { + nextLCB: for (Node lcb : lcbTargets) { q.clear(); visited.clear(); - ClockRegion currCR = lcb.getTile().getClockRegion(); - Set starts = startingPoints.getOrDefault(currCR, Collections.emptySet()); - for (Node n : starts) { - q.add(new RouteNode(n)); + Tile lcbTile = lcb.getTile(); + ClockRegion currCR = lcbTile.getClockRegion(); + for (Node node : startingPoints.getOrDefault(currCR, Collections.emptySet())) { + q.add(new NodeWithPrevAndCost(node)); } while (!q.isEmpty()) { - RouteNode curr = q.poll(); + NodeWithPrevAndCost curr = q.poll(); visited.add(curr); if (lcb.equals(curr)) { - List pips = curr.getPIPsBackToSource(); - allPIPs.addAll(pips); - - Set s = startingPoints.get(currCR); - for (PIP p : pips) { - s.add(p.getStartNode()); - s.add(p.getEndNode()); + Set set = startingPoints.get(currCR); + List path = curr.getPrevPath(); + for (Node node : path) { + set.add(node); } + allPIPs.addAll(RouterHelper.getPIPsFromNodes(path)); continue nextLCB; } - Node currNode = Node.getNode(curr); - for (Node downhill : currNode.getAllDownhillNodes()) { + for (Node downhill : curr.getAllDownhillNodes()) { // Stay in this clock region - if (!currCR.equals(downhill.getTile().getClockRegion())) continue; + if (!currCR.equals(downhill.getTile().getClockRegion())) { + continue; + } IntentCode intentCode = downhill.getIntentCode(); - if (intentCode != IntentCode.NODE_PINFEED && !intentCode.isVersalClocking()) continue; - RouteNode rn = new RouteNode(downhill.getTile(), downhill.getWireIndex(), curr, curr.getLevel()+1); - if (visited.contains(rn)) continue; - if (rn.getWireName().endsWith("_I_CASC_PIN")) continue; - if (rn.getWireName().endsWith("_CLR_B_PIN")) continue; - rn.setCost(rn.getManhattanDistance(lcb)); - q.add(rn); + if (intentCode != IntentCode.NODE_PINFEED && !intentCode.isVersalClocking()) { + continue; + } + if (downhill.getWireName().endsWith("_I_CASC_PIN") || downhill.getWireName().endsWith("_CLR_B_PIN")) { + continue; + } + if (visited.contains(downhill)) { + continue; + } + int cost = downhill.getTile().getManhattanDistance(lcbTile); + q.add(new NodeWithPrevAndCost(downhill, curr, cost)); } } throw new RuntimeException("ERROR: Couldn't route to distribution line in clock region " + lcb); @@ -413,11 +373,11 @@ public static void routeToLCBs(Net clk, Map> startingPoin * @param getNodeStatus Lambda for indicating the status of a Node: available, in-use (preserved * for same net as we're routing), or unavailable (preserved for other net). */ - public static void routeLCBsToSinks(Net clk, Map> lcbMappings, + public static void routeLCBsToSinks(Net clk, Map> lcbMappings, Function getNodeStatus) { Set used = new HashSet<>(); Set visited = new HashSet<>(); - Queue q = new LinkedList<>(); + Queue q = new ArrayDeque<>(); Predicate isNodeUnavailable = (node) -> getNodeStatus.apply(node) == NodeStatus.UNAVAILABLE; Set allowedIntentCodes = EnumSet.of( @@ -435,48 +395,60 @@ public static void routeLCBsToSinks(Net clk, Map> l RouteThruHelper routeThruHelper = new RouteThruHelper(clk.getDesign().getDevice()); - for (Entry> e : lcbMappings.entrySet()) { + for (Entry> e : lcbMappings.entrySet()) { Set currPIPs = new HashSet<>(); - RouteNode lcb = e.getKey(); - assert(lcb.getParent() == null); + Node lcb = e.getKey(); nextPin: for (SitePinInst sink : e.getValue()) { - RouteNode target = sink.getRouteNode(); - Node targetNode = Node.getNode(target); + Node target = sink.getConnectedNode(); q.clear(); - q.add(lcb); + q.add(new NodeWithPrev(lcb)); while (!q.isEmpty()) { - RouteNode curr = q.poll(); - Node currNode = Node.getNode(curr); - if (targetNode.equals(currNode)) { + NodeWithPrev curr = q.poll(); + if (target.equals(curr)) { boolean inuse = false; - for (PIP pip : curr.getPIPsBackToSourceByNodes()) { + List path = curr.getPrevPath(); + int i; + for (i = 1; i < path.size(); i++) { + Node node = path.get(i); if (inuse) { - assert(getNodeStatus.apply(pip.getStartNode()) == NodeStatus.INUSE); + assert(getNodeStatus.apply(node) == NodeStatus.INUSE); continue; } - currPIPs.add(pip); - NodeStatus status = getNodeStatus.apply(pip.getStartNode()); + currPIPs.add(PIP.getArbitraryPIP(node, path.get(i-1))); + NodeStatus status = getNodeStatus.apply(node); if (status == NodeStatus.INUSE) { inuse = true; continue; } assert(status == NodeStatus.AVAILABLE); } + currPIPs.addAll(RouterHelper.getPIPsFromNodes(path.subList(1, i))); sink.setRouted(true); visited.clear(); continue nextPin; } - for (Node downhill : currNode.getAllDownhillNodes()) { - if (!allowedIntentCodes.contains(downhill.getIntentCode())) continue; - if (!visited.add(downhill)) continue; - if (used.contains(downhill)) continue; + for (Node downhill : curr.getAllDownhillNodes()) { + IntentCode downhillIntentCode = downhill.getIntentCode(); + if (!allowedIntentCodes.contains(downhillIntentCode)) { + continue; + } + if (!visited.add(downhill)) { + continue; + } + if (used.contains(downhill)) { + continue; + } // have to allow those routethru-s NODE_IRI -> * - if (routeThruHelper.isRouteThru(currNode, downhill) && downhill.getIntentCode() != IntentCode.NODE_IRI) continue; - if (isNodeUnavailable.test(downhill)) continue; - q.add(new RouteNode(downhill.getTile(), downhill.getWireIndex(), curr, curr.getLevel()+1)); + if (routeThruHelper.isRouteThru(curr, downhill) && downhillIntentCode != IntentCode.NODE_IRI) { + continue; + } + if (isNodeUnavailable.test(downhill)) { + continue; + } + q.add(new NodeWithPrev(downhill, curr)); } } throw new RuntimeException("ERROR: Couldn't route LCB " + e.getKey() + " to Pin " + sink); @@ -543,9 +515,9 @@ public static void incrementalClockRouter(Net clkNet, throw new RuntimeException("ERROR: incrementalClockRouter not yet support on Versal devices."); } - public static Map> routeLCBsToSinks(Net clk, - Function getNodeStatus) { - Map> lcbMappings = new HashMap<>(); + public static Map> routeLCBsToSinks(Net clk, + Function getNodeStatus) { + Map> lcbMappings = new HashMap<>(); Set allowedIntentCodes = EnumSet.of( IntentCode.NODE_CLE_CNODE, IntentCode.NODE_INTF_CNODE, @@ -561,39 +533,49 @@ public static Map> routeLCBsToSinks(Net clk, IntentCode.NODE_GLOBAL_LEAF ); Set visited = new HashSet<>(); - Queue q = new LinkedList<>(); + Queue q = new ArrayDeque<>(); Predicate isNodeUnavailable = (node) -> getNodeStatus.apply(node) == NodeStatus.UNAVAILABLE; RouteThruHelper routeThruHelper = new RouteThruHelper(clk.getDesign().getDevice()); nextPin: for (SitePinInst p: clk.getPins()) { - if (p.isOutPin()) continue; - Node sinkNode = p.getConnectedNode(); - RouteNode sinkRouteNode = new RouteNode(sinkNode.getTile(), sinkNode.getWireIndex(), null, 0); + if (p.isOutPin()) { + continue; + } + NodeWithPrev sink = new NodeWithPrev(p.getConnectedNode()); ClockRegion cr = p.getTile().getClockRegion(); q.clear(); - q.add(sinkRouteNode); + q.add(sink); while (!q.isEmpty()) { - RouteNode curr = q.poll(); - Node currNode = Node.getNode(curr); - - for (Node uphill : currNode.getAllUphillNodes()) { - if (!uphill.getTile().getClockRegion().equals(cr)) continue; - if (!allowedIntentCodes.contains(uphill.getIntentCode())) continue; - if (!visited.add(uphill)) continue; - if (routeThruHelper.isRouteThru(uphill, currNode) && currNode.getIntentCode() != IntentCode.NODE_IRI) continue; - if (isNodeUnavailable.test(uphill)) continue; - if (uphill.getIntentCode() == IntentCode.NODE_GLOBAL_LEAF) { - RouteNode rn = new RouteNode(uphill.getTile(), uphill.getWireIndex(), curr, curr.getLevel()+1); - clk.getPIPs().addAll(rn.getPIPsForwardToSinkByNodes()); - rn.setParent(null); - rn.setLevel(0); - lcbMappings.computeIfAbsent(rn, (k) -> new ArrayList<>()).add(p); + NodeWithPrev curr = q.poll(); + for (Node uphill : curr.getAllUphillNodes()) { + if (!uphill.getTile().getClockRegion().equals(cr)) { + continue; + } + IntentCode uphillIntentCode = uphill.getIntentCode(); + if (!allowedIntentCodes.contains(uphillIntentCode)) { + continue; + } + if (!visited.add(uphill)) { + continue; + } + if (routeThruHelper.isRouteThru(uphill, curr) && curr.getIntentCode() != IntentCode.NODE_IRI) { + continue; + } + if (isNodeUnavailable.test(uphill)) { + continue; + } + NodeWithPrev node = new NodeWithPrev(uphill, curr); + if (uphillIntentCode == IntentCode.NODE_GLOBAL_LEAF) { + List path = node.getPrevPath(); + boolean srcToSinkOrder = true; + clk.getPIPs().addAll(RouterHelper.getPIPsFromNodes(path, srcToSinkOrder)); + lcbMappings.computeIfAbsent(uphill, (k) -> new ArrayList<>()).add(p); visited.clear(); continue nextPin; } - q.add(new RouteNode(uphill.getTile(), uphill.getWireIndex(), curr, curr.getLevel()+1)); + q.add(node); } } throw new RuntimeException("ERROR: Couldn't map Pin " + p + " to LCB."); diff --git a/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java b/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java index 0d165198d..e376a9510 100644 --- a/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java +++ b/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java @@ -235,7 +235,6 @@ public static void symmetricClkRouting(Net clk, Device device, Function clockRegions = getClockRegionsOfNet(clk); - Map upDownDistLines; SitePinInst source = clk.getSource(); SiteTypeEnum sourceTypeEnum = source.getSiteTypeEnum(); // In US/US+ clock routing, we use two VROUTE nodes to reach the clock regions above and below the centroid. @@ -279,9 +278,9 @@ public static void symmetricClkRouting(Net clk, Device device, Function upDownDistLines = VersalClockRouting.routeToHorizontalDistributionLines(clk, vroute, clockRegions, false, getNodeStatus); - Map> lcbMappings = VersalClockRouting.routeLCBsToSinks(clk, getNodeStatus); + Map> lcbMappings = VersalClockRouting.routeLCBsToSinks(clk, getNodeStatus); VersalClockRouting.routeDistributionToLCBs(clk, upDownDistLines, lcbMappings.keySet()); } From 87e87d95ab31dcf87567811f85d2c404167f7897 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Fri, 22 Nov 2024 14:05:26 -0800 Subject: [PATCH 24/41] More tidying up Signed-off-by: Eddie Hung --- .../router/VersalClockRouting.java | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/src/com/xilinx/rapidwright/router/VersalClockRouting.java b/src/com/xilinx/rapidwright/router/VersalClockRouting.java index 77c7d0d18..9d8c8706f 100644 --- a/src/com/xilinx/rapidwright/router/VersalClockRouting.java +++ b/src/com/xilinx/rapidwright/router/VersalClockRouting.java @@ -265,17 +265,17 @@ public static Map routeVerticalToHorizontalDistributionLines( curr.getIntentCode() == IntentCode.NODE_GLOBAL_GCLK && parent.getIntentCode() == IntentCode.NODE_GLOBAL_HDISTR_LOCAL) { List path = curr.getPrevPath(); - int i; - for (i = 1; i < path.size(); i++) { + for (int i = 1; i < path.size(); i++) { Node node = path.get(i); NodeStatus status = getNodeStatus.apply(node); if (status == NodeStatus.INUSE) { break; } assert(status == NodeStatus.AVAILABLE); + if (i > 1) { + allPIPs.add(PIP.getArbitraryPIP(node, path.get(i-1))); + } } - allPIPs.addAll(RouterHelper.getPIPsFromNodes(path.subList(1, i))); - parent.setPrev(null); distLines.put(targetCR, parent); continue nextClockRegion; } @@ -304,21 +304,22 @@ public static Map routeVerticalToHorizontalDistributionLines( * @param lcbTargets The target LCB nodes to route the clock */ public static void routeDistributionToLCBs(Net clk, Map distLines, Set lcbTargets) { - Map> startingPoints = getStartingPoints(distLines); + Map> startingPoints = getStartingPoints(distLines); routeToLCBs(clk, startingPoints, lcbTargets); } - public static Map> getStartingPoints(Map distLines) { - Map> startingPoints = new HashMap<>(); + public static Map> getStartingPoints(Map distLines) { + Map> startingPoints = new HashMap<>(); for (Entry e : distLines.entrySet()) { ClockRegion cr = e.getKey(); Node distLine = e.getValue(); - startingPoints.computeIfAbsent(cr, k -> new HashSet<>()).add(distLine); + startingPoints.computeIfAbsent(cr, k -> new HashSet<>()) + .add(new NodeWithPrevAndCost(distLine)); } return startingPoints; } - public static void routeToLCBs(Net clk, Map> startingPoints, Set lcbTargets) { + public static void routeToLCBs(Net clk, Map> startingPoints, Set lcbTargets) { Queue q = new PriorityQueue<>(); Set allPIPs = new HashSet<>(); Set visited = new HashSet<>(); @@ -328,19 +329,23 @@ public static void routeToLCBs(Net clk, Map> startingPoin visited.clear(); Tile lcbTile = lcb.getTile(); ClockRegion currCR = lcbTile.getClockRegion(); - for (Node node : startingPoints.getOrDefault(currCR, Collections.emptySet())) { - q.add(new NodeWithPrevAndCost(node)); + Set starts = startingPoints.getOrDefault(currCR, Collections.emptySet()); + for (NodeWithPrev n : starts) { + assert(n.getPrev() == null); } + q.addAll(starts); while (!q.isEmpty()) { NodeWithPrevAndCost curr = q.poll(); visited.add(curr); if (lcb.equals(curr)) { - Set set = startingPoints.get(currCR); List path = curr.getPrevPath(); - for (Node node : path) { - set.add(node); - } allPIPs.addAll(RouterHelper.getPIPsFromNodes(path)); + + Set s = startingPoints.get(currCR); + for (Node n : path) { + s.add(new NodeWithPrevAndCost(n)); + } + continue nextLCB; } for (Node downhill : curr.getAllDownhillNodes()) { @@ -355,6 +360,9 @@ public static void routeToLCBs(Net clk, Map> startingPoin if (downhill.getWireName().endsWith("_I_CASC_PIN") || downhill.getWireName().endsWith("_CLR_B_PIN")) { continue; } + // if (!visited.add(downhill)) { + // continue; + // } if (visited.contains(downhill)) { continue; } @@ -409,14 +417,15 @@ public static void routeLCBsToSinks(Net clk, Map> lcbMap if (target.equals(curr)) { boolean inuse = false; List path = curr.getPrevPath(); - int i; - for (i = 1; i < path.size(); i++) { + for (int i = 1; i < path.size(); i++) { Node node = path.get(i); if (inuse) { assert(getNodeStatus.apply(node) == NodeStatus.INUSE); continue; } - currPIPs.add(PIP.getArbitraryPIP(node, path.get(i-1))); + if (i > 1) { + currPIPs.add(PIP.getArbitraryPIP(node, path.get(i - 1))); + } NodeStatus status = getNodeStatus.apply(node); if (status == NodeStatus.INUSE) { inuse = true; @@ -424,7 +433,6 @@ public static void routeLCBsToSinks(Net clk, Map> lcbMap } assert(status == NodeStatus.AVAILABLE); } - currPIPs.addAll(RouterHelper.getPIPsFromNodes(path.subList(1, i))); sink.setRouted(true); visited.clear(); continue nextPin; From a8491ef35ba257d5fc7da01a066d074d00eb19d1 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 11:35:29 -0800 Subject: [PATCH 25/41] [IntentCode] Add isVersalCnode() helper method Signed-off-by: Eddie Hung Conflicts: src/com/xilinx/rapidwright/device/IntentCode.java --- src/com/xilinx/rapidwright/device/IntentCode.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/com/xilinx/rapidwright/device/IntentCode.java b/src/com/xilinx/rapidwright/device/IntentCode.java index 2b084c9c5..e68f6306d 100644 --- a/src/com/xilinx/rapidwright/device/IntentCode.java +++ b/src/com/xilinx/rapidwright/device/IntentCode.java @@ -158,6 +158,16 @@ public boolean isUltraScaleClockDistribution() { return NODE_GLOBAL_HDISTR == this || NODE_GLOBAL_VDISTR == this; } + public boolean isVersalClocking() { + return NODE_GLOBAL_HDISTR == this || NODE_GLOBAL_HDISTR_LOCAL == this || NODE_GLOBAL_HROUTE_HSR == this || + NODE_GLOBAL_VDISTR == this || NODE_GLOBAL_VDISTR_LVL2 == this || NODE_GLOBAL_VROUTE == this || + NODE_GLOBAL_GCLK == this || NODE_GLOBAL_LEAF == this || NODE_GLOBAL_BUFG == this; + } + + public boolean isVersalCnode() { + return NODE_CLE_CNODE == this || NODE_INTF_CNODE == this; + } + private static final int SERIES7_START_IDX = 23; private static final int SERIES7_END_IDX = SERIES7_START_IDX + 33 - 1; From a44f707d40a02d63851c0bbf88da933594dba390 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 11:36:53 -0800 Subject: [PATCH 26/41] [GlobalSignalRouting] Allow INTF CNODEs, all CNODEs even if reserved Signed-off-by: Eddie Hung --- .../rwroute/GlobalSignalRouting.java | 23 +++++++++++-------- .../xilinx/rapidwright/rwroute/RWRoute.java | 9 +++++--- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java b/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java index 49e8823c4..b00834840 100644 --- a/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java +++ b/src/com/xilinx/rapidwright/rwroute/GlobalSignalRouting.java @@ -444,15 +444,6 @@ public static void routeStaticNet(List pins, } IntentCode uphillIntentCode = uphillNode.getIntentCode(); - if (uphillIntentCode == IntentCode.NODE_CLE_CNODE && intentCode != IntentCode.NODE_CLE_CTRL) { - assert(isVersal); - // Only allow PIPs from NODE_CLE_CNODE to NODE_CLE_CTRL intent codes - // (NODE_CLE_NODEs can also be used to re-enter the INT tile --- do not allow this - // so that these precious resources are not consumed by the static router thereby - // blocking the signal router from using them) - continue; - } - switch(uphillIntentCode) { case NODE_GLOBAL_VDISTR: case NODE_GLOBAL_HROUTE: @@ -469,6 +460,20 @@ public static void routeStaticNet(List pins, case NODE_VLONG7: case NODE_VLONG12: continue; + case NODE_CLE_CNODE: + // Only allow PIPs from NODE_{CLE,INTF}_CNODE to NODE_{CLE,INTF}_CTRL intent codes + // (NODE_CLE_NODEs can also be used to re-enter the INT tile --- do not allow this + // so that these precious resources are not consumed by the static router thereby + // blocking the signal router from using them) + if (intentCode != IntentCode.NODE_CLE_CTRL) { + continue; + } + break; + case NODE_INTF_CNODE: + if (intentCode != IntentCode.NODE_INTF_CTRL) { + continue; + } + break; // VCC net should never need to use S/D/Q nodes ... case NODE_SINGLE: diff --git a/src/com/xilinx/rapidwright/rwroute/RWRoute.java b/src/com/xilinx/rapidwright/rwroute/RWRoute.java index c533c14af..09e26b087 100644 --- a/src/com/xilinx/rapidwright/rwroute/RWRoute.java +++ b/src/com/xilinx/rapidwright/rwroute/RWRoute.java @@ -458,9 +458,12 @@ protected NodeStatus getGlobalRoutingNodeStatus(Net net, Node node) { RouteNode rnode = routingGraph.getNode(node); if (rnode != null) { - // A RouteNode will only be created if the net is necessary for - // a to-be-routed connection - return NodeStatus.UNAVAILABLE; + if (rnode.getType() != RouteNodeType.LOCAL_RESERVED) { + // Typically a RouteNode will only be created if the net is necessary for + // a to-be-routed connection + return NodeStatus.UNAVAILABLE; + } + assert(routingGraph.isVersal && rnode.getIntentCode().isVersalCnode()); } return NodeStatus.AVAILABLE; } From 255e52ab728d04fd92b6c8eb720e450bdbab8115 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 12:19:48 -0800 Subject: [PATCH 27/41] Revert "[IntentCode] Add isVersalCnode() helper method" This reverts commit 435152a03c734d10fa41b606b0575c797cc3a922. Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/device/IntentCode.java | 4 ---- src/com/xilinx/rapidwright/rwroute/RWRoute.java | 9 +++------ 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/com/xilinx/rapidwright/device/IntentCode.java b/src/com/xilinx/rapidwright/device/IntentCode.java index e68f6306d..4e92c8726 100644 --- a/src/com/xilinx/rapidwright/device/IntentCode.java +++ b/src/com/xilinx/rapidwright/device/IntentCode.java @@ -164,10 +164,6 @@ public boolean isVersalClocking() { NODE_GLOBAL_GCLK == this || NODE_GLOBAL_LEAF == this || NODE_GLOBAL_BUFG == this; } - public boolean isVersalCnode() { - return NODE_CLE_CNODE == this || NODE_INTF_CNODE == this; - } - private static final int SERIES7_START_IDX = 23; private static final int SERIES7_END_IDX = SERIES7_START_IDX + 33 - 1; diff --git a/src/com/xilinx/rapidwright/rwroute/RWRoute.java b/src/com/xilinx/rapidwright/rwroute/RWRoute.java index 09e26b087..c533c14af 100644 --- a/src/com/xilinx/rapidwright/rwroute/RWRoute.java +++ b/src/com/xilinx/rapidwright/rwroute/RWRoute.java @@ -458,12 +458,9 @@ protected NodeStatus getGlobalRoutingNodeStatus(Net net, Node node) { RouteNode rnode = routingGraph.getNode(node); if (rnode != null) { - if (rnode.getType() != RouteNodeType.LOCAL_RESERVED) { - // Typically a RouteNode will only be created if the net is necessary for - // a to-be-routed connection - return NodeStatus.UNAVAILABLE; - } - assert(routingGraph.isVersal && rnode.getIntentCode().isVersalCnode()); + // A RouteNode will only be created if the net is necessary for + // a to-be-routed connection + return NodeStatus.UNAVAILABLE; } return NodeStatus.AVAILABLE; } From adcb6a99ce9ae0f921a325a5a8ef11b88a0c2d5d Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 12:22:25 -0800 Subject: [PATCH 28/41] Move Versal {B,C}NODE heuristic from determineRoutingTargets() to initializeRouting(), which is after route{GlobalClock,Static}Nets() Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/rwroute/RWRoute.java | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/com/xilinx/rapidwright/rwroute/RWRoute.java b/src/com/xilinx/rapidwright/rwroute/RWRoute.java index c533c14af..acba903d4 100644 --- a/src/com/xilinx/rapidwright/rwroute/RWRoute.java +++ b/src/com/xilinx/rapidwright/rwroute/RWRoute.java @@ -326,32 +326,6 @@ protected void determineRoutingTargets() { // Wait for all outstanding RouteNodeGraph.preserveAsync() calls to complete routingGraph.awaitPreserve(); - - // On Versal only, reserve all uphills of NODE_(CLE|INTF)_CTRL sinks since - // their [BC]NODEs can also be used to reach NODE_INODEs --- not applying this - // heuristic can lead to avoidable congestion - if (routingGraph.isVersal) { - for (Connection connection : indirectConnections) { - RouteNode sinkRnode = connection.getSinkRnode(); - if (sinkRnode.getType() == RouteNodeType.EXCLUSIVE_SINK_BOTH) { - for (Node uphill : sinkRnode.getAllUphillNodes()) { - if (uphill.isTiedToVcc()) { - continue; - } - Net preservedNet = routingGraph.getPreservedNet(uphill); - if (preservedNet != null && preservedNet != connection.getNet()) { - continue; - } - assert((sinkRnode.getIntentCode() == IntentCode.NODE_CLE_CTRL && - (uphill.getIntentCode() == IntentCode.NODE_CLE_CNODE || uphill.getIntentCode() == IntentCode.NODE_CLE_BNODE)) || - (sinkRnode.getIntentCode() == IntentCode.NODE_INTF_CTRL && - (uphill.getIntentCode() == IntentCode.NODE_INTF_CNODE || uphill.getIntentCode() == IntentCode.NODE_INTF_BNODE))); - RouteNode rnode = routingGraph.getOrCreate(uphill, RouteNodeType.LOCAL_RESERVED); - rnode.setType(RouteNodeType.LOCAL_RESERVED); - } - } - } - } } private void categorizeNets() { @@ -804,6 +778,32 @@ private void initializeRouting() { oneMinusTimingWeight = 1 - timingWeight; oneMinusWlWeight = 1 - wlWeight; printIterationHeader(config.isTimingDriven()); + + // On Versal only, reserve all uphills of NODE_(CLE|INTF)_CTRL sinks since + // their [BC]NODEs can also be used to reach NODE_INODEs --- not applying this + // heuristic can lead to avoidable congestion + if (routingGraph.isVersal) { + for (Connection connection : indirectConnections) { + RouteNode sinkRnode = connection.getSinkRnode(); + if (sinkRnode.getType() == RouteNodeType.EXCLUSIVE_SINK_BOTH) { + for (Node uphill : sinkRnode.getAllUphillNodes()) { + if (uphill.isTiedToVcc()) { + continue; + } + Net preservedNet = routingGraph.getPreservedNet(uphill); + if (preservedNet != null && preservedNet != connection.getNet()) { + continue; + } + assert((sinkRnode.getIntentCode() == IntentCode.NODE_CLE_CTRL && + (uphill.getIntentCode() == IntentCode.NODE_CLE_CNODE || uphill.getIntentCode() == IntentCode.NODE_CLE_BNODE)) || + (sinkRnode.getIntentCode() == IntentCode.NODE_INTF_CTRL && + (uphill.getIntentCode() == IntentCode.NODE_INTF_CNODE || uphill.getIntentCode() == IntentCode.NODE_INTF_BNODE))); + RouteNode rnode = routingGraph.getOrCreate(uphill, RouteNodeType.LOCAL_RESERVED); + rnode.setType(RouteNodeType.LOCAL_RESERVED); + } + } + } + } } /** From 1862adb9538b4d0e8da4e9deb0548a5e7fc30c65 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 12:26:06 -0800 Subject: [PATCH 29/41] [RouterHelper] invertPossibleGndPinsToVccPins() exception for DSP58 Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/rwroute/RouterHelper.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java index 1f61cf225..99e4eec5c 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java +++ b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java @@ -53,6 +53,7 @@ import com.xilinx.rapidwright.device.Node; import com.xilinx.rapidwright.device.PIP; import com.xilinx.rapidwright.device.Series; +import com.xilinx.rapidwright.device.SiteTypeEnum; import com.xilinx.rapidwright.device.Tile; import com.xilinx.rapidwright.device.TileTypeEnum; import com.xilinx.rapidwright.edif.EDIFHierCellInst; @@ -410,7 +411,11 @@ public static Set invertPossibleGndPinsToVccPins(Design design, } else { BELPin[] belPins = si.getSiteWirePins(siteWireName); if (belPins.length != 2) { - continue; + if (belPins.length == 3 && si.getSiteTypeEnum() == SiteTypeEnum.DSP58 && siteWireName.equals("RSTD")) { + assert(belPins[1].toString().equals("SRCMXINV.RSTAD_UNUSED")); + } else { + continue; + } } for (BELPin belPin : belPins) { if (belPin.isSitePort()) { From 34830b19ac4f8fd85d4d6b7a5c618f57fbfda67c Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 12:47:05 -0800 Subject: [PATCH 30/41] [DesignTools] getAllRoutedSitePinsFromPhysicalPin() handle SLICE_FF_CLK_MOD Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/design/DesignTools.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/com/xilinx/rapidwright/design/DesignTools.java b/src/com/xilinx/rapidwright/design/DesignTools.java index 54d747d44..88fdbe2da 100644 --- a/src/com/xilinx/rapidwright/design/DesignTools.java +++ b/src/com/xilinx/rapidwright/design/DesignTools.java @@ -2296,11 +2296,19 @@ public static List getAllRoutedSitePinsFromPhysicalPin(Cell cell, Net ne } else if (bel.isLUT() || bel.getBELType().endsWith("MUX") || // F[789]MUX // Versal + bel.isSliceFFClkMod() || bel.getName().endsWith("_IMR")) { Cell possibleRouteThru = inst.getCell(bel); - if (possibleRouteThru != null && possibleRouteThru.isRoutethru()) { - String routeThru = possibleRouteThru.getPinMappingsP2L().keySet().iterator().next(); - queue.add(bel.getPin(routeThru)); + if (possibleRouteThru == null) { + BELPin clkBelPin = bel.isSliceFFClkMod() ? bel.getPin("CLK") : null; + if (clkBelPin != null && inst.getNetFromSiteWire(clkBelPin.getSiteWireName()) == net) { + queue.add(clkBelPin); + } + } else { + if (possibleRouteThru.isRoutethru()) { + String routeThru = possibleRouteThru.getPinMappingsP2L().keySet().iterator().next(); + queue.add(bel.getPin(routeThru)); + } } } } From 67022d01ed9678a821aee724b0cc14897dcb9cd1 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 13:48:58 -0800 Subject: [PATCH 31/41] [DesignTools] getAllRoutedSitePinsFromPhysicalPin() to handle DSP_CAS_DELAY Signed-off-by: Eddie Hung --- .../rapidwright/design/DesignTools.java | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/com/xilinx/rapidwright/design/DesignTools.java b/src/com/xilinx/rapidwright/design/DesignTools.java index 88fdbe2da..34528051b 100644 --- a/src/com/xilinx/rapidwright/design/DesignTools.java +++ b/src/com/xilinx/rapidwright/design/DesignTools.java @@ -2317,20 +2317,40 @@ public static List getAllRoutedSitePinsFromPhysicalPin(Cell cell, Net ne if (!siteWires.contains(sink.getSiteWireName())) continue; if (sink.isSitePort()) { sitePins.add(sink.getName()); - } else if (sink.getBEL().getBELClass() == BELClass.RBEL) { + continue; + } + BEL bel = sink.getBEL(); + if (bel.getBELClass() == BELClass.RBEL) { // Check if the SitePIP is being used - SitePIP sitePIP = inst.getUsedSitePIP(sink.getBELName()); - if (sitePIP == null) continue; - // Don't proceed if it's configured for a different pin - if (!sitePIP.getInputPinName().equals(sink.getName())) continue; + SitePIP sitePIP = inst.getUsedSitePIP(sink); + if (sitePIP == null) { + continue; + } + assert(sitePIP.getInputPinName().equals(sink.getName())); // Make this the new source to search from and keep looking... queue.add(sitePIP.getOutputPin()); - } else if (sink.getBEL().isFF()) { + } else if (bel.isFF()) { // FF pass thru option (not a site PIP) - siteWireName = sink.getBEL().getPin("Q").getSiteWireName(); + siteWireName = bel.getPin("Q").getSiteWireName(); if (siteWires.contains(siteWireName)) { sitePins.add(siteWireName); } + } else if (bel.getBELType().equals("DSP_CAS_DELAY")) { + // Versal only + SitePIP sitePIP = inst.getUsedSitePIP(sink); + if (sitePIP == null) { + continue; + } + assert(sitePIP.getInputPinName().equals(sink.getName())); + // For an unknown reason, it appears that the sitewire is not painted correctly ... + // Make this the new source to search from and keep looking... + // queue.add(sitePIP.getOutputPin()); + // ... so assume it is and workaround + BELPin source = sitePIP.getOutputPin(); + assert(source.getSiteConns().size() == 1); + BELPin port = source.getSiteConns().get(0); + assert(port.isSitePort()); + sitePins.add(port.getName()); } } } @@ -3378,14 +3398,16 @@ public static void createCeSrRstPinsToVCC(Design design) { Net net = si.getNetFromSiteWire(sitePinName); if (net != null) { if (belPinName == CE) { + if (!net.isVCCNet()) { + continue; + } // CE: it is possible for sitewire to be assigned to a non VCC net, but a SitePinInst to not yet exist - assert(!net.isVCCNet()); - continue; } else { - // SR: it is possible for sitewire to be assigned the GND net, yet still be routed to VCC + assert(belPinName == SR); if (!net.isStaticNet()) { continue; } + // SR: it is possible for sitewire to be assigned the GND net, yet still be routed to VCC } } From d3cca76c9134275db7075ebc8c6d779e684fadc2 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 15:49:20 -0800 Subject: [PATCH 32/41] [CUFR] CUFR and PartialCUFR to default to --hus Emit warning if not enabled Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/rwroute/CUFR.java | 28 +++++++++- .../rapidwright/rwroute/PartialCUFR.java | 51 +++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/com/xilinx/rapidwright/rwroute/CUFR.java b/src/com/xilinx/rapidwright/rwroute/CUFR.java index 208776f7b..6bc362292 100644 --- a/src/com/xilinx/rapidwright/rwroute/CUFR.java +++ b/src/com/xilinx/rapidwright/rwroute/CUFR.java @@ -163,7 +163,28 @@ protected void routeIndirectConnections(Collection connections) { } /** - * Routes a {@link Design} instance. + * Routes a design in the full timing-driven routing mode using CUFR. + * @param design The {@link Design} instance to be routed. + */ + public static Design routeDesignFullTimingDriven(Design design) { + return routeDesignWithUserDefinedArguments(design, new String[] { + "--hus" + }); + } + + /** + * Routes a design in the full non-timing-driven routing mode using CUFR. + * @param design The {@link Design} instance to be routed. + */ + public static Design routeDesignFullNonTimingDriven(Design design) { + return routeDesignWithUserDefinedArguments(design, new String[] { + "--hus", + "--nonTimingDriven" + }); + } + + /** + * Routes a {@link Design} instance using CUFR. * @param design The {@link Design} instance to be routed. * @param args An array of string arguments, can be null. * If null, the design will be routed in the full timing-driven routing mode with default a {@link RWRouteConfig} instance. @@ -174,6 +195,11 @@ public static Design routeDesignWithUserDefinedArguments(Design design, String[] // Instantiates a RWRouteConfig Object and parses the arguments. // Uses the default configuration if basic usage only. RWRouteConfig config = new RWRouteConfig(args); + + if (!config.isHus()) { + System.err.println("WARNING: Hybrid Updating Strategy (HUS) is not enabled."); + } + return routeDesign(design, new CUFR(design, config)); } diff --git a/src/com/xilinx/rapidwright/rwroute/PartialCUFR.java b/src/com/xilinx/rapidwright/rwroute/PartialCUFR.java index 0d70a3965..2f435d0f9 100644 --- a/src/com/xilinx/rapidwright/rwroute/PartialCUFR.java +++ b/src/com/xilinx/rapidwright/rwroute/PartialCUFR.java @@ -151,6 +151,53 @@ protected void printRoutingStatistics() { super.printRoutingStatistics(); } + /** + * Routes a design in the partial non-timing-driven routing mode. + * @param design The {@link Design} instance to be routed. + * @param pinsToRoute Collection of {@link SitePinInst}-s to be routed. If null, route all unrouted pins in the design. + */ + public static Design routeDesignPartialNonTimingDriven(Design design, Collection pinsToRoute) { + boolean softPreserve = false; + return routeDesignPartialNonTimingDriven(design, pinsToRoute, softPreserve); + } + + /** + * Routes a design in the partial non-timing-driven routing mode using CUFR. + * @param design The {@link Design} instance to be routed. + * @param pinsToRoute Collection of {@link SitePinInst}-s to be routed. If null, route all unrouted pins in the design. + * @param softPreserve Allow routed nets to be unrouted and subsequently rerouted in order to improve routability. + */ + public static Design routeDesignPartialNonTimingDriven(Design design, Collection pinsToRoute, boolean softPreserve) { + return routeDesignWithUserDefinedArguments(design, new String[] { + "--hus", + "--fixBoundingBox", + // use U-turn nodes and no masking of nodes cross RCLK + // Pros: maximum routability + // Con: might result in delay optimism and a slight increase in runtime + "--useUTurnNodes", + "--nonTimingDriven", + "--verbose"}, + pinsToRoute, softPreserve); + } + + /** + * Routes a design in the partial timing-driven routing mode using CUFR. + * @param design The {@link Design} instance to be routed. + * @param pinsToRoute Collection of {@link SitePinInst}-s to be routed. If null, route all unrouted pins in the design. + * @param softPreserve Allow routed nets to be unrouted and subsequently rerouted in order to improve routability. + */ + public static Design routeDesignPartialTimingDriven(Design design, Collection pinsToRoute, boolean softPreserve) { + return routeDesignWithUserDefinedArguments(design, new String[] { + "--hus", + "--fixBoundingBox", + // use U-turn nodes and no masking of nodes cross RCLK + // Pros: maximum routability + // Con: might result in delay optimism and a slight increase in runtime + "--useUTurnNodes", + "--verbose"}, + pinsToRoute, softPreserve); + } + /** * Partially routes a {@link Design} instance; specifically, all nets with no routing PIPs already present. * @param design The {@link Design} instance to be routed. @@ -194,6 +241,10 @@ public static Design routeDesignWithUserDefinedArguments(Design design, System.out.println("WARNING: Masking nodes across RCLK for partial routing could result in routability problems."); } + if (!config.isHus()) { + System.err.println("WARNING: Hybrid Updating Strategy (HUS) is not enabled."); + } + return routeDesign(design, new PartialCUFR(design, config, pinsToRoute, softPreserve)); } From 6f572ff2798a7ad6da2c98a249e0e35236666578 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 16:01:35 -0800 Subject: [PATCH 33/41] [RouterHelper] invertPossibleGndPinsToVccPins() to invert Versal BRAM.CLK Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/rwroute/RouterHelper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java index 99e4eec5c..9ca2569d1 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java +++ b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java @@ -412,6 +412,7 @@ public static Set invertPossibleGndPinsToVccPins(Design design, BELPin[] belPins = si.getSiteWirePins(siteWireName); if (belPins.length != 2) { if (belPins.length == 3 && si.getSiteTypeEnum() == SiteTypeEnum.DSP58 && siteWireName.equals("RSTD")) { + assert(isVersal); assert(belPins[1].toString().equals("SRCMXINV.RSTAD_UNUSED")); } else { continue; @@ -426,7 +427,8 @@ public static Set invertPossibleGndPinsToVccPins(Design design, } // Emulate Vivado's behaviour and do not invert CLK* site pins if (Utils.isBRAM(spi.getSiteInst()) && - belPin.getBELName().startsWith("CLK")) { + belPin.getBELName().startsWith("CLK") && + !isVersal) { continue; } toInvertPins.add(spi); From 9cf4ffe47fe77ede4b81863a2767244d9ff4f5ad Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 20:06:55 -0800 Subject: [PATCH 34/41] [RouterHelper] invertPossibleGndPinsToVccPins() to use correct sitewire Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/rwroute/RouterHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java index 9ca2569d1..4eea6d50d 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java +++ b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java @@ -351,7 +351,7 @@ public static Set invertPossibleGndPinsToVccPins(Design design, } Collection connectedCells = DesignTools.getConnectedCells(spiBelPin, si); if (connectedCells.isEmpty()) { - for (BELPin belPin : si.getSiteWirePins(siteWireName)) { + for (BELPin belPin : si.getSiteWirePins(spiBelPin.getSiteWireName())) { if (belPin.isSitePort()) { continue; } From 29260a66cfbfe9cafa7ec6a91b5408f059fd0251 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 20:35:48 -0800 Subject: [PATCH 35/41] [DesignTools] createA1A6ToStaticNets() to handle SRL16s on LUT5+6 Signed-off-by: Eddie Hung --- .../rapidwright/design/DesignTools.java | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/com/xilinx/rapidwright/design/DesignTools.java b/src/com/xilinx/rapidwright/design/DesignTools.java index 34528051b..d8bc6b769 100644 --- a/src/com/xilinx/rapidwright/design/DesignTools.java +++ b/src/com/xilinx/rapidwright/design/DesignTools.java @@ -3272,7 +3272,24 @@ public static void createA1A6ToStaticNets(Design design) { } String belName = bel.getName(); - if ("SRL16E".equals(cell.getType()) || "SRLC32E".equals(cell.getType())) { + char fiveOrSix = belName.charAt(1); + if (fiveOrSix == '5') { + // Assume that only 5LUT can use O5 + assert(cell.getLogicalPinMapping("O5") != null); + if (LUTTools.getCompanionLUTCell(cell) != null) { + // 5LUT is used, but 6LUT also exists; let the 6LUT deal with things + continue; + } + } else { + assert(fiveOrSix == '6'); + + if (cell.getLogicalPinMapping("A6") != null) { + // A6 pin is being used by LUT + continue; + } + } + + if (("SRL16E".equals(cell.getType())) || "SRLC32E".equals(cell.getType())) { String pinName = belName.charAt(0) + "1"; SitePinInst spi = si.getSitePinInst(pinName); if (spi != null) { @@ -3282,15 +3299,7 @@ public static void createA1A6ToStaticNets(Design design) { vccNet.createPin(pinName, si); } - if (cell.getLogicalPinMapping("A6") != null) { - // A6 pin is being used by LUT - continue; - } - - char fiveOrSix = belName.charAt(1); - assert(fiveOrSix == '5' || fiveOrSix == '6'); Net staticNet = vccNet; - BEL lut6Bel = (fiveOrSix == '5') ? si.getBEL(belName.charAt(0) + "6LUT") : bel; Net a6Net = si.getNetFromSiteWire(lut6Bel.getPin("A6").getSiteWireName()); @@ -3310,15 +3319,7 @@ public static void createA1A6ToStaticNets(Design design) { if (cell.getLogicalPinMapping("O5") != null) { // LUT output comes out on O5 - if (fiveOrSix == '5') { - // It's a 5LUT - if (si.getCell(belName.charAt(0) + "6LUT") != null) { - // But 6LUT exists; let the 6LUT deal with it - continue; - } - } else { - throw new RuntimeException("Assumption that only 5LUTs can use O5 failed here."); - } + assert(fiveOrSix == '5'); } else { if (fiveOrSix != '6') { // Assume that O6 is only driven by 6LUT, even though possible for 5LUT, unless @@ -3326,7 +3327,6 @@ public static void createA1A6ToStaticNets(Design design) { assert (cell.isRoutethru()); continue; } - assert(fiveOrSix == '6'); } From 14c0e1570b3ff9085f59f807d6e1f600f1501f02 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 20 Nov 2024 23:42:16 -0800 Subject: [PATCH 36/41] Fix DesignTools.createA1A6ToStaticNets() Signed-off-by: Eddie Hung --- .../rapidwright/design/DesignTools.java | 57 ++++++++++++------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/src/com/xilinx/rapidwright/design/DesignTools.java b/src/com/xilinx/rapidwright/design/DesignTools.java index d8bc6b769..1de9b7ec1 100644 --- a/src/com/xilinx/rapidwright/design/DesignTools.java +++ b/src/com/xilinx/rapidwright/design/DesignTools.java @@ -3275,7 +3275,7 @@ public static void createA1A6ToStaticNets(Design design) { char fiveOrSix = belName.charAt(1); if (fiveOrSix == '5') { // Assume that only 5LUT can use O5 - assert(cell.getLogicalPinMapping("O5") != null); + assert(cell.getLogicalPinMapping("O5") != null || cell.isRoutethru()); if (LUTTools.getCompanionLUTCell(cell) != null) { // 5LUT is used, but 6LUT also exists; let the 6LUT deal with things continue; @@ -3283,40 +3283,53 @@ public static void createA1A6ToStaticNets(Design design) { } else { assert(fiveOrSix == '6'); - if (cell.getLogicalPinMapping("A6") != null) { - // A6 pin is being used by LUT - continue; + if ("SRLC32E".equals(cell.getType())) { + // For SRLC32Es, only the A1 needs to be tied to VCC + String pinName = belName.charAt(0) + "1"; + SitePinInst spi = si.getSitePinInst(pinName); + if (spi == null) { + vccNet.createPin(pinName, si); + } else { + assert(spi.getNet().isVCCNet()); + } + // A6 is needed as a logical pin + assert(cell.getLogicalPinMapping("A6") != null); } - } - if (("SRL16E".equals(cell.getType())) || "SRLC32E".equals(cell.getType())) { - String pinName = belName.charAt(0) + "1"; - SitePinInst spi = si.getSitePinInst(pinName); - if (spi != null) { - assert(spi.getNet().isVCCNet()); + if (cell.getLogicalPinMapping("A6") != null) { + // A6 pin is being used by LUT/SRL; no need to tie it to VCC continue; } - vccNet.createPin(pinName, si); } Net staticNet = vccNet; BEL lut6Bel = (fiveOrSix == '5') ? si.getBEL(belName.charAt(0) + "6LUT") : bel; Net a6Net = si.getNetFromSiteWire(lut6Bel.getPin("A6").getSiteWireName()); - // SRL16Es that have been transformed from SRLC32E require GND on their A6 pin - if (cell.getType().equals("SRL16E") && "SRLC32E".equals(cell.getPropertyValueString("XILINX_LEGACY_PRIM"))) { - staticNet = gndNet; - // Expect sitewire to be VCC and GND - if (!a6Net.isStaticNet()) { - throw new RuntimeException("ERROR: Site pin " + si.getSiteName() + "/" + belName.charAt(0) + "6 is not a static net"); + boolean expectGndNet = false; + if ("SRL16E".equals(cell.getType())) { + String pinName = belName.charAt(0) + "1"; + SitePinInst spi = si.getSitePinInst(pinName); + if (spi == null) { + vccNet.createPin(pinName, si); } - } else { - // Tie A6 to staticNet only if sitewire says so - if (a6Net != staticNet) { - continue; + + // SRL16Es that have been transformed from SRLC32E require GND on their A6 pin + if ("SRLC32E".equals(cell.getPropertyValueString("XILINX_LEGACY_PRIM"))) { + expectGndNet = true; + staticNet = gndNet; + // Expect sitewire to be VCC or GND + if (!a6Net.isStaticNet()) { + throw new RuntimeException("ERROR: Site pin " + si.getSiteName() + "/" + belName.charAt(0) + "6 is not a static net"); + } } } + // Tie A6 to staticNet only if sitewire says so + if (a6Net != staticNet && !expectGndNet) { + continue; + } + if (cell.getLogicalPinMapping("O5") != null) { // LUT output comes out on O5 assert(fiveOrSix == '5'); @@ -3324,7 +3337,7 @@ public static void createA1A6ToStaticNets(Design design) { if (fiveOrSix != '6') { // Assume that O6 is only driven by 6LUT, even though possible for 5LUT, unless // it's a routethru - assert (cell.isRoutethru()); + assert(cell.isRoutethru()); continue; } assert(fiveOrSix == '6'); From a4fa8ee0e0d9d0911c8f904b56231e94c528dd72 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Thu, 21 Nov 2024 11:37:18 -0800 Subject: [PATCH 37/41] [RouteNode] Correct assertions in setBaseCost() for Versal Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/rwroute/RouteNode.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/com/xilinx/rapidwright/rwroute/RouteNode.java b/src/com/xilinx/rapidwright/rwroute/RouteNode.java index a5fb5af8c..46e61f721 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouteNode.java +++ b/src/com/xilinx/rapidwright/rwroute/RouteNode.java @@ -165,6 +165,12 @@ private void setBaseCost(Series series) { break; case NODE_VSINGLE: // Versal-only case NODE_HSINGLE: // Versal-only + if (length == 0 && getAllWiresInNode().length == 1) { + assert(getAllDownhillPIPs().isEmpty() || // e.g. INT_X3Y383/OUT_NN1_E_BEG6 and INT_X19Y384/OUT_EE1_E_BEG8 on vp1002 + getWireName().startsWith("INT_SDQ_RED_ATOM_")); + break; + } + // Fall through case NODE_SINGLE: // US and US+ if (length <= 1) { assert(!getAllDownhillPIPs().isEmpty()); @@ -175,6 +181,14 @@ private void setBaseCost(Series series) { break; case NODE_VDOUBLE: // Versal only case NODE_HDOUBLE: // Versal only + if (length == 0 && getAllWiresInNode().length == 1) { + // e.g. INT_X2Y382/OUT_NN2_W_BEG2 and INT_X18Y384/OUT_WW2_W_BEG4 on vp1002 + assert(getAllDownhillPIPs().isEmpty()); + // This node has no downhill PIPs, mark these as inaccessible so that it will never be queued + type = (byte) RouteNodeType.INACCESSIBLE.ordinal(); + break; + } + // Fall through case NODE_DOUBLE: // US and US+ if (length == 0) { assert(!getAllDownhillPIPs().isEmpty()); @@ -194,9 +208,9 @@ private void setBaseCost(Series series) { } } break; - case NODE_HQUAD: + case NODE_HQUAD: // US/US+/Versal if (length == 0) { - // Since this node has zero length (and by extension no downhill PIPs) + // Since this node has zero length (and asserted to have no downhill PIPs) // mark it as being inacccessible so that it will never be queued assert(getAllDownhillPIPs().isEmpty()); type = (byte) RouteNodeType.INACCESSIBLE.ordinal(); @@ -204,9 +218,11 @@ private void setBaseCost(Series series) { baseCost = 0.35f * length; } break; - case NODE_VQUAD: + case NODE_VQUAD: // US/US+/Versal if (length == 0) { - assert(!getAllDownhillPIPs().isEmpty()); + // On Versal, INT_X1Y380/OUT_NN4_W_BEG6 on vp1002 has no downhill PIPs + assert((series == Series.Versal && getAllWiresInNode().length == 1) || + !getAllDownhillPIPs().isEmpty()); } else { // VQUADs have length 4 and 5 baseCost = 0.15f * length; @@ -219,7 +235,7 @@ private void setBaseCost(Series series) { break; case NODE_HLONG: // US/US+ if (length == 0) { - // Since this node has zero length (and by extension no downhill PIPs) + // Since this node has zero length (and asserted to have no downhill PIPs) // mark it as being inacccessible so that it will never be queued assert(getAllDownhillPIPs().isEmpty()); type = (byte) RouteNodeType.INACCESSIBLE.ordinal(); From fed9ed55dca3fcfc9b4bae37641467cc0833f14a Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Thu, 21 Nov 2024 11:37:39 -0800 Subject: [PATCH 38/41] [TestNode] Extend testNodeReachabilityVersal Signed-off-by: Eddie Hung --- test/src/com/xilinx/rapidwright/device/TestNode.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/src/com/xilinx/rapidwright/device/TestNode.java b/test/src/com/xilinx/rapidwright/device/TestNode.java index eacef5bd4..a180fe26b 100644 --- a/test/src/com/xilinx/rapidwright/device/TestNode.java +++ b/test/src/com/xilinx/rapidwright/device/TestNode.java @@ -237,7 +237,8 @@ public void testNodeReachabilityUltraScale(String partName, String tileName, Str "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_HSINGLE,OUT_.*,false", + "xcvp1002,INT_X38Y220,NODE_HSINGLE,INT_SDQ_RED_ATOM_.*,false", "xcvp1002,INT_X38Y220,NODE_VSINGLE,,false", "xcvp1002,INT_X38Y220,NODE_HDOUBLE,,false", "xcvp1002,INT_X38Y220,NODE_VDOUBLE,,false", From c16876187835b419611d8dcb457beb528db4dbc5 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Thu, 21 Nov 2024 13:31:00 -0800 Subject: [PATCH 39/41] Update comment Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/rwroute/RouteNode.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/com/xilinx/rapidwright/rwroute/RouteNode.java b/src/com/xilinx/rapidwright/rwroute/RouteNode.java index 46e61f721..d4391f7a9 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouteNode.java +++ b/src/com/xilinx/rapidwright/rwroute/RouteNode.java @@ -167,7 +167,10 @@ private void setBaseCost(Series series) { case NODE_HSINGLE: // Versal-only if (length == 0 && getAllWiresInNode().length == 1) { assert(getAllDownhillPIPs().isEmpty() || // e.g. INT_X3Y383/OUT_NN1_E_BEG6 and INT_X19Y384/OUT_EE1_E_BEG8 on vp1002 - getWireName().startsWith("INT_SDQ_RED_ATOM_")); + (ic == IntentCode.NODE_HSINGLE && getWireName().startsWith("INT_SDQ_"))); + // HSINGLE nodes that have a wirename INT_SDQ_* do not travel to any other + // tiles but still have downhill PIPs (and thus we cannot mark as being + // inaccessible without checking getAllDownhillPIPs() or getWireName()) break; } // Fall through From 2e208b34918f8f4b19e6e6859a15e1d065d16cdc Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Fri, 22 Nov 2024 15:35:01 -0800 Subject: [PATCH 40/41] Even more tidying Signed-off-by: Eddie Hung --- .../router/VersalClockRouting.java | 105 +----------------- 1 file changed, 3 insertions(+), 102 deletions(-) diff --git a/src/com/xilinx/rapidwright/router/VersalClockRouting.java b/src/com/xilinx/rapidwright/router/VersalClockRouting.java index 9d8c8706f..0046e341d 100644 --- a/src/com/xilinx/rapidwright/router/VersalClockRouting.java +++ b/src/com/xilinx/rapidwright/router/VersalClockRouting.java @@ -360,9 +360,6 @@ public static void routeToLCBs(Net clk, Map> lcbMappings, - Function getNodeStatus) { - Set used = new HashSet<>(); - Set visited = new HashSet<>(); - Queue q = new ArrayDeque<>(); - - Predicate isNodeUnavailable = (node) -> getNodeStatus.apply(node) == NodeStatus.UNAVAILABLE; - Set allowedIntentCodes = EnumSet.of( - IntentCode.NODE_CLE_CNODE, - IntentCode.NODE_INTF_CNODE, - IntentCode.NODE_CLE_CTRL, - IntentCode.NODE_INTF_CTRL, - IntentCode.NODE_IRI, - IntentCode.NODE_INODE, - IntentCode.NODE_PINBOUNCE, - IntentCode.NODE_CLE_BNODE, - IntentCode.NODE_IMUX, - IntentCode.NODE_PINFEED - ); - - RouteThruHelper routeThruHelper = new RouteThruHelper(clk.getDesign().getDevice()); - - for (Entry> e : lcbMappings.entrySet()) { - Set currPIPs = new HashSet<>(); - Node lcb = e.getKey(); - - nextPin: for (SitePinInst sink : e.getValue()) { - Node target = sink.getConnectedNode(); - q.clear(); - q.add(new NodeWithPrev(lcb)); - - while (!q.isEmpty()) { - NodeWithPrev curr = q.poll(); - if (target.equals(curr)) { - boolean inuse = false; - List path = curr.getPrevPath(); - for (int i = 1; i < path.size(); i++) { - Node node = path.get(i); - if (inuse) { - assert(getNodeStatus.apply(node) == NodeStatus.INUSE); - continue; - } - if (i > 1) { - currPIPs.add(PIP.getArbitraryPIP(node, path.get(i - 1))); - } - NodeStatus status = getNodeStatus.apply(node); - if (status == NodeStatus.INUSE) { - inuse = true; - continue; - } - assert(status == NodeStatus.AVAILABLE); - } - sink.setRouted(true); - visited.clear(); - continue nextPin; - } - - for (Node downhill : curr.getAllDownhillNodes()) { - IntentCode downhillIntentCode = downhill.getIntentCode(); - if (!allowedIntentCodes.contains(downhillIntentCode)) { - continue; - } - if (!visited.add(downhill)) { - continue; - } - if (used.contains(downhill)) { - continue; - } - // have to allow those routethru-s NODE_IRI -> * - if (routeThruHelper.isRouteThru(curr, downhill) && downhillIntentCode != IntentCode.NODE_IRI) { - continue; - } - if (isNodeUnavailable.test(downhill)) { - continue; - } - q.add(new NodeWithPrev(downhill, curr)); - } - } - throw new RuntimeException("ERROR: Couldn't route LCB " + e.getKey() + " to Pin " + sink); - } - - List clkPIPs = clk.getPIPs(); - for (PIP p : currPIPs) { - used.add(p.getStartNode()); - used.add(p.getEndNode()); - clkPIPs.add(p); - } - } - } - /** * Routes from a GLOBAL_VERTICAL_ROUTE to horizontal distribution lines. * @param clk The clock net to be routed. @@ -506,7 +407,7 @@ public static void incrementalClockRouter(Design design, Net clkNet, Function getNodeStatus) { // TODO: - throw new RuntimeException("ERROR: incrementalClockRouter not yet support on Versal devices."); + throw new RuntimeException("ERROR: Incremental clock routing not yet supported for Versal devices."); } /** @@ -520,7 +421,7 @@ public static void incrementalClockRouter(Net clkNet, List clkPins, Function getNodeStatus) { // TODO: - throw new RuntimeException("ERROR: incrementalClockRouter not yet support on Versal devices."); + throw new RuntimeException("ERROR: Incremental clock routing not yet supported for Versal devices."); } public static Map> routeLCBsToSinks(Net clk, @@ -586,7 +487,7 @@ public static Map> routeLCBsToSinks(Net clk, q.add(node); } } - throw new RuntimeException("ERROR: Couldn't map Pin " + p + " to LCB."); + throw new RuntimeException("ERROR: Couldn't route pin " + sink + " to any LCB"); } return lcbMappings; From 65ceffb94e533978a0a68cf74a557cdbf881c33c Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Fri, 22 Nov 2024 15:42:48 -0800 Subject: [PATCH 41/41] Last bit of tidying Signed-off-by: Eddie Hung --- .../router/VersalClockRouting.java | 3 +-- .../rwroute/GlobalSignalRouting.java | 21 ++++++++----------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/com/xilinx/rapidwright/router/VersalClockRouting.java b/src/com/xilinx/rapidwright/router/VersalClockRouting.java index 0046e341d..4cfc2add7 100644 --- a/src/com/xilinx/rapidwright/router/VersalClockRouting.java +++ b/src/com/xilinx/rapidwright/router/VersalClockRouting.java @@ -336,7 +336,6 @@ public static void routeToLCBs(Net clk, Map path = curr.getPrevPath(); allPIPs.addAll(RouterHelper.getPIPsFromNodes(path)); @@ -360,7 +359,7 @@ public static void routeToLCBs(Net clk, Map> getListOfNodesFromRoutes(Device device, M * for same net as we're routing), or unavailable (preserved for other net). */ public static void symmetricClkRouting(Net clk, Device device, Function getNodeStatus) { - if (device.getSeries() != Series.Versal) { + if (device.getSeries() == Series.UltraScale || device.getSeries() == Series.UltraScalePlus) { List clockRegions = getClockRegionsOfNet(clk); ClockRegion centroid = findCentroid(clk, device); @@ -227,12 +227,8 @@ public static void symmetricClkRouting(Net clk, Device device, Function clockRegions = getClockRegionsOfNet(clk); SitePinInst source = clk.getSource(); @@ -244,7 +240,6 @@ public static void symmetricClkRouting(Net clk, Device device, Function @@ -256,9 +251,9 @@ public static void symmetricClkRouting(Net clk, Device device, Function NODE_GLOBAL_BUFG -> NODE_GLOBAL_GCLK -> NODE_GLOBAL_HROUTE_HSR -> NODE_GLOBAL_VROUTE + // Assume that these source sites are located in the bottom of the device (Y=0). + // The path from the output pin to VROUTE matches the following pattern: + // NODE_GLOBAL_BUFG -> NODE_GLOBAL_BUFG -> NODE_GLOBAL_GCLK -> NODE_GLOBAL_HROUTE_HSR -> NODE_GLOBAL_VROUTE // which is similar to US/US+ clock routing. // Notice that we have to quickly reach a NODE_GLOBAL_HROUTE_HSR node, and if we allow the Y coordinate of centroid to be bigger than 1, // we may fail to do so. Thus, we need to force the Y-coordinate of centroid to be 1. @@ -268,12 +263,12 @@ public static void symmetricClkRouting(Net clk, Device device, Function> lcbMappings = VersalClockRouting.routeLCBsToSinks(clk, getNodeStatus); VersalClockRouting.routeDistributionToLCBs(clk, upDownDistLines, lcbMappings.keySet()); + } else { + throw new RuntimeException("ERROR: GlobalSignalRouting.symmetricClkRouting() does not support the " + device.getSeries() + " series."); } Set clkPIPsWithoutDuplication = new HashSet<>(clk.getPIPs());