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