# Constraints [TOC] ## Attribute / Type Constraints When defining the arguments of an operation in TableGen, users can specify either plain attributes/types or use attribute/type constraints to levy additional requirements on the attribute value or operand type. ```tablegen def My_Type1 : MyDialect_Type<"Type1", "type1"> { ... } def My_Type2 : MyDialect_Type<"Type2", "type2"> { ... } // Plain type let arguments = (ins MyType1:$val); // Type constraint let arguments = (ins AnyTypeOf<[MyType1, MyType2]>:$val); ``` `AnyTypeOf` is an example for a type constraints. Many useful type constraints can be found in `mlir/IR/CommonTypeConstraints.td`. Additional verification code is generated for type/attribute constraints. Type constraints can not only be used when defining operation arguments, but also when defining type parameters. Optionally, C++ functions can be generated, so that type/attribute constraints can be checked from C++. The name of the C++ function must be specified in the `cppFunctionName` field. If no function name is specified, no C++ function is emitted. ```tablegen // Example: Element type constraint for VectorType def Builtin_VectorTypeElementType : AnyTypeOf<[AnyInteger, Index, AnyFloat]> { let cppFunctionName = "isValidVectorTypeElementType"; } ``` The above example tranlates into the following C++ code: ```c++ bool isValidVectorTypeElementType(::mlir::Type type) { return (((::llvm::isa<::mlir::IntegerType>(type))) || ((::llvm::isa<::mlir::IndexType>(type))) || ((::llvm::isa<::mlir::FloatType>(type)))); } ``` An extra TableGen rule is needed to emit C++ code for type/attribute constraints. This will generate only the declarations/definitions of the type/attribute constaraints that are defined in the specified `.td` file, but not those that are in included `.td` files. ```cmake mlir_tablegen(TypeConstraints.h.inc -gen-type-constraint-decls) mlir_tablegen(TypeConstraints.cpp.inc -gen-type-constraint-defs) mlir_tablegen(AttrConstraints.h.inc -gen-attr-constraint-decls) mlir_tablegen(AttrConstraints.cpp.inc -gen-attr-constraint-defs) ``` The generated `TypeConstraints.h.inc` respectivelly `AttrConstraints.h.inc` will need to be included whereever you are referencing the type/attributes constraint in C++. Note that no C++ namespace will be emitted by the code generator. The `#include` statements of the `.h.inc`/`.cpp.inc` files should be wrapped in C++ namespaces by the user.