Skip to content

Commit 59b0695

Browse files
authored
fix circular imports (#143)
this PR fixes circular imports by removing the re-export of `rewrite.abc` and re-organize `attrs` and `types`, which is slightly breaking. More specifically, - `types` is moved into `attrs` as `kirin.ir.attrs.types` - `py.data` dialect is removed, and `PyAttr` is now part of builtin attributes because it is used within the IR module - `py.base` is added to carry the minimum lowering transforms - `julia.emit` now has a default `PyAttr` emit rule. - `rewrite.abc` is no longer re-exported to avoid circular imports the re-exports are still kinda messy, we will do a round of refactor of that in future PRs.
1 parent 163f625 commit 59b0695

File tree

40 files changed

+200
-166
lines changed

40 files changed

+200
-166
lines changed

src/kirin/decl/emit/init.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class EmitInit(BaseModifier):
2929

3030
def __init__(self, cls: type, **kwargs: Unpack[StatementOptions]) -> None:
3131
super().__init__(cls, **kwargs)
32-
from kirin.dialects.py.data import PyAttr
32+
from kirin.ir.attrs.py import PyAttr
3333

3434
self._init_params: list[str] = []
3535
self._init_body: list[str] = []

src/kirin/decl/emit/property.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ def _emit_result_property(self, index: int, f: info.ResultField):
111111
return getter, setter
112112

113113
def _emit_attribute_property(self, f: info.AttributeField):
114-
from kirin.dialects.py.data import PyAttr
114+
from kirin.ir.attrs.py import PyAttr
115115

116116
storage = "properties" if f.property else "attributes"
117117
attr = f"{self._self_name}.{storage}['{f.name}']"

src/kirin/dialects/cf/stmts.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from kirin.ir import Block, SSAValue, Statement, IsTerminator
22
from kirin.decl import info, statement
3-
from kirin.ir.types import Bool, String
43
from kirin.print.printer import Printer
4+
from kirin.ir.attrs.types import Bool, String
55
from kirin.dialects.cf.dialect import dialect
66

77

src/kirin/dialects/math/_gen.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def builtin_math_functions():
4747
f.write("# This file is generated by gen.py\n")
4848
f.write("from kirin import ir\n")
4949
f.write("from kirin.decl import statement, info\n")
50-
f.write("from kirin.ir.types import Float\n")
50+
f.write("from kirin.ir.attrs.types import Float\n")
5151
f.write("from kirin.dialects.math.dialect import dialect\n")
5252
f.write("\n")
5353
for name, obj, sig in builtin_math_functions():

src/kirin/dialects/math/stmts.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# This file is generated by gen.py
22
from kirin import ir
33
from kirin.decl import info, statement
4-
from kirin.ir.types import Float
4+
from kirin.ir.attrs.types import Float
55
from kirin.dialects.math.dialect import dialect
66

77

src/kirin/dialects/py/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
cmp as cmp,
33
len as len,
44
attr as attr,
5-
data as data,
5+
base as base,
66
binop as binop,
77
ilist as ilist,
88
range as range,
@@ -18,7 +18,6 @@
1818
)
1919
from .len import Len as Len
2020
from .attr import GetAttr as GetAttr
21-
from .data import PyAttr as PyAttr
2221
from .range import Range as Range
2322
from .slice import Slice as Slice
2423
from .append import Append as Append

src/kirin/dialects/py/assign.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from kirin import ir, interp, lowering, exceptions
44
from kirin.decl import info, statement
55
from kirin.print import Printer
6-
from kirin.dialects.py import data
76

87
dialect = ir.Dialect("py.assign")
98

@@ -15,7 +14,7 @@ class Alias(ir.Statement):
1514
name = "alias"
1615
traits = frozenset({ir.Pure(), ir.FromPythonCall()})
1716
value: ir.SSAValue = info.argument(T)
18-
target: data.PyAttr[str] = info.attribute(property=True)
17+
target: ir.PyAttr[str] = info.attribute(property=True)
1918
result: ir.ResultValue = info.result(T)
2019

2120
def print_impl(self, printer: Printer) -> None:
@@ -69,7 +68,7 @@ def lower_Assign(
6968
targets=[ast.Name(lhs_name, ast.Store())], value=ast.Name(_, ast.Load())
7069
):
7170
stmt = Alias(
72-
value=results[0], target=data.PyAttr(lhs_name)
71+
value=results[0], target=ir.PyAttr(lhs_name)
7372
) # NOTE: this is guaranteed to be one result
7473
stmt.result.name = lhs_name
7574
current_frame.defs[lhs_name] = state.append_stmt(stmt).result

src/kirin/dialects/py/base.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
"""Base dialect for Python.
2+
3+
This dialect does not contain statements. It only contains
4+
lowering rules for `ast.Name` and `ast.Expr`.
5+
"""
6+
7+
import ast
8+
9+
from kirin import ir, lowering, exceptions
10+
11+
dialect = ir.Dialect("py.base")
12+
13+
14+
@dialect.register
15+
class PythonLowering(lowering.FromPythonAST):
16+
17+
def lower_Name(
18+
self, state: lowering.LoweringState, node: ast.Name
19+
) -> lowering.Result:
20+
name = node.id
21+
if isinstance(node.ctx, ast.Load):
22+
value = state.current_frame.get(name)
23+
if value is None:
24+
raise exceptions.DialectLoweringError(f"{name} is not defined")
25+
return lowering.Result(value)
26+
elif isinstance(node.ctx, ast.Store):
27+
raise exceptions.DialectLoweringError("unhandled store operation")
28+
else: # Del
29+
raise exceptions.DialectLoweringError("unhandled del operation")
30+
31+
def lower_Expr(
32+
self, state: lowering.LoweringState, node: ast.Expr
33+
) -> lowering.Result:
34+
return state.visit(node.value)

src/kirin/dialects/py/constant.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from kirin.decl import info, statement
66
from kirin.print import Printer
77
from kirin.emit.julia import EmitJulia, EmitStrFrame
8-
from kirin.dialects.py.data import PyAttr
98

109
dialect = ir.Dialect("py.constant")
1110

@@ -20,9 +19,9 @@ class Constant(ir.Statement, Generic[T]):
2019
result: ir.ResultValue = info.result()
2120

2221
# NOTE: we allow py.Constant take data.PyAttr too
23-
def __init__(self, value: T | PyAttr[T]) -> None:
24-
if not isinstance(value, PyAttr):
25-
value = PyAttr(value)
22+
def __init__(self, value: T | ir.PyAttr[T]) -> None:
23+
if not isinstance(value, ir.PyAttr):
24+
value = ir.PyAttr(value)
2625
super().__init__(
2726
properties={"value": value},
2827
result_types=(value.type,),
@@ -65,4 +64,4 @@ class JuliaTable(interp.MethodTable):
6564

6665
@interp.impl(Constant)
6766
def emit_Constant(self, emit: EmitJulia, frame: EmitStrFrame, stmt: Constant):
68-
return (emit.emit_attribute(PyAttr(stmt.value)),)
67+
return (emit.emit_attribute(ir.PyAttr(stmt.value)),)

src/kirin/dialects/py/data.py

Lines changed: 0 additions & 72 deletions
This file was deleted.

0 commit comments

Comments
 (0)