19f3f6d7bSStella Laurenzo# RUN: %PYTHON %s | FileCheck %s
29f3f6d7bSStella Laurenzo
39f3f6d7bSStella Laurenzofrom mlir.ir import *
49f3f6d7bSStella Laurenzoimport mlir.dialects.python_test as test
59f3f6d7bSStella Laurenzo
69f3f6d7bSStella Laurenzodef run(f):
79f3f6d7bSStella Laurenzo  print("\nTEST:", f.__name__)
89f3f6d7bSStella Laurenzo  f()
9*14c92070SAlex Zinenko  return f
109f3f6d7bSStella Laurenzo
119f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testAttributes
12*14c92070SAlex Zinenko@run
139f3f6d7bSStella Laurenzodef testAttributes():
140f9e6451SMehdi Amini  with Context() as ctx, Location.unknown():
150f9e6451SMehdi Amini    ctx.allow_unregistered_dialects = True
160f9e6451SMehdi Amini
179f3f6d7bSStella Laurenzo    #
189f3f6d7bSStella Laurenzo    # Check op construction with attributes.
199f3f6d7bSStella Laurenzo    #
209f3f6d7bSStella Laurenzo
219f3f6d7bSStella Laurenzo    i32 = IntegerType.get_signless(32)
229f3f6d7bSStella Laurenzo    one = IntegerAttr.get(i32, 1)
239f3f6d7bSStella Laurenzo    two = IntegerAttr.get(i32, 2)
249f3f6d7bSStella Laurenzo    unit = UnitAttr.get()
259f3f6d7bSStella Laurenzo
269f3f6d7bSStella Laurenzo    # CHECK: "python_test.attributed_op"() {
279f3f6d7bSStella Laurenzo    # CHECK-DAG: mandatory_i32 = 1 : i32
289f3f6d7bSStella Laurenzo    # CHECK-DAG: optional_i32 = 2 : i32
299f3f6d7bSStella Laurenzo    # CHECK-DAG: unit
309f3f6d7bSStella Laurenzo    # CHECK: }
319f3f6d7bSStella Laurenzo    op = test.AttributedOp(one, two, unit)
329f3f6d7bSStella Laurenzo    print(f"{op}")
339f3f6d7bSStella Laurenzo
349f3f6d7bSStella Laurenzo    # CHECK: "python_test.attributed_op"() {
359f3f6d7bSStella Laurenzo    # CHECK: mandatory_i32 = 2 : i32
369f3f6d7bSStella Laurenzo    # CHECK: }
379f3f6d7bSStella Laurenzo    op2 = test.AttributedOp(two, None, None)
389f3f6d7bSStella Laurenzo    print(f"{op2}")
399f3f6d7bSStella Laurenzo
409f3f6d7bSStella Laurenzo    #
419f3f6d7bSStella Laurenzo    # Check generic "attributes" access and mutation.
429f3f6d7bSStella Laurenzo    #
439f3f6d7bSStella Laurenzo
449f3f6d7bSStella Laurenzo    assert "additional" not in op.attributes
459f3f6d7bSStella Laurenzo
469f3f6d7bSStella Laurenzo    # CHECK: "python_test.attributed_op"() {
479f3f6d7bSStella Laurenzo    # CHECK-DAG: additional = 1 : i32
489f3f6d7bSStella Laurenzo    # CHECK-DAG: mandatory_i32 = 2 : i32
499f3f6d7bSStella Laurenzo    # CHECK: }
509f3f6d7bSStella Laurenzo    op2.attributes["additional"] = one
519f3f6d7bSStella Laurenzo    print(f"{op2}")
529f3f6d7bSStella Laurenzo
539f3f6d7bSStella Laurenzo    # CHECK: "python_test.attributed_op"() {
549f3f6d7bSStella Laurenzo    # CHECK-DAG: additional = 2 : i32
559f3f6d7bSStella Laurenzo    # CHECK-DAG: mandatory_i32 = 2 : i32
569f3f6d7bSStella Laurenzo    # CHECK: }
579f3f6d7bSStella Laurenzo    op2.attributes["additional"] = two
589f3f6d7bSStella Laurenzo    print(f"{op2}")
599f3f6d7bSStella Laurenzo
609f3f6d7bSStella Laurenzo    # CHECK: "python_test.attributed_op"() {
619f3f6d7bSStella Laurenzo    # CHECK-NOT: additional = 2 : i32
629f3f6d7bSStella Laurenzo    # CHECK:     mandatory_i32 = 2 : i32
639f3f6d7bSStella Laurenzo    # CHECK: }
649f3f6d7bSStella Laurenzo    del op2.attributes["additional"]
659f3f6d7bSStella Laurenzo    print(f"{op2}")
669f3f6d7bSStella Laurenzo
679f3f6d7bSStella Laurenzo    try:
689f3f6d7bSStella Laurenzo      print(op.attributes["additional"])
699f3f6d7bSStella Laurenzo    except KeyError:
709f3f6d7bSStella Laurenzo      pass
719f3f6d7bSStella Laurenzo    else:
729f3f6d7bSStella Laurenzo      assert False, "expected KeyError on unknown attribute key"
739f3f6d7bSStella Laurenzo
749f3f6d7bSStella Laurenzo    #
759f3f6d7bSStella Laurenzo    # Check accessors to defined attributes.
769f3f6d7bSStella Laurenzo    #
779f3f6d7bSStella Laurenzo
789f3f6d7bSStella Laurenzo    # CHECK: Mandatory: 1
799f3f6d7bSStella Laurenzo    # CHECK: Optional: 2
809f3f6d7bSStella Laurenzo    # CHECK: Unit: True
819f3f6d7bSStella Laurenzo    print(f"Mandatory: {op.mandatory_i32.value}")
829f3f6d7bSStella Laurenzo    print(f"Optional: {op.optional_i32.value}")
839f3f6d7bSStella Laurenzo    print(f"Unit: {op.unit}")
849f3f6d7bSStella Laurenzo
859f3f6d7bSStella Laurenzo    # CHECK: Mandatory: 2
869f3f6d7bSStella Laurenzo    # CHECK: Optional: None
879f3f6d7bSStella Laurenzo    # CHECK: Unit: False
889f3f6d7bSStella Laurenzo    print(f"Mandatory: {op2.mandatory_i32.value}")
899f3f6d7bSStella Laurenzo    print(f"Optional: {op2.optional_i32}")
909f3f6d7bSStella Laurenzo    print(f"Unit: {op2.unit}")
919f3f6d7bSStella Laurenzo
929f3f6d7bSStella Laurenzo    # CHECK: Mandatory: 2
939f3f6d7bSStella Laurenzo    # CHECK: Optional: None
949f3f6d7bSStella Laurenzo    # CHECK: Unit: False
959f3f6d7bSStella Laurenzo    op.mandatory_i32 = two
969f3f6d7bSStella Laurenzo    op.optional_i32 = None
979f3f6d7bSStella Laurenzo    op.unit = False
989f3f6d7bSStella Laurenzo    print(f"Mandatory: {op.mandatory_i32.value}")
999f3f6d7bSStella Laurenzo    print(f"Optional: {op.optional_i32}")
1009f3f6d7bSStella Laurenzo    print(f"Unit: {op.unit}")
1019f3f6d7bSStella Laurenzo    assert "optional_i32" not in op.attributes
1029f3f6d7bSStella Laurenzo    assert "unit" not in op.attributes
1039f3f6d7bSStella Laurenzo
1049f3f6d7bSStella Laurenzo    try:
1059f3f6d7bSStella Laurenzo      op.mandatory_i32 = None
1069f3f6d7bSStella Laurenzo    except ValueError:
1079f3f6d7bSStella Laurenzo      pass
1089f3f6d7bSStella Laurenzo    else:
1099f3f6d7bSStella Laurenzo      assert False, "expected ValueError on setting a mandatory attribute to None"
1109f3f6d7bSStella Laurenzo
1119f3f6d7bSStella Laurenzo    # CHECK: Optional: 2
1129f3f6d7bSStella Laurenzo    op.optional_i32 = two
1139f3f6d7bSStella Laurenzo    print(f"Optional: {op.optional_i32.value}")
1149f3f6d7bSStella Laurenzo
1159f3f6d7bSStella Laurenzo    # CHECK: Optional: None
1169f3f6d7bSStella Laurenzo    del op.optional_i32
1179f3f6d7bSStella Laurenzo    print(f"Optional: {op.optional_i32}")
1189f3f6d7bSStella Laurenzo
1199f3f6d7bSStella Laurenzo    # CHECK: Unit: False
1209f3f6d7bSStella Laurenzo    op.unit = None
1219f3f6d7bSStella Laurenzo    print(f"Unit: {op.unit}")
1229f3f6d7bSStella Laurenzo    assert "unit" not in op.attributes
1239f3f6d7bSStella Laurenzo
1249f3f6d7bSStella Laurenzo    # CHECK: Unit: True
1259f3f6d7bSStella Laurenzo    op.unit = True
1269f3f6d7bSStella Laurenzo    print(f"Unit: {op.unit}")
1279f3f6d7bSStella Laurenzo
1289f3f6d7bSStella Laurenzo    # CHECK: Unit: False
1299f3f6d7bSStella Laurenzo    del op.unit
1309f3f6d7bSStella Laurenzo    print(f"Unit: {op.unit}")
1319f3f6d7bSStella Laurenzo
132*14c92070SAlex Zinenko
133*14c92070SAlex Zinenko# CHECK-LABEL: TEST: inferReturnTypes
134*14c92070SAlex Zinenko@run
135*14c92070SAlex Zinenkodef inferReturnTypes():
136*14c92070SAlex Zinenko  with Context() as ctx, Location.unknown(ctx):
137*14c92070SAlex Zinenko    test.register_python_test_dialect(ctx)
138*14c92070SAlex Zinenko    module = Module.create()
139*14c92070SAlex Zinenko    with InsertionPoint(module.body):
140*14c92070SAlex Zinenko      op = test.InferResultsOp(
141*14c92070SAlex Zinenko          IntegerType.get_signless(32), IntegerType.get_signless(64))
142*14c92070SAlex Zinenko      dummy = test.DummyOp()
143*14c92070SAlex Zinenko
144*14c92070SAlex Zinenko    # CHECK: [Type(i32), Type(i64)]
145*14c92070SAlex Zinenko    iface = InferTypeOpInterface(op)
146*14c92070SAlex Zinenko    print(iface.inferReturnTypes())
147*14c92070SAlex Zinenko
148*14c92070SAlex Zinenko    # CHECK: [Type(i32), Type(i64)]
149*14c92070SAlex Zinenko    iface_static = InferTypeOpInterface(test.InferResultsOp)
150*14c92070SAlex Zinenko    print(iface.inferReturnTypes())
151*14c92070SAlex Zinenko
152*14c92070SAlex Zinenko    assert isinstance(iface.opview, test.InferResultsOp)
153*14c92070SAlex Zinenko    assert iface.opview == iface.operation.opview
154*14c92070SAlex Zinenko
155*14c92070SAlex Zinenko    try:
156*14c92070SAlex Zinenko      iface_static.opview
157*14c92070SAlex Zinenko    except TypeError:
158*14c92070SAlex Zinenko      pass
159*14c92070SAlex Zinenko    else:
160*14c92070SAlex Zinenko      assert False, ("not expected to be able to obtain an opview from a static"
161*14c92070SAlex Zinenko                     " interface")
162*14c92070SAlex Zinenko
163*14c92070SAlex Zinenko    try:
164*14c92070SAlex Zinenko      InferTypeOpInterface(dummy)
165*14c92070SAlex Zinenko    except ValueError:
166*14c92070SAlex Zinenko      pass
167*14c92070SAlex Zinenko    else:
168*14c92070SAlex Zinenko      assert False, "not expected dummy op to implement the interface"
169*14c92070SAlex Zinenko
170*14c92070SAlex Zinenko    try:
171*14c92070SAlex Zinenko      InferTypeOpInterface(test.DummyOp)
172*14c92070SAlex Zinenko    except ValueError:
173*14c92070SAlex Zinenko      pass
174*14c92070SAlex Zinenko    else:
175*14c92070SAlex Zinenko      assert False, "not expected dummy op class to implement the interface"
176