15#include "mlir/IR/PatternMatch.h"
16#include "mlir/Transforms/DialectConversion.h"
19#define GEN_PASS_DEF_AIEPLACETILES
20#include "aie/Dialect/AIE/Transforms/AIEPasses.h.inc"
23#define DEBUG_TYPE "aie-place-tiles"
32 ConvertLogicalTileToTile(MLIRContext *context, DeviceOp &d,
Placer &p,
33 PatternBenefit benefit = 1)
37 matchAndRewrite(LogicalTileOp logicalTile, OpAdaptor adaptor,
38 ConversionPatternRewriter &rewriter)
const override {
39 auto placement = placer.getPlacement(logicalTile);
41 return logicalTile.emitError(
"no placement found for logical tile");
45 TileOp::getOrCreate(rewriter, device, placement->col, placement->row);
47 if (
auto scheme = logicalTile.getAllocationScheme())
48 tileOp.setAllocationScheme(scheme);
50 rewriter.replaceOp(logicalTile, tileOp.getResult());
59struct AIEPlaceTilesPass
60 : xilinx::AIE::impl::AIEPlaceTilesBase<AIEPlaceTilesPass> {
61 void runOnOperation()
override {
62 DeviceOp device = getOperation();
65 std::shared_ptr<Placer> placer;
66 switch (clPlacerType) {
67 case PlacerType::SequentialPlacer: {
68 std::optional<int> coresPerCol = std::nullopt;
69 if (clCoresPerCol >= 0)
70 coresPerCol = clCoresPerCol;
71 placer = std::make_shared<SequentialPlacer>(coresPerCol);
76 placer->initialize(device.getTargetModel());
77 if (failed(placer->place(device)))
78 return signalPassFailure();
80 ConversionTarget target(getContext());
81 target.addLegalOp<TileOp>();
82 target.addIllegalOp<LogicalTileOp>();
83 target.addLegalDialect<AIEDialect>();
85 RewritePatternSet patterns(&getContext());
86 patterns.add<ConvertLogicalTileToTile>(device.getContext(), device,
89 if (failed(applyPartialConversion(device, target, std::move(patterns))))
90 return signalPassFailure();
97 return std::make_unique<AIEPlaceTilesPass>();
Include the generated interface declarations.
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEPlaceTilesPass()