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