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