Skip to content
Snippets Groups Projects

Consolidate codegen and JIT modules.

Merged Frederik Hennig requested to merge fhennig/codegen-module into v2.0-dev
All threads resolved!
1 file
+ 57
36
Compare changes
  • Side-by-side
  • Inline
+ 57
36
from dataclasses import dataclass
from typing import ClassVar
from .backend.ast import PsAstNode
from .backend.emission import CAstPrinter, IRAstPrinter, EmissionError
@@ -84,50 +81,74 @@ class AstInspection:
return html_code
@dataclass
class IntermediateAst:
def __init__(self, description: str | None = None):
self._description = description
self._name: str
self._lookup: str
@property
def description(self) -> str:
if self._description is not None:
return self._description
else:
return self._name
def __set_name__(self, owner, name: str):
self._name = name
self._lookup = f"_{name}"
def __get__(self, obj, objtype=None) -> AstInspection | None:
if obj is None:
return None
ast = getattr(obj, self._lookup, None)
if ast is not None:
return AstInspection(ast)
else:
return None
def __set__(self, obj, val: PsAstNode | None):
setattr(obj, self._lookup, val)
class IntermediatesInspection:
"""Inspect intermediate results produced by the code generator."""
parsed_body: PsAstNode | None = None
materialized_ispace: PsAstNode | None = None
constants_eliminated: PsAstNode | None = None
cpu_canonicalize: PsAstNode | None = None
cpu_hoist_invariants: PsAstNode | None = None
cpu_vectorize: PsAstNode | None = None
cpu_select_intrins: PsAstNode | None = None
cpu_openmp: PsAstNode | None = None
lowered: PsAstNode | None = None
DESCR: ClassVar = {
"parsed_body": "Freeze & Type Deduction",
"materialized_ispace": "Iteration Space Materialization",
"constants_eliminated": "Constant Elimination",
"cpu_canonicalize": "CPU: Symbol Canonicalization",
"cpu_hoist_invariants": "CPU: Hoisting of Loop Invariants",
"cpu_vectorize": "CPU: Vectorization",
"cpu_select_intrins": "CPU: Intrinsics Selection",
"cpu_openmp": "CPU: OpenMP Instrumentation",
"lowered": "C Language Lowering",
}
parsed_body: IntermediateAst = IntermediateAst("Freeze & Type Deduction")
materialized_ispace: IntermediateAst = IntermediateAst(
"Iteration Space Materialization"
)
constants_eliminated: IntermediateAst = IntermediateAst("Constant Elimination")
cpu_canonicalize: IntermediateAst = IntermediateAst("CPU: Symbol Canonicalization")
cpu_hoist_invariants: IntermediateAst = IntermediateAst(
"CPU: Hoisting of Loop Invariants"
)
cpu_vectorize: IntermediateAst = IntermediateAst("CPU: Vectorization")
cpu_select_intrins: IntermediateAst = IntermediateAst("CPU: Intrinsics Selection")
cpu_openmp: IntermediateAst = IntermediateAst("CPU: OpenMP Instrumentation")
lowered: IntermediateAst = IntermediateAst("C Language Lowering")
def _ipython_display_(self):
from IPython.display import display
import ipywidgets as widgets
from dataclasses import fields, asdict
all_fields = fields(IntermediatesInspection)
fields_dict = asdict(self)
all_asts = [
(self.DESCR.get(f.name, f.name), fields_dict[f.name])
for f in all_fields
if fields_dict[f.name] is not None
all_fields = [
(name, obj.description)
for name, obj in IntermediatesInspection.__dict__.items()
if isinstance(obj, IntermediateAst)
]
labels = [t[0] for t in all_asts]
previews: list[AstInspection] = []
labels: list[str] = []
for name, descr in all_fields:
preview = getattr(self, name)
if preview is not None:
previews.append(preview)
labels.append(descr)
code_views = [AstInspection(t[1])._widget() for t in all_asts]
code_views = [p._widget() for p in previews]
select_label = widgets.HTML("<div><b>Code Generator Stages</b></div>")
select = widgets.Select(options=labels)
Loading