@@ -699,51 +699,79 @@ abbrev TranslateResultWithLaurel := (Option Core.Program) × (List DiagnosticMod
699699
700700/--
701701Translate Laurel Program to Core Program, also returning the lowered Laurel program.
702+
703+ When `keepAllFilesPrefix` is provided, the program state after each named
704+ Laurel-to-Laurel pass is written to `{prefix}.{n}.{passName}.laurel.st`
705+ (numbered from 1).
702706-/
703- def translateWithLaurel (options: LaurelTranslateOptions) (program : Program): TranslateResultWithLaurel :=
707+ def translateWithLaurel (options: LaurelTranslateOptions) (program : Program)
708+ (keepAllFilesPrefix : Option String := none)
709+ : IO TranslateResultWithLaurel := do
704710 let program := { program with
705711 staticProcedures := coreDefinitionsForLaurel.staticProcedures ++ program.staticProcedures
706712 }
713+ if let some pfx := keepAllFilesPrefix then
714+ if let some parent := (System.FilePath.mk pfx).parent then
715+ IO.FS.createDirAll parent
716+ let stepRef ← IO.mkRef (0 : Nat)
717+ let emit (name : String) (p : Program) : IO Unit :=
718+ match keepAllFilesPrefix with
719+ | some pfx => do
720+ let n ← stepRef.modifyGet (fun n => (n, n + 1 ))
721+ IO.FS.writeFile s! "{ pfx} .{ n} .{ name} .laurel.st"
722+ ((formatProgram p).pretty ++ "\n " )
723+ | none => pure ()
724+
725+ -- Step 0: the input program before any passes
726+ emit "Initial" program
707727
708- -- dbg_trace "=== Initial Laurel program ==="
709- -- dbg_trace (toString (Std.Format.pretty (Std.ToFormat.format program)))
710- -- dbg_trace "================================="
711728 let result := resolve program
712729 let resolutionErrors: List DiagnosticModel := if options.emitResolutionErrors then result.errors.toList else []
713730 let (program, model) := (result.program, result.model)
731+ emit "Resolve" program
714732 let diamondErrors := validateDiamondFieldAccesses model program
715733
716734 let (program, nonCompositeDiags) := filterNonCompositeModifies model program
735+ emit "FilterNonCompositeModifies" program
717736
718737 let program := heapParameterization model program
719738 let result := resolve program (some model)
720739 let (program, model) := (result.program, result.model)
740+ emit "HeapParameterization" program
721741
722742 let program := typeHierarchyTransform model program
723743 let result := resolve program (some model)
724744 let (program, model) := (result.program, result.model)
745+ emit "TypeHierarchyTransform" program
725746 let (program, modifiesDiags) := modifiesClausesTransform model program
726747 let result := resolve program (some model)
727748 let (program, model) := (result.program, result.model)
728749 let result := resolve program (some model)
729750 let (program, model) := (result.program, result.model)
751+ emit "ModifiesClausesTransform" program
730752 let program := inferHoleTypes model program
753+ emit "InferHoleTypes" program
731754 let program := eliminateHoles program
755+ emit "EliminateHoles" program
732756 let program := desugarShortCircuit model program
757+ emit "DesugarShortCircuit" program
733758 let program := liftExpressionAssignments model program
759+ emit "LiftExpressionAssignments" program
734760 let program := eliminateReturnsInExpressionTransform program
735761 let result := resolve program (some model)
736762 let (program, model) := (result.program, result.model)
763+ emit "EliminateReturns" program
737764
738765 let (program, constrainedTypeDiags) := constrainedTypeElim model program
739766 let result := resolve program (some model)
740767 let (program, model) := (result.program, result.model)
768+ emit "ConstrainedTypeElim" program
741769
742770 let initState : TranslateState := {model := model }
743771 let (coreProgramOption, translateState) := runTranslateM initState (translateLaurelToCore options program)
744772 let allDiagnostics := resolutionErrors ++ diamondErrors ++ nonCompositeDiags ++ modifiesDiags ++ constrainedTypeDiags ++ translateState.diagnostics
745773 let coreProgramOption := if translateState.coreProgramHasSuperfluousErrors then none else coreProgramOption
746- (coreProgramOption, allDiagnostics, program)
774+ return (coreProgramOption, allDiagnostics, program)
747775 where
748776
749777 /--
@@ -824,17 +852,17 @@ def translateWithLaurel (options: LaurelTranslateOptions) (program : Program): T
824852/--
825853Translate Laurel Program to Core Program
826854-/
827- def translate (options: LaurelTranslateOptions) (program : Program): TranslateResult :=
828- let (core, diags, _) := translateWithLaurel options program
829- (core, diags)
855+ def translate (options: LaurelTranslateOptions) (program : Program): IO TranslateResult := do
856+ let (core, diags, _) ← translateWithLaurel options program
857+ return (core, diags)
830858
831859/--
832860Verify a Laurel program using an SMT solver
833861-/
834862def verifyToVcResults (program : Program)
835863 (options : VerifyOptions := .default)
836864 : IO (Option VCResults × List DiagnosticModel) := do
837- let (coreProgramOption, translateDiags) := translate {} program
865+ let (coreProgramOption, translateDiags) ← translate {} program
838866
839867 match coreProgramOption with
840868 | some coreProgram =>
0 commit comments