Warning
This page is under construction. The content may be incomplete or incorrect. Submit an issue on GitHub if you need help or want to contribute.
Dialects for special Python functions
There are some special built-in Python functions that does not necessarily provide new data types when using them as Kirin dialects.
For example, the py.range dialect may not use a Python range type, the actual type can be decided by another dialect that implements the type inference method for Range statement, e.g ilist dialect provides an IList implementation for Range statement.
The reason for this is that in many cases, eDSLs are not interested in the actual data type of the result, but rather the semantics of the operation. For ilist dialect, the Range statement is just a syntax sugar for creating a list of integers. The compiler will decide what the actual implementation (such as the memory layout) of the list should be.
References
Iterable
kirin.dialects.py.iterable
This module provides access to Python iterables.
This is used to lower Python loops into cf dialect.
This module contains the common methods for the Python iterable:
- The
Iterstatement class. - The
Nextstatement class. - The lowering pass for the iterable.
- The concrete implementation of the iterable.
This dialect maps iter() and next() calls to the Iter and Next statements.
PyRangeIterType module-attribute
PyRangeIterType = PyClass(type(iter(range(0))))
dialect module-attribute
dialect = Dialect('py.iterable')
Concrete
Bases: MethodTable
flowchart TD
kirin.dialects.py.iterable.Concrete[Concrete]
kirin.interp.table.MethodTable[MethodTable]
kirin.interp.table.MethodTable --> kirin.dialects.py.iterable.Concrete
click kirin.dialects.py.iterable.Concrete href "" "kirin.dialects.py.iterable.Concrete"
click kirin.interp.table.MethodTable href "" "kirin.interp.table.MethodTable"
iter_
iter_(interp, frame: Frame, stmt: Iter)
Source code in src/kirin/dialects/py/iterable.py
45 46 47 | |
next_
next_(interp, frame: Frame, stmt: Next)
Source code in src/kirin/dialects/py/iterable.py
49 50 51 | |
Iter kirin-statement
Iter(value: SSAValue)
Bases: Statement
flowchart TD
kirin.dialects.py.iterable.Iter[Iter]
kirin.ir.nodes.stmt.Statement[Statement]
kirin.ir.nodes.base.IRNode[IRNode]
kirin.print.printable.Printable[Printable]
kirin.ir.nodes.stmt.Statement --> kirin.dialects.py.iterable.Iter
kirin.ir.nodes.base.IRNode --> kirin.ir.nodes.stmt.Statement
kirin.print.printable.Printable --> kirin.ir.nodes.base.IRNode
click kirin.dialects.py.iterable.Iter href "" "kirin.dialects.py.iterable.Iter"
click kirin.ir.nodes.stmt.Statement href "" "kirin.ir.nodes.stmt.Statement"
click kirin.ir.nodes.base.IRNode href "" "kirin.ir.nodes.base.IRNode"
click kirin.print.printable.Printable href "" "kirin.print.printable.Printable"
This is equivalent to iter(value) in Python.
iter kirin-result
iter: ResultValue = result(Any)
traits class-attribute instance-attribute
traits = frozenset({})
value kirin-argument
value: SSAValue = argument(Any)
Lowering dataclass
Lowering()
Bases: FromPythonAST
flowchart TD
kirin.dialects.py.iterable.Lowering[Lowering]
kirin.lowering.python.dialect.FromPythonAST[FromPythonAST]
kirin.lowering.python.dialect.FromPythonAST --> kirin.dialects.py.iterable.Lowering
click kirin.dialects.py.iterable.Lowering href "" "kirin.dialects.py.iterable.Lowering"
click kirin.lowering.python.dialect.FromPythonAST href "" "kirin.lowering.python.dialect.FromPythonAST"
lower_Call_iter
lower_Call_iter(
state: State, node: Call
) -> lowering.Result
Source code in src/kirin/dialects/py/iterable.py
69 70 71 72 73 74 75 | |
lower_Call_next
lower_Call_next(
state: State, node: Call
) -> lowering.Result
Source code in src/kirin/dialects/py/iterable.py
77 78 79 80 81 82 83 84 85 86 87 88 | |
Next kirin-statement
Next(iter: SSAValue)
Bases: Statement
flowchart TD
kirin.dialects.py.iterable.Next[Next]
kirin.ir.nodes.stmt.Statement[Statement]
kirin.ir.nodes.base.IRNode[IRNode]
kirin.print.printable.Printable[Printable]
kirin.ir.nodes.stmt.Statement --> kirin.dialects.py.iterable.Next
kirin.ir.nodes.base.IRNode --> kirin.ir.nodes.stmt.Statement
kirin.print.printable.Printable --> kirin.ir.nodes.base.IRNode
click kirin.dialects.py.iterable.Next href "" "kirin.dialects.py.iterable.Next"
click kirin.ir.nodes.stmt.Statement href "" "kirin.ir.nodes.stmt.Statement"
click kirin.ir.nodes.base.IRNode href "" "kirin.ir.nodes.base.IRNode"
click kirin.print.printable.Printable href "" "kirin.print.printable.Printable"
This is equivalent to next(iterable, None) in Python.
iter kirin-argument
iter: SSAValue = argument(Any)
value kirin-result
value: ResultValue = result(Any)
TypeInfer
Bases: MethodTable
flowchart TD
kirin.dialects.py.iterable.TypeInfer[TypeInfer]
kirin.interp.table.MethodTable[MethodTable]
kirin.interp.table.MethodTable --> kirin.dialects.py.iterable.TypeInfer
click kirin.dialects.py.iterable.TypeInfer href "" "kirin.dialects.py.iterable.TypeInfer"
click kirin.interp.table.MethodTable href "" "kirin.interp.table.MethodTable"
iter_
iter_(interp, frame: Frame, stmt: Iter)
Source code in src/kirin/dialects/py/iterable.py
57 58 59 | |
next_
next_(interp, frame: Frame, stmt: Next)
Source code in src/kirin/dialects/py/iterable.py
61 62 63 | |
Len
kirin.dialects.py.len
The Len dialect.
This dialect maps the len() call to the Len statement:
- The
Lenstatement class. - The lowering pass for the
len()call. - The concrete implementation of the
len()call.
dialect module-attribute
dialect = Dialect('py.len')
Concrete
Bases: MethodTable
flowchart TD
kirin.dialects.py.len.Concrete[Concrete]
kirin.interp.table.MethodTable[MethodTable]
kirin.interp.table.MethodTable --> kirin.dialects.py.len.Concrete
click kirin.dialects.py.len.Concrete href "" "kirin.dialects.py.len.Concrete"
click kirin.interp.table.MethodTable href "" "kirin.interp.table.MethodTable"
len
len(interp, frame: Frame, stmt: Len)
Source code in src/kirin/dialects/py/len.py
30 31 32 | |
ConstProp
Bases: MethodTable
flowchart TD
kirin.dialects.py.len.ConstProp[ConstProp]
kirin.interp.table.MethodTable[MethodTable]
kirin.interp.table.MethodTable --> kirin.dialects.py.len.ConstProp
click kirin.dialects.py.len.ConstProp href "" "kirin.dialects.py.len.ConstProp"
click kirin.interp.table.MethodTable href "" "kirin.interp.table.MethodTable"
len
len(interp, frame: Frame, stmt: Len)
Source code in src/kirin/dialects/py/len.py
38 39 40 41 42 43 44 45 46 | |
Len kirin-statement
Len(value: SSAValue)
Bases: Statement
flowchart TD
kirin.dialects.py.len.Len[Len]
kirin.ir.nodes.stmt.Statement[Statement]
kirin.ir.nodes.base.IRNode[IRNode]
kirin.print.printable.Printable[Printable]
kirin.ir.nodes.stmt.Statement --> kirin.dialects.py.len.Len
kirin.ir.nodes.base.IRNode --> kirin.ir.nodes.stmt.Statement
kirin.print.printable.Printable --> kirin.ir.nodes.base.IRNode
click kirin.dialects.py.len.Len href "" "kirin.dialects.py.len.Len"
click kirin.ir.nodes.stmt.Statement href "" "kirin.ir.nodes.stmt.Statement"
click kirin.ir.nodes.base.IRNode href "" "kirin.ir.nodes.base.IRNode"
click kirin.print.printable.Printable href "" "kirin.print.printable.Printable"
name class-attribute instance-attribute
name = 'len'
result kirin-result
result: ResultValue = result(Int)
traits class-attribute instance-attribute
traits = frozenset({Pure(), FromPythonCall()})
value kirin-argument
value: SSAValue = argument(Any)
Lowering dataclass
Lowering()
Bases: FromPythonAST
flowchart TD
kirin.dialects.py.len.Lowering[Lowering]
kirin.lowering.python.dialect.FromPythonAST[FromPythonAST]
kirin.lowering.python.dialect.FromPythonAST --> kirin.dialects.py.len.Lowering
click kirin.dialects.py.len.Lowering href "" "kirin.dialects.py.len.Lowering"
click kirin.lowering.python.dialect.FromPythonAST href "" "kirin.lowering.python.dialect.FromPythonAST"
lower_Call_len
lower_Call_len(state: State, node: Call) -> lowering.Result
Source code in src/kirin/dialects/py/len.py
52 53 54 | |
Range
kirin.dialects.py.range
The range dialect for Python.
This dialect models the builtin range() function in Python.
The dialect includes: - The Range statement class. - The lowering pass for the range() function.
This dialect does not include a concrete implementation or type inference for the range() function. One needs to use other dialect for the concrete implementation and type inference, e.g., ilist dialect.
dialect module-attribute
dialect = Dialect('py.range')
Range kirin-statement
Range(start: SSAValue, stop: SSAValue, step: SSAValue)
Bases: Statement
flowchart TD
kirin.dialects.py.range.Range[Range]
kirin.ir.nodes.stmt.Statement[Statement]
kirin.ir.nodes.base.IRNode[IRNode]
kirin.print.printable.Printable[Printable]
kirin.ir.nodes.stmt.Statement --> kirin.dialects.py.range.Range
kirin.ir.nodes.base.IRNode --> kirin.ir.nodes.stmt.Statement
kirin.print.printable.Printable --> kirin.ir.nodes.base.IRNode
click kirin.dialects.py.range.Range href "" "kirin.dialects.py.range.Range"
click kirin.ir.nodes.stmt.Statement href "" "kirin.ir.nodes.stmt.Statement"
click kirin.ir.nodes.base.IRNode href "" "kirin.ir.nodes.base.IRNode"
click kirin.print.printable.Printable href "" "kirin.print.printable.Printable"
name class-attribute instance-attribute
name = 'range'
result kirin-result
result: ResultValue = result(PyClass(range))
start kirin-argument
start: SSAValue = argument(Int)
step kirin-argument
step: SSAValue = argument(Int)
stop kirin-argument
stop: SSAValue = argument(Int)
traits class-attribute instance-attribute
traits = frozenset({Pure(), FromPythonRangeLike()})
TypeInfer
Bases: MethodTable
flowchart TD
kirin.dialects.py.range.TypeInfer[TypeInfer]
kirin.interp.table.MethodTable[MethodTable]
kirin.interp.table.MethodTable --> kirin.dialects.py.range.TypeInfer
click kirin.dialects.py.range.TypeInfer href "" "kirin.dialects.py.range.TypeInfer"
click kirin.interp.table.MethodTable href "" "kirin.interp.table.MethodTable"
eltype_range
eltype_range(interp_, frame: Frame, stmt: ElType)
Source code in src/kirin/dialects/py/range.py
34 35 36 | |
Slice
kirin.dialects.py.slice
The slice dialect for Python.
This dialect provides a Slice statement that represents a slice object in Python:
- The
Slicestatement class. - The lowering pass for the
slicecall. - The concrete implementation of the
slicecall. - The type inference implementation of the
slicecall.
T module-attribute
T = TypeVar('T')
dialect module-attribute
dialect = Dialect('py.slice')
Concrete
Bases: MethodTable
flowchart TD
kirin.dialects.py.slice.Concrete[Concrete]
kirin.interp.table.MethodTable[MethodTable]
kirin.interp.table.MethodTable --> kirin.dialects.py.slice.Concrete
click kirin.dialects.py.slice.Concrete href "" "kirin.dialects.py.slice.Concrete"
click kirin.interp.table.MethodTable href "" "kirin.interp.table.MethodTable"
_slice
_slice(interp, frame: Frame, stmt: Slice)
Source code in src/kirin/dialects/py/slice.py
68 69 70 71 72 73 74 75 76 | |
Lowering dataclass
Lowering()
Bases: FromPythonAST
flowchart TD
kirin.dialects.py.slice.Lowering[Lowering]
kirin.lowering.python.dialect.FromPythonAST[FromPythonAST]
kirin.lowering.python.dialect.FromPythonAST --> kirin.dialects.py.slice.Lowering
click kirin.dialects.py.slice.Lowering href "" "kirin.dialects.py.slice.Lowering"
click kirin.lowering.python.dialect.FromPythonAST href "" "kirin.lowering.python.dialect.FromPythonAST"
lower_Call_slice
lower_Call_slice(
state: State, node: Call
) -> lowering.Result
Source code in src/kirin/dialects/py/slice.py
95 96 97 98 99 | |
lower_Slice
lower_Slice(state: State, node: Slice) -> lowering.Result
Source code in src/kirin/dialects/py/slice.py
82 83 84 85 86 87 88 89 90 91 92 93 | |
Slice kirin-statement
Slice(start: SSAValue, stop: SSAValue, step: SSAValue)
Bases: Statement
flowchart TD
kirin.dialects.py.slice.Slice[Slice]
kirin.ir.nodes.stmt.Statement[Statement]
kirin.ir.nodes.base.IRNode[IRNode]
kirin.print.printable.Printable[Printable]
kirin.ir.nodes.stmt.Statement --> kirin.dialects.py.slice.Slice
kirin.ir.nodes.base.IRNode --> kirin.ir.nodes.stmt.Statement
kirin.print.printable.Printable --> kirin.ir.nodes.base.IRNode
click kirin.dialects.py.slice.Slice href "" "kirin.dialects.py.slice.Slice"
click kirin.ir.nodes.stmt.Statement href "" "kirin.ir.nodes.stmt.Statement"
click kirin.ir.nodes.base.IRNode href "" "kirin.ir.nodes.base.IRNode"
click kirin.print.printable.Printable href "" "kirin.print.printable.Printable"
Source code in src/kirin/dialects/py/slice.py
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | |
name class-attribute instance-attribute
name = 'slice'
result kirin-result
result: ResultValue = result(Slice[T])
start kirin-argument
start: SSAValue = argument(T | NoneType)
step kirin-argument
step: SSAValue = argument(T | NoneType)
stop kirin-argument
stop: SSAValue = argument(T | NoneType)
traits class-attribute instance-attribute
traits = frozenset({Pure(), SliceLowering()})
SliceLowering dataclass
SliceLowering()
Bases: FromPythonCall['Slice']
flowchart TD
kirin.dialects.py.slice.SliceLowering[SliceLowering]
kirin.lowering.python.traits.FromPythonCall[FromPythonCall]
kirin.lowering.python.traits.PythonLoweringTrait[PythonLoweringTrait]
kirin.ir.traits.abc.Trait[Trait]
kirin.lowering.python.traits.FromPythonCall --> kirin.dialects.py.slice.SliceLowering
kirin.lowering.python.traits.PythonLoweringTrait --> kirin.lowering.python.traits.FromPythonCall
kirin.ir.traits.abc.Trait --> kirin.lowering.python.traits.PythonLoweringTrait
click kirin.dialects.py.slice.SliceLowering href "" "kirin.dialects.py.slice.SliceLowering"
click kirin.lowering.python.traits.FromPythonCall href "" "kirin.lowering.python.traits.FromPythonCall"
click kirin.lowering.python.traits.PythonLoweringTrait href "" "kirin.lowering.python.traits.PythonLoweringTrait"
click kirin.ir.traits.abc.Trait href "" "kirin.ir.traits.abc.Trait"
lower
lower(
stmt: type[Slice], state: State, node: Call
) -> lowering.Result
Source code in src/kirin/dialects/py/slice.py
24 25 26 27 | |
_lower_slice
_lower_slice(state: State, node: Call) -> lowering.Result
Source code in src/kirin/dialects/py/slice.py
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | |
Built-in Function
kirin.dialects.py.builtin
builtin dialect for python builtins
This dialect provides implementations for builtin functions like abs and sum.
- Statements:
Abs,Sum. - The lowering pass for the builtin functions.
- The concrete implementation of the builtin functions.
- The type inference implementation of the builtin functions.
This dialect maps ast.Call nodes of builtin functions to the Abs and Sum statements.
T module-attribute
T = TypeVar('T', bound=Int | Float)
dialect module-attribute
dialect = Dialect('py.builtin')
Abs kirin-statement
Abs(value: SSAValue)
Bases: Statement
flowchart TD
kirin.dialects.py.builtin.Abs[Abs]
kirin.ir.nodes.stmt.Statement[Statement]
kirin.ir.nodes.base.IRNode[IRNode]
kirin.print.printable.Printable[Printable]
kirin.ir.nodes.stmt.Statement --> kirin.dialects.py.builtin.Abs
kirin.ir.nodes.base.IRNode --> kirin.ir.nodes.stmt.Statement
kirin.print.printable.Printable --> kirin.ir.nodes.base.IRNode
click kirin.dialects.py.builtin.Abs href "" "kirin.dialects.py.builtin.Abs"
click kirin.ir.nodes.stmt.Statement href "" "kirin.ir.nodes.stmt.Statement"
click kirin.ir.nodes.base.IRNode href "" "kirin.ir.nodes.base.IRNode"
click kirin.print.printable.Printable href "" "kirin.print.printable.Printable"
name class-attribute instance-attribute
name = 'abs'
result kirin-result
result: ResultValue = result(T)
traits class-attribute instance-attribute
traits = frozenset({Pure(), FromPythonCall()})
value kirin-argument
value: SSAValue = argument(T, print=False)
Concrete
Bases: MethodTable
flowchart TD
kirin.dialects.py.builtin.Concrete[Concrete]
kirin.interp.table.MethodTable[MethodTable]
kirin.interp.table.MethodTable --> kirin.dialects.py.builtin.Concrete
click kirin.dialects.py.builtin.Concrete href "" "kirin.dialects.py.builtin.Concrete"
click kirin.interp.table.MethodTable href "" "kirin.interp.table.MethodTable"
_sum
_sum(interp, frame: Frame, stmt: Sum)
Source code in src/kirin/dialects/py/builtin.py
58 59 60 | |
abs
abs(interp, frame: Frame, stmt: Abs)
Source code in src/kirin/dialects/py/builtin.py
54 55 56 | |
Lowering dataclass
Lowering()
Bases: FromPythonAST
flowchart TD
kirin.dialects.py.builtin.Lowering[Lowering]
kirin.lowering.python.dialect.FromPythonAST[FromPythonAST]
kirin.lowering.python.dialect.FromPythonAST --> kirin.dialects.py.builtin.Lowering
click kirin.dialects.py.builtin.Lowering href "" "kirin.dialects.py.builtin.Lowering"
click kirin.lowering.python.dialect.FromPythonAST href "" "kirin.lowering.python.dialect.FromPythonAST"
lower_Call_abs
lower_Call_abs(state: State, node: Call) -> lowering.Result
Source code in src/kirin/dialects/py/builtin.py
42 43 44 | |
lower_Call_sum
lower_Call_sum(state: State, node: Call) -> lowering.Result
Source code in src/kirin/dialects/py/builtin.py
46 47 48 | |
Sum kirin-statement
Sum(value: SSAValue)
Bases: Statement
flowchart TD
kirin.dialects.py.builtin.Sum[Sum]
kirin.ir.nodes.stmt.Statement[Statement]
kirin.ir.nodes.base.IRNode[IRNode]
kirin.print.printable.Printable[Printable]
kirin.ir.nodes.stmt.Statement --> kirin.dialects.py.builtin.Sum
kirin.ir.nodes.base.IRNode --> kirin.ir.nodes.stmt.Statement
kirin.print.printable.Printable --> kirin.ir.nodes.base.IRNode
click kirin.dialects.py.builtin.Sum href "" "kirin.dialects.py.builtin.Sum"
click kirin.ir.nodes.stmt.Statement href "" "kirin.ir.nodes.stmt.Statement"
click kirin.ir.nodes.base.IRNode href "" "kirin.ir.nodes.base.IRNode"
click kirin.print.printable.Printable href "" "kirin.print.printable.Printable"
name class-attribute instance-attribute
name = 'sum'
result kirin-result
result: ResultValue = result(Any)
traits class-attribute instance-attribute
traits = frozenset({Pure(), FromPythonCall()})
value kirin-argument
value: SSAValue = argument(Any, print=False)
TypeInfer
Bases: MethodTable
flowchart TD
kirin.dialects.py.builtin.TypeInfer[TypeInfer]
kirin.interp.table.MethodTable[MethodTable]
kirin.interp.table.MethodTable --> kirin.dialects.py.builtin.TypeInfer
click kirin.dialects.py.builtin.TypeInfer href "" "kirin.dialects.py.builtin.TypeInfer"
click kirin.interp.table.MethodTable href "" "kirin.interp.table.MethodTable"
absf
absf(interp, frame, stmt)
Source code in src/kirin/dialects/py/builtin.py
70 71 72 | |
absi
absi(interp, frame, stmt)
Source code in src/kirin/dialects/py/builtin.py
66 67 68 | |