//===- DerivedAttributeOpInterface.td ----------------------*- 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 contains a set of interfaces for derived attribute op interface.
//
//===----------------------------------------------------------------------===//

#ifndef MLIR_DERIVEDATTRIBUTEOPINTERFACE
#define MLIR_DERIVEDATTRIBUTEOPINTERFACE

include "mlir/IR/OpBase.td"

def DerivedAttributeOpInterface : OpInterface<"DerivedAttributeOpInterface"> {
  let description = [{
    Interface to query derived attribute characteristics.

    Derived attributes are not stored in the operation but are instead derived
    from information of the operation. ODS generates convenience accessors for
    derived attributes and can be used to simplify translations.
  }];
  let cppNamespace = "::mlir";

  let methods = [
    StaticInterfaceMethod<
      /*desc=*/"Returns whether name corresponds to a derived attribute.",
      /*retTy=*/"bool",
      /*methodName=*/"isDerivedAttribute",
      /*args=*/(ins "::mlir::StringRef":$name)
    >,
    InterfaceMethod<
      /*desc=*/[{
        Materializes the derived attributes. Returns null attribute where
        unable to materialize a derived attribute as attribute.
      }],
      /*retTy=*/"::mlir::DictionaryAttr",
      /*methodName=*/"materializeDerivedAttributes"
    >,
  ];
}

#endif // MLIR_DERIVEDATTRIBUTEOPINTERFACE
