14 #include "../PassDetail.h"
17 #include "mlir/Transforms/DialectConversion.h"
18 #include "llvm/ADT/TypeSwitch.h"
21 using namespace circt;
27 case hw::EventControl::AtPosEdge:
28 return sv::EventControl::AtPosEdge;
29 case hw::EventControl::AtNegEdge:
30 return sv::EventControl::AtNegEdge;
31 case hw::EventControl::AtEdge:
32 return sv::EventControl::AtEdge;
34 llvm_unreachable(
"Unknown event control kind");
38 struct HWToSVPass :
public LowerHWToSVBase<HWToSVPass> {
39 void runOnOperation()
override;
46 matchAndRewrite(TriggeredOp op, OpAdaptor operands,
47 ConversionPatternRewriter &rewriter)
const override {
48 auto alwaysOp = rewriter.create<AlwaysOp>(
51 llvm::SmallVector<Value>{op.getTrigger()});
52 rewriter.mergeBlocks(op.getBodyBlock(), alwaysOp.getBodyBlock(),
53 operands.getInputs());
61 void HWToSVPass::runOnOperation() {
62 MLIRContext &context = getContext();
65 ConversionTarget target(context);
66 RewritePatternSet
patterns(&context);
68 target.addIllegalOp<TriggeredOp>();
69 target.addLegalDialect<sv::SVDialect>();
71 patterns.add<TriggeredOpConversionPattern>(&context);
73 if (failed(applyPartialConversion(module, target, std::move(
patterns))))
82 return std::make_unique<HWToSVPass>();
static sv::EventControl hwToSvEventControl(hw::EventControl ec)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
std::unique_ptr< mlir::OperationPass< hw::HWModuleOp > > createLowerHWToSVPass()