Skip to content

Builtin

builtin

DYNAMIC_INDEX = -2 ** 63 module-attribute

A constant value denoting a dynamic index in a shape. Equal to -(2 ** 63) which is used in C++ MLIR.

FlatSymbolRefAttrConstr = MessageConstraint(ParamAttrConstraint.get(SymbolRefAttr, AnyAttr(), EmptyArrayAttrConstraint()), 'Expected SymbolRefAttr with no nested symbols.') module-attribute

Constrain SymbolRef to be FlatSymbolRef

FlatSymbolRefAttr = Annotated[SymbolRefAttr, FlatSymbolRefAttrConstr] module-attribute

SymbolRef constrained to have an empty nested_references property.

StaticDimensionConstr = MessageConstraint(IntAttrConstraint(NotEqualIntConstraint(DYNAMIC_INDEX)), f'expected static dimension, but got {DYNAMIC_INDEX}') module-attribute

Constrain a dimension to be static (not equal to DYNAMIC_INDEX).

StaticShapeArrayConstr = MessageConstraint(ArrayOfConstraint(StaticDimensionConstr), 'expected static shape, but got dynamic dimension') module-attribute

Constrain an array to be a static shape (all dimensions static).

I128: TypeAlias = IntegerType[Literal[128], Literal[Signedness.SIGNLESS]] module-attribute

I64: TypeAlias = IntegerType[Literal[64], Literal[Signedness.SIGNLESS]] module-attribute

I32: TypeAlias = IntegerType[Literal[32], Literal[Signedness.SIGNLESS]] module-attribute

I16: TypeAlias = IntegerType[Literal[16], Literal[Signedness.SIGNLESS]] module-attribute

I8: TypeAlias = IntegerType[Literal[8], Literal[Signedness.SIGNLESS]] module-attribute

I1: TypeAlias = IntegerType[Literal[1], Literal[Signedness.SIGNLESS]] module-attribute

i128: I128 = IntegerType(128) module-attribute

i64: I64 = IntegerType(64) module-attribute

i32: I32 = IntegerType(32) module-attribute

i16: I16 = IntegerType(16) module-attribute

i8: I8 = IntegerType(8) module-attribute

i1: I1 = IntegerType(1) module-attribute

AnySignlessIntegerType: TypeAlias = IntegerType[int, Literal[Signedness.SIGNLESS]] module-attribute

Type alias constrained to signless IntegerType.

LocationAttr: TypeAlias = UnknownLoc | FileLineColLoc | CallSiteLoc | NameLoc | FusedLoc module-attribute

Union of all MLIR location attribute types. Represents source location information that can be attached to operations, covering unknown locations, file/line/column positions, call-site chains, named locations, and fused (multi-location) aggregates.

UNKNOWN_LOC: LocationAttr = UnknownLoc() module-attribute

BoolAttr: TypeAlias = IntegerAttr[I1] module-attribute

AnyFloat: TypeAlias = BFloat16Type | Float16Type | Float32Type | Float64Type | Float80Type | Float128Type | FloatTF32Type | Float8E5M2Type | Float8E4M3Type | Float8E4M3FNType | Float8E5M2FNUZType | Float8E4M3FNUZType | Float8E4M3B11FNUZType | Float8E3M4Type | Float8E8M0FNUType | Float6E2M3FNType | Float6E3M2FNType | Float4E2M1FNType module-attribute

AnyVectorType: TypeAlias = VectorType[Attribute] module-attribute

VectorOrTensorOf: TypeAlias = VectorType[AttributeCovT] | TensorType[AttributeCovT] | UnrankedTensorType[AttributeCovT] module-attribute

bf16 = BFloat16Type() module-attribute

f16 = Float16Type() module-attribute

f32 = Float32Type() module-attribute

f64 = Float64Type() module-attribute

f80 = Float80Type() module-attribute

f128 = Float128Type() module-attribute

tf32 = FloatTF32Type() module-attribute

f8E5M2 = Float8E5M2Type() module-attribute

f8E4M3 = Float8E4M3Type() module-attribute

f8E4M3FN = Float8E4M3FNType() module-attribute

f8E5M2FNUZ = Float8E5M2FNUZType() module-attribute

f8E4M3FNUZ = Float8E4M3FNUZType() module-attribute

f8E4M3B11FNUZ = Float8E4M3B11FNUZType() module-attribute

f8E3M4 = Float8E3M4Type() module-attribute

f8E8M0FNU = Float8E8M0FNUType() module-attribute

f6E2M3FN = Float6E2M3FNType() module-attribute

f6E3M2FN = Float6E3M2FNType() module-attribute

f4E2M1FN = Float4E2M1FNType() module-attribute

RankedStructure: TypeAlias = VectorType[AttributeCovT] | TensorType[AttributeCovT] | MemRefType[AttributeCovT] module-attribute

AnyDenseElement: TypeAlias = IntegerType | IndexType | AnyFloat | ComplexType module-attribute

DenseIntElementsAttr: TypeAlias = DenseIntOrFPElementsAttr[IndexType | IntegerType] module-attribute

Builtin = Dialect('builtin', [ModuleOp, UnregisteredOp, UnrealizedConversionCastOp], [UnregisteredAttr, StringAttr, SymbolRefAttr, IntAttr, IntegerAttr, ArrayAttr, DictionaryAttr, DenseIntOrFPElementsAttr, DenseResourceAttr, UnitAttr, FloatData, UnknownLoc, FileLineColLoc, NoneAttr, OpaqueAttr, ComplexType, FunctionType, BFloat16Type, Float16Type, Float32Type, Float64Type, Float80Type, Float128Type, FloatTF32Type, Float8E5M2Type, Float8E4M3Type, Float8E4M3FNType, Float8E5M2FNUZType, Float8E4M3FNUZType, Float8E4M3B11FNUZType, Float8E3M4Type, Float8E8M0FNUType, Float6E2M3FNType, Float6E3M2FNType, Float4E2M1FNType, FloatAttr, SignednessAttr, TupleType, IntegerType, IndexType, NoneType, VectorType, TensorType, UnrankedTensorType, AffineMapAttr, AffineSetAttr, MemRefType, UnrankedMemRefType], [OpAsmDialectInterface()]) module-attribute

ShapedType dataclass

Bases: Attribute, ABC

Source code in xdsl/dialects/builtin.py
class ShapedType(Attribute, ABC):
    @abstractmethod
    def get_num_dims(self) -> int: ...

    @abstractmethod
    def get_shape(self) -> tuple[int, ...]: ...

    def element_count(self) -> int:
        return prod(self.get_shape())

    def has_static_shape(self) -> bool:
        """
        Check if all dimensions have static (non-dynamic) shapes.
        """
        return all(dim != DYNAMIC_INDEX for dim in self.get_shape())

    @staticmethod
    def strides_for_shape(
        shape: Sequence[int], factor: int = 1
    ) -> tuple[int | None, ...]:
        """
        Returns a tuple of strides for a given shape, with row-major layout.
        Strides that depend on a dynamic index are returned as `None`.
        The optional `factor` parameter specifies the stride for the innermost
        dimension, defaulting to 1.
        """
        rev_strides: list[int | None] = []
        stride: int | None = factor
        for dim in reversed(shape):
            rev_strides.append(stride)
            if stride is None or dim == DYNAMIC_INDEX:
                stride = None
            else:
                stride *= dim
        return tuple(reversed(rev_strides))

get_num_dims() -> int abstractmethod

Source code in xdsl/dialects/builtin.py
@abstractmethod
def get_num_dims(self) -> int: ...

get_shape() -> tuple[int, ...] abstractmethod

Source code in xdsl/dialects/builtin.py
@abstractmethod
def get_shape(self) -> tuple[int, ...]: ...

element_count() -> int

Source code in xdsl/dialects/builtin.py
def element_count(self) -> int:
    return prod(self.get_shape())

has_static_shape() -> bool

Check if all dimensions have static (non-dynamic) shapes.

Source code in xdsl/dialects/builtin.py
def has_static_shape(self) -> bool:
    """
    Check if all dimensions have static (non-dynamic) shapes.
    """
    return all(dim != DYNAMIC_INDEX for dim in self.get_shape())

strides_for_shape(shape: Sequence[int], factor: int = 1) -> tuple[int | None, ...] staticmethod

Returns a tuple of strides for a given shape, with row-major layout. Strides that depend on a dynamic index are returned as None. The optional factor parameter specifies the stride for the innermost dimension, defaulting to 1.

Source code in xdsl/dialects/builtin.py
@staticmethod
def strides_for_shape(
    shape: Sequence[int], factor: int = 1
) -> tuple[int | None, ...]:
    """
    Returns a tuple of strides for a given shape, with row-major layout.
    Strides that depend on a dynamic index are returned as `None`.
    The optional `factor` parameter specifies the stride for the innermost
    dimension, defaulting to 1.
    """
    rev_strides: list[int | None] = []
    stride: int | None = factor
    for dim in reversed(shape):
        rev_strides.append(stride)
        if stride is None or dim == DYNAMIC_INDEX:
            stride = None
        else:
            stride *= dim
    return tuple(reversed(rev_strides))

ContainerType

Bases: ABC, Generic[_ContainerElementTypeT]

Source code in xdsl/dialects/builtin.py
class ContainerType(ABC, Generic[_ContainerElementTypeT]):
    @abstractmethod
    def get_element_type(self) -> _ContainerElementTypeT:
        pass

get_element_type() -> _ContainerElementTypeT abstractmethod

Source code in xdsl/dialects/builtin.py
@abstractmethod
def get_element_type(self) -> _ContainerElementTypeT:
    pass

NoneAttr dataclass

Bases: ParametrizedAttribute, BuiltinAttribute

An attribute representing the absence of an attribute.

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class NoneAttr(ParametrizedAttribute, BuiltinAttribute):
    """An attribute representing the absence of an attribute."""

    name = "none"

    def print_builtin(self, printer: Printer):
        printer.print_string("none")

name = 'none' class-attribute instance-attribute

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_string("none")

ArrayAttr

Bases: _BuiltinGenericData[tuple[AttributeCovT, ...]], Iterable[AttributeCovT], Generic[AttributeCovT]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class ArrayAttr(
    _BuiltinGenericData[tuple[AttributeCovT, ...]],
    Iterable[AttributeCovT],
    Generic[AttributeCovT],
):
    name = "array"

    def __init__(self, param: Iterable[AttributeCovT]) -> None:
        super().__init__(tuple(param))

    def print_builtin(self, printer: Printer):
        with printer.in_square_brackets():
            printer.print_list(self.data, printer.print_attribute)

    @staticmethod
    @override
    def constr(
        constr: IRDLAttrConstraint[AttributeInvT]
        | RangeConstraint[AttributeInvT]
        | None = None,
    ) -> ArrayOfConstraint[AttributeInvT]:
        return ArrayOfConstraint[AttributeInvT](
            cast(
                AttrConstraint[AttributeInvT],
                TypeVarConstraint(AttributeCovT, AnyAttr()),
            )
            if constr is None
            else constr
        )

    def __len__(self):
        return len(self.data)

    def __iter__(self) -> Iterator[AttributeCovT]:
        return iter(self.data)

name = 'array' class-attribute instance-attribute

__init__(param: Iterable[AttributeCovT]) -> None

Source code in xdsl/dialects/builtin.py
def __init__(self, param: Iterable[AttributeCovT]) -> None:
    super().__init__(tuple(param))

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    with printer.in_square_brackets():
        printer.print_list(self.data, printer.print_attribute)

constr(constr: IRDLAttrConstraint[AttributeInvT] | RangeConstraint[AttributeInvT] | None = None) -> ArrayOfConstraint[AttributeInvT] staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
@override
def constr(
    constr: IRDLAttrConstraint[AttributeInvT]
    | RangeConstraint[AttributeInvT]
    | None = None,
) -> ArrayOfConstraint[AttributeInvT]:
    return ArrayOfConstraint[AttributeInvT](
        cast(
            AttrConstraint[AttributeInvT],
            TypeVarConstraint(AttributeCovT, AnyAttr()),
        )
        if constr is None
        else constr
    )

__len__()

Source code in xdsl/dialects/builtin.py
def __len__(self):
    return len(self.data)

__iter__() -> Iterator[AttributeCovT]

Source code in xdsl/dialects/builtin.py
def __iter__(self) -> Iterator[AttributeCovT]:
    return iter(self.data)

ArrayOfConstraint dataclass

Bases: AttrConstraint[ArrayAttr[AttributeCovT]]

Source code in xdsl/dialects/builtin.py
@dataclass(frozen=True)
class ArrayOfConstraint(AttrConstraint[ArrayAttr[AttributeCovT]]):
    elem_range_constraint: RangeConstraint[AttributeCovT]
    """
    A constraint that enforces an ArrayData whose elements satisfy
    the underlying range constraint.
    """

    def __init__(
        self,
        constr: (IRDLAttrConstraint[AttributeCovT] | RangeConstraint[AttributeCovT]),
    ):
        if isinstance(constr, RangeConstraint):
            object.__setattr__(self, "elem_range_constraint", constr)
        else:
            object.__setattr__(self, "elem_range_constraint", RangeOf.get(constr))

    def verify(
        self,
        attr: Attribute,
        constraint_context: VerificationContext,
    ) -> None:
        if not isa(attr, ArrayAttr):
            raise VerifyException(
                f"expected ArrayAttr attribute, but got '{type(attr)}'"
            )
        self.elem_range_constraint.verify(attr.data, constraint_context)

    def can_infer(self, var_constraint_names: AbstractSet[str]) -> bool:
        return self.elem_range_constraint.can_infer(
            var_constraint_names, length_known=False
        )

    def infer(self, context: InferenceContext) -> ArrayAttr[AttributeCovT]:
        return ArrayAttr(self.elem_range_constraint.infer(context, length=None))

    def get_bases(self) -> set[type[Attribute]] | None:
        return {ArrayAttr}

    def variables(self) -> set[str]:
        return self.elem_range_constraint.variables()

    def mapping_type_vars(
        self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
    ) -> AttrConstraint[ArrayAttr[AttributeCovT]]:
        return ArrayOfConstraint(
            self.elem_range_constraint.mapping_type_vars(type_var_mapping)
        )

elem_range_constraint: RangeConstraint[AttributeCovT] instance-attribute

A constraint that enforces an ArrayData whose elements satisfy the underlying range constraint.

__init__(constr: IRDLAttrConstraint[AttributeCovT] | RangeConstraint[AttributeCovT])

Source code in xdsl/dialects/builtin.py
def __init__(
    self,
    constr: (IRDLAttrConstraint[AttributeCovT] | RangeConstraint[AttributeCovT]),
):
    if isinstance(constr, RangeConstraint):
        object.__setattr__(self, "elem_range_constraint", constr)
    else:
        object.__setattr__(self, "elem_range_constraint", RangeOf.get(constr))

verify(attr: Attribute, constraint_context: VerificationContext) -> None

Source code in xdsl/dialects/builtin.py
def verify(
    self,
    attr: Attribute,
    constraint_context: VerificationContext,
) -> None:
    if not isa(attr, ArrayAttr):
        raise VerifyException(
            f"expected ArrayAttr attribute, but got '{type(attr)}'"
        )
    self.elem_range_constraint.verify(attr.data, constraint_context)

can_infer(var_constraint_names: AbstractSet[str]) -> bool

Source code in xdsl/dialects/builtin.py
def can_infer(self, var_constraint_names: AbstractSet[str]) -> bool:
    return self.elem_range_constraint.can_infer(
        var_constraint_names, length_known=False
    )

infer(context: InferenceContext) -> ArrayAttr[AttributeCovT]

Source code in xdsl/dialects/builtin.py
def infer(self, context: InferenceContext) -> ArrayAttr[AttributeCovT]:
    return ArrayAttr(self.elem_range_constraint.infer(context, length=None))

get_bases() -> set[type[Attribute]] | None

Source code in xdsl/dialects/builtin.py
def get_bases(self) -> set[type[Attribute]] | None:
    return {ArrayAttr}

variables() -> set[str]

Source code in xdsl/dialects/builtin.py
def variables(self) -> set[str]:
    return self.elem_range_constraint.variables()

mapping_type_vars(type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]) -> AttrConstraint[ArrayAttr[AttributeCovT]]

Source code in xdsl/dialects/builtin.py
def mapping_type_vars(
    self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
) -> AttrConstraint[ArrayAttr[AttributeCovT]]:
    return ArrayOfConstraint(
        self.elem_range_constraint.mapping_type_vars(type_var_mapping)
    )

StringAttr dataclass

Bases: _BuiltinData[str]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class StringAttr(_BuiltinData[str]):
    name = "string"

    def print_builtin(self, printer: Printer):
        printer.print_string_literal(self.data)

name = 'string' class-attribute instance-attribute

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_string_literal(self.data)

SymbolNameConstraint dataclass

Bases: AttrConstraint[StringAttr]

Constrain an attribute to be a StringAttr. This constraint has special assembly format support.

Source code in xdsl/dialects/builtin.py
@dataclass(frozen=True)
class SymbolNameConstraint(AttrConstraint[StringAttr]):
    """
    Constrain an attribute to be a StringAttr.
    This constraint has special assembly format support.
    """

    def verify(
        self,
        attr: Attribute,
        constraint_context: VerificationContext,
    ) -> None:
        if not isinstance(attr, StringAttr):
            raise VerifyException(f"{attr} should be a string")

    def get_bases(self) -> set[type[Attribute]] | None:
        return {StringAttr}

    def mapping_type_vars(
        self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
    ) -> AttrConstraint[StringAttr]:
        return self

__init__() -> None

verify(attr: Attribute, constraint_context: VerificationContext) -> None

Source code in xdsl/dialects/builtin.py
def verify(
    self,
    attr: Attribute,
    constraint_context: VerificationContext,
) -> None:
    if not isinstance(attr, StringAttr):
        raise VerifyException(f"{attr} should be a string")

get_bases() -> set[type[Attribute]] | None

Source code in xdsl/dialects/builtin.py
def get_bases(self) -> set[type[Attribute]] | None:
    return {StringAttr}

mapping_type_vars(type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]) -> AttrConstraint[StringAttr]

Source code in xdsl/dialects/builtin.py
def mapping_type_vars(
    self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
) -> AttrConstraint[StringAttr]:
    return self

BytesAttr dataclass

Bases: _BuiltinData[bytes]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class BytesAttr(_BuiltinData[bytes]):
    name = "bytes"

    def print_builtin(self, printer: Printer):
        printer.print_bytes_literal(self.data)

name = 'bytes' class-attribute instance-attribute

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_bytes_literal(self.data)

SymbolRefAttr

Bases: ParametrizedAttribute, BuiltinAttribute

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class SymbolRefAttr(ParametrizedAttribute, BuiltinAttribute):
    name = "symbol_ref"
    root_reference: StringAttr
    nested_references: ArrayAttr[StringAttr]

    def __init__(
        self,
        root: str | StringAttr,
        nested: Sequence[str] | Sequence[StringAttr] | ArrayAttr[StringAttr] = [],
    ) -> None:
        if isinstance(root, str):
            root = StringAttr(root)
        if not isinstance(nested, ArrayAttr):
            nested = ArrayAttr(
                [StringAttr(x) if isinstance(x, str) else x for x in nested]
            )
        super().__init__(root, nested)

    @staticmethod
    def get(value: str | StringAttr | SymbolRefAttr) -> SymbolRefAttr:
        if isinstance(value, str | StringAttr):
            return SymbolRefAttr(value)
        return value

    def string_value(self):
        root = self.root_reference.data
        for ref in self.nested_references.data:
            root += "." + ref.data
        return root

    def print_builtin(self, printer: Printer):
        printer.print_symbol_name(self.root_reference)
        for ref in self.nested_references.data:
            printer.print_string("::")
            printer.print_symbol_name(ref)

name = 'symbol_ref' class-attribute instance-attribute

root_reference: StringAttr instance-attribute

nested_references: ArrayAttr[StringAttr] instance-attribute

__init__(root: str | StringAttr, nested: Sequence[str] | Sequence[StringAttr] | ArrayAttr[StringAttr] = []) -> None

Source code in xdsl/dialects/builtin.py
def __init__(
    self,
    root: str | StringAttr,
    nested: Sequence[str] | Sequence[StringAttr] | ArrayAttr[StringAttr] = [],
) -> None:
    if isinstance(root, str):
        root = StringAttr(root)
    if not isinstance(nested, ArrayAttr):
        nested = ArrayAttr(
            [StringAttr(x) if isinstance(x, str) else x for x in nested]
        )
    super().__init__(root, nested)

get(value: str | StringAttr | SymbolRefAttr) -> SymbolRefAttr staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def get(value: str | StringAttr | SymbolRefAttr) -> SymbolRefAttr:
    if isinstance(value, str | StringAttr):
        return SymbolRefAttr(value)
    return value

string_value()

Source code in xdsl/dialects/builtin.py
def string_value(self):
    root = self.root_reference.data
    for ref in self.nested_references.data:
        root += "." + ref.data
    return root

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_symbol_name(self.root_reference)
    for ref in self.nested_references.data:
        printer.print_string("::")
        printer.print_symbol_name(ref)

EmptyArrayAttrConstraint dataclass

Bases: AttrConstraint

Constrain attribute to be empty ArrayData

Source code in xdsl/dialects/builtin.py
class EmptyArrayAttrConstraint(AttrConstraint):
    """
    Constrain attribute to be empty ArrayData
    """

    def verify(self, attr: Attribute, constraint_context: VerificationContext) -> None:
        if not isa(attr, ArrayAttr):
            raise VerifyException(f"expected ArrayData attribute, but got {attr}")
        if attr.data:
            raise VerifyException(f"expected empty array, but got {attr}")

    def mapping_type_vars(
        self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
    ) -> EmptyArrayAttrConstraint:
        return self

verify(attr: Attribute, constraint_context: VerificationContext) -> None

Source code in xdsl/dialects/builtin.py
def verify(self, attr: Attribute, constraint_context: VerificationContext) -> None:
    if not isa(attr, ArrayAttr):
        raise VerifyException(f"expected ArrayData attribute, but got {attr}")
    if attr.data:
        raise VerifyException(f"expected empty array, but got {attr}")

mapping_type_vars(type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]) -> EmptyArrayAttrConstraint

Source code in xdsl/dialects/builtin.py
def mapping_type_vars(
    self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
) -> EmptyArrayAttrConstraint:
    return self

IntAttr dataclass

Bases: GenericData[_IntCovT], Generic[_IntCovT]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class IntAttr(GenericData[_IntCovT], Generic[_IntCovT]):
    name = "builtin.int"

    @classmethod
    def parse_parameter(cls, parser: AttrParser) -> _IntCovT:
        with parser.in_angle_brackets():
            data = parser.parse_integer()
            return cast(_IntCovT, data)

    def print_parameter(self, printer: Printer) -> None:
        with printer.in_angle_brackets():
            printer.print_string(f"{self.data}")

    def __bool__(self) -> bool:
        """Returns True if value is non-zero."""
        return bool(self.data)

    @staticmethod
    @override
    def constr(
        constr: IntConstraint | int | TypeForm[int] | None = None,
    ) -> AttrConstraint[IntAttr]:
        return IntAttrConstraint.get(
            IntTypeVarConstraint(_IntCovT, AnyInt()) if constr is None else constr
        )

name = 'builtin.int' class-attribute instance-attribute

parse_parameter(parser: AttrParser) -> _IntCovT classmethod

Source code in xdsl/dialects/builtin.py
@classmethod
def parse_parameter(cls, parser: AttrParser) -> _IntCovT:
    with parser.in_angle_brackets():
        data = parser.parse_integer()
        return cast(_IntCovT, data)

print_parameter(printer: Printer) -> None

Source code in xdsl/dialects/builtin.py
def print_parameter(self, printer: Printer) -> None:
    with printer.in_angle_brackets():
        printer.print_string(f"{self.data}")

__bool__() -> bool

Returns True if value is non-zero.

Source code in xdsl/dialects/builtin.py
def __bool__(self) -> bool:
    """Returns True if value is non-zero."""
    return bool(self.data)

constr(constr: IntConstraint | int | TypeForm[int] | None = None) -> AttrConstraint[IntAttr] staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
@override
def constr(
    constr: IntConstraint | int | TypeForm[int] | None = None,
) -> AttrConstraint[IntAttr]:
    return IntAttrConstraint.get(
        IntTypeVarConstraint(_IntCovT, AnyInt()) if constr is None else constr
    )

IntAttrConstraint dataclass

Bases: AttrConstraint[IntAttr]

Constrains the value of an IntAttr.

Source code in xdsl/dialects/builtin.py
@dataclass(frozen=True)
class IntAttrConstraint(AttrConstraint[IntAttr]):
    """
    Constrains the value of an IntAttr.
    """

    @staticmethod
    def get(
        int_constraint: IntConstraint | int | TypeForm[int] | None = None,
    ) -> AttrConstraint[IntAttr]:
        if int_constraint is None:
            return BaseAttr(IntAttr)
        if not isinstance(int_constraint, IntConstraint):
            int_constraint = get_int_constraint(int_constraint)
        if int_constraint == AnyInt():
            return BaseAttr(IntAttr)
        if isinstance(int_constraint, EqIntConstraint):
            return EqAttrConstraint(IntAttr(int_constraint.value))
        return IntAttrConstraint(int_constraint)

    int_constraint: IntConstraint

    def verify(self, attr: Attribute, constraint_context: VerificationContext) -> None:
        if not isa(attr, IntAttr):
            raise VerifyException(f"attribute {attr} expected to be an IntAttr")
        self.int_constraint.verify(attr.data, constraint_context)

    def variables(self) -> set[str]:
        return self.int_constraint.variables()

    def can_infer(self, var_constraint_names: AbstractSet[str]) -> bool:
        return self.int_constraint.can_infer(var_constraint_names)

    def infer(self, context: InferenceContext) -> IntAttr:
        return IntAttr(self.int_constraint.infer(context))

    def get_bases(self) -> set[type[Attribute]] | None:
        return {IntAttr}

    def mapping_type_vars(
        self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
    ):
        return IntAttrConstraint.get(
            self.int_constraint.mapping_type_vars(type_var_mapping)
        )

int_constraint: IntConstraint instance-attribute

__init__(int_constraint: IntConstraint) -> None

