diff --git a/mlir/include/mlir-c/Dialect/Complex.h b/mlir/include/mlir-c/Dialect/Complex.h new file mode 100644 index 0000000000000..777b77d4b72fe --- /dev/null +++ b/mlir/include/mlir-c/Dialect/Complex.h @@ -0,0 +1,51 @@ +//===-- mlir-c/Dialect/Complex.h - C API for Complex dialect ------*- C -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef MLIR_C_DIALECT_COMPLEX_H +#define MLIR_C_DIALECT_COMPLEX_H + +#include "mlir-c/IR.h" + +#ifdef __cplusplus +extern "C" { +#endif + +MLIR_DECLARE_CAPI_DIALECT_REGISTRATION(Complex, complex); + +/// Checks whether the given attribute is a complex attribute. +MLIR_CAPI_EXPORTED bool mlirAttributeIsAComplex(MlirAttribute attr); + +/// Creates a complex attribute in the given context with the given +/// double real and imaginary values and double-precision FP semantics. +MLIR_CAPI_EXPORTED MlirAttribute mlirComplexAttrDoubleGet(MlirContext ctx, + MlirType type, + double real, + double imag); + +/// Same as "mlirComplexAttrDoubleGet", but if the type is not valid for a +/// construction of a ComplexAttr, returns a null MlirAttribute. +MLIR_CAPI_EXPORTED MlirAttribute mlirComplexAttrDoubleGetChecked( + MlirLocation loc, MlirType type, double real, double imag); + +/// Returns the real value stored in the given complex attribute, interpreting +/// the value as double. +MLIR_CAPI_EXPORTED double mlirComplexAttrGetRealDouble(MlirAttribute attr); + +/// Returns the imaginaryvalue stored in the given complex attribute, +/// interpreting the value as double. +MLIR_CAPI_EXPORTED double mlirComplexAttrGetImagDouble(MlirAttribute attr); + +/// Returns the typeID of a Complex attribute. +MLIR_CAPI_EXPORTED MlirTypeID mlirComplexAttrGetTypeID(void); + +#ifdef __cplusplus +} +#endif + +#endif // MLIR_C_DIALECT_COMPLEX_H diff --git a/mlir/lib/CAPI/Dialect/CMakeLists.txt b/mlir/lib/CAPI/Dialect/CMakeLists.txt index bb1fdf8be3c8f..30c9cb0593371 100644 --- a/mlir/lib/CAPI/Dialect/CMakeLists.txt +++ b/mlir/lib/CAPI/Dialect/CMakeLists.txt @@ -31,6 +31,15 @@ add_mlir_upstream_c_api_library(MLIRCAPIAsync MLIRPass ) +add_mlir_upstream_c_api_library(MLIRCAPIComplex + Complex.cpp + + PARTIAL_SOURCES_INTENDED + LINK_LIBS PUBLIC + MLIRCAPIIR + MLIRComplexDialect +) + add_mlir_upstream_c_api_library(MLIRCAPIControlFlow ControlFlow.cpp diff --git a/mlir/lib/CAPI/Dialect/Complex.cpp b/mlir/lib/CAPI/Dialect/Complex.cpp new file mode 100644 index 0000000000000..9e0a1b2086a6a --- /dev/null +++ b/mlir/lib/CAPI/Dialect/Complex.cpp @@ -0,0 +1,43 @@ +//===- Complex.cpp - C Interface for Complex 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/Complex.h" +#include "mlir-c/IR.h" +#include "mlir-c/Support.h" +#include "mlir/CAPI/Registration.h" + +MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(Complex, complex, + mlir::complex::ComplexDialect) + +bool mlirAttributeIsAComplex(MlirAttribute attr) { + return isa(unwrap(attr)); +} + +MlirAttribute mlirComplexAttrDoubleGet(MlirContext ctx, MlirType type, + double real, double imag) { + return wrap( + complex::NumberAttr::get(cast(unwrap(type)), real, imag)); +} + +MlirAttribute mlirComplexAttrDoubleGetChecked(MlirLocation loc, MlirType type, + double real, double imag) { + return wrap(complex::NumberAttr::getChecked( + unwrap(loc), cast(unwrap(type)), real, imag)); +} + +double mlirComplexAttrGetRealDouble(MlirAttribute attr) { + return cast(unwrap(attr)).getRealAsDouble(); +} + +double mlirComplexAttrGetImagDouble(MlirAttribute attr) { + return cast(unwrap(attr)).getImagAsDouble(); +} + +MlirTypeID mlirComplexAttrGetTypeID(void) { + return wrap(complex::NumberAttr::getTypeID()); +}