Skip to content

Commit 20d8d04

Browse files
authored
Merge pull request #860 from superaxander/qp-consolidation
Consolidating quantified field and predicate chunks
2 parents 31e3a48 + ad19758 commit 20d8d04

8 files changed

Lines changed: 298 additions & 98 deletions

File tree

src/main/scala/interfaces/state/Chunks.scala

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,21 @@ trait GeneralChunk extends Chunk {
1818
val resourceID: ResourceID
1919
val id: ChunkIdentifer
2020
val perm: Term
21-
val permExp: Option[ast.Exp]
21+
def applyCondition(newCond: Term, newCondExp: Option[ast.Exp]): GeneralChunk
22+
def permMinus(perm: Term, permExp: Option[ast.Exp]): GeneralChunk
23+
def permPlus(perm: Term, permExp: Option[ast.Exp]): GeneralChunk
2224

23-
def withPerm(perm: Term, permExp: Option[ast.Exp]): GeneralChunk
25+
val permExp: Option[ast.Exp]
2426
}
2527

2628
trait NonQuantifiedChunk extends GeneralChunk {
2729
val args: Seq[Term]
2830
val argsExp: Option[Seq[ast.Exp]]
2931
val snap: Term
30-
override def withPerm(perm: Term, permExp: Option[ast.Exp]): NonQuantifiedChunk
32+
override def applyCondition(newCond: Term, newCondExp: Option[ast.Exp]): NonQuantifiedChunk
33+
override def permMinus(perm: Term, permExp: Option[ast.Exp]): NonQuantifiedChunk
34+
override def permPlus(perm: Term, permExp: Option[ast.Exp]): NonQuantifiedChunk
35+
def withPerm(perm: Term, permExp: Option[ast.Exp]): NonQuantifiedChunk
3136
def withSnap(snap: Term): NonQuantifiedChunk
3237
}
3338

@@ -37,6 +42,8 @@ trait QuantifiedChunk extends GeneralChunk {
3742

3843
def snapshotMap: Term
3944
def valueAt(arguments: Seq[Term]): Term
40-
override def withPerm(perm: Term, permExp: Option[ast.Exp]): QuantifiedChunk
45+
override def applyCondition(newCond: Term, newCondExp: Option[ast.Exp]): QuantifiedChunk
46+
override def permMinus(perm: Term, permExp: Option[ast.Exp]): QuantifiedChunk
47+
override def permPlus(perm: Term, permExp: Option[ast.Exp]): QuantifiedChunk
4148
def withSnapshotMap(snap: Term): QuantifiedChunk
4249
}

src/main/scala/logger/records/data/SingleMergeRecord.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ package viper.silicon.logger.records.data
88

99
import viper.silicon.common.collections.immutable.InsertionOrderedSet
1010
import viper.silicon.decider.PathConditionStack
11-
import viper.silicon.interfaces.state.NonQuantifiedChunk
11+
import viper.silicon.interfaces.state.{Chunk, NonQuantifiedChunk}
1212
import viper.silicon.state._
1313
import viper.silicon.state.terms.Term
1414
import viper.silver.ast
1515

