695 lines · plain
1// RUN: mlir-tblgen -gen-python-op-bindings -bind-dialect=test -I %S/../../include %s | FileCheck %s2 3include "mlir/IR/OpBase.td"4include "mlir/IR/AttrTypeBase.td"5include "mlir/Interfaces/InferTypeOpInterface.td"6 7// CHECK: @_ods_cext.register_dialect8// CHECK: class _Dialect(_ods_ir.Dialect):9 // CHECK: DIALECT_NAMESPACE = "test"10def Test_Dialect : Dialect {11 let name = "test";12 let cppNamespace = "Test";13}14 15class TestOp<string mnemonic, list<Trait> traits = []> :16 Op<Test_Dialect, mnemonic, traits>;17 18// CHECK: @_ods_cext.register_operation(_Dialect)19// CHECK: class AttrSizedOperandsOp(_ods_ir.OpView):20// CHECK-LABEL: OPERATION_NAME = "test.attr_sized_operands"21// CHECK: _ODS_OPERAND_SEGMENTS = [-1,1,0,]22def AttrSizedOperandsOp : TestOp<"attr_sized_operands",23 [AttrSizedOperandSegments]> {24 // CHECK: def __init__(self, variadic1, non_variadic, *, variadic2=None, loc=None, ip=None):25 // CHECK: operands = []26 // CHECK: attributes = {}27 // CHECK: regions = None28 // CHECK: operands.append(_get_op_results_or_values(variadic1))29 // CHECK: operands.append(non_variadic)30 // CHECK: operands.append(variadic2)31 // CHECK: results = []32 // CHECK: _ods_successors = None33 // CHECK: super().__init__(34 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS,35 // CHECK: attributes=attributes, results=results, operands=operands,36 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)37 38 // CHECK: @builtins.property39 // CHECK: def variadic1(self) -> _ods_ir.OpOperandList:40 // CHECK: operand_range = _ods_segmented_accessor(41 // CHECK: self.operation.operands,42 // CHECK: self.operation.attributes["operandSegmentSizes"], 0)43 // CHECK: return operand_range44 // CHECK-NOT: if len(operand_range)45 //46 // CHECK: @builtins.property47 // CHECK: def non_variadic(self) -> _ods_ir.Value:48 // CHECK: operand_range = _ods_segmented_accessor(49 // CHECK: self.operation.operands,50 // CHECK: self.operation.attributes["operandSegmentSizes"], 1)51 // CHECK: return operand_range[0]52 //53 // CHECK: @builtins.property54 // CHECK: def variadic2(self) -> _Optional[_ods_ir.Value]:55 // CHECK: operand_range = _ods_segmented_accessor(56 // CHECK: self.operation.operands,57 // CHECK: self.operation.attributes["operandSegmentSizes"], 2)58 // CHECK: return operand_range[0] if len(operand_range) > 0 else None59 let arguments = (ins Variadic<AnyType>:$variadic1, AnyType:$non_variadic,60 Optional<AnyType>:$variadic2);61}62 63// CHECK: def attr_sized_operands(variadic1, non_variadic, *, variadic2=None, loc=None, ip=None) -> AttrSizedOperandsOp:64// CHECK: return AttrSizedOperandsOp(variadic1=variadic1, non_variadic=non_variadic, variadic2=variadic2, loc=loc, ip=ip)65 66// CHECK: @_ods_cext.register_operation(_Dialect)67// CHECK: class AttrSizedResultsOp(_ods_ir.OpView):68// CHECK-LABEL: OPERATION_NAME = "test.attr_sized_results"69// CHECK: _ODS_RESULT_SEGMENTS = [0,1,-1,]70def AttrSizedResultsOp : TestOp<"attr_sized_results",71 [AttrSizedResultSegments]> {72 // CHECK: def __init__(self, variadic1, non_variadic, variadic2, *, loc=None, ip=None):73 // CHECK: operands = []74 // CHECK: attributes = {}75 // CHECK: regions = None76 // CHECK: results = []77 // CHECK: if variadic1 is not None: results.append(variadic1)78 // CHECK: results.append(non_variadic)79 // CHECK: results.append(variadic2)80 // CHECK: _ods_successors = None81 // CHECK: super().__init__(82 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS,83 // CHECK: attributes=attributes, results=results, operands=operands,84 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)85 86 // CHECK: @builtins.property87 // CHECK: def variadic1(self) -> _Optional[_ods_ir.OpResult]:88 // CHECK: result_range = _ods_segmented_accessor(89 // CHECK: self.operation.results,90 // CHECK: self.operation.attributes["resultSegmentSizes"], 0)91 // CHECK: return result_range[0] if len(result_range) > 0 else None92 //93 // CHECK: @builtins.property94 // CHECK: def non_variadic(self) -> _ods_ir.OpResult:95 // CHECK: result_range = _ods_segmented_accessor(96 // CHECK: self.operation.results,97 // CHECK: self.operation.attributes["resultSegmentSizes"], 1)98 // CHECK: return result_range[0]99 //100 // CHECK: @builtins.property101 // CHECK: def variadic2(self) -> _ods_ir.OpResultList:102 // CHECK: result_range = _ods_segmented_accessor(103 // CHECK: self.operation.results,104 // CHECK: self.operation.attributes["resultSegmentSizes"], 2)105 // CHECK: return result_range106 // CHECK-NOT: if len(result_range)107 let results = (outs Optional<AnyType>:$variadic1, AnyType:$non_variadic,108 Variadic<AnyType>:$variadic2);109}110 111// CHECK: def attr_sized_results(variadic1, non_variadic, variadic2, *, loc=None, ip=None) -> _Union[_ods_ir.OpResult, _ods_ir.OpResultList, AttrSizedResultsOp]:112// CHECK: op = AttrSizedResultsOp(variadic1=variadic1, non_variadic=non_variadic, variadic2=variadic2, loc=loc, ip=ip); results = op.results113// CHECK: return results if len(results) > 1 else (results[0] if len(results) == 1 else op)114 115 116// CHECK: @_ods_cext.register_operation(_Dialect)117// CHECK: class AttributedOp(_ods_ir.OpView):118// CHECK-LABEL: OPERATION_NAME = "test.attributed_op"119// CHECK-NOT: _ODS_OPERAND_SEGMENTS120// CHECK-NOT: _ODS_RESULT_SEGMENTS121def AttributedOp : TestOp<"attributed_op"> {122 // CHECK: def __init__(self, i32attr, in_, *, optionalF32Attr=None, unitAttr=None, loc=None, ip=None):123 // CHECK: operands = []124 // CHECK: attributes = {}125 // CHECK: regions = None126 // CHECK: attributes["i32attr"] = (i32attr if (127 // CHECK-NEXT: isinstance(i32attr, _ods_ir.Attribute) or128 // CHECK-NEXT: not _ods_ir.AttrBuilder.contains('I32Attr')129 // CHECK-NEXT: _ods_ir.AttrBuilder.get('I32Attr')(i32attr, context=_ods_context)130 // CHECK: if optionalF32Attr is not None: attributes["optionalF32Attr"] = (optionalF32Attr131 // CHECK: if bool(unitAttr): attributes["unitAttr"] = _ods_ir.UnitAttr.get(132 // CHECK: _ods_get_default_loc_context(loc))133 // CHECK: attributes["in"] = (in_134 // CHECK: results = []135 // CHECK: _ods_successors = None136 // CHECK: super().__init__(137 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS,138 // CHECK: attributes=attributes, results=results, operands=operands,139 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)140 141 // CHECK: @builtins.property142 // CHECK: def i32attr(self) -> _ods_ir.IntegerAttr:143 // CHECK: return self.operation.attributes["i32attr"]144 145 // CHECK: @builtins.property146 // CHECK: def optionalF32Attr(self) -> _Optional[_ods_ir.FloatAttr]:147 // CHECK: if "optionalF32Attr" not in self.operation.attributes:148 // CHECK: return None149 // CHECK: return self.operation.attributes["optionalF32Attr"]150 151 // CHECK: @builtins.property152 // CHECK: def unitAttr(self) -> bool:153 // CHECK: return "unitAttr" in self.operation.attributes154 155 // CHECK: @builtins.property156 // CHECK: def in_(self) -> _ods_ir.IntegerAttr:157 // CHECK: return self.operation.attributes["in"]158 159 let arguments = (ins I32Attr:$i32attr, OptionalAttr<F32Attr>:$optionalF32Attr,160 UnitAttr:$unitAttr, I32Attr:$in);161}162 163// CHECK: def attributed_op(i32attr, in_, *, optional_f32_attr=None, unit_attr=None, loc=None, ip=None) -> AttributedOp:164// CHECK: return AttributedOp(i32attr=i32attr, in_=in_, optionalF32Attr=optional_f32_attr, unitAttr=unit_attr, loc=loc, ip=ip)165 166// CHECK: @_ods_cext.register_operation(_Dialect)167// CHECK: class AttributedOpWithOperands(_ods_ir.OpView):168// CHECK-LABEL: OPERATION_NAME = "test.attributed_op_with_operands"169// CHECK-NOT: _ODS_OPERAND_SEGMENTS170// CHECK-NOT: _ODS_RESULT_SEGMENTS171def AttributedOpWithOperands : TestOp<"attributed_op_with_operands"> {172 // CHECK: def __init__(self, _gen_arg_0, _gen_arg_2, *, in_=None, is_=None, loc=None, ip=None):173 // CHECK: operands = []174 // CHECK: attributes = {}175 // CHECK: regions = None176 // CHECK: operands.append(_gen_arg_0)177 // CHECK: operands.append(_gen_arg_2)178 // CHECK: if bool(in_): attributes["in"] = _ods_ir.UnitAttr.get(179 // CHECK: _ods_get_default_loc_context(loc))180 // CHECK: if is_ is not None: attributes["is"] = (is_181 // CHECK: results = []182 // CHECK: _ods_successors = None183 // CHECK: super().__init__(184 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS,185 // CHECK: attributes=attributes, results=results, operands=operands,186 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)187 188 // CHECK: @builtins.property189 // CHECK: def in_(self) -> bool:190 // CHECK: return "in" in self.operation.attributes191 192 // CHECK: @builtins.property193 // CHECK: def is_(self) -> _Optional[_ods_ir.FloatAttr]:194 // CHECK: if "is" not in self.operation.attributes:195 // CHECK: return None196 // CHECK: return self.operation.attributes["is"]197 let arguments = (ins I32, UnitAttr:$in, F32, OptionalAttr<F32Attr>:$is);198}199 200// CHECK: def attributed_op_with_operands(_gen_arg_0, _gen_arg_2, *, in_=None, is_=None, loc=None, ip=None) -> AttributedOpWithOperands201// CHECK: return AttributedOpWithOperands(_gen_arg_0=_gen_arg_0, _gen_arg_2=_gen_arg_2, in_=in_, is_=is_, loc=loc, ip=ip)202 203// CHECK: @_ods_cext.register_operation(_Dialect)204// CHECK: class DefaultValuedAttrsOp(_ods_ir.OpView):205// CHECK-LABEL: OPERATION_NAME = "test.default_valued_attrs"206def DefaultValuedAttrsOp : TestOp<"default_valued_attrs"> {207 // CHECK: def __init__(self, *, arr=None, unsupported=None, loc=None, ip=None):208 // CHECK: operands = []209 // CHECK: attributes = {}210 // CHECK: regions = None211 // CHECK: if arr is not None: attributes["arr"] = (arr212 // CHECK: if unsupported is not None: attributes["unsupported"] = (unsupported213 // CHECK: results = []214 // CHECK: _ods_successors = None215 // CHECK: super().__init__(216 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS,217 // CHECK: attributes=attributes, results=results, operands=operands,218 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)219 220 let arguments = (ins DefaultValuedAttr<I64ArrayAttr, "{}">:$arr,221 DefaultValuedAttr<I64ArrayAttr, "dummy_func()">:$unsupported);222 let results = (outs);223}224 225// CHECK: def default_valued_attrs(*, arr=None, unsupported=None, loc=None, ip=None) -> DefaultValuedAttrsOp:226// CHECK: return DefaultValuedAttrsOp(arr=arr, unsupported=unsupported, loc=loc, ip=ip)227 228// CHECK-LABEL: OPERATION_NAME = "test.derive_result_types_op"229def DeriveResultTypesOp : TestOp<"derive_result_types_op", [FirstAttrDerivedResultType]> {230 // CHECK: def __init__(self, type_, *, results=None, loc=None, ip=None):231 // CHECK: operands = []232 // CHECK: if results is None:233 // CHECK: _ods_result_type_source_attr = attributes["type"]234 // CHECK: _ods_derived_result_type = (235 // CHECK: _ods_ir.TypeAttr(_ods_result_type_source_attr).value236 // CHECK: if _ods_ir.TypeAttr.isinstance(_ods_result_type_source_attr) else237 // CHECK: _ods_result_type_source_attr.type)238 // CHECK: results = [_ods_derived_result_type] * 2239 let arguments = (ins TypeAttr:$type);240 let results = (outs AnyType:$res, AnyType);241}242 243// CHECK: def derive_result_types_op(type_, *, results=None, loc=None, ip=None) -> _ods_ir.OpResultList:244// CHECK: return DeriveResultTypesOp(type_=type_, results=results, loc=loc, ip=ip).results245 246// CHECK-LABEL: OPERATION_NAME = "test.derive_result_types_variadic_op"247def DeriveResultTypesVariadicOp : TestOp<"derive_result_types_variadic_op", [FirstAttrDerivedResultType]> {248 // CHECK: def __init__(self, res, _gen_res_1, type_, *, loc=None, ip=None):249 let arguments = (ins TypeAttr:$type);250 let results = (outs AnyType:$res, Variadic<AnyType>);251}252 253// CHECK: def derive_result_types_variadic_op(res, _gen_res_1, type_, *, loc=None, ip=None) -> _Union[_ods_ir.OpResult, _ods_ir.OpResultList, DeriveResultTypesVariadicOp]:254// CHECK: op = DeriveResultTypesVariadicOp(res=res, _gen_res_1=_gen_res_1, type_=type_, loc=loc, ip=ip); results = op.results255// CHECK: return results if len(results) > 1 else (results[0] if len(results) == 1 else op)256 257 258// CHECK: class DescriptionOp(_ods_ir.OpView):259// CHECK: r"""260// CHECK: This is a long description.261// CHECK: It has multiple lines.262// CHECK: A code block (to test the indent).263// CHECK: ```mlir264// CHECK: test.loop {265// CHECK: test.yield266// CHECK: }267// CHECK: ```268// CHECK: Add \"\"\" will not terminate the description.269// CHECK: """270def DescriptionOp : TestOp<"description"> {271 let description = [{272 This is a long description.273 It has multiple lines.274 275 A code block (to test the indent).276 ```mlir277 test.loop {278 test.yield279 }280 ```281 Add """ will not terminate the description.282 }];283}284 285// CHECK: @_ods_cext.register_operation(_Dialect)286// CHECK: class EmptyOp(_ods_ir.OpView):287// CHECK-LABEL: OPERATION_NAME = "test.empty"288def EmptyOp : TestOp<"empty">;289 // CHECK: def __init__(self, *, loc=None, ip=None):290 // CHECK: operands = []291 // CHECK: attributes = {}292 // CHECK: regions = None293 // CHECK: results = []294 // CHECK: _ods_successors = None295 // CHECK: super().__init__(296 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS,297 // CHECK: attributes=attributes, results=results, operands=operands,298 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)299 300// CHECK: def empty(*, loc=None, ip=None) -> EmptyOp:301// CHECK: return EmptyOp(loc=loc, ip=ip)302 303// CHECK-LABEL: OPERATION_NAME = "test.infer_result_types_implied_op"304def InferResultTypesImpliedOp : TestOp<"infer_result_types_implied_op"> {305 // CHECK: def __init__(self, *, results=None, loc=None, ip=None):306 // CHECK: _ods_context = _ods_get_default_loc_context(loc)307 // CHECK: super().__init__(308 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS,309 // CHECK: attributes=attributes, results=results, operands=operands,310 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)311 let results = (outs I32:$i32, F32:$f32);312}313 314// CHECK: def infer_result_types_implied_op(*, results=None, loc=None, ip=None) -> _ods_ir.OpResultList:315// CHECK: return InferResultTypesImpliedOp(results=results, loc=loc, ip=ip).results316 317// CHECK-LABEL: OPERATION_NAME = "test.infer_result_types_op"318def InferResultTypesOp : TestOp<"infer_result_types_op", [InferTypeOpInterface]> {319 // CHECK: def __init__(self, *, results=None, loc=None, ip=None):320 // CHECK: operands = []321 // CHECK: super().__init__(322 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS,323 // CHECK: attributes=attributes, results=results, operands=operands,324 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)325 let results = (outs AnyType, AnyType, AnyType);326}327 328// CHECK: def infer_result_types_op(*, results=None, loc=None, ip=None) -> _ods_ir.OpResultList:329// CHECK: return InferResultTypesOp(results=results, loc=loc, ip=ip).results330 331// CHECK: @_ods_cext.register_operation(_Dialect)332// CHECK: class MissingNamesOp(_ods_ir.OpView):333// CHECK-LABEL: OPERATION_NAME = "test.missing_names"334def MissingNamesOp : TestOp<"missing_names"> {335 // CHECK: def __init__(self, i32, _gen_res_1, i64, _gen_arg_0, f32, _gen_arg_2, *, loc=None, ip=None):336 // CHECK: operands = []337 // CHECK: attributes = {}338 // CHECK: regions = None339 // CHECK: operands.append(_gen_arg_0)340 // CHECK: operands.append(f32)341 // CHECK: operands.append(_gen_arg_2)342 // CHECK: results = []343 // CHECK: results.append(i32)344 // CHECK: results.append(_gen_res_1)345 // CHECK: results.append(i64)346 // CHECK: _ods_successors = None347 // CHECK: super().__init__(348 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS349 // CHECK: attributes=attributes, results=results, operands=operands,350 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)351 352 // CHECK: @builtins.property353 // CHECK: def f32(self) -> _ods_ir.Value[_ods_ir.FloatType]:354 // CHECK: return self.operation.operands[1]355 let arguments = (ins I32, F32:$f32, I64);356 357 // CHECK: @builtins.property358 // CHECK: def i32(self) -> _ods_ir.OpResult[_ods_ir.IntegerType]:359 // CHECK: return self.operation.results[0]360 //361 // CHECK: @builtins.property362 // CHECK: def i64(self) -> _ods_ir.OpResult[_ods_ir.IntegerType]:363 // CHECK: return self.operation.results[2]364 let results = (outs I32:$i32, AnyFloat, I64:$i64);365}366 367// CHECK: def missing_names(i32, _gen_res_1, i64, _gen_arg_0, f32, _gen_arg_2, *, loc=None, ip=None) -> _ods_ir.OpResultList:368// CHECK: return MissingNamesOp(i32=i32, _gen_res_1=_gen_res_1, i64=i64, _gen_arg_0=_gen_arg_0, f32=f32, _gen_arg_2=_gen_arg_2, loc=loc, ip=ip).results369 370// CHECK: @_ods_cext.register_operation(_Dialect)371// CHECK: class OneOptionalOperandOp(_ods_ir.OpView):372// CHECK-LABEL: OPERATION_NAME = "test.one_optional_operand"373// CHECK-NOT: _ODS_OPERAND_SEGMENTS374// CHECK-NOT: _ODS_RESULT_SEGMENTS375def OneOptionalOperandOp : TestOp<"one_optional_operand"> {376 let arguments = (ins AnyType:$non_optional, Optional<AnyType>:$optional);377 // CHECK: def __init__(self, non_optional, *, optional=None, loc=None, ip=None):378 // CHECK: operands = []379 // CHECK: attributes = {}380 // CHECK: regions = None381 // CHECK: operands.append(non_optional)382 // CHECK: if optional is not None: operands.append(optional)383 // CHECK: results = []384 // CHECK: _ods_successors = None385 // CHECK: super().__init__(386 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS387 // CHECK: attributes=attributes, results=results, operands=operands,388 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)389 390 // CHECK: @builtins.property391 // CHECK: def non_optional(self) -> _ods_ir.Value:392 // CHECK: return self.operation.operands[0]393 394 // CHECK: @builtins.property395 // CHECK: def optional(self) -> _Optional[_ods_ir.Value]:396 // CHECK: return None if len(self.operation.operands) < 2 else self.operation.operands[1]397}398 399// CHECK: def one_optional_operand(non_optional, *, optional=None, loc=None, ip=None) -> OneOptionalOperandOp:400// CHECK: return OneOptionalOperandOp(non_optional=non_optional, optional=optional, loc=loc, ip=ip)401 402// CHECK: @_ods_cext.register_operation(_Dialect)403// CHECK: class OneVariadicOperandOp(_ods_ir.OpView):404// CHECK-LABEL: OPERATION_NAME = "test.one_variadic_operand"405// CHECK-NOT: _ODS_OPERAND_SEGMENTS406// CHECK-NOT: _ODS_RESULT_SEGMENTS407def OneVariadicOperandOp : TestOp<"one_variadic_operand"> {408 // CHECK: def __init__(self, non_variadic, variadic, *, loc=None, ip=None):409 // CHECK: operands = []410 // CHECK: attributes = {}411 // CHECK: regions = None412 // CHECK: operands.append(non_variadic)413 // CHECK: operands.extend(_get_op_results_or_values(variadic))414 // CHECK: results = []415 // CHECK: _ods_successors = None416 // CHECK: super().__init__(417 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS418 // CHECK: attributes=attributes, results=results, operands=operands,419 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)420 421 // CHECK: @builtins.property422 // CHECK: def non_variadic(self) -> _ods_ir.Value:423 // CHECK: return self.operation.operands[0]424 //425 // CHECK: @builtins.property426 // CHECK: def variadic(self) -> _ods_ir.OpOperandList:427 // CHECK: _ods_variadic_group_length = len(self.operation.operands) - 2 + 1428 // CHECK: return self.operation.operands[1:1 + _ods_variadic_group_length]429 let arguments = (ins AnyType:$non_variadic, Variadic<AnyType>:$variadic);430}431 432// CHECK: def one_variadic_operand(non_variadic, variadic, *, loc=None, ip=None) -> OneVariadicOperandOp:433// CHECK: return OneVariadicOperandOp(non_variadic=non_variadic, variadic=variadic, loc=loc, ip=ip)434 435// CHECK: @_ods_cext.register_operation(_Dialect)436// CHECK: class OneVariadicResultOp(_ods_ir.OpView):437// CHECK-LABEL: OPERATION_NAME = "test.one_variadic_result"438// CHECK-NOT: _ODS_OPERAND_SEGMENTS439// CHECK-NOT: _ODS_RESULT_SEGMENTS440def OneVariadicResultOp : TestOp<"one_variadic_result"> {441 // CHECK: def __init__(self, variadic, non_variadic, *, loc=None, ip=None):442 // CHECK: operands = []443 // CHECK: attributes = {}444 // CHECK: regions = None445 // CHECK: results = []446 // CHECK: results.extend(variadic)447 // CHECK: results.append(non_variadic)448 // CHECK: _ods_successors = None449 // CHECK: super().__init__(450 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS451 // CHECK: attributes=attributes, results=results, operands=operands,452 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)453 454 // CHECK: @builtins.property455 // CHECK: def variadic(self) -> _ods_ir.OpResultList:456 // CHECK: _ods_variadic_group_length = len(self.operation.results) - 2 + 1457 // CHECK: return self.operation.results[0:0 + _ods_variadic_group_length]458 //459 // CHECK: @builtins.property460 // CHECK: def non_variadic(self) -> _ods_ir.OpResult:461 // CHECK: _ods_variadic_group_length = len(self.operation.results) - 2 + 1462 // CHECK: return self.operation.results[1 + _ods_variadic_group_length - 1]463 let results = (outs Variadic<AnyType>:$variadic, AnyType:$non_variadic);464}465 466// CHECK: def one_variadic_result(variadic, non_variadic, *, loc=None, ip=None) -> _Union[_ods_ir.OpResult, _ods_ir.OpResultList, OneVariadicResultOp]:467// CHECK: op = OneVariadicResultOp(variadic=variadic, non_variadic=non_variadic, loc=loc, ip=ip); results = op.results468// CHECK: return results if len(results) > 1 else (results[0] if len(results) == 1 else op)469 470// CHECK: @_ods_cext.register_operation(_Dialect)471// CHECK: class PythonKeywordOp(_ods_ir.OpView):472// CHECK-LABEL: OPERATION_NAME = "test.python_keyword"473def PythonKeywordOp : TestOp<"python_keyword"> {474 // CHECK: def __init__(self, in_, *, loc=None, ip=None):475 // CHECK: operands = []476 // CHECK: attributes = {}477 // CHECK: regions = None478 // CHECK: operands.append(in_)479 // CHECK: results = []480 // CHECK: _ods_successors = None481 // CHECK: super().__init__(482 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS483 // CHECK: attributes=attributes, results=results, operands=operands,484 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)485 486 // CHECK: @builtins.property487 // CHECK: def in_(self) -> _ods_ir.Value:488 // CHECK: return self.operation.operands[0]489 let arguments = (ins AnyType:$in);490}491 492// CHECK: def python_keyword(in_, *, loc=None, ip=None) -> PythonKeywordOp:493// CHECK: return PythonKeywordOp(in_=in_, loc=loc, ip=ip)494 495// CHECK-LABEL: OPERATION_NAME = "test.same_results"496def SameResultsOp : TestOp<"same_results", [SameOperandsAndResultType]> {497 // CHECK: def __init__(self, in1, in2, *, results=None, loc=None, ip=None):498 // CHECK: operands = []499 // CHECK: operands.append500 // CHECK: if results is None: results = [operands[0].type] * 1501 let arguments = (ins AnyType:$in1, AnyType:$in2);502 let results = (outs AnyType:$res);503}504 505// CHECK: def same_results(in1, in2, *, results=None, loc=None, ip=None) -> _ods_ir.OpResult:506// CHECK: return SameResultsOp(in1=in1, in2=in2, results=results, loc=loc, ip=ip).result507 508// CHECK-LABEL: OPERATION_NAME = "test.same_results_variadic"509def SameResultsVariadicOp : TestOp<"same_results_variadic", [SameOperandsAndResultType]> {510 // CHECK: def __init__(self, res, in1, in2, *, loc=None, ip=None):511 let arguments = (ins AnyType:$in1, AnyType:$in2);512 let results = (outs Variadic<AnyType>:$res);513}514 515// CHECK: def same_results_variadic(res, in1, in2, *, loc=None, ip=None) -> _Union[_ods_ir.OpResult, _ods_ir.OpResultList, SameResultsVariadicOp]:516// CHECK: op = SameResultsVariadicOp(res=res, in1=in1, in2=in2, loc=loc, ip=ip); results = op.results517// CHECK: return results if len(results) > 1 else (results[0] if len(results) == 1 else op)518 519 520// CHECK: @_ods_cext.register_operation(_Dialect)521// CHECK: class SameVariadicOperandSizeOp(_ods_ir.OpView):522// CHECK-LABEL: OPERATION_NAME = "test.same_variadic_operand"523def SameVariadicOperandSizeOp : TestOp<"same_variadic_operand",524 [SameVariadicOperandSize]> {525 // CHECK: @builtins.property526 // CHECK: def variadic1(self) -> _ods_ir.OpOperandList:527 // CHECK: start, elements_per_group = _ods_equally_sized_accessor(self.operation.operands, 1, 2, 0, 0)528 // CHECK: return self.operation.operands[start:start + elements_per_group]529 //530 // CHECK: @builtins.property531 // CHECK: def non_variadic(self) -> _ods_ir.Value:532 // CHECK: start, elements_per_group = _ods_equally_sized_accessor(self.operation.operands, 1, 2, 0, 1)533 // CHECK: return self.operation.operands[start]534 //535 // CHECK: @builtins.property536 // CHECK: def variadic2(self) -> _ods_ir.OpOperandList:537 // CHECK: start, elements_per_group = _ods_equally_sized_accessor(self.operation.operands, 1, 2, 1, 1)538 // CHECK: return self.operation.operands[start:start + elements_per_group]539 let arguments = (ins Variadic<AnyType>:$variadic1, AnyType:$non_variadic,540 Variadic<AnyType>:$variadic2);541}542 543// CHECK: def same_variadic_operand(variadic1, non_variadic, variadic2, *, loc=None, ip=None) -> SameVariadicOperandSizeOp:544// CHECK: return SameVariadicOperandSizeOp(variadic1=variadic1, non_variadic=non_variadic, variadic2=variadic2, loc=loc, ip=ip)545 546// CHECK: @_ods_cext.register_operation(_Dialect)547// CHECK: class SameVariadicResultSizeOp(_ods_ir.OpView):548// CHECK-LABEL: OPERATION_NAME = "test.same_variadic_result"549def SameVariadicResultSizeOp : TestOp<"same_variadic_result",550 [SameVariadicResultSize]> {551 // CHECK: @builtins.property552 // CHECK: def variadic1(self) -> _ods_ir.OpResultList:553 // CHECK: start, elements_per_group = _ods_equally_sized_accessor(self.operation.results, 1, 2, 0, 0)554 // CHECK: return self.operation.results[start:start + elements_per_group]555 //556 // CHECK: @builtins.property557 // CHECK: def non_variadic(self) -> _ods_ir.OpResult:558 // CHECK: start, elements_per_group = _ods_equally_sized_accessor(self.operation.results, 1, 2, 0, 1)559 // CHECK: return self.operation.results[start]560 //561 // CHECK: @builtins.property562 // CHECK: def variadic2(self) -> _ods_ir.OpResultList:563 // CHECK: start, elements_per_group = _ods_equally_sized_accessor(self.operation.results, 1, 2, 1, 1)564 // CHECK: return self.operation.results[start:start + elements_per_group]565 let results = (outs Variadic<AnyType>:$variadic1, AnyType:$non_variadic,566 Variadic<AnyType>:$variadic2);567}568 569// CHECK: def same_variadic_result(variadic1, non_variadic, variadic2, *, loc=None, ip=None) -> _Union[_ods_ir.OpResult, _ods_ir.OpResultList, SameVariadicResultSizeOp]:570// CHECK: op = SameVariadicResultSizeOp(variadic1=variadic1, non_variadic=non_variadic, variadic2=variadic2, loc=loc, ip=ip); results = op.results571// CHECK: return results if len(results) > 1 else (results[0] if len(results) == 1 else op)572 573// CHECK: @_ods_cext.register_operation(_Dialect)574// CHECK: class SimpleOp(_ods_ir.OpView):575// CHECK-LABEL: OPERATION_NAME = "test.simple"576def SimpleOp : TestOp<"simple"> {577 // CHECK: def __init__(self, i64, f64, i32, f32, *, loc=None, ip=None):578 // CHECK: operands = []579 // CHECK: attributes = {}580 // CHECK: regions = None581 // CHECK: operands.append(i32)582 // CHECK: operands.append(f32)583 // CHECK: results = []584 // CHECK: results.append(i64)585 // CHECK: results.append(f64)586 // CHECK: _ods_successors = None587 // CHECK: super().__init__(588 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS589 // CHECK: attributes=attributes, results=results, operands=operands,590 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)591 592 // CHECK: @builtins.property593 // CHECK: def i32(self) -> _ods_ir.Value[_ods_ir.IntegerType]:594 // CHECK: return self.operation.operands[0]595 //596 // CHECK: @builtins.property597 // CHECK: def f32(self) -> _ods_ir.Value[_ods_ir.FloatType]:598 // CHECK: return self.operation.operands[1]599 let arguments = (ins I32:$i32, F32:$f32);600 601 // CHECK: @builtins.property602 // CHECK: def i64(self) -> _ods_ir.OpResult[_ods_ir.IntegerType]:603 // CHECK: return self.operation.results[0]604 //605 // CHECK: @builtins.property606 // CHECK: def f64(self) -> _ods_ir.OpResult[_ods_ir.FloatType]:607 // CHECK: return self.operation.results[1]608 let results = (outs I64:$i64, AnyFloat:$f64);609}610 611// CHECK: def simple(i64, f64, i32, f32, *, loc=None, ip=None) -> _ods_ir.OpResultList:612// CHECK: return SimpleOp(i64=i64, f64=f64, i32=i32, f32=f32, loc=loc, ip=ip).results613 614// CHECK: class VariadicAndNormalRegionOp(_ods_ir.OpView):615// CHECK-LABEL: OPERATION_NAME = "test.variadic_and_normal_region"616def VariadicAndNormalRegionOp : TestOp<"variadic_and_normal_region"> {617 // CHECK: def __init__(self, num_variadic, *, loc=None, ip=None):618 // CHECK: operands = []619 // CHECK: attributes = {}620 // CHECK: regions = None621 // CHECK: results = []622 // CHECK: _ods_successors = None623 // CHECK: regions = 2 + num_variadic624 // CHECK: super().__init__(625 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS626 // CHECK: attributes=attributes, results=results, operands=operands,627 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)628 let regions = (region AnyRegion:$region, AnyRegion, VariadicRegion<AnyRegion>:$variadic);629 630 // CHECK: @builtins.property631 // CHECK: def region(self) -> _ods_ir.Region:632 // CHECK: return self.regions[0]633 634 // CHECK: @builtins.property635 // CHECK: def variadic(self) -> _ods_ir.RegionSequence:636 // CHECK: return self.regions[2:]637}638 639// CHECK: def variadic_and_normal_region(num_variadic, *, loc=None, ip=None) -> VariadicAndNormalRegionOp:640// CHECK: return VariadicAndNormalRegionOp(num_variadic=num_variadic, loc=loc, ip=ip)641 642// CHECK: class VariadicRegionOp(_ods_ir.OpView):643// CHECK-LABEL: OPERATION_NAME = "test.variadic_region"644def VariadicRegionOp : TestOp<"variadic_region"> {645 // CHECK: def __init__(self, num_variadic, *, loc=None, ip=None):646 // CHECK: operands = []647 // CHECK: attributes = {}648 // CHECK: regions = None649 // CHECK: results = []650 // CHECK: _ods_successors = None651 // CHECK: regions = 0 + num_variadic652 // CHECK: super().__init__(653 // CHECK: self.OPERATION_NAME, self._ODS_REGIONS, self._ODS_OPERAND_SEGMENTS, self._ODS_RESULT_SEGMENTS654 // CHECK: attributes=attributes, results=results, operands=operands,655 // CHECK: successors=_ods_successors, regions=regions, loc=loc, ip=ip)656 let regions = (region VariadicRegion<AnyRegion>:$Variadic);657 658 // CHECK: @builtins.property659 // CHECK: def Variadic(self) -> _ods_ir.RegionSequence:660 // CHECK: return self.regions[0:]661}662 663// CHECK: def variadic_region(num_variadic, *, loc=None, ip=None) -> VariadicRegionOp:664// CHECK: return VariadicRegionOp(num_variadic=num_variadic, loc=loc, ip=ip)665 666// CHECK: @_ods_cext.register_operation(_Dialect)667// CHECK: class WithSpecialCharactersOp(_ods_ir.OpView):668// CHECK-LABEL: OPERATION_NAME = "test.123with--special.characters"669def WithSpecialCharactersOp : TestOp<"123with--special.characters"> {670}671 672// CHECK: def _123with__special_characters(*, loc=None, ip=None) -> WithSpecialCharactersOp:673// CHECK: return WithSpecialCharactersOp(loc=loc, ip=ip)674 675// CHECK: @_ods_cext.register_operation(_Dialect)676// CHECK: class WithSuccessorsOp(_ods_ir.OpView):677// CHECK-LABEL: OPERATION_NAME = "test.with_successors"678def WithSuccessorsOp : TestOp<"with_successors"> {679 // CHECK-NOT: _ods_successors = None680 // CHECK: _ods_successors = []681 // CHECK-NEXT: _ods_successors.append(successor)682 // CHECK-NEXT: _ods_successors.extend(successors)683 let successors = (successor AnySuccessor:$successor,684 VariadicSuccessor<AnySuccessor>:$successors);685}686 687// CHECK: def with_successors(successor, successors, *, loc=None, ip=None) -> WithSuccessorsOp:688// CHECK: return WithSuccessorsOp(successor=successor, successors=successors, loc=loc, ip=ip)689 690// CHECK: class snake_case(_ods_ir.OpView):691// CHECK-LABEL: OPERATION_NAME = "test.snake_case"692def already_snake_case : TestOp<"snake_case"> {}693// CHECK: def snake_case_(*, loc=None, ip=None) -> snake_case:694// CHECK: return snake_case(loc=loc, ip=ip)695