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
23#define DEBUG_TYPE "aie-lower-multicast"
24
25using namespace mlir;
26using namespace xilinx;
27using namespace xilinx::AIE;
28using namespace xilinx::AIEX;
29
30template <typename MyOp>
31struct AIEOpRemoval : public OpConversionPattern<MyOp> {
33 using OpAdaptor = typename MyOp::Adaptor;
34
35 AIEOpRemoval(MLIRContext *context, PatternBenefit benefit = 1)
36 : OpConversionPattern<MyOp>(context, benefit) {}
37
38 LogicalResult
39 matchAndRewrite(MyOp op, OpAdaptor adaptor,
40 ConversionPatternRewriter &rewriter) const override {
41 Operation *Op = op.getOperation();
42
43 rewriter.eraseOp(Op);
44 return success();
45 }
46};
47
48struct AIELowerMulticastPass : public AIEMulticastBase<AIELowerMulticastPass> {
49 void runOnOperation() override {
50
51 DeviceOp device = getOperation();
52 OpBuilder builder = OpBuilder::atBlockTerminator(device.getBody());
53
54 for (auto multicast : device.getOps<MulticastOp>()) {
55 Region &r = multicast.getPorts();
56 Block &b = r.front();
57 Port sourcePort = multicast.port();
58 TileOp srcTile = dyn_cast<TileOp>(multicast.getTile().getDefiningOp());
59 for (Operation &Op : b.getOperations()) {
60 if (MultiDestOp multiDest = dyn_cast<MultiDestOp>(Op)) {
61 TileOp destTile =
62 dyn_cast<TileOp>(multiDest.getTile().getDefiningOp());
63 Port destPort = multiDest.port();
64 builder.create<FlowOp>(builder.getUnknownLoc(), srcTile,
65 sourcePort.bundle, sourcePort.channel,
66 destTile, destPort.bundle, destPort.channel);
67 }
68 }
69 }
70
71 ConversionTarget target(getContext());
72 RewritePatternSet patterns(&getContext());
73
74 patterns.add<AIEOpRemoval<MulticastOp>>(device.getContext());
75
76 if (failed(applyPartialConversion(device, target, std::move(patterns))))
77 signalPassFailure();
78 }
79};
80
81std::unique_ptr<OperationPass<DeviceOp>>
83 return std::make_unique<AIELowerMulticastPass>();
84}
std::unique_ptr< mlir::OperationPass< AIE::DeviceOp > > createAIELowerMulticastPass()
Include the generated interface declarations.
Port { WireBundle bundle Port
Definition AIEDialect.h:118
void runOnOperation() override
LogicalResult matchAndRewrite(MyOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override
AIEOpRemoval(MLIRContext *context, PatternBenefit benefit=1)
typename MyAIEOp::Adaptor OpAdaptor