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