MLIR-AIE
AIELowerSetLock.cpp
Go to the documentation of this file.
1//===- AIELowerSetLock.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// Copyright (C) 2025, Advanced Micro Devices, Inc.
8//
9//===----------------------------------------------------------------------===//
10
15
16#include "mlir/Pass/Pass.h"
17#include "mlir/Transforms/DialectConversion.h"
18
19namespace xilinx::AIEX {
20#define GEN_PASS_DEF_AIELOWERSETLOCK
21#include "aie/Dialect/AIEX/Transforms/AIEXPasses.h.inc"
22} // namespace xilinx::AIEX
23
24#define DEBUG_TYPE "aie-lower-set-lock"
25
26using namespace mlir;
27using namespace xilinx;
28using namespace xilinx::AIE;
29using namespace xilinx::AIEX;
30
33
34public:
35 SetLockToWrite32Pattern(MLIRContext *context)
36 : OpConversionPattern(context) {}
37
38 LogicalResult
39 matchAndRewrite(SetLockOp op, OpAdaptor adaptor,
40 ConversionPatternRewriter &rewriter) const override {
41 AIE::DeviceOp dev = op->getParentOfType<AIE::DeviceOp>();
42 const AIE::AIETargetModel &tm = dev.getTargetModel();
43
44 auto lockOp = op.getLockOp();
45 if (!lockOp.getLockID()) {
46 op->emitError("Tried to lower a SetLockOp on an unassigned lock");
47 return failure();
48 }
49
50 auto col = lockOp.colIndex();
51 auto row = lockOp.rowIndex();
52 uint32_t lockID = lockOp.getLockIDValue();
53
54 // The validity of this optional is already checked in the verifier
55 auto localLockAddress =
56 tm.getLocalLockAddress(lockID, lockOp.getTileID()).value();
57
58 rewriter.replaceOpWithNewOp<NpuWrite32Op>(
59 op, localLockAddress, op.getValue(), nullptr,
60 rewriter.getI32IntegerAttr(col), rewriter.getI32IntegerAttr(row));
61
62 return success();
63 };
64};
65
67 : public xilinx::AIEX::impl::AIELowerSetLockBase<AIELowerSetLockPass> {
68 void runOnOperation() override {
69
70 DeviceOp device = getOperation();
71
72 ConversionTarget target(getContext());
73 target.addLegalOp<NpuWrite32Op>();
74 target.addIllegalOp<SetLockOp>();
75
76 RewritePatternSet patterns(&getContext());
77 patterns.add<SetLockToWrite32Pattern>(&getContext());
78
79 if (failed(applyPartialConversion(device, target, std::move(patterns)))) {
80 signalPassFailure();
81 }
82 }
83};
84
85std::unique_ptr<OperationPass<DeviceOp>>
87 return std::make_unique<AIELowerSetLockPass>();
88}
std::unique_ptr< mlir::OperationPass< AIE::DeviceOp > > createAIELowerSetLockPass()
Include the generated interface declarations.
void runOnOperation() override
LogicalResult matchAndRewrite(SetLockOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override
SetLockToWrite32Pattern(MLIRContext *context)