1*9f3f6d7bSStella Laurenzo# RUN: %PYTHON %s | FileCheck %s
2*9f3f6d7bSStella Laurenzo
3*9f3f6d7bSStella Laurenzoimport gc
4*9f3f6d7bSStella Laurenzofrom mlir.ir import *
5*9f3f6d7bSStella Laurenzo
6*9f3f6d7bSStella Laurenzo
7*9f3f6d7bSStella Laurenzodef run(f):
8*9f3f6d7bSStella Laurenzo  print("\nTEST:", f.__name__)
9*9f3f6d7bSStella Laurenzo  f()
10*9f3f6d7bSStella Laurenzo  gc.collect()
11*9f3f6d7bSStella Laurenzo  assert Context._get_live_count() == 0
12*9f3f6d7bSStella Laurenzo  return f
13*9f3f6d7bSStella Laurenzo
14*9f3f6d7bSStella Laurenzo
15*9f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testDialectDescriptor
16*9f3f6d7bSStella Laurenzo@run
17*9f3f6d7bSStella Laurenzodef testDialectDescriptor():
18*9f3f6d7bSStella Laurenzo  ctx = Context()
19*9f3f6d7bSStella Laurenzo  d = ctx.get_dialect_descriptor("std")
20*9f3f6d7bSStella Laurenzo  # CHECK: <DialectDescriptor std>
21*9f3f6d7bSStella Laurenzo  print(d)
22*9f3f6d7bSStella Laurenzo  # CHECK: std
23*9f3f6d7bSStella Laurenzo  print(d.namespace)
24*9f3f6d7bSStella Laurenzo  try:
25*9f3f6d7bSStella Laurenzo    _ = ctx.get_dialect_descriptor("not_existing")
26*9f3f6d7bSStella Laurenzo  except ValueError:
27*9f3f6d7bSStella Laurenzo    pass
28*9f3f6d7bSStella Laurenzo  else:
29*9f3f6d7bSStella Laurenzo    assert False, "Expected exception"
30*9f3f6d7bSStella Laurenzo
31*9f3f6d7bSStella Laurenzo
32*9f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testUserDialectClass
33*9f3f6d7bSStella Laurenzo@run
34*9f3f6d7bSStella Laurenzodef testUserDialectClass():
35*9f3f6d7bSStella Laurenzo  ctx = Context()
36*9f3f6d7bSStella Laurenzo  # Access using attribute.
37*9f3f6d7bSStella Laurenzo  d = ctx.dialects.std
38*9f3f6d7bSStella Laurenzo  # Note that the standard dialect namespace prints as ''. Others will print
39*9f3f6d7bSStella Laurenzo  # as "<Dialect %namespace (..."
40*9f3f6d7bSStella Laurenzo  # CHECK: <Dialect (class mlir.dialects._std_ops_gen._Dialect)>
41*9f3f6d7bSStella Laurenzo  print(d)
42*9f3f6d7bSStella Laurenzo  try:
43*9f3f6d7bSStella Laurenzo    _ = ctx.dialects.not_existing
44*9f3f6d7bSStella Laurenzo  except AttributeError:
45*9f3f6d7bSStella Laurenzo    pass
46*9f3f6d7bSStella Laurenzo  else:
47*9f3f6d7bSStella Laurenzo    assert False, "Expected exception"
48*9f3f6d7bSStella Laurenzo
49*9f3f6d7bSStella Laurenzo  # Access using index.
50*9f3f6d7bSStella Laurenzo  d = ctx.dialects["std"]
51*9f3f6d7bSStella Laurenzo  # CHECK: <Dialect (class mlir.dialects._std_ops_gen._Dialect)>
52*9f3f6d7bSStella Laurenzo  print(d)
53*9f3f6d7bSStella Laurenzo  try:
54*9f3f6d7bSStella Laurenzo    _ = ctx.dialects["not_existing"]
55*9f3f6d7bSStella Laurenzo  except IndexError:
56*9f3f6d7bSStella Laurenzo    pass
57*9f3f6d7bSStella Laurenzo  else:
58*9f3f6d7bSStella Laurenzo    assert False, "Expected exception"
59*9f3f6d7bSStella Laurenzo
60*9f3f6d7bSStella Laurenzo  # Using the 'd' alias.
61*9f3f6d7bSStella Laurenzo  d = ctx.d["std"]
62*9f3f6d7bSStella Laurenzo  # CHECK: <Dialect (class mlir.dialects._std_ops_gen._Dialect)>
63*9f3f6d7bSStella Laurenzo  print(d)
64*9f3f6d7bSStella Laurenzo
65*9f3f6d7bSStella Laurenzo
66*9f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testCustomOpView
67*9f3f6d7bSStella Laurenzo# This test uses the standard dialect AddFOp as an example of a user op.
68*9f3f6d7bSStella Laurenzo# TODO: Op creation and access is still quite verbose: simplify this test as
69*9f3f6d7bSStella Laurenzo# additional capabilities come online.
70*9f3f6d7bSStella Laurenzo@run
71*9f3f6d7bSStella Laurenzodef testCustomOpView():
72*9f3f6d7bSStella Laurenzo
73*9f3f6d7bSStella Laurenzo  def createInput():
74*9f3f6d7bSStella Laurenzo    op = Operation.create("pytest_dummy.intinput", results=[f32])
75*9f3f6d7bSStella Laurenzo    # TODO: Auto result cast from operation
76*9f3f6d7bSStella Laurenzo    return op.results[0]
77*9f3f6d7bSStella Laurenzo
78*9f3f6d7bSStella Laurenzo  with Context() as ctx, Location.unknown():
79*9f3f6d7bSStella Laurenzo    ctx.allow_unregistered_dialects = True
80*9f3f6d7bSStella Laurenzo    m = Module.create()
81*9f3f6d7bSStella Laurenzo
82*9f3f6d7bSStella Laurenzo    with InsertionPoint(m.body):
83*9f3f6d7bSStella Laurenzo      f32 = F32Type.get()
84*9f3f6d7bSStella Laurenzo      # Create via dialects context collection.
85*9f3f6d7bSStella Laurenzo      input1 = createInput()
86*9f3f6d7bSStella Laurenzo      input2 = createInput()
87*9f3f6d7bSStella Laurenzo      op1 = ctx.dialects.std.AddFOp(input1.type, input1, input2)
88*9f3f6d7bSStella Laurenzo
89*9f3f6d7bSStella Laurenzo      # Create via an import
90*9f3f6d7bSStella Laurenzo      from mlir.dialects.std import AddFOp
91*9f3f6d7bSStella Laurenzo      AddFOp(input1.type, input1, op1.result)
92*9f3f6d7bSStella Laurenzo
93*9f3f6d7bSStella Laurenzo  # CHECK: %[[INPUT0:.*]] = "pytest_dummy.intinput"
94*9f3f6d7bSStella Laurenzo  # CHECK: %[[INPUT1:.*]] = "pytest_dummy.intinput"
95*9f3f6d7bSStella Laurenzo  # CHECK: %[[R0:.*]] = addf %[[INPUT0]], %[[INPUT1]] : f32
96*9f3f6d7bSStella Laurenzo  # CHECK: %[[R1:.*]] = addf %[[INPUT0]], %[[R0]] : f32
97*9f3f6d7bSStella Laurenzo  m.operation.print()
98*9f3f6d7bSStella Laurenzo
99*9f3f6d7bSStella Laurenzo
100*9f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testIsRegisteredOperation
101*9f3f6d7bSStella Laurenzo@run
102*9f3f6d7bSStella Laurenzodef testIsRegisteredOperation():
103*9f3f6d7bSStella Laurenzo  ctx = Context()
104*9f3f6d7bSStella Laurenzo
105*9f3f6d7bSStella Laurenzo  # CHECK: std.cond_br: True
106*9f3f6d7bSStella Laurenzo  print(f"std.cond_br: {ctx.is_registered_operation('std.cond_br')}")
107*9f3f6d7bSStella Laurenzo  # CHECK: std.not_existing: False
108*9f3f6d7bSStella Laurenzo  print(f"std.not_existing: {ctx.is_registered_operation('std.not_existing')}")
109