Skip to content

Commit

Permalink
Merge branch 'master' into dspil_benchmarking
Browse files Browse the repository at this point in the history
  • Loading branch information
Dspil committed Jul 18, 2023
2 parents 3250bc7 + 3b3b4be commit 2b985b8
Show file tree
Hide file tree
Showing 6 changed files with 41 additions and 53 deletions.
2 changes: 1 addition & 1 deletion silver
Submodule silver updated 36 files
+1 −0 src/main/scala/viper/silver/ast/Expression.scala
+1 −1 src/main/scala/viper/silver/ast/Statement.scala
+31 −10 src/main/scala/viper/silver/ast/utility/Functions.scala
+1 −1 src/main/scala/viper/silver/ast/utility/ImpureAssumeRewriter.scala
+3 −1 src/main/scala/viper/silver/ast/utility/Simplifier.scala
+2 −2 src/main/scala/viper/silver/ast/utility/rewriter/Rewritable.scala
+3 −8 src/main/scala/viper/silver/cfg/CfgTest.scala
+8 −19 src/main/scala/viper/silver/frontend/SilFrontend.scala
+3 −3 src/main/scala/viper/silver/parser/FastMessage.scala
+136 −537 src/main/scala/viper/silver/parser/FastParser.scala
+424 −0 src/main/scala/viper/silver/parser/MacroExpander.scala
+143 −98 src/main/scala/viper/silver/parser/ParseAst.scala
+72 −125 src/main/scala/viper/silver/parser/Resolver.scala
+9 −8 src/main/scala/viper/silver/parser/Transformer.scala
+116 −64 src/main/scala/viper/silver/parser/Translator.scala
+16 −4 src/main/scala/viper/silver/plugin/standard/adt/AdtPASTExtension.scala
+20 −24 src/main/scala/viper/silver/plugin/standard/adt/AdtPlugin.scala
+2 −1 src/main/scala/viper/silver/plugin/standard/predicateinstance/PredicateInstancePASTExtension.scala
+1 −3 src/main/scala/viper/silver/plugin/standard/termination/TerminationPlugin.scala
+1 −1 src/main/scala/viper/silver/verifier/VerificationError.scala
+7 −1 src/main/scala/viper/silver/verifier/VerificationResult.scala
+55 −0 src/test/resources/all/basic/comparisons.vpr
+26 −0 src/test/resources/all/basic/comparisons_fail.vpr
+53 −0 src/test/resources/all/basic/multi_initialization.vpr
+20 −0 src/test/resources/all/basic/multi_initialization_err.vpr
+13 −0 src/test/resources/all/basic/multi_initialization_translate_err.vpr
+2 −2 src/test/resources/all/issues/silver/0090.vpr
+6 −1 src/test/resources/all/issues/silver/0128.vpr
+1 −1 src/test/resources/all/issues/silver/0138.vpr
+8 −0 src/test/resources/all/issues/silver/0717.vpr
+9 −0 src/test/resources/all/issues/silver/0720.vpr
+9 −4 src/test/resources/all/third_party/stefan_recent/testTreeWandE1.vpr
+1 −2 src/test/resources/examples/quickselect/arrays_quickselect_rec.vpr
+1 −1 src/test/scala/ASTTransformationTests.scala
+36 −10 src/test/scala/AstPositionsTests.scala
+6 −0 src/test/scala/SimplifierTests.scala
6 changes: 0 additions & 6 deletions src/main/scala/Config.scala
Original file line number Diff line number Diff line change
Expand Up @@ -822,12 +822,6 @@ class Config(args: Seq[String]) extends SilFrontendConfig(args, "Silicon") {
case _ => Right(())
}

validateOpt(assertionMode, parallelizeBranches) {
case (Some(AssertionMode.SoftConstraints), Some(true)) =>
Left(s"Assertion mode SoftConstraints is not supported in combination with ${parallelizeBranches.name}")
case _ => Right()
}

