MLIR-AIE
AIECreateBroadcastPacket.cpp
Go to the documentation of this file.
1//===- AIECreateBroadcastPacket.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 2019 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_AIEBROADCASTPACKET
25#include "aie/Dialect/AIEX/Transforms/AIEXPasses.h.inc"
26} // namespace xilinx::AIEX
27
28#define DEBUG_TYPE "aie-create-lower-packet"
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
55 AIEBroadcastPacketPass> {
56 void runOnOperation() override {
57
58 DeviceOp device = getOperation();
59 OpBuilder builder = OpBuilder::atBlockTerminator(device.getBody());
60
61 for (auto broadcastpacket : device.getOps<BroadcastPacketOp>()) {
62 Region &r = broadcastpacket.getPorts();
63 Block &b = r.front();
64 Port sourcePort = broadcastpacket.port();
65 TileOp srcTile =
66 dyn_cast<TileOp>(broadcastpacket.getTile().getDefiningOp());
67
68 for (Operation &Op : b.getOperations()) {
69 if (BPIDOp bpid = dyn_cast<BPIDOp>(Op)) {
70 Region &r_bpid = bpid.getPorts();
71 Block &b_bpid = r_bpid.front();
72 int flowID = bpid.IDInt();
73 builder.setInsertionPointAfter(broadcastpacket);
74 PacketFlowOp pkFlow = PacketFlowOp::create(
75 builder, builder.getUnknownLoc(), flowID, nullptr, nullptr);
76 Region &r_pkFlow = pkFlow.getPorts();
77 Block *b_pkFlow = builder.createBlock(&r_pkFlow);
78 builder.setInsertionPointToStart(b_pkFlow);
79 PacketSourceOp::create(builder, builder.getUnknownLoc(), srcTile,
80 sourcePort.bundle, sourcePort.channel);
81 for (Operation &op : b_bpid.getOperations()) {
82 if (BPDestOp bpdest = dyn_cast<BPDestOp>(op)) {
83 TileOp destTile =
84 dyn_cast<TileOp>(bpdest.getTile().getDefiningOp());
85 Port destPort = bpdest.port();
86 builder.setInsertionPointToEnd(b_pkFlow);
87 PacketDestOp::create(builder, builder.getUnknownLoc(), destTile,
88 destPort.bundle, destPort.channel);
89 }
90 }
91 builder.setInsertionPointToEnd(b_pkFlow);
92 EndOp::create(builder, builder.getUnknownLoc());
93 }
94 }
95 }
96
97 ConversionTarget target(getContext());
98 RewritePatternSet patterns(&getContext());
99
100 patterns.add<AIEOpRemoval<BroadcastPacketOp>>(device.getContext());
101
102 if (failed(applyPartialConversion(device, target, std::move(patterns))))
103 signalPassFailure();
104 }
105};
106
107std::unique_ptr<OperationPass<DeviceOp>>
109 return std::make_unique<AIEBroadcastPacketPass>();
110}
std::unique_ptr< mlir::OperationPass< AIE::DeviceOp > > createAIEBroadcastPacketPass()
Include the generated interface declarations.
Port { WireBundle bundle Port
Definition AIEDialect.h:128
LogicalResult matchAndRewrite(MyOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override
AIEOpRemoval(MLIRContext *context, PatternBenefit benefit=1)
typename MyAIEOp::Adaptor OpAdaptor