Skip to content

Commit ad19758

Browse files
committed
Merge
2 parents 7468240 + 31e3a48 commit ad19758

61 files changed

Lines changed: 3531 additions & 1196 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ jobs:
6868
cp target/scala-2.13/silicon.jar .
6969
7070
- name: Upload artifact
71-
uses: actions/upload-artifact@v2
71+
uses: actions/upload-artifact@v4
7272
with:
7373
name: test-and-assemble
7474
path: |
@@ -90,7 +90,7 @@ jobs:
9090
submodules: true
9191

9292
- name: Download artifacts from job test-and-assemble
93-
uses: actions/download-artifact@v2
93+
uses: actions/download-artifact@v4
9494
with:
9595
name: test-and-assemble
9696

annotation/Terms.example.scala

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -842,49 +842,6 @@ object AtLeast extends /* OptimisingBinaryArithmeticOperation with */ ((Term, Te
842842
}
843843
}
844844

845-
/*
846-
Helper class for permissions
847-
*/
848-
849-
final class Rational(n: BigInt, d: BigInt) extends Ordered[Rational] {
850-
require(d != 0, "Denominator of Rational must not be 0.")
851-
852-
private val g = n.gcd(d)
853-
val numerator: BigInt = n / g * d.signum
854-
val denominator: BigInt = d.abs / g
855-
856-
def +(that: Rational): Rational = {
857-
val newNum = this.numerator * that.denominator + that.numerator * this.denominator
858-
val newDen = this.denominator * that.denominator
859-
Rational(newNum, newDen)
860-
}
861-
def -(that: Rational): Rational = this + (-that)
862-
def unary_- = Rational(-numerator, denominator)
863-
def abs = Rational(numerator.abs, denominator)
864-
def signum = Rational(numerator.signum, 1)
865-
866-
def *(that: Rational): Rational = Rational(this.numerator * that.numerator, this.denominator * that.denominator)
867-
def /(that: Rational): Rational = this * that.inverse
868-
def inverse = Rational(denominator, numerator)
869-
870-
def compare(that: Rational) = (this.numerator * that.denominator - that.numerator * this.denominator).signum
871-
872-
override def equals(obj: Any) = obj match {
873-
case that: Rational => this.numerator == that.numerator && this.denominator == that.denominator
874-
case _ => false
875-
}
876-
877-
override lazy val toString = s"$numerator/$denominator"
878-
}
879-
880-
object Rational extends ((BigInt, BigInt) => Rational) {
881-
val zero = Rational(0, 1)
882-
val one = Rational(1, 1)
883-
884-
def apply(numer: BigInt, denom: BigInt) = new Rational(numer, denom)
885-
def unapply(r: Rational) = Some(r.numerator, r.denominator)
886-
}
887-
888845
/*
889846
* Permissions
890847
*/

src/main/scala/Config.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,12 @@ class Config(args: Seq[String]) extends SilFrontendConfig(args, "Silicon") {
818818
noshort = true
819819
)
820820

821+
val enableDebugging: ScallopOption[Boolean] = opt[Boolean]("enableDebugging",
822+
descr = "Enable debugging mode",
823+
default = Some(false),
824+
noshort = true
825+
)
826+
821827
/* Option validation (trailing file argument is validated by parent class) */
822828

