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