17 #include "mlir/IR/ImplicitLocOpBuilder.h"
19 using namespace circt;
20 using namespace firrtl;
23 class LowerMatchesPass :
public LowerMatchesBase<LowerMatchesPass> {
24 void runOnOperation()
override;
31 auto numCases = match->getNumRegions();
37 ImplicitLocOpBuilder b(match.getLoc(), match);
38 auto input = match.getInput();
39 for (
size_t i = 0; i < numCases - 1; ++i) {
41 auto condition = b.create<IsTagOp>(input, match.getFieldIndexAttr(i));
42 auto when = b.create<WhenOp>(condition,
true);
45 auto *thenBlock = &when.getThenBlock();
46 auto *caseBlock = &match.getRegion(i).front();
47 caseBlock->moveBefore(thenBlock);
51 b.setInsertionPointToStart(caseBlock);
52 auto data = b.create<SubtagOp>(input, match.getFieldIndexAttr(i));
53 caseBlock->getArgument(0).replaceAllUsesWith(
data);
54 caseBlock->eraseArgument(0);
57 b.setInsertionPointToStart(&when.getElseBlock());
64 auto data = b.create<SubtagOp>(input, match.getFieldIndexAttr(numCases - 1));
68 auto *caseBlock = &match->getRegions().back().front();
69 caseBlock->getArgument(0).replaceAllUsesWith(
data);
70 auto *defaultBlock = b.getInsertionBlock();
71 defaultBlock->getOperations().splice(b.getInsertionPoint(),
72 caseBlock->getOperations());
76 void LowerMatchesPass::runOnOperation() {
78 markAnalysesPreserved<InstanceGraph>();
82 return std::make_unique<LowerMatchesPass>();
static void lowerMatch(MatchOp match)
std::unique_ptr< mlir::Pass > createLowerMatchesPass()
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.