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