11#ifndef MLIR_AIE_DIALECT_H
12#define MLIR_AIE_DIALECT_H
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"
29template <
typename ConcreteType>
31 static mlir::LogicalResult
verifyTrait(mlir::Operation *op);
36template <
typename ConcreteType>
39 static mlir::LogicalResult
verifyTrait(mlir::Operation *op);
42template <
typename ConcreteType>
49 uint32_t burstLength);
51 uint32_t burstLength);
59#include "aie/Dialect/AIE/IR/AIEInterfaces.h.inc"
64template <
typename ConcreteOp>
67 static ::mlir::LogicalResult
verifyTrait(::mlir::Operation *op) {
69 ::mlir::cast<::mlir::OffsetSizeAndStrideOpInterface>(op));
74 : ::mlir::OffsetSizeAndStrideOpInterface {
75 template <
typename ConcreteOp>
81#include "aie/Dialect/AIE/IR/AIEDialect.h.inc"
93#define GET_TYPEDEF_CLASSES
94#include "aie/Dialect/AIE/IR/AIETypes.h.inc"
100#define GET_ATTRDEF_CLASSES
101#include "aie/Dialect/AIE/IR/AIEAttrs.h.inc"
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; \
123 return std::tie(bundle,
channel) == std::tie(rhs.bundle, rhs.channel);
129 return std::tie(bundle,
channel) < std::tie(rhs.bundle, rhs.channel);
134 os << stringifyWireBundle(
port.bundle).str();
135 os <<
": " << std::to_string(
port.channel) <<
")";
154 return std::tie(
src,
dst) == std::tie(rhs.src, rhs.dst);
159 DMAChannelDir direction;
163 return std::tie(direction,
channel) == std::tie(rhs.direction, rhs.channel);
172 mlir::OpAsmParser::UnresolvedOperand &operand,
173 BDDimLayoutArrayAttr &dimensions);
176 mlir::Operation *op, mlir::Value tile,
177 BDDimLayoutArrayAttr dimensions);
180 mlir::OpAsmParser &parser,
181 llvm::SmallVectorImpl<mlir::OpAsmParser::UnresolvedOperand> &tiles,
182 BDDimLayoutArrayArrayAttr &dimensions);
185 mlir::Operation *op, mlir::OperandRange tiles,
186 BDDimLayoutArrayArrayAttr dimensions);
193#define GET_OP_CLASSES
194#include "aie/Dialect/AIE/IR/AIEOps.h.inc"
198class ShimDMAAllocationOp;
201 std::optional<AIE::ShimDMAAllocationOp>
get(DeviceOp dev,
202 mlir::StringRef sym_name);
205 llvm::DenseMap<std::pair<DeviceOp, mlir::StringRef>,
206 std::optional<AIE::ShimDMAAllocationOp>>
208 std::optional<AIE::ShimDMAAllocationOp>
209 cachelessGet(DeviceOp dev, mlir::StringRef sym_name);
215void collectTiles(DeviceOp &device,
216 llvm::DenseMap<TileID, mlir::Operation *> &tiles);
220 llvm::DenseMap<mlir::Operation *, llvm::SmallVector<BufferOp, 4>> &buffers);
226struct DenseMapInfo<
xilinx::AIE::ObjectFifoAcquireOp> {
227 static xilinx::AIE::ObjectFifoAcquireOp getEmptyKey() {
228 auto *pointer = DenseMapInfo<void *>::getEmptyKey();
229 return xilinx::AIE::ObjectFifoAcquireOp::getFromOpaquePointer(pointer);
232 static xilinx::AIE::ObjectFifoAcquireOp getTombstoneKey() {
233 auto *pointer = DenseMapInfo<void *>::getTombstoneKey();
234 return xilinx::AIE::ObjectFifoAcquireOp::getFromOpaquePointer(pointer);
237 static unsigned getHashValue(xilinx::AIE::ObjectFifoAcquireOp val) {
238 return hash_value(val.getAsOpaquePointer());
241 static bool isEqual(xilinx::AIE::ObjectFifoAcquireOp lhs,
242 xilinx::AIE::ObjectFifoAcquireOp rhs) {
251struct DenseMapInfo<
xilinx::AIE::ObjectFifoCreateOp> {
253 auto *pointer = DenseMapInfo<void *>::getEmptyKey();
254 return xilinx::AIE::ObjectFifoCreateOp::getFromOpaquePointer(pointer);
258 auto *pointer = DenseMapInfo<void *>::getTombstoneKey();
259 return xilinx::AIE::ObjectFifoCreateOp::getFromOpaquePointer(pointer);
263 return hash_value(val.getAsOpaquePointer());
266 static bool isEqual(xilinx::AIE::ObjectFifoCreateOp lhs,
267 xilinx::AIE::ObjectFifoCreateOp rhs) {
273struct DenseMapInfo<
xilinx::AIE::DMAChannel> {
274 using FirstInfo = DenseMapInfo<xilinx::AIE::DMAChannelDir>;
278 return {FirstInfo::getEmptyKey(), SecondInfo::getEmptyKey()};
282 return {FirstInfo::getTombstoneKey(), SecondInfo::getTombstoneKey()};
286 return detail::combineHashValue(FirstInfo::getHashValue(d.direction),
287 SecondInfo::getHashValue(d.channel));
298 using FirstInfo = DenseMapInfo<xilinx::AIE::WireBundle>;
302 return {FirstInfo::getEmptyKey(), SecondInfo::getEmptyKey()};
306 return {FirstInfo::getTombstoneKey(), SecondInfo::getTombstoneKey()};
310 return detail::combineHashValue(FirstInfo::getHashValue(d.bundle),
311 SecondInfo::getHashValue(d.channel));
326 return a.bundle == b.bundle ? a.channel < b.channel : a.bundle < b.bundle;
333 std::size_t h1 = std::hash<xilinx::AIE::WireBundle>{}(p.bundle);
334 std::size_t h2 = std::hash<int>{}(p.channel);
#define GENERATE_TO_STRING(TYPE_WITH_INSERTION_OP)
Include the generated interface declarations.
void printObjectFifoConsumerTiles(mlir::OpAsmPrinter &printer, mlir::Operation *op, mlir::OperandRange tiles, BDDimLayoutArrayArrayAttr dimensions)
Connect { Port src Connect
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)
friend std::string to_string(const TileID &s)
DMAChannel { DMAChannelDir direction DMAChannel
uint32_t getShimBurstLengthEncoding(const AIE::AIETargetModel &tm, uint32_t burstLength)
int32_t getBufferBaseAddress(mlir::Operation *bufOp)
bool operator!=(const Port &rhs) const
Port { WireBundle bundle Port
const AIETargetModel & getTargetModel(mlir::Operation *op)
mlir::ParseResult parseObjectFifoProducerTile(mlir::OpAsmParser &parser, mlir::OpAsmParser::UnresolvedOperand &operand, BDDimLayoutArrayAttr &dimensions)
bool operator==(const Port &rhs) const
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
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)
DenseMapInfo< int > SecondInfo
DenseMapInfo< xilinx::AIE::DMAChannelDir > FirstInfo
static unsigned getHashValue(const xilinx::AIE::DMAChannel &d)
static xilinx::AIE::DMAChannel getTombstoneKey()
static xilinx::AIE::DMAChannel getEmptyKey()
static bool isEqual(xilinx::AIE::ObjectFifoCreateOp lhs, xilinx::AIE::ObjectFifoCreateOp rhs)
static unsigned getHashValue(xilinx::AIE::ObjectFifoCreateOp val)
static xilinx::AIE::ObjectFifoCreateOp getTombstoneKey()
static xilinx::AIE::ObjectFifoCreateOp getEmptyKey()
static xilinx::AIE::Port getTombstoneKey()
static unsigned getHashValue(const xilinx::AIE::Port &d)
DenseMapInfo< int > SecondInfo
DenseMapInfo< xilinx::AIE::WireBundle > FirstInfo
static xilinx::AIE::Port getEmptyKey()
static bool isEqual(const xilinx::AIE::Port &lhs, const xilinx::AIE::Port &rhs)
std::size_t operator()(const xilinx::AIE::Port &p) const noexcept
bool operator()(const xilinx::AIE::Port &a, const xilinx::AIE::Port &b) const
static mlir::LogicalResult verifyTrait(mlir::Operation *op)
static mlir::LogicalResult verifyTrait(mlir::Operation *op)
::mlir::LogicalResult verifyTrait(::mlir::Operation *op)
std::optional< AIE::ShimDMAAllocationOp > get(DeviceOp dev, mlir::StringRef sym_name)