xref: /llvm-project/mlir/test/python/ir/attributes.py (revision 5d3ae5161210c068d01ffba36c8e0761e9971179)
19f3f6d7bSStella Laurenzo# RUN: %PYTHON %s | FileCheck %s
29f3f6d7bSStella Laurenzo
39f3f6d7bSStella Laurenzoimport gc
4619fd8c2SJeff Niu
59f3f6d7bSStella Laurenzofrom mlir.ir import *
69f3f6d7bSStella Laurenzo
7619fd8c2SJeff Niu
89f3f6d7bSStella Laurenzodef run(f):
99f3f6d7bSStella Laurenzo    print("\nTEST:", f.__name__)
109f3f6d7bSStella Laurenzo    f()
119f3f6d7bSStella Laurenzo    gc.collect()
129f3f6d7bSStella Laurenzo    assert Context._get_live_count() == 0
139f3f6d7bSStella Laurenzo    return f
149f3f6d7bSStella Laurenzo
159f3f6d7bSStella Laurenzo
169f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testParsePrint
179f3f6d7bSStella Laurenzo@run
189f3f6d7bSStella Laurenzodef testParsePrint():
199f3f6d7bSStella Laurenzo    with Context() as ctx:
209f3f6d7bSStella Laurenzo        t = Attribute.parse('"hello"')
219f3f6d7bSStella Laurenzo    assert t.context is ctx
229f3f6d7bSStella Laurenzo    ctx = None
239f3f6d7bSStella Laurenzo    gc.collect()
249f533548SIngo Müller    # CHECK: "hello"
259f3f6d7bSStella Laurenzo    print(str(t))
269566ee28Smax    # CHECK: StringAttr("hello")
279f3f6d7bSStella Laurenzo    print(repr(t))
289f3f6d7bSStella Laurenzo
299f3f6d7bSStella Laurenzo
309f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testParseError
319f3f6d7bSStella Laurenzo@run
329f3f6d7bSStella Laurenzodef testParseError():
339f3f6d7bSStella Laurenzo    with Context():
349f3f6d7bSStella Laurenzo        try:
359f3f6d7bSStella Laurenzo            t = Attribute.parse("BAD_ATTR_DOES_NOT_EXIST")
363ea4c501SRahul Kayaith        except MLIRError as e:
373ea4c501SRahul Kayaith            # CHECK: testParseError: <
383ea4c501SRahul Kayaith            # CHECK:   Unable to parse attribute:
393ea4c501SRahul Kayaith            # CHECK:   error: "BAD_ATTR_DOES_NOT_EXIST":1:1: expected attribute value
403ea4c501SRahul Kayaith            # CHECK: >
413ea4c501SRahul Kayaith            print(f"testParseError: <{e}>")
429f3f6d7bSStella Laurenzo        else:
439f3f6d7bSStella Laurenzo            print("Exception not produced")
449f3f6d7bSStella Laurenzo
459f3f6d7bSStella Laurenzo
469f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testAttrEq
479f3f6d7bSStella Laurenzo@run
489f3f6d7bSStella Laurenzodef testAttrEq():
499f3f6d7bSStella Laurenzo    with Context():
509f3f6d7bSStella Laurenzo        a1 = Attribute.parse('"attr1"')
519f3f6d7bSStella Laurenzo        a2 = Attribute.parse('"attr2"')
529f3f6d7bSStella Laurenzo        a3 = Attribute.parse('"attr1"')
539f3f6d7bSStella Laurenzo        # CHECK: a1 == a1: True
549f3f6d7bSStella Laurenzo        print("a1 == a1:", a1 == a1)
559f3f6d7bSStella Laurenzo        # CHECK: a1 == a2: False
569f3f6d7bSStella Laurenzo        print("a1 == a2:", a1 == a2)
579f3f6d7bSStella Laurenzo        # CHECK: a1 == a3: True
589f3f6d7bSStella Laurenzo        print("a1 == a3:", a1 == a3)
59fd45dccaSEisuke Kawashima        # CHECK: a1 is None: False
60fd45dccaSEisuke Kawashima        print("a1 is None:", a1 is None)
619f3f6d7bSStella Laurenzo
629f3f6d7bSStella Laurenzo
6347cc166bSJohn Demme# CHECK-LABEL: TEST: testAttrHash
6447cc166bSJohn Demme@run
6547cc166bSJohn Demmedef testAttrHash():
6647cc166bSJohn Demme    with Context():
6747cc166bSJohn Demme        a1 = Attribute.parse('"attr1"')
6847cc166bSJohn Demme        a2 = Attribute.parse('"attr2"')
6947cc166bSJohn Demme        a3 = Attribute.parse('"attr1"')
7047cc166bSJohn Demme        # CHECK: hash(a1) == hash(a3): True
7147cc166bSJohn Demme        print("hash(a1) == hash(a3):", a1.__hash__() == a3.__hash__())
7247cc166bSJohn Demme
7347cc166bSJohn Demme        s = set()
7447cc166bSJohn Demme        s.add(a1)
7547cc166bSJohn Demme        s.add(a2)
7647cc166bSJohn Demme        s.add(a3)
7747cc166bSJohn Demme        # CHECK: len(s): 2
7847cc166bSJohn Demme        print("len(s): ", len(s))
7947cc166bSJohn Demme
8047cc166bSJohn Demme
819f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testAttrCast
829f3f6d7bSStella Laurenzo@run
839f3f6d7bSStella Laurenzodef testAttrCast():
849f3f6d7bSStella Laurenzo    with Context():
859f3f6d7bSStella Laurenzo        a1 = Attribute.parse('"attr1"')
869f3f6d7bSStella Laurenzo        a2 = Attribute(a1)
879f3f6d7bSStella Laurenzo        # CHECK: a1 == a2: True
889f3f6d7bSStella Laurenzo        print("a1 == a2:", a1 == a2)
899f3f6d7bSStella Laurenzo
909f3f6d7bSStella Laurenzo
9178f2dae0SAlex Zinenko# CHECK-LABEL: TEST: testAttrIsInstance
9278f2dae0SAlex Zinenko@run
9378f2dae0SAlex Zinenkodef testAttrIsInstance():
9478f2dae0SAlex Zinenko    with Context():
9578f2dae0SAlex Zinenko        a1 = Attribute.parse("42")
9678f2dae0SAlex Zinenko        a2 = Attribute.parse("[42]")
9778f2dae0SAlex Zinenko        assert IntegerAttr.isinstance(a1)
9878f2dae0SAlex Zinenko        assert not IntegerAttr.isinstance(a2)
9978f2dae0SAlex Zinenko        assert not ArrayAttr.isinstance(a1)
10078f2dae0SAlex Zinenko        assert ArrayAttr.isinstance(a2)
10178f2dae0SAlex Zinenko
10278f2dae0SAlex Zinenko
1039f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testAttrEqDoesNotRaise
1049f3f6d7bSStella Laurenzo@run
1059f3f6d7bSStella Laurenzodef testAttrEqDoesNotRaise():
1069f3f6d7bSStella Laurenzo    with Context():
1079f3f6d7bSStella Laurenzo        a1 = Attribute.parse('"attr1"')
1089f3f6d7bSStella Laurenzo        not_an_attr = "foo"
1099f3f6d7bSStella Laurenzo        # CHECK: False
1109f3f6d7bSStella Laurenzo        print(a1 == not_an_attr)
1119f3f6d7bSStella Laurenzo        # CHECK: False
112fd45dccaSEisuke Kawashima        print(a1 is None)
1139f3f6d7bSStella Laurenzo        # CHECK: True
114fd45dccaSEisuke Kawashima        print(a1 is not None)
1159f3f6d7bSStella Laurenzo
1169f3f6d7bSStella Laurenzo
1179f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testAttrCapsule
1189f3f6d7bSStella Laurenzo@run
1199f3f6d7bSStella Laurenzodef testAttrCapsule():
1209f3f6d7bSStella Laurenzo    with Context() as ctx:
1219f3f6d7bSStella Laurenzo        a1 = Attribute.parse('"attr1"')
1229f3f6d7bSStella Laurenzo    # CHECK: mlir.ir.Attribute._CAPIPtr
1239f3f6d7bSStella Laurenzo    attr_capsule = a1._CAPIPtr
1249f3f6d7bSStella Laurenzo    print(attr_capsule)
1259f3f6d7bSStella Laurenzo    a2 = Attribute._CAPICreate(attr_capsule)
1269f3f6d7bSStella Laurenzo    assert a2 == a1
1279f3f6d7bSStella Laurenzo    assert a2.context is ctx
1289f3f6d7bSStella Laurenzo
1299f3f6d7bSStella Laurenzo
1309f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testStandardAttrCasts
1319f3f6d7bSStella Laurenzo@run
1329f3f6d7bSStella Laurenzodef testStandardAttrCasts():
1339f3f6d7bSStella Laurenzo    with Context():
1349f3f6d7bSStella Laurenzo        a1 = Attribute.parse('"attr1"')
1359f3f6d7bSStella Laurenzo        astr = StringAttr(a1)
1369f3f6d7bSStella Laurenzo        aself = StringAttr(astr)
1379566ee28Smax        # CHECK: StringAttr("attr1")
1389f3f6d7bSStella Laurenzo        print(repr(astr))
1399f3f6d7bSStella Laurenzo        try:
1409f3f6d7bSStella Laurenzo            tillegal = StringAttr(Attribute.parse("1.0"))
1419f3f6d7bSStella Laurenzo        except ValueError as e:
1429f3f6d7bSStella Laurenzo            # CHECK: ValueError: Cannot cast attribute to StringAttr (from Attribute(1.000000e+00 : f64))
1439f3f6d7bSStella Laurenzo            print("ValueError:", e)
1449f3f6d7bSStella Laurenzo        else:
1459f3f6d7bSStella Laurenzo            print("Exception not produced")
1469f3f6d7bSStella Laurenzo
1479f3f6d7bSStella Laurenzo
1489f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testAffineMapAttr
1499f3f6d7bSStella Laurenzo@run
1509f3f6d7bSStella Laurenzodef testAffineMapAttr():
1519f3f6d7bSStella Laurenzo    with Context() as ctx:
1529f3f6d7bSStella Laurenzo        d0 = AffineDimExpr.get(0)
1539f3f6d7bSStella Laurenzo        d1 = AffineDimExpr.get(1)
1549f3f6d7bSStella Laurenzo        c2 = AffineConstantExpr.get(2)
1559f3f6d7bSStella Laurenzo        map0 = AffineMap.get(2, 3, [])
1569f3f6d7bSStella Laurenzo
1579f3f6d7bSStella Laurenzo        # CHECK: affine_map<(d0, d1)[s0, s1, s2] -> ()>
1589f3f6d7bSStella Laurenzo        attr_built = AffineMapAttr.get(map0)
1599f3f6d7bSStella Laurenzo        print(str(attr_built))
160c36b4248SBimo        assert attr_built.value == map0
1619f3f6d7bSStella Laurenzo        attr_parsed = Attribute.parse(str(attr_built))
1629f3f6d7bSStella Laurenzo        assert attr_built == attr_parsed
1639f3f6d7bSStella Laurenzo
1649f3f6d7bSStella Laurenzo
165334873feSAmy Wang# CHECK-LABEL: TEST: testIntegerSetAttr
166334873feSAmy Wang@run
167334873feSAmy Wangdef testIntegerSetAttr():
168334873feSAmy Wang    with Context() as ctx:
169334873feSAmy Wang        d0 = AffineDimExpr.get(0)
170334873feSAmy Wang        d1 = AffineDimExpr.get(1)
171334873feSAmy Wang        s0 = AffineSymbolExpr.get(0)
172334873feSAmy Wang        c42 = AffineConstantExpr.get(42)
173334873feSAmy Wang        set0 = IntegerSet.get(2, 1, [d0 - d1, s0 - c42], [True, False])
174334873feSAmy Wang
175334873feSAmy Wang        # CHECK: affine_set<(d0, d1)[s0] : (d0 - d1 == 0, s0 - 42 >= 0)>
176334873feSAmy Wang        attr_built = IntegerSetAttr.get(set0)
177334873feSAmy Wang        print(str(attr_built))
178334873feSAmy Wang
179334873feSAmy Wang        attr_parsed = Attribute.parse(str(attr_built))
180334873feSAmy Wang        assert attr_built == attr_parsed
181334873feSAmy Wang
182334873feSAmy Wang
1839f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testFloatAttr
1849f3f6d7bSStella Laurenzo@run
1859f3f6d7bSStella Laurenzodef testFloatAttr():
1869f3f6d7bSStella Laurenzo    with Context(), Location.unknown():
1879f3f6d7bSStella Laurenzo        fattr = FloatAttr(Attribute.parse("42.0 : f32"))
1889f3f6d7bSStella Laurenzo        # CHECK: fattr value: 42.0
1899f3f6d7bSStella Laurenzo        print("fattr value:", fattr.value)
1902a5d4974SIngo Müller        # CHECK: fattr float: 42.0 <class 'float'>
1912a5d4974SIngo Müller        print("fattr float:", float(fattr), type(float(fattr)))
1929f3f6d7bSStella Laurenzo
1939f3f6d7bSStella Laurenzo        # Test factory methods.
1949f3f6d7bSStella Laurenzo        # CHECK: default_get: 4.200000e+01 : f32
195f9008e63STobias Hieta        print("default_get:", FloatAttr.get(F32Type.get(), 42.0))
1969f3f6d7bSStella Laurenzo        # CHECK: f32_get: 4.200000e+01 : f32
1979f3f6d7bSStella Laurenzo        print("f32_get:", FloatAttr.get_f32(42.0))
1989f3f6d7bSStella Laurenzo        # CHECK: f64_get: 4.200000e+01 : f64
1999f3f6d7bSStella Laurenzo        print("f64_get:", FloatAttr.get_f64(42.0))
2009f3f6d7bSStella Laurenzo        try:
201f9008e63STobias Hieta            fattr_invalid = FloatAttr.get(IntegerType.get_signless(32), 42)
2023ea4c501SRahul Kayaith        except MLIRError as e:
2033ea4c501SRahul Kayaith            # CHECK: Invalid attribute:
2043ea4c501SRahul Kayaith            # CHECK: error: unknown: expected floating point type
2059f3f6d7bSStella Laurenzo            print(e)
2069f3f6d7bSStella Laurenzo        else:
2079f3f6d7bSStella Laurenzo            print("Exception not produced")
2089f3f6d7bSStella Laurenzo
2099f3f6d7bSStella Laurenzo
2109f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testIntegerAttr
2119f3f6d7bSStella Laurenzo@run
2129f3f6d7bSStella Laurenzodef testIntegerAttr():
2139f3f6d7bSStella Laurenzo    with Context() as ctx:
214e9db306dSrkayaith        i_attr = IntegerAttr(Attribute.parse("42"))
215e9db306dSrkayaith        # CHECK: i_attr value: 42
216e9db306dSrkayaith        print("i_attr value:", i_attr.value)
217e9db306dSrkayaith        # CHECK: i_attr type: i64
218e9db306dSrkayaith        print("i_attr type:", i_attr.type)
2192a5d4974SIngo Müller        # CHECK: i_attr int: 42 <class 'int'>
2202a5d4974SIngo Müller        print("i_attr int:", int(i_attr), type(int(i_attr)))
221e9db306dSrkayaith        si_attr = IntegerAttr(Attribute.parse("-1 : si8"))
222e9db306dSrkayaith        # CHECK: si_attr value: -1
223e9db306dSrkayaith        print("si_attr value:", si_attr.value)
224e9db306dSrkayaith        ui_attr = IntegerAttr(Attribute.parse("255 : ui8"))
2252a5d4974SIngo Müller        # CHECK: i_attr int: -1 <class 'int'>
2262a5d4974SIngo Müller        print("si_attr int:", int(si_attr), type(int(si_attr)))
227e9db306dSrkayaith        # CHECK: ui_attr value: 255
228e9db306dSrkayaith        print("ui_attr value:", ui_attr.value)
2292a5d4974SIngo Müller        # CHECK: i_attr int: 255 <class 'int'>
2302a5d4974SIngo Müller        print("ui_attr int:", int(ui_attr), type(int(ui_attr)))
231e9db306dSrkayaith        idx_attr = IntegerAttr(Attribute.parse("-1 : index"))
232e9db306dSrkayaith        # CHECK: idx_attr value: -1
233e9db306dSrkayaith        print("idx_attr value:", idx_attr.value)
2342a5d4974SIngo Müller        # CHECK: idx_attr int: -1 <class 'int'>
2352a5d4974SIngo Müller        print("idx_attr int:", int(idx_attr), type(int(idx_attr)))
2369f3f6d7bSStella Laurenzo
2379f3f6d7bSStella Laurenzo        # Test factory methods.
2389f3f6d7bSStella Laurenzo        # CHECK: default_get: 42 : i32
239f9008e63STobias Hieta        print("default_get:", IntegerAttr.get(IntegerType.get_signless(32), 42))
2409f3f6d7bSStella Laurenzo
2419f3f6d7bSStella Laurenzo
2429f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testBoolAttr
2439f3f6d7bSStella Laurenzo@run
2449f3f6d7bSStella Laurenzodef testBoolAttr():
2459f3f6d7bSStella Laurenzo    with Context() as ctx:
2469f3f6d7bSStella Laurenzo        battr = BoolAttr(Attribute.parse("true"))
2479f3f6d7bSStella Laurenzo        # CHECK: iattr value: True
2489f3f6d7bSStella Laurenzo        print("iattr value:", battr.value)
2492a5d4974SIngo Müller        # CHECK: iattr bool: True <class 'bool'>
2502a5d4974SIngo Müller        print("iattr bool:", bool(battr), type(bool(battr)))
2519f3f6d7bSStella Laurenzo
2529f3f6d7bSStella Laurenzo        # Test factory methods.
2539f3f6d7bSStella Laurenzo        # CHECK: default_get: true
2549f3f6d7bSStella Laurenzo        print("default_get:", BoolAttr.get(True))
2559f3f6d7bSStella Laurenzo
2569f3f6d7bSStella Laurenzo
2579f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testFlatSymbolRefAttr
2589f3f6d7bSStella Laurenzo@run
2599f3f6d7bSStella Laurenzodef testFlatSymbolRefAttr():
2609f3f6d7bSStella Laurenzo    with Context() as ctx:
2614eee9ef9Smax        sattr = Attribute.parse("@symbol")
2629f3f6d7bSStella Laurenzo        # CHECK: symattr value: symbol
2639f3f6d7bSStella Laurenzo        print("symattr value:", sattr.value)
2649f3f6d7bSStella Laurenzo
2659f3f6d7bSStella Laurenzo        # Test factory methods.
2669f3f6d7bSStella Laurenzo        # CHECK: default_get: @foobar
2679f3f6d7bSStella Laurenzo        print("default_get:", FlatSymbolRefAttr.get("foobar"))
2689f3f6d7bSStella Laurenzo
2699f3f6d7bSStella Laurenzo
2704eee9ef9Smax# CHECK-LABEL: TEST: testSymbolRefAttr
2714eee9ef9Smax@run
2724eee9ef9Smaxdef testSymbolRefAttr():
2734eee9ef9Smax    with Context() as ctx:
2744eee9ef9Smax        sattr = Attribute.parse("@symbol1::@symbol2")
2754eee9ef9Smax        # CHECK: symattr value: ['symbol1', 'symbol2']
2764eee9ef9Smax        print("symattr value:", sattr.value)
2774eee9ef9Smax
2784eee9ef9Smax        # CHECK: default_get: @symbol1::@symbol2
2794eee9ef9Smax        print("default_get:", SymbolRefAttr.get(["symbol1", "symbol2"]))
2804eee9ef9Smax
2814eee9ef9Smax        # CHECK: default_get: @"@symbol1"::@"@symbol2"
2824eee9ef9Smax        print("default_get:", SymbolRefAttr.get(["@symbol1", "@symbol2"]))
2834eee9ef9Smax
2844eee9ef9Smax
2855c3861b2SYun Long# CHECK-LABEL: TEST: testOpaqueAttr
2865c3861b2SYun Long@run
2875c3861b2SYun Longdef testOpaqueAttr():
2885c3861b2SYun Long    with Context() as ctx:
2895c3861b2SYun Long        ctx.allow_unregistered_dialects = True
2905c3861b2SYun Long        oattr = OpaqueAttr(Attribute.parse("#pytest_dummy.dummyattr<>"))
2915c3861b2SYun Long        # CHECK: oattr value: pytest_dummy
2925c3861b2SYun Long        print("oattr value:", oattr.dialect_namespace)
29362bf6c2eSChris Jones        # CHECK: oattr value: b'dummyattr<>'
2945c3861b2SYun Long        print("oattr value:", oattr.data)
2955c3861b2SYun Long
2965c3861b2SYun Long        # Test factory methods.
297ab9cdf09SRiver Riddle        # CHECK: default_get: #foobar<123>
2985c3861b2SYun Long        print(
2995c3861b2SYun Long            "default_get:",
300f9008e63STobias Hieta            OpaqueAttr.get("foobar", bytes("123", "utf-8"), NoneType.get()),
301f9008e63STobias Hieta        )
3025c3861b2SYun Long
3035c3861b2SYun Long
3049f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testStringAttr
3059f3f6d7bSStella Laurenzo@run
3069f3f6d7bSStella Laurenzodef testStringAttr():
3079f3f6d7bSStella Laurenzo    with Context() as ctx:
3089f3f6d7bSStella Laurenzo        sattr = StringAttr(Attribute.parse('"stringattr"'))
3099f3f6d7bSStella Laurenzo        # CHECK: sattr value: stringattr
3109f3f6d7bSStella Laurenzo        print("sattr value:", sattr.value)
3119f533548SIngo Müller        # CHECK: sattr value: b'stringattr'
3129f533548SIngo Müller        print("sattr value:", sattr.value_bytes)
3139f3f6d7bSStella Laurenzo
3149f3f6d7bSStella Laurenzo        # Test factory methods.
3159f533548SIngo Müller        # CHECK: default_get: "foobar"
3169f533548SIngo Müller        print("default_get:", StringAttr.get("foobar"))
3179f533548SIngo Müller        # CHECK: typed_get: "12345" : i32
3189f533548SIngo Müller        print("typed_get:", StringAttr.get_typed(IntegerType.get_signless(32), "12345"))
3199f3f6d7bSStella Laurenzo
3209f3f6d7bSStella Laurenzo
3219f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testNamedAttr
3229f3f6d7bSStella Laurenzo@run
3239f3f6d7bSStella Laurenzodef testNamedAttr():
3249f3f6d7bSStella Laurenzo    with Context():
3259f3f6d7bSStella Laurenzo        a = Attribute.parse('"stringattr"')
3269f3f6d7bSStella Laurenzo        named = a.get_named("foobar")  # Note: under the small object threshold
3279f533548SIngo Müller        # CHECK: attr: "stringattr"
3289f533548SIngo Müller        print("attr:", named.attr)
3299f3f6d7bSStella Laurenzo        # CHECK: name: foobar
3309f3f6d7bSStella Laurenzo        print("name:", named.name)
3319f3f6d7bSStella Laurenzo        # CHECK: named: NamedAttribute(foobar="stringattr")
3329f3f6d7bSStella Laurenzo        print("named:", named)
3339f3f6d7bSStella Laurenzo
3349f3f6d7bSStella Laurenzo
3359f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testDenseIntAttr
3369f3f6d7bSStella Laurenzo@run
3379f3f6d7bSStella Laurenzodef testDenseIntAttr():
3389f3f6d7bSStella Laurenzo    with Context():
3399f3f6d7bSStella Laurenzo        raw = Attribute.parse("dense<[[0,1,2],[3,4,5]]> : vector<2x3xi32>")
3409f3f6d7bSStella Laurenzo        # CHECK: attr: dense<[{{\[}}0, 1, 2], [3, 4, 5]]>
3419f3f6d7bSStella Laurenzo        print("attr:", raw)
3429f3f6d7bSStella Laurenzo
3439f3f6d7bSStella Laurenzo        a = DenseIntElementsAttr(raw)
3449f3f6d7bSStella Laurenzo        assert len(a) == 6
3459f3f6d7bSStella Laurenzo
3469f3f6d7bSStella Laurenzo        # CHECK: 0 1 2 3 4 5
3479f3f6d7bSStella Laurenzo        for value in a:
3489f3f6d7bSStella Laurenzo            print(value, end=" ")
3499f3f6d7bSStella Laurenzo        print()
3509f3f6d7bSStella Laurenzo
3519f3f6d7bSStella Laurenzo        # CHECK: i32
3529f3f6d7bSStella Laurenzo        print(ShapedType(a.type).element_type)
3539f3f6d7bSStella Laurenzo
3549f3f6d7bSStella Laurenzo        raw = Attribute.parse("dense<[true,false,true,false]> : vector<4xi1>")
3559f3f6d7bSStella Laurenzo        # CHECK: attr: dense<[true, false, true, false]>
3569f3f6d7bSStella Laurenzo        print("attr:", raw)
3579f3f6d7bSStella Laurenzo
3589f3f6d7bSStella Laurenzo        a = DenseIntElementsAttr(raw)
3599f3f6d7bSStella Laurenzo        assert len(a) == 4
3609f3f6d7bSStella Laurenzo
3619f3f6d7bSStella Laurenzo        # CHECK: 1 0 1 0
3629f3f6d7bSStella Laurenzo        for value in a:
3639f3f6d7bSStella Laurenzo            print(value, end=" ")
3649f3f6d7bSStella Laurenzo        print()
3659f3f6d7bSStella Laurenzo
3669f3f6d7bSStella Laurenzo        # CHECK: i1
3679f3f6d7bSStella Laurenzo        print(ShapedType(a.type).element_type)
3689f3f6d7bSStella Laurenzo
369*5d3ae516SMatthias Gehre        shape = Attribute.parse("dense<[0, 1, 2, 3]> : vector<4xindex>")
370*5d3ae516SMatthias Gehre        # CHECK: attr: dense<[0, 1, 2, 3]>
371*5d3ae516SMatthias Gehre        print("attr:", shape)
372*5d3ae516SMatthias Gehre
3739f3f6d7bSStella Laurenzo
374619fd8c2SJeff Niu@run
375619fd8c2SJeff Niudef testDenseArrayGetItem():
3769566ee28Smax    def print_item(attr_asm):
3779566ee28Smax        attr = Attribute.parse(attr_asm)
378619fd8c2SJeff Niu        print(f"{len(attr)}: {attr[0]}, {attr[1]}")
379619fd8c2SJeff Niu
380619fd8c2SJeff Niu    with Context():
3818dcb6722SIngo Müller        # CHECK: 2: False, True
3829566ee28Smax        print_item("array<i1: false, true>")
383619fd8c2SJeff Niu        # CHECK: 2: 2, 3
3849566ee28Smax        print_item("array<i8: 2, 3>")
385619fd8c2SJeff Niu        # CHECK: 2: 4, 5
3869566ee28Smax        print_item("array<i16: 4, 5>")
387619fd8c2SJeff Niu        # CHECK: 2: 6, 7
3889566ee28Smax        print_item("array<i32: 6, 7>")
389619fd8c2SJeff Niu        # CHECK: 2: 8, 9
3909566ee28Smax        print_item("array<i64: 8, 9>")
391619fd8c2SJeff Niu        # CHECK: 2: 1.{{0+}}, 2.{{0+}}
3929566ee28Smax        print_item("array<f32: 1.0, 2.0>")
393619fd8c2SJeff Niu        # CHECK: 2: 3.{{0+}}, 4.{{0+}}
3949566ee28Smax        print_item("array<f64: 3.0, 4.0>")
395619fd8c2SJeff Niu
3968dcb6722SIngo Müller        class MyBool:
3978dcb6722SIngo Müller            def __bool__(self):
3988dcb6722SIngo Müller                return True
3998dcb6722SIngo Müller
4008dcb6722SIngo Müller        # CHECK: myboolarray: array<i1: true>
4018dcb6722SIngo Müller        print("myboolarray:", DenseBoolArrayAttr.get([MyBool()]))
4028dcb6722SIngo Müller
403619fd8c2SJeff Niu
4042a5d4974SIngo Müller# CHECK-LABEL: TEST: testDenseArrayAttrConstruction
4052a5d4974SIngo Müller@run
4062a5d4974SIngo Müllerdef testDenseArrayAttrConstruction():
4072a5d4974SIngo Müller    with Context(), Location.unknown():
4082a5d4974SIngo Müller
4092a5d4974SIngo Müller        def create_and_print(cls, x):
4102a5d4974SIngo Müller            try:
4112a5d4974SIngo Müller                darr = cls.get(x)
4122a5d4974SIngo Müller                print(f"input: {x} ({type(x)}), result: {darr}")
4132a5d4974SIngo Müller            except Exception as ex:
4142a5d4974SIngo Müller                print(f"input: {x} ({type(x)}), error: {ex}")
4152a5d4974SIngo Müller
4162a5d4974SIngo Müller        # CHECK: input: [4, 2] (<class 'list'>),
4172a5d4974SIngo Müller        # CHECK-SAME: result: array<i8: 4, 2>
4182a5d4974SIngo Müller        create_and_print(DenseI8ArrayAttr, [4, 2])
4192a5d4974SIngo Müller
4202a5d4974SIngo Müller        # CHECK: input: [4, 2.0] (<class 'list'>),
4212a5d4974SIngo Müller        # CHECK-SAME: error: get(): incompatible function arguments
4222a5d4974SIngo Müller        create_and_print(DenseI8ArrayAttr, [4, 2.0])
4232a5d4974SIngo Müller
4242a5d4974SIngo Müller        # CHECK: input: [40000, 2] (<class 'list'>),
4252a5d4974SIngo Müller        # CHECK-SAME: error: get(): incompatible function arguments
4262a5d4974SIngo Müller        create_and_print(DenseI8ArrayAttr, [40000, 2])
4272a5d4974SIngo Müller
4282a5d4974SIngo Müller        # CHECK: input: range(0, 4) (<class 'range'>),
4292a5d4974SIngo Müller        # CHECK-SAME: result: array<i8: 0, 1, 2, 3>
4302a5d4974SIngo Müller        create_and_print(DenseI8ArrayAttr, range(4))
4312a5d4974SIngo Müller
4322a5d4974SIngo Müller        # CHECK: input: [IntegerAttr(4 : i64), IntegerAttr(2 : i64)] (<class 'list'>),
4332a5d4974SIngo Müller        # CHECK-SAME: result: array<i8: 4, 2>
4342a5d4974SIngo Müller        create_and_print(DenseI8ArrayAttr, [Attribute.parse(f"{x}") for x in [4, 2]])
4352a5d4974SIngo Müller
4362a5d4974SIngo Müller        # CHECK: input: [IntegerAttr(4000 : i64), IntegerAttr(2 : i64)] (<class 'list'>),
4372a5d4974SIngo Müller        # CHECK-SAME: error: get(): incompatible function arguments
4382a5d4974SIngo Müller        create_and_print(DenseI8ArrayAttr, [Attribute.parse(f"{x}") for x in [4000, 2]])
4392a5d4974SIngo Müller
4402a5d4974SIngo Müller        # CHECK: input: [IntegerAttr(4 : i64), FloatAttr(2.000000e+00 : f64)] (<class 'list'>),
4412a5d4974SIngo Müller        # CHECK-SAME: error: get(): incompatible function arguments
4422a5d4974SIngo Müller        create_and_print(DenseI8ArrayAttr, [Attribute.parse(f"{x}") for x in [4, 2.0]])
4432a5d4974SIngo Müller
4442a5d4974SIngo Müller        # CHECK: input: [IntegerAttr(4 : i8), IntegerAttr(2 : ui16)] (<class 'list'>),
4452a5d4974SIngo Müller        # CHECK-SAME: result: array<i8: 4, 2>
4462a5d4974SIngo Müller        create_and_print(
4472a5d4974SIngo Müller            DenseI8ArrayAttr, [Attribute.parse(s) for s in ["4 : i8", "2 : ui16"]]
4482a5d4974SIngo Müller        )
4492a5d4974SIngo Müller
4502a5d4974SIngo Müller        # CHECK: input: [FloatAttr(4.000000e+00 : f64), FloatAttr(2.000000e+00 : f64)] (<class 'list'>)
4512a5d4974SIngo Müller        # CHECK-SAME: result: array<f32: 4.000000e+00, 2.000000e+00>
4522a5d4974SIngo Müller        create_and_print(
4532a5d4974SIngo Müller            DenseF32ArrayAttr, [Attribute.parse(f"{x}") for x in [4.0, 2.0]]
4542a5d4974SIngo Müller        )
4552a5d4974SIngo Müller
4562a5d4974SIngo Müller        # CHECK: [BoolAttr(true), BoolAttr(false)] (<class 'list'>),
4572a5d4974SIngo Müller        # CHECK-SAME: result: array<i1: true, false>
4582a5d4974SIngo Müller        create_and_print(
4592a5d4974SIngo Müller            DenseBoolArrayAttr, [Attribute.parse(f"{x}") for x in ["true", "false"]]
4602a5d4974SIngo Müller        )
4612a5d4974SIngo Müller
4622a5d4974SIngo Müller
463308d8b8cSRahul Kayaith# CHECK-LABEL: TEST: testDenseIntAttrGetItem
464308d8b8cSRahul Kayaith@run
465308d8b8cSRahul Kayaithdef testDenseIntAttrGetItem():
466308d8b8cSRahul Kayaith    def print_item(attr_asm):
4679566ee28Smax        attr = Attribute.parse(attr_asm)
468308d8b8cSRahul Kayaith        dtype = ShapedType(attr.type).element_type
469308d8b8cSRahul Kayaith        try:
470308d8b8cSRahul Kayaith            item = attr[0]
471308d8b8cSRahul Kayaith            print(f"{dtype}:", item)
472308d8b8cSRahul Kayaith        except TypeError as e:
473308d8b8cSRahul Kayaith            print(f"{dtype}:", e)
474308d8b8cSRahul Kayaith
475308d8b8cSRahul Kayaith    with Context():
476308d8b8cSRahul Kayaith        # CHECK: i1: 1
477308d8b8cSRahul Kayaith        print_item("dense<true> : tensor<i1>")
478308d8b8cSRahul Kayaith        # CHECK: i8: 123
479308d8b8cSRahul Kayaith        print_item("dense<123> : tensor<i8>")
480308d8b8cSRahul Kayaith        # CHECK: i16: 123
481308d8b8cSRahul Kayaith        print_item("dense<123> : tensor<i16>")
482308d8b8cSRahul Kayaith        # CHECK: i32: 123
483308d8b8cSRahul Kayaith        print_item("dense<123> : tensor<i32>")
484308d8b8cSRahul Kayaith        # CHECK: i64: 123
485308d8b8cSRahul Kayaith        print_item("dense<123> : tensor<i64>")
486308d8b8cSRahul Kayaith        # CHECK: ui8: 123
487308d8b8cSRahul Kayaith        print_item("dense<123> : tensor<ui8>")
488308d8b8cSRahul Kayaith        # CHECK: ui16: 123
489308d8b8cSRahul Kayaith        print_item("dense<123> : tensor<ui16>")
490308d8b8cSRahul Kayaith        # CHECK: ui32: 123
491308d8b8cSRahul Kayaith        print_item("dense<123> : tensor<ui32>")
492308d8b8cSRahul Kayaith        # CHECK: ui64: 123
493308d8b8cSRahul Kayaith        print_item("dense<123> : tensor<ui64>")
494308d8b8cSRahul Kayaith        # CHECK: si8: -123
495308d8b8cSRahul Kayaith        print_item("dense<-123> : tensor<si8>")
496308d8b8cSRahul Kayaith        # CHECK: si16: -123
497308d8b8cSRahul Kayaith        print_item("dense<-123> : tensor<si16>")
498308d8b8cSRahul Kayaith        # CHECK: si32: -123
499308d8b8cSRahul Kayaith        print_item("dense<-123> : tensor<si32>")
500308d8b8cSRahul Kayaith        # CHECK: si64: -123
501308d8b8cSRahul Kayaith        print_item("dense<-123> : tensor<si64>")
502308d8b8cSRahul Kayaith
503308d8b8cSRahul Kayaith        # CHECK: i7: Unsupported integer type
504308d8b8cSRahul Kayaith        print_item("dense<123> : tensor<i7>")
505308d8b8cSRahul Kayaith
506308d8b8cSRahul Kayaith
5079f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testDenseFPAttr
5089f3f6d7bSStella Laurenzo@run
5099f3f6d7bSStella Laurenzodef testDenseFPAttr():
5109f3f6d7bSStella Laurenzo    with Context():
5119f3f6d7bSStella Laurenzo        raw = Attribute.parse("dense<[0.0, 1.0, 2.0, 3.0]> : vector<4xf32>")
5129f3f6d7bSStella Laurenzo        # CHECK: attr: dense<[0.000000e+00, 1.000000e+00, 2.000000e+00, 3.000000e+00]>
5139f3f6d7bSStella Laurenzo
5149f3f6d7bSStella Laurenzo        print("attr:", raw)
5159f3f6d7bSStella Laurenzo
5169f3f6d7bSStella Laurenzo        a = DenseFPElementsAttr(raw)
5179f3f6d7bSStella Laurenzo        assert len(a) == 4
5189f3f6d7bSStella Laurenzo
5199f3f6d7bSStella Laurenzo        # CHECK: 0.0 1.0 2.0 3.0
5209f3f6d7bSStella Laurenzo        for value in a:
5219f3f6d7bSStella Laurenzo            print(value, end=" ")
5229f3f6d7bSStella Laurenzo        print()
5239f3f6d7bSStella Laurenzo
5249f3f6d7bSStella Laurenzo        # CHECK: f32
5259f3f6d7bSStella Laurenzo        print(ShapedType(a.type).element_type)
5269f3f6d7bSStella Laurenzo
5279f3f6d7bSStella Laurenzo
5289f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testDictAttr
5299f3f6d7bSStella Laurenzo@run
5309f3f6d7bSStella Laurenzodef testDictAttr():
5319f3f6d7bSStella Laurenzo    with Context():
5329f3f6d7bSStella Laurenzo        dict_attr = {
533f9008e63STobias Hieta            "stringattr": StringAttr.get("string"),
534f9008e63STobias Hieta            "integerattr": IntegerAttr.get(IntegerType.get_signless(32), 42),
5359f3f6d7bSStella Laurenzo        }
5369f3f6d7bSStella Laurenzo
5379f3f6d7bSStella Laurenzo        a = DictAttr.get(dict_attr)
5389f3f6d7bSStella Laurenzo
539a5985ca5Sklensy        # CHECK: attr: {integerattr = 42 : i32, stringattr = "string"}
5409f3f6d7bSStella Laurenzo        print("attr:", a)
5419f3f6d7bSStella Laurenzo
5429f3f6d7bSStella Laurenzo        assert len(a) == 2
5439f3f6d7bSStella Laurenzo
544974c1596SRahul Kayaith        # CHECK: integerattr: IntegerAttr(42 : i32)
545974c1596SRahul Kayaith        print("integerattr:", repr(a["integerattr"]))
5469f3f6d7bSStella Laurenzo
547974c1596SRahul Kayaith        # CHECK: stringattr: StringAttr("string")
548974c1596SRahul Kayaith        print("stringattr:", repr(a["stringattr"]))
5499f3f6d7bSStella Laurenzo
5509fb1086bSAdrian Kuegel        # CHECK: True
551f9008e63STobias Hieta        print("stringattr" in a)
5529fb1086bSAdrian Kuegel
5539fb1086bSAdrian Kuegel        # CHECK: False
554f9008e63STobias Hieta        print("not_in_dict" in a)
5559fb1086bSAdrian Kuegel
5569f3f6d7bSStella Laurenzo        # Check that exceptions are raised as expected.
5579f3f6d7bSStella Laurenzo        try:
558f9008e63STobias Hieta            _ = a["does_not_exist"]
5599f3f6d7bSStella Laurenzo        except KeyError:
5609f3f6d7bSStella Laurenzo            pass
5619f3f6d7bSStella Laurenzo        else:
5629f3f6d7bSStella Laurenzo            assert False, "Exception not produced"
5639f3f6d7bSStella Laurenzo
5649f3f6d7bSStella Laurenzo        try:
5659f3f6d7bSStella Laurenzo            _ = a[42]
5669f3f6d7bSStella Laurenzo        except IndexError:
5679f3f6d7bSStella Laurenzo            pass
5689f3f6d7bSStella Laurenzo        else:
5699f3f6d7bSStella Laurenzo            assert False, "expected IndexError on accessing an out-of-bounds attribute"
5709f3f6d7bSStella Laurenzo
571a5985ca5Sklensy        # CHECK: empty: {}
572ed9e52f3SAlex Zinenko        print("empty: ", DictAttr.get())
573ed9e52f3SAlex Zinenko
5749f3f6d7bSStella Laurenzo
5759f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testTypeAttr
5769f3f6d7bSStella Laurenzo@run
5779f3f6d7bSStella Laurenzodef testTypeAttr():
5789f3f6d7bSStella Laurenzo    with Context():
5799f3f6d7bSStella Laurenzo        raw = Attribute.parse("vector<4xf32>")
5809f3f6d7bSStella Laurenzo        # CHECK: attr: vector<4xf32>
5819f3f6d7bSStella Laurenzo        print("attr:", raw)
5829f3f6d7bSStella Laurenzo        type_attr = TypeAttr(raw)
5839f3f6d7bSStella Laurenzo        # CHECK: f32
5849f3f6d7bSStella Laurenzo        print(ShapedType(type_attr.value).element_type)
5859f3f6d7bSStella Laurenzo
5869f3f6d7bSStella Laurenzo
5879f3f6d7bSStella Laurenzo# CHECK-LABEL: TEST: testArrayAttr
5889f3f6d7bSStella Laurenzo@run
5899f3f6d7bSStella Laurenzodef testArrayAttr():
5909f3f6d7bSStella Laurenzo    with Context():
591974c1596SRahul Kayaith        arr = Attribute.parse("[42, true, vector<4xf32>]")
592974c1596SRahul Kayaith    # CHECK: arr: [42, true, vector<4xf32>]
593974c1596SRahul Kayaith    print("arr:", arr)
594974c1596SRahul Kayaith    # CHECK: - IntegerAttr(42 : i64)
595974c1596SRahul Kayaith    # CHECK: - BoolAttr(true)
596974c1596SRahul Kayaith    # CHECK: - TypeAttr(vector<4xf32>)
597974c1596SRahul Kayaith    for attr in arr:
598974c1596SRahul Kayaith        print("- ", repr(attr))
5999f3f6d7bSStella Laurenzo
6009f3f6d7bSStella Laurenzo    with Context():
6019f3f6d7bSStella Laurenzo        intAttr = Attribute.parse("42")
6029f3f6d7bSStella Laurenzo        vecAttr = Attribute.parse("vector<4xf32>")
6039f3f6d7bSStella Laurenzo        boolAttr = BoolAttr.get(True)
6049f3f6d7bSStella Laurenzo        raw = ArrayAttr.get([vecAttr, boolAttr, intAttr])
6059f3f6d7bSStella Laurenzo    # CHECK: attr: [vector<4xf32>, true, 42]
6069f3f6d7bSStella Laurenzo    print("raw attr:", raw)
607974c1596SRahul Kayaith    # CHECK: - TypeAttr(vector<4xf32>)
608974c1596SRahul Kayaith    # CHECK: - BoolAttr(true
609974c1596SRahul Kayaith    # CHECK: - IntegerAttr(42 : i64)
610974c1596SRahul Kayaith    arr = raw
6119f3f6d7bSStella Laurenzo    for attr in arr:
612974c1596SRahul Kayaith        print("- ", repr(attr))
613974c1596SRahul Kayaith    # CHECK: attr[0]: TypeAttr(vector<4xf32>)
614974c1596SRahul Kayaith    print("attr[0]:", repr(arr[0]))
615974c1596SRahul Kayaith    # CHECK: attr[1]: BoolAttr(true)
616974c1596SRahul Kayaith    print("attr[1]:", repr(arr[1]))
617974c1596SRahul Kayaith    # CHECK: attr[2]: IntegerAttr(42 : i64)
618974c1596SRahul Kayaith    print("attr[2]:", repr(arr[2]))
6199f3f6d7bSStella Laurenzo    try:
6209f3f6d7bSStella Laurenzo        print("attr[3]:", arr[3])
6219f3f6d7bSStella Laurenzo    except IndexError as e:
6229f3f6d7bSStella Laurenzo        # CHECK: Error: ArrayAttribute index out of range
6239f3f6d7bSStella Laurenzo        print("Error: ", e)
6249f3f6d7bSStella Laurenzo    with Context():
6259f3f6d7bSStella Laurenzo        try:
6269f3f6d7bSStella Laurenzo            ArrayAttr.get([None])
6279f3f6d7bSStella Laurenzo        except RuntimeError as e:
6289f3f6d7bSStella Laurenzo            # CHECK: Error: Invalid attribute (None?) when attempting to create an ArrayAttribute
6299f3f6d7bSStella Laurenzo            print("Error: ", e)
6309f3f6d7bSStella Laurenzo        try:
6319f3f6d7bSStella Laurenzo            ArrayAttr.get([42])
6329f3f6d7bSStella Laurenzo        except RuntimeError as e:
6339f3f6d7bSStella Laurenzo            # CHECK: Error: Invalid attribute when attempting to create an ArrayAttribute
6349f3f6d7bSStella Laurenzo            print("Error: ", e)
635ed9e52f3SAlex Zinenko
636ed9e52f3SAlex Zinenko    with Context():
637ed9e52f3SAlex Zinenko        array = ArrayAttr.get([StringAttr.get("a"), StringAttr.get("b")])
638ed9e52f3SAlex Zinenko        array = array + [StringAttr.get("c")]
639ed9e52f3SAlex Zinenko        # CHECK: concat: ["a", "b", "c"]
640ed9e52f3SAlex Zinenko        print("concat: ", array)
641ac2e2d65SDenys Shabalin
642ac2e2d65SDenys Shabalin
643ac2e2d65SDenys Shabalin# CHECK-LABEL: TEST: testStridedLayoutAttr
644ac2e2d65SDenys Shabalin@run
645ac2e2d65SDenys Shabalindef testStridedLayoutAttr():
646ac2e2d65SDenys Shabalin    with Context():
647ac2e2d65SDenys Shabalin        attr = StridedLayoutAttr.get(42, [5, 7, 13])
648ac2e2d65SDenys Shabalin        # CHECK: strided<[5, 7, 13], offset: 42>
649ac2e2d65SDenys Shabalin        print(attr)
650ac2e2d65SDenys Shabalin        # CHECK: 42
651ac2e2d65SDenys Shabalin        print(attr.offset)
652ac2e2d65SDenys Shabalin        # CHECK: 3
653ac2e2d65SDenys Shabalin        print(len(attr.strides))
654ac2e2d65SDenys Shabalin        # CHECK: 5
655ac2e2d65SDenys Shabalin        print(attr.strides[0])
656ac2e2d65SDenys Shabalin        # CHECK: 7
657ac2e2d65SDenys Shabalin        print(attr.strides[1])
658ac2e2d65SDenys Shabalin        # CHECK: 13
659ac2e2d65SDenys Shabalin        print(attr.strides[2])
660e3fd612eSDenys Shabalin
661e3fd612eSDenys Shabalin        attr = StridedLayoutAttr.get_fully_dynamic(3)
662e3fd612eSDenys Shabalin        dynamic = ShapedType.get_dynamic_stride_or_offset()
663e3fd612eSDenys Shabalin        # CHECK: strided<[?, ?, ?], offset: ?>
664e3fd612eSDenys Shabalin        print(attr)
665e3fd612eSDenys Shabalin        # CHECK: offset is dynamic: True
666e3fd612eSDenys Shabalin        print(f"offset is dynamic: {attr.offset == dynamic}")
667e3fd612eSDenys Shabalin        # CHECK: rank: 3
668e3fd612eSDenys Shabalin        print(f"rank: {len(attr.strides)}")
669e3fd612eSDenys Shabalin        # CHECK: strides are dynamic: [True, True, True]
670e3fd612eSDenys Shabalin        print(f"strides are dynamic: {[s == dynamic for s in attr.strides]}")
671bfb1ba75Smax
672bfb1ba75Smax
673bfb1ba75Smax# CHECK-LABEL: TEST: testConcreteTypesRoundTrip
674bfb1ba75Smax@run
675bfb1ba75Smaxdef testConcreteTypesRoundTrip():
676bfb1ba75Smax    with Context(), Location.unknown():
677bfb1ba75Smax
678bfb1ba75Smax        def print_item(attr):
679bfb1ba75Smax            print(repr(attr.type))
680bfb1ba75Smax
681bfb1ba75Smax        # CHECK: F32Type(f32)
682bfb1ba75Smax        print_item(Attribute.parse("42.0 : f32"))
683bfb1ba75Smax        # CHECK: F32Type(f32)
684bfb1ba75Smax        print_item(FloatAttr.get_f32(42.0))
685bfb1ba75Smax        # CHECK: IntegerType(i64)
686bfb1ba75Smax        print_item(IntegerAttr.get(IntegerType.get_signless(64), 42))
687bfb1ba75Smax
688bfb1ba75Smax        def print_container_item(attr_asm):
689bfb1ba75Smax            attr = DenseElementsAttr(Attribute.parse(attr_asm))
690bfb1ba75Smax            print(repr(attr.type))
691bfb1ba75Smax            print(repr(attr.type.element_type))
692bfb1ba75Smax
693bfb1ba75Smax        # CHECK: RankedTensorType(tensor<i16>)
694bfb1ba75Smax        # CHECK: IntegerType(i16)
695bfb1ba75Smax        print_container_item("dense<123> : tensor<i16>")
696bfb1ba75Smax
697bfb1ba75Smax        # CHECK: RankedTensorType(tensor<f64>)
698bfb1ba75Smax        # CHECK: F64Type(f64)
699bfb1ba75Smax        print_container_item("dense<1.0> : tensor<f64>")
700bfb1ba75Smax
701bfb1ba75Smax        raw = Attribute.parse("vector<4xf32>")
702bfb1ba75Smax        # CHECK: attr: vector<4xf32>
703bfb1ba75Smax        print("attr:", raw)
704bfb1ba75Smax        type_attr = TypeAttr(raw)
705bfb1ba75Smax
706bfb1ba75Smax        # CHECK: VectorType(vector<4xf32>)
707bfb1ba75Smax        print(repr(type_attr.value))
708bfb1ba75Smax        # CHECK: F32Type(f32)
709bfb1ba75Smax        print(repr(type_attr.value.element_type))
7109566ee28Smax
7119566ee28Smax
7129566ee28Smax# CHECK-LABEL: TEST: testConcreteAttributesRoundTrip
7139566ee28Smax@run
7149566ee28Smaxdef testConcreteAttributesRoundTrip():
7159566ee28Smax    with Context(), Location.unknown():
7169566ee28Smax        # CHECK: FloatAttr(4.200000e+01 : f32)
7179566ee28Smax        print(repr(Attribute.parse("42.0 : f32")))
7189566ee28Smax
7199566ee28Smax        assert IntegerAttr.static_typeid is not None
720