llvm/mlir/include/mlir/Dialect/IRDL/IR/IRDLAttributes.td

//===- IRDLAttributes.td - IR Definition Language Dialect --*- 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
//
//===----------------------------------------------------------------------===//
//
// This file declares the attributes used in IRDL.
//
//===----------------------------------------------------------------------===//

#ifndef MLIR_DIALECT_IRDL_IR_IRDLATTRIBUTES
#define MLIR_DIALECT_IRDL_IR_IRDLATTRIBUTES

include "IRDL.td"
include "mlir/IR/AttrTypeBase.td"
include "mlir/IR/EnumAttr.td"

def Variadicity : I32EnumAttr<
    "Variadicity", "variadicity kind",
    [
      I32EnumAttrCase<"single",  0>,
      I32EnumAttrCase<"optional",  1>,
      I32EnumAttrCase<"variadic", 2>,
    ]> {
  let cppNamespace = "::mlir::irdl";
  let genSpecializedAttr = 0;
}

def VariadicityAttr : EnumAttr<IRDL_Dialect, Variadicity, "variadicity"> {
  let summary =
    "A variadicity kind. Can be either 'single', 'optional', or 'variadic'";
  let description = [{
    A `irdl.variadicity` attribute specifies that the associated operand or
    result definition is either a single definition (the default), an
    optional definition, or a variadic definition.

    For instance:
    ```mlir
    irdl.operands (%arg1, single %arg2, optional %arg3, variadic %arg4)
    ```

    In this example, both %arg1 and %arg2 are single operands, %arg3 is an
    optional operand, and %arg4 is a variadic operand.
  }];
}

def VariadicityArrayAttr : ArrayOfAttr<IRDL_Dialect, "VariadicityArray", "variadicity_array",
                            VariadicityAttr.cppClassName> {}

#endif // MLIR_DIALECT_IRDL_IR_IRDLATTRIBUTES