# ============================================================================= # Projet : AIR — Accounting Intermediate Representation # Auteur : Simon-Pierre Boucher # Contact : contact@spboucher.ai # Fichier : pass_manager.py # Description : Pass manager — ordered passes, invariant verified after every pass. # ============================================================================= """AIC pass manager. Runs the pass pipeline in order. After EVERY pass, the double-entry invariant (per-entry balance + accounting equation) is verified — the accounting analogue of `opt -verify-each`. Any ERROR diagnostic aborts compilation with a CompilationError carrying clang-style diagnostics. """ from __future__ import annotations from aic.diagnostics import CompilationError, Severity from aic.passes.base import Pass from aic.unit import CompilationUnit from core.invariant import verify_entries, verify_equation class PassManager: def __init__(self, passes: list[Pass]): self.passes = passes def run(self, unit: CompilationUnit) -> CompilationUnit: for p in self.passes: unit.diagnostics.extend(p.run(unit)) # the permanent invariant: checked after every pass, no exceptions unit.diagnostics.extend(verify_entries(unit.entries, p.name)) unit.diagnostics.extend(verify_equation(unit.entries, p.name)) if any(d.severity is Severity.ERROR for d in unit.diagnostics): raise CompilationError(unit.diagnostics) return unit