18 #include "mlir/IR/BuiltinTypes.h"
19 #include "mlir/IR/OperationSupport.h"
21 using namespace circt;
22 using namespace calyx;
33 auto control = component.getControlOp();
35 auto topLevel = *control.getRegion().getOps<EnableOp>().begin();
36 auto topLevelName = topLevel.getGroupName();
38 auto wires = component.getWiresOp();
39 Value componentGoPort = component.getGoPort();
40 wires.walk([&](GroupOp group) {
41 auto &groupRegion = group->getRegion(0);
46 auto groupDone = group.getDoneOp();
47 if (topLevelName == group.getSymName()) {
51 builder.create<AssignOp>(group->getLoc(), component.getDonePort(),
52 groupDone.getSrc(), groupDone.getGuard());
53 groupDone->replaceAllUsesWith(assignOp);
60 auto groupGo = group.getGoOp();
61 auto groupGoGuard = groupGo.getGuard();
62 groupGo.replaceAllUsesWith(groupGoGuard);
72 auto &wiresRegion = component.getWiresOp().getRegion();
73 auto &wireBlocks = wiresRegion.getBlocks();
74 auto lastBlock = wiresRegion.end();
77 wiresRegion.walk([&](GroupOp group) {
78 wireBlocks.splice(lastBlock, group.getRegion().getBlocks());
83 auto firstBlock = wireBlocks.begin();
84 for (
auto it = firstBlock, e = lastBlock; it != e; ++it) {
87 firstBlock->getOperations().splice(firstBlock->end(), it->getOperations());
91 while (&wiresRegion.front() != &wiresRegion.back())
92 wiresRegion.back().erase();
97 struct RemoveGroupsPass :
public RemoveGroupsBase<RemoveGroupsPass> {
98 void runOnOperation()
override;
103 void RemoveGroupsPass::runOnOperation() {
104 ComponentOp component = getOperation();
107 if (component.getControlOp().getOps().empty())
117 auto control = component.getControlOp();
118 control.walk([&](EnableOp enable) { enable->erase(); });
122 return std::make_unique<RemoveGroupsPass>();
static void modifyGroupOperations(ComponentOp component)
Makes several modifications to the operations of a GroupOp:
void inlineGroups(ComponentOp component)
Inlines each group in the WiresOp.
static void updateGroupAssignmentGuards(OpBuilder &builder, GroupOp &group, Op &op)
Updates the guard of each assignment within a group with op.
std::unique_ptr< mlir::Pass > createRemoveGroupsPass()
This file defines an intermediate representation for circuits acting as an abstraction for constraint...