MLIR-AIE 1.4.5.dev
AIECreateBroadcastPacket.cpp
Go to the documentation of this file.
1//===- AIECreateBroadcastPacket.cpp -----------------------------*- C++ -*-===//
2//
3// Copyright (C) 2019-2022 Xilinx, Inc.
4// Copyright (C) 2022-2026 Advanced Micro Devices, Inc.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
12
13#include "mlir/IR/Attributes.h"
14#include "mlir/IR/PatternMatch.h"
15#include "mlir/Pass/Pass.h"
16#include "mlir/Tools/mlir-translate/MlirTranslateMain.h"
17#include "mlir/Transforms/DialectConversion.h"
18
19#include "llvm/ADT/Twine.h"
20
21namespace xilinx::AIEX {
22#define GEN_PASS_DEF_AIEBROADCASTPACKET
23#include "aie/Dialect/AIEX/Transforms/AIEXPasses.h.inc"
24} // namespace xilinx::AIEX
25
26#define DEBUG_TYPE "aie-create-lower-packet"
27
28using namespace mlir;
29using namespace xilinx;
30using namespace xilinx::AIE;
31using namespace xilinx::AIEX;
32
33template <typename MyOp>
34struct AIEOpRemoval : public OpConversionPattern<MyOp> {
35 using OpConversionPattern<MyOp>::OpConversionPattern;
36 using OpAdaptor = typename MyOp::Adaptor;
37
38 AIEOpRemoval(MLIRContext *context, PatternBenefit benefit = 1)
39 : OpConversionPattern<MyOp>(context, benefit) {}
40
41 LogicalResult
42 matchAndRewrite(MyOp op, OpAdaptor adaptor,
43 ConversionPatternRewriter &rewriter) const override {
44 Operation *Op = op.getOperation();
45
46 rewriter.eraseOp(Op);
47 return success();
48 }
49};
50
53 AIEBroadcastPacketPass> {
54 void runOnOperation() override {
55
56 DeviceOp device = getOperation();
57 OpBuilder builder = OpBuilder::atBlockTerminator(device.getBody());
58
59 for (auto broadcastpacket : device.getOps<BroadcastPacketOp>()) {
60 Region &r = broadcastpacket.getPorts();
61 Block &b = r.front();
62 Port sourcePort = broadcastpacket.port();
63 TileOp srcTile = cast<TileOp>(broadcastpacket.getTile().getDefiningOp());
64
65 for (Operation &Op : b.getOperations()) {
66 if (BPIDOp bpid = dyn_cast<BPIDOp>(Op)) {
67 Region &r_bpid = bpid.getPorts();
68 Block &b_bpid = r_bpid.front();
69 int flowID = bpid.IDInt();
70 builder.setInsertionPointAfter(broadcastpacket);
71 PacketFlowOp pkFlow = PacketFlowOp::create(
72 builder, broadcastpacket.getLoc(), flowID, nullptr, nullptr);
73 Region &r_pkFlow = pkFlow.getPorts();
74 Block *b_pkFlow = builder.createBlock(&r_pkFlow);
75 builder.setInsertionPointToStart(b_pkFlow);
76 PacketSourceOp::create(builder, broadcastpacket.getLoc(), srcTile,
77 sourcePort.bundle, sourcePort.channel);
78 for (Operation &op : b_bpid.getOperations()) {
79 if (BPDestOp bpdest = dyn_cast<BPDestOp>(op)) {
80 TileOp destTile = cast<TileOp>(bpdest.getTile().getDefiningOp());
81 Port destPort = bpdest.port();
82 builder.setInsertionPointToEnd(b_pkFlow);
83 PacketDestOp::create(builder, bpdest.getLoc(), destTile,
84 destPort.bundle, destPort.channel);
85 }
86 }
87 builder.setInsertionPointToEnd(b_pkFlow);
88 EndOp::create(builder, broadcastpacket.getLoc());
89 }
90 }
91 }
92
93 ConversionTarget target(getContext());
94 RewritePatternSet patterns(&getContext());
95
96 patterns.add<AIEOpRemoval<BroadcastPacketOp>>(device.getContext());
97
98 if (failed(applyPartialConversion(device, target, std::move(patterns))))
99 signalPassFailure();
100 }
101};
102
103std::unique_ptr<OperationPass<DeviceOp>>
105 return std::make_unique<AIEBroadcastPacketPass>();
106}
std::unique_ptr< mlir::OperationPass< AIE::DeviceOp > > createAIEBroadcastPacketPass()
struct Port { WireBundle bundle; int channel; bool operator==(const Port &rhs) const { return std::tie(bundle, channel)==std::tie(rhs.bundle, rhs.channel); } bool operator!=(const Port &rhs) const { return !(*this==rhs);} bool operator<(const Port &rhs) const { return std::tie(bundle, channel)< std::tie(rhs.bundle, rhs.channel); } friend std::ostream &operator<<(std::ostream &os, const Port &port) { os<< "("; os<< stringifyWireBundle(port.bundle).str(); os<< ": "<< std::to_string(port.channel)<< ")"; return os; } friend llvm::raw_ostream &operator<<(llvm::raw_ostream &os, const Port &port) { os<< to_string(port); return os; } } Port
Definition AIEDialect.h:265
AIEOpRemoval(MLIRContext *context, PatternBenefit benefit=1)
typename MyOp::Adaptor OpAdaptor
LogicalResult matchAndRewrite(MyOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override