14 #include "../PassDetail.h"
19 #include "mlir/Transforms/DialectConversion.h"
20 #include "llvm/ADT/TypeSwitch.h"
23 using namespace circt;
25 using namespace verif;
37 matchAndRewrite(PrintOp op, OpAdaptor operands,
38 ConversionPatternRewriter &rewriter)
const override {
42 op.getLoc(), APInt(32, 0x80000001,
false));
45 dyn_cast_or_null<FormatVerilogStringOp>(op.getString().getDefiningOp());
47 return op->emitOpError() <<
"expected FormatVerilogStringOp as the "
48 "source of the formatted string";
50 rewriter.replaceOpWithNewOp<sv::FWriteOp>(
51 op, fdStdout, fstrOp.getFormatString(), fstrOp.getSubstitutions());
60 matchAndRewrite(HasBeenResetOp op, OpAdaptor operands,
61 ConversionPatternRewriter &rewriter)
const override {
62 auto i1 = rewriter.getI1Type();
63 auto constOne = rewriter.create<
hw::ConstantOp>(op.getLoc(), i1, 1);
65 auto constX = rewriter.
create<sv::ConstantXOp>(op.getLoc(), i1);
69 op.getLoc(), i1, rewriter.getStringAttr(
"hasBeenResetReg"));
71 auto clock = operands.getClock();
72 auto reset = operands.getReset();
81 rewriter.create<sv::InitialOp>(op.getLoc(), [&] {
82 auto assignOne = [&] {
83 rewriter.create<sv::BPAssignOp>(op.getLoc(),
reg, constOne);
86 rewriter.create<sv::BPAssignOp>(op.getLoc(),
reg, constX);
89 rewriter.create<sv::IfOp>(op.getLoc(), reset, assignOne, assignX);
97 Value triggerOn = op.getAsync() ? reset : clock;
98 rewriter.create<sv::AlwaysOp>(
99 op.getLoc(), sv::EventControl::AtPosEdge, triggerOn, [&] {
100 auto assignOne = [&] {
101 rewriter.create<sv::PAssignOp>(op.getLoc(),
reg, constOne);
106 rewriter.create<sv::IfOp>(op.getLoc(), reset, assignOne);
112 auto regIsOne = rewriter.createOrFold<comb::ICmpOp>(
113 op.getLoc(), comb::ICmpPredicate::ceq, regRead, constOne);
114 auto resetIsZero = rewriter.createOrFold<comb::ICmpOp>(
115 op.getLoc(), comb::ICmpPredicate::ceq, reset, constZero);
116 auto resetStartedAndEnded = rewriter.createOrFold<
comb::AndOp>(
117 op.getLoc(), regIsOne, resetIsZero,
true);
118 rewriter.replaceOpWithNewOp<hw::WireOp>(
119 op, resetStartedAndEnded, rewriter.getStringAttr(
"hasBeenReset"));
132 struct VerifToSVPass :
public LowerVerifToSVBase<VerifToSVPass> {
133 void runOnOperation()
override;
137 void VerifToSVPass::runOnOperation() {
138 MLIRContext &context = getContext();
141 ConversionTarget target(context);
142 RewritePatternSet
patterns(&context);
144 target.addIllegalOp<PrintOp, HasBeenResetOp>();
145 target.addLegalDialect<sv::SVDialect, hw::HWDialect, comb::CombDialect>();
146 patterns.add<PrintOpConversionPattern, HasBeenResetConversion>(&context);
148 if (failed(applyPartialConversion(module, target, std::move(
patterns))))
152 std::unique_ptr<OperationPass<hw::HWModuleOp>>
154 return std::make_unique<VerifToSVPass>();
def create(data_type, value)
This file defines an intermediate representation for circuits acting as an abstraction for constraint...
std::unique_ptr< OperationPass< hw::HWModuleOp > > createLowerVerifToSVPass()
Create the Verif to SV conversion pass.
def reg(value, clock, reset=None, reset_value=None, name=None, sym_name=None)