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
18#define DEBUG_TYPE "aie-canonicalize-device"
19
20using namespace mlir;
21using namespace xilinx;
22using namespace xilinx::AIE;
23
25 : AIECanonicalizeDeviceBase<AIECanonicalizeDevicePass> {
26 void runOnOperation() override {
27
28 ModuleOp moduleOp = getOperation();
29
30 for (auto deviceOp : moduleOp.getOps<AIETarget>()) {
31 (void)deviceOp;
32 // We have a device.. Nothing to do.
33 return;
34 }
35
36 // Builder with no insertion point, because we don't want to insert
37 // the new op quite yet.
38 OpBuilder builder(moduleOp->getContext());
39
40 Location location = builder.getUnknownLoc();
41 auto deviceOp = builder.create<DeviceOp>(
42 location,
43 AIEDeviceAttr::get(builder.getContext(), AIEDevice::xcvc1902));
44
45 deviceOp.getRegion().takeBody(moduleOp.getBodyRegion());
46 new (&moduleOp->getRegion(0)) Region(moduleOp);
47 moduleOp->getRegion(0).emplaceBlock();
48
49 DeviceOp::ensureTerminator(deviceOp.getBodyRegion(), builder, location);
50 OpBuilder builder2 = OpBuilder::atBlockBegin(moduleOp.getBody());
51 builder2.insert(deviceOp);
52 }
53};
54
55std::unique_ptr<OperationPass<ModuleOp>>
57 return std::make_unique<AIECanonicalizeDevicePass>();
58}
Include the generated interface declarations.
std::unique_ptr< mlir::OperationPass< mlir::ModuleOp > > createAIECanonicalizeDevicePass()