15#include "mlir/IR/Builders.h"
16#include "mlir/IR/OpImplementation.h"
17#include "mlir/IR/PatternMatch.h"
28#include "circt/Dialect/PIR/PIR.cpp.inc"
37 auto namesAttr = (*this)->getAttrOfType<ArrayAttr>(
"names");
40 if (!namesAttr.empty()) {
41 auto results = getResults();
44 for (
size_t i = 0; i < results.size(); ++i) {
46 if (
auto name = dyn_cast<StringAttr>(namesAttr[i])) {
47 setNameFn(results[i], name);
50 (*this)->emitOpError(
"Non-string attribute in string array!");
64 using OpRewritePattern<Op>::OpRewritePattern;
66 LogicalResult matchAndRewrite(Op op,
67 PatternRewriter &rewriter)
const override {
69 Value enable = op.getEnable();
74 auto enableConst = enable.getDefiningOp<hw::ConstantOp>();
75 if (!enableConst || !enableConst.getValue().isOne())
79 rewriter.modifyOpInPlace(op, [&]() { op.getEnableMutable().clear(); });
87 using OpRewritePattern<Op>::OpRewritePattern;
89 LogicalResult matchAndRewrite(Op op,
90 PatternRewriter &rewriter)
const override {
92 Value enable = op.getEnable();
97 auto enableConst = enable.getDefiningOp<hw::ConstantOp>();
98 if (!enableConst || !enableConst.getValue().isZero())
101 rewriter.eraseOp(op);
107template <
typename Op>
109 using OpRewritePattern<Op>::OpRewritePattern;
111 LogicalResult matchAndRewrite(Op op,
112 PatternRewriter &rewriter)
const override {
114 Value disable = op.getDisable();
119 auto disableConst = disable.getDefiningOp<hw::ConstantOp>();
120 if (!disableConst || !disableConst.getValue().isZero())
124 rewriter.modifyOpInPlace(op, [&]() { op.getDisableMutable().clear(); });
130template <
typename Op>
132 using OpRewritePattern<Op>::OpRewritePattern;
134 LogicalResult matchAndRewrite(Op op,
135 PatternRewriter &rewriter)
const override {
136 Value disable = op.getDisable();
142 auto disableConst = disable.getDefiningOp<hw::ConstantOp>();
143 if (!disableConst || !disableConst.getValue().isOne())
146 rewriter.eraseOp(op);
154template <
typename Op>
156 using OpRewritePattern<Op>::OpRewritePattern;
158 LogicalResult matchAndRewrite(Op op,
159 PatternRewriter &rewriter)
const override {
160 Value
property = op.getProperty();
163 if (
auto boolToProp =
164 property.template getDefiningOp<BoolToClockedPropOp>()) {
166 boolToProp.getInput().getDefiningOp<hw::ConstantOp>()) {
167 if (constOp.getValue().isOne()) {
168 rewriter.eraseOp(op);
177 if (
auto clkSeqToClkProp =
178 property.template getDefiningOp<ClockedSeqToClockedPropOp>()) {
179 if (
auto boolToClkSeq =
180 clkSeqToClkProp.getInput().getDefiningOp<BoolToClockedSeqOp>()) {
182 boolToClkSeq.getInput().getDefiningOp<hw::ConstantOp>()) {
183 if (constOp.getValue().isOne()) {
184 rewriter.eraseOp(op);
201void AssertPropertyOp::getCanonicalizationPatterns(RewritePatternSet &results,
203 results.add<EraseIfEnableFalse<AssertPropertyOp>,
204 EraseIfPropertyTrivial<AssertPropertyOp>,
205 EraseIfDisableTrue<AssertPropertyOp>,
206 RemoveEnableTrue<AssertPropertyOp>,
207 RemoveDisableFalse<AssertPropertyOp>>(
context);
210void AssumePropertyOp::getCanonicalizationPatterns(RewritePatternSet &results,
212 results.add<EraseIfEnableFalse<AssumePropertyOp>,
213 EraseIfPropertyTrivial<AssumePropertyOp>,
214 EraseIfDisableTrue<AssumePropertyOp>,
215 RemoveEnableTrue<AssumePropertyOp>,
216 RemoveDisableFalse<AssumePropertyOp>>(
context);
219void RestrictOp::getCanonicalizationPatterns(RewritePatternSet &results,
222 .add<EraseIfEnableFalse<RestrictOp>, EraseIfPropertyTrivial<RestrictOp>,
223 EraseIfDisableTrue<RestrictOp>, RemoveEnableTrue<RestrictOp>,
224 RemoveDisableFalse<RestrictOp>>(
context);
227void CoverPropertyOp::getCanonicalizationPatterns(RewritePatternSet &results,
229 results.add<EraseIfEnableFalse<CoverPropertyOp>,
230 EraseIfPropertyTrivial<CoverPropertyOp>,
231 EraseIfDisableTrue<CoverPropertyOp>,
232 RemoveEnableTrue<CoverPropertyOp>,
233 RemoveDisableFalse<CoverPropertyOp>>(
context);
242ClockedSeqToClockedPropOp::canonicalize(ClockedSeqToClockedPropOp op,
243 PatternRewriter &rewriter) {
244 if (
auto bToClkSeq = op.getInput().getDefiningOp<BoolToClockedSeqOp>()) {
245 rewriter.replaceOpWithNewOp<BoolToClockedPropOp>(op, bToClkSeq.getInput());
257ClockedOp::inferReturnTypes(MLIRContext *
context, std::optional<Location> loc,
258 ValueRange operands, DictionaryAttr attributes,
259 PropertyRef properties, RegionRange regions,
260 SmallVectorImpl<Type> &inferredReturnTypes) {
261 if (isa<ClockedPropertyType>(operands[1].getType())) {
262 inferredReturnTypes.push_back(ClockedPropertyType::get(
context));
264 inferredReturnTypes.push_back(ClockedSequenceType::get(
context));
static std::unique_ptr< Context > context
false return failure()
Parse an optional keyword or string and set instance into 'result'.
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
function_ref< void(Value, StringRef)> OpAsmSetValueNameFn