//===- ComplexAttributes.td - Definitions for complex attributes -*- tablegen -*-=// // // 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 COMPLEX_ATTRIBUTE #define COMPLEX_ATTRIBUTE include "mlir/IR/AttrTypeBase.td" include "mlir/IR/BuiltinAttributeInterfaces.td" include "mlir/Dialect/Complex/IR/ComplexBase.td" //===----------------------------------------------------------------------===// // Complex Attributes. //===----------------------------------------------------------------------===// class Complex_Attr traits = []> : AttrDef { let mnemonic = attrMnemonic; } def Complex_NumberAttr : Complex_Attr<"Number", "number", [TypedAttrInterface]> { let summary = "A complex number attribute"; let description = [{ A complex number attribute. Example: ```mlir #complex.number<:f64 1.0, 2.0> ``` }]; let parameters = (ins APFloatParameter<"">:$real, APFloatParameter<"">:$imag, AttributeSelfTypeParameter<"">:$type); let builders = [ AttrBuilderWithInferredContext<(ins "mlir::ComplexType":$type, "double":$real, "double":$imag), [{ auto elementType = ::llvm::cast(type.getElementType()); APFloat realFloat(real); bool unused; realFloat.convert(elementType.getFloatSemantics(), APFloat::rmNearestTiesToEven, &unused); APFloat imagFloat(imag); imagFloat.convert(elementType.getFloatSemantics(), APFloat::rmNearestTiesToEven, &unused); return $_get(type.getContext(), realFloat, imagFloat, type); }]> ]; let extraClassDeclaration = [{ mlir::Complex getValue() { return mlir::Complex(getReal(), getImag()); } }]; let genVerifyDecl = 1; let hasCustomAssemblyFormat = 1; let skipDefaultBuilders = 1; } #endif // COMPLEX_ATTRIBUTE