823829
validateOpt(prover) {

src/main/scala/Utils.scala

Lines changed: 65 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,23 @@
66

77
package viper.silicon
88

9-
import scala.annotation.implicitNotFound
10-
import scala.collection.immutable.ArraySeq
9+
import viper.silicon.state.terms._
10+
import viper.silicon.verifier.Verifier
1111
import viper.silver
12+
import viper.silver.ast.utility.Triggers.TriggerGenerationWithAddAndSubtract
13+
import viper.silver.ast.utility.rewriter.Traverse
14+
import viper.silver.ast.SourcePNodeInfo
1215
import viper.silver.components.StatefulComponent
13-
import viper.silver.verifier.{VerificationError, errors}
16+
import viper.silver.parser.{PExp, PType, PUnknown, PUnnamedTypedDeclaration}
1417
import viper.silver.verifier.errors.Internal
1518
import viper.silver.verifier.reasons.{FeatureUnsupported, UnexpectedNode}
16-
import viper.silver.ast.utility.rewriter.Traverse
17-
import viper.silicon.state.terms.{Sort, Term, Var}
18-
import viper.silicon.verifier.Verifier
19-
import viper.silver.ast.utility.Triggers.TriggerGenerationWithAddAndSubtract
19+
import viper.silver.verifier.{VerificationError, errors}
20+
21+
import scala.annotation.implicitNotFound
22+
import scala.collection.immutable.ArraySeq
2023

2124
package object utils {
22-
def freshSnap: (Sort, Verifier) => Var = (sort, v) => v.decider.fresh(sort)
25+
def freshSnap: (Sort, Verifier) => Var = (sort, v) => v.decider.fresh(sort, Option.when(Verifier.config.enableDebugging())(PUnknown()))
2326
def toSf(t: Term): (Sort, Verifier) => Term = (sort, _) => t.convert(sort)
2427

2528
def mapReduceLeft[E](it: Iterable[E], f: E => E, op: (E, E) => E, unit: E): E =
@@ -131,6 +134,59 @@ package object utils {
131134
(e0: silver.ast.Exp, e1: silver.ast.Exp) => silver.ast.Or(e0, e1)(e0.pos, e0.info),
132135
silver.ast.FalseLit()(emptyPos))
133136

137+
def removeKnownToBeTrueExp(exps: List[silver.ast.Exp], terms: List[Term]): List[silver.ast.Exp] = {
138+
exps.zip(terms).filter(t => t._2 != True).map(e => e._1)
139+
}
140+
141+
def simplifyVariableName(str: String) : String = {
142+
str.substring(0, str.lastIndexOf("@"))
143+
}
144+
145+
def replaceVarsInExp(e: silver.ast.Exp, varNames: Seq[String], replacements: Seq[silver.ast.Exp]): silver.ast.Exp = {
146+
silver.utility.Sanitizer.replaceFreeVariablesInExpression(e, varNames.zip(replacements).toMap, Set())
147+
}
148+
149+
def extractPTypeFromStmt(stmt: silver.ast.Stmt): PType = {
150+
stmt.info.getUniqueInfo[SourcePNodeInfo] match {
151+
case Some(info) =>
152+
val sourceNode = info.sourcePNode
153+
sourceNode match {
154+
case decl: PUnnamedTypedDeclaration => decl.typ
155+
case _ => PUnknown()
156+
}
157+
case _ => PUnknown()
158+
}
159+
}
160+
161+
def extractPTypeFromExp(exp: silver.ast.Exp): PType = {
162+
exp.info.getUniqueInfo[SourcePNodeInfo] match {
163+
case Some(info) =>
164+
val sourceNode = info.sourcePNode
165+
sourceNode match {
166+
case e: PExp => e.typ
167+
case d: PUnnamedTypedDeclaration => d.typ
168+
case _ => PUnknown()
169+
}
170+
case _ => PUnknown()
171+
}
172+
}
173+
174+
def buildMinExp(exps: Seq[silver.ast.Exp], typ: silver.ast.Type): silver.ast.Exp = {
175+
exps match {
176+
case Seq(e) => e
177+
case Seq(e0, e1) => silver.ast.DebugPermMin(e0, e1)(e0.pos, e0.info)
178+
case exps if exps.length > 2 => silver.ast.DebugPermMin(exps.head, buildMinExp(exps.tail, typ))(exps.head.pos, exps.head.info)
179+
}
180+
}
181+
182+
def buildQuantExp(quantifier: Quantifier, vars: Seq[silver.ast.LocalVarDecl], eBody: silver.ast.Exp, eTrigger: Seq[silver.ast.Trigger]): silver.ast.Exp = {
183+
quantifier match {
184+
case Forall => silver.ast.Forall(vars, eTrigger, eBody)(eBody.pos, eBody.info, eBody.errT)
185+
case Exists => silver.ast.Exists(vars, eTrigger, eBody)(eBody.pos, eBody.info, eBody.errT)
186+
}
187+
}
188+
189+
134190
/** Note: be aware of Silver issue #95!*/
135191
def rewriteRangeContains(program: silver.ast.Program): silver.ast.Program =
136192
program.transform({
@@ -211,7 +267,7 @@ package object utils {
211267
def toUnambiguousShortString(resource: silver.ast.Resource): String = {
212268
resource match {
213269
case l: silver.ast.Location => l.name
214-
case m: silver.ast.MagicWand => m.toString()
270+
case m: silver.ast.MagicWand => m.toString
215271
case m@silver.ast.MagicWandOp => s"${silver.ast.MagicWandOp.op}@${sourceLineColumn(m)}"
216272
}
217273
}

0 commit comments

Comments
 (0)