CIRCT 20.0.0git
Loading...
Searching...
No Matches
HWToSV.cpp
Go to the documentation of this file.
1//===- HWToSV.cpp - HW To SV Conversion Pass ------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This is the main HW to SV Conversion Pass Implementation.
10//
11//===----------------------------------------------------------------------===//
12
16#include "mlir/Pass/Pass.h"
17#include "mlir/Transforms/DialectConversion.h"
18#include "llvm/ADT/TypeSwitch.h"
19
20namespace circt {
21#define GEN_PASS_DEF_LOWERHWTOSV
22#include "circt/Conversion/Passes.h.inc"
23} // namespace circt
24
25using namespace mlir;
26using namespace circt;
27using namespace hw;
28using namespace sv;
29
30static sv::EventControl hwToSvEventControl(hw::EventControl ec) {
31 switch (ec) {
32 case hw::EventControl::AtPosEdge:
33 return sv::EventControl::AtPosEdge;
34 case hw::EventControl::AtNegEdge:
35 return sv::EventControl::AtNegEdge;
36 case hw::EventControl::AtEdge:
37 return sv::EventControl::AtEdge;
38 }
39 llvm_unreachable("Unknown event control kind");
40}
41
42namespace {
43struct HWToSVPass : public circt::impl::LowerHWToSVBase<HWToSVPass> {
44 void runOnOperation() override;
45};
46
47struct TriggeredOpConversionPattern : public OpConversionPattern<TriggeredOp> {
49
50 LogicalResult
51 matchAndRewrite(TriggeredOp op, OpAdaptor operands,
52 ConversionPatternRewriter &rewriter) const override {
53 auto alwaysOp = rewriter.create<AlwaysOp>(
54 op.getLoc(),
55 llvm::SmallVector<sv::EventControl>{hwToSvEventControl(op.getEvent())},
56 llvm::SmallVector<Value>{op.getTrigger()});
57 rewriter.mergeBlocks(op.getBodyBlock(), alwaysOp.getBodyBlock(),
58 operands.getInputs());
59 rewriter.eraseOp(op);
60 return success();
61 }
62};
63
64} // namespace
65
66void HWToSVPass::runOnOperation() {
67 MLIRContext &context = getContext();
68 hw::HWModuleOp module = getOperation();
69
70 ConversionTarget target(context);
71 RewritePatternSet patterns(&context);
72
73 target.addIllegalOp<TriggeredOp>();
74 target.addLegalDialect<sv::SVDialect>();
75
76 patterns.add<TriggeredOpConversionPattern>(&context);
77
78 if (failed(applyPartialConversion(module, target, std::move(patterns))))
79 signalPassFailure();
80}
81
82//===----------------------------------------------------------------------===//
83// HW to SV Conversion Pass
84//===----------------------------------------------------------------------===//
85
86std::unique_ptr<OperationPass<hw::HWModuleOp>> circt::createLowerHWToSVPass() {
87 return std::make_unique<HWToSVPass>();
88}
static sv::EventControl hwToSvEventControl(hw::EventControl ec)
Definition HWToSV.cpp:30
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
std::unique_ptr< mlir::OperationPass< hw::HWModuleOp > > createLowerHWToSVPass()
Definition HWToSV.cpp:86
Definition hw.py:1
Definition sv.py:1