From d9b9c41dfaca41a4f0a354365c3d102e6441e56c Mon Sep 17 00:00:00 2001 From: Samuel Gruetter <samuel.gruetter@epfl.ch> Date: Tue, 2 Jun 2015 13:12:30 +0200 Subject: [PATCH] --verify --termination does verification and termination checking in one run --- src/main/scala/leon/Main.scala | 6 ++++++ src/main/scala/leon/Pipeline.scala | 13 +++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/main/scala/leon/Main.scala b/src/main/scala/leon/Main.scala index 66a54ec4c..04df65e6d 100644 --- a/src/main/scala/leon/Main.scala +++ b/src/main/scala/leon/Main.scala @@ -149,6 +149,7 @@ object Main { val synthesisF = ctx.findOptionOrDefault(optSynthesis) val xlangF = ctx.findOptionOrDefault(optXLang) val repairF = ctx.findOptionOrDefault(optRepair) + val analysisF = ctx.findOption(optVerify).isDefined && ctx.findOption(optTermination).isDefined val terminationF = ctx.findOptionOrDefault(optTermination) val verifyF = ctx.findOptionOrDefault(optVerify) val evalF = ctx.findOption(SharedOptions.optEval) @@ -182,6 +183,7 @@ object Main { if (noopF) RestoreMethods andThen FileOutputPhase else if (synthesisF) SynthesisPhase else if (repairF) RepairPhase + else if (analysisF) Pipeline.both(FunctionClosure andThen AnalysisPhase, TerminationPhase) else if (terminationF) TerminationPhase else if (xlangF) XLangAnalysisPhase else if (evalF.isDefined) EvaluationPhase @@ -246,6 +248,10 @@ object Main { // Run pipeline pipeline.run(ctx)(args.toList) match { + case (vReport: verification.VerificationReport, tReport: termination.TerminationReport) => + ctx.reporter.info(vReport.summaryString) + ctx.reporter.info(tReport.summaryString) + case report: verification.VerificationReport => ctx.reporter.info(report.summaryString) diff --git a/src/main/scala/leon/Pipeline.scala b/src/main/scala/leon/Pipeline.scala index e4f93fcfa..3e3c8a915 100644 --- a/src/main/scala/leon/Pipeline.scala +++ b/src/main/scala/leon/Pipeline.scala @@ -15,3 +15,16 @@ abstract class Pipeline[-F, +T] { def run(ctx: LeonContext)(v: F): T } + +object Pipeline { + + def both[T, R1, R2](f1: Pipeline[T, R1], f2: Pipeline[T, R2]): Pipeline[T, (R1, R2)] = new Pipeline[T, (R1, R2)] { + def run(ctx : LeonContext)(t : T): (R1, R2) = { + val r1 = f1.run(ctx)(t) + // don't check for SharedOptions.optStrictPhases because f2 does not depend on the result of f1 + val r2 = f2.run(ctx)(t) + (r1, r2) + } + } + +} -- GitLab