16-
class SingleMergeRecord(val destChunks: Seq[NonQuantifiedChunk],
17-
val newChunks: Seq[NonQuantifiedChunk],
16+
class SingleMergeRecord(val destChunks: Seq[Chunk],
17+
val newChunks: Seq[Chunk],
1818
p: PathConditionStack) extends DataRecord {
1919
val value: ast.Node = null
2020
val state: State = null

src/main/scala/logger/writer/SymbExLogReportWriter.scala

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,40 +58,39 @@ object SymbExLogReportWriter {
5858
"perm" -> TermWriter.toJSON(perm)
5959
)
6060

61-
case QuantifiedFieldChunk(id, fvf, perm, _, invs, cond, receiver, _, hints) =>
61+
case QuantifiedFieldChunk(id, fvf, condition, _, perm, _, invs, receiver, _, hints) =>
6262
JsObject(
6363
"type" -> JsString("quantified_field_chunk"),
6464
"field" -> JsString(id.toString),
6565
"field_value_function" -> TermWriter.toJSON(fvf),
66+
"condition" -> TermWriter.toJSON(condition),
6667
"perm" -> TermWriter.toJSON(perm),
6768
"invs" -> invs.map(inverseFunctionsToJSON).getOrElse(JsNull),
68-
"cond" -> cond.map(TermWriter.toJSON).getOrElse(JsNull),
6969
"receiver" -> receiver.map(TermWriter.toJSON).getOrElse(JsNull),
7070
"hints" -> (if (hints.nonEmpty) JsArray(hints.map(TermWriter.toJSON).toVector) else JsNull)
7171
)
7272

73-
case QuantifiedPredicateChunk(id, vars, _, psf, perm, _, invs, cond, singletonArgs, _, hints) =>
73+
case QuantifiedPredicateChunk(id, vars, _, psf, condition, _, perm, _, invs, singletonArgs, _, hints) =>
7474
JsObject(
7575
"type" -> JsString("quantified_predicate_chunk"),
7676
"vars" -> JsArray(vars.map(TermWriter.toJSON).toVector),
7777
"predicate" -> JsString(id.toString),
7878
"predicate_snap_function" -> TermWriter.toJSON(psf),
79+
"condition" -> TermWriter.toJSON(condition),
7980
"perm" -> TermWriter.toJSON(perm),
8081
"invs" -> invs.map(inverseFunctionsToJSON).getOrElse(JsNull),
81-
"cond" -> cond.map(TermWriter.toJSON).getOrElse(JsNull),
8282
"singleton_args" -> singletonArgs.map(as => JsArray(as.map(TermWriter.toJSON).toVector)).getOrElse(JsNull),
8383
"hints" -> (if (hints.nonEmpty) JsArray(hints.map(TermWriter.toJSON).toVector) else JsNull)
8484
)
8585

86-
case QuantifiedMagicWandChunk(id, vars, _, wsf, perm, _, invs, cond, singletonArgs, _, hints) =>
86+
case QuantifiedMagicWandChunk(id, vars, _, wsf, perm, _, invs, singletonArgs, _, hints) =>
8787
JsObject(
8888
"type" -> JsString("quantified_magic_wand_chunk"),
8989
"vars" -> JsArray(vars.map(TermWriter.toJSON).toVector),
9090
"predicate" -> JsString(id.toString),
9191
"wand_snap_function" -> TermWriter.toJSON(wsf),
9292
"perm" -> TermWriter.toJSON(perm),
9393
"invs" -> invs.map(inverseFunctionsToJSON).getOrElse(JsNull),
94-
"cond" -> cond.map(TermWriter.toJSON).getOrElse(JsNull),
9594
"singleton_args" -> singletonArgs.map(as => JsArray(as.map(TermWriter.toJSON).toVector)).getOrElse(JsNull),
9695
"hints" -> (if (hints.nonEmpty) JsArray(hints.map(TermWriter.toJSON).toVector) else JsNull)
9796
)

src/main/scala/rules/ChunkSupporter.scala

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,6 @@ trait ChunkSupportRules extends SymbolicExecutionRules {
5656
v: Verifier)
5757
: Option[CH]
5858

59-
def findMatchingChunk[CH <: NonQuantifiedChunk: ClassTag]
60-
(chunks: Iterable[Chunk],
61-
chunk: CH,
62-
v: Verifier)
63-
: Option[CH]
64-
6559
def findChunksWithID[CH <: NonQuantifiedChunk: ClassTag]
6660
(chunks: Iterable[Chunk],
6761
id: ChunkIdentifer)
@@ -264,11 +258,6 @@ object chunkSupporter extends ChunkSupportRules {
264258
findChunkLiterally(relevantChunks, args) orElse findChunkWithProver(relevantChunks, args, v)
265259
}
266260

267-
def findMatchingChunk[CH <: NonQuantifiedChunk: ClassTag]
268-
(chunks: Iterable[Chunk], chunk: CH, v: Verifier): Option[CH] = {
269-
findChunk[CH](chunks, chunk.id, chunk.args, v)
270-
}
271-
272261
def findChunksWithID[CH <: NonQuantifiedChunk: ClassTag](chunks: Iterable[Chunk], id: ChunkIdentifer): Iterable[CH] = {
273262
chunks.flatMap {
274263
case c: CH if id == c.id => Some(c)

0 commit comments

Comments
 (0)