MLIR-AIE 1.4.5.dev
AIECanonicalizeDevice.cpp
Go to the documentation of this file.
1//===- AIECanonicalizeDevice.cpp --------------------------------*- C++ -*-===//
2//
3// Copyright (C) 2023 Advanced Micro Devices, Inc.
4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5//
6//===----------------------------------------------------------------------===//
7
10
11#include "mlir/IR/Builders.h"
12#include "mlir/IR/Location.h"
13#include "mlir/Pass/Pass.h"
14
15namespace xilinx::AIE {
16#define GEN_PASS_DEF_AIECANONICALIZEDEVICE
17#include "aie/Dialect/AIE/Transforms/AIEPasses.h.inc"
18} // namespace xilinx::AIE
19
20#define DEBUG_TYPE "aie-canonicalize-device"
21
22using namespace mlir;
23using namespace xilinx;
24using namespace xilinx::AIE;
25
27 : xilinx::AIE::impl::AIECanonicalizeDeviceBase<AIECanonicalizeDevicePass> {
28 void runOnOperation() override {
29
30 ModuleOp moduleOp = getOperation();
31
32 for (auto deviceOp : moduleOp.getOps<AIETarget>()) {
33 (void)deviceOp;
34 // We have a device.. Nothing to do.
35 return;
36 }
37
38 // Builder with no insertion point, because we don't want to insert
39 // the new op quite yet.
40 OpBuilder builder(moduleOp->getContext());
41
42 Location location = moduleOp.getLoc();
43 auto deviceOp = DeviceOp::create(
44 builder, location,
45 AIEDeviceAttr::get(builder.getContext(), AIEDevice::xcvc1902),
46 StringAttr::get(builder.getContext(),
47 DeviceOp::getDefaultDeviceName()));
48
49 deviceOp.getRegion().takeBody(moduleOp.getBodyRegion());
50 new (&moduleOp->getRegion(0)) Region(moduleOp);
51 moduleOp->getRegion(0).emplaceBlock();
52
53 DeviceOp::ensureTerminator(deviceOp.getBodyRegion(), builder, location);
54 OpBuilder builder2 = OpBuilder::atBlockBegin(moduleOp.getBody());
55 builder2.insert(deviceOp);
56 }
57};
58
59std::unique_ptr<OperationPass<ModuleOp>>
61 return std::make_unique<AIECanonicalizeDevicePass>();
62}
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIECanonicalizeDevicePass()