MLIR-AIE 1.4.5.dev
AIEResourceStages.cpp
Go to the documentation of this file.
1//===- AIEResourceStages.cpp ------------------------------------*- C++ -*-===//
2//
3// Copyright (C) 2026 Advanced Micro Devices, Inc.
4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5//
6//===----------------------------------------------------------------------===//
7
10
11#include "mlir/Conversion/AffineToStandard/AffineToStandard.h"
12#include "mlir/Pass/PassManager.h"
13#include "mlir/Pass/PassRegistry.h"
14
15using namespace mlir;
16using namespace xilinx;
17using namespace xilinx::AIE;
18
19void AIEX::addPlacementStage(OpPassManager &pm,
20 const AIEPlaceTilesOptions &options) {
21 pm.nest<DeviceOp>().addPass(createAIEPlaceTilesPass(options));
22}
23
24void AIEX::addTraceStage(OpPassManager &pm) {
25 OpPassManager &dpm = pm.nest<DeviceOp>();
26 dpm.addPass(createAIEInsertTraceFlowsPass());
27 dpm.addPass(createAIETraceToConfigPass());
30 // Module-level: it rewrites callers and callees together.
32}
33
34void AIEX::addLoweringStage(OpPassManager &pm, bool dynamicObjFifos,
35 bool packetSwObjFifos, bool ctrlPktOverlay,
36 bool loadPdiToCtrlPkt, bool skipObjectFifoVerify) {
37 pm.addPass(createLowerAffinePass());
39 // Before lock IDs and buffer addresses, which its new locks and buffers need.
41
42 // With the overlay requested, it claims its shim DMA channels before
43 // objectFIFO lowering works around them; otherwise it runs after tile
44 // control IDs are assigned.
45 AIEGenerateColumnControlOverlayOptions overlay;
46 overlay.clRouteShimDmaToTileCTRL = ctrlPktOverlay;
47 overlay.clEmitStandaloneOverlay = ctrlPktOverlay && loadPdiToCtrlPkt;
48 if (ctrlPktOverlay)
50
51 OpPassManager &dpm = pm.nest<DeviceOp>();
52 addObjectFifoLoweringPasses(dpm, packetSwObjFifos, skipObjectFifoVerify);
53 AIEObjectFifoUnrollOptions unroll;
54 unroll.clDefaultDynamic = dynamicObjFifos;
55 dpm.addPass(createAIEObjectFifoUnrollPass(unroll));
57 dpm.addPass(createAIEAssignLockIDsPass());
60 dpm.addPass(createAIELowerCascadeFlowsPass());
61 dpm.addPass(createAIEBroadcastPacketPass());
62 dpm.addPass(createAIELowerMulticastPass());
63 dpm.addPass(createAIEAssignTileCtrlIDsPass());
64
65 if (!ctrlPktOverlay)
67
68 // A buffer's name becomes a symbol in its core's object.
69 pm.nest<DeviceOp>().addPass(createAIEPrepareBuffersPass());
70}
71
72void AIEX::addBufferAddressStage(OpPassManager &pm, int64_t placementBudget) {
73 AIEAssignBufferAddressesOptions options;
74 options.clPlacementBudget = placementBudget;
75 pm.nest<DeviceOp>().addPass(createAIEAssignBufferAddressesPass(options));
76}
77
78void AIEX::addRoutingStage(OpPassManager &pm, bool allowDeadlockProne) {
79 OpPassManager &dpm = pm.nest<DeviceOp>();
80 dpm.addPass(createAIESplitFlowViasPass());
81 AIERoutePathfinderFlowsOptions options;
82 options.clAllowDeadlockProne = allowDeadlockProne;
83 dpm.addPass(createAIEPathfinderPass(options));
84}
85
87 PassPipelineRegistration<AIEResourceStagesOptions>(
88 "aie-resource-stages",
89 "aiecc's placement, trace, lowering, buffer address and routing stages",
90 [](OpPassManager &pm, const AIEResourceStagesOptions &options) {
91 AIEPlaceTilesOptions place;
92 place.clPlacerType = options.placer;
93 place.clCoresPerCol = options.coresPerCol;
94 place.clSASeed = options.saSeed;
95 place.clSAEffort = options.saEffort;
96 addPlacementStage(pm, place);
97 addTraceStage(pm);
99 options.ctrlPktOverlay || options.loadPdiToCtrlPkt,
100 options.loadPdiToCtrlPkt,
101 options.skipObjectFifoVerify);
104 });
105}
std::unique_ptr< mlir::OperationPass< AIE::DeviceOp > > createAIEReserveRuntimeBDIDsPass()
void addBufferAddressStage(mlir::OpPassManager &pm, int64_t placementBudget)
void addRoutingStage(mlir::OpPassManager &pm, bool allowDeadlockProne)
void addPlacementStage(mlir::OpPassManager &pm, const AIE::AIEPlaceTilesOptions &options)
aiecc's stages that give a design its tiles, locks, BD IDs, buffers and routes, in its order.
std::unique_ptr< mlir::OperationPass< AIE::DeviceOp > > createAIEXInlineTraceConfigPass()
void registerAIEResourceStagesPipeline()
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIELowerScratchpadParametersPass()
std::unique_ptr< mlir::OperationPass< AIE::DeviceOp > > createAIELowerMulticastPass()
std::unique_ptr< mlir::OperationPass< AIE::DeviceOp > > createAIEBroadcastPacketPass()
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIEFuseTraceBuffersPass()
void addLoweringStage(mlir::OpPassManager &pm, bool dynamicObjFifos, bool packetSwObjFifos, bool ctrlPktOverlay, bool loadPdiToCtrlPkt, bool skipObjectFifoVerify)
Affine lowering through aie-prepare-buffers.
void addTraceStage(mlir::OpPassManager &pm)
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEInsertTraceFlowsPass()
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 > > createAIEAssignTileCtrlIDsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIELowerCascadeFlowsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIENormalizeDmaBdDimsPass()
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 > > createAIESplitFlowViasPass()
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIECanonicalizeDevicePass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEAssignBufferAddressesPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIETraceToConfigPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEAssignBufferDescriptorIDsPass()
std::unique_ptr< mlir::OperationPass< DeviceOp > > createAIEPathfinderPass()
Options of aie-resource-stages, named and defaulted as aiecc's flags.
Definition AIEXPasses.h:118
Option< AIE::PlacerType > placer
Definition AIEXPasses.h:119