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