MLIR-AIE
AIEDialect.h
Go to the documentation of this file.
1//===- AIEDialect.h ---------------------------------------------*- 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
11#ifndef MLIR_AIE_DIALECT_H
12#define MLIR_AIE_DIALECT_H
13
14#include "AIEEnums.h"
15
17
18#include "mlir/Dialect/DLTI/Traits.h"
19#include "mlir/Dialect/Func/IR/FuncOps.h"
20#include "mlir/Dialect/MemRef/IR/MemRef.h"
21#include "mlir/IR/BuiltinAttributes.h"
22#include "mlir/IR/OpDefinition.h"
23#include "mlir/IR/OpImplementation.h"
24#include "mlir/Interfaces/DataLayoutInterfaces.h"
25
26#include "llvm/ADT/StringRef.h"
27
28namespace xilinx::AIE {
29
30// Check that the given DMA-like op (e.g. MemOp, ShimDMAOp)
31// has valid BDs.
32template <typename ConcreteType>
33struct HasValidBDs : mlir::OpTrait::TraitBase<ConcreteType, HasValidBDs> {
34 static mlir::LogicalResult verifyTrait(mlir::Operation *op);
35};
36
37// Check that the given DMA-like op (e.g. MemOp, ShimDMAOp)
38// has valid channels.
39template <typename ConcreteType>
41 : mlir::OpTrait::TraitBase<ConcreteType, HasValidBDs> {
42 static mlir::LogicalResult verifyTrait(mlir::Operation *op);
43};
44
45template <typename ConcreteType>
47 : mlir::OpTrait::TraitBase<ConcreteType, SkipAccessibilityCheckTrait> {};
48
49// Marker trait for operations that can be flow endpoints (e.g., TileOp, CoreOp,
50// MemOp)
51template <typename ConcreteType>
52struct IsFlowEndPoint : mlir::OpTrait::TraitBase<ConcreteType, IsFlowEndPoint> {
53};
54
55class TileOp;
56
58 uint32_t burstLength);
60 uint32_t burstLength);
61
62mlir::LogicalResult
63verifyOffsetSizeAndStrideOp(mlir::OffsetSizeAndStrideOpInterface op);
64
65} // namespace xilinx::AIE
66
67/// Include the generated interface declarations.
68#include "aie/Dialect/AIE/IR/AIEInterfaces.h.inc"
69
70namespace xilinx::AIE {
71mlir::LogicalResult
72myVerifyOffsetSizeAndStrideOp(mlir::OffsetSizeAndStrideOpInterface op);
73template <typename ConcreteOp>
76 static ::mlir::LogicalResult verifyTrait(::mlir::Operation *op) {
78 ::mlir::cast<::mlir::OffsetSizeAndStrideOpInterface>(op));
79 }
80};
81
83 : ::mlir::OffsetSizeAndStrideOpInterface {
84 template <typename ConcreteOp>
85 struct Trait : public MyOffsetSizeAndStrideOpInterfaceTrait<ConcreteOp> {};
86};
87} // namespace xilinx::AIE
88
89// Include dialect declarations such as parseAttributes, parseType
90#include "aie/Dialect/AIE/IR/AIEDialect.h.inc"
91
92namespace xilinx::AIE {
93
95
96} // namespace xilinx::AIE
97
98////////////////////////////////////////////////////////////////////////////////
99/////////////////////// Custom Types for the Dialect ///////////////////////////
100////////////////////////////////////////////////////////////////////////////////
101
102#define GET_TYPEDEF_CLASSES
103#include "aie/Dialect/AIE/IR/AIETypes.h.inc"
104
105////////////////////////////////////////////////////////////////////////////////
106// Custom Attributes ///////////////////////////////////////////////////////////
107////////////////////////////////////////////////////////////////////////////////
108
109#define GET_ATTRDEF_CLASSES
110#include "aie/Dialect/AIE/IR/AIEAttrs.h.inc"
111
112////////////////////////////////////////////////////////////////////////////////
113//////////////////// Custom Operations for the Dialect /////////////////////////
114////////////////////////////////////////////////////////////////////////////////
115
116namespace xilinx::AIE {
117
118WireBundle getConnectingBundle(WireBundle dir);
119
120#define GENERATE_TO_STRING(TYPE_WITH_INSERTION_OP) \
121 friend std::string to_string(const TYPE_WITH_INSERTION_OP &s) { \
122 std::ostringstream ss; \
123 ss << s; \
124 return ss.str(); \
125 }
126
127using Port = struct Port {
128 WireBundle bundle;
130
131 bool operator==(const Port &rhs) const {
132 return std::tie(bundle, channel) == std::tie(rhs.bundle, rhs.channel);
133 }
134
135 bool operator!=(const Port &rhs) const { return !(*this == rhs); }
136
137 bool operator<(const Port &rhs) const {
138 return std::tie(bundle, channel) < std::tie(rhs.bundle, rhs.channel);
139 }
140
141 friend std::ostream &operator<<(std::ostream &os, const Port &port) {
142 os << "(";
143 os << stringifyWireBundle(port.bundle).str();
144 os << ": " << std::to_string(port.channel) << ")";
145 return os;
146 }
147
149
150 friend llvm::raw_ostream &operator<<(llvm::raw_ostream &os,
151 const Port &port) {
152 os << to_string(port);
153 return os;
154 }
155};
156
157using Connect = struct Connect {
158 Port src;
160
161 bool operator==(const Connect &rhs) const {
162 return std::tie(src, dst) == std::tie(rhs.src, rhs.dst);
163 }
164
165 bool operator!=(const Connect &rhs) const { return !(*this == rhs); }
166
167 bool operator<(const Connect &rhs) const {
168 return std::tie(src, dst) < std::tie(rhs.src, rhs.dst);
169 }
170};
171
172using DMAChannel = struct DMAChannel {
173 DMAChannelDir direction;
174 int channel;
175
176 bool operator==(const DMAChannel &rhs) const {
177 return std::tie(direction, channel) == std::tie(rhs.direction, rhs.channel);
178 }
179};
180
181const AIETargetModel &getTargetModel(mlir::Operation *op);
182const AIETargetModel &getTargetModel(AIEDevice device);
183
184mlir::ParseResult
185parseObjectFifoProducerTile(mlir::OpAsmParser &parser,
186 mlir::OpAsmParser::UnresolvedOperand &operand,
187 BDDimLayoutArrayAttr &dimensions);
188
189void printObjectFifoProducerTile(mlir::OpAsmPrinter &printer,
190 mlir::Operation *op, mlir::Value tile,
191 BDDimLayoutArrayAttr dimensions);
192
194 mlir::OpAsmParser &parser,
195 llvm::SmallVectorImpl<mlir::OpAsmParser::UnresolvedOperand> &tiles,
196 BDDimLayoutArrayArrayAttr &dimensions);
197
198void printObjectFifoConsumerTiles(mlir::OpAsmPrinter &printer,
199 mlir::Operation *op, mlir::OperandRange tiles,
200 BDDimLayoutArrayArrayAttr dimensions);
201
202int32_t getBufferBaseAddress(mlir::Operation *bufOp);
203
204// Trace Event Value Parsing/Printing (handles both string and typed enums)
205mlir::ParseResult parseTraceEvent(mlir::AsmParser &parser,
206 mlir::Attribute &result);
207void printTraceEventEnum(mlir::AsmPrinter &printer, mlir::Attribute attr);
208
209} // namespace xilinx::AIE
210
211// include TableGen generated Op definitions
212#define GET_OP_CLASSES
213#include "aie/Dialect/AIE/IR/AIEOps.h.inc"
214
215namespace xilinx::AIE {
216
217void collectTiles(DeviceOp &device,
218 llvm::DenseMap<TileID, mlir::Operation *> &tiles);
219
221 DeviceOp &device,
222 llvm::DenseMap<mlir::Operation *, llvm::SmallVector<BufferOp, 4>> &buffers);
223} // namespace xilinx::AIE
224
225namespace llvm {
226// Functions hash just like pointers.
227template <>
228struct DenseMapInfo<xilinx::AIE::ObjectFifoAcquireOp> {
229 static xilinx::AIE::ObjectFifoAcquireOp getEmptyKey() {
230 auto *pointer = DenseMapInfo<void *>::getEmptyKey();
231 return xilinx::AIE::ObjectFifoAcquireOp::getFromOpaquePointer(pointer);
232 }
233
234 static xilinx::AIE::ObjectFifoAcquireOp getTombstoneKey() {
235 auto *pointer = DenseMapInfo<void *>::getTombstoneKey();
236 return xilinx::AIE::ObjectFifoAcquireOp::getFromOpaquePointer(pointer);
237 }
238
239 static unsigned getHashValue(xilinx::AIE::ObjectFifoAcquireOp val) {
240 return hash_value(val.getAsOpaquePointer());
241 }
242
243 static bool isEqual(xilinx::AIE::ObjectFifoAcquireOp lhs,
244 xilinx::AIE::ObjectFifoAcquireOp rhs) {
245 return lhs == rhs;
246 }
247};
248} // namespace llvm
249
250namespace llvm {
251// Functions hash just like pointers.
252template <>
253struct DenseMapInfo<xilinx::AIE::ObjectFifoCreateOp> {
254 static xilinx::AIE::ObjectFifoCreateOp getEmptyKey() {
255 auto *pointer = DenseMapInfo<void *>::getEmptyKey();
256 return xilinx::AIE::ObjectFifoCreateOp::getFromOpaquePointer(pointer);
257 }
258
259 static xilinx::AIE::ObjectFifoCreateOp getTombstoneKey() {
260 auto *pointer = DenseMapInfo<void *>::getTombstoneKey();
261 return xilinx::AIE::ObjectFifoCreateOp::getFromOpaquePointer(pointer);
262 }
263
264 static unsigned getHashValue(xilinx::AIE::ObjectFifoCreateOp val) {
265 return hash_value(val.getAsOpaquePointer());
266 }
267
268 static bool isEqual(xilinx::AIE::ObjectFifoCreateOp lhs,
269 xilinx::AIE::ObjectFifoCreateOp rhs) {
270 return lhs == rhs;
271 }
272};
273
274template <>
275struct DenseMapInfo<xilinx::AIE::DMAChannel> {
276 using FirstInfo = DenseMapInfo<xilinx::AIE::DMAChannelDir>;
277 using SecondInfo = DenseMapInfo<int>;
278
280 return {FirstInfo::getEmptyKey(), SecondInfo::getEmptyKey()};
281 }
282
284 return {FirstInfo::getTombstoneKey(), SecondInfo::getTombstoneKey()};
285 }
286
287 static unsigned getHashValue(const xilinx::AIE::DMAChannel &d) {
288 return detail::combineHashValue(FirstInfo::getHashValue(d.direction),
289 SecondInfo::getHashValue(d.channel));
290 }
291
292 static bool isEqual(const xilinx::AIE::DMAChannel &lhs,
293 const xilinx::AIE::DMAChannel &rhs) {
294 return lhs == rhs;
295 }
296};
297
298template <>
299struct DenseMapInfo<xilinx::AIE::Port> {
300 using FirstInfo = DenseMapInfo<xilinx::AIE::WireBundle>;
301 using SecondInfo = DenseMapInfo<int>;
302
304 return {FirstInfo::getEmptyKey(), SecondInfo::getEmptyKey()};
305 }
306
308 return {FirstInfo::getTombstoneKey(), SecondInfo::getTombstoneKey()};
309 }
310
311 static unsigned getHashValue(const xilinx::AIE::Port &d) {
312 return detail::combineHashValue(FirstInfo::getHashValue(d.bundle),
313 SecondInfo::getHashValue(d.channel));
314 }
315
316 static bool isEqual(const xilinx::AIE::Port &lhs,
317 const xilinx::AIE::Port &rhs) {
318 return lhs == rhs;
319 }
320};
321
322} // namespace llvm
323
324template <>
325struct std::less<xilinx::AIE::Port> {
327 const xilinx::AIE::Port &b) const {
328 return a.bundle == b.bundle ? a.channel < b.channel : a.bundle < b.bundle;
329 }
330};
331
332template <>
333struct std::hash<xilinx::AIE::Port> {
334 std::size_t operator()(const xilinx::AIE::Port &p) const noexcept {
335 std::size_t h1 = std::hash<xilinx::AIE::WireBundle>{}(p.bundle);
336 std::size_t h2 = std::hash<int>{}(p.channel);
337 return h1 ^ h2 << 1;
338 }
339};
340
341#endif
#define GENERATE_TO_STRING(TYPE_WITH_INSERTION_OP)
Definition AIEDialect.h:120
Include the generated interface declarations.
void printObjectFifoConsumerTiles(mlir::OpAsmPrinter &printer, mlir::Operation *op, mlir::OperandRange tiles, BDDimLayoutArrayArrayAttr dimensions)
Connect { Port src Connect
Definition AIEDialect.h:158
uint32_t getShimBurstLengthBytes(const AIE::AIETargetModel &tm, uint32_t burstLength)
void collectTiles(DeviceOp &device, llvm::DenseMap< TileID, mlir::Operation * > &tiles)
void collectBuffers(DeviceOp &device, llvm::DenseMap< mlir::Operation *, llvm::SmallVector< BufferOp, 4 > > &buffers)
mlir::ParseResult parseTraceEvent(mlir::AsmParser &parser, mlir::Attribute &result)
mlir::LogicalResult verifyOffsetSizeAndStrideOp(mlir::OffsetSizeAndStrideOpInterface op)
void registerAIETranslations()
friend std::ostream & operator<<(std::ostream &os, const Port &port)
Definition AIEDialect.h:141
friend std::string to_string(const TileID &s)
DMAChannel { DMAChannelDir direction DMAChannel
Definition AIEDialect.h:173
uint32_t getShimBurstLengthEncoding(const AIE::AIETargetModel &tm, uint32_t burstLength)
int32_t getBufferBaseAddress(mlir::Operation *bufOp)
bool operator!=(const Port &rhs) const
Definition AIEDialect.h:135
Port { WireBundle bundle Port
Definition AIEDialect.h:128
const AIETargetModel & getTargetModel(mlir::Operation *op)
PathEndPoint src
mlir::ParseResult parseObjectFifoProducerTile(mlir::OpAsmParser &parser, mlir::OpAsmParser::UnresolvedOperand &operand, BDDimLayoutArrayAttr &dimensions)
bool operator==(const Port &rhs) const
Definition AIEDialect.h:131
void printTraceEventEnum(mlir::AsmPrinter &printer, mlir::Attribute attr)
mlir::LogicalResult myVerifyOffsetSizeAndStrideOp(mlir::OffsetSizeAndStrideOpInterface op)
void printObjectFifoProducerTile(mlir::OpAsmPrinter &printer, mlir::Operation *op, mlir::Value tile, BDDimLayoutArrayAttr dimensions)
bool operator<(const Port &rhs) const
Definition AIEDialect.h:137
mlir::ParseResult parseObjectFifoConsumerTiles(mlir::OpAsmParser &parser, llvm::SmallVectorImpl< mlir::OpAsmParser::UnresolvedOperand > &tiles, BDDimLayoutArrayArrayAttr &dimensions)
WireBundle getConnectingBundle(WireBundle dir)
static bool isEqual(const xilinx::AIE::DMAChannel &lhs, const xilinx::AIE::DMAChannel &rhs)
Definition AIEDialect.h:292
DenseMapInfo< xilinx::AIE::DMAChannelDir > FirstInfo
Definition AIEDialect.h:276
static unsigned getHashValue(const xilinx::AIE::DMAChannel &d)
Definition AIEDialect.h:287
static xilinx::AIE::DMAChannel getTombstoneKey()
Definition AIEDialect.h:283
static xilinx::AIE::DMAChannel getEmptyKey()
Definition AIEDialect.h:279
static xilinx::AIE::ObjectFifoAcquireOp getEmptyKey()
Definition AIEDialect.h:229
static bool isEqual(xilinx::AIE::ObjectFifoAcquireOp lhs, xilinx::AIE::ObjectFifoAcquireOp rhs)
Definition AIEDialect.h:243
static xilinx::AIE::ObjectFifoAcquireOp getTombstoneKey()
Definition AIEDialect.h:234
static unsigned getHashValue(xilinx::AIE::ObjectFifoAcquireOp val)
Definition AIEDialect.h:239
static bool isEqual(xilinx::AIE::ObjectFifoCreateOp lhs, xilinx::AIE::ObjectFifoCreateOp rhs)
Definition AIEDialect.h:268
static unsigned getHashValue(xilinx::AIE::ObjectFifoCreateOp val)
Definition AIEDialect.h:264
static xilinx::AIE::ObjectFifoCreateOp getTombstoneKey()
Definition AIEDialect.h:259
static xilinx::AIE::ObjectFifoCreateOp getEmptyKey()
Definition AIEDialect.h:254
static xilinx::AIE::Port getTombstoneKey()
Definition AIEDialect.h:307
static unsigned getHashValue(const xilinx::AIE::Port &d)
Definition AIEDialect.h:311
DenseMapInfo< xilinx::AIE::WireBundle > FirstInfo
Definition AIEDialect.h:300
static xilinx::AIE::Port getEmptyKey()
Definition AIEDialect.h:303
static bool isEqual(const xilinx::AIE::Port &lhs, const xilinx::AIE::Port &rhs)
Definition AIEDialect.h:316
std::size_t operator()(const xilinx::AIE::Port &p) const noexcept
Definition AIEDialect.h:334
bool operator()(const xilinx::AIE::Port &a, const xilinx::AIE::Port &b) const
Definition AIEDialect.h:326
static mlir::LogicalResult verifyTrait(mlir::Operation *op)
static mlir::LogicalResult verifyTrait(mlir::Operation *op)
::mlir::LogicalResult verifyTrait(::mlir::Operation *op)
Definition AIEDialect.h:76