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() 914c92070SAlex Zinenko return f 109f3f6d7bSStella Laurenzo 119f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testAttributes 1214c92070SAlex 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 13214c92070SAlex Zinenko 13314c92070SAlex Zinenko# CHECK-LABEL: TEST: inferReturnTypes 13414c92070SAlex Zinenko@run 13514c92070SAlex Zinenkodef inferReturnTypes(): 13614c92070SAlex Zinenko with Context() as ctx, Location.unknown(ctx): 13714c92070SAlex Zinenko test.register_python_test_dialect(ctx) 13814c92070SAlex Zinenko module = Module.create() 13914c92070SAlex Zinenko with InsertionPoint(module.body): 140*2995d29bSAlex Zinenko op = test.InferResultsOp() 14114c92070SAlex Zinenko dummy = test.DummyOp() 14214c92070SAlex Zinenko 14314c92070SAlex Zinenko # CHECK: [Type(i32), Type(i64)] 14414c92070SAlex Zinenko iface = InferTypeOpInterface(op) 14514c92070SAlex Zinenko print(iface.inferReturnTypes()) 14614c92070SAlex Zinenko 14714c92070SAlex Zinenko # CHECK: [Type(i32), Type(i64)] 14814c92070SAlex Zinenko iface_static = InferTypeOpInterface(test.InferResultsOp) 14914c92070SAlex Zinenko print(iface.inferReturnTypes()) 15014c92070SAlex Zinenko 15114c92070SAlex Zinenko assert isinstance(iface.opview, test.InferResultsOp) 15214c92070SAlex Zinenko assert iface.opview == iface.operation.opview 15314c92070SAlex Zinenko 15414c92070SAlex Zinenko try: 15514c92070SAlex Zinenko iface_static.opview 15614c92070SAlex Zinenko except TypeError: 15714c92070SAlex Zinenko pass 15814c92070SAlex Zinenko else: 15914c92070SAlex Zinenko assert False, ("not expected to be able to obtain an opview from a static" 16014c92070SAlex Zinenko " interface") 16114c92070SAlex Zinenko 16214c92070SAlex Zinenko try: 16314c92070SAlex Zinenko InferTypeOpInterface(dummy) 16414c92070SAlex Zinenko except ValueError: 16514c92070SAlex Zinenko pass 16614c92070SAlex Zinenko else: 16714c92070SAlex Zinenko assert False, "not expected dummy op to implement the interface" 16814c92070SAlex Zinenko 16914c92070SAlex Zinenko try: 17014c92070SAlex Zinenko InferTypeOpInterface(test.DummyOp) 17114c92070SAlex Zinenko except ValueError: 17214c92070SAlex Zinenko pass 17314c92070SAlex Zinenko else: 17414c92070SAlex Zinenko assert False, "not expected dummy op class to implement the interface" 175*2995d29bSAlex Zinenko 176*2995d29bSAlex Zinenko 177*2995d29bSAlex Zinenko# CHECK-LABEL: TEST: resultTypesDefinedByTraits 178*2995d29bSAlex Zinenko@run 179*2995d29bSAlex Zinenkodef resultTypesDefinedByTraits(): 180*2995d29bSAlex Zinenko with Context() as ctx, Location.unknown(ctx): 181*2995d29bSAlex Zinenko test.register_python_test_dialect(ctx) 182*2995d29bSAlex Zinenko module = Module.create() 183*2995d29bSAlex Zinenko with InsertionPoint(module.body): 184*2995d29bSAlex Zinenko inferred = test.InferResultsOp() 185*2995d29bSAlex Zinenko same = test.SameOperandAndResultTypeOp([inferred.results[0]]) 186*2995d29bSAlex Zinenko # CHECK-COUNT-2: i32 187*2995d29bSAlex Zinenko print(same.one.type) 188*2995d29bSAlex Zinenko print(same.two.type) 189*2995d29bSAlex Zinenko 190*2995d29bSAlex Zinenko first_type_attr = test.FirstAttrDeriveTypeAttrOp( 191*2995d29bSAlex Zinenko inferred.results[1], TypeAttr.get(IndexType.get())) 192*2995d29bSAlex Zinenko # CHECK-COUNT-2: index 193*2995d29bSAlex Zinenko print(first_type_attr.one.type) 194*2995d29bSAlex Zinenko print(first_type_attr.two.type) 195*2995d29bSAlex Zinenko 196*2995d29bSAlex Zinenko first_attr = test.FirstAttrDeriveAttrOp( 197*2995d29bSAlex Zinenko FloatAttr.get(F32Type.get(), 3.14)) 198*2995d29bSAlex Zinenko # CHECK-COUNT-3: f32 199*2995d29bSAlex Zinenko print(first_attr.one.type) 200*2995d29bSAlex Zinenko print(first_attr.two.type) 201*2995d29bSAlex Zinenko print(first_attr.three.type) 202*2995d29bSAlex Zinenko 203*2995d29bSAlex Zinenko implied = test.InferResultsImpliedOp() 204*2995d29bSAlex Zinenko # CHECK: i32 205*2995d29bSAlex Zinenko print(implied.integer.type) 206*2995d29bSAlex Zinenko # CHECK: f64 207*2995d29bSAlex Zinenko print(implied.flt.type) 208*2995d29bSAlex Zinenko # CHECK: index 209*2995d29bSAlex Zinenko print(implied.index.type) 210