Skip to content

Forward Dataflow

Forward dataclass

Forward(
    dialects: DialectGroup,
    *,
    max_depth: int = 800,
    max_python_recursion_depth: int = 131072,
    debug: bool = False
)

Bases: ForwardExtra[ForwardFrame[LatticeType], LatticeType], ABC


              flowchart TD
              kirin.analysis.forward.Forward[Forward]
              kirin.analysis.forward.ForwardExtra[ForwardExtra]
              kirin.interp.abstract.AbstractInterpreter[AbstractInterpreter]
              kirin.interp.abc.InterpreterABC[InterpreterABC]

                              kirin.analysis.forward.ForwardExtra --> kirin.analysis.forward.Forward
                                kirin.interp.abstract.AbstractInterpreter --> kirin.analysis.forward.ForwardExtra
                                kirin.interp.abc.InterpreterABC --> kirin.interp.abstract.AbstractInterpreter
                




              click kirin.analysis.forward.Forward href "" "kirin.analysis.forward.Forward"
              click kirin.analysis.forward.ForwardExtra href "" "kirin.analysis.forward.ForwardExtra"
              click kirin.interp.abstract.AbstractInterpreter href "" "kirin.interp.abstract.AbstractInterpreter"
              click kirin.interp.abc.InterpreterABC href "" "kirin.interp.abc.InterpreterABC"
            

Forward dataflow analysis.

This is the base class for forward dataflow analysis. If your analysis requires extra information per frame, you should subclass ForwardExtra instead.

initialize_frame

initialize_frame(
    node: Statement, *, has_parent_access: bool = False
) -> ForwardFrame[LatticeType]

Initialize a new call frame for the given callable node.

Source code in src/kirin/analysis/forward.py
66
67
68
69
def initialize_frame(
    self, node: ir.Statement, *, has_parent_access: bool = False
) -> ForwardFrame[LatticeType]:
    return ForwardFrame(node, has_parent_access=has_parent_access)

ForwardExtra dataclass

ForwardExtra(
    dialects: DialectGroup,
    *,
    max_depth: int = 800,
    max_python_recursion_depth: int = 131072,
    debug: bool = False
)

Bases: AbstractInterpreter[FrameType, LatticeType], ABC


              flowchart TD
              kirin.analysis.forward.ForwardExtra[ForwardExtra]
              kirin.interp.abstract.AbstractInterpreter[AbstractInterpreter]
              kirin.interp.abc.InterpreterABC[InterpreterABC]

                              kirin.interp.abstract.AbstractInterpreter --> kirin.analysis.forward.ForwardExtra
                                kirin.interp.abc.InterpreterABC --> kirin.interp.abstract.AbstractInterpreter
                



              click kirin.analysis.forward.ForwardExtra href "" "kirin.analysis.forward.ForwardExtra"
              click kirin.interp.abstract.AbstractInterpreter href "" "kirin.interp.abstract.AbstractInterpreter"
              click kirin.interp.abc.InterpreterABC href "" "kirin.interp.abc.InterpreterABC"
            

Forward dataflow analysis but with custom frame for extra information/state per call frame.

Parameters:

Name Type Description Default
FrameType

The type of the frame used for the analysis.

required
LatticeType

The type of the lattice used for the analysis.

required

method_self abstractmethod

method_self(method: Method) -> LatticeType

Return the self value for the given method.

Source code in src/kirin/analysis/forward.py
51
52
53
54
@abstractmethod
def method_self(self, method: ir.Method) -> LatticeType:
    """Return the self value for the given method."""
    ...

ForwardFrame dataclass

ForwardFrame(
    code: Statement,
    worklist: WorkList[Successor[ResultType]] = WorkList(),
    visited: dict[
        Block, set[Successor[ResultType]]
    ] = dict(),
    *,
    parent: FrameABC | None = None,
    has_parent_access: bool = False,
    lineno_offset: int = 0,
    entries: dict[SSAValue, ValueType] = dict()
)

Bases: AbstractFrame[LatticeType]


              flowchart TD
              kirin.analysis.forward.ForwardFrame[ForwardFrame]
              kirin.interp.abstract.AbstractFrame[AbstractFrame]
              kirin.interp.frame.Frame[Frame]
              kirin.interp.frame.FrameABC[FrameABC]

                              kirin.interp.abstract.AbstractFrame --> kirin.analysis.forward.ForwardFrame
                                kirin.interp.frame.Frame --> kirin.interp.abstract.AbstractFrame
                                kirin.interp.frame.FrameABC --> kirin.interp.frame.Frame
                




              click kirin.analysis.forward.ForwardFrame href "" "kirin.analysis.forward.ForwardFrame"
              click kirin.interp.abstract.AbstractFrame href "" "kirin.interp.abstract.AbstractFrame"
              click kirin.interp.frame.Frame href "" "kirin.interp.frame.Frame"
              click kirin.interp.frame.FrameABC href "" "kirin.interp.frame.FrameABC"
            

set_values

set_values(
    keys: Iterable[SSAValue], values: Iterable[LatticeType]
) -> None

Set the values of the given keys. This is a convenience method to set multiple values at once.

Parameters:

Name Type Description Default
keys Iterable[KeyType]

The keys to set the values for.

required
values Iterable[ValueType]

The values.

required
Source code in src/kirin/analysis/forward.py
15
16
17
18
19
20
21
22
def set_values(
    self, keys: Iterable[ir.SSAValue], values: Iterable[LatticeType]
) -> None:
    for ssa_value, result in zip(keys, values):
        if ssa_value in self.entries:
            self.entries[ssa_value] = self.entries[ssa_value].join(result)
        else:
            self.entries[ssa_value] = result