Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds a tieoff method for module instances with unconnected inputs #811

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
81 changes: 80 additions & 1 deletion src/com/xilinx/rapidwright/design/ModuleInst.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@
import com.xilinx.rapidwright.device.SiteTypeEnum;
import com.xilinx.rapidwright.device.Tile;
import com.xilinx.rapidwright.edif.EDIFCell;
import com.xilinx.rapidwright.edif.EDIFNet;
import com.xilinx.rapidwright.edif.EDIFPortInst;
import com.xilinx.rapidwright.edif.EDIFTools;
import com.xilinx.rapidwright.util.MessageGenerator;
import com.xilinx.rapidwright.util.Utils;

Expand Down Expand Up @@ -469,7 +472,11 @@ private SitePinInst getCorrespondingPin(SitePinInst modulePin) {
if (newSiteInst == null) {
throw new RuntimeException("Did not find corresponding Site Inst for "+modulePin.getSiteInst().getName()+" in "+getName());
}
return newSiteInst.getSitePinInst(modulePin.getName());
SitePinInst pin = newSiteInst.getSitePinInst(modulePin.getName());
if (pin == null) {
pin = new SitePinInst(modulePin.getName(), newSiteInst);
}
return pin;
}

/**
Expand Down Expand Up @@ -713,6 +720,78 @@ public void connect(String portName, int busIndex0, ModuleInst other, String oth
}
}

/**
* Connects unconnected SitePinInst inputs on the module instance to either GND
* or VCC (some reset input use VCC as an input and use the inverter to drive
* GND).
clavin-xlnx marked this conversation as resolved.
Show resolved Hide resolved
*/
public void tieOffUnconnectedInputs(boolean verbose) {
for (Port port : getModule().getPorts()) {
if (port.isOutPort())
continue;

for (SitePinInst pin : getCorrespondingPins(port)) {
if (pin == null) {
System.err.println("ERROR: Problem encountered with finding corresponding SitePinInst on port "
+ getName() + "/" + port.getName() + " skipping...");
}
if (pin != null && (pin.getNet() == null || pin.getNet().getSource() == null)) {
boolean useVccInverter = pin.getName().contains("RST");
Copy link
Collaborator

@eddieh-xlnx eddieh-xlnx Sep 12, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems like an important condition to document the behaviour of.

The name of this boolean is useVccInverter but then when it gets passed to connectToStaticNet() it becomes its connectToVcc argument which does not seem to reconcile, because it doesn't look like this latter method does any inversion?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've modified the code to clarify and harmonize the usage.

if (verbose) {
System.out.println(getName() + "/" + port.getName() + " SitePinInst=[" + pin
+ "] has no source, connecting to " + (useVccInverter ? "VCC" : "GND"));
}
connectToStaticNet(port.getName(), useVccInverter);
}
break;
}
}
}

/**
* Connects a port (all of its corresponding SitePinInsts) to either the GND or
* VCC net.
*
* @param portName Name of the port to connect to GND or VCC
* @param connectToVCC True to connect to VCC, False for GND
*/
public void connectToStaticNet(String portName, boolean connectToVCC) {
NetType type = connectToVCC ? NetType.VCC : NetType.GND;
Net staticNet = getDesign().getStaticNet(type);

Port inPort = getPort(portName);
if (inPort.isOutPort()) {
throw new RuntimeException("ERROR: Attempting to connnect output port "
+ getName() + "/" + portName + " to " + staticNet);
}

// Connect logically
EDIFCell parent = getCellInst().getParentCell();
EDIFNet logicalStaticNet = EDIFTools.getStaticNet(type, parent, getDesign().getNetlist());
EDIFPortInst portInst = getCellInst().getPortInst(portName);
if (portInst == null) {
logicalStaticNet.createPortInst(portName, getCellInst());
} else {
portInst.getNet().removePortInst(portInst);
logicalStaticNet.addPortInst(portInst);
}
Comment on lines +814 to +823
Copy link
Collaborator

@eddieh-xlnx eddieh-xlnx Jan 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When connectToVCC is true, this would also make the port logically connected to VCC (whereas if you're relying on the inverter, shouldn't it be GND?)
EDIT: Perhaps not relevant if we stop inverting.


// Connect physically
for (SitePinInst inPin : getCorrespondingPins(inPort)) {
if (inPin == null) {
System.err.println("ERROR: Problem encountered with finding corresponding SitePinInst on port "
+ getName() + "/" + inPort.getName() + " skipping...");
continue;
}

Net oldPhysicalNet = inPin.getNet();
if (oldPhysicalNet != null) {
oldPhysicalNet.removePin(inPin, true);
}
staticNet.addPin(inPin);
}
}

@Override
public RelocatableTileRectangle getBoundingBox() {
return module.getBoundingBox().getCorresponding(getAnchor().getTile(), module.getAnchor().getTile());
Expand Down
Loading