13#include "../PassDetails.h"
20#include "mlir/IR/BuiltinTypes.h"
21#include "mlir/Interfaces/ControlFlowInterfaces.h"
22#include "mlir/Pass/Pass.h"
23#include "mlir/Transforms/DialectConversion.h"
27#define GEN_PASS_DEF_LOWERESITYPES
28#include "circt/Dialect/ESI/ESIPasses.h.inc"
37struct ESILowerTypesPass
38 :
public circt::esi::impl::LowerESITypesBase<ESILowerTypesPass> {
39 void runOnOperation()
override;
45class LowerTypesConverter :
public TypeConverter {
47 LowerTypesConverter() {
48 addConversion([](Type t) {
return t; });
49 addConversion([](WindowType window) {
return window.getLoweredType(); });
50 addSourceMaterialization(wrapMaterialization);
51 addArgumentMaterialization(wrapMaterialization);
52 addTargetMaterialization(unwrapMaterialization);
56 static mlir::Value wrapMaterialization(OpBuilder &b, WindowType resultType,
57 ValueRange inputs, Location loc) {
58 if (inputs.size() != 1)
60 auto wrap = b.create<WrapWindow>(loc, resultType, inputs[0]);
61 return wrap.getWindow();
64 static mlir::Value unwrapMaterialization(OpBuilder &b,
65 hw::UnionType resultType,
66 ValueRange inputs, Location loc) {
67 if (inputs.size() != 1 || !isa<WindowType>(inputs[0].getType()))
69 auto unwrap = b.create<UnwrapWindow>(loc, resultType, inputs[0]);
75void ESILowerTypesPass::runOnOperation() {
76 ConversionTarget target(getContext());
79 target.markUnknownOpDynamicallyLegal([](Operation *op) {
80 return TypeSwitch<Operation *, bool>(op)
81 .Case([](igraph::InstanceOpInterface inst) {
83 llvm::any_of(inst->getOperandTypes(), hw::type_isa<WindowType>) ||
84 llvm::any_of(inst->getResultTypes(), hw::type_isa<WindowType>));
86 .Case([](hw::HWMutableModuleLike mod) {
88 return hw::type_isa<WindowType>(p.type);
90 return !(llvm::any_of(mod.getPortList(), isWindowPort));
92 .Default([](Operation *op) {
93 if (op->hasTrait<OpTrait::ReturnLike>())
94 return !llvm::any_of(op->getOperandTypes(),
95 hw::type_isa<WindowType>);
100 LowerTypesConverter types;
101 RewritePatternSet
patterns(&getContext());
104 applyPartialConversion(getOperation(), target, std::move(
patterns))))
108std::unique_ptr<OperationPass<ModuleOp>>
110 return std::make_unique<ESILowerTypesPass>();
return wrap(CMemoryType::get(unwrap(ctx), baseType, numElements))
static EvaluatorValuePtr unwrap(OMEvaluatorValue c)
std::unique_ptr< OperationPass< ModuleOp > > createESITypeLoweringPass()
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
Generic pattern which replaces an operation by one of the same operation name, but with converted att...
This holds the name, type, direction of a module's ports.