[HW] Fix more bugs related to input/output specific functions.

Fix more hold-overs from when input and output were split.

See #6707
This commit is contained in:
Andrew Lenharth 2024-02-16 10:45:51 -06:00
parent cef977a7e5
commit 9e0c1696f3
3 changed files with 28 additions and 28 deletions

View File

@ -65,7 +65,7 @@ def HWModuleLike : OpInterface<"HWModuleLike", [
"SmallVector<Location>", "getAllPortLocs", (ins)>,
InterfaceMethod<"Set the port Locations",
"void", "setAllPortLocs", (ins "ArrayRef<Location>":$locs)>,
"void", "setAllPortLocsAttrs", (ins "ArrayRef<Attribute>":$locs)>,
InterfaceMethod<"Set the module type (and port names)",
"void", "setHWModuleType", (ins "::circt::hw::ModuleType":$type)>,
@ -259,6 +259,11 @@ def HWModuleLike : OpInterface<"HWModuleLike", [
$_op.setAllPortAttrs(attrs);
}
void setAllPortLocs(ArrayRef<Location> locs) {
std::vector<Attribute> nLocs(locs.begin(), locs.end());
$_op.setAllPortLocsAttrs(nLocs);
}
Location getPortLoc(size_t idx) {
return $_op.getAllPortLocs()[idx];
}
@ -293,13 +298,14 @@ def HWModuleLike : OpInterface<"HWModuleLike", [
return ArrayAttr::get($_op->getContext(), retval);
}
void setInputLocs(ArrayRef<Location> inAttrs) {
assert(inAttrs.size() == $_op.getNumInputPorts());
auto outAttrs = getOutputLocs();
SmallVector<Location> attrs;
attrs.append(inAttrs.begin(), inAttrs.end());
attrs.append(outAttrs.begin(), outAttrs.end());
$_op.setAllPortLocs(attrs);
void setInputLocs(ArrayRef<Location> inLocs) {
assert(inLocs.size() == $_op.getNumInputPorts());
auto type = $_op.getHWModuleType();
SmallVector<Location> newLocs($_op.getAllPortLocs());
for (size_t idx = 0, e = inLocs.size(); idx != e; ++idx)
newLocs[type.getPortIdForInputId(idx)] = inLocs[idx];
$_op.setAllPortLocs(newLocs);
}
SmallVector<Location> getOutputLocs() {
@ -318,13 +324,13 @@ def HWModuleLike : OpInterface<"HWModuleLike", [
return ArrayAttr::get($_op->getContext(), retval);
}
void setOutputLocs(ArrayRef<Location> outAttrs) {
assert(outAttrs.size() == $_op.getNumOutputPorts());
auto inAttrs = getInputLocs();
SmallVector<Location> attrs;
attrs.append(inAttrs.begin(), inAttrs.end());
attrs.append(outAttrs.begin(), outAttrs.end());
$_op.setAllPortLocs(attrs);
void setOutputLocs(ArrayRef<Location> outLocs) {
assert(outLocs.size() == $_op.getNumOutputPorts());
auto type = $_op.getHWModuleType();
SmallVector<Location> newLocs($_op.getAllPortLocs());
for (size_t idx = 0, e = outLocs.size(); idx != e; ++idx)
newLocs[type.getPortIdForOutputId(idx)] = outLocs[idx];
$_op.setAllPortLocs(newLocs);
}
}];

View File

@ -598,7 +598,7 @@ SmallVector<Location> ESIPureModuleOp::getAllPortLocs() {
return retval;
}
void ESIPureModuleOp::setAllPortLocs(ArrayRef<Location> locs) {
void ESIPureModuleOp::setAllPortLocsAttrs(ArrayRef<Attribute> locs) {
emitError("No ports for port locations");
}

View File

@ -1246,13 +1246,7 @@ SmallVector<Location> HWModuleGeneratedOp::getAllPortLocs() {
return ::getAllPortLocs(*this);
}
template <typename ModTy>
static void setAllPortLocs(ArrayRef<Location> locs, ModTy module) {
std::vector<Attribute> nLocs(locs.begin(), locs.end());
module.setPortLocsAttr(ArrayAttr::get(module.getContext(), nLocs));
}
void HWModuleOp::setAllPortLocs(ArrayRef<Location> locs) {
void HWModuleOp::setAllPortLocsAttrs(ArrayRef<Attribute> locs) {
SmallVector<Attribute> resultLocs;
unsigned inputCount = 0;
auto modType = getModuleType();
@ -1261,17 +1255,17 @@ void HWModuleOp::setAllPortLocs(ArrayRef<Location> locs) {
if (modType.isOutput(i))
resultLocs.push_back(locs[i]);
else
body->getArgument(inputCount++).setLoc(locs[i]);
body->getArgument(inputCount++).setLoc(cast<Location>(locs[i]));
}
setResultLocsAttr(ArrayAttr::get(getContext(), resultLocs));
}
void HWModuleExternOp::setAllPortLocs(ArrayRef<Location> locs) {
::setAllPortLocs(locs, *this);
void HWModuleExternOp::setAllPortLocsAttrs(ArrayRef<Attribute> locs) {
setPortLocsAttr(ArrayAttr::get(getContext(), locs));
}
void HWModuleGeneratedOp::setAllPortLocs(ArrayRef<Location> locs) {
::setAllPortLocs(locs, *this);
void HWModuleGeneratedOp::setAllPortLocsAttrs(ArrayRef<Attribute> locs) {
setPortLocsAttr(ArrayAttr::get(getContext(), locs));
}
template <typename ModTy>