get(int_constraint: IntConstraint | int | TypeForm[int] | None = None) -> AttrConstraint[IntAttr] staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def get(
    int_constraint: IntConstraint | int | TypeForm[int] | None = None,
) -> AttrConstraint[IntAttr]:
    if int_constraint is None:
        return BaseAttr(IntAttr)
    if not isinstance(int_constraint, IntConstraint):
        int_constraint = get_int_constraint(int_constraint)
    if int_constraint == AnyInt():
        return BaseAttr(IntAttr)
    if isinstance(int_constraint, EqIntConstraint):
        return EqAttrConstraint(IntAttr(int_constraint.value))
    return IntAttrConstraint(int_constraint)

verify(attr: Attribute, constraint_context: VerificationContext) -> None

Source code in xdsl/dialects/builtin.py
def verify(self, attr: Attribute, constraint_context: VerificationContext) -> None:
    if not isa(attr, IntAttr):
        raise VerifyException(f"attribute {attr} expected to be an IntAttr")
    self.int_constraint.verify(attr.data, constraint_context)

variables() -> set[str]

Source code in xdsl/dialects/builtin.py
def variables(self) -> set[str]:
    return self.int_constraint.variables()

can_infer(var_constraint_names: AbstractSet[str]) -> bool

Source code in xdsl/dialects/builtin.py
def can_infer(self, var_constraint_names: AbstractSet[str]) -> bool:
    return self.int_constraint.can_infer(var_constraint_names)

infer(context: InferenceContext) -> IntAttr

Source code in xdsl/dialects/builtin.py
def infer(self, context: InferenceContext) -> IntAttr:
    return IntAttr(self.int_constraint.infer(context))

get_bases() -> set[type[Attribute]] | None

Source code in xdsl/dialects/builtin.py
def get_bases(self) -> set[type[Attribute]] | None:
    return {IntAttr}

mapping_type_vars(type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint])

Source code in xdsl/dialects/builtin.py
def mapping_type_vars(
    self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
):
    return IntAttrConstraint.get(
        self.int_constraint.mapping_type_vars(type_var_mapping)
    )

Signedness

Bases: ConstraintConvertible, Enum

Signedness semantics for integer

Source code in xdsl/dialects/builtin.py
class Signedness(ConstraintConvertible, Enum):
    "Signedness semantics for integer"

    SIGNLESS = 0
    "No signedness semantics"

    SIGNED = 1
    UNSIGNED = 2

    def value_range(self, bitwidth: int) -> tuple[int, int]:
        """
        For a given bitwidth, returns (min, max+1), where min and max are the smallest and
        largest representable values.

        Signless integers are bit patterns, so the representable range is the union of the
        signed and unsigned representable ranges.
        """
        match self:
            case Signedness.SIGNLESS:
                return signless_value_range(bitwidth)
            case Signedness.SIGNED:
                return signed_value_range(bitwidth)
            case Signedness.UNSIGNED:
                return unsigned_value_range(bitwidth)

    @staticmethod
    def base_constr() -> AttrConstraint[SignednessAttr]:
        """The constraint for this class."""
        return BaseAttr(SignednessAttr)

    def constr(self) -> AttrConstraint[SignednessAttr]:
        return EqAttrConstraint(SignednessAttr(self))

SIGNLESS = 0 class-attribute instance-attribute

No signedness semantics

SIGNED = 1 class-attribute instance-attribute

UNSIGNED = 2 class-attribute instance-attribute

value_range(bitwidth: int) -> tuple[int, int]

For a given bitwidth, returns (min, max+1), where min and max are the smallest and largest representable values.

Signless integers are bit patterns, so the representable range is the union of the signed and unsigned representable ranges.

Source code in xdsl/dialects/builtin.py
def value_range(self, bitwidth: int) -> tuple[int, int]:
    """
    For a given bitwidth, returns (min, max+1), where min and max are the smallest and
    largest representable values.

    Signless integers are bit patterns, so the representable range is the union of the
    signed and unsigned representable ranges.
    """
    match self:
        case Signedness.SIGNLESS:
            return signless_value_range(bitwidth)
        case Signedness.SIGNED:
            return signed_value_range(bitwidth)
        case Signedness.UNSIGNED:
            return unsigned_value_range(bitwidth)

base_constr() -> AttrConstraint[SignednessAttr] staticmethod

The constraint for this class.

Source code in xdsl/dialects/builtin.py
@staticmethod
def base_constr() -> AttrConstraint[SignednessAttr]:
    """The constraint for this class."""
    return BaseAttr(SignednessAttr)

constr() -> AttrConstraint[SignednessAttr]

Source code in xdsl/dialects/builtin.py
def constr(self) -> AttrConstraint[SignednessAttr]:
    return EqAttrConstraint(SignednessAttr(self))

SignednessAttr dataclass

Bases: GenericData[_SignednessCovT], Generic[_SignednessCovT]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class SignednessAttr(GenericData[_SignednessCovT], Generic[_SignednessCovT]):
    name = "builtin.signedness"

    @classmethod
    def parse_parameter(cls, parser: AttrParser) -> _SignednessCovT:
        with parser.in_angle_brackets():
            if parser.parse_optional_keyword("signless") is not None:
                return Signedness.SIGNLESS  # pyright: ignore[reportReturnType]
            if parser.parse_optional_keyword("signed") is not None:
                return Signedness.SIGNED  # pyright: ignore[reportReturnType]
            if parser.parse_optional_keyword("unsigned") is not None:
                return Signedness.UNSIGNED  # pyright: ignore[reportReturnType]
            parser.raise_error("`signless`, `signed`, or `unsigned` expected")

    def print_parameter(self, printer: Printer) -> None:
        with printer.in_angle_brackets():
            data = self.data
            if data == Signedness.SIGNLESS:
                printer.print_string("signless")
            elif data == Signedness.SIGNED:
                printer.print_string("signed")
            elif data == Signedness.UNSIGNED:
                printer.print_string("unsigned")
            else:
                raise ValueError(f"Invalid signedness {data}")

    @staticmethod
    def constr() -> AttrConstraint:
        return TypeVarConstraint(_SignednessCovT, BaseAttr(SignednessAttr))

name = 'builtin.signedness' class-attribute instance-attribute

parse_parameter(parser: AttrParser) -> _SignednessCovT classmethod

Source code in xdsl/dialects/builtin.py
@classmethod
def parse_parameter(cls, parser: AttrParser) -> _SignednessCovT:
    with parser.in_angle_brackets():
        if parser.parse_optional_keyword("signless") is not None:
            return Signedness.SIGNLESS  # pyright: ignore[reportReturnType]
        if parser.parse_optional_keyword("signed") is not None:
            return Signedness.SIGNED  # pyright: ignore[reportReturnType]
        if parser.parse_optional_keyword("unsigned") is not None:
            return Signedness.UNSIGNED  # pyright: ignore[reportReturnType]
        parser.raise_error("`signless`, `signed`, or `unsigned` expected")

print_parameter(printer: Printer) -> None

Source code in xdsl/dialects/builtin.py
def print_parameter(self, printer: Printer) -> None:
    with printer.in_angle_brackets():
        data = self.data
        if data == Signedness.SIGNLESS:
            printer.print_string("signless")
        elif data == Signedness.SIGNED:
            printer.print_string("signed")
        elif data == Signedness.UNSIGNED:
            printer.print_string("unsigned")
        else:
            raise ValueError(f"Invalid signedness {data}")

constr() -> AttrConstraint staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def constr() -> AttrConstraint:
    return TypeVarConstraint(_SignednessCovT, BaseAttr(SignednessAttr))

CompileTimeFixedBitwidthType dataclass

Bases: TypeAttribute, ABC

A type attribute whose runtime bitwidth is fixed, but may be target-dependent.

Source code in xdsl/dialects/builtin.py
class CompileTimeFixedBitwidthType(TypeAttribute, ABC):
    """
    A type attribute whose runtime bitwidth is fixed, but may be target-dependent.
    """

    name = "abstract.compile_time_fixed_bitwidth_type"

    @property
    @abstractmethod
    def compile_time_size(self) -> int:
        """
        Contiguous memory footprint in bytes of the value during compilation.
        """
        raise NotImplementedError()

name = 'abstract.compile_time_fixed_bitwidth_type' class-attribute instance-attribute

compile_time_size: int abstractmethod property

Contiguous memory footprint in bytes of the value during compilation.

FixedBitwidthType dataclass

Bases: CompileTimeFixedBitwidthType, ABC

A type attribute whose runtime bitwidth is target-independent.

Source code in xdsl/dialects/builtin.py
class FixedBitwidthType(CompileTimeFixedBitwidthType, ABC):
    """
    A type attribute whose runtime bitwidth is target-independent.
    """

    name = "abstract.fixed_bitwidth_type"

    @property
    @abstractmethod
    def bitwidth(self) -> int:
        """
        Contiguous memory footprint in bits
        """
        raise NotImplementedError()

    @property
    def size(self) -> int:
        """
        Contiguous memory footprint in bytes, defaults to `ceil(bitwidth / 8)`
        """
        return (self.bitwidth + 7) >> 3

name = 'abstract.fixed_bitwidth_type' class-attribute instance-attribute

bitwidth: int abstractmethod property

Contiguous memory footprint in bits

size: int property

Contiguous memory footprint in bytes, defaults to ceil(bitwidth / 8)

PackableType dataclass

Bases: CompileTimeFixedBitwidthType, ABC, Generic[_PyT]

Abstract base class for xDSL types whose values can be encoded and decoded as bytes.

Source code in xdsl/dialects/builtin.py
class PackableType(CompileTimeFixedBitwidthType, ABC, Generic[_PyT]):
    """
    Abstract base class for xDSL types whose values can be encoded and decoded as bytes.
    """

    @abstractmethod
    def iter_unpack(self, buffer: ReadableBuffer, /) -> Iterator[_PyT]:
        """
        Yields unpacked values one at a time, starting at the beginning of the buffer.

        Raises `ValueError` if `len(buffer)` is not divisible by
        `self.compile_time_size`.
        """
        raise NotImplementedError()

    @abstractmethod
    def unpack(self, buffer: ReadableBuffer, num: int, /) -> tuple[_PyT, ...]:
        """
        Unpack `num` values from the beginning of the buffer.

        Raises `ValueError` if `len(buffer) != num * self.compile_time_size`.
        """
        raise NotImplementedError()

    @abstractmethod
    def pack_into(self, buffer: WriteableBuffer, offset: int, value: _PyT) -> None:
        """
        Pack a value at a given offset into a buffer.

        Raises `ValueError` if `len(buffer) < offset + self.compile_time_size`.
        """
        raise NotImplementedError()

    @abstractmethod
    def pack(self, values: Sequence[_PyT]) -> bytes:
        """
        Create a new buffer containing the input `values`.
        """
        raise NotImplementedError()

iter_unpack(buffer: ReadableBuffer) -> Iterator[_PyT] abstractmethod

Yields unpacked values one at a time, starting at the beginning of the buffer.

Raises ValueError if len(buffer) is not divisible by self.compile_time_size.

Source code in xdsl/dialects/builtin.py
@abstractmethod
def iter_unpack(self, buffer: ReadableBuffer, /) -> Iterator[_PyT]:
    """
    Yields unpacked values one at a time, starting at the beginning of the buffer.

    Raises `ValueError` if `len(buffer)` is not divisible by
    `self.compile_time_size`.
    """
    raise NotImplementedError()

unpack(buffer: ReadableBuffer, num: int) -> tuple[_PyT, ...] abstractmethod

Unpack num values from the beginning of the buffer.

Raises ValueError if len(buffer) != num * self.compile_time_size.

Source code in xdsl/dialects/builtin.py
@abstractmethod
def unpack(self, buffer: ReadableBuffer, num: int, /) -> tuple[_PyT, ...]:
    """
    Unpack `num` values from the beginning of the buffer.

    Raises `ValueError` if `len(buffer) != num * self.compile_time_size`.
    """
    raise NotImplementedError()

pack_into(buffer: WriteableBuffer, offset: int, value: _PyT) -> None abstractmethod

Pack a value at a given offset into a buffer.

Raises ValueError if len(buffer) < offset + self.compile_time_size.

Source code in xdsl/dialects/builtin.py
@abstractmethod
def pack_into(self, buffer: WriteableBuffer, offset: int, value: _PyT) -> None:
    """
    Pack a value at a given offset into a buffer.

    Raises `ValueError` if `len(buffer) < offset + self.compile_time_size`.
    """
    raise NotImplementedError()

pack(values: Sequence[_PyT]) -> bytes abstractmethod

Create a new buffer containing the input values.

Source code in xdsl/dialects/builtin.py
@abstractmethod
def pack(self, values: Sequence[_PyT]) -> bytes:
    """
    Create a new buffer containing the input `values`.
    """
    raise NotImplementedError()

StructPackableType dataclass

Bases: PackableType[_PyT], ABC, Generic[_PyT]

Abstract base class for xDSL types that can be packed and unpacked using Python's struct package, using a format string.

Source code in xdsl/dialects/builtin.py
class StructPackableType(PackableType[_PyT], ABC, Generic[_PyT]):
    """
    Abstract base class for xDSL types that can be packed and unpacked using Python's
    `struct` package, using a format string.
    """

    @property
    @abstractmethod
    def format(self) -> str:
        """
        Format to be used when decoding and encoding bytes.

        See external [documentation](https://docs.python.org/3/library/struct.html).
        """
        raise NotImplementedError()

    def iter_unpack(self, buffer: ReadableBuffer, /) -> Iterator[_PyT]:
        try:
            return (values[0] for values in struct.iter_unpack(self.format, buffer))
        except struct.error:
            buffer_size = len(memoryview(buffer))
            compile_time_size = self.compile_time_size
            if buffer_size % compile_time_size:
                raise ValueError(
                    f"Buffer length {buffer_size} not multiple of {self.name} element "
                    f"size {compile_time_size}."
                )
            # Re-raise unexpected struct.error
            raise

    def unpack(self, buffer: ReadableBuffer, num: int, /) -> tuple[_PyT, ...]:
        fmt = self.format[0] + str(num) + self.format[1:]
        try:
            return struct.unpack(fmt, buffer)
        except struct.error:
            buffer_size = len(memoryview(buffer))
            compile_time_size = self.compile_time_size
            if buffer_size != num * compile_time_size:
                raise ValueError(
                    f"Buffer length {buffer_size} not product of {self.name} element "
                    f"size {compile_time_size} and num {num}."
                )
            # Re-raise unexpected struct.error
            raise

    def pack_into(self, buffer: WriteableBuffer, offset: int, value: _PyT) -> None:
        try:
            struct.pack_into(self.format, buffer, offset, value)
        except struct.error:
            buffer_size = len(memoryview(buffer))
            compile_time_size = self.compile_time_size
            if buffer_size < offset + compile_time_size:
                raise ValueError(
                    f"Buffer length {buffer_size} too small for packing "
                    f"{compile_time_size} bytes at offset {offset}, expected at least "
                    f"{offset + compile_time_size}."
                )
            # Re-raise unexpected struct.error
            raise

    def pack(self, values: Sequence[_PyT]) -> bytes:
        fmt = self.format[0] + str(len(values)) + self.format[1:]
        return struct.pack(fmt, *values)

    @property
    def compile_time_size(self) -> int:
        return struct.calcsize(self.format)

format: str abstractmethod property

Format to be used when decoding and encoding bytes.

See external documentation.

compile_time_size: int property

iter_unpack(buffer: ReadableBuffer) -> Iterator[_PyT]

Source code in xdsl/dialects/builtin.py
def iter_unpack(self, buffer: ReadableBuffer, /) -> Iterator[_PyT]:
    try:
        return (values[0] for values in struct.iter_unpack(self.format, buffer))
    except struct.error:
        buffer_size = len(memoryview(buffer))
        compile_time_size = self.compile_time_size
        if buffer_size % compile_time_size:
            raise ValueError(
                f"Buffer length {buffer_size} not multiple of {self.name} element "
                f"size {compile_time_size}."
            )
        # Re-raise unexpected struct.error
        raise

unpack(buffer: ReadableBuffer, num: int) -> tuple[_PyT, ...]

Source code in xdsl/dialects/builtin.py
def unpack(self, buffer: ReadableBuffer, num: int, /) -> tuple[_PyT, ...]:
    fmt = self.format[0] + str(num) + self.format[1:]
    try:
        return struct.unpack(fmt, buffer)
    except struct.error:
        buffer_size = len(memoryview(buffer))
        compile_time_size = self.compile_time_size
        if buffer_size != num * compile_time_size:
            raise ValueError(
                f"Buffer length {buffer_size} not product of {self.name} element "
                f"size {compile_time_size} and num {num}."
            )
        # Re-raise unexpected struct.error
        raise

pack_into(buffer: WriteableBuffer, offset: int, value: _PyT) -> None

Source code in xdsl/dialects/builtin.py
def pack_into(self, buffer: WriteableBuffer, offset: int, value: _PyT) -> None:
    try:
        struct.pack_into(self.format, buffer, offset, value)
    except struct.error:
        buffer_size = len(memoryview(buffer))
        compile_time_size = self.compile_time_size
        if buffer_size < offset + compile_time_size:
            raise ValueError(
                f"Buffer length {buffer_size} too small for packing "
                f"{compile_time_size} bytes at offset {offset}, expected at least "
                f"{offset + compile_time_size}."
            )
        # Re-raise unexpected struct.error
        raise

pack(values: Sequence[_PyT]) -> bytes

Source code in xdsl/dialects/builtin.py
def pack(self, values: Sequence[_PyT]) -> bytes:
    fmt = self.format[0] + str(len(values)) + self.format[1:]
    return struct.pack(fmt, *values)

IntegerType

Bases: ParametrizedAttribute, StructPackableType[int], FixedBitwidthType, BuiltinAttribute, Generic[_IntCovT, _SignednessCovT]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class IntegerType(
    ParametrizedAttribute,
    StructPackableType[int],
    FixedBitwidthType,
    BuiltinAttribute,
    Generic[_IntCovT, _SignednessCovT],
):
    name = "integer_type"
    width: IntAttr[_IntCovT]
    signedness: SignednessAttr[_SignednessCovT]

    def __init__(
        self,
        data: _IntCovT | IntAttr[_IntCovT],
        signedness: _SignednessCovT
        | SignednessAttr[_SignednessCovT] = Signedness.SIGNLESS,
    ) -> None:
        if isinstance(data, int):
            data = IntAttr(data)
        if isinstance(signedness, Signedness):
            signedness = SignednessAttr(signedness)
        super().__init__(data, signedness)

    def print_builtin(self, printer: Printer) -> None:
        if self.signedness.data == Signedness.SIGNLESS:
            printer.print_string("i")
        elif self.signedness.data == Signedness.SIGNED:
            printer.print_string("si")
        elif self.signedness.data == Signedness.UNSIGNED:
            printer.print_string("ui")
        printer.print_int(self.width.data)

    def __repr__(self):
        width = self.width.data
        signedness = self.signedness.data
        if signedness == Signedness.SIGNLESS:
            return f"IntegerType({width})"
        else:
            return f"IntegerType({width}, {signedness})"

    def verify(self):
        if self.width.data < 0:
            raise VerifyException(
                f"integer type bitwidth should be nonnegative (got {self.width.data})"
            )

    def value_range(self) -> tuple[int, int]:
        return self.signedness.data.value_range(self.width.data)

    def verify_value(self, value: int):
        min_value, max_value = self.value_range()

        if not (min_value <= value < max_value):
            raise VerifyException(
                f"Integer value {value} is out of range for type {self} which supports "
                f"values in the range [{min_value}, {max_value})"
            )

    def normalized_value(
        self, value: int, *, truncate_bits: bool = False
    ) -> int | None:
        """
        Signless values can represent integers from both the signed and unsigned ranges
        for a given bitwidth.
        We choose to normalize values that are not in the intersection of the two ranges
        to the signed version (meaning ambiguous values will always be negative).
        For example, the bitpattern of all ones will always be represented as `-1` at
        runtime.
        If the input value is outside of the valid range, return `None` if `truncate_bits`
        is false, otherwise returns a value in range by truncating the bits of the input.
        """
        min_value, max_value = self.value_range()
        if not (min_value <= value < max_value):
            if not truncate_bits:
                return None
            value = value % (2**self.bitwidth)

        if self.signedness.data != Signedness.UNSIGNED:
            signed_ub = signed_upper_bound(self.bitwidth)
            unsigned_ub = unsigned_upper_bound(self.bitwidth)
            if signed_ub <= value:
                return value - unsigned_ub

        return value

    def get_normalized_value(self, value: int) -> int:
        """
        Normalises an integer value similarly to the `normalized_value` function,
        but throws a ValueError when the value falls outside the type's range.
        """
        v = self.normalized_value(value)
        if v is None:
            min_value, max_value = self.value_range()
            raise ValueError(
                f"Integer value {value} is out of range for type {self} which supports "
                f"values in the range [{min_value}, {max_value})"
            )
        return v

    @property
    def bitwidth(self) -> int:
        return self.width.data

    @property
    def format(self) -> str:
        format_index = ((self.bitwidth + 7) >> 3) - 1  #  = ceil(bw / 8) - 1
        if format_index >= 8:
            raise NotImplementedError(f"Format not implemented for {self}")

        unsigned = self.signedness.data == Signedness.UNSIGNED
        f = _UNSIGNED_INTEGER_FORMATS if unsigned else _SIGNED_INTEGER_FORMATS
        return f[format_index]

name = 'integer_type' class-attribute instance-attribute

width: IntAttr[_IntCovT] instance-attribute

signedness: SignednessAttr[_SignednessCovT] instance-attribute

bitwidth: int property

format: str property

__init__(data: _IntCovT | IntAttr[_IntCovT], signedness: _SignednessCovT | SignednessAttr[_SignednessCovT] = Signedness.SIGNLESS) -> None

Source code in xdsl/dialects/builtin.py
def __init__(
    self,
    data: _IntCovT | IntAttr[_IntCovT],
    signedness: _SignednessCovT
    | SignednessAttr[_SignednessCovT] = Signedness.SIGNLESS,
) -> None:
    if isinstance(data, int):
        data = IntAttr(data)
    if isinstance(signedness, Signedness):
        signedness = SignednessAttr(signedness)
    super().__init__(data, signedness)

print_builtin(printer: Printer) -> None

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer) -> None:
    if self.signedness.data == Signedness.SIGNLESS:
        printer.print_string("i")
    elif self.signedness.data == Signedness.SIGNED:
        printer.print_string("si")
    elif self.signedness.data == Signedness.UNSIGNED:
        printer.print_string("ui")
    printer.print_int(self.width.data)

__repr__()

Source code in xdsl/dialects/builtin.py
def __repr__(self):
    width = self.width.data
    signedness = self.signedness.data
    if signedness == Signedness.SIGNLESS:
        return f"IntegerType({width})"
    else:
        return f"IntegerType({width}, {signedness})"

verify()

Source code in xdsl/dialects/builtin.py
def verify(self):
    if self.width.data < 0:
        raise VerifyException(
            f"integer type bitwidth should be nonnegative (got {self.width.data})"
        )

value_range() -> tuple[int, int]

Source code in xdsl/dialects/builtin.py
def value_range(self) -> tuple[int, int]:
    return self.signedness.data.value_range(self.width.data)

verify_value(value: int)

Source code in xdsl/dialects/builtin.py
def verify_value(self, value: int):
    min_value, max_value = self.value_range()

    if not (min_value <= value < max_value):
        raise VerifyException(
            f"Integer value {value} is out of range for type {self} which supports "
            f"values in the range [{min_value}, {max_value})"
        )

normalized_value(value: int, *, truncate_bits: bool = False) -> int | None

Signless values can represent integers from both the signed and unsigned ranges for a given bitwidth. We choose to normalize values that are not in the intersection of the two ranges to the signed version (meaning ambiguous values will always be negative). For example, the bitpattern of all ones will always be represented as -1 at runtime. If the input value is outside of the valid range, return None if truncate_bits is false, otherwise returns a value in range by truncating the bits of the input.

Source code in xdsl/dialects/builtin.py
def normalized_value(
    self, value: int, *, truncate_bits: bool = False
) -> int | None:
    """
    Signless values can represent integers from both the signed and unsigned ranges
    for a given bitwidth.
    We choose to normalize values that are not in the intersection of the two ranges
    to the signed version (meaning ambiguous values will always be negative).
    For example, the bitpattern of all ones will always be represented as `-1` at
    runtime.
    If the input value is outside of the valid range, return `None` if `truncate_bits`
    is false, otherwise returns a value in range by truncating the bits of the input.
    """
    min_value, max_value = self.value_range()
    if not (min_value <= value < max_value):
        if not truncate_bits:
            return None
        value = value % (2**self.bitwidth)

    if self.signedness.data != Signedness.UNSIGNED:
        signed_ub = signed_upper_bound(self.bitwidth)
        unsigned_ub = unsigned_upper_bound(self.bitwidth)
        if signed_ub <= value:
            return value - unsigned_ub

    return value

get_normalized_value(value: int) -> int

Normalises an integer value similarly to the normalized_value function, but throws a ValueError when the value falls outside the type's range.

Source code in xdsl/dialects/builtin.py
def get_normalized_value(self, value: int) -> int:
    """
    Normalises an integer value similarly to the `normalized_value` function,
    but throws a ValueError when the value falls outside the type's range.
    """
    v = self.normalized_value(value)
    if v is None:
        min_value, max_value = self.value_range()
        raise ValueError(
            f"Integer value {value} is out of range for type {self} which supports "
            f"values in the range [{min_value}, {max_value})"
        )
    return v

UnitAttr dataclass

Bases: ParametrizedAttribute, BuiltinAttribute

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class UnitAttr(ParametrizedAttribute, BuiltinAttribute):
    name = "unit"

    def print_builtin(self, printer: Printer) -> None:
        printer.print_string("unit")

name = 'unit' class-attribute instance-attribute

print_builtin(printer: Printer) -> None

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer) -> None:
    printer.print_string("unit")

LocationConstraint dataclass

Bases: AttrConstraint

Check if an attribute is one of the supported location types.

Source code in xdsl/dialects/builtin.py
class LocationConstraint(AttrConstraint):
    """
    Check if an attribute is one of the supported location types.
    """

    def verify(self, attr: Attribute, constraint_context: VerificationContext) -> None:
        if isinstance(attr, LocationAttr) or isinstance(attr, NoneAttr):
            return
        raise VerifyException(f"{attr} is not a location attribute")

    def mapping_type_vars(
        self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
    ) -> AttrConstraint:
        # No type variables to map in this constraint
        return self

verify(attr: Attribute, constraint_context: VerificationContext) -> None

