Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Consolidating quantified field and predicate chunks #860

Merged
merged 6 commits into from
Sep 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions src/main/scala/interfaces/state/Chunks.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,21 @@ trait GeneralChunk extends Chunk {
val resourceID: ResourceID
val id: ChunkIdentifer
val perm: Term
val permExp: Option[ast.Exp]
def applyCondition(newCond: Term, newCondExp: Option[ast.Exp]): GeneralChunk
def permMinus(perm: Term, permExp: Option[ast.Exp]): GeneralChunk
def permPlus(perm: Term, permExp: Option[ast.Exp]): GeneralChunk

def withPerm(perm: Term, permExp: Option[ast.Exp]): GeneralChunk
val permExp: Option[ast.Exp]
}

trait NonQuantifiedChunk extends GeneralChunk {
val args: Seq[Term]
val argsExp: Option[Seq[ast.Exp]]
val snap: Term
override def withPerm(perm: Term, permExp: Option[ast.Exp]): NonQuantifiedChunk
override def applyCondition(newCond: Term, newCondExp: Option[ast.Exp]): NonQuantifiedChunk
override def permMinus(perm: Term, permExp: Option[ast.Exp]): NonQuantifiedChunk
override def permPlus(perm: Term, permExp: Option[ast.Exp]): NonQuantifiedChunk
def withPerm(perm: Term, permExp: Option[ast.Exp]): NonQuantifiedChunk
def withSnap(snap: Term): NonQuantifiedChunk
}

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

def snapshotMap: Term
def valueAt(arguments: Seq[Term]): Term
override def withPerm(perm: Term, permExp: Option[ast.Exp]): QuantifiedChunk
override def applyCondition(newCond: Term, newCondExp: Option[ast.Exp]): QuantifiedChunk
override def permMinus(perm: Term, permExp: Option[ast.Exp]): QuantifiedChunk
override def permPlus(perm: Term, permExp: Option[ast.Exp]): QuantifiedChunk
def withSnapshotMap(snap: Term): QuantifiedChunk
}
6 changes: 3 additions & 3 deletions src/main/scala/logger/records/data/SingleMergeRecord.scala
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ package viper.silicon.logger.records.data

import viper.silicon.common.collections.immutable.InsertionOrderedSet
import viper.silicon.decider.PathConditionStack
import viper.silicon.interfaces.state.NonQuantifiedChunk
import viper.silicon.interfaces.state.{Chunk, NonQuantifiedChunk}
import viper.silicon.state._
import viper.silicon.state.terms.Term
import viper.silver.ast

class SingleMergeRecord(val destChunks: Seq[NonQuantifiedChunk],
val newChunks: Seq[NonQuantifiedChunk],
class SingleMergeRecord(val destChunks: Seq[Chunk],
val newChunks: Seq[Chunk],
p: PathConditionStack) extends DataRecord {
val value: ast.Node = null
val state: State = null
Expand Down
11 changes: 5 additions & 6 deletions src/main/scala/logger/writer/SymbExLogReportWriter.scala
Original file line number Diff line number Diff line change
Expand Up @@ -58,40 +58,39 @@ object SymbExLogReportWriter {
"perm" -> TermWriter.toJSON(perm)
)

case QuantifiedFieldChunk(id, fvf, perm, _, invs, cond, receiver, _, hints) =>
case QuantifiedFieldChunk(id, fvf, condition, _, perm, _, invs, receiver, _, hints) =>
JsObject(
"type" -> JsString("quantified_field_chunk"),
"field" -> JsString(id.toString),
"field_value_function" -> TermWriter.toJSON(fvf),
"condition" -> TermWriter.toJSON(condition),
"perm" -> TermWriter.toJSON(perm),
"invs" -> invs.map(inverseFunctionsToJSON).getOrElse(JsNull),
"cond" -> cond.map(TermWriter.toJSON).getOrElse(JsNull),
"receiver" -> receiver.map(TermWriter.toJSON).getOrElse(JsNull),
"hints" -> (if (hints.nonEmpty) JsArray(hints.map(TermWriter.toJSON).toVector) else JsNull)
)

case QuantifiedPredicateChunk(id, vars, _, psf, perm, _, invs, cond, singletonArgs, _, hints) =>
case QuantifiedPredicateChunk(id, vars, _, psf, condition, _, perm, _, invs, singletonArgs, _, hints) =>
JsObject(
"type" -> JsString("quantified_predicate_chunk"),
"vars" -> JsArray(vars.map(TermWriter.toJSON).toVector),
"predicate" -> JsString(id.toString),
"predicate_snap_function" -> TermWriter.toJSON(psf),
"condition" -> TermWriter.toJSON(condition),
"perm" -> TermWriter.toJSON(perm),
"invs" -> invs.map(inverseFunctionsToJSON).getOrElse(JsNull),
"cond" -> cond.map(TermWriter.toJSON).getOrElse(JsNull),
"singleton_args" -> singletonArgs.map(as => JsArray(as.map(TermWriter.toJSON).toVector)).getOrElse(JsNull),
"hints" -> (if (hints.nonEmpty) JsArray(hints.map(TermWriter.toJSON).toVector) else JsNull)
)

case QuantifiedMagicWandChunk(id, vars, _, wsf, perm, _, invs, cond, singletonArgs, _, hints) =>
case QuantifiedMagicWandChunk(id, vars, _, wsf, perm, _, invs, singletonArgs, _, hints) =>
JsObject(
"type" -> JsString("quantified_magic_wand_chunk"),
"vars" -> JsArray(vars.map(TermWriter.toJSON).toVector),
"predicate" -> JsString(id.toString),
"wand_snap_function" -> TermWriter.toJSON(wsf),
"perm" -> TermWriter.toJSON(perm),
"invs" -> invs.map(inverseFunctionsToJSON).getOrElse(JsNull),
"cond" -> cond.map(TermWriter.toJSON).getOrElse(JsNull),
"singleton_args" -> singletonArgs.map(as => JsArray(as.map(TermWriter.toJSON).toVector)).getOrElse(JsNull),
"hints" -> (if (hints.nonEmpty) JsArray(hints.map(TermWriter.toJSON).toVector) else JsNull)
)
Expand Down
11 changes: 0 additions & 11 deletions src/main/scala/rules/ChunkSupporter.scala
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,6 @@ trait ChunkSupportRules extends SymbolicExecutionRules {
v: Verifier)
: Option[CH]

def findMatchingChunk[CH <: NonQuantifiedChunk: ClassTag]
(chunks: Iterable[Chunk],
chunk: CH,
v: Verifier)
: Option[CH]

def findChunksWithID[CH <: NonQuantifiedChunk: ClassTag]
(chunks: Iterable[Chunk],
id: ChunkIdentifer)
Expand Down Expand Up @@ -264,11 +258,6 @@ object chunkSupporter extends ChunkSupportRules {
findChunkLiterally(relevantChunks, args) orElse findChunkWithProver(relevantChunks, args, v)
}

def findMatchingChunk[CH <: NonQuantifiedChunk: ClassTag]
(chunks: Iterable[Chunk], chunk: CH, v: Verifier): Option[CH] = {
findChunk[CH](chunks, chunk.id, chunk.args, v)
}

def findChunksWithID[CH <: NonQuantifiedChunk: ClassTag](chunks: Iterable[Chunk], id: ChunkIdentifer): Iterable[CH] = {
chunks.flatMap {
case c: CH if id == c.id => Some(c)
Expand Down
Loading
Loading