validateFileOpt(logConfig)
validateFileOpt(setAxiomatizationFile)
validateFileOpt(multisetAxiomatizationFile)
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/decider/Decider.scala
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,7 @@ trait DefaultDeciderProvider extends VerifierComponent { this: Verifier =>

def statistics(): Map[String, String] = prover.statistics()

override def generateModel(): Unit = proverAssert(False, None)
override def generateModel(): Unit = proverAssert(False, Verifier.config.assertTimeout.toOption)

override def getModel(): Model = prover.getModel()

Expand Down
52 changes: 28 additions & 24 deletions src/main/scala/decider/Z3ProverAPI.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,17 @@ package viper.silicon.decider
import com.typesafe.scalalogging.LazyLogging
import viper.silicon.common.config.Version
import viper.silicon.interfaces.decider.{Prover, Result, Sat, Unknown, Unsat}
import viper.silicon.state.{IdentifierFactory, State}
import viper.silicon.state.terms.{App, Decl, Fun, FunctionDecl, Implies, Ite, MacroDecl, Quantification, Sort, SortDecl, SortWrapperDecl, Term, Trigger, TriggerGenerator, sorts}
import viper.silicon.state.IdentifierFactory
import viper.silicon.state.terms.{App, Decl, Fun, FunctionDecl, Implies, MacroDecl, Not, Quantification, Sort, SortDecl, SortWrapperDecl, Term, TriggerGenerator, sorts}
import viper.silicon.{Config, Map}
import viper.silicon.verifier.Verifier
import viper.silver.reporter.{InternalWarningMessage, Reporter}
import viper.silver.verifier.{MapEntry, ModelEntry, ModelParser, ValueEntry, DefaultDependency => SilDefaultDependency, Model => ViperModel}

import java.io.PrintWriter
import java.nio.file.Path
import scala.collection.mutable
import com.microsoft.z3._
import com.microsoft.z3.enumerations.Z3_param_kind
import viper.silicon.decider.Z3ProverAPI.oldVersionOnlyParams
import viper.silicon.reporting.ExternalToolError

import scala.jdk.CollectionConverters.MapHasAsJava
Expand Down Expand Up @@ -64,7 +62,6 @@ object Z3ProverAPI {
"smt.qi.eager_threshold" -> 100.0,
)
val allParams = boolParams ++ intParams ++ stringParams ++ doubleParams
val oldVersionOnlyParams = Set("smt.arith.solver")
}


Expand Down Expand Up @@ -122,26 +119,21 @@ class Z3ProverAPI(uniqueId: String,
s
}

val useOldVersionParams = version() <= Version("4.8.7.0")
Z3ProverAPI.boolParams.foreach{
case (k, v) =>
if (useOldVersionParams || !oldVersionOnlyParams.contains(k))
params.add(removeSmtPrefix(k), v)
params.add(removeSmtPrefix(k), v)
}
Z3ProverAPI.intParams.foreach{
case (k, v) =>
if (useOldVersionParams || !oldVersionOnlyParams.contains(k))
params.add(removeSmtPrefix(k), v)
params.add(removeSmtPrefix(k), v)
}
Z3ProverAPI.doubleParams.foreach{
case (k, v) =>
if (useOldVersionParams || !oldVersionOnlyParams.contains(k))
params.add(removeSmtPrefix(k), v)
params.add(removeSmtPrefix(k), v)
}
Z3ProverAPI.stringParams.foreach{
case (k, v) =>
if (useOldVersionParams || !oldVersionOnlyParams.contains(k))
params.add(removeSmtPrefix(k), v)
params.add(removeSmtPrefix(k), v)
}
val userProvidedArgs = Verifier.config.proverConfigArgs
prover = ctx.mkSolver()
Expand Down Expand Up @@ -256,19 +248,24 @@ class Z3ProverAPI(uniqueId: String,
// When used via API, Z3 completely discards assumptions that contain invalid triggers (whereas it just ignores
// the invalid trigger when used via stdio). Thus, to make sure our assumption is not discarded, we manually
// walk through all quantifiers and remove invalid terms inside the trigger.
triggerGenerator.setCustomIsForbiddenInTrigger(triggerGenerator.advancedIsForbiddenInTrigger)
val cleanTerm = term.transform{
case q@Quantification(_, _, _, triggers, _, _, _) if triggers.nonEmpty =>
val goodTriggers = triggers.filterNot(trig => trig.p.exists(ptrn => ptrn.shallowCollect{
case t => triggerGenerator.isForbiddenInTrigger(t)
}.nonEmpty))
q.copy(triggers = goodTriggers)
}()
val cleanTerm = cleanTriggers(term)
prover.add(termConverter.convert(cleanTerm).asInstanceOf[BoolExpr])
reporter.report(InternalWarningMessage("Z3 error: " + e.getMessage))
}
}