Source code in xdsl/dialects/builtin.py
def verify(self, attr: Attribute, constraint_context: VerificationContext) -> None:
    if isinstance(attr, LocationAttr) or isinstance(attr, NoneAttr):
        return
    raise VerifyException(f"{attr} is not a location attribute")

mapping_type_vars(type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]) -> AttrConstraint

Source code in xdsl/dialects/builtin.py
def mapping_type_vars(
    self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
) -> AttrConstraint:
    # No type variables to map in this constraint
    return self

LocationsArrayConstraint

Bases: AttrConstraint

Check if an attribute is one of the supported location types.

Source code in xdsl/dialects/builtin.py
class LocationsArrayConstraint(AttrConstraint):
    """
    Check if an attribute is one of the supported location types.
    """

    def __init__(self):
        self.location_constraint = LocationConstraint()

    def verify(self, attr: Attribute, constraint_context: VerificationContext) -> None:
        array = cast(ArrayAttr[Attribute], attr)
        element: Attribute
        for element in array:
            self.location_constraint.verify(element, constraint_context)

    def mapping_type_vars(
        self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
    ) -> AttrConstraint:
        # No type variables to map in this constraint
        return self

location_constraint = LocationConstraint() instance-attribute

__init__()

Source code in xdsl/dialects/builtin.py
def __init__(self):
    self.location_constraint = LocationConstraint()

verify(attr: Attribute, constraint_context: VerificationContext) -> None

Source code in xdsl/dialects/builtin.py
def verify(self, attr: Attribute, constraint_context: VerificationContext) -> None:
    array = cast(ArrayAttr[Attribute], attr)
    element: Attribute
    for element in array:
        self.location_constraint.verify(element, constraint_context)

mapping_type_vars(type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]) -> AttrConstraint

Source code in xdsl/dialects/builtin.py
def mapping_type_vars(
    self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
) -> AttrConstraint:
    # No type variables to map in this constraint
    return self

UnknownLoc dataclass

Bases: ParametrizedAttribute, BuiltinAttribute

Syntax:

unknown-location ::= `unknown`

Source location information is an extremely integral part of the MLIR infrastructure. As such, location information is always present in the IR, and must explicitly be set to unknown. Thus, an instance of the unknown location represents an unspecified source location.

Example:

loc(unknown)
Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class UnknownLoc(ParametrizedAttribute, BuiltinAttribute):
    """
    Syntax:

    ```
    unknown-location ::= `unknown`
    ```

    Source location information is an extremely integral part of the MLIR
    infrastructure. As such, location information is always present in the IR,
    and must explicitly be set to unknown. Thus, an instance of the `unknown`
    location represents an unspecified source location.

    Example:

    ```mlir
    loc(unknown)
    ```
    """

    name = "unknown_loc"

    def print_builtin(self, printer: Printer) -> None:
        with printer.in_location():
            printer.print_string("unknown")

name = 'unknown_loc' class-attribute instance-attribute

print_builtin(printer: Printer) -> None

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer) -> None:
    with printer.in_location():
        printer.print_string("unknown")

FileLineColLoc dataclass

Bases: ParametrizedAttribute, BuiltinAttribute

Syntax:

filelinecol-location ::= string-literal `:` integer-literal `:`
                         integer-literal

An instance of this location represents a tuple of file, line number, and column number. This is similar to the type of location that you get from most source languages.

Example:

loc("mysource.cc":10:8)
Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class FileLineColLoc(ParametrizedAttribute, BuiltinAttribute):
    """
    Syntax:

    ```
    filelinecol-location ::= string-literal `:` integer-literal `:`
                             integer-literal
    ```

    An instance of this location represents a tuple of file, line number, and
    column number. This is similar to the type of location that you get from
    most source languages.

    Example:

    ```mlir
    loc("mysource.cc":10:8)
    ```
    """

    name = "file_line_loc"

    filename: StringAttr = param_def()
    line: IntAttr = param_def()
    column: IntAttr = param_def()

    def print_builtin(self, printer: Printer) -> None:
        with printer.in_location():
            printer.print_attribute(self.filename)
            printer.print_string(":")
            printer.print_int(self.line.data)
            printer.print_string(":")
            printer.print_int(self.column.data)

name = 'file_line_loc' class-attribute instance-attribute

filename: StringAttr = param_def() class-attribute instance-attribute

line: IntAttr = param_def() class-attribute instance-attribute

column: IntAttr = param_def() class-attribute instance-attribute

print_builtin(printer: Printer) -> None

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer) -> None:
    with printer.in_location():
        printer.print_attribute(self.filename)
        printer.print_string(":")
        printer.print_int(self.line.data)
        printer.print_string(":")
        printer.print_int(self.column.data)

CallSiteLoc dataclass

Bases: ParametrizedAttribute, BuiltinAttribute

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class CallSiteLoc(ParametrizedAttribute, BuiltinAttribute):
    name = "builtin.callsite_loc"

    callee: Attribute = param_def(LocationConstraint())
    caller: Attribute = param_def(LocationConstraint())

    def print_builtin(self, printer: Printer) -> None:
        with printer.in_location():
            printer.print_string("callsite(")
            printer.print_attribute(self.callee)
            printer.print_string(" at ")
            printer.print_attribute(self.caller)
            printer.print_string(")")

name = 'builtin.callsite_loc' class-attribute instance-attribute

callee: Attribute = param_def(LocationConstraint()) class-attribute instance-attribute

caller: Attribute = param_def(LocationConstraint()) class-attribute instance-attribute

print_builtin(printer: Printer) -> None

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer) -> None:
    with printer.in_location():
        printer.print_string("callsite(")
        printer.print_attribute(self.callee)
        printer.print_string(" at ")
        printer.print_attribute(self.caller)
        printer.print_string(")")

FusedLoc dataclass

Bases: ParametrizedAttribute, BuiltinAttribute

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class FusedLoc(ParametrizedAttribute, BuiltinAttribute):
    name = "builtin.fused_loc"

    locations: Attribute = param_def(
        constraint=LocationsArrayConstraint(), converter=ArrayAttr[Attribute].get
    )
    metadata: Attribute = param_def()

    def print_builtin(self, printer: Printer) -> None:
        with printer.in_location():
            printer.print_string("fused")
            if not isinstance(self.metadata, NoneAttr):
                printer.print_string("<")
                printer.print_attribute(self.metadata)
                printer.print_string(">")
            printer.print_attribute(self.locations)

name = 'builtin.fused_loc' class-attribute instance-attribute

locations: Attribute = param_def(constraint=LocationsArrayConstraint(), converter=ArrayAttr[Attribute].get) class-attribute instance-attribute

metadata: Attribute = param_def() class-attribute instance-attribute

print_builtin(printer: Printer) -> None

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer) -> None:
    with printer.in_location():
        printer.print_string("fused")
        if not isinstance(self.metadata, NoneAttr):
            printer.print_string("<")
            printer.print_attribute(self.metadata)
            printer.print_string(">")
        printer.print_attribute(self.locations)

NameLoc dataclass

Bases: ParametrizedAttribute, BuiltinAttribute

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class NameLoc(ParametrizedAttribute, BuiltinAttribute):
    name = "builtin.name_loc"

    desc: StringAttr = param_def()
    location: Attribute = param_def(LocationConstraint())

    def print_builtin(self, printer: Printer) -> None:
        with printer.in_location():
            printer.print_attribute(self.desc)
            if not isinstance(self.location, NoneAttr):
                printer.print_string("(")
                printer.print_attribute(self.location)
                printer.print_string(")")

name = 'builtin.name_loc' class-attribute instance-attribute

desc: StringAttr = param_def() class-attribute instance-attribute

location: Attribute = param_def(LocationConstraint()) class-attribute instance-attribute

print_builtin(printer: Printer) -> None

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer) -> None:
    with printer.in_location():
        printer.print_attribute(self.desc)
        if not isinstance(self.location, NoneAttr):
            printer.print_string("(")
            printer.print_attribute(self.location)
            printer.print_string(")")

IndexType dataclass

Bases: ParametrizedAttribute, BuiltinAttribute, StructPackableType[int]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class IndexType(ParametrizedAttribute, BuiltinAttribute, StructPackableType[int]):
    name = "index"

    def print_builtin(self, printer: Printer):
        printer.print_string("index")

    @property
    def format(self) -> str:
        # index types are always packable as int64
        return "<q"

name = 'index' class-attribute instance-attribute

format: str property

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_string("index")

IntegerAttr

Bases: BuiltinAttribute, TypedAttribute, Generic[_IntegerAttrTypeCovT]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class IntegerAttr(
    BuiltinAttribute,
    TypedAttribute,
    Generic[_IntegerAttrTypeCovT],
):
    name = "integer"
    value: IntAttr
    type: _IntegerAttrTypeCovT

    @overload
    def __init__(
        self,
        value: int | IntAttr,
        value_type: _IntegerAttrTypeCovT,
        *,
        truncate_bits: bool = False,
    ) -> None: ...

    @overload
    def __init__(
        self: IntegerAttr[IntegerType[_IntCovT, Literal[Signedness.SIGNLESS]]],
        value: int | IntAttr,
        value_type: _IntCovT,
        *,
        truncate_bits: bool = False,
    ) -> None: ...

    def __init__(
        self,
        value: int | IntAttr,
        value_type: _IntCovT | IntegerType[_IntCovT] | IndexType,
        *,
        truncate_bits: bool = False,
    ) -> None:
        if isinstance(value_type, int):
            value_type = IntegerType(value_type)
        if not isinstance(value, int):
            value = value.data
        if not isinstance(value_type, IndexType):
            normalized_value = value_type.normalized_value(
                value, truncate_bits=truncate_bits
            )
            if normalized_value is not None:
                value = normalized_value
        super().__init__(IntAttr(value), value_type)

    @staticmethod
    def from_index_int_value(value: int) -> IntegerAttr[IndexType]:
        return IntegerAttr(value, IndexType())

    @staticmethod
    def from_bool(value: bool) -> BoolAttr:
        return IntegerAttr(value, i1)

    def print_builtin(self, printer: Printer) -> None:
        ty = self.type
        printer.print_int(self.value.data, ty)
        if ty != i1:
            printer.print_string(" : ")
            printer.print_attribute(ty)

    def verify(self) -> None:
        if isinstance(int_type := self.type, IndexType):
            return

        int_type.verify_value(self.value.data)

    @staticmethod
    def parse_with_type(
        parser: AttrParser,
        type: Attribute,
    ) -> TypedAttribute:
        assert isa(type, IntegerType | IndexType)
        return IntegerAttr(parser.parse_integer(allow_boolean=(type == i1)), type)

    def print_without_type(self, printer: Printer):
        printer.print_int(self.value.data, self.type)

    def get_type(self) -> Attribute:
        return self.type

    @staticmethod
    def constr(
        type: IRDLAttrConstraint[_IntegerAttrTypeCovT] = IndexType | IntegerType,
        *,
        value: AttrConstraint | IntConstraint | None = None,
    ) -> AttrConstraint[IntegerAttr[_IntegerAttrTypeCovT]]:
        if isinstance(value, IntConstraint):
            value = IntAttrConstraint.get(value)
        return cast(
            AttrConstraint[IntegerAttr[_IntegerAttrTypeCovT]],
            ParamAttrConstraint.get(IntegerAttr, value, type),
        )

    def __bool__(self) -> bool:
        """Returns True if value is non-zero."""
        return bool(self.value)

    @staticmethod
    def iter_unpack(
        type: _IntegerAttrTypeInvT, buffer: ReadableBuffer, /
    ) -> Iterator[IntegerAttr[_IntegerAttrTypeInvT]]:
        """
        Yields unpacked values one at a time, starting at the beginning of the buffer.
        """
        for value in type.iter_unpack(buffer):
            yield IntegerAttr(value, type)

    @staticmethod
    def unpack(
        type: _IntegerAttrTypeInvT, buffer: ReadableBuffer, num: int, /
    ) -> tuple[IntegerAttr[_IntegerAttrTypeInvT], ...]:
        """
        Unpack `num` values from the beginning of the buffer.
        """
        return tuple(IntegerAttr(value, type) for value in type.unpack(buffer, num))

name = 'integer' class-attribute instance-attribute

value: IntAttr instance-attribute

type: _IntegerAttrTypeCovT instance-attribute

__init__(value: int | IntAttr, value_type: _IntCovT | IntegerType[_IntCovT] | IndexType, *, truncate_bits: bool = False) -> None

__init__(
    value: int | IntAttr,
    value_type: _IntegerAttrTypeCovT,
    *,
    truncate_bits: bool = False,
) -> None
__init__(
    value: int | IntAttr,
    value_type: _IntCovT,
    *,
    truncate_bits: bool = False,
) -> None
Source code in xdsl/dialects/builtin.py
def __init__(
    self,
    value: int | IntAttr,
    value_type: _IntCovT | IntegerType[_IntCovT] | IndexType,
    *,
    truncate_bits: bool = False,
) -> None:
    if isinstance(value_type, int):
        value_type = IntegerType(value_type)
    if not isinstance(value, int):
        value = value.data
    if not isinstance(value_type, IndexType):
        normalized_value = value_type.normalized_value(
            value, truncate_bits=truncate_bits
        )
        if normalized_value is not None:
            value = normalized_value
    super().__init__(IntAttr(value), value_type)

from_index_int_value(value: int) -> IntegerAttr[IndexType] staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def from_index_int_value(value: int) -> IntegerAttr[IndexType]:
    return IntegerAttr(value, IndexType())

from_bool(value: bool) -> BoolAttr staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def from_bool(value: bool) -> BoolAttr:
    return IntegerAttr(value, i1)

print_builtin(printer: Printer) -> None

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer) -> None:
    ty = self.type
    printer.print_int(self.value.data, ty)
    if ty != i1:
        printer.print_string(" : ")
        printer.print_attribute(ty)

verify() -> None

Source code in xdsl/dialects/builtin.py
def verify(self) -> None:
    if isinstance(int_type := self.type, IndexType):
        return

    int_type.verify_value(self.value.data)

parse_with_type(parser: AttrParser, type: Attribute) -> TypedAttribute staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def parse_with_type(
    parser: AttrParser,
    type: Attribute,
) -> TypedAttribute:
    assert isa(type, IntegerType | IndexType)
    return IntegerAttr(parser.parse_integer(allow_boolean=(type == i1)), type)

