public class ConnectMMCM { public static void main(String[] args) { if(args.length != 1) { System.out.println("USAGE: <dcp_file_name>"); return; } Design design = Design.readCheckpoint(args[0]);
Cell led0 = design.createAndPlaceIOB("led0", PinType.OUT, "D6", "LVCMOS33"); Cell mmcm = null; for(Cell c : design.getCells()){ if(c.getBEL().getName().contains("BUFCE")) { if(c.getSiteInst().getName().contains("BUFGCE_X0Y122")) { mmcm = c; } } } System.out.println(mmcm); Net clkout_net = design.createNet("clkout_net"); clkout_net.connect(led0, "I"); clkout_net.connect(mmcm, "O"); design.routeSites(); new Router(design).routeDesign(); design.writeCheckpoint("HelloWorld.dcp"); }}
jiangwx@mb450itx:~/2020/RapidWright/RapidWright$ java com.xilinx.rapidwright.examples.ConnectMMCM workspace/zcu104_rw1/zcu104_rw1.runs/impl_1/step1_wrapper_routed.dcp ================================================================================ Reading DCP: step1_wrapper_routed.dcp ================================================================================ XML Parse & Device Load: 0.712s EDIF Parse: 1.214s Read XDEF Header: 0.013s Read XDEF Caches: 0.060s Read XDEF Placement: 0.635s Read XDEF Routing: 0.544s------------------------------------------------------------------------------ [No GC] *Total*: 3.177sstep1_i/clk_wiz_0/inst/CLK_CORE_DRP_I/clk_inst/clkout1_buf(BEL: BUFCE)Exception in thread "main" java.lang.RuntimeException: ERROR: Unable to route step1_i/clk_wiz_0/inst/CLK_CORE_DRP_I/p_0_out__0__0_i_43_n_0 in site SLICE_X59Y179 at com.xilinx.rapidwright.design.SiteInst.routeSite(Unknown Source) at com.xilinx.rapidwright.design.Design.routeSites(Unknown Source) at com.xilinx.rapidwright.examples.ConnectMMCM.main(ConnectMMCM.java:38)
mmcm = d.getSiteInstFromSiteName("BUFGCE_X0Y122").getCell("BUFCE");
import java.util.ArrayList;
import com.xilinx.rapidwright.design.Cell;import com.xilinx.rapidwright.design.Design;import com.xilinx.rapidwright.design.PinType;import com.xilinx.rapidwright.design.SitePinInst;import com.xilinx.rapidwright.edif.EDIFHierPortInst;import com.xilinx.rapidwright.edif.EDIFNet;import com.xilinx.rapidwright.edif.EDIFNetlist;import com.xilinx.rapidwright.edif.EDIFTools;import com.xilinx.rapidwright.router.Router;
public class ConnectMMCM { public static void main(String[] args) { if(args.length != 1) { System.out.println("USAGE: <dcp_file_name>"); return; } Design design = Design.readCheckpoint(args[0]);
// Create our D6 input clock IO Cell clkInputIO = design.createAndPlaceIOB("clkInputIO", PinType.IN, "D6", "LVCMOS33"); // Grab a hold of the current BUFG being driven by the MMCM Cell mmcmBUFG = design.getSiteInstFromSiteName("BUFGCE_X0Y122").getCell("BUFCE"); System.out.println(mmcmBUFG);
// Create our new net driven by the clk from D6 String clkInputNetName = "myNewClkNet"; Net clkInputNet = design.createNet(clkInputNetName); clkInputNet.connect(clkInputIO, "O"); // Disconnect it logically from the MMCM EDIFNet targetNet = mmcmBUFG.getEDIFCellInst().getPortInst("I").getNet(); targetNet.removePortInst("mmcme4_adv_inst/CLKOUT0"); // Disconnect it physically from the MMCM SitePinInst sink = mmcmBUFG.getSitePinFromLogicalPin("I", null); sink.getNet().removeSource(); clkInputNet.addPin(sink); // Logically connect the clk net through levels of hierarchy to reach the MMCM BUFG EDIFHierPortInst src = new EDIFHierPortInst( EDIFNetlist.getHierParentName(clkInputNet.getName()), clkInputNet.getLogicalNet().getPortInst("clkInputIO_IBUF_inst/O") ); EDIFHierPortInst snk = new EDIFHierPortInst( EDIFNetlist.getHierParentName(mmcmBUFG.getName()), targetNet.getPortInst("clkout1_buf/I") ); EDIFTools.connectPortInstsThruHier(src, snk, design.getNetlist(), clkInputNetName); // Route just the sites we touched clkInputIO.getSiteInst().routeSite(); mmcmBUFG.getSiteInst().routeSite();
// Just route the MMCM BUFG input pin, keep everything else the same Router router = new Router(design); ArrayList<SitePinInst> sinks = new ArrayList<>(); sinks.add(sink); router.routePinsReEntrant(sinks, false);
design.writeCheckpoint("ClockSourcedFromD6.dcp"); }}