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
19#define DEBUG_TYPE "aie-lower-set-lock"
20
21using namespace mlir;
22using namespace xilinx;
23using namespace xilinx::AIE;
24using namespace xilinx::AIEX;
25
28
29public:
30 SetLockToWrite32Pattern(MLIRContext *context)
31 : OpConversionPattern(context) {}
32
33 LogicalResult
34 matchAndRewrite(SetLockOp op, OpAdaptor adaptor,
35 ConversionPatternRewriter &rewriter) const override {
36 AIE::DeviceOp dev = op->getParentOfType<AIE::DeviceOp>();
37 const AIE::AIETargetModel &tm = dev.getTargetModel();
38
39 auto lockOp = op.getLockOp();
40 if (!lockOp.getLockID()) {
41 op->emitError("Tried to lower a SetLockOp on an unassigned lock");
42 return failure();
43 }
44
45 auto col = lockOp.colIndex();
46 auto row = lockOp.rowIndex();
47 uint32_t lockID = lockOp.getLockIDValue();
48
49 // The validity of this optional is already checked in the verifier
50 auto localLockAddress =
51 tm.getLocalLockAddress(lockID, lockOp.getTileID()).value();
52
53 rewriter.replaceOpWithNewOp<NpuWrite32Op>(
54 op, localLockAddress, op.getValue(), nullptr,
55 rewriter.getI32IntegerAttr(col), rewriter.getI32IntegerAttr(row));
56
57 return success();
58 };
59};
60
61struct AIELowerSetLockPass : public AIELowerSetLockBase<AIELowerSetLockPass> {
62 void runOnOperation() override {
63
64 DeviceOp device = getOperation();
65
66 ConversionTarget target(getContext());
67 target.addLegalOp<NpuWrite32Op>();
68 target.addIllegalOp<SetLockOp>();
69
70 RewritePatternSet patterns(&getContext());
71 patterns.add<SetLockToWrite32Pattern>(&getContext());
72
73 if (failed(applyPartialConversion(device, target, std::move(patterns)))) {
74 signalPassFailure();
75 }
76 }
77};
78
79std::unique_ptr<OperationPass<DeviceOp>>
81 return std::make_unique<AIELowerSetLockPass>();
82}
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)