print_without_type(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_without_type(self, printer: Printer):
    printer.print_int(self.value.data, self.type)

get_type() -> Attribute

Source code in xdsl/dialects/builtin.py
def get_type(self) -> Attribute:
    return self.type

constr(type: IRDLAttrConstraint[_IntegerAttrTypeCovT] = IndexType | IntegerType, *, value: AttrConstraint | IntConstraint | None = None) -> AttrConstraint[IntegerAttr[_IntegerAttrTypeCovT]] staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def constr(
    type: IRDLAttrConstraint[_IntegerAttrTypeCovT] = IndexType | IntegerType,
    *,
    value: AttrConstraint | IntConstraint | None = None,
) -> AttrConstraint[IntegerAttr[_IntegerAttrTypeCovT]]:
    if isinstance(value, IntConstraint):
        value = IntAttrConstraint.get(value)
    return cast(
        AttrConstraint[IntegerAttr[_IntegerAttrTypeCovT]],
        ParamAttrConstraint.get(IntegerAttr, value, type),
    )

__bool__() -> bool

Returns True if value is non-zero.

Source code in xdsl/dialects/builtin.py
def __bool__(self) -> bool:
    """Returns True if value is non-zero."""
    return bool(self.value)

iter_unpack(type: _IntegerAttrTypeInvT, buffer: ReadableBuffer) -> Iterator[IntegerAttr[_IntegerAttrTypeInvT]] staticmethod

Yields unpacked values one at a time, starting at the beginning of the buffer.

Source code in xdsl/dialects/builtin.py
@staticmethod
def iter_unpack(
    type: _IntegerAttrTypeInvT, buffer: ReadableBuffer, /
) -> Iterator[IntegerAttr[_IntegerAttrTypeInvT]]:
    """
    Yields unpacked values one at a time, starting at the beginning of the buffer.
    """
    for value in type.iter_unpack(buffer):
        yield IntegerAttr(value, type)

unpack(type: _IntegerAttrTypeInvT, buffer: ReadableBuffer, num: int) -> tuple[IntegerAttr[_IntegerAttrTypeInvT], ...] staticmethod

Unpack num values from the beginning of the buffer.

Source code in xdsl/dialects/builtin.py
@staticmethod
def unpack(
    type: _IntegerAttrTypeInvT, buffer: ReadableBuffer, num: int, /
) -> tuple[IntegerAttr[_IntegerAttrTypeInvT], ...]:
    """
    Unpack `num` values from the beginning of the buffer.
    """
    return tuple(IntegerAttr(value, type) for value in type.unpack(buffer, num))

FloatNonfiniteBehavior

Bases: Enum

How a reduced-precision float format represents infinities and NaNs.

Mirrors LLVM APFloat's fltNonfiniteBehavior.

Source code in xdsl/dialects/builtin.py
class FloatNonfiniteBehavior(Enum):
    """
    How a reduced-precision float format represents infinities and NaNs.

    Mirrors LLVM APFloat's `fltNonfiniteBehavior`.
    """

    IEEE = auto()
    """The all-ones exponent encodes infinities (zero mantissa) and NaNs."""
    NAN_ONLY = auto()
    """No infinities; a NaN is present (see `FloatNanEncoding`)."""
    FINITE_ONLY = auto()
    """No infinities or NaNs; overflow saturates to the largest finite value."""

IEEE = auto() class-attribute instance-attribute

The all-ones exponent encodes infinities (zero mantissa) and NaNs.

NAN_ONLY = auto() class-attribute instance-attribute

No infinities; a NaN is present (see FloatNanEncoding).

FINITE_ONLY = auto() class-attribute instance-attribute

No infinities or NaNs; overflow saturates to the largest finite value.

FloatNanEncoding

Bases: Enum

Which bit pattern encodes NaN. Mirrors LLVM APFloat's fltNanEncoding.

Source code in xdsl/dialects/builtin.py
class FloatNanEncoding(Enum):
    """
    Which bit pattern encodes NaN. Mirrors LLVM APFloat's `fltNanEncoding`.
    """

    IEEE = auto()
    """All-ones exponent with a non-zero mantissa."""
    ALL_ONES = auto()
    """All-ones exponent and mantissa."""
    NEGATIVE_ZERO = auto()
    """The sign-bit-only pattern; the format has no negative zero."""

IEEE = auto() class-attribute instance-attribute

All-ones exponent with a non-zero mantissa.

ALL_ONES = auto() class-attribute instance-attribute

All-ones exponent and mantissa.

NEGATIVE_ZERO = auto() class-attribute instance-attribute

The sign-bit-only pattern; the format has no negative zero.

FloatSemantics dataclass

The parameters that fully define a reduced-precision float format.

Modelled on LLVM's fltSemantics.

Source code in xdsl/dialects/builtin.py
@dataclass(frozen=True)
class FloatSemantics:
    """
    The parameters that fully define a reduced-precision float format.

    Modelled on LLVM's `fltSemantics`.
    """

    exponent_bits: int
    mantissa_bits: int
    exponent_bias: int
    nonfinite: FloatNonfiniteBehavior = FloatNonfiniteBehavior.IEEE
    nan_encoding: FloatNanEncoding = FloatNanEncoding.IEEE
    has_zero: bool = True
    has_sign: bool = True

    @property
    def bitwidth(self) -> int:
        return int(self.has_sign) + self.exponent_bits + self.mantissa_bits

    @property
    def max_exponent(self) -> int:
        """The all-ones exponent field."""
        return (1 << self.exponent_bits) - 1

    @property
    def max_mantissa(self) -> int:
        """The all-ones mantissa field."""
        return (1 << self.mantissa_bits) - 1

    @property
    def sign_shift(self) -> int:
        """Bit position of the sign bit."""
        return self.exponent_bits + self.mantissa_bits

    @staticmethod
    def round_half_even(significand: int, shift: int) -> int:
        """Round `significand >> shift` to nearest, ties to even, with exact integer math."""
        if shift <= 0:
            return significand << (-shift)
        quotient = significand >> shift
        dropped = significand & ((1 << shift) - 1)
        halfway = 1 << (shift - 1)
        if dropped > halfway or (dropped == halfway and quotient & 1):
            quotient += 1
        return quotient

exponent_bits: int instance-attribute

mantissa_bits: int instance-attribute

exponent_bias: int instance-attribute

nonfinite: FloatNonfiniteBehavior = FloatNonfiniteBehavior.IEEE class-attribute instance-attribute

nan_encoding: FloatNanEncoding = FloatNanEncoding.IEEE class-attribute instance-attribute

has_zero: bool = True class-attribute instance-attribute

has_sign: bool = True class-attribute instance-attribute

bitwidth: int property

max_exponent: int property

The all-ones exponent field.

max_mantissa: int property

The all-ones mantissa field.

sign_shift: int property

Bit position of the sign bit.

__init__(exponent_bits: int, mantissa_bits: int, exponent_bias: int, nonfinite: FloatNonfiniteBehavior = FloatNonfiniteBehavior.IEEE, nan_encoding: FloatNanEncoding = FloatNanEncoding.IEEE, has_zero: bool = True, has_sign: bool = True) -> None

round_half_even(significand: int, shift: int) -> int staticmethod

Round significand >> shift to nearest, ties to even, with exact integer math.

Source code in xdsl/dialects/builtin.py
@staticmethod
def round_half_even(significand: int, shift: int) -> int:
    """Round `significand >> shift` to nearest, ties to even, with exact integer math."""
    if shift <= 0:
        return significand << (-shift)
    quotient = significand >> shift
    dropped = significand & ((1 << shift) - 1)
    halfway = 1 << (shift - 1)
    if dropped > halfway or (dropped == halfway and quotient & 1):
        quotient += 1
    return quotient

ReducedPrecisionFloatType dataclass

Bases: _FloatType, PackableType[float], ABC

Base for reduced-precision float types, described by a FloatSemantics.

Concrete subclasses set only SEMANTICS; all encoding, decoding, rounding and special-value handling is shared here and parameterised by that FloatSemantics.

Source code in xdsl/dialects/builtin.py
class ReducedPrecisionFloatType(_FloatType, PackableType[float], ABC):
    """
    Base for reduced-precision float types, described by a `FloatSemantics`.

    Concrete subclasses set only `SEMANTICS`; all encoding, decoding, rounding and
    special-value handling is shared here and parameterised by that `FloatSemantics`.
    """

    SEMANTICS: ClassVar[FloatSemantics]

    @property
    def bitwidth(self) -> int:
        return self.SEMANTICS.bitwidth

    @property
    def compile_time_size(self) -> int:
        return self.size

    @staticmethod
    def decode_significand_power(magnitude: float) -> tuple[int, int]:
        """Return `(significand, power)` with `magnitude == significand * 2**power`, exact for positive finite floats."""
        bits = struct.unpack("<Q", struct.pack("<d", magnitude))[0]
        biased_exponent = (bits >> 52) & 0x7FF
        fraction = bits & ((1 << 52) - 1)
        if biased_exponent:
            return fraction | (1 << 52), biased_exponent - 1075
        return fraction, -1074

    def _decode_special(
        self, negative: bool, biased_exponent: int, mantissa: int
    ) -> float | None:
        """Value of a reserved infinity/NaN pattern, or None if the pattern is finite."""
        semantics = self.SEMANTICS
        match semantics:
            case FloatSemantics(nonfinite=FloatNonfiniteBehavior.FINITE_ONLY):
                return None
            case FloatSemantics(nonfinite=FloatNonfiniteBehavior.IEEE) if (
                biased_exponent != semantics.max_exponent
            ):
                return None
            case FloatSemantics(nonfinite=FloatNonfiniteBehavior.IEEE) if mantissa:
                return math.nan
            case FloatSemantics(nonfinite=FloatNonfiniteBehavior.IEEE) if negative:
                return -math.inf
            case FloatSemantics(nonfinite=FloatNonfiniteBehavior.IEEE):
                return math.inf
            case FloatSemantics(nan_encoding=FloatNanEncoding.ALL_ONES) if (
                biased_exponent == semantics.max_exponent
                and mantissa == semantics.max_mantissa
            ):
                return math.nan
            case FloatSemantics(nan_encoding=FloatNanEncoding.ALL_ONES):
                return None
            case _ if negative and biased_exponent == 0 and mantissa == 0:
                return math.nan
            case _:
                return None

    def decode_bits(self, bits: int) -> float:
        semantics = self.SEMANTICS
        mantissa_bits = semantics.mantissa_bits
        bias = semantics.exponent_bias
        negative = bool(semantics.has_sign and (bits >> semantics.sign_shift) & 1)
        biased_exponent = (bits >> mantissa_bits) & semantics.max_exponent
        mantissa = bits & semantics.max_mantissa
        special = self._decode_special(negative, biased_exponent, mantissa)
        if special is not None:
            return special
        sign = -1.0 if negative else 1.0
        if semantics.has_zero and biased_exponent == 0:
            return sign * mantissa * 2.0 ** (1 - bias - mantissa_bits)
        return (
            sign * (1 + mantissa / 2.0**mantissa_bits) * 2.0 ** (biased_exponent - bias)
        )

    def _encode_overflow(self, sign: int) -> int:
        """Bits a too-large magnitude maps to: infinity, NaN, or the largest finite value."""
        semantics = self.SEMANTICS
        match semantics.nonfinite:
            case FloatNonfiniteBehavior.IEEE:
                return (sign << semantics.sign_shift) | (
                    semantics.max_exponent << semantics.mantissa_bits
                )
            case FloatNonfiniteBehavior.NAN_ONLY:
                return self._encode_nan(sign)
            case FloatNonfiniteBehavior.FINITE_ONLY:
                return (
                    (sign << semantics.sign_shift)
                    | (semantics.max_exponent << semantics.mantissa_bits)
                    | semantics.max_mantissa
                )

    def _encode_nan(self, sign: int) -> int:
        semantics = self.SEMANTICS
        mantissa_bits = semantics.mantissa_bits
        if semantics.nonfinite is FloatNonfiniteBehavior.FINITE_ONLY:
            return self._encode_overflow(sign)
        match semantics.nan_encoding:
            case FloatNanEncoding.IEEE:
                return (semantics.max_exponent << mantissa_bits) | (
                    1 << (mantissa_bits - 1)
                )
            case FloatNanEncoding.ALL_ONES:
                return (
                    (sign << semantics.sign_shift)
                    | (semantics.max_exponent << mantissa_bits)
                    | semantics.max_mantissa
                )
            case FloatNanEncoding.NEGATIVE_ZERO:
                return 1 << semantics.sign_shift

    def _encode_zero(self, sign: int) -> int:
        if self.SEMANTICS.nan_encoding is FloatNanEncoding.NEGATIVE_ZERO:
            return 0  # no negative zero
        return sign << self.SEMANTICS.sign_shift

    def _overflows(self, biased_exponent: int, mantissa: int) -> bool:
        semantics = self.SEMANTICS
        if semantics.nonfinite is FloatNonfiniteBehavior.IEEE:
            return biased_exponent >= semantics.max_exponent
        if semantics.nan_encoding is FloatNanEncoding.ALL_ONES:
            return biased_exponent > semantics.max_exponent or (
                biased_exponent == semantics.max_exponent
                and mantissa == semantics.max_mantissa
            )
        return biased_exponent > semantics.max_exponent

    def _rounded_exponent_mantissa(self, magnitude: float) -> tuple[int, int] | None:
        """
        Round a positive, finite magnitude to `(biased_exponent, mantissa)`.

        Returns `(0, 0)` on underflow to the smallest value and `None` on overflow.
        """
        semantics = self.SEMANTICS
        mantissa_bits = semantics.mantissa_bits
        bias = semantics.exponent_bias
        implicit_bit = 1 << mantissa_bits
        significand, power = self.decode_significand_power(magnitude)
        exponent = math.frexp(magnitude)[1] - 1
        smallest_normal_exponent = 1 - bias if semantics.has_zero else -bias
        if exponent < smallest_normal_exponent:
            if not semantics.has_zero:
                return 0, 0  # no subnormals: underflow to the smallest value
            quotient = semantics.round_half_even(
                significand, (1 - bias - mantissa_bits) - power
            )
            if quotient < implicit_bit:
                return 0, quotient
            return 1, 0  # rounded up into the smallest normal
        quotient = semantics.round_half_even(
            significand, (exponent - mantissa_bits) - power
        )
        if quotient == implicit_bit << 1:
            exponent += 1
            quotient = implicit_bit
        biased_exponent = exponent + bias
        mantissa = quotient - implicit_bit
        if self._overflows(biased_exponent, mantissa):
            return None
        return biased_exponent, mantissa

    def encode_bits(self, value: float) -> int:
        semantics = self.SEMANTICS
        sign = 1 if semantics.has_sign and math.copysign(1.0, value) < 0 else 0
        if math.isinf(value):
            return self._encode_overflow(sign)
        if math.isnan(value):
            return self._encode_nan(sign)
        if value == 0.0:
            return self._encode_zero(sign)
        if not semantics.has_sign and value < 0:
            # Unsigned formats (e.g. f8E8M0FNU) reject signed finite values, as LLVM does,
            # rather than silently dropping the sign. -0.0 is handled by the zero case above.
            raise ValueError(f"{self.name} does not support signed values")
        fields = self._rounded_exponent_mantissa(abs(value))
        if fields is None:
            return self._encode_overflow(sign)
        biased_exponent, mantissa = fields
        if semantics.has_zero and not biased_exponent and not mantissa:
            return self._encode_zero(sign)
        return (
            (sign << semantics.sign_shift)
            | (biased_exponent << semantics.mantissa_bits)
            | mantissa
        )

    def iter_unpack(self, buffer: ReadableBuffer, /) -> Iterator[float]:
        # `int` handles the odd byte widths `struct` can't (tf32's 19 bits -> 3 bytes).
        size = self.size
        mv = memoryview(buffer)
        buffer_size = len(mv)
        if buffer_size % size:
            raise ValueError(
                f"Buffer length {buffer_size} not multiple of {self.name} element "
                f"size {size}."
            )
        return (
            self.decode_bits(int.from_bytes(mv[i : i + size], "little"))
            for i in range(0, buffer_size, size)
        )

    def unpack(self, buffer: ReadableBuffer, num: int, /) -> tuple[float, ...]:
        size = self.size
        mv = memoryview(buffer)
        buffer_size = len(mv)
        if buffer_size != num * size:
            raise ValueError(
                f"Buffer length {buffer_size} not product of {self.name} element "
                f"size {size} and num {num}."
            )
        return tuple(
            self.decode_bits(int.from_bytes(mv[i : i + size], "little"))
            for i in range(0, buffer_size, size)
        )

    def pack_into(self, buffer: WriteableBuffer, offset: int, value: float) -> None:
        size = self.size
        buffer_size = len(memoryview(buffer))
        if buffer_size < offset + size:
            raise ValueError(
                f"Buffer length {buffer_size} too small for packing "
                f"{size} bytes at offset {offset}, expected at least "
                f"{offset + size}."
            )
        memoryview(buffer)[offset : offset + size] = self.encode_bits(value).to_bytes(
            size, "little"
        )

    def pack(self, values: Sequence[float]) -> bytes:
        size = self.size
        buffer = bytearray(size * len(values))
        for index, value in enumerate(values):
            self.pack_into(buffer, index * size, value)
        return bytes(buffer)

SEMANTICS: FloatSemantics class-attribute

bitwidth: int property

compile_time_size: int property

decode_significand_power(magnitude: float) -> tuple[int, int] staticmethod

Return (significand, power) with magnitude == significand * 2**power, exact for positive finite floats.

Source code in xdsl/dialects/builtin.py
@staticmethod
def decode_significand_power(magnitude: float) -> tuple[int, int]:
    """Return `(significand, power)` with `magnitude == significand * 2**power`, exact for positive finite floats."""
    bits = struct.unpack("<Q", struct.pack("<d", magnitude))[0]
    biased_exponent = (bits >> 52) & 0x7FF
    fraction = bits & ((1 << 52) - 1)
    if biased_exponent:
        return fraction | (1 << 52), biased_exponent - 1075
    return fraction, -1074

decode_bits(bits: int) -> float

Source code in xdsl/dialects/builtin.py
def decode_bits(self, bits: int) -> float:
    semantics = self.SEMANTICS
    mantissa_bits = semantics.mantissa_bits
    bias = semantics.exponent_bias
    negative = bool(semantics.has_sign and (bits >> semantics.sign_shift) & 1)
    biased_exponent = (bits >> mantissa_bits) & semantics.max_exponent
    mantissa = bits & semantics.max_mantissa
    special = self._decode_special(negative, biased_exponent, mantissa)
    if special is not None:
        return special
    sign = -1.0 if negative else 1.0
    if semantics.has_zero and biased_exponent == 0:
        return sign * mantissa * 2.0 ** (1 - bias - mantissa_bits)
    return (
        sign * (1 + mantissa / 2.0**mantissa_bits) * 2.0 ** (biased_exponent - bias)
    )

encode_bits(value: float) -> int

Source code in xdsl/dialects/builtin.py
def encode_bits(self, value: float) -> int:
    semantics = self.SEMANTICS
    sign = 1 if semantics.has_sign and math.copysign(1.0, value) < 0 else 0
    if math.isinf(value):
        return self._encode_overflow(sign)
    if math.isnan(value):
        return self._encode_nan(sign)
    if value == 0.0:
        return self._encode_zero(sign)
    if not semantics.has_sign and value < 0:
        # Unsigned formats (e.g. f8E8M0FNU) reject signed finite values, as LLVM does,
        # rather than silently dropping the sign. -0.0 is handled by the zero case above.
        raise ValueError(f"{self.name} does not support signed values")
    fields = self._rounded_exponent_mantissa(abs(value))
    if fields is None:
        return self._encode_overflow(sign)
    biased_exponent, mantissa = fields
    if semantics.has_zero and not biased_exponent and not mantissa:
        return self._encode_zero(sign)
    return (
        (sign << semantics.sign_shift)
        | (biased_exponent << semantics.mantissa_bits)
        | mantissa
    )

iter_unpack(buffer: ReadableBuffer) -> Iterator[float]

Source code in xdsl/dialects/builtin.py
def iter_unpack(self, buffer: ReadableBuffer, /) -> Iterator[float]:
    # `int` handles the odd byte widths `struct` can't (tf32's 19 bits -> 3 bytes).
    size = self.size
    mv = memoryview(buffer)
    buffer_size = len(mv)
    if buffer_size % size:
        raise ValueError(
            f"Buffer length {buffer_size} not multiple of {self.name} element "
            f"size {size}."
        )
    return (
        self.decode_bits(int.from_bytes(mv[i : i + size], "little"))
        for i in range(0, buffer_size, size)
    )

unpack(buffer: ReadableBuffer, num: int) -> tuple[float, ...]

Source code in xdsl/dialects/builtin.py
def unpack(self, buffer: ReadableBuffer, num: int, /) -> tuple[float, ...]:
    size = self.size
    mv = memoryview(buffer)
    buffer_size = len(mv)
    if buffer_size != num * size:
        raise ValueError(
            f"Buffer length {buffer_size} not product of {self.name} element "
            f"size {size} and num {num}."
        )
    return tuple(
        self.decode_bits(int.from_bytes(mv[i : i + size], "little"))
        for i in range(0, buffer_size, size)
    )

pack_into(buffer: WriteableBuffer, offset: int, value: float) -> None

Source code in xdsl/dialects/builtin.py
def pack_into(self, buffer: WriteableBuffer, offset: int, value: float) -> None:
    size = self.size
    buffer_size = len(memoryview(buffer))
    if buffer_size < offset + size:
        raise ValueError(
            f"Buffer length {buffer_size} too small for packing "
            f"{size} bytes at offset {offset}, expected at least "
            f"{offset + size}."
        )
    memoryview(buffer)[offset : offset + size] = self.encode_bits(value).to_bytes(
        size, "little"
    )

pack(values: Sequence[float]) -> bytes

Source code in xdsl/dialects/builtin.py
def pack(self, values: Sequence[float]) -> bytes:
    size = self.size
    buffer = bytearray(size * len(values))
    for index, value in enumerate(values):
        self.pack_into(buffer, index * size, value)
    return bytes(buffer)

BFloat16Type dataclass

Bases: ParametrizedAttribute, _FloatType

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class BFloat16Type(ParametrizedAttribute, _FloatType):
    name = "bf16"

    @property
    def bitwidth(self) -> int:
        return 16

    @property
    def compile_time_size(self) -> int:
        return 2

    @staticmethod
    def _encode(value: float) -> bytes:
        """
        Encode a Python binary64 float directly as bf16 bytes, little-endian.
        Round to nearest, ties to even, preserving signed zeros and quieting NaNs.
        """
        f64_bits = struct.unpack("<Q", struct.pack("<d", value))[0]
        sign = (f64_bits >> 48) & 0x8000
        exponent = ((f64_bits >> 52) & 0x7FF) - 1023
        fraction = f64_bits & ((1 << 52) - 1)
        if exponent == 1024:
            bits = 0x7F80
            if fraction:
                # Preserve high payload bits and force a quiet, nonzero NaN.
                bits |= (fraction >> 45) | 0x0040
        elif exponent < -134:
            # Below half the smallest bf16 subnormal, including binary64 zero.
            bits = 0
        elif exponent < -126:
            # Subnormals are multiples of 2**-133. The binary64 significand
            # represents a multiple of 2**(exponent - 52).
            bits = FloatSemantics.round_half_even(
                (1 << 52) | fraction, -133 - (exponent - 52)
            )
        else:
            # Keep seven fraction bits; a carry increments the bf16 exponent.
            bits = ((exponent + 127) << 7) + FloatSemantics.round_half_even(
                fraction, 52 - 7
            )
            bits = min(bits, 0x7F80)  # Overflow rounds to infinity.
        return (sign | bits).to_bytes(2, "little")

    @staticmethod
    def _decode(raw: ReadableBuffer) -> float:
        # bf16 is the high 16 bits of an f32 with the low 16 truncated; the
        # inverse is to zero-extend with two low bytes in little-endian.
        return struct.unpack("<f", b"\x00\x00" + raw)[0]

    def iter_unpack(self, buffer: ReadableBuffer, /) -> Iterator[float]:
        mv = memoryview(buffer)
        buffer_size = len(mv)
        if buffer_size % 2:
            raise ValueError(
                f"Buffer length {buffer_size} not multiple of {self.name} element "
                f"size 2."
            )
        return (self._decode(mv[i : i + 2]) for i in range(0, len(mv), 2))

    def unpack(self, buffer: ReadableBuffer, num: int, /) -> tuple[float, ...]:
        mv = memoryview(buffer)
        buffer_size = len(mv)
        compile_time_size = self.compile_time_size
        if buffer_size != num * compile_time_size:
            raise ValueError(
                f"Buffer length {buffer_size} not product of {self.name} element "
                f"size {compile_time_size} and num {num}."
            )

        return tuple(self._decode(mv[i : i + 2]) for i in range(0, buffer_size, 2))

    def pack_into(self, buffer: WriteableBuffer, offset: int, value: float) -> None:
        buffer_size = len(memoryview(buffer))
        compile_time_size = self.compile_time_size
        if buffer_size < offset + compile_time_size:
            raise ValueError(
                f"Buffer length {buffer_size} too small for packing "
                f"{compile_time_size} bytes at offset {offset}, expected at least "
                f"{offset + compile_time_size}."
            )

        memoryview(buffer)[offset : offset + 2] = self._encode(value)

    def pack(self, values: Sequence[float]) -> bytes:
        return b"".join(self._encode(v) for v in values)

name = 'bf16' class-attribute instance-attribute

bitwidth: int property

compile_time_size: int property

iter_unpack(buffer: ReadableBuffer) -> Iterator[float]

Source code in xdsl/dialects/builtin.py
def iter_unpack(self, buffer: ReadableBuffer, /) -> Iterator[float]:
    mv = memoryview(buffer)
    buffer_size = len(mv)
    if buffer_size % 2:
        raise ValueError(
            f"Buffer length {buffer_size} not multiple of {self.name} element "
            f"size 2."
        )
    return (self._decode(mv[i : i + 2]) for i in range(0, len(mv), 2))

unpack(buffer: ReadableBuffer, num: int) -> tuple[float, ...]

Source code in xdsl/dialects/builtin.py
def unpack(self, buffer: ReadableBuffer, num: int, /) -> tuple[float, ...]:
    mv = memoryview(buffer)
    buffer_size = len(mv)
    compile_time_size = self.compile_time_size
    if buffer_size != num * compile_time_size:
        raise ValueError(
            f"Buffer length {buffer_size} not product of {self.name} element "
            f"size {compile_time_size} and num {num}."
        )

    return tuple(self._decode(mv[i : i + 2]) for i in range(0, buffer_size, 2))

pack_into(buffer: WriteableBuffer, offset: int, value: float) -> None

Source code in xdsl/dialects/builtin.py
def pack_into(self, buffer: WriteableBuffer, offset: int, value: float) -> None:
    buffer_size = len(memoryview(buffer))
    compile_time_size = self.compile_time_size
    if buffer_size < offset + compile_time_size:
        raise ValueError(
            f"Buffer length {buffer_size} too small for packing "
            f"{compile_time_size} bytes at offset {offset}, expected at least "
            f"{offset + compile_time_size}."
        )

    memoryview(buffer)[offset : offset + 2] = self._encode(value)

pack(values: Sequence[float]) -> bytes

Source code in xdsl/dialects/builtin.py
def pack(self, values: Sequence[float]) -> bytes:
    return b"".join(self._encode(v) for v in values)

Float16Type dataclass

Bases: ParametrizedAttribute, _FloatType, StructPackableType[float]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float16Type(ParametrizedAttribute, _FloatType, StructPackableType[float]):
    name = "f16"

    @property
    def bitwidth(self) -> int:
        return 16

    @property
    def format(self) -> str:
        return "<e"

name = 'f16' class-attribute instance-attribute

bitwidth: int property

format: str property

Float32Type dataclass

Bases: ParametrizedAttribute, _FloatType, StructPackableType[float]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float32Type(ParametrizedAttribute, _FloatType, StructPackableType[float]):
    name = "f32"

    @property
    def bitwidth(self) -> int:
        return 32

    @property
    def format(self) -> str:
        return "<f"

name = 'f32' class-attribute instance-attribute

bitwidth: int property

format: str property

Float64Type dataclass

Bases: ParametrizedAttribute, _FloatType, StructPackableType[float]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float64Type(ParametrizedAttribute, _FloatType, StructPackableType[float]):
    name = "f64"

    @property
    def bitwidth(self) -> int:
        return 64

    @property
    def format(self) -> str:
        return "<d"

name = 'f64' class-attribute instance-attribute

bitwidth: int property

format: str property

Float80Type dataclass

Bases: ParametrizedAttribute, _FloatType, StructPackableType[float]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float80Type(ParametrizedAttribute, _FloatType, StructPackableType[float]):
    name = "f80"

    @property
    def bitwidth(self) -> int:
        return 80

    @property
    def format(self) -> str:
        raise NotImplementedError()

    def round(self, value: float) -> float:
        # Every f64 value is exactly representable in f80.
        return value

name = 'f80' class-attribute instance-attribute

bitwidth: int property

format: str property

round(value: float) -> float

Source code in xdsl/dialects/builtin.py
def round(self, value: float) -> float:
    # Every f64 value is exactly representable in f80.
    return value

Float128Type dataclass

Bases: ParametrizedAttribute, _FloatType, StructPackableType[float]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float128Type(ParametrizedAttribute, _FloatType, StructPackableType[float]):
    name = "f128"

    @property
    def bitwidth(self) -> int:
        return 128

    @property
    def format(self) -> str:
        raise NotImplementedError()

    def round(self, value: float) -> float:
        # Every f64 value is exactly representable in f128.
        return value

name = 'f128' class-attribute instance-attribute

bitwidth: int property

format: str property

round(value: float) -> float

Source code in xdsl/dialects/builtin.py
def round(self, value: float) -> float:
    # Every f64 value is exactly representable in f128.
    return value

FloatTF32Type dataclass

Bases: ParametrizedAttribute, ReducedPrecisionFloatType

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class FloatTF32Type(ParametrizedAttribute, ReducedPrecisionFloatType):
    name = "tf32"
    SEMANTICS = FloatSemantics(
        exponent_bits=8,
        mantissa_bits=10,
        exponent_bias=127,
    )

name = 'tf32' class-attribute instance-attribute

SEMANTICS = FloatSemantics(exponent_bits=8, mantissa_bits=10, exponent_bias=127) class-attribute instance-attribute

Float8E5M2Type dataclass

Bases: ParametrizedAttribute, ReducedPrecisionFloatType

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float8E5M2Type(ParametrizedAttribute, ReducedPrecisionFloatType):
    name = "f8E5M2"
    SEMANTICS = FloatSemantics(
        exponent_bits=5,
        mantissa_bits=2,
        exponent_bias=15,
    )

name = 'f8E5M2' class-attribute instance-attribute

SEMANTICS = FloatSemantics(exponent_bits=5, mantissa_bits=2, exponent_bias=15) class-attribute instance-attribute

Float8E4M3Type dataclass

Bases: ParametrizedAttribute, ReducedPrecisionFloatType

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float8E4M3Type(ParametrizedAttribute, ReducedPrecisionFloatType):
    name = "f8E4M3"
    SEMANTICS = FloatSemantics(
        exponent_bits=4,
        mantissa_bits=3,
        exponent_bias=7,
    )

name = 'f8E4M3' class-attribute instance-attribute

SEMANTICS = FloatSemantics(exponent_bits=4, mantissa_bits=3, exponent_bias=7) class-attribute instance-attribute

Float8E4M3FNType dataclass

Bases: ParametrizedAttribute, ReducedPrecisionFloatType

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float8E4M3FNType(ParametrizedAttribute, ReducedPrecisionFloatType):
    name = "f8E4M3FN"
    SEMANTICS = FloatSemantics(
        exponent_bits=4,
        mantissa_bits=3,
        exponent_bias=7,
        nonfinite=FloatNonfiniteBehavior.NAN_ONLY,
        nan_encoding=FloatNanEncoding.ALL_ONES,
    )

name = 'f8E4M3FN' class-attribute instance-attribute

SEMANTICS = FloatSemantics(exponent_bits=4, mantissa_bits=3, exponent_bias=7, nonfinite=FloatNonfiniteBehavior.NAN_ONLY, nan_encoding=FloatNanEncoding.ALL_ONES) class-attribute instance-attribute

Float8E5M2FNUZType dataclass

Bases: ParametrizedAttribute, ReducedPrecisionFloatType

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float8E5M2FNUZType(ParametrizedAttribute, ReducedPrecisionFloatType):
    name = "f8E5M2FNUZ"
    SEMANTICS = FloatSemantics(
        exponent_bits=5,
        mantissa_bits=2,
        exponent_bias=16,
        nonfinite=FloatNonfiniteBehavior.NAN_ONLY,
        nan_encoding=FloatNanEncoding.NEGATIVE_ZERO,
    )

name = 'f8E5M2FNUZ' class-attribute instance-attribute

SEMANTICS = FloatSemantics(exponent_bits=5, mantissa_bits=2, exponent_bias=16, nonfinite=FloatNonfiniteBehavior.NAN_ONLY, nan_encoding=FloatNanEncoding.NEGATIVE_ZERO) class-attribute instance-attribute

Float8E4M3FNUZType dataclass

Bases: ParametrizedAttribute, ReducedPrecisionFloatType

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float8E4M3FNUZType(ParametrizedAttribute, ReducedPrecisionFloatType):
    name = "f8E4M3FNUZ"
    SEMANTICS = FloatSemantics(
        exponent_bits=4,
        mantissa_bits=3,
        exponent_bias=8,
        nonfinite=FloatNonfiniteBehavior.NAN_ONLY,
        nan_encoding=FloatNanEncoding.NEGATIVE_ZERO,
    )

name = 'f8E4M3FNUZ' class-attribute instance-attribute

SEMANTICS = FloatSemantics(exponent_bits=4, mantissa_bits=3, exponent_bias=8, nonfinite=FloatNonfiniteBehavior.NAN_ONLY, nan_encoding=FloatNanEncoding.NEGATIVE_ZERO) class-attribute instance-attribute

Float8E4M3B11FNUZType dataclass

Bases: ParametrizedAttribute, ReducedPrecisionFloatType

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float8E4M3B11FNUZType(ParametrizedAttribute, ReducedPrecisionFloatType):
    name = "f8E4M3B11FNUZ"
    SEMANTICS = FloatSemantics(
        exponent_bits=4,
        mantissa_bits=3,
        exponent_bias=11,
        nonfinite=FloatNonfiniteBehavior.NAN_ONLY,
        nan_encoding=FloatNanEncoding.NEGATIVE_ZERO,
    )

name = 'f8E4M3B11FNUZ' class-attribute instance-attribute

SEMANTICS = FloatSemantics(exponent_bits=4, mantissa_bits=3, exponent_bias=11, nonfinite=FloatNonfiniteBehavior.NAN_ONLY, nan_encoding=FloatNanEncoding.NEGATIVE_ZERO) class-attribute instance-attribute

Float8E3M4Type dataclass

Bases: ParametrizedAttribute, ReducedPrecisionFloatType

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float8E3M4Type(ParametrizedAttribute, ReducedPrecisionFloatType):
    name = "f8E3M4"
    SEMANTICS = FloatSemantics(
        exponent_bits=3,
        mantissa_bits=4,
        exponent_bias=3,
    )

name = 'f8E3M4' class-attribute instance-attribute

SEMANTICS = FloatSemantics(exponent_bits=3, mantissa_bits=4, exponent_bias=3) class-attribute instance-attribute

Float8E8M0FNUType dataclass

Bases: ParametrizedAttribute, ReducedPrecisionFloatType

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float8E8M0FNUType(ParametrizedAttribute, ReducedPrecisionFloatType):
    name = "f8E8M0FNU"
    SEMANTICS = FloatSemantics(
        exponent_bits=8,
        mantissa_bits=0,
        exponent_bias=127,
        nonfinite=FloatNonfiniteBehavior.NAN_ONLY,
        nan_encoding=FloatNanEncoding.ALL_ONES,
        has_zero=False,
        has_sign=False,
    )

name = 'f8E8M0FNU' class-attribute instance-attribute

SEMANTICS = FloatSemantics(exponent_bits=8, mantissa_bits=0, exponent_bias=127, nonfinite=FloatNonfiniteBehavior.NAN_ONLY, nan_encoding=FloatNanEncoding.ALL_ONES, has_zero=False, has_sign=False) class-attribute instance-attribute

Float6E2M3FNType dataclass

Bases: ParametrizedAttribute, ReducedPrecisionFloatType

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float6E2M3FNType(ParametrizedAttribute, ReducedPrecisionFloatType):
    name = "f6E2M3FN"
    SEMANTICS = FloatSemantics(
        exponent_bits=2,
        mantissa_bits=3,
        exponent_bias=1,
        nonfinite=FloatNonfiniteBehavior.FINITE_ONLY,
    )

name = 'f6E2M3FN' class-attribute instance-attribute

SEMANTICS = FloatSemantics(exponent_bits=2, mantissa_bits=3, exponent_bias=1, nonfinite=FloatNonfiniteBehavior.FINITE_ONLY) class-attribute instance-attribute

Float6E3M2FNType dataclass

Bases: ParametrizedAttribute, ReducedPrecisionFloatType

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float6E3M2FNType(ParametrizedAttribute, ReducedPrecisionFloatType):
    name = "f6E3M2FN"
    SEMANTICS = FloatSemantics(
        exponent_bits=3,
        mantissa_bits=2,
        exponent_bias=3,
        nonfinite=FloatNonfiniteBehavior.FINITE_ONLY,
    )

name = 'f6E3M2FN' class-attribute instance-attribute

SEMANTICS = FloatSemantics(exponent_bits=3, mantissa_bits=2, exponent_bias=3, nonfinite=FloatNonfiniteBehavior.FINITE_ONLY) class-attribute instance-attribute

Float4E2M1FNType dataclass

Bases: ParametrizedAttribute, ReducedPrecisionFloatType

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class Float4E2M1FNType(ParametrizedAttribute, ReducedPrecisionFloatType):
    name = "f4E2M1FN"
    SEMANTICS = FloatSemantics(
        exponent_bits=2,
        mantissa_bits=1,
        exponent_bias=1,
        nonfinite=FloatNonfiniteBehavior.FINITE_ONLY,
    )

name = 'f4E2M1FN' class-attribute instance-attribute

SEMANTICS = FloatSemantics(exponent_bits=2, mantissa_bits=1, exponent_bias=1, nonfinite=FloatNonfiniteBehavior.FINITE_ONLY) class-attribute instance-attribute

FloatData dataclass

Bases: Data[float]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class FloatData(Data[float]):
    name = "builtin.float_data"

    @classmethod
    def parse_parameter(cls, parser: AttrParser) -> float:
        with parser.in_angle_brackets():
            return float(parser.parse_number())

    def print_parameter(self, printer: Printer) -> None:
        with printer.in_angle_brackets():
            printer.print_string(f"{self.data}")

    def __eq__(self, other: object) -> bool:
        """Compare stored bits, distinguishing signed zeros and NaN encodings."""
        if not isinstance(other, FloatData):
            return False
        return convert_f64_to_u64(self.data) == convert_f64_to_u64(other.data)

    def __hash__(self):
        return hash(convert_f64_to_u64(self.data))

name = 'builtin.float_data' class-attribute instance-attribute

parse_parameter(parser: AttrParser) -> float classmethod

Source code in xdsl/dialects/builtin.py
@classmethod
def parse_parameter(cls, parser: AttrParser) -> float:
    with parser.in_angle_brackets():
        return float(parser.parse_number())

print_parameter(printer: Printer) -> None

Source code in xdsl/dialects/builtin.py
def print_parameter(self, printer: Printer) -> None:
    with printer.in_angle_brackets():
        printer.print_string(f"{self.data}")

__eq__(other: object) -> bool

Compare stored bits, distinguishing signed zeros and NaN encodings.

Source code in xdsl/dialects/builtin.py
def __eq__(self, other: object) -> bool:
    """Compare stored bits, distinguishing signed zeros and NaN encodings."""
    if not isinstance(other, FloatData):
        return False
    return convert_f64_to_u64(self.data) == convert_f64_to_u64(other.data)

__hash__()

Source code in xdsl/dialects/builtin.py
def __hash__(self):
    return hash(convert_f64_to_u64(self.data))

FloatAttr

Bases: BuiltinAttribute, TypedAttribute, Generic[_FloatAttrTypeCovT]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class FloatAttr(BuiltinAttribute, TypedAttribute, Generic[_FloatAttrTypeCovT]):
    name = "float"

    value: FloatData
    type: _FloatAttrTypeCovT

    @overload
    def __init__(self, data: float | FloatData, type: _FloatAttrTypeCovT) -> None: ...

    @overload
    def __init__(self, data: float | FloatData, type: int) -> None: ...

    def __init__(
        self, data: float | FloatData, type: int | _FloatAttrTypeCovT | AnyFloat
    ) -> None:
        if isinstance(type, int):
            if type == 16:
                type = f16
            elif type == 32:
                type = f32
            elif type == 64:
                type = f64
            elif type == 80:
                type = f80
            elif type == 128:
                type = f128
            else:
                raise ValueError(f"Invalid bitwidth: {type}")

        value: float = data.data if isinstance(data, FloatData) else data
        # constrain value to precision of floating point type
        value = type.round(value)

        data_attr = FloatData(value)

        super().__init__(data_attr, type)

    @staticmethod
    def parse_with_type(
        parser: AttrParser,
        type: Attribute,
    ) -> TypedAttribute:
        assert isinstance(type, AnyFloat)
        return FloatAttr(parser.parse_float(), type)

    def print_without_type(self, printer: Printer):
        return printer.print_float(self.value.data, self.type)

    def print_builtin(self, printer: Printer):
        self.print_without_type(printer)
        printer.print_string(" : ")
        printer.print_attribute(self.get_type())

    @staticmethod
    def iter_unpack(
        type: _FloatAttrTypeInvT, buffer: ReadableBuffer, /
    ) -> Iterator[FloatAttr[_FloatAttrTypeInvT]]:
        """
        Yields unpacked values one at a time, starting at the beginning of the buffer.
        """
        for value in type.iter_unpack(buffer):
            yield FloatAttr(value, type)

    @staticmethod
    def unpack(
        type: _FloatAttrTypeInvT, buffer: ReadableBuffer, num: int, /
    ) -> tuple[FloatAttr[_FloatAttrTypeInvT], ...]:
        """
        Unpack `num` values from the beginning of the buffer.
        """
        return tuple(FloatAttr(value, type) for value in type.unpack(buffer, num))

    @staticmethod
    def constr(
        type: IRDLAttrConstraint[_FloatAttrTypeCovT] = AnyFloat,
    ) -> AttrConstraint[FloatAttr[_FloatAttrTypeCovT]]:
        return cast(
            AttrConstraint[FloatAttr[_FloatAttrTypeCovT]],
            ParamAttrConstraint.get(
                FloatAttr,
                None,
                type,
            ),
        )

name = 'float' class-attribute instance-attribute

value: FloatData instance-attribute

type: _FloatAttrTypeCovT instance-attribute

__init__(data: float | FloatData, type: int | _FloatAttrTypeCovT | AnyFloat) -> None

__init__(
    data: float | FloatData, type: _FloatAttrTypeCovT
) -> None
__init__(data: float | FloatData, type: int) -> None
Source code in xdsl/dialects/builtin.py
def __init__(
    self, data: float | FloatData, type: int | _FloatAttrTypeCovT | AnyFloat
) -> None:
    if isinstance(type, int):
        if type == 16:
            type = f16
        elif type == 32:
            type = f32
        elif type == 64:
            type = f64
        elif type == 80:
            type = f80
        elif type == 128:
            type = f128
        else:
            raise ValueError(f"Invalid bitwidth: {type}")

    value: float = data.data if isinstance(data, FloatData) else data
    # constrain value to precision of floating point type
    value = type.round(value)

    data_attr = FloatData(value)

    super().__init__(data_attr, type)

parse_with_type(parser: AttrParser, type: Attribute) -> TypedAttribute staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def parse_with_type(
    parser: AttrParser,
    type: Attribute,
) -> TypedAttribute:
    assert isinstance(type, AnyFloat)
    return FloatAttr(parser.parse_float(), type)

print_without_type(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_without_type(self, printer: Printer):
    return printer.print_float(self.value.data, self.type)

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    self.print_without_type(printer)
    printer.print_string(" : ")
    printer.print_attribute(self.get_type())

iter_unpack(type: _FloatAttrTypeInvT, buffer: ReadableBuffer) -> Iterator[FloatAttr[_FloatAttrTypeInvT]] staticmethod

Yields unpacked values one at a time, starting at the beginning of the buffer.

Source code in xdsl/dialects/builtin.py
@staticmethod
def iter_unpack(
    type: _FloatAttrTypeInvT, buffer: ReadableBuffer, /
) -> Iterator[FloatAttr[_FloatAttrTypeInvT]]:
    """
    Yields unpacked values one at a time, starting at the beginning of the buffer.
    """
    for value in type.iter_unpack(buffer):
        yield FloatAttr(value, type)

unpack(type: _FloatAttrTypeInvT, buffer: ReadableBuffer, num: int) -> tuple[FloatAttr[_FloatAttrTypeInvT], ...] staticmethod

Unpack num values from the beginning of the buffer.

Source code in xdsl/dialects/builtin.py
@staticmethod
def unpack(
    type: _FloatAttrTypeInvT, buffer: ReadableBuffer, num: int, /
) -> tuple[FloatAttr[_FloatAttrTypeInvT], ...]:
    """
    Unpack `num` values from the beginning of the buffer.
    """
    return tuple(FloatAttr(value, type) for value in type.unpack(buffer, num))

constr(type: IRDLAttrConstraint[_FloatAttrTypeCovT] = AnyFloat) -> AttrConstraint[FloatAttr[_FloatAttrTypeCovT]] staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def constr(
    type: IRDLAttrConstraint[_FloatAttrTypeCovT] = AnyFloat,
) -> AttrConstraint[FloatAttr[_FloatAttrTypeCovT]]:
    return cast(
        AttrConstraint[FloatAttr[_FloatAttrTypeCovT]],
        ParamAttrConstraint.get(
            FloatAttr,
            None,
            type,
        ),
    )

ComplexType dataclass

Bases: PackableType[tuple[float, float] | tuple[int, int]], ParametrizedAttribute, BuiltinAttribute, ContainerType[_ComplexElementCovT], TypeAttribute, Generic[_ComplexElementCovT]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class ComplexType(
    PackableType[tuple[float, float] | tuple[int, int]],
    ParametrizedAttribute,
    BuiltinAttribute,
    ContainerType[_ComplexElementCovT],
    TypeAttribute,
    Generic[_ComplexElementCovT],
):
    name = "complex"
    element_type: _ComplexElementCovT

    def print_builtin(self, printer: Printer):
        printer.print_string("complex")
        with printer.in_angle_brackets():
            printer.print_attribute(self.element_type)

    def get_element_type(self) -> _ComplexElementCovT:
        return self.element_type

    @property
    def compile_time_size(self) -> int:
        return 2 * self.element_type.compile_time_size

    @property
    def size(self) -> int:
        return 2 * self.element_type.size

    def iter_unpack(self, buffer: ReadableBuffer, /):
        values = (value for value in self.element_type.iter_unpack(buffer))
        return ((real, imag) for real, imag in zip(values, values))

    def unpack(self, buffer: ReadableBuffer, num: int, /):
        values = (value for value in self.element_type.unpack(buffer, 2 * num))
        return tuple((real, imag) for real, imag in zip(values, values))

    @overload
    def pack_into(
        self: ComplexType[IntegerType],
        buffer: WriteableBuffer,
        offset: int,
        value: tuple[int, int],
    ) -> None: ...

    @overload
    def pack_into(
        self: ComplexType[AnyFloat],
        buffer: WriteableBuffer,
        offset: int,
        value: tuple[float, float],
    ) -> None: ...

    def pack_into(
        self,
        buffer: WriteableBuffer,
        offset: int,
        value: tuple[float, float] | tuple[int, int],
    ) -> None:
        self.element_type.pack_into(buffer, 2 * offset, value[0])  # pyright: ignore[reportArgumentType]
        self.element_type.pack_into(buffer, 2 * offset + 1, value[1])  # pyright: ignore[reportArgumentType]
        return

    @overload
    def pack(
        self: ComplexType[AnyFloat], values: Sequence[tuple[float, float]]
    ) -> bytes: ...

    @overload
    def pack(
        self: ComplexType[IntegerType], values: Sequence[tuple[int, int]]
    ) -> bytes: ...

    def pack(self, values: Sequence[tuple[float, float] | tuple[int, int]]) -> bytes:
        return self.element_type.pack(tuple(val for vals in values for val in vals))  # pyright: ignore[reportArgumentType]

    @staticmethod
    def constr(
        element_type: IRDLAttrConstraint[_ComplexElementCovT] | None = None,
    ) -> AttrConstraint[ComplexType[_ComplexElementCovT]]:
        return cast(
            AttrConstraint[ComplexType[_ComplexElementCovT]],
            ParamAttrConstraint.get(
                ComplexType,
                element_type,
            ),
        )

name = 'complex' class-attribute instance-attribute

element_type: _ComplexElementCovT instance-attribute

compile_time_size: int property

size: int property

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_string("complex")
    with printer.in_angle_brackets():
        printer.print_attribute(self.element_type)

get_element_type() -> _ComplexElementCovT

Source code in xdsl/dialects/builtin.py
def get_element_type(self) -> _ComplexElementCovT:
    return self.element_type

iter_unpack(buffer: ReadableBuffer)

Source code in xdsl/dialects/builtin.py
def iter_unpack(self, buffer: ReadableBuffer, /):
    values = (value for value in self.element_type.iter_unpack(buffer))
    return ((real, imag) for real, imag in zip(values, values))

unpack(buffer: ReadableBuffer, num: int)

Source code in xdsl/dialects/builtin.py
def unpack(self, buffer: ReadableBuffer, num: int, /):
    values = (value for value in self.element_type.unpack(buffer, 2 * num))
    return tuple((real, imag) for real, imag in zip(values, values))

pack_into(buffer: WriteableBuffer, offset: int, value: tuple[float, float] | tuple[int, int]) -> None

pack_into(
    buffer: WriteableBuffer,
    offset: int,
    value: tuple[int, int],
) -> None
pack_into(
    buffer: WriteableBuffer,
    offset: int,
    value: tuple[float, float],
) -> None
Source code in xdsl/dialects/builtin.py
def pack_into(
    self,
    buffer: WriteableBuffer,
    offset: int,
    value: tuple[float, float] | tuple[int, int],
) -> None:
    self.element_type.pack_into(buffer, 2 * offset, value[0])  # pyright: ignore[reportArgumentType]
    self.element_type.pack_into(buffer, 2 * offset + 1, value[1])  # pyright: ignore[reportArgumentType]
    return

pack(values: Sequence[tuple[float, float] | tuple[int, int]]) -> bytes

pack(values: Sequence[tuple[float, float]]) -> bytes
pack(values: Sequence[tuple[int, int]]) -> bytes
Source code in xdsl/dialects/builtin.py
def pack(self, values: Sequence[tuple[float, float] | tuple[int, int]]) -> bytes:
    return self.element_type.pack(tuple(val for vals in values for val in vals))  # pyright: ignore[reportArgumentType]

constr(element_type: IRDLAttrConstraint[_ComplexElementCovT] | None = None) -> AttrConstraint[ComplexType[_ComplexElementCovT]] staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def constr(
    element_type: IRDLAttrConstraint[_ComplexElementCovT] | None = None,
) -> AttrConstraint[ComplexType[_ComplexElementCovT]]:
    return cast(
        AttrConstraint[ComplexType[_ComplexElementCovT]],
        ParamAttrConstraint.get(
            ComplexType,
            element_type,
        ),
    )

DictionaryAttr

Bases: _BuiltinData[immutabledict[str, Attribute]]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class DictionaryAttr(_BuiltinData[immutabledict[str, Attribute]]):
    name = "dictionary"

    def __init__(self, value: Mapping[str, Attribute]):
        if not isinstance(value, immutabledict):
            value = immutabledict(value)
        super().__init__(value)

    def print_builtin(self, printer: Printer):
        printer.print_attr_dict(self.data)

    def verify(self) -> None:
        return super().verify()

name = 'dictionary' class-attribute instance-attribute

__init__(value: Mapping[str, Attribute])

Source code in xdsl/dialects/builtin.py
def __init__(self, value: Mapping[str, Attribute]):
    if not isinstance(value, immutabledict):
        value = immutabledict(value)
    super().__init__(value)

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_attr_dict(self.data)

verify() -> None

Source code in xdsl/dialects/builtin.py
def verify(self) -> None:
    return super().verify()

TupleType dataclass

Bases: ParametrizedAttribute, BuiltinAttribute, TypeAttribute

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class TupleType(ParametrizedAttribute, BuiltinAttribute, TypeAttribute):
    name = "tuple"

    types: ArrayAttr[TypeAttribute] = param_def(converter=ArrayAttr[TypeAttribute].get)

    def print_builtin(self, printer: Printer):
        printer.print_string("tuple")
        with printer.in_angle_brackets():
            printer.print_list(self.types, printer.print_attribute)

name = 'tuple' class-attribute instance-attribute

types: ArrayAttr[TypeAttribute] = param_def(converter=ArrayAttr[TypeAttribute].get) class-attribute instance-attribute

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_string("tuple")
    with printer.in_angle_brackets():
        printer.print_list(self.types, printer.print_attribute)

VectorType

Bases: BuiltinAttribute, ParametrizedAttribute, TypeAttribute, ShapedType, ContainerType[AttributeCovT], Generic[AttributeCovT]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class VectorType(
    BuiltinAttribute,
    ParametrizedAttribute,
    TypeAttribute,
    ShapedType,
    ContainerType[AttributeCovT],
    Generic[AttributeCovT],
):
    name = "vector"

    element_type: AttributeCovT
    shape: ArrayAttr[IntAttr]
    scalable_dims: ArrayAttr[BoolAttr]

    def __init__(
        self,
        element_type: AttributeCovT,
        shape: Iterable[int | IntAttr],
        scalable_dims: ArrayAttr[BoolAttr] | None = None,
    ) -> None:
        shape = ArrayAttr(
            [IntAttr(dim) if isinstance(dim, int) else dim for dim in shape]
        )
        if scalable_dims is None:
            false = BoolAttr(False, i1)
            scalable_dims = ArrayAttr(false for _ in shape)
        super().__init__(element_type, shape, scalable_dims)

    @staticmethod
    def _print_vector_dim(printer: Printer, pair: tuple[IntAttr, BoolAttr]):
        """
        Helper method to print a vector dimension either as static (`4`) or scalable
        (`[4]`).
        """
        dim, scalable = pair
        if scalable:
            printer.print_string(f"[{dim.data}]")
        else:
            printer.print_string(f"{dim.data}")

    def print_builtin(self, printer: Printer):
        printer.print_string("vector")
        with printer.in_angle_brackets():
            printer.print_list(
                zip(self.shape, self.scalable_dims, strict=True),
                lambda pair: self._print_vector_dim(printer, pair),
                delimiter="x",
            )
            if self.shape.data:
                printer.print_string("x")

            printer.print_attribute(self.element_type)

    def get_num_dims(self) -> int:
        return len(self.shape.data)

    def get_num_scalable_dims(self) -> int:
        return sum(bool(d.value) for d in self.scalable_dims)

    def get_shape(self) -> tuple[int, ...]:
        return tuple(i.data for i in self.shape)

    def get_element_type(self) -> AttributeCovT:
        return self.element_type

    def get_scalable_dims(self) -> tuple[bool, ...]:
        return tuple(bool(i) for i in self.scalable_dims)

    def verify(self):
        num_dims = len(self.shape)
        num_scalable_dims = len(self.scalable_dims)
        if num_dims != num_scalable_dims:
            raise VerifyException(
                f"Number of scalable dimension specifiers {num_scalable_dims} must "
                f"equal to number of dimensions {num_dims}."
            )

    @staticmethod
    def constr(
        element_type: IRDLAttrConstraint[AttributeInvT] | None = None,
        *,
        shape: IRDLAttrConstraint[ArrayAttr[IntAttr]] | None = None,
        scalable_dims: IRDLAttrConstraint[ArrayAttr[BoolAttr]] | None = None,
    ) -> AttrConstraint[VectorType[AttributeInvT]]:
        shape_constr = AnyAttr() if shape is None else shape
        scalable_dims_constr = AnyAttr() if scalable_dims is None else scalable_dims
        return cast(
            AttrConstraint[VectorType[AttributeInvT]],
            ParamAttrConstraint.get(
                VectorType,
                element_type,
                shape_constr,
                scalable_dims_constr,
            ),
        )

name = 'vector' class-attribute instance-attribute

element_type: AttributeCovT instance-attribute

shape: ArrayAttr[IntAttr] instance-attribute

scalable_dims: ArrayAttr[BoolAttr] instance-attribute

__init__(element_type: AttributeCovT, shape: Iterable[int | IntAttr], scalable_dims: ArrayAttr[BoolAttr] | None = None) -> None

Source code in xdsl/dialects/builtin.py
def __init__(
    self,
    element_type: AttributeCovT,
    shape: Iterable[int | IntAttr],
    scalable_dims: ArrayAttr[BoolAttr] | None = None,
) -> None:
    shape = ArrayAttr(
        [IntAttr(dim) if isinstance(dim, int) else dim for dim in shape]
    )
    if scalable_dims is None:
        false = BoolAttr(False, i1)
        scalable_dims = ArrayAttr(false for _ in shape)
    super().__init__(element_type, shape, scalable_dims)

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_string("vector")
    with printer.in_angle_brackets():
        printer.print_list(
            zip(self.shape, self.scalable_dims, strict=True),
            lambda pair: self._print_vector_dim(printer, pair),
            delimiter="x",
        )
        if self.shape.data:
            printer.print_string("x")

        printer.print_attribute(self.element_type)

get_num_dims() -> int

Source code in xdsl/dialects/builtin.py
def get_num_dims(self) -> int:
    return len(self.shape.data)

get_num_scalable_dims() -> int

Source code in xdsl/dialects/builtin.py
def get_num_scalable_dims(self) -> int:
    return sum(bool(d.value) for d in self.scalable_dims)

get_shape() -> tuple[int, ...]

Source code in xdsl/dialects/builtin.py
def get_shape(self) -> tuple[int, ...]:
    return tuple(i.data for i in self.shape)

get_element_type() -> AttributeCovT

Source code in xdsl/dialects/builtin.py
def get_element_type(self) -> AttributeCovT:
    return self.element_type

get_scalable_dims() -> tuple[bool, ...]

Source code in xdsl/dialects/builtin.py
def get_scalable_dims(self) -> tuple[bool, ...]:
    return tuple(bool(i) for i in self.scalable_dims)

verify()

Source code in xdsl/dialects/builtin.py
def verify(self):
    num_dims = len(self.shape)
    num_scalable_dims = len(self.scalable_dims)
    if num_dims != num_scalable_dims:
        raise VerifyException(
            f"Number of scalable dimension specifiers {num_scalable_dims} must "
            f"equal to number of dimensions {num_dims}."
        )

constr(element_type: IRDLAttrConstraint[AttributeInvT] | None = None, *, shape: IRDLAttrConstraint[ArrayAttr[IntAttr]] | None = None, scalable_dims: IRDLAttrConstraint[ArrayAttr[BoolAttr]] | None = None) -> AttrConstraint[VectorType[AttributeInvT]] staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def constr(
    element_type: IRDLAttrConstraint[AttributeInvT] | None = None,
    *,
    shape: IRDLAttrConstraint[ArrayAttr[IntAttr]] | None = None,
    scalable_dims: IRDLAttrConstraint[ArrayAttr[BoolAttr]] | None = None,
) -> AttrConstraint[VectorType[AttributeInvT]]:
    shape_constr = AnyAttr() if shape is None else shape
    scalable_dims_constr = AnyAttr() if scalable_dims is None else scalable_dims
    return cast(
        AttrConstraint[VectorType[AttributeInvT]],
        ParamAttrConstraint.get(
            VectorType,
            element_type,
            shape_constr,
            scalable_dims_constr,
        ),
    )

TensorType

Bases: ParametrizedAttribute, BuiltinAttribute, TypeAttribute, ShapedType, ContainerType[AttributeCovT], Generic[AttributeCovT]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class TensorType(
    ParametrizedAttribute,
    BuiltinAttribute,
    TypeAttribute,
    ShapedType,
    ContainerType[AttributeCovT],
    Generic[AttributeCovT],
):
    name = "tensor"

    shape: ArrayAttr[IntAttr]
    element_type: AttributeCovT
    encoding: Attribute

    def __init__(
        self,
        element_type: AttributeCovT,
        shape: Iterable[int | IntAttr],
        encoding: Attribute = NoneAttr(),
    ):
        shape = ArrayAttr(
            [IntAttr(dim) if isinstance(dim, int) else dim for dim in shape]
        )
        super().__init__(shape, element_type, encoding)

    def print_builtin(self, printer: Printer):
        printer.print_string("tensor")
        with printer.in_angle_brackets():
            printer.print_dimension_list(self.get_shape())
            if len(self.shape.data) != 0:
                printer.print_string("x")
            printer.print_attribute(self.element_type)
            if self.encoding != NoneAttr():
                printer.print_string(", ")
                printer.print_attribute(self.encoding)

    def get_num_dims(self) -> int:
        return len(self.shape.data)

    def get_shape(self) -> tuple[int, ...]:
        return tuple(i.data for i in self.shape.data)

    def get_element_type(self) -> AttributeCovT:
        return self.element_type

    @staticmethod
    def constr(
        element_type: IRDLAttrConstraint[AttributeInvT] | None = None,
        shape: IRDLAttrConstraint | None = None,
    ) -> AttrConstraint[TensorType[AttributeInvT]]:
        return cast(
            AttrConstraint[TensorType[AttributeInvT]],
            ParamAttrConstraint.get(TensorType, shape, element_type, AnyAttr()),
        )

name = 'tensor' class-attribute instance-attribute

shape: ArrayAttr[IntAttr] instance-attribute

element_type: AttributeCovT instance-attribute

encoding: Attribute instance-attribute

__init__(element_type: AttributeCovT, shape: Iterable[int | IntAttr], encoding: Attribute = NoneAttr())

Source code in xdsl/dialects/builtin.py
def __init__(
    self,
    element_type: AttributeCovT,
    shape: Iterable[int | IntAttr],
    encoding: Attribute = NoneAttr(),
):
    shape = ArrayAttr(
        [IntAttr(dim) if isinstance(dim, int) else dim for dim in shape]
    )
    super().__init__(shape, element_type, encoding)

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_string("tensor")
    with printer.in_angle_brackets():
        printer.print_dimension_list(self.get_shape())
        if len(self.shape.data) != 0:
            printer.print_string("x")
        printer.print_attribute(self.element_type)
        if self.encoding != NoneAttr():
            printer.print_string(", ")
            printer.print_attribute(self.encoding)

get_num_dims() -> int

Source code in xdsl/dialects/builtin.py
def get_num_dims(self) -> int:
    return len(self.shape.data)

get_shape() -> tuple[int, ...]

Source code in xdsl/dialects/builtin.py
def get_shape(self) -> tuple[int, ...]:
    return tuple(i.data for i in self.shape.data)

get_element_type() -> AttributeCovT

Source code in xdsl/dialects/builtin.py
def get_element_type(self) -> AttributeCovT:
    return self.element_type

constr(element_type: IRDLAttrConstraint[AttributeInvT] | None = None, shape: IRDLAttrConstraint | None = None) -> AttrConstraint[TensorType[AttributeInvT]] staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def constr(
    element_type: IRDLAttrConstraint[AttributeInvT] | None = None,
    shape: IRDLAttrConstraint | None = None,
) -> AttrConstraint[TensorType[AttributeInvT]]:
    return cast(
        AttrConstraint[TensorType[AttributeInvT]],
        ParamAttrConstraint.get(TensorType, shape, element_type, AnyAttr()),
    )

UnrankedTensorType dataclass

Bases: ParametrizedAttribute, BuiltinAttribute, TypeAttribute, ContainerType[AttributeCovT], Generic[AttributeCovT]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class UnrankedTensorType(
    ParametrizedAttribute,
    BuiltinAttribute,
    TypeAttribute,
    ContainerType[AttributeCovT],
    Generic[AttributeCovT],
):
    name = "unranked_tensor"

    element_type: AttributeCovT

    def get_element_type(self) -> AttributeCovT:
        return self.element_type

    def print_builtin(self, printer: Printer):
        with printer.delimited("tensor<*x", ">"):
            printer.print_attribute(self.element_type)

name = 'unranked_tensor' class-attribute instance-attribute

element_type: AttributeCovT instance-attribute

get_element_type() -> AttributeCovT

Source code in xdsl/dialects/builtin.py
def get_element_type(self) -> AttributeCovT:
    return self.element_type

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    with printer.delimited("tensor<*x", ">"):
        printer.print_attribute(self.element_type)

VectorRankConstraint dataclass

Bases: AttrConstraint

Constrain a vector to be of a given rank.

Source code in xdsl/dialects/builtin.py
@dataclass(frozen=True)
class VectorRankConstraint(AttrConstraint):
    """
    Constrain a vector to be of a given rank.
    """

    expected_rank: int
    """The expected vector rank."""

    def verify(self, attr: Attribute, constraint_context: VerificationContext) -> None:
        if not isinstance(attr, VectorType):
            raise VerifyException(f"{attr} should be of type VectorType.")
        if attr.get_num_dims() != self.expected_rank:
            raise VerifyException(
                f"Expected vector rank to be {self.expected_rank}, got {attr.get_num_dims()}."
            )

    def mapping_type_vars(
        self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
    ) -> VectorRankConstraint:
        return self

expected_rank: int instance-attribute

The expected vector rank.

__init__(expected_rank: int) -> None

verify(attr: Attribute, constraint_context: VerificationContext) -> None

Source code in xdsl/dialects/builtin.py
def verify(self, attr: Attribute, constraint_context: VerificationContext) -> None:
    if not isinstance(attr, VectorType):
        raise VerifyException(f"{attr} should be of type VectorType.")
    if attr.get_num_dims() != self.expected_rank:
        raise VerifyException(
            f"Expected vector rank to be {self.expected_rank}, got {attr.get_num_dims()}."
        )

mapping_type_vars(type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]) -> VectorRankConstraint

Source code in xdsl/dialects/builtin.py
def mapping_type_vars(
    self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
) -> VectorRankConstraint:
    return self

VectorBaseTypeConstraint dataclass

Bases: AttrConstraint

Constrain a vector to be of a given base type.

Source code in xdsl/dialects/builtin.py
@dataclass(frozen=True)
class VectorBaseTypeConstraint(AttrConstraint):
    """
    Constrain a vector to be of a given base type.
    """

    expected_type: Attribute
    """The expected vector base type."""

    def verify(self, attr: Attribute, constraint_context: VerificationContext) -> None:
        if not isa(attr, VectorType):
            raise VerifyException(f"{attr} should be of type VectorType.")
        if attr.element_type != self.expected_type:
            raise VerifyException(
                f"Expected vector type to be {self.expected_type}, got {attr.element_type}."
            )

    def mapping_type_vars(
        self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
    ) -> VectorBaseTypeConstraint:
        return self

expected_type: Attribute instance-attribute

The expected vector base type.

__init__(expected_type: Attribute) -> None

verify(attr: Attribute, constraint_context: VerificationContext) -> None

Source code in xdsl/dialects/builtin.py
def verify(self, attr: Attribute, constraint_context: VerificationContext) -> None:
    if not isa(attr, VectorType):
        raise VerifyException(f"{attr} should be of type VectorType.")
    if attr.element_type != self.expected_type:
        raise VerifyException(
            f"Expected vector type to be {self.expected_type}, got {attr.element_type}."
        )

mapping_type_vars(type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]) -> VectorBaseTypeConstraint

