16#include "mlir/Pass/Pass.h"
20#define GEN_PASS_DEF_FOLDVALUEFORMATTERS
21#include "circt/Dialect/Sim/SimPasses.h.inc"
29struct FoldValueFormattersPass
30 : impl::FoldValueFormattersBase<FoldValueFormattersPass> {
32 void runOnOperation()
override;
36void FoldValueFormattersPass::runOnOperation() {
38 bool anyChanged =
false;
39 OpBuilder builder(getOperation());
41 getOperation().getBody()->walk([&](Operation *op) {
43 if (!isa_and_nonnull<SimDialect>(op->getDialect()))
45 auto valFmtOp = dyn_cast<ValueFormatter>(op);
48 auto fmtValue = getFormattedValue(op);
49 auto *valDefOp = fmtValue.getDefiningOp();
50 if (!valDefOp || !valDefOp->hasTrait<OpTrait::ConstantLike>())
53 SmallVector<OpFoldResult, 1> foldResult;
54 if (failed(valDefOp->fold((foldResult))))
56 auto opResultIdx = cast<OpResult>(fmtValue).getResultNumber();
57 assert((foldResult.size() > opResultIdx &&
58 isa<Attribute>(foldResult[opResultIdx])) &&
59 "ConstantLike operation should fold to constant attributes");
62 valFmtOp.formatConstant(cast<Attribute>(foldResult[opResultIdx]));
66 builder.setInsertionPoint(valFmtOp);
68 FormatLiteralOp::create(builder, valFmtOp.getLoc(), stringConst);
69 assert(valFmtOp.getOperation()->getNumResults() == 1);
70 valFmtOp.getOperation()->getResult(0).replaceAllUsesWith(
71 literalOp.getResult());
72 valFmtOp.getOperation()->erase();
77 markAllAnalysesPreserved();
assert(baseType &&"element must be base type")
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.