1*9f3f6d7bSStella Laurenzo# RUN: %PYTHON %s | FileCheck %s
2*9f3f6d7bSStella Laurenzo
3*9f3f6d7bSStella Laurenzofrom mlir.ir import *
4*9f3f6d7bSStella Laurenzoimport mlir.dialects.python_test as test
5*9f3f6d7bSStella Laurenzo
6*9f3f6d7bSStella Laurenzodef run(f):
7*9f3f6d7bSStella Laurenzo  print("\nTEST:", f.__name__)
8*9f3f6d7bSStella Laurenzo  f()
9*9f3f6d7bSStella Laurenzo
10*9f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testAttributes
11*9f3f6d7bSStella Laurenzodef testAttributes():
12*9f3f6d7bSStella Laurenzo  with Context(), Location.unknown():
13*9f3f6d7bSStella Laurenzo    #
14*9f3f6d7bSStella Laurenzo    # Check op construction with attributes.
15*9f3f6d7bSStella Laurenzo    #
16*9f3f6d7bSStella Laurenzo
17*9f3f6d7bSStella Laurenzo    i32 = IntegerType.get_signless(32)
18*9f3f6d7bSStella Laurenzo    one = IntegerAttr.get(i32, 1)
19*9f3f6d7bSStella Laurenzo    two = IntegerAttr.get(i32, 2)
20*9f3f6d7bSStella Laurenzo    unit = UnitAttr.get()
21*9f3f6d7bSStella Laurenzo
22*9f3f6d7bSStella Laurenzo    # CHECK: "python_test.attributed_op"() {
23*9f3f6d7bSStella Laurenzo    # CHECK-DAG: mandatory_i32 = 1 : i32
24*9f3f6d7bSStella Laurenzo    # CHECK-DAG: optional_i32 = 2 : i32
25*9f3f6d7bSStella Laurenzo    # CHECK-DAG: unit
26*9f3f6d7bSStella Laurenzo    # CHECK: }
27*9f3f6d7bSStella Laurenzo    op = test.AttributedOp(one, two, unit)
28*9f3f6d7bSStella Laurenzo    print(f"{op}")
29*9f3f6d7bSStella Laurenzo
30*9f3f6d7bSStella Laurenzo    # CHECK: "python_test.attributed_op"() {
31*9f3f6d7bSStella Laurenzo    # CHECK: mandatory_i32 = 2 : i32
32*9f3f6d7bSStella Laurenzo    # CHECK: }
33*9f3f6d7bSStella Laurenzo    op2 = test.AttributedOp(two, None, None)
34*9f3f6d7bSStella Laurenzo    print(f"{op2}")
35*9f3f6d7bSStella Laurenzo
36*9f3f6d7bSStella Laurenzo    #
37*9f3f6d7bSStella Laurenzo    # Check generic "attributes" access and mutation.
38*9f3f6d7bSStella Laurenzo    #
39*9f3f6d7bSStella Laurenzo
40*9f3f6d7bSStella Laurenzo    assert "additional" not in op.attributes
41*9f3f6d7bSStella Laurenzo
42*9f3f6d7bSStella Laurenzo    # CHECK: "python_test.attributed_op"() {
43*9f3f6d7bSStella Laurenzo    # CHECK-DAG: additional = 1 : i32
44*9f3f6d7bSStella Laurenzo    # CHECK-DAG: mandatory_i32 = 2 : i32
45*9f3f6d7bSStella Laurenzo    # CHECK: }
46*9f3f6d7bSStella Laurenzo    op2.attributes["additional"] = one
47*9f3f6d7bSStella Laurenzo    print(f"{op2}")
48*9f3f6d7bSStella Laurenzo
49*9f3f6d7bSStella Laurenzo    # CHECK: "python_test.attributed_op"() {
50*9f3f6d7bSStella Laurenzo    # CHECK-DAG: additional = 2 : i32
51*9f3f6d7bSStella Laurenzo    # CHECK-DAG: mandatory_i32 = 2 : i32
52*9f3f6d7bSStella Laurenzo    # CHECK: }
53*9f3f6d7bSStella Laurenzo    op2.attributes["additional"] = two
54*9f3f6d7bSStella Laurenzo    print(f"{op2}")
55*9f3f6d7bSStella Laurenzo
56*9f3f6d7bSStella Laurenzo    # CHECK: "python_test.attributed_op"() {
57*9f3f6d7bSStella Laurenzo    # CHECK-NOT: additional = 2 : i32
58*9f3f6d7bSStella Laurenzo    # CHECK:     mandatory_i32 = 2 : i32
59*9f3f6d7bSStella Laurenzo    # CHECK: }
60*9f3f6d7bSStella Laurenzo    del op2.attributes["additional"]
61*9f3f6d7bSStella Laurenzo    print(f"{op2}")
62*9f3f6d7bSStella Laurenzo
63*9f3f6d7bSStella Laurenzo    try:
64*9f3f6d7bSStella Laurenzo      print(op.attributes["additional"])
65*9f3f6d7bSStella Laurenzo    except KeyError:
66*9f3f6d7bSStella Laurenzo      pass
67*9f3f6d7bSStella Laurenzo    else:
68*9f3f6d7bSStella Laurenzo      assert False, "expected KeyError on unknown attribute key"
69*9f3f6d7bSStella Laurenzo
70*9f3f6d7bSStella Laurenzo    #
71*9f3f6d7bSStella Laurenzo    # Check accessors to defined attributes.
72*9f3f6d7bSStella Laurenzo    #
73*9f3f6d7bSStella Laurenzo
74*9f3f6d7bSStella Laurenzo    # CHECK: Mandatory: 1
75*9f3f6d7bSStella Laurenzo    # CHECK: Optional: 2
76*9f3f6d7bSStella Laurenzo    # CHECK: Unit: True
77*9f3f6d7bSStella Laurenzo    print(f"Mandatory: {op.mandatory_i32.value}")
78*9f3f6d7bSStella Laurenzo    print(f"Optional: {op.optional_i32.value}")
79*9f3f6d7bSStella Laurenzo    print(f"Unit: {op.unit}")
80*9f3f6d7bSStella Laurenzo
81*9f3f6d7bSStella Laurenzo    # CHECK: Mandatory: 2
82*9f3f6d7bSStella Laurenzo    # CHECK: Optional: None
83*9f3f6d7bSStella Laurenzo    # CHECK: Unit: False
84*9f3f6d7bSStella Laurenzo    print(f"Mandatory: {op2.mandatory_i32.value}")
85*9f3f6d7bSStella Laurenzo    print(f"Optional: {op2.optional_i32}")
86*9f3f6d7bSStella Laurenzo    print(f"Unit: {op2.unit}")
87*9f3f6d7bSStella Laurenzo
88*9f3f6d7bSStella Laurenzo    # CHECK: Mandatory: 2
89*9f3f6d7bSStella Laurenzo    # CHECK: Optional: None
90*9f3f6d7bSStella Laurenzo    # CHECK: Unit: False
91*9f3f6d7bSStella Laurenzo    op.mandatory_i32 = two
92*9f3f6d7bSStella Laurenzo    op.optional_i32 = None
93*9f3f6d7bSStella Laurenzo    op.unit = False
94*9f3f6d7bSStella Laurenzo    print(f"Mandatory: {op.mandatory_i32.value}")
95*9f3f6d7bSStella Laurenzo    print(f"Optional: {op.optional_i32}")
96*9f3f6d7bSStella Laurenzo    print(f"Unit: {op.unit}")
97*9f3f6d7bSStella Laurenzo    assert "optional_i32" not in op.attributes
98*9f3f6d7bSStella Laurenzo    assert "unit" not in op.attributes
99*9f3f6d7bSStella Laurenzo
100*9f3f6d7bSStella Laurenzo    try:
101*9f3f6d7bSStella Laurenzo      op.mandatory_i32 = None
102*9f3f6d7bSStella Laurenzo    except ValueError:
103*9f3f6d7bSStella Laurenzo      pass
104*9f3f6d7bSStella Laurenzo    else:
105*9f3f6d7bSStella Laurenzo      assert False, "expected ValueError on setting a mandatory attribute to None"
106*9f3f6d7bSStella Laurenzo
107*9f3f6d7bSStella Laurenzo    # CHECK: Optional: 2
108*9f3f6d7bSStella Laurenzo    op.optional_i32 = two
109*9f3f6d7bSStella Laurenzo    print(f"Optional: {op.optional_i32.value}")
110*9f3f6d7bSStella Laurenzo
111*9f3f6d7bSStella Laurenzo    # CHECK: Optional: None
112*9f3f6d7bSStella Laurenzo    del op.optional_i32
113*9f3f6d7bSStella Laurenzo    print(f"Optional: {op.optional_i32}")
114*9f3f6d7bSStella Laurenzo
115*9f3f6d7bSStella Laurenzo    # CHECK: Unit: False
116*9f3f6d7bSStella Laurenzo    op.unit = None
117*9f3f6d7bSStella Laurenzo    print(f"Unit: {op.unit}")
118*9f3f6d7bSStella Laurenzo    assert "unit" not in op.attributes
119*9f3f6d7bSStella Laurenzo
120*9f3f6d7bSStella Laurenzo    # CHECK: Unit: True
121*9f3f6d7bSStella Laurenzo    op.unit = True
122*9f3f6d7bSStella Laurenzo    print(f"Unit: {op.unit}")
123*9f3f6d7bSStella Laurenzo
124*9f3f6d7bSStella Laurenzo    # CHECK: Unit: False
125*9f3f6d7bSStella Laurenzo    del op.unit
126*9f3f6d7bSStella Laurenzo    print(f"Unit: {op.unit}")
127*9f3f6d7bSStella Laurenzo
128*9f3f6d7bSStella Laurenzorun(testAttributes)
129