Source code in xdsl/dialects/builtin.py
def mapping_type_vars(
    self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
) -> VectorBaseTypeConstraint:
    return self

VectorBaseTypeAndRankConstraint dataclass

Bases: AttrConstraint

Constrain a vector to be of a given rank and base type.

Source code in xdsl/dialects/builtin.py
@dataclass(frozen=True)
class VectorBaseTypeAndRankConstraint(AttrConstraint):
    """
    Constrain a vector to be of a given rank and base type.
    """

    expected_type: Attribute
    """The expected vector base type."""

    expected_rank: int
    """The expected vector rank."""

    def verify(self, attr: Attribute, constraint_context: VerificationContext) -> None:
        constraint = VectorBaseTypeConstraint(
            self.expected_type
        ) & VectorRankConstraint(self.expected_rank)
        constraint.verify(attr, constraint_context)

    def mapping_type_vars(
        self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
    ) -> VectorBaseTypeAndRankConstraint:
        return self

expected_type: Attribute instance-attribute

The expected vector base type.

expected_rank: int instance-attribute

The expected vector rank.

__init__(expected_type: Attribute, expected_rank: int) -> None

verify(attr: Attribute, constraint_context: VerificationContext) -> None

Source code in xdsl/dialects/builtin.py
def verify(self, attr: Attribute, constraint_context: VerificationContext) -> None:
    constraint = VectorBaseTypeConstraint(
        self.expected_type
    ) & VectorRankConstraint(self.expected_rank)
    constraint.verify(attr, constraint_context)

