MLIR-AIE
AIELowerMulticast.cpp
Go to the documentation of this file.
1//===- AIELowerMulticast.cpp ------------------------------------*- C++ -*-===//
2//
3// This file is licensed under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7// (c) Copyright 2020 Xilinx Inc.
8//
9//===----------------------------------------------------------------------===//
10
14
15#include "mlir/IR/Attributes.h"
16#include "mlir/IR/PatternMatch.h"
17#include "mlir/Pass/Pass.h"
18#include "mlir/Tools/mlir-translate/MlirTranslateMain.h"
19#include "mlir/Transforms/DialectConversion.h"
20
21#include "llvm/ADT/Twine.h"
22
23namespace xilinx::AIEX {
24#define GEN_PASS_DEF_AIEMULTICAST
25#include "aie/Dialect/AIEX/Transforms/AIEXPasses.h.inc"
26} // namespace xilinx::AIEX
27
28#define DEBUG_TYPE "aie-lower-multicast"
29
30using namespace mlir;
31using namespace xilinx;
32using namespace xilinx::AIE;
33using namespace xilinx::AIEX;
34
35template <typename MyOp>
36struct AIEOpRemoval : public OpConversionPattern<MyOp> {
38 using OpAdaptor = typename MyOp::Adaptor;
39
40 AIEOpRemoval(MLIRContext *context, PatternBenefit benefit = 1)
41 : OpConversionPattern<MyOp>(context, benefit) {}
42
43 LogicalResult
44 matchAndRewrite(MyOp op, OpAdaptor adaptor,
45 ConversionPatternRewriter &rewriter) const override {
46 Operation *Op = op.getOperation();
47
48 rewriter.eraseOp(Op);
49 return success();
50 }
51};
52
54 : public xilinx::AIEX::impl::AIEMulticastBase<AIELowerMulticastPass> {
55 void runOnOperation() override {
56
57 DeviceOp device = getOperation();
58 OpBuilder builder = OpBuilder::atBlockTerminator(device.getBody());
59
60 for (auto multicast : device.getOps<MulticastOp>()) {
61 Region &r = multicast.getPorts();
62 Block &b = r.front();
63 Port sourcePort = multicast.port();
64 TileOp srcTile = dyn_cast<TileOp>(multicast.getTile().getDefiningOp());
65 for (Operation &Op : b.getOperations()) {
66 if (MultiDestOp multiDest = dyn_cast<MultiDestOp>(Op)) {
67 TileOp destTile =
68 dyn_cast<TileOp>(multiDest.getTile().getDefiningOp());
69 Port destPort = multiDest.port();
70 FlowOp::create(builder, builder.getUnknownLoc(), srcTile,
71 sourcePort.bundle, sourcePort.channel, destTile,
72 destPort.bundle, destPort.channel);
73 }
74 }
75 }
76
77 ConversionTarget target(getContext());
78 RewritePatternSet patterns(&getContext());
79
80 patterns.add<AIEOpRemoval<MulticastOp>>(device.getContext());
81
82 if (failed(applyPartialConversion(device, target, std::move(patterns))))
83 signalPassFailure();
84 }
85};
86
87std::unique_ptr<OperationPass<DeviceOp>>
89 return std::make_unique<AIELowerMulticastPass>();
90}
std::unique_ptr< mlir::OperationPass< AIE::DeviceOp > > createAIELowerMulticastPass()
Include the generated interface declarations.
Port { WireBundle bundle Port
Definition AIEDialect.h:128
void runOnOperation() override
LogicalResult matchAndRewrite(MyOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override
AIEOpRemoval(MLIRContext *context, PatternBenefit benefit=1)
typename MyAIEOp::Adaptor OpAdaptor