MLIR-AIE 1.4.5.dev
AIEPasses.h
Go to the documentation of this file.
1//===- AIEPasses.h ----------------------------------------------*- C++ -*-===//
2//
3// Copyright (C) 2021-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
9#ifndef AIE_PASSES_H
10#define AIE_PASSES_H
11
14
15#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
16#include "mlir/Dialect/SCF/IR/SCF.h"
17#include "mlir/Pass/Pass.h"
18
19namespace xilinx::AIE {
20
21/// Discardable attribute set by `--aie-objectfifo-lower-cores` on `scf.for`
22/// and forever `scf.while` loops containing ObjectFifo accesses -- the loop
23/// unroll factor (the least common multiple of the depths of the objectFifos
24/// accessed within the loop) consumed by the `AIEObjectFifoUnroll` pass.
25inline constexpr llvm::StringLiteral kObjectFifoUnrollHintAttrName =
26 "aie.unroll_hint";
27
28/// Discardable attribute set by `--aie-objectfifo-lower-cores` on the rank-0
29/// `memref.alloca`s that hold a core's objects of an objectFifo in rotation
30/// order. The `AIEObjectFifoUnroll` pass promotes them to SSA on each core
31/// where every object then folds to its buffer. Otherwise they stay in memory,
32/// so that LLVM's SROA carries only the buffer pointer around the loop rather
33/// than the whole memref descriptor.
34inline constexpr llvm::StringLiteral kObjectFifoObjectSlotAttrName =
35 "aie.objectfifo.object_slot";
36
37/// Whether `whileOp` repeats forever: its condition is a constant true, and its
38/// condition region does nothing but forward its arguments to the body. This is
39/// how IRON's `Worker` writes a core that runs until reconfiguration. Such a
40/// loop can be unrolled by repeating its body.
41bool isForeverLoop(mlir::scf::WhileOp whileOp);
42
43/// Whether `op` is a loop that objectFifo lowering unrolls by the rotation
44/// period of the objectFifos accessed in it: an `scf.for`, or an `scf.while`
45/// that repeats forever.
46bool isObjectFifoLoop(mlir::Operation *op);
47
48/// The innermost loop around `op` that `isObjectFifoLoop` accepts, or null.
49mlir::Operation *getObjectFifoLoopParent(mlir::Operation *op);
50
51#define GEN_PASS_DECL
52#include "aie/Dialect/AIE/Transforms/AIEPasses.h.inc"
53
54std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEPlaceTilesPass();
55std::unique_ptr<mlir::OperationPass<DeviceOp>>
56createAIEPlaceTilesPass(const AIEPlaceTilesOptions &options);
57std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEPrepareBuffersPass();
58std::unique_ptr<mlir::OperationPass<DeviceOp>>
60std::unique_ptr<mlir::OperationPass<DeviceOp>>
62 const AIEAssignBufferAddressesOptions &options);
63std::unique_ptr<mlir::OperationPass<DeviceOp>>
65std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEAssignLockIDsPass();
66std::unique_ptr<mlir::OperationPass<DeviceOp>>
68std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
70std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
72std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
73createAIECoreToStandardPass(const AIECoreToStandardOptions &options);
74std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEFindFlowsPass();
75std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIESplitFlowViasPass();
76std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIELocalizeLocksPass();
77std::unique_ptr<mlir::OperationPass<DeviceOp>>
79std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>> createAIERouteFlowsPass();
80std::unique_ptr<mlir::OperationPass<DeviceOp>>
82std::unique_ptr<mlir::OperationPass<DeviceOp>>
84std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
86std::unique_ptr<mlir::OperationPass<DeviceOp>>
88std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEPathfinderPass();
89std::unique_ptr<mlir::OperationPass<DeviceOp>>
90createAIEPathfinderPass(const AIERoutePathfinderFlowsOptions &options);
91std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEObjectFifoUnrollPass();
92std::unique_ptr<mlir::OperationPass<DeviceOp>>
93createAIEObjectFifoUnrollPass(const AIEObjectFifoUnrollOptions &options);
94std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEObjectFifoSplitPass();
95std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEObjectFifoVerifyPass();
96std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEAssignPacketIdsPass();
97std::unique_ptr<mlir::OperationPass<DeviceOp>>
98createAIEAssignPacketIdsPass(bool packetSwitched);
99std::unique_ptr<mlir::OperationPass<DeviceOp>>
101std::unique_ptr<mlir::OperationPass<DeviceOp>>
103std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
105std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
106createAIECheckAgainstImagePass(const AIECheckAgainstImageOptions &options);
107std::unique_ptr<mlir::OperationPass<DeviceOp>>
109std::unique_ptr<mlir::OperationPass<DeviceOp>>
111std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIELowerCascadeFlowsPass();
112std::unique_ptr<mlir::OperationPass<DeviceOp>>
114std::unique_ptr<mlir::OperationPass<DeviceOp>>
116std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
118std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
120 const AIEGenerateColumnControlOverlayOptions &options);
121std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEAssignTileCtrlIDsPass();
122std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIETraceToConfigPass();
123std::unique_ptr<mlir::OperationPass<DeviceOp>>
125std::unique_ptr<mlir::OperationPass<DeviceOp>> createAIEInsertTraceFlowsPass();
126
127/// Generate the code for registering passes.
128#define GEN_PASS_REGISTRATION
129#include "aie/Dialect/AIE/Transforms/AIEPasses.h.inc"
130
131/// Adds the passes of `aie-objectFifo-stateful-transform` to `pm`, which
132/// anchors on DeviceOp.
133void addObjectFifoLoweringPasses(mlir::OpPassManager &pm, bool packetSwitched,
134 bool skipVerify);
135
136/// Register `aie-objectFifo-stateful-transform` as a pipeline over the passes
137/// that lower `aie.objectfifo`.
139
140} // namespace xilinx::AIE
141
142#endif // AIE_PASSES_H
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEInsertTraceFlowsPass()
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIEHoistVectorTransferPointersPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIETraceRegPackWritesPass()
void addObjectFifoLoweringPasses(mlir::OpPassManager &pm, bool packetSwitched, bool skipVerify)
Adds the passes of aie-objectFifo-stateful-transform to pm, which anchors on DeviceOp.
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEPrepareBuffersPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIECoreIntRangeNarrowingPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoLowerCoresPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEAssignTileCtrlIDsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIELowerCascadeFlowsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoAllocatePass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIENormalizeDmaBdDimsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEFindFlowsPass()
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIECoreToStandardPass()
constexpr llvm::StringLiteral kObjectFifoObjectSlotAttrName
Discardable attribute set by --aie-objectfifo-lower-cores on the rank-0 memref.allocas that hold a co...
Definition AIEPasses.h:34
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIECheckAgainstImagePass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoLivenessPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEVectorToPointerLoopsPass()
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIEGenerateColumnControlOverlayPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEAssignLockIDsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEPlaceTilesPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoUnrollPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIENormalizeAddressSpacesPass()
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIERouteFlowsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEAssignPacketIdsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIESplitFlowViasPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEAssignCoreLinkFilesPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoErasePoolsPass()
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIECanonicalizeDevicePass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEAssignBufferAddressesPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoVerifyPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIELocalizeLocksPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIETraceToConfigPass()
constexpr llvm::StringLiteral kObjectFifoUnrollHintAttrName
Discardable attribute set by --aie-objectfifo-lower-cores on scf.for and forever scf....
Definition AIEPasses.h:25
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEAssignBufferDescriptorIDsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoLowerDMAsPass()
bool isForeverLoop(mlir::scf::WhileOp whileOp)
Whether whileOp repeats forever: its condition is a constant true, and its condition region does noth...
void registerAIEObjectFifoPipeline()
Register aie-objectFifo-stateful-transform as a pipeline over the passes that lower aie....
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEPathfinderPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEVectorTransferLoweringPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEObjectFifoSplitPass()
mlir::Operation * getObjectFifoLoopParent(mlir::Operation *op)
The innermost loop around op that isObjectFifoLoop accepts, or null.
bool isObjectFifoLoop(mlir::Operation *op)
Whether op is a loop that objectFifo lowering unrolls by the rotation period of the objectFifos acces...