Previously, the Python bindings for the Linalg dialect relied on the internal implementation of core bindings. Most of that functionality was moved, and the remaining one does not need access to the implementation: it used to accept a dialect pointer as argument, but it can always be extracted from the operation that it also accepts; operations are available through PybindAdaptors in an opaque way. Change the bindings in that direction. This enables the decoupling of the Linalg dialect Python extension from the core IR Python extension. Reviewed By: nicolasvasilache Differential Revision: https://reviews.llvm.org/D116649
42 lines
1.6 KiB
C++
42 lines
1.6 KiB
C++
//===- Linalg.cpp - C Interface for Linalg dialect ------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "mlir-c/Dialect/Linalg.h"
|
|
#include "mlir/CAPI/Registration.h"
|
|
#include "mlir/Dialect/Linalg/IR/Linalg.h"
|
|
|
|
using namespace mlir;
|
|
using namespace mlir::linalg;
|
|
|
|
/// Apply the special region builder for the builtin named Linalg op.
|
|
/// Assert that `op` is a builtin named Linalg op.
|
|
void mlirLinalgFillBuiltinNamedOpRegion(MlirOperation mlirOp) {
|
|
Operation *op = unwrap(mlirOp);
|
|
auto linalgOp = cast<LinalgOp>(op);
|
|
auto *dialect = static_cast<LinalgDialect *>(linalgOp->getDialect());
|
|
LinalgDialect::RegionBuilderFunType fun =
|
|
dialect->getRegionBuilder(op->getName().getStringRef());
|
|
|
|
assert(fun && "Expected a builtin named Linalg op.");
|
|
assert(op->getNumRegions() == 1 && "Expected Linalg op with 1 region");
|
|
assert(op->getRegion(0).getBlocks().empty() &&
|
|
"Expected Linalg op with 0 blocks");
|
|
|
|
SmallVector<Type, 8> argTypes;
|
|
for (OpOperand *opOperand : linalgOp.getInputAndOutputOperands())
|
|
argTypes.push_back(getElementTypeOrSelf(opOperand->get().getType()));
|
|
|
|
ImplicitLocOpBuilder b(op->getLoc(), op->getContext());
|
|
Region ®ion = op->getRegion(0);
|
|
Block *body = b.createBlock(®ion, /*insertPt=*/{}, argTypes);
|
|
b.setInsertionPointToStart(body);
|
|
fun(b, *body);
|
|
}
|
|
|
|
MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(Linalg, linalg, LinalgDialect)
|