def cleanTriggers(term: Term): Term = {
triggerGenerator.setCustomIsForbiddenInTrigger(triggerGenerator.advancedIsForbiddenInTrigger)
val cleanTerm = term.transform {
case q@Quantification(_, _, _, triggers, _, _, _) if triggers.nonEmpty =>
val goodTriggers = triggers.filterNot(trig => trig.p.exists(ptrn => ptrn.shallowCollect {
case t => triggerGenerator.isForbiddenInTrigger(t)
}.nonEmpty))
q.copy(triggers = goodTriggers)
}()
cleanTerm
}

def assert(goal: Term, timeout: Option[Int]): Boolean = {
endPreamblePhase()

Expand All @@ -279,7 +276,14 @@ class Z3ProverAPI(uniqueId: String,
}
result
} catch {
case e: Z3Exception => throw ExternalToolError("Prover", "Z3 error: " + e.getMessage)
case e: Z3Exception => {
val cleanGoal = cleanTriggers(goal)
if (cleanGoal == goal) {
throw ExternalToolError("Prover", "Z3 error: " + e.getMessage)
} else {
assert(cleanGoal, timeout)
}
}
}
}

Expand Down Expand Up @@ -342,7 +346,7 @@ class Z3ProverAPI(uniqueId: String,

val guard = fresh("grd", Nil, sorts.Bool)
val guardApp = App(guard, Nil)
val goalImplication = Implies(guardApp, goal)
val goalImplication = Implies(guardApp, Not(goal))

prover.add(termConverter.convertTerm(goalImplication).asInstanceOf[BoolExpr])

Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/rules/Evaluator.scala
Original file line number Diff line number Diff line change
Expand Up @@ -291,9 +291,9 @@ object evaluator extends EvaluationRules {

case ast.Let(x, e0, e1) =>
eval(s, e0, pve, v)((s1, t0, v1) => {
val t = v1.decider.fresh(v1.symbolConverter.toSort(x.typ))
val t = v1.decider.appliedFresh("letvar", v1.symbolConverter.toSort(x.typ), s1.relevantQuantifiedVariables)
v1.decider.assume(t === t0)
val newFuncRec = s1.functionRecorder.recordFreshSnapshot(t)
val newFuncRec = s1.functionRecorder.recordFreshSnapshot(t.applicable.asInstanceOf[Function])
eval(s1.copy(g = s1.g + (x.localVar, t0), functionRecorder = newFuncRec), e1, pve, v1)(Q)
})

Expand Down
28 changes: 9 additions & 19 deletions src/main/scala/supporters/BuiltinDomainsContributor.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import viper.silicon.interfaces.PreambleContributor
import viper.silicon.interfaces.decider.ProverLike
import viper.silicon.state.DefaultSymbolConverter
import viper.silicon.state.terms._
import viper.silver.ast.LineCol

abstract class BuiltinDomainsContributor extends PreambleContributor[Sort, DomainFun, Term] {
type BuiltinDomainType <: ast.GenericType
Expand Down Expand Up @@ -194,23 +193,14 @@ private object utils {
}

val fp = new viper.silver.parser.FastParser()
val lc = new LineCol(fp)
fp.parse(content, fromPath) match {
case fastparse.Parsed.Success(parsedProgram: viper.silver.parser.PProgram, _) =>
assert(parsedProgram.errors.isEmpty, s"Unexpected parsing errors: ${parsedProgram.errors}")

val resolver = viper.silver.parser.Resolver(parsedProgram)
val resolved = resolver.run.get
val translator = viper.silver.parser.Translator(resolved)
val program = translator.translate.get

program

case fastparse.Parsed.Failure(msg, index, _) =>
val (line, col) = lc.getPos(index)
sys.error(s"Failure: $msg, at ${viper.silver.ast.FilePosition(fromPath, line, col)}")
//? val pos = extra.input.prettyIndex(index).split(":").map(_.toInt)
//? sys.error(s"Failure: $msg, at ${viper.silver.ast.FilePosition(fromPath, pos(0), pos(1))}")
}
val parsedProgram = fp.parse(content, fromPath)
assert(parsedProgram.errors.isEmpty, s"Unexpected parsing errors: ${parsedProgram.errors}")

val resolver = viper.silver.parser.Resolver(parsedProgram)
val resolved = resolver.run.get
val translator = viper.silver.parser.Translator(resolved)
val program = translator.translate.get

program
}
}

0 comments on commit 2b985b8

Please sign in to comment.