From 2ecd8637c6311ff42d36d1ae9637accd4a87bf62 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 29 May 2024 12:02:52 -0700 Subject: [PATCH 01/18] Add US+ testing Signed-off-by: Eddie Hung --- .../interchange/TestCellBELMappings.java | 15 +++++----- .../interchange/TestDeviceResources.java | 29 +++++++++---------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java b/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java index 3cec807be..38c376cc4 100644 --- a/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java +++ b/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java @@ -23,22 +23,23 @@ package com.xilinx.rapidwright.interchange; -import org.capnproto.MessageBuilder; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - import com.xilinx.rapidwright.device.Device; import com.xilinx.rapidwright.interchange.DeviceResources.Device.CellBelMapping; import com.xilinx.rapidwright.interchange.DeviceResources.Device.CellBelPinEntry; import com.xilinx.rapidwright.interchange.DeviceResources.Device.ParameterCellBelPinMaps; +import org.capnproto.MessageBuilder; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; public class TestCellBELMappings { - @Test - public void testCellBELPinMappings() { + @ParameterizedTest + @ValueSource(strings = {"xcau10p", "xc7a15t"}) + public void testCellBELPinMappings(String deviceName) { StringEnumerator allStrings = new StringEnumerator(); MessageBuilder message = new MessageBuilder(); - Device device = Device.getDevice(TestDeviceResources.TEST_DEVICE); + Device device = Device.getDevice(deviceName); DeviceResources.Device.Builder devBuilder = message.initRoot(DeviceResources.Device.factory); EnumerateCellBelMapping.populateAllPinMappings(device.getName(), device, devBuilder, allStrings); diff --git a/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java b/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java index 805ab3795..b0c44d1f4 100644 --- a/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java +++ b/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java @@ -23,28 +23,25 @@ package com.xilinx.rapidwright.interchange; -import java.io.IOException; -import java.nio.file.Path; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; - import com.xilinx.rapidwright.device.Device; import com.xilinx.rapidwright.tests.CodePerfTracker; +import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; -public class TestDeviceResources { +import java.io.IOException; +import java.nio.file.Path; - public static final String TEST_DEVICE = "xc7a15t"; +public class TestDeviceResources { - @Test - public void testDeviceResources(@TempDir Path tempDir) throws IOException { - Path capnProtoFile = tempDir.resolve(TEST_DEVICE + ".device"); - Device device = Device.getDevice(TEST_DEVICE); + @ParameterizedTest + @ValueSource(strings = {"xcau10p", "xc7a15t"}) + public void testDeviceResources(String deviceName, @TempDir Path tempDir) throws IOException { + Path capnProtoFile = tempDir.resolve(deviceName + ".device"); + Device device = Device.getDevice(deviceName); DeviceResourcesWriter.writeDeviceResourcesFile( - TEST_DEVICE, device, CodePerfTracker.SILENT, capnProtoFile.toString()); + deviceName, device, CodePerfTracker.SILENT, capnProtoFile.toString()); Device.releaseDeviceReferences(); - DeviceResourcesVerifier.verifyDeviceResources(capnProtoFile.toString(), TEST_DEVICE); + DeviceResourcesVerifier.verifyDeviceResources(capnProtoFile.toString(), deviceName); } - - } From 6c8ebccd40b5a1ea6fc45c4beb2fb7290082d570 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 29 May 2024 15:05:54 -0700 Subject: [PATCH 02/18] [DeviceResourcesWriter] Populate PIP timings (slow corner, typical) Signed-off-by: Eddie Hung --- .../interchange/DeviceResourcesWriter.java | 86 +++++++++++++------ 1 file changed, 60 insertions(+), 26 deletions(-) diff --git a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java index 209469c63..6142711b2 100644 --- a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java +++ b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2020-2022, Xilinx, Inc. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. + * Copyright (c) 2022-2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Chris Lavin, Xilinx Research Labs. @@ -23,30 +23,6 @@ package com.xilinx.rapidwright.interchange; -import java.io.IOException; -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.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Queue; -import java.util.Set; -import java.util.TreeSet; - -import org.capnproto.MessageBuilder; -import org.capnproto.PrimitiveList; -import org.capnproto.PrimitiveList.Int; -import org.capnproto.StructList; -import org.capnproto.Text; -import org.capnproto.TextList; -import org.capnproto.Void; - import com.xilinx.rapidwright.design.Design; import com.xilinx.rapidwright.design.DesignTools; import com.xilinx.rapidwright.design.SiteInst; @@ -99,8 +75,34 @@ import com.xilinx.rapidwright.interchange.LogicalNetlist.Netlist; import com.xilinx.rapidwright.interchange.LogicalNetlist.Netlist.Direction; import com.xilinx.rapidwright.interchange.LogicalNetlist.Netlist.PropertyMap; +import com.xilinx.rapidwright.rwroute.RouterHelper; import com.xilinx.rapidwright.tests.CodePerfTracker; +import com.xilinx.rapidwright.timing.delayestimator.DelayEstimatorBase; +import com.xilinx.rapidwright.timing.delayestimator.InterconnectInfo; import com.xilinx.rapidwright.util.Pair; +import org.capnproto.MessageBuilder; +import org.capnproto.PrimitiveList; +import org.capnproto.PrimitiveList.Int; +import org.capnproto.StructList; +import org.capnproto.Text; +import org.capnproto.TextList; +import org.capnproto.Void; + +import java.io.IOException; +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.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Queue; +import java.util.Set; +import java.util.TreeSet; public class DeviceResourcesWriter { private static StringEnumerator allStrings; @@ -688,6 +690,9 @@ public static Map writeAllTileTypesToBuilder(Design desig StructList.Builder tileTypesList = devBuilder.initTileTypeList(tileTypes.size()); Map tileTypeIndicies = new HashMap(); + Map slowTypDelayIndices = new HashMap<>(); + // Make the zero index no delay + slowTypDelayIndices.put(0f, 0); int i=0; for (Entry e : tileTypes.entrySet()) { @@ -727,6 +732,12 @@ public static Map writeAllTileTypesToBuilder(Design desig // pips ArrayList pips = tile.getPIPs(); + DelayEstimatorBase delayEstimator = null; + if (device.getSeries() == Series.UltraScalePlus) { + // Timing model only supports UltraScalePlus currently + boolean useUTurnNodes = true; + delayEstimator = new DelayEstimatorBase(device, new InterconnectInfo(), useUTurnNodes, 0); + } StructList.Builder pipBuilders = tileType.initPips(pips.size()); for (int j=0; j < pips.size(); j++) { @@ -772,10 +783,34 @@ public static Map writeAllTileTypesToBuilder(Design desig k++; } } + + if (delayEstimator != null) { + Node startNode = pip.getStartNode(); + if (!pip.getStartNode().isTied()) { + Node endNode = pip.getEndNode(); + float delay = RouterHelper.computeNodeDelay(delayEstimator, endNode); + delay += DelayEstimatorBase.getExtraDelay(endNode, DelayEstimatorBase.isLong(startNode)); + if (delay != 0) { + int index = slowTypDelayIndices.computeIfAbsent(delay, (v) -> slowTypDelayIndices.size()); + pipBuilder.setTiming(index); + } + } + } } + i++; } + StructList.Builder pipTimingsBuilder = devBuilder.initPipTimings(slowTypDelayIndices.size()); + for (Map.Entry e : slowTypDelayIndices.entrySet()) { + float slowTypDelay = e.getKey(); + int index = e.getValue(); + DeviceResources.Device.PIPTiming.Builder timingBuilder = pipTimingsBuilder.get(index); + DeviceResources.Device.CornerModel.Builder delayBuilder = timingBuilder.initInternalDelay(); + DeviceResources.Device.CornerModelValues.Builder slowBuilder = delayBuilder.initSlow().initSlow(); + slowBuilder.initTyp().setTyp(slowTypDelay); + } + return tileTypeIndicies; } @@ -847,7 +882,6 @@ public static void writeAllWiresAndNodesToBuilder(Device device, DeviceResources devBuilder.initNodes(allNodes.size()); for (int i=0; i < allNodes.size(); i++) { DeviceResources.Device.Node.Builder nodeBuilder = nodeBuilders.get(i); - //Node node = allNodes.get(i); long nodeKey = allNodes.get(i); Node node = Node.getNode(device.getTile((int)(nodeKey >>> 32)), (int)(nodeKey & 0xffffffff)); Wire[] wires = node.getAllWiresInNode(); From aeacb851ce6915e2b389d656a41a9ebef966096d Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Thu, 30 May 2024 09:28:41 -0700 Subject: [PATCH 03/18] [DelayEstimatorBase] Refactor calcNodeGroupDelay() Signed-off-by: Eddie Hung --- .../rapidwright/rwroute/RouterHelper.java | 8 +++- .../delayestimator/DelayEstimatorBase.java | 43 ++++++++++++------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java index 0d69649f5..70defe012 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java +++ b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java @@ -580,13 +580,17 @@ public static LightweightRouteNode createRoutingNode(Node node, Map dArray = distArrays.get(tg.orientation()).get(tg.type()); @@ -451,11 +468,7 @@ short calcNodeGroupDelay(T.NodeGroupType tg, short begLoc, short endLoc) { } } - float k0 = K0.get(tg.orientation()).get(tg.type()); - float k1 = K1.get(tg.orientation()).get(tg.type()); float k2 = K2.get(tg.orientation()).get(tg.type()); - short l = L .get(tg.orientation()).get(tg.type()); - - return (short) (k0 + k1 * l + k2 * d); + return (short) (k2 * d); } } From 97a3a4821c25f6dbfc07c39337df815860250680 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Thu, 30 May 2024 09:30:29 -0700 Subject: [PATCH 04/18] Populate PIP timings into slow.max, node discontinuity delay into node.resistance.slow.max Signed-off-by: Eddie Hung --- .../interchange/DeviceResourcesWriter.java | 61 ++++++++++++++----- 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java index 6142711b2..bf8885345 100644 --- a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java +++ b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java @@ -111,6 +111,8 @@ public class DeviceResourcesWriter { private static HashMap tileTypes; private static HashMap siteTypes; + private static DelayEstimatorBase delayEstimator; + public static void populateSiteEnumerations(SiteInst siteInst, Site site) { if (!siteTypes.containsKey(siteInst.getSiteTypeEnum())) { if (site.getSiteTypeEnum() != siteInst.getSiteTypeEnum()) { @@ -279,6 +281,13 @@ public static void writeDeviceResourcesFile(String part, Device device, CodePerf design.setPartName(part); Series series = device.getSeries(); + delayEstimator = null; + if (series == Series.UltraScalePlus) { + // Timing model only supports UltraScalePlus currently + boolean useUTurnNodes = true; + delayEstimator = new DelayEstimatorBase(device, new InterconnectInfo(), useUTurnNodes, 0); + } + t.start("populateEnums"); populateEnumerations(design, device); @@ -690,9 +699,9 @@ public static Map writeAllTileTypesToBuilder(Design desig StructList.Builder tileTypesList = devBuilder.initTileTypeList(tileTypes.size()); Map tileTypeIndicies = new HashMap(); - Map slowTypDelayIndices = new HashMap<>(); + Map slowMaxDelayIndices = new HashMap<>(); // Make the zero index no delay - slowTypDelayIndices.put(0f, 0); + slowMaxDelayIndices.put(0f, 0); int i=0; for (Entry e : tileTypes.entrySet()) { @@ -732,12 +741,6 @@ public static Map writeAllTileTypesToBuilder(Design desig // pips ArrayList pips = tile.getPIPs(); - DelayEstimatorBase delayEstimator = null; - if (device.getSeries() == Series.UltraScalePlus) { - // Timing model only supports UltraScalePlus currently - boolean useUTurnNodes = true; - delayEstimator = new DelayEstimatorBase(device, new InterconnectInfo(), useUTurnNodes, 0); - } StructList.Builder pipBuilders = tileType.initPips(pips.size()); for (int j=0; j < pips.size(); j++) { @@ -788,10 +791,12 @@ public static Map writeAllTileTypesToBuilder(Design desig Node startNode = pip.getStartNode(); if (!pip.getStartNode().isTied()) { Node endNode = pip.getEndNode(); - float delay = RouterHelper.computeNodeDelay(delayEstimator, endNode); - delay += DelayEstimatorBase.getExtraDelay(endNode, DelayEstimatorBase.isLong(startNode)); - if (delay != 0) { - int index = slowTypDelayIndices.computeIfAbsent(delay, (v) -> slowTypDelayIndices.size()); + boolean includeSegmentation = true; + boolean includeDiscontinuity = false; + float delayPs = RouterHelper.computeNodeDelay(delayEstimator, endNode, includeSegmentation, includeDiscontinuity); + delayPs += DelayEstimatorBase.getExtraDelay(endNode, DelayEstimatorBase.isLong(startNode)); + if (delayPs != 0) { + int index = slowMaxDelayIndices.computeIfAbsent(delayPs, (v) -> slowMaxDelayIndices.size()); pipBuilder.setTiming(index); } } @@ -801,14 +806,14 @@ public static Map writeAllTileTypesToBuilder(Design desig i++; } - StructList.Builder pipTimingsBuilder = devBuilder.initPipTimings(slowTypDelayIndices.size()); - for (Map.Entry e : slowTypDelayIndices.entrySet()) { - float slowTypDelay = e.getKey(); + StructList.Builder pipTimingsBuilder = devBuilder.initPipTimings(slowMaxDelayIndices.size()); + for (Map.Entry e : slowMaxDelayIndices.entrySet()) { + float slowMaxDelayPs = e.getKey(); int index = e.getValue(); DeviceResources.Device.PIPTiming.Builder timingBuilder = pipTimingsBuilder.get(index); DeviceResources.Device.CornerModel.Builder delayBuilder = timingBuilder.initInternalDelay(); DeviceResources.Device.CornerModelValues.Builder slowBuilder = delayBuilder.initSlow().initSlow(); - slowBuilder.initTyp().setTyp(slowTypDelay); + slowBuilder.initMax().setMax(slowMaxDelayPs * 1e-12f); } return tileTypeIndicies; @@ -878,6 +883,10 @@ public static void writeAllWiresAndNodesToBuilder(Device device, DeviceResources wireBuilder.setType(wire.getIntentCode().ordinal()); } + Map slowMaxDelayIndices = new HashMap<>(); + // Make the zero index no delay + slowMaxDelayIndices.put(0f, 0); + StructList.Builder nodeBuilders = devBuilder.initNodes(allNodes.size()); for (int i=0; i < allNodes.size(); i++) { @@ -889,6 +898,26 @@ public static void writeAllWiresAndNodesToBuilder(Device device, DeviceResources for (int k=0; k < wires.length; k++) { wBuilders.set(k, allWires.getIndex(makeKey(wires[k].getTile(), wires[k].getWireIndex()))); } + + if (delayEstimator != null && !node.isTied()) { + boolean includeSegmentation = false; + boolean includeDiscontinuity = true; + float delayPs = RouterHelper.computeNodeDelay(delayEstimator, node, includeSegmentation, includeDiscontinuity); + if (delayPs != 0) { + int index = slowMaxDelayIndices.computeIfAbsent(delayPs, (v) -> slowMaxDelayIndices.size()); + nodeBuilder.setNodeTiming(index); + } + } + } + + StructList.Builder nodeTimingsBuilder = devBuilder.initNodeTimings(slowMaxDelayIndices.size()); + for (Map.Entry e : slowMaxDelayIndices.entrySet()) { + float slowMaxDelayPs = e.getKey(); + int index = e.getValue(); + DeviceResources.Device.NodeTiming.Builder timingBuilder = nodeTimingsBuilder.get(index); + DeviceResources.Device.CornerModel.Builder delayBuilder = timingBuilder.initResistance(); // FIXME + DeviceResources.Device.CornerModelValues.Builder slowBuilder = delayBuilder.initSlow().initSlow(); + slowBuilder.initMax().setMax(slowMaxDelayPs * 1e-12f); } } private static void populatePackages(StringEnumerator allStrings, Device device, DeviceResources.Device.Builder devBuilder) { From d81e8063a03dacfdcf3374898f414282deded86f Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Thu, 30 May 2024 12:58:52 -0700 Subject: [PATCH 05/18] Cleanup/rename use T = R * C Signed-off-by: Eddie Hung --- .../interchange/DeviceResourcesWriter.java | 16 +++++++++------- .../xilinx/rapidwright/rwroute/RouterHelper.java | 8 +++++--- .../delayestimator/DelayEstimatorBase.java | 12 ++++++------ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java index bf8885345..2733ac067 100644 --- a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java +++ b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java @@ -791,9 +791,9 @@ public static Map writeAllTileTypesToBuilder(Design desig Node startNode = pip.getStartNode(); if (!pip.getStartNode().isTied()) { Node endNode = pip.getEndNode(); - boolean includeSegmentation = true; + boolean includeBase = true; boolean includeDiscontinuity = false; - float delayPs = RouterHelper.computeNodeDelay(delayEstimator, endNode, includeSegmentation, includeDiscontinuity); + float delayPs = RouterHelper.computeNodeDelay(delayEstimator, endNode, includeBase, includeDiscontinuity); delayPs += DelayEstimatorBase.getExtraDelay(endNode, DelayEstimatorBase.isLong(startNode)); if (delayPs != 0) { int index = slowMaxDelayIndices.computeIfAbsent(delayPs, (v) -> slowMaxDelayIndices.size()); @@ -900,9 +900,9 @@ public static void writeAllWiresAndNodesToBuilder(Device device, DeviceResources } if (delayEstimator != null && !node.isTied()) { - boolean includeSegmentation = false; + boolean incldueBase = false; boolean includeDiscontinuity = true; - float delayPs = RouterHelper.computeNodeDelay(delayEstimator, node, includeSegmentation, includeDiscontinuity); + float delayPs = RouterHelper.computeNodeDelay(delayEstimator, node, incldueBase, includeDiscontinuity); if (delayPs != 0) { int index = slowMaxDelayIndices.computeIfAbsent(delayPs, (v) -> slowMaxDelayIndices.size()); nodeBuilder.setNodeTiming(index); @@ -915,9 +915,11 @@ public static void writeAllWiresAndNodesToBuilder(Device device, DeviceResources float slowMaxDelayPs = e.getKey(); int index = e.getValue(); DeviceResources.Device.NodeTiming.Builder timingBuilder = nodeTimingsBuilder.get(index); - DeviceResources.Device.CornerModel.Builder delayBuilder = timingBuilder.initResistance(); // FIXME - DeviceResources.Device.CornerModelValues.Builder slowBuilder = delayBuilder.initSlow().initSlow(); - slowBuilder.initMax().setMax(slowMaxDelayPs * 1e-12f); + // Delay represented as T = R * C where R = and C = 1e-12 (1 ps) + DeviceResources.Device.CornerModelValues.Builder resBuilder = timingBuilder.initResistance().initSlow().initSlow(); + resBuilder.initMax().setMax(slowMaxDelayPs); + DeviceResources.Device.CornerModelValues.Builder capBuilder = timingBuilder.initCapacitance().initSlow().initSlow(); + capBuilder.initMax().setMax(1e-12f); } } private static void populatePackages(StringEnumerator allStrings, Device device, DeviceResources.Device.Builder devBuilder) { diff --git a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java index 70defe012..a1eed632e 100644 --- a/src/com/xilinx/rapidwright/rwroute/RouterHelper.java +++ b/src/com/xilinx/rapidwright/rwroute/RouterHelper.java @@ -580,15 +580,17 @@ public static LightweightRouteNode createRoutingNode(Node node, Map Date: Fri, 31 May 2024 10:26:39 -0700 Subject: [PATCH 06/18] [TimingAndWirelengthReport] Do not mask UTurn nodes Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/rwroute/TimingAndWirelengthReport.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/xilinx/rapidwright/rwroute/TimingAndWirelengthReport.java b/src/com/xilinx/rapidwright/rwroute/TimingAndWirelengthReport.java index 3e745c09b..0c900d7d9 100644 --- a/src/com/xilinx/rapidwright/rwroute/TimingAndWirelengthReport.java +++ b/src/com/xilinx/rapidwright/rwroute/TimingAndWirelengthReport.java @@ -188,6 +188,7 @@ public static void main(String[] args) { DesignTools.createMissingSitePinInsts(design); RWRouteConfig config = new RWRouteConfig(new String[0]); config.setTimingDriven(true); + config.setUseUTurnNodes(true); final boolean isPartialRouting = false; TimingAndWirelengthReport reporter = new TimingAndWirelengthReport(design, config, isPartialRouting); reporter.computeStatisticsAndReport(); From 8dc8288bd216c97869bc2016c941012920f36835 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Mon, 3 Jun 2024 12:17:35 -0700 Subject: [PATCH 07/18] [DeviceResourcesWriter] Populate SitePIP and intra-Cell delays Signed-off-by: Eddie Hung --- .../interchange/DeviceResourcesWriter.java | 27 ++++- .../interchange/EnumerateCellBelMapping.java | 111 +++++++++++++++++- .../xilinx/rapidwright/timing/DelayModel.java | 8 +- .../rapidwright/timing/DelayModelBuilder.java | 2 +- .../rapidwright/timing/SmallDelayModel.java | 17 ++- .../interchange/TestCellBELMappings.java | 2 +- 6 files changed, 147 insertions(+), 20 deletions(-) diff --git a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java index 2733ac067..c325066d6 100644 --- a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java +++ b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java @@ -77,6 +77,8 @@ import com.xilinx.rapidwright.interchange.LogicalNetlist.Netlist.PropertyMap; import com.xilinx.rapidwright.rwroute.RouterHelper; import com.xilinx.rapidwright.tests.CodePerfTracker; +import com.xilinx.rapidwright.timing.DelayModel; +import com.xilinx.rapidwright.timing.DelayModelBuilder; import com.xilinx.rapidwright.timing.delayestimator.DelayEstimatorBase; import com.xilinx.rapidwright.timing.delayestimator.InterconnectInfo; import com.xilinx.rapidwright.util.Pair; @@ -112,6 +114,7 @@ public class DeviceResourcesWriter { private static HashMap siteTypes; private static DelayEstimatorBase delayEstimator; + private static DelayModel intrasiteAndLogicDelayModel; public static void populateSiteEnumerations(SiteInst siteInst, Site site) { if (!siteTypes.containsKey(siteInst.getSiteTypeEnum())) { @@ -286,6 +289,8 @@ public static void writeDeviceResourcesFile(String part, Device device, CodePerf // Timing model only supports UltraScalePlus currently boolean useUTurnNodes = true; delayEstimator = new DelayEstimatorBase(device, new InterconnectInfo(), useUTurnNodes, 0); + String seriesName = design.getDevice().getSeries().name().toLowerCase(); + intrasiteAndLogicDelayModel = DelayModelBuilder.getDelayModel(seriesName); } t.start("populateEnums"); @@ -488,7 +493,7 @@ public static void writeDeviceResourcesFile(String part, Device device, CodePerf } t.stop().start("Cell <-> BEL pin map"); - EnumerateCellBelMapping.populateAllPinMappings(part, device, devBuilder, allStrings); + EnumerateCellBelMapping.populateAllPinMappings(part, device, devBuilder, allStrings, intrasiteAndLogicDelayModel); t.stop().start("Packages"); populatePackages(allStrings, device, devBuilder); @@ -640,8 +645,24 @@ public static void writeAllSiteTypesToBuilder(Design design, Device device, Devi for (int j=0; j < allSitePIPs.length; j++) { DeviceResources.Device.SitePIP.Builder spBuilder = spBuilders.get(j); SitePIP sitePIP = allSitePIPs[j]; - spBuilder.setInpin(allBELPins.getIndex(sitePIP.getInputPin())); - spBuilder.setOutpin(allBELPins.getIndex(sitePIP.getOutputPin())); + BELPin inputPin = sitePIP.getInputPin(); + spBuilder.setInpin(allBELPins.getIndex(inputPin)); + BELPin outputPin = sitePIP.getOutputPin(); + spBuilder.setOutpin(allBELPins.getIndex(outputPin)); + + // Write out delay of SitePIP + if (intrasiteAndLogicDelayModel != null) { + BELPin frBelPin = inputPin.getSourcePin(); + String frBelPinString = (frBelPin.isSitePort() ? "" : frBelPin.getBELName() + "/") + frBelPin.getName(); + BELPin toBelPin = outputPin.getSiteConns().get(0); + String toBelPinString = (toBelPin.isSitePort() ? "" : toBelPin.getBELName() + "/") + toBelPin.getName(); + Short delayPs = intrasiteAndLogicDelayModel.getIntraSiteDelay(siteInst.getSiteTypeEnum(), frBelPinString, toBelPinString); + if (delayPs != null && delayPs > 0) { + DeviceResources.Device.CornerModel.Builder delayBuilder = spBuilder.initDelay(); + DeviceResources.Device.CornerModelValues.Builder slowBuilder = delayBuilder.initSlow().initSlow(); + slowBuilder.initMax().setMax(delayPs * 1e-12f); + } + } } design.removeSiteInst(siteInst); diff --git a/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java b/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java index f07697fbf..7f0ddf23c 100644 --- a/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java +++ b/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java @@ -27,12 +27,18 @@ import java.util.AbstractMap; import java.util.ArrayList; import java.util.Comparator; +import java.util.EnumMap; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import com.xilinx.rapidwright.device.BEL; +import com.xilinx.rapidwright.device.BELPin; +import com.xilinx.rapidwright.timing.DelayModel; +import com.xilinx.rapidwright.timing.DelayModelBuilder; import org.capnproto.MessageBuilder; import org.capnproto.StructList; @@ -711,7 +717,14 @@ public static Map> createSiteMap(Device device) { return siteMap; } - public static void populateCellBelPin(StringEnumerator allStrings, Map> siteMap, CellBelMapping.Builder mapping, EDIFCell topLevelCell, EDIFCell cell, Design design) { + public static void populateCellBelPin(StringEnumerator allStrings, + Map> siteMap, + CellBelMapping.Builder mapping, + EDIFCell topLevelCell, + EDIFCell cell, + Design design, + DeviceResources.Device.Builder devBuilder, + DelayModel intrasiteAndLogicDelayModel) { mapping.setCell(allStrings.getIndex(cell.getName())); EDIFCellInst cellInst = new EDIFCellInst("test", cell, topLevelCell); Cell physCell = design.createCell("test", cellInst); @@ -733,6 +746,14 @@ public static void populateCellBelPin(StringEnumerator allStrings, Map pinDelays = (intrasiteAndLogicDelayModel != null) ? new ArrayList<>() : null; + for (Map.Entry possibleSite : entries) { SiteTypeEnum siteType = possibleSite.getKey(); String bel = possibleSite.getValue(); @@ -774,6 +795,41 @@ public static void populateCellBelPin(StringEnumerator allStrings, Map siteType2index = new EnumMap<>(SiteTypeEnum.class); + Map> siteType2belPin2index = new EnumMap<>(SiteTypeEnum.class); + + // First, re-parse the siteTypeList to extract site-type and bel-pin indices + StructList.Reader siteTypesReader = devBuilder.asReader().getSiteTypeList(); + int siteTypeIndex = 0; + for (DeviceResources.Device.SiteType.Reader st : siteTypesReader) { + SiteTypeEnum siteType = SiteTypeEnum.valueOf(allStrings.get(st.getName())); + siteType2index.put(siteType, siteTypeIndex++); + Map belPin2index = new HashMap<>(); + List siteList = siteMap.get(siteType); + Site site = siteList.get(0); + int belPinIndex = 0; + for (DeviceResources.Device.BELPin.Reader bpr : st.getBelPins()) { + String bel = allStrings.get(bpr.getBel()); + String pin = allStrings.get(bpr.getName()); + BELPin bp = site.getBELPin(bel, pin); + belPin2index.put(bp, belPinIndex++); + } + siteType2belPin2index.put(siteType, belPin2index); + } + + StructList.Builder pinDelaysBuilder = mapping.initPinsDelay(pinDelays.size()); + Iterator pinDelaysIt = pinDelaysBuilder.iterator(); + for (PinDelayEntry e : pinDelays) { + DeviceResources.Device.PinsDelay.Builder pd = pinDelaysIt.next(); + Map belPin2index = siteType2belPin2index.get(e.site); + pd.initFirstPin().setPin(belPin2index.get(e.firstPin)); + pd.initSecondPin().setPin(belPin2index.get(e.secondPin)); + pd.initCornerModel().initSlow().initSlow().initMax().setMax(e.delayPs * 1e-12f); + DeviceResources.Device.PinsDelayType type; + if (e.firstPin.isClock()) { + if (e.secondPin.isInput()) { + type = DeviceResources.Device.PinsDelayType.SETUP; + } else { + type = DeviceResources.Device.PinsDelayType.CLK2Q; + } + } else { + type = DeviceResources.Device.PinsDelayType.COMB; + } + pd.setPinsDelayType(type); + pd.setSite(siteType2index.get(e.site)); + } + } } - public static void populateAllPinMappings(String part, Device device, DeviceResources.Device.Builder devBuilder, StringEnumerator allStrings) { + public static void populateAllPinMappings(String part, Device device, DeviceResources.Device.Builder devBuilder, StringEnumerator allStrings, DelayModel intrasiteAndLogicDelayModel) { Design design = new Design("top", part); EDIFLibrary prims = Design.getPrimitivesLibrary(design.getDevice().getName()); @@ -820,7 +923,7 @@ public static void populateAllPinMappings(String part, Device device, DeviceReso StructList.Builder cellMapping = devBuilder.initCellBelMap(count); for (EDIFCell cell : prims.getCells()) { if (!macroCells.contains(cell.getName())) { - populateCellBelPin(allStrings, siteMap, cellMapping.get(i), topLevelCell, cell, design); + populateCellBelPin(allStrings, siteMap, cellMapping.get(i), topLevelCell, cell, design, devBuilder, intrasiteAndLogicDelayModel); i += 1; } } @@ -844,7 +947,7 @@ public static void main(String[] args) throws IOException { MessageBuilder message = new MessageBuilder(); DeviceResources.Device.Builder devBuilder = message.initRoot(DeviceResources.Device.factory); - populateAllPinMappings(args[0], device, devBuilder, allStrings); + populateAllPinMappings(args[0], device, devBuilder, allStrings, null); t.stop().printSummary(); } diff --git a/src/com/xilinx/rapidwright/timing/DelayModel.java b/src/com/xilinx/rapidwright/timing/DelayModel.java index 06ee9b5fe..6b5d87d90 100644 --- a/src/com/xilinx/rapidwright/timing/DelayModel.java +++ b/src/com/xilinx/rapidwright/timing/DelayModel.java @@ -25,8 +25,6 @@ package com.xilinx.rapidwright.timing; -import java.util.List; - import com.xilinx.rapidwright.device.SiteTypeEnum; @@ -79,7 +77,7 @@ public interface DelayModel { * @return Logic delay in ps. Return -1 if the connection does not exist. * @throws IllegalArgumentException if the given bel is not recognized by the model. */ - public short getLogicDelay(short belIdx, String frBelPin, String toBelPin, int encodedConfig); + public Short getLogicDelay(short belIdx, String frBelPin, String toBelPin, int encodedConfig); /** * Get the delay between input and output pins of a bel. @@ -90,7 +88,7 @@ public interface DelayModel { * @return Logic delay in ps. Return -1 if the connection does not exist. * @throws IllegalArgumentException if the given bel is not recognized by the model. */ - public short getLogicDelay(short belIdx, String frBelPin, String toBelPin); + public Short getLogicDelay(short belIdx, String frBelPin, String toBelPin); /** * TODO - Revisit this as part of the DelayModel @@ -105,7 +103,7 @@ public interface DelayModel { * @param belName Name of the BEL * @return The unique BEL timing model index */ - public short getBELIndex(String belName); + public Short getBELIndex(String belName); } diff --git a/src/com/xilinx/rapidwright/timing/DelayModelBuilder.java b/src/com/xilinx/rapidwright/timing/DelayModelBuilder.java index 971c3d273..f54e950ef 100644 --- a/src/com/xilinx/rapidwright/timing/DelayModelBuilder.java +++ b/src/com/xilinx/rapidwright/timing/DelayModelBuilder.java @@ -37,7 +37,7 @@ * Never construct DelayModel directly. DelayModelBuilder guarantees that there is at most one DelayModel * ie., DelayModelBuilder returns the existing model. */ -class DelayModelBuilder { +public class DelayModelBuilder { // Adding new mode or source requires appending them to the end of valid_mode or valid_source. // Never change the order of existing entries. diff --git a/src/com/xilinx/rapidwright/timing/SmallDelayModel.java b/src/com/xilinx/rapidwright/timing/SmallDelayModel.java index 816a605e2..685f736db 100644 --- a/src/com/xilinx/rapidwright/timing/SmallDelayModel.java +++ b/src/com/xilinx/rapidwright/timing/SmallDelayModel.java @@ -58,7 +58,7 @@ public int getEncodedConfigCode(String value) { return configCodeMap.getOrDefault(value, 0); } - public short getBELIndex(String belName) { + public Short getBELIndex(String belName) { return bel2IdxMap.get(belName); } @@ -67,7 +67,7 @@ public short getBELIndex(String belName) { */ public Short getIntraSiteDelay(SiteTypeEnum siteTypeName, String frBelPin, String toBelPin) { boolean verbose = false; - Short delay = null; + Short delay; Short idx = site2IdxMap.get(siteTypeName.name()); if (idx == null) { return null; @@ -78,7 +78,6 @@ public Short getIntraSiteDelay(SiteTypeEnum siteTypeName, String frBelPin, Strin String key = idx + frBelPin + toBelPin; delay = intraSiteDelays.get(key); if (delay == null) { - delay = -2; if (verbose) { System.out.println("WARNING in SmallDelayModel: Unknown connection to getIntraSiteDelay." + " site/belName " + siteTypeName + " frBelPin " + frBelPin + " toBelPin " + toBelPin); @@ -91,15 +90,16 @@ public Short getIntraSiteDelay(SiteTypeEnum siteTypeName, String frBelPin, Strin /** * Implement the method with the same signature defined in DelayModel interface. */ - public short getLogicDelay(short belIdx, String frBelPin, String toBelPin) { + public Short getLogicDelay(short belIdx, String frBelPin, String toBelPin) { return getLogicDelay(belIdx, frBelPin, toBelPin, 0); } /** * Implement the method with the same signature defined in DelayModel interface. */ - public short getLogicDelay(short belIdx, String frBelPin, String toBelPin, int encodedConfig) { - Short delay = -2; + public Short getLogicDelay(short belIdx, String frBelPin, String toBelPin, int encodedConfig) { + boolean verbose = false; + Short delay = null; // Certain that the following combination do not cause duplication. Otherwise, separators must be added. String key = belIdx + frBelPin + toBelPin; @@ -114,6 +114,11 @@ public short getLogicDelay(short belIdx, String frBelPin, String toBelPin, int e break; } } + } else { + if (verbose) { + System.out.println("WARNING in SmallDelayModel: Unknown connection to getLogicDelay." + + " belIdx " + belIdx + " frBelPin " + frBelPin + " toBelPin " + toBelPin); + } } return delay; } diff --git a/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java b/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java index 38c376cc4..5b0be0435 100644 --- a/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java +++ b/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java @@ -41,7 +41,7 @@ public void testCellBELPinMappings(String deviceName) { MessageBuilder message = new MessageBuilder(); Device device = Device.getDevice(deviceName); DeviceResources.Device.Builder devBuilder = message.initRoot(DeviceResources.Device.factory); - EnumerateCellBelMapping.populateAllPinMappings(device.getName(), device, devBuilder, allStrings); + EnumerateCellBelMapping.populateAllPinMappings(device.getName(), device, devBuilder, allStrings, null); boolean foundIDDRS = false; boolean foundIDDRR = false; From fd7d50c1c547913dda46a74a7c820738ee026f3c Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Mon, 3 Jun 2024 12:18:47 -0700 Subject: [PATCH 08/18] Add assertion Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/interchange/EnumerateCellBelMapping.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java b/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java index 7f0ddf23c..561224037 100644 --- a/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java +++ b/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java @@ -876,6 +876,7 @@ class PinDelayEntry { if (e.secondPin.isInput()) { type = DeviceResources.Device.PinsDelayType.SETUP; } else { + assert(e.secondPin.isOutput()); type = DeviceResources.Device.PinsDelayType.CLK2Q; } } else { From bd0d34e83b5c0c253e5bf8160ef764d774ce406d Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Mon, 3 Jun 2024 14:05:21 -0700 Subject: [PATCH 09/18] [DeviceResourcesWriter] Delays for thru-site pips (SLICEL only) Signed-off-by: Eddie Hung --- .../interchange/DeviceResourcesWriter.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java index c325066d6..9f1e6219f 100644 --- a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java +++ b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java @@ -82,6 +82,7 @@ import com.xilinx.rapidwright.timing.delayestimator.DelayEstimatorBase; import com.xilinx.rapidwright.timing.delayestimator.InterconnectInfo; import com.xilinx.rapidwright.util.Pair; +import com.xilinx.rapidwright.util.Utils; import org.capnproto.MessageBuilder; import org.capnproto.PrimitiveList; import org.capnproto.PrimitiveList.Int; @@ -816,6 +817,25 @@ public static Map writeAllTileTypesToBuilder(Design desig boolean includeDiscontinuity = false; float delayPs = RouterHelper.computeNodeDelay(delayEstimator, endNode, includeBase, includeDiscontinuity); delayPs += DelayEstimatorBase.getExtraDelay(endNode, DelayEstimatorBase.isLong(startNode)); + if (pip.isRouteThru()) { + if (Utils.isCLB(pip.getTile().getTileTypeEnum())) { + // Site port to cell + com.xilinx.rapidwright.device.SitePin fromSitePin = pip.getStartWire().getSitePin(); + String fromSitePinName = fromSitePin.getPinName(); + assert(fromSitePinName.matches("[A-H][1-6]")); + char lutLetter = fromSitePinName.charAt(0); + char pinNumber = fromSitePinName.charAt(1); + delayPs += intrasiteAndLogicDelayModel.getIntraSiteDelay(SiteTypeEnum.SLICEL, fromSitePinName, lutLetter + "6LUT/A" + pinNumber); + // Through cell + short belIdx = intrasiteAndLogicDelayModel.getBELIndex(lutLetter + "6LUT"); + delayPs += intrasiteAndLogicDelayModel.getLogicDelay(belIdx, "A" + pinNumber, "O6"); + // Cell to site port + com.xilinx.rapidwright.device.SitePin toSitePin = pip.getEndWire().getSitePin(); + String toSitePinName = toSitePin.getPinName(); + assert(toSitePinName.matches("[A-H](_O|MUX)")); + delayPs += intrasiteAndLogicDelayModel.getIntraSiteDelay(SiteTypeEnum.SLICEL, lutLetter + "6LUT/O6", toSitePinName); + } + } if (delayPs != 0) { int index = slowMaxDelayIndices.computeIfAbsent(delayPs, (v) -> slowMaxDelayIndices.size()); pipBuilder.setTiming(index); From 3acd160a823db5e1cc2d40da7b3a755a5716c28a Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Mon, 3 Jun 2024 14:09:35 -0700 Subject: [PATCH 10/18] Update copyright Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/interchange/EnumerateCellBelMapping.java | 2 +- .../xilinx/rapidwright/rwroute/TimingAndWirelengthReport.java | 2 +- src/com/xilinx/rapidwright/timing/DelayModel.java | 2 +- src/com/xilinx/rapidwright/timing/DelayModelBuilder.java | 2 +- src/com/xilinx/rapidwright/timing/SmallDelayModel.java | 2 +- .../rapidwright/timing/delayestimator/DelayEstimatorBase.java | 2 +- .../com/xilinx/rapidwright/interchange/TestCellBELMappings.java | 2 +- .../com/xilinx/rapidwright/interchange/TestDeviceResources.java | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java b/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java index 561224037..6668ddd1f 100644 --- a/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java +++ b/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2022, Xilinx, Inc. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. + * Copyright (c) 2022-2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Keith Rothman, Google, Inc. diff --git a/src/com/xilinx/rapidwright/rwroute/TimingAndWirelengthReport.java b/src/com/xilinx/rapidwright/rwroute/TimingAndWirelengthReport.java index 0c900d7d9..7ec68a475 100644 --- a/src/com/xilinx/rapidwright/rwroute/TimingAndWirelengthReport.java +++ b/src/com/xilinx/rapidwright/rwroute/TimingAndWirelengthReport.java @@ -1,7 +1,7 @@ /* * * Copyright (c) 2021 Ghent University. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. + * Copyright (c) 2022-2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Yun Zhou, Ghent University. diff --git a/src/com/xilinx/rapidwright/timing/DelayModel.java b/src/com/xilinx/rapidwright/timing/DelayModel.java index 6b5d87d90..3d5cdce39 100644 --- a/src/com/xilinx/rapidwright/timing/DelayModel.java +++ b/src/com/xilinx/rapidwright/timing/DelayModel.java @@ -1,7 +1,7 @@ /* * * Copyright (c) 2019-2022, Xilinx, Inc. - * Copyright (c) 2022, Advanced Micro Devices, Inc. + * Copyright (c) 2022, 2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Pongstorn Maidee, Xilinx Research Labs. diff --git a/src/com/xilinx/rapidwright/timing/DelayModelBuilder.java b/src/com/xilinx/rapidwright/timing/DelayModelBuilder.java index f54e950ef..e22eed9d7 100644 --- a/src/com/xilinx/rapidwright/timing/DelayModelBuilder.java +++ b/src/com/xilinx/rapidwright/timing/DelayModelBuilder.java @@ -1,7 +1,7 @@ /* * * Copyright (c) 2019-2022, Xilinx, Inc. - * Copyright (c) 2022, Advanced Micro Devices, Inc. + * Copyright (c) 2022, 2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Pongstorn Maidee, Xilinx Research Labs. diff --git a/src/com/xilinx/rapidwright/timing/SmallDelayModel.java b/src/com/xilinx/rapidwright/timing/SmallDelayModel.java index 685f736db..4c618dd2b 100644 --- a/src/com/xilinx/rapidwright/timing/SmallDelayModel.java +++ b/src/com/xilinx/rapidwright/timing/SmallDelayModel.java @@ -1,7 +1,7 @@ /* * * Copyright (c) 2019-2022, Xilinx, Inc. - * Copyright (c) 2022, Advanced Micro Devices, Inc. + * Copyright (c) 2022, 2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Pongstorn Maidee, Xilinx Research Labs. diff --git a/src/com/xilinx/rapidwright/timing/delayestimator/DelayEstimatorBase.java b/src/com/xilinx/rapidwright/timing/delayestimator/DelayEstimatorBase.java index fdf49d5a5..1f1aa6218 100644 --- a/src/com/xilinx/rapidwright/timing/delayestimator/DelayEstimatorBase.java +++ b/src/com/xilinx/rapidwright/timing/delayestimator/DelayEstimatorBase.java @@ -1,7 +1,7 @@ /* * * Copyright (c) 2021-2022, Xilinx, Inc. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. + * Copyright (c) 2022-2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Pongstorn Maidee, Xilinx Research Labs. diff --git a/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java b/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java index 5b0be0435..30a353b7c 100644 --- a/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java +++ b/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2022, Xilinx, Inc. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. + * Copyright (c) 2022-2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Chris Lavin, Xilinx Research Labs. diff --git a/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java b/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java index b0c44d1f4..885ce6366 100644 --- a/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java +++ b/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2022, Xilinx, Inc. - * Copyright (c) 2022, Advanced Micro Devices, Inc. + * Copyright (c) 2022, 2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Chris Lavin, Xilinx Research Labs. From 6a15ad1d178f56ca132ce1c6a5890039751b861e Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Mon, 3 Jun 2024 14:19:54 -0700 Subject: [PATCH 11/18] Revert making DelayModelBuilder public Signed-off-by: Eddie Hung --- .../rapidwright/interchange/DeviceResourcesWriter.java | 8 +++++--- .../rapidwright/interchange/EnumerateCellBelMapping.java | 1 - src/com/xilinx/rapidwright/timing/DelayModelBuilder.java | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java index 9f1e6219f..24b08c6fd 100644 --- a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java +++ b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java @@ -78,7 +78,7 @@ import com.xilinx.rapidwright.rwroute.RouterHelper; import com.xilinx.rapidwright.tests.CodePerfTracker; import com.xilinx.rapidwright.timing.DelayModel; -import com.xilinx.rapidwright.timing.DelayModelBuilder; +import com.xilinx.rapidwright.timing.TimingModel; import com.xilinx.rapidwright.timing.delayestimator.DelayEstimatorBase; import com.xilinx.rapidwright.timing.delayestimator.InterconnectInfo; import com.xilinx.rapidwright.util.Pair; @@ -116,6 +116,7 @@ public class DeviceResourcesWriter { private static DelayEstimatorBase delayEstimator; private static DelayModel intrasiteAndLogicDelayModel; + private static TimingModel timingModel; public static void populateSiteEnumerations(SiteInst siteInst, Site site) { if (!siteTypes.containsKey(siteInst.getSiteTypeEnum())) { @@ -290,8 +291,9 @@ public static void writeDeviceResourcesFile(String part, Device device, CodePerf // Timing model only supports UltraScalePlus currently boolean useUTurnNodes = true; delayEstimator = new DelayEstimatorBase(device, new InterconnectInfo(), useUTurnNodes, 0); - String seriesName = design.getDevice().getSeries().name().toLowerCase(); - intrasiteAndLogicDelayModel = DelayModelBuilder.getDelayModel(seriesName); + TimingModel timingModel = new TimingModel(design.getDevice()); + timingModel.build(); + intrasiteAndLogicDelayModel = timingModel.getDelayModel(); } t.start("populateEnums"); diff --git a/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java b/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java index 6668ddd1f..db36d01b9 100644 --- a/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java +++ b/src/com/xilinx/rapidwright/interchange/EnumerateCellBelMapping.java @@ -38,7 +38,6 @@ import com.xilinx.rapidwright.device.BEL; import com.xilinx.rapidwright.device.BELPin; import com.xilinx.rapidwright.timing.DelayModel; -import com.xilinx.rapidwright.timing.DelayModelBuilder; import org.capnproto.MessageBuilder; import org.capnproto.StructList; diff --git a/src/com/xilinx/rapidwright/timing/DelayModelBuilder.java b/src/com/xilinx/rapidwright/timing/DelayModelBuilder.java index e22eed9d7..971c3d273 100644 --- a/src/com/xilinx/rapidwright/timing/DelayModelBuilder.java +++ b/src/com/xilinx/rapidwright/timing/DelayModelBuilder.java @@ -1,7 +1,7 @@ /* * * Copyright (c) 2019-2022, Xilinx, Inc. - * Copyright (c) 2022, 2024, Advanced Micro Devices, Inc. + * Copyright (c) 2022, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Pongstorn Maidee, Xilinx Research Labs. @@ -37,7 +37,7 @@ * Never construct DelayModel directly. DelayModelBuilder guarantees that there is at most one DelayModel * ie., DelayModelBuilder returns the existing model. */ -public class DelayModelBuilder { +class DelayModelBuilder { // Adding new mode or source requires appending them to the end of valid_mode or valid_source. // Never change the order of existing entries. From 9b89d37e33c1d230933625cd79eccea5fe991d66 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 12 Jun 2024 04:26:43 -0700 Subject: [PATCH 12/18] Cleanup Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/interchange/DeviceResourcesWriter.java | 1 - .../rapidwright/timing/delayestimator/DelayEstimatorBase.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java index 24b08c6fd..f0e700b7d 100644 --- a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java +++ b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java @@ -116,7 +116,6 @@ public class DeviceResourcesWriter { private static DelayEstimatorBase delayEstimator; private static DelayModel intrasiteAndLogicDelayModel; - private static TimingModel timingModel; public static void populateSiteEnumerations(SiteInst siteInst, Site site) { if (!siteTypes.containsKey(siteInst.getSiteTypeEnum())) { diff --git a/src/com/xilinx/rapidwright/timing/delayestimator/DelayEstimatorBase.java b/src/com/xilinx/rapidwright/timing/delayestimator/DelayEstimatorBase.java index 1f1aa6218..3c80bfe4b 100644 --- a/src/com/xilinx/rapidwright/timing/delayestimator/DelayEstimatorBase.java +++ b/src/com/xilinx/rapidwright/timing/delayestimator/DelayEstimatorBase.java @@ -210,7 +210,7 @@ public short end() { } - public TermInfo getTermInfo(Node node) { + private TermInfo getTermInfo(Node node) { String nodeType = node.getWireName(); // Based on its name, WW1_E should go be horizontal single. However, it go to the north like NN1_E. From 7504ad5888d5a30476387e504f05c50bb657206f Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 12 Jun 2024 06:46:05 -0700 Subject: [PATCH 13/18] Fix some broken tests Signed-off-by: Eddie Hung --- .../rapidwright/timing/TimingGraph.java | 24 +++++++++---------- .../interchange/TestCellBELMappings.java | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/com/xilinx/rapidwright/timing/TimingGraph.java b/src/com/xilinx/rapidwright/timing/TimingGraph.java index 151acfe52..ffec1eba8 100644 --- a/src/com/xilinx/rapidwright/timing/TimingGraph.java +++ b/src/com/xilinx/rapidwright/timing/TimingGraph.java @@ -1028,7 +1028,7 @@ void determineLogicDelaysFromEDIFCellInsts(Map myCellMap) String s2 = ep2.getName(); // RAMB36E2 and RAMB18E2 have the same delay, only that RAMB18E2 will have less pins - short delay = 0; + Short delay = 0; if (s1.startsWith("CLKA")) { // for DSP, we need to look up in the text file // check order_a for A pin, order_b for B pin if (isBramOutPortA(s2)) { @@ -1051,7 +1051,7 @@ void determineLogicDelaysFromEDIFCellInsts(Map myCellMap) delay = intrasiteAndLogicDelayModel.getLogicDelay(belIdx, s1, s2, encodedConfig); } - if (delay < 0) { + if (delay == null) { continue; } @@ -1259,21 +1259,18 @@ else if (myCellName.startsWith("LUT") || myCellName.startsWith("RAM") || myCellN String outputPhysPin = c.getPhysicalPinMapping(ep2.getName()); - float myLogicDelay; + Short myLogicDelay; try { myLogicDelay = intrasiteAndLogicDelayModel.getLogicDelay(belIdx, physPin, outputPhysPin); } catch (IllegalArgumentException e) { continue; } - if (myLogicDelay < 0) { + if (myLogicDelay == null) { continue; } - float LOGIC_DELAY = 0.0f; - - LOGIC_DELAY = myLogicDelay; if (ep2.getName().startsWith("O")) { - logicDelay = LOGIC_DELAY; + logicDelay = myLogicDelay; //break; } @@ -1327,9 +1324,9 @@ else if (myCellName.startsWith("CARRY")) { encodedConfig = 0; } - float myLogicDelay = intrasiteAndLogicDelayModel.getLogicDelay( + Short myLogicDelay = intrasiteAndLogicDelayModel.getLogicDelay( belIdx, physPin, outputPhysPin, encodedConfig); - if (myLogicDelay < 0) { + if (myLogicDelay == null) { continue; } @@ -1506,10 +1503,13 @@ private void dspTimingFileExistenceWarning(String dspBlockFullHierName) { } float getCLKtoOutputDelay(String portName, int encodedConfig) { - float delay = 0; + short delay = 0; short belIdx = intrasiteAndLogicDelayModel.getBELIndex("RAMB36E2"); for (String clk : bramCLKPins) { - delay = Math.max(delay, intrasiteAndLogicDelayModel.getLogicDelay(belIdx, clk, portName, encodedConfig)); + Short newDelay = intrasiteAndLogicDelayModel.getLogicDelay(belIdx, clk, portName, encodedConfig); + if (newDelay != null) { + delay = (short) Math.max(delay, newDelay); + } } return delay; } diff --git a/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java b/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java index 30a353b7c..12bb92290 100644 --- a/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java +++ b/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java @@ -35,7 +35,7 @@ public class TestCellBELMappings { @ParameterizedTest - @ValueSource(strings = {"xcau10p", "xc7a15t"}) + @ValueSource(strings = {"xc7a15t"}) public void testCellBELPinMappings(String deviceName) { StringEnumerator allStrings = new StringEnumerator(); MessageBuilder message = new MessageBuilder(); From ea32d8615c3b3360ea0ccba87789ce941f706dea Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Wed, 12 Jun 2024 08:53:33 -0700 Subject: [PATCH 14/18] Another fix Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/timing/TimingModel.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/com/xilinx/rapidwright/timing/TimingModel.java b/src/com/xilinx/rapidwright/timing/TimingModel.java index 0a560fcea..6dc949426 100644 --- a/src/com/xilinx/rapidwright/timing/TimingModel.java +++ b/src/com/xilinx/rapidwright/timing/TimingModel.java @@ -1631,9 +1631,11 @@ private void checkForIntrasiteDelay() { else { fromPinName += sourceBELPin.getName(); } - short tmpIntrasiteDelay = intrasiteAndLogicDelayModel.getIntraSiteDelay( + Short tmpIntrasiteDelay = intrasiteAndLogicDelayModel.getIntraSiteDelay( SiteTypeEnum.SLICEL, fromPinName, startPinInst.getName()); - intrasiteDelay += tmpIntrasiteDelay; + if (tmpIntrasiteDelay != null) { + intrasiteDelay += tmpIntrasiteDelay; + } } else if (startPinInst.getName().endsWith("_O")) { intrasiteDelay += INTRASITE_DELAY_LUT_OUTPUT_TO_O_SITEPIN; From bf878cab9600d506d81eecc7404040fbd0832cf6 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Thu, 13 Jun 2024 02:14:17 -0700 Subject: [PATCH 15/18] Revert test/ changes Signed-off-by: Eddie Hung --- .../interchange/TestCellBELMappings.java | 19 ++++++------ .../interchange/TestDeviceResources.java | 31 ++++++++++--------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java b/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java index 12bb92290..3cec807be 100644 --- a/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java +++ b/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2022, Xilinx, Inc. - * Copyright (c) 2022-2024, Advanced Micro Devices, Inc. + * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Chris Lavin, Xilinx Research Labs. @@ -23,25 +23,24 @@ package com.xilinx.rapidwright.interchange; +import org.capnproto.MessageBuilder; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + import com.xilinx.rapidwright.device.Device; import com.xilinx.rapidwright.interchange.DeviceResources.Device.CellBelMapping; import com.xilinx.rapidwright.interchange.DeviceResources.Device.CellBelPinEntry; import com.xilinx.rapidwright.interchange.DeviceResources.Device.ParameterCellBelPinMaps; -import org.capnproto.MessageBuilder; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; public class TestCellBELMappings { - @ParameterizedTest - @ValueSource(strings = {"xc7a15t"}) - public void testCellBELPinMappings(String deviceName) { + @Test + public void testCellBELPinMappings() { StringEnumerator allStrings = new StringEnumerator(); MessageBuilder message = new MessageBuilder(); - Device device = Device.getDevice(deviceName); + Device device = Device.getDevice(TestDeviceResources.TEST_DEVICE); DeviceResources.Device.Builder devBuilder = message.initRoot(DeviceResources.Device.factory); - EnumerateCellBelMapping.populateAllPinMappings(device.getName(), device, devBuilder, allStrings, null); + EnumerateCellBelMapping.populateAllPinMappings(device.getName(), device, devBuilder, allStrings); boolean foundIDDRS = false; boolean foundIDDRR = false; diff --git a/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java b/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java index 885ce6366..805ab3795 100644 --- a/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java +++ b/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2022, Xilinx, Inc. - * Copyright (c) 2022, 2024, Advanced Micro Devices, Inc. + * Copyright (c) 2022, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Chris Lavin, Xilinx Research Labs. @@ -23,25 +23,28 @@ package com.xilinx.rapidwright.interchange; -import com.xilinx.rapidwright.device.Device; -import com.xilinx.rapidwright.tests.CodePerfTracker; -import org.junit.jupiter.api.io.TempDir; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; - import java.io.IOException; import java.nio.file.Path; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import com.xilinx.rapidwright.device.Device; +import com.xilinx.rapidwright.tests.CodePerfTracker; + public class TestDeviceResources { - @ParameterizedTest - @ValueSource(strings = {"xcau10p", "xc7a15t"}) - public void testDeviceResources(String deviceName, @TempDir Path tempDir) throws IOException { - Path capnProtoFile = tempDir.resolve(deviceName + ".device"); - Device device = Device.getDevice(deviceName); + public static final String TEST_DEVICE = "xc7a15t"; + + @Test + public void testDeviceResources(@TempDir Path tempDir) throws IOException { + Path capnProtoFile = tempDir.resolve(TEST_DEVICE + ".device"); + Device device = Device.getDevice(TEST_DEVICE); DeviceResourcesWriter.writeDeviceResourcesFile( - deviceName, device, CodePerfTracker.SILENT, capnProtoFile.toString()); + TEST_DEVICE, device, CodePerfTracker.SILENT, capnProtoFile.toString()); Device.releaseDeviceReferences(); - DeviceResourcesVerifier.verifyDeviceResources(capnProtoFile.toString(), deviceName); + DeviceResourcesVerifier.verifyDeviceResources(capnProtoFile.toString(), TEST_DEVICE); } + + } From c578e41ea08f7431c7d3f081ca26cda491cd0360 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Thu, 13 Jun 2024 02:34:08 -0700 Subject: [PATCH 16/18] Fix test Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/interchange/TestCellBELMappings.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java b/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java index 3cec807be..632a541b4 100644 --- a/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java +++ b/test/src/com/xilinx/rapidwright/interchange/TestCellBELMappings.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2022, Xilinx, Inc. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. + * Copyright (c) 2022-2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Chris Lavin, Xilinx Research Labs. @@ -40,7 +40,8 @@ public void testCellBELPinMappings() { MessageBuilder message = new MessageBuilder(); Device device = Device.getDevice(TestDeviceResources.TEST_DEVICE); DeviceResources.Device.Builder devBuilder = message.initRoot(DeviceResources.Device.factory); - EnumerateCellBelMapping.populateAllPinMappings(device.getName(), device, devBuilder, allStrings); + EnumerateCellBelMapping + .populateAllPinMappings(device.getName(), device, devBuilder, allStrings, null); boolean foundIDDRS = false; boolean foundIDDRR = false; From ad8d152194f860ea7f911042e3315a4a20c7995d Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Thu, 13 Jun 2024 02:34:29 -0700 Subject: [PATCH 17/18] Add testUltraScalePlusTiming() Signed-off-by: Eddie Hung --- .../interchange/TestDeviceResources.java | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java b/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java index 805ab3795..00f9a7db5 100644 --- a/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java +++ b/test/src/com/xilinx/rapidwright/interchange/TestDeviceResources.java @@ -1,6 +1,6 @@ /* * Copyright (c) 2022, Xilinx, Inc. - * Copyright (c) 2022, Advanced Micro Devices, Inc. + * Copyright (c) 2022, 2024, Advanced Micro Devices, Inc. * All rights reserved. * * Author: Chris Lavin, Xilinx Research Labs. @@ -26,11 +26,17 @@ import java.io.IOException; import java.nio.file.Path; +import org.capnproto.MessageReader; +import org.capnproto.ReaderOptions; +import org.capnproto.TextList; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import com.xilinx.rapidwright.device.Device; import com.xilinx.rapidwright.tests.CodePerfTracker; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; public class TestDeviceResources { @@ -46,5 +52,54 @@ public void testDeviceResources(@TempDir Path tempDir) throws IOException { DeviceResourcesVerifier.verifyDeviceResources(capnProtoFile.toString(), TEST_DEVICE); } + @ParameterizedTest + @CsvSource({ + "xcau10p" + }) + public void testUltraScalePlusTiming(String deviceName, @TempDir Path tempDir) throws IOException { + Path capnProtoFile = tempDir.resolve(deviceName + ".device"); + Device device = Device.getDevice(deviceName); + DeviceResourcesWriter.writeDeviceResourcesFile( + deviceName, device, CodePerfTracker.SILENT, capnProtoFile.toString()); + + ReaderOptions readerOptions = new ReaderOptions(1024L * 1024L * 1024L * 64L, 64); + MessageReader readMsg = Interchange.readInterchangeFile(capnProtoFile.toString(), readerOptions); + DeviceResources.Device.Reader dReader = readMsg.getRoot(DeviceResources.Device.factory); + + Assertions.assertTrue(dReader.getPipTimings().size() > 1); + Assertions.assertTrue(dReader.getNodeTimings().size() > 1); + TextList.Reader sReader = dReader.getStrList(); + + // Check SitePIPs have at least one delay + int reached = 0; + for (DeviceResources.Device.SiteType.Reader st : dReader.getSiteTypeList()) { + String name = sReader.get(st.getName()).toString(); + if (!name.startsWith("SLICE")) { + continue; + } + for (DeviceResources.Device.SitePIP.Reader sp : st.getSitePIPs()) { + if (sp.hasDelay()) { + reached++; + break; + } + } + } + // {SLICEL,SLICEM} + Assertions.assertEquals(2, reached); + + // Check Cells have at least one delay + reached = 0; + for (DeviceResources.Device.CellBelMapping.Reader cb : dReader.getCellBelMap()) { + String name = sReader.get(cb.getCell()).toString(); + if (!name.startsWith("LUT")) { + continue; + } + if (cb.hasPinsDelay()) { + reached++; + } + } + // LUT[1-6] + Assertions.assertEquals(6, reached); + } } From 8222132d42b8bc03d29153957343293d9fb97658 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Thu, 13 Jun 2024 02:58:02 -0700 Subject: [PATCH 18/18] Address review comments Signed-off-by: Eddie Hung --- .../interchange/DeviceResourcesWriter.java | 8 +++++--- src/com/xilinx/rapidwright/timing/DelayModel.java | 13 +++++-------- .../xilinx/rapidwright/timing/SmallDelayModel.java | 6 +++--- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java index f0e700b7d..ba5d67480 100644 --- a/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java +++ b/src/com/xilinx/rapidwright/interchange/DeviceResourcesWriter.java @@ -117,6 +117,8 @@ public class DeviceResourcesWriter { private static DelayEstimatorBase delayEstimator; private static DelayModel intrasiteAndLogicDelayModel; + private static final float PICSECONDS_TO_SECONDS = 1e-12f; + public static void populateSiteEnumerations(SiteInst siteInst, Site site) { if (!siteTypes.containsKey(siteInst.getSiteTypeEnum())) { if (site.getSiteTypeEnum() != siteInst.getSiteTypeEnum()) { @@ -662,7 +664,7 @@ public static void writeAllSiteTypesToBuilder(Design design, Device device, Devi if (delayPs != null && delayPs > 0) { DeviceResources.Device.CornerModel.Builder delayBuilder = spBuilder.initDelay(); DeviceResources.Device.CornerModelValues.Builder slowBuilder = delayBuilder.initSlow().initSlow(); - slowBuilder.initMax().setMax(delayPs * 1e-12f); + slowBuilder.initMax().setMax(delayPs * PICSECONDS_TO_SECONDS); } } } @@ -855,7 +857,7 @@ public static Map writeAllTileTypesToBuilder(Design desig DeviceResources.Device.PIPTiming.Builder timingBuilder = pipTimingsBuilder.get(index); DeviceResources.Device.CornerModel.Builder delayBuilder = timingBuilder.initInternalDelay(); DeviceResources.Device.CornerModelValues.Builder slowBuilder = delayBuilder.initSlow().initSlow(); - slowBuilder.initMax().setMax(slowMaxDelayPs * 1e-12f); + slowBuilder.initMax().setMax(slowMaxDelayPs * PICSECONDS_TO_SECONDS); } return tileTypeIndicies; @@ -961,7 +963,7 @@ public static void writeAllWiresAndNodesToBuilder(Device device, DeviceResources DeviceResources.Device.CornerModelValues.Builder resBuilder = timingBuilder.initResistance().initSlow().initSlow(); resBuilder.initMax().setMax(slowMaxDelayPs); DeviceResources.Device.CornerModelValues.Builder capBuilder = timingBuilder.initCapacitance().initSlow().initSlow(); - capBuilder.initMax().setMax(1e-12f); + capBuilder.initMax().setMax(PICSECONDS_TO_SECONDS); } } private static void populatePackages(StringEnumerator allStrings, Device device, DeviceResources.Device.Builder devBuilder) { diff --git a/src/com/xilinx/rapidwright/timing/DelayModel.java b/src/com/xilinx/rapidwright/timing/DelayModel.java index 3d5cdce39..8a8e5927e 100644 --- a/src/com/xilinx/rapidwright/timing/DelayModel.java +++ b/src/com/xilinx/rapidwright/timing/DelayModel.java @@ -53,14 +53,13 @@ public interface DelayModel { /** * Get the delay in ps between two bel pins within the given site name. * - * @param siteTypeName The name of the site type, such as SLICEL and SLICEM. + * @param siteType The SiteTypeEnum of BEL site, such as SLICEL and SLICEM. * @param frBelPin The bel pin which is the driver of the connection. Thus, it must be a bel output pin. * The bel name must be included, ie., AFF2/D. An input site pin is considered a valid frBelPin. * @param toBelPin The bel pin which is the sink of the connection (a bel input pin, or an output site pin). - * @return Intra-site delay in ps. Return -1 if the connection does not exist. - * @throws IllegalArgumentException if the given siteTypeName is not recognized by the model. + * @return Intra-site delay in ps. Return null if the connection does not exist. */ - public Short getIntraSiteDelay(SiteTypeEnum siteTypeName, String frBelPin, String toBelPin); + public Short getIntraSiteDelay(SiteTypeEnum siteType, String frBelPin, String toBelPin); /** * Get the delay between input and output pins of a bel. @@ -74,8 +73,7 @@ public interface DelayModel { * Where to get the config's value from the design? * There is no uniform way to find the value. It is to determined per case. * For example, some configs of carry8 is from bel, while some from cell. - * @return Logic delay in ps. Return -1 if the connection does not exist. - * @throws IllegalArgumentException if the given bel is not recognized by the model. + * @return Logic delay in ps. Return null if the connection does not exist. */ public Short getLogicDelay(short belIdx, String frBelPin, String toBelPin, int encodedConfig); @@ -85,8 +83,7 @@ public interface DelayModel { * @param belIdx The unique BEL timing model index, see {@link #getBELIndex(String)}. * @param frBelPin An input bel pin. It must NOT include bel name. * @param toBelPin An output bel pin. It must NOT include bel name. - * @return Logic delay in ps. Return -1 if the connection does not exist. - * @throws IllegalArgumentException if the given bel is not recognized by the model. + * @return Logic delay in ps. Return null if the connection does not exist. */ public Short getLogicDelay(short belIdx, String frBelPin, String toBelPin); diff --git a/src/com/xilinx/rapidwright/timing/SmallDelayModel.java b/src/com/xilinx/rapidwright/timing/SmallDelayModel.java index 4c618dd2b..ad27ab635 100644 --- a/src/com/xilinx/rapidwright/timing/SmallDelayModel.java +++ b/src/com/xilinx/rapidwright/timing/SmallDelayModel.java @@ -65,10 +65,10 @@ public Short getBELIndex(String belName) { /** * Implement the method with the same signature defined in DelayModel interface. */ - public Short getIntraSiteDelay(SiteTypeEnum siteTypeName, String frBelPin, String toBelPin) { + public Short getIntraSiteDelay(SiteTypeEnum siteType, String frBelPin, String toBelPin) { boolean verbose = false; Short delay; - Short idx = site2IdxMap.get(siteTypeName.name()); + Short idx = site2IdxMap.get(siteType.name()); if (idx == null) { return null; // throw new IllegalArgumentException("SmallDelayModel: Unknown site/belName to getIntraSiteDelay." @@ -80,7 +80,7 @@ public Short getIntraSiteDelay(SiteTypeEnum siteTypeName, String frBelPin, Strin if (delay == null) { if (verbose) { System.out.println("WARNING in SmallDelayModel: Unknown connection to getIntraSiteDelay." - + " site/belName " + siteTypeName + " frBelPin " + frBelPin + " toBelPin " + toBelPin); + + " site/belName " + siteType + " frBelPin " + frBelPin + " toBelPin " + toBelPin); } } }