26#define GEN_PASS_DEF_COMBINEASSERTLIKEPASS
27#include "circt/Dialect/Verif/Passes.h.inc"
57struct CombineAssertLikePass
58 : verif::impl::CombineAssertLikePassBase<CombineAssertLikePass> {
59 void runOnOperation()
override;
79 LogicalResult accumulateCondition(
84 auto condition = op.getProperty();
85 auto defop = op.getOperation();
86 Block *parent = defop->getBlock();
89 if (!isa<ltl::PropertyType, ltl::SequenceType>(condition.getType())) {
92 auto enable = op.getEnable();
98 builder.setInsertionPoint(defop);
101 comb::AndOp::create(builder, defop->getLoc(), condition, enable);
104 conds[parent].push_back(andop);
107 conds[parent].push_back(condition);
111 opsToErase[parent].push_back(defop);
118 template <
typename AT>
119 LogicalResult conjoinConditions(Operation *assertlike,
120 llvm::SmallVectorImpl<Value> &conds,
121 OpBuilder &builder) {
128 builder.setInsertionPointAfter(assertlike);
131 auto andop = comb::AndOp::create(builder, assertlike->getLoc(), conds,
135 AT::create(builder, andop.getLoc(), andop,
nullptr,
143 template <
typename AT>
144 LogicalResult conjoinAndErase(
147 OpBuilder &builder) {
149 for (
auto [parent, ops] : opsToErase) {
151 if (ops.size() > 1) {
153 if (
auto it = conds.find(parent); it != conds.end())
155 if (failed(conjoinConditions<AT>(ops.back(), conds[parent], builder)))
168void CombineAssertLikePass::runOnOperation() {
170 OpBuilder builder(hwModule);
175 hwModule.walk([&](Operation *op) {
177 if (
auto aop = dyn_cast<verif::AssertOp>(op))
178 if (failed(accumulateCondition(aop, assertConditions, assertsToErase,
180 return signalPassFailure();
181 if (
auto aop = dyn_cast<verif::AssumeOp>(op))
182 if (failed(accumulateCondition(aop, assumeConditions, assumesToErase,
184 return signalPassFailure();
189 if (failed(conjoinAndErase<verif::AssertOp>(assertConditions, assertsToErase,
191 return signalPassFailure();
194 if (failed(conjoinAndErase<verif::AssumeOp>(assumeConditions, assumesToErase,
196 return signalPassFailure();
199 assertConditions.clear();
200 assumeConditions.clear();
201 assertsToErase.clear();
202 assumesToErase.clear();
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.