mapping_type_vars(type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]) -> VectorBaseTypeAndRankConstraint

Source code in xdsl/dialects/builtin.py
def mapping_type_vars(
    self, type_var_mapping: Mapping[TypeVar, AttrConstraint | IntConstraint]
) -> VectorBaseTypeAndRankConstraint:
    return self

DenseResourceAttr dataclass

Bases: BuiltinAttribute, TypedAttribute

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class DenseResourceAttr(BuiltinAttribute, TypedAttribute):
    name = "dense_resource"

    resource_handle: StringAttr
    type: ShapedType

    def print_without_type(self, printer: Printer):
        printer.print_string("dense_resource")
        with printer.in_angle_brackets():
            printer.print_resource_handle("builtin", self.resource_handle.data)

    def print_builtin(self, printer: Printer):
        self.print_without_type(printer)
        printer.print_string(" : ")
        printer.print_attribute(self.get_type())

    @staticmethod
    def from_params(handle: str | StringAttr, type: ShapedType) -> DenseResourceAttr:
        if isinstance(handle, str):
            handle = StringAttr(handle)
        return DenseResourceAttr(handle, type)

name = 'dense_resource' class-attribute instance-attribute

resource_handle: StringAttr instance-attribute

type: ShapedType instance-attribute

print_without_type(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_without_type(self, printer: Printer):
    printer.print_string("dense_resource")
    with printer.in_angle_brackets():
        printer.print_resource_handle("builtin", self.resource_handle.data)

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    self.print_without_type(printer)
    printer.print_string(" : ")
    printer.print_attribute(self.get_type())

from_params(handle: str | StringAttr, type: ShapedType) -> DenseResourceAttr staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def from_params(handle: str | StringAttr, type: ShapedType) -> DenseResourceAttr:
    if isinstance(handle, str):
        handle = StringAttr(handle)
    return DenseResourceAttr(handle, type)

DenseArrayBase dataclass

Bases: ContainerType[_DenseArrayElementCovT], ParametrizedAttribute, BuiltinAttribute, Generic[_DenseArrayElementCovT]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class DenseArrayBase(
    ContainerType[_DenseArrayElementCovT],
    ParametrizedAttribute,
    BuiltinAttribute,
    Generic[_DenseArrayElementCovT],
):
    name = "array"

    elt_type: _DenseArrayElementCovT
    data: BytesAttr

    def print_builtin(self, printer: Printer):
        printer.print_string("array")
        with printer.in_angle_brackets():
            printer.print_attribute(self.elt_type)
            if len(self) == 0:
                return
            printer.print_string(": ")
            elt_type = self.elt_type
            if isinstance(elt_type, IntegerType):
                int_self: DenseArrayBase[IntegerType] = self  # pyright: ignore[reportAssignmentType]
                printer.print_list(
                    int_self.iter_values(),
                    lambda x: printer.print_int(x, elt_type),
                )
            else:
                float_self: DenseArrayBase[AnyFloat] = self  # pyright: ignore[reportAssignmentType]
                printer.print_list(
                    float_self.iter_values(), lambda x: printer.print_float(x, elt_type)
                )

    def verify(self):
        data_len = len(self.data.data)
        elt_size = self.elt_type.size
        if data_len % elt_size:
            raise VerifyException(
                f"Data length of {self.name} ({data_len}) not divisible by element "
                f"size {elt_size}"
            )

    def get_element_type(self) -> _DenseArrayElementCovT:
        return self.elt_type

    @overload
    @staticmethod
    def from_list(
        data_type: _IntegerTypeInvT, data: Sequence[int]
    ) -> DenseArrayBase[_IntegerTypeInvT]: ...

    @overload
    @staticmethod
    def from_list(
        data_type: _FloatAttrTypeInvT, data: Sequence[float]
    ) -> DenseArrayBase[_FloatAttrTypeInvT]: ...

    @staticmethod
    def from_list(
        data_type: IntegerType | AnyFloat,
        data: (Sequence[int] | Sequence[float]),
    ) -> DenseArrayBase:
        if isinstance(data_type, IntegerType):
            data = tuple(
                data_type.get_normalized_value(value)  # pyright: ignore[reportArgumentType]
                for value in data
            )
        bytes_data = data_type.pack(data)  # pyright: ignore[reportArgumentType]
        return DenseArrayBase(data_type, BytesAttr(bytes_data))

    @overload
    def iter_values(self: DenseArrayBase[IntegerType]) -> Iterator[int]: ...

    @overload
    def iter_values(self: DenseArrayBase[AnyFloat]) -> Iterator[float]: ...

    def iter_values(self) -> Iterator[float] | Iterator[int]:
        """
        Returns an iterator of `int` or `float` values, depending on whether
        `self.elt_type` is an integer type or a floating point type.
        """
        return self.elt_type.iter_unpack(self.data.data)

    @overload
    def get_values(self: DenseArrayBase[IntegerType]) -> tuple[int, ...]: ...

    @overload
    def get_values(self: DenseArrayBase[AnyFloat]) -> tuple[float, ...]: ...

    def get_values(self) -> tuple[int, ...] | tuple[float, ...]:
        """
        Get a tuple of `int` or `float` values, depending on whether `self.elt_type` is
        an integer type or a floating point type.
        """
        return self.elt_type.unpack(self.data.data, len(self))

    def iter_attrs(self) -> Iterator[IntegerAttr] | Iterator[FloatAttr]:
        if isinstance(self.elt_type, IntegerType):
            return IntegerAttr.iter_unpack(self.elt_type, self.data.data)
        else:
            return FloatAttr.iter_unpack(self.elt_type, self.data.data)

    def get_attrs(self) -> tuple[IntegerAttr, ...] | tuple[FloatAttr, ...]:
        if isinstance(self.elt_type, IntegerType):
            return IntegerAttr.unpack(self.elt_type, self.data.data, len(self))
        else:
            return FloatAttr.unpack(self.elt_type, self.data.data, len(self))

    def __len__(self) -> int:
        return len(self.data.data) // self.elt_type.size

    @staticmethod
    def constr(
        element_type: IRDLAttrConstraint[_DenseArrayElementInvT] | None = None,
    ) -> AttrConstraint[DenseArrayBase[_DenseArrayElementInvT]]:
        return cast(
            AttrConstraint[DenseArrayBase[_DenseArrayElementInvT]],
            ParamAttrConstraint.get(DenseArrayBase, element_type, AnyAttr()),
        )

name = 'array' class-attribute instance-attribute

elt_type: _DenseArrayElementCovT instance-attribute

data: BytesAttr instance-attribute

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_string("array")
    with printer.in_angle_brackets():
        printer.print_attribute(self.elt_type)
        if len(self) == 0:
            return
        printer.print_string(": ")
        elt_type = self.elt_type
        if isinstance(elt_type, IntegerType):
            int_self: DenseArrayBase[IntegerType] = self  # pyright: ignore[reportAssignmentType]
            printer.print_list(
                int_self.iter_values(),
                lambda x: printer.print_int(x, elt_type),
            )
        else:
            float_self: DenseArrayBase[AnyFloat] = self  # pyright: ignore[reportAssignmentType]
            printer.print_list(
                float_self.iter_values(), lambda x: printer.print_float(x, elt_type)
            )

verify()

Source code in xdsl/dialects/builtin.py
def verify(self):
    data_len = len(self.data.data)
    elt_size = self.elt_type.size
    if data_len % elt_size:
        raise VerifyException(
            f"Data length of {self.name} ({data_len}) not divisible by element "
            f"size {elt_size}"
        )

get_element_type() -> _DenseArrayElementCovT

Source code in xdsl/dialects/builtin.py
def get_element_type(self) -> _DenseArrayElementCovT:
    return self.elt_type

from_list(data_type: IntegerType | AnyFloat, data: Sequence[int] | Sequence[float]) -> DenseArrayBase staticmethod

from_list(
    data_type: _IntegerTypeInvT, data: Sequence[int]
) -> DenseArrayBase[_IntegerTypeInvT]
from_list(
    data_type: _FloatAttrTypeInvT, data: Sequence[float]
) -> DenseArrayBase[_FloatAttrTypeInvT]
Source code in xdsl/dialects/builtin.py
@staticmethod
def from_list(
    data_type: IntegerType | AnyFloat,
    data: (Sequence[int] | Sequence[float]),
) -> DenseArrayBase:
    if isinstance(data_type, IntegerType):
        data = tuple(
            data_type.get_normalized_value(value)  # pyright: ignore[reportArgumentType]
            for value in data
        )
    bytes_data = data_type.pack(data)  # pyright: ignore[reportArgumentType]
    return DenseArrayBase(data_type, BytesAttr(bytes_data))

iter_values() -> Iterator[float] | Iterator[int]

iter_values() -> Iterator[int]
iter_values() -> Iterator[float]

Returns an iterator of int or float values, depending on whether self.elt_type is an integer type or a floating point type.

Source code in xdsl/dialects/builtin.py
def iter_values(self) -> Iterator[float] | Iterator[int]:
    """
    Returns an iterator of `int` or `float` values, depending on whether
    `self.elt_type` is an integer type or a floating point type.
    """
    return self.elt_type.iter_unpack(self.data.data)

get_values() -> tuple[int, ...] | tuple[float, ...]

get_values() -> tuple[int, ...]
get_values() -> tuple[float, ...]

Get a tuple of int or float values, depending on whether self.elt_type is an integer type or a floating point type.

Source code in xdsl/dialects/builtin.py
def get_values(self) -> tuple[int, ...] | tuple[float, ...]:
    """
    Get a tuple of `int` or `float` values, depending on whether `self.elt_type` is
    an integer type or a floating point type.
    """
    return self.elt_type.unpack(self.data.data, len(self))

iter_attrs() -> Iterator[IntegerAttr] | Iterator[FloatAttr]

Source code in xdsl/dialects/builtin.py
def iter_attrs(self) -> Iterator[IntegerAttr] | Iterator[FloatAttr]:
    if isinstance(self.elt_type, IntegerType):
        return IntegerAttr.iter_unpack(self.elt_type, self.data.data)
    else:
        return FloatAttr.iter_unpack(self.elt_type, self.data.data)

get_attrs() -> tuple[IntegerAttr, ...] | tuple[FloatAttr, ...]

Source code in xdsl/dialects/builtin.py
def get_attrs(self) -> tuple[IntegerAttr, ...] | tuple[FloatAttr, ...]:
    if isinstance(self.elt_type, IntegerType):
        return IntegerAttr.unpack(self.elt_type, self.data.data, len(self))
    else:
        return FloatAttr.unpack(self.elt_type, self.data.data, len(self))

__len__() -> int

Source code in xdsl/dialects/builtin.py
def __len__(self) -> int:
    return len(self.data.data) // self.elt_type.size

constr(element_type: IRDLAttrConstraint[_DenseArrayElementInvT] | None = None) -> AttrConstraint[DenseArrayBase[_DenseArrayElementInvT]] staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def constr(
    element_type: IRDLAttrConstraint[_DenseArrayElementInvT] | None = None,
) -> AttrConstraint[DenseArrayBase[_DenseArrayElementInvT]]:
    return cast(
        AttrConstraint[DenseArrayBase[_DenseArrayElementInvT]],
        ParamAttrConstraint.get(DenseArrayBase, element_type, AnyAttr()),
    )

FunctionType dataclass

Bases: ParametrizedAttribute, BuiltinAttribute, TypeAttribute

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class FunctionType(ParametrizedAttribute, BuiltinAttribute, TypeAttribute):
    name = "fun"

    inputs: ArrayAttr[Attribute]
    outputs: ArrayAttr[Attribute]

    def print_builtin(self, printer: Printer):
        with printer.in_parens():
            printer.print_list(self.inputs.data, printer.print_attribute)
        printer.print_string(" -> ")
        outputs = self.outputs.data
        if len(outputs) == 1 and not isinstance(outputs[0], FunctionType):
            printer.print_attribute(outputs[0])
        else:
            with printer.in_parens():
                printer.print_list(outputs, printer.print_attribute)

    @staticmethod
    def from_lists(
        inputs: Sequence[Attribute], outputs: Sequence[Attribute]
    ) -> FunctionType:
        return FunctionType(ArrayAttr(inputs), ArrayAttr(outputs))

    @staticmethod
    def from_attrs(
        inputs: ArrayAttr[Attribute], outputs: ArrayAttr[Attribute]
    ) -> FunctionType:
        return FunctionType(inputs, outputs)

name = 'fun' class-attribute instance-attribute

inputs: ArrayAttr[Attribute] instance-attribute

outputs: ArrayAttr[Attribute] instance-attribute

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    with printer.in_parens():
        printer.print_list(self.inputs.data, printer.print_attribute)
    printer.print_string(" -> ")
    outputs = self.outputs.data
    if len(outputs) == 1 and not isinstance(outputs[0], FunctionType):
        printer.print_attribute(outputs[0])
    else:
        with printer.in_parens():
            printer.print_list(outputs, printer.print_attribute)

from_lists(inputs: Sequence[Attribute], outputs: Sequence[Attribute]) -> FunctionType staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def from_lists(
    inputs: Sequence[Attribute], outputs: Sequence[Attribute]
) -> FunctionType:
    return FunctionType(ArrayAttr(inputs), ArrayAttr(outputs))

from_attrs(inputs: ArrayAttr[Attribute], outputs: ArrayAttr[Attribute]) -> FunctionType staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def from_attrs(
    inputs: ArrayAttr[Attribute], outputs: ArrayAttr[Attribute]
) -> FunctionType:
    return FunctionType(inputs, outputs)

OpaqueAttr dataclass

Bases: ParametrizedAttribute, BuiltinAttribute

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class OpaqueAttr(ParametrizedAttribute, BuiltinAttribute):
    name = "opaque"

    ident: StringAttr
    value: StringAttr
    type: Attribute

    def print_builtin(self, printer: Printer):
        printer.print_string("opaque")
        with printer.in_angle_brackets():
            printer.print_attribute(self.ident)
            printer.print_string(", ")
            printer.print_attribute(self.value)

        if not isinstance(self.type, NoneAttr):
            printer.print_string(" : ")
            printer.print_attribute(self.type)

    @staticmethod
    def from_strings(name: str, value: str, type: Attribute = NoneAttr()) -> OpaqueAttr:
        return OpaqueAttr(StringAttr(name), StringAttr(value), type)

name = 'opaque' class-attribute instance-attribute

ident: StringAttr instance-attribute

value: StringAttr instance-attribute

type: Attribute instance-attribute

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_string("opaque")
    with printer.in_angle_brackets():
        printer.print_attribute(self.ident)
        printer.print_string(", ")
        printer.print_attribute(self.value)

    if not isinstance(self.type, NoneAttr):
        printer.print_string(" : ")
        printer.print_attribute(self.type)

from_strings(name: str, value: str, type: Attribute = NoneAttr()) -> OpaqueAttr staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def from_strings(name: str, value: str, type: Attribute = NoneAttr()) -> OpaqueAttr:
    return OpaqueAttr(StringAttr(name), StringAttr(value), type)

MemRefLayoutAttr dataclass

Bases: Attribute, ABC

Interface for any attribute acceptable as a memref layout.

Source code in xdsl/dialects/builtin.py
class MemRefLayoutAttr(Attribute, ABC):
    """
    Interface for any attribute acceptable as a memref layout.
    """

    @abstractmethod
    def get_affine_map(self) -> AffineMap:
        """
        Return the affine mapping from the iteration space of this
        layout to the element offset in linear memory. The resulting
        affine map thus has only one result.
        """
        raise NotImplementedError()

    def get_strides(self) -> Sequence[int | None] | None:
        """
        (optional) Return the list of strides, representing the element offset
        in linear memory for every dimension in the iteration space of
        this memref layout attribute.

        Note: The dimension of the iteration space may differ from the dimension
        of the data it represents. For instance, this can occur in a tiled layout.

        This is only applicable to hyper-rectangular layouts.
        If this is not applicable for a given layout, returns None
        """
        return None

    def get_offset(self) -> int | None:
        """
        (optional) Return the static offset of this memref layout, if available.

        Returns `None` when the offset is dynamic or when this layout does not
        expose a strided offset.
        """
        return None

get_affine_map() -> AffineMap abstractmethod

Return the affine mapping from the iteration space of this layout to the element offset in linear memory. The resulting affine map thus has only one result.

Source code in xdsl/dialects/builtin.py
@abstractmethod
def get_affine_map(self) -> AffineMap:
    """
    Return the affine mapping from the iteration space of this
    layout to the element offset in linear memory. The resulting
    affine map thus has only one result.
    """
    raise NotImplementedError()

get_strides() -> Sequence[int | None] | None

(optional) Return the list of strides, representing the element offset in linear memory for every dimension in the iteration space of this memref layout attribute.

Note: The dimension of the iteration space may differ from the dimension of the data it represents. For instance, this can occur in a tiled layout.

This is only applicable to hyper-rectangular layouts. If this is not applicable for a given layout, returns None

Source code in xdsl/dialects/builtin.py
def get_strides(self) -> Sequence[int | None] | None:
    """
    (optional) Return the list of strides, representing the element offset
    in linear memory for every dimension in the iteration space of
    this memref layout attribute.

    Note: The dimension of the iteration space may differ from the dimension
    of the data it represents. For instance, this can occur in a tiled layout.

    This is only applicable to hyper-rectangular layouts.
    If this is not applicable for a given layout, returns None
    """
    return None

get_offset() -> int | None

(optional) Return the static offset of this memref layout, if available.

Returns None when the offset is dynamic or when this layout does not expose a strided offset.

Source code in xdsl/dialects/builtin.py
def get_offset(self) -> int | None:
    """
    (optional) Return the static offset of this memref layout, if available.

    Returns `None` when the offset is dynamic or when this layout does not
    expose a strided offset.
    """
    return None

StridedLayoutAttr

Bases: MemRefLayoutAttr, BuiltinAttribute, ParametrizedAttribute

An attribute representing a strided layout of a shaped type. See external documentation.

Contrary to MLIR, we represent dynamic offsets and strides with NoneAttr, and we do not restrict offsets and strides to 64-bits integers.

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class StridedLayoutAttr(MemRefLayoutAttr, BuiltinAttribute, ParametrizedAttribute):
    """
    An attribute representing a strided layout of a shaped type.
    See external [documentation](https://mlir.llvm.org/docs/Dialects/Builtin/#stridedlayoutattr).

    Contrary to MLIR, we represent dynamic offsets and strides with
    `NoneAttr`, and we do not restrict offsets and strides to 64-bits
    integers.
    """

    name = "strided"

    strides: ArrayAttr[IntAttr | NoneAttr]
    offset: IntAttr | NoneAttr

    def __init__(
        self,
        strides: (
            ArrayAttr[IntAttr | NoneAttr] | Sequence[int | IntAttr | NoneAttr | None]
        ),
        offset: int | IntAttr | NoneAttr | None = 0,
    ) -> None:
        if not isinstance(strides, ArrayAttr):
            strides_values: list[IntAttr | NoneAttr] = []
            for stride in strides:
                if isinstance(stride, int):
                    strides_values.append(IntAttr(stride))
                elif stride is None:
                    strides_values.append(NoneAttr())
                else:
                    strides_values.append(stride)
            strides = ArrayAttr(strides_values)

        if isinstance(offset, int):
            offset = IntAttr(offset)
        if offset is None:
            offset = NoneAttr()

        super().__init__(strides, offset)

    @staticmethod
    def _print_int_or_question(printer: Printer, value: IntAttr | NoneAttr) -> None:
        printer.print_string(f"{value.data}" if isinstance(value, IntAttr) else "?")

    def print_builtin(self, printer: Printer):
        printer.print_string("strided")
        with printer.in_angle_brackets():
            with printer.in_square_brackets():
                printer.print_list(
                    self.strides.data,
                    lambda value: self._print_int_or_question(printer, value),
                )
            if self.offset != IntAttr(0):
                printer.print_string(", offset: ")
                self._print_int_or_question(printer, self.offset)

    def get_strides(self) -> Sequence[int | None]:
        return tuple(
            None if isinstance(stride, NoneAttr) else stride.data
            for stride in self.strides
        )

    def get_offset(self) -> int | None:
        if isinstance(self.offset, NoneAttr):
            return None
        else:
            return self.offset.data

    def get_affine_map(self) -> AffineMap:
        """
        Return the affine mapping from the iteration space of this
        layout to the element offset in linear memory. The resulting
        affine map thus has only one result.

        For dynamic strides, this results in an affinemap with a number
        of symbols, ordered in the following manner:
            (1) Symbol for the dynamic offset of the layout
            (2) Symbols for every dynamic stride of the layout
        """

        # keep track of number of symbols
        nb_symbols = 0

        result = AffineConstantExpr(0)

        # add offset
        if isinstance(self.offset, IntAttr):
            result += AffineConstantExpr(self.offset.data)
        else:  # NoneAttr
            result += AffineSymExpr(nb_symbols)
            nb_symbols += 1

        for dim, stride in enumerate(self.strides.data):
            if isinstance(stride, IntAttr):
                stride_expr = AffineConstantExpr(stride.data)
            else:  # NoneAttr
                stride_expr = AffineSymExpr(nb_symbols)
                nb_symbols += 1
            result += AffineDimExpr(dim) * stride_expr

        return AffineMap(len(self.strides), nb_symbols, (result,))

name = 'strided' class-attribute instance-attribute

strides: ArrayAttr[IntAttr | NoneAttr] instance-attribute

offset: IntAttr | NoneAttr instance-attribute

__init__(strides: ArrayAttr[IntAttr | NoneAttr] | Sequence[int | IntAttr | NoneAttr | None], offset: int | IntAttr | NoneAttr | None = 0) -> None

Source code in xdsl/dialects/builtin.py
def __init__(
    self,
    strides: (
        ArrayAttr[IntAttr | NoneAttr] | Sequence[int | IntAttr | NoneAttr | None]
    ),
    offset: int | IntAttr | NoneAttr | None = 0,
) -> None:
    if not isinstance(strides, ArrayAttr):
        strides_values: list[IntAttr | NoneAttr] = []
        for stride in strides:
            if isinstance(stride, int):
                strides_values.append(IntAttr(stride))
            elif stride is None:
                strides_values.append(NoneAttr())
            else:
                strides_values.append(stride)
        strides = ArrayAttr(strides_values)

    if isinstance(offset, int):
        offset = IntAttr(offset)
    if offset is None:
        offset = NoneAttr()

    super().__init__(strides, offset)

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_string("strided")
    with printer.in_angle_brackets():
        with printer.in_square_brackets():
            printer.print_list(
                self.strides.data,
                lambda value: self._print_int_or_question(printer, value),
            )
        if self.offset != IntAttr(0):
            printer.print_string(", offset: ")
            self._print_int_or_question(printer, self.offset)

get_strides() -> Sequence[int | None]

Source code in xdsl/dialects/builtin.py
def get_strides(self) -> Sequence[int | None]:
    return tuple(
        None if isinstance(stride, NoneAttr) else stride.data
        for stride in self.strides
    )

get_offset() -> int | None

Source code in xdsl/dialects/builtin.py
def get_offset(self) -> int | None:
    if isinstance(self.offset, NoneAttr):
        return None
    else:
        return self.offset.data

get_affine_map() -> AffineMap

Return the affine mapping from the iteration space of this layout to the element offset in linear memory. The resulting affine map thus has only one result.

For dynamic strides, this results in an affinemap with a number of symbols, ordered in the following manner: (1) Symbol for the dynamic offset of the layout (2) Symbols for every dynamic stride of the layout

Source code in xdsl/dialects/builtin.py
def get_affine_map(self) -> AffineMap:
    """
    Return the affine mapping from the iteration space of this
    layout to the element offset in linear memory. The resulting
    affine map thus has only one result.

    For dynamic strides, this results in an affinemap with a number
    of symbols, ordered in the following manner:
        (1) Symbol for the dynamic offset of the layout
        (2) Symbols for every dynamic stride of the layout
    """

    # keep track of number of symbols
    nb_symbols = 0

    result = AffineConstantExpr(0)

    # add offset
    if isinstance(self.offset, IntAttr):
        result += AffineConstantExpr(self.offset.data)
    else:  # NoneAttr
        result += AffineSymExpr(nb_symbols)
        nb_symbols += 1

    for dim, stride in enumerate(self.strides.data):
        if isinstance(stride, IntAttr):
            stride_expr = AffineConstantExpr(stride.data)
        else:  # NoneAttr
            stride_expr = AffineSymExpr(nb_symbols)
            nb_symbols += 1
        result += AffineDimExpr(dim) * stride_expr

    return AffineMap(len(self.strides), nb_symbols, (result,))

AffineMapAttr dataclass

Bases: MemRefLayoutAttr, _BuiltinData[AffineMap]

An Attribute containing an AffineMap object.

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class AffineMapAttr(MemRefLayoutAttr, _BuiltinData[AffineMap]):
    """An Attribute containing an AffineMap object."""

    name = "affine_map"

    def print_builtin(self, printer: Printer):
        printer.print_string(f"affine_map<{self.data}>")

    @staticmethod
    def constant_map(value: int) -> AffineMapAttr:
        return AffineMapAttr(AffineMap.constant_map(value))

    def get_affine_map(self) -> AffineMap:
        return self.data

name = 'affine_map' class-attribute instance-attribute

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_string(f"affine_map<{self.data}>")

constant_map(value: int) -> AffineMapAttr staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def constant_map(value: int) -> AffineMapAttr:
    return AffineMapAttr(AffineMap.constant_map(value))

get_affine_map() -> AffineMap

Source code in xdsl/dialects/builtin.py
def get_affine_map(self) -> AffineMap:
    return self.data

AffineSetAttr dataclass

Bases: _BuiltinData[AffineSet]

An attribute containing an AffineSet object.

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class AffineSetAttr(_BuiltinData[AffineSet]):
    """An attribute containing an AffineSet object."""

    name = "affine_set"

    def print_builtin(self, printer: Printer):
        printer.print_string(f"affine_set<{self.data}>")

name = 'affine_set' class-attribute instance-attribute

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_string(f"affine_set<{self.data}>")

UnrealizedConversionCastOp dataclass

Bases: IRDLOperation

Source code in xdsl/dialects/builtin.py
@irdl_op_definition
class UnrealizedConversionCastOp(IRDLOperation):
    name = "builtin.unrealized_conversion_cast"

    inputs = var_operand_def()
    outputs = var_result_def()

    traits = traits_def(NoMemoryEffect())

    @staticmethod
    def get(inputs: Sequence[OperandArg], result_type: Sequence[Attribute]):
        return UnrealizedConversionCastOp.build(
            operands=[inputs],
            result_types=[result_type],
        )

    @staticmethod
    def cast_one(
        input: SSAValue, result_type: AttributeInvT
    ) -> tuple[UnrealizedConversionCastOp, SSAValue[AttributeInvT]]:
        op = UnrealizedConversionCastOp(operands=(input,), result_types=(result_type,))
        res: SSAValue[AttributeInvT] = op.results[0]  # pyright: ignore[reportAssignmentType]
        if input.name_hint is not None:
            res.name_hint = input.name_hint
        return op, res

    @classmethod
    def parse(cls, parser: Parser) -> Self:
        if parser.parse_optional_characters("to") is None:
            args = parser.parse_comma_separated_list(
                parser.Delimiter.NONE,
                parser.parse_unresolved_operand,
            )
            parser.parse_punctuation(":")
            input_types = parser.parse_comma_separated_list(
                parser.Delimiter.NONE,
                parser.parse_type,
            )
            parser.parse_characters("to")
            inputs = parser.resolve_operands(args, input_types, parser.pos)
        else:
            inputs = list[SSAValue]()
        output_types = parser.parse_comma_separated_list(
            parser.Delimiter.NONE,
            parser.parse_type,
        )
        attributes = parser.parse_optional_attr_dict()
        return cls(
            operands=[inputs], result_types=[output_types], attributes=attributes
        )

    def print(self, printer: Printer):
        def print_fn(operand: SSAValue) -> None:
            return printer.print_attribute(operand.type)

        if self.inputs:
            printer.print_string(" ")
            printer.print_list(self.inputs, printer.print_operand)
            printer.print_string(" : ")
            printer.print_list(self.inputs, print_fn)
        printer.print_string(" to ")
        printer.print_list(self.outputs, print_fn)
        printer.print_op_attributes(self.attributes)

name = 'builtin.unrealized_conversion_cast' class-attribute instance-attribute

inputs = var_operand_def() class-attribute instance-attribute

outputs = var_result_def() class-attribute instance-attribute

traits = traits_def(NoMemoryEffect()) class-attribute instance-attribute

get(inputs: Sequence[OperandArg], result_type: Sequence[Attribute]) staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def get(inputs: Sequence[OperandArg], result_type: Sequence[Attribute]):
    return UnrealizedConversionCastOp.build(
        operands=[inputs],
        result_types=[result_type],
    )

cast_one(input: SSAValue, result_type: AttributeInvT) -> tuple[UnrealizedConversionCastOp, SSAValue[AttributeInvT]] staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def cast_one(
    input: SSAValue, result_type: AttributeInvT
) -> tuple[UnrealizedConversionCastOp, SSAValue[AttributeInvT]]:
    op = UnrealizedConversionCastOp(operands=(input,), result_types=(result_type,))
    res: SSAValue[AttributeInvT] = op.results[0]  # pyright: ignore[reportAssignmentType]
    if input.name_hint is not None:
        res.name_hint = input.name_hint
    return op, res

parse(parser: Parser) -> Self classmethod

Source code in xdsl/dialects/builtin.py
@classmethod
def parse(cls, parser: Parser) -> Self:
    if parser.parse_optional_characters("to") is None:
        args = parser.parse_comma_separated_list(
            parser.Delimiter.NONE,
            parser.parse_unresolved_operand,
        )
        parser.parse_punctuation(":")
        input_types = parser.parse_comma_separated_list(
            parser.Delimiter.NONE,
            parser.parse_type,
        )
        parser.parse_characters("to")
        inputs = parser.resolve_operands(args, input_types, parser.pos)
    else:
        inputs = list[SSAValue]()
    output_types = parser.parse_comma_separated_list(
        parser.Delimiter.NONE,
        parser.parse_type,
    )
    attributes = parser.parse_optional_attr_dict()
    return cls(
        operands=[inputs], result_types=[output_types], attributes=attributes
    )

print(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print(self, printer: Printer):
    def print_fn(operand: SSAValue) -> None:
        return printer.print_attribute(operand.type)

    if self.inputs:
        printer.print_string(" ")
        printer.print_list(self.inputs, printer.print_operand)
        printer.print_string(" : ")
        printer.print_list(self.inputs, print_fn)
    printer.print_string(" to ")
    printer.print_list(self.outputs, print_fn)
    printer.print_op_attributes(self.attributes)

UnregisteredOp dataclass

Bases: Operation, ABC

An unregistered operation.

Each unregistered op is registered as a subclass of UnregisteredOp, and op with different names have distinct subclasses.

Source code in xdsl/dialects/builtin.py
class UnregisteredOp(Operation, ABC):
    """
    An unregistered operation.

    Each unregistered op is registered as a subclass of `UnregisteredOp`,
    and op with different names have distinct subclasses.
    """

    name = "builtin.unregistered"
    traits = traits_def()

    @property
    def op_name(self) -> StringAttr:
        if "op_name__" not in self.attributes:
            raise ValueError("missing 'op_name__' attribute")
        op_name = self.attributes["op_name__"]
        if not isinstance(op_name, StringAttr):
            raise ValueError(
                f"'op_name__' is expected to have 'StringAttr' type, got {op_name}"
            )
        return op_name

    @classmethod
    def with_name(cls, name: str) -> type[Operation]:
        """
        Return a new unregistered operation type given a name.
        This function should not be called directly. Use methods from
        `Context` to get an `UnregisteredOp` type.
        """

        class UnregisteredOpWithNameOp(UnregisteredOp):
            @classmethod
            def create(
                cls,
                *,
                operands: Sequence[SSAValue] = (),
                result_types: Sequence[Attribute] = (),
                properties: Mapping[str, Attribute] = {},
                attributes: Mapping[str, Attribute] = {},
                location: LocationAttr | None = None,
                successors: Sequence[Block] = (),
                regions: Sequence[Region] = (),
            ):
                op = super().create(
                    operands=operands,
                    result_types=result_types,
                    properties=properties,
                    attributes=attributes,
                    location=location,
                    successors=successors,
                    regions=regions,
                )
                op.attributes["op_name__"] = StringAttr(name)
                return op

        return UnregisteredOpWithNameOp

    @classmethod
    def has_trait(
        cls,
        trait: type[OpTrait] | OpTrait,
        *,
        value_if_unregistered: bool = True,
    ) -> bool:
        return value_if_unregistered

name = 'builtin.unregistered' class-attribute instance-attribute

traits = traits_def() class-attribute instance-attribute

op_name: StringAttr property

with_name(name: str) -> type[Operation] classmethod

Return a new unregistered operation type given a name. This function should not be called directly. Use methods from Context to get an UnregisteredOp type.

Source code in xdsl/dialects/builtin.py
@classmethod
def with_name(cls, name: str) -> type[Operation]:
    """
    Return a new unregistered operation type given a name.
    This function should not be called directly. Use methods from
    `Context` to get an `UnregisteredOp` type.
    """

    class UnregisteredOpWithNameOp(UnregisteredOp):
        @classmethod
        def create(
            cls,
            *,
            operands: Sequence[SSAValue] = (),
            result_types: Sequence[Attribute] = (),
            properties: Mapping[str, Attribute] = {},
            attributes: Mapping[str, Attribute] = {},
            location: LocationAttr | None = None,
            successors: Sequence[Block] = (),
            regions: Sequence[Region] = (),
        ):
            op = super().create(
                operands=operands,
                result_types=result_types,
                properties=properties,
                attributes=attributes,
                location=location,
                successors=successors,
                regions=regions,
            )
            op.attributes["op_name__"] = StringAttr(name)
            return op

    return UnregisteredOpWithNameOp

has_trait(trait: type[OpTrait] | OpTrait, *, value_if_unregistered: bool = True) -> bool classmethod

Source code in xdsl/dialects/builtin.py
@classmethod
def has_trait(
    cls,
    trait: type[OpTrait] | OpTrait,
    *,
    value_if_unregistered: bool = True,
) -> bool:
    return value_if_unregistered

UnregisteredAttr dataclass

Bases: ParametrizedAttribute, BuiltinAttribute, ABC

An unregistered attribute or type.

Each unregistered attribute is registered as a subclass of UnregisteredAttr, and attribute with different names have distinct subclasses.

Since attributes do not have a generic format, unregistered attributes represent their original parameters as a string, which is exactly the content parsed from the textual representation.

Source code in xdsl/dialects/builtin.py
@dataclass(frozen=True, init=False)
class UnregisteredAttr(ParametrizedAttribute, BuiltinAttribute, ABC):
    """
    An unregistered attribute or type.

    Each unregistered attribute is registered as a subclass of
    `UnregisteredAttr`, and attribute with different names have
    distinct subclasses.

    Since attributes do not have a generic format, unregistered
    attributes represent their original parameters as a string,
    which is exactly the content parsed from the textual
    representation.
    """

    name = "builtin.unregistered"

    attr_name: StringAttr
    is_type: IntAttr
    is_opaque: IntAttr
    value: StringAttr
    """
    This parameter is non-null is the attribute is a type, and null otherwise.
    """

    def __init__(
        self,
        attr_name: str | StringAttr,
        is_type: bool | IntAttr,
        is_opaque: bool | IntAttr,
        value: str | StringAttr,
    ):
        if isinstance(attr_name, str):
            attr_name = StringAttr(attr_name)
        if isinstance(is_type, bool):
            is_type = IntAttr(int(is_type))
        if isinstance(is_opaque, bool):
            is_opaque = IntAttr(int(is_opaque))
        if isinstance(value, str):
            value = StringAttr(value)
        super().__init__(attr_name, is_type, is_opaque, value)

    def print_builtin(self, printer: Printer):
        # Do not print `!` or `#` for unregistered builtin attributes
        printer.print_string("!" if self.is_type.data else "#")
        if self.is_opaque.data:
            printer.print_string(
                f"{self.attr_name.data.replace('.', '<', 1)}{self.value.data}>"
            )
        else:
            printer.print_string(self.attr_name.data)
            if self.value.data:
                printer.print_string(f"<{self.value.data}>")

    @classmethod
    def with_name_and_type(cls, name: str, is_type: bool) -> type[UnregisteredAttr]:
        """
        Return a new unregistered attribute type given a name and a
        boolean indicating if the attribute can be a type.
        This function should not be called directly. Use methods from
        `Context` to get an `UnregisteredAttr` type.
        """

        @irdl_attr_definition(init=False)
        class UnregisteredAttrWithName(UnregisteredAttr):
            def verify(self):
                if self.attr_name.data != name:
                    raise VerifyException("Unregistered attribute name mismatch")
                if self.is_type.data != int(is_type):
                    raise VerifyException("Unregistered attribute is_type mismatch")

        @irdl_attr_definition(init=False)
        class UnregisteredAttrTypeWithName(UnregisteredAttr, TypeAttribute):
            def verify(self):
                if self.attr_name.data != name:
                    raise VerifyException("Unregistered attribute name mismatch")
                if self.is_type.data != int(is_type):
                    raise VerifyException("Unregistered attribute is_type mismatch")

        if is_type:
            return UnregisteredAttrTypeWithName
        else:
            return UnregisteredAttrWithName

name = 'builtin.unregistered' class-attribute instance-attribute

attr_name: StringAttr instance-attribute

is_type: IntAttr instance-attribute

is_opaque: IntAttr instance-attribute

value: StringAttr instance-attribute

This parameter is non-null is the attribute is a type, and null otherwise.

__init__(attr_name: str | StringAttr, is_type: bool | IntAttr, is_opaque: bool | IntAttr, value: str | StringAttr)

Source code in xdsl/dialects/builtin.py
def __init__(
    self,
    attr_name: str | StringAttr,
    is_type: bool | IntAttr,
    is_opaque: bool | IntAttr,
    value: str | StringAttr,
):
    if isinstance(attr_name, str):
        attr_name = StringAttr(attr_name)
    if isinstance(is_type, bool):
        is_type = IntAttr(int(is_type))
    if isinstance(is_opaque, bool):
        is_opaque = IntAttr(int(is_opaque))
    if isinstance(value, str):
        value = StringAttr(value)
    super().__init__(attr_name, is_type, is_opaque, value)

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    # Do not print `!` or `#` for unregistered builtin attributes
    printer.print_string("!" if self.is_type.data else "#")
    if self.is_opaque.data:
        printer.print_string(
            f"{self.attr_name.data.replace('.', '<', 1)}{self.value.data}>"
        )
    else:
        printer.print_string(self.attr_name.data)
        if self.value.data:
            printer.print_string(f"<{self.value.data}>")

with_name_and_type(name: str, is_type: bool) -> type[UnregisteredAttr] classmethod

Return a new unregistered attribute type given a name and a boolean indicating if the attribute can be a type. This function should not be called directly. Use methods from Context to get an UnregisteredAttr type.

Source code in xdsl/dialects/builtin.py
@classmethod
def with_name_and_type(cls, name: str, is_type: bool) -> type[UnregisteredAttr]:
    """
    Return a new unregistered attribute type given a name and a
    boolean indicating if the attribute can be a type.
    This function should not be called directly. Use methods from
    `Context` to get an `UnregisteredAttr` type.
    """

    @irdl_attr_definition(init=False)
    class UnregisteredAttrWithName(UnregisteredAttr):
        def verify(self):
            if self.attr_name.data != name:
                raise VerifyException("Unregistered attribute name mismatch")
            if self.is_type.data != int(is_type):
                raise VerifyException("Unregistered attribute is_type mismatch")

    @irdl_attr_definition(init=False)
    class UnregisteredAttrTypeWithName(UnregisteredAttr, TypeAttribute):
        def verify(self):
            if self.attr_name.data != name:
                raise VerifyException("Unregistered attribute name mismatch")
            if self.is_type.data != int(is_type):
                raise VerifyException("Unregistered attribute is_type mismatch")

    if is_type:
        return UnregisteredAttrTypeWithName
    else:
        return UnregisteredAttrWithName

ModuleOp

Bases: IRDLOperation

Source code in xdsl/dialects/builtin.py
@irdl_op_definition
class ModuleOp(IRDLOperation):
    name = "builtin.module"

    sym_name = opt_prop_def(StringAttr)

    body = region_def("single_block")

    traits = traits_def(
        IsolatedFromAbove(),
        NoTerminator(),
        OptionalSymbolOpInterface(),
        SymbolTable(),
    )

    def __init__(
        self,
        ops: Iterable[Operation] | Region,
        attributes: Mapping[str, Attribute] | None = None,
        sym_name: StringAttr | None = None,
    ):
        if attributes is None:
            attributes = {}
        if isinstance(ops, Region):
            region = ops
        else:
            region = Region(Block(ops))
        properties: dict[str, Attribute | None] = {"sym_name": sym_name}
        super().__init__(regions=[region], attributes=attributes, properties=properties)

    @property
    def ops(self) -> BlockOps:
        return self.body.ops

    @classmethod
    def parse(cls, parser: Parser) -> ModuleOp:
        module_name = parser.parse_optional_symbol_name()

        attributes = parser.parse_optional_attr_dict_with_keyword()
        if attributes is not None:
            attributes = attributes.data
        region = parser.parse_region()

        # Add a block if the region is empty
        if not region.blocks:
            region.add_block(Block())

        return ModuleOp(region, attributes, module_name)

    def print(self, printer: Printer) -> None:
        if self.sym_name is not None:
            printer.print_string(" ")
            printer.print_symbol_name(self.sym_name)

        if self.attributes:
            printer.print_op_attributes(self.attributes, print_keyword=True)

        if not self.body.block.ops:
            # Do not print the entry block if the region has an empty block
            printer.print_string(" {\n")
            printer.print_string("}")
        else:
            printer.print_string(" ")
            printer.print_region(self.body)

name = 'builtin.module' class-attribute instance-attribute

sym_name = opt_prop_def(StringAttr) class-attribute instance-attribute

body = region_def('single_block') class-attribute instance-attribute

traits = traits_def(IsolatedFromAbove(), NoTerminator(), OptionalSymbolOpInterface(), SymbolTable()) class-attribute instance-attribute

ops: BlockOps property

__init__(ops: Iterable[Operation] | Region, attributes: Mapping[str, Attribute] | None = None, sym_name: StringAttr | None = None)

Source code in xdsl/dialects/builtin.py
def __init__(
    self,
    ops: Iterable[Operation] | Region,
    attributes: Mapping[str, Attribute] | None = None,
    sym_name: StringAttr | None = None,
):
    if attributes is None:
        attributes = {}
    if isinstance(ops, Region):
        region = ops
    else:
        region = Region(Block(ops))
    properties: dict[str, Attribute | None] = {"sym_name": sym_name}
    super().__init__(regions=[region], attributes=attributes, properties=properties)

parse(parser: Parser) -> ModuleOp classmethod

Source code in xdsl/dialects/builtin.py
@classmethod
def parse(cls, parser: Parser) -> ModuleOp:
    module_name = parser.parse_optional_symbol_name()

    attributes = parser.parse_optional_attr_dict_with_keyword()
    if attributes is not None:
        attributes = attributes.data
    region = parser.parse_region()

    # Add a block if the region is empty
    if not region.blocks:
        region.add_block(Block())

    return ModuleOp(region, attributes, module_name)

print(printer: Printer) -> None

Source code in xdsl/dialects/builtin.py
def print(self, printer: Printer) -> None:
    if self.sym_name is not None:
        printer.print_string(" ")
        printer.print_symbol_name(self.sym_name)

    if self.attributes:
        printer.print_op_attributes(self.attributes, print_keyword=True)

    if not self.body.block.ops:
        # Do not print the entry block if the region has an empty block
        printer.print_string(" {\n")
        printer.print_string("}")
    else:
        printer.print_string(" ")
        printer.print_region(self.body)

NoneType dataclass

Bases: ParametrizedAttribute, BuiltinAttribute, TypeAttribute

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class NoneType(ParametrizedAttribute, BuiltinAttribute, TypeAttribute):
    name = "none_type"

    def print_builtin(self, printer: Printer):
        printer.print_string("none")

name = 'none_type' class-attribute instance-attribute

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_string("none")

MemRefType

Bases: ParametrizedAttribute, BuiltinAttribute, TypeAttribute, ShapedType, ContainerType[AttributeCovT], Generic[AttributeCovT]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class MemRefType(
    ParametrizedAttribute,
    BuiltinAttribute,
    TypeAttribute,
    ShapedType,
    ContainerType[AttributeCovT],
    Generic[AttributeCovT],
):
    name = "memref"

    shape: ArrayAttr[IntAttr]
    element_type: AttributeCovT
    layout: MemRefLayoutAttr | NoneAttr
    memory_space: Attribute

    def __init__(
        self,
        element_type: AttributeCovT,
        shape: ArrayAttr[IntAttr] | Iterable[int | IntAttr],
        layout: MemRefLayoutAttr | NoneAttr = NoneAttr(),
        memory_space: Attribute = NoneAttr(),
    ):
        if not isa(shape, ArrayAttr[IntAttr]):
            shape = ArrayAttr(
                [IntAttr(dim) if isinstance(dim, int) else dim for dim in shape]
            )
        super().__init__(
            shape,
            element_type,
            layout,
            memory_space,
        )

    def get_num_dims(self) -> int:
        return len(self.shape.data)

    def get_shape(self) -> tuple[int, ...]:
        return tuple(i.data for i in self.shape.data)

    def get_element_type(self) -> AttributeCovT:
        return self.element_type

    @classmethod
    def parse_parameters(cls, parser: AttrParser) -> list[Attribute]:
        parser.parse_punctuation("<", " in memref attribute")
        shape = parser.parse_attribute()
        parser.parse_punctuation(",", " between shape and element type parameters")
        type = parser.parse_attribute()
        # If we have a layout or a memory space, parse both of them.
        if parser.parse_optional_punctuation(",") is None:
            parser.parse_punctuation(">", " at end of memref attribute")
            return [shape, type, NoneAttr(), NoneAttr()]
        layout = parser.parse_attribute()
        parser.parse_punctuation(",", " between layout and memory space")
        memory_space = parser.parse_attribute()
        parser.parse_punctuation(">", " at end of memref attribute")

        return [shape, type, layout, memory_space]

    def print_parameters(self, printer: Printer) -> None:
        with printer.in_angle_brackets():
            printer.print_attribute(self.shape)
            printer.print_string(", ")
            printer.print_attribute(self.element_type)
            if self.layout != NoneAttr() or self.memory_space != NoneAttr():
                printer.print_string(", ")
                printer.print_attribute(self.layout)
                printer.print_string(", ")
                printer.print_attribute(self.memory_space)

    def print_builtin(self, printer: Printer):
        printer.print_string("memref")
        with printer.in_angle_brackets():
            if self.shape.data:
                printer.print_dimension_list(self.get_shape())
                printer.print_string("x")
            printer.print_attribute(self.element_type)
            if not isinstance(self.layout, NoneAttr):
                printer.print_string(", ")
                printer.print_attribute(self.layout)
            if not isinstance(self.memory_space, NoneAttr):
                printer.print_string(", ")
                printer.print_attribute(self.memory_space)

    def get_affine_map(self) -> AffineMap:
        """
        Return the affine mapping from the iteration space of this
        memref's layout to the element offset in linear memory.
        """
        if isinstance(self.layout, NoneAttr):
            # empty shape not supported
            if self.get_shape() == ():
                raise DiagnosticException(
                    f"Unsupported empty shape in memref of type {self}"
                )

            strides = self.strides_for_shape(self.get_shape())
            map = StridedLayoutAttr(strides).get_affine_map()
        else:
            map = self.layout.get_affine_map()

        return map

    def get_affine_map_in_bytes(self) -> AffineMap:
        """
        Return the affine mapping from the iteration space of this
        memref's layout to the byte offset in linear memory.

        Unlike the get_affine_map, this function accounts for element width.
        """

        map = self.get_affine_map()

        # account for element width
        assert isinstance(self.element_type, FixedBitwidthType)

        return AffineMap(
            map.num_dims,
            map.num_symbols,
            tuple(result * self.element_type.size for result in map.results),
        )

    def get_strides(self) -> Sequence[int | None] | None:
        """
        Yields the strides of the memref for each dimension.
        The stride of a dimension is the number of elements that are skipped when
        incrementing the corresponding index by one.
        """
        match self.layout:
            case NoneAttr():
                return ShapedType.strides_for_shape(self.get_shape())
            case _:
                return self.layout.get_strides()

    def get_offset(self) -> int | None:
        """
        Return the static offset of the memref layout.

        Returns `0` for the default layout, and `None` when the offset is dynamic or
        when the layout does not expose a strided offset.
        """
        match self.layout:
            case NoneAttr():
                return 0
            case _:
                return self.layout.get_offset()

    @staticmethod
    def constr(
        element_type: IRDLAttrConstraint[AttributeCovT] = AnyAttr(),
        *,
        shape: IRDLAttrConstraint | None = None,
        layout: IRDLAttrConstraint | None = None,
        memory_space: IRDLAttrConstraint | None = None,
    ) -> AttrConstraint[MemRefType[AttributeCovT]]:
        return cast(
            AttrConstraint[MemRefType[AttributeCovT]],
            ParamAttrConstraint.get(
                MemRefType, shape, element_type, layout, memory_space
            ),
        )

name = 'memref' class-attribute instance-attribute

shape: ArrayAttr[IntAttr] instance-attribute

element_type: AttributeCovT instance-attribute

layout: MemRefLayoutAttr | NoneAttr instance-attribute

memory_space: Attribute instance-attribute

__init__(element_type: AttributeCovT, shape: ArrayAttr[IntAttr] | Iterable[int | IntAttr], layout: MemRefLayoutAttr | NoneAttr = NoneAttr(), memory_space: Attribute = NoneAttr())

Source code in xdsl/dialects/builtin.py
def __init__(
    self,
    element_type: AttributeCovT,
    shape: ArrayAttr[IntAttr] | Iterable[int | IntAttr],
    layout: MemRefLayoutAttr | NoneAttr = NoneAttr(),
    memory_space: Attribute = NoneAttr(),
):
    if not isa(shape, ArrayAttr[IntAttr]):
        shape = ArrayAttr(
            [IntAttr(dim) if isinstance(dim, int) else dim for dim in shape]
        )
    super().__init__(
        shape,
        element_type,
        layout,
        memory_space,
    )

get_num_dims() -> int

Source code in xdsl/dialects/builtin.py
def get_num_dims(self) -> int:
    return len(self.shape.data)

get_shape() -> tuple[int, ...]

Source code in xdsl/dialects/builtin.py
def get_shape(self) -> tuple[int, ...]:
    return tuple(i.data for i in self.shape.data)

get_element_type() -> AttributeCovT

Source code in xdsl/dialects/builtin.py
def get_element_type(self) -> AttributeCovT:
    return self.element_type

parse_parameters(parser: AttrParser) -> list[Attribute] classmethod

Source code in xdsl/dialects/builtin.py
@classmethod
def parse_parameters(cls, parser: AttrParser) -> list[Attribute]:
    parser.parse_punctuation("<", " in memref attribute")
    shape = parser.parse_attribute()
    parser.parse_punctuation(",", " between shape and element type parameters")
    type = parser.parse_attribute()
    # If we have a layout or a memory space, parse both of them.
    if parser.parse_optional_punctuation(",") is None:
        parser.parse_punctuation(">", " at end of memref attribute")
        return [shape, type, NoneAttr(), NoneAttr()]
    layout = parser.parse_attribute()
    parser.parse_punctuation(",", " between layout and memory space")
    memory_space = parser.parse_attribute()
    parser.parse_punctuation(">", " at end of memref attribute")

    return [shape, type, layout, memory_space]

print_parameters(printer: Printer) -> None

Source code in xdsl/dialects/builtin.py
def print_parameters(self, printer: Printer) -> None:
    with printer.in_angle_brackets():
        printer.print_attribute(self.shape)
        printer.print_string(", ")
        printer.print_attribute(self.element_type)
        if self.layout != NoneAttr() or self.memory_space != NoneAttr():
            printer.print_string(", ")
            printer.print_attribute(self.layout)
            printer.print_string(", ")
            printer.print_attribute(self.memory_space)

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_string("memref")
    with printer.in_angle_brackets():
        if self.shape.data:
            printer.print_dimension_list(self.get_shape())
            printer.print_string("x")
        printer.print_attribute(self.element_type)
        if not isinstance(self.layout, NoneAttr):
            printer.print_string(", ")
            printer.print_attribute(self.layout)
        if not isinstance(self.memory_space, NoneAttr):
            printer.print_string(", ")
            printer.print_attribute(self.memory_space)

get_affine_map() -> AffineMap

Return the affine mapping from the iteration space of this memref's layout to the element offset in linear memory.

Source code in xdsl/dialects/builtin.py
def get_affine_map(self) -> AffineMap:
    """
    Return the affine mapping from the iteration space of this
    memref's layout to the element offset in linear memory.
    """
    if isinstance(self.layout, NoneAttr):
        # empty shape not supported
        if self.get_shape() == ():
            raise DiagnosticException(
                f"Unsupported empty shape in memref of type {self}"
            )

        strides = self.strides_for_shape(self.get_shape())
        map = StridedLayoutAttr(strides).get_affine_map()
    else:
        map = self.layout.get_affine_map()

    return map

get_affine_map_in_bytes() -> AffineMap

Return the affine mapping from the iteration space of this memref's layout to the byte offset in linear memory.

Unlike the get_affine_map, this function accounts for element width.

Source code in xdsl/dialects/builtin.py
def get_affine_map_in_bytes(self) -> AffineMap:
    """
    Return the affine mapping from the iteration space of this
    memref's layout to the byte offset in linear memory.

    Unlike the get_affine_map, this function accounts for element width.
    """

    map = self.get_affine_map()

    # account for element width
    assert isinstance(self.element_type, FixedBitwidthType)

    return AffineMap(
        map.num_dims,
        map.num_symbols,
        tuple(result * self.element_type.size for result in map.results),
    )

get_strides() -> Sequence[int | None] | None

Yields the strides of the memref for each dimension. The stride of a dimension is the number of elements that are skipped when incrementing the corresponding index by one.

Source code in xdsl/dialects/builtin.py
def get_strides(self) -> Sequence[int | None] | None:
    """
    Yields the strides of the memref for each dimension.
    The stride of a dimension is the number of elements that are skipped when
    incrementing the corresponding index by one.
    """
    match self.layout:
        case NoneAttr():
            return ShapedType.strides_for_shape(self.get_shape())
        case _:
            return self.layout.get_strides()

get_offset() -> int | None

Return the static offset of the memref layout.

Returns 0 for the default layout, and None when the offset is dynamic or when the layout does not expose a strided offset.

Source code in xdsl/dialects/builtin.py
def get_offset(self) -> int | None:
    """
    Return the static offset of the memref layout.

    Returns `0` for the default layout, and `None` when the offset is dynamic or
    when the layout does not expose a strided offset.
    """
    match self.layout:
        case NoneAttr():
            return 0
        case _:
            return self.layout.get_offset()

constr(element_type: IRDLAttrConstraint[AttributeCovT] = AnyAttr(), *, shape: IRDLAttrConstraint | None = None, layout: IRDLAttrConstraint | None = None, memory_space: IRDLAttrConstraint | None = None) -> AttrConstraint[MemRefType[AttributeCovT]] staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def constr(
    element_type: IRDLAttrConstraint[AttributeCovT] = AnyAttr(),
    *,
    shape: IRDLAttrConstraint | None = None,
    layout: IRDLAttrConstraint | None = None,
    memory_space: IRDLAttrConstraint | None = None,
) -> AttrConstraint[MemRefType[AttributeCovT]]:
    return cast(
        AttrConstraint[MemRefType[AttributeCovT]],
        ParamAttrConstraint.get(
            MemRefType, shape, element_type, layout, memory_space
        ),
    )

UnrankedMemRefType dataclass

Bases: ParametrizedAttribute, BuiltinAttribute, TypeAttribute, ContainerType[AttributeCovT], Generic[AttributeCovT]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class UnrankedMemRefType(
    ParametrizedAttribute,
    BuiltinAttribute,
    TypeAttribute,
    ContainerType[AttributeCovT],
    Generic[AttributeCovT],
):
    name = "unranked_memref"

    element_type: AttributeCovT
    memory_space: Attribute

    def print_builtin(self, printer: Printer):
        printer.print_string("memref<*x")
        printer.print_attribute(self.element_type)
        if not isinstance(self.memory_space, NoneAttr):
            printer.print_string(", ")
            printer.print_attribute(self.memory_space)
        printer.print_string(">")

    @staticmethod
    def from_type(
        referenced_type: AttributeInvT,
        memory_space: Attribute = NoneAttr(),
    ) -> UnrankedMemRefType[AttributeInvT]:
        return UnrankedMemRefType(referenced_type, memory_space)

    def get_element_type(self) -> AttributeCovT:
        return self.element_type

name = 'unranked_memref' class-attribute instance-attribute

element_type: AttributeCovT instance-attribute

memory_space: Attribute instance-attribute

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    printer.print_string("memref<*x")
    printer.print_attribute(self.element_type)
    if not isinstance(self.memory_space, NoneAttr):
        printer.print_string(", ")
        printer.print_attribute(self.memory_space)
    printer.print_string(">")

from_type(referenced_type: AttributeInvT, memory_space: Attribute = NoneAttr()) -> UnrankedMemRefType[AttributeInvT] staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def from_type(
    referenced_type: AttributeInvT,
    memory_space: Attribute = NoneAttr(),
) -> UnrankedMemRefType[AttributeInvT]:
    return UnrankedMemRefType(referenced_type, memory_space)

get_element_type() -> AttributeCovT

Source code in xdsl/dialects/builtin.py
def get_element_type(self) -> AttributeCovT:
    return self.element_type

DenseIntOrFPElementsAttr dataclass

Bases: TypedAttribute, BuiltinAttribute, ContainerType[_DenseElementCovT], Generic[_DenseElementCovT]

Source code in xdsl/dialects/builtin.py
@irdl_attr_definition
class DenseIntOrFPElementsAttr(
    TypedAttribute,
    BuiltinAttribute,
    ContainerType[_DenseElementCovT],
    Generic[_DenseElementCovT],
):
    name = "dense"
    type: RankedStructure[_DenseElementCovT]
    data: BytesAttr

    # The type stores the shape data
    def get_shape(self) -> tuple[int, ...]:
        return self.type.get_shape()

    def get_element_type(self) -> _DenseElementCovT:
        return self.type.get_element_type()

    def __len__(self) -> int:
        return len(self.data.data) // self.type.element_type.compile_time_size

    @property
    def shape_is_complete(self) -> bool:
        shape = self.get_shape()

        n = 1
        for dim in shape:
            if dim < 1:
                # Dimensions need to be greater or equal to one
                return False
            n *= dim

        # Product of dimensions needs to equal length
        return n == len(self)

    def verify(self) -> None:
        # zero rank type should only hold 1 value
        data_len = len(self)
        if not self.type.get_shape() and data_len != 1:
            raise VerifyException(
                f"A zero-rank {self.type.name} can only hold 1 value but {data_len} were given."
            )

    @overload
    @staticmethod
    def from_list(
        type: RankedStructure[_FloatAttrTypeInvT],
        data: Sequence[float],
    ) -> DenseIntOrFPElementsAttr[_FloatAttrTypeInvT]: ...

    @overload
    @staticmethod
    def from_list(
        type: RankedStructure[_IntegerAttrTypeInvT],
        data: Sequence[int],
    ) -> DenseIntOrFPElementsAttr[_IntegerAttrTypeInvT]: ...

    @overload
    @staticmethod
    def from_list(
        type: RankedStructure[ComplexType[_IntegerTypeInvT]],
        data: Sequence[tuple[int, int]],
    ) -> DenseIntOrFPElementsAttr[ComplexType[_IntegerTypeInvT]]: ...

    @overload
    @staticmethod
    def from_list(
        type: RankedStructure[ComplexType[_FloatAttrTypeInvT]],
        data: Sequence[tuple[float, float]],
    ) -> DenseIntOrFPElementsAttr[ComplexType[_FloatAttrTypeInvT]]: ...

    @staticmethod
    def from_list(
        type: (
            RankedStructure[
                AnyFloat
                | IntegerType
                | IndexType
                | ComplexType[IntegerType]
                | ComplexType[AnyFloat]
            ]
        ),
        data: Sequence[int]
        | Sequence[float]
        | Sequence[tuple[int, int]]
        | Sequence[tuple[float, float]],
    ) -> DenseIntOrFPElementsAttr:
        # Normalise ints
        if isinstance(t := type.get_element_type(), IntegerType):
            data = tuple(t.get_normalized_value(x) for x in data)  # pyright: ignore[reportArgumentType]

        b = type.element_type.pack(data)  # pyright: ignore[reportArgumentType]

        # Splat case
        if len(data) == 1 and (p := prod(type.get_shape())) != 1:
            b *= p

        return DenseIntOrFPElementsAttr(type, BytesAttr(b))

    def iter_values(
        self,
    ) -> (
        Iterator[int]
        | Iterator[float]
        | Iterator[tuple[int, int]]
        | Iterator[tuple[float, float]]
    ):
        """
        Return an iterator over all the values of the elements in this DenseIntOrFPElementsAttr
        """
        return self.get_element_type().iter_unpack(self.data.data)

    @overload
    def get_values(
        self: DenseIntOrFPElementsAttr[IntegerType | IndexType],
    ) -> tuple[int, ...]: ...

    @overload
    def get_values(self: DenseIntOrFPElementsAttr[AnyFloat]) -> tuple[float, ...]: ...

    @overload
    def get_values(
        self: DenseIntOrFPElementsAttr[ComplexType[IntegerType]],
    ) -> tuple[tuple[int, int], ...]: ...

    @overload
    def get_values(
        self: DenseIntOrFPElementsAttr[ComplexType[AnyFloat]],
    ) -> tuple[tuple[float, float], ...]: ...

    @overload
    def get_values(
        self,
    ) -> (
        tuple[int, ...]
        | tuple[float, ...]
        | tuple[tuple[int, int], ...]
        | tuple[tuple[float, float], ...]
    ): ...

    def get_values(
        self,
    ) -> (
        tuple[int, ...]
        | tuple[float, ...]
        | tuple[tuple[int, int], ...]
        | tuple[tuple[float, float], ...]
    ):
        """
        Return all the values of the elements in this DenseIntOrFPElementsAttr
        """
        return self.get_element_type().unpack(self.data.data, len(self))

    def iter_attrs(self) -> Iterator[IntegerAttr] | Iterator[FloatAttr]:
        """
        Return an iterator over all elements of the dense attribute in their relevant
        attribute representation (IntegerAttr / FloatAttr)
        """
        if isinstance(eltype := self.get_element_type(), IntegerType | IndexType):
            return IntegerAttr.iter_unpack(eltype, self.data.data)
        elif isinstance(eltype, AnyFloat):
            return FloatAttr.iter_unpack(eltype, self.data.data)
        raise NotImplementedError()

    def get_attrs(self) -> Sequence[IntegerAttr] | Sequence[FloatAttr]:
        """
        Return all elements of the dense attribute in their relevant
        attribute representation (IntegerAttr / FloatAttr)
        """
        if isinstance(eltype := self.get_element_type(), IntegerType | IndexType):
            return IntegerAttr.unpack(eltype, self.data.data, len(self))
        elif isinstance(eltype, AnyFloat):
            return FloatAttr.unpack(eltype, self.data.data, len(self))
        raise NotImplementedError()

    def is_splat(self) -> bool:
        """
        Return whether or not this dense attribute is defined entirely
        by a single value (splat).
        """
        values = self.get_values()
        return values.count(values[0]) == len(values)

    @staticmethod
    def parse_with_type(parser: AttrParser, type: Attribute) -> TypedAttribute:
        assert isa(type, RankedStructure[AnyDenseElement])
        return parser.parse_dense_int_or_fp_elements_attr(type)

    def _print_one_elem(
        self, val: float | tuple[int, int] | tuple[float, float], printer: Printer
    ):
        if isinstance(val, int):
            element_type = self.get_element_type()
            assert isinstance(element_type, IntegerType | IndexType)
            printer.print_int(val, element_type)
        elif isinstance(val, float):
            element_type = self.get_element_type()
            assert isinstance(element_type, AnyFloat)
            printer.print_float(val, element_type)
        else:  # complex
            element_type = self.get_element_type()
            assert isinstance(element_type, ComplexType)
            printer.print_complex(val, element_type)

    def _print_dense_list(
        self,
        array: Sequence[int]
        | Sequence[float]
        | Sequence[tuple[int, int]]
        | Sequence[tuple[float, float]],
        shape: Sequence[int],
        printer: Printer,
    ):
        printer.print_string("[")
        if len(shape) > 1:
            k = len(array) // shape[0]
            printer.print_list(
                (array[i : i + k] for i in range(0, len(array), k)),
                lambda subarray: self._print_dense_list(subarray, shape[1:], printer),
            )
        else:
            printer.print_list(
                array,
                lambda val: self._print_one_elem(val, printer),
            )
        printer.print_string("]")

    def print_without_type(self, printer: Printer):
        printer.print_string("dense")
        length = len(self)
        data = self.get_values()
        shape = self.get_shape() if self.shape_is_complete else (length,)
        assert shape is not None, "If shape is complete, then it cannot be None"
        with printer.in_angle_brackets():
            if length == 0:
                pass
            elif self.is_splat():
                self._print_one_elem(data[0], printer)
            elif length > 100:
                printer.print_string(f'"0x{self.data.data.hex().upper()}"')
            else:
                self._print_dense_list(data, shape, printer)

    def print_builtin(self, printer: Printer):
        self.print_without_type(printer)
        printer.print_string(" : ")
        printer.print_attribute(self.get_type())

name = 'dense' class-attribute instance-attribute

type: RankedStructure[_DenseElementCovT] instance-attribute

data: BytesAttr instance-attribute

shape_is_complete: bool property

get_shape() -> tuple[int, ...]

Source code in xdsl/dialects/builtin.py
def get_shape(self) -> tuple[int, ...]:
    return self.type.get_shape()

get_element_type() -> _DenseElementCovT

Source code in xdsl/dialects/builtin.py
def get_element_type(self) -> _DenseElementCovT:
    return self.type.get_element_type()

__len__() -> int

Source code in xdsl/dialects/builtin.py
def __len__(self) -> int:
    return len(self.data.data) // self.type.element_type.compile_time_size

verify() -> None

Source code in xdsl/dialects/builtin.py
def verify(self) -> None:
    # zero rank type should only hold 1 value
    data_len = len(self)
    if not self.type.get_shape() and data_len != 1:
        raise VerifyException(
            f"A zero-rank {self.type.name} can only hold 1 value but {data_len} were given."
        )

from_list(type: RankedStructure[AnyFloat | IntegerType | IndexType | ComplexType[IntegerType] | ComplexType[AnyFloat]], data: Sequence[int] | Sequence[float] | Sequence[tuple[int, int]] | Sequence[tuple[float, float]]) -> DenseIntOrFPElementsAttr staticmethod

from_list(
    type: RankedStructure[_FloatAttrTypeInvT],
    data: Sequence[float],
) -> DenseIntOrFPElementsAttr[_FloatAttrTypeInvT]
from_list(
    type: RankedStructure[_IntegerAttrTypeInvT],
    data: Sequence[int],
) -> DenseIntOrFPElementsAttr[_IntegerAttrTypeInvT]
from_list(
    type: RankedStructure[ComplexType[_IntegerTypeInvT]],
    data: Sequence[tuple[int, int]],
) -> DenseIntOrFPElementsAttr[
    ComplexType[_IntegerTypeInvT]
]
from_list(
    type: RankedStructure[ComplexType[_FloatAttrTypeInvT]],
    data: Sequence[tuple[float, float]],
) -> DenseIntOrFPElementsAttr[
    ComplexType[_FloatAttrTypeInvT]
]
Source code in xdsl/dialects/builtin.py
@staticmethod
def from_list(
    type: (
        RankedStructure[
            AnyFloat
            | IntegerType
            | IndexType
            | ComplexType[IntegerType]
            | ComplexType[AnyFloat]
        ]
    ),
    data: Sequence[int]
    | Sequence[float]
    | Sequence[tuple[int, int]]
    | Sequence[tuple[float, float]],
) -> DenseIntOrFPElementsAttr:
    # Normalise ints
    if isinstance(t := type.get_element_type(), IntegerType):
        data = tuple(t.get_normalized_value(x) for x in data)  # pyright: ignore[reportArgumentType]

    b = type.element_type.pack(data)  # pyright: ignore[reportArgumentType]

    # Splat case
    if len(data) == 1 and (p := prod(type.get_shape())) != 1:
        b *= p

    return DenseIntOrFPElementsAttr(type, BytesAttr(b))

iter_values() -> Iterator[int] | Iterator[float] | Iterator[tuple[int, int]] | Iterator[tuple[float, float]]

Return an iterator over all the values of the elements in this DenseIntOrFPElementsAttr

Source code in xdsl/dialects/builtin.py
def iter_values(
    self,
) -> (
    Iterator[int]
    | Iterator[float]
    | Iterator[tuple[int, int]]
    | Iterator[tuple[float, float]]
):
    """
    Return an iterator over all the values of the elements in this DenseIntOrFPElementsAttr
    """
    return self.get_element_type().iter_unpack(self.data.data)

get_values() -> tuple[int, ...] | tuple[float, ...] | tuple[tuple[int, int], ...] | tuple[tuple[float, float], ...]

get_values() -> tuple[int, ...]
get_values() -> tuple[float, ...]
get_values() -> tuple[tuple[int, int], ...]
get_values() -> tuple[tuple[float, float], ...]
get_values() -> (
    tuple[int, ...]
    | tuple[float, ...]
    | tuple[tuple[int, int], ...]
    | tuple[tuple[float, float], ...]
)

Return all the values of the elements in this DenseIntOrFPElementsAttr

Source code in xdsl/dialects/builtin.py
def get_values(
    self,
) -> (
    tuple[int, ...]
    | tuple[float, ...]
    | tuple[tuple[int, int], ...]
    | tuple[tuple[float, float], ...]
):
    """
    Return all the values of the elements in this DenseIntOrFPElementsAttr
    """
    return self.get_element_type().unpack(self.data.data, len(self))

iter_attrs() -> Iterator[IntegerAttr] | Iterator[FloatAttr]

Return an iterator over all elements of the dense attribute in their relevant attribute representation (IntegerAttr / FloatAttr)

Source code in xdsl/dialects/builtin.py
def iter_attrs(self) -> Iterator[IntegerAttr] | Iterator[FloatAttr]:
    """
    Return an iterator over all elements of the dense attribute in their relevant
    attribute representation (IntegerAttr / FloatAttr)
    """
    if isinstance(eltype := self.get_element_type(), IntegerType | IndexType):
        return IntegerAttr.iter_unpack(eltype, self.data.data)
    elif isinstance(eltype, AnyFloat):
        return FloatAttr.iter_unpack(eltype, self.data.data)
    raise NotImplementedError()

get_attrs() -> Sequence[IntegerAttr] | Sequence[FloatAttr]

Return all elements of the dense attribute in their relevant attribute representation (IntegerAttr / FloatAttr)

Source code in xdsl/dialects/builtin.py
def get_attrs(self) -> Sequence[IntegerAttr] | Sequence[FloatAttr]:
    """
    Return all elements of the dense attribute in their relevant
    attribute representation (IntegerAttr / FloatAttr)
    """
    if isinstance(eltype := self.get_element_type(), IntegerType | IndexType):
        return IntegerAttr.unpack(eltype, self.data.data, len(self))
    elif isinstance(eltype, AnyFloat):
        return FloatAttr.unpack(eltype, self.data.data, len(self))
    raise NotImplementedError()

is_splat() -> bool

Return whether or not this dense attribute is defined entirely by a single value (splat).

Source code in xdsl/dialects/builtin.py
def is_splat(self) -> bool:
    """
    Return whether or not this dense attribute is defined entirely
    by a single value (splat).
    """
    values = self.get_values()
    return values.count(values[0]) == len(values)

parse_with_type(parser: AttrParser, type: Attribute) -> TypedAttribute staticmethod

Source code in xdsl/dialects/builtin.py
@staticmethod
def parse_with_type(parser: AttrParser, type: Attribute) -> TypedAttribute:
    assert isa(type, RankedStructure[AnyDenseElement])
    return parser.parse_dense_int_or_fp_elements_attr(type)

print_without_type(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_without_type(self, printer: Printer):
    printer.print_string("dense")
    length = len(self)
    data = self.get_values()
    shape = self.get_shape() if self.shape_is_complete else (length,)
    assert shape is not None, "If shape is complete, then it cannot be None"
    with printer.in_angle_brackets():
        if length == 0:
            pass
        elif self.is_splat():
            self._print_one_elem(data[0], printer)
        elif length > 100:
            printer.print_string(f'"0x{self.data.data.hex().upper()}"')
        else:
            self._print_dense_list(data, shape, printer)

print_builtin(printer: Printer)

Source code in xdsl/dialects/builtin.py
def print_builtin(self, printer: Printer):
    self.print_without_type(printer)
    printer.print_string(" : ")
    printer.print_attribute(self.get_type())

container_of(constr: IRDLAttrConstraint[AttributeInvT]) -> AttrConstraint[AttributeInvT | VectorType[AttributeInvT] | TensorType[AttributeInvT]]

Source code in xdsl/dialects/builtin.py
def container_of(
    constr: IRDLAttrConstraint[AttributeInvT],
) -> AttrConstraint[
    AttributeInvT | VectorType[AttributeInvT] | TensorType[AttributeInvT]
]:
    return AnyOf.get(constr, VectorType.constr(constr), TensorType.constr(constr))

ContainerOf(constr: IRDLAttrConstraint[AttributeInvT])

Source code in xdsl/dialects/builtin.py
@deprecated("Please use `container_of` instead")
def ContainerOf(
    constr: IRDLAttrConstraint[AttributeInvT],
):
    container_of(constr)