13f71765aSAlex Zinenko# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 23f71765aSAlex Zinenko# See https://llvm.org/LICENSE.txt for license information. 33f71765aSAlex Zinenko# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 43f71765aSAlex Zinenko 53f71765aSAlex Zinenkotry: 63f71765aSAlex Zinenko from ..ir import * 73f71765aSAlex Zinenko from ._ods_common import get_op_result_or_value as _get_op_result_or_value, get_op_results_or_values as _get_op_results_or_values 83f71765aSAlex Zinenko from ..dialects import pdl 93f71765aSAlex Zinenkoexcept ImportError as e: 103f71765aSAlex Zinenko raise RuntimeError("Error loading imports from extension module") from e 113f71765aSAlex Zinenko 123f71765aSAlex Zinenkofrom typing import Optional, overload, Sequence, Union 133f71765aSAlex Zinenko 143f71765aSAlex Zinenko 153f71765aSAlex Zinenkodef _get_symbol_ref_attr(value: Union[Attribute, str]): 163f71765aSAlex Zinenko if isinstance(value, Attribute): 173f71765aSAlex Zinenko return value 183f71765aSAlex Zinenko return FlatSymbolRefAttr.get(value) 193f71765aSAlex Zinenko 203f71765aSAlex Zinenko 213f71765aSAlex Zinenkoclass GetClosestIsolatedParentOp: 223f71765aSAlex Zinenko 233f71765aSAlex Zinenko def __init__(self, target: Union[Operation, Value], *, loc=None, ip=None): 243f71765aSAlex Zinenko super().__init__( 253f71765aSAlex Zinenko pdl.OperationType.get(), 263f71765aSAlex Zinenko _get_op_result_or_value(target), 273f71765aSAlex Zinenko loc=loc, 283f71765aSAlex Zinenko ip=ip) 293f71765aSAlex Zinenko 303f71765aSAlex Zinenko 318e03bfc3SAlex Zinenkoclass MergeHandlesOp: 328e03bfc3SAlex Zinenko 338e03bfc3SAlex Zinenko def __init__(self, 348e03bfc3SAlex Zinenko handles: Sequence[Union[Operation, Value]], 358e03bfc3SAlex Zinenko *, 368e03bfc3SAlex Zinenko deduplicate: bool = False, 378e03bfc3SAlex Zinenko loc=None, 388e03bfc3SAlex Zinenko ip=None): 398e03bfc3SAlex Zinenko super().__init__( 408e03bfc3SAlex Zinenko pdl.OperationType.get(), [_get_op_result_or_value(h) for h in handles], 418e03bfc3SAlex Zinenko deduplicate=deduplicate, 428e03bfc3SAlex Zinenko loc=loc, 438e03bfc3SAlex Zinenko ip=ip) 448e03bfc3SAlex Zinenko 458e03bfc3SAlex Zinenko 463f71765aSAlex Zinenkoclass PDLMatchOp: 473f71765aSAlex Zinenko 483f71765aSAlex Zinenko def __init__(self, 493f71765aSAlex Zinenko target: Union[Operation, Value], 503f71765aSAlex Zinenko pattern_name: Union[Attribute, str], 513f71765aSAlex Zinenko *, 523f71765aSAlex Zinenko loc=None, 533f71765aSAlex Zinenko ip=None): 543f71765aSAlex Zinenko super().__init__( 553f71765aSAlex Zinenko pdl.OperationType.get(), 563f71765aSAlex Zinenko _get_op_result_or_value(target), 573f71765aSAlex Zinenko _get_symbol_ref_attr(pattern_name), 583f71765aSAlex Zinenko loc=loc, 593f71765aSAlex Zinenko ip=ip) 603f71765aSAlex Zinenko 613f71765aSAlex Zinenko 62*00d1a1a2SAlex Zinenkoclass ReplicateOp: 63*00d1a1a2SAlex Zinenko 64*00d1a1a2SAlex Zinenko def __init__(self, 65*00d1a1a2SAlex Zinenko pattern: Union[Operation, Value], 66*00d1a1a2SAlex Zinenko handles: Sequence[Union[Operation, Value]], 67*00d1a1a2SAlex Zinenko *, 68*00d1a1a2SAlex Zinenko loc=None, 69*00d1a1a2SAlex Zinenko ip=None): 70*00d1a1a2SAlex Zinenko super().__init__( 71*00d1a1a2SAlex Zinenko [pdl.OperationType.get()] * len(handles), 72*00d1a1a2SAlex Zinenko _get_op_result_or_value(pattern), 73*00d1a1a2SAlex Zinenko [_get_op_result_or_value(h) for h in handles], 74*00d1a1a2SAlex Zinenko loc=loc, 75*00d1a1a2SAlex Zinenko ip=ip) 76*00d1a1a2SAlex Zinenko 77*00d1a1a2SAlex Zinenko 783f71765aSAlex Zinenkoclass SequenceOp: 793f71765aSAlex Zinenko 803f71765aSAlex Zinenko @overload 813f71765aSAlex Zinenko def __init__(self, resultsOrRoot: Sequence[Type], 823f71765aSAlex Zinenko optionalRoot: Optional[Union[Operation, Value]]): 833f71765aSAlex Zinenko ... 843f71765aSAlex Zinenko 853f71765aSAlex Zinenko @overload 863f71765aSAlex Zinenko def __init__(self, resultsOrRoot: Optional[Union[Operation, Value]], 873f71765aSAlex Zinenko optionalRoot: NoneType): 883f71765aSAlex Zinenko ... 893f71765aSAlex Zinenko 903f71765aSAlex Zinenko def __init__(self, resultsOrRoot=None, optionalRoot=None): 913f71765aSAlex Zinenko results = resultsOrRoot if isinstance(resultsOrRoot, Sequence) else [] 923f71765aSAlex Zinenko root = ( 933f71765aSAlex Zinenko resultsOrRoot 943f71765aSAlex Zinenko if not isinstance(resultsOrRoot, Sequence) else optionalRoot) 953f71765aSAlex Zinenko root = _get_op_result_or_value(root) if root else None 963f71765aSAlex Zinenko super().__init__(results_=results, root=root) 973f71765aSAlex Zinenko self.regions[0].blocks.append(pdl.OperationType.get()) 983f71765aSAlex Zinenko 993f71765aSAlex Zinenko @property 1003f71765aSAlex Zinenko def body(self) -> Block: 1013f71765aSAlex Zinenko return self.regions[0].blocks[0] 1023f71765aSAlex Zinenko 1033f71765aSAlex Zinenko @property 1043f71765aSAlex Zinenko def bodyTarget(self) -> Value: 1053f71765aSAlex Zinenko return self.body.arguments[0] 1063f71765aSAlex Zinenko 1073f71765aSAlex Zinenko 1083f71765aSAlex Zinenkoclass WithPDLPatternsOp: 1093f71765aSAlex Zinenko 1103f71765aSAlex Zinenko def __init__(self, 1113f71765aSAlex Zinenko target: Optional[Union[Operation, Value]] = None, 1123f71765aSAlex Zinenko *, 1133f71765aSAlex Zinenko loc=None, 1143f71765aSAlex Zinenko ip=None): 1153f71765aSAlex Zinenko super().__init__( 1163f71765aSAlex Zinenko root=_get_op_result_or_value(target) if target else None, 1173f71765aSAlex Zinenko loc=loc, 1183f71765aSAlex Zinenko ip=ip) 1193f71765aSAlex Zinenko self.regions[0].blocks.append(pdl.OperationType.get()) 1203f71765aSAlex Zinenko 1213f71765aSAlex Zinenko @property 1223f71765aSAlex Zinenko def body(self) -> Block: 1233f71765aSAlex Zinenko return self.regions[0].blocks[0] 1243f71765aSAlex Zinenko 1253f71765aSAlex Zinenko @property 1263f71765aSAlex Zinenko def bodyTarget(self) -> Value: 1273f71765aSAlex Zinenko return self.body.arguments[0] 1283f71765aSAlex Zinenko 1293f71765aSAlex Zinenko 1303f71765aSAlex Zinenkoclass YieldOp: 1313f71765aSAlex Zinenko 1323f71765aSAlex Zinenko def __init__(self, 1333f71765aSAlex Zinenko operands: Union[Operation, Sequence[Value]] = [], 1343f71765aSAlex Zinenko *, 1353f71765aSAlex Zinenko loc=None, 1363f71765aSAlex Zinenko ip=None): 1373f71765aSAlex Zinenko super().__init__(_get_op_results_or_values(operands), loc=loc, ip=ip) 138