From f2360b920f3b7a5eb4082189f1704cf7e053fc49 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Fri, 14 Apr 2023 18:28:39 -0700 Subject: [PATCH 1/2] Collapsed macro's ports' parent to be set properly Signed-off-by: Eddie Hung --- .../xilinx/rapidwright/edif/EDIFNetlist.java | 3 ++ .../rapidwright/edif/TestEDIFNetlist.java | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/com/xilinx/rapidwright/edif/EDIFNetlist.java b/src/com/xilinx/rapidwright/edif/EDIFNetlist.java index ddd8a1a16..fead5339f 100644 --- a/src/com/xilinx/rapidwright/edif/EDIFNetlist.java +++ b/src/com/xilinx/rapidwright/edif/EDIFNetlist.java @@ -1676,6 +1676,9 @@ public void collapseMacroUnisims(Series series) { for (EDIFCell cell : reinsert) { prims.removeCell(cell); prims.addCell(cell); + for (EDIFPort port : cell.getPorts()) { + port.setParentCell(cell); + } } for (String name : primsToRemoveOnCollapse) { diff --git a/test/src/com/xilinx/rapidwright/edif/TestEDIFNetlist.java b/test/src/com/xilinx/rapidwright/edif/TestEDIFNetlist.java index bf4e574ee..9cc8048d3 100644 --- a/test/src/com/xilinx/rapidwright/edif/TestEDIFNetlist.java +++ b/test/src/com/xilinx/rapidwright/edif/TestEDIFNetlist.java @@ -104,6 +104,35 @@ void testMacroExpansionException(@TempDir Path tempDir) { Assertions.assertFalse(testDesign2.getNetlist().getHDIPrimitivesLibrary().containsCell("OBUFDS_DUAL_BUF")); } + @Test + void testMacroExpansionPortParents() { + final Part part = PartNameTools.getPart(Device.KCU105); + Design testDesign = createSamplePrimitiveDesign("OBUFDS", part); + + EDIFCell cell = testDesign.getNetlist().getHDIPrimitivesLibrary().getCell("OBUFDS"); + for (EDIFPort p : cell.getPorts()) { + Assertions.assertEquals(p.getParentCell(), cell); + } + + testDesign.getNetlist().expandMacroUnisims(part.getSeries()); + + EDIFCell expandedCell = testDesign.getNetlist().getHDIPrimitivesLibrary().getCell("OBUFDS_DUAL_BUF"); + Assertions.assertNotNull(expandedCell); + for (EDIFPort p : expandedCell.getPorts()) { + // Compare names because libraries are different ('p' is in UltraScale_macro_primitives library) + Assertions.assertNotEquals(p.getParentCell().getLibrary(), expandedCell.getLibrary()); + Assertions.assertEquals(p.getParentCell().getName(), expandedCell.getName()); + } + + testDesign.getNetlist().collapseMacroUnisims(part.getSeries()); + + EDIFCell collapsedCell = testDesign.getNetlist().getHDIPrimitivesLibrary().getCell("OBUFDS"); + Assertions.assertNotNull(collapsedCell); + for (EDIFPort p : collapsedCell.getPorts()) { + Assertions.assertEquals(p.getParentCell(), collapsedCell); + } + } + @Test public void testTrackChanges() { Design d = Design.readCheckpoint(RapidWrightDCP.getPath("microblazeAndILA_3pblocks.dcp"), true); From dab0e98d638a5f0913ee80dc9413c6613b1f4808 Mon Sep 17 00:00:00 2001 From: Eddie Hung Date: Mon, 24 Apr 2023 20:50:59 -0700 Subject: [PATCH 2/2] EDIFNetlist.expandMacroUnisims() to do a deep copy Signed-off-by: Eddie Hung --- src/com/xilinx/rapidwright/edif/EDIFNetlist.java | 5 +---- test/src/com/xilinx/rapidwright/edif/TestEDIFNetlist.java | 8 +++----- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/com/xilinx/rapidwright/edif/EDIFNetlist.java b/src/com/xilinx/rapidwright/edif/EDIFNetlist.java index fead5339f..fba55d696 100644 --- a/src/com/xilinx/rapidwright/edif/EDIFNetlist.java +++ b/src/com/xilinx/rapidwright/edif/EDIFNetlist.java @@ -1624,7 +1624,7 @@ public void expandMacroUnisims(Series series) { throw new RuntimeException("failed to find cell macro "+cellName+", we are in "+lib.getName()); } primsToRemoveOnCollapse.add(cellName); - EDIFCell copy = new EDIFCell(netlistPrims, macro); + EDIFCell copy = new EDIFCell(netlistPrims, macro, cellName); if (copy.getCellInsts().size() > 0) { for (EDIFCellInst copyInst : copy.getCellInsts()) { EDIFCell primCell = netlistPrims.getCell(copyInst.getCellType().getName()); @@ -1676,9 +1676,6 @@ public void collapseMacroUnisims(Series series) { for (EDIFCell cell : reinsert) { prims.removeCell(cell); prims.addCell(cell); - for (EDIFPort port : cell.getPorts()) { - port.setParentCell(cell); - } } for (String name : primsToRemoveOnCollapse) { diff --git a/test/src/com/xilinx/rapidwright/edif/TestEDIFNetlist.java b/test/src/com/xilinx/rapidwright/edif/TestEDIFNetlist.java index 9cc8048d3..ff01040af 100644 --- a/test/src/com/xilinx/rapidwright/edif/TestEDIFNetlist.java +++ b/test/src/com/xilinx/rapidwright/edif/TestEDIFNetlist.java @@ -74,7 +74,7 @@ private Design createSamplePrimitiveDesign(String prim, Part part) { final EDIFCell prototypePrim = Design.getPrimitivesLibrary().getCell(prim); - EDIFCell primCell = new EDIFCell(netlist.getHDIPrimitivesLibrary(), prototypePrim); + EDIFCell primCell = new EDIFCell(netlist.getHDIPrimitivesLibrary(), prototypePrim, prim); primCell.createCellInst("test" + prim, netlist.getTopCell()); @@ -111,7 +111,7 @@ void testMacroExpansionPortParents() { EDIFCell cell = testDesign.getNetlist().getHDIPrimitivesLibrary().getCell("OBUFDS"); for (EDIFPort p : cell.getPorts()) { - Assertions.assertEquals(p.getParentCell(), cell); + Assertions.assertSame(p.getParentCell(), cell); } testDesign.getNetlist().expandMacroUnisims(part.getSeries()); @@ -119,9 +119,7 @@ void testMacroExpansionPortParents() { EDIFCell expandedCell = testDesign.getNetlist().getHDIPrimitivesLibrary().getCell("OBUFDS_DUAL_BUF"); Assertions.assertNotNull(expandedCell); for (EDIFPort p : expandedCell.getPorts()) { - // Compare names because libraries are different ('p' is in UltraScale_macro_primitives library) - Assertions.assertNotEquals(p.getParentCell().getLibrary(), expandedCell.getLibrary()); - Assertions.assertEquals(p.getParentCell().getName(), expandedCell.getName()); + Assertions.assertSame(p.getParentCell(), expandedCell); } testDesign.getNetlist().collapseMacroUnisims(part.getSeries());