Skip to content

Commit

Permalink
DesignTools.createCeSrRstPinsToVCC() to detect gnd to invert (#664)
Browse files Browse the repository at this point in the history
* DesignTools.createCeSrRstPinsToVCC() to detect gnd to invert

Signed-off-by: Eddie Hung <[email protected]>

* Update src/com/xilinx/rapidwright/design/DesignTools.java

Signed-off-by: eddieh-xlnx <[email protected]>

* Undo part of #636

Signed-off-by: Eddie Hung <[email protected]>

* Tidy up and add test

Signed-off-by: Eddie Hung <[email protected]>

* Remove unused imports

Signed-off-by: Eddie Hung <[email protected]>

* Update year

Signed-off-by: Eddie Hung <[email protected]>

---------

Signed-off-by: Eddie Hung <[email protected]>
Signed-off-by: eddieh-xlnx <[email protected]>
  • Loading branch information
eddieh-xlnx authored May 10, 2023
1 parent b66cb0f commit d6a6b5b
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 57 deletions.
93 changes: 71 additions & 22 deletions src/com/xilinx/rapidwright/design/DesignTools.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
Expand Down Expand Up @@ -2843,17 +2845,28 @@ public static void createA1A6ToStaticNets(Design design) {
* @param design Design object to be modified in-place.
*/
public static void createCeSrRstPinsToVCC(Design design) {
Series series = design.getDevice().getSeries();
if (series == Series.Series7) {
// Nothing to be done for Series7 which don't have inverters
return;
}
Net vcc = design.getVccNet();
Net gndInvertibleToVcc = null;
// On these series of devices, SR can be inverted from gnd to vcc
if (EnumSet.of(Series.UltraScale, Series.UltraScalePlus).contains(series)) {
gndInvertibleToVcc = design.getGndNet();
}
Map<String, Pair<String, String>> pinMapping = belTypeSitePinNameMapping.get(series);
for (Cell cell : design.getCells()) {
if (isUnisimFlipFlopType(cell.getType())) {
SiteInst si = cell.getSiteInst();
BEL bel = cell.getBEL();
Pair<String, String> sitePinNames = belSitePinNameMapping.get(bel.getBELType());
Pair<String, String> sitePinNames = pinMapping.get(bel.getBELType());
String[] pins = new String[] {"CE", "SR"};
for (String pin : pins) {
BELPin belPin = cell.getBEL().getPin(pin);
Net net = si.getNetFromSiteWire(belPin.getSiteWireName());
if (net == null) {
if (net == null || (net == gndInvertibleToVcc && pin.equals("SR"))) {
String sitePinName;
if (pin.equals("CE")) { // CKEN
sitePinName = sitePinNames.getFirst();
Expand Down Expand Up @@ -2955,27 +2968,63 @@ private static boolean isUnisimFlipFlopType(String cellType) {
return unisimFlipFlopTypes.contains(cellType);
}

static Map<String, Pair<String, String>> belSitePinNameMapping;
static public final Map<Series, Map<String, Pair<String, String>>> belTypeSitePinNameMapping;
static{
belSitePinNameMapping = new HashMap<>();

belSitePinNameMapping.put("AFF", new Pair<>("CKEN1", "SRST1"));
belSitePinNameMapping.put("BFF", new Pair<>("CKEN1", "SRST1"));
belSitePinNameMapping.put("CFF", new Pair<>("CKEN1", "SRST1"));
belSitePinNameMapping.put("DFF", new Pair<>("CKEN1", "SRST1"));
belSitePinNameMapping.put("AFF2", new Pair<>("CKEN2", "SRST1"));
belSitePinNameMapping.put("BFF2", new Pair<>("CKEN2", "SRST1"));
belSitePinNameMapping.put("CFF2", new Pair<>("CKEN2", "SRST1"));
belSitePinNameMapping.put("DFF2", new Pair<>("CKEN2", "SRST1"));

belSitePinNameMapping.put("EFF", new Pair<>("CKEN3", "SRST2"));
belSitePinNameMapping.put("FFF", new Pair<>("CKEN3", "SRST2"));
belSitePinNameMapping.put("GFF", new Pair<>("CKEN3", "SRST2"));
belSitePinNameMapping.put("HFF", new Pair<>("CKEN3", "SRST2"));
belSitePinNameMapping.put("EFF2", new Pair<>("CKEN4", "SRST2"));
belSitePinNameMapping.put("FFF2", new Pair<>("CKEN4", "SRST2"));
belSitePinNameMapping.put("GFF2", new Pair<>("CKEN4", "SRST2"));
belSitePinNameMapping.put("HFF2", new Pair<>("CKEN4", "SRST2"));
belTypeSitePinNameMapping = new EnumMap(Series.class);
Pair<String,String> p;

{
Map<String, Pair<String, String>> ultraScalePlus = new HashMap<>();
belTypeSitePinNameMapping.put(Series.UltraScalePlus, ultraScalePlus);

p = new Pair<>("CKEN1", "SRST1");
ultraScalePlus.put("AFF", p);
ultraScalePlus.put("BFF", p);
ultraScalePlus.put("CFF", p);
ultraScalePlus.put("DFF", p);
p = new Pair<>("CKEN2", "SRST1");
ultraScalePlus.put("AFF2", p);
ultraScalePlus.put("BFF2", p);
ultraScalePlus.put("CFF2", p);
ultraScalePlus.put("DFF2", p);

p = new Pair<>("CKEN3", "SRST2");
ultraScalePlus.put("EFF", p);
ultraScalePlus.put("FFF", p);
ultraScalePlus.put("GFF", p);
ultraScalePlus.put("HFF", p);
p = new Pair<>("CKEN4", "SRST2");
ultraScalePlus.put("EFF2", p);
ultraScalePlus.put("FFF2", p);
ultraScalePlus.put("GFF2", p);
ultraScalePlus.put("HFF2", p);
}
{
Map<String, Pair<String, String>> ultraScale = new HashMap<>();
belTypeSitePinNameMapping.put(Series.UltraScale, ultraScale);

p = new Pair<>("CKEN_B1", "SRST_B1");
ultraScale.put("AFF", p);
ultraScale.put("BFF", p);
ultraScale.put("CFF", p);
ultraScale.put("DFF", p);
p = new Pair<>("CKEN_B2", "SRST_B1");
ultraScale.put("AFF2", p);
ultraScale.put("BFF2", p);
ultraScale.put("CFF2", p);
ultraScale.put("DFF2", p);

p = new Pair<>("CKEN_B3", "SRST_B2");
ultraScale.put("EFF", p);
ultraScale.put("FFF", p);
ultraScale.put("GFF", p);
ultraScale.put("HFF", p);
p = new Pair<>("CKEN_B4", "SRST_B2");
ultraScale.put("EFF2", p);
ultraScale.put("FFF2", p);
ultraScale.put("GFF2", p);
ultraScale.put("HFF2", p);
}
}

/**
Expand Down
34 changes: 0 additions & 34 deletions src/com/xilinx/rapidwright/interchange/PhysNetlistReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,6 @@
import java.util.Queue;
import java.util.Set;

import com.xilinx.rapidwright.device.Series;
import com.xilinx.rapidwright.device.SitePIP;
import org.capnproto.MessageReader;
import org.capnproto.PrimitiveList;
import org.capnproto.ReaderOptions;
Expand Down Expand Up @@ -118,8 +116,6 @@ public static Design readPhysNetlist(String physNetlistFileName, EDIFNetlist net

readDesignProperties(physNetlist, design, allStrings);

postProcess(design);

return design;
}

Expand Down Expand Up @@ -800,34 +796,4 @@ else if (isPlaced != isCellPlaced) {
}
}
}

private static void postProcess(Design design) {
final Series series = design.getDevice().getSeries();

if (series == Series.UltraScalePlus || series == Series.UltraScale) {
// To be consistent with Vivado DCPs, remove all intra-site routing for
// SRST* pins tied to ground on these series of devices.
// (Note: this condition is necessary for {@link DesignTools#createCeSrRstPinsToVCC()})
String[] siteWires = new String[]{"RST_ABCDINV_OUT", "RST_EFGHINV_OUT"};
for (SiteInst si : design.getSiteInsts()) {
if (!Utils.isSLICE(si)) {
continue;
}
for (String sw : siteWires) {
Net net = si.getNetFromSiteWire(sw);
if (net != null && net.getType() == NetType.GND) {
BELPin belPin = si.getSiteWirePins(sw)[0];
assert(belPin.isOutput());
BEL bel = belPin.getBEL();
assert(bel.getBELClass() == BELClass.RBEL);
assert(bel.getInvertingPin() == bel.getNonInvertingPin());
SitePIP sp = si.getSitePIP(belPin);
Net inputNet = si.getNetFromSiteWire(sp.getInputPin().getSiteWireName());
assert(inputNet == null || inputNet.isStaticNet());
si.unrouteIntraSiteNet(sp.getInputPin(), sp.getOutputPin());
}
}
}
}
}
}
45 changes: 44 additions & 1 deletion test/src/com/xilinx/rapidwright/design/TestDesignTools.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2021-2022, Xilinx, Inc.
* Copyright (c) 2022, Advanced Micro Devices, Inc.
* Copyright (c) 2022-2023, Advanced Micro Devices, Inc.
* All rights reserved.
*
* Author: Chris Lavin, Xilinx Research Labs.
Expand Down Expand Up @@ -34,6 +34,7 @@
import java.util.Map.Entry;
import java.util.Set;

import com.xilinx.rapidwright.device.Series;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
Expand Down Expand Up @@ -905,4 +906,46 @@ public void testCalculateUtilization() {
}
}
}

@ParameterizedTest
@CsvSource({
// US+
Device.AWS_F1+",SLICE_X0Y0/AFF,SRST1,true",
Device.AWS_F1+",SLICE_X0Y0/AFF2,SRST1,false",
Device.AWS_F1+",SLICE_X1Y1/HFF,SRST2,true",
Device.AWS_F1+",SLICE_X1Y1/HFF2,SRST2,false",
// US
Device.KCU105+",SLICE_X0Y0/AFF,SRST_B1,true",
Device.KCU105+",SLICE_X0Y0/AFF2,SRST_B1,false",
Device.KCU105+",SLICE_X1Y1/HFF,SRST_B2,true",
Device.KCU105+",SLICE_X1Y1/HFF2,SRST_B2,false",
// Series7
Device.PYNQ_Z1+",SLICE_X0Y0/AFF,SR,true",
Device.PYNQ_Z1+",SLICE_X0Y0/A5FF,SR,false",
Device.PYNQ_Z1+",SLICE_X1Y1/DFF,SR,true",
Device.PYNQ_Z1+",SLICE_X1Y1/D5FF,SR,false",
})
public void testCreateCeSrRstPinsToVCC(String deviceName, String location, String sitePinName, boolean connectGnd) {
Design design = new Design("test", deviceName);
Cell c = design.createAndPlaceCell("ff", Unisim.FDRE, location);
BELPin sr = c.getBEL().getPin("SR");
SiteInst si = c.getSiteInst();
Assertions.assertNull(si.getNetFromSiteWire(sr.getSiteWireName()));
if (connectGnd) {
Net gnd = design.getGndNet();
Assertions.assertTrue(si.routeIntraSiteNet(gnd, sr, sr));
}

DesignTools.createCeSrRstPinsToVCC(design);

SitePinInst spi = si.getSitePinInst(sitePinName);
if (design.getDevice().getSeries() == Series.Series7) {
// Nothing done for Series7
Assertions.assertNull(spi);
} else {
Assertions.assertNotNull(spi);
Net vcc = design.getVccNet();
Assertions.assertEquals(vcc, spi.getNet());
}
}
}

0 comments on commit d6a6b5b

Please sign in to comment.