MLIR-AIE 1.4.5.dev
AIETokenAnalysis.h
Go to the documentation of this file.
1//===- AIETokenAnalysis.h ---------------------------------------*- C++ -*-===//
2//
3// Copyright (C) 2019-2022 Xilinx, Inc.
4// Copyright (C) 2023 Advanced Micro Devices, Inc.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef AIEX_TOKENANALYSIS_H
10#define AIEX_TOKENANALYSIS_H
11
12#include "llvm/ADT/DenseMap.h"
13#include "llvm/ADT/SmallVector.h"
14#include "llvm/Support/Debug.h"
15
16namespace mlir {
17class Operation;
18} // namespace mlir
19
20namespace xilinx::AIE {
21class DeviceOp;
22struct TileID;
23} // namespace xilinx::AIE
24
25namespace xilinx::AIEX {
26
28 AIE::DeviceOp &device;
29 llvm::DenseMap<llvm::StringRef, int> tokenSymbols;
30 std::vector<std::pair<llvm::StringRef, std::vector<mlir::Operation *>>>
31 tokenAcqMap;
32 std::vector<std::pair<llvm::StringRef, std::vector<mlir::Operation *>>>
33 tokenRelMap;
34 llvm::SmallVector<std::pair<mlir::Operation *, mlir::Operation *>, 4>
35 tokenChains;
36 llvm::SmallVector<std::pair<mlir::Operation *, mlir::Operation *>, 4>
37 tokenPairs;
38 llvm::DenseMap<xilinx::AIE::TileID, mlir::Operation *> tiles;
39
40public:
41 TokenAnalysis(AIE::DeviceOp &d) : device(d) {}
42
43 void runAnalysis();
44
45 auto getTokenSymbols() const { return tokenSymbols; }
46
47 auto getTokenChains() const { return tokenChains; }
48
49 auto getTokenPairs() const { return tokenPairs; }
50
51 auto getTiles() const { return tiles; }
52
53 // CoreOp or MemOp
54 mlir::Operation *getTokenUserOp(mlir::Operation *Op);
55 mlir::Operation *getShareableTileOp(mlir::Operation *Op1,
56 mlir::Operation *Op2);
57 xilinx::AIE::TileID getCoord(mlir::Operation *Op);
58
59 void print(llvm::raw_ostream &os);
60};
61
62} // namespace xilinx::AIEX
63
64#endif
TokenAnalysis(AIE::DeviceOp &d)
mlir::Operation * getShareableTileOp(mlir::Operation *Op1, mlir::Operation *Op2)
xilinx::AIE::TileID getCoord(mlir::Operation *Op)
mlir::Operation * getTokenUserOp(mlir::Operation *Op)
void print(llvm::raw_ostream &os)
struct TileID { friend std::ostream &operator<<(std::ostream &os, const TileID &s) { os<< "TileID("<< s.col<< ", "<< s.row<< ")"; return os; } friend std::string to_string(const TileID &s) { std::ostringstream ss; ss<< s; return ss.str(); } friend llvm::raw_ostream &operator<<(llvm::raw_ostream &os, const TileID &s) { os<< to_string(s); return os; } inline bool operator<(const TileID &rhs) const { return std::tie(col, row)< std::tie(rhs.col, rhs.row); } bool operator==(const TileID &rhs) const { return std::tie(col, row)==std::tie(rhs.col, rhs.row); } bool operator!=(const TileID &rhs) const { return !(*this==rhs);} int col, row;} TileID