//===- SPIRVAvailability.td - Op Availability Base file ----*- 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 MLIR_DIALECT_SPIRV_IR_AVAILABILITY #define MLIR_DIALECT_SPIRV_IR_AVAILABILITY include "mlir/IR/OpBase.td" //===----------------------------------------------------------------------===// // Op availability definitions //===----------------------------------------------------------------------===// // The base class for defining op availability dimensions. class Availability { // The following are fields for controlling the generated C++ OpInterface. // The namespace for the generated C++ OpInterface subclass. string cppNamespace = ?; // The name for the generated C++ OpInterface subclass. string interfaceName = ?; // The documentation for the generated C++ OpInterface subclass. string interfaceDescription = ""; // The following are fields for controlling the query function signature. // The query function's return type in the generated C++ OpInterface subclass. string queryFnRetType = ?; // The query function's name in the generated C++ OpInterface subclass. string queryFnName = ?; // The following are fields for controlling the query function implementation. // The logic for merging two availability requirements. This is used to derive // the final availability requirement when, for example, an op has two // operands and these two operands have different availability requirements. // // The code should use `$overall` as the placeholder for the final requirement // and `$instance` for the current availability requirement instance. code mergeAction = ?; // The initializer for the final availability requirement. string initializer = ?; // An availability instance's type. string instanceType = ?; // The following are fields for a concrete availability instance. // The code for preparing a concrete instance. This should be C++ statements // and will be generated before the `mergeAction` logic. code instancePreparation = ""; // The availability requirement carried by a concrete instance. string instance = ?; } class MinVersionBase : Availability { let interfaceName = name; let queryFnRetType = "std::optional<" # scheme.returnType # ">"; let queryFnName = "getMinVersion"; let mergeAction = "{ " "if ($overall) { " "$overall = static_cast<" # scheme.returnType # ">(" "std::max(*$overall, $instance)); " "} else { $overall = $instance; }}"; let initializer = "::std::nullopt"; let instanceType = scheme.cppNamespace # "::" # scheme.enum.className; let instance = scheme.cppNamespace # "::" # scheme.enum.className # "::" # min.symbol; } class MaxVersionBase : Availability { let interfaceName = name; let queryFnRetType = "std::optional<" # scheme.returnType # ">"; let queryFnName = "getMaxVersion"; let mergeAction = "{ " "if ($overall) { " "$overall = static_cast<" # scheme.returnType # ">(" "std::min(*$overall, $instance)); " "} else { $overall = $instance; }}"; let initializer = "::std::nullopt"; let instanceType = scheme.cppNamespace # "::" # scheme.enum.className; let instance = scheme.cppNamespace # "::" # scheme.enum.className # "::" # max.symbol; } #endif // MLIR_DIALECT_SPIRV_IR_AVAILABILITY