From c76f3967169e7e982204a73f959a636e08a58a66 Mon Sep 17 00:00:00 2001 From: s0mark Date: Tue, 12 Sep 2023 22:01:12 +0200 Subject: [PATCH 01/14] updated stack covering --- .../java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt | 5 +++-- .../main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt index 6e6121c3ae..b976ec889a 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt @@ -166,8 +166,9 @@ fun getXcfaErrorPredicate( fun getPartialOrder(partialOrd: PartialOrd) = PartialOrd> { s1, s2 -> - s1.processes == s2.processes && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes && partialOrd.isLeq( - s1.sGlobal, s2.sGlobal) + s1.processes.size == s2.processes.size && s1.processes.keys.all { pid -> + s2.processes[pid]?.let { s1.processes.getValue(pid).isLeq(it) } ?: false + } && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes && partialOrd.isLeq(s1.sGlobal, s2.sGlobal) } private fun , P : XcfaPrec> getXcfaArgBuilder( diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt index 4527e608b7..064595abdc 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt @@ -301,6 +301,14 @@ data class XcfaProcessState( return true } + fun isLeq(other: XcfaProcessState): Boolean { + if (other.locs.size < this.locs.size) return false + + val stackIsLeq = this.locs.drop(1).reversed().zip(other.locs.reversed()).all { (l1, l2) -> l1 == l2 } + && this.locs.first() == other.locs.first() + return stackIsLeq && this.paramsInitialized == other.paramsInitialized + } + override fun hashCode(): Int { var result = locs.hashCode() result = 31 * result + paramsInitialized.hashCode() // TODO FRICKIN INNER STATE HASH From 6bcc3d23b75715c7ca5dd4bbfcd6cfaafdc7e727 Mon Sep 17 00:00:00 2001 From: s0mark Date: Wed, 13 Sep 2023 20:45:18 +0200 Subject: [PATCH 02/14] instance-insensitive covering between global states --- .../mit/theta/xcfa/analysis/XcfaAnalysis.kt | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt index b976ec889a..51387df015 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt @@ -34,6 +34,8 @@ import hu.bme.mit.theta.common.logging.Logger import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.stmt.Stmts +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.utils.TypeUtils import hu.bme.mit.theta.solver.Solver @@ -164,11 +166,40 @@ fun getXcfaErrorPredicate( ErrorDetection.NO_ERROR, ErrorDetection.OVERFLOW -> Predicate> { false } } +private fun Map.reverseMapping() = this.entries.associate { it.value to it.key } + +private fun valIsLeq(lhs: Map, Optional>>, rhs: Map, Optional>>): Boolean { + val lessVars = if (rhs.keys.size > lhs.keys.size) lhs else rhs + val moreVars = if (rhs.keys.size > lhs.keys.size) rhs else lhs + for (varDecl in lessVars.keys) { + if (lessVars[varDecl] != moreVars[varDecl]) { + return false + } + } + return true +} + fun getPartialOrder(partialOrd: PartialOrd) = PartialOrd> { s1, s2 -> - s1.processes.size == s2.processes.size && s1.processes.keys.all { pid -> + val locIsLeq = s1.processes.size == s2.processes.size && s1.processes.keys.all { pid -> s2.processes[pid]?.let { s1.processes.getValue(pid).isLeq(it) } ?: false - } && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes && partialOrd.isLeq(s1.sGlobal, s2.sGlobal) + } && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes + if (locIsLeq) { + val s1Global = s1.sGlobal + val s2Global = s2.sGlobal + val s1VarLookup = s1.processes[0]?.varLookup?.peek()?.reverseMapping() ?: mapOf() + val s2VarLookup = s2.processes[0]?.varLookup?.peek()?.reverseMapping() ?: mapOf() + if (s1Global is ExplState && s2Global is ExplState) { + val s1Val = s1Global.decls.associate { v -> v.changeVars(s1VarLookup) to s1Global.eval(v) } + val s2Val = s2Global.decls.associate { v -> v.changeVars(s2VarLookup) to s2Global.eval(v) } + valIsLeq(s1Val, s2Val) + } else if (s1Global is PredState && s2Global is PredState) { + val s1Translated = PredState.of(s1Global.preds.map { p -> p.changeVars(s1VarLookup) }) + val s2Translated = PredState.of(s2Global.preds.map { p -> p.changeVars(s2VarLookup) }) + partialOrd.isLeq(s1Translated as S, s2Translated as S) + } else + partialOrd.isLeq(s1.sGlobal, s2.sGlobal) + } else false } private fun , P : XcfaPrec> getXcfaArgBuilder( From 46c64024f4f5df2acbce052f14a72d8a53cf47b0 Mon Sep 17 00:00:00 2001 From: s0mark Date: Mon, 18 Sep 2023 12:07:19 +0200 Subject: [PATCH 03/14] pop top location when stack covers --- .../algorithm/cegar/BasicAbstractor.java | 20 +++---- .../mit/theta/xcfa/analysis/XcfaAbstractor.kt | 53 +++++++++++++++++++ .../mit/theta/xcfa/analysis/XcfaAnalysis.kt | 20 +++---- .../theta/xcfa/passes/ProcedurePassManager.kt | 2 +- 4 files changed, 74 insertions(+), 21 deletions(-) create mode 100644 subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/BasicAbstractor.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/BasicAbstractor.java index b4785eeb81..3ef23ed6ca 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/BasicAbstractor.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/BasicAbstractor.java @@ -41,7 +41,7 @@ /** * Basic implementation for the abstractor, relying on an ArgBuilder. */ -public final class BasicAbstractor implements Abstractor { +public class BasicAbstractor implements Abstractor { private final ArgBuilder argBuilder; private final Function projection; @@ -49,7 +49,7 @@ public final class BasicAbstractor stopCriterion; private final Logger logger; - private BasicAbstractor(final ArgBuilder argBuilder, final Function projection, + protected BasicAbstractor(final ArgBuilder argBuilder, final Function projection, final Waitlist> waitlist, final StopCriterion stopCriterion, final Logger logger) { this.argBuilder = checkNotNull(argBuilder); this.projection = checkNotNull(projection); @@ -122,7 +122,7 @@ public AbstractorResult check(final ARG arg, final P prec) { } } - private void close(final ArgNode node, final Collection> candidates) { + protected void close(final ArgNode node, final Collection> candidates) { if (!node.isLeaf()) { return; } @@ -139,14 +139,14 @@ public String toString() { return Utils.lispStringBuilder(getClass().getSimpleName()).add(waitlist).toString(); } - public static final class Builder { - private final ArgBuilder argBuilder; - private Function projection; - private Waitlist> waitlist; - private StopCriterion stopCriterion; - private Logger logger; + public static class Builder { + protected final ArgBuilder argBuilder; + protected Function projection; + protected Waitlist> waitlist; + protected StopCriterion stopCriterion; + protected Logger logger; - private Builder(final ArgBuilder argBuilder) { + protected Builder(final ArgBuilder argBuilder) { this.argBuilder = argBuilder; this.projection = s -> 0; this.waitlist = FifoWaitlist.create(); diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt new file mode 100644 index 0000000000..469e8baba4 --- /dev/null +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt @@ -0,0 +1,53 @@ +package hu.bme.mit.theta.xcfa.analysis + +import hu.bme.mit.theta.analysis.Action +import hu.bme.mit.theta.analysis.Prec +import hu.bme.mit.theta.analysis.State +import hu.bme.mit.theta.analysis.algorithm.ArgBuilder +import hu.bme.mit.theta.analysis.algorithm.ArgNode +import hu.bme.mit.theta.analysis.algorithm.cegar.BasicAbstractor +import hu.bme.mit.theta.analysis.algorithm.cegar.abstractor.StopCriterion +import hu.bme.mit.theta.analysis.waitlist.Waitlist +import hu.bme.mit.theta.common.logging.Logger +import java.util.function.Function + +class XcfaAbstractor( + argBuilder: ArgBuilder, + projection: Function?, + waitlist: Waitlist>, + stopCriterion: StopCriterion, + logger: Logger, +) : BasicAbstractor(argBuilder, projection, waitlist, stopCriterion, logger) { + + override fun close(node: ArgNode, candidates: Collection>) { + if (!node.isLeaf) { + return + } + for (candidate in candidates) { + if (candidate.mayCover(node)) { + var popped = false + (node.state as XcfaState<*>).processes.forEach { (pid: Int?, proc: XcfaProcessState) -> + if (proc != (candidate.state as XcfaState<*>).processes[pid]) { + proc.locs.pop() + popped = true + } + } + if (!popped) node.cover(candidate) + return + } + } + } + + companion object{ + fun builder(argBuilder: ArgBuilder): BasicAbstractor.Builder { + return Builder(argBuilder) + } + } + + class Builder(argBuilder: ArgBuilder) + : BasicAbstractor.Builder(argBuilder) { + override fun build(): BasicAbstractor { + return XcfaAbstractor(argBuilder, projection, waitlist, stopCriterion, logger) + } + } +} diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt index 51387df015..5a96e99410 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt @@ -20,7 +20,6 @@ import hu.bme.mit.theta.analysis.* import hu.bme.mit.theta.analysis.algorithm.ArgBuilder import hu.bme.mit.theta.analysis.algorithm.ArgNode import hu.bme.mit.theta.analysis.algorithm.cegar.Abstractor -import hu.bme.mit.theta.analysis.algorithm.cegar.BasicAbstractor import hu.bme.mit.theta.analysis.algorithm.cegar.abstractor.StopCriterion import hu.bme.mit.theta.analysis.expl.ExplInitFunc import hu.bme.mit.theta.analysis.expl.ExplPrec @@ -168,11 +167,14 @@ fun getXcfaErrorPredicate( private fun Map.reverseMapping() = this.entries.associate { it.value to it.key } -private fun valIsLeq(lhs: Map, Optional>>, rhs: Map, Optional>>): Boolean { - val lessVars = if (rhs.keys.size > lhs.keys.size) lhs else rhs - val moreVars = if (rhs.keys.size > lhs.keys.size) rhs else lhs - for (varDecl in lessVars.keys) { - if (lessVars[varDecl] != moreVars[varDecl]) { +fun stackIsLeq(s1: XcfaState, s2: XcfaState) = s2.processes.keys.all { pid -> + s1.processes[pid]?.let { s2.processes.getValue(pid).isLeq(it) } ?: false +} + +private fun valIsLeq(val1: Map, Optional>>, val2: Map, Optional>>): Boolean { + if (val2.size > val1.size) return false + for (varDecl in val2.keys) { + if (val1[varDecl] != val2[varDecl]) { return false } } @@ -181,9 +183,7 @@ private fun valIsLeq(lhs: Map, Optional> fun getPartialOrder(partialOrd: PartialOrd) = PartialOrd> { s1, s2 -> - val locIsLeq = s1.processes.size == s2.processes.size && s1.processes.keys.all { pid -> - s2.processes[pid]?.let { s1.processes.getValue(pid).isLeq(it) } ?: false - } && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes + val locIsLeq = s1.processes.size == s2.processes.size && stackIsLeq(s1, s2) && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes if (locIsLeq) { val s1Global = s1.sGlobal val s2Global = s2.sGlobal @@ -221,7 +221,7 @@ fun , P : XcfaPrec> getXcfaAbstractor( lts: LTS, XcfaAction>, errorDetection: ErrorDetection ): Abstractor, XcfaAction, out XcfaPrec> = - BasicAbstractor.builder(getXcfaArgBuilder(analysis, lts, errorDetection)) + XcfaAbstractor.builder(getXcfaArgBuilder(analysis, lts, errorDetection)) .waitlist(waitlist as Waitlist>) // TODO: can we do this nicely? .stopCriterion(stopCriterion as StopCriterion).logger(logger) .build() // TODO: can we do this nicely? diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/ProcedurePassManager.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/ProcedurePassManager.kt index 65370c72e6..4814128119 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/ProcedurePassManager.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/ProcedurePassManager.kt @@ -36,7 +36,7 @@ class CPasses(checkOverflow: Boolean, parseContext: ParseContext) : ProcedurePas FpFunctionsToExprsPass(parseContext), PthreadFunctionsPass(parseContext), // trying to inline procedures - InlineProceduresPass(parseContext), +// InlineProceduresPass(parseContext), RemoveDeadEnds(parseContext), EliminateSelfLoops(parseContext), // handling remaining function calls From a8ff9ce191368ad6ef7382b1bf1cc4e203e5d5be Mon Sep 17 00:00:00 2001 From: s0mark Date: Fri, 29 Sep 2023 16:30:54 +0200 Subject: [PATCH 04/14] handle cex with abstracted call --- .../algorithm/cegar/BasicAbstractor.java | 10 +- .../refinement/SingleExprTraceRefiner.java | 16 ++-- .../mit/theta/xcfa/analysis/XcfaAbstractor.kt | 80 ++++++++++++++-- .../bme/mit/theta/xcfa/analysis/XcfaPrec.kt | 2 +- .../analysis/XcfaSingeExprTraceRefiner.kt | 95 +++++++++++++++++++ .../bme/mit/theta/xcfa/analysis/XcfaState.kt | 3 +- .../xcfa/analysis/XcfaExplAnalysisTest.kt | 10 +- .../bme/mit/theta/xcfa/cli/XcfaCegarConfig.kt | 5 +- 8 files changed, 192 insertions(+), 29 deletions(-) create mode 100644 subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/BasicAbstractor.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/BasicAbstractor.java index 3ef23ed6ca..71f3d529ab 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/BasicAbstractor.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/BasicAbstractor.java @@ -43,11 +43,11 @@ */ public class BasicAbstractor implements Abstractor { - private final ArgBuilder argBuilder; - private final Function projection; - private final Waitlist> waitlist; - private final StopCriterion stopCriterion; - private final Logger logger; + protected final ArgBuilder argBuilder; + protected final Function projection; + protected final Waitlist> waitlist; + protected final StopCriterion stopCriterion; + protected final Logger logger; protected BasicAbstractor(final ArgBuilder argBuilder, final Function projection, final Waitlist> waitlist, final StopCriterion stopCriterion, final Logger logger) { diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/expr/refinement/SingleExprTraceRefiner.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/expr/refinement/SingleExprTraceRefiner.java index 595f838ff6..f95cfbacc6 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/expr/refinement/SingleExprTraceRefiner.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/expr/refinement/SingleExprTraceRefiner.java @@ -36,15 +36,15 @@ * A Refiner implementation that can refine a single trace (of ExprStates and * ExprActions) using an ExprTraceChecker and a PrecRefiner. */ -public final class SingleExprTraceRefiner +public class SingleExprTraceRefiner implements Refiner { - private final ExprTraceChecker exprTraceChecker; - private final PrecRefiner precRefiner; - private final PruneStrategy pruneStrategy; - private final NodePruner nodePruner; - private final Logger logger; + protected final ExprTraceChecker exprTraceChecker; + protected final PrecRefiner precRefiner; + protected final PruneStrategy pruneStrategy; + protected final NodePruner nodePruner; + protected final Logger logger; - private SingleExprTraceRefiner(final ExprTraceChecker exprTraceChecker, + protected SingleExprTraceRefiner(final ExprTraceChecker exprTraceChecker, final PrecRefiner precRefiner, final PruneStrategy pruneStrategy, final Logger logger) { this.exprTraceChecker = checkNotNull(exprTraceChecker); @@ -54,7 +54,7 @@ private SingleExprTraceRefiner(final ExprTraceChecker exprTraceChecker, this.logger = checkNotNull(logger); } - private SingleExprTraceRefiner(final ExprTraceChecker exprTraceChecker, + protected SingleExprTraceRefiner(final ExprTraceChecker exprTraceChecker, final PrecRefiner precRefiner, final PruneStrategy pruneStrategy, final Logger logger, final NodePruner nodePruner) { diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt index 469e8baba4..4c51594019 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt @@ -1,12 +1,16 @@ package hu.bme.mit.theta.xcfa.analysis +import com.google.common.base.Preconditions import hu.bme.mit.theta.analysis.Action import hu.bme.mit.theta.analysis.Prec import hu.bme.mit.theta.analysis.State +import hu.bme.mit.theta.analysis.algorithm.ARG import hu.bme.mit.theta.analysis.algorithm.ArgBuilder import hu.bme.mit.theta.analysis.algorithm.ArgNode +import hu.bme.mit.theta.analysis.algorithm.cegar.AbstractorResult import hu.bme.mit.theta.analysis.algorithm.cegar.BasicAbstractor import hu.bme.mit.theta.analysis.algorithm.cegar.abstractor.StopCriterion +import hu.bme.mit.theta.analysis.reachedset.Partition import hu.bme.mit.theta.analysis.waitlist.Waitlist import hu.bme.mit.theta.common.logging.Logger import java.util.function.Function @@ -19,21 +23,83 @@ class XcfaAbstractor( logger: Logger, ) : BasicAbstractor(argBuilder, projection, waitlist, stopCriterion, logger) { - override fun close(node: ArgNode, candidates: Collection>) { + override fun check(arg: ARG, prec: P): AbstractorResult { + logger.write(Logger.Level.DETAIL, "| | Precision: %s%n", prec) + + if (!arg.isInitialized) { + logger.write(Logger.Level.SUBSTEP, "| | (Re)initializing ARG...") + argBuilder.init(arg, prec) + logger.write(Logger.Level.SUBSTEP, "done%n") + } + + assert(arg.isInitialized) + + logger.write( + Logger.Level.INFO, "| | Starting ARG: %d nodes, %d incomplete, %d unsafe%n", arg.nodes.count(), + arg.incompleteNodes.count(), arg.unsafeNodes.count() + ) + logger.write(Logger.Level.SUBSTEP, "| | Building ARG...") + + val reachedSet: Partition, *> = Partition.of { n: ArgNode -> + projection.apply(n.state) + } + waitlist.clear() + + reachedSet.addAll(arg.nodes) + waitlist.addAll(arg.incompleteNodes) + + if (!stopCriterion.canStop(arg)) { + while (!waitlist.isEmpty) { + val node = waitlist.remove() + var newNodes: Collection>? = emptyList() + val expandProcedureCall = (node.state as XcfaState<*>) in (prec as XcfaPrec

).noPop + close(node, reachedSet[node], !expandProcedureCall) + if (!node.isSubsumed && !node.isTarget) { + newNodes = argBuilder.expand(node, prec) + reachedSet.addAll(newNodes) + waitlist.addAll(newNodes) + } + if (stopCriterion.canStop(arg, newNodes)) break + } + } + + logger.write(Logger.Level.SUBSTEP, "done%n") + logger.write( + Logger.Level.INFO, "| | Finished ARG: %d nodes, %d incomplete, %d unsafe%n", arg.nodes.count(), + arg.incompleteNodes.count(), arg.unsafeNodes.count() + ) + + waitlist.clear() // Optimization + + + return if (arg.isSafe) { + Preconditions.checkState(arg.isComplete, "Returning incomplete ARG as safe") + AbstractorResult.safe() + } else { + AbstractorResult.unsafe() + } + } + + override fun close(node: ArgNode, candidates: MutableCollection>) + = close(node, candidates, true) + + fun close(node: ArgNode, candidates: Collection>, popCovered: Boolean) { if (!node.isLeaf) { return } for (candidate in candidates) { if (candidate.mayCover(node)) { - var popped = false - (node.state as XcfaState<*>).processes.forEach { (pid: Int?, proc: XcfaProcessState) -> + var onlyStackCovers = false + (node.state as XcfaState<*>).processes.forEach { (pid: Int, proc: XcfaProcessState) -> if (proc != (candidate.state as XcfaState<*>).processes[pid]) { - proc.locs.pop() - popped = true + if (popCovered) proc.popped = proc.locs.pop() + onlyStackCovers = true } } - if (!popped) node.cover(candidate) - return + if (!onlyStackCovers) { + node.cover(candidate) + return + } } } } diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaPrec.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaPrec.kt index c912925c73..b267bf5f51 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaPrec.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaPrec.kt @@ -19,7 +19,7 @@ package hu.bme.mit.theta.xcfa.analysis import hu.bme.mit.theta.analysis.Prec import hu.bme.mit.theta.core.decl.VarDecl -data class XcfaPrec

(val p: P) : Prec { +data class XcfaPrec

(val p: P, val noPop: MutableList> = mutableListOf()) : Prec { override fun getUsedVars(): Collection> { return p.usedVars diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt new file mode 100644 index 0000000000..77197b919e --- /dev/null +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt @@ -0,0 +1,95 @@ +package hu.bme.mit.theta.xcfa.analysis + +import com.google.common.base.Preconditions +import hu.bme.mit.theta.analysis.Prec +import hu.bme.mit.theta.analysis.Trace +import hu.bme.mit.theta.analysis.algorithm.ARG +import hu.bme.mit.theta.analysis.algorithm.cegar.RefinerResult +import hu.bme.mit.theta.analysis.expr.ExprAction +import hu.bme.mit.theta.analysis.expr.ExprState +import hu.bme.mit.theta.analysis.expr.refinement.* +import hu.bme.mit.theta.common.logging.Logger +import java.util.LinkedList + + +class XcfaSingleExprTraceRefiner : + SingleExprTraceRefiner { + private constructor( + exprTraceChecker: ExprTraceChecker, + precRefiner: PrecRefiner, + pruneStrategy: PruneStrategy, + logger: Logger + ) : super(exprTraceChecker, precRefiner, pruneStrategy, logger) + + private constructor( + exprTraceChecker: ExprTraceChecker, + precRefiner: PrecRefiner, + pruneStrategy: PruneStrategy, + logger: Logger, + nodePruner: NodePruner + ) : super(exprTraceChecker, precRefiner, pruneStrategy, logger, nodePruner) + + private fun getAbstractedProcedureState(trace: Trace): Pair>? { + trace.states.forEachIndexed { i, s -> + val state = s as XcfaState + state.processes.entries.find { (_, processState) -> processState.popped != null }?.let { (pid, processState) -> + val stackBeforePop = LinkedList(processState.locs) + stackBeforePop.push(processState.popped) + val processesBeforePop = state.processes.toMutableMap() + processesBeforePop[pid] = processState.copy(locs = stackBeforePop) + val stateBeforePop = state.copy(processes = processesBeforePop) + return Pair(i, stateBeforePop) + } + } + return null + } + + override fun refine(arg: ARG, prec: P?): RefinerResult { + Preconditions.checkNotNull(arg) + Preconditions.checkNotNull

(prec) + assert(!arg.isSafe) { "ARG must be unsafe" } + + // TODO use CexMonitor lastCex somehow? + // TODO and maybe later smarten ArgTrace up a bit so monitor does not have to explicitly be here? + val optionalNewCex = arg.cexs.findFirst() //filter(cex -> ArgCexCheckHandler.instance.checkIfCounterexampleNew(cex)).findFirst(); + val cexToConcretize = optionalNewCex.get() + val traceToConcretize = cexToConcretize.toTrace() + + return getAbstractedProcedureState(traceToConcretize)?.let { (i, state) -> + when (pruneStrategy) { + PruneStrategy.LAZY -> { + logger.write(Logger.Level.SUBSTEP, "| | Pruning from index %d...", i) + val nodeToPrune = cexToConcretize.node(i) + nodePruner.prune(arg, nodeToPrune) + } + + PruneStrategy.FULL -> { + logger.write(Logger.Level.SUBSTEP, "| | Pruning whole ARG", i) + arg.pruneAll() + } + + else -> throw UnsupportedOperationException("Unsupported pruning strategy") + } + + val refinedPrec = (prec as XcfaPrec

).copy() + refinedPrec.noPop.add(state) + RefinerResult.spurious(refinedPrec as P?) + } ?: super.refine(arg, prec) + } + + companion object { + fun create( + exprTraceChecker: ExprTraceChecker, precRefiner: PrecRefiner, + pruneStrategy: PruneStrategy, logger: Logger + ): XcfaSingleExprTraceRefiner { + return XcfaSingleExprTraceRefiner(exprTraceChecker, precRefiner, pruneStrategy, logger) + } + + fun create( + exprTraceChecker: ExprTraceChecker, precRefiner: PrecRefiner, + pruneStrategy: PruneStrategy, logger: Logger, nodePruner: NodePruner + ): XcfaSingleExprTraceRefiner { + return XcfaSingleExprTraceRefiner(exprTraceChecker, precRefiner, pruneStrategy, logger, nodePruner) + } + } +} diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt index 064595abdc..8ea598d9d0 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt @@ -235,6 +235,7 @@ data class XcfaProcessState( val paramsInitialized: Boolean = false, val prefix: String = "" ) { + var popped: XcfaLocation? = null fun withNewLoc(l: XcfaLocation): XcfaProcessState { val deque: LinkedList = LinkedList(locs) @@ -306,7 +307,7 @@ data class XcfaProcessState( val stackIsLeq = this.locs.drop(1).reversed().zip(other.locs.reversed()).all { (l1, l2) -> l1 == l2 } && this.locs.first() == other.locs.first() - return stackIsLeq && this.paramsInitialized == other.paramsInitialized + return stackIsLeq && this.paramsInitialized && other.paramsInitialized } override fun hashCode(): Int { diff --git a/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaExplAnalysisTest.kt b/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaExplAnalysisTest.kt index 769a6d5845..79f9967637 100644 --- a/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaExplAnalysisTest.kt +++ b/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaExplAnalysisTest.kt @@ -86,7 +86,7 @@ class XcfaExplAnalysisTest { val precRefiner = XcfaPrecRefiner, ExplPrec, ItpRefutation>(ItpRefToExplPrec()) val refiner = - SingleExprTraceRefiner.create( + XcfaSingleExprTraceRefiner.create( ExprTraceBwBinItpChecker.create(BoolExprs.True(), BoolExprs.True(), Z3SolverFactory.getInstance().createItpSolver()), precRefiner, PruneStrategy.FULL, @@ -129,7 +129,7 @@ class XcfaExplAnalysisTest { val precRefiner = XcfaPrecRefiner, ExplPrec, ItpRefutation>(ItpRefToExplPrec()) val refiner = - SingleExprTraceRefiner.create( + XcfaSingleExprTraceRefiner.create( ExprTraceBwBinItpChecker.create(BoolExprs.True(), BoolExprs.True(), Z3SolverFactory.getInstance().createItpSolver()), precRefiner, PruneStrategy.FULL, @@ -172,7 +172,7 @@ class XcfaExplAnalysisTest { val precRefiner = XcfaPrecRefiner, ExplPrec, ItpRefutation>(ItpRefToExplPrec()) val refiner = - SingleExprTraceRefiner.create( + XcfaSingleExprTraceRefiner.create( ExprTraceBwBinItpChecker.create(BoolExprs.True(), BoolExprs.True(), Z3SolverFactory.getInstance().createItpSolver()), precRefiner, PruneStrategy.FULL, @@ -216,7 +216,7 @@ class XcfaExplAnalysisTest { val atomicNodePruner = AtomicNodePruner, XcfaAction>() val refiner = - SingleExprTraceRefiner.create( + XcfaSingleExprTraceRefiner.create( ExprTraceBwBinItpChecker.create(BoolExprs.True(), BoolExprs.True(), Z3SolverFactory.getInstance().createItpSolver()), precRefiner, PruneStrategy.FULL, NullLogger.getInstance(), @@ -259,7 +259,7 @@ class XcfaExplAnalysisTest { val precRefiner = XcfaPrecRefiner(ItpRefToExplPrec()) val refiner = - SingleExprTraceRefiner.create( + XcfaSingleExprTraceRefiner.create( ExprTraceBwBinItpChecker.create(BoolExprs.True(), BoolExprs.True(), Z3SolverFactory.getInstance().createItpSolver()), precRefiner, PruneStrategy.FULL, diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarConfig.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarConfig.kt index fc9e1363f2..87246bfdef 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarConfig.kt +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarConfig.kt @@ -46,6 +46,7 @@ import hu.bme.mit.theta.xcfa.analysis.ErrorDetection import hu.bme.mit.theta.xcfa.analysis.XcfaAction import hu.bme.mit.theta.xcfa.analysis.XcfaState import hu.bme.mit.theta.xcfa.analysis.por.XcfaDporLts +import hu.bme.mit.theta.xcfa.analysis.XcfaSingleExprTraceRefiner import hu.bme.mit.theta.xcfa.model.XCFA import java.io.BufferedReader import java.io.File @@ -152,10 +153,10 @@ data class XcfaCegarConfig( MultiExprTraceRefiner.create(ref, precRefiner, pruneStrategy, logger) else if (porLevel == POR.AASPOR) - SingleExprTraceRefiner.create(ref, precRefiner, pruneStrategy, logger, + XcfaSingleExprTraceRefiner.create(ref, precRefiner, pruneStrategy, logger, atomicNodePruner) else - SingleExprTraceRefiner.create(ref, precRefiner, pruneStrategy, logger) + XcfaSingleExprTraceRefiner.create(ref, precRefiner, pruneStrategy, logger) /* // set up stopping analysis if it is stuck on same ARGs and precisions From c37a97870a88260047ea97f64316ec37f30cec59 Mon Sep 17 00:00:00 2001 From: s0mark Date: Wed, 11 Oct 2023 21:22:15 +0200 Subject: [PATCH 05/14] changed precision proc params to instances --- .../mit/theta/xcfa/analysis/XcfaPrecRefiner.kt | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaPrecRefiner.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaPrecRefiner.kt index 48a4df6a05..6c3039d55d 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaPrecRefiner.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaPrecRefiner.kt @@ -41,18 +41,9 @@ class XcfaPrecRefiner(refToPrec: Refuta Preconditions.checkNotNull(refutation) var runningPrec: P = prec.p for (i in trace.states.indices) { - val reverseLookup = trace.states[i].processes.values.map { - it.varLookup.map { - it.map { - Pair(it.value, it.key) - } - }.flatten() - }.flatten().toMap() - val additionalLookup = if (i > 0) getTempLookup( - trace.actions[i - 1].edge.label).entries.associateBy( - { it.value }) { it.key } else emptyMap() - val precFromRef = refToPrec.toPrec(refutation, i) - .changeVars(reverseLookup + additionalLookup) + val tempLookup = if (i > 0) getTempLookup(trace.actions[i - 1].edge.label).entries + .associateBy({ it.value }) { it.key } else emptyMap() + val precFromRef = refToPrec.toPrec(refutation, i).changeVars(tempLookup) runningPrec = refToPrec.join(runningPrec, precFromRef) } return prec.refine(runningPrec) From 26477702a9c5dfe1192b13c3c7d51ce180eb4927 Mon Sep 17 00:00:00 2001 From: s0mark Date: Wed, 11 Oct 2023 21:25:06 +0200 Subject: [PATCH 06/14] fixed stack covering refinement --- .../java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt | 2 +- .../mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt index 4c51594019..bf937f59c4 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt @@ -98,8 +98,8 @@ class XcfaAbstractor( } if (!onlyStackCovers) { node.cover(candidate) - return } + return } } } diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt index 77197b919e..a02d4539c7 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt @@ -55,7 +55,9 @@ class XcfaSingleExprTraceRefiner + val refinerResult = super.refine(arg, prec) + + return if (refinerResult.isUnsafe) getAbstractedProcedureState(traceToConcretize)?.let { (i, state) -> when (pruneStrategy) { PruneStrategy.LAZY -> { logger.write(Logger.Level.SUBSTEP, "| | Pruning from index %d...", i) @@ -74,7 +76,7 @@ class XcfaSingleExprTraceRefiner).copy() refinedPrec.noPop.add(state) RefinerResult.spurious(refinedPrec as P?) - } ?: super.refine(arg, prec) + } ?: refinerResult else refinerResult } companion object { From a4799e38b8f73a2d4c34b7addd9fb76efe6093f4 Mon Sep 17 00:00:00 2001 From: s0mark Date: Wed, 11 Oct 2023 21:26:00 +0200 Subject: [PATCH 07/14] limited projection to top locations --- .../main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt index e4b3959fcb..ff8efdbb58 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt @@ -224,7 +224,7 @@ fun , P : XcfaPrec> getXcfaAbstractor( XcfaAbstractor.builder(getXcfaArgBuilder(analysis, lts, errorDetection)) .waitlist(waitlist as Waitlist>) // TODO: can we do this nicely? .stopCriterion(stopCriterion as StopCriterion).logger(logger) - .projection { it.processes } + .projection { it.processes.map { (_, p) -> p.locs.peek() } } .build() // TODO: can we do this nicely? /// EXPL From 0928025100d5bfc06f8b33dacd687b2b2d76fda6 Mon Sep 17 00:00:00 2001 From: s0mark Date: Mon, 13 Nov 2023 21:08:24 +0100 Subject: [PATCH 08/14] extracted partial order with stacks --- .../mit/theta/xcfa/analysis/XcfaAnalysis.kt | 70 ++++++++++--------- .../bme/mit/theta/xcfa/analysis/XcfaState.kt | 8 --- 2 files changed, 36 insertions(+), 42 deletions(-) diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt index ff8efdbb58..4f54f2cc64 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt @@ -30,11 +30,12 @@ import hu.bme.mit.theta.analysis.pred.* import hu.bme.mit.theta.analysis.pred.PredAbstractors.PredAbstractor import hu.bme.mit.theta.analysis.waitlist.Waitlist import hu.bme.mit.theta.common.logging.Logger +import hu.bme.mit.theta.core.decl.Decl import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.decl.VarDecl +import hu.bme.mit.theta.core.model.ImmutableValuation +import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.stmt.Stmts -import hu.bme.mit.theta.core.type.LitExpr -import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.utils.TypeUtils import hu.bme.mit.theta.solver.Solver @@ -167,46 +168,47 @@ fun getXcfaErrorPredicate( private fun Map.reverseMapping() = this.entries.associate { it.value to it.key } -fun stackIsLeq(s1: XcfaState, s2: XcfaState) = s2.processes.keys.all { pid -> - s1.processes[pid]?.let { s2.processes.getValue(pid).isLeq(it) } ?: false +private fun stackIsLeq(s1: XcfaState, s2: XcfaState) = s2.processes.keys.all { pid -> + s1.processes[pid]?.let { ps1 -> + val ps2 = s2.processes.getValue(pid) + ps1.locs.peek() == ps2.locs.peek() && ps1.paramsInitialized && ps2.paramsInitialized + } ?: false } -private fun valIsLeq(val1: Map, Optional>>, val2: Map, Optional>>): Boolean { - if (val2.size > val1.size) return false - for (varDecl in val2.keys) { - if (val1[varDecl] != val2[varDecl]) { - return false - } +private fun Valuation.changeVars(varLut: Map, VarDecl<*>>): Valuation { + val builder = ImmutableValuation.builder() + for (decl in this.decls) { + builder.put(decl.changeVars(varLut), this.eval(decl).get()) } - return true + return builder.build() +} + +private fun XcfaState.withGeneralizedVarInstances(): S { + val varLookup = processes.mapNotNull { (_, process) -> process.varLookup.peek()?.reverseMapping() } + .reduceOrNull(Map, VarDecl<*>>::plus) ?: mapOf() + return when (sGlobal) { + is ExplState -> ExplState.of(sGlobal.getVal().changeVars(varLookup)) + is PredState -> PredState.of(sGlobal.preds.map { p -> p.changeVars(varLookup) }) + else -> throw NotImplementedError("Generalizing variable instances is not implemented for data states that are not explicit or predicate.") + } as S } fun getPartialOrder(partialOrd: PartialOrd) = PartialOrd> { s1, s2 -> - val locIsLeq = s1.processes.size == s2.processes.size && stackIsLeq(s1, s2) && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes - if (locIsLeq) { - val s1Global = s1.sGlobal - val s2Global = s2.sGlobal - val s1VarLookup = s1.processes[0]?.varLookup?.peek()?.reverseMapping() ?: mapOf() - val s2VarLookup = s2.processes[0]?.varLookup?.peek()?.reverseMapping() ?: mapOf() - if (s1Global is ExplState && s2Global is ExplState) { - val s1Val = s1Global.decls.associate { v -> v.changeVars(s1VarLookup) to s1Global.eval(v) } - val s2Val = s2Global.decls.associate { v -> v.changeVars(s2VarLookup) to s2Global.eval(v) } - valIsLeq(s1Val, s2Val) - } else if (s1Global is PredState && s2Global is PredState) { - val s1Translated = PredState.of(s1Global.preds.map { p -> p.changeVars(s1VarLookup) }) - val s2Translated = PredState.of(s2Global.preds.map { p -> p.changeVars(s2VarLookup) }) - partialOrd.isLeq(s1Translated as S, s2Translated as S) - } else - partialOrd.isLeq(s1.sGlobal, s2.sGlobal) - } else false + s1.processes == s2.processes && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes && partialOrd.isLeq(s1.sGlobal, s2.sGlobal) + } + +fun getStackPartialOrder(partialOrd: PartialOrd) = + PartialOrd> { s1, s2 -> + s1.processes.size == s2.processes.size && stackIsLeq(s1, s2) && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes + && partialOrd.isLeq(s1.withGeneralizedVarInstances(), s2.withGeneralizedVarInstances()) } private fun , P : XcfaPrec> getXcfaArgBuilder( analysis: Analysis, lts: LTS, XcfaAction>, errorDetection: ErrorDetection) - : ArgBuilder = + : ArgBuilder = ArgBuilder.create( lts, analysis, @@ -230,7 +232,7 @@ fun , P : XcfaPrec> getXcfaAbstractor( /// EXPL private fun getExplXcfaInitFunc(xcfa: XCFA, - solver: Solver): (XcfaPrec) -> List> { + solver: Solver): (XcfaPrec) -> List> { val processInitState = xcfa.initProcedures.mapIndexed { i, it -> val initLocStack: LinkedList = LinkedList() initLocStack.add(it.first.initLoc) @@ -244,7 +246,7 @@ private fun getExplXcfaInitFunc(xcfa: XCFA, } private fun getExplXcfaTransFunc(solver: Solver, - maxEnum: Int): (XcfaState, XcfaAction, XcfaPrec) -> List> { + maxEnum: Int): (XcfaState, XcfaAction, XcfaPrec) -> List> { val explTransFunc = ExplStmtTransFunc.create(solver, maxEnum) return { s, a, p -> val (newSt, newAct) = s.apply(a) @@ -255,7 +257,7 @@ private fun getExplXcfaTransFunc(solver: Solver, } class ExplXcfaAnalysis(xcfa: XCFA, solver: Solver, maxEnum: Int, - partialOrd: PartialOrd>) : XcfaAnalysis( + partialOrd: PartialOrd>) : XcfaAnalysis( corePartialOrd = partialOrd, coreInitFunc = getExplXcfaInitFunc(xcfa, solver), coreTransFunc = getExplXcfaTransFunc(solver, maxEnum) @@ -264,7 +266,7 @@ class ExplXcfaAnalysis(xcfa: XCFA, solver: Solver, maxEnum: Int, /// PRED private fun getPredXcfaInitFunc(xcfa: XCFA, - predAbstractor: PredAbstractor): (XcfaPrec) -> List> { + predAbstractor: PredAbstractor): (XcfaPrec) -> List> { val processInitState = xcfa.initProcedures.mapIndexed { i, it -> val initLocStack: LinkedList = LinkedList() initLocStack.add(it.first.initLoc) @@ -289,7 +291,7 @@ private fun getPredXcfaTransFunc( } class PredXcfaAnalysis(xcfa: XCFA, solver: Solver, predAbstractor: PredAbstractor, - partialOrd: PartialOrd>) : XcfaAnalysis( + partialOrd: PartialOrd>) : XcfaAnalysis( corePartialOrd = partialOrd, coreInitFunc = getPredXcfaInitFunc(xcfa, predAbstractor), coreTransFunc = getPredXcfaTransFunc(predAbstractor) diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt index 8ea598d9d0..f151c656bf 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt @@ -302,14 +302,6 @@ data class XcfaProcessState( return true } - fun isLeq(other: XcfaProcessState): Boolean { - if (other.locs.size < this.locs.size) return false - - val stackIsLeq = this.locs.drop(1).reversed().zip(other.locs.reversed()).all { (l1, l2) -> l1 == l2 } - && this.locs.first() == other.locs.first() - return stackIsLeq && this.paramsInitialized && other.paramsInitialized - } - override fun hashCode(): Int { var result = locs.hashCode() result = 31 * result + paramsInitialized.hashCode() // TODO FRICKIN INNER STATE HASH From d7538c173725823cbec0a1cc122c3b5e4e685d4a Mon Sep 17 00:00:00 2001 From: s0mark Date: Mon, 20 Nov 2023 20:24:52 +0100 Subject: [PATCH 09/14] stack covering only for recursive programs --- .../hu/bme/mit/theta/xcfa/analysis/Utils.kt | 53 +++++++++++++++++++ .../mit/theta/xcfa/analysis/XcfaAbstractor.kt | 13 ++--- .../mit/theta/xcfa/analysis/XcfaAnalysis.kt | 38 ++++--------- .../analysis/XcfaSingeExprTraceRefiner.kt | 5 +- .../bme/mit/theta/xcfa/analysis/XcfaState.kt | 2 +- .../bme/mit/theta/xcfa/cli/ConfigOptions.kt | 10 ++-- .../bme/mit/theta/xcfa/cli/XcfaCegarConfig.kt | 11 ++-- .../theta/xcfa/passes/ProcedurePassManager.kt | 2 +- 8 files changed, 84 insertions(+), 50 deletions(-) create mode 100644 subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt new file mode 100644 index 0000000000..ef6a88c80b --- /dev/null +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt @@ -0,0 +1,53 @@ +package hu.bme.mit.theta.xcfa.analysis + +import hu.bme.mit.theta.analysis.expl.ExplState +import hu.bme.mit.theta.analysis.expr.ExprState +import hu.bme.mit.theta.analysis.pred.PredState +import hu.bme.mit.theta.core.decl.Decl +import hu.bme.mit.theta.core.decl.VarDecl +import hu.bme.mit.theta.core.model.ImmutableValuation +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.xcfa.getFlatLabels +import hu.bme.mit.theta.xcfa.model.InvokeLabel +import hu.bme.mit.theta.xcfa.model.XCFA +import hu.bme.mit.theta.xcfa.passes.changeVars +import kotlin.reflect.KProperty + +fun Map.reverseMapping() = this.entries.associate { it.value to it.key } + +fun Valuation.changeVars(varLut: Map, VarDecl<*>>): Valuation { + val builder = ImmutableValuation.builder() + for (decl in this.decls) { + builder.put(decl.changeVars(varLut), this.eval(decl).get()) + } + return builder.build() +} + +internal fun XcfaState.withGeneralizedVars(): S { + val varLookup = processes.mapNotNull { (_, process) -> process.varLookup.peek()?.reverseMapping() } + .reduceOrNull(Map, VarDecl<*>>::plus) ?: mapOf() + return when (sGlobal) { + is ExplState -> ExplState.of(sGlobal.getVal().changeVars(varLookup)) + is PredState -> PredState.of(sGlobal.preds.map { p -> p.changeVars(varLookup) }) + else -> throw NotImplementedError("Generalizing variable instances is not implemented for data states that are not explicit or predicate.") + } as S +} + +class LazyDelegate(val getProperty: T.() -> P) { + private var calculated = false + private lateinit var property: P + + operator fun getValue(thisRef: T, property: KProperty<*>): P { + return if (calculated) this.property + else thisRef.getProperty().also { + this.property = it + this.calculated = true + } + } +} + +val XCFA.isInlined: Boolean by LazyDelegate { + !this.procedures.any { p -> p.edges.any { e -> e.getFlatLabels().any { l -> + l is InvokeLabel && this.procedures.any { it.name == l.name } + } } } +} \ No newline at end of file diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt index bf937f59c4..4ab4cb4219 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt @@ -52,8 +52,12 @@ class XcfaAbstractor( while (!waitlist.isEmpty) { val node = waitlist.remove() var newNodes: Collection>? = emptyList() - val expandProcedureCall = (node.state as XcfaState<*>) in (prec as XcfaPrec

).noPop - close(node, reachedSet[node], !expandProcedureCall) + if ((node.state as XcfaState<*>).xcfa!!.isInlined) { + close(node, reachedSet[node]) + } else { + val expandProcedureCall = (node.state as XcfaState<*>) in (prec as XcfaPrec

).noPop + closePop(node, reachedSet[node], !expandProcedureCall) + } if (!node.isSubsumed && !node.isTarget) { newNodes = argBuilder.expand(node, prec) reachedSet.addAll(newNodes) @@ -80,10 +84,7 @@ class XcfaAbstractor( } } - override fun close(node: ArgNode, candidates: MutableCollection>) - = close(node, candidates, true) - - fun close(node: ArgNode, candidates: Collection>, popCovered: Boolean) { + fun closePop(node: ArgNode, candidates: Collection>, popCovered: Boolean) { if (!node.isLeaf) { return } diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt index 4f54f2cc64..21eca21e1c 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt @@ -30,11 +30,8 @@ import hu.bme.mit.theta.analysis.pred.* import hu.bme.mit.theta.analysis.pred.PredAbstractors.PredAbstractor import hu.bme.mit.theta.analysis.waitlist.Waitlist import hu.bme.mit.theta.common.logging.Logger -import hu.bme.mit.theta.core.decl.Decl import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.decl.VarDecl -import hu.bme.mit.theta.core.model.ImmutableValuation -import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.stmt.Stmts import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.utils.TypeUtils @@ -166,7 +163,10 @@ fun getXcfaErrorPredicate( ErrorDetection.NO_ERROR, ErrorDetection.OVERFLOW -> Predicate> { false } } -private fun Map.reverseMapping() = this.entries.associate { it.value to it.key } +fun getPartialOrder(partialOrd: PartialOrd) = + PartialOrd> { s1, s2 -> + s1.processes == s2.processes && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes && partialOrd.isLeq(s1.sGlobal, s2.sGlobal) + } private fun stackIsLeq(s1: XcfaState, s2: XcfaState) = s2.processes.keys.all { pid -> s1.processes[pid]?.let { ps1 -> @@ -175,33 +175,10 @@ private fun stackIsLeq(s1: XcfaState, s2: XcfaState) = s2.p } ?: false } -private fun Valuation.changeVars(varLut: Map, VarDecl<*>>): Valuation { - val builder = ImmutableValuation.builder() - for (decl in this.decls) { - builder.put(decl.changeVars(varLut), this.eval(decl).get()) - } - return builder.build() -} - -private fun XcfaState.withGeneralizedVarInstances(): S { - val varLookup = processes.mapNotNull { (_, process) -> process.varLookup.peek()?.reverseMapping() } - .reduceOrNull(Map, VarDecl<*>>::plus) ?: mapOf() - return when (sGlobal) { - is ExplState -> ExplState.of(sGlobal.getVal().changeVars(varLookup)) - is PredState -> PredState.of(sGlobal.preds.map { p -> p.changeVars(varLookup) }) - else -> throw NotImplementedError("Generalizing variable instances is not implemented for data states that are not explicit or predicate.") - } as S -} - -fun getPartialOrder(partialOrd: PartialOrd) = - PartialOrd> { s1, s2 -> - s1.processes == s2.processes && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes && partialOrd.isLeq(s1.sGlobal, s2.sGlobal) - } - fun getStackPartialOrder(partialOrd: PartialOrd) = PartialOrd> { s1, s2 -> s1.processes.size == s2.processes.size && stackIsLeq(s1, s2) && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes - && partialOrd.isLeq(s1.withGeneralizedVarInstances(), s2.withGeneralizedVarInstances()) + && partialOrd.isLeq(s1.withGeneralizedVars(), s2.withGeneralizedVars()) } private fun , P : XcfaPrec> getXcfaArgBuilder( @@ -226,7 +203,10 @@ fun , P : XcfaPrec> getXcfaAbstractor( XcfaAbstractor.builder(getXcfaArgBuilder(analysis, lts, errorDetection)) .waitlist(waitlist as Waitlist>) // TODO: can we do this nicely? .stopCriterion(stopCriterion as StopCriterion).logger(logger) - .projection { it.processes.map { (_, p) -> p.locs.peek() } } + .projection { + if (it.xcfa!!.isInlined) it.processes + else it.processes.map { (_, p) -> p.locs.peek() } + } .build() // TODO: can we do this nicely? /// EXPL diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt index a02d4539c7..fb291eeb91 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt @@ -29,7 +29,7 @@ class XcfaSingleExprTraceRefiner ) : super(exprTraceChecker, precRefiner, pruneStrategy, logger, nodePruner) - private fun getAbstractedProcedureState(trace: Trace): Pair>? { + private fun findPoppedState(trace: Trace): Pair>? { trace.states.forEachIndexed { i, s -> val state = s as XcfaState state.processes.entries.find { (_, processState) -> processState.popped != null }?.let { (pid, processState) -> @@ -56,8 +56,9 @@ class XcfaSingleExprTraceRefiner).xcfa!!.isInlined - return if (refinerResult.isUnsafe) getAbstractedProcedureState(traceToConcretize)?.let { (i, state) -> + return if (checkForPop && refinerResult.isUnsafe) findPoppedState(traceToConcretize)?.let { (i, state) -> when (pruneStrategy) { PruneStrategy.LAZY -> { logger.write(Logger.Level.SUBSTEP, "| | Pruning from index %d...", i) diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt index f151c656bf..17520fd00d 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt @@ -235,7 +235,7 @@ data class XcfaProcessState( val paramsInitialized: Boolean = false, val prefix: String = "" ) { - var popped: XcfaLocation? = null + internal var popped: XcfaLocation? = null // stores if the stack was popped due to abstract stack covering fun withNewLoc(l: XcfaLocation): XcfaProcessState { val deque: LinkedList = LinkedList(locs) diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/ConfigOptions.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/ConfigOptions.kt index 506ad1d44b..7013c4fb68 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/ConfigOptions.kt +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/ConfigOptions.kt @@ -96,7 +96,7 @@ enum class Domain( ) -> Abstractor, val itpPrecRefiner: (exprSplitter: ExprSplitter) -> PrecRefiner, val initPrec: (XCFA, InitPrec) -> XcfaPrec<*>, - val partialOrd: (Solver) -> PartialOrd>, + val partialOrd: (Solver) -> PartialOrd, val nodePruner: NodePruner, val stateType: Type ) { @@ -110,7 +110,7 @@ enum class Domain( XcfaPrecRefiner(ItpRefToExplPrec()) }, initPrec = { x, ip -> ip.explPrec(x) }, - partialOrd = { getPartialOrder { s1, s2 -> s1.isLeq(s2) } }, + partialOrd = { PartialOrd { s1, s2 -> s1.isLeq(s2) } }, nodePruner = AtomicNodePruner, XcfaAction>(), stateType = TypeToken.get(ExplState::class.java).type ), @@ -123,7 +123,7 @@ enum class Domain( XcfaPrecRefiner(ItpRefToPredPrec(a)) }, initPrec = { x, ip -> ip.predPrec(x) }, - partialOrd = { solver -> getPartialOrder(PredOrd.create(solver)) }, + partialOrd = { solver -> PredOrd.create(solver) }, nodePruner = AtomicNodePruner, XcfaAction>(), stateType = TypeToken.get(PredState::class.java).type ), @@ -136,7 +136,7 @@ enum class Domain( XcfaPrecRefiner(ItpRefToPredPrec(a)) }, initPrec = { x, ip -> ip.predPrec(x) }, - partialOrd = { solver -> getPartialOrder(PredOrd.create(solver)) }, + partialOrd = { solver -> PredOrd.create(solver) }, nodePruner = AtomicNodePruner, XcfaAction>(), stateType = TypeToken.get(PredState::class.java).type ), @@ -149,7 +149,7 @@ enum class Domain( XcfaPrecRefiner(ItpRefToPredPrec(a)) }, initPrec = { x, ip -> ip.predPrec(x) }, - partialOrd = { solver -> getPartialOrder(PredOrd.create(solver)) }, + partialOrd = { solver -> PredOrd.create(solver) }, nodePruner = AtomicNodePruner, XcfaAction>(), stateType = TypeToken.get(PredState::class.java).type ), diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarConfig.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarConfig.kt index f868778a9f..2bef9ada62 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarConfig.kt +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarConfig.kt @@ -42,11 +42,8 @@ import hu.bme.mit.theta.core.decl.Decl import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.frontend.ParseContext import hu.bme.mit.theta.solver.SolverFactory -import hu.bme.mit.theta.xcfa.analysis.ErrorDetection -import hu.bme.mit.theta.xcfa.analysis.XcfaAction -import hu.bme.mit.theta.xcfa.analysis.XcfaState +import hu.bme.mit.theta.xcfa.analysis.* import hu.bme.mit.theta.xcfa.analysis.por.XcfaDporLts -import hu.bme.mit.theta.xcfa.analysis.XcfaSingleExprTraceRefiner import hu.bme.mit.theta.xcfa.model.XCFA import java.io.BufferedReader import java.io.File @@ -117,8 +114,10 @@ data class XcfaCegarConfig( } val abstractionSolverInstance = abstractionSolverFactory.createSolver() - val corePartialOrd: PartialOrd> = domain.partialOrd( - abstractionSolverInstance) + val globalStatePartialOrd: PartialOrd = domain.partialOrd(abstractionSolverInstance) + val corePartialOrd: PartialOrd> = + if (xcfa.isInlined) getPartialOrder(globalStatePartialOrd) + else getStackPartialOrder(globalStatePartialOrd) val abstractor: Abstractor = domain.abstractor( xcfa, abstractionSolverInstance, diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/ProcedurePassManager.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/ProcedurePassManager.kt index 4c72fa20d5..ab2faf0fe3 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/ProcedurePassManager.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/ProcedurePassManager.kt @@ -37,7 +37,7 @@ class CPasses(checkOverflow: Boolean, parseContext: ParseContext) : ProcedurePas PthreadFunctionsPass(parseContext), LoopUnrollPass(), // trying to inline procedures -// InlineProceduresPass(parseContext), + InlineProceduresPass(parseContext), RemoveDeadEnds(parseContext), EliminateSelfLoops(parseContext), // handling remaining function calls From 06b86fa55e857afdae5995d5afab45c2960e39a7 Mon Sep 17 00:00:00 2001 From: s0mark Date: Mon, 20 Nov 2023 20:37:48 +0100 Subject: [PATCH 10/14] Merge branch 'xcfa-refactor' into interproc --- .github/actions/benchexec-report/action.yml | 77 + .github/actions/benchexec-test/action.yml | 65 + .../actions/benchexec-test/unsupported.txt | 6401 +++++++++++++++++ .github/actions/build-archive/README.md | 42 + .github/actions/build-archive/action.yml | 58 + .../build-archive/necessary-solvers.txt | 4 + .github/workflows/check-copyright.yml | 4 + .github/workflows/check-formatting.yml | 4 + .github/workflows/check-version.yml | 4 + .github/workflows/linux-build-test-deploy.yml | 46 + .github/workflows/mac-build-test.yml | 4 + .github/workflows/sonar.yml | 4 + .github/workflows/win-build-test.yml | 4 + .gitignore | 1 + CONTRIBUTORS.md | 2 + scripts/complex.kts | 340 + scripts/{portfolio.kts => simple.kts} | 0 .../cfa/analysis/CfaToMonoliticTransFunc.java | 70 + .../cfa/analysis/config/CfaConfigBuilder.java | 6 + .../java/hu/bme/mit/theta/cfa/cli/CfaCli.java | 55 +- subprojects/common/analysis/build.gradle.kts | 1 + .../bme/mit/theta/analysis/algorithm/ARG.java | 19 +- .../AbstractMonolithicTransFunc.java | 53 + .../mit/theta/analysis/algorithm/ArgEdge.java | 29 - .../mit/theta/analysis/algorithm/ArgNode.java | 30 +- .../algorithm/ArgStructuralEquality.java | 192 + .../theta/analysis/algorithm/ArgTrace.java | 29 - .../algorithm/MonolithicTransFunc.java | 36 + .../mit/theta/analysis/algorithm/SporLts.java | 265 - .../algorithm/cegar/CegarChecker.java | 9 +- .../algorithm/debug/ARGWebDebugger.java | 135 + .../analysis/algorithm/imc/ImcChecker.java | 179 + .../analysis/algorithm/kind/KIndChecker.java | 197 + .../mcm/analysis/FiniteStateChecker.kt | 3 + .../algorithm/mcm/analysis/PartialSolver.kt | 3 + .../refinement/SingleExprTraceRefiner.java | 7 +- .../theta/analysis/pred/PredAbstractors.java | 29 + .../theta/analysis/pred/PredTransFunc.java | 2 +- .../analysis/runtimemonitor/CexMonitor.kt | 11 +- .../runtimemonitor/MonitorCheckpoint.kt | 8 + .../container/CexHashStorage.kt | 5 +- .../algorithm/ArgStructuralEqualityTest.java | 73 + .../analysis/algorithm/ExprActionStub.java | 36 + .../analysis/algorithm/ExprStateStub.java | 34 + .../mit/theta/analysis/algorithm/IMCTest.java | 78 + .../theta/analysis/algorithm/KIndTest.java | 82 + .../algorithm/MonolithicTransFuncStub.java | 73 + .../mit/theta/analysis/stubs/ActionStub.java | 15 + .../mit/theta/analysis/stubs/StateStub.java | 14 + ...rrLogger.java => UniqueWarningLogger.java} | 13 +- .../visualization/WebDebuggerLogger.java | 8 +- .../theta/core/model/ImmutableValuation.java | 23 +- .../mit/theta/core/type/fptype/FpLitExpr.java | 4 +- .../theta/core/type/inttype/IntLitExpr.java | 11 +- .../mit/theta/core/utils/ExprSimplifier.java | 6 +- .../bme/mit/theta/core/utils/VarPoolUtil.java | 2 +- .../mit/theta/core/expr/EvaluationTest.java | 13 + .../frontends/c-frontend/src/main/antlr/C.g4 | 3 +- .../mit/theta/frontend/FrontendMetadata.java | 48 +- .../bme/mit/theta/frontend/ParseContext.java | 31 +- .../grammar/expression/ExpressionVisitor.java | 103 +- .../expression/UnsupportedInitializer.java | 42 + .../grammar/function/FunctionVisitor.java | 26 +- ...itwiseOption.java => ArithmeticTrait.java} | 4 +- .../grammar/preprocess/BitwiseChecker.java | 85 +- .../grammar/type/DeclarationVisitor.java | 28 +- .../grammar/type/TypeVisitor.java | 38 +- .../model/statements/CAssignment.java | 21 +- .../model/types/complex/CComplexType.java | 75 +- .../model/types/complex/CVoid.java | 5 + .../model/types/complex/real/CDouble.java | 5 + .../model/types/complex/real/CFloat.java | 5 + .../model/types/complex/real/CLongDouble.java | 5 + .../visitors/bitvector/CastVisitor.java | 10 +- .../types/simple/CSimpleTypeFactory.java | 9 +- .../model/types/simple/NamedType.java | 12 +- .../model/types/simple/Struct.java | 13 +- .../frontend/chc/ChcBackwardXcfaBuilder.java | 30 +- .../frontend/chc/ChcForwardXcfaBuilder.java | 24 +- .../mit/theta/frontend/chc/ChcFrontend.java | 9 +- subprojects/frontends/llvm/build.gradle.kts | 52 +- .../src/main/cpp/passes/gazer/Intrinsics.cpp | 84 +- .../src/main/cpp/passes/gazer/Intrinsics.h | 43 - .../llvm/src/main/cpp/passes/gazer/Passes.h | 12 - .../llvm/src/main/cpp/types/Instruction.cpp | 2 +- .../llvm/src/main/cpp/utilities/CPipeline.cpp | 227 +- .../llvm/src/main/cpp/utilities/CPipeline.h | 2 +- .../impl/cvc5/CVC5SmtLibSolverInstaller.java | 4 +- .../mathsat/MathSATSmtLibSolverInstaller.java | 2 +- .../PrincessSmtLibSolverInstaller.java | 2 +- .../SMTInterpolSmtLibSolverInstaller.java | 5 +- .../impl/z3/Z3SmtLibSolverInstaller.java | 9 +- .../sts/analysis/StsToMonoliticTransFunc.java | 45 + .../java/hu/bme/mit/theta/sts/cli/StsCli.java | 52 +- .../mit/theta/c2xcfa/FrontendXcfaBuilder.kt | 13 +- .../java/hu/bme/mit/theta/c2xcfa/Utils.kt | 7 +- .../theta/c2xcfa/TestFrontendXcfaBuilder.kt | 5 +- .../mit/theta/cat/solver/DatalogSolver.java | 104 - .../mit/theta/xcfa/litmus/cli/LitmusCli.java | 35 +- subprojects/xcfa/llvm2xcfa/build.gradle.kts | 3 +- .../handlers/states/FunctionState.java | 2 +- .../mit/theta/xcfa/analysis/XcfaAnalysis.kt | 32 +- .../analysis/XcfaMonolithicTransFunc.java | 74 + .../analysis/XcfaSingeExprTraceRefiner.kt | 4 +- .../bme/mit/theta/xcfa/analysis/XcfaState.kt | 94 +- .../mit/theta/xcfa/analysis/coi/XcfaCoi.kt | 172 + .../xcfa/analysis/coi/XcfaCoiMultiThread.kt | 159 + .../xcfa/analysis/coi/XcfaCoiSingleThread.kt | 84 + .../xcfa/analysis/por/XcfaAasporCoiLts.kt | 44 + .../theta/xcfa/analysis/por/XcfaAasporLts.kt | 87 +- .../theta/xcfa/analysis/por/XcfaDporLts.kt | 14 +- .../theta/xcfa/analysis/por/XcfaSporLts.kt | 281 +- .../xcfa/analysis/XcfaExplAnalysisTest.kt | 17 +- .../xcfa/analysis/XcfaPredAnalysisTest.kt | 17 +- subprojects/xcfa/xcfa-cli/build.gradle.kts | 14 +- .../bme/mit/theta/xcfa/cli/ConfigOptions.kt | 68 +- .../hu/bme/mit/theta/xcfa/cli/ExitCodes.kt | 27 +- .../hu/bme/mit/theta/xcfa/cli/GsonUtils.kt | 3 + .../mit/theta/xcfa/cli/VerificationTraits.kt | 4 +- .../bme/mit/theta/xcfa/cli/XcfaCegarConfig.kt | 65 +- .../mit/theta/xcfa/cli/XcfaCegarServer.java | 54 +- .../java/hu/bme/mit/theta/xcfa/cli/XcfaCli.kt | 315 +- .../bme/mit/theta/xcfa/cli/XcfaImcConfig.kt | 55 + .../bme/mit/theta/xcfa/cli/XcfaKindConfig.kt | 68 + .../mit/theta/xcfa/cli/portfolio/complex23.kt | 351 + .../mit/theta/xcfa/cli/portfolio/complex24.kt | 447 ++ .../bme/mit/theta/xcfa/cli/portfolio/stm.kt | 8 +- .../mit/theta/xcfa/cli/utils/BMCValToTrace.kt | 70 + .../theta/xcfa/cli/utils/XcfaWitnessWriter.kt | 10 +- .../xcfa/cli/witnesses/TraceToWitness.kt | 7 +- .../mit/theta/xcfa/cli/XcfaCliParseTest.kt | 53 +- .../theta/xcfa/cli/XcfaCliPortfolioTest.kt | 90 + .../mit/theta/xcfa/cli/XcfaCliVerifyTest.kt | 94 +- .../mit/theta/xcfa/cli/XcfaCliWitnessTest.kt | 139 + .../hu/bme/mit/theta/xcfa/cli/XcfaToCTest.kt | 67 + .../c/litmustest/singlethread/witness_test.c | 9 + .../chc-LIA-nonlin-Arrays-nonrecADT_000.smt2 | 5209 -------------- .../main/java/hu/bme/mit/theta/xcfa/Utils.kt | 280 +- .../java/hu/bme/mit/theta/xcfa/XcfaToC.kt | 371 + .../xcfa/gson/FrontendMetadataAdapter.kt | 142 + .../theta/xcfa/gson/ParseContextAdapter.kt | 70 +- .../hu/bme/mit/theta/xcfa/model/Builders.kt | 89 +- .../java/hu/bme/mit/theta/xcfa/model/Dsl.kt | 2 +- .../java/hu/bme/mit/theta/xcfa/model/XCFA.kt | 24 +- .../xcfa/passes/CLibraryFunctionsPass.kt | 138 + .../xcfa/passes/FpFunctionsToExprsPass.kt | 44 +- .../xcfa/passes/HavocPromotionAndRange.kt | 10 +- .../theta/xcfa/passes/InlineProceduresPass.kt | 23 +- .../hu/bme/mit/theta/xcfa/passes/LbePass.kt | 16 +- .../mit/theta/xcfa/passes/LoopUnrollPass.kt | 13 +- .../mit/theta/xcfa/passes/NormalizePass.kt | 5 + .../theta/xcfa/passes/ProcedurePassManager.kt | 95 +- .../theta/xcfa/passes/PthreadFunctionsPass.kt | 111 - .../theta/xcfa/passes/SimplifyExprsPass.kt | 28 +- .../mit/theta/xcfa/passes/UnusedVarPass.kt | 16 +- .../hu/bme/mit/theta/xcfa/passes/Utils.kt | 36 +- .../theta/xcfa/model/XcfaSerializationTest.kt | 81 + .../hu/bme/mit/theta/xcfa/passes/PassTests.kt | 88 +- .../analysis/XstsToMonoliticTransFunc.java | 56 + .../analysis/config/XstsConfigBuilder.java | 6 + .../test/resources/model/count_up_down.xsts | 2 + .../src/test/resources/model/counter5.xsts | 2 +- .../hu/bme/mit/theta/xsts/cli/XstsCli.java | 53 +- 163 files changed, 13450 insertions(+), 6916 deletions(-) create mode 100644 .github/actions/benchexec-report/action.yml create mode 100644 .github/actions/benchexec-test/action.yml create mode 100644 .github/actions/benchexec-test/unsupported.txt create mode 100644 .github/actions/build-archive/README.md create mode 100644 .github/actions/build-archive/action.yml create mode 100644 .github/actions/build-archive/necessary-solvers.txt create mode 100644 scripts/complex.kts rename scripts/{portfolio.kts => simple.kts} (100%) create mode 100644 subprojects/cfa/cfa-analysis/src/main/java/hu/bme/mit/theta/cfa/analysis/CfaToMonoliticTransFunc.java create mode 100644 subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/AbstractMonolithicTransFunc.java create mode 100644 subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgStructuralEquality.java create mode 100644 subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/MonolithicTransFunc.java delete mode 100644 subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/SporLts.java create mode 100644 subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/debug/ARGWebDebugger.java create mode 100644 subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/imc/ImcChecker.java create mode 100644 subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/kind/KIndChecker.java create mode 100644 subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/ArgStructuralEqualityTest.java create mode 100644 subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/ExprActionStub.java create mode 100644 subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/ExprStateStub.java create mode 100644 subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/IMCTest.java create mode 100644 subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/KIndTest.java create mode 100644 subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/MonolithicTransFuncStub.java rename subprojects/common/common/src/main/java/hu/bme/mit/theta/common/logging/{StderrLogger.java => UniqueWarningLogger.java} (70%) create mode 100644 subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializer.java rename subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/preprocess/{BitwiseOption.java => ArithmeticTrait.java} (90%) create mode 100644 subprojects/sts/sts-analysis/src/main/java/hu/bme/mit/theta/sts/analysis/StsToMonoliticTransFunc.java delete mode 100644 subprojects/xcfa/cat/src/main/java/hu/bme/mit/theta/cat/solver/DatalogSolver.java create mode 100644 subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaMonolithicTransFunc.java create mode 100644 subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/coi/XcfaCoi.kt create mode 100644 subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/coi/XcfaCoiMultiThread.kt create mode 100644 subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/coi/XcfaCoiSingleThread.kt create mode 100644 subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaAasporCoiLts.kt create mode 100644 subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaImcConfig.kt create mode 100644 subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaKindConfig.kt create mode 100644 subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/complex23.kt create mode 100644 subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/complex24.kt create mode 100644 subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/utils/BMCValToTrace.kt create mode 100644 subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliPortfolioTest.kt create mode 100644 subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliWitnessTest.kt create mode 100644 subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaToCTest.kt create mode 100644 subprojects/xcfa/xcfa-cli/src/test/resources/c/litmustest/singlethread/witness_test.c delete mode 100644 subprojects/xcfa/xcfa-cli/src/test/resources/chc/chc-LIA-nonlin-Arrays-nonrecADT_000.smt2 create mode 100644 subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/XcfaToC.kt create mode 100644 subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/gson/FrontendMetadataAdapter.kt create mode 100644 subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/CLibraryFunctionsPass.kt delete mode 100644 subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/PthreadFunctionsPass.kt create mode 100644 subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/model/XcfaSerializationTest.kt create mode 100644 subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/XstsToMonoliticTransFunc.java diff --git a/.github/actions/benchexec-report/action.yml b/.github/actions/benchexec-report/action.yml new file mode 100644 index 0000000000..9e9253d517 --- /dev/null +++ b/.github/actions/benchexec-report/action.yml @@ -0,0 +1,77 @@ +name: 'Report on benchexec tests' +description: 'Collecting results of benchexec runs, and creating report' +runs: + using: "composite" + steps: + - name: Checkout repository + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Install benchexec + shell: bash + run: | + sudo add-apt-repository ppa:sosy-lab/benchmarking + sudo apt install benchexec + - name: Download artifacts + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + with: + path: artifacts + - name: Generate tables + id: generate + shell: bash + run: | + cd artifacts + EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) + echo "Message<<$EOF" >> $GITHUB_OUTPUT + for i in * + do + if (ls $i/*xml.bz2 >/dev/null 2>/dev/null) + then + pushd $i + table-generator -d *xml.bz2 + sed -i 's/\.\.\/sv-benchmarks/https:\/\/gitlab\.com\/sosy-lab\/benchmarking\/sv-benchmarks\/-\/raw\/main/g' *.html + unzip *.zip + rm *.zip + correct=$(tail -n9 *.txt | grep ' correct:' | awk ' { print $2 } ') + incorrect=$(tail -n9 *.txt | grep ' incorrect:' | awk ' { print $2 } ') + all=$(tail -n9 *.txt | grep 'Statistics:' | awk ' { print $2 } ') + emoji=":white_check_mark:" + [ $correct -eq 0 ] && emoji=":question:" + [ $incorrect -eq 0 ] || emoji=":exclamation:" + echo "

$emoji ${i#BenchexecResults-} ($correct / $incorrect / $all)" >> $GITHUB_OUTPUT + echo >> $GITHUB_OUTPUT + echo '`table-generator`'" output: [HTML](https://theta.mit.bme.hu/benchmark-results/${{ github.head_ref }}/$i/$(ls *.html))/[CSV](https://theta.mit.bme.hu/benchmark-results/${{ github.head_ref }}/$i/$(ls *.csv))" >> $GITHUB_OUTPUT + echo >> $GITHUB_OUTPUT + echo '```' >> $GITHUB_OUTPUT + cat *.txt >> $GITHUB_OUTPUT + echo '```' >> $GITHUB_OUTPUT + echo "
" >> $GITHUB_OUTPUT + echo >> $GITHUB_OUTPUT + echo >> $GITHUB_OUTPUT + popd + else + rm -rf $i + fi + done + echo "$EOF" >> $GITHUB_OUTPUT + - name: Upload results + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + with: + name: BenchexecResults + path: artifacts + - name: Deploy to GHPages + if: github.event_name == 'pull_request' + uses: JamesIves/github-pages-deploy-action@22a6ee251d6f13c6ab1ecb200d974f1a6feb1b8d # v4.4.2 + with: + branch: gh-pages + folder: artifacts + target-folder: benchmark-results/${{ github.head_ref }}/ + single-commit: true + - name: Comment on PR + if: github.event_name == 'pull_request' + uses: thollander/actions-comment-pull-request@dadb7667129e23f12ca3925c90dc5cd7121ab57e + with: + comment_tag: 'diffcheck' + mode: 'recreate' + message: | + Benchexec test report for a selection of SV-Benchmarks (correct / incorrect / all): + + ${{ steps.generate.outputs.Message }} \ No newline at end of file diff --git a/.github/actions/benchexec-test/action.yml b/.github/actions/benchexec-test/action.yml new file mode 100644 index 0000000000..ac8db09730 --- /dev/null +++ b/.github/actions/benchexec-test/action.yml @@ -0,0 +1,65 @@ +name: 'Run tests using benchexec' +description: 'Running benchexec tests on xcfa-cli' +inputs: + task: + required: true + test_number: + required: true +runs: + using: "composite" + steps: + - name: Checkout repository + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Install benchexec and dependencies + shell: bash + run: | + sudo add-apt-repository ppa:sosy-lab/benchmarking + sudo apt install benchexec openjdk-17-jre-headless libgomp1 libmpfr-dev + - name: Get benchmark definition file + shell: bash + run: | + mkdir -p xml + wget https://gitlab.com/sosy-lab/sv-comp/bench-defs/-/raw/main/benchmark-defs/theta.xml -P xml + sed -i 's///g' xml/theta.xml + - name: Get sv-benchmarks + shell: bash + run: | + git clone --filter=blob:none --no-checkout --depth 1 --sparse https://gitlab.com/sosy-lab/benchmarking/sv-benchmarks.git + cd sv-benchmarks + git sparse-checkout add c + git checkout + - name: Get archive + shell: bash + run: | + wget https://github.com/ftsrg/theta/releases/download/svcomp23/theta.zip + unzip theta.zip + - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + name: Get JAR + with: + name: ThetaJars + path: jar/ + - name: Add new jar to archive + shell: bash + run: | + mv jar/xcfa/xcfa-cli/build/libs/*-all.jar theta/theta.jar + ls -l theta + - name: Cut setfile if too long + id: setfile + shell: bash + run: | + cd sv-benchmarks/c + for i in $(sed 's/#.*$//g' ${{ inputs.task }}.set); do find . -wholename ./$i; done | while read line; do grep "${line#./}" $GITHUB_ACTION_PATH/unsupported.txt >/dev/null 2>/dev/null || test -z $(yq e '.properties.[] | select(.property_file == "../properties/unreach-call.prp")' $line) >/dev/null 2>/dev/null || echo $(echo $line | sha1sum | awk ' { print $1 } ') $line ; done | sort -k1 | awk ' { $1=""; print $0 } ' | awk '{$1=$1};1' > all-files.txt + head -n${{ inputs.test_number }} all-files.txt > ${{ inputs.task }}.set + echo "length=$(cat ${{ inputs.task }}.set | wc -l)" >> "$GITHUB_OUTPUT" + cat ${{ inputs.task }}.set + - name: Run benchexec + shell: bash + if: steps.setfile.outputs.length != '0' + run: | + benchexec xml/theta.xml --no-container --tool-directory theta -t ${{ inputs.task }} + - name: Upload results + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + if: steps.setfile.outputs.length != '0' + with: + name: BenchexecResults-${{ inputs.task }} + path: results diff --git a/.github/actions/benchexec-test/unsupported.txt b/.github/actions/benchexec-test/unsupported.txt new file mode 100644 index 0000000000..b913a7799a --- /dev/null +++ b/.github/actions/benchexec-test/unsupported.txt @@ -0,0 +1,6401 @@ +array-crafted/bAnd5.yml +array-crafted/bor5.yml +array-crafted/mapavg5.yml +array-crafted/mapsum5.yml +array-crafted/xor5.yml +array-crafted/zero_sum_const1.yml +array-crafted/zero_sum_const2.yml +array-crafted/zero_sum_const3.yml +array-crafted/zero_sum_const4.yml +array-crafted/zero_sum_const5.yml +array-crafted/zero_sum_const_m2.yml +array-crafted/zero_sum_const_m3.yml +array-crafted/zero_sum_const_m4.yml +array-crafted/zero_sum_const_m5.yml +array-examples/relax-2-2.yml +array-fpi/brs1.yml +array-fpi/brs1f.yml +array-fpi/brs2.yml +array-fpi/brs2f.yml +array-fpi/brs3.yml +array-fpi/brs3f.yml +array-fpi/brs4.yml +array-fpi/brs4f.yml +array-fpi/brs5.yml +array-fpi/brs5f.yml +array-fpi/conda.yml +array-fpi/condaf.yml +array-fpi/condg.yml +array-fpi/condgf.yml +array-fpi/condm.yml +array-fpi/condmf.yml +array-fpi/condn.yml +array-fpi/condnf.yml +array-fpi/eqn1.yml +array-fpi/eqn1f.yml +array-fpi/eqn2.yml +array-fpi/eqn2f.yml +array-fpi/eqn3.yml +array-fpi/eqn3f.yml +array-fpi/eqn4.yml +array-fpi/eqn4f.yml +array-fpi/eqn5.yml +array-fpi/eqn5f.yml +array-fpi/ifcomp.yml +array-fpi/ifcompf.yml +array-fpi/ifeqn1.yml +array-fpi/ifeqn1f.yml +array-fpi/ifeqn2.yml +array-fpi/ifeqn2f.yml +array-fpi/ifeqn3.yml +array-fpi/ifeqn3f.yml +array-fpi/ifeqn4.yml +array-fpi/ifeqn4f.yml +array-fpi/ifeqn5.yml +array-fpi/ifeqn5f.yml +array-fpi/ifncomp.yml +array-fpi/ifncompf.yml +array-fpi/indp1f.yml +array-fpi/indp2.yml +array-fpi/indp2f.yml +array-fpi/indp3.yml +array-fpi/indp3f.yml +array-fpi/indp4.yml +array-fpi/indp4f.yml +array-fpi/indp5.yml +array-fpi/indp5f.yml +array-fpi/modn.yml +array-fpi/modnf.yml +array-fpi/modp.yml +array-fpi/modpf.yml +array-fpi/mods.yml +array-fpi/modsf.yml +array-fpi/ms1.yml +array-fpi/ms1f.yml +array-fpi/ms2.yml +array-fpi/ms2f.yml +array-fpi/ms3.yml +array-fpi/ms3f.yml +array-fpi/ms4.yml +array-fpi/ms4f.yml +array-fpi/ms5.yml +array-fpi/ms5f.yml +array-fpi/ncomp.yml +array-fpi/ncompf.yml +array-fpi/nsqm-if.yml +array-fpi/nsqm-iff.yml +array-fpi/nsqm.yml +array-fpi/nsqmf.yml +array-fpi/pcomp.yml +array-fpi/pcompf.yml +array-fpi/res1.yml +array-fpi/res1f.yml +array-fpi/res1o.yml +array-fpi/res1of.yml +array-fpi/res2.yml +array-fpi/res2f.yml +array-fpi/res2o.yml +array-fpi/res2of.yml +array-fpi/s12if.yml +array-fpi/s12iff.yml +array-fpi/s1if.yml +array-fpi/s1iff.yml +array-fpi/s1lif.yml +array-fpi/s1liff.yml +array-fpi/s22if.yml +array-fpi/s22iff.yml +array-fpi/s2if.yml +array-fpi/s2iff.yml +array-fpi/s2lif.yml +array-fpi/s2liff.yml +array-fpi/s32if.yml +array-fpi/s32iff.yml +array-fpi/s3if.yml +array-fpi/s3iff.yml +array-fpi/s3lif.yml +array-fpi/s3liff.yml +array-fpi/s42if.yml +array-fpi/s42iff.yml +array-fpi/s4if.yml +array-fpi/s4iff.yml +array-fpi/s4lif.yml +array-fpi/s4liff.yml +array-fpi/s52if.yml +array-fpi/s52iff.yml +array-fpi/s5if.yml +array-fpi/s5iff.yml +array-fpi/s5lif.yml +array-fpi/s5liff.yml +array-fpi/sina1.yml +array-fpi/sina1f.yml +array-fpi/sina2.yml +array-fpi/sina2f.yml +array-fpi/sina3.yml +array-fpi/sina3f.yml +array-fpi/sina4.yml +array-fpi/sina4f.yml +array-fpi/sina5.yml +array-fpi/sina5f.yml +array-fpi/sqm-if.yml +array-fpi/sqm-iff.yml +array-fpi/sqm.yml +array-fpi/sqmf.yml +array-fpi/ss1.yml +array-fpi/ss1f.yml +array-fpi/ss2.yml +array-fpi/ss2f.yml +array-fpi/ss3.yml +array-fpi/ss3f.yml +array-fpi/ss4.yml +array-fpi/ss4f.yml +array-fpi/ssina.yml +array-fpi/ssinaf.yml +array-industry-pattern/array_of_struct_break.yml +array-industry-pattern/array_of_struct_loop_dep.yml +array-industry-pattern/array_of_struct_ptr_cond_init.yml +array-industry-pattern/array_of_struct_ptr_flag_init.yml +array-industry-pattern/array_of_struct_ptr_monotonic.yml +array-industry-pattern/array_of_struct_ptr_mul_init.yml +array-industry-pattern/array_of_struct_single_elem_init.yml +array-industry-pattern/array_ptr_partial_init.yml +array-industry-pattern/array_ptr_single_elem_init-1.yml +array-lopstr16/base_case.yml +array-lopstr16/break-1.yml +array-lopstr16/break-2.yml +array-lopstr16/flag_loopdep.yml +array-lopstr16/flag_loopdep_simple.yml +array-lopstr16/motivex.yml +array-lopstr16/partial_lesser_bound.yml +array-lopstr16/scalar_loopdep.yml +array-lopstr16/single_elem_safe.yml +array-lopstr16/sum_multi_array.yml +array-tiling/mlceu.yml +array-tiling/mlceu2.yml +array-tiling/pnr2.yml +array-tiling/pnr3.yml +array-tiling/pnr4.yml +array-tiling/pnr5.yml +array-tiling/poly1.yml +array-tiling/poly2.yml +array-tiling/revcpyswp2.yml +array-tiling/rew.yml +array-tiling/rewnif.yml +array-tiling/rewnifrev.yml +array-tiling/rewnifrev2.yml +array-tiling/rewrev.yml +array-tiling/skipped.yml +array-tiling/skippedu.yml +array-tiling/tcpy.yml +bitvector-loops/verisec_sendmail_tTflag_arr_one_loop.yml +bitvector/s3_clnt_3.BV.c.cil-1a.yml +bitvector/s3_clnt_3.BV.c.cil-2a.yml +combinations/pals_lcr.8.1.ufo.BOUNDED-16.pals+Problem12_label01.yml +combinations/pals_lcr.8.1.ufo.BOUNDED-16.pals+Problem12_label02.yml +combinations/pals_lcr.8.1.ufo.BOUNDED-16.pals+Problem12_label04.yml +combinations/pals_lcr.8.1.ufo.BOUNDED-16.pals+Problem12_label05.yml +combinations/pals_lcr.8.1.ufo.BOUNDED-16.pals+Problem12_label09.yml +combinations/pals_lcr.8.1.ufo.UNBOUNDED.pals+Problem12_label01.yml +combinations/pals_lcr.8.1.ufo.UNBOUNDED.pals+Problem12_label02.yml +combinations/pals_lcr.8.1.ufo.UNBOUNDED.pals+Problem12_label04.yml +combinations/pals_lcr.8.1.ufo.UNBOUNDED.pals+Problem12_label05.yml +combinations/pals_lcr.8.1.ufo.UNBOUNDED.pals+Problem12_label09.yml +combinations/pals_lcr.8.ufo.BOUNDED-16.pals+Problem12_label00.yml +combinations/pals_lcr.8.ufo.BOUNDED-16.pals+Problem12_label01.yml +combinations/pals_lcr.8.ufo.BOUNDED-16.pals+Problem12_label02.yml +combinations/pals_lcr.8.ufo.BOUNDED-16.pals+Problem12_label03.yml +combinations/pals_lcr.8.ufo.BOUNDED-16.pals+Problem12_label04.yml +combinations/pals_lcr.8.ufo.BOUNDED-16.pals+Problem12_label05.yml +combinations/pals_lcr.8.ufo.BOUNDED-16.pals+Problem12_label06.yml +combinations/pals_lcr.8.ufo.BOUNDED-16.pals+Problem12_label07.yml +combinations/pals_lcr.8.ufo.BOUNDED-16.pals+Problem12_label08.yml +combinations/pals_lcr.8.ufo.BOUNDED-16.pals+Problem12_label09.yml +combinations/pals_lcr.8.ufo.UNBOUNDED.pals+Problem12_label00.yml +combinations/pals_lcr.8.ufo.UNBOUNDED.pals+Problem12_label01.yml +combinations/pals_lcr.8.ufo.UNBOUNDED.pals+Problem12_label02.yml +combinations/pals_lcr.8.ufo.UNBOUNDED.pals+Problem12_label03.yml +combinations/pals_lcr.8.ufo.UNBOUNDED.pals+Problem12_label04.yml +combinations/pals_lcr.8.ufo.UNBOUNDED.pals+Problem12_label05.yml +combinations/pals_lcr.8.ufo.UNBOUNDED.pals+Problem12_label06.yml +combinations/pals_lcr.8.ufo.UNBOUNDED.pals+Problem12_label07.yml +combinations/pals_lcr.8.ufo.UNBOUNDED.pals+Problem12_label08.yml +combinations/pals_lcr.8.ufo.UNBOUNDED.pals+Problem12_label09.yml +combinations/pals_lcr.8_overflow.ufo.UNBOUNDED.pals+Problem12_label01.yml +combinations/pals_lcr.8_overflow.ufo.UNBOUNDED.pals+Problem12_label02.yml +combinations/pals_lcr.8_overflow.ufo.UNBOUNDED.pals+Problem12_label04.yml +combinations/pals_lcr.8_overflow.ufo.UNBOUNDED.pals+Problem12_label05.yml +combinations/pals_lcr.8_overflow.ufo.UNBOUNDED.pals+Problem12_label09.yml +ddv-machzwd/ddv_machzwd_all.yml +ddv-machzwd/ddv_machzwd_inb.yml +ddv-machzwd/ddv_machzwd_inb_p.yml +ddv-machzwd/ddv_machzwd_inl.yml +ddv-machzwd/ddv_machzwd_inl_p.yml +ddv-machzwd/ddv_machzwd_inw.yml +ddv-machzwd/ddv_machzwd_inw_p.yml +ddv-machzwd/ddv_machzwd_outb.yml +ddv-machzwd/ddv_machzwd_outb_p.yml +ddv-machzwd/ddv_machzwd_outl.yml +ddv-machzwd/ddv_machzwd_outl_p.yml +ddv-machzwd/ddv_machzwd_outw_p.yml +ddv-machzwd/ddv_machzwd_pthread_mutex_unlock.yml +eca-rers2018/Problem12.yml +eca-rers2018/Problem15.yml +float-benchs/arctan_Pade.yml +float-benchs/bary_diverge.yml +float-benchs/cast_float_ptr.yml +float-benchs/cast_float_union.yml +float-benchs/cast_union_loose.yml +float-benchs/cast_union_tight.yml +float-benchs/cos_polynomial.yml +float-benchs/filter2_alt.yml +float-benchs/filter2_iterated.yml +float-benchs/filter_iir.yml +float-benchs/image_filter.yml +float-benchs/interpolation.yml +float-benchs/interpolation2.c.p+cfa-reducer.yml +float-benchs/interpolation2.c.v+cfa-reducer.yml +float-benchs/interpolation2.c.v+nlh-reducer.yml +float-benchs/interpolation2.yml +float-benchs/inv_Newton-1.yml +float-benchs/inv_Newton-2.yml +float-benchs/inv_Newton.c.p+cfa-reducer.yml +float-benchs/inv_sqrt_Quake.c.v+cfa-reducer.yml +float-benchs/inv_sqrt_Quake.yml +float-benchs/mea8000.yml +float-benchs/sin_interpolated_bigrange_loose.yml +float-benchs/sin_interpolated_bigrange_tight.yml +float-benchs/sin_interpolated_index-1.yml +float-benchs/sin_interpolated_index-2.yml +float-benchs/sin_interpolated_negation.yml +float-benchs/sin_interpolated_smallrange.yml +float-benchs/sqrt_Householder_constant.c.p+cfa-reducer.yml +float-benchs/sqrt_Householder_constant.yml +float-benchs/sqrt_Householder_interval.yml +float-benchs/sqrt_Householder_pseudoconstant.yml +float-benchs/sqrt_Newton_pseudoconstant.yml +float-benchs/sqrt_biNewton_pseudoconstant.yml +float-benchs/sqrt_poly.yml +float-benchs/sqrt_poly2.yml +float-benchs/water_pid.yml +float-newlib/double_req_bl_0210.yml +float-newlib/double_req_bl_0220a.yml +float-newlib/double_req_bl_0220b.yml +float-newlib/double_req_bl_0240a.yml +float-newlib/double_req_bl_0240b.yml +float-newlib/double_req_bl_0250a.yml +float-newlib/double_req_bl_0250b.yml +float-newlib/double_req_bl_0260.yml +float-newlib/double_req_bl_0270a.yml +float-newlib/double_req_bl_0270b.yml +float-newlib/double_req_bl_0281.yml +float-newlib/double_req_bl_0310.yml +float-newlib/double_req_bl_0320.yml +float-newlib/double_req_bl_0330a.yml +float-newlib/double_req_bl_0330b.yml +float-newlib/double_req_bl_0460.yml +float-newlib/double_req_bl_0470.yml +float-newlib/double_req_bl_0480.yml +float-newlib/double_req_bl_0490a.yml +float-newlib/double_req_bl_0490b.yml +float-newlib/double_req_bl_0520.yml +float-newlib/double_req_bl_0530a.yml +float-newlib/double_req_bl_0530b.yml +float-newlib/double_req_bl_0550a.yml +float-newlib/double_req_bl_0550b.yml +float-newlib/double_req_bl_0620a.yml +float-newlib/double_req_bl_0620b.yml +float-newlib/double_req_bl_0621a.yml +float-newlib/double_req_bl_0621b.yml +float-newlib/double_req_bl_0660a.yml +float-newlib/double_req_bl_0660b.yml +float-newlib/double_req_bl_0661a.yml +float-newlib/double_req_bl_0661b.yml +float-newlib/double_req_bl_0662a.yml +float-newlib/double_req_bl_0662b.yml +float-newlib/double_req_bl_0663a.yml +float-newlib/double_req_bl_0663b.yml +float-newlib/double_req_bl_0670.yml +float-newlib/double_req_bl_0680a.yml +float-newlib/double_req_bl_0680b.yml +float-newlib/double_req_bl_0681a.yml +float-newlib/double_req_bl_0681b.yml +float-newlib/double_req_bl_0682a.yml +float-newlib/double_req_bl_0682b.yml +float-newlib/double_req_bl_0683a.yml +float-newlib/double_req_bl_0683b.yml +float-newlib/double_req_bl_0684a.yml +float-newlib/double_req_bl_0684b.yml +float-newlib/double_req_bl_0685a.yml +float-newlib/double_req_bl_0685b.yml +float-newlib/double_req_bl_0686a.yml +float-newlib/double_req_bl_0686b.yml +float-newlib/double_req_bl_0720.yml +float-newlib/double_req_bl_0730a.yml +float-newlib/double_req_bl_0730b.yml +float-newlib/double_req_bl_0730c.yml +float-newlib/double_req_bl_0740.yml +float-newlib/double_req_bl_0832.yml +float-newlib/double_req_bl_0833.yml +float-newlib/double_req_bl_0834.yml +float-newlib/double_req_bl_0870a.yml +float-newlib/double_req_bl_0870b.yml +float-newlib/double_req_bl_0872a.yml +float-newlib/double_req_bl_0872b.yml +float-newlib/double_req_bl_0873a.yml +float-newlib/double_req_bl_0873b.yml +float-newlib/double_req_bl_0874.yml +float-newlib/double_req_bl_0876.yml +float-newlib/double_req_bl_0882.yml +float-newlib/double_req_bl_0883.yml +float-newlib/double_req_bl_0910a.yml +float-newlib/double_req_bl_0910b.yml +float-newlib/double_req_bl_0920a.yml +float-newlib/double_req_bl_0920b.yml +float-newlib/double_req_bl_0921.yml +float-newlib/double_req_bl_0930.yml +float-newlib/double_req_bl_0931.yml +float-newlib/double_req_bl_0960b.yml +float-newlib/double_req_bl_0970a.yml +float-newlib/double_req_bl_0970b.yml +float-newlib/double_req_bl_0971.yml +float-newlib/double_req_bl_0981.yml +float-newlib/double_req_bl_1011a.yml +float-newlib/double_req_bl_1011b.yml +float-newlib/double_req_bl_1012a.yml +float-newlib/double_req_bl_1012b.yml +float-newlib/double_req_bl_1031.yml +float-newlib/double_req_bl_1032a.yml +float-newlib/double_req_bl_1032b.yml +float-newlib/double_req_bl_1032c.yml +float-newlib/double_req_bl_1032d.yml +float-newlib/double_req_bl_1051.yml +float-newlib/double_req_bl_1052a.yml +float-newlib/double_req_bl_1052b.yml +float-newlib/double_req_bl_1052c.yml +float-newlib/double_req_bl_1052d.yml +float-newlib/double_req_bl_1071.yml +float-newlib/double_req_bl_1072a.yml +float-newlib/double_req_bl_1072b.yml +float-newlib/double_req_bl_1072c.yml +float-newlib/double_req_bl_1072d.yml +float-newlib/double_req_bl_1091.yml +float-newlib/double_req_bl_1092a.yml +float-newlib/double_req_bl_1092b.yml +float-newlib/double_req_bl_1092c.yml +float-newlib/double_req_bl_1092d.yml +float-newlib/double_req_bl_1121a.yml +float-newlib/double_req_bl_1121b.yml +float-newlib/double_req_bl_1122a.yml +float-newlib/double_req_bl_1122b.yml +float-newlib/double_req_bl_1130a.yml +float-newlib/double_req_bl_1131a.yml +float-newlib/double_req_bl_1131b.yml +float-newlib/double_req_bl_1210.yml +float-newlib/double_req_bl_1211a.yml +float-newlib/double_req_bl_1211b.yml +float-newlib/double_req_bl_1230.yml +float-newlib/double_req_bl_1231b.yml +float-newlib/double_req_bl_1232a.yml +float-newlib/double_req_bl_1232b.yml +float-newlib/double_req_bl_1250.yml +float-newlib/double_req_bl_1251b.yml +float-newlib/double_req_bl_1252a.yml +float-newlib/double_req_bl_1252b.yml +float-newlib/double_req_bl_1300.yml +float-newlib/float_req_bl_0220a.yml +float-newlib/float_req_bl_0220b.yml +float-newlib/float_req_bl_0240a.yml +float-newlib/float_req_bl_0240b.yml +float-newlib/float_req_bl_0250a.yml +float-newlib/float_req_bl_0250b.yml +float-newlib/float_req_bl_0260.yml +float-newlib/float_req_bl_0270a.yml +float-newlib/float_req_bl_0270b.yml +float-newlib/float_req_bl_0281.yml +float-newlib/float_req_bl_0310.yml +float-newlib/float_req_bl_0320a.yml +float-newlib/float_req_bl_0320b.yml +float-newlib/float_req_bl_0330a.yml +float-newlib/float_req_bl_0330b.yml +float-newlib/float_req_bl_0460.yml +float-newlib/float_req_bl_0470.yml +float-newlib/float_req_bl_0480.yml +float-newlib/float_req_bl_0490a.yml +float-newlib/float_req_bl_0490b.yml +float-newlib/float_req_bl_0530a.yml +float-newlib/float_req_bl_0530b.yml +float-newlib/float_req_bl_0550a.yml +float-newlib/float_req_bl_0550b.yml +float-newlib/float_req_bl_0610.yml +float-newlib/float_req_bl_0620a.yml +float-newlib/float_req_bl_0620b.yml +float-newlib/float_req_bl_0621a.yml +float-newlib/float_req_bl_0621b.yml +float-newlib/float_req_bl_0660a.yml +float-newlib/float_req_bl_0660b.yml +float-newlib/float_req_bl_0661a.yml +float-newlib/float_req_bl_0661b.yml +float-newlib/float_req_bl_0662a.yml +float-newlib/float_req_bl_0662b.yml +float-newlib/float_req_bl_0663a.yml +float-newlib/float_req_bl_0663b.yml +float-newlib/float_req_bl_0670.yml +float-newlib/float_req_bl_0680a.yml +float-newlib/float_req_bl_0680b.yml +float-newlib/float_req_bl_0681a.yml +float-newlib/float_req_bl_0681b.yml +float-newlib/float_req_bl_0682a.yml +float-newlib/float_req_bl_0682b.yml +float-newlib/float_req_bl_0683a.yml +float-newlib/float_req_bl_0683b.yml +float-newlib/float_req_bl_0684a.yml +float-newlib/float_req_bl_0684b.yml +float-newlib/float_req_bl_0685a.yml +float-newlib/float_req_bl_0685b.yml +float-newlib/float_req_bl_0686a.yml +float-newlib/float_req_bl_0686b.yml +float-newlib/float_req_bl_0710.yml +float-newlib/float_req_bl_0720.yml +float-newlib/float_req_bl_0730a.yml +float-newlib/float_req_bl_0730b.yml +float-newlib/float_req_bl_0730c.yml +float-newlib/float_req_bl_0740.yml +float-newlib/float_req_bl_0831.yml +float-newlib/float_req_bl_0832a.yml +float-newlib/float_req_bl_0832b.yml +float-newlib/float_req_bl_0833.yml +float-newlib/float_req_bl_0834.yml +float-newlib/float_req_bl_0870a.yml +float-newlib/float_req_bl_0870b.yml +float-newlib/float_req_bl_0872a.yml +float-newlib/float_req_bl_0872b.yml +float-newlib/float_req_bl_0873a.yml +float-newlib/float_req_bl_0873b.yml +float-newlib/float_req_bl_0874.yml +float-newlib/float_req_bl_0875.yml +float-newlib/float_req_bl_0876.yml +float-newlib/float_req_bl_0877.yml +float-newlib/float_req_bl_0880.yml +float-newlib/float_req_bl_0881.yml +float-newlib/float_req_bl_0883.yml +float-newlib/float_req_bl_0910a.yml +float-newlib/float_req_bl_0910b.yml +float-newlib/float_req_bl_0920a.yml +float-newlib/float_req_bl_0920b.yml +float-newlib/float_req_bl_0921.yml +float-newlib/float_req_bl_0930.yml +float-newlib/float_req_bl_0931.yml +float-newlib/float_req_bl_0960a.yml +float-newlib/float_req_bl_0960b.yml +float-newlib/float_req_bl_0970a.yml +float-newlib/float_req_bl_0970b.yml +float-newlib/float_req_bl_0971.yml +float-newlib/float_req_bl_0981.yml +float-newlib/float_req_bl_1010.yml +float-newlib/float_req_bl_1011a.yml +float-newlib/float_req_bl_1011b.yml +float-newlib/float_req_bl_1012a.yml +float-newlib/float_req_bl_1012b.yml +float-newlib/float_req_bl_1031.yml +float-newlib/float_req_bl_1032a.yml +float-newlib/float_req_bl_1032b.yml +float-newlib/float_req_bl_1032c.yml +float-newlib/float_req_bl_1032d.yml +float-newlib/float_req_bl_1051.yml +float-newlib/float_req_bl_1052a.yml +float-newlib/float_req_bl_1052b.yml +float-newlib/float_req_bl_1052c.yml +float-newlib/float_req_bl_1052d.yml +float-newlib/float_req_bl_1071.yml +float-newlib/float_req_bl_1072a.yml +float-newlib/float_req_bl_1072b.yml +float-newlib/float_req_bl_1072c.yml +float-newlib/float_req_bl_1072d.yml +float-newlib/float_req_bl_1091.yml +float-newlib/float_req_bl_1092a.yml +float-newlib/float_req_bl_1092b.yml +float-newlib/float_req_bl_1092c.yml +float-newlib/float_req_bl_1092d.yml +float-newlib/float_req_bl_1121a.yml +float-newlib/float_req_bl_1121b.yml +float-newlib/float_req_bl_1122a.yml +float-newlib/float_req_bl_1122b.yml +float-newlib/float_req_bl_1130a.yml +float-newlib/float_req_bl_1130b.yml +float-newlib/float_req_bl_1131a.yml +float-newlib/float_req_bl_1131b.yml +float-newlib/float_req_bl_1210.yml +float-newlib/float_req_bl_1211a.yml +float-newlib/float_req_bl_1211b.yml +float-newlib/float_req_bl_1230.yml +float-newlib/float_req_bl_1231.yml +float-newlib/float_req_bl_1232a.yml +float-newlib/float_req_bl_1232b.yml +float-newlib/float_req_bl_1250.yml +float-newlib/float_req_bl_1251.yml +float-newlib/float_req_bl_1252a.yml +float-newlib/float_req_bl_1252b.yml +float-newlib/float_req_bl_1270a.yml +float-newlib/float_req_bl_1270b.yml +float-newlib/float_req_bl_1270c.yml +float-newlib/float_req_bl_1270d.yml +float-newlib/float_req_bl_1271a.yml +float-newlib/float_req_bl_1271b.yml +float-newlib/float_req_bl_1381.yml +floats-cbmc-regression/float-div1.yml +floats-cbmc-regression/float-flags-simp1.yml +floats-cbmc-regression/float-no-simp2.yml +floats-cbmc-regression/float-no-simp4.yml +floats-cbmc-regression/float-no-simp6.yml +floats-cbmc-regression/float-no-simp7.yml +floats-cbmc-regression/float-no-simp8.yml +floats-cbmc-regression/float-rounding1.yml +floats-cbmc-regression/float-to-double2.yml +floats-cbmc-regression/float-zero-sum1.yml +floats-cbmc-regression/float19.yml +floats-cbmc-regression/float2.yml +floats-cbmc-regression/float20.yml +floats-cbmc-regression/float21.yml +floats-cbmc-regression/float22.yml +floats-cbmc-regression/float3.yml +floats-cbmc-regression/float4.yml +floats-cbmc-regression/float_lib1.yml +floats-cbmc-regression/float_lib2.yml +floats-esbmc-regression/ceil.yml +floats-esbmc-regression/ceil_nondet.yml +floats-esbmc-regression/copysign.yml +floats-esbmc-regression/digits_bad_for.yml +floats-esbmc-regression/digits_bad_while.yml +floats-esbmc-regression/digits_for.yml +floats-esbmc-regression/digits_while.yml +floats-esbmc-regression/fabs.yml +floats-esbmc-regression/fdim.yml +floats-esbmc-regression/floor.yml +floats-esbmc-regression/floor_nondet.yml +floats-esbmc-regression/fmax.yml +floats-esbmc-regression/fmin.yml +floats-esbmc-regression/fmod.yml +floats-esbmc-regression/fmod2.yml +floats-esbmc-regression/fmod3.yml +floats-esbmc-regression/isgreater.yml +floats-esbmc-regression/isgreaterequal.yml +floats-esbmc-regression/isless.yml +floats-esbmc-regression/islessequal.yml +floats-esbmc-regression/islessgreater.yml +floats-esbmc-regression/isunordered.yml +floats-esbmc-regression/lrint.yml +floats-esbmc-regression/modf.yml +floats-esbmc-regression/nearbyint.yml +floats-esbmc-regression/nearbyint2.yml +floats-esbmc-regression/remainder.yml +floats-esbmc-regression/rint.yml +floats-esbmc-regression/rint2.yml +floats-esbmc-regression/round.yml +floats-esbmc-regression/round_nondet.yml +floats-esbmc-regression/trunc.yml +floats-esbmc-regression/trunc_nondet.yml +floats-esbmc-regression/trunc_nondet_2.yml +forester-heap/dll-01-1.yml +forester-heap/dll-01-2.yml +forester-heap/dll-circular-1.yml +forester-heap/dll-circular-2.yml +forester-heap/dll-optional-1.yml +forester-heap/dll-optional-2.yml +forester-heap/dll-queue-1.yml +forester-heap/dll-queue-2.yml +forester-heap/dll-rb-cnstr_1-1.yml +forester-heap/dll-rb-cnstr_1-2.yml +forester-heap/dll-rb-sentinel-1.yml +forester-heap/dll-rb-sentinel-2.yml +forester-heap/dll-reverse.yml +forester-heap/dll-simple-white-blue-1.yml +forester-heap/dll-simple-white-blue-2.yml +forester-heap/dll-sorted-1.yml +forester-heap/dll-sorted-2.yml +forester-heap/dll-token-1.yml +forester-heap/dll-token-2.yml +forester-heap/sll-01-1.yml +forester-heap/sll-01-2.yml +forester-heap/sll-buckets-1.yml +forester-heap/sll-buckets-2.yml +forester-heap/sll-circular-1.yml +forester-heap/sll-circular-2.yml +forester-heap/sll-optional-1.yml +forester-heap/sll-optional-2.yml +forester-heap/sll-queue-1.yml +forester-heap/sll-queue-2.yml +forester-heap/sll-rb-cnstr_1-1.yml +forester-heap/sll-rb-cnstr_1-2.yml +forester-heap/sll-rb-sentinel-1.yml +forester-heap/sll-rb-sentinel-2.yml +forester-heap/sll-reverse_simple.yml +forester-heap/sll-simple-white-blue-1.yml +forester-heap/sll-simple-white-blue-2.yml +forester-heap/sll-sorted-1.yml +forester-heap/sll-sorted-2.yml +forester-heap/sll-token-1.yml +forester-heap/sll-token-2.yml +goblint-regression/02-base_26-malloc_struct.yml +goblint-regression/04-mutex_21-sound_base.yml +goblint-regression/04-mutex_22-deref_read.yml +goblint-regression/04-mutex_23-sound_unlock.yml +goblint-regression/04-mutex_27-base_rc.yml +goblint-regression/04-mutex_28-base_nr.yml +goblint-regression/04-mutex_38-indexing_malloc.yml +goblint-regression/04-mutex_44-malloc_sound.yml +goblint-regression/04-mutex_50-funptr_rc.yml +goblint-regression/04-mutex_51-mutex_ptr.yml +goblint-regression/05-lval_ls_01-idx_rc.yml +goblint-regression/05-lval_ls_02-idx_nr.yml +goblint-regression/05-lval_ls_09-idxsense_rc.yml +goblint-regression/05-lval_ls_13-idxunknown_lock.yml +goblint-regression/05-lval_ls_16-idxunknown_unlock.yml +goblint-regression/06-symbeq_02-funloop_norace.yml +goblint-regression/06-symbeq_03-funloop_simple.yml +goblint-regression/06-symbeq_04-funloop_hard1.yml +goblint-regression/06-symbeq_05-funloop_hard2.yml +goblint-regression/06-symbeq_06-tricky_address1.yml +goblint-regression/06-symbeq_07-tricky_address2.yml +goblint-regression/06-symbeq_08-tricky_address3.yml +goblint-regression/06-symbeq_09-tricky_address4.yml +goblint-regression/06-symbeq_10-equ_rc.yml +goblint-regression/06-symbeq_11-equ_nr.yml +goblint-regression/06-symbeq_11a-equ_nr.yml +goblint-regression/06-symbeq_13-equ_proc_nr.yml +goblint-regression/06-symbeq_14-list_entry_rc.yml +goblint-regression/06-symbeq_15-list_entry_nr.yml +goblint-regression/06-symbeq_23-idxsense_nr.yml +goblint-regression/09-regions_01-list_rc.yml +goblint-regression/09-regions_02-list_nr.yml +goblint-regression/09-regions_03-list2_rc.yml +goblint-regression/09-regions_04-list2_nr.yml +goblint-regression/09-regions_05-ptra_rc.yml +goblint-regression/09-regions_06-ptra_nr.yml +goblint-regression/09-regions_09-arraylist-deref.yml +goblint-regression/09-regions_09-arraylist.yml +goblint-regression/09-regions_10-arraylist_rc.yml +goblint-regression/09-regions_11-arraylist_nr-deref.yml +goblint-regression/09-regions_11-arraylist_nr.yml +goblint-regression/09-regions_12-arraycollapse_rc-deref.yml +goblint-regression/09-regions_12-arraycollapse_rc.yml +goblint-regression/09-regions_13-arraycollapse_nr-deref.yml +goblint-regression/09-regions_13-arraycollapse_nr.yml +goblint-regression/09-regions_16-arrayloop_rc.yml +goblint-regression/09-regions_17-arrayloop_nr.yml +goblint-regression/09-regions_18-nested_rc.yml +goblint-regression/09-regions_19-nested_nr-deref.yml +goblint-regression/09-regions_19-nested_nr.yml +goblint-regression/09-regions_20-arrayloop2_rc.yml +goblint-regression/09-regions_21-arrayloop2_nr.yml +goblint-regression/09-regions_22-nocollapse.yml +goblint-regression/09-regions_23-evilcollapse_rc.yml +goblint-regression/09-regions_24-evilcollapse_nr.yml +goblint-regression/09-regions_26-alloc_region_rc.yml +goblint-regression/09-regions_28-list2alloc.yml +goblint-regression/10-synch_02-thread_nonunique.yml +goblint-regression/13-privatized_25-struct_nr_true.yml +goblint-regression/13-privatized_52-refine-protected-loop2-small_true.yml +goblint-regression/13-privatized_68-pfscan_protected_loop_minimal_interval_true.yml +goblint-regression/13-privatized_69-refine-protected-loop-interval_true.yml +goblint-regression/28-race_reach_01-simple_racing.yml +goblint-regression/28-race_reach_02-simple_racefree.yml +goblint-regression/28-race_reach_03-munge_racing.yml +goblint-regression/28-race_reach_04-munge_racefree.yml +goblint-regression/28-race_reach_05-lockfuns_racefree.yml +goblint-regression/28-race_reach_06-cond_racing1.yml +goblint-regression/28-race_reach_07-cond_racing2.yml +goblint-regression/28-race_reach_08-cond_racefree.yml +goblint-regression/28-race_reach_09-ptrmunge_racing.yml +goblint-regression/28-race_reach_10-ptrmunge_racefree.yml +goblint-regression/28-race_reach_11-ptr_racing.yml +goblint-regression/28-race_reach_12-ptr_racefree.yml +goblint-regression/28-race_reach_19-callback_racing.yml +goblint-regression/28-race_reach_20-callback_racefree.yml +goblint-regression/28-race_reach_21-deref_read_racing.yml +goblint-regression/28-race_reach_22-deref_read_racefree.yml +goblint-regression/28-race_reach_23-sound_unlock_racing.yml +goblint-regression/28-race_reach_24-sound_lock_racing.yml +goblint-regression/28-race_reach_27-funptr_racing.yml +goblint-regression/28-race_reach_28-funptr_racefree.yml +goblint-regression/28-race_reach_36-indirect_racefree.yml +goblint-regression/28-race_reach_37-indirect_racing.yml +goblint-regression/28-race_reach_40-trylock_racing.yml +goblint-regression/28-race_reach_41-trylock_racefree.yml +goblint-regression/28-race_reach_42-trylock2_racefree.yml +goblint-regression/28-race_reach_51-mutexptr_racefree.yml +goblint-regression/28-race_reach_60-invariant_racefree.yml +goblint-regression/28-race_reach_61-invariant_racing-2.yml +goblint-regression/28-race_reach_61-invariant_racing.yml +goblint-regression/28-race_reach_70-funloop_racefree.yml +goblint-regression/28-race_reach_71-funloop_racing.yml +goblint-regression/28-race_reach_72-funloop_hard_racing.yml +goblint-regression/28-race_reach_73-funloop_hard_racefree.yml +goblint-regression/28-race_reach_74-tricky_address1_racefree.yml +goblint-regression/28-race_reach_75-tricky_address2_racefree.yml +goblint-regression/28-race_reach_76-tricky_address3_racefree.yml +goblint-regression/28-race_reach_77-tricky_address4_racing.yml +goblint-regression/28-race_reach_78-equ_racing-overflow.yml +goblint-regression/28-race_reach_78-equ_racing.yml +goblint-regression/28-race_reach_79-equ_racefree-overflow.yml +goblint-regression/28-race_reach_79-equ_racefree.yml +goblint-regression/28-race_reach_81-list_racing.yml +goblint-regression/28-race_reach_82-list_racefree.yml +goblint-regression/28-race_reach_83-list2_racing1.yml +goblint-regression/28-race_reach_84-list2_racing2.yml +goblint-regression/28-race_reach_85-list2_racefree.yml +goblint-regression/28-race_reach_86-lists_racing.yml +goblint-regression/28-race_reach_87-lists_racefree.yml +goblint-regression/28-race_reach_90-arrayloop2_racing.yml +goblint-regression/28-race_reach_91-arrayloop2_racefree.yml +goblint-regression/28-race_reach_92-evilcollapse_racing.yml +goblint-regression/28-race_reach_93-evilcollapse_racefree.yml +goblint-regression/28-race_reach_94-alloc_region_racing.yml +hardness-nfm22/hardness_codestructure_dependencies_file-0.yml +hardness-nfm22/hardness_codestructure_dependencies_file-1.yml +hardness-nfm22/hardness_codestructure_dependencies_file-11.yml +hardness-nfm22/hardness_codestructure_dependencies_file-12.yml +hardness-nfm22/hardness_codestructure_dependencies_file-13.yml +hardness-nfm22/hardness_codestructure_dependencies_file-15.yml +hardness-nfm22/hardness_codestructure_dependencies_file-16.yml +hardness-nfm22/hardness_codestructure_dependencies_file-17.yml +hardness-nfm22/hardness_codestructure_dependencies_file-18.yml +hardness-nfm22/hardness_codestructure_dependencies_file-19.yml +hardness-nfm22/hardness_codestructure_dependencies_file-2.yml +hardness-nfm22/hardness_codestructure_dependencies_file-20.yml +hardness-nfm22/hardness_codestructure_dependencies_file-21.yml +hardness-nfm22/hardness_codestructure_dependencies_file-22.yml +hardness-nfm22/hardness_codestructure_dependencies_file-23.yml +hardness-nfm22/hardness_codestructure_dependencies_file-24.yml +hardness-nfm22/hardness_codestructure_dependencies_file-25.yml +hardness-nfm22/hardness_codestructure_dependencies_file-26.yml +hardness-nfm22/hardness_codestructure_dependencies_file-28.yml +hardness-nfm22/hardness_codestructure_dependencies_file-3.yml +hardness-nfm22/hardness_codestructure_dependencies_file-30.yml +hardness-nfm22/hardness_codestructure_dependencies_file-32.yml +hardness-nfm22/hardness_codestructure_dependencies_file-33.yml +hardness-nfm22/hardness_codestructure_dependencies_file-35.yml +hardness-nfm22/hardness_codestructure_dependencies_file-36.yml +hardness-nfm22/hardness_codestructure_dependencies_file-37.yml +hardness-nfm22/hardness_codestructure_dependencies_file-38.yml +hardness-nfm22/hardness_codestructure_dependencies_file-4.yml +hardness-nfm22/hardness_codestructure_dependencies_file-40.yml +hardness-nfm22/hardness_codestructure_dependencies_file-43.yml +hardness-nfm22/hardness_codestructure_dependencies_file-44.yml +hardness-nfm22/hardness_codestructure_dependencies_file-45.yml +hardness-nfm22/hardness_codestructure_dependencies_file-46.yml +hardness-nfm22/hardness_codestructure_dependencies_file-47.yml +hardness-nfm22/hardness_codestructure_dependencies_file-48.yml +hardness-nfm22/hardness_codestructure_dependencies_file-49.yml +hardness-nfm22/hardness_codestructure_dependencies_file-5.yml +hardness-nfm22/hardness_codestructure_dependencies_file-51.yml +hardness-nfm22/hardness_codestructure_dependencies_file-52.yml +hardness-nfm22/hardness_codestructure_dependencies_file-54.yml +hardness-nfm22/hardness_codestructure_dependencies_file-55.yml +hardness-nfm22/hardness_codestructure_dependencies_file-57.yml +hardness-nfm22/hardness_codestructure_dependencies_file-59.yml +hardness-nfm22/hardness_codestructure_dependencies_file-6.yml +hardness-nfm22/hardness_codestructure_dependencies_file-60.yml +hardness-nfm22/hardness_codestructure_dependencies_file-61.yml +hardness-nfm22/hardness_codestructure_dependencies_file-62.yml +hardness-nfm22/hardness_codestructure_dependencies_file-63.yml +hardness-nfm22/hardness_codestructure_dependencies_file-65.yml +hardness-nfm22/hardness_codestructure_dependencies_file-66.yml +hardness-nfm22/hardness_codestructure_dependencies_file-67.yml +hardness-nfm22/hardness_codestructure_dependencies_file-68.yml +hardness-nfm22/hardness_codestructure_dependencies_file-69.yml +hardness-nfm22/hardness_codestructure_dependencies_file-70.yml +hardness-nfm22/hardness_codestructure_dependencies_file-72.yml +hardness-nfm22/hardness_codestructure_dependencies_file-73.yml +hardness-nfm22/hardness_codestructure_dependencies_file-74.yml +hardness-nfm22/hardness_codestructure_dependencies_file-75.yml +hardness-nfm22/hardness_codestructure_dependencies_file-76.yml +hardness-nfm22/hardness_codestructure_dependencies_file-78.yml +hardness-nfm22/hardness_codestructure_dependencies_file-79.yml +hardness-nfm22/hardness_codestructure_dependencies_file-8.yml +hardness-nfm22/hardness_codestructure_dependencies_file-80.yml +hardness-nfm22/hardness_codestructure_dependencies_file-82.yml +hardness-nfm22/hardness_codestructure_dependencies_file-84.yml +hardness-nfm22/hardness_codestructure_dependencies_file-85.yml +hardness-nfm22/hardness_codestructure_dependencies_file-87.yml +hardness-nfm22/hardness_codestructure_dependencies_file-88.yml +hardness-nfm22/hardness_codestructure_dependencies_file-89.yml +hardness-nfm22/hardness_codestructure_dependencies_file-9.yml +hardness-nfm22/hardness_codestructure_dependencies_file-92.yml +hardness-nfm22/hardness_codestructure_dependencies_file-94.yml +hardness-nfm22/hardness_codestructure_dependencies_file-95.yml +hardness-nfm22/hardness_codestructure_dependencies_file-96.yml +hardness-nfm22/hardness_codestructure_dependencies_file-98.yml +hardness-nfm22/hardness_codestructure_dependencies_file-99.yml +hardness-nfm22/hardness_codestructure_functionizing_file-0.yml +hardness-nfm22/hardness_codestructure_functionizing_file-1.yml +hardness-nfm22/hardness_codestructure_functionizing_file-2.yml +hardness-nfm22/hardness_codestructure_functionizing_file-3.yml +hardness-nfm22/hardness_codestructure_functionizing_file-4.yml +hardness-nfm22/hardness_codestructure_functionizing_file-5.yml +hardness-nfm22/hardness_codestructure_functionizing_file-6.yml +hardness-nfm22/hardness_codestructure_functionizing_file-8.yml +hardness-nfm22/hardness_codestructure_functionizing_file-9.yml +hardness-nfm22/hardness_codestructure_normal_file-0.yml +hardness-nfm22/hardness_codestructure_normal_file-1.yml +hardness-nfm22/hardness_codestructure_normal_file-11.yml +hardness-nfm22/hardness_codestructure_normal_file-12.yml +hardness-nfm22/hardness_codestructure_normal_file-13.yml +hardness-nfm22/hardness_codestructure_normal_file-15.yml +hardness-nfm22/hardness_codestructure_normal_file-16.yml +hardness-nfm22/hardness_codestructure_normal_file-17.yml +hardness-nfm22/hardness_codestructure_normal_file-18.yml +hardness-nfm22/hardness_codestructure_normal_file-19.yml +hardness-nfm22/hardness_codestructure_normal_file-2.yml +hardness-nfm22/hardness_codestructure_normal_file-20.yml +hardness-nfm22/hardness_codestructure_normal_file-21.yml +hardness-nfm22/hardness_codestructure_normal_file-22.yml +hardness-nfm22/hardness_codestructure_normal_file-23.yml +hardness-nfm22/hardness_codestructure_normal_file-24.yml +hardness-nfm22/hardness_codestructure_normal_file-25.yml +hardness-nfm22/hardness_codestructure_normal_file-26.yml +hardness-nfm22/hardness_codestructure_normal_file-28.yml +hardness-nfm22/hardness_codestructure_normal_file-29.yml +hardness-nfm22/hardness_codestructure_normal_file-3.yml +hardness-nfm22/hardness_codestructure_normal_file-30.yml +hardness-nfm22/hardness_codestructure_normal_file-32.yml +hardness-nfm22/hardness_codestructure_normal_file-33.yml +hardness-nfm22/hardness_codestructure_normal_file-35.yml +hardness-nfm22/hardness_codestructure_normal_file-36.yml +hardness-nfm22/hardness_codestructure_normal_file-37.yml +hardness-nfm22/hardness_codestructure_normal_file-38.yml +hardness-nfm22/hardness_codestructure_normal_file-4.yml +hardness-nfm22/hardness_codestructure_normal_file-40.yml +hardness-nfm22/hardness_codestructure_normal_file-41.yml +hardness-nfm22/hardness_codestructure_normal_file-43.yml +hardness-nfm22/hardness_codestructure_normal_file-44.yml +hardness-nfm22/hardness_codestructure_normal_file-45.yml +hardness-nfm22/hardness_codestructure_normal_file-46.yml +hardness-nfm22/hardness_codestructure_normal_file-47.yml +hardness-nfm22/hardness_codestructure_normal_file-48.yml +hardness-nfm22/hardness_codestructure_normal_file-49.yml +hardness-nfm22/hardness_codestructure_normal_file-5.yml +hardness-nfm22/hardness_codestructure_normal_file-51.yml +hardness-nfm22/hardness_codestructure_normal_file-52.yml +hardness-nfm22/hardness_codestructure_normal_file-54.yml +hardness-nfm22/hardness_codestructure_normal_file-55.yml +hardness-nfm22/hardness_codestructure_normal_file-57.yml +hardness-nfm22/hardness_codestructure_normal_file-59.yml +hardness-nfm22/hardness_codestructure_normal_file-6.yml +hardness-nfm22/hardness_codestructure_normal_file-60.yml +hardness-nfm22/hardness_codestructure_normal_file-61.yml +hardness-nfm22/hardness_codestructure_normal_file-62.yml +hardness-nfm22/hardness_codestructure_normal_file-63.yml +hardness-nfm22/hardness_codestructure_normal_file-65.yml +hardness-nfm22/hardness_codestructure_normal_file-66.yml +hardness-nfm22/hardness_codestructure_normal_file-67.yml +hardness-nfm22/hardness_codestructure_normal_file-68.yml +hardness-nfm22/hardness_codestructure_normal_file-69.yml +hardness-nfm22/hardness_codestructure_normal_file-70.yml +hardness-nfm22/hardness_codestructure_normal_file-72.yml +hardness-nfm22/hardness_codestructure_normal_file-73.yml +hardness-nfm22/hardness_codestructure_normal_file-74.yml +hardness-nfm22/hardness_codestructure_normal_file-75.yml +hardness-nfm22/hardness_codestructure_normal_file-76.yml +hardness-nfm22/hardness_codestructure_normal_file-78.yml +hardness-nfm22/hardness_codestructure_normal_file-79.yml +hardness-nfm22/hardness_codestructure_normal_file-8.yml +hardness-nfm22/hardness_codestructure_normal_file-80.yml +hardness-nfm22/hardness_codestructure_normal_file-82.yml +hardness-nfm22/hardness_codestructure_normal_file-84.yml +hardness-nfm22/hardness_codestructure_normal_file-85.yml +hardness-nfm22/hardness_codestructure_normal_file-87.yml +hardness-nfm22/hardness_codestructure_normal_file-88.yml +hardness-nfm22/hardness_codestructure_normal_file-89.yml +hardness-nfm22/hardness_codestructure_normal_file-9.yml +hardness-nfm22/hardness_codestructure_normal_file-92.yml +hardness-nfm22/hardness_codestructure_normal_file-94.yml +hardness-nfm22/hardness_codestructure_normal_file-95.yml +hardness-nfm22/hardness_codestructure_normal_file-96.yml +hardness-nfm22/hardness_codestructure_normal_file-98.yml +hardness-nfm22/hardness_codestructure_normal_file-99.yml +hardness-nfm22/hardness_codestructure_steplocals_file-0.yml +hardness-nfm22/hardness_codestructure_steplocals_file-1.yml +hardness-nfm22/hardness_codestructure_steplocals_file-11.yml +hardness-nfm22/hardness_codestructure_steplocals_file-12.yml +hardness-nfm22/hardness_codestructure_steplocals_file-13.yml +hardness-nfm22/hardness_codestructure_steplocals_file-15.yml +hardness-nfm22/hardness_codestructure_steplocals_file-16.yml +hardness-nfm22/hardness_codestructure_steplocals_file-17.yml +hardness-nfm22/hardness_codestructure_steplocals_file-18.yml +hardness-nfm22/hardness_codestructure_steplocals_file-19.yml +hardness-nfm22/hardness_codestructure_steplocals_file-2.yml +hardness-nfm22/hardness_codestructure_steplocals_file-20.yml +hardness-nfm22/hardness_codestructure_steplocals_file-21.yml +hardness-nfm22/hardness_codestructure_steplocals_file-22.yml +hardness-nfm22/hardness_codestructure_steplocals_file-23.yml +hardness-nfm22/hardness_codestructure_steplocals_file-24.yml +hardness-nfm22/hardness_codestructure_steplocals_file-25.yml +hardness-nfm22/hardness_codestructure_steplocals_file-26.yml +hardness-nfm22/hardness_codestructure_steplocals_file-28.yml +hardness-nfm22/hardness_codestructure_steplocals_file-29.yml +hardness-nfm22/hardness_codestructure_steplocals_file-3.yml +hardness-nfm22/hardness_codestructure_steplocals_file-30.yml +hardness-nfm22/hardness_codestructure_steplocals_file-32.yml +hardness-nfm22/hardness_codestructure_steplocals_file-33.yml +hardness-nfm22/hardness_codestructure_steplocals_file-35.yml +hardness-nfm22/hardness_codestructure_steplocals_file-36.yml +hardness-nfm22/hardness_codestructure_steplocals_file-37.yml +hardness-nfm22/hardness_codestructure_steplocals_file-38.yml +hardness-nfm22/hardness_codestructure_steplocals_file-4.yml +hardness-nfm22/hardness_codestructure_steplocals_file-40.yml +hardness-nfm22/hardness_codestructure_steplocals_file-41.yml +hardness-nfm22/hardness_codestructure_steplocals_file-43.yml +hardness-nfm22/hardness_codestructure_steplocals_file-44.yml +hardness-nfm22/hardness_codestructure_steplocals_file-45.yml +hardness-nfm22/hardness_codestructure_steplocals_file-46.yml +hardness-nfm22/hardness_codestructure_steplocals_file-47.yml +hardness-nfm22/hardness_codestructure_steplocals_file-48.yml +hardness-nfm22/hardness_codestructure_steplocals_file-49.yml +hardness-nfm22/hardness_codestructure_steplocals_file-5.yml +hardness-nfm22/hardness_codestructure_steplocals_file-51.yml +hardness-nfm22/hardness_codestructure_steplocals_file-52.yml +hardness-nfm22/hardness_codestructure_steplocals_file-54.yml +hardness-nfm22/hardness_codestructure_steplocals_file-55.yml +hardness-nfm22/hardness_codestructure_steplocals_file-57.yml +hardness-nfm22/hardness_codestructure_steplocals_file-59.yml +hardness-nfm22/hardness_codestructure_steplocals_file-6.yml +hardness-nfm22/hardness_codestructure_steplocals_file-60.yml +hardness-nfm22/hardness_codestructure_steplocals_file-61.yml +hardness-nfm22/hardness_codestructure_steplocals_file-62.yml +hardness-nfm22/hardness_codestructure_steplocals_file-63.yml +hardness-nfm22/hardness_codestructure_steplocals_file-65.yml +hardness-nfm22/hardness_codestructure_steplocals_file-66.yml +hardness-nfm22/hardness_codestructure_steplocals_file-67.yml +hardness-nfm22/hardness_codestructure_steplocals_file-68.yml +hardness-nfm22/hardness_codestructure_steplocals_file-69.yml +hardness-nfm22/hardness_codestructure_steplocals_file-70.yml +hardness-nfm22/hardness_codestructure_steplocals_file-72.yml +hardness-nfm22/hardness_codestructure_steplocals_file-73.yml +hardness-nfm22/hardness_codestructure_steplocals_file-74.yml +hardness-nfm22/hardness_codestructure_steplocals_file-75.yml +hardness-nfm22/hardness_codestructure_steplocals_file-76.yml +hardness-nfm22/hardness_codestructure_steplocals_file-78.yml +hardness-nfm22/hardness_codestructure_steplocals_file-79.yml +hardness-nfm22/hardness_codestructure_steplocals_file-8.yml +hardness-nfm22/hardness_codestructure_steplocals_file-80.yml +hardness-nfm22/hardness_codestructure_steplocals_file-82.yml +hardness-nfm22/hardness_codestructure_steplocals_file-84.yml +hardness-nfm22/hardness_codestructure_steplocals_file-85.yml +hardness-nfm22/hardness_codestructure_steplocals_file-87.yml +hardness-nfm22/hardness_codestructure_steplocals_file-88.yml +hardness-nfm22/hardness_codestructure_steplocals_file-89.yml +hardness-nfm22/hardness_codestructure_steplocals_file-9.yml +hardness-nfm22/hardness_codestructure_steplocals_file-92.yml +hardness-nfm22/hardness_codestructure_steplocals_file-94.yml +hardness-nfm22/hardness_codestructure_steplocals_file-95.yml +hardness-nfm22/hardness_codestructure_steplocals_file-96.yml +hardness-nfm22/hardness_codestructure_steplocals_file-98.yml +hardness-nfm22/hardness_codestructure_steplocals_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodesize_normal_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-10.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-14.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-27.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-29.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-31.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-34.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-39.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-41.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-50.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-53.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-56.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-7.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-71.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-83.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-86.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-90.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-91.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-93.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-100_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-10.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-14.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-27.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-29.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-31.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-34.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-50.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-58.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-81.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-93.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-10_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-10.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-14.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-27.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-29.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-31.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-34.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-39.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-41.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-42.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-50.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-53.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-56.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-58.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-64.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-7.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-77.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-81.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-83.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-86.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-90.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-91.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-93.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-97.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-250_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-10.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-14.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-27.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-29.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-34.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-39.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-50.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-53.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-58.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-7.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-71.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-77.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-83.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-86.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-91.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-93.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-25_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-10.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-14.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-27.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-29.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-31.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-34.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-39.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-41.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-42.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-50.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-53.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-56.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-58.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-64.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-7.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-71.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-77.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-81.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-83.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-86.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-90.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-91.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-93.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-97.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-500_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-10.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-14.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-29.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-31.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-34.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-39.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-41.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-50.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-56.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-7.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-71.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-83.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-91.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-93.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-97.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodesize_ps-cn-50_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-10.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-14.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-29.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-31.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-34.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-39.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-41.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-50.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-56.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-71.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-91.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-97.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-ci_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-10.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-14.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-29.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-31.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-34.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-39.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-41.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-50.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-56.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-7.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-71.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-83.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-91.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-93.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-97.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-cn_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-10.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-14.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-29.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-31.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-34.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-39.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-41.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-50.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-56.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-7.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-71.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-91.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-93.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-97.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pe-co_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-10.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-14.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-29.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-31.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-34.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-39.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-41.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-50.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-56.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-71.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-91.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-97.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-ci_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-10.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-14.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-29.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-31.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-34.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-39.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-41.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-50.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-56.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-7.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-71.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-83.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-91.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-93.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-97.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-cn_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-10.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-14.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-29.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-31.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-34.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-39.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-41.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-50.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-56.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-7.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-71.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-91.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-93.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-97.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-pr-co_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-10.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-14.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-29.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-31.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-34.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-39.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-41.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-50.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-56.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-71.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-91.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-97.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-ci_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-10.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-14.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-29.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-31.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-34.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-39.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-41.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-50.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-56.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-7.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-71.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-83.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-91.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-93.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-97.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-cn_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-10.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-14.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-29.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-31.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-34.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-39.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-41.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-50.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-56.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-7.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-71.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-91.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-93.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-97.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_filler-ps-co_file-99.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-0.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-1.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-11.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-12.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-13.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-15.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-16.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-17.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-18.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-19.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-2.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-20.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-21.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-22.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-23.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-24.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-25.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-26.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-28.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-3.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-30.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-32.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-33.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-35.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-36.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-37.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-38.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-4.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-40.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-43.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-44.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-45.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-46.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-47.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-48.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-49.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-5.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-51.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-52.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-54.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-55.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-57.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-59.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-6.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-60.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-61.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-62.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-63.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-65.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-66.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-67.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-68.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-69.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-70.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-72.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-73.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-74.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-75.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-76.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-78.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-79.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-8.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-80.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-82.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-84.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-85.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-87.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-88.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-89.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-9.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-92.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-94.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-95.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-96.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-98.yml +hardness-nfm22/hardness_fillercode_fillercodestructure_normal_file-99.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-0.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-10.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-11.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-13.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-14.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-15.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-17.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-20.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-21.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-3.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-31.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-34.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-36.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-38.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-40.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-41.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-44.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-45.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-46.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-47.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-5.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-50.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-51.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-52.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-53.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-54.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-55.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-56.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-6.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-60.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-61.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-64.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-65.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-67.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-68.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-69.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-7.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-70.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-72.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-73.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-74.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-75.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-76.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-77.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-78.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-79.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-80.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-81.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-82.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-83.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-9.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-92.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-93.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-94.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-96.yml +hardness-nfm22/hardness_floatingpointinfluence_has-floats_file-98.yml +hardness-nfm22/hardness_floatingpointinfluence_no-floats_file-15.yml +hardness-nfm22/hardness_floatingpointinfluence_no-floats_file-34.yml +hardness-nfm22/hardness_floatingpointinfluence_no-floats_file-35.yml +hardness-nfm22/hardness_floatingpointinfluence_no-floats_file-47.yml +hardness-nfm22/hardness_floatingpointinfluence_no-floats_file-5.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-0.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-1.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-11.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-12.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-13.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-14.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-15.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-16.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-17.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-18.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-19.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-2.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-20.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-21.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-22.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-23.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-25.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-27.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-28.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-29.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-3.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-31.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-32.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-34.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-35.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-36.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-37.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-38.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-39.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-4.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-40.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-42.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-43.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-44.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-45.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-46.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-47.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-48.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-49.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-5.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-50.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-51.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-52.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-53.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-56.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-57.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-58.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-59.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-6.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-60.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-61.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-62.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-63.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-64.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-66.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-67.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-7.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-70.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-71.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-72.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-73.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-74.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-75.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-76.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-78.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-79.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-8.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-80.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-81.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-82.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-83.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-84.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-85.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-88.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-89.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-9.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-90.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-91.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-92.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-93.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-94.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-95.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-96.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-1loop_file-97.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-0.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-1.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-11.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-12.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-13.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-14.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-15.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-16.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-17.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-18.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-19.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-2.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-20.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-21.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-22.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-23.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-25.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-27.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-28.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-29.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-3.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-31.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-32.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-34.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-35.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-36.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-37.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-38.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-39.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-4.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-40.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-42.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-43.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-44.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-45.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-46.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-47.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-48.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-49.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-5.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-50.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-51.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-52.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-53.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-56.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-57.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-58.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-59.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-6.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-60.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-61.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-62.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-63.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-64.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-66.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-67.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-7.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-70.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-71.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-72.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-73.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-74.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-75.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-76.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-78.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-79.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-8.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-80.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-81.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-82.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-83.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-84.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-85.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-88.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-89.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-9.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-90.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-91.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-92.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-93.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-94.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-95.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-96.yml +hardness-nfm22/hardness_loopvsstraightlinecode_100-while_file-97.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-0.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-10.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-11.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-15.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-17.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-20.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-21.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-25.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-26.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-3.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-31.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-34.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-36.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-37.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-38.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-43.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-45.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-46.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-47.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-50.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-51.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-52.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-53.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-57.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-59.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-6.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-60.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-64.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-65.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-66.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-68.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-7.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-70.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-72.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-73.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-74.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-75.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-79.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-80.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-81.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-83.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-85.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-89.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-9.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-90.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-92.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-93.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-94.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-95.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-98.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-1loop_file-99.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-0.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-10.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-11.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-15.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-17.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-20.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-21.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-25.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-26.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-3.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-31.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-34.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-36.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-37.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-38.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-43.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-45.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-46.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-47.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-50.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-51.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-52.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-53.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-57.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-59.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-6.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-60.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-64.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-65.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-66.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-68.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-7.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-70.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-72.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-73.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-74.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-75.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-79.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-80.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-81.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-83.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-85.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-89.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-9.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-90.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-92.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-93.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-94.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-95.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-98.yml +hardness-nfm22/hardness_loopvsstraightlinecode_25-while_file-99.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-0.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-1.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-11.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-12.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-13.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-15.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-16.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-17.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-18.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-19.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-2.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-20.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-21.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-22.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-23.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-24.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-25.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-26.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-28.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-3.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-30.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-32.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-33.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-35.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-36.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-37.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-38.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-4.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-40.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-43.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-44.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-45.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-46.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-47.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-48.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-49.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-5.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-51.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-52.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-54.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-55.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-57.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-59.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-6.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-60.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-61.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-62.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-63.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-65.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-66.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-67.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-68.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-69.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-70.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-72.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-73.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-74.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-75.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-76.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-78.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-79.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-8.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-80.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-82.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-84.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-85.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-87.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-88.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-89.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-9.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-92.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-94.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-95.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-96.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-98.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-1loop_file-99.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-0.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-1.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-11.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-12.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-13.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-15.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-16.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-17.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-18.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-19.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-2.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-20.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-21.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-22.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-23.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-24.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-25.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-26.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-28.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-3.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-30.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-32.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-33.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-35.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-36.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-37.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-38.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-4.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-40.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-43.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-44.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-45.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-46.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-47.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-48.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-49.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-5.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-51.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-52.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-54.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-55.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-57.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-59.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-6.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-60.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-61.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-62.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-63.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-65.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-66.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-67.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-68.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-69.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-70.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-72.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-73.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-74.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-75.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-76.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-78.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-79.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-8.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-80.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-82.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-84.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-85.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-87.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-88.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-89.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-9.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-92.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-94.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-95.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-96.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-98.yml +hardness-nfm22/hardness_loopvsstraightlinecode_50-while_file-99.yml +hardness-nfm22/hardness_operatoramount_amount100_file-0.yml +hardness-nfm22/hardness_operatoramount_amount100_file-1.yml +hardness-nfm22/hardness_operatoramount_amount100_file-11.yml +hardness-nfm22/hardness_operatoramount_amount100_file-12.yml +hardness-nfm22/hardness_operatoramount_amount100_file-13.yml +hardness-nfm22/hardness_operatoramount_amount100_file-14.yml +hardness-nfm22/hardness_operatoramount_amount100_file-15.yml +hardness-nfm22/hardness_operatoramount_amount100_file-16.yml +hardness-nfm22/hardness_operatoramount_amount100_file-17.yml +hardness-nfm22/hardness_operatoramount_amount100_file-18.yml +hardness-nfm22/hardness_operatoramount_amount100_file-19.yml +hardness-nfm22/hardness_operatoramount_amount100_file-2.yml +hardness-nfm22/hardness_operatoramount_amount100_file-20.yml +hardness-nfm22/hardness_operatoramount_amount100_file-21.yml +hardness-nfm22/hardness_operatoramount_amount100_file-22.yml +hardness-nfm22/hardness_operatoramount_amount100_file-23.yml +hardness-nfm22/hardness_operatoramount_amount100_file-25.yml +hardness-nfm22/hardness_operatoramount_amount100_file-27.yml +hardness-nfm22/hardness_operatoramount_amount100_file-28.yml +hardness-nfm22/hardness_operatoramount_amount100_file-29.yml +hardness-nfm22/hardness_operatoramount_amount100_file-3.yml +hardness-nfm22/hardness_operatoramount_amount100_file-31.yml +hardness-nfm22/hardness_operatoramount_amount100_file-32.yml +hardness-nfm22/hardness_operatoramount_amount100_file-34.yml +hardness-nfm22/hardness_operatoramount_amount100_file-35.yml +hardness-nfm22/hardness_operatoramount_amount100_file-36.yml +hardness-nfm22/hardness_operatoramount_amount100_file-37.yml +hardness-nfm22/hardness_operatoramount_amount100_file-38.yml +hardness-nfm22/hardness_operatoramount_amount100_file-39.yml +hardness-nfm22/hardness_operatoramount_amount100_file-4.yml +hardness-nfm22/hardness_operatoramount_amount100_file-40.yml +hardness-nfm22/hardness_operatoramount_amount100_file-42.yml +hardness-nfm22/hardness_operatoramount_amount100_file-43.yml +hardness-nfm22/hardness_operatoramount_amount100_file-44.yml +hardness-nfm22/hardness_operatoramount_amount100_file-45.yml +hardness-nfm22/hardness_operatoramount_amount100_file-46.yml +hardness-nfm22/hardness_operatoramount_amount100_file-47.yml +hardness-nfm22/hardness_operatoramount_amount100_file-48.yml +hardness-nfm22/hardness_operatoramount_amount100_file-49.yml +hardness-nfm22/hardness_operatoramount_amount100_file-5.yml +hardness-nfm22/hardness_operatoramount_amount100_file-50.yml +hardness-nfm22/hardness_operatoramount_amount100_file-51.yml +hardness-nfm22/hardness_operatoramount_amount100_file-52.yml +hardness-nfm22/hardness_operatoramount_amount100_file-53.yml +hardness-nfm22/hardness_operatoramount_amount100_file-56.yml +hardness-nfm22/hardness_operatoramount_amount100_file-57.yml +hardness-nfm22/hardness_operatoramount_amount100_file-58.yml +hardness-nfm22/hardness_operatoramount_amount100_file-59.yml +hardness-nfm22/hardness_operatoramount_amount100_file-6.yml +hardness-nfm22/hardness_operatoramount_amount100_file-60.yml +hardness-nfm22/hardness_operatoramount_amount100_file-61.yml +hardness-nfm22/hardness_operatoramount_amount100_file-62.yml +hardness-nfm22/hardness_operatoramount_amount100_file-63.yml +hardness-nfm22/hardness_operatoramount_amount100_file-64.yml +hardness-nfm22/hardness_operatoramount_amount100_file-66.yml +hardness-nfm22/hardness_operatoramount_amount100_file-67.yml +hardness-nfm22/hardness_operatoramount_amount100_file-7.yml +hardness-nfm22/hardness_operatoramount_amount100_file-70.yml +hardness-nfm22/hardness_operatoramount_amount100_file-71.yml +hardness-nfm22/hardness_operatoramount_amount100_file-72.yml +hardness-nfm22/hardness_operatoramount_amount100_file-73.yml +hardness-nfm22/hardness_operatoramount_amount100_file-74.yml +hardness-nfm22/hardness_operatoramount_amount100_file-75.yml +hardness-nfm22/hardness_operatoramount_amount100_file-76.yml +hardness-nfm22/hardness_operatoramount_amount100_file-78.yml +hardness-nfm22/hardness_operatoramount_amount100_file-79.yml +hardness-nfm22/hardness_operatoramount_amount100_file-8.yml +hardness-nfm22/hardness_operatoramount_amount100_file-80.yml +hardness-nfm22/hardness_operatoramount_amount100_file-81.yml +hardness-nfm22/hardness_operatoramount_amount100_file-82.yml +hardness-nfm22/hardness_operatoramount_amount100_file-83.yml +hardness-nfm22/hardness_operatoramount_amount100_file-84.yml +hardness-nfm22/hardness_operatoramount_amount100_file-85.yml +hardness-nfm22/hardness_operatoramount_amount100_file-88.yml +hardness-nfm22/hardness_operatoramount_amount100_file-89.yml +hardness-nfm22/hardness_operatoramount_amount100_file-9.yml +hardness-nfm22/hardness_operatoramount_amount100_file-90.yml +hardness-nfm22/hardness_operatoramount_amount100_file-91.yml +hardness-nfm22/hardness_operatoramount_amount100_file-92.yml +hardness-nfm22/hardness_operatoramount_amount100_file-93.yml +hardness-nfm22/hardness_operatoramount_amount100_file-94.yml +hardness-nfm22/hardness_operatoramount_amount100_file-95.yml +hardness-nfm22/hardness_operatoramount_amount100_file-96.yml +hardness-nfm22/hardness_operatoramount_amount100_file-97.yml +hardness-nfm22/hardness_operatoramount_amount10_file-12.yml +hardness-nfm22/hardness_operatoramount_amount10_file-14.yml +hardness-nfm22/hardness_operatoramount_amount10_file-16.yml +hardness-nfm22/hardness_operatoramount_amount10_file-18.yml +hardness-nfm22/hardness_operatoramount_amount10_file-22.yml +hardness-nfm22/hardness_operatoramount_amount10_file-25.yml +hardness-nfm22/hardness_operatoramount_amount10_file-26.yml +hardness-nfm22/hardness_operatoramount_amount10_file-27.yml +hardness-nfm22/hardness_operatoramount_amount10_file-28.yml +hardness-nfm22/hardness_operatoramount_amount10_file-30.yml +hardness-nfm22/hardness_operatoramount_amount10_file-34.yml +hardness-nfm22/hardness_operatoramount_amount10_file-35.yml +hardness-nfm22/hardness_operatoramount_amount10_file-37.yml +hardness-nfm22/hardness_operatoramount_amount10_file-45.yml +hardness-nfm22/hardness_operatoramount_amount10_file-46.yml +hardness-nfm22/hardness_operatoramount_amount10_file-47.yml +hardness-nfm22/hardness_operatoramount_amount10_file-50.yml +hardness-nfm22/hardness_operatoramount_amount10_file-61.yml +hardness-nfm22/hardness_operatoramount_amount10_file-62.yml +hardness-nfm22/hardness_operatoramount_amount10_file-63.yml +hardness-nfm22/hardness_operatoramount_amount10_file-71.yml +hardness-nfm22/hardness_operatoramount_amount10_file-72.yml +hardness-nfm22/hardness_operatoramount_amount10_file-76.yml +hardness-nfm22/hardness_operatoramount_amount10_file-79.yml +hardness-nfm22/hardness_operatoramount_amount10_file-86.yml +hardness-nfm22/hardness_operatoramount_amount10_file-9.yml +hardness-nfm22/hardness_operatoramount_amount10_file-95.yml +hardness-nfm22/hardness_operatoramount_amount10_file-99.yml +hardness-nfm22/hardness_operatoramount_amount250_file-0.yml +hardness-nfm22/hardness_operatoramount_amount250_file-10.yml +hardness-nfm22/hardness_operatoramount_amount250_file-11.yml +hardness-nfm22/hardness_operatoramount_amount250_file-12.yml +hardness-nfm22/hardness_operatoramount_amount250_file-13.yml +hardness-nfm22/hardness_operatoramount_amount250_file-14.yml +hardness-nfm22/hardness_operatoramount_amount250_file-15.yml +hardness-nfm22/hardness_operatoramount_amount250_file-16.yml +hardness-nfm22/hardness_operatoramount_amount250_file-17.yml +hardness-nfm22/hardness_operatoramount_amount250_file-18.yml +hardness-nfm22/hardness_operatoramount_amount250_file-19.yml +hardness-nfm22/hardness_operatoramount_amount250_file-2.yml +hardness-nfm22/hardness_operatoramount_amount250_file-21.yml +hardness-nfm22/hardness_operatoramount_amount250_file-22.yml +hardness-nfm22/hardness_operatoramount_amount250_file-23.yml +hardness-nfm22/hardness_operatoramount_amount250_file-24.yml +hardness-nfm22/hardness_operatoramount_amount250_file-25.yml +hardness-nfm22/hardness_operatoramount_amount250_file-26.yml +hardness-nfm22/hardness_operatoramount_amount250_file-27.yml +hardness-nfm22/hardness_operatoramount_amount250_file-28.yml +hardness-nfm22/hardness_operatoramount_amount250_file-29.yml +hardness-nfm22/hardness_operatoramount_amount250_file-3.yml +hardness-nfm22/hardness_operatoramount_amount250_file-30.yml +hardness-nfm22/hardness_operatoramount_amount250_file-31.yml +hardness-nfm22/hardness_operatoramount_amount250_file-32.yml +hardness-nfm22/hardness_operatoramount_amount250_file-33.yml +hardness-nfm22/hardness_operatoramount_amount250_file-34.yml +hardness-nfm22/hardness_operatoramount_amount250_file-35.yml +hardness-nfm22/hardness_operatoramount_amount250_file-36.yml +hardness-nfm22/hardness_operatoramount_amount250_file-37.yml +hardness-nfm22/hardness_operatoramount_amount250_file-38.yml +hardness-nfm22/hardness_operatoramount_amount250_file-39.yml +hardness-nfm22/hardness_operatoramount_amount250_file-4.yml +hardness-nfm22/hardness_operatoramount_amount250_file-40.yml +hardness-nfm22/hardness_operatoramount_amount250_file-41.yml +hardness-nfm22/hardness_operatoramount_amount250_file-42.yml +hardness-nfm22/hardness_operatoramount_amount250_file-43.yml +hardness-nfm22/hardness_operatoramount_amount250_file-44.yml +hardness-nfm22/hardness_operatoramount_amount250_file-45.yml +hardness-nfm22/hardness_operatoramount_amount250_file-46.yml +hardness-nfm22/hardness_operatoramount_amount250_file-47.yml +hardness-nfm22/hardness_operatoramount_amount250_file-48.yml +hardness-nfm22/hardness_operatoramount_amount250_file-49.yml +hardness-nfm22/hardness_operatoramount_amount250_file-5.yml +hardness-nfm22/hardness_operatoramount_amount250_file-50.yml +hardness-nfm22/hardness_operatoramount_amount250_file-51.yml +hardness-nfm22/hardness_operatoramount_amount250_file-52.yml +hardness-nfm22/hardness_operatoramount_amount250_file-53.yml +hardness-nfm22/hardness_operatoramount_amount250_file-54.yml +hardness-nfm22/hardness_operatoramount_amount250_file-55.yml +hardness-nfm22/hardness_operatoramount_amount250_file-56.yml +hardness-nfm22/hardness_operatoramount_amount250_file-57.yml +hardness-nfm22/hardness_operatoramount_amount250_file-58.yml +hardness-nfm22/hardness_operatoramount_amount250_file-59.yml +hardness-nfm22/hardness_operatoramount_amount250_file-6.yml +hardness-nfm22/hardness_operatoramount_amount250_file-60.yml +hardness-nfm22/hardness_operatoramount_amount250_file-61.yml +hardness-nfm22/hardness_operatoramount_amount250_file-62.yml +hardness-nfm22/hardness_operatoramount_amount250_file-63.yml +hardness-nfm22/hardness_operatoramount_amount250_file-64.yml +hardness-nfm22/hardness_operatoramount_amount250_file-65.yml +hardness-nfm22/hardness_operatoramount_amount250_file-66.yml +hardness-nfm22/hardness_operatoramount_amount250_file-67.yml +hardness-nfm22/hardness_operatoramount_amount250_file-68.yml +hardness-nfm22/hardness_operatoramount_amount250_file-69.yml +hardness-nfm22/hardness_operatoramount_amount250_file-7.yml +hardness-nfm22/hardness_operatoramount_amount250_file-70.yml +hardness-nfm22/hardness_operatoramount_amount250_file-71.yml +hardness-nfm22/hardness_operatoramount_amount250_file-72.yml +hardness-nfm22/hardness_operatoramount_amount250_file-73.yml +hardness-nfm22/hardness_operatoramount_amount250_file-74.yml +hardness-nfm22/hardness_operatoramount_amount250_file-76.yml +hardness-nfm22/hardness_operatoramount_amount250_file-77.yml +hardness-nfm22/hardness_operatoramount_amount250_file-78.yml +hardness-nfm22/hardness_operatoramount_amount250_file-79.yml +hardness-nfm22/hardness_operatoramount_amount250_file-8.yml +hardness-nfm22/hardness_operatoramount_amount250_file-80.yml +hardness-nfm22/hardness_operatoramount_amount250_file-81.yml +hardness-nfm22/hardness_operatoramount_amount250_file-82.yml +hardness-nfm22/hardness_operatoramount_amount250_file-84.yml +hardness-nfm22/hardness_operatoramount_amount250_file-85.yml +hardness-nfm22/hardness_operatoramount_amount250_file-86.yml +hardness-nfm22/hardness_operatoramount_amount250_file-87.yml +hardness-nfm22/hardness_operatoramount_amount250_file-88.yml +hardness-nfm22/hardness_operatoramount_amount250_file-89.yml +hardness-nfm22/hardness_operatoramount_amount250_file-9.yml +hardness-nfm22/hardness_operatoramount_amount250_file-90.yml +hardness-nfm22/hardness_operatoramount_amount250_file-91.yml +hardness-nfm22/hardness_operatoramount_amount250_file-93.yml +hardness-nfm22/hardness_operatoramount_amount250_file-94.yml +hardness-nfm22/hardness_operatoramount_amount250_file-95.yml +hardness-nfm22/hardness_operatoramount_amount250_file-96.yml +hardness-nfm22/hardness_operatoramount_amount250_file-97.yml +hardness-nfm22/hardness_operatoramount_amount250_file-98.yml +hardness-nfm22/hardness_operatoramount_amount250_file-99.yml +hardness-nfm22/hardness_operatoramount_amount25_file-0.yml +hardness-nfm22/hardness_operatoramount_amount25_file-10.yml +hardness-nfm22/hardness_operatoramount_amount25_file-11.yml +hardness-nfm22/hardness_operatoramount_amount25_file-15.yml +hardness-nfm22/hardness_operatoramount_amount25_file-17.yml +hardness-nfm22/hardness_operatoramount_amount25_file-20.yml +hardness-nfm22/hardness_operatoramount_amount25_file-21.yml +hardness-nfm22/hardness_operatoramount_amount25_file-25.yml +hardness-nfm22/hardness_operatoramount_amount25_file-26.yml +hardness-nfm22/hardness_operatoramount_amount25_file-3.yml +hardness-nfm22/hardness_operatoramount_amount25_file-31.yml +hardness-nfm22/hardness_operatoramount_amount25_file-34.yml +hardness-nfm22/hardness_operatoramount_amount25_file-36.yml +hardness-nfm22/hardness_operatoramount_amount25_file-37.yml +hardness-nfm22/hardness_operatoramount_amount25_file-38.yml +hardness-nfm22/hardness_operatoramount_amount25_file-43.yml +hardness-nfm22/hardness_operatoramount_amount25_file-45.yml +hardness-nfm22/hardness_operatoramount_amount25_file-46.yml +hardness-nfm22/hardness_operatoramount_amount25_file-47.yml +hardness-nfm22/hardness_operatoramount_amount25_file-50.yml +hardness-nfm22/hardness_operatoramount_amount25_file-51.yml +hardness-nfm22/hardness_operatoramount_amount25_file-52.yml +hardness-nfm22/hardness_operatoramount_amount25_file-53.yml +hardness-nfm22/hardness_operatoramount_amount25_file-57.yml +hardness-nfm22/hardness_operatoramount_amount25_file-59.yml +hardness-nfm22/hardness_operatoramount_amount25_file-6.yml +hardness-nfm22/hardness_operatoramount_amount25_file-60.yml +hardness-nfm22/hardness_operatoramount_amount25_file-64.yml +hardness-nfm22/hardness_operatoramount_amount25_file-65.yml +hardness-nfm22/hardness_operatoramount_amount25_file-66.yml +hardness-nfm22/hardness_operatoramount_amount25_file-68.yml +hardness-nfm22/hardness_operatoramount_amount25_file-7.yml +hardness-nfm22/hardness_operatoramount_amount25_file-70.yml +hardness-nfm22/hardness_operatoramount_amount25_file-72.yml +hardness-nfm22/hardness_operatoramount_amount25_file-73.yml +hardness-nfm22/hardness_operatoramount_amount25_file-74.yml +hardness-nfm22/hardness_operatoramount_amount25_file-75.yml +hardness-nfm22/hardness_operatoramount_amount25_file-79.yml +hardness-nfm22/hardness_operatoramount_amount25_file-80.yml +hardness-nfm22/hardness_operatoramount_amount25_file-81.yml +hardness-nfm22/hardness_operatoramount_amount25_file-83.yml +hardness-nfm22/hardness_operatoramount_amount25_file-85.yml +hardness-nfm22/hardness_operatoramount_amount25_file-89.yml +hardness-nfm22/hardness_operatoramount_amount25_file-9.yml +hardness-nfm22/hardness_operatoramount_amount25_file-90.yml +hardness-nfm22/hardness_operatoramount_amount25_file-92.yml +hardness-nfm22/hardness_operatoramount_amount25_file-93.yml +hardness-nfm22/hardness_operatoramount_amount25_file-94.yml +hardness-nfm22/hardness_operatoramount_amount25_file-95.yml +hardness-nfm22/hardness_operatoramount_amount25_file-98.yml +hardness-nfm22/hardness_operatoramount_amount25_file-99.yml +hardness-nfm22/hardness_operatoramount_amount500_file-0.yml +hardness-nfm22/hardness_operatoramount_amount500_file-1.yml +hardness-nfm22/hardness_operatoramount_amount500_file-10.yml +hardness-nfm22/hardness_operatoramount_amount500_file-11.yml +hardness-nfm22/hardness_operatoramount_amount500_file-12.yml +hardness-nfm22/hardness_operatoramount_amount500_file-13.yml +hardness-nfm22/hardness_operatoramount_amount500_file-14.yml +hardness-nfm22/hardness_operatoramount_amount500_file-15.yml +hardness-nfm22/hardness_operatoramount_amount500_file-16.yml +hardness-nfm22/hardness_operatoramount_amount500_file-17.yml +hardness-nfm22/hardness_operatoramount_amount500_file-18.yml +hardness-nfm22/hardness_operatoramount_amount500_file-19.yml +hardness-nfm22/hardness_operatoramount_amount500_file-2.yml +hardness-nfm22/hardness_operatoramount_amount500_file-20.yml +hardness-nfm22/hardness_operatoramount_amount500_file-21.yml +hardness-nfm22/hardness_operatoramount_amount500_file-22.yml +hardness-nfm22/hardness_operatoramount_amount500_file-23.yml +hardness-nfm22/hardness_operatoramount_amount500_file-24.yml +hardness-nfm22/hardness_operatoramount_amount500_file-25.yml +hardness-nfm22/hardness_operatoramount_amount500_file-26.yml +hardness-nfm22/hardness_operatoramount_amount500_file-27.yml +hardness-nfm22/hardness_operatoramount_amount500_file-28.yml +hardness-nfm22/hardness_operatoramount_amount500_file-29.yml +hardness-nfm22/hardness_operatoramount_amount500_file-3.yml +hardness-nfm22/hardness_operatoramount_amount500_file-30.yml +hardness-nfm22/hardness_operatoramount_amount500_file-31.yml +hardness-nfm22/hardness_operatoramount_amount500_file-32.yml +hardness-nfm22/hardness_operatoramount_amount500_file-33.yml +hardness-nfm22/hardness_operatoramount_amount500_file-34.yml +hardness-nfm22/hardness_operatoramount_amount500_file-35.yml +hardness-nfm22/hardness_operatoramount_amount500_file-36.yml +hardness-nfm22/hardness_operatoramount_amount500_file-37.yml +hardness-nfm22/hardness_operatoramount_amount500_file-38.yml +hardness-nfm22/hardness_operatoramount_amount500_file-39.yml +hardness-nfm22/hardness_operatoramount_amount500_file-4.yml +hardness-nfm22/hardness_operatoramount_amount500_file-40.yml +hardness-nfm22/hardness_operatoramount_amount500_file-41.yml +hardness-nfm22/hardness_operatoramount_amount500_file-42.yml +hardness-nfm22/hardness_operatoramount_amount500_file-43.yml +hardness-nfm22/hardness_operatoramount_amount500_file-44.yml +hardness-nfm22/hardness_operatoramount_amount500_file-45.yml +hardness-nfm22/hardness_operatoramount_amount500_file-46.yml +hardness-nfm22/hardness_operatoramount_amount500_file-47.yml +hardness-nfm22/hardness_operatoramount_amount500_file-48.yml +hardness-nfm22/hardness_operatoramount_amount500_file-49.yml +hardness-nfm22/hardness_operatoramount_amount500_file-5.yml +hardness-nfm22/hardness_operatoramount_amount500_file-50.yml +hardness-nfm22/hardness_operatoramount_amount500_file-51.yml +hardness-nfm22/hardness_operatoramount_amount500_file-52.yml +hardness-nfm22/hardness_operatoramount_amount500_file-53.yml +hardness-nfm22/hardness_operatoramount_amount500_file-54.yml +hardness-nfm22/hardness_operatoramount_amount500_file-55.yml +hardness-nfm22/hardness_operatoramount_amount500_file-56.yml +hardness-nfm22/hardness_operatoramount_amount500_file-57.yml +hardness-nfm22/hardness_operatoramount_amount500_file-58.yml +hardness-nfm22/hardness_operatoramount_amount500_file-59.yml +hardness-nfm22/hardness_operatoramount_amount500_file-6.yml +hardness-nfm22/hardness_operatoramount_amount500_file-60.yml +hardness-nfm22/hardness_operatoramount_amount500_file-61.yml +hardness-nfm22/hardness_operatoramount_amount500_file-62.yml +hardness-nfm22/hardness_operatoramount_amount500_file-63.yml +hardness-nfm22/hardness_operatoramount_amount500_file-64.yml +hardness-nfm22/hardness_operatoramount_amount500_file-65.yml +hardness-nfm22/hardness_operatoramount_amount500_file-66.yml +hardness-nfm22/hardness_operatoramount_amount500_file-67.yml +hardness-nfm22/hardness_operatoramount_amount500_file-68.yml +hardness-nfm22/hardness_operatoramount_amount500_file-69.yml +hardness-nfm22/hardness_operatoramount_amount500_file-7.yml +hardness-nfm22/hardness_operatoramount_amount500_file-70.yml +hardness-nfm22/hardness_operatoramount_amount500_file-71.yml +hardness-nfm22/hardness_operatoramount_amount500_file-72.yml +hardness-nfm22/hardness_operatoramount_amount500_file-73.yml +hardness-nfm22/hardness_operatoramount_amount500_file-74.yml +hardness-nfm22/hardness_operatoramount_amount500_file-75.yml +hardness-nfm22/hardness_operatoramount_amount500_file-76.yml +hardness-nfm22/hardness_operatoramount_amount500_file-77.yml +hardness-nfm22/hardness_operatoramount_amount500_file-78.yml +hardness-nfm22/hardness_operatoramount_amount500_file-79.yml +hardness-nfm22/hardness_operatoramount_amount500_file-8.yml +hardness-nfm22/hardness_operatoramount_amount500_file-80.yml +hardness-nfm22/hardness_operatoramount_amount500_file-81.yml +hardness-nfm22/hardness_operatoramount_amount500_file-82.yml +hardness-nfm22/hardness_operatoramount_amount500_file-83.yml +hardness-nfm22/hardness_operatoramount_amount500_file-84.yml +hardness-nfm22/hardness_operatoramount_amount500_file-85.yml +hardness-nfm22/hardness_operatoramount_amount500_file-86.yml +hardness-nfm22/hardness_operatoramount_amount500_file-87.yml +hardness-nfm22/hardness_operatoramount_amount500_file-88.yml +hardness-nfm22/hardness_operatoramount_amount500_file-89.yml +hardness-nfm22/hardness_operatoramount_amount500_file-9.yml +hardness-nfm22/hardness_operatoramount_amount500_file-90.yml +hardness-nfm22/hardness_operatoramount_amount500_file-91.yml +hardness-nfm22/hardness_operatoramount_amount500_file-92.yml +hardness-nfm22/hardness_operatoramount_amount500_file-93.yml +hardness-nfm22/hardness_operatoramount_amount500_file-94.yml +hardness-nfm22/hardness_operatoramount_amount500_file-95.yml +hardness-nfm22/hardness_operatoramount_amount500_file-96.yml +hardness-nfm22/hardness_operatoramount_amount500_file-97.yml +hardness-nfm22/hardness_operatoramount_amount500_file-98.yml +hardness-nfm22/hardness_operatoramount_amount500_file-99.yml +hardness-nfm22/hardness_operatoramount_amount50_file-0.yml +hardness-nfm22/hardness_operatoramount_amount50_file-1.yml +hardness-nfm22/hardness_operatoramount_amount50_file-11.yml +hardness-nfm22/hardness_operatoramount_amount50_file-12.yml +hardness-nfm22/hardness_operatoramount_amount50_file-13.yml +hardness-nfm22/hardness_operatoramount_amount50_file-15.yml +hardness-nfm22/hardness_operatoramount_amount50_file-16.yml +hardness-nfm22/hardness_operatoramount_amount50_file-17.yml +hardness-nfm22/hardness_operatoramount_amount50_file-18.yml +hardness-nfm22/hardness_operatoramount_amount50_file-19.yml +hardness-nfm22/hardness_operatoramount_amount50_file-2.yml +hardness-nfm22/hardness_operatoramount_amount50_file-20.yml +hardness-nfm22/hardness_operatoramount_amount50_file-21.yml +hardness-nfm22/hardness_operatoramount_amount50_file-22.yml +hardness-nfm22/hardness_operatoramount_amount50_file-23.yml +hardness-nfm22/hardness_operatoramount_amount50_file-24.yml +hardness-nfm22/hardness_operatoramount_amount50_file-25.yml +hardness-nfm22/hardness_operatoramount_amount50_file-26.yml +hardness-nfm22/hardness_operatoramount_amount50_file-28.yml +hardness-nfm22/hardness_operatoramount_amount50_file-3.yml +hardness-nfm22/hardness_operatoramount_amount50_file-30.yml +hardness-nfm22/hardness_operatoramount_amount50_file-32.yml +hardness-nfm22/hardness_operatoramount_amount50_file-33.yml +hardness-nfm22/hardness_operatoramount_amount50_file-35.yml +hardness-nfm22/hardness_operatoramount_amount50_file-36.yml +hardness-nfm22/hardness_operatoramount_amount50_file-37.yml +hardness-nfm22/hardness_operatoramount_amount50_file-38.yml +hardness-nfm22/hardness_operatoramount_amount50_file-4.yml +hardness-nfm22/hardness_operatoramount_amount50_file-40.yml +hardness-nfm22/hardness_operatoramount_amount50_file-43.yml +hardness-nfm22/hardness_operatoramount_amount50_file-44.yml +hardness-nfm22/hardness_operatoramount_amount50_file-45.yml +hardness-nfm22/hardness_operatoramount_amount50_file-46.yml +hardness-nfm22/hardness_operatoramount_amount50_file-47.yml +hardness-nfm22/hardness_operatoramount_amount50_file-48.yml +hardness-nfm22/hardness_operatoramount_amount50_file-49.yml +hardness-nfm22/hardness_operatoramount_amount50_file-5.yml +hardness-nfm22/hardness_operatoramount_amount50_file-51.yml +hardness-nfm22/hardness_operatoramount_amount50_file-52.yml +hardness-nfm22/hardness_operatoramount_amount50_file-54.yml +hardness-nfm22/hardness_operatoramount_amount50_file-55.yml +hardness-nfm22/hardness_operatoramount_amount50_file-57.yml +hardness-nfm22/hardness_operatoramount_amount50_file-59.yml +hardness-nfm22/hardness_operatoramount_amount50_file-6.yml +hardness-nfm22/hardness_operatoramount_amount50_file-60.yml +hardness-nfm22/hardness_operatoramount_amount50_file-61.yml +hardness-nfm22/hardness_operatoramount_amount50_file-62.yml +hardness-nfm22/hardness_operatoramount_amount50_file-63.yml +hardness-nfm22/hardness_operatoramount_amount50_file-65.yml +hardness-nfm22/hardness_operatoramount_amount50_file-66.yml +hardness-nfm22/hardness_operatoramount_amount50_file-67.yml +hardness-nfm22/hardness_operatoramount_amount50_file-68.yml +hardness-nfm22/hardness_operatoramount_amount50_file-69.yml +hardness-nfm22/hardness_operatoramount_amount50_file-70.yml +hardness-nfm22/hardness_operatoramount_amount50_file-72.yml +hardness-nfm22/hardness_operatoramount_amount50_file-73.yml +hardness-nfm22/hardness_operatoramount_amount50_file-74.yml +hardness-nfm22/hardness_operatoramount_amount50_file-75.yml +hardness-nfm22/hardness_operatoramount_amount50_file-76.yml +hardness-nfm22/hardness_operatoramount_amount50_file-78.yml +hardness-nfm22/hardness_operatoramount_amount50_file-79.yml +hardness-nfm22/hardness_operatoramount_amount50_file-8.yml +hardness-nfm22/hardness_operatoramount_amount50_file-80.yml +hardness-nfm22/hardness_operatoramount_amount50_file-82.yml +hardness-nfm22/hardness_operatoramount_amount50_file-84.yml +hardness-nfm22/hardness_operatoramount_amount50_file-85.yml +hardness-nfm22/hardness_operatoramount_amount50_file-87.yml +hardness-nfm22/hardness_operatoramount_amount50_file-88.yml +hardness-nfm22/hardness_operatoramount_amount50_file-89.yml +hardness-nfm22/hardness_operatoramount_amount50_file-9.yml +hardness-nfm22/hardness_operatoramount_amount50_file-92.yml +hardness-nfm22/hardness_operatoramount_amount50_file-94.yml +hardness-nfm22/hardness_operatoramount_amount50_file-95.yml +hardness-nfm22/hardness_operatoramount_amount50_file-96.yml +hardness-nfm22/hardness_operatoramount_amount50_file-98.yml +hardness-nfm22/hardness_operatoramount_amount50_file-99.yml +hardness-nfm22/hardness_variablewrapping_normal_file-0.yml +hardness-nfm22/hardness_variablewrapping_normal_file-10.yml +hardness-nfm22/hardness_variablewrapping_normal_file-11.yml +hardness-nfm22/hardness_variablewrapping_normal_file-13.yml +hardness-nfm22/hardness_variablewrapping_normal_file-14.yml +hardness-nfm22/hardness_variablewrapping_normal_file-15.yml +hardness-nfm22/hardness_variablewrapping_normal_file-17.yml +hardness-nfm22/hardness_variablewrapping_normal_file-20.yml +hardness-nfm22/hardness_variablewrapping_normal_file-21.yml +hardness-nfm22/hardness_variablewrapping_normal_file-3.yml +hardness-nfm22/hardness_variablewrapping_normal_file-31.yml +hardness-nfm22/hardness_variablewrapping_normal_file-34.yml +hardness-nfm22/hardness_variablewrapping_normal_file-36.yml +hardness-nfm22/hardness_variablewrapping_normal_file-38.yml +hardness-nfm22/hardness_variablewrapping_normal_file-40.yml +hardness-nfm22/hardness_variablewrapping_normal_file-41.yml +hardness-nfm22/hardness_variablewrapping_normal_file-44.yml +hardness-nfm22/hardness_variablewrapping_normal_file-45.yml +hardness-nfm22/hardness_variablewrapping_normal_file-46.yml +hardness-nfm22/hardness_variablewrapping_normal_file-47.yml +hardness-nfm22/hardness_variablewrapping_normal_file-5.yml +hardness-nfm22/hardness_variablewrapping_normal_file-50.yml +hardness-nfm22/hardness_variablewrapping_normal_file-51.yml +hardness-nfm22/hardness_variablewrapping_normal_file-52.yml +hardness-nfm22/hardness_variablewrapping_normal_file-53.yml +hardness-nfm22/hardness_variablewrapping_normal_file-54.yml +hardness-nfm22/hardness_variablewrapping_normal_file-55.yml +hardness-nfm22/hardness_variablewrapping_normal_file-56.yml +hardness-nfm22/hardness_variablewrapping_normal_file-6.yml +hardness-nfm22/hardness_variablewrapping_normal_file-60.yml +hardness-nfm22/hardness_variablewrapping_normal_file-61.yml +hardness-nfm22/hardness_variablewrapping_normal_file-64.yml +hardness-nfm22/hardness_variablewrapping_normal_file-65.yml +hardness-nfm22/hardness_variablewrapping_normal_file-67.yml +hardness-nfm22/hardness_variablewrapping_normal_file-68.yml +hardness-nfm22/hardness_variablewrapping_normal_file-69.yml +hardness-nfm22/hardness_variablewrapping_normal_file-7.yml +hardness-nfm22/hardness_variablewrapping_normal_file-70.yml +hardness-nfm22/hardness_variablewrapping_normal_file-72.yml +hardness-nfm22/hardness_variablewrapping_normal_file-73.yml +hardness-nfm22/hardness_variablewrapping_normal_file-74.yml +hardness-nfm22/hardness_variablewrapping_normal_file-75.yml +hardness-nfm22/hardness_variablewrapping_normal_file-76.yml +hardness-nfm22/hardness_variablewrapping_normal_file-77.yml +hardness-nfm22/hardness_variablewrapping_normal_file-78.yml +hardness-nfm22/hardness_variablewrapping_normal_file-79.yml +hardness-nfm22/hardness_variablewrapping_normal_file-80.yml +hardness-nfm22/hardness_variablewrapping_normal_file-81.yml +hardness-nfm22/hardness_variablewrapping_normal_file-82.yml +hardness-nfm22/hardness_variablewrapping_normal_file-83.yml +hardness-nfm22/hardness_variablewrapping_normal_file-9.yml +hardness-nfm22/hardness_variablewrapping_normal_file-92.yml +hardness-nfm22/hardness_variablewrapping_normal_file-93.yml +hardness-nfm22/hardness_variablewrapping_normal_file-94.yml +hardness-nfm22/hardness_variablewrapping_normal_file-96.yml +hardness-nfm22/hardness_variablewrapping_normal_file-98.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-0.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-1.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-10.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-11.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-12.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-13.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-14.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-15.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-17.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-19.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-2.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-20.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-21.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-22.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-23.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-24.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-25.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-26.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-27.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-28.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-3.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-30.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-31.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-32.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-34.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-35.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-36.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-38.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-4.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-40.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-41.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-42.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-43.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-44.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-45.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-46.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-47.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-48.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-49.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-5.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-50.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-51.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-52.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-53.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-54.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-55.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-56.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-57.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-58.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-59.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-6.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-60.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-61.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-63.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-64.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-65.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-66.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-67.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-68.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-69.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-7.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-70.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-72.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-73.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-74.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-75.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-76.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-77.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-78.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-79.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-8.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-80.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-81.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-82.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-83.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-85.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-86.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-87.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-88.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-9.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-90.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-91.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-92.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-93.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-94.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-95.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-96.yml +hardness-nfm22/hardness_variablewrapping_wrapper-a_file-98.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-0.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-1.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-10.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-11.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-12.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-13.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-14.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-15.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-16.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-17.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-18.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-19.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-2.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-20.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-21.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-22.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-23.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-24.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-25.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-26.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-27.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-28.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-29.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-3.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-30.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-31.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-32.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-33.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-34.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-35.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-36.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-37.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-38.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-39.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-4.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-40.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-41.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-42.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-43.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-44.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-45.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-46.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-47.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-48.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-49.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-5.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-50.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-51.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-52.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-53.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-54.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-55.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-56.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-57.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-58.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-59.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-6.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-60.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-61.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-62.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-63.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-64.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-65.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-66.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-67.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-68.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-69.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-7.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-70.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-71.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-72.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-73.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-74.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-75.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-76.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-77.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-78.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-79.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-8.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-80.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-81.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-82.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-83.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-84.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-85.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-86.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-87.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-88.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-89.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-9.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-90.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-91.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-92.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-93.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-94.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-95.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-96.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-97.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-98.yml +hardness-nfm22/hardness_variablewrapping_wrapper-ap_file-99.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-0.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-1.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-10.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-11.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-12.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-13.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-14.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-15.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-16.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-17.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-18.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-19.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-2.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-20.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-21.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-22.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-23.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-24.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-25.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-26.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-27.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-28.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-29.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-3.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-30.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-31.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-32.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-33.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-34.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-35.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-36.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-37.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-38.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-39.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-4.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-40.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-41.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-42.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-43.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-44.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-45.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-46.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-47.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-48.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-49.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-5.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-50.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-51.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-52.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-53.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-54.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-55.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-56.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-57.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-58.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-59.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-6.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-60.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-61.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-62.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-63.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-64.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-65.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-66.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-67.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-68.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-69.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-7.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-70.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-71.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-72.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-73.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-74.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-75.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-76.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-77.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-78.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-79.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-8.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-80.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-81.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-82.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-83.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-84.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-85.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-86.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-87.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-88.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-89.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-9.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-90.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-91.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-92.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-93.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-94.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-95.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-96.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-97.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-98.yml +hardness-nfm22/hardness_variablewrapping_wrapper-p_file-99.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-0.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-1.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-10.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-11.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-12.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-13.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-14.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-15.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-16.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-17.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-18.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-19.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-2.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-20.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-21.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-22.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-23.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-24.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-25.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-26.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-27.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-28.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-29.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-3.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-30.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-31.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-32.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-33.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-34.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-35.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-36.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-37.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-38.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-39.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-4.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-40.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-41.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-42.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-43.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-44.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-45.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-46.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-47.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-48.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-49.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-5.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-50.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-51.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-52.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-53.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-54.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-55.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-56.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-57.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-58.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-59.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-6.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-60.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-61.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-62.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-63.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-64.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-65.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-66.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-67.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-68.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-69.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-7.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-70.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-71.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-72.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-73.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-74.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-75.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-76.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-77.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-78.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-79.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-8.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-80.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-81.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-82.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-83.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-84.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-85.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-86.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-87.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-88.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-89.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-9.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-90.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-91.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-92.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-93.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-94.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-95.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-96.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-97.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-98.yml +hardness-nfm22/hardness_variablewrapping_wrapper-s_file-99.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-0.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-1.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-10.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-11.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-12.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-13.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-14.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-15.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-16.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-17.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-18.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-19.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-2.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-20.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-21.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-22.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-23.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-24.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-25.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-26.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-27.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-28.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-29.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-3.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-30.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-31.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-32.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-33.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-34.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-35.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-36.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-37.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-38.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-39.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-4.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-40.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-41.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-42.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-43.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-44.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-45.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-46.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-47.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-48.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-49.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-5.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-50.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-51.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-52.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-53.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-54.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-55.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-56.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-57.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-58.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-59.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-6.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-60.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-61.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-62.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-63.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-64.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-65.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-66.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-67.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-68.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-69.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-7.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-70.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-71.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-72.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-73.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-74.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-75.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-76.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-77.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-78.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-79.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-8.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-80.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-81.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-82.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-83.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-84.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-85.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-86.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-87.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-88.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-89.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-9.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-90.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-91.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-92.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-93.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-94.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-95.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-96.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-97.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-98.yml +hardness-nfm22/hardness_variablewrapping_wrapper-sp_file-99.yml +hardware-verification-array/btor2c-lazyMod.safe_arbitrated_fifos_n2d8w8.yml +hardware-verification-array/btor2c-lazyMod.safe_linked_list_fifo_n2d4.yml +hardware-verification-array/btor2c-lazyMod.unknown_ridecore_array.yml +hardware-verification-array/btor2c-lazyMod.unsafe_arbitrated_fifos_n2d8w8.yml +hardware-verification-array/btor2c-lazyMod.unsafe_linked_list_fifo_n2d4.yml +hardware-verification-array/btor2c-lazyMod.unsafe_ridecore_array.yml +hardware-verification-bv/btor2c-lazyMod.cal10.yml +hardware-verification-bv/btor2c-lazyMod.cal100.yml +hardware-verification-bv/btor2c-lazyMod.cal101.yml +hardware-verification-bv/btor2c-lazyMod.cal102.yml +hardware-verification-bv/btor2c-lazyMod.cal103.yml +hardware-verification-bv/btor2c-lazyMod.cal104.yml +hardware-verification-bv/btor2c-lazyMod.cal105.yml +hardware-verification-bv/btor2c-lazyMod.cal106.yml +hardware-verification-bv/btor2c-lazyMod.cal107.yml +hardware-verification-bv/btor2c-lazyMod.cal108.yml +hardware-verification-bv/btor2c-lazyMod.cal109.yml +hardware-verification-bv/btor2c-lazyMod.cal11.yml +hardware-verification-bv/btor2c-lazyMod.cal110.yml +hardware-verification-bv/btor2c-lazyMod.cal111.yml +hardware-verification-bv/btor2c-lazyMod.cal112.yml +hardware-verification-bv/btor2c-lazyMod.cal113.yml +hardware-verification-bv/btor2c-lazyMod.cal114.yml +hardware-verification-bv/btor2c-lazyMod.cal115.yml +hardware-verification-bv/btor2c-lazyMod.cal116.yml +hardware-verification-bv/btor2c-lazyMod.cal117.yml +hardware-verification-bv/btor2c-lazyMod.cal118.yml +hardware-verification-bv/btor2c-lazyMod.cal119.yml +hardware-verification-bv/btor2c-lazyMod.cal120.yml +hardware-verification-bv/btor2c-lazyMod.cal121.yml +hardware-verification-bv/btor2c-lazyMod.cal122.yml +hardware-verification-bv/btor2c-lazyMod.cal123.yml +hardware-verification-bv/btor2c-lazyMod.cal124.yml +hardware-verification-bv/btor2c-lazyMod.cal125.yml +hardware-verification-bv/btor2c-lazyMod.cal126.yml +hardware-verification-bv/btor2c-lazyMod.cal127.yml +hardware-verification-bv/btor2c-lazyMod.cal128.yml +hardware-verification-bv/btor2c-lazyMod.cal129.yml +hardware-verification-bv/btor2c-lazyMod.cal130.yml +hardware-verification-bv/btor2c-lazyMod.cal131.yml +hardware-verification-bv/btor2c-lazyMod.cal132.yml +hardware-verification-bv/btor2c-lazyMod.cal133.yml +hardware-verification-bv/btor2c-lazyMod.cal134.yml +hardware-verification-bv/btor2c-lazyMod.cal135.yml +hardware-verification-bv/btor2c-lazyMod.cal136.yml +hardware-verification-bv/btor2c-lazyMod.cal137.yml +hardware-verification-bv/btor2c-lazyMod.cal138.yml +hardware-verification-bv/btor2c-lazyMod.cal139.yml +hardware-verification-bv/btor2c-lazyMod.cal14.yml +hardware-verification-bv/btor2c-lazyMod.cal140.yml +hardware-verification-bv/btor2c-lazyMod.cal141.yml +hardware-verification-bv/btor2c-lazyMod.cal142.yml +hardware-verification-bv/btor2c-lazyMod.cal143.yml +hardware-verification-bv/btor2c-lazyMod.cal144.yml +hardware-verification-bv/btor2c-lazyMod.cal145.yml +hardware-verification-bv/btor2c-lazyMod.cal146.yml +hardware-verification-bv/btor2c-lazyMod.cal147.yml +hardware-verification-bv/btor2c-lazyMod.cal148.yml +hardware-verification-bv/btor2c-lazyMod.cal149.yml +hardware-verification-bv/btor2c-lazyMod.cal15.yml +hardware-verification-bv/btor2c-lazyMod.cal150.yml +hardware-verification-bv/btor2c-lazyMod.cal151.yml +hardware-verification-bv/btor2c-lazyMod.cal152.yml +hardware-verification-bv/btor2c-lazyMod.cal153.yml +hardware-verification-bv/btor2c-lazyMod.cal154.yml +hardware-verification-bv/btor2c-lazyMod.cal155.yml +hardware-verification-bv/btor2c-lazyMod.cal156.yml +hardware-verification-bv/btor2c-lazyMod.cal157.yml +hardware-verification-bv/btor2c-lazyMod.cal158.yml +hardware-verification-bv/btor2c-lazyMod.cal159.yml +hardware-verification-bv/btor2c-lazyMod.cal160.yml +hardware-verification-bv/btor2c-lazyMod.cal161.yml +hardware-verification-bv/btor2c-lazyMod.cal162.yml +hardware-verification-bv/btor2c-lazyMod.cal163.yml +hardware-verification-bv/btor2c-lazyMod.cal164.yml +hardware-verification-bv/btor2c-lazyMod.cal165.yml +hardware-verification-bv/btor2c-lazyMod.cal166.yml +hardware-verification-bv/btor2c-lazyMod.cal167.yml +hardware-verification-bv/btor2c-lazyMod.cal168.yml +hardware-verification-bv/btor2c-lazyMod.cal169.yml +hardware-verification-bv/btor2c-lazyMod.cal170.yml +hardware-verification-bv/btor2c-lazyMod.cal171.yml +hardware-verification-bv/btor2c-lazyMod.cal172.yml +hardware-verification-bv/btor2c-lazyMod.cal173.yml +hardware-verification-bv/btor2c-lazyMod.cal174.yml +hardware-verification-bv/btor2c-lazyMod.cal175.yml +hardware-verification-bv/btor2c-lazyMod.cal176.yml +hardware-verification-bv/btor2c-lazyMod.cal177.yml +hardware-verification-bv/btor2c-lazyMod.cal178.yml +hardware-verification-bv/btor2c-lazyMod.cal182.yml +hardware-verification-bv/btor2c-lazyMod.cal183.yml +hardware-verification-bv/btor2c-lazyMod.cal184.yml +hardware-verification-bv/btor2c-lazyMod.cal187.yml +hardware-verification-bv/btor2c-lazyMod.cal188.yml +hardware-verification-bv/btor2c-lazyMod.cal189.yml +hardware-verification-bv/btor2c-lazyMod.cal19.yml +hardware-verification-bv/btor2c-lazyMod.cal190.yml +hardware-verification-bv/btor2c-lazyMod.cal191.yml +hardware-verification-bv/btor2c-lazyMod.cal192.yml +hardware-verification-bv/btor2c-lazyMod.cal193.yml +hardware-verification-bv/btor2c-lazyMod.cal194.yml +hardware-verification-bv/btor2c-lazyMod.cal195.yml +hardware-verification-bv/btor2c-lazyMod.cal196.yml +hardware-verification-bv/btor2c-lazyMod.cal197.yml +hardware-verification-bv/btor2c-lazyMod.cal198.yml +hardware-verification-bv/btor2c-lazyMod.cal199.yml +hardware-verification-bv/btor2c-lazyMod.cal2.yml +hardware-verification-bv/btor2c-lazyMod.cal20.yml +hardware-verification-bv/btor2c-lazyMod.cal200.yml +hardware-verification-bv/btor2c-lazyMod.cal201.yml +hardware-verification-bv/btor2c-lazyMod.cal202.yml +hardware-verification-bv/btor2c-lazyMod.cal203.yml +hardware-verification-bv/btor2c-lazyMod.cal204.yml +hardware-verification-bv/btor2c-lazyMod.cal205.yml +hardware-verification-bv/btor2c-lazyMod.cal206.yml +hardware-verification-bv/btor2c-lazyMod.cal207.yml +hardware-verification-bv/btor2c-lazyMod.cal208.yml +hardware-verification-bv/btor2c-lazyMod.cal209.yml +hardware-verification-bv/btor2c-lazyMod.cal21.yml +hardware-verification-bv/btor2c-lazyMod.cal210.yml +hardware-verification-bv/btor2c-lazyMod.cal211.yml +hardware-verification-bv/btor2c-lazyMod.cal212.yml +hardware-verification-bv/btor2c-lazyMod.cal213.yml +hardware-verification-bv/btor2c-lazyMod.cal214.yml +hardware-verification-bv/btor2c-lazyMod.cal215.yml +hardware-verification-bv/btor2c-lazyMod.cal216.yml +hardware-verification-bv/btor2c-lazyMod.cal217.yml +hardware-verification-bv/btor2c-lazyMod.cal218.yml +hardware-verification-bv/btor2c-lazyMod.cal219.yml +hardware-verification-bv/btor2c-lazyMod.cal22.yml +hardware-verification-bv/btor2c-lazyMod.cal220.yml +hardware-verification-bv/btor2c-lazyMod.cal221.yml +hardware-verification-bv/btor2c-lazyMod.cal222.yml +hardware-verification-bv/btor2c-lazyMod.cal223.yml +hardware-verification-bv/btor2c-lazyMod.cal224.yml +hardware-verification-bv/btor2c-lazyMod.cal225.yml +hardware-verification-bv/btor2c-lazyMod.cal226.yml +hardware-verification-bv/btor2c-lazyMod.cal227.yml +hardware-verification-bv/btor2c-lazyMod.cal228.yml +hardware-verification-bv/btor2c-lazyMod.cal229.yml +hardware-verification-bv/btor2c-lazyMod.cal23.yml +hardware-verification-bv/btor2c-lazyMod.cal230.yml +hardware-verification-bv/btor2c-lazyMod.cal231.yml +hardware-verification-bv/btor2c-lazyMod.cal232.yml +hardware-verification-bv/btor2c-lazyMod.cal233.yml +hardware-verification-bv/btor2c-lazyMod.cal234.yml +hardware-verification-bv/btor2c-lazyMod.cal235.yml +hardware-verification-bv/btor2c-lazyMod.cal24.yml +hardware-verification-bv/btor2c-lazyMod.cal26.yml +hardware-verification-bv/btor2c-lazyMod.cal27.yml +hardware-verification-bv/btor2c-lazyMod.cal28.yml +hardware-verification-bv/btor2c-lazyMod.cal29.yml +hardware-verification-bv/btor2c-lazyMod.cal3.yml +hardware-verification-bv/btor2c-lazyMod.cal30.yml +hardware-verification-bv/btor2c-lazyMod.cal31.yml +hardware-verification-bv/btor2c-lazyMod.cal32.yml +hardware-verification-bv/btor2c-lazyMod.cal33.yml +hardware-verification-bv/btor2c-lazyMod.cal34.yml +hardware-verification-bv/btor2c-lazyMod.cal35.yml +hardware-verification-bv/btor2c-lazyMod.cal36.yml +hardware-verification-bv/btor2c-lazyMod.cal37.yml +hardware-verification-bv/btor2c-lazyMod.cal38.yml +hardware-verification-bv/btor2c-lazyMod.cal39.yml +hardware-verification-bv/btor2c-lazyMod.cal4.yml +hardware-verification-bv/btor2c-lazyMod.cal40.yml +hardware-verification-bv/btor2c-lazyMod.cal41.yml +hardware-verification-bv/btor2c-lazyMod.cal42.yml +hardware-verification-bv/btor2c-lazyMod.cal43.yml +hardware-verification-bv/btor2c-lazyMod.cal44.yml +hardware-verification-bv/btor2c-lazyMod.cal45.yml +hardware-verification-bv/btor2c-lazyMod.cal46.yml +hardware-verification-bv/btor2c-lazyMod.cal47.yml +hardware-verification-bv/btor2c-lazyMod.cal48.yml +hardware-verification-bv/btor2c-lazyMod.cal49.yml +hardware-verification-bv/btor2c-lazyMod.cal5.yml +hardware-verification-bv/btor2c-lazyMod.cal50.yml +hardware-verification-bv/btor2c-lazyMod.cal52.yml +hardware-verification-bv/btor2c-lazyMod.cal53.yml +hardware-verification-bv/btor2c-lazyMod.cal56.yml +hardware-verification-bv/btor2c-lazyMod.cal59.yml +hardware-verification-bv/btor2c-lazyMod.cal6.yml +hardware-verification-bv/btor2c-lazyMod.cal60.yml +hardware-verification-bv/btor2c-lazyMod.cal61.yml +hardware-verification-bv/btor2c-lazyMod.cal62.yml +hardware-verification-bv/btor2c-lazyMod.cal63.yml +hardware-verification-bv/btor2c-lazyMod.cal64.yml +hardware-verification-bv/btor2c-lazyMod.cal65.yml +hardware-verification-bv/btor2c-lazyMod.cal66.yml +hardware-verification-bv/btor2c-lazyMod.cal67.yml +hardware-verification-bv/btor2c-lazyMod.cal68.yml +hardware-verification-bv/btor2c-lazyMod.cal69.yml +hardware-verification-bv/btor2c-lazyMod.cal7.yml +hardware-verification-bv/btor2c-lazyMod.cal70.yml +hardware-verification-bv/btor2c-lazyMod.cal71.yml +hardware-verification-bv/btor2c-lazyMod.cal72.yml +hardware-verification-bv/btor2c-lazyMod.cal73.yml +hardware-verification-bv/btor2c-lazyMod.cal74.yml +hardware-verification-bv/btor2c-lazyMod.cal75.yml +hardware-verification-bv/btor2c-lazyMod.cal76.yml +hardware-verification-bv/btor2c-lazyMod.cal77.yml +hardware-verification-bv/btor2c-lazyMod.cal78.yml +hardware-verification-bv/btor2c-lazyMod.cal79.yml +hardware-verification-bv/btor2c-lazyMod.cal8.yml +hardware-verification-bv/btor2c-lazyMod.cal80.yml +hardware-verification-bv/btor2c-lazyMod.cal81.yml +hardware-verification-bv/btor2c-lazyMod.cal82.yml +hardware-verification-bv/btor2c-lazyMod.cal83.yml +hardware-verification-bv/btor2c-lazyMod.cal84.yml +hardware-verification-bv/btor2c-lazyMod.cal85.yml +hardware-verification-bv/btor2c-lazyMod.cal86.yml +hardware-verification-bv/btor2c-lazyMod.cal87.yml +hardware-verification-bv/btor2c-lazyMod.cal88.yml +hardware-verification-bv/btor2c-lazyMod.cal89.yml +hardware-verification-bv/btor2c-lazyMod.cal9.yml +hardware-verification-bv/btor2c-lazyMod.cal90.yml +hardware-verification-bv/btor2c-lazyMod.cal91.yml +hardware-verification-bv/btor2c-lazyMod.cal92.yml +hardware-verification-bv/btor2c-lazyMod.cal93.yml +hardware-verification-bv/btor2c-lazyMod.cal94.yml +hardware-verification-bv/btor2c-lazyMod.cal95.yml +hardware-verification-bv/btor2c-lazyMod.cal96.yml +hardware-verification-bv/btor2c-lazyMod.cal97.yml +hardware-verification-bv/btor2c-lazyMod.cal98.yml +hardware-verification-bv/btor2c-lazyMod.cal99.yml +heap-data/calendar.yml +heap-data/cart.yml +heap-data/hash_fun.yml +heap-data/min_max.yml +heap-data/packet_filter.yml +heap-data/process_queue.yml +heap-data/quick_sort_split.yml +heap-data/running_example.yml +heap-data/shared_mem1.yml +heap-data/shared_mem2.yml +heap-manipulation/bubble_sort_linux-1.yml +heap-manipulation/bubble_sort_linux-2.yml +heap-manipulation/dancing.yml +heap-manipulation/dll_of_dll-1.yml +heap-manipulation/dll_of_dll-2.yml +heap-manipulation/merge_sort-1.yml +heap-manipulation/merge_sort-2.yml +heap-manipulation/sll_to_dll_rev-1.yml +heap-manipulation/sll_to_dll_rev-2.yml +heap-manipulation/tree-2.yml +heap-manipulation/tree-3.yml +heap-manipulation/tree-4.yml +ldv-linux-3.14-races/linux-3.14--drivers--media--platform--marvell-ccic--cafe_ccic.ko.cil-1.yml +ldv-linux-3.14-races/linux-3.14--drivers--media--platform--marvell-ccic--cafe_ccic.ko.cil-2.yml +ldv-linux-3.14-races/linux-3.14--drivers--net--irda--nsc-ircc.ko.cil.yml +ldv-linux-3.14-races/linux-3.14--drivers--net--irda--w83977af_ir.ko.cil.yml +ldv-linux-3.14-races/linux-3.14--drivers--spi--spi-tegra20-slink.ko.cil.yml +ldv-linux-3.14-races/linux-3.14--drivers--usb--misc--adutux.ko.cil.yml +ldv-races/race-2_1-container_of.yml +ldv-races/race-2_2-container_of.yml +ldv-races/race-2_2b-container_of.yml +ldv-races/race-2_3-container_of.yml +ldv-races/race-2_3b-container_of.yml +ldv-races/race-2_4-container_of.yml +ldv-races/race-2_4b-container_of.yml +ldv-races/race-2_5-container_of.yml +ldv-races/race-2_5b-container_of.yml +ldv-races/race-3_1-container_of-global.yml +ldv-races/race-3_2-container_of-global.yml +ldv-races/race-3_2b-container_of-global.yml +ldv-regression/1_3.yml +ldv-regression/alias_of_return.c_1.yml +ldv-regression/alias_of_return.yml +ldv-regression/alias_of_return_2.c_1.yml +ldv-regression/alias_of_return_2.yml +ldv-regression/alt_test.yml +ldv-regression/ex3_forlist.yml +ldv-regression/fo_test.yml +ldv-regression/mutex_lock_struct.c_1.yml +ldv-regression/mutex_lock_struct.yml +ldv-regression/nested_structure-1.yml +ldv-regression/nested_structure-2.yml +ldv-regression/nested_structure_noptr-1.yml +ldv-regression/nested_structure_noptr-2.yml +ldv-regression/nested_structure_ptr-1.yml +ldv-regression/nested_structure_ptr-2.yml +ldv-regression/oomInt.c_1.yml +ldv-regression/recursive_list.yml +ldv-regression/rule57_ebda_blast.c_1.yml +ldv-regression/rule57_ebda_blast.yml +ldv-regression/rule57_ebda_blast_2.yml +ldv-regression/rule60_list.yml +ldv-regression/rule60_list2.c_1.yml +ldv-regression/rule60_list2.yml +ldv-regression/sizeofparameters_test.yml +ldv-regression/stateful_check.yml +ldv-regression/structure_assignment.yml +ldv-regression/test01.yml +ldv-regression/test02.yml +ldv-regression/test03.yml +ldv-regression/test04.yml +ldv-regression/test05.yml +ldv-regression/test06.yml +ldv-regression/test07.yml +ldv-regression/test08.yml +ldv-regression/test10.yml +ldv-regression/test11.yml +ldv-regression/test12.yml +ldv-regression/test13.yml +ldv-regression/test14.yml +ldv-regression/test17.yml +ldv-regression/test19.yml +ldv-regression/test20.yml +ldv-regression/test21-1.yml +ldv-regression/test21-2.yml +ldv-regression/test22-1.yml +ldv-regression/test22-3.yml +ldv-regression/test23-1.yml +ldv-regression/test23-2.yml +ldv-regression/test24-1.yml +ldv-regression/test24-2.yml +ldv-regression/test25-1.yml +ldv-regression/test25-2.yml +ldv-regression/test26-1.yml +ldv-regression/test26-2.yml +ldv-regression/test27-1.yml +ldv-regression/test28-1.yml +ldv-regression/test28-2.yml +ldv-regression/test29-1.yml +ldv-regression/test29-2.yml +ldv-regression/test30-1.yml +ldv-regression/test30-2.yml +ldv-regression/test_address.yml +ldv-regression/test_cut_trace.yml +ldv-regression/test_malloc-1.yml +ldv-regression/test_malloc-2.yml +ldv-regression/test_overflow.yml +ldv-regression/test_union.c_1.yml +ldv-regression/test_union.yml +ldv-regression/test_union_cast-1.yml +ldv-regression/test_union_cast-2.yml +ldv-regression/test_union_cast.c_1.yml +ldv-regression/test_union_cast.yml +ldv-regression/test_while_int.c_1.yml +ldv-regression/test_while_int.yml +ldv-sets/test_add-1.yml +ldv-sets/test_add-2.yml +ldv-sets/test_mutex.yml +ldv-sets/test_mutex_double_lock.yml +ldv-sets/test_mutex_double_unlock.yml +ldv-sets/test_mutex_unbounded-1.yml +ldv-sets/test_mutex_unbounded-2.yml +ldv-sets/test_mutex_unlock_at_exit.yml +list-ext-properties/list-ext.yml +list-ext-properties/simple-ext.yml +list-ext2-properties/list_and_tree_cnstr-1.yml +list-ext2-properties/list_and_tree_cnstr-2.yml +list-ext2-properties/simple_and_skiplist_2lvl-1.yml +list-ext2-properties/simple_and_skiplist_2lvl-2.yml +list-ext2-properties/simple_search_value-1.yml +list-ext2-properties/simple_search_value-2.yml +list-ext3-properties/dll_circular_traversal-2.yml +list-ext3-properties/dll_nullified-1.yml +list-ext3-properties/dll_nullified-2.yml +list-ext3-properties/sll_circular_traversal-1.yml +list-ext3-properties/sll_length_check-1.yml +list-ext3-properties/sll_length_check-2.yml +list-ext3-properties/sll_nondet_insert-1.yml +list-ext3-properties/sll_nondet_insert-2.yml +list-ext3-properties/sll_of_sll_nondet_append-1.yml +list-ext3-properties/sll_of_sll_nondet_append-2.yml +list-properties/alternating_list-1.yml +list-properties/alternating_list-2.yml +list-properties/list-1.yml +list-properties/list-2.yml +list-properties/list_flag-1.yml +list-properties/list_flag-2.yml +list-properties/list_search-1.yml +list-properties/list_search-2.yml +list-properties/simple-1.yml +list-properties/simple-2.yml +list-properties/simple_built_from_end.yml +list-properties/splice-1.yml +list-properties/splice-2.yml +list-simple/dll2c_append_equal.yml +list-simple/dll2c_append_unequal.yml +list-simple/dll2c_insert_equal.yml +list-simple/dll2c_insert_unequal.yml +list-simple/dll2c_prepend_equal.yml +list-simple/dll2c_prepend_unequal.yml +list-simple/dll2c_remove_all.yml +list-simple/dll2c_remove_all_reverse.yml +list-simple/dll2c_update_all.yml +list-simple/dll2c_update_all_reverse.yml +list-simple/dll2n_append_equal.yml +list-simple/dll2n_append_unequal.yml +list-simple/dll2n_insert_equal.yml +list-simple/dll2n_insert_unequal.yml +list-simple/dll2n_prepend_equal.yml +list-simple/dll2n_prepend_unequal.yml +list-simple/dll2n_remove_all.yml +list-simple/dll2n_remove_all_reverse.yml +list-simple/dll2n_update_all.yml +list-simple/dll2n_update_all_reverse.yml +list-simple/sll2c_append_equal.yml +list-simple/sll2c_append_unequal.yml +list-simple/sll2c_insert_equal.yml +list-simple/sll2c_insert_unequal.yml +list-simple/sll2c_prepend_equal.yml +list-simple/sll2c_prepend_unequal.yml +list-simple/sll2c_remove_all.yml +list-simple/sll2c_remove_all_reverse.yml +list-simple/sll2c_update_all.yml +list-simple/sll2c_update_all_reverse.yml +list-simple/sll2n_append_equal.yml +list-simple/sll2n_append_unequal.yml +list-simple/sll2n_insert_equal.yml +list-simple/sll2n_insert_unequal.yml +list-simple/sll2n_prepend_equal.yml +list-simple/sll2n_prepend_unequal.yml +list-simple/sll2n_remove_all.yml +list-simple/sll2n_remove_all_reverse.yml +list-simple/sll2n_update_all.yml +list-simple/sll2n_update_all_reverse.yml +longjmp/68-longjmp_05-heap-counting-return-one-method_true.yml +longjmp/68-longjmp_05-heap-counting-return-one-method_unknown_1_neg.yml +longjmp/68-longjmp_05-heap-counting-return-one-method_unknown_1_pos.yml +longjmp/68-longjmp_21-multifun_true.yml +longjmp/68-longjmp_22-multifun-arg_true.yml +longjmp/68-longjmp_42-poison-reduced_true.yml +loop-floats-scientific-comp/loop4.yml +loop-floats-scientific-comp/loop5.yml +loop-industry-pattern/aiob_1.yml +loop-industry-pattern/aiob_2.yml +loop-industry-pattern/aiob_3.yml +loop-industry-pattern/aiob_4.c.v+cfa-reducer.yml +loop-industry-pattern/aiob_4.c.v+lh-reducer.yml +loop-industry-pattern/aiob_4.c.v+lhb-reducer.yml +loop-industry-pattern/aiob_4.c.v+nlh-reducer.yml +loop-industry-pattern/aiob_4.yml +loop-industry-pattern/ofuf_1.yml +loop-industry-pattern/ofuf_2.yml +loop-industry-pattern/ofuf_3.yml +loop-industry-pattern/ofuf_4.yml +loop-industry-pattern/ofuf_5.yml +loop-lit/mcmillan2006.yml +loops-crafted-1/discover_list.yml +loops-crafted-1/net_reset.yml +loops/bubble_sort-2.yml +loops/insertion_sort-1-2.yml +loops/insertion_sort-2-2.yml +loops/linear_sea.ch.yml +loops/linear_search.yml +loops/lu.cmp.yml +loops/ludcmp.yml +loops/matrix-2-2.yml +loops/n.c24.yml +loops/veris.c_NetBSD-libc_loop.yml +loops/veris.c_OpenSER_cases1_stripFullBoth_arr.yml +loops/veris.c_sendmail_tTflag_arr_one_loop.yml +loops/verisec_NetBSD-libc_loop.yml +loops/verisec_OpenSER_cases1_stripFullBoth_arr.yml +loops/vogal-1.yml +loops/vogal-2.yml +memory-model/2SB.yml +memory-model/4SB.yml +neural-networks/cartpole_0_safe.c-amalgamation.yml +neural-networks/cartpole_10_safe.c-amalgamation.yml +neural-networks/cartpole_11_safe.c-amalgamation.yml +neural-networks/cartpole_12_safe.c-amalgamation.yml +neural-networks/cartpole_13_safe.c-amalgamation.yml +neural-networks/cartpole_14_safe.c-amalgamation.yml +neural-networks/cartpole_15_safe.c-amalgamation.yml +neural-networks/cartpole_16_safe.c-amalgamation.yml +neural-networks/cartpole_17_safe.c-amalgamation.yml +neural-networks/cartpole_18_safe.c-amalgamation.yml +neural-networks/cartpole_19_safe.c-amalgamation.yml +neural-networks/cartpole_1_safe.c-amalgamation.yml +neural-networks/cartpole_20_safe.c-amalgamation.yml +neural-networks/cartpole_21_safe.c-amalgamation.yml +neural-networks/cartpole_22_safe.c-amalgamation.yml +neural-networks/cartpole_23_safe.c-amalgamation.yml +neural-networks/cartpole_24_safe.c-amalgamation.yml +neural-networks/cartpole_25_safe.c-amalgamation.yml +neural-networks/cartpole_26_safe.c-amalgamation.yml +neural-networks/cartpole_27_safe.c-amalgamation.yml +neural-networks/cartpole_28_safe.c-amalgamation.yml +neural-networks/cartpole_29_unsafe.c-amalgamation.yml +neural-networks/cartpole_2_safe.c-amalgamation.yml +neural-networks/cartpole_30_safe.c-amalgamation.yml +neural-networks/cartpole_31_safe.c-amalgamation.yml +neural-networks/cartpole_32_safe.c-amalgamation.yml +neural-networks/cartpole_33_safe.c-amalgamation.yml +neural-networks/cartpole_34_safe.c-amalgamation.yml +neural-networks/cartpole_35_safe.c-amalgamation.yml +neural-networks/cartpole_36_unsafe.c-amalgamation.yml +neural-networks/cartpole_37_safe.c-amalgamation.yml +neural-networks/cartpole_38_safe.c-amalgamation.yml +neural-networks/cartpole_39_safe.c-amalgamation.yml +neural-networks/cartpole_3_safe.c-amalgamation.yml +neural-networks/cartpole_40_safe.c-amalgamation.yml +neural-networks/cartpole_41_safe.c-amalgamation.yml +neural-networks/cartpole_42_unsafe.c-amalgamation.yml +neural-networks/cartpole_43_safe.c-amalgamation.yml +neural-networks/cartpole_44_unsafe.c-amalgamation.yml +neural-networks/cartpole_45_safe.c-amalgamation.yml +neural-networks/cartpole_46_safe.c-amalgamation.yml +neural-networks/cartpole_47_safe.c-amalgamation.yml +neural-networks/cartpole_48_safe.c-amalgamation.yml +neural-networks/cartpole_49_safe.c-amalgamation.yml +neural-networks/cartpole_4_safe.c-amalgamation.yml +neural-networks/cartpole_50_safe.c-amalgamation.yml +neural-networks/cartpole_51_safe.c-amalgamation.yml +neural-networks/cartpole_52_safe.c-amalgamation.yml +neural-networks/cartpole_53_safe.c-amalgamation.yml +neural-networks/cartpole_54_safe.c-amalgamation.yml +neural-networks/cartpole_55_safe.c-amalgamation.yml +neural-networks/cartpole_56_safe.c-amalgamation.yml +neural-networks/cartpole_57_safe.c-amalgamation.yml +neural-networks/cartpole_58_safe.c-amalgamation.yml +neural-networks/cartpole_59_safe.c-amalgamation.yml +neural-networks/cartpole_5_safe.c-amalgamation.yml +neural-networks/cartpole_60_safe.c-amalgamation.yml +neural-networks/cartpole_61_safe.c-amalgamation.yml +neural-networks/cartpole_62_safe.c-amalgamation.yml +neural-networks/cartpole_63_safe.c-amalgamation.yml +neural-networks/cartpole_64_safe.c-amalgamation.yml +neural-networks/cartpole_65_safe.c-amalgamation.yml +neural-networks/cartpole_66_safe.c-amalgamation.yml +neural-networks/cartpole_67_safe.c-amalgamation.yml +neural-networks/cartpole_68_safe.c-amalgamation.yml +neural-networks/cartpole_69_safe.c-amalgamation.yml +neural-networks/cartpole_6_safe.c-amalgamation.yml +neural-networks/cartpole_70_safe.c-amalgamation.yml +neural-networks/cartpole_71_safe.c-amalgamation.yml +neural-networks/cartpole_72_safe.c-amalgamation.yml +neural-networks/cartpole_73_safe.c-amalgamation.yml +neural-networks/cartpole_74_safe.c-amalgamation.yml +neural-networks/cartpole_75_safe.c-amalgamation.yml +neural-networks/cartpole_76_safe.c-amalgamation.yml +neural-networks/cartpole_77_safe.c-amalgamation.yml +neural-networks/cartpole_78_safe.c-amalgamation.yml +neural-networks/cartpole_79_safe.c-amalgamation.yml +neural-networks/cartpole_7_safe.c-amalgamation.yml +neural-networks/cartpole_80_safe.c-amalgamation.yml +neural-networks/cartpole_81_safe.c-amalgamation.yml +neural-networks/cartpole_82_safe.c-amalgamation.yml +neural-networks/cartpole_83_safe.c-amalgamation.yml +neural-networks/cartpole_84_safe.c-amalgamation.yml +neural-networks/cartpole_85_safe.c-amalgamation.yml +neural-networks/cartpole_86_safe.c-amalgamation.yml +neural-networks/cartpole_87_safe.c-amalgamation.yml +neural-networks/cartpole_88_safe.c-amalgamation.yml +neural-networks/cartpole_89_safe.c-amalgamation.yml +neural-networks/cartpole_8_safe.c-amalgamation.yml +neural-networks/cartpole_90_safe.c-amalgamation.yml +neural-networks/cartpole_91_safe.c-amalgamation.yml +neural-networks/cartpole_92_safe.c-amalgamation.yml +neural-networks/cartpole_93_safe.c-amalgamation.yml +neural-networks/cartpole_94_safe.c-amalgamation.yml +neural-networks/cartpole_95_safe.c-amalgamation.yml +neural-networks/cartpole_96_safe.c-amalgamation.yml +neural-networks/cartpole_97_safe.c-amalgamation.yml +neural-networks/cartpole_98_safe.c-amalgamation.yml +neural-networks/cartpole_99_unsafe.c-amalgamation.yml +neural-networks/cartpole_9_safe.c-amalgamation.yml +neural-networks/cos_0_safe.c-amalgamation.yml +neural-networks/cos_1_safe.c-amalgamation.yml +neural-networks/cos_2_safe.c-amalgamation.yml +neural-networks/cos_3_unsafe.c-amalgamation.yml +neural-networks/cos_4_safe.c-amalgamation.yml +neural-networks/cos_5_unsafe.c-amalgamation.yml +neural-networks/cos_6_safe.c-amalgamation.yml +neural-networks/cos_7_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_0_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_10_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_11_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_12_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_13_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_14_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_15_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_16_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_17_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_18_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_19_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_1_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_20_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_21_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_22_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_23_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_24_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_25_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_26_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_27_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_28_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_29_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_2_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_30_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_31_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_32_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_33_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_34_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_35_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_36_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_37_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_38_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_39_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_3_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_40_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_41_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_42_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_43_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_44_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_45_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_46_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_47_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_48_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_49_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_4_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_50_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_51_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_52_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_53_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_54_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_55_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_56_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_57_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_58_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_59_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_5_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_60_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_61_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_62_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_63_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_64_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_65_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_66_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_67_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_68_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_69_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_6_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_70_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_71_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_72_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_73_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_74_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_75_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_76_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_77_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_78_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_79_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_7_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_80_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_81_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_82_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_83_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_84_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_85_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_86_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_87_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_88_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_89_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_8_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_90_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_91_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_92_safe.c-amalgamation.yml +neural-networks/dubinsrejoin_93_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_94_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_95_unsafe.c-amalgamation.yml +neural-networks/dubinsrejoin_9_safe.c-amalgamation.yml +neural-networks/elu_0_safe.c-amalgamation.yml +neural-networks/elu_1_safe.c-amalgamation.yml +neural-networks/elu_2_safe.c-amalgamation.yml +neural-networks/elu_3_unsafe.c-amalgamation.yml +neural-networks/elu_4_safe.c-amalgamation.yml +neural-networks/erf_0_safe.c-amalgamation.yml +neural-networks/erf_1_safe.c-amalgamation.yml +neural-networks/erf_2_safe.c-amalgamation.yml +neural-networks/erf_3_unsafe.c-amalgamation.yml +neural-networks/erf_4_safe.c-amalgamation.yml +neural-networks/erf_5_safe.c-amalgamation.yml +neural-networks/exp_0_safe.c-amalgamation.yml +neural-networks/exp_1_safe.c-amalgamation.yml +neural-networks/exp_2_safe.c-amalgamation.yml +neural-networks/exp_3_safe.c-amalgamation.yml +neural-networks/exp_4_unsafe.c-amalgamation.yml +neural-networks/exp_5_unsafe.c-amalgamation.yml +neural-networks/exp_6_safe.c-amalgamation.yml +neural-networks/gcas_0_safe.c-amalgamation.yml +neural-networks/gcas_10_safe.c-amalgamation.yml +neural-networks/gcas_11_safe.c-amalgamation.yml +neural-networks/gcas_1_unsafe.c-amalgamation.yml +neural-networks/gcas_2_unsafe.c-amalgamation.yml +neural-networks/gcas_3_safe.c-amalgamation.yml +neural-networks/gcas_4_safe.c-amalgamation.yml +neural-networks/gcas_5_safe.c-amalgamation.yml +neural-networks/gcas_6_unsafe.c-amalgamation.yml +neural-networks/gcas_7_safe.c-amalgamation.yml +neural-networks/gcas_8_safe.c-amalgamation.yml +neural-networks/gcas_9_unsafe.c-amalgamation.yml +neural-networks/gelu_0_safe.c-amalgamation.yml +neural-networks/gelu_1_safe.c-amalgamation.yml +neural-networks/gelu_2_safe.c-amalgamation.yml +neural-networks/gelu_3_unsafe.c-amalgamation.yml +neural-networks/gelu_4_unsafe.c-amalgamation.yml +neural-networks/gelu_5_unsafe.c-amalgamation.yml +neural-networks/log_0_safe.c-amalgamation.yml +neural-networks/log_1_safe.c-amalgamation.yml +neural-networks/log_2_safe.c-amalgamation.yml +neural-networks/log_3_unsafe.c-amalgamation.yml +neural-networks/log_4_safe.c-amalgamation.yml +neural-networks/log_5_unsafe.c-amalgamation.yml +neural-networks/log_6_safe.c-amalgamation.yml +neural-networks/logistic_0_safe.c-amalgamation.yml +neural-networks/logistic_1_safe.c-amalgamation.yml +neural-networks/logistic_2_safe.c-amalgamation.yml +neural-networks/logistic_3_safe.c-amalgamation.yml +neural-networks/logistic_4_safe.c-amalgamation.yml +neural-networks/logistic_5_unsafe.c-amalgamation.yml +neural-networks/logistic_6_safe.c-amalgamation.yml +neural-networks/logistic_7_unsafe.c-amalgamation.yml +neural-networks/lunarlander_0_unsafe.c-amalgamation.yml +neural-networks/lunarlander_10_unsafe.c-amalgamation.yml +neural-networks/lunarlander_11_unsafe.c-amalgamation.yml +neural-networks/lunarlander_12_safe.c-amalgamation.yml +neural-networks/lunarlander_13_unsafe.c-amalgamation.yml +neural-networks/lunarlander_14_unsafe.c-amalgamation.yml +neural-networks/lunarlander_15_unsafe.c-amalgamation.yml +neural-networks/lunarlander_16_unsafe.c-amalgamation.yml +neural-networks/lunarlander_17_safe.c-amalgamation.yml +neural-networks/lunarlander_18_unsafe.c-amalgamation.yml +neural-networks/lunarlander_19_safe.c-amalgamation.yml +neural-networks/lunarlander_1_unsafe.c-amalgamation.yml +neural-networks/lunarlander_20_unsafe.c-amalgamation.yml +neural-networks/lunarlander_21_unsafe.c-amalgamation.yml +neural-networks/lunarlander_22_unsafe.c-amalgamation.yml +neural-networks/lunarlander_23_unsafe.c-amalgamation.yml +neural-networks/lunarlander_24_unsafe.c-amalgamation.yml +neural-networks/lunarlander_25_unsafe.c-amalgamation.yml +neural-networks/lunarlander_26_unsafe.c-amalgamation.yml +neural-networks/lunarlander_27_unsafe.c-amalgamation.yml +neural-networks/lunarlander_28_unsafe.c-amalgamation.yml +neural-networks/lunarlander_29_unsafe.c-amalgamation.yml +neural-networks/lunarlander_2_unsafe.c-amalgamation.yml +neural-networks/lunarlander_30_unsafe.c-amalgamation.yml +neural-networks/lunarlander_31_unsafe.c-amalgamation.yml +neural-networks/lunarlander_32_unsafe.c-amalgamation.yml +neural-networks/lunarlander_33_unsafe.c-amalgamation.yml +neural-networks/lunarlander_34_unsafe.c-amalgamation.yml +neural-networks/lunarlander_35_unsafe.c-amalgamation.yml +neural-networks/lunarlander_36_unsafe.c-amalgamation.yml +neural-networks/lunarlander_37_unsafe.c-amalgamation.yml +neural-networks/lunarlander_38_unsafe.c-amalgamation.yml +neural-networks/lunarlander_39_unsafe.c-amalgamation.yml +neural-networks/lunarlander_3_unsafe.c-amalgamation.yml +neural-networks/lunarlander_40_unsafe.c-amalgamation.yml +neural-networks/lunarlander_41_unsafe.c-amalgamation.yml +neural-networks/lunarlander_42_unsafe.c-amalgamation.yml +neural-networks/lunarlander_43_unsafe.c-amalgamation.yml +neural-networks/lunarlander_44_unsafe.c-amalgamation.yml +neural-networks/lunarlander_45_unsafe.c-amalgamation.yml +neural-networks/lunarlander_46_unsafe.c-amalgamation.yml +neural-networks/lunarlander_47_unsafe.c-amalgamation.yml +neural-networks/lunarlander_48_unsafe.c-amalgamation.yml +neural-networks/lunarlander_49_unsafe.c-amalgamation.yml +neural-networks/lunarlander_4_unsafe.c-amalgamation.yml +neural-networks/lunarlander_50_unsafe.c-amalgamation.yml +neural-networks/lunarlander_51_unsafe.c-amalgamation.yml +neural-networks/lunarlander_52_safe.c-amalgamation.yml +neural-networks/lunarlander_53_unsafe.c-amalgamation.yml +neural-networks/lunarlander_54_safe.c-amalgamation.yml +neural-networks/lunarlander_55_unsafe.c-amalgamation.yml +neural-networks/lunarlander_56_unsafe.c-amalgamation.yml +neural-networks/lunarlander_57_unsafe.c-amalgamation.yml +neural-networks/lunarlander_58_unsafe.c-amalgamation.yml +neural-networks/lunarlander_59_unsafe.c-amalgamation.yml +neural-networks/lunarlander_5_unsafe.c-amalgamation.yml +neural-networks/lunarlander_60_unsafe.c-amalgamation.yml +neural-networks/lunarlander_61_unsafe.c-amalgamation.yml +neural-networks/lunarlander_62_unsafe.c-amalgamation.yml +neural-networks/lunarlander_63_unsafe.c-amalgamation.yml +neural-networks/lunarlander_64_safe.c-amalgamation.yml +neural-networks/lunarlander_65_unsafe.c-amalgamation.yml +neural-networks/lunarlander_66_unsafe.c-amalgamation.yml +neural-networks/lunarlander_67_safe.c-amalgamation.yml +neural-networks/lunarlander_68_unsafe.c-amalgamation.yml +neural-networks/lunarlander_69_unsafe.c-amalgamation.yml +neural-networks/lunarlander_6_unsafe.c-amalgamation.yml +neural-networks/lunarlander_70_unsafe.c-amalgamation.yml +neural-networks/lunarlander_71_unsafe.c-amalgamation.yml +neural-networks/lunarlander_72_safe.c-amalgamation.yml +neural-networks/lunarlander_73_unsafe.c-amalgamation.yml +neural-networks/lunarlander_74_safe.c-amalgamation.yml +neural-networks/lunarlander_75_safe.c-amalgamation.yml +neural-networks/lunarlander_76_unsafe.c-amalgamation.yml +neural-networks/lunarlander_77_unsafe.c-amalgamation.yml +neural-networks/lunarlander_78_safe.c-amalgamation.yml +neural-networks/lunarlander_79_safe.c-amalgamation.yml +neural-networks/lunarlander_7_unsafe.c-amalgamation.yml +neural-networks/lunarlander_80_safe.c-amalgamation.yml +neural-networks/lunarlander_81_unsafe.c-amalgamation.yml +neural-networks/lunarlander_82_safe.c-amalgamation.yml +neural-networks/lunarlander_83_safe.c-amalgamation.yml +neural-networks/lunarlander_84_unsafe.c-amalgamation.yml +neural-networks/lunarlander_85_unsafe.c-amalgamation.yml +neural-networks/lunarlander_86_unsafe.c-amalgamation.yml +neural-networks/lunarlander_87_unsafe.c-amalgamation.yml +neural-networks/lunarlander_88_unsafe.c-amalgamation.yml +neural-networks/lunarlander_89_safe.c-amalgamation.yml +neural-networks/lunarlander_8_unsafe.c-amalgamation.yml +neural-networks/lunarlander_90_safe.c-amalgamation.yml +neural-networks/lunarlander_91_safe.c-amalgamation.yml +neural-networks/lunarlander_92_safe.c-amalgamation.yml +neural-networks/lunarlander_93_unsafe.c-amalgamation.yml +neural-networks/lunarlander_94_safe.c-amalgamation.yml +neural-networks/lunarlander_95_unsafe.c-amalgamation.yml +neural-networks/lunarlander_96_unsafe.c-amalgamation.yml +neural-networks/lunarlander_97_unsafe.c-amalgamation.yml +neural-networks/lunarlander_98_unsafe.c-amalgamation.yml +neural-networks/lunarlander_99_unsafe.c-amalgamation.yml +neural-networks/lunarlander_9_unsafe.c-amalgamation.yml +neural-networks/poly_1024_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_1024_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_1024_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_1024_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_1024_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_1024_thresh_5_unsafe.c-amalgamation.yml +neural-networks/poly_128_128_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_128_128_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_128_128_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_128_128_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_128_128_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_128_128_thresh_5_unsafe.c-amalgamation.yml +neural-networks/poly_128_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_128_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_128_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_128_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_128_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_128_thresh_5_unsafe.c-amalgamation.yml +neural-networks/poly_16_16_16_16_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_16_16_16_16_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_16_16_16_16_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_16_16_16_16_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_16_16_16_16_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_16_16_16_16_thresh_5_unsafe.c-amalgamation.yml +neural-networks/poly_16_16_16_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_16_16_16_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_16_16_16_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_16_16_16_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_16_16_16_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_16_16_16_thresh_5_unsafe.c-amalgamation.yml +neural-networks/poly_16_16_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_16_16_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_16_16_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_16_16_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_16_16_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_16_16_thresh_5_unsafe.c-amalgamation.yml +neural-networks/poly_256_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_256_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_256_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_256_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_256_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_256_thresh_5_unsafe.c-amalgamation.yml +neural-networks/poly_32_32_32_32_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_32_32_32_32_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_32_32_32_32_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_32_32_32_32_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_32_32_32_32_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_32_32_32_32_thresh_5_unsafe.c-amalgamation.yml +neural-networks/poly_32_32_32_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_32_32_32_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_32_32_32_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_32_32_32_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_32_32_32_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_32_32_32_thresh_5_unsafe.c-amalgamation.yml +neural-networks/poly_32_32_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_32_32_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_32_32_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_32_32_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_32_32_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_32_32_thresh_5_unsafe.c-amalgamation.yml +neural-networks/poly_4_4_4_4_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_4_4_4_4_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_4_4_4_4_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_4_4_4_4_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_4_4_4_4_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_4_4_4_4_thresh_5_unsafe.c-amalgamation.yml +neural-networks/poly_512_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_512_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_512_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_512_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_512_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_512_thresh_5_unsafe.c-amalgamation.yml +neural-networks/poly_64_64_64_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_64_64_64_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_64_64_64_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_64_64_64_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_64_64_64_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_64_64_64_thresh_5_unsafe.c-amalgamation.yml +neural-networks/poly_64_64_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_64_64_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_64_64_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_64_64_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_64_64_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_64_64_thresh_5_unsafe.c-amalgamation.yml +neural-networks/poly_8_8_8_8_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_8_8_8_8_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_8_8_8_8_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_8_8_8_8_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_8_8_8_8_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_8_8_8_8_thresh_5_unsafe.c-amalgamation.yml +neural-networks/poly_8_8_8_thresh_0_safe.c-amalgamation.yml +neural-networks/poly_8_8_8_thresh_1_safe.c-amalgamation.yml +neural-networks/poly_8_8_8_thresh_2_safe.c-amalgamation.yml +neural-networks/poly_8_8_8_thresh_3_unsafe.c-amalgamation.yml +neural-networks/poly_8_8_8_thresh_4_unsafe.c-amalgamation.yml +neural-networks/poly_8_8_8_thresh_5_unsafe.c-amalgamation.yml +neural-networks/relu_0_safe.c-amalgamation.yml +neural-networks/relu_1_safe.c-amalgamation.yml +neural-networks/relu_2_safe.c-amalgamation.yml +neural-networks/robot_0_unsafe.c-amalgamation.yml +neural-networks/robot_10_unsafe.c-amalgamation.yml +neural-networks/robot_1_unsafe.c-amalgamation.yml +neural-networks/robot_2_unsafe.c-amalgamation.yml +neural-networks/robot_3_safe.c-amalgamation.yml +neural-networks/robot_4_unsafe.c-amalgamation.yml +neural-networks/robot_5_safe.c-amalgamation.yml +neural-networks/robot_6_safe.c-amalgamation.yml +neural-networks/robot_7_safe.c-amalgamation.yml +neural-networks/robot_8_safe.c-amalgamation.yml +neural-networks/robot_9_unsafe.c-amalgamation.yml +neural-networks/sin_0_safe.c-amalgamation.yml +neural-networks/sin_1_safe.c-amalgamation.yml +neural-networks/sin_2_safe.c-amalgamation.yml +neural-networks/sin_3_unsafe.c-amalgamation.yml +neural-networks/sin_4_safe.c-amalgamation.yml +neural-networks/sin_5_unsafe.c-amalgamation.yml +neural-networks/sin_6_safe.c-amalgamation.yml +neural-networks/sin_7_safe.c-amalgamation.yml +neural-networks/softmax_0_safe.c-amalgamation.yml +neural-networks/softmax_10_safe.c-amalgamation.yml +neural-networks/softmax_11_safe.c-amalgamation.yml +neural-networks/softmax_12_unsafe.c-amalgamation.yml +neural-networks/softmax_13_unsafe.c-amalgamation.yml +neural-networks/softmax_1_unsafe.c-amalgamation.yml +neural-networks/softmax_2_safe.c-amalgamation.yml +neural-networks/softmax_3_unsafe.c-amalgamation.yml +neural-networks/softmax_4_safe.c-amalgamation.yml +neural-networks/softmax_5_unsafe.c-amalgamation.yml +neural-networks/softmax_6_safe.c-amalgamation.yml +neural-networks/softmax_7_unsafe.c-amalgamation.yml +neural-networks/softmax_8_safe.c-amalgamation.yml +neural-networks/softmax_9_unsafe.c-amalgamation.yml +neural-networks/softplus_0_safe.c-amalgamation.yml +neural-networks/softplus_1_safe.c-amalgamation.yml +neural-networks/softplus_2_safe.c-amalgamation.yml +neural-networks/softplus_3_safe.c-amalgamation.yml +neural-networks/softplus_4_unsafe.c-amalgamation.yml +neural-networks/softplus_5_safe.c-amalgamation.yml +neural-networks/softsign_0_safe.c-amalgamation.yml +neural-networks/softsign_1_safe.c-amalgamation.yml +neural-networks/softsign_2_unsafe.c-amalgamation.yml +neural-networks/softsign_3_safe.c-amalgamation.yml +neural-networks/softsign_4_safe.c-amalgamation.yml +neural-networks/softsign_5_safe.c-amalgamation.yml +neural-networks/softsign_w16_r1_case_0_unsafe.c-amalgamation.yml +neural-networks/softsign_w16_r1_case_1_safe.c-amalgamation.yml +neural-networks/softsign_w16_r2_case_0_safe.c-amalgamation.yml +neural-networks/softsign_w16_r2_case_1_unsafe.c-amalgamation.yml +neural-networks/softsign_w16_r3_case_0_safe.c-amalgamation.yml +neural-networks/softsign_w16_r3_case_1_unsafe.c-amalgamation.yml +neural-networks/softsign_w16_r4_case_0_safe.c-amalgamation.yml +neural-networks/softsign_w16_r4_case_1_unsafe.c-amalgamation.yml +neural-networks/softsign_w32_r1_case_0_unsafe.c-amalgamation.yml +neural-networks/softsign_w32_r1_case_1_safe.c-amalgamation.yml +neural-networks/softsign_w32_r2_case_0_safe.c-amalgamation.yml +neural-networks/softsign_w32_r2_case_1_unsafe.c-amalgamation.yml +neural-networks/softsign_w32_r3_case_0_safe.c-amalgamation.yml +neural-networks/softsign_w32_r3_case_1_unsafe.c-amalgamation.yml +neural-networks/softsign_w32_r4_case_0_safe.c-amalgamation.yml +neural-networks/softsign_w32_r4_case_1_unsafe.c-amalgamation.yml +neural-networks/softsign_w4_r1_case_0_unsafe.c-amalgamation.yml +neural-networks/softsign_w4_r1_case_1_safe.c-amalgamation.yml +neural-networks/softsign_w4_r2_case_0_safe.c-amalgamation.yml +neural-networks/softsign_w4_r2_case_1_unsafe.c-amalgamation.yml +neural-networks/softsign_w4_r3_case_0_safe.c-amalgamation.yml +neural-networks/softsign_w4_r3_case_1_unsafe.c-amalgamation.yml +neural-networks/softsign_w4_r4_case_0_safe.c-amalgamation.yml +neural-networks/softsign_w4_r4_case_1_unsafe.c-amalgamation.yml +neural-networks/softsign_w64_r1_case_0_unsafe.c-amalgamation.yml +neural-networks/softsign_w64_r1_case_1_safe.c-amalgamation.yml +neural-networks/softsign_w64_r2_case_0_safe.c-amalgamation.yml +neural-networks/softsign_w64_r2_case_1_unsafe.c-amalgamation.yml +neural-networks/softsign_w64_r3_case_0_safe.c-amalgamation.yml +neural-networks/softsign_w64_r3_case_1_unsafe.c-amalgamation.yml +neural-networks/softsign_w64_r4_case_0_safe.c-amalgamation.yml +neural-networks/softsign_w64_r4_case_1_unsafe.c-amalgamation.yml +neural-networks/softsign_w8_r1_case_0_unsafe.c-amalgamation.yml +neural-networks/softsign_w8_r1_case_1_safe.c-amalgamation.yml +neural-networks/softsign_w8_r2_case_0_safe.c-amalgamation.yml +neural-networks/softsign_w8_r2_case_1_unsafe.c-amalgamation.yml +neural-networks/softsign_w8_r3_case_0_safe.c-amalgamation.yml +neural-networks/softsign_w8_r3_case_1_unsafe.c-amalgamation.yml +neural-networks/softsign_w8_r4_case_0_safe.c-amalgamation.yml +neural-networks/softsign_w8_r4_case_1_unsafe.c-amalgamation.yml +neural-networks/sqrt_0_safe.c-amalgamation.yml +neural-networks/sqrt_1_safe.c-amalgamation.yml +neural-networks/sqrt_2_safe.c-amalgamation.yml +neural-networks/sqrt_3_safe.c-amalgamation.yml +neural-networks/sqrt_4_unsafe.c-amalgamation.yml +neural-networks/sqrt_5_safe.c-amalgamation.yml +neural-networks/sqrt_6_unsafe.c-amalgamation.yml +neural-networks/sqrt_7_safe.c-amalgamation.yml +neural-networks/tanh_0_safe.c-amalgamation.yml +neural-networks/tanh_1_safe.c-amalgamation.yml +neural-networks/tanh_2_safe.c-amalgamation.yml +neural-networks/tanh_3_safe.c-amalgamation.yml +neural-networks/tanh_4_safe.c-amalgamation.yml +neural-networks/tanh_5_unsafe.c-amalgamation.yml +neural-networks/tanh_6_safe.c-amalgamation.yml +neural-networks/tanh_7_safe.c-amalgamation.yml +neural-networks/tanh_w16_r1_case_0_unsafe.c-amalgamation.yml +neural-networks/tanh_w16_r1_case_1_safe.c-amalgamation.yml +neural-networks/tanh_w16_r2_case_0_safe.c-amalgamation.yml +neural-networks/tanh_w16_r2_case_1_unsafe.c-amalgamation.yml +neural-networks/tanh_w16_r3_case_0_safe.c-amalgamation.yml +neural-networks/tanh_w16_r3_case_1_safe.c-amalgamation.yml +neural-networks/tanh_w16_r4_case_0_safe.c-amalgamation.yml +neural-networks/tanh_w16_r4_case_1_safe.c-amalgamation.yml +neural-networks/tanh_w32_r1_case_0_unsafe.c-amalgamation.yml +neural-networks/tanh_w32_r1_case_1_safe.c-amalgamation.yml +neural-networks/tanh_w32_r2_case_0_safe.c-amalgamation.yml +neural-networks/tanh_w32_r2_case_1_unsafe.c-amalgamation.yml +neural-networks/tanh_w32_r3_case_0_safe.c-amalgamation.yml +neural-networks/tanh_w32_r3_case_1_safe.c-amalgamation.yml +neural-networks/tanh_w32_r4_case_0_safe.c-amalgamation.yml +neural-networks/tanh_w32_r4_case_1_safe.c-amalgamation.yml +neural-networks/tanh_w4_r1_case_0_unsafe.c-amalgamation.yml +neural-networks/tanh_w4_r1_case_1_safe.c-amalgamation.yml +neural-networks/tanh_w4_r2_case_0_safe.c-amalgamation.yml +neural-networks/tanh_w4_r2_case_1_unsafe.c-amalgamation.yml +neural-networks/tanh_w4_r3_case_0_safe.c-amalgamation.yml +neural-networks/tanh_w4_r3_case_1_unsafe.c-amalgamation.yml +neural-networks/tanh_w4_r4_case_0_safe.c-amalgamation.yml +neural-networks/tanh_w4_r4_case_1_unsafe.c-amalgamation.yml +neural-networks/tanh_w64_r1_case_0_unsafe.c-amalgamation.yml +neural-networks/tanh_w64_r1_case_1_safe.c-amalgamation.yml +neural-networks/tanh_w64_r2_case_0_safe.c-amalgamation.yml +neural-networks/tanh_w64_r2_case_1_unsafe.c-amalgamation.yml +neural-networks/tanh_w64_r3_case_0_safe.c-amalgamation.yml +neural-networks/tanh_w64_r3_case_1_safe.c-amalgamation.yml +neural-networks/tanh_w64_r4_case_0_safe.c-amalgamation.yml +neural-networks/tanh_w64_r4_case_1_safe.c-amalgamation.yml +neural-networks/tanh_w8_r1_case_0_unsafe.c-amalgamation.yml +neural-networks/tanh_w8_r1_case_1_safe.c-amalgamation.yml +neural-networks/tanh_w8_r2_case_0_safe.c-amalgamation.yml +neural-networks/tanh_w8_r2_case_1_unsafe.c-amalgamation.yml +neural-networks/tanh_w8_r3_case_0_safe.c-amalgamation.yml +neural-networks/tanh_w8_r3_case_1_unsafe.c-amalgamation.yml +neural-networks/tanh_w8_r4_case_0_safe.c-amalgamation.yml +neural-networks/tanh_w8_r4_case_1_safe.c-amalgamation.yml +neural-networks/vdp_0_safe.c-amalgamation.yml +neural-networks/vdp_10_safe.c-amalgamation.yml +neural-networks/vdp_11_safe.c-amalgamation.yml +neural-networks/vdp_1_safe.c-amalgamation.yml +neural-networks/vdp_2_safe.c-amalgamation.yml +neural-networks/vdp_3_unsafe.c-amalgamation.yml +neural-networks/vdp_4_safe.c-amalgamation.yml +neural-networks/vdp_5_safe.c-amalgamation.yml +neural-networks/vdp_6_unsafe.c-amalgamation.yml +neural-networks/vdp_7_safe.c-amalgamation.yml +neural-networks/vdp_8_unsafe.c-amalgamation.yml +neural-networks/vdp_9_safe.c-amalgamation.yml +ntdrivers/cdaudio.i.cil-1.yml +ntdrivers/diskperf.i.cil-1.yml +ntdrivers/diskperf.i.cil-2.yml +ntdrivers/floppy.i.cil-1.yml +ntdrivers/floppy.i.cil-3.yml +ntdrivers/kbfiltr.i.cil-2.yml +ntdrivers/parport.i.cil-1.yml +ntdrivers/parport.i.cil-2.yml +product-lines/elevator_spec13_product21.cil.yml +product-lines/elevator_spec13_product22.cil.yml +product-lines/elevator_spec13_product23.cil.yml +product-lines/elevator_spec13_product24.cil.yml +product-lines/elevator_spec13_product29.cil.yml +product-lines/elevator_spec13_product30.cil.yml +product-lines/elevator_spec13_product31.cil.yml +product-lines/elevator_spec13_product32.cil.yml +product-lines/elevator_spec13_productSimulator.cil.yml +product-lines/elevator_spec14_product03.cil.yml +product-lines/elevator_spec14_product11.cil.yml +product-lines/elevator_spec14_product19.cil.yml +product-lines/elevator_spec14_product20.cil.yml +product-lines/elevator_spec14_product23.cil.yml +product-lines/elevator_spec14_product24.cil.yml +product-lines/elevator_spec14_product27.cil.yml +product-lines/elevator_spec14_product28.cil.yml +product-lines/elevator_spec14_product31.cil.yml +product-lines/elevator_spec14_product32.cil.yml +product-lines/elevator_spec14_productSimulator.cil.yml +product-lines/elevator_spec1_product01.cil.yml +product-lines/elevator_spec1_product03.cil.yml +product-lines/elevator_spec1_product09.cil.yml +product-lines/elevator_spec1_product11.cil.yml +product-lines/elevator_spec1_product17.cil.yml +product-lines/elevator_spec1_product18.cil.yml +product-lines/elevator_spec1_product19.cil.yml +product-lines/elevator_spec1_product20.cil.yml +product-lines/elevator_spec1_product21.cil.yml +product-lines/elevator_spec1_product22.cil.yml +product-lines/elevator_spec1_product23.cil.yml +product-lines/elevator_spec1_product24.cil.yml +product-lines/elevator_spec1_product25.cil.yml +product-lines/elevator_spec1_product26.cil.yml +product-lines/elevator_spec1_product27.cil.yml +product-lines/elevator_spec1_product28.cil.yml +product-lines/elevator_spec1_product29.cil.yml +product-lines/elevator_spec1_product30.cil.yml +product-lines/elevator_spec1_product31.cil.yml +product-lines/elevator_spec1_product32.cil.yml +product-lines/elevator_spec1_productSimulator.cil.yml +product-lines/elevator_spec2_product01.cil.yml +product-lines/elevator_spec2_product03.cil.yml +product-lines/elevator_spec2_product09.cil.yml +product-lines/elevator_spec2_product11.cil.yml +product-lines/elevator_spec2_product17.cil.yml +product-lines/elevator_spec2_product18.cil.yml +product-lines/elevator_spec2_product19.cil.yml +product-lines/elevator_spec2_product20.cil.yml +product-lines/elevator_spec2_product21.cil.yml +product-lines/elevator_spec2_product22.cil.yml +product-lines/elevator_spec2_product23.cil.yml +product-lines/elevator_spec2_product24.cil.yml +product-lines/elevator_spec2_product25.cil.yml +product-lines/elevator_spec2_product26.cil.yml +product-lines/elevator_spec2_product27.cil.yml +product-lines/elevator_spec2_product28.cil.yml +product-lines/elevator_spec2_product29.cil.yml +product-lines/elevator_spec2_product30.cil.yml +product-lines/elevator_spec2_product31.cil.yml +product-lines/elevator_spec2_product32.cil.yml +product-lines/elevator_spec2_productSimulator.cil.yml +product-lines/elevator_spec3_product01.cil.yml +product-lines/elevator_spec3_product03.cil.yml +product-lines/elevator_spec3_product09.cil.yml +product-lines/elevator_spec3_product11.cil.yml +product-lines/elevator_spec3_product17.cil.yml +product-lines/elevator_spec3_product18.cil.yml +product-lines/elevator_spec3_product19.cil.yml +product-lines/elevator_spec3_product20.cil.yml +product-lines/elevator_spec3_product21.cil.yml +product-lines/elevator_spec3_product22.cil.yml +product-lines/elevator_spec3_product23.cil.yml +product-lines/elevator_spec3_product24.cil.yml +product-lines/elevator_spec3_product25.cil.yml +product-lines/elevator_spec3_product26.cil.yml +product-lines/elevator_spec3_product27.cil.yml +product-lines/elevator_spec3_product28.cil.yml +product-lines/elevator_spec3_product29.cil.yml +product-lines/elevator_spec3_product30.cil.yml +product-lines/elevator_spec3_product31.cil.yml +product-lines/elevator_spec3_product32.cil.yml +product-lines/elevator_spec3_productSimulator.cil.yml +product-lines/elevator_spec9_product09.cil.yml +product-lines/elevator_spec9_product11.cil.yml +product-lines/elevator_spec9_product25.cil.yml +product-lines/elevator_spec9_product26.cil.yml +product-lines/elevator_spec9_product27.cil.yml +product-lines/elevator_spec9_product28.cil.yml +product-lines/elevator_spec9_product29.cil.yml +product-lines/elevator_spec9_product30.cil.yml +product-lines/elevator_spec9_product31.cil.yml +product-lines/elevator_spec9_product32.cil.yml +product-lines/elevator_spec9_productSimulator.cil.yml +product-lines/email_spec0_product05.cil.yml +product-lines/email_spec0_product09.cil.yml +product-lines/email_spec0_product10.cil.yml +product-lines/email_spec0_product11.cil.yml +product-lines/email_spec0_product16.cil.yml +product-lines/email_spec0_product19.cil.yml +product-lines/email_spec0_product21.cil.yml +product-lines/email_spec0_product22.cil.yml +product-lines/email_spec0_product24.cil.yml +product-lines/email_spec0_product25.cil.yml +product-lines/email_spec0_product26.cil.yml +product-lines/email_spec0_product27.cil.yml +product-lines/email_spec0_product31.cil.yml +product-lines/email_spec0_product33.cil.yml +product-lines/email_spec0_product34.cil.yml +product-lines/email_spec0_product35.cil.yml +product-lines/email_spec0_product36.cil.yml +product-lines/email_spec0_product37.cil.yml +product-lines/email_spec0_product38.cil.yml +product-lines/email_spec0_product40.cil.yml +product-lines/email_spec0_productSimulator.cil.yml +product-lines/email_spec11_product03.cil.yml +product-lines/email_spec11_product07.cil.yml +product-lines/email_spec11_product08.cil.yml +product-lines/email_spec11_product10.cil.yml +product-lines/email_spec11_product15.cil.yml +product-lines/email_spec11_product18.cil.yml +product-lines/email_spec11_product20.cil.yml +product-lines/email_spec11_product22.cil.yml +product-lines/email_spec11_product23.cil.yml +product-lines/email_spec11_product24.cil.yml +product-lines/email_spec11_product26.cil.yml +product-lines/email_spec11_product27.cil.yml +product-lines/email_spec11_product30.cil.yml +product-lines/email_spec11_product32.cil.yml +product-lines/email_spec11_product33.cil.yml +product-lines/email_spec11_product35.cil.yml +product-lines/email_spec11_product36.cil.yml +product-lines/email_spec11_product37.cil.yml +product-lines/email_spec11_product39.cil.yml +product-lines/email_spec11_product40.cil.yml +product-lines/email_spec11_productSimulator.cil.yml +product-lines/email_spec1_product12.cil.yml +product-lines/email_spec1_product14.cil.yml +product-lines/email_spec1_product15.cil.yml +product-lines/email_spec1_product16.cil.yml +product-lines/email_spec1_product20.cil.yml +product-lines/email_spec1_product21.cil.yml +product-lines/email_spec1_product22.cil.yml +product-lines/email_spec1_product26.cil.yml +product-lines/email_spec1_product28.cil.yml +product-lines/email_spec1_product29.cil.yml +product-lines/email_spec1_product30.cil.yml +product-lines/email_spec1_product31.cil.yml +product-lines/email_spec1_product32.cil.yml +product-lines/email_spec1_product33.cil.yml +product-lines/email_spec1_product34.cil.yml +product-lines/email_spec1_product35.cil.yml +product-lines/email_spec1_productSimulator.cil.yml +product-lines/email_spec27_product13.cil.yml +product-lines/email_spec27_product17.cil.yml +product-lines/email_spec27_product18.cil.yml +product-lines/email_spec27_product19.cil.yml +product-lines/email_spec27_product23.cil.yml +product-lines/email_spec27_product24.cil.yml +product-lines/email_spec27_product25.cil.yml +product-lines/email_spec27_product27.cil.yml +product-lines/email_spec27_product28.cil.yml +product-lines/email_spec27_product29.cil.yml +product-lines/email_spec27_product30.cil.yml +product-lines/email_spec27_product31.cil.yml +product-lines/email_spec27_product32.cil.yml +product-lines/email_spec27_product33.cil.yml +product-lines/email_spec27_product34.cil.yml +product-lines/email_spec27_product35.cil.yml +product-lines/email_spec27_productSimulator.cil.yml +product-lines/email_spec3_product13.cil.yml +product-lines/email_spec3_product17.cil.yml +product-lines/email_spec3_product18.cil.yml +product-lines/email_spec3_product19.cil.yml +product-lines/email_spec3_product23.cil.yml +product-lines/email_spec3_product24.cil.yml +product-lines/email_spec3_product25.cil.yml +product-lines/email_spec3_product27.cil.yml +product-lines/email_spec3_product28.cil.yml +product-lines/email_spec3_product29.cil.yml +product-lines/email_spec3_product30.cil.yml +product-lines/email_spec3_product31.cil.yml +product-lines/email_spec3_product32.cil.yml +product-lines/email_spec3_product33.cil.yml +product-lines/email_spec3_product34.cil.yml +product-lines/email_spec3_product35.cil.yml +product-lines/email_spec3_productSimulator.cil.yml +product-lines/email_spec4_product13.cil.yml +product-lines/email_spec4_product17.cil.yml +product-lines/email_spec4_product18.cil.yml +product-lines/email_spec4_product19.cil.yml +product-lines/email_spec4_product23.cil.yml +product-lines/email_spec4_product24.cil.yml +product-lines/email_spec4_product25.cil.yml +product-lines/email_spec4_product27.cil.yml +product-lines/email_spec4_product28.cil.yml +product-lines/email_spec4_product29.cil.yml +product-lines/email_spec4_product30.cil.yml +product-lines/email_spec4_product31.cil.yml +product-lines/email_spec4_product32.cil.yml +product-lines/email_spec4_product33.cil.yml +product-lines/email_spec4_product34.cil.yml +product-lines/email_spec4_product35.cil.yml +product-lines/email_spec4_productSimulator.cil.yml +product-lines/email_spec6_product12.cil.yml +product-lines/email_spec6_product14.cil.yml +product-lines/email_spec6_product15.cil.yml +product-lines/email_spec6_product16.cil.yml +product-lines/email_spec6_product20.cil.yml +product-lines/email_spec6_product21.cil.yml +product-lines/email_spec6_product22.cil.yml +product-lines/email_spec6_product26.cil.yml +product-lines/email_spec6_product28.cil.yml +product-lines/email_spec6_product29.cil.yml +product-lines/email_spec6_product30.cil.yml +product-lines/email_spec6_product31.cil.yml +product-lines/email_spec6_product32.cil.yml +product-lines/email_spec6_product33.cil.yml +product-lines/email_spec6_product34.cil.yml +product-lines/email_spec6_product35.cil.yml +product-lines/email_spec6_productSimulator.cil.yml +product-lines/email_spec7_product13.cil.yml +product-lines/email_spec7_product17.cil.yml +product-lines/email_spec7_product18.cil.yml +product-lines/email_spec7_product19.cil.yml +product-lines/email_spec7_product23.cil.yml +product-lines/email_spec7_product24.cil.yml +product-lines/email_spec7_product25.cil.yml +product-lines/email_spec7_product27.cil.yml +product-lines/email_spec7_product28.cil.yml +product-lines/email_spec7_product29.cil.yml +product-lines/email_spec7_product30.cil.yml +product-lines/email_spec7_product31.cil.yml +product-lines/email_spec7_product32.cil.yml +product-lines/email_spec7_product33.cil.yml +product-lines/email_spec7_product34.cil.yml +product-lines/email_spec7_product35.cil.yml +product-lines/email_spec7_productSimulator.cil.yml +product-lines/email_spec8_product12.cil.yml +product-lines/email_spec8_product14.cil.yml +product-lines/email_spec8_product15.cil.yml +product-lines/email_spec8_product16.cil.yml +product-lines/email_spec8_product20.cil.yml +product-lines/email_spec8_product21.cil.yml +product-lines/email_spec8_product22.cil.yml +product-lines/email_spec8_product26.cil.yml +product-lines/email_spec8_product28.cil.yml +product-lines/email_spec8_product29.cil.yml +product-lines/email_spec8_product30.cil.yml +product-lines/email_spec8_product31.cil.yml +product-lines/email_spec8_product32.cil.yml +product-lines/email_spec8_product33.cil.yml +product-lines/email_spec8_product34.cil.yml +product-lines/email_spec8_product35.cil.yml +product-lines/email_spec8_productSimulator.cil.yml +product-lines/email_spec9_product12.cil.yml +product-lines/email_spec9_product14.cil.yml +product-lines/email_spec9_product15.cil.yml +product-lines/email_spec9_product16.cil.yml +product-lines/email_spec9_product20.cil.yml +product-lines/email_spec9_product21.cil.yml +product-lines/email_spec9_product22.cil.yml +product-lines/email_spec9_product26.cil.yml +product-lines/email_spec9_product28.cil.yml +product-lines/email_spec9_product29.cil.yml +product-lines/email_spec9_product30.cil.yml +product-lines/email_spec9_product31.cil.yml +product-lines/email_spec9_product32.cil.yml +product-lines/email_spec9_product33.cil.yml +product-lines/email_spec9_product34.cil.yml +product-lines/email_spec9_product35.cil.yml +product-lines/email_spec9_productSimulator.cil.yml +product-lines/minepump_spec1_product01.cil.yml +product-lines/minepump_spec1_product02.cil.yml +product-lines/minepump_spec1_product03.cil.yml +product-lines/minepump_spec1_product04.cil.yml +product-lines/minepump_spec1_product05.cil.yml +product-lines/minepump_spec1_product06.cil.yml +product-lines/minepump_spec1_product07.cil.yml +product-lines/minepump_spec1_product08.cil.yml +product-lines/minepump_spec1_product09.cil.yml +product-lines/minepump_spec1_product10.cil.yml +product-lines/minepump_spec1_product11.cil.yml +product-lines/minepump_spec1_product12.cil.yml +product-lines/minepump_spec1_product13.cil.yml +product-lines/minepump_spec1_product14.cil.yml +product-lines/minepump_spec1_product15.cil.yml +product-lines/minepump_spec1_product16.cil.yml +product-lines/minepump_spec1_product17.cil.yml +product-lines/minepump_spec1_product18.cil.yml +product-lines/minepump_spec1_product19.cil.yml +product-lines/minepump_spec1_product20.cil.yml +product-lines/minepump_spec1_product21.cil.yml +product-lines/minepump_spec1_product22.cil.yml +product-lines/minepump_spec1_product23.cil.yml +product-lines/minepump_spec1_product24.cil.yml +product-lines/minepump_spec1_product25.cil.yml +product-lines/minepump_spec1_product26.cil.yml +product-lines/minepump_spec1_product27.cil.yml +product-lines/minepump_spec1_product28.cil.yml +product-lines/minepump_spec1_product29.cil.yml +product-lines/minepump_spec1_product30.cil.yml +product-lines/minepump_spec1_product31.cil.yml +product-lines/minepump_spec1_product32.cil.yml +product-lines/minepump_spec1_product33.cil.yml +product-lines/minepump_spec1_product34.cil.yml +product-lines/minepump_spec1_product35.cil.yml +product-lines/minepump_spec1_product36.cil.yml +product-lines/minepump_spec1_product37.cil.yml +product-lines/minepump_spec1_product38.cil.yml +product-lines/minepump_spec1_product39.cil.yml +product-lines/minepump_spec1_product40.cil.yml +product-lines/minepump_spec1_product41.cil.yml +product-lines/minepump_spec1_product42.cil.yml +product-lines/minepump_spec1_product43.cil.yml +product-lines/minepump_spec1_product44.cil.yml +product-lines/minepump_spec1_product45.cil.yml +product-lines/minepump_spec1_product46.cil.yml +product-lines/minepump_spec1_product47.cil.yml +product-lines/minepump_spec1_product48.cil.yml +product-lines/minepump_spec1_product49.cil.yml +product-lines/minepump_spec1_product50.cil.yml +product-lines/minepump_spec1_product51.cil.yml +product-lines/minepump_spec1_product52.cil.yml +product-lines/minepump_spec1_product53.cil.yml +product-lines/minepump_spec1_product54.cil.yml +product-lines/minepump_spec1_product55.cil.yml +product-lines/minepump_spec1_product56.cil.yml +product-lines/minepump_spec1_product57.cil.yml +product-lines/minepump_spec1_product58.cil.yml +product-lines/minepump_spec1_product59.cil.yml +product-lines/minepump_spec1_product60.cil.yml +product-lines/minepump_spec1_product61.cil.yml +product-lines/minepump_spec1_product62.cil.yml +product-lines/minepump_spec1_product63.cil.yml +product-lines/minepump_spec1_product64.cil.yml +product-lines/minepump_spec1_productSimulator.cil.yml +product-lines/minepump_spec2_product01.cil.yml +product-lines/minepump_spec2_product02.cil.yml +product-lines/minepump_spec2_product03.cil.yml +product-lines/minepump_spec2_product04.cil.yml +product-lines/minepump_spec2_product05.cil.yml +product-lines/minepump_spec2_product06.cil.yml +product-lines/minepump_spec2_product07.cil.yml +product-lines/minepump_spec2_product08.cil.yml +product-lines/minepump_spec2_product09.cil.yml +product-lines/minepump_spec2_product10.cil.yml +product-lines/minepump_spec2_product11.cil.yml +product-lines/minepump_spec2_product12.cil.yml +product-lines/minepump_spec2_product13.cil.yml +product-lines/minepump_spec2_product14.cil.yml +product-lines/minepump_spec2_product15.cil.yml +product-lines/minepump_spec2_product16.cil.yml +product-lines/minepump_spec2_product17.cil.yml +product-lines/minepump_spec2_product18.cil.yml +product-lines/minepump_spec2_product19.cil.yml +product-lines/minepump_spec2_product20.cil.yml +product-lines/minepump_spec2_product21.cil.yml +product-lines/minepump_spec2_product22.cil.yml +product-lines/minepump_spec2_product23.cil.yml +product-lines/minepump_spec2_product24.cil.yml +product-lines/minepump_spec2_product25.cil.yml +product-lines/minepump_spec2_product26.cil.yml +product-lines/minepump_spec2_product27.cil.yml +product-lines/minepump_spec2_product28.cil.yml +product-lines/minepump_spec2_product29.cil.yml +product-lines/minepump_spec2_product30.cil.yml +product-lines/minepump_spec2_product31.cil.yml +product-lines/minepump_spec2_product32.cil.yml +product-lines/minepump_spec2_product33.cil.yml +product-lines/minepump_spec2_product34.cil.yml +product-lines/minepump_spec2_product35.cil.yml +product-lines/minepump_spec2_product36.cil.yml +product-lines/minepump_spec2_product37.cil.yml +product-lines/minepump_spec2_product38.cil.yml +product-lines/minepump_spec2_product39.cil.yml +product-lines/minepump_spec2_product40.cil.yml +product-lines/minepump_spec2_product41.cil.yml +product-lines/minepump_spec2_product42.cil.yml +product-lines/minepump_spec2_product43.cil.yml +product-lines/minepump_spec2_product44.cil.yml +product-lines/minepump_spec2_product45.cil.yml +product-lines/minepump_spec2_product46.cil.yml +product-lines/minepump_spec2_product47.cil.yml +product-lines/minepump_spec2_product48.cil.yml +product-lines/minepump_spec2_product49.cil.yml +product-lines/minepump_spec2_product50.cil.yml +product-lines/minepump_spec2_product51.cil.yml +product-lines/minepump_spec2_product52.cil.yml +product-lines/minepump_spec2_product53.cil.yml +product-lines/minepump_spec2_product54.cil.yml +product-lines/minepump_spec2_product55.cil.yml +product-lines/minepump_spec2_product56.cil.yml +product-lines/minepump_spec2_product57.cil.yml +product-lines/minepump_spec2_product58.cil.yml +product-lines/minepump_spec2_product59.cil.yml +product-lines/minepump_spec2_product60.cil.yml +product-lines/minepump_spec2_product61.cil.yml +product-lines/minepump_spec2_product62.cil.yml +product-lines/minepump_spec2_product63.cil.yml +product-lines/minepump_spec2_product64.cil.yml +product-lines/minepump_spec2_productSimulator.cil.yml +product-lines/minepump_spec3_product01.cil.yml +product-lines/minepump_spec3_product02.cil.yml +product-lines/minepump_spec3_product03.cil.yml +product-lines/minepump_spec3_product04.cil.yml +product-lines/minepump_spec3_product05.cil.yml +product-lines/minepump_spec3_product06.cil.yml +product-lines/minepump_spec3_product07.cil.yml +product-lines/minepump_spec3_product08.cil.yml +product-lines/minepump_spec3_product09.cil.yml +product-lines/minepump_spec3_product10.cil.yml +product-lines/minepump_spec3_product11.cil.yml +product-lines/minepump_spec3_product12.cil.yml +product-lines/minepump_spec3_product13.cil.yml +product-lines/minepump_spec3_product14.cil.yml +product-lines/minepump_spec3_product15.cil.yml +product-lines/minepump_spec3_product16.cil.yml +product-lines/minepump_spec3_product17.cil.yml +product-lines/minepump_spec3_product18.cil.yml +product-lines/minepump_spec3_product19.cil.yml +product-lines/minepump_spec3_product20.cil.yml +product-lines/minepump_spec3_product21.cil.yml +product-lines/minepump_spec3_product22.cil.yml +product-lines/minepump_spec3_product23.cil.yml +product-lines/minepump_spec3_product24.cil.yml +product-lines/minepump_spec3_product25.cil.yml +product-lines/minepump_spec3_product26.cil.yml +product-lines/minepump_spec3_product27.cil.yml +product-lines/minepump_spec3_product28.cil.yml +product-lines/minepump_spec3_product29.cil.yml +product-lines/minepump_spec3_product30.cil.yml +product-lines/minepump_spec3_product31.cil.yml +product-lines/minepump_spec3_product32.cil.yml +product-lines/minepump_spec3_product33.cil.yml +product-lines/minepump_spec3_product34.cil.yml +product-lines/minepump_spec3_product35.cil.yml +product-lines/minepump_spec3_product36.cil.yml +product-lines/minepump_spec3_product37.cil.yml +product-lines/minepump_spec3_product38.cil.yml +product-lines/minepump_spec3_product39.cil.yml +product-lines/minepump_spec3_product40.cil.yml +product-lines/minepump_spec3_product41.cil.yml +product-lines/minepump_spec3_product42.cil.yml +product-lines/minepump_spec3_product43.cil.yml +product-lines/minepump_spec3_product44.cil.yml +product-lines/minepump_spec3_product45.cil.yml +product-lines/minepump_spec3_product46.cil.yml +product-lines/minepump_spec3_product47.cil.yml +product-lines/minepump_spec3_product48.cil.yml +product-lines/minepump_spec3_product49.cil.yml +product-lines/minepump_spec3_product50.cil.yml +product-lines/minepump_spec3_product51.cil.yml +product-lines/minepump_spec3_product52.cil.yml +product-lines/minepump_spec3_product53.cil.yml +product-lines/minepump_spec3_product54.cil.yml +product-lines/minepump_spec3_product55.cil.yml +product-lines/minepump_spec3_product56.cil.yml +product-lines/minepump_spec3_product57.cil.yml +product-lines/minepump_spec3_product58.cil.yml +product-lines/minepump_spec3_product59.cil.yml +product-lines/minepump_spec3_product60.cil.yml +product-lines/minepump_spec3_product61.cil.yml +product-lines/minepump_spec3_product62.cil.yml +product-lines/minepump_spec3_product63.cil.yml +product-lines/minepump_spec3_product64.cil.yml +product-lines/minepump_spec3_productSimulator.cil.yml +product-lines/minepump_spec4_product01.cil.yml +product-lines/minepump_spec4_product02.cil.yml +product-lines/minepump_spec4_product03.cil.yml +product-lines/minepump_spec4_product04.cil.yml +product-lines/minepump_spec4_product05.cil.yml +product-lines/minepump_spec4_product06.cil.yml +product-lines/minepump_spec4_product07.cil.yml +product-lines/minepump_spec4_product08.cil.yml +product-lines/minepump_spec4_product09.cil.yml +product-lines/minepump_spec4_product10.cil.yml +product-lines/minepump_spec4_product11.cil.yml +product-lines/minepump_spec4_product12.cil.yml +product-lines/minepump_spec4_product13.cil.yml +product-lines/minepump_spec4_product14.cil.yml +product-lines/minepump_spec4_product15.cil.yml +product-lines/minepump_spec4_product16.cil.yml +product-lines/minepump_spec4_product17.cil.yml +product-lines/minepump_spec4_product18.cil.yml +product-lines/minepump_spec4_product19.cil.yml +product-lines/minepump_spec4_product20.cil.yml +product-lines/minepump_spec4_product21.cil.yml +product-lines/minepump_spec4_product22.cil.yml +product-lines/minepump_spec4_product23.cil.yml +product-lines/minepump_spec4_product24.cil.yml +product-lines/minepump_spec4_product25.cil.yml +product-lines/minepump_spec4_product26.cil.yml +product-lines/minepump_spec4_product27.cil.yml +product-lines/minepump_spec4_product28.cil.yml +product-lines/minepump_spec4_product29.cil.yml +product-lines/minepump_spec4_product30.cil.yml +product-lines/minepump_spec4_product31.cil.yml +product-lines/minepump_spec4_product32.cil.yml +product-lines/minepump_spec4_product33.cil.yml +product-lines/minepump_spec4_product34.cil.yml +product-lines/minepump_spec4_product35.cil.yml +product-lines/minepump_spec4_product36.cil.yml +product-lines/minepump_spec4_product37.cil.yml +product-lines/minepump_spec4_product38.cil.yml +product-lines/minepump_spec4_product39.cil.yml +product-lines/minepump_spec4_product40.cil.yml +product-lines/minepump_spec4_product41.cil.yml +product-lines/minepump_spec4_product42.cil.yml +product-lines/minepump_spec4_product43.cil.yml +product-lines/minepump_spec4_product44.cil.yml +product-lines/minepump_spec4_product45.cil.yml +product-lines/minepump_spec4_product46.cil.yml +product-lines/minepump_spec4_product47.cil.yml +product-lines/minepump_spec4_product48.cil.yml +product-lines/minepump_spec4_product49.cil.yml +product-lines/minepump_spec4_product50.cil.yml +product-lines/minepump_spec4_product51.cil.yml +product-lines/minepump_spec4_product52.cil.yml +product-lines/minepump_spec4_product53.cil.yml +product-lines/minepump_spec4_product54.cil.yml +product-lines/minepump_spec4_product55.cil.yml +product-lines/minepump_spec4_product56.cil.yml +product-lines/minepump_spec4_product57.cil.yml +product-lines/minepump_spec4_product58.cil.yml +product-lines/minepump_spec4_product59.cil.yml +product-lines/minepump_spec4_product60.cil.yml +product-lines/minepump_spec4_product61.cil.yml +product-lines/minepump_spec4_product62.cil.yml +product-lines/minepump_spec4_product63.cil.yml +product-lines/minepump_spec4_product64.cil.yml +product-lines/minepump_spec4_productSimulator.cil.yml +product-lines/minepump_spec5_product01.cil.yml +product-lines/minepump_spec5_product02.cil.yml +product-lines/minepump_spec5_product03.cil.yml +product-lines/minepump_spec5_product04.cil.yml +product-lines/minepump_spec5_product05.cil.yml +product-lines/minepump_spec5_product06.cil.yml +product-lines/minepump_spec5_product07.cil.yml +product-lines/minepump_spec5_product08.cil.yml +product-lines/minepump_spec5_product09.cil.yml +product-lines/minepump_spec5_product10.cil.yml +product-lines/minepump_spec5_product11.cil.yml +product-lines/minepump_spec5_product12.cil.yml +product-lines/minepump_spec5_product13.cil.yml +product-lines/minepump_spec5_product14.cil.yml +product-lines/minepump_spec5_product15.cil.yml +product-lines/minepump_spec5_product16.cil.yml +product-lines/minepump_spec5_product17.cil.yml +product-lines/minepump_spec5_product18.cil.yml +product-lines/minepump_spec5_product19.cil.yml +product-lines/minepump_spec5_product20.cil.yml +product-lines/minepump_spec5_product21.cil.yml +product-lines/minepump_spec5_product22.cil.yml +product-lines/minepump_spec5_product23.cil.yml +product-lines/minepump_spec5_product24.cil.yml +product-lines/minepump_spec5_product25.cil.yml +product-lines/minepump_spec5_product26.cil.yml +product-lines/minepump_spec5_product27.cil.yml +product-lines/minepump_spec5_product28.cil.yml +product-lines/minepump_spec5_product29.cil.yml +product-lines/minepump_spec5_product30.cil.yml +product-lines/minepump_spec5_product31.cil.yml +product-lines/minepump_spec5_product32.cil.yml +product-lines/minepump_spec5_product33.cil.yml +product-lines/minepump_spec5_product34.cil.yml +product-lines/minepump_spec5_product35.cil.yml +product-lines/minepump_spec5_product36.cil.yml +product-lines/minepump_spec5_product37.cil.yml +product-lines/minepump_spec5_product38.cil.yml +product-lines/minepump_spec5_product39.cil.yml +product-lines/minepump_spec5_product40.cil.yml +product-lines/minepump_spec5_product41.cil.yml +product-lines/minepump_spec5_product42.cil.yml +product-lines/minepump_spec5_product43.cil.yml +product-lines/minepump_spec5_product44.cil.yml +product-lines/minepump_spec5_product45.cil.yml +product-lines/minepump_spec5_product46.cil.yml +product-lines/minepump_spec5_product47.cil.yml +product-lines/minepump_spec5_product48.cil.yml +product-lines/minepump_spec5_product49.cil.yml +product-lines/minepump_spec5_product50.cil.yml +product-lines/minepump_spec5_product51.cil.yml +product-lines/minepump_spec5_product52.cil.yml +product-lines/minepump_spec5_product53.cil.yml +product-lines/minepump_spec5_product54.cil.yml +product-lines/minepump_spec5_product55.cil.yml +product-lines/minepump_spec5_product56.cil.yml +product-lines/minepump_spec5_product57.cil.yml +product-lines/minepump_spec5_product58.cil.yml +product-lines/minepump_spec5_product59.cil.yml +product-lines/minepump_spec5_product60.cil.yml +product-lines/minepump_spec5_product61.cil.yml +product-lines/minepump_spec5_product62.cil.yml +product-lines/minepump_spec5_product63.cil.yml +product-lines/minepump_spec5_product64.cil.yml +product-lines/minepump_spec5_productSimulator.cil.yml +pthread-C-DAC/pthread-finding-k-matches.yml +pthread-C-DAC/pthread-numerical-integration.yml +pthread-atomic/dekker-b.yml +pthread-atomic/lamport-b.yml +pthread-atomic/peterson-b.yml +pthread-atomic/qrcu-1.yml +pthread-atomic/qrcu-2.yml +pthread-atomic/szymanski-b.yml +pthread-complex/bounded_buffer.yml +pthread-complex/elimination_backoff_stack-race.yml +pthread-complex/elimination_backoff_stack.yml +pthread-complex/safestack_relacy.yml +pthread-complex/workstealqueue_mutex-1.yml +pthread-complex/workstealqueue_mutex-2.yml +pthread-deagle/airline-10.yml +pthread-deagle/airline-15.yml +pthread-deagle/airline-20.yml +pthread-deagle/airline-25.yml +pthread-deagle/airline-5.yml +pthread-deagle/floating_read-10.yml +pthread-deagle/floating_read-15.yml +pthread-deagle/floating_read-20.yml +pthread-deagle/floating_read-25.yml +pthread-deagle/floating_read-5.yml +pthread-deagle/reorder_c11_bad-10.yml +pthread-deagle/reorder_c11_bad-20.yml +pthread-deagle/reorder_c11_bad-30.yml +pthread-deagle/reorder_c11_bad-40.yml +pthread-deagle/reorder_c11_bad-50.yml +pthread-deagle/reorder_c11_good-10.yml +pthread-deagle/reorder_c11_good-20.yml +pthread-deagle/reorder_c11_good-30.yml +pthread-deagle/reorder_c11_good-40.yml +pthread-deagle/reorder_c11_good-50.yml +pthread-divine/barrier_2t.yml +pthread-divine/barrier_3t.yml +pthread-divine/condvar.yml +pthread-divine/condvar_spurious_wakeup.yml +pthread-divine/divinefifo-bug_1w1r.yml +pthread-divine/divinefifo_1w1r.yml +pthread-divine/one_time_barrier_2t.yml +pthread-divine/one_time_barrier_3t.yml +pthread-divine/one_time_barrier_twice_2t.yml +pthread-divine/one_time_barrier_twice_3t.yml +pthread-divine/ring_1w1r-1.yml +pthread-divine/ring_1w1r-2.yml +pthread-divine/ring_2w1r-1.yml +pthread-divine/ring_2w1r-2.yml +pthread-divine/tls_basic.yml +pthread-divine/tls_destructor_worker.yml +pthread-driver-races/char_generic_nvram_nvram_unlocked_ioctl_write_nvram.yml +pthread-driver-races/char_generic_nvram_read_nvram_nvram_unlocked_ioctl.yml +pthread-driver-races/char_generic_nvram_read_nvram_write_nvram-race.yml +pthread-driver-races/char_generic_nvram_read_nvram_write_nvram.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_change_pc8736x_gpio_configure.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_change_pc8736x_gpio_current-race.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_change_pc8736x_gpio_current.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_change_pc8736x_gpio_get.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_change_pc8736x_gpio_set-race.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_change_pc8736x_gpio_set.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_configure_pc8736x_gpio_current.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_configure_pc8736x_gpio_get.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_configure_pc8736x_gpio_set.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_current_pc8736x_gpio_get.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_current_pc8736x_gpio_set-race.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_current_pc8736x_gpio_set.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_get_pc8736x_gpio_set.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_open_pc8736x_gpio_change.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_open_pc8736x_gpio_configure.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_open_pc8736x_gpio_current.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_open_pc8736x_gpio_get.yml +pthread-driver-races/char_pc8736x_gpio_pc8736x_gpio_open_pc8736x_gpio_set.yml +pthread-ext/02_inc_cas.yml +pthread-ext/04_incdec_cas-race.yml +pthread-ext/04_incdec_cas.yml +pthread-ext/17_szymanski.yml +pthread-ext/23_lu-fig2.fixed.yml +pthread-ext/27_Boop_simple_vf.yml +pthread-ext/47_ticket_lock_hc_backoff_vs.yml +pthread-ext/48_ticket_lock_low_contention_vs-b.yml +pthread-ext/48_ticket_lock_low_contention_vs.yml +pthread-lit/sssc12-2.yml +pthread-lit/sssc12-pthread.yml +pthread-lit/sssc12.yml +pthread-lit/sssc12_variant-2.yml +pthread-lit/sssc12_variant-pthread.yml +pthread-lit/sssc12_variant.yml +pthread-nondet/nondet-array-1.yml +pthread-nondet/nondet-array-2.yml +pthread-race-challenges/atomic-gcc.yml +pthread-race-challenges/per-thread-array-index-race-2.yml +pthread-race-challenges/per-thread-array-index-race.yml +pthread-race-challenges/per-thread-array-index.yml +pthread-race-challenges/per-thread-array-init-race.yml +pthread-race-challenges/per-thread-array-init.yml +pthread-race-challenges/per-thread-array-join-counter-2.yml +pthread-race-challenges/per-thread-array-join-counter-race-2.yml +pthread-race-challenges/per-thread-array-join-counter-race-3.yml +pthread-race-challenges/per-thread-array-join-counter-race-4.yml +pthread-race-challenges/per-thread-array-join-counter-race.yml +pthread-race-challenges/per-thread-array-join-counter.yml +pthread-race-challenges/per-thread-array-ptr-race.yml +pthread-race-challenges/per-thread-array-ptr.yml +pthread-race-challenges/per-thread-index-bitmask-race-2.yml +pthread-race-challenges/per-thread-index-bitmask-race-3.yml +pthread-race-challenges/per-thread-index-bitmask-race.yml +pthread-race-challenges/per-thread-index-bitmask.yml +pthread-race-challenges/per-thread-index-inc-race-2.yml +pthread-race-challenges/per-thread-index-inc-race.yml +pthread-race-challenges/per-thread-index-inc.yml +pthread-race-challenges/per-thread-struct-in-array-race.yml +pthread-race-challenges/per-thread-struct-in-array.yml +pthread-race-challenges/per-thread-struct-race.yml +pthread-race-challenges/per-thread-struct-tid-join.yml +pthread-race-challenges/per-thread-struct-tid.yml +pthread-race-challenges/per-thread-struct.yml +pthread-race-challenges/semaphore-posix-race-2.yml +pthread-race-challenges/semaphore-posix-race.yml +pthread-race-challenges/semaphore-posix.yml +pthread-race-challenges/thread-join-array-const-race-2.yml +pthread-race-challenges/thread-join-array-const-race-3.yml +pthread-race-challenges/thread-join-array-const-race.yml +pthread-race-challenges/thread-join-array-const.yml +pthread-race-challenges/thread-join-array-dynamic-race-2.yml +pthread-race-challenges/thread-join-array-dynamic-race-3.yml +pthread-race-challenges/thread-join-array-dynamic-race.yml +pthread-race-challenges/thread-join-array-dynamic.yml +pthread-race-challenges/thread-join-binomial-race-2.yml +pthread-race-challenges/thread-join-binomial-race-3.yml +pthread-race-challenges/thread-join-binomial-race.yml +pthread-race-challenges/thread-join-binomial.yml +pthread-race-challenges/thread-join-counter-inner-2.yml +pthread-race-challenges/thread-join-counter-inner-3.yml +pthread-race-challenges/thread-join-counter-inner-race-2.yml +pthread-race-challenges/thread-join-counter-inner-race-3.yml +pthread-race-challenges/thread-join-counter-inner-race-4.yml +pthread-race-challenges/thread-join-counter-inner-race-5.yml +pthread-race-challenges/thread-join-counter-inner-race.yml +pthread-race-challenges/thread-join-counter-inner.yml +pthread-race-challenges/thread-join-counter-outer-race-2.yml +pthread-race-challenges/thread-join-counter-outer-race-3.yml +pthread-race-challenges/thread-join-counter-outer-race-4.yml +pthread-race-challenges/thread-join-counter-outer-race.yml +pthread-race-challenges/thread-join-counter-outer.yml +pthread-race-challenges/thread-local-pthread-value-cond.yml +pthread-race-challenges/thread-local-pthread-value.yml +pthread-race-challenges/thread-local-value-cond.yml +pthread-race-challenges/thread-local-value-dynamic.yml +pthread-race-challenges/thread-local-value-race.yml +pthread-race-challenges/thread-local-value.yml +pthread-race-challenges/value-barrier-race.yml +pthread-race-challenges/value-barrier.yml +pthread/bigshot_p.yml +pthread/bigshot_s.yml +pthread/bigshot_s2.yml +pthread/indexer.yml +pthread/queue.yml +pthread/queue_longer.yml +pthread/queue_longest.yml +pthread/queue_ok.yml +pthread/queue_ok_longer.yml +pthread/queue_ok_longest.yml +pthread/reorder_2-2.yml +pthread/reorder_2-race.yml +pthread/reorder_2.yml +pthread/reorder_5-2.yml +pthread/reorder_5-race.yml +pthread/reorder_5.yml +pthread/sigma.yml +pthread/singleton-b.yml +pthread/singleton.yml +pthread/singleton_with-uninit-problems-b.yml +pthread/singleton_with-uninit-problems.yml +pthread/stack-1.yml +pthread/stack-2.yml +pthread/stack_longer-1.yml +pthread/stack_longer-2.yml +pthread/stack_longest-1.yml +pthread/stack_longest-2.yml +pthread/twostage_3-2.yml +pthread/twostage_3-race.yml +pthread/twostage_3.yml +reducercommutativity/max.yml +reducercommutativity/rangesum.yml +reducercommutativity/sep.yml +seq-mthreaded-reduced/pals_floodmax.3.1.ufo.BOUNDED-6.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.1.ufo.BOUNDED-6.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.1.ufo.BOUNDED-6.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.1.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.1.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.1.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.2.ufo.BOUNDED-6.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.2.ufo.BOUNDED-6.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.2.ufo.BOUNDED-6.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.2.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.2.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.2.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.3.ufo.BOUNDED-6.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.3.ufo.BOUNDED-6.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.3.ufo.BOUNDED-6.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.3.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.3.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.3.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.4.ufo.BOUNDED-6.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.4.ufo.BOUNDED-6.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.4.ufo.BOUNDED-6.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.4.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.4.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.4.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.ufo.BOUNDED-6.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.ufo.BOUNDED-6.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.ufo.BOUNDED-6.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.3.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.1.ufo.BOUNDED-8.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.1.ufo.BOUNDED-8.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.1.ufo.BOUNDED-8.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.1.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.1.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.1.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.2.ufo.BOUNDED-8.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.2.ufo.BOUNDED-8.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.2.ufo.BOUNDED-8.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.2.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.2.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.2.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.3.ufo.BOUNDED-8.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.3.ufo.BOUNDED-8.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.3.ufo.BOUNDED-8.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.3.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.3.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.3.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.4.ufo.BOUNDED-8.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.4.ufo.BOUNDED-8.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.4.ufo.BOUNDED-8.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.4.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.4.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.4.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.ufo.BOUNDED-8.pals.c.p+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.ufo.BOUNDED-8.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.ufo.BOUNDED-8.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.ufo.UNBOUNDED.pals.c.p+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.4.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.5.1.ufo.BOUNDED-10.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.5.1.ufo.BOUNDED-10.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.5.2.ufo.BOUNDED-10.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.5.2.ufo.BOUNDED-10.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.5.2.ufo.BOUNDED-10.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.5.2.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.5.2.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.5.2.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.5.3.ufo.BOUNDED-10.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.5.3.ufo.BOUNDED-10.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_floodmax.5.4.ufo.BOUNDED-10.pals.c.p+lhb-reducer.yml +seq-mthreaded-reduced/pals_floodmax.5.4.ufo.BOUNDED-10.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_floodmax.5.4.ufo.BOUNDED-10.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.1.ufo.BOUNDED-6.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.1.ufo.BOUNDED-6.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.1.ufo.BOUNDED-6.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.1.ufo.BOUNDED-6.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.1.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.1.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.1.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.1.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.2.ufo.BOUNDED-6.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.2.ufo.BOUNDED-6.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.2.ufo.BOUNDED-6.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.2.ufo.BOUNDED-6.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.2.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.2.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.2.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.2.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.ufo.BOUNDED-6.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.ufo.BOUNDED-6.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.ufo.BOUNDED-6.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.ufo.BOUNDED-6.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.3.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.1.ufo.BOUNDED-8.pals.c.p+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.1.ufo.BOUNDED-8.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.1.ufo.BOUNDED-8.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.1.ufo.BOUNDED-8.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.1.ufo.BOUNDED-8.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.1.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.1.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.1.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.1.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.2.ufo.BOUNDED-8.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.2.ufo.BOUNDED-8.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.2.ufo.BOUNDED-8.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.2.ufo.BOUNDED-8.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.2.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.2.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.2.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.2.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.ufo.BOUNDED-8.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.ufo.BOUNDED-8.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.ufo.BOUNDED-8.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.ufo.BOUNDED-8.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.4.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.1.ufo.BOUNDED-10.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.1.ufo.BOUNDED-10.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.1.ufo.BOUNDED-10.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.1.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.1.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.1.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.2.ufo.BOUNDED-10.pals.c.p+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.2.ufo.BOUNDED-10.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.2.ufo.BOUNDED-10.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.2.ufo.BOUNDED-10.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.2.ufo.BOUNDED-10.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.2.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.2.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.2.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.2.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.ufo.BOUNDED-10.pals.c.p+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.ufo.BOUNDED-10.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.ufo.BOUNDED-10.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.5.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.6.1.ufo.BOUNDED-12.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.6.1.ufo.BOUNDED-12.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.6.1.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.6.1.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.6.2.ufo.BOUNDED-12.pals.c.p+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.6.2.ufo.BOUNDED-12.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.6.2.ufo.BOUNDED-12.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.6.2.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.6.2.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.6.ufo.BOUNDED-12.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.6.ufo.BOUNDED-12.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr-var-start-time.6.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.1.ufo.BOUNDED-6.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.1.ufo.BOUNDED-6.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.1.ufo.BOUNDED-6.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.1.ufo.BOUNDED-6.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.1.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.1.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.1.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.1.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.ufo.BOUNDED-6.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.ufo.BOUNDED-6.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.ufo.BOUNDED-6.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.ufo.BOUNDED-6.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.3.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.1.ufo.BOUNDED-8.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.1.ufo.BOUNDED-8.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.1.ufo.BOUNDED-8.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.1.ufo.BOUNDED-8.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.1.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.1.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.1.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.1.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.ufo.BOUNDED-8.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.ufo.BOUNDED-8.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.ufo.BOUNDED-8.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.ufo.BOUNDED-8.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.4.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.1.ufo.BOUNDED-10.pals.c.p+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.1.ufo.BOUNDED-10.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.1.ufo.BOUNDED-10.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.1.ufo.BOUNDED-10.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.1.ufo.BOUNDED-10.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.1.ufo.UNBOUNDED.pals.c.p+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.1.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.1.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.1.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.1.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.ufo.BOUNDED-10.pals.c.p+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.ufo.BOUNDED-10.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.ufo.BOUNDED-10.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.ufo.BOUNDED-10.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.ufo.BOUNDED-10.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.5.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.1.ufo.BOUNDED-12.pals.c.p+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.1.ufo.BOUNDED-12.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.1.ufo.BOUNDED-12.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.1.ufo.BOUNDED-12.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.1.ufo.BOUNDED-12.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.1.ufo.UNBOUNDED.pals.c.p+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.1.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.1.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.1.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.1.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.ufo.BOUNDED-12.pals.c.p+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.ufo.BOUNDED-12.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.ufo.BOUNDED-12.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.ufo.BOUNDED-12.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.ufo.BOUNDED-12.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.ufo.UNBOUNDED.pals.c.p+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.6.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.7.1.ufo.BOUNDED-14.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.7.1.ufo.BOUNDED-14.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.7.1.ufo.BOUNDED-14.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.7.1.ufo.BOUNDED-14.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.7.1.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.7.1.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.7.1.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.7.1.ufo.UNBOUNDED.pals.c.v+sep-reducer.yml +seq-mthreaded-reduced/pals_lcr.7.ufo.BOUNDED-14.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.7.ufo.BOUNDED-14.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.7.ufo.BOUNDED-14.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.7.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.7.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.8.1.ufo.BOUNDED-16.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.8.1.ufo.BOUNDED-16.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.8.1.ufo.BOUNDED-16.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_lcr.8.1.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_lcr.8.1.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_lcr.8.1.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.1.ufo.BOUNDED-6.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.1.ufo.BOUNDED-6.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.1.ufo.BOUNDED-6.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.1.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.1.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.1.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.2.ufo.BOUNDED-6.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.2.ufo.BOUNDED-6.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.2.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.2.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.2.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.3.ufo.BOUNDED-6.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.3.ufo.BOUNDED-6.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.3.ufo.BOUNDED-6.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.3.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.3.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.3.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.4.ufo.BOUNDED-6.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.4.ufo.BOUNDED-6.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.4.ufo.BOUNDED-6.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.4.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.4.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.4.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.ufo.BOUNDED-6.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.ufo.BOUNDED-6.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.ufo.BOUNDED-6.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.3.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.1.ufo.BOUNDED-8.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.1.ufo.BOUNDED-8.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.1.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.1.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.1.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.2.ufo.BOUNDED-8.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.2.ufo.BOUNDED-8.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.2.ufo.BOUNDED-8.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.2.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.2.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.2.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.3.ufo.BOUNDED-8.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.3.ufo.BOUNDED-8.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.3.ufo.BOUNDED-8.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.3.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.3.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.3.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.4.ufo.BOUNDED-8.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.4.ufo.BOUNDED-8.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.4.ufo.BOUNDED-8.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.4.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.4.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.4.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.ufo.BOUNDED-8.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.ufo.BOUNDED-8.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.ufo.BOUNDED-8.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.4.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.1.ufo.BOUNDED-10.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.1.ufo.BOUNDED-10.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.1.ufo.BOUNDED-10.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.2.ufo.BOUNDED-10.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.2.ufo.BOUNDED-10.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.2.ufo.BOUNDED-10.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.2.ufo.UNBOUNDED.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.2.ufo.UNBOUNDED.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.2.ufo.UNBOUNDED.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.3.ufo.BOUNDED-10.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.3.ufo.BOUNDED-10.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.3.ufo.BOUNDED-10.pals.c.v+nlh-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.4.ufo.BOUNDED-10.pals.c.p+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.4.ufo.BOUNDED-10.pals.c.v+cfa-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.4.ufo.BOUNDED-10.pals.c.v+lhb-reducer.yml +seq-mthreaded-reduced/pals_opt-floodmax.5.4.ufo.BOUNDED-10.pals.c.v+nlh-reducer.yml +seq-mthreaded/pals_lcr.8.1.ufo.BOUNDED-16.pals.yml +seq-mthreaded/pals_lcr.8.1.ufo.UNBOUNDED.pals.yml +seq-mthreaded/pals_lcr.8.ufo.BOUNDED-16.pals.yml +seq-mthreaded/pals_lcr.8.ufo.UNBOUNDED.pals.yml +seq-mthreaded/pals_lcr.8_overflow.ufo.UNBOUNDED.pals.yml +seq-mthreaded/rekcba_aso.1.M1-1.yml +seq-mthreaded/rekcba_aso.1.M1-2.yml +seq-mthreaded/rekcba_aso.1.M4-1.yml +seq-mthreaded/rekcba_aso.1.M4-2.yml +seq-mthreaded/rekcba_aso.2.M1-1.yml +seq-mthreaded/rekcba_aso.2.M1-2.yml +seq-mthreaded/rekcba_aso.2.M4-1.yml +seq-mthreaded/rekcba_aso.2.M4-2.yml +seq-mthreaded/rekcba_aso.3.M1.yml +seq-mthreaded/rekcba_aso.3.M4.yml +seq-mthreaded/rekcba_aso.4.M1.yml +seq-mthreaded/rekcba_aso.4.M4.yml +seq-mthreaded/rekcba_nxt.1.M1-1.yml +seq-mthreaded/rekcba_nxt.1.M1-2.yml +seq-mthreaded/rekcba_nxt.1.M4-1.yml +seq-mthreaded/rekcba_nxt.1.M4-2.yml +seq-mthreaded/rekcba_nxt.2.M1-1.yml +seq-mthreaded/rekcba_nxt.2.M1-2.yml +seq-mthreaded/rekcba_nxt.2.M4-1.yml +seq-mthreaded/rekcba_nxt.2.M4-2.yml +seq-mthreaded/rekcba_nxt.3.M1.yml +seq-mthreaded/rekcba_nxt.3.M4.yml +seq-mthreaded/rekh_aso.1.M1-1.yml +seq-mthreaded/rekh_aso.1.M1-2.yml +seq-mthreaded/rekh_aso.1.M4-1.yml +seq-mthreaded/rekh_aso.1.M4-2.yml +seq-mthreaded/rekh_aso.2.M1-1.yml +seq-mthreaded/rekh_aso.2.M1-2.yml +seq-mthreaded/rekh_aso.2.M4-1.yml +seq-mthreaded/rekh_aso.2.M4-2.yml +seq-mthreaded/rekh_aso.3.M1.yml +seq-mthreaded/rekh_aso.3.M4.yml +seq-mthreaded/rekh_aso.4.M1.yml +seq-mthreaded/rekh_aso.4.M4.yml +seq-mthreaded/rekh_nxt.1.M1-1.yml +seq-mthreaded/rekh_nxt.1.M1-2.yml +seq-mthreaded/rekh_nxt.1.M4-1.yml +seq-mthreaded/rekh_nxt.1.M4-2.yml +seq-mthreaded/rekh_nxt.2.M1-1.yml +seq-mthreaded/rekh_nxt.2.M1-2.yml +seq-mthreaded/rekh_nxt.2.M4-1.yml +seq-mthreaded/rekh_nxt.2.M4-2.yml +seq-mthreaded/rekh_nxt.3.M1.yml +seq-mthreaded/rekh_nxt.3.M4.yml +seq-pthread/cs_dekker.yml +seq-pthread/cs_fib-1.yml +seq-pthread/cs_fib-2.yml +seq-pthread/cs_fib_longer-1.yml +seq-pthread/cs_fib_longer-2.yml +seq-pthread/cs_lamport.yml +seq-pthread/cs_peterson.yml +seq-pthread/cs_queue-1.yml +seq-pthread/cs_queue-2.yml +seq-pthread/cs_read_write_lock-1.yml +seq-pthread/cs_read_write_lock-2.yml +seq-pthread/cs_stack-1.yml +seq-pthread/cs_stack-2.yml +seq-pthread/cs_stateful-1.yml +seq-pthread/cs_stateful-2.yml +seq-pthread/cs_sync.yml +seq-pthread/cs_szymanski.yml +seq-pthread/cs_time_var_mutex.yml +systemc/kundu.cil.yml +systemc/kundu1.cil.yml +systemc/kundu2.cil.yml +verifythis/duplets.yml +verifythis/elimination_max.yml +verifythis/elimination_max_rec.yml +verifythis/elimination_max_rec_onepoint.yml +verifythis/lcp.yml +verifythis/prefixsum_iter.yml +verifythis/prefixsum_rec.yml +verifythis/tree_del_iter.yml +verifythis/tree_del_iter_incorrect.yml +verifythis/tree_del_rec.yml +verifythis/tree_del_rec_incorrect.yml +verifythis/tree_max.yml +verifythis/tree_max_incorrect.yml +weaver/array-eq-symm.wvr.yml +weaver/array-eq-trans.wvr.yml +weaver/bench-exp1x3.wvr.yml +weaver/bench-exp2x3.wvr.yml +weaver/bench-exp2x4.wvr.yml +weaver/bench-exp2x6.wvr.yml +weaver/bench-exp2x9.wvr.yml +weaver/bench-exp3x3-opt.wvr.yml +weaver/bench-exp3x3.wvr.yml +weaver/chl-array-int-subst.wvr.yml +weaver/chl-array-int-symm.wvr.yml +weaver/chl-array-int-trans.wvr.yml +weaver/chl-chromosome-opt-symm.wvr.yml +weaver/chl-chromosome-subst.wvr.yml +weaver/chl-chromosome-symm.wvr.yml +weaver/chl-chromosome-trans.wvr.yml +weaver/chl-collitem-subst.wvr.yml +weaver/chl-collitem-symm.wvr.yml +weaver/chl-collitem-trans.wvr.yml +weaver/chl-exp-term-subst.wvr.yml +weaver/chl-exp-term-symm.wvr.yml +weaver/chl-file-item-subst.wvr.yml +weaver/chl-file-item-symm.wvr.yml +weaver/chl-file-item-trans.wvr.yml +weaver/chl-match-subst.wvr.yml +weaver/chl-match-symm.wvr.yml +weaver/chl-match-trans.wvr.yml +weaver/chl-name-comparator-subst.wvr.yml +weaver/chl-name-comparator-symm.wvr.yml +weaver/chl-name-comparator-trans.wvr.yml +weaver/chl-node-subst.wvr.yml +weaver/chl-node-symm.wvr.yml +weaver/chl-node-trans.wvr.yml +weaver/chl-nzb-file-subst.wvr.yml +weaver/chl-nzb-file-symm.wvr.yml +weaver/chl-nzb-file-trans.wvr.yml +weaver/chl-poker-hand-subst.wvr.yml +weaver/chl-poker-hand-symm.wvr.yml +weaver/chl-poker-hand-trans.wvr.yml +weaver/chl-simpl-str-subst.wvr.yml +weaver/chl-simpl-str-symm.wvr.yml +weaver/chl-simpl-str-trans.wvr.yml +weaver/chl-sre-subst.wvr.yml +weaver/chl-sre-symm.wvr.yml +weaver/chl-sre-trans.wvr.yml +weaver/chl-time-subst.wvr.yml +weaver/chl-time-symm.wvr.yml +weaver/chl-time-trans.wvr.yml +weaver/chl-word-subst.wvr.yml +weaver/chl-word-symm.wvr.yml +weaver/chl-word-trans.wvr.yml +weaver/clever.wvr.yml +weaver/fibonacci.wvr.yml +weaver/loop-tiling-eq.wvr.yml +weaver/mult-comm.wvr.yml +weaver/mult-dist.wvr.yml +weaver/mult-flipped-dist.wvr.yml +weaver/parallel-bakery-2.wvr.yml +weaver/parallel-bakery-3.wvr.yml +weaver/parallel-bakery-4.wvr.yml +weaver/parallel-barrier-loop.wvr.yml +weaver/parallel-barrier.wvr.yml +weaver/parallel-bluetooth.wvr.yml +weaver/parallel-lamport.wvr.yml +weaver/parallel-min-max-1.wvr.yml +weaver/parallel-misc-1.wvr.yml +weaver/parallel-misc-2-unrolled-atomic.wvr.yml +weaver/parallel-misc-2-unrolled.wvr.yml +weaver/parallel-misc-2.wvr.yml +weaver/parallel-misc-3-extended.wvr.yml +weaver/parallel-misc-3.wvr.yml +weaver/parallel-misc-4.wvr.yml +weaver/parallel-misc-5.wvr.yml +weaver/parallel-parallel-sum-1-dsl.wvr.yml +weaver/parallel-parallel-sum-1.wvr.yml +weaver/parallel-parallel-sum-2.wvr.yml +weaver/parallel-parallel-sum-equiv.wvr.yml +weaver/parallel-simple-equiv.wvr.yml +weaver/parallel-ticket-2.wvr.yml +weaver/parallel-ticket-3.wvr.yml +weaver/parallel-ticket-4.wvr.yml +weaver/parallel-ticket-5.wvr.yml +weaver/parallel-ticket-6.wvr.yml +weaver/parallel-ticket-7.wvr.yml +weaver/parallel-ticket-8.wvr.yml +weaver/popl20-bad-buffer-mult-alt.wvr.yml +weaver/popl20-bad-buffer-mult-alt2.wvr.yml +weaver/popl20-bad-commit-1.wvr-bad.yml +weaver/popl20-bad-commit-2.wvr-bad.yml +weaver/popl20-bad-counter-queue.wvr.yml +weaver/popl20-bad-counter-queue2.wvr.yml +weaver/popl20-bad-dot-product-alt.wvr.yml +weaver/popl20-bad-dot-product.wvr.yml +weaver/popl20-bad-ring-nondet.wvr.yml +weaver/popl20-bad-ring.wvr.yml +weaver/popl20-bad-threaded-sum-2.wvr.yml +weaver/popl20-bad-three-array-sum-alt.wvr.yml +weaver/popl20-channel-sum.wvr.yml +weaver/popl20-commit-1.wvr.yml +weaver/popl20-commit-2.wvr.yml +weaver/popl20-counter-determinism.wvr.yml +weaver/popl20-counter-fun.wvr.yml +weaver/popl20-difference-det.wvr.yml +weaver/popl20-figure1-alt.wvr.yml +weaver/popl20-figure1.wvr.yml +weaver/popl20-figure3.wvr.yml +weaver/popl20-horseshoe.wvr.yml +weaver/popl20-min-max-dec.wvr.yml +weaver/popl20-min-max-inc-dec.wvr.yml +weaver/popl20-min-max-inc.wvr.yml +weaver/popl20-more-array-sum-alt.wvr.yml +weaver/popl20-more-array-sum-alt2.wvr.yml +weaver/popl20-more-array-sum.wvr.yml +weaver/popl20-more-array-sum2.wvr.yml +weaver/popl20-more-buffer-mult.wvr.yml +weaver/popl20-more-buffer-mult2.wvr.yml +weaver/popl20-more-buffer-series.wvr.yml +weaver/popl20-more-buffer-series2.wvr.yml +weaver/popl20-more-dec-subseq.wvr.yml +weaver/popl20-more-inc-subseq.wvr.yml +weaver/popl20-more-max-array-hom.wvr.yml +weaver/popl20-more-max-array.wvr.yml +weaver/popl20-more-min-array-hom.wvr.yml +weaver/popl20-more-min-array.wvr.yml +weaver/popl20-more-min-le-max.wvr.yml +weaver/popl20-more-mts.wvr.yml +weaver/popl20-more-multiply-verify.wvr.yml +weaver/popl20-more-nonblocking-counter-alt2.wvr.yml +weaver/popl20-more-parray-copy.wvr.yml +weaver/popl20-more-queue-add-2-nl.wvr.yml +weaver/popl20-more-queue-add-3-nl.wvr.yml +weaver/popl20-more-sorted.wvr.yml +weaver/popl20-more-sum-array-hom.wvr.yml +weaver/popl20-more-vector-add.wvr.yml +weaver/popl20-mult-4.wvr.yml +weaver/popl20-mult-equiv.wvr.yml +weaver/popl20-nonblocking-cntr-alt.wvr.yml +weaver/popl20-nonblocking-cntr.wvr.yml +weaver/popl20-prod-cons-eq.wvr.yml +weaver/popl20-prod-cons.wvr.yml +weaver/popl20-prod-cons3.wvr.yml +weaver/popl20-proofs-counter-add-4-semi-Q67.wvr.yml +weaver/popl20-queue-add-2.wvr.yml +weaver/popl20-queue-add-3.wvr.yml +weaver/popl20-send-receive-alt.wvr.yml +weaver/popl20-send-receive.wvr.yml +weaver/popl20-simple-array-sum.wvr.yml +weaver/popl20-simple-queue.wvr.yml +weaver/popl20-threaded-sum-3.wvr.yml +weaver/popl20-three-array-max.wvr.yml +weaver/popl20-three-array-min.wvr.yml +weaver/popl20-three-array-sum.wvr.yml +weaver/popl20-two-queue.wvr.yml +weaver/security.wvr.yml +weaver/spaghetti.wvr.yml +weaver/test-context1.wvr.yml +weaver/test-easy1.wvr.yml +weaver/test-easy10.wvr.yml +weaver/test-easy11.wvr.yml +weaver/test-easy6.wvr.yml +weaver/test-easy7.wvr.yml +weaver/test-easy8.wvr.yml +weaver/test-hard1.wvr.yml +weaver/test-semi1.wvr.yml +weaver/unroll-2.wvr.yml +weaver/unroll-3.wvr.yml +weaver/unroll-4.wvr.yml +weaver/unroll-5.wvr.yml +weaver/unroll-cond-2.wvr.yml +weaver/unroll-cond-3.wvr.yml +weaver/unroll-cond-4.wvr.yml +weaver/unroll-cond-5.wvr.yml \ No newline at end of file diff --git a/.github/actions/build-archive/README.md b/.github/actions/build-archive/README.md new file mode 100644 index 0000000000..ed4cfdcf34 --- /dev/null +++ b/.github/actions/build-archive/README.md @@ -0,0 +1,42 @@ +# Submission of TOOL_NAME to SV-COMP + +_Theta_ is a generic, modular and configurable model checking framework developed at the [Critical Systems Research Group](http://inf.mit.bme.hu/en) of [Budapest University of Technology and Economics](http://www.bme.hu/?language=en), aiming to support the design and evaluation of abstraction refinement-based algorithms for the reachability analysis of various formalisms. +The main distinguishing characteristic of Theta is its architecture that allows the definition of input formalisms with higher level language front-ends, and the combination of various abstract domains, interpreters, and strategies for abstraction and refinement. +Theta can both serve as a model checking backend, and also includes ready-to-use, stand-alone tools. + +## Submitted version + +The submitted version can be found under the `COMMIT_ID` commit in the [GitHub repository](https://github.com/ftsrg/theta/commit/COMMIT_ID). + +Minimal necessary packages for Ubuntu 22.04 LTS: + +* openjdk-17-jre-headless +* libgomp1 +* libmpfr-dev + +## Contents of the Submission +``` +. +├── CONTRIBUTORS.md - contains information on the main contributors to TOOL_NAME +├── LIB_LICENSES.md - contains the licensing information for packaged dependencies +├── LICENSE - contains the license for TOOL_NAME +├── README.md - this file +├── lib - contains the native library dependencies +├── solvers - contains further dependencies (SMT-solvers), each having their respective licenses +├── theta-smtlib.jar - the jarfile for installing and managing smt solvers (not necessary unless different solver versions are required) +├── theta-start.sh - the starting script of TOOL_NAME +└── theta.jar - the main jarfile of TOOL_NAME +``` + +## Usage +This packaged version of TOOL_NAME is equipped with the necessary SMT solvers, libraries and binary version of TOOL_NAME. To use it, one has to simply execute `theta-start.sh` with the desired parameters. The first parameter must be the name of the input task (except when using `--version`). The script provides the `--smt-home` directory to TOOL_NAME. +The tool is used with the following parameters on SV-COMP: + +``` +INPUT_FLAG \ +--witness-only \ +--loglevel RESULT +``` + +For a more verbose output, change `--loglevel` to `MAINSTEP, SUBSTEP, INFO or DETAIL`. +For more parameters, check out [the documentation on CEGAR](https://github.com/ftsrg/theta/blob/master/doc/CEGAR-algorithms.md) *(might not be up to date on every parameter, but gives a detailed explanation on them)* and [the main class of the XCFA frontend](https://github.com/ftsrg/theta/blob/master/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/stateless/XcfaCli.java). \ No newline at end of file diff --git a/.github/actions/build-archive/action.yml b/.github/actions/build-archive/action.yml new file mode 100644 index 0000000000..c6afb0bfa2 --- /dev/null +++ b/.github/actions/build-archive/action.yml @@ -0,0 +1,58 @@ +name: 'Create SV-COMP binary' +inputs: + name: + required: true + inputflag: + required: true +runs: + using: "composite" + steps: + - name: Checkout repository + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + name: Get JAR + with: + name: ThetaJars + path: jar/ + - name: Create folder structure + shell: bash + run: | + mkdir -p ${{ inputs.name }}/theta/ + mkdir -p ${{ inputs.name }}/theta/solvers + cp lib ${{ inputs.name }}/theta/lib -r + cp CONTRIBUTORS.md ${{ inputs.name }}/theta/ + cp lib/README.md ${{ inputs.name }}/theta/LIB_LICENSES.md + cp LICENSE ${{ inputs.name }}/theta/ + cp README.md ${{ inputs.name }}/theta/GENERAL_README.md + cp scripts/theta-start.sh ${{ inputs.name }}/theta/theta-start.sh + chmod +x ${{ inputs.name }}/theta/theta-start.sh + sed "s/COMMIT_ID/$GITHUB_SHA/g" $GITHUB_ACTION_PATH/README.md > ${{ inputs.name }}/theta/README.md + sed -i 's/TOOL_NAME/${{ inputs.name }}/g' ${{ inputs.name }}/theta/README.md + sed -i 's/INPUT_FLAG/${{ inputs.inputflag }}/g' ${{ inputs.name }}/theta/README.md + - name: Extract theta-xcfa-cli and theta-smtlib-cli + shell: bash + run: | + mv jar/xcfa/xcfa-cli/build/libs/*-all.jar ${{ inputs.name }}/theta/theta.jar + mv jar/solver/solver-smtlib-cli/build/libs/*-all.jar ${{ inputs.name }}/theta/theta-smtlib.jar + - name: Setup java 17 + uses: actions/setup-java@5ffc13f4174014e2d4d4572b3d74c3fa61aeb2c2 # v3.11.0 + with: + distribution: temurin + java-version: 17 + - name: Install solvers + shell: bash + run: | + for i in $(cat $GITHUB_ACTION_PATH/necessary-solvers.txt) + do + java -jar ${{ inputs.name }}/theta/theta-smtlib.jar --home ${{ inputs.name }}/theta/solvers install $i + done + - name: ZIP archive + shell: bash + run: | + cd ${{ inputs.name }} + zip theta.zip theta -r + - name: Upload results + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + with: + name: ${{ inputs.name }}_SV-COMP + path: ${{ inputs.name }}/theta.zip diff --git a/.github/actions/build-archive/necessary-solvers.txt b/.github/actions/build-archive/necessary-solvers.txt new file mode 100644 index 0000000000..e6d12c0f97 --- /dev/null +++ b/.github/actions/build-archive/necessary-solvers.txt @@ -0,0 +1,4 @@ +cvc5:1.0.8 +mathsat:5.6.10 +z3:4.12.2 +princess:2023-06-19 \ No newline at end of file diff --git a/.github/workflows/check-copyright.yml b/.github/workflows/check-copyright.yml index 0ee8975a5d..c441a8d667 100644 --- a/.github/workflows/check-copyright.yml +++ b/.github/workflows/check-copyright.yml @@ -6,6 +6,10 @@ on: permissions: write-all +concurrency: + group: copyright-${{ github.head_ref }} + cancel-in-progress: true + jobs: check-copyright: runs-on: ubuntu-latest diff --git a/.github/workflows/check-formatting.yml b/.github/workflows/check-formatting.yml index 9165de23ec..213bdcb52d 100644 --- a/.github/workflows/check-formatting.yml +++ b/.github/workflows/check-formatting.yml @@ -6,6 +6,10 @@ on: permissions: write-all +concurrency: + group: formatting-${{ github.head_ref }} + cancel-in-progress: true + jobs: check-formatting: runs-on: ubuntu-latest diff --git a/.github/workflows/check-version.yml b/.github/workflows/check-version.yml index b65d9c69a4..102e6d154c 100644 --- a/.github/workflows/check-version.yml +++ b/.github/workflows/check-version.yml @@ -3,6 +3,10 @@ on: pull_request: types: [opened, synchronize, reopened] +concurrency: + group: version-${{ github.head_ref }} + cancel-in-progress: true + jobs: check-version: runs-on: ubuntu-latest diff --git a/.github/workflows/linux-build-test-deploy.yml b/.github/workflows/linux-build-test-deploy.yml index 65d2dd34a4..06b029cf79 100644 --- a/.github/workflows/linux-build-test-deploy.yml +++ b/.github/workflows/linux-build-test-deploy.yml @@ -12,6 +12,9 @@ on: permissions: write-all +concurrency: + group: deploy-${{ github.head_ref }} + cancel-in-progress: true jobs: build: @@ -41,7 +44,50 @@ jobs: status: "Failure" color: "red" path: "badges/build-${{ runner.os }}" + + + test-benchexec: + strategy: + matrix: + task: [ReachSafety-Arrays, ReachSafety-BitVectors, ReachSafety-ControlFlow, ReachSafety-ECA, ReachSafety-Floats, ReachSafety-Heap, ReachSafety-Loops, ReachSafety-ProductLines, ReachSafety-Recursive, ReachSafety-Sequentialized, ReachSafety-XCSP, ReachSafety-Combinations, ReachSafety-Hardware, ConcurrencySafety-Main, NoDataRace-Main, ConcurrencySafety-NoOverflows, ConcurrencySafety-MemSafety] + runs-on: ubuntu-latest + needs: build + steps: + - name: Checkout repository + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Run benchexec + uses: ./.github/actions/benchexec-test + with: + task: ${{ matrix.task }} + test_number: 5 + collect-results: + needs: test-benchexec + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Generate report + uses: ./.github/actions/benchexec-report + + create-archives: + runs-on: ubuntu-latest + needs: build + steps: + - name: Checkout repository + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - name: Create theta.zip + uses: ./.github/actions/build-archive + with: + name: "Theta" + inputflag: "--portfolio COMPLEX" + - name: Create emergentheta.zip + uses: ./.github/actions/build-archive + with: + name: "EmergenTheta" + inputflag: "--algorithm IMC_THEN_KIND" + + javadoc: needs: build runs-on: ubuntu-latest diff --git a/.github/workflows/mac-build-test.yml b/.github/workflows/mac-build-test.yml index 3d0d796498..c5fe7d0057 100644 --- a/.github/workflows/mac-build-test.yml +++ b/.github/workflows/mac-build-test.yml @@ -6,6 +6,10 @@ on: permissions: write-all +concurrency: + group: mac-${{ github.head_ref }} + cancel-in-progress: true + jobs: test-mac: strategy: diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 40f78b29f6..41450f2f0f 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -4,6 +4,10 @@ on: pull_request: types: [opened, synchronize, reopened] +concurrency: + group: sonar-${{ github.head_ref }} + cancel-in-progress: true + jobs: run-sonar: runs-on: ubuntu-latest diff --git a/.github/workflows/win-build-test.yml b/.github/workflows/win-build-test.yml index 0f05d6c3e5..1288984285 100644 --- a/.github/workflows/win-build-test.yml +++ b/.github/workflows/win-build-test.yml @@ -6,6 +6,10 @@ on: permissions: write-all +concurrency: + group: win-${{ github.head_ref }} + cancel-in-progress: true + jobs: test-windows: strategy: diff --git a/.gitignore b/.gitignore index 112ffa08d8..507ff2a3d3 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ dest/ # Other wdl-output.json +witness.graphml diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 95d30caf1a..9722efe245 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -14,3 +14,5 @@ Contributors: * [Vince Molnár](https://github.com/vincemolnar) * [Márk Somorjai](https://github.com/s0mark) * [Csanád Telbisz](https://github.com/csanadtelbisz) +* [Botond Sisák](https://github.com/sisakb) +* [Zalán Mondok](https://github.com/mondokz) diff --git a/scripts/complex.kts b/scripts/complex.kts new file mode 100644 index 0000000000..8af7d46af6 --- /dev/null +++ b/scripts/complex.kts @@ -0,0 +1,340 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import hu.bme.mit.theta.analysis.expr.refinement.PruneStrategy +import hu.bme.mit.theta.common.logging.Logger +import hu.bme.mit.theta.common.logging.NullLogger +import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.BitwiseOption +import hu.bme.mit.theta.frontend.ParseContext +import hu.bme.mit.theta.xcfa.analysis.ErrorDetection +import hu.bme.mit.theta.xcfa.cli.* +import hu.bme.mit.theta.xcfa.cli.portfolio.* +import hu.bme.mit.theta.xcfa.model.XCFA +import java.io.File +import java.util.concurrent.TimeoutException + +val xcfaTyped = xcfa as XCFA +val cFileNameTyped = cFileName as String +val loggerTyped = logger as Logger +val smtHomeTyped = smtHome as String +val traitsTyped = traits as VerificationTraits +val propertyTyped = property as ErrorDetection +val parseContextTyped = parseContext as ParseContext + +val checker = { p: Boolean, config: XcfaCegarConfig -> + if (p) + config.checkInProcess(xcfaTyped, smtHomeTyped, true, cFileNameTyped, loggerTyped, parseContextTyped)() + else config.check(xcfaTyped, loggerTyped) +} + +var baseConfig = XcfaCegarConfig( + errorDetectionType = propertyTyped, + abstractionSolver = "Z3", + validateAbstractionSolver = false, + domain = Domain.EXPL, + maxEnum = 1, + search = Search.ERR, + initPrec = InitPrec.EMPTY, + porLevel = POR.NOPOR, + refinementSolver = "Z3", + validateRefinementSolver = false, + refinement = Refinement.SEQ_ITP, + exprSplitter = ExprSplitterOptions.WHOLE, + pruneStrategy = PruneStrategy.FULL, + cexMonitor = CexMonitorOptions.CHECK, + timeoutMs = 0 +) + +if (traitsTyped.multithreaded) { + baseConfig = baseConfig.copy(search = Search.BFS, porLevel = POR.AASPOR, pruneStrategy = PruneStrategy.LAZY) + + if (propertyTyped == ErrorDetection.DATA_RACE) { + baseConfig = baseConfig.copy(porLevel = POR.SPOR) + } +} + +val timeoutTrigger = ExceptionTrigger( + ErrorCodeException(ExitCodes.TIMEOUT.code), + ErrorCodeException(ExitCodes.VERIFICATION_STUCK.code), + ErrorCodeException(ExitCodes.OUT_OF_MEMORY.code), + ErrorCodeException(ExitCodes.GENERIC_ERROR.code), + label = "Timeout" +) + +val timeoutOrSolverError = ExceptionTrigger( + ErrorCodeException(ExitCodes.SOLVER_ERROR.code), + ErrorCodeException(ExitCodes.TIMEOUT.code), + ErrorCodeException(ExitCodes.VERIFICATION_STUCK.code), + ErrorCodeException(ExitCodes.OUT_OF_MEMORY.code), + ErrorCodeException(ExitCodes.GENERIC_ERROR.code), + label = "TimeoutOrSolverError" +) + +val quickExplConfig = baseConfig.copy(initPrec = InitPrec.ALLVARS, timeoutMs = 90_000) +val emptyExplConfig = baseConfig.copy(timeoutMs = 210_000) +val predConfig = baseConfig.copy(domain = Domain.PRED_CART, refinement = Refinement.BW_BIN_ITP) + +fun integerStm(): STM { + fun getStm(inProcess: Boolean): STM { + val config_1_1 = ConfigNode("QuickFullExpl_z3_4.10.1_$inProcess", + quickExplConfig.copy(abstractionSolver = "z3:4.10.1", refinementSolver = "z3:4.10.1", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_2_1 = ConfigNode("EmptyExpl_z3_4.10.1_$inProcess", + emptyExplConfig.copy(abstractionSolver = "z3:4.10.1", refinementSolver = "z3:4.10.1", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_3_1 = ConfigNode("PredCart_z3_4.10.1_$inProcess", + predConfig.copy(abstractionSolver = "z3:4.10.1", refinementSolver = "z3:4.10.1"), checker, inProcess) + + val config_1_2 = ConfigNode("QuickFullExpl_Z3_$inProcess", quickExplConfig.copy(), checker, inProcess) + val config_2_2 = ConfigNode("EmptyExpl_Z3_$inProcess", emptyExplConfig.copy(), checker, inProcess) + val config_3_2 = ConfigNode("PredCart_Z3_$inProcess", predConfig.copy(), checker, inProcess) + + val config_1_3 = ConfigNode("QuickFullExpl_princess_2022_07_01_$inProcess", + quickExplConfig.copy(abstractionSolver = "princess:2022-07-01", refinementSolver = "princess:2022-07-01"), + checker, inProcess) + val config_2_3 = ConfigNode("EmptyExpl_princess_2022_07_01_$inProcess", + emptyExplConfig.copy(abstractionSolver = "princess:2022-07-01", refinementSolver = "princess:2022-07-01"), + checker, inProcess) + val config_3_3 = ConfigNode("PredCart_mathsat_5.6.8_$inProcess", + predConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8"), checker, + inProcess) + + val config_1_4 = ConfigNode("QuickFullExpl_mathsat_5.6.8_$inProcess", + quickExplConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8"), checker, + inProcess) + val config_2_4 = ConfigNode("EmptyExpl_mathsat_5.6.8_$inProcess", + emptyExplConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8"), checker, + inProcess) + val config_3_4 = ConfigNode("PredCart_princess_2022_07_01_$inProcess", + predConfig.copy(abstractionSolver = "princess:2022-07-01", refinementSolver = "princess:2022-07-01"), + checker, inProcess) + + val timeouts = setOf( + Edge(config_1_1, config_2_1, timeoutTrigger), + Edge(config_2_1, config_3_1, timeoutTrigger), + + Edge(config_1_2, config_2_2, timeoutTrigger), + Edge(config_2_2, config_3_1, timeoutTrigger), + + Edge(config_1_3, config_2_3, timeoutTrigger), + Edge(config_2_3, config_3_1, timeoutTrigger), + + Edge(config_1_4, config_2_4, if (inProcess) timeoutOrSolverError else ExceptionTrigger(label = "Anything")), + Edge(config_2_4, config_3_1, if (inProcess) timeoutOrSolverError else ExceptionTrigger(label = "Anything")), + ) + + val notTimeout = if (inProcess) ExceptionTrigger(ErrorCodeException(ExitCodes.SOLVER_ERROR.code), + label = "SolverError") else ExceptionTrigger(fallthroughExceptions = timeoutTrigger.exceptions, + label = "AnythingButTimeout") + + val solverExceptions = setOf( + Edge(config_1_1, config_1_2, notTimeout), + Edge(config_1_2, config_1_3, notTimeout), + Edge(config_1_3, config_1_4, notTimeout), + + Edge(config_2_1, config_2_2, notTimeout), + Edge(config_2_2, config_2_3, notTimeout), + Edge(config_2_3, config_2_4, notTimeout), + + Edge(config_3_1, config_3_2, notTimeout), + Edge(config_3_2, config_3_3, notTimeout), + Edge(config_3_3, config_3_4, notTimeout), + ) + return STM(config_1_1, timeouts union solverExceptions) + } + + val inProcess = HierarchicalNode("InProcess", getStm(true)) + val notInProcess = HierarchicalNode("NotInprocess", getStm(false)) + + val fallbackEdge = Edge(inProcess, notInProcess, ExceptionTrigger(label = "Anything")) + + return STM(inProcess, setOf(fallbackEdge)) +} + +fun bitwiseStm(): STM { + fun getStm(inProcess: Boolean): STM { + val config_1_1 = ConfigNode("QuickFullExpl_Z3_$inProcess", + quickExplConfig.copy(refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_2_1 = ConfigNode("EmptyExpl_Z3_$inProcess", emptyExplConfig.copy(refinement = Refinement.NWT_IT_WP), + checker, inProcess) + val config_3_1 = ConfigNode("PredCart_mathsat_5.6.8_$inProcess", + predConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8"), checker, + inProcess) + + val config_1_2 = ConfigNode("QuickFullExpl_cvc5_1.0.2_$inProcess", + quickExplConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_2_2 = ConfigNode("EmptyExpl_cvc5_1.0.2_$inProcess", + emptyExplConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_3_2 = ConfigNode("PredCart_z3_4.10.1_$inProcess", + predConfig.copy(abstractionSolver = "z3:4.10.1", refinementSolver = "z3:4.10.1"), checker, inProcess) + + val config_1_3 = ConfigNode("QuickFullExpl_mathsat_5.6.8_$inProcess", + quickExplConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_2_3 = ConfigNode("EmptyExpl_mathsat_5.6.8_$inProcess", + emptyExplConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8", + refinement = Refinement.SEQ_ITP), checker, inProcess) + val config_3_3 = ConfigNode("PredCart_cvc5_1.0.2_$inProcess", + predConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + + val timeouts = setOf( + Edge(config_1_1, config_2_1, timeoutTrigger), + Edge(config_2_1, config_3_1, timeoutTrigger), + + Edge(config_1_2, config_2_2, timeoutTrigger), + Edge(config_2_2, config_3_1, timeoutTrigger), + + Edge(config_1_3, config_2_3, if (inProcess) timeoutOrSolverError else ExceptionTrigger(label = "Anything")), + Edge(config_2_3, config_3_1, if (inProcess) timeoutOrSolverError else ExceptionTrigger(label = "Anything")), + ) + + val notTimeout = if (inProcess) ExceptionTrigger(ErrorCodeException(ExitCodes.SOLVER_ERROR.code), + label = "SolverError") else ExceptionTrigger(fallthroughExceptions = timeoutTrigger.exceptions, + label = "AnythingButTimeout") + + val solverExceptions = setOf( + Edge(config_1_1, config_1_2, notTimeout), + Edge(config_1_2, config_1_3, notTimeout), + + Edge(config_2_1, config_2_2, notTimeout), + Edge(config_2_2, config_2_3, notTimeout), + + Edge(config_3_1, config_3_2, notTimeout), + Edge(config_3_2, config_3_3, notTimeout), + ) + return STM(config_1_1, timeouts union solverExceptions) + } + + val inProcess = HierarchicalNode("InProcess", getStm(true)) + val notInProcess = HierarchicalNode("NotInprocess", getStm(false)) + + val fallbackEdge = Edge(inProcess, notInProcess, ExceptionTrigger(label = "Anything")) + + return STM(inProcess, setOf(fallbackEdge)) +} + +fun floatsStm(): STM { + fun getStm(inProcess: Boolean): STM { + val config_1_1 = ConfigNode("QuickFullExpl_cvc5_1.0.2_$inProcess", + quickExplConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_2_1 = ConfigNode("EmptyExpl_cvc5_1.0.2_$inProcess", + quickExplConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_3_1 = ConfigNode("PredCart_mathsat_5.6.8_$inProcess", + predConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8"), checker, + inProcess) + + val config_1_2 = ConfigNode("QuickFullExpl_cvc5_1.0.2_seq_$inProcess", + quickExplConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.SEQ_ITP), checker, inProcess) + val config_2_2 = ConfigNode("EmptyExpl_cvc5_1.0.2_seq_$inProcess", + emptyExplConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.SEQ_ITP), checker, inProcess) + val config_3_2 = ConfigNode("PredCart_bitwuzla_latest_$inProcess", + predConfig.copy(abstractionSolver = "bitwuzla:latest", refinementSolver = "bitwuzla:latest", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + + val config_1_3 = ConfigNode("QuickFullExpl_mathsat_5.6.8_$inProcess", + quickExplConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8", + validateAbstractionSolver = true, validateRefinementSolver = true, refinement = Refinement.NWT_IT_WP), + checker, inProcess) + val config_2_3 = ConfigNode("EmptyExpl_mathsat_5.6.8_$inProcess", + emptyExplConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8", + validateAbstractionSolver = true, validateRefinementSolver = true, refinement = Refinement.NWT_IT_WP), + checker, inProcess) + val config_3_3 = ConfigNode("PredCart_cvc5_1.0.2_$inProcess", + predConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + + val config_1_4 = ConfigNode("QuickFullExpl_mathsat_fp_$inProcess", + quickExplConfig.copy(abstractionSolver = "mathsat:fp", refinementSolver = "mathsat:fp", + validateAbstractionSolver = true, validateRefinementSolver = true), checker, inProcess) + val config_2_4 = ConfigNode("EmptyExpl_mathsat_fp_$inProcess", + emptyExplConfig.copy(abstractionSolver = "mathsat:fp", refinementSolver = "mathsat:fp", + validateAbstractionSolver = true, validateRefinementSolver = true), checker, inProcess) + val config_3_4 = ConfigNode("PredCart_mathsat_fp_$inProcess", + predConfig.copy(abstractionSolver = "mathsat:fp", refinementSolver = "mathsat:fp", + validateAbstractionSolver = true, validateRefinementSolver = true), checker, inProcess) + + val config_1_5 = ConfigNode("QuickFullExpl_Z3_$inProcess", + quickExplConfig.copy(abstractionSolver = "Z3", refinementSolver = "Z3", validateAbstractionSolver = true, + validateRefinementSolver = true, refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_2_5 = ConfigNode("EmptyExpl_Z3_$inProcess", + emptyExplConfig.copy(abstractionSolver = "Z3", refinementSolver = "Z3", validateAbstractionSolver = true, + validateRefinementSolver = true, refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_3_5 = ConfigNode("PredCart_Z3_$inProcess", + predConfig.copy(abstractionSolver = "Z3", refinementSolver = "Z3", refinement = Refinement.NWT_IT_WP), + checker, inProcess) + + val timeouts = setOf( + Edge(config_1_1, config_2_1, timeoutTrigger), + Edge(config_2_1, config_3_1, timeoutTrigger), + + Edge(config_1_2, config_2_2, timeoutTrigger), + Edge(config_2_2, config_3_1, timeoutTrigger), + + Edge(config_1_3, config_2_3, timeoutTrigger), + Edge(config_2_3, config_3_1, timeoutTrigger), + + Edge(config_1_4, config_2_4, timeoutTrigger), + Edge(config_2_4, config_3_1, timeoutTrigger), + + Edge(config_1_5, config_2_5, if (inProcess) timeoutOrSolverError else ExceptionTrigger(label = "Anything")), + Edge(config_2_5, config_3_1, if (inProcess) timeoutOrSolverError else ExceptionTrigger(label = "Anything")), + ) + + val notTimeout = if (inProcess) ExceptionTrigger(ErrorCodeException(ExitCodes.SOLVER_ERROR.code), + label = "SolverError") else ExceptionTrigger(fallthroughExceptions = timeoutTrigger.exceptions, + label = "AnythingButTimeout") + + val solverExceptions = setOf( + Edge(config_1_1, config_1_2, notTimeout), + Edge(config_1_2, config_1_3, notTimeout), + Edge(config_1_3, config_1_4, notTimeout), + Edge(config_1_4, config_1_5, notTimeout), + + Edge(config_2_1, config_2_2, notTimeout), + Edge(config_2_2, config_2_3, notTimeout), + Edge(config_2_3, config_2_4, notTimeout), + Edge(config_2_4, config_2_5, notTimeout), + + Edge(config_3_1, config_3_2, notTimeout), + Edge(config_3_2, config_3_3, notTimeout), + Edge(config_3_3, config_3_4, notTimeout), + Edge(config_3_4, config_3_5, notTimeout), + ) + return STM(config_1_1, timeouts union solverExceptions) + } + + val inProcess = HierarchicalNode("InProcess", getStm(true)) + val notInProcess = HierarchicalNode("NotInprocess", getStm(false)) + + val fallbackEdge = Edge(inProcess, notInProcess, ExceptionTrigger(label = "Anything")) + + return STM(inProcess, setOf(fallbackEdge)) +} + +val stm = when (traitsTyped.arithmetic) { + BitwiseOption.INTEGER -> integerStm() + BitwiseOption.BITWISE -> bitwiseStm() + BitwiseOption.BITWISE_FLOAT -> floatsStm() +} + +stm.execute() diff --git a/scripts/portfolio.kts b/scripts/simple.kts similarity index 100% rename from scripts/portfolio.kts rename to scripts/simple.kts diff --git a/subprojects/cfa/cfa-analysis/src/main/java/hu/bme/mit/theta/cfa/analysis/CfaToMonoliticTransFunc.java b/subprojects/cfa/cfa-analysis/src/main/java/hu/bme/mit/theta/cfa/analysis/CfaToMonoliticTransFunc.java new file mode 100644 index 0000000000..6d778a0cd8 --- /dev/null +++ b/subprojects/cfa/cfa-analysis/src/main/java/hu/bme/mit/theta/cfa/analysis/CfaToMonoliticTransFunc.java @@ -0,0 +1,70 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.cfa.analysis; + +import com.google.common.base.Preconditions; +import hu.bme.mit.theta.analysis.algorithm.AbstractMonolithicTransFunc; +import hu.bme.mit.theta.analysis.algorithm.MonolithicTransFunc; +import hu.bme.mit.theta.cfa.CFA; +import hu.bme.mit.theta.core.decl.Decls; +import hu.bme.mit.theta.core.stmt.AssignStmt; +import hu.bme.mit.theta.core.stmt.AssumeStmt; +import hu.bme.mit.theta.core.stmt.NonDetStmt; +import hu.bme.mit.theta.core.stmt.SequenceStmt; +import hu.bme.mit.theta.core.stmt.Stmt; +import hu.bme.mit.theta.core.utils.StmtUtils; +import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.And; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Neq; + +public class CfaToMonoliticTransFunc extends AbstractMonolithicTransFunc { + private CfaToMonoliticTransFunc(CFA cfa) { + Preconditions.checkArgument(cfa.getErrorLoc().isPresent()); + + int i = 0; + final Map map = new HashMap<>(); + for (var x : cfa.getLocs()) { + map.put(x, i++); + } + var locVar = Decls.Var("loc", Int()); + List tranList = cfa.getEdges().stream().map(e -> SequenceStmt.of(List.of( + AssumeStmt.of(Eq(locVar.getRef(), Int(map.get(e.getSource())))), + e.getStmt(), + AssignStmt.of(locVar, Int(map.get(e.getTarget()))) + ))).collect(Collectors.toList()); + var trans = NonDetStmt.of(tranList); + var transUnfold = StmtUtils.toExpr(trans, VarIndexingFactory.indexing(0)); + transExpr = And(transUnfold.getExprs()); + initExpr = Eq(locVar.getRef(), Int(map.get(cfa.getInitLoc()))); + propExpr = Neq(locVar.getRef(), Int(map.get(cfa.getErrorLoc().get()))); + + firstIndex = VarIndexingFactory.indexing(0); + offsetIndex = transUnfold.getIndexing(); + } + + public static MonolithicTransFunc create(CFA cfa) { + return new CfaToMonoliticTransFunc(cfa); + } +} diff --git a/subprojects/cfa/cfa-analysis/src/main/java/hu/bme/mit/theta/cfa/analysis/config/CfaConfigBuilder.java b/subprojects/cfa/cfa-analysis/src/main/java/hu/bme/mit/theta/cfa/analysis/config/CfaConfigBuilder.java index e9ccbf664d..ede462bf6c 100644 --- a/subprojects/cfa/cfa-analysis/src/main/java/hu/bme/mit/theta/cfa/analysis/config/CfaConfigBuilder.java +++ b/subprojects/cfa/cfa-analysis/src/main/java/hu/bme/mit/theta/cfa/analysis/config/CfaConfigBuilder.java @@ -93,6 +93,12 @@ public class CfaConfigBuilder { + public enum Algorithm { + CEGAR, + KINDUCTION, + IMC + } + public enum Domain { EXPL, PRED_BOOL, PRED_CART, PRED_SPLIT } diff --git a/subprojects/cfa/cfa-cli/src/main/java/hu/bme/mit/theta/cfa/cli/CfaCli.java b/subprojects/cfa/cfa-cli/src/main/java/hu/bme/mit/theta/cfa/cli/CfaCli.java index b514dcfae5..761d6a246c 100644 --- a/subprojects/cfa/cfa-cli/src/main/java/hu/bme/mit/theta/cfa/cli/CfaCli.java +++ b/subprojects/cfa/cfa-cli/src/main/java/hu/bme/mit/theta/cfa/cli/CfaCli.java @@ -15,33 +15,26 @@ */ package hu.bme.mit.theta.cfa.cli; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.nio.file.Path; -import java.util.concurrent.TimeUnit; -import java.util.stream.Stream; - import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.beust.jcommander.ParameterException; import com.google.common.base.Stopwatch; - import hu.bme.mit.theta.analysis.Trace; import hu.bme.mit.theta.analysis.algorithm.SafetyResult; import hu.bme.mit.theta.analysis.algorithm.SafetyResult.Unsafe; import hu.bme.mit.theta.analysis.algorithm.cegar.CegarStatistics; +import hu.bme.mit.theta.analysis.algorithm.imc.ImcChecker; +import hu.bme.mit.theta.analysis.algorithm.kind.KIndChecker; import hu.bme.mit.theta.analysis.expl.ExplState; import hu.bme.mit.theta.analysis.expr.refinement.PruneStrategy; import hu.bme.mit.theta.cfa.CFA; import hu.bme.mit.theta.cfa.analysis.CfaAction; import hu.bme.mit.theta.cfa.analysis.CfaState; +import hu.bme.mit.theta.cfa.analysis.CfaToMonoliticTransFunc; import hu.bme.mit.theta.cfa.analysis.CfaTraceConcretizer; import hu.bme.mit.theta.cfa.analysis.config.CfaConfig; import hu.bme.mit.theta.cfa.analysis.config.CfaConfigBuilder; +import hu.bme.mit.theta.cfa.analysis.config.CfaConfigBuilder.Algorithm; import hu.bme.mit.theta.cfa.analysis.config.CfaConfigBuilder.Domain; import hu.bme.mit.theta.cfa.analysis.config.CfaConfigBuilder.Encoding; import hu.bme.mit.theta.cfa.analysis.config.CfaConfigBuilder.InitPrec; @@ -67,6 +60,16 @@ import hu.bme.mit.theta.solver.z3.Z3SolverFactory; import hu.bme.mit.theta.solver.z3.Z3SolverManager; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.nio.file.Path; +import java.util.concurrent.TimeUnit; +import java.util.stream.Stream; + import static com.google.common.base.Preconditions.checkNotNull; /** @@ -77,6 +80,8 @@ public class CfaCli { private static final String JAR_NAME = "theta-cfa-cli.jar"; private final String[] args; private final TableWriter writer; + @Parameter(names = {"--algorithm"}, description = "Algorithm") + Algorithm algorithm = Algorithm.CEGAR; @Parameter(names = "--domain", description = "Abstract domain") Domain domain = Domain.PRED_CART; @@ -231,10 +236,27 @@ private void run() { refinementSolverFactory = SolverManager.resolveSolverFactory(solver); } - final CfaConfig configuration = buildConfiguration(cfa, errLoc, - abstractionSolverFactory, refinementSolverFactory); - final SafetyResult status = check(configuration); - sw.stop(); + final SafetyResult status; + if (algorithm == Algorithm.CEGAR) { + final CfaConfig configuration = buildConfiguration(cfa, errLoc, abstractionSolverFactory, refinementSolverFactory); + status = check(configuration); + sw.stop(); + } else if (algorithm == Algorithm.KINDUCTION) { + var transFunc = CfaToMonoliticTransFunc.create(cfa); + var checker = new KIndChecker<>(transFunc, Integer.MAX_VALUE, 0, 1, Z3SolverFactory.getInstance().createSolver(), Z3SolverFactory.getInstance().createSolver(), ExplState::of, null, cfa.getVars()); + status = checker.check(null); + logger.write(Logger.Level.RESULT, "%s%n", status); + sw.stop(); + } else if (algorithm == Algorithm.IMC) { + var transFunc = CfaToMonoliticTransFunc.create(cfa); + var checker = new ImcChecker<>(transFunc, Integer.MAX_VALUE, Z3SolverFactory.getInstance().createItpSolver(), ExplState::of, cfa.getVars(), null); + status = checker.check(null); + logger.write(Logger.Level.RESULT, "%s%n", status); + sw.stop(); + } else { + throw new UnsupportedOperationException("Algorithm " + algorithm + " not supported"); + } + printResult(status, sw.elapsed(TimeUnit.MILLISECONDS)); if (status.isUnsafe() && cexfile != null) { writeCex(status.asUnsafe()); @@ -287,7 +309,8 @@ private CFA loadModel() throws Exception { } private void printResult(final SafetyResult status, final long totalTimeMs) { - final CegarStatistics stats = (CegarStatistics) status.getStats().get(); + final CegarStatistics stats = (CegarStatistics) + status.getStats().orElse(new CegarStatistics(0, 0, 0, 0)); if (benchmarkMode) { writer.cell(status.isSafe()); writer.cell(totalTimeMs); diff --git a/subprojects/common/analysis/build.gradle.kts b/subprojects/common/analysis/build.gradle.kts index dae61a15a5..d73ed4f787 100644 --- a/subprojects/common/analysis/build.gradle.kts +++ b/subprojects/common/analysis/build.gradle.kts @@ -24,4 +24,5 @@ dependencies { implementation(project(":theta-solver")) implementation(project(":theta-graph-solver")) testImplementation(project(":theta-solver-z3")) + implementation("com.corundumstudio.socketio:netty-socketio:2.0.6") } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ARG.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ARG.java index 241a369590..e653bfb397 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ARG.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ARG.java @@ -18,10 +18,10 @@ import hu.bme.mit.theta.analysis.Action; import hu.bme.mit.theta.analysis.PartialOrd; import hu.bme.mit.theta.analysis.State; +import hu.bme.mit.theta.analysis.algorithm.debug.ARGWebDebugger; import hu.bme.mit.theta.common.container.Containers; import java.util.Collection; -import java.util.Objects; import java.util.Optional; import java.util.OptionalInt; import java.util.stream.Stream; @@ -110,6 +110,7 @@ public ArgNode createInitNode(final S initState, final boolean target) { checkNotNull(initState); final ArgNode initNode = createNode(initState, 0, target); initNodes.add(initNode); + ARGWebDebugger.create(initNode); return initNode; } @@ -135,6 +136,7 @@ private ArgEdge createEdge(final ArgNode source, final A action, fin final ArgEdge edge = new ArgEdge<>(source, action, target); source.outEdges.add(edge); target.inEdge = Optional.of(edge); + ARGWebDebugger.add(source, action, target); return edge; } @@ -148,6 +150,7 @@ public void prune(final ArgNode node) { final ArgEdge edge = node.getInEdge().get(); final ArgNode parent = edge.getSource(); parent.outEdges.remove(edge); + ARGWebDebugger.remove(edge); parent.expanded = false; } else { assert initNodes.contains(node); @@ -221,18 +224,4 @@ public double getMeanBranchingFactor() { final double mean = nodesToCalculate.mapToDouble(n -> n.getOutEdges().count()).average().orElse(0); return mean; } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ARG arg = (ARG) o; - return initialized == arg.initialized && - initNodes.equals(arg.initNodes); - } - - @Override - public int hashCode() { - return Objects.hash(initNodes, initialized, partialOrd); - } } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/AbstractMonolithicTransFunc.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/AbstractMonolithicTransFunc.java new file mode 100644 index 0000000000..92992513af --- /dev/null +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/AbstractMonolithicTransFunc.java @@ -0,0 +1,53 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.analysis.algorithm; + +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.utils.indexings.VarIndexing; + +public abstract class AbstractMonolithicTransFunc implements MonolithicTransFunc { + protected Expr transExpr; + protected Expr initExpr; + protected VarIndexing firstIndex; + protected VarIndexing offsetIndex; + protected Expr propExpr; + + @Override + public Expr getTransExpr() { + return transExpr; + } + + @Override + public Expr getInitExpr() { + return initExpr; + } + + @Override + public Expr getPropExpr() { + return propExpr; + } + + @Override + public VarIndexing getInitIndexing() { + return firstIndex; + } + + @Override + public VarIndexing getOffsetIndexing() { + return offsetIndex; + } +} diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgEdge.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgEdge.java index e1babcec02..2ea5b9f6f6 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgEdge.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgEdge.java @@ -18,36 +18,7 @@ import hu.bme.mit.theta.analysis.Action; import hu.bme.mit.theta.analysis.State; -import java.util.Objects; - public final class ArgEdge { - private static final int HASH_SEED = 3653; - private volatile int hashCode = 0; - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ArgEdge argEdge = (ArgEdge) o; - return Objects.equals(source.getState(), argEdge.source.getState()) - && Objects.equals(target, argEdge.target) - && Objects.equals(action.toString(), argEdge.action.toString()); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + source.getState().hashCode(); - result = 31 * result + target.getState().hashCode(); - result = 31 * result + action.toString().hashCode(); - hashCode = result; - } - return result; - // return Objects.hash(source.getState(), target.getState(), action.toString()); - } - private final ArgNode source; private final ArgNode target; private final A action; diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgNode.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgNode.java index 81f5a5270a..f7a56a4cb6 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgNode.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgNode.java @@ -20,7 +20,9 @@ import hu.bme.mit.theta.common.Utils; import hu.bme.mit.theta.common.container.Containers; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Optional; import java.util.stream.Stream; import static com.google.common.base.Preconditions.checkArgument; @@ -28,9 +30,6 @@ public final class ArgNode { - private static final int HASH_SEED = 8543; - private volatile int hashCode = 0; - final ARG arg; private final int id; @@ -270,29 +269,6 @@ private Stream> unexcludedDescendantsOfNode() { //// - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + id; - hashCode = result; - } - return result; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ArgNode argNode = (ArgNode) o; - return depth == argNode.depth && - state.equals(argNode.state) && - coveringNode.equals(argNode.coveringNode) && - Set.copyOf(outEdges).equals(Set.copyOf(argNode.outEdges)) && - target == argNode.target; - } - @Override public String toString() { return Utils.lispStringBuilder("ArgNode").add(id).body().add(state).toString(); diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgStructuralEquality.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgStructuralEquality.java new file mode 100644 index 0000000000..7c973dcac0 --- /dev/null +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgStructuralEquality.java @@ -0,0 +1,192 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.analysis.algorithm; + +import hu.bme.mit.theta.analysis.Action; +import hu.bme.mit.theta.analysis.State; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.google.common.base.Objects.equal; + +/** + * Structural comparisons using equal() and hashCode() for ARG-related classes. + * Each node is uniquely identifiable using its incoming edge (or its absence), and wrapped state. + * Each edge is uniquely identifiable using its source node, and wrapped action. + * An ARG is uniquely identifiable using its leaf nodes. + * An ArgTrace is uniquely identifiable using its last node. + *

+ * We perform caching for the hash codes, but equals() checks will always traverse the ancestors of + * a node (and edge). However, this traversal only goes towards the root, rather than in all + * directions. + */ +public final class ArgStructuralEquality { + private static final Map hashCodeCache = new LinkedHashMap<>(); + + private ArgStructuralEquality() { + } + + public static boolean equals(final ArgNode n1, + final ArgNode n2) { + + // if references are the same, the two nodes are equal + if (n1 == n2) { + return true; + } + + // if one is null, the two nodes are not equal + if (n1 == null || n2 == null) { + return false; + } + + // if wrapped state is not same, nodes are not equal + if (!n1.getState().equals(n2.getState())) { + return false; + } + + // if one node has a parent but the other one does not, nodes are not equal + if (n1.inEdge.isPresent() != n2.inEdge.isPresent()) { + return false; + } + + // if in edge is not same, nodes are not equal + if (n1.inEdge.isPresent() && !equals(n1.inEdge.get(), n2.inEdge.get())) { + return false; + } + + return true; + } + + public static boolean equals(final ArgEdge e1, + final ArgEdge e2) { + + // if references are the same, the two edges are equal + if (e1 == e2) { + return true; + } + + // if one is null, the two edges are not equal + if (e1 == null || e2 == null) { + return false; + } + + + // if wrapped action is not same, edges are not equal + if (!e1.getAction().equals(e2.getAction())) { + return false; + } + + // if source node is not same, edges are not equal + if (!equals(e1.getSource(), e2.getSource())) { + return false; + } + + return true; + } + + public static boolean equals(final ARG a1, + final ARG a2) { + + // if references are the same, the two edges are equal + if (a1 == a2) { + return true; + } + + // if one is null, the two args are not equal + if (a1 == null || a2 == null) { + return false; + } + + Set> leaves1 = a1.getNodes().filter(ArgNode::isLeaf).collect(Collectors.toUnmodifiableSet()); + Set> leaves2 = a2.getNodes().filter(ArgNode::isLeaf).collect(Collectors.toUnmodifiableSet()); + + // if the two ARGs contain a different number of leaf nodes, they are not equal + if (leaves1.size() != leaves2.size()) { + return false; + } + + leaves1loop: + for (ArgNode n1 : leaves1) { + for (ArgNode n2 : leaves2) { + if (equals(n1, n2)) { + continue leaves1loop; + } + } + // a leaf node did not have a corresponding leaf node in the other arg + return false; + } + return true; + } + + public static boolean equals(final ArgTrace t1, + final ArgTrace t2) { + + return equal(t1.node(t1.length()), t2.node(t2.length())); + } + + + public static int hashCode(final ArgNode n) { + if (!hashCodeCache.containsKey(n)) { + int hashcode = 0; + + if (n.inEdge.isPresent()) { + hashcode += hashCode(n.inEdge.get()); + } + + hashcode += n.getState().hashCode(); + hashCodeCache.put(n, hashcode); + } + return hashCodeCache.get(n); + } + + public static int hashCode(final ArgEdge e) { + if (!hashCodeCache.containsKey(e)) { + int hashcode = 0; + + hashcode += hashCode(e.getSource()); + + hashcode += e.getAction().hashCode(); + + hashCodeCache.put(e, hashcode); + } + return hashCodeCache.get(e); + } + + // ARG is not immutable, so we don't cache + public static int hashCode(final ARG a) { + int hashcode = 0; + + Set> leaves = a.getNodes().filter(ArgNode::isLeaf).collect(Collectors.toUnmodifiableSet()); + for (ArgNode leaf : leaves) { + hashcode += hashCode(leaf); + } + + return hashcode; + } + + public static int hashCode(final ArgTrace t) { + if (!hashCodeCache.containsKey(t)) { + int hashcode = hashCode(t.node(t.length())); + hashCodeCache.put(t, hashcode); + } + return hashCodeCache.get(t); + } + +} diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgTrace.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgTrace.java index a786f29df8..e06919ff33 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgTrace.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/ArgTrace.java @@ -34,9 +34,6 @@ */ public final class ArgTrace implements Iterable> { - private static final int HASH_SEED = 7653; - private volatile int hashCode = 0; - private final List> nodes; private final List> edges; private final Collection states; @@ -116,30 +113,4 @@ public Iterator> iterator() { return nodes.iterator(); } - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - ArgTrace argTrace = (ArgTrace) o; - return states.equals(argTrace.states); // && edges.equals(argTrace.edges); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + states.hashCode(); - result = 31 * result + edges.hashCode(); - hashCode = result; - } - return result; - // return Objects.hash(states, edges); - } - //// - } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/MonolithicTransFunc.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/MonolithicTransFunc.java new file mode 100644 index 0000000000..a56fe59fdd --- /dev/null +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/MonolithicTransFunc.java @@ -0,0 +1,36 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.analysis.algorithm; + +import com.google.errorprone.annotations.Var; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.utils.indexings.VarIndexing; +import hu.bme.mit.theta.solver.SolverFactory; + +public interface MonolithicTransFunc { + Expr getTransExpr(); + + Expr getInitExpr(); + + Expr getPropExpr(); + + VarIndexing getInitIndexing(); + + VarIndexing getOffsetIndexing(); + + +} diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/SporLts.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/SporLts.java deleted file mode 100644 index 21d4546cc7..0000000000 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/SporLts.java +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright 2023 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package hu.bme.mit.theta.analysis.algorithm; - -import hu.bme.mit.theta.analysis.Action; -import hu.bme.mit.theta.analysis.LTS; -import hu.bme.mit.theta.analysis.State; -import hu.bme.mit.theta.core.decl.Decl; -import hu.bme.mit.theta.core.type.Type; - -import java.util.*; -import java.util.function.Predicate; - -/** - * LTS with a POR (Partial Order Reduction) algorithm applied as a filter when returning enabled actions. - * - * @param the type of the state - * @param the type of the action (transition in the state space) - * @param the type of the transition in the original formalism - */ -public abstract class SporLts implements LTS { - - /* CACHE COLLECTIONS */ - - /** - * Shared objects (~global variables) used by a transition. - */ - private final HashMap>> usedSharedObjects = new HashMap<>(); - - /** - * Shared objects (~global variables) that are used by the key transition or by transitions reachable from the - * current state via a given transition. - */ - private final HashMap>> influencedSharedObjects = new HashMap<>(); - - /** - * Backward transitions in the transition system (a transition of a loop). - */ - protected final Set backwardTransitions = new LinkedHashSet<>(); - - - /** - * Returns the enabled actions in the ARG from the given state filtered with a POR algorithm. - * - * @param state the state whose enabled actions we would like to know - * @return the enabled actions - */ - @Override - public Set getEnabledActionsFor(S state) { - // Collecting enabled actions - Collection allEnabledActions = getAllEnabledActionsFor(state); - - // Calculating the persistent set starting from every (or some of the) enabled transition; the minimal persistent set is stored - Set minimalPersistentSet = new LinkedHashSet<>(); - Collection> persistentSetFirstActions = getPersistentSetFirstActions(allEnabledActions); - for (Collection firstActions : persistentSetFirstActions) { - Set persistentSet = calculatePersistentSet(allEnabledActions, firstActions); - if (minimalPersistentSet.size() == 0 || persistentSet.size() < minimalPersistentSet.size()) { - minimalPersistentSet = persistentSet; - } - } - - return minimalPersistentSet; - } - - /** - * Calculates a persistent set of enabled actions starting from a particular action. - * - * @param enabledActions the enabled actions in the present state - * @param firstActions the actions that will be added to the persistent set as the first actions - * @return a persistent set of enabled actions - */ - protected Set calculatePersistentSet(Collection enabledActions, Collection firstActions) { - if (firstActions.stream().anyMatch(this::isBackwardAction)) { - return new LinkedHashSet<>(enabledActions); - } - - Set persistentSet = new LinkedHashSet<>(firstActions); - Set otherActions = new LinkedHashSet<>(enabledActions); // actions not in the persistent set - firstActions.forEach(otherActions::remove); - - boolean addedNewAction = true; - while (addedNewAction) { - addedNewAction = false; - Set actionsToRemove = new LinkedHashSet<>(); - for (A action : otherActions) { - // for every action that is not in the persistent set it is checked whether it should be added to the persistent set - // (because it is dependent with an action already in the persistent set) - if (persistentSet.stream().anyMatch(persistentSetAction -> areDependents(persistentSetAction, action))) { - if (isBackwardAction(action)) { - return new LinkedHashSet<>(enabledActions); // see POR algorithm for the reason of removing backward transitions - } - - persistentSet.add(action); - actionsToRemove.add(action); - addedNewAction = true; - } - } - actionsToRemove.forEach(otherActions::remove); - } - - return persistentSet; - } - - /** - * Returns all the enabled actions in a state. - * - * @param state the state whose enabled actions are to be returned - * @return the enabled actions in the state - */ - protected abstract Collection getAllEnabledActionsFor(S state); - - /** - * Returns the actions from where persistent sets will be calculated (a subset of the given enabled actions). - * The default implementation returns all enabled actions. - * - * @param allEnabledActions all the enabled actions in the present state - * @return the actions from where persistent sets will be calculated - */ - protected Collection> getPersistentSetFirstActions(Collection allEnabledActions) { - return List.of(allEnabledActions); - } - - /** - * Determines whether an action is dependent with another one (based on the notions introduced for the POR - * algorithm) already in the persistent set. - * - * @param persistentSetAction the action in the persistent set - * @param action the other action (not in the persistent set) - * @return true, if the two actions are dependent in the context of persistent sets - */ - protected boolean areDependents(A persistentSetAction, A action) { - var usedByPersistentSetAction = getCachedUsedSharedObjects(getTransitionOf(persistentSetAction)); - return isSameProcess(persistentSetAction, action) || - getInfluencedSharedObjects(getTransitionOf(action)).stream().anyMatch(usedByPersistentSetAction::contains); - } - - /** - * Determines whether two actions are in the same process. - * - * @param action1 action 1 - * @param action2 action 2 - * @return true, if the two actions are in the same process - */ - protected abstract boolean isSameProcess(A action1, A action2); - - /** - * Determines whether the given action is a backward action. - * - * @param action the action to be classified as backward action or non-backward action - * @return true, if the action is a backward action - */ - protected boolean isBackwardAction(A action) { - return backwardTransitions.contains(getTransitionOf(action)); - } - - /** - * Get the original transition of an action (from which the action has been created). - * - * @param action whose original transition is to be returned - * @return the original transition - */ - protected abstract T getTransitionOf(A action); - - /** - * Returns the successive transitions of a transition (transitions whose source is the target of the given - * parameter). - * - * @param transition whose successive transitions is to be returned - * @return the successive transitions of the transition given as the parameter - */ - protected abstract Set getSuccessiveTransitions(T transition); - - - /** - * Returns the shared objects (~global variables) that an action uses (it is present in one of its labels). - * - * @param transition whose shared objects are to be returned - * @return the set of used shared objects - */ - protected abstract Set> getDirectlyUsedSharedObjects(T transition); - - /** - * Returns the shared objects (~global variables) that an action uses. - * - * @param transition whose shared objects are to be returned - * @return the set of directly or indirectly used shared objects - */ - protected Set> getUsedSharedObjects(T transition) { - return getDirectlyUsedSharedObjects(transition); - } - - /** - * Same as {@link SporLts#getUsedSharedObjects(T transition)} with an additional cache layer. - * - * @param transition whose shared objects are to be returned - * @return the set of directly or indirectly used shared objects - */ - protected Set> getCachedUsedSharedObjects(T transition) { - if (!usedSharedObjects.containsKey(transition)) { - Set> vars = getUsedSharedObjects(transition); - usedSharedObjects.put(transition, vars); - } - return usedSharedObjects.get(transition); - } - - /** - * Returns the shared objects (~global variables) used by the given transition or by transitions that are reachable - * via the given transition ("influenced shared objects"). - * - * @param transition whose successor transitions' shared objects are to be returned. - * @return the set of influenced shared objects - */ - protected Set> getInfluencedSharedObjects(T transition) { - if (!influencedSharedObjects.containsKey(transition)) { - influencedSharedObjects.put(transition, getSharedObjectsWithBFS(transition, t -> true)); - } - return influencedSharedObjects.get(transition); - } - - /** - * Returns shared objects (~global variables) encountered in a search starting from a given transition. - * - * @param startTransition the start point (transition) of the search - * @param goFurther the predicate that tells whether more transitions have to be explored through this - * transition - * @return the set of encountered shared objects - */ - protected Set> getSharedObjectsWithBFS(T startTransition, Predicate goFurther) { - Set> vars = new LinkedHashSet<>(); - List exploredTransitions = new ArrayList<>(); - List transitionsToExplore = new ArrayList<>(); - transitionsToExplore.add(startTransition); - - while (!transitionsToExplore.isEmpty()) { - T exploring = transitionsToExplore.remove(0); - vars.addAll(getDirectlyUsedSharedObjects(exploring)); - - if (goFurther.test(exploring)) { - Set successiveTransitions = getSuccessiveTransitions(exploring); - for (var newTransition : successiveTransitions) { - if (!exploredTransitions.contains(newTransition)) { - transitionsToExplore.add(newTransition); - } - } - } - exploredTransitions.add(exploring); - } - return vars; - } -} diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/CegarChecker.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/CegarChecker.java index 677ab071be..80bd3f1cfd 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/CegarChecker.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/CegarChecker.java @@ -91,10 +91,11 @@ public SafetyResult check(final P initPrec) { abstractorTime += stopwatch.elapsed(TimeUnit.MILLISECONDS) - abstractorStartTime; logger.write(Level.MAINSTEP, "| Checking abstraction done, result: %s%n", abstractorResult); - String argGraph = JSONWriter.getInstance().writeString(ArgVisualizer.getDefault().visualize(arg)); - String precString = prec.toString(); - - wdl.addIteration(iteration, argGraph, precString); + if (WebDebuggerLogger.enabled()) { + String argGraph = JSONWriter.getInstance().writeString(ArgVisualizer.getDefault().visualize(arg)); + String precString = prec.toString(); + wdl.addIteration(iteration, argGraph, precString); + } if (abstractorResult.isUnsafe()) { MonitorCheckpoint.Checkpoints.execute("CegarChecker.unsafeARG"); diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/debug/ARGWebDebugger.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/debug/ARGWebDebugger.java new file mode 100644 index 0000000000..92b2a67313 --- /dev/null +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/debug/ARGWebDebugger.java @@ -0,0 +1,135 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.analysis.algorithm.debug; + +import com.corundumstudio.socketio.Configuration; +import com.corundumstudio.socketio.SocketIOServer; +import hu.bme.mit.theta.analysis.Action; +import hu.bme.mit.theta.analysis.State; +import hu.bme.mit.theta.analysis.algorithm.ArgEdge; +import hu.bme.mit.theta.analysis.algorithm.ArgNode; + +import java.util.LinkedList; +import java.util.List; + + +/** + * Use http://leventebajczi.com/theta-debugger/ to connect to Theta and see the ARG being built. + * Modify the *debug* field below to true in order to enable the debugger. + */ + +public final class ARGWebDebugger { + public static boolean on = false; + private static final Integer PORT = 8080; + + private static SocketIOServer server; + private static final Object lock = new Object(); + private static volatile boolean received; + private static volatile boolean waiting; + + + private static final List replayLog = new LinkedList<>(); + + + private ARGWebDebugger() { + } + + private static void startServer() { + if (!on) return; + Configuration config = new Configuration(); + config.setPort(PORT); + + server = new SocketIOServer(config); + server.addEventListener("continue", String.class, (client, data, ackSender) -> { + received = true; + synchronized (lock) { + lock.notifyAll(); + } + }); + server.addConnectListener(client -> { + for (String s : replayLog) { + System.err.println("Replaying " + s); + client.sendEvent("message", s); + } + if (waiting) client.sendEvent("message", "{\"method\": \"wait\"}"); + }); + server.start(); + waitUntil(); + } + + private static void send(String data, boolean log) { + if (server == null) startServer(); + if (log) replayLog.add(data); + server.getAllClients().forEach(client -> client.sendEvent("message", data)); + } + + private static void waitUntil() { + if (server == null) startServer(); + send("{\"method\": \"wait\"}", false); + synchronized (lock) { + while (!received) { + waiting = true; + try { + lock.wait(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + received = false; // Reset for the next wait + waiting = false; + } + } + + private static String nodeToString(ArgNode node, A action) { + return "{\"name\": \"Node " + node.getId() + "\"," + + " \"attributes\": {" + + (action == null ? "" : "\"action\": \"" + action.toString().replaceAll("[\\n\\r\\t\"]", " ") + "\",") + + "\"state\": \"" + node.getState().toString().replaceAll("[\\n\\r\\t\"]", " ") + "\"" + "," + + "\"target\": \"" + node.isTarget() + "\"" + "}," + + " \"tooltip\": {" + + (action == null ? "" : "\"action\": \"" + action.toString().replaceAll("[\\n\\r\\t\"]", " ") + "\",") + + "\"state\": \"" + node.getState().toString().replaceAll("[\\n\\r\\t\"]", " ") + "\"" + "}," + + " \"id\": " + node.getId() + "}"; + } + + public static void create(ArgNode initNode) { + if (!on) { + return; + } + replayLog.clear(); + send("{\"method\": \"create\", \"node\": " + nodeToString(initNode, null) + "}", true); + waitUntil(); + } + + public static void add(ArgNode parent, + A action, + ArgNode child) { + if (!on) { + return; + } + send("{\"method\": \"add\", \"parent\": " + parent.getId() + ", \"child\": " + nodeToString(child, action) + "}", true); + waitUntil(); + } + + public static void remove(ArgEdge edge) { + if (!on) { + return; + } + send("{\"method\": \"delete\", \"parent\": " + edge.getSource().getId() + ", \"child\": " + edge.getTarget().getId() + "}", true); + waitUntil(); + } +} diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/imc/ImcChecker.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/imc/ImcChecker.java new file mode 100644 index 0000000000..2022615759 --- /dev/null +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/imc/ImcChecker.java @@ -0,0 +1,179 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.analysis.algorithm.imc; + +import com.google.common.base.Stopwatch; +import hu.bme.mit.theta.analysis.Trace; +import hu.bme.mit.theta.analysis.algorithm.ARG; +import hu.bme.mit.theta.analysis.algorithm.MonolithicTransFunc; +import hu.bme.mit.theta.analysis.algorithm.SafetyChecker; +import hu.bme.mit.theta.analysis.algorithm.SafetyResult; +import hu.bme.mit.theta.analysis.expr.ExprState; +import hu.bme.mit.theta.analysis.expr.StmtAction; +import hu.bme.mit.theta.analysis.unit.UnitPrec; +import hu.bme.mit.theta.core.decl.VarDecl; +import hu.bme.mit.theta.core.model.Valuation; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.utils.PathUtils; +import hu.bme.mit.theta.core.utils.indexings.VarIndexing; +import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory; +import hu.bme.mit.theta.solver.ItpMarker; +import hu.bme.mit.theta.solver.ItpPattern; +import hu.bme.mit.theta.solver.ItpSolver; +import hu.bme.mit.theta.solver.utils.WithPushPop; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.function.BiFunction; +import java.util.function.Function; + +import static hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.And; +import static hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.Not; +import static hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.Or; + + +public class ImcChecker implements SafetyChecker { + private final Expr trans; + private final Expr init; + private final Expr prop; + private final int upperBound; + private final ItpSolver solver; + private final VarIndexing firstIndexing; + private final VarIndexing offset; + private final Function valToState; + private final BiFunction valsToAction; + private final Collection> vars; + private final int timeout; + + public ImcChecker(MonolithicTransFunc transFunc, + int upperBound, + ItpSolver solver, + Function valToState, + Collection> vars, + BiFunction valsToAction) { + this(transFunc, upperBound, solver, valToState, valsToAction, vars, 0); + } + + public ImcChecker(MonolithicTransFunc transFunc, + int upperBound, + ItpSolver solver, + Function valToState, + BiFunction valsToAction, + Collection> vars, + int timeout) { + this.trans = transFunc.getTransExpr(); + this.init = transFunc.getInitExpr(); + this.prop = transFunc.getPropExpr(); + this.upperBound = upperBound; + this.solver = solver; + this.firstIndexing = transFunc.getInitIndexing(); + this.offset = transFunc.getOffsetIndexing(); + this.valToState = valToState; + this.valsToAction = valsToAction; + this.vars = vars; + this.timeout = timeout; + } + + + @Override + public SafetyResult check(UnitPrec prec) { + final Stopwatch sw = Stopwatch.createStarted(); + + int i = 0; + var exprsFromStart = new ArrayList<>(List.of(PathUtils.unfold(init, VarIndexingFactory.indexing(0)))); + var listOfIndexes = new ArrayList<>(List.of(firstIndexing)); + + final ItpMarker a = solver.createMarker(); + final ItpMarker b = solver.createMarker(); + final ItpPattern pattern = solver.createBinPattern(a, b); + + while (i < upperBound && (timeout == 0 || sw.elapsed(TimeUnit.SECONDS) < timeout)) { + i++; + var newIndex = listOfIndexes.get(i - 1).add(offset); + var expression = PathUtils.unfold(trans, listOfIndexes.get(i - 1)); + + exprsFromStart.add(expression); + listOfIndexes.add(newIndex); + + var unfoldedProp = Not(PathUtils.unfold(prop, newIndex)); + + solver.push(); + solver.add(a, And(exprsFromStart.subList(0, 2))); + solver.add(b, And(And(exprsFromStart.subList(2, exprsFromStart.size())), unfoldedProp)); + + + var img = exprsFromStart.get(0); + + var status = solver.check(); + if (!(timeout == 0 || sw.elapsed(TimeUnit.SECONDS) < timeout)) { + return null; + } + + if (status.isSat()) { + var stateList = new LinkedList(); + var actionList = new LinkedList(); + if (valToState != null && valsToAction != null) { + Valuation lastValuation = null; + for (int j = 0; j < listOfIndexes.size(); j++) { + VarIndexing listOfIndex = listOfIndexes.get(j); + var valuation = PathUtils.extractValuation(solver.getModel(), listOfIndex, vars); + stateList.add(valToState.apply(valuation)); + if (j > 0) { + actionList.add(valsToAction.apply(lastValuation, valuation)); + } + lastValuation = valuation; + } + } + Trace trace = Trace.of(stateList, actionList); + return SafetyResult.unsafe(trace, ARG.create(null)); + } + // reached fixed point + while (status.isUnsat()) { + var interpolant = solver.getInterpolant(pattern); + var itpFormula = PathUtils.unfold(PathUtils.foldin(interpolant.eval(a), listOfIndexes.get(1)), listOfIndexes.get(0)); + solver.pop(); + try (var pps = new WithPushPop(solver)) { + solver.add(a, And(itpFormula, Not(img))); + if (solver.check().isUnsat()) { + return SafetyResult.safe(ARG.create((state1, state2) -> false)); + } else if (!(timeout == 0 || sw.elapsed(TimeUnit.SECONDS) < timeout)) { + return null; + } + } + img = Or(img, itpFormula); + + solver.push(); + solver.add(a, And(itpFormula, exprsFromStart.get(1))); + solver.add(b, And(And(exprsFromStart.subList(2, exprsFromStart.size())), unfoldedProp)); + + status = solver.check(); + if (!(timeout == 0 || sw.elapsed(TimeUnit.SECONDS) < timeout)) { + return null; + } + } + solver.pop(); + + } + return null; + } + + +} + diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/kind/KIndChecker.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/kind/KIndChecker.java new file mode 100644 index 0000000000..e7684b9bba --- /dev/null +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/kind/KIndChecker.java @@ -0,0 +1,197 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.analysis.algorithm.kind; + + +import hu.bme.mit.theta.analysis.Trace; +import hu.bme.mit.theta.analysis.algorithm.ARG; +import hu.bme.mit.theta.analysis.algorithm.MonolithicTransFunc; +import hu.bme.mit.theta.analysis.algorithm.SafetyChecker; +import hu.bme.mit.theta.analysis.algorithm.SafetyResult; +import hu.bme.mit.theta.analysis.expr.ExprAction; +import hu.bme.mit.theta.analysis.expr.ExprState; +import hu.bme.mit.theta.analysis.unit.UnitPrec; +import hu.bme.mit.theta.core.decl.VarDecl; +import hu.bme.mit.theta.core.model.Valuation; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.utils.PathUtils; +import hu.bme.mit.theta.core.utils.indexings.VarIndexing; +import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory; +import hu.bme.mit.theta.solver.Solver; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedList; +import java.util.function.BiFunction; +import java.util.function.Function; + +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; +import static hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.And; +import static hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.Not; + + +public class KIndChecker implements SafetyChecker { + private final Expr trans; + private final Expr init; + private final Expr prop; + private final int upperBound; + private final int inductionStartBound; + private final int inductionFrequency; + private final Solver solver1; + private final Solver solver2; + private final VarIndexing firstIndexing; + private final VarIndexing offset; + private final Function valToState; + private final BiFunction valsToAction; + private final Collection> vars; + + + public KIndChecker(MonolithicTransFunc transFunc, + int upperBound, + int inductionStartBound, + int inductionFrequency, + Solver solver1, + Solver solver2, + Function valToState, + BiFunction valsToAction, + Collection> vars) { + this.trans = transFunc.getTransExpr(); + this.init = transFunc.getInitExpr(); + this.prop = transFunc.getPropExpr(); + this.upperBound = upperBound; + this.inductionStartBound = inductionStartBound; + this.inductionFrequency = inductionFrequency; + this.solver1 = solver1; + this.solver2 = solver2; + this.firstIndexing = transFunc.getInitIndexing(); + this.offset = transFunc.getOffsetIndexing(); + this.valToState = valToState; + this.valsToAction = valsToAction; + this.vars = vars; + } + + + @Override + public SafetyResult check(UnitPrec prec) { + int i = 0; + var currIndex = firstIndexing; + + + var listOfIndexes = new ArrayList(); + + solver1.add(PathUtils.unfold(init, VarIndexingFactory.indexing(0))); + var eqList = new ArrayList>(); + while (i < upperBound) { + // BMC part + + solver1.add(PathUtils.unfold(trans, currIndex)); + + var finalList = new ArrayList>(); + + for (int j = 0; j < listOfIndexes.size(); j++) { + var tempList = new ArrayList>(); + for (var v : vars) { + tempList.add(Eq(PathUtils.unfold(v.getRef(), currIndex), PathUtils.unfold(v.getRef(), listOfIndexes.get(j)))); + } + finalList.add(Not(And(tempList))); + } + eqList.addAll(finalList); + listOfIndexes.add(currIndex); + + var lastIndex = currIndex; + + currIndex = currIndex.add(offset); + + // Checking loop free path of length i + + solver1.push(); + solver1.add(eqList); + + if (solver1.check().isUnsat()) { + + return SafetyResult.safe(ARG.create(null)); + } + solver1.pop(); + + // Counterexample feasibility check + + // I1 and T1-2 and T2-3 and ... and Tk-1-k + + // Not Pk + solver1.push(); + solver1.add(PathUtils.unfold(Not(prop), currIndex)); + + if (solver1.check().isSat()) { + // otherwise trace is cut off before last action + listOfIndexes.add(currIndex); + var stateList = new LinkedList(); + var actionList = new LinkedList(); + if (valToState != null && valsToAction != null) { + Valuation lastValuation = null; + for (int j = 0; j < listOfIndexes.size(); j++) { + VarIndexing listOfIndex = listOfIndexes.get(j); + var valuation = PathUtils.extractValuation(solver1.getModel(), listOfIndex, vars); + stateList.add(valToState.apply(valuation)); + if (j > 0) { + actionList.add(valsToAction.apply(lastValuation, valuation)); + } + lastValuation = valuation; + } + } else { + stateList.add((S) new ExprState() { + @Override + public Expr toExpr() { + return True(); + } + + @Override + public boolean isBottom() { + return false; + } + }); + } + Trace trace = Trace.of(stateList, actionList); + return SafetyResult.unsafe(trace, ARG.create(null)); + } + solver1.pop(); + + // KIND part + + // P1 and T1-2 and P2 and ... and Tk-k+1 + + solver2.add(PathUtils.unfold(prop, lastIndex.sub(firstIndexing))); + solver2.add(PathUtils.unfold(trans, lastIndex.sub(firstIndexing))); + + // Not Pk+1 + if (i >= inductionStartBound && (i - inductionStartBound) % inductionFrequency == 0) { + solver2.push(); + solver2.add(PathUtils.unfold(Not(prop), currIndex.sub(firstIndexing))); + + if (solver2.check().isUnsat()) { + return SafetyResult.safe(ARG.create(null)); + } + solver2.pop(); + } + i++; + } + return null; + } + + +} diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/mcm/analysis/FiniteStateChecker.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/mcm/analysis/FiniteStateChecker.kt index 76cde6ac78..1467f4a721 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/mcm/analysis/FiniteStateChecker.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/mcm/analysis/FiniteStateChecker.kt @@ -33,6 +33,9 @@ import hu.bme.mit.theta.graphsolver.patterns.constraints.GraphConstraint import hu.bme.mit.theta.graphsolver.solvers.GraphSolver import java.util.* +/** + * WiP checker for finite-state systems + */ class FiniteStateChecker( private val mcm: Collection, private val initFunc: InitFunc, diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/mcm/analysis/PartialSolver.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/mcm/analysis/PartialSolver.kt index 0ac91921ff..f64477a609 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/mcm/analysis/PartialSolver.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/mcm/analysis/PartialSolver.kt @@ -23,6 +23,9 @@ import hu.bme.mit.theta.graphsolver.compilers.GraphPatternCompiler import hu.bme.mit.theta.graphsolver.patterns.constraints.GraphConstraint import hu.bme.mit.theta.graphsolver.solvers.GraphSolver +/** + * WiP solver for memory-model related tasks. + */ class PartialSolver( private val mcm: Collection, private val partialGraph: CandidateExecutionGraph, diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/expr/refinement/SingleExprTraceRefiner.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/expr/refinement/SingleExprTraceRefiner.java index f95cfbacc6..d1b406ff1e 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/expr/refinement/SingleExprTraceRefiner.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/expr/refinement/SingleExprTraceRefiner.java @@ -83,9 +83,7 @@ public RefinerResult refine(final ARG arg, final P prec) { checkNotNull(prec); assert !arg.isSafe() : "ARG must be unsafe"; - // TODO use CexMonitor lastCex somehow? - // TODO and maybe later smarten ArgTrace up a bit so monitor does not have to explicitly be here? - Optional> optionalNewCex = arg.getCexs().findFirst(); //filter(cex -> ArgCexCheckHandler.instance.checkIfCounterexampleNew(cex)).findFirst(); + Optional> optionalNewCex = arg.getCexs().findFirst(); final ArgTrace cexToConcretize = optionalNewCex.get(); final Trace traceToConcretize = cexToConcretize.toTrace(); @@ -108,9 +106,6 @@ public RefinerResult refine(final ARG arg, final P prec) { assert 0 <= pruneIndex : "Pruning index must be non-negative"; assert pruneIndex <= cexToConcretize.length() : "Pruning index larger than cex length"; - // TODO change to CexMonitor (right now it is added earlier on, but with mitigation and more options that will have to change) - // ArgCexCheckHandler.instance.addCounterexample(cexToConcretize); - switch (pruneStrategy) { case LAZY: logger.write(Level.SUBSTEP, "| | Pruning from index %d...", pruneIndex); diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/pred/PredAbstractors.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/pred/PredAbstractors.java index 863a8802ad..2fbaf2b9e1 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/pred/PredAbstractors.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/pred/PredAbstractors.java @@ -15,6 +15,7 @@ */ package hu.bme.mit.theta.analysis.pred; +import hu.bme.mit.theta.analysis.expr.ExprAction; import hu.bme.mit.theta.common.container.Containers; import hu.bme.mit.theta.core.decl.ConstDecl; import hu.bme.mit.theta.core.decl.Decls; @@ -23,6 +24,7 @@ import hu.bme.mit.theta.core.type.LitExpr; import hu.bme.mit.theta.core.type.booltype.BoolExprs; import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.utils.ExprUtils; import hu.bme.mit.theta.core.utils.PathUtils; import hu.bme.mit.theta.core.utils.indexings.VarIndexing; import hu.bme.mit.theta.solver.Solver; @@ -69,6 +71,15 @@ public interface PredAbstractor { Collection createStatesForExpr(final Expr expr, final VarIndexing exprIndexing, final PredPrec prec, final VarIndexing precIndexing); + + default Collection createStatesForExpr(final Expr expr, + final VarIndexing exprIndexing, + final PredPrec prec, + final VarIndexing precIndexing, + final PredState state, + final ExprAction action) { + return createStatesForExpr(expr, exprIndexing, prec, precIndexing); + } } /** @@ -225,5 +236,23 @@ public Collection createStatesForExpr(final Expr expr, return Collections.singleton(PredState.of(newStatePreds)); } + @Override + public Collection createStatesForExpr(final Expr expr, + final VarIndexing exprIndexing, + final PredPrec prec, + final VarIndexing precIndexing, + final PredState state, + final ExprAction action) { + var actionExpr = action.toExpr(); + if (actionExpr.equals(True())) { + var filteredPreds = state.getPreds().stream().filter(p -> { + var vars = ExprUtils.getVars(p); + var indexing = action.nextIndexing(); + return vars.stream().allMatch(v -> indexing.get(v) == 0); + }).collect(Collectors.toList()); + return Collections.singleton(PredState.of(filteredPreds)); + } + return createStatesForExpr(expr, exprIndexing, prec, precIndexing); + } } } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/pred/PredTransFunc.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/pred/PredTransFunc.java index fa243f4fcb..b5ac6c5e2e 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/pred/PredTransFunc.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/pred/PredTransFunc.java @@ -50,7 +50,7 @@ public Collection getSuccStates(final PredState state, final Collection succStates = predAbstractor.createStatesForExpr( And(state.toExpr(), action.toExpr()), VarIndexingFactory.indexing(0), prec, - action.nextIndexing()); + action.nextIndexing(), state, action); return succStates.isEmpty() ? Collections.singleton(PredState.bottom()) : succStates; } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/runtimemonitor/CexMonitor.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/runtimemonitor/CexMonitor.kt index 610d19d97a..b35c793418 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/runtimemonitor/CexMonitor.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/runtimemonitor/CexMonitor.kt @@ -24,10 +24,15 @@ import hu.bme.mit.theta.common.exception.NotSolvableException import hu.bme.mit.theta.common.logging.Logger import java.lang.RuntimeException - -// TODO implement mitigation +/** + * This monitor checks whether a new counterexample is found during the current iteration of CEGAR. + * In most cases, finding the same counterexample again means that refinement is not progressing. + * Warning: With some configurations (e.g. lazy pruning) it is NOT impossible that analysis will + * progress even if in some iterations a new cex is not found, but seems to be rare. + * However, if you think analysis should NOT be stopped by this monitor, disable it and check results. + */ class CexMonitor constructor( - private val mitigate: Boolean, private val logger: Logger, private val arg: ARG + private val logger: Logger, private val arg: ARG ) : Monitor { private val cexHashStorage = CexHashStorage() diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/runtimemonitor/MonitorCheckpoint.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/runtimemonitor/MonitorCheckpoint.kt index b2245ffff0..3bb29c352f 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/runtimemonitor/MonitorCheckpoint.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/runtimemonitor/MonitorCheckpoint.kt @@ -60,5 +60,13 @@ class MonitorCheckpoint internal constructor(private val name: String) { { "Checkpoint name $name was not registered (add it in MonitorCheckpoint.kt)" } // see checkpointNames above registeredCheckpoints[name]?.executeCheckpoint() ?: error("Checkpoint with name $name not found.") } + + fun reset() { + registeredCheckpoints.values.forEach { it.reset() } + } + } + + private fun reset() { + registeredMonitors.clear() } } \ No newline at end of file diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/runtimemonitor/container/CexHashStorage.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/runtimemonitor/container/CexHashStorage.kt index ba42658891..d1dc1d49a1 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/runtimemonitor/container/CexHashStorage.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/runtimemonitor/container/CexHashStorage.kt @@ -17,6 +17,7 @@ package hu.bme.mit.theta.analysis.runtimemonitor.container import hu.bme.mit.theta.analysis.Action import hu.bme.mit.theta.analysis.State +import hu.bme.mit.theta.analysis.algorithm.ArgStructuralEquality import hu.bme.mit.theta.analysis.algorithm.ArgTrace class CexHashStorage : @@ -24,10 +25,10 @@ class CexHashStorage : private val counterexamples: MutableSet = LinkedHashSet() override fun addData(newData: ArgTrace?) { - counterexamples.add(newData.hashCode()) + counterexamples.add(ArgStructuralEquality.hashCode(newData)) } override operator fun contains(data: ArgTrace?): Boolean { - return counterexamples.contains(data.hashCode()) + return counterexamples.contains(ArgStructuralEquality.hashCode(data)) } } \ No newline at end of file diff --git a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/ArgStructuralEqualityTest.java b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/ArgStructuralEqualityTest.java new file mode 100644 index 0000000000..cc79435be3 --- /dev/null +++ b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/ArgStructuralEqualityTest.java @@ -0,0 +1,73 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.analysis.algorithm; + +import hu.bme.mit.theta.analysis.Action; +import hu.bme.mit.theta.analysis.State; +import hu.bme.mit.theta.analysis.stubs.ActionStub; +import hu.bme.mit.theta.analysis.stubs.PartialOrdStub; +import hu.bme.mit.theta.analysis.stubs.StateStub; +import org.junit.Assert; +import org.junit.Test; + +public class ArgStructuralEqualityTest { + + private static ARG createArg(boolean variant) { + ARG arg = ARG.create(new PartialOrdStub()); + Action act = new ActionStub("A"); + + ArgNode s0 = arg.createInitNode(new StateStub("s0"), false); + ArgNode s10 = arg.createSuccNode(s0, act, new StateStub("s10"), + false); + ArgNode s20 = arg.createSuccNode(s10, act, new StateStub("s20"), + true); + ArgNode s21 = arg.createSuccNode(s10, act, new StateStub("s21"), + false); + ArgNode s11 = arg.createSuccNode(s0, act, new StateStub("s11"), + true); + if (variant) { + ArgNode s12a = arg.createSuccNode(s0, act, new StateStub("s12a"), + false); + } else { + ArgNode s12b = arg.createSuccNode(s0, act, new StateStub("s12b"), + false); + } + return arg; + } + + @Test + public void testARGEquals() { + var arg1 = createArg(true); + var arg2 = createArg(true); + var arg3 = createArg(false); + + Assert.assertNotEquals("Reference-based equality", arg1, arg2); + Assert.assertTrue("Structural equality (true)", ArgStructuralEquality.equals(arg1, arg2)); + Assert.assertFalse("Structural equality (false)", ArgStructuralEquality.equals(arg1, arg3)); + } + + @Test + public void testARGHashCode() { + var arg1 = createArg(true); + var arg2 = createArg(true); + var arg3 = createArg(false); + + Assert.assertNotEquals("Reference-based hashcode", arg1.hashCode(), arg2.hashCode()); + Assert.assertEquals("Structural hashcode (true)", ArgStructuralEquality.hashCode(arg1), ArgStructuralEquality.hashCode(arg2)); + Assert.assertNotEquals("Structural hashcode (false)", ArgStructuralEquality.hashCode(arg1), ArgStructuralEquality.hashCode(arg3)); + } + +} diff --git a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/ExprActionStub.java b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/ExprActionStub.java new file mode 100644 index 0000000000..1c4e510de2 --- /dev/null +++ b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/ExprActionStub.java @@ -0,0 +1,36 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.analysis.algorithm; + +import hu.bme.mit.theta.analysis.expr.StmtAction; +import hu.bme.mit.theta.core.stmt.Stmt; + +import java.util.List; + +class ExprActionStub extends StmtAction { + + private final List stmts; + + ExprActionStub(List stmts) { + this.stmts = stmts; + } + + @Override + public List getStmts() { + return null; + } +} diff --git a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/ExprStateStub.java b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/ExprStateStub.java new file mode 100644 index 0000000000..3d6edce4ab --- /dev/null +++ b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/ExprStateStub.java @@ -0,0 +1,34 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.analysis.algorithm; + +import hu.bme.mit.theta.analysis.expr.ExprState; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.booltype.BoolType; + +record ExprStateStub(Expr expr) implements ExprState { + + @Override + public boolean isBottom() { + return false; + } + + @Override + public Expr toExpr() { + return expr; + } +} diff --git a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/IMCTest.java b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/IMCTest.java new file mode 100644 index 0000000000..3a62a40dca --- /dev/null +++ b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/IMCTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.analysis.algorithm; + +import hu.bme.mit.theta.analysis.algorithm.imc.ImcChecker; +import hu.bme.mit.theta.solver.z3.Z3SolverFactory; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static hu.bme.mit.theta.core.decl.Decls.Var; +import static hu.bme.mit.theta.core.stmt.Stmts.Assign; +import static hu.bme.mit.theta.core.stmt.Stmts.Assume; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Add; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Mul; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Neq; + +class IMCTest { + @Test + void testIMCFalse() { + var x = Var("x", Int()); + var checker = new ImcChecker( + new MonolithicTransFuncStub( + Assign(x, Add(x.getRef(), Int(1))), + Eq(x.getRef(), Int(0)), + Neq(x.getRef(), Int(5)) + ), + Integer.MAX_VALUE, + Z3SolverFactory.getInstance().createItpSolver(), + valuation -> new ExprStateStub(valuation.toExpr()), + (valuation, valuation2) -> new ExprActionStub(List.of(Assume(valuation.toExpr()), Assume(valuation2.toExpr()))), + List.of(x), + 0 + ); + + var result = checker.check(null); + Assertions.assertTrue(result.isUnsafe()); + } + + @Test + void testIMCTrue() { + var x = Var("x", Int()); + var checker = new ImcChecker( + new MonolithicTransFuncStub( + Assign(x, Mul(x.getRef(), Int(2))), + Eq(x.getRef(), Int(0)), + Neq(x.getRef(), Int(5)) + ), + Integer.MAX_VALUE, + Z3SolverFactory.getInstance().createItpSolver(), + valuation -> new ExprStateStub(valuation.toExpr()), + (valuation, valuation2) -> new ExprActionStub(List.of(Assume(valuation.toExpr()), Assume(valuation2.toExpr()))), + List.of(x), + 0 + ); + + var result = checker.check(null); + Assertions.assertTrue(result.isSafe()); + } + + +} diff --git a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/KIndTest.java b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/KIndTest.java new file mode 100644 index 0000000000..1a55273085 --- /dev/null +++ b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/KIndTest.java @@ -0,0 +1,82 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.analysis.algorithm; + +import hu.bme.mit.theta.analysis.algorithm.kind.KIndChecker; +import hu.bme.mit.theta.solver.z3.Z3SolverFactory; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static hu.bme.mit.theta.core.decl.Decls.Var; +import static hu.bme.mit.theta.core.stmt.Stmts.Assign; +import static hu.bme.mit.theta.core.stmt.Stmts.Assume; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Add; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Mul; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Neq; + +class KIndTest { + @Test + void testKindFalse() { + var x = Var("x", Int()); + var checker = new KIndChecker( + new MonolithicTransFuncStub( + Assign(x, Add(x.getRef(), Int(1))), + Eq(x.getRef(), Int(0)), + Neq(x.getRef(), Int(5)) + ), + Integer.MAX_VALUE, + 0, + 1, + Z3SolverFactory.getInstance().createSolver(), + Z3SolverFactory.getInstance().createSolver(), + valuation -> new ExprStateStub(valuation.toExpr()), + (valuation, valuation2) -> new ExprActionStub(List.of(Assume(valuation.toExpr()), Assume(valuation2.toExpr()))), + List.of(x) + ); + + var result = checker.check(null); + Assertions.assertTrue(result.isUnsafe()); + } + + @Test + void testKindTrue() { + var x = Var("x", Int()); + var checker = new KIndChecker( + new MonolithicTransFuncStub( + Assign(x, Mul(x.getRef(), Int(2))), + Eq(x.getRef(), Int(0)), + Neq(x.getRef(), Int(5)) + ), + Integer.MAX_VALUE, + 0, + 1, + Z3SolverFactory.getInstance().createSolver(), + Z3SolverFactory.getInstance().createSolver(), + valuation -> new ExprStateStub(valuation.toExpr()), + (valuation, valuation2) -> new ExprActionStub(List.of(Assume(valuation.toExpr()), Assume(valuation2.toExpr()))), + List.of(x) + ); + + var result = checker.check(null); + Assertions.assertTrue(result.isSafe()); + } + + +} diff --git a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/MonolithicTransFuncStub.java b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/MonolithicTransFuncStub.java new file mode 100644 index 0000000000..06f727d368 --- /dev/null +++ b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/MonolithicTransFuncStub.java @@ -0,0 +1,73 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.analysis.algorithm; + +import hu.bme.mit.theta.core.stmt.Stmt; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.utils.StmtUtils; +import hu.bme.mit.theta.core.utils.indexings.VarIndexing; +import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory; + +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.And; + +public final class MonolithicTransFuncStub implements MonolithicTransFunc { + private final Expr transExpr; + private final Expr initExpr; + private final Expr propExpr; + private final VarIndexing initIndexing; + private final VarIndexing offsetIndexing; + + public MonolithicTransFuncStub( + Stmt transStmt, + Expr initExpr, + Expr propExpr + ) { + var result = StmtUtils.toExpr(transStmt, VarIndexingFactory.indexing(0)); + this.transExpr = And(result.getExprs()); + this.initExpr = initExpr; + this.propExpr = propExpr; + this.initIndexing = VarIndexingFactory.indexing(0); + this.offsetIndexing = result.getIndexing(); + } + + @Override + public Expr getTransExpr() { + return transExpr; + } + + @Override + public Expr getInitExpr() { + return initExpr; + } + + @Override + public Expr getPropExpr() { + return propExpr; + } + + @Override + public VarIndexing getInitIndexing() { + return initIndexing; + } + + @Override + public VarIndexing getOffsetIndexing() { + return offsetIndexing; + } + +} diff --git a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/stubs/ActionStub.java b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/stubs/ActionStub.java index 43bc32dc39..80cc43ed0b 100644 --- a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/stubs/ActionStub.java +++ b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/stubs/ActionStub.java @@ -17,6 +17,8 @@ import hu.bme.mit.theta.analysis.Action; +import java.util.Objects; + public class ActionStub implements Action { private final String label; @@ -29,4 +31,17 @@ public ActionStub(final String label) { public String toString() { return label; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ActionStub that = (ActionStub) o; + return Objects.equals(label, that.label); + } + + @Override + public int hashCode() { + return Objects.hash(label); + } } diff --git a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/stubs/StateStub.java b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/stubs/StateStub.java index e2206a07e3..ccfddf4410 100644 --- a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/stubs/StateStub.java +++ b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/stubs/StateStub.java @@ -17,6 +17,8 @@ import hu.bme.mit.theta.analysis.State; +import java.util.Objects; + public class StateStub implements State { private final String label; @@ -35,4 +37,16 @@ public String toString() { return label; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + StateStub stateStub = (StateStub) o; + return Objects.equals(label, stateStub.label); + } + + @Override + public int hashCode() { + return Objects.hash(label); + } } diff --git a/subprojects/common/common/src/main/java/hu/bme/mit/theta/common/logging/StderrLogger.java b/subprojects/common/common/src/main/java/hu/bme/mit/theta/common/logging/UniqueWarningLogger.java similarity index 70% rename from subprojects/common/common/src/main/java/hu/bme/mit/theta/common/logging/StderrLogger.java rename to subprojects/common/common/src/main/java/hu/bme/mit/theta/common/logging/UniqueWarningLogger.java index d83267e88c..bf0ff97430 100644 --- a/subprojects/common/common/src/main/java/hu/bme/mit/theta/common/logging/StderrLogger.java +++ b/subprojects/common/common/src/main/java/hu/bme/mit/theta/common/logging/UniqueWarningLogger.java @@ -16,18 +16,25 @@ package hu.bme.mit.theta.common.logging; import java.io.PrintStream; +import java.util.LinkedHashSet; +import java.util.Set; -public final class StderrLogger extends BaseLogger { +public final class UniqueWarningLogger extends BaseLogger { private static final PrintStream CONSOLE = System.err; + private final Set messages; - public StderrLogger(final Level minLevel) { + public UniqueWarningLogger(final Level minLevel) { super(minLevel); + messages = new LinkedHashSet<>(); } @Override protected void writeStr(final String str) { - CONSOLE.print(str); + if (!messages.contains(str)) { + messages.add(str); + CONSOLE.print(str); + } } } diff --git a/subprojects/common/common/src/main/java/hu/bme/mit/theta/common/visualization/WebDebuggerLogger.java b/subprojects/common/common/src/main/java/hu/bme/mit/theta/common/visualization/WebDebuggerLogger.java index 1948e13bca..750145c9ab 100644 --- a/subprojects/common/common/src/main/java/hu/bme/mit/theta/common/visualization/WebDebuggerLogger.java +++ b/subprojects/common/common/src/main/java/hu/bme/mit/theta/common/visualization/WebDebuggerLogger.java @@ -36,6 +36,10 @@ public static void enableWebDebuggerLogger() { enabled = true; } + public static Boolean enabled() { + return enabled; + } + public static WebDebuggerLogger getInstance() { return instance; } @@ -70,7 +74,9 @@ private String getFileContent() { for (String trace : traces) { sb.append("\"").append(trace).append("\"").append(",\n"); } - sb.deleteCharAt(sb.length() - 1); + if (!traces.isEmpty()) { + sb.deleteCharAt(sb.length() - 1); + } sb.append("]").append(System.lineSeparator()); sb.append("}"); return sb.toString(); diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/model/ImmutableValuation.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/model/ImmutableValuation.java index 184c07fb90..4c2ff27300 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/model/ImmutableValuation.java +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/model/ImmutableValuation.java @@ -15,21 +15,20 @@ */ package hu.bme.mit.theta.core.model; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; - -import java.util.Collection; -import java.util.Map; -import java.util.Optional; - import com.google.common.collect.ImmutableMap; - import hu.bme.mit.theta.core.decl.Decl; import hu.bme.mit.theta.core.type.Expr; import hu.bme.mit.theta.core.type.LitExpr; import hu.bme.mit.theta.core.type.Type; import hu.bme.mit.theta.core.type.booltype.BoolType; +import java.util.Collection; +import java.util.Map; +import java.util.Optional; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + /** * Basic, immutable implementation of a valuation. The inner builder class can be used to create a * new instance. @@ -60,6 +59,14 @@ public static ImmutableValuation copyOf(final Valuation val) { } } + public static ImmutableValuation from(final Map, LitExpr> map) { + final Builder builder = builder(); + for (final Decl decl : map.keySet()) { + builder.put(decl, map.get(decl)); + } + return builder.build(); + } + public static ImmutableValuation empty() { return LazyHolder.EMPTY; } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.java index 857e6dd188..deb29cfc5d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.java +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.java @@ -251,9 +251,7 @@ public int hashCode() { @Override public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass() && getType().equals(((FpLitExpr) obj).getType())) { + if (obj != null && this.getClass() == obj.getClass() && getType().equals(((FpLitExpr) obj).getType())) { return eq((FpLitExpr) obj).equals(BoolExprs.True()); } else { return false; diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.java index 936c3a1674..7bddedee0b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.java +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.java @@ -78,7 +78,16 @@ public IntLitExpr pos() { } public IntLitExpr div(final IntLitExpr that) { - return IntLitExpr.of(this.value.divide(that.value)); + // Semantics: + // 5 div 3 = 1 + // 5 div -3 = -1 + // -5 div 3 = -2 + // -5 div -3 = 2 + var result = this.value.divide(that.value); + if (this.value.compareTo(BigInteger.ZERO) < 0 && this.value.mod(that.value.abs()).compareTo(BigInteger.ZERO) != 0) { + result = result.subtract(BigInteger.valueOf(that.value.signum())); + } + return IntLitExpr.of(result); } public IntLitExpr mod(final IntLitExpr that) { diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java index 9b02f1a457..a42549b81b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java @@ -145,7 +145,7 @@ import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.SimplifierLevel.*; +import static hu.bme.mit.theta.core.utils.SimplifierLevel.LITERAL_ONLY; public final class ExprSimplifier { @@ -2004,10 +2004,6 @@ private Expr simplifyFpEq(final FpEqExpr expr, final Valuation val) { if (leftOp instanceof FpLitExpr && rightOp instanceof FpLitExpr) { return Bool(leftOp.equals(rightOp)); - } else if (leftOp instanceof RefExpr && rightOp instanceof RefExpr) { - if (level != LITERAL_ONLY && leftOp.equals(rightOp)) { - return True(); - } } return expr.with(leftOp, rightOp); diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/VarPoolUtil.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/VarPoolUtil.java index 96c768c58e..a58afbe670 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/VarPoolUtil.java +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/VarPoolUtil.java @@ -33,7 +33,7 @@ private VarPoolUtil() { public static VarDecl requestInt() { if (intPool.isEmpty()) { - return Decls.Var("temp" + counter++, Int()); + return Decls.Var("__temp_" + counter++, Int()); } else { return intPool.remove(); } diff --git a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java index e313f18583..b547b0d806 100644 --- a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java +++ b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java @@ -231,6 +231,19 @@ public void testIntToRat() { } } + @Test + public void testDiv() { + assertEquals(Int(1), evaluate(Div(Int(5), Int(3)))); + assertEquals(Int(-1), evaluate(Div(Int(5), Int(-3)))); + assertEquals(Int(-2), evaluate(Div(Int(-5), Int(3)))); + assertEquals(Int(2), evaluate(Div(Int(-5), Int(-3)))); + + assertEquals(Int(2), evaluate(Div(Int(6), Int(3)))); + assertEquals(Int(-2), evaluate(Div(Int(6), Int(-3)))); + assertEquals(Int(-2), evaluate(Div(Int(-6), Int(3)))); + assertEquals(Int(2), evaluate(Div(Int(-6), Int(-3)))); + } + @Test public void testMod() { assertEquals(Int(2), evaluate(Mod(Int(2), Int(3)))); diff --git a/subprojects/frontends/c-frontend/src/main/antlr/C.g4 b/subprojects/frontends/c-frontend/src/main/antlr/C.g4 index e6ea2c984e..e8cb557d48 100644 --- a/subprojects/frontends/c-frontend/src/main/antlr/C.g4 +++ b/subprojects/frontends/c-frontend/src/main/antlr/C.g4 @@ -31,7 +31,8 @@ grammar C; primaryExpression - : Identifier # primaryExpressionId + : '__PRETTY_FUNC__' # gccPrettyFunc + | Identifier # primaryExpressionId | Constant # primaryExpressionConstant | StringLiteral+ # primaryExpressionStrings | '(' expression ')' # primaryExpressionBraceExpression diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/FrontendMetadata.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/FrontendMetadata.java index a4a12d669e..5b6edef1ef 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/FrontendMetadata.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/FrontendMetadata.java @@ -17,41 +17,59 @@ package hu.bme.mit.theta.frontend; import hu.bme.mit.theta.common.Tuple2; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.frontend.transformation.model.types.complex.CComplexType; +import org.jetbrains.annotations.NotNull; import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.Map; import java.util.Optional; -import java.util.Set; import static com.google.common.base.Preconditions.checkNotNull; public class FrontendMetadata { - private final Map, Set> lookupOwner = new LinkedHashMap<>(); - private final Map, Map> lookupKeyValue = new LinkedHashMap<>(); + private final Map> lookupKeyValue; + private final Map, Integer>, CComplexType> types; + public FrontendMetadata() { + this.lookupKeyValue = new LinkedHashMap<>(); + this.types = new LinkedHashMap<>(); + } - public Set lookupMetadata(String key, T value) { - return lookupOwner.getOrDefault(Tuple2.of(key, value), Set.of()); + public FrontendMetadata(@NotNull Map> lookupKeyValue) { + this.lookupKeyValue = new LinkedHashMap<>(lookupKeyValue); + this.types = new LinkedHashMap<>(); } public Map lookupMetadata(X owner) { - return lookupKeyValue.getOrDefault(Tuple2.of(owner, getHashCode(owner)), Map.of()); + return lookupKeyValue.getOrDefault(getHashCode(owner), Map.of()); } public Optional getMetadataValue(X owner, String key) { - return Optional.ofNullable(lookupKeyValue.getOrDefault(Tuple2.of(owner, getHashCode(owner)), Map.of()).get(key)); + if (owner instanceof Expr && key.equals("cType")) { + Tuple2, Integer> pair = Tuple2.of((Expr) owner, System.identityHashCode(owner)); + return Optional.ofNullable(types.get(pair)); + } + return Optional.ofNullable(lookupKeyValue.getOrDefault(getHashCode(owner), Map.of()).get(key)); } public void create(X owner, String key, T value) { checkNotNull(value); - Tuple2 tup = Tuple2.of(key, value); - Set set = lookupOwner.getOrDefault(tup, new LinkedHashSet<>()); - set.add(owner); - lookupOwner.put(tup, set); - Map keyvalues = lookupKeyValue.getOrDefault(Tuple2.of(owner, getHashCode(owner)), new LinkedHashMap<>()); - keyvalues.put(key, value); - lookupKeyValue.put(Tuple2.of(owner, getHashCode(owner)), keyvalues); + if (owner instanceof Expr && key.equals("cType") && value instanceof CComplexType) { + Tuple2, Integer> pair = Tuple2.of((Expr) owner, System.identityHashCode(owner)); +// if (types.containsKey(pair) && types.get(pair).getClass() != value.getClass()) { +// throw new RuntimeException("Expression (" + owner + ") already has a different type: " + types.get(pair) + ". New type: " + value); +// } + types.put(pair, (CComplexType) value); + } else { + Map keyvalues = lookupKeyValue.getOrDefault(getHashCode(owner), new LinkedHashMap<>()); + keyvalues.put(key, value); + lookupKeyValue.put(getHashCode(owner), keyvalues); + } + } + + public Map> getLookupKeyValue() { + return new LinkedHashMap<>(lookupKeyValue); } private static int getHashCode(Object object) { diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/ParseContext.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/ParseContext.java index 70d6c03e79..0de0ef1bab 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/ParseContext.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/ParseContext.java @@ -19,12 +19,15 @@ import hu.bme.mit.theta.frontend.transformation.ArchitectureConfig.ArchitectureType; import hu.bme.mit.theta.frontend.transformation.ArchitectureConfig.ArithmeticType; import hu.bme.mit.theta.frontend.transformation.CStmtCounter; -import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.BitwiseOption; +import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.ArithmeticTrait; + +import java.util.LinkedHashSet; +import java.util.Set; public class ParseContext { private final FrontendMetadata metadata; private final CStmtCounter cStmtCounter; - private BitwiseOption bitwiseOption; + private Set arithmeticTraits = new LinkedHashSet<>(); private ArchitectureType architecture = ArchitectureType.ILP32; private Boolean multiThreading = false; private ArithmeticType arithmetic = ArithmeticType.efficient; @@ -34,16 +37,32 @@ public ParseContext() { cStmtCounter = new CStmtCounter(); } + public ParseContext( + final FrontendMetadata metadata, + final CStmtCounter cStmtCounter, + final Set arithmeticTraits, + final ArchitectureType architecture, + final Boolean multiThreading, + final ArithmeticType arithmetic + ) { + this.metadata = metadata; + this.cStmtCounter = cStmtCounter; + this.arithmeticTraits = arithmeticTraits; + this.architecture = architecture; + this.multiThreading = multiThreading; + this.arithmetic = arithmetic; + } + public FrontendMetadata getMetadata() { return metadata; } - public BitwiseOption getBitwiseOption() { - return bitwiseOption; + public Set getArithmeticTraits() { + return Set.copyOf(arithmeticTraits); } - public void setBitwiseOption(BitwiseOption bitwiseOption) { - this.bitwiseOption = bitwiseOption; + public void addArithmeticTrait(ArithmeticTrait arithmeticTrait) { + this.arithmeticTraits.add(arithmeticTrait); } public ArchitectureType getArchitecture() { diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/ExpressionVisitor.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/ExpressionVisitor.java index 099c5466e4..20f9b83a98 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/ExpressionVisitor.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/ExpressionVisitor.java @@ -19,11 +19,15 @@ import hu.bme.mit.theta.c.frontend.dsl.gen.CBaseVisitor; import hu.bme.mit.theta.c.frontend.dsl.gen.CParser; import hu.bme.mit.theta.common.Tuple2; +import hu.bme.mit.theta.common.logging.Logger; +import hu.bme.mit.theta.common.logging.Logger.Level; import hu.bme.mit.theta.core.decl.VarDecl; import hu.bme.mit.theta.core.type.Expr; import hu.bme.mit.theta.core.type.LitExpr; import hu.bme.mit.theta.core.type.Type; import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs; +import hu.bme.mit.theta.core.type.abstracttype.DivExpr; +import hu.bme.mit.theta.core.type.abstracttype.ModExpr; import hu.bme.mit.theta.core.type.anytype.IteExpr; import hu.bme.mit.theta.core.type.anytype.RefExpr; import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr; @@ -35,6 +39,7 @@ import hu.bme.mit.theta.core.type.bvtype.BvType; import hu.bme.mit.theta.core.type.bvtype.BvXorExpr; import hu.bme.mit.theta.core.type.fptype.FpLitExpr; +import hu.bme.mit.theta.core.type.inttype.IntType; import hu.bme.mit.theta.core.utils.BvUtils; import hu.bme.mit.theta.core.utils.FpUtils; import hu.bme.mit.theta.frontend.ParseContext; @@ -64,8 +69,14 @@ import java.util.stream.Collectors; import static com.google.common.base.Preconditions.checkState; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Add; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Div; import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Geq; import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Ite; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Mod; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Sub; import static hu.bme.mit.theta.core.type.fptype.FpExprs.FpType; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; import static hu.bme.mit.theta.core.utils.TypeUtils.cast; @@ -79,14 +90,16 @@ public class ExpressionVisitor extends CBaseVisitor> { private final FunctionVisitor functionVisitor; private final TypedefVisitor typedefVisitor; private final TypeVisitor typeVisitor; + private final Logger uniqueWarningLogger; - public ExpressionVisitor(ParseContext parseContext, FunctionVisitor functionVisitor, Deque>>> variables, Map, CDeclaration> functions, TypedefVisitor typedefVisitor, TypeVisitor typeVisitor) { + public ExpressionVisitor(ParseContext parseContext, FunctionVisitor functionVisitor, Deque>>> variables, Map, CDeclaration> functions, TypedefVisitor typedefVisitor, TypeVisitor typeVisitor, Logger uniqueWarningLogger) { this.parseContext = parseContext; this.functionVisitor = functionVisitor; this.variables = variables; this.functions = functions; this.typedefVisitor = typedefVisitor; this.typeVisitor = typeVisitor; + this.uniqueWarningLogger = uniqueWarningLogger; } protected VarDecl getVar(String name) { @@ -338,9 +351,11 @@ public Expr visitAdditiveExpression(CParser.AdditiveExpressionContext ctx) { CComplexType smallestCommonType = CComplexType.getSmallestCommonType(types, parseContext); List> collect = new ArrayList<>(); for (int i = 0; i < exprs.size(); i++) { - Expr expr = (i == 0 || ctx.signs.get(i - 1).getText().equals("+")) ? exprs.get(i) : AbstractExprs.Neg(exprs.get(i)); - parseContext.getMetadata().create(expr, "cType", CComplexType.getType(exprs.get(i), parseContext)); - Expr castTo = smallestCommonType.castTo(expr); + parseContext.getMetadata().create(exprs.get(i), "cType", CComplexType.getType(exprs.get(i), parseContext)); + Expr castTo = smallestCommonType.castTo(exprs.get(i)); + if (i != 0 && ctx.signs.get(i - 1).getText().equals("-")) { + castTo = AbstractExprs.Neg(castTo); + } collect.add(castTo); } Expr add = AbstractExprs.Add(collect); @@ -371,10 +386,20 @@ public Expr visitMultiplicativeExpression(CParser.MultiplicativeExpressionCon expr = AbstractExprs.Mul(leftExpr, rightExpr); break; case "/": - expr = AbstractExprs.Div(leftExpr, rightExpr); + if (leftExpr.getType() instanceof IntType && rightExpr.getType() instanceof IntType) { + expr = createIntDiv(leftExpr, rightExpr); + } else { + expr = AbstractExprs.Div(leftExpr, rightExpr); + } break; case "%": - expr = AbstractExprs.Mod(leftExpr, rightExpr); + if (leftExpr.getType() instanceof IntType && rightExpr.getType() instanceof IntType) { + expr = createIntMod(leftExpr, rightExpr); + } else if (leftExpr.getType() instanceof BvType && rightExpr.getType() instanceof BvType) { + expr = AbstractExprs.Rem(leftExpr, rightExpr); + } else { + expr = AbstractExprs.Mod(leftExpr, rightExpr); + } break; default: throw new IllegalStateException("Unexpected value: " + ctx.signs.get(i).getText()); @@ -388,6 +413,48 @@ public Expr visitMultiplicativeExpression(CParser.MultiplicativeExpressionCon return ctx.castExpression(0).accept(this); } + /** + * Conversion from C (/) semantics to solver (div) semantics. + * + * @param a dividend + * @param b divisor + * @return expression representing C division semantics with solver operations + */ + private Expr createIntDiv(Expr a, Expr b) { + DivExpr aDivB = Div(a, b); + return Ite(Geq(a, Int(0)), // if (a >= 0) + aDivB, // a div b + // else + Ite(Neq(Mod(a, b), Int(0)), // if (a mod b != 0) + Ite(Geq(b, Int(0)), // if (b >= 0) + Add(aDivB, Int(1)), // a div b + 1 + // else + Sub(aDivB, Int(1)) // a div b - 1 + ), // else + aDivB // a div b + ) + ); + } + + /** + * Conversion from C (%) semantics to solver (mod) semantics. + * + * @param a dividend + * @param b divisor + * @return expression representing C modulo semantics with solver operations + */ + private Expr createIntMod(Expr a, Expr b) { + ModExpr aModB = Mod(a, b); + return Ite(Geq(a, Int(0)), // if (a >= 0) + aModB, // a mod b + // else + Ite(Geq(b, Int(0)), // if (b >= 0) + Sub(aModB, b), // a mod b - b + Add(aModB, b) // a mod b + b + ) + ); + } + @Override public Expr visitCastExpressionUnaryExpression(CParser.CastExpressionUnaryExpressionContext ctx) { return ctx.unaryExpression().accept(this); @@ -406,18 +473,21 @@ public Expr visitCastExpressionCast(CParser.CastExpressionCastContext ctx) { @Override public Expr visitUnaryExpressionSizeOrAlignOf(CParser.UnaryExpressionSizeOrAlignOfContext ctx) { if (ctx.Alignof() != null) { - System.err.println("WARNING: alignof is not yet implemented, using a literal 0 instead."); + uniqueWarningLogger.write(Level.INFO, "WARNING: alignof is not yet implemented, using a literal 0 instead.\n"); CComplexType signedInt = CComplexType.getSignedInt(parseContext); LitExpr zero = signedInt.getNullValue(); parseContext.getMetadata().create(zero, "cType", signedInt); return zero; } else { - Optional type = typedefVisitor.getType(ctx.typeName().getText()); + final Optional type = typedefVisitor.getType(ctx.typeName().getText()) + .or(() -> Optional.ofNullable(CComplexType.getType(ctx.typeName().getText(), parseContext))) + .or(() -> Optional.ofNullable(CComplexType.getType(getVar(ctx.typeName().getText()).getRef(), parseContext))); + if (type.isPresent()) { LitExpr value = CComplexType.getSignedInt(parseContext).getValue("" + parseContext.getArchitecture().getBitWidth(type.get().getTypeName()) / 8); return value; } else { - System.err.println("WARNING: sizeof got unknown type, using a literal 0 instead."); + uniqueWarningLogger.write(Level.INFO, "WARNING: sizeof got unknown type, using a literal 0 instead.\n"); CComplexType signedInt = CComplexType.getSignedInt(parseContext); LitExpr zero = signedInt.getNullValue(); parseContext.getMetadata().create(zero, "cType", signedInt); @@ -587,6 +657,15 @@ public Expr visitPostfixExpressionBrackets(CParser.PostfixExpressionBracketsC return ctx.expression().accept(this); } + @Override + public Expr visitGccPrettyFunc(CParser.GccPrettyFuncContext ctx) { + uniqueWarningLogger.write(Level.INFO, "WARNING: gcc intrinsic encountered in place of an expression, using a literal 0 instead.\n"); + CComplexType signedInt = CComplexType.getSignedInt(parseContext); + LitExpr zero = signedInt.getNullValue(); + parseContext.getMetadata().create(zero, "cType", signedInt); + return zero; + } + @Override public Expr visitPrimaryExpressionId(CParser.PrimaryExpressionIdContext ctx) { return getVar(ctx.Identifier().getText()).getRef(); @@ -643,6 +722,10 @@ public Expr visitPrimaryExpressionConstant(CParser.PrimaryExpressionConstantC bigInteger = new BigInteger(text.substring(2), 2); } else if (text.startsWith("0") && text.length() > 1) { bigInteger = new BigInteger(text.substring(1), 8); + } else if (text.startsWith("'\\x")) { // char c = '\x0' + bigInteger = new BigInteger(text.substring(3, text.length() - 1), 8); + } else if (text.startsWith("'\\")) { // char c = '\0' + bigInteger = new BigInteger(text.substring(2, text.length() - 1), 10); } else { bigInteger = new BigInteger(text, 10); } @@ -683,7 +766,7 @@ public Expr visitPrimaryExpressionGccExtension(CParser.PrimaryExpressionGccEx public Expr visitPrimaryExpressionStrings(CParser.PrimaryExpressionStringsContext ctx) { CComplexType signedInt = CComplexType.getSignedInt(parseContext); Expr ret = signedInt.getUnitValue(); - System.err.println("Warning: using int(1) as a string constant"); + uniqueWarningLogger.write(Level.INFO, "WARNING: using int(1) as a string constant\n"); parseContext.getMetadata().create(ret, "cType", signedInt); return ret; } diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializer.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializer.java new file mode 100644 index 0000000000..042df61d24 --- /dev/null +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializer.java @@ -0,0 +1,42 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.frontend.transformation.grammar.expression; + +import hu.bme.mit.theta.core.model.Valuation; +import hu.bme.mit.theta.core.type.LitExpr; +import hu.bme.mit.theta.core.type.NullaryExpr; +import hu.bme.mit.theta.core.type.inttype.IntType; + +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; + +public class UnsupportedInitializer extends NullaryExpr { + + @Override + public IntType getType() { + return Int(); + } + + @Override + public LitExpr eval(Valuation val) { + throw new UnsupportedOperationException("UnsupportedInitializer expressions are not supported."); + } + + @Override + public String toString() { + return "UnsupportedInitializer"; + } +} diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/function/FunctionVisitor.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/function/FunctionVisitor.java index 7ea70631aa..bd45adbdb5 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/function/FunctionVisitor.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/function/FunctionVisitor.java @@ -19,6 +19,8 @@ import hu.bme.mit.theta.c.frontend.dsl.gen.CBaseVisitor; import hu.bme.mit.theta.c.frontend.dsl.gen.CParser; import hu.bme.mit.theta.common.Tuple2; +import hu.bme.mit.theta.common.logging.Logger; +import hu.bme.mit.theta.common.logging.Logger.Level; import hu.bme.mit.theta.core.decl.VarDecl; import hu.bme.mit.theta.core.stmt.AssumeStmt; import hu.bme.mit.theta.core.type.Expr; @@ -26,9 +28,10 @@ import hu.bme.mit.theta.core.type.booltype.BoolType; import hu.bme.mit.theta.frontend.ParseContext; import hu.bme.mit.theta.frontend.transformation.ArchitectureConfig; +import hu.bme.mit.theta.frontend.transformation.ArchitectureConfig.ArithmeticType; import hu.bme.mit.theta.frontend.transformation.grammar.expression.ExpressionVisitor; +import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.ArithmeticTrait; import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.BitwiseChecker; -import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.BitwiseOption; import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.GlobalDeclUsageVisitor; import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.TypedefVisitor; import hu.bme.mit.theta.frontend.transformation.grammar.type.DeclarationVisitor; @@ -70,6 +73,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.StringJoiner; import static com.google.common.base.Preconditions.checkState; @@ -88,6 +92,7 @@ public class FunctionVisitor extends CBaseVisitor { private final GlobalDeclUsageVisitor globalDeclUsageVisitor; private final TypeVisitor typeVisitor; private final TypedefVisitor typedefVisitor; + private final Logger uniqueWarningLogger; public void clear() { variables.clear(); @@ -127,7 +132,7 @@ private void createVars(String name, CDeclaration declaration, CComplexType type Tuple2>> peek = variables.peek(); VarDecl varDecl = Var(getName(name), type.getSmtType()); if (peek.get2().containsKey(name)) { - System.err.println("WARNING: Variable already exists: " + name); + uniqueWarningLogger.write(Level.INFO, "WARNING: Variable already exists: " + name + "\n"); varDecl = peek.get2().get(name); } peek.get2().put(name, varDecl); @@ -137,8 +142,9 @@ private void createVars(String name, CDeclaration declaration, CComplexType type declaration.addVarDecl(varDecl); } - public FunctionVisitor(final ParseContext parseContext) { - this.declarationVisitor = new DeclarationVisitor(parseContext, this); + public FunctionVisitor(final ParseContext parseContext, Logger uniqueWarningLogger) { + this.declarationVisitor = new DeclarationVisitor(parseContext, this, uniqueWarningLogger); + this.uniqueWarningLogger = uniqueWarningLogger; this.typedefVisitor = declarationVisitor.getTypedefVisitor(); this.typeVisitor = declarationVisitor.getTypeVisitor(); variables = new ArrayDeque<>(); @@ -163,8 +169,10 @@ public CStatement visitCompilationUnit(CParser.CompilationUnitContext ctx) { // if arithemetic is set on efficient, we change it to either bv or int arithmetic here if (parseContext.getArithmetic() == ArchitectureConfig.ArithmeticType.efficient) { // if it wasn't on efficient, the check returns manual - BitwiseOption bitwiseOption = BitwiseChecker.checkIfBitwise(parseContext, globalUsages); - parseContext.setArithmetic((bitwiseOption == BitwiseOption.INTEGER) ? ArchitectureConfig.ArithmeticType.integer : ArchitectureConfig.ArithmeticType.bitvector); + Set arithmeticTraits = BitwiseChecker.gatherArithmeticTraits(parseContext, globalUsages); + parseContext.setArithmetic( + arithmeticTraits.contains(ArithmeticTrait.BITWISE) || arithmeticTraits.contains(ArithmeticTrait.FLOAT) ? + ArithmeticType.bitvector : ArithmeticType.integer); } CProgram program = new CProgram(parseContext); @@ -292,7 +300,7 @@ public CStatement visitIdentifierStatement(CParser.IdentifierStatementContext ct @Override public CStatement visitCaseStatement(CParser.CaseStatementContext ctx) { parseContext.getCStmtCounter().incrementBranches(); - CExpr cexpr = new CExpr(ctx.constantExpression().accept(new ExpressionVisitor(parseContext, this, variables, functions, typedefVisitor, typeVisitor)), parseContext); + CExpr cexpr = new CExpr(ctx.constantExpression().accept(new ExpressionVisitor(parseContext, this, variables, functions, typedefVisitor, typeVisitor, uniqueWarningLogger)), parseContext); CCase cCase = new CCase( cexpr, ctx.statement().accept(this), parseContext); @@ -497,7 +505,7 @@ public CStatement visitExpression(CParser.ExpressionContext ctx) { @Override public CStatement visitAssignmentExpressionAssignmentExpression(CParser.AssignmentExpressionAssignmentExpressionContext ctx) { - ExpressionVisitor expressionVisitor = new ExpressionVisitor(parseContext, this, variables, functions, typedefVisitor, typeVisitor); + ExpressionVisitor expressionVisitor = new ExpressionVisitor(parseContext, this, variables, functions, typedefVisitor, typeVisitor, uniqueWarningLogger); CCompound compound = new CCompound(parseContext); CCompound preStatements = new CCompound(parseContext); CCompound postStatements = new CCompound(parseContext); @@ -515,7 +523,7 @@ public CStatement visitAssignmentExpressionAssignmentExpression(CParser.Assignme @Override public CStatement visitAssignmentExpressionConditionalExpression(CParser.AssignmentExpressionConditionalExpressionContext ctx) { - ExpressionVisitor expressionVisitor = new ExpressionVisitor(parseContext, this, variables, functions, typedefVisitor, typeVisitor); + ExpressionVisitor expressionVisitor = new ExpressionVisitor(parseContext, this, variables, functions, typedefVisitor, typeVisitor, uniqueWarningLogger); CCompound compound = new CCompound(parseContext); CCompound preStatements = new CCompound(parseContext); CCompound postStatements = new CCompound(parseContext); diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/preprocess/BitwiseOption.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/preprocess/ArithmeticTrait.java similarity index 90% rename from subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/preprocess/BitwiseOption.java rename to subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/preprocess/ArithmeticTrait.java index 7d950b27ce..97c233ea58 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/preprocess/BitwiseOption.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/preprocess/ArithmeticTrait.java @@ -16,6 +16,6 @@ package hu.bme.mit.theta.frontend.transformation.grammar.preprocess; -public enum BitwiseOption { - INTEGER, BITWISE, BITWISE_FLOAT +public enum ArithmeticTrait { + LIN_INT, NONLIN_INT, BITWISE, FLOAT, ARR, } diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/preprocess/BitwiseChecker.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/preprocess/BitwiseChecker.java index c1bd087e9e..6afa0e377e 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/preprocess/BitwiseChecker.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/preprocess/BitwiseChecker.java @@ -18,36 +18,64 @@ import hu.bme.mit.theta.c.frontend.dsl.gen.CBaseVisitor; import hu.bme.mit.theta.c.frontend.dsl.gen.CParser; +import hu.bme.mit.theta.c.frontend.dsl.gen.CParser.DirectDeclaratorArray1Context; +import hu.bme.mit.theta.c.frontend.dsl.gen.CParser.DirectDeclaratorArray2Context; +import hu.bme.mit.theta.c.frontend.dsl.gen.CParser.DirectDeclaratorArray3Context; +import hu.bme.mit.theta.c.frontend.dsl.gen.CParser.DirectDeclaratorArray4Context; +import hu.bme.mit.theta.c.frontend.dsl.gen.CParser.MultiplicativeExpressionContext; import hu.bme.mit.theta.frontend.ParseContext; import java.util.List; - -import static com.google.common.base.Preconditions.checkState; +import java.util.Set; public class BitwiseChecker extends CBaseVisitor { - private BitwiseOption bitwiseOption = null; + private final ParseContext parseContext; + + private BitwiseChecker(ParseContext parseContext) { + this.parseContext = parseContext; + } - // checks only once, returns the result of the first check after - public static BitwiseOption checkIfBitwise(ParseContext parseContext, List contexts) { - BitwiseChecker instance = new BitwiseChecker(); - instance.bitwiseOption = BitwiseOption.INTEGER; + public static Set gatherArithmeticTraits(ParseContext parseContext, List contexts) { + BitwiseChecker instance = new BitwiseChecker(parseContext); for (CParser.ExternalDeclarationContext ctx : contexts) { ctx.accept(instance); } - checkState(instance.bitwiseOption != null); - parseContext.setBitwiseOption(instance.bitwiseOption); - return instance.bitwiseOption; + return instance.parseContext.getArithmeticTraits(); } @Override public Void visitTypeSpecifierDouble(CParser.TypeSpecifierDoubleContext ctx) { - bitwiseOption = BitwiseOption.BITWISE_FLOAT; + parseContext.addArithmeticTrait(ArithmeticTrait.FLOAT); return null; } @Override public Void visitTypeSpecifierFloat(CParser.TypeSpecifierFloatContext ctx) { - bitwiseOption = BitwiseOption.BITWISE_FLOAT; + parseContext.addArithmeticTrait(ArithmeticTrait.FLOAT); + return null; + } + + @Override + public Void visitDirectDeclaratorArray1(DirectDeclaratorArray1Context ctx) { + parseContext.addArithmeticTrait(ArithmeticTrait.ARR); + return null; + } + + @Override + public Void visitDirectDeclaratorArray2(DirectDeclaratorArray2Context ctx) { + parseContext.addArithmeticTrait(ArithmeticTrait.ARR); + return null; + } + + @Override + public Void visitDirectDeclaratorArray3(DirectDeclaratorArray3Context ctx) { + parseContext.addArithmeticTrait(ArithmeticTrait.ARR); + return null; + } + + @Override + public Void visitDirectDeclaratorArray4(DirectDeclaratorArray4Context ctx) { + parseContext.addArithmeticTrait(ArithmeticTrait.ARR); return null; } @@ -55,7 +83,7 @@ public Void visitTypeSpecifierFloat(CParser.TypeSpecifierFloatContext ctx) { public Void visitPrimaryExpressionConstant(CParser.PrimaryExpressionConstantContext ctx) { String text = ctx.getText(); if (text.contains(".")) { - bitwiseOption = BitwiseOption.BITWISE_FLOAT; + parseContext.addArithmeticTrait(ArithmeticTrait.FLOAT); return null; } return super.visitPrimaryExpressionConstant(ctx); @@ -64,11 +92,9 @@ public Void visitPrimaryExpressionConstant(CParser.PrimaryExpressionConstantCont @Override public Void visitInclusiveOrExpression(CParser.InclusiveOrExpressionContext ctx) { ctx.exclusiveOrExpression(0).accept(this); - Boolean b = ctx.exclusiveOrExpression().size() > 1; + boolean b = ctx.exclusiveOrExpression().size() > 1; if (b) { - if (bitwiseOption == BitwiseOption.INTEGER) { - bitwiseOption = BitwiseOption.BITWISE; - } + parseContext.addArithmeticTrait(ArithmeticTrait.BITWISE); } return null; } @@ -76,11 +102,9 @@ public Void visitInclusiveOrExpression(CParser.InclusiveOrExpressionContext ctx) @Override public Void visitExclusiveOrExpression(CParser.ExclusiveOrExpressionContext ctx) { ctx.andExpression(0).accept(this); - Boolean b = ctx.andExpression().size() > 1; + boolean b = ctx.andExpression().size() > 1; if (b) { - if (bitwiseOption == BitwiseOption.INTEGER) { - bitwiseOption = BitwiseOption.BITWISE; - } + parseContext.addArithmeticTrait(ArithmeticTrait.BITWISE); } return null; } @@ -88,11 +112,9 @@ public Void visitExclusiveOrExpression(CParser.ExclusiveOrExpressionContext ctx) @Override public Void visitAndExpression(CParser.AndExpressionContext ctx) { ctx.equalityExpression(0).accept(this); - Boolean b = ctx.equalityExpression().size() > 1; + boolean b = ctx.equalityExpression().size() > 1; if (b) { - if (bitwiseOption == BitwiseOption.INTEGER) { - bitwiseOption = BitwiseOption.BITWISE; - } + parseContext.addArithmeticTrait(ArithmeticTrait.BITWISE); } return null; } @@ -100,13 +122,18 @@ public Void visitAndExpression(CParser.AndExpressionContext ctx) { @Override public Void visitShiftExpression(CParser.ShiftExpressionContext ctx) { ctx.additiveExpression(0).accept(this); - Boolean b = ctx.additiveExpression().size() > 1; + boolean b = ctx.additiveExpression().size() > 1; if (b) { - if (bitwiseOption == BitwiseOption.INTEGER) { - bitwiseOption = BitwiseOption.BITWISE; - } + parseContext.addArithmeticTrait(ArithmeticTrait.BITWISE); } return null; } + @Override + public Void visitMultiplicativeExpression(MultiplicativeExpressionContext ctx) { + if (ctx.castExpression().size() > 1) { + parseContext.addArithmeticTrait(ArithmeticTrait.NONLIN_INT); + } + return super.visitMultiplicativeExpression(ctx); + } } diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/DeclarationVisitor.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/DeclarationVisitor.java index 4dd23f9ad9..2eac00cd9b 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/DeclarationVisitor.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/DeclarationVisitor.java @@ -18,10 +18,14 @@ import hu.bme.mit.theta.c.frontend.dsl.gen.CBaseVisitor; import hu.bme.mit.theta.c.frontend.dsl.gen.CParser; +import hu.bme.mit.theta.common.logging.Logger; +import hu.bme.mit.theta.common.logging.Logger.Level; import hu.bme.mit.theta.frontend.ParseContext; +import hu.bme.mit.theta.frontend.transformation.grammar.expression.UnsupportedInitializer; import hu.bme.mit.theta.frontend.transformation.grammar.function.FunctionVisitor; import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.TypedefVisitor; import hu.bme.mit.theta.frontend.transformation.model.declaration.CDeclaration; +import hu.bme.mit.theta.frontend.transformation.model.statements.CExpr; import hu.bme.mit.theta.frontend.transformation.model.statements.CInitializerList; import hu.bme.mit.theta.frontend.transformation.model.statements.CStatement; import hu.bme.mit.theta.frontend.transformation.model.types.simple.CSimpleType; @@ -36,12 +40,14 @@ public class DeclarationVisitor extends CBaseVisitor { private final FunctionVisitor functionVisitor; private final TypedefVisitor typedefVisitor; private final TypeVisitor typeVisitor; + private final Logger uniqueWarningLogger; - public DeclarationVisitor(ParseContext parseContext, FunctionVisitor functionVisitor) { + public DeclarationVisitor(ParseContext parseContext, FunctionVisitor functionVisitor, Logger uniqueWarningLogger) { this.parseContext = parseContext; this.functionVisitor = functionVisitor; + this.uniqueWarningLogger = uniqueWarningLogger; this.typedefVisitor = new TypedefVisitor(this); - this.typeVisitor = new TypeVisitor(this, typedefVisitor, parseContext); + this.typeVisitor = new TypeVisitor(this, typedefVisitor, parseContext, uniqueWarningLogger); } public TypedefVisitor getTypedefVisitor() { @@ -81,13 +87,17 @@ public List getDeclarations(CParser.DeclarationSpecifiersContext d "Initializer list designators not yet implemented!"); CInitializerList cInitializerList = new CInitializerList( cSimpleType.getActualType(), parseContext); - for (CParser.InitializerContext initializer : context.initializer() - .initializerList().initializers) { - CStatement expr = initializer.assignmentExpression() - .accept(functionVisitor); - cInitializerList.addStatement(null /* TODO: add designator */, expr); + try { + for (CParser.InitializerContext initializer : context.initializer() + .initializerList().initializers) { + CStatement expr = initializer.assignmentExpression().accept(functionVisitor); + cInitializerList.addStatement(null /* TODO: add designator */, expr); + } + initializerExpression = cInitializerList; + } catch (NullPointerException e) { + initializerExpression = new CExpr(new UnsupportedInitializer(), parseContext); + parseContext.getMetadata().create(initializerExpression.getExpression(), "cType", cSimpleType); } - initializerExpression = cInitializerList; } else { initializerExpression = context.initializer().assignmentExpression() .accept(functionVisitor); @@ -190,7 +200,7 @@ public CDeclaration visitDirectDeclaratorFunctionDecl( CParser.DirectDeclaratorFunctionDeclContext ctx) { CDeclaration decl = ctx.directDeclarator().accept(this); if (!(ctx.parameterTypeList() == null || ctx.parameterTypeList().ellipses == null)) { - System.err.println("WARNING: variable args are not supported!"); + uniqueWarningLogger.write(Level.INFO, "WARNING: variable args are not supported!\n"); decl.setFunc(true); return decl; } diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/TypeVisitor.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/TypeVisitor.java index a23c4c738f..8bf0016648 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/TypeVisitor.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/TypeVisitor.java @@ -18,6 +18,8 @@ import hu.bme.mit.theta.c.frontend.dsl.gen.CBaseVisitor; import hu.bme.mit.theta.c.frontend.dsl.gen.CParser; +import hu.bme.mit.theta.common.logging.Logger; +import hu.bme.mit.theta.common.logging.Logger.Level; import hu.bme.mit.theta.core.type.Expr; import hu.bme.mit.theta.frontend.ParseContext; import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.TypedefVisitor; @@ -52,6 +54,7 @@ public class TypeVisitor extends CBaseVisitor { private final DeclarationVisitor declarationVisitor; private final TypedefVisitor typedefVisitor; private final ParseContext parseContext; + private final Logger uniqueWarningLogger; private static final List standardTypes = @@ -59,10 +62,11 @@ public class TypeVisitor extends CBaseVisitor { private static final List shorthandTypes = List.of("long", "short", "unsigned", "_Bool"); - public TypeVisitor(DeclarationVisitor declarationVisitor, TypedefVisitor typedefVisitor, ParseContext parseContext) { + public TypeVisitor(DeclarationVisitor declarationVisitor, TypedefVisitor typedefVisitor, ParseContext parseContext, Logger uniqueWarningLogger) { this.declarationVisitor = declarationVisitor; this.typedefVisitor = typedefVisitor; this.parseContext = parseContext; + this.uniqueWarningLogger = uniqueWarningLogger; } @@ -81,18 +85,18 @@ private CSimpleType mergeCTypes(List cSimpleTypes) { List enums = cSimpleTypes.stream().filter(cType -> cType instanceof Enum) .collect(Collectors.toList()); if (enums.size() > 0) { - System.err.println("WARNING: enums are not yet supported! Using int instead."); - cSimpleTypes.add(NamedType("int", parseContext)); + uniqueWarningLogger.write(Level.INFO, "WARNING: enums are not yet supported! Using int instead.\n"); + cSimpleTypes.add(NamedType("int", parseContext, uniqueWarningLogger)); cSimpleTypes.removeAll(enums); } List namedElements = cSimpleTypes.stream() .filter(cType -> cType instanceof NamedType).collect(Collectors.toList()); if (namedElements.size() == 0) { - namedElements.add(NamedType("int", parseContext)); + namedElements.add(NamedType("int", parseContext, uniqueWarningLogger)); } NamedType mainType = (NamedType) namedElements.get(namedElements.size() - 1); if (shorthandTypes.contains(mainType.getNamedType())) { - mainType = NamedType("int", parseContext); + mainType = NamedType("int", parseContext, uniqueWarningLogger); } else { cSimpleTypes.remove(mainType); } @@ -101,8 +105,8 @@ private CSimpleType mergeCTypes(List cSimpleTypes) { // we didn't get explicit signedness if (type.isSigned() == null) { if (type instanceof NamedType && ((NamedType) type).getNamedType().contains("char")) { - System.err.println( - "WARNING: signedness of the type char is implementation specific. Right now it is interpreted as a signed char."); + uniqueWarningLogger.write(Level.INFO, + "WARNING: signedness of the type char is implementation specific. Right now it is interpreted as a signed char.\n"); } type.setSigned(true); } @@ -191,7 +195,7 @@ public CSimpleType visitCompoundDefinition(CParser.CompoundDefinitionContext ctx if (ctx.Identifier() != null) { name = ctx.Identifier().getText(); } - Struct struct = CSimpleTypeFactory.Struct(name, parseContext); + Struct struct = CSimpleTypeFactory.Struct(name, parseContext, uniqueWarningLogger); for (CParser.StructDeclarationContext structDeclarationContext : ctx.structDeclarationList() .structDeclaration()) { CParser.SpecifierQualifierListContext specifierQualifierListContext = structDeclarationContext.specifierQualifierList(); @@ -209,8 +213,8 @@ public CSimpleType visitCompoundDefinition(CParser.CompoundDefinitionContext ctx } return struct; } else { - System.err.println("Warning: CompoundDefinitions are not yet implemented!"); - return NamedType("int", parseContext); + uniqueWarningLogger.write(Level.INFO, "WARNING: CompoundDefinitions are not yet implemented!\n"); + return NamedType("int", parseContext, uniqueWarningLogger); } } @@ -220,7 +224,7 @@ public CSimpleType visitCompoundUsage(CParser.CompoundUsageContext ctx) { if (ctx.structOrUnion().Struct() != null) { return Struct.getByName(text); } else { - return NamedType(ctx.structOrUnion().getText() + " " + text, parseContext); + return NamedType(ctx.structOrUnion().getText() + " " + text, parseContext, uniqueWarningLogger); } } @@ -245,7 +249,7 @@ public CSimpleType visitEnumDefinition(CParser.EnumDefinitionContext ctx) { @Override public CSimpleType visitEnumUsage(CParser.EnumUsageContext ctx) { - return NamedType("enum " + ctx.Identifier().getText(), parseContext); + return NamedType("enum " + ctx.Identifier().getText(), parseContext, uniqueWarningLogger); } @Override @@ -273,9 +277,9 @@ public CSimpleType visitTypeSpecifierSimple(CParser.TypeSpecifierSimpleContext c case "unsigned": return Unsigned(); case "_Bool": - return NamedType("_Bool", parseContext); + return NamedType("_Bool", parseContext, uniqueWarningLogger); default: - return NamedType(ctx.getText(), parseContext); + return NamedType(ctx.getText(), parseContext, uniqueWarningLogger); } } @@ -286,12 +290,12 @@ public CSimpleType visitTypeSpecifierGccThread(CParser.TypeSpecifierGccThreadCon @Override public CSimpleType visitTypeSpecifierFloat(CParser.TypeSpecifierFloatContext ctx) { - return NamedType("float", parseContext); + return NamedType("float", parseContext, uniqueWarningLogger); } @Override public CSimpleType visitTypeSpecifierDouble(CParser.TypeSpecifierDoubleContext ctx) { - return NamedType("double", parseContext); + return NamedType("double", parseContext, uniqueWarningLogger); } @Override @@ -303,7 +307,7 @@ public CSimpleType visitTypeSpecifierTypedefName(CParser.TypeSpecifierTypedefNam return origin; } else { if (standardTypes.contains(ctx.getText())) { - return NamedType(ctx.getText(), parseContext); + return NamedType(ctx.getText(), parseContext, uniqueWarningLogger); } else { return DeclaredName(ctx.getText()); } diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/statements/CAssignment.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/statements/CAssignment.java index d1de52d571..4e25b8ce51 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/statements/CAssignment.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/statements/CAssignment.java @@ -21,13 +21,17 @@ import hu.bme.mit.theta.core.type.Type; import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs; import hu.bme.mit.theta.core.type.arraytype.ArrayType; +import hu.bme.mit.theta.core.type.bvtype.BvExprs; +import hu.bme.mit.theta.core.type.bvtype.BvType; import hu.bme.mit.theta.frontend.ParseContext; import hu.bme.mit.theta.frontend.transformation.model.types.complex.CComplexType; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; public class CAssignment extends CStatement { @@ -90,8 +94,23 @@ public Expr getrExpression() { case "-=": ret = AbstractExprs.Sub(lValue, rValue.getExpression()); break; + case "^=": + Expr rExpressionXor = rValue.getExpression(); + checkState(lValue.getType() instanceof BvType && rExpressionXor.getType() instanceof BvType); + ret = BvExprs.Xor(List.of((Expr) lValue, (Expr) rExpressionXor)); + break; + case "&=": + Expr rExpressionAnd = rValue.getExpression(); + checkState(lValue.getType() instanceof BvType && rExpressionAnd.getType() instanceof BvType); + ret = BvExprs.And(List.of((Expr) lValue, (Expr) rExpressionAnd)); + break; + case "|=": + Expr rExpressionOr = rValue.getExpression(); + checkState(lValue.getType() instanceof BvType && rExpressionOr.getType() instanceof BvType); + ret = BvExprs.Or(List.of((Expr) lValue, (Expr) rExpressionOr)); + break; default: - throw new RuntimeException("Bad operator!"); + throw new RuntimeException("Bad operator: " + operator); } parseContext.getMetadata().create(ret, "cType", CComplexType.getType(lValue, parseContext)); ret = CComplexType.getType(lValue, parseContext).castTo(ret); diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CComplexType.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CComplexType.java index c9ddba7eaf..8d4bbb8393 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CComplexType.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CComplexType.java @@ -20,6 +20,10 @@ import hu.bme.mit.theta.core.type.Expr; import hu.bme.mit.theta.core.type.LitExpr; import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.core.type.arraytype.ArrayType; +import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.type.bvtype.BvType; +import hu.bme.mit.theta.core.type.inttype.IntType; import hu.bme.mit.theta.frontend.ParseContext; import hu.bme.mit.theta.frontend.transformation.model.types.complex.compound.CArray; import hu.bme.mit.theta.frontend.transformation.model.types.complex.compound.CCompound; @@ -51,6 +55,7 @@ import hu.bme.mit.theta.frontend.transformation.model.types.simple.CSimpleType; import java.util.List; +import java.util.Map.Entry; import java.util.Optional; import static hu.bme.mit.theta.frontend.transformation.ArchitectureConfig.getCastVisitor; @@ -117,7 +122,7 @@ public CComplexType getSmallestCommonType(CComplexType type) { } public String getTypeName() { - throw new RuntimeException("Type name could not be queried from this type!"); + throw new RuntimeException("Type name could not be queried from this type: " + this); } public int width() { @@ -132,13 +137,77 @@ public static CComplexType getSmallestCommonType(List types, Parse return ret; } + public static CComplexType getType(String s, ParseContext parseContext) { + return switch (s) { + case "_Bool" -> new CBool(null, parseContext); + case "char", "signedchar" -> new CSignedChar(null, parseContext); + case "short", "signedshort" -> new CSignedShort(null, parseContext); + case "unsignedshort" -> new CUnsignedShort(null, parseContext); + case "unsignedchar" -> new CUnsignedChar(null, parseContext); + case "signed", "int", "signedint" -> new CSignedInt(null, parseContext); + case "unsigned", "unsignedint" -> new CUnsignedInt(null, parseContext); + case "long", "signedlong", "longint", "signedlongint" -> + new CSignedLong(null, parseContext); + case "unsignedlong", "unsignedlongint" -> new CUnsignedLong(null, parseContext); + case "longlong", "signedlonglong", "lonlongint", "signedlonglongint" -> + new CSignedLongLong(null, parseContext); + case "unsignedlonglong", "unsignedlonglongint" -> + new CUnsignedLongLong(null, parseContext); + case "float" -> new CFloat(null, parseContext); + case "double" -> new CDouble(null, parseContext); + case "longdouble" -> new CLongDouble(null, parseContext); + default -> { + if (s.endsWith("*")) { + yield new CPointer(null, null, parseContext); + } else { + throw new RuntimeException("Type not known: " + s); + } + } + }; + } + public static CComplexType getType(Expr expr, ParseContext parseContext) { Optional cTypeOptional = parseContext.getMetadata().getMetadataValue(expr, "cType"); if (cTypeOptional.isPresent() && cTypeOptional.get() instanceof CComplexType) { return (CComplexType) cTypeOptional.get(); } else if (cTypeOptional.isPresent() && cTypeOptional.get() instanceof CSimpleType) { return ((CSimpleType) cTypeOptional.get()).getActualType(); - } else throw new RuntimeException("Type not known for expression: " + expr); + } else { + return getType(expr.getType(), parseContext); +// throw new RuntimeException("Type not known for expression: " + expr); + } + } + + private static CComplexType getType(Type type, ParseContext parseContext) { + if (type instanceof IntType) { + return new CSignedInt(null, parseContext); + } else if (type instanceof ArrayType aType) { + return new CArray(null, getType(aType.getElemType(), parseContext), parseContext); + } else if (type instanceof BoolType) { + return new CBool(null, parseContext); + } else if (type instanceof BvType) { + for (Entry entry : parseContext.getArchitecture().standardTypeSizes.entrySet()) { + String s = entry.getKey(); + Integer integer = entry.getValue(); + if (integer == ((BvType) type).getSize()) { + switch (s) { + case "bool": + return new CBool(null, parseContext); + case "short": + return ((BvType) type).getSigned() ? new CSignedShort(null, parseContext) : new CUnsignedShort(null, parseContext); + case "int": + return ((BvType) type).getSigned() ? new CSignedInt(null, parseContext) : new CUnsignedInt(null, parseContext); + case "long": + return ((BvType) type).getSigned() ? new CSignedLong(null, parseContext) : new CUnsignedLong(null, parseContext); + case "longlong": + return ((BvType) type).getSigned() ? new CSignedLongLong(null, parseContext) : new CUnsignedLongLong(null, parseContext); + } + } + } + throw new RuntimeException("No suitable width found for type: " + type); + } else { + throw new RuntimeException("Not yet implemented for type: " + type); + } } @@ -204,7 +273,7 @@ public R accept(CComplexTypeVisitor visitor, T param) { public static class CComplexTypeVisitor { public R visit(CComplexType type, T param) { - throw new UnsupportedOperationException("Not (yet) implemented"); + throw new UnsupportedOperationException("Not (yet) implemented (" + type.getClass().getSimpleName() + " in " + this.getClass().getName() + ")"); } public R visit(CVoid type, T param) { diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CVoid.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CVoid.java index 9b28e816f3..1d9e69f09f 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CVoid.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CVoid.java @@ -28,4 +28,9 @@ public CVoid(CSimpleType origin, ParseContext parseContext) { public R accept(CComplexTypeVisitor visitor, T param) { return visitor.visit(this, param); } + + @Override + public String getTypeName() { + return "void"; + } } diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/real/CDouble.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/real/CDouble.java index ab3693376f..08187a9f15 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/real/CDouble.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/real/CDouble.java @@ -31,4 +31,9 @@ public CDouble(CSimpleType origin, ParseContext parseContext) { public R accept(CComplexTypeVisitor visitor, T param) { return visitor.visit(this, param); } + + @Override + public String getTypeName() { + return "double"; + } } diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/real/CFloat.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/real/CFloat.java index b71acbf65e..58612af384 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/real/CFloat.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/real/CFloat.java @@ -31,4 +31,9 @@ public CFloat(CSimpleType origin, ParseContext parseContext) { public R accept(CComplexTypeVisitor visitor, T param) { return visitor.visit(this, param); } + + @Override + public String getTypeName() { + return "float"; + } } diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/real/CLongDouble.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/real/CLongDouble.java index ed12111dbe..963beb80a6 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/real/CLongDouble.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/real/CLongDouble.java @@ -31,4 +31,9 @@ public CLongDouble(CSimpleType origin, ParseContext parseContext) { public R accept(CComplexTypeVisitor visitor, T param) { return visitor.visit(this, param); } + + @Override + public String getTypeName() { + return "long double"; + } } diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/visitors/bitvector/CastVisitor.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/visitors/bitvector/CastVisitor.java index 2383a99cc8..200c5b7486 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/visitors/bitvector/CastVisitor.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/visitors/bitvector/CastVisitor.java @@ -85,7 +85,7 @@ private Expr handleSignedConversion(CInteger type, Expr param return BvExprs.Extract(cast(param, BvType.of(that.width())), Int(0), Int(type.width())); } else { - return param.withOps(param.getOps()); + return BvExprs.Pos((Expr) param); } } else { throw new IllegalStateException("Compound types are not directly supported!"); @@ -111,8 +111,12 @@ private Expr handleUnsignedConversion(CInteger type, Expr par } else if (that.width() > type.width()) { return BvExprs.Extract(cast(param, BvType.of(that.width())), Int(0), Int(type.width())); - } else { - return param.withOps(param.getOps()); + } else { // width equals + if (that instanceof Signed) { + return BvExprs.Add(List.of((Expr) param, BvUtils.bigIntegerToUnsignedBvLitExpr(BigInteger.TWO.pow(type.width()).subtract(BigInteger.ONE), type.width()), (Expr) type.getUnitValue())); + } else { + return param; + } } } else { throw new IllegalStateException("Compound types are not directly supported!"); diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/simple/CSimpleTypeFactory.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/simple/CSimpleTypeFactory.java index 9517d6599d..2d48ffb80c 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/simple/CSimpleTypeFactory.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/simple/CSimpleTypeFactory.java @@ -16,6 +16,7 @@ package hu.bme.mit.theta.frontend.transformation.model.types.simple; +import hu.bme.mit.theta.common.logging.Logger; import hu.bme.mit.theta.core.type.Expr; import hu.bme.mit.theta.frontend.ParseContext; @@ -48,8 +49,8 @@ public static Typedef Typedef() { return Typedef.instance; } - public static NamedType NamedType(final String namedType, ParseContext parseContext) { - return new NamedType(parseContext, namedType); + public static NamedType NamedType(final String namedType, ParseContext parseContext, Logger uniqueWarningLogger) { + return new NamedType(parseContext, namedType, uniqueWarningLogger); } public static DeclaredName DeclaredName(final String declaredName) { @@ -60,8 +61,8 @@ public static Enum Enum(final String id, final Map>> fi return new Enum(id, fields); } - public static Struct Struct(final String name, ParseContext parseContext) { - return new Struct(name, parseContext); + public static Struct Struct(final String name, ParseContext parseContext, Logger uniqueWarningLogger) { + return new Struct(name, parseContext, uniqueWarningLogger); } public static ThreadLocal ThreadLocal() { diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/simple/NamedType.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/simple/NamedType.java index 737fa821b0..6223532c58 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/simple/NamedType.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/simple/NamedType.java @@ -16,6 +16,8 @@ package hu.bme.mit.theta.frontend.transformation.model.types.simple; +import hu.bme.mit.theta.common.logging.Logger; +import hu.bme.mit.theta.common.logging.Logger.Level; import hu.bme.mit.theta.frontend.ParseContext; import hu.bme.mit.theta.frontend.transformation.model.types.complex.CComplexType; import hu.bme.mit.theta.frontend.transformation.model.types.complex.CVoid; @@ -42,10 +44,12 @@ public class NamedType extends CSimpleType { protected final ParseContext parseContext; private final String namedType; + private final Logger uniqueWarningLogger; - NamedType(ParseContext parseContext, final String namedType) { + NamedType(ParseContext parseContext, final String namedType, Logger uniqueWarningLogger) { this.parseContext = parseContext; this.namedType = namedType; + this.uniqueWarningLogger = uniqueWarningLogger; } @Override @@ -98,7 +102,7 @@ public CComplexType getActualType() { type = new CVoid(this, parseContext); break; default: { - System.err.println("WARNING: Unknown simple type " + namedType); + uniqueWarningLogger.write(Level.INFO, "WARNING: Unknown simple type " + namedType + "\n"); type = new CVoid(this, parseContext); break; } @@ -164,7 +168,7 @@ protected void patch(CSimpleType cSimpleType) { @Override public CSimpleType getBaseType() { - NamedType namedType = new NamedType(parseContext, getNamedType()); + NamedType namedType = new NamedType(parseContext, getNamedType(), uniqueWarningLogger); namedType.setAtomic(this.isAtomic()); namedType.setExtern(this.isExtern()); namedType.setTypedef(this.isTypedef()); @@ -220,7 +224,7 @@ public boolean isVoid() { @Override public CSimpleType copyOf() { - CSimpleType namedType = new NamedType(parseContext, getNamedType()); + CSimpleType namedType = new NamedType(parseContext, getNamedType(), uniqueWarningLogger); namedType.setAtomic(this.isAtomic()); namedType.setExtern(this.isExtern()); namedType.setTypedef(this.isTypedef()); diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/simple/Struct.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/simple/Struct.java index 4ada2ab0a7..24a31f96f1 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/simple/Struct.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/simple/Struct.java @@ -16,6 +16,8 @@ package hu.bme.mit.theta.frontend.transformation.model.types.simple; +import hu.bme.mit.theta.common.logging.Logger; +import hu.bme.mit.theta.common.logging.Logger.Level; import hu.bme.mit.theta.frontend.ParseContext; import hu.bme.mit.theta.frontend.transformation.model.types.complex.CComplexType; import hu.bme.mit.theta.frontend.transformation.model.types.complex.compound.CStruct; @@ -27,6 +29,8 @@ public class Struct extends NamedType { private final Map fields; private final String name; + private final Logger uniqueWarningLogger; + private boolean currentlyBeingBuilt; private static final Map definedTypes = new LinkedHashMap<>(); @@ -34,8 +38,9 @@ public static Struct getByName(String name) { return definedTypes.get(name); } - Struct(String name, ParseContext parseContext) { - super(parseContext, "struct"); + Struct(String name, ParseContext parseContext, Logger uniqueWarningLogger) { + super(parseContext, "struct", uniqueWarningLogger); + this.uniqueWarningLogger = uniqueWarningLogger; fields = new LinkedHashMap<>(); this.name = name; if (name != null) { @@ -51,7 +56,7 @@ public void addField(String name, CSimpleType type) { @Override public CComplexType getActualType() { if (currentlyBeingBuilt) { - System.err.println("WARNING: self-embedded structs! Using long as a placeholder"); + uniqueWarningLogger.write(Level.INFO, "WARNING: self-embedded structs! Using long as a placeholder\n"); return CComplexType.getSignedInt(parseContext); } currentlyBeingBuilt = true; @@ -73,7 +78,7 @@ public boolean isVoid() { @Override public CSimpleType copyOf() { - Struct struct = new Struct(name, parseContext); + Struct struct = new Struct(name, parseContext, uniqueWarningLogger); struct.fields.putAll(fields); return struct; } diff --git a/subprojects/frontends/chc-frontend/src/main/java/hu/bme/mit/theta/frontend/chc/ChcBackwardXcfaBuilder.java b/subprojects/frontends/chc-frontend/src/main/java/hu/bme/mit/theta/frontend/chc/ChcBackwardXcfaBuilder.java index 6721326fff..0bd2d0d290 100644 --- a/subprojects/frontends/chc-frontend/src/main/java/hu/bme/mit/theta/frontend/chc/ChcBackwardXcfaBuilder.java +++ b/subprojects/frontends/chc-frontend/src/main/java/hu/bme/mit/theta/frontend/chc/ChcBackwardXcfaBuilder.java @@ -26,21 +26,41 @@ import hu.bme.mit.theta.core.type.Type; import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; import hu.bme.mit.theta.core.type.booltype.BoolType; -import hu.bme.mit.theta.xcfa.model.*; -import hu.bme.mit.theta.xcfa.passes.ChcPasses; +import hu.bme.mit.theta.xcfa.model.EmptyMetaData; +import hu.bme.mit.theta.xcfa.model.InvokeLabel; +import hu.bme.mit.theta.xcfa.model.ParamDirection; +import hu.bme.mit.theta.xcfa.model.SequenceLabel; +import hu.bme.mit.theta.xcfa.model.StmtLabel; +import hu.bme.mit.theta.xcfa.model.XcfaBuilder; +import hu.bme.mit.theta.xcfa.model.XcfaEdge; +import hu.bme.mit.theta.xcfa.model.XcfaLocation; +import hu.bme.mit.theta.xcfa.model.XcfaProcedureBuilder; +import hu.bme.mit.theta.xcfa.passes.ProcedurePassManager; import kotlin.Pair; import org.antlr.v4.runtime.RuleContext; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.frontend.chc.ChcUtils.*; +import static hu.bme.mit.theta.frontend.chc.ChcUtils.createVars; +import static hu.bme.mit.theta.frontend.chc.ChcUtils.getTailConditionLabels; +import static hu.bme.mit.theta.frontend.chc.ChcUtils.transformConst; +import static hu.bme.mit.theta.frontend.chc.ChcUtils.transformSort; public class ChcBackwardXcfaBuilder extends CHCBaseVisitor implements ChcXcfaBuilder { private final Map procedures = new HashMap<>(); + private final ProcedurePassManager procedurePassManager; private XcfaBuilder xcfaBuilder; private int callCount = 0; + public ChcBackwardXcfaBuilder(final ProcedurePassManager procedurePassManager) { + this.procedurePassManager = procedurePassManager; + } + @Override public XcfaBuilder buildXcfa(CHCParser parser) { xcfaBuilder = new XcfaBuilder("chc"); @@ -123,7 +143,7 @@ private XcfaLocation createLocation(XcfaProcedureBuilder builder) { } private XcfaProcedureBuilder createProcedure(String procName) { - XcfaProcedureBuilder builder = new XcfaProcedureBuilder(procName, new ChcPasses()); + XcfaProcedureBuilder builder = new XcfaProcedureBuilder(procName, procedurePassManager); builder.setName(procName); builder.addParam(Decls.Var(procName + "_ret", Bool()), ParamDirection.OUT); diff --git a/subprojects/frontends/chc-frontend/src/main/java/hu/bme/mit/theta/frontend/chc/ChcForwardXcfaBuilder.java b/subprojects/frontends/chc-frontend/src/main/java/hu/bme/mit/theta/frontend/chc/ChcForwardXcfaBuilder.java index ffd2119d62..71b06b1aa7 100644 --- a/subprojects/frontends/chc-frontend/src/main/java/hu/bme/mit/theta/frontend/chc/ChcForwardXcfaBuilder.java +++ b/subprojects/frontends/chc-frontend/src/main/java/hu/bme/mit/theta/frontend/chc/ChcForwardXcfaBuilder.java @@ -22,27 +22,41 @@ import hu.bme.mit.theta.core.stmt.AssignStmt; import hu.bme.mit.theta.core.stmt.HavocStmt; import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.xcfa.model.*; -import hu.bme.mit.theta.xcfa.passes.ChcPasses; +import hu.bme.mit.theta.xcfa.model.EmptyMetaData; +import hu.bme.mit.theta.xcfa.model.SequenceLabel; +import hu.bme.mit.theta.xcfa.model.StmtLabel; +import hu.bme.mit.theta.xcfa.model.XcfaBuilder; +import hu.bme.mit.theta.xcfa.model.XcfaEdge; +import hu.bme.mit.theta.xcfa.model.XcfaLabel; +import hu.bme.mit.theta.xcfa.model.XcfaLocation; +import hu.bme.mit.theta.xcfa.model.XcfaProcedureBuilder; +import hu.bme.mit.theta.xcfa.passes.ProcedurePassManager; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.frontend.chc.ChcUtils.*; +import static hu.bme.mit.theta.frontend.chc.ChcUtils.createVars; +import static hu.bme.mit.theta.frontend.chc.ChcUtils.getTailConditionLabels; +import static hu.bme.mit.theta.frontend.chc.ChcUtils.transformConst; +import static hu.bme.mit.theta.frontend.chc.ChcUtils.transformSort; public class ChcForwardXcfaBuilder extends CHCBaseVisitor implements ChcXcfaBuilder { + private final ProcedurePassManager procedurePassManager; private XcfaProcedureBuilder builder; private XcfaLocation initLocation; private XcfaLocation errorLocation; private final Map locations = new HashMap<>(); + public ChcForwardXcfaBuilder(final ProcedurePassManager procedurePassManager) { + this.procedurePassManager = procedurePassManager; + } + @Override public XcfaBuilder buildXcfa(CHCParser parser) { XcfaBuilder xcfaBuilder = new XcfaBuilder("chc"); - builder = new XcfaProcedureBuilder("main", new ChcPasses()); + builder = new XcfaProcedureBuilder("main", procedurePassManager); builder.createInitLoc(); builder.createErrorLoc(); builder.createFinalLoc(); diff --git a/subprojects/frontends/chc-frontend/src/main/java/hu/bme/mit/theta/frontend/chc/ChcFrontend.java b/subprojects/frontends/chc-frontend/src/main/java/hu/bme/mit/theta/frontend/chc/ChcFrontend.java index afbfbf24c5..58e992a895 100644 --- a/subprojects/frontends/chc-frontend/src/main/java/hu/bme/mit/theta/frontend/chc/ChcFrontend.java +++ b/subprojects/frontends/chc-frontend/src/main/java/hu/bme/mit/theta/frontend/chc/ChcFrontend.java @@ -18,6 +18,8 @@ import hu.bme.mit.theta.chc.frontend.dsl.gen.CHCLexer; import hu.bme.mit.theta.chc.frontend.dsl.gen.CHCParser; import hu.bme.mit.theta.xcfa.model.XcfaBuilder; +import hu.bme.mit.theta.xcfa.passes.ProcedurePassManager; +import org.antlr.v4.runtime.BailErrorStrategy; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CommonTokenStream; @@ -35,12 +37,13 @@ public ChcFrontend(ChcTransformation transformation) { chcTransformation = transformation; } - public XcfaBuilder buildXcfa(CharStream charStream) { + public XcfaBuilder buildXcfa(CharStream charStream, ProcedurePassManager procedurePassManager) { ChcUtils.init(charStream); CHCParser parser = new CHCParser(new CommonTokenStream(new CHCLexer(charStream))); + parser.setErrorHandler(new BailErrorStrategy()); ChcXcfaBuilder chcXcfaBuilder = switch (chcTransformation) { - case FORWARD -> new ChcForwardXcfaBuilder(); - case BACKWARD -> new ChcBackwardXcfaBuilder(); + case FORWARD -> new ChcForwardXcfaBuilder(procedurePassManager); + case BACKWARD -> new ChcBackwardXcfaBuilder(procedurePassManager); default -> throw new RuntimeException("Should not be here; adapt PORTFOLIO to FW/BW beforehand."); }; diff --git a/subprojects/frontends/llvm/build.gradle.kts b/subprojects/frontends/llvm/build.gradle.kts index d8feb6aec1..84b310dabe 100644 --- a/subprojects/frontends/llvm/build.gradle.kts +++ b/subprojects/frontends/llvm/build.gradle.kts @@ -22,14 +22,38 @@ plugins { id("cpp-library") } -val enabled = current().isLinux && +/** + * This subproject builds the lib/libtheta-llvm.so if the necessary pre-requisites are met (LLVM-15 is available) + */ + +val llvmConfigBinary = try { + val output = runCommandForOutput("llvm-config", "--version") + val version = output[0].split('.') + val major = version[0] + val minor = version[1] + val patch = version[2] + if (major == "15") + "llvm-config" + else + throw IOException() +} catch (e: IOException) { try { - runCommandForOutput("llvm-config") - true + val output = runCommandForOutput("llvm-config-15", "--version") + val version = output[0].split('.') + val major = version[0] + val minor = version[1] + val patch = version[2] + if (major == "15") + "llvm-config-15" + else + throw IOException() } catch (e: IOException) { - println("LLVM not installed, not building native library.") - false + println("LLVM-15 not installed, not building native library.") + null } +} + +val taskEnabled = current().isLinux && llvmConfigBinary != null fun runCommandForOutput(vararg args: String): Array { val process = ProcessBuilder(*args).start() @@ -46,17 +70,17 @@ fun runCommandForOutput(vararg args: String): Array { } fun llvmConfigFlags(vararg args: String): Array { - if (!enabled) return arrayOf() + if (!taskEnabled) return arrayOf() return try { - runCommandForOutput("llvm-config", *args) + runCommandForOutput(llvmConfigBinary!!, *args) } catch (e: IOException) { e.printStackTrace() arrayOf() - }.also { println("LLVM flags (${args.toList()}): ${it.toList()}") } + } } fun jniConfigFlags(): Array { - if (!enabled) return arrayOf() + if (!taskEnabled) return arrayOf() val jdkHomeArr = runCommandForOutput("bash", "-c", "dirname \$(cd \$(dirname \$(readlink -f \$(which javac) || which javac)); pwd -P)") check(jdkHomeArr.size == 1) @@ -67,7 +91,7 @@ fun jniConfigFlags(): Array { return arrayOf( "-I${mainInclude.absolutePath}", "-I${linuxInclude.absolutePath}", - ).also { println("JNI flags: ${it.toList()}") } + ) } library { @@ -79,8 +103,8 @@ library { *jniConfigFlags(), *llvmConfigFlags("--cxxflags"))) onlyIf { - println("CppCompile is enabled: $enabled") - this@Build_gradle.enabled + println("CppCompile is enabled: $taskEnabled") + this@Build_gradle.taskEnabled } } @@ -90,8 +114,8 @@ library { *llvmConfigFlags("--cxxflags", "--ldflags", "--libs", "core", "bitreader"), "-ldl")) onlyIf { - println("LinkSharedLibrary is enabled: $enabled") - this@Build_gradle.enabled + println("LinkSharedLibrary is enabled: $taskEnabled") + this@Build_gradle.taskEnabled } } } \ No newline at end of file diff --git a/subprojects/frontends/llvm/src/main/cpp/passes/gazer/Intrinsics.cpp b/subprojects/frontends/llvm/src/main/cpp/passes/gazer/Intrinsics.cpp index dfc92d087a..cfebf95573 100644 --- a/subprojects/frontends/llvm/src/main/cpp/passes/gazer/Intrinsics.cpp +++ b/subprojects/frontends/llvm/src/main/cpp/passes/gazer/Intrinsics.cpp @@ -34,60 +34,6 @@ static std::string getOverloadedFunctionName(llvm::StringRef prefix, llvm::Type return rso.str(); } -/* -llvm::FunctionCallee GazerIntrinsic::GetOrInsertFunctionEntry(llvm::Module& module, llvm::ArrayRef args) -{ - std::vector funArgs; - funArgs.push_back(llvm::Type::getMetadataTy(module.getContext())); - funArgs.insert(funArgs.end(), args.begin(), args.end()); - - auto funTy = llvm::FunctionType::get(llvm::Type::getVoidTy(module.getContext()), funArgs, false); - - std::string buffer; - llvm::raw_string_ostream rso{buffer}; - - rso << FunctionEntryPrefix; - for (auto& arg : args) { - rso << '.'; - arg->print(rso, false, true); - } - rso.flush(); - - return module.getOrInsertFunction( - rso.str(), - funTy - ); -} - -llvm::FunctionCallee GazerIntrinsic::GetOrInsertFunctionReturnVoid(llvm::Module& module) -{ - return module.getOrInsertFunction( - FunctionReturnVoidName, - llvm::Type::getVoidTy(module.getContext()), - llvm::Type::getMetadataTy(module.getContext()) - ); -} - -llvm::FunctionCallee GazerIntrinsic::GetOrInsertFunctionCallReturned(llvm::Module& module) -{ - return module.getOrInsertFunction( - FunctionCallReturnedName, - llvm::Type::getVoidTy(module.getContext()), - llvm::Type::getMetadataTy(module.getContext()) - ); -} - -llvm::FunctionCallee GazerIntrinsic::GetOrInsertFunctionReturnValue(llvm::Module& module, llvm::Type* type) -{ - // Insert a new function for this mark type - return module.getOrInsertFunction( - getOverloadedFunctionName(FunctionReturnValuePrefix, type), - llvm::Type::getVoidTy(module.getContext()), - llvm::Type::getMetadataTy(module.getContext()), - type - ); -} -*/ llvm::FunctionCallee GazerIntrinsic::GetOrInsertInlinedGlobalWrite(llvm::Module &module, llvm::Type *type) { return module.getOrInsertFunction( getOverloadedFunctionName("gazer.inlined_global.write.", type), @@ -96,32 +42,4 @@ llvm::FunctionCallee GazerIntrinsic::GetOrInsertInlinedGlobalWrite(llvm::Module type, llvm::Type::getMetadataTy(module.getContext()) ); -} -/* -llvm::FunctionCallee GazerIntrinsic::GetOrInsertOverflowCheck(llvm::Module& module, Overflow kind, llvm::Type* type) -{ - std::string name; - - switch (kind) { - case Overflow::SAdd: name = SAddNoOverflowPrefix; break; - case Overflow::UAdd: name = UAddNoOverflowPrefix; break; - case Overflow::SSub: name = SSubNoOverflowPrefix; break; - case Overflow::USub: name = USubNoOverflowPrefix; break; - case Overflow::SMul: name = SMulNoOverflowPrefix; break; - case Overflow::UMul: name = UMulNoOverflowPrefix; break; - default: - llvm_unreachable("Unknown overflow kind!"); - } - - llvm::raw_string_ostream rso(name); - type->print(rso, false, true); - rso.flush(); - - return module.getOrInsertFunction( - name, - llvm::Type::getInt1Ty(module.getContext()), - type, - type - ); -} - */ \ No newline at end of file +} \ No newline at end of file diff --git a/subprojects/frontends/llvm/src/main/cpp/passes/gazer/Intrinsics.h b/subprojects/frontends/llvm/src/main/cpp/passes/gazer/Intrinsics.h index daa683efe2..01fa776cc9 100644 --- a/subprojects/frontends/llvm/src/main/cpp/passes/gazer/Intrinsics.h +++ b/subprojects/frontends/llvm/src/main/cpp/passes/gazer/Intrinsics.h @@ -28,55 +28,12 @@ namespace gazer { class GazerIntrinsic { - public: - /* - static constexpr char FunctionEntryPrefix[] = "gazer.function.entry"; - static constexpr char FunctionReturnVoidName[] = "gazer.function.return_void"; - static constexpr char FunctionCallReturnedName[] = "gazer.function.call_returned"; - static constexpr char FunctionReturnValuePrefix[] = "gazer.function.return_value."; - */ - // static constexpr char InlinedGlobalWritePrefix[] = "gazer.inlined_global.write."; // TODO debug this - undefined reference to this from Intrinsics.cpp - - /* - static constexpr char NoOverflowPrefix[] = "gazer.no_overflow"; - - static constexpr char SAddNoOverflowPrefix[] = "gazer.no_overflow.sadd."; - static constexpr char SSubNoOverflowPrefix[] = "gazer.no_overflow.ssub."; - static constexpr char SMulNoOverflowPrefix[] = "gazer.no_overflow.smul."; - static constexpr char SDivNoOverflowPrefix[] = "gazer.no_overflow.sdiv."; - - static constexpr char UAddNoOverflowPrefix[] = "gazer.no_overflow.uadd."; - static constexpr char USubNoOverflowPrefix[] = "gazer.no_overflow.usub."; - static constexpr char UMulNoOverflowPrefix[] = "gazer.no_overflow.umul."; - - enum class Overflow - { - SAdd, UAdd, SSub, USub, SMul, UMul - }; - */ public: static llvm::CallInst *CreateInlinedGlobalWrite(llvm::Value *value, llvm::DIGlobalVariable *gv); - //static llvm::CallInst* CreateFunctionEntry(llvm::Module& module, llvm::DISubprogram* dsp = nullptr); public: - /// Returns a 'gazer.function.entry(metadata fn_name, args...)' intrinsic. - //static llvm::FunctionCallee GetOrInsertFunctionEntry(llvm::Module& module, llvm::ArrayRef args); - - /// Returns a 'gazer.function.return_void(metadata fn_name)' intrinsic. - //static llvm::FunctionCallee GetOrInsertFunctionReturnVoid(llvm::Module& module); - - /// Returns a 'gazer.function.call_returned(metadata fn_name)' intrinsic. - //static llvm::FunctionCallee GetOrInsertFunctionCallReturned(llvm::Module& module); - - /// Returns a 'gazer.function.return_value.T(metadata fn_name, T retval)' intrinsic, - /// where 'T' is the given return type. - //static llvm::FunctionCallee GetOrInsertFunctionReturnValue(llvm::Module& module, llvm::Type* type); - - /// Returns a 'gazer.inlined_global_write.T(T value, metadata gv_name)' intrinsic. static llvm::FunctionCallee GetOrInsertInlinedGlobalWrite(llvm::Module &module, llvm::Type *type); - /// Returns a 'gazer.KIND.no_overflow.T(T left, T right)' intrinsic. - //static llvm::FunctionCallee GetOrInsertOverflowCheck(llvm::Module& module, Overflow kind, llvm::Type* type); }; } diff --git a/subprojects/frontends/llvm/src/main/cpp/passes/gazer/Passes.h b/subprojects/frontends/llvm/src/main/cpp/passes/gazer/Passes.h index 0853cb5a0c..0549c95d77 100644 --- a/subprojects/frontends/llvm/src/main/cpp/passes/gazer/Passes.h +++ b/subprojects/frontends/llvm/src/main/cpp/passes/gazer/Passes.h @@ -22,16 +22,6 @@ namespace gazer { -/// InlineGlobalVariables - This pass inlines all global variables into -/// the main function of the program. -// llvm::Pass *createInlineGlobalVariablesPass(); - -/// This pass combines each 'gazer.error_code' call within the function -/// into a single one. -// llvm::Pass* createLiftErrorCallsPass(llvm::Function& entry); - -/// This pass normalizes some known verifier calls into a uniform format. -// llvm::Pass* createNormalizeVerifierCallsPass(); // Added from LLVMFrontendSettings.h enum class InlineLevel { @@ -43,8 +33,6 @@ namespace gazer { /// A simpler (and more restricted) inlining pass. llvm::Pass *createSimpleInlinerPass(llvm::Function &entry, InlineLevel level); -// llvm::Pass* createCanonizeLoopExitsPass(); - } #endif diff --git a/subprojects/frontends/llvm/src/main/cpp/types/Instruction.cpp b/subprojects/frontends/llvm/src/main/cpp/types/Instruction.cpp index b1f728eb69..69773f751f 100644 --- a/subprojects/frontends/llvm/src/main/cpp/types/Instruction.cpp +++ b/subprojects/frontends/llvm/src/main/cpp/types/Instruction.cpp @@ -65,7 +65,7 @@ Instruction::Instruction(llvm::Instruction &inst) { std::cerr << "Instruction: " << std::endl; inst.print(llvm::errs()); std::cerr << std::endl; - abort(); +// abort(); } } diff --git a/subprojects/frontends/llvm/src/main/cpp/utilities/CPipeline.cpp b/subprojects/frontends/llvm/src/main/cpp/utilities/CPipeline.cpp index 07a6361bf2..e3906dfc5e 100644 --- a/subprojects/frontends/llvm/src/main/cpp/utilities/CPipeline.cpp +++ b/subprojects/frontends/llvm/src/main/cpp/utilities/CPipeline.cpp @@ -18,27 +18,28 @@ CPipeline::CPipeline(std::string _filename, std::string _clangCLI) { std::string filenameExtension = _filename.substr(_filename.length() - 2, _filename.length()); if (!(filenameExtension.compare(".c") || filenameExtension.compare(".i"))) { std::cerr << "Error: Input file should be a .c or .i file!" << std::endl; - abort(); +// abort(); + } + else { + this->clangCli = _clangCLI; + this->filename = _filename; + this->bcFilename = filename.substr(0, filename.length() - 2) + ".bc"; + + //std::cout << this->bcFilename << std::endl; + this->clangArgs = std::vector < llvm::StringRef > { + this->clangCli, + "-g", + "-c", + "-O0", + "-emit-llvm", + "-Xclang", "-disable-O0-optnone", + "-o", this->bcFilename, + this->filename + }; } - - this->clangCli = _clangCLI; - this->filename = _filename; - this->bcFilename = filename.substr(0, filename.length() - 2) + ".bc"; - - //std::cout << this->bcFilename << std::endl; - this->clangArgs = std::vector < llvm::StringRef > { - this->clangCli, - "-g", - "-c", - "-O0", - "-emit-llvm", - "-Xclang", "-disable-O0-optnone", - "-o", this->bcFilename, - this->filename - }; } -void CPipeline::executeClang() { +bool CPipeline::executeClang() { std::string clangErrors; int returnCode = llvm::sys::ExecuteAndWait( @@ -52,14 +53,14 @@ void CPipeline::executeClang() { ); if (returnCode == -1) { - llvm::errs() << "ERROR: failed to execute clang: " + std::cerr << "ERROR: failed to execute clang: " << (clangErrors.empty() ? "Unknown error." : clangErrors) << "\n"; - abort(); + return false; } if (returnCode != 0) { - llvm::errs() << "ERROR: clang exited with a non-zero exit code.\n"; - abort(); + std::cerr << "ERROR: clang exited with a non-zero exit code.\n"; + return false; } llvm::SMDiagnostic error; @@ -67,9 +68,10 @@ void CPipeline::executeClang() { this->module = parseIRFile(bcFilename, error, context); if (module == nullptr) { - std::cout << "Error while parsing: null module!" << std::endl; - abort(); + std::cout << "Could not parse module" << std::endl; + return false; } + return true; } void CPipeline::executeOptimizationPasses() { @@ -81,119 +83,122 @@ void CPipeline::executeOptimizationPasses() { auto mainPtr = module->getFunction("main"); if (mainPtr == nullptr) { std::cerr << "ERROR: entry function (main) not found" << std::endl; - abort(); } + else { - if (PassGroupManager::enableInlining) { - pm.add(llvm::createInternalizePass([this](auto &gv) { - if (auto fun = llvm::dyn_cast(&gv)) { - return module->getFunction("main") == fun; - } else if(auto gvar = llvm::dyn_cast(&gv)) { - return true; - } - return false; - })); - // For now we hardcode main as the entry function and all as inline level - pm.add(gazer::createSimpleInlinerPass(*mainPtr, gazer::InlineLevel::All)); - pm.add(llvm::createGlobalDCEPass()); // Remove dead functions - - - // Transform the generated alloca instructions into registers - pm.add(llvm::createPromoteMemoryToRegisterPass()); - } + if (PassGroupManager::enableInlining) { + pm.add(llvm::createInternalizePass([this](auto &gv) { + if (auto fun = llvm::dyn_cast(&gv)) { + return module->getFunction("main") == fun; + } else if(auto gvar = llvm::dyn_cast(&gv)) { + return true; + } + return false; + })); + // For now we hardcode main as the entry function and all as inline level + pm.add(gazer::createSimpleInlinerPass(*mainPtr, gazer::InlineLevel::All)); + pm.add(llvm::createGlobalDCEPass()); // Remove dead functions - if (PassGroupManager::enableOptimizations) { - // Start with some metadata-based typed AA - pm.add(llvm::createTypeBasedAAWrapperPass()); - pm.add(llvm::createScopedNoAliasAAWrapperPass()); - pm.add(llvm::createBasicAAWrapperPass()); - // Split call sites under conditionals - pm.add(llvm::createCallSiteSplittingPass()); + // Transform the generated alloca instructions into registers + pm.add(llvm::createPromoteMemoryToRegisterPass()); + } - // Do some inter-procedural reductions - pm.add(llvm::createIPSCCPPass()); - pm.add(llvm::createGlobalOptimizerPass()); - pm.add(llvm::createDeadArgEliminationPass()); + if (PassGroupManager::enableOptimizations) { + // Start with some metadata-based typed AA + pm.add(llvm::createTypeBasedAAWrapperPass()); + pm.add(llvm::createScopedNoAliasAAWrapperPass()); + pm.add(llvm::createBasicAAWrapperPass()); - // Clean up - pm.add(llvm::createInstructionCombiningPass()); - pm.add(createEliminationPass()); // must be after createInstructionCombiningPass, otherwise weird things happen + // Split call sites under conditionals + pm.add(llvm::createCallSiteSplittingPass()); - // Note: CFG simplifier can do some problematic stuff, like creating logical binary ops from phi node - icmp combinations - /* - llvm::SimplifyCFGOptions options = llvm::SimplifyCFGOptions(1, false, false, true, false, nullptr, false, false); - llvm::Pass* scfgpass = new llvm::SimplifyCFGPass(options); - pm.add(scfgpass); - llvm::createCFGSimplificationPass() - */ + // Do some inter-procedural reductions + pm.add(llvm::createIPSCCPPass()); + pm.add(llvm::createGlobalOptimizerPass()); + pm.add(llvm::createDeadArgEliminationPass()); - // pm.add(llvm::createCFGSimplificationPass()); + // Clean up + pm.add(llvm::createInstructionCombiningPass()); + pm.add(createEliminationPass()); // must be after createInstructionCombiningPass, otherwise weird things happen - // pm.add(llvm::createSROAPass()); - // pm.add(gazer::createPromoteUndefsPass()); // SROA may introduce new undef values, so we run another promote undef pass after it + // Note: CFG simplifier can do some problematic stuff, like creating logical binary ops from phi node - icmp combinations + /* + llvm::SimplifyCFGOptions options = llvm::SimplifyCFGOptions(1, false, false, true, false, nullptr, false, false); + llvm::Pass* scfgpass = new llvm::SimplifyCFGPass(options); + pm.add(scfgpass); + llvm::createCFGSimplificationPass() + */ - // // pm.add(llvm::createPrintModulePass(llvm::outs())); - // pm.add(llvm::createEarlyCSEPass()); + // pm.add(llvm::createCFGSimplificationPass()); - // // pm.add(llvm::createCFGSimplificationPass()); - // pm.add(llvm::createAggressiveInstCombinerPass()); - // pm.add(llvm::createInstructionCombiningPass()); + // pm.add(llvm::createSROAPass()); + // pm.add(gazer::createPromoteUndefsPass()); // SROA may introduce new undef values, so we run another promote undef pass after it - // // Try to remove irreducible control flow - // pm.add(llvm::createStructurizeCFGPass()); + // // pm.add(llvm::createPrintModulePass(llvm::outs())); + // pm.add(llvm::createEarlyCSEPass()); - // // Optimize loops - // pm.add(llvm::createLoopInstSimplifyPass()); - // pm.add(llvm::createLoopSimplifyCFGPass()); - // pm.add(llvm::createLoopRotatePass()); - // pm.add(llvm::createLICMPass()); + // // pm.add(llvm::createCFGSimplificationPass()); + // pm.add(llvm::createAggressiveInstCombinerPass()); + // pm.add(llvm::createInstructionCombiningPass()); - // // pm.add(llvm::createCFGSimplificationPass()); - // pm.add(llvm::createInstructionCombiningPass()); + // // Try to remove irreducible control flow + // pm.add(llvm::createStructurizeCFGPass()); - // pm.add(llvm::createIndVarSimplifyPass()); - // pm.add(llvm::createLoopStrengthReducePass()); // needed by indvarsimplify (see LLVM passes reference manual) - // pm.add(llvm::createLoopDeletionPass()); + // // Optimize loops + // pm.add(llvm::createLoopInstSimplifyPass()); + // pm.add(llvm::createLoopSimplifyCFGPass()); + // pm.add(llvm::createLoopRotatePass()); + // pm.add(llvm::createLICMPass()); - // pm.add(llvm::createNewGVNPass()); + // // pm.add(llvm::createCFGSimplificationPass()); + // pm.add(llvm::createInstructionCombiningPass()); - } - pm.add(createEliminateGepPass()); + // pm.add(llvm::createIndVarSimplifyPass()); + // pm.add(llvm::createLoopStrengthReducePass()); // needed by indvarsimplify (see LLVM passes reference manual) + // pm.add(llvm::createLoopDeletionPass()); - // Note: CFG simplifier can do some problematic stuff, like creating logical binary ops from phi node - icmp combinations - // more problems: we can lose assumption line metadata on this as well - // and if used so late, it can merge icmps into a logical or/other op and that probably won't be usable when giving cex - // pm.add(llvm::createCFGSimplificationPass()); // simplifies CFG of a function, (good as a clean up?), later/sooner? + // pm.add(llvm::createNewGVNPass()); - // "cleanup": - if (PassGroupManager::enableCleanupPasses) { - pm.add(llvm::createInstructionCombiningPass()); // algebraic simplification (does not modify CFG), -instcombine - // https://llvm.org/doxygen/classllvm_1_1SimplifyCFGPass.html#details + } + pm.add(createEliminateGepPass()); - pm.add(llvm::createDeadArgEliminationPass()); // -deadargelim - pm.add(llvm::createRedundantDbgInstEliminationPass()); // -die (I mean the LLVM flag - not as a threat) - pm.add(gazer::createPromoteUndefsPass()); // cleanups can bring undefs - } + // Note: CFG simplifier can do some problematic stuff, like creating logical binary ops from phi node - icmp combinations + // more problems: we can lose assumption line metadata on this as well + // and if used so late, it can merge icmps into a logical or/other op and that probably won't be usable when giving cex + // pm.add(llvm::createCFGSimplificationPass()); // simplifies CFG of a function, (good as a clean up?), later/sooner? + + // "cleanup": + if (PassGroupManager::enableCleanupPasses) { + pm.add(llvm::createInstructionCombiningPass()); // algebraic simplification (does not modify CFG), -instcombine + // https://llvm.org/doxygen/classllvm_1_1SimplifyCFGPass.html#details + + pm.add(llvm::createDeadArgEliminationPass()); // -deadargelim + pm.add(llvm::createRedundantDbgInstEliminationPass()); // -die (I mean the LLVM flag - not as a threat) + pm.add(gazer::createPromoteUndefsPass()); // cleanups can bring undefs + } - pm.add(createToposortPass()); - // pm.add(createPhiEliminationPass()); + pm.add(createToposortPass()); + // pm.add(createPhiEliminationPass()); - // pm.add(llvm::createDemoteRegisterToMemoryPass()); - pm.add(gazer::createPromoteUndefsPass()); // cleanups can bring undefs + // pm.add(llvm::createDemoteRegisterToMemoryPass()); + pm.add(gazer::createPromoteUndefsPass()); // cleanups can bring undefs - pm.add(createTransformHandlesToIntPass()); - pm.add(llvm::createStripDeadPrototypesPass()); + pm.add(createTransformHandlesToIntPass()); + pm.add(llvm::createStripDeadPrototypesPass()); - // FatalErrors = false - it won't kill our process for each error (maybe for some?) - // it will print, what it finds to stderr - pm.add(llvm::createVerifierPass(false)); + // FatalErrors = false - it won't kill our process for each error (maybe for some?) + // it will print, what it finds to stderr + pm.add(llvm::createVerifierPass(false)); - pm.run(*module); + pm.run(*module); + } } std::unique_ptr CPipeline::processCProgram() { - executeClang(); - executeOptimizationPasses(); - return std::move(module); // we move this out of here - can be done only once! + if(executeClang()) { + executeOptimizationPasses(); + return std::move(module); // we move this out of here - can be done only once! + } + else return nullptr; } \ No newline at end of file diff --git a/subprojects/frontends/llvm/src/main/cpp/utilities/CPipeline.h b/subprojects/frontends/llvm/src/main/cpp/utilities/CPipeline.h index 6f872faf12..90f266f56b 100644 --- a/subprojects/frontends/llvm/src/main/cpp/utilities/CPipeline.h +++ b/subprojects/frontends/llvm/src/main/cpp/utilities/CPipeline.h @@ -18,7 +18,7 @@ class CPipeline { std::string clangCli; std::unique_ptr module = nullptr; // parsed from .bc at the end of executeClang - void executeClang(); + bool executeClang(); void executeOptimizationPasses(); diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibSolverInstaller.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibSolverInstaller.java index 1f22b1988e..877b830e53 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibSolverInstaller.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibSolverInstaller.java @@ -96,7 +96,9 @@ public SolverFactory getSolverFactory(final Path installDir, final String versio @Override public List getSupportedVersions() { - return Arrays.asList("1.0.2", "1.0.1", "1.0.0"); + return Arrays.asList( + "1.0.8", "1.0.7", "1.0.6", "1.0.5", "1.0.4", "1.0.3", "1.0.2", "1.0.1", "1.0.0" + ); } private URL getDownloadUrl(final String version) throws SmtLibSolverInstallerException, MalformedURLException { diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/mathsat/MathSATSmtLibSolverInstaller.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/mathsat/MathSATSmtLibSolverInstaller.java index df073cb186..e067faf099 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/mathsat/MathSATSmtLibSolverInstaller.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/mathsat/MathSATSmtLibSolverInstaller.java @@ -170,7 +170,7 @@ public SolverFactory getSolverFactory(final Path installDir, final String versio @Override public List getSupportedVersions() { return Arrays.asList( - "5.6.8", "5.6.7", "5.6.6", "5.6.5", "5.6.4", "5.6.3", "5.6.2", "5.6.1", "5.6.0", + "5.6.10", "5.6.9", "5.6.8", "5.6.7", "5.6.6", "5.6.5", "5.6.4", "5.6.3", "5.6.2", "5.6.1", "5.6.0", "5.5.4", "5.5.3", "5.5.2", "5.5.1", "5.5.0", "5.4.1", "5.4.0", "5.3.14", "5.3.13", "5.3.12", "5.3.11", "5.3.10", "5.3.9", "5.3.8", "5.3.7", "5.3.6", diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/princess/PrincessSmtLibSolverInstaller.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/princess/PrincessSmtLibSolverInstaller.java index 40caafbe0e..4c1d124653 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/princess/PrincessSmtLibSolverInstaller.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/princess/PrincessSmtLibSolverInstaller.java @@ -90,7 +90,7 @@ public SolverFactory getSolverFactory(final Path installDir, final String versio @Override public List getSupportedVersions() { return Arrays.asList( - "2022-07-01", "2021-11-15", + "2023-06-19", "2023-04-07", "2022-11-03", "2022-07-01", "2021-11-15", "2021-05-10", "2021-03-10", "2020-03-12", "2019-10-02", "2019-07-24", "2018-10-26", "2018-05-25", "2018-01-27", "2017-12-06", "2017-07-17" ); diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/smtinterpol/SMTInterpolSmtLibSolverInstaller.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/smtinterpol/SMTInterpolSmtLibSolverInstaller.java index 065664320f..ed4d0bba13 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/smtinterpol/SMTInterpolSmtLibSolverInstaller.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/smtinterpol/SMTInterpolSmtLibSolverInstaller.java @@ -81,13 +81,16 @@ public SolverFactory getSolverFactory(final Path installDir, final String versio @Override public List getSupportedVersions() { - return Arrays.asList("2.5-1230", "2.5-916", "2.5-663", "2.5-479", "2.5-7"); + return Arrays.asList("2.5-1256", "2.5-1230", "2.5-916", "2.5-663", "2.5-479", "2.5-7"); } private URL getDownloadUrl(final String version) throws SmtLibSolverInstallerException, MalformedURLException { final String fileName; switch (version) { + case "2.5-1256": + fileName = "2.5-1230-g55d6ba76"; + break; case "2.5-1230": fileName = "2.5-1230-g3eafb46a"; break; diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3SmtLibSolverInstaller.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3SmtLibSolverInstaller.java index 2d9a8bdce4..12443a2c8b 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3SmtLibSolverInstaller.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3SmtLibSolverInstaller.java @@ -44,6 +44,13 @@ public Z3SmtLibSolverInstaller(final Logger logger) { super(logger); versions = new ArrayList<>(); + versions.add(SemVer.VersionDecoder.create(SemVer.of("4.12.0")) + .addString(LINUX, X64, "x64-glibc-2.35") + .addString(WINDOWS, X64, "x64-win") + .addString(WINDOWS, X86, "x86-win") + .addString(MAC, X64, "x64-osx-10.16") + .build() + ); versions.add(SemVer.VersionDecoder.create(SemVer.of("4.8.12")) .addString(LINUX, X64, "x64-glibc-2.31") .addString(WINDOWS, X64, "x64-win") @@ -185,7 +192,7 @@ public SolverFactory getSolverFactory(final Path installDir, final String versio @Override public List getSupportedVersions() { return Arrays.asList( - "4.11.2", "4.11.0", "4.10.2", "4.10.1", "4.10.0", "4.9.1", "4.9.0", + "4.12.2", "4.12.1", "4.12.0", "4.11.2", "4.11.0", "4.10.2", "4.10.1", "4.10.0", "4.9.1", "4.9.0", "4.8.17", "4.8.16", "4.8.15", "4.8.14", "4.8.13", "4.8.12", "4.8.11", "4.8.10", "4.8.9", "4.8.8", "4.8.7", "4.8.6", "4.8.5", "4.8.4", "4.8.3", "4.8.2", "4.8.1", "4.7.1", "4.6.0", "4.5.0", diff --git a/subprojects/sts/sts-analysis/src/main/java/hu/bme/mit/theta/sts/analysis/StsToMonoliticTransFunc.java b/subprojects/sts/sts-analysis/src/main/java/hu/bme/mit/theta/sts/analysis/StsToMonoliticTransFunc.java new file mode 100644 index 0000000000..6ca93077e7 --- /dev/null +++ b/subprojects/sts/sts-analysis/src/main/java/hu/bme/mit/theta/sts/analysis/StsToMonoliticTransFunc.java @@ -0,0 +1,45 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.sts.analysis; + +import hu.bme.mit.theta.analysis.algorithm.AbstractMonolithicTransFunc; +import hu.bme.mit.theta.analysis.algorithm.MonolithicTransFunc; +import hu.bme.mit.theta.analysis.expl.ExplState; +import hu.bme.mit.theta.core.decl.VarDecl; +import hu.bme.mit.theta.core.model.Valuation; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.utils.indexings.VarIndexing; +import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory; +import hu.bme.mit.theta.solver.SolverFactory; +import hu.bme.mit.theta.sts.STS; + +import java.util.Collection; +import java.util.function.Function; + +public class StsToMonoliticTransFunc extends AbstractMonolithicTransFunc { + private StsToMonoliticTransFunc(STS sts) { + transExpr = sts.getTrans(); + initExpr = sts.getInit(); + propExpr = sts.getProp(); + firstIndex = VarIndexingFactory.indexing(0); + offsetIndex = VarIndexingFactory.indexing(1); + } + + public static MonolithicTransFunc create(STS sts) { + return new StsToMonoliticTransFunc(sts); + } +} diff --git a/subprojects/sts/sts-cli/src/main/java/hu/bme/mit/theta/sts/cli/StsCli.java b/subprojects/sts/sts-cli/src/main/java/hu/bme/mit/theta/sts/cli/StsCli.java index 2edf48c6ba..d02e8def6b 100644 --- a/subprojects/sts/sts-cli/src/main/java/hu/bme/mit/theta/sts/cli/StsCli.java +++ b/subprojects/sts/sts-cli/src/main/java/hu/bme/mit/theta/sts/cli/StsCli.java @@ -15,18 +15,16 @@ */ package hu.bme.mit.theta.sts.cli; -import java.io.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.Stream; - import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.beust.jcommander.ParameterException; import com.google.common.base.Stopwatch; - import hu.bme.mit.theta.analysis.Trace; import hu.bme.mit.theta.analysis.algorithm.SafetyResult; import hu.bme.mit.theta.analysis.algorithm.cegar.CegarStatistics; +import hu.bme.mit.theta.analysis.algorithm.imc.ImcChecker; +import hu.bme.mit.theta.analysis.algorithm.kind.KIndChecker; +import hu.bme.mit.theta.analysis.expl.ExplState; import hu.bme.mit.theta.analysis.expr.ExprState; import hu.bme.mit.theta.analysis.expr.refinement.PruneStrategy; import hu.bme.mit.theta.common.CliUtils; @@ -40,8 +38,7 @@ import hu.bme.mit.theta.core.model.Valuation; import hu.bme.mit.theta.core.type.booltype.BoolExprs; import hu.bme.mit.theta.core.utils.ExprUtils; -import hu.bme.mit.theta.solver.*; -import hu.bme.mit.theta.solver.z3.*; +import hu.bme.mit.theta.solver.z3.Z3SolverFactory; import hu.bme.mit.theta.sts.STS; import hu.bme.mit.theta.sts.StsUtils; import hu.bme.mit.theta.sts.aiger.AigerParser; @@ -49,9 +46,8 @@ import hu.bme.mit.theta.sts.aiger.elements.AigerSystem; import hu.bme.mit.theta.sts.aiger.utils.AigerCoi; import hu.bme.mit.theta.sts.analysis.StsAction; +import hu.bme.mit.theta.sts.analysis.StsToMonoliticTransFunc; import hu.bme.mit.theta.sts.analysis.StsTraceConcretizer; -import hu.bme.mit.theta.sts.dsl.StsDslManager; -import hu.bme.mit.theta.sts.dsl.StsSpec; import hu.bme.mit.theta.sts.analysis.config.StsConfig; import hu.bme.mit.theta.sts.analysis.config.StsConfigBuilder; import hu.bme.mit.theta.sts.analysis.config.StsConfigBuilder.Domain; @@ -59,6 +55,17 @@ import hu.bme.mit.theta.sts.analysis.config.StsConfigBuilder.PredSplit; import hu.bme.mit.theta.sts.analysis.config.StsConfigBuilder.Refinement; import hu.bme.mit.theta.sts.analysis.config.StsConfigBuilder.Search; +import hu.bme.mit.theta.sts.dsl.StsDslManager; +import hu.bme.mit.theta.sts.dsl.StsSpec; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.concurrent.TimeUnit; +import java.util.stream.Stream; /** * A command line interface for running a CEGAR configuration on an STS. @@ -69,9 +76,18 @@ public class StsCli { private final String[] args; private final TableWriter writer; + enum Algorithm { + CEGAR, + KINDUCTION, + IMC + } + @Parameter(names = {"--domain"}, description = "Abstract domain") Domain domain = Domain.PRED_CART; + @Parameter(names = {"--algorithm"}, description = "Algorithm") + Algorithm algorithm = Algorithm.CEGAR; + @Parameter(names = {"--refinement"}, description = "Refinement strategy") Refinement refinement = Refinement.SEQ_ITP; @@ -145,8 +161,20 @@ private void run() { try { final Stopwatch sw = Stopwatch.createStarted(); final STS sts = loadModel(); - final StsConfig configuration = buildConfiguration(sts); - final SafetyResult status = check(configuration); + + SafetyResult status = null; + if (algorithm.equals(Algorithm.CEGAR)) { + final StsConfig configuration = buildConfiguration(sts); + status = check(configuration); + } else if (algorithm.equals(Algorithm.KINDUCTION)) { + var transFunc = StsToMonoliticTransFunc.create(sts); + var checker = new KIndChecker<>(transFunc, Integer.MAX_VALUE, 0, 1, Z3SolverFactory.getInstance().createSolver(), Z3SolverFactory.getInstance().createSolver(), ExplState::of, null, sts.getVars()); + status = checker.check(null); + } else if (algorithm.equals(Algorithm.IMC)) { + var transFunc = StsToMonoliticTransFunc.create(sts); + var checker = new ImcChecker<>(transFunc, Integer.MAX_VALUE, Z3SolverFactory.getInstance().createItpSolver(), ExplState::of, sts.getVars(), null); + status = checker.check(null); + } sw.stop(); printResult(status, sts, sw.elapsed(TimeUnit.MILLISECONDS)); if (status.isUnsafe() && cexfile != null) { @@ -267,4 +295,4 @@ private void writeCex(final STS sts, final SafetyResult.Unsafe status) } } } -} +} \ No newline at end of file diff --git a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt index 983ba865b1..5931d24699 100644 --- a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt +++ b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt @@ -18,6 +18,8 @@ package hu.bme.mit.theta.c2xcfa import com.google.common.base.Preconditions +import hu.bme.mit.theta.common.logging.Logger +import hu.bme.mit.theta.common.logging.Logger.Level import hu.bme.mit.theta.core.decl.Decls import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.stmt.AssignStmt @@ -50,7 +52,8 @@ import java.util.Set import java.util.stream.Collectors import kotlin.collections.set -class FrontendXcfaBuilder(val parseContext: ParseContext, val checkOverflow: Boolean = false) : +class FrontendXcfaBuilder(val parseContext: ParseContext, val checkOverflow: Boolean = false, + val uniqueWarningLogger: Logger) : CStatementVisitorBase() { private val locationLut: MutableMap = LinkedHashMap() @@ -83,8 +86,8 @@ class FrontendXcfaBuilder(val parseContext: ParseContext, val checkOverflow: Boo for (globalDeclaration in cProgram.globalDeclarations) { val type = CComplexType.getType(globalDeclaration.get2().ref, parseContext) if (type is CVoid || type is CStruct) { - System.err.println( - "WARNING: Not handling init expression of " + globalDeclaration.get1() + " as it is non initializable") + uniqueWarningLogger.write(Level.INFO, + "WARNING: Not handling init expression of " + globalDeclaration.get1() + " as it is non initializable\n") continue } builder.addVar(XcfaGlobalVar(globalDeclaration.get2(), type.nullValue)) @@ -116,7 +119,7 @@ class FrontendXcfaBuilder(val parseContext: ParseContext, val checkOverflow: Boo val flatVariables = function.flatVariables val funcDecl = function.funcDecl val compound = function.compound - val builder = XcfaProcedureBuilder(funcDecl.name, CPasses(checkOverflow, parseContext)) + val builder = XcfaProcedureBuilder(funcDecl.name, CPasses(checkOverflow, parseContext, uniqueWarningLogger)) xcfaBuilder.addProcedure(builder) for (flatVariable in flatVariables) { builder.addVar(flatVariable) @@ -129,7 +132,7 @@ class FrontendXcfaBuilder(val parseContext: ParseContext, val checkOverflow: Boo } else { // TODO we assume later that there is always a ret var, but this should change val toAdd: VarDecl<*> = Decls.Var(funcDecl.name + "_ret", funcDecl.actualType.smtType) - val signedIntType = CSimpleTypeFactory.NamedType("int", parseContext) + val signedIntType = CSimpleTypeFactory.NamedType("int", parseContext, uniqueWarningLogger) signedIntType.setSigned(true) parseContext.metadata.create(toAdd.ref, "cType", signedIntType) builder.addParam(toAdd, ParamDirection.OUT) diff --git a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/Utils.kt b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/Utils.kt index fe9948f0ff..d6a131eb6b 100644 --- a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/Utils.kt +++ b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/Utils.kt @@ -18,6 +18,7 @@ package hu.bme.mit.theta.c2xcfa import hu.bme.mit.theta.c.frontend.dsl.gen.CLexer import hu.bme.mit.theta.c.frontend.dsl.gen.CParser +import hu.bme.mit.theta.common.logging.Logger import hu.bme.mit.theta.frontend.CStatistics import hu.bme.mit.theta.frontend.ParseContext import hu.bme.mit.theta.frontend.getStatistics @@ -30,7 +31,7 @@ import org.antlr.v4.runtime.CommonTokenStream import java.io.InputStream fun getXcfaFromC(stream: InputStream, parseContext: ParseContext, collectStatistics: Boolean, - checkOverflow: Boolean): Triple?> { + checkOverflow: Boolean, warningLogger: Logger): Triple?> { val input = CharStreams.fromStream(stream) val lexer = CLexer(input) val tokens = CommonTokenStream(lexer) @@ -38,10 +39,10 @@ fun getXcfaFromC(stream: InputStream, parseContext: ParseContext, collectStatist parser.errorHandler = BailErrorStrategy() val context = parser.compilationUnit() - val program = context.accept(FunctionVisitor(parseContext)) + val program = context.accept(FunctionVisitor(parseContext, warningLogger)) check(program is CProgram) - val frontendXcfaBuilder = FrontendXcfaBuilder(parseContext, checkOverflow) + val frontendXcfaBuilder = FrontendXcfaBuilder(parseContext, checkOverflow, warningLogger) val builder = frontendXcfaBuilder.buildXcfa(program) val xcfa = builder.build() diff --git a/subprojects/xcfa/c2xcfa/src/test/java/hu/bme/mit/theta/c2xcfa/TestFrontendXcfaBuilder.kt b/subprojects/xcfa/c2xcfa/src/test/java/hu/bme/mit/theta/c2xcfa/TestFrontendXcfaBuilder.kt index 73b1678668..1e1e8bd144 100644 --- a/subprojects/xcfa/c2xcfa/src/test/java/hu/bme/mit/theta/c2xcfa/TestFrontendXcfaBuilder.kt +++ b/subprojects/xcfa/c2xcfa/src/test/java/hu/bme/mit/theta/c2xcfa/TestFrontendXcfaBuilder.kt @@ -16,6 +16,7 @@ package hu.bme.mit.theta.c2xcfa +import hu.bme.mit.theta.common.logging.NullLogger import hu.bme.mit.theta.frontend.ParseContext import org.junit.Test import org.junit.runner.RunWith @@ -68,7 +69,7 @@ class TestFrontendXcfaBuilder { val stream = javaClass.getResourceAsStream(filepath) - getXcfaFromC(stream!!, ParseContext(), false, false) + getXcfaFromC(stream!!, ParseContext(), false, false, NullLogger.getInstance()) } @Test @@ -77,6 +78,6 @@ class TestFrontendXcfaBuilder { val stream = javaClass.getResourceAsStream(filepath) - getXcfaFromC(stream!!, ParseContext(), false, true) + getXcfaFromC(stream!!, ParseContext(), false, true, NullLogger.getInstance()) } } \ No newline at end of file diff --git a/subprojects/xcfa/cat/src/main/java/hu/bme/mit/theta/cat/solver/DatalogSolver.java b/subprojects/xcfa/cat/src/main/java/hu/bme/mit/theta/cat/solver/DatalogSolver.java deleted file mode 100644 index f1a08ce2ec..0000000000 --- a/subprojects/xcfa/cat/src/main/java/hu/bme/mit/theta/cat/solver/DatalogSolver.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2023 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package hu.bme.mit.theta.cat.solver; - -public class DatalogSolver { - -// public static void solve(final Datalog mcm, final XCFA xcfa) { -// final Map relations = mcm.getRelations(); -// final Datalog.Relation po = relations.get("po"); -// final Datalog.Relation r = relations.get("R"); -// final Datalog.Relation w = relations.get("W"); -// final Datalog.Relation f = relations.get("F"); -// for (final XcfaProcess process : xcfa.getProcesses()) { -// XcfaLocation lastLoc = process.getMainProcedure().getInitLoc(); -// while(!lastLoc.isEndLoc()) { -// if(lastLoc.getOutgoingEdges().size() != 1) throw new UnsupportedOperationException("Only branchless programs are supported for now"); -// final XcfaEdge xcfaEdge = lastLoc.getOutgoingEdges().get(0); -// if(xcfaEdge.getLabels().size() != 1) throw new UnsupportedOperationException("Only single-label edges are supported for now"); -// final XcfaLabel xcfaLabel = xcfaEdge.getLabels().get(0); -// -// if(xcfaLabel instanceof XcfaLabel.StoreXcfaLabel) w.addFact(TupleN.of(GenericDatalogArgument.createArgument(xcfaEdge.getTarget()))); -// else if(xcfaLabel instanceof XcfaLabel.LoadXcfaLabel) r.addFact(TupleN.of(GenericDatalogArgument.createArgument(xcfaEdge.getTarget()))); -// else if(xcfaLabel instanceof XcfaLabel.FenceXcfaLabel) f.addFact(TupleN.of(GenericDatalogArgument.createArgument(xcfaEdge.getTarget()))); -// -// if(lastLoc != process.getMainProcedure().getInitLoc()) po.addFact(TupleN.of(GenericDatalogArgument.createArgument(lastLoc), GenericDatalogArgument.createArgument(xcfaEdge.getTarget()))); -// -// lastLoc = xcfaEdge.getTarget(); -// } -// } -// -// final Object[] writes = w.getElements().stream().map(objects -> ((GenericDatalogArgument)objects.get(0)).getContent()).toArray(); -// final Object[] reads = r.getElements().stream().map(objects -> ((GenericDatalogArgument)objects.get(0)).getContent()).toArray(); -// generateCos(writes, mcm, null, () -> generateRfs(reads, writes, mcm, () -> { -// System.out.println("digraph G{"); -// final Datalog.Relation rf = mcm.getRelations().get("rf"); -// for (TupleN element : po.getElements()) { -// System.out.println(element.get(0) + " -> " + element.get(1) + " [color=grey]"); -// } -// for (TupleN element : rf.getElements()) { -// System.out.println(element.get(0) + " -> " + element.get(1) + " [color=red]"); -// } -// System.out.println("}"); -// System.out.println(); -// })); -// } -// -// private static void generateRfs(final Object[] reads, final Object[] writes, final Datalog mcm, final Runnable whenComplete) { -// if(reads.length > 0) { -// final Object read = reads[0]; -// for (Object write : writes) { -// mcm.push(); -// mcm.getRelations().get("rf").addFact(TupleN.of(GenericDatalogArgument.createArgument(write), GenericDatalogArgument.createArgument(read))); -// if (mcm.getRelations().get("mustBeEmpty").getElements().size() == 0) { -// generateRfs(removeOne(reads, 0), writes, mcm, whenComplete); -// } -// mcm.pop(); -// } -// } else { -// whenComplete.run(); -// } -// } -// -// private static void generateCos(final Object[] writes, final Datalog mcm, final Object last, final Runnable whenComplete) { -// if(writes.length == 0) { -// whenComplete.run(); -// } else { -// for (int i = 0; i < writes.length; i++) { -// mcm.push(); -// if (last != null) -// mcm.getRelations().get("co").addFact(TupleN.of(GenericDatalogArgument.createArgument(last), GenericDatalogArgument.createArgument(writes[i]))); -// if (mcm.getRelations().get("mustBeEmpty").getElements().size() == 0) { -// generateCos(removeOne(writes, i), mcm, writes[i], whenComplete); -// } -// mcm.pop(); -// } -// } -// } -// -// private static Object[] removeOne(final Object[] input, final int at) { -// final Object[] ret = new Object[input.length - 1]; -// int idx = 0; -// for (int i = 0; i < input.length; i++) { -// if(i != at) { -// ret[idx++] = input[i]; -// } -// } -// return ret; -// } - -} diff --git a/subprojects/xcfa/litmus-cli/src/main/java/hu/bme/mit/theta/xcfa/litmus/cli/LitmusCli.java b/subprojects/xcfa/litmus-cli/src/main/java/hu/bme/mit/theta/xcfa/litmus/cli/LitmusCli.java index 9edc0eaf09..b9af083855 100644 --- a/subprojects/xcfa/litmus-cli/src/main/java/hu/bme/mit/theta/xcfa/litmus/cli/LitmusCli.java +++ b/subprojects/xcfa/litmus-cli/src/main/java/hu/bme/mit/theta/xcfa/litmus/cli/LitmusCli.java @@ -19,13 +19,13 @@ import com.beust.jcommander.Parameter; import com.beust.jcommander.ParameterException; import com.google.common.base.Stopwatch; -import hu.bme.mit.theta.graphsolver.patterns.constraints.GraphConstraint; import hu.bme.mit.theta.cat.dsl.CatDslManager; import hu.bme.mit.theta.common.CliUtils; import hu.bme.mit.theta.common.OsHelper; import hu.bme.mit.theta.common.logging.ConsoleLogger; import hu.bme.mit.theta.common.logging.Logger; import hu.bme.mit.theta.frontend.litmus2xcfa.LitmusInterpreter; +import hu.bme.mit.theta.graphsolver.patterns.constraints.GraphConstraint; import hu.bme.mit.theta.solver.Solver; import hu.bme.mit.theta.solver.SolverManager; import hu.bme.mit.theta.solver.smtlib.SmtLibSolverManager; @@ -39,8 +39,6 @@ import java.util.List; import java.util.concurrent.TimeUnit; -import static hu.bme.mit.theta.xcfa.model.VisualizerKt.toDot; - public class LitmusCli { private static final String JAR_NAME = "theta-litmus-cli.jar"; private final String[] args; @@ -131,37 +129,6 @@ private void run() { System.out.println("}"); } -// final List processIds = listToRange(processes, -1, -1); -// -// final XcfaProcessMemEventProvider memEventProvider = new XcfaProcessMemEventProvider<>(processes.size()); -// final MultiprocLTS, XcfaProcessAction> multiprocLTS = new MultiprocLTS<>(processIds.stream().map(id -> Map.entry(id, new XcfaProcessLTS())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); -// final MultiprocInitFunc, ExplPrec> multiprocInitFunc = new MultiprocInitFunc<>(processIds.stream().map(id -> Map.entry(id, new XcfaProcessInitFunc<>(processes.get(id * -1 - 1), ExplInitFunc.create(solver, True())))).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); -// final MultiprocTransFunc, XcfaProcessAction, ExplPrec> multiprocTransFunc = new MultiprocTransFunc<>(processIds.stream().map(id -> Map.entry(id, new XcfaProcessTransFunc<>(ExplStmtTransFunc.create(solver, 10)))).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); -// final List initialWrites = xcfa.getvars().stream().filter(it -> xcfa.getInitValue(it).isPresent()).map(it -> new MemoryEvent.Write(memEventProvider.getVarId(it), it, null, Set.of(), null)).collect(Collectors.toList()); -// final XcfaProcessPartialOrd partialOrd = new XcfaProcessPartialOrd<>(ExplOrd.getInstance()); - - -// final XcfaProcessMemEventProvider memEventProvider = new XcfaProcessMemEventProvider<>(processes.size()); -// final MultiprocLTS, XcfaProcessAction> multiprocLTS = new MultiprocLTS<>(processIds.stream().map(id -> Map.entry(id, new XcfaProcessLTS())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); -// final MultiprocInitFunc, ExplPrec> multiprocInitFunc = new MultiprocInitFunc<>(processIds.stream().map(id -> Map.entry(id, new XcfaProcessInitFunc<>(processes.get(id*-1-1), ExplInitFunc.create(solver, True())))).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); -// final MultiprocTransFunc, XcfaProcessAction, ExplPrec> multiprocTransFunc = new MultiprocTransFunc<>(processIds.stream().map(id -> Map.entry(id, new XcfaProcessTransFunc<>(ExplStmtTransFunc.create(solver, 10)))).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); -// final List initialWrites = xcfa.getvars().stream().filter(it -> xcfa.getInitValue(it).isPresent()).map(it -> new MemoryEvent.Write(memEventProvider.getVarId(it), it, null, Set.of(), null)).collect(Collectors.toList()); -// final XcfaProcessPartialOrd partialOrd = new XcfaProcessPartialOrd<>(ExplOrd.getInstance()); -// -// final MutableValuation val = new MutableValuation(); -// for (VarDecl var : xcfa.getvars()) { -// val.put(var, BvUtils.bigIntegerToNeutralBvLitExpr(BigInteger.ZERO, 64)); -// } -// -// final MCMChecker, XcfaProcessAction, ExplPrec> mcmChecker = new MCMChecker<>(memEventProvider, multiprocLTS, multiprocInitFunc, multiprocTransFunc, processIds, initialWrites, partialOrd, ExplState.of(val), solver, mcm, logger); -// final MCMChecker.MCMSafetyResult mcmSafetyResult = mcmChecker.check(ExplPrec.of(xcfa.getvars().stream().filter(e -> e.getName().equals("crit")).toList())); -// if (visualize) { -// if (mcmSafetyResult.getSolutions().size() == 0) { -// logger.write(Logger.Level.RESULT, "No solutions found, nothing to visualize\n"); -// } else { -// mcmSafetyResult.visualize(); -// } -// } } } catch (final Throwable t) { t.printStackTrace(); diff --git a/subprojects/xcfa/llvm2xcfa/build.gradle.kts b/subprojects/xcfa/llvm2xcfa/build.gradle.kts index 594182d75c..b3b396367f 100644 --- a/subprojects/xcfa/llvm2xcfa/build.gradle.kts +++ b/subprojects/xcfa/llvm2xcfa/build.gradle.kts @@ -33,6 +33,7 @@ tasks.test { dependsOn(nativeLibTasks.build) val linkTask = nativeLibTasks.withType(LinkSharedLibrary::class).first() - systemProperty("java.library.path", linkTask.linkedFile.get().asFile.parent) + systemProperty("java.library.path", + linkTask.linkedFile.get().asFile.parent + ":/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib") } } diff --git a/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/handlers/states/FunctionState.java b/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/handlers/states/FunctionState.java index 9198b2fb51..907865b70a 100644 --- a/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/handlers/states/FunctionState.java +++ b/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/handlers/states/FunctionState.java @@ -58,7 +58,7 @@ public class FunctionState { public FunctionState(GlobalState globalState, Tuple3, List>> function) { this.globalState = globalState; this.function = function; - procedureBuilder = new XcfaProcedureBuilder(function.get1(), new ProcedurePassManager(List.of())); + procedureBuilder = new XcfaProcedureBuilder(function.get1(), new ProcedurePassManager()); // procedureBuilder.setName(function.get1()); localVars = new HashMap<>(); params = new HashSet<>(); diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt index 21eca21e1c..b8e04eb29a 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt @@ -36,22 +36,26 @@ import hu.bme.mit.theta.core.stmt.Stmts import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.utils.TypeUtils import hu.bme.mit.theta.solver.Solver +import hu.bme.mit.theta.xcfa.* import hu.bme.mit.theta.xcfa.analysis.XcfaProcessState.Companion.createLookup -import hu.bme.mit.theta.xcfa.getFlatLabels -import hu.bme.mit.theta.xcfa.getGlobalVars +import hu.bme.mit.theta.xcfa.analysis.coi.ConeOfInfluence import hu.bme.mit.theta.xcfa.isWritten import hu.bme.mit.theta.xcfa.model.* import hu.bme.mit.theta.xcfa.passes.changeVars -import hu.bme.mit.theta.xcfa.startsAtomic import java.util.* import java.util.function.Predicate open class XcfaAnalysis( private val corePartialOrd: PartialOrd>, private val coreInitFunc: InitFunc, XcfaPrec

>, - private val coreTransFunc: TransFunc, XcfaAction, XcfaPrec

>, + private var coreTransFunc: TransFunc, XcfaAction, XcfaPrec

>, ) : Analysis, XcfaAction, XcfaPrec

> { + init { + ConeOfInfluence.coreTransFunc = transFunc as TransFunc, XcfaAction, XcfaPrec> + coreTransFunc = ConeOfInfluence.transFunc as TransFunc, XcfaAction, XcfaPrec

> + } + override fun getPartialOrd(): PartialOrd> = corePartialOrd override fun getInitFunc(): InitFunc, XcfaPrec

> = coreInitFunc override fun getTransFunc(): TransFunc, XcfaAction, XcfaPrec

> = coreTransFunc @@ -140,21 +144,21 @@ fun getXcfaErrorPredicate( ErrorDetection.DATA_RACE -> { Predicate> { s -> val xcfa = s.xcfa!! - if (s.mutexes.containsKey("")) return@Predicate false for (process1 in s.processes) for (process2 in s.processes) if (process1.key != process2.key) for (edge1 in process1.value.locs.peek().outgoingEdges) for (edge2 in process2.value.locs.peek().outgoingEdges) { - val globalVars1 = edge1.getGlobalVars(xcfa) - val globalVars2 = edge2.getGlobalVars(xcfa) - val isAtomic1 = edge1.startsAtomic() - val isAtomic2 = edge2.startsAtomic() - if (!isAtomic1 || !isAtomic2) { - val intersection = globalVars1.keys intersect globalVars2.keys - if (intersection.any { globalVars1[it].isWritten || globalVars2[it].isWritten }) - return@Predicate true - } + val mutexes1 = s.mutexes.filterValues { it == process1.key }.keys + val mutexes2 = s.mutexes.filterValues { it == process2.key }.keys + val globalVars1 = edge1.getGlobalVarsWithNeededMutexes(xcfa, mutexes1) + val globalVars2 = edge2.getGlobalVarsWithNeededMutexes(xcfa, mutexes2) + for (v1 in globalVars1) + for (v2 in globalVars2) + if (v1.varDecl == v2.varDecl) + if (v1.access.isWritten || v2.access.isWritten) + if ((v1.mutexes intersect v2.mutexes).isEmpty()) + return@Predicate true } false } diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaMonolithicTransFunc.java b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaMonolithicTransFunc.java new file mode 100644 index 0000000000..ea58eaf1c2 --- /dev/null +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaMonolithicTransFunc.java @@ -0,0 +1,74 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.xcfa.analysis; + +import com.google.common.base.Preconditions; +import hu.bme.mit.theta.analysis.algorithm.AbstractMonolithicTransFunc; +import hu.bme.mit.theta.analysis.algorithm.MonolithicTransFunc; +import hu.bme.mit.theta.core.decl.Decls; +import hu.bme.mit.theta.core.stmt.AssignStmt; +import hu.bme.mit.theta.core.stmt.AssumeStmt; +import hu.bme.mit.theta.core.stmt.NonDetStmt; +import hu.bme.mit.theta.core.stmt.SequenceStmt; +import hu.bme.mit.theta.core.stmt.Stmt; +import hu.bme.mit.theta.core.utils.StmtUtils; +import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory; +import hu.bme.mit.theta.xcfa.UtilsKt; +import hu.bme.mit.theta.xcfa.model.StmtLabel; +import hu.bme.mit.theta.xcfa.model.XCFA; +import hu.bme.mit.theta.xcfa.model.XcfaLocation; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.And; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Neq; + +public class XcfaMonolithicTransFunc extends AbstractMonolithicTransFunc { + private XcfaMonolithicTransFunc(XCFA xcfa) { + Preconditions.checkArgument(xcfa.getInitProcedures().size() == 1); + var proc = xcfa.getInitProcedures().stream().findFirst().orElse(null).getFirst(); + assert proc != null; + Preconditions.checkArgument(proc.getEdges().stream().map(UtilsKt::getFlatLabels).noneMatch(it -> it.stream().anyMatch(i -> !(i instanceof StmtLabel)))); + Preconditions.checkArgument(proc.getErrorLoc().isPresent()); + int i = 0; + final Map map = new HashMap<>(); + for (var x : proc.getLocs()) { + map.put(x, i++); + } + var locVar = Decls.Var("__loc_", Int()); + List tranList = proc.getEdges().stream().map(e -> SequenceStmt.of(List.of( + AssumeStmt.of(Eq(locVar.getRef(), Int(map.get(e.getSource())))), + e.getLabel().toStmt(), + AssignStmt.of(locVar, Int(map.get(e.getTarget()))) + ))).collect(Collectors.toList()); + final var trans = NonDetStmt.of(tranList); + var transUnfold = StmtUtils.toExpr(trans, VarIndexingFactory.indexing(0)); + transExpr = And(transUnfold.getExprs()); + initExpr = Eq(locVar.getRef(), Int(map.get(proc.getInitLoc()))); + firstIndex = VarIndexingFactory.indexing(0); + offsetIndex = transUnfold.getIndexing(); + propExpr = Neq(locVar.getRef(), Int(map.get(proc.getErrorLoc().get()))); + } + + public static MonolithicTransFunc create(XCFA xcfa) { + return new XcfaMonolithicTransFunc(xcfa); + } +} diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt index fb291eeb91..28003bcd27 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt @@ -49,9 +49,7 @@ class XcfaSingleExprTraceRefiner(prec) assert(!arg.isSafe) { "ARG must be unsafe" } - // TODO use CexMonitor lastCex somehow? - // TODO and maybe later smarten ArgTrace up a bit so monitor does not have to explicitly be here? - val optionalNewCex = arg.cexs.findFirst() //filter(cex -> ArgCexCheckHandler.instance.checkIfCounterexampleNew(cex)).findFirst(); + val optionalNewCex = arg.cexs.findFirst() val cexToConcretize = optionalNewCex.get() val traceToConcretize = cexToConcretize.toTrace() diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt index 17520fd00d..7cf2a87b26 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaState.kt @@ -71,14 +71,31 @@ data class XcfaState @JvmOverloads constructor( "ATOMIC_BEGIN" -> changes.add { it.enterMutex("", a.pid) } "ATOMIC_END" -> changes.add { it.exitMutex("", a.pid) } in Regex("mutex_lock\\((.*)\\)") -> changes.add { state -> - state.enterMutex( - label.substring("mutex_lock".length + 1, label.length - 1), a.pid) + state.enterMutex(label.substring("mutex_lock".length + 1, label.length - 1), a.pid) } in Regex("mutex_unlock\\((.*)\\)") -> changes.add { state -> - state.exitMutex( - label.substring("mutex_unlock".length + 1, label.length - 1), a.pid) + state.exitMutex(label.substring("mutex_unlock".length + 1, label.length - 1), a.pid) } + + in Regex("start_cond_wait\\((.*)\\)") -> { + val args = label.substring("start_cond_wait".length + 1, label.length - 1).split(",") + changes.add { state -> state.enterMutex(args[0], -1) } + changes.add { state -> state.exitMutex(args[1], a.pid) } + } + + in Regex("cond_wait\\((.*)\\)") -> { + val args = label.substring("cond_wait".length + 1, label.length - 1).split(",") + changes.add { state -> state.enterMutex(args[0], a.pid) } + changes.add { state -> state.exitMutex(args[0], a.pid) } + changes.add { state -> state.enterMutex(args[1], a.pid) } + } + + in Regex("cond_signal\\((.*)\\)") -> changes.add { state -> + state.exitMutex(label.substring("cond_signal".length + 1, label.length - 1), -1) + } + + else -> error("Unknown fence label $label") } }.let { false } @@ -86,23 +103,18 @@ data class XcfaState @JvmOverloads constructor( val proc = xcfa?.procedures?.find { proc -> proc.name == it.name } ?: error( "No such method ${it.name}.") val returnStmt = SequenceLabel( - proc.params.withIndex().filter { it.value.second != ParamDirection.IN } - .map { iVal -> - StmtLabel(Assign( - cast((it.params[iVal.index] as RefExpr<*>).decl as VarDecl<*>, - iVal.value.first.type), - cast(iVal.value.first.ref, iVal.value.first.type)), - metadata = it.metadata) - }) + proc.params.withIndex().filter { it.value.second != ParamDirection.IN }.map { iVal -> + StmtLabel(Assign(cast((it.params[iVal.index] as RefExpr<*>).decl as VarDecl<*>, + iVal.value.first.type), cast(iVal.value.first.ref, iVal.value.first.type)), + metadata = it.metadata) + }) changes.add { state -> - state.invokeFunction(a.pid, proc, returnStmt, proc.params.toMap(), - it.tempLookup) + state.invokeFunction(a.pid, proc, returnStmt, proc.params.toMap(), it.tempLookup) } false } - is ReturnLabel -> changes.add { state -> state.returnFromFunction(a.pid) } - .let { true } + is ReturnLabel -> changes.add { state -> state.returnFromFunction(a.pid) }.let { true } is JoinLabel -> { changes.add { state -> state.enterMutex("${threadLookup[it.pidVar]}", a.pid) } @@ -121,12 +133,10 @@ data class XcfaState @JvmOverloads constructor( } changes.add { state -> - if (checkNotNull(state.processes[a.pid]).locs.isEmpty()) state.endProcess( - a.pid) else state + if (checkNotNull(state.processes[a.pid]).locs.isEmpty()) state.endProcess(a.pid) else state } - return Pair(changes.fold(this) { current, change -> change(current) }, - a.withLabel(SequenceLabel(newLabels))) + return Pair(changes.fold(this) { current, change -> change(current) }, a.withLabel(SequenceLabel(newLabels))) } private fun start(startLabel: StartLabel): XcfaState { @@ -151,17 +161,13 @@ data class XcfaState @JvmOverloads constructor( val pid = pidCnt++ val lookup = XcfaProcessState.createLookup(procedure, "T$pid", "") newThreadLookup[startLabel.pidVar] = pid - newProcesses[pid] = XcfaProcessState( - LinkedList(listOf(procedure.initLoc)), - prefix = "T$pid", - varLookup = LinkedList(listOf(lookup)), - returnStmts = LinkedList(listOf(returnStmt)), + newProcesses[pid] = XcfaProcessState(LinkedList(listOf(procedure.initLoc)), prefix = "T$pid", + varLookup = LinkedList(listOf(lookup)), returnStmts = LinkedList(listOf(returnStmt)), paramStmts = LinkedList(listOf(Pair( /* init */ SequenceLabel(paramList.filter { it.value != ParamDirection.OUT }.map { StmtLabel(Assign(cast(it.key.changeVars(lookup), it.key.type), - cast(it.key.changeVars(tempLookup).ref, it.key.type)), - metadata = EmptyMetaData) + cast(it.key.changeVars(tempLookup).ref, it.key.type)), metadata = EmptyMetaData) }), /* deinit */ SequenceLabel(paramList.filter { it.value != ParamDirection.IN }.map { @@ -184,11 +190,9 @@ data class XcfaState @JvmOverloads constructor( } private fun invokeFunction(pid: Int, proc: XcfaProcedure, returnStmt: XcfaLabel, - paramList: Map, ParamDirection>, - tempLookup: Map, VarDecl<*>>): XcfaState { + paramList: Map, ParamDirection>, tempLookup: Map, VarDecl<*>>): XcfaState { val newProcesses: MutableMap = LinkedHashMap(processes) - newProcesses[pid] = checkNotNull( - processes[pid]?.enterFunction(proc, returnStmt, paramList, tempLookup)) + newProcesses[pid] = checkNotNull(processes[pid]?.enterFunction(proc, returnStmt, paramList, tempLookup)) return copy(processes = newProcesses) } @@ -226,15 +230,11 @@ data class XcfaState @JvmOverloads constructor( } } -data class XcfaProcessState( - val locs: LinkedList, - val varLookup: LinkedList, VarDecl<*>>>, +data class XcfaProcessState(val locs: LinkedList, val varLookup: LinkedList, VarDecl<*>>>, val returnStmts: LinkedList = LinkedList(listOf(NopLabel)), - val paramStmts: LinkedList> = LinkedList( - listOf(Pair(NopLabel, NopLabel))), - val paramsInitialized: Boolean = false, - val prefix: String = "" -) { + val paramStmts: LinkedList> = LinkedList(listOf(Pair(NopLabel, NopLabel))), + val paramsInitialized: Boolean = false, val prefix: String = "") { + internal var popped: XcfaLocation? = null // stores if the stack was popped due to abstract stack covering fun withNewLoc(l: XcfaLocation): XcfaProcessState { @@ -250,8 +250,7 @@ data class XcfaProcessState( else -> "${locs.peek()!!} [${locs.size}], initilized=$paramsInitialized" } - fun enterFunction(xcfaProcedure: XcfaProcedure, returnStmt: XcfaLabel, - paramList: Map, ParamDirection>, + fun enterFunction(xcfaProcedure: XcfaProcedure, returnStmt: XcfaLabel, paramList: Map, ParamDirection>, tempLookup: Map, VarDecl<*>>): XcfaProcessState { val deque: LinkedList = LinkedList(locs) val varLookup: LinkedList, VarDecl<*>>> = LinkedList(varLookup) @@ -273,8 +272,8 @@ data class XcfaProcessState( cast(it.key.changeVars(lookup).ref, it.key.type)), metadata = EmptyMetaData) }), )) - return copy(locs = deque, varLookup = varLookup, returnStmts = returnStmts, - paramStmts = paramStmts, paramsInitialized = false) + return copy(locs = deque, varLookup = varLookup, returnStmts = returnStmts, paramStmts = paramStmts, + paramsInitialized = false) } fun exitFunction(): XcfaProcessState { @@ -286,8 +285,7 @@ data class XcfaProcessState( varLookup.pop() returnStmts.pop() paramStmts.pop() - return copy(locs = deque, varLookup = varLookup, returnStmts = returnStmts, - paramStmts = paramStmts) + return copy(locs = deque, varLookup = varLookup, returnStmts = returnStmts, paramStmts = paramStmts) } override fun equals(other: Any?): Boolean { @@ -304,15 +302,15 @@ data class XcfaProcessState( override fun hashCode(): Int { var result = locs.hashCode() - result = 31 * result + paramsInitialized.hashCode() // TODO FRICKIN INNER STATE HASH + result = 31 * result + paramsInitialized.hashCode() return result } companion object { fun createLookup(proc: XcfaProcedure, threadPrefix: String, - procPrefix: String): Map, VarDecl<*>> = - listOf(proc.params.map { it.first }, proc.vars).flatten().associateWith { + procPrefix: String): Map, VarDecl<*>> = listOf(proc.params.map { it.first }, proc.vars).flatten() + .associateWith { val sj = StringJoiner("::") if (threadPrefix != "") sj.add(threadPrefix) else sj.add("_") diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/coi/XcfaCoi.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/coi/XcfaCoi.kt new file mode 100644 index 0000000000..6b3238eca4 --- /dev/null +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/coi/XcfaCoi.kt @@ -0,0 +1,172 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.xcfa.analysis.coi + +import hu.bme.mit.theta.analysis.LTS +import hu.bme.mit.theta.analysis.Prec +import hu.bme.mit.theta.analysis.TransFunc +import hu.bme.mit.theta.analysis.expr.ExprState +import hu.bme.mit.theta.core.decl.VarDecl +import hu.bme.mit.theta.core.stmt.AssignStmt +import hu.bme.mit.theta.core.stmt.HavocStmt +import hu.bme.mit.theta.xcfa.* +import hu.bme.mit.theta.xcfa.analysis.XcfaAction +import hu.bme.mit.theta.xcfa.analysis.XcfaPrec +import hu.bme.mit.theta.xcfa.analysis.XcfaState +import hu.bme.mit.theta.xcfa.analysis.getXcfaLts +import hu.bme.mit.theta.xcfa.analysis.por.extension +import hu.bme.mit.theta.xcfa.analysis.por.nullableExtension +import hu.bme.mit.theta.xcfa.model.* +import java.util.* +import kotlin.math.min + +lateinit var ConeOfInfluence: XcfaCoi + +internal typealias S = XcfaState +internal typealias A = XcfaAction + +internal var XcfaAction.transFuncVersion: XcfaAction? by nullableExtension() + +abstract class XcfaCoi(protected val xcfa: XCFA) { + + var coreLts: LTS = getXcfaLts() + lateinit var coreTransFunc: TransFunc> + + protected var lastPrec: Prec? = null + protected var XcfaLocation.scc: Int by extension() + protected val directObservation: MutableMap> = mutableMapOf() + + abstract val lts: LTS + + val transFunc = TransFunc> { state, action, prec -> + coreTransFunc.getSuccStates(state, action.transFuncVersion ?: action, prec) + } + + init { + xcfa.procedures.forEach { tarjan(it.initLoc) } + } + + private fun tarjan(initLoc: XcfaLocation) { + var sccCnt = 0 + var discCnt = 0 + val disc = mutableMapOf() + val lowest = mutableMapOf() + val visited = mutableSetOf() + val stack = Stack() + val toVisit = Stack() + toVisit.push(initLoc) + + while (toVisit.isNotEmpty()) { + val visiting = toVisit.peek() + if (visiting !in visited) { + disc[visiting] = discCnt++ + lowest[visiting] = disc[visiting]!! + stack.push(visiting) + visited.add(visiting) + } + + for (edge in visiting.outgoingEdges) { + if (edge.target in stack) { + lowest[visiting] = min(lowest[visiting]!!, lowest[edge.target]!!) + } else if (edge.target !in visited) { + toVisit.push(edge.target) + break + } + } + + if (toVisit.peek() != visiting) continue + + if (lowest[visiting] == disc[visiting]) { + val scc = sccCnt++ + while (stack.peek() != visiting) { + stack.pop().scc = scc + } + stack.pop().scc = scc // visiting + } + + toVisit.pop() + } + } + + protected fun findDirectObservers(edge: XcfaEdge, prec: Prec) { + val precVars = prec.usedVars + val writtenVars = edge.collectVarsWithAccessType().filter { it.value.isWritten && it.key in precVars } + if (writtenVars.isEmpty()) return + + val toVisit = mutableListOf(edge) + val visited = mutableSetOf() + while (toVisit.isNotEmpty()) { + val visiting = toVisit.removeFirst() + visited.add(visiting) + addEdgeIfObserved(edge, visiting, writtenVars, precVars, directObservation) + toVisit.addAll(visiting.target.outgoingEdges.filter { it !in visited }) + } + } + + protected open fun addEdgeIfObserved( + source: XcfaEdge, target: XcfaEdge, observableVars: Map, AccessType>, + precVars: Collection>, relation: MutableMap> + ) { + val vars = target.collectVarsWithAccessType() + var relevantAction = vars.any { it.value.isWritten && it.key in precVars } + if (!relevantAction) { + val assumeVars = target.label.collectAssumesVars() + relevantAction = assumeVars.any { it in precVars } + } + + if (relevantAction && vars.any { it.key in observableVars && it.value.isRead }) { + addToRelation(source, target, relation) + } + } + + protected abstract fun addToRelation(source: XcfaEdge, target: XcfaEdge, + relation: MutableMap>) + + protected fun isRealObserver(edge: XcfaEdge) = edge.label.collectAssumesVars().isNotEmpty() + + protected fun replace(action: A, prec: Prec): XcfaAction { + val replacedLabel = action.label.replace(prec) + action.transFuncVersion = action.withLabel(replacedLabel.run { + if (this !is SequenceLabel) SequenceLabel(listOf(this)) else this + }) + return action + } + + private fun XcfaLabel.replace(prec: Prec): XcfaLabel = when (this) { + is SequenceLabel -> SequenceLabel(labels.map { it.replace(prec) }, metadata) + is NondetLabel -> NondetLabel(labels.map { it.replace(prec) }.toSet(), metadata) + is StmtLabel -> { + when (val stmt = this.stmt) { + is AssignStmt<*> -> if (stmt.varDecl in prec.usedVars) { + StmtLabel(HavocStmt.of(stmt.varDecl), metadata = this.metadata) + } else { + NopLabel + } + + is HavocStmt<*> -> if (stmt.varDecl in prec.usedVars) { + this + } else { + NopLabel + } + + else -> this + } + } + + else -> this + } +} \ No newline at end of file diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/coi/XcfaCoiMultiThread.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/coi/XcfaCoiMultiThread.kt new file mode 100644 index 0000000000..7774dafb16 --- /dev/null +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/coi/XcfaCoiMultiThread.kt @@ -0,0 +1,159 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.xcfa.analysis.coi + +import hu.bme.mit.theta.analysis.LTS +import hu.bme.mit.theta.analysis.Prec +import hu.bme.mit.theta.xcfa.getFlatLabels +import hu.bme.mit.theta.xcfa.collectVarsWithAccessType +import hu.bme.mit.theta.xcfa.isWritten +import hu.bme.mit.theta.xcfa.model.StartLabel +import hu.bme.mit.theta.xcfa.model.XCFA +import hu.bme.mit.theta.xcfa.model.XcfaEdge +import hu.bme.mit.theta.xcfa.model.XcfaProcedure + +class XcfaCoiMultiThread(xcfa: XCFA) : XcfaCoi(xcfa) { + + private val startThreads: MutableSet = mutableSetOf() + private val edgeToProcedure: MutableMap = mutableMapOf() + private var XcfaEdge.procedure: XcfaProcedure + get() = edgeToProcedure[this]!! + set(value) { + edgeToProcedure[this] = value + } + private val interProcessObservation: MutableMap> = mutableMapOf() + + data class ProcedureEntry( + val procedure: XcfaProcedure, + val scc: Int, + val pid: Int + ) + + override val lts = object : LTS { + override fun getEnabledActionsFor(state: S): Collection { + val enabled = coreLts.getEnabledActionsFor(state) + return lastPrec?.let { replaceIrrelevantActions(state, enabled, it) } ?: enabled + } + + override fun

getEnabledActionsFor(state: S, explored: Collection, prec: P): Collection { + if (lastPrec != prec) reinitialize(prec) + val enabled = coreLts.getEnabledActionsFor(state, explored, prec) + return replaceIrrelevantActions(state, enabled, prec) + } + + private fun replaceIrrelevantActions(state: S, enabled: Collection, prec: Prec): Collection { + val procedures = state.processes.map { (pid, pState) -> + val loc = pState.locs.peek() + val procedure = loc.incomingEdges.ifEmpty(loc::outgoingEdges).first().procedure + ProcedureEntry(procedure, loc.scc, pid) + }.toMutableList() + + do { + var anyNew = false + startThreads.filter { edge -> + procedures.any { edge.procedure == it.procedure && it.scc >= edge.source.scc } + }.forEach { edge -> + edge.getFlatLabels().filterIsInstance().forEach { startLabel -> + val procedure = xcfa.procedures.find { it.name == startLabel.name }!! + val procedureEntry = ProcedureEntry(procedure, procedure.initLoc.scc, -1) + if (procedureEntry !in procedures) { + procedures.add(procedureEntry) + anyNew = true + } + } + } + } while (anyNew) + val multipleProcedures = findDuplicates(procedures.map { it.procedure }) + + return enabled.map { action -> + if (!isObserved(action, procedures, multipleProcedures)) { + replace(action, prec) + } else { + action.transFuncVersion = null + action + } + } + } + + private fun isObserved(action: A, procedures: MutableList, + multipleProcedures: Set): Boolean { + val toVisit = edgeToProcedure.keys.filter { + it.source == action.edge.source && it.target == action.edge.target + }.toMutableList() + val visited = mutableSetOf() + + while (toVisit.isNotEmpty()) { + val visiting = toVisit.removeFirst() + if (isRealObserver(visiting)) return true + + visited.add(visiting) + val toAdd = (directObservation[visiting] ?: emptySet()) union + (interProcessObservation[visiting]?.filter { edge -> + procedures.any { + it.procedure.name == edge.procedure.name && it.scc >= edge.source.scc && + (it.procedure.name != visiting.procedure.name || it.procedure in multipleProcedures) + } // the edge is still reachable + } ?: emptySet()) + toVisit.addAll(toAdd.filter { it !in visited }) + } + return false + } + + fun findDuplicates(list: List): Set { + val seen = mutableSetOf() + val duplicates = mutableSetOf() + for (item in list) { + if (!seen.add(item.name)) { + duplicates.add(item) + } + } + return duplicates + } + } + + fun reinitialize(prec: Prec) { + directObservation.clear() + interProcessObservation.clear() + xcfa.procedures.forEach { procedure -> + procedure.edges.forEach { edge -> + edge.procedure = procedure + if (edge.getFlatLabels().any { it is StartLabel }) startThreads.add(edge) + findDirectObservers(edge, prec) + findInterProcessObservers(edge, prec) + } + } + lastPrec = prec + } + + private fun findInterProcessObservers(edge: XcfaEdge, prec: Prec) { + val precVars = prec.usedVars + val writtenVars = edge.collectVarsWithAccessType().filter { it.value.isWritten && it.key in precVars } + if (writtenVars.isEmpty()) return + + xcfa.procedures.forEach { procedure -> + procedure.edges.forEach { + addEdgeIfObserved(edge, it, writtenVars, precVars, interProcessObservation) + } + } + } + + override fun addToRelation(source: XcfaEdge, target: XcfaEdge, + relation: MutableMap>) { + relation[source] = relation[source] ?: mutableSetOf() + relation[source]!!.add(target) + } +} \ No newline at end of file diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/coi/XcfaCoiSingleThread.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/coi/XcfaCoiSingleThread.kt new file mode 100644 index 0000000000..9d6b3fa8bb --- /dev/null +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/coi/XcfaCoiSingleThread.kt @@ -0,0 +1,84 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.xcfa.analysis.coi + +import hu.bme.mit.theta.analysis.LTS +import hu.bme.mit.theta.analysis.Prec +import hu.bme.mit.theta.xcfa.model.XCFA +import hu.bme.mit.theta.xcfa.model.XcfaEdge +import hu.bme.mit.theta.xcfa.model.XcfaLocation + +class XcfaCoiSingleThread(xcfa: XCFA) : XcfaCoi(xcfa) { + + private var observed: Set> = setOf() + + override val lts = object : LTS { + override fun getEnabledActionsFor(state: S): Collection { + val enabled = coreLts.getEnabledActionsFor(state) + return lastPrec?.let { replaceIrrelevantActions(enabled, it) } ?: enabled + } + + override fun

getEnabledActionsFor(state: S, explored: Collection, prec: P): Collection { + if (lastPrec != prec) reinitialize(prec) + val enabled = coreLts.getEnabledActionsFor(state, explored, prec) + return replaceIrrelevantActions(enabled, prec) + } + + private fun replaceIrrelevantActions(enabled: Collection, prec: Prec): Collection = + enabled.map { action -> + if (Pair(action.source, action.target) !in observed) { + replace(action, prec) + } else { + action.transFuncVersion = null + action + } + } + } + + fun reinitialize(prec: Prec) { + lastPrec = prec + directObservation.clear() + val realObservers = mutableSetOf() + xcfa.procedures.forEach { procedure -> + procedure.edges.forEach { edge -> + findDirectObservers(edge, prec) + if (isRealObserver(edge)) { + realObservers.add(edge) + } + } + } + collectedObservedEdges(realObservers) + } + + override fun addToRelation(source: XcfaEdge, target: XcfaEdge, + relation: MutableMap>) { + relation[target] = relation[target] ?: mutableSetOf() + relation[target]!!.add(source) + } + + private fun collectedObservedEdges(realObservers: Set) { + val toVisit = realObservers.toMutableList() + val visited = mutableSetOf() + while (toVisit.isNotEmpty()) { + val visiting = toVisit.removeFirst() + visited.add(visiting) + val toAdd = directObservation[visiting] ?: emptySet() + toVisit.addAll(toAdd.filter { it !in visited }) + } + observed = visited.map { it.source to it.target }.toSet() + } +} \ No newline at end of file diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaAasporCoiLts.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaAasporCoiLts.kt new file mode 100644 index 0000000000..247eadcf47 --- /dev/null +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaAasporCoiLts.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.xcfa.analysis.por + +import hu.bme.mit.theta.analysis.LTS +import hu.bme.mit.theta.analysis.expr.ExprState +import hu.bme.mit.theta.core.decl.Decl +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.xcfa.analysis.XcfaAction +import hu.bme.mit.theta.xcfa.analysis.XcfaState +import hu.bme.mit.theta.xcfa.analysis.coi.transFuncVersion +import hu.bme.mit.theta.xcfa.model.XCFA +import hu.bme.mit.theta.xcfa.model.XcfaEdge + +class XcfaAasporCoiLts( + xcfa: XCFA, + ignoredVarRegistry: MutableMap, MutableSet>, + coiLTS: LTS, XcfaAction> +) : XcfaAasporLts(xcfa, ignoredVarRegistry) { + + init { + simpleXcfaLts = coiLTS + } + + override fun getEdgeOf(action: XcfaAction): XcfaEdge = + super.getEdgeOf(action.transFuncVersion ?: action) + + override fun isBackwardAction(action: XcfaAction): Boolean = + backwardTransitions.any { it.source == action.edge.source && it.target == action.edge.target } +} \ No newline at end of file diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaAasporLts.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaAasporLts.kt index f5ba5b18fc..6bcdb06dff 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaAasporLts.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaAasporLts.kt @@ -23,36 +23,33 @@ import hu.bme.mit.theta.xcfa.analysis.XcfaAction import hu.bme.mit.theta.xcfa.analysis.XcfaState import hu.bme.mit.theta.xcfa.model.XCFA -class XcfaAasporLts(xcfa: XCFA, - private val ignoredVarRegistry: MutableMap, MutableSet>) : - XcfaSporLts(xcfa) { +open class XcfaAasporLts( + xcfa: XCFA, + private val ignoredVarRegistry: MutableMap, MutableSet> +) : XcfaSporLts(xcfa) { - override fun

getEnabledActionsFor( - state: XcfaState<*>, - exploredActions: Collection, - prec: P - ): Set { + override fun

getEnabledActionsFor(state: XcfaState<*>, exploredActions: Collection, + prec: P): Set { // Collecting enabled actions - val allEnabledActions = getAllEnabledActionsFor(state) + val allEnabledActions = simpleXcfaLts.getEnabledActionsFor(state, exploredActions, prec) - // Calculating the persistent set starting from every (or some of the) enabled transition or from exploredActions if it is not empty - // The minimal persistent set is stored - var minimalPersistentSet = mutableSetOf() - val persistentSetFirstActions = if (exploredActions.isEmpty()) { - getPersistentSetFirstActions(allEnabledActions) + // Calculating the source set starting from every (or some of the) enabled transition or from exploredActions if it is not empty + // The minimal source set is stored + var minimalSourceSet = mutableSetOf() + val sourceSetFirstActions = if (exploredActions.isEmpty()) { + getSourceSetFirstActions(state, allEnabledActions) } else { setOf(exploredActions) } var finalIgnoredVars = setOf>() - // Calculate persistent sets from all possible starting action set - for (firstActions in persistentSetFirstActions) { - // Variables that have been ignored (if they would be in the precision, more actions have had to be added to the persistent set) + // Calculate source sets from all possible starting action set + for (firstActions in sourceSetFirstActions) { + // Variables that have been ignored (if they would be in the precision, more actions have had to be added to the source set) val ignoredVars = mutableSetOf>() - val persistentSet = calculatePersistentSet(allEnabledActions, firstActions, prec, - ignoredVars) - if (minimalPersistentSet.isEmpty() || persistentSet.size < minimalPersistentSet.size) { - minimalPersistentSet = persistentSet.toMutableSet() + val sourceSet = calculateSourceSet(allEnabledActions, firstActions, prec, ignoredVars) + if (minimalSourceSet.isEmpty() || sourceSet.size < minimalSourceSet.size) { + minimalSourceSet = sourceSet.toMutableSet() finalIgnoredVars = ignoredVars } } @@ -62,28 +59,27 @@ class XcfaAasporLts(xcfa: XCFA, } checkNotNull(ignoredVarRegistry[ignoredVar]).add(state) } - minimalPersistentSet.removeAll(exploredActions.toSet()) - return minimalPersistentSet + minimalSourceSet.removeAll(exploredActions.toSet()) + return minimalSourceSet } /** - * Calculates a persistent set of enabled actions starting from a set of particular actions. + * Calculates a source set of enabled actions starting from a set of particular actions. * * @param enabledActions the enabled actions in the present state - * @param firstActions the actions that will be added to the persistent set as the first actions + * @param firstActions the actions that will be added to the source set as the first actions * @param prec the precision of the current abstraction - * @param ignoredVars variables that have been ignored (if they would be in the precision, more actions have had to be added to the persistent set) - * @return a persistent set of enabled actions in the current abstraction + * @param ignoredVars variables that have been ignored (if they would be in the precision, more actions have had to be added to the source set) + * @return a source set of enabled actions in the current abstraction */ - private fun calculatePersistentSet(enabledActions: Collection, - firstActions: Collection, prec: Prec, - ignoredVars: MutableSet>): Set { + private fun calculateSourceSet(enabledActions: Collection, firstActions: Collection, + prec: Prec, ignoredVars: MutableSet>): Set { if (firstActions.any(this::isBackwardAction)) { return enabledActions.toSet() } - val persistentSet = firstActions.toMutableSet() - val otherActions = enabledActions.toMutableSet() // actions not in the persistent set + val sourceSet = firstActions.toMutableSet() + val otherActions = enabledActions.toMutableSet() // actions not in the source set firstActions.forEach(otherActions::remove) val ignoredVarsByAction = otherActions.associateWith { mutableSetOf>() } @@ -92,39 +88,36 @@ class XcfaAasporLts(xcfa: XCFA, addedNewAction = false val actionsToRemove = mutableSetOf() for (action in otherActions) { - // for every action that is not in the persistent set it is checked whether it should be added to the persistent set - // (because it is dependent with an action already in the persistent set) + // for every action that is not in the source set it is checked whether it should be added to the source set + // (because it is dependent with an action already in the source set) val potentialIgnoredVars = mutableSetOf>() - if (persistentSet.any { persistentSetAction -> - areDependents(persistentSetAction, action, prec, potentialIgnoredVars) - }) { + if (sourceSet.any { areDependents(it, action, prec, potentialIgnoredVars) }) { if (isBackwardAction(action)) { return enabledActions.toSet() // see POR algorithm for the reason of removing backward transitions } - persistentSet.add(action) + sourceSet.add(action) actionsToRemove.add(action) addedNewAction = true } else { - checkNotNull(ignoredVarsByAction[action]).addAll( - potentialIgnoredVars) // the action is not added to the persistent set because we ignore variables in potentialIgnoredVars + // the action is not added to the source set because we ignore variables in potentialIgnoredVars + checkNotNull(ignoredVarsByAction[action]).addAll(potentialIgnoredVars) } } actionsToRemove.forEach(otherActions::remove) } otherActions.forEach { action -> ignoredVars.addAll(checkNotNull(ignoredVarsByAction[action])) } - return persistentSet + return sourceSet } - private fun areDependents(persistentSetAction: XcfaAction, action: XcfaAction, prec: Prec, + private fun areDependents(sourceSetAction: XcfaAction, action: XcfaAction, prec: Prec, ignoredVariables: MutableSet>): Boolean { - if (isSameProcess(persistentSetAction, action)) { + if (isSameProcess(sourceSetAction, action)) { return true } - val usedByPersistentSetAction = getCachedUsedSharedObjects( - getTransitionOf(persistentSetAction)) - val influencedSharedObjects = getInfluencedSharedObjects(getTransitionOf(action)) + val usedBySourceSetAction = getCachedUsedSharedObjects(getEdgeOf(sourceSetAction)) + val influencedSharedObjects = getInfluencedSharedObjects(getEdgeOf(action)) for (varDecl in influencedSharedObjects) { - if (usedByPersistentSetAction.contains(varDecl)) { + if (usedBySourceSetAction.contains(varDecl)) { if (varDecl !in prec.usedVars) { // the actions would be dependent, but we may have a chance to ignore it in the current abstraction ignoredVariables.add(varDecl) diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaDporLts.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaDporLts.kt index 63f7a47d8b..88be0f44ed 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaDporLts.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaDporLts.kt @@ -25,7 +25,7 @@ import hu.bme.mit.theta.analysis.waitlist.Waitlist import hu.bme.mit.theta.xcfa.analysis.XcfaAction import hu.bme.mit.theta.xcfa.analysis.XcfaState import hu.bme.mit.theta.xcfa.analysis.getXcfaLts -import hu.bme.mit.theta.xcfa.getGlobalVars +import hu.bme.mit.theta.xcfa.collectIndirectGlobalVarAccesses import hu.bme.mit.theta.xcfa.isWritten import hu.bme.mit.theta.xcfa.model.XCFA import java.util.* @@ -456,8 +456,8 @@ open class XcfaDporLts(private val xcfa: XCFA) : LTS { protected open fun dependent(a: A, b: A): Boolean { if (a.pid == b.pid) return true - val aGlobalVars = a.edge.getGlobalVars(xcfa) - val bGlobalVars = b.edge.getGlobalVars(xcfa) + val aGlobalVars = a.edge.collectIndirectGlobalVarAccesses(xcfa) + val bGlobalVars = b.edge.collectIndirectGlobalVarAccesses(xcfa) // dependent if they access the same variable (at least one write) return (aGlobalVars.keys intersect bGlobalVars.keys).any { aGlobalVars[it].isWritten || bGlobalVars[it].isWritten } } @@ -471,7 +471,7 @@ class XcfaAadporLts(private val xcfa: XCFA) : XcfaDporLts(xcfa) { /** * The current precision of the abstraction. */ - private lateinit var prec: Prec + private var prec: Prec? = null /** * Returns actions to be explored from the given state considering the given precision. @@ -487,9 +487,9 @@ class XcfaAadporLts(private val xcfa: XCFA) : XcfaDporLts(xcfa) { override fun dependent(a: A, b: A): Boolean { if (a.pid == b.pid) return true - val aGlobalVars = a.edge.getGlobalVars(xcfa) - val bGlobalVars = b.edge.getGlobalVars(xcfa) - val precVars = prec.usedVars.toSet() + val precVars = prec?.usedVars?.toSet() ?: return super.dependent(a, b) + val aGlobalVars = a.edge.collectIndirectGlobalVarAccesses(xcfa) + val bGlobalVars = b.edge.collectIndirectGlobalVarAccesses(xcfa) // dependent if they access the same variable in the precision (at least one write) return (aGlobalVars.keys intersect bGlobalVars.keys intersect precVars).any { aGlobalVars[it].isWritten || bGlobalVars[it].isWritten } } diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaSporLts.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaSporLts.kt index cbaba22ba1..c2dac34f9e 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaSporLts.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaSporLts.kt @@ -15,67 +15,194 @@ */ package hu.bme.mit.theta.xcfa.analysis.por -import hu.bme.mit.theta.analysis.algorithm.SporLts +import hu.bme.mit.theta.analysis.LTS import hu.bme.mit.theta.core.decl.Decl import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.xcfa.* import hu.bme.mit.theta.xcfa.analysis.XcfaAction import hu.bme.mit.theta.xcfa.analysis.XcfaState import hu.bme.mit.theta.xcfa.analysis.getXcfaLts -import hu.bme.mit.theta.xcfa.collectVars -import hu.bme.mit.theta.xcfa.getFlatLabels -import hu.bme.mit.theta.xcfa.isAtomicBegin -import hu.bme.mit.theta.xcfa.isAtomicEnd import hu.bme.mit.theta.xcfa.model.* import java.util.* +import java.util.function.Predicate import kotlin.random.Random -open class XcfaSporLts(protected val xcfa: XCFA) : SporLts, XcfaAction, XcfaEdge>() { +/** + * LTS with a POR (Partial Order Reduction) algorithm applied as a filter when returning enabled actions. + * The algorithm is similar to the static source-set based POR algorithm described in the following paper: + * Abdulla, P., Aronis, S., Jonsson, B., Sagonas, K. (2017): + * Comparing source sets and persistent sets for partial order reduction + * + * @param xcfa the XCFA of the verified program + */ +open class XcfaSporLts(protected val xcfa: XCFA) : LTS, XcfaAction> { companion object { - private val random: Random = Random.Default - private val simpleXcfaLts = getXcfaLts() + var random: Random = Random.Default } + protected var simpleXcfaLts = getXcfaLts() + + /* CACHE COLLECTIONS */ + + /** + * Shared objects (~global variables) used by a transition. + */ + private val usedSharedObjects: MutableMap>> = mutableMapOf() + + /** + * Shared objects (~global variables) that are used by the key transition or by transitions reachable from the + * current state via a given transition. + */ + private val influencedSharedObjects: MutableMap>> = mutableMapOf() + + /** + * Backward transitions in the transition system (a transition of a loop). + */ + protected val backwardTransitions: MutableSet = mutableSetOf() + init { collectBackwardTransitions() } - override fun getAllEnabledActionsFor(state: XcfaState<*>): Collection = - simpleXcfaLts.getEnabledActionsFor(state) + /** + * Returns the enabled actions in the ARG from the given state filtered with a POR algorithm. + * + * @param state the state whose enabled actions we would like to know + * @return the enabled actions + */ + override fun getEnabledActionsFor(state: XcfaState<*>): Set { + // Collecting enabled actions + val allEnabledActions = simpleXcfaLts.getEnabledActionsFor(state) + + // Calculating the source set starting from every (or some of the) enabled transition; the minimal source set is stored + var minimalSourceSet = setOf() + val sourceSetFirstActions = getSourceSetFirstActions(state, allEnabledActions) + for (firstActions in sourceSetFirstActions) { + val sourceSet = calculateSourceSet(allEnabledActions, firstActions) + if (minimalSourceSet.isEmpty() || sourceSet.size < minimalSourceSet.size) { + minimalSourceSet = sourceSet + } + } + return minimalSourceSet + } - override fun getPersistentSetFirstActions( + /** + * Returns the possible starting actions of a source set. + * + * @param allEnabledActions the enabled actions in the present state + * @return the possible starting actions of a source set + */ + protected fun getSourceSetFirstActions(state: XcfaState<*>, allEnabledActions: Collection): Collection> { val enabledActionsByProcess = allEnabledActions.groupBy(XcfaAction::pid) val enabledProcesses = enabledActionsByProcess.keys.toList().shuffled(random) - return enabledProcesses.map { checkNotNull(enabledActionsByProcess[it]) } + return enabledProcesses.map { pid -> + val firstProcesses = mutableSetOf(pid) + checkMutexBlocks(state, pid, firstProcesses, enabledActionsByProcess) + firstProcesses.flatMap { enabledActionsByProcess[it] ?: emptyList() } + } } - override fun isSameProcess(action1: XcfaAction, - action2: XcfaAction) = action1.pid == action2.pid - - override fun getTransitionOf(action: XcfaAction) = action.edge + /** + * Checks whether a process is blocked by a mutex and if it is, it adds the process that blocks it to the set of + * first processes. + * + * @param state the current state + * @param pid the process whose blocking is to be checked + * @param firstProcesses the set of first processes + * @param enabledActionsByProcess the enabled actions grouped by processes + * @return the set of first processes + */ + private fun checkMutexBlocks(state: XcfaState<*>, pid: Int, firstProcesses: MutableSet, + enabledActionsByProcess: Map>) { + val processState = checkNotNull(state.processes[pid]) + if (!processState.paramsInitialized) return + val disabledOutEdges = processState.locs.peek().outgoingEdges.filter { edge -> + enabledActionsByProcess[pid]?.none { action -> action.target == edge.target } ?: true + } + disabledOutEdges.forEach { edge -> + edge.getFlatLabels().filterIsInstance().forEach { fence -> + fence.labels.filter { it.startsWith("mutex_lock") }.forEach { lock -> + val mutex = lock.substringAfter('(').substringBefore(')') + state.mutexes[mutex]?.let { pid2 -> + if (pid2 !in firstProcesses) { + firstProcesses.add(pid2) + checkMutexBlocks(state, pid2, firstProcesses, enabledActionsByProcess) + } + } + } + } + } + } - override fun getSuccessiveTransitions(edge: XcfaEdge): Set { - val outgoingEdges = edge.target.outgoingEdges.toMutableSet() - val startThreads = edge.getFlatLabels().filterIsInstance().toList() - if (startThreads.isNotEmpty()) { // for start thread labels, the thread procedure must be explored, too! - startThreads.forEach { startThread -> - outgoingEdges.addAll( - xcfa.procedures.first { it.name == startThread.name }.initLoc.outgoingEdges) + /** + * Calculates a source set of enabled actions starting from a particular action. + * + * @param enabledActions the enabled actions in the present state + * @param firstActions the actions that will be added to the source set as the first actions + * @return a source set of enabled actions + */ + private fun calculateSourceSet(enabledActions: Collection, + firstActions: Collection): Set { + if (firstActions.any(::isBackwardAction)) { + return enabledActions.toSet() + } + val sourceSet = firstActions.toMutableSet() + val otherActions = (enabledActions.toMutableSet() subtract sourceSet).toMutableSet() // actions not in the source set + var addedNewAction = true + while (addedNewAction) { + addedNewAction = false + val actionsToRemove = mutableSetOf() + for (action in otherActions) { + // for every action that is not in the source set it is checked whether it should be added to the source set + // (because it is dependent with an action already in the source set) + if (sourceSet.any { areDependents(it, action) }) { + if (isBackwardAction(action)) { + return enabledActions.toSet() // see POR algorithm for the reason of removing backward transitions + } + sourceSet.add(action) + actionsToRemove.add(action) + addedNewAction = true + } } + actionsToRemove.forEach(otherActions::remove) } - return outgoingEdges + return sourceSet + } + + /** + * Determines whether an action is dependent with another one (based on the notions introduced for the POR + * algorithm) already in the source set. + * + * @param sourceSetAction the action in the source set + * @param action the other action (not in the source set) + * @return true, if the two actions are dependent in the context of source sets + */ + private fun areDependents(sourceSetAction: XcfaAction, action: XcfaAction): Boolean { + val usedBySourceSetAction = getCachedUsedSharedObjects(getEdgeOf(sourceSetAction)) + return isSameProcess(sourceSetAction, action) || + getInfluencedSharedObjects(getEdgeOf(action)).any { it in usedBySourceSetAction } } + /** + * Determines whether two actions are in the same process. + * + * @param action1 the first action + * @param action2 the second action + * @return true, if the two actions are in the same process + */ + protected fun isSameProcess(action1: XcfaAction, action2: XcfaAction) = action1.pid == action2.pid + /** * Returns the global variables that an edge uses (it is present in one of its labels). * * @param edge whose global variables are to be returned * @return the set of used global variables */ - override fun getDirectlyUsedSharedObjects(edge: XcfaEdge): Set> { + private fun getDirectlyUsedSharedObjects(edge: XcfaEdge): Set> { val globalVars = xcfa.vars.map(XcfaGlobalVar::wrappedVar) return edge.getFlatLabels().flatMap { label -> label.collectVars().filter { it in globalVars } @@ -89,14 +216,106 @@ open class XcfaSporLts(protected val xcfa: XCFA) : SporLts, XcfaAct * @param edge whose global variables are to be returned * @return the set of directly or indirectly used global variables */ - override fun getUsedSharedObjects(edge: XcfaEdge): Set?> = - if (edge.getFlatLabels().any(XcfaLabel::isAtomicBegin)) { - getSharedObjectsWithBFS(edge) { - it.getFlatLabels().none(XcfaLabel::isAtomicEnd) - }.toSet() - } else { + private fun getUsedSharedObjects(edge: XcfaEdge): Set> { + val flatLabels = edge.getFlatLabels() + val mutexes = flatLabels.filterIsInstance().flatMap { it.acquiredMutexes }.toMutableSet() + return if (mutexes.isEmpty()) { getDirectlyUsedSharedObjects(edge) + } else { + getSharedObjectsWithBFS(edge) { it.mutexOperations(mutexes) }.toSet() + } + } + + /** + * Same as [getUsedSharedObjects] with an additional cache layer. + * + * @param edge whose shared objects are to be returned + * @return the set of directly or indirectly used shared objects + */ + protected fun getCachedUsedSharedObjects(edge: XcfaEdge): Set> { + if (!usedSharedObjects.containsKey(edge)) { + val vars = getUsedSharedObjects(edge) + usedSharedObjects[edge] = vars } + return usedSharedObjects[edge]!! + } + + /** + * Returns the shared objects (~global variables) used by the given transition or by transitions that are reachable + * via the given transition ("influenced shared objects"). + * + * @param edge whose successor transitions' shared objects are to be returned. + * @return the set of influenced shared objects + */ + protected fun getInfluencedSharedObjects(edge: XcfaEdge): Set> { + if (!influencedSharedObjects.containsKey(edge)) { + influencedSharedObjects[edge] = getSharedObjectsWithBFS(edge) { true } + } + return influencedSharedObjects[edge]!! + } + + /** + * Returns shared objects (~global variables) encountered in a search starting from a given transition. + * + * @param startTransition the start point (transition) of the search + * @param goFurther the predicate that tells whether more transitions have to be explored through this + * transition + * @return the set of encountered shared objects + */ + private fun getSharedObjectsWithBFS(startTransition: XcfaEdge, + goFurther: Predicate): Set> { + val vars = mutableSetOf>() + val exploredEdges = mutableListOf() + val edgesToExplore = mutableListOf() + edgesToExplore.add(startTransition) + while (edgesToExplore.isNotEmpty()) { + val exploring = edgesToExplore.removeFirst() + vars.addAll(getDirectlyUsedSharedObjects(exploring)) + if (goFurther.test(exploring)) { + val successiveEdges = getSuccessiveTransitions(exploring) + for (newEdge in successiveEdges) { + if (newEdge !in exploredEdges) { + edgesToExplore.add(newEdge) + } + } + } + exploredEdges.add(exploring) + } + return vars + } + + /** + * Returns the xcfa edge of the given action. + * + * @param action the action whose edge is to be returned + * @return the edge of the action + */ + protected open fun getEdgeOf(action: XcfaAction) = action.edge + + /** + * Returns the outgoing edges of the target of the given edge. + * + * @param edge the edge whose target's outgoing edges are to be returned + * @return the outgoing edges of the target of the edge + */ + private fun getSuccessiveTransitions(edge: XcfaEdge): Set { + val outgoingEdges = edge.target.outgoingEdges.toMutableSet() + val startThreads = edge.getFlatLabels().filterIsInstance().toList() + if (startThreads.isNotEmpty()) { // for start thread labels, the thread procedure must be explored, too! + startThreads.forEach { startThread -> + outgoingEdges.addAll(xcfa.procedures.first { it.name == startThread.name }.initLoc.outgoingEdges) + } + } + return outgoingEdges + } + + /** + * Determines whether the given action is a backward action. + * + * @param action the action to be classified as backward action or non-backward action + * @return true, if the action is a backward action + */ + protected open fun isBackwardAction(action: XcfaAction): Boolean = backwardTransitions.contains(getEdgeOf(action)) /** * Collects backward edges of the given XCFA. diff --git a/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaExplAnalysisTest.kt b/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaExplAnalysisTest.kt index 79f9967637..6b89916d1e 100644 --- a/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaExplAnalysisTest.kt +++ b/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaExplAnalysisTest.kt @@ -32,6 +32,8 @@ import hu.bme.mit.theta.common.logging.NullLogger import hu.bme.mit.theta.core.type.booltype.BoolExprs import hu.bme.mit.theta.frontend.ParseContext import hu.bme.mit.theta.solver.z3.Z3SolverFactory +import hu.bme.mit.theta.xcfa.analysis.coi.ConeOfInfluence +import hu.bme.mit.theta.xcfa.analysis.coi.XcfaCoiMultiThread import hu.bme.mit.theta.xcfa.analysis.por.* import org.junit.jupiter.api.Assertions import org.junit.jupiter.params.ParameterizedTest @@ -64,7 +66,8 @@ class XcfaExplAnalysisTest { fun testNoporExpl(filepath: String, verdict: (SafetyResult<*, *>) -> Boolean) { println("Testing NOPOR on $filepath...") val stream = javaClass.getResourceAsStream(filepath) - val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false).first + val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false, NullLogger.getInstance()).first + ConeOfInfluence = XcfaCoiMultiThread(xcfa) val analysis = ExplXcfaAnalysis( xcfa, @@ -107,7 +110,8 @@ class XcfaExplAnalysisTest { fun testSporExpl(filepath: String, verdict: (SafetyResult<*, *>) -> Boolean) { println("Testing SPOR on $filepath...") val stream = javaClass.getResourceAsStream(filepath) - val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false).first + val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false, NullLogger.getInstance()).first + ConeOfInfluence = XcfaCoiMultiThread(xcfa) val analysis = ExplXcfaAnalysis( xcfa, @@ -151,7 +155,8 @@ class XcfaExplAnalysisTest { XcfaDporLts.random = Random(seed) println("Testing DPOR on $filepath...") val stream = javaClass.getResourceAsStream(filepath) - val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false).first + val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false, NullLogger.getInstance()).first + ConeOfInfluence = XcfaCoiMultiThread(xcfa) val analysis = ExplXcfaAnalysis( xcfa, @@ -193,7 +198,8 @@ class XcfaExplAnalysisTest { fun testAasporExpl(filepath: String, verdict: (SafetyResult<*, *>) -> Boolean) { println("Testing AASPOR on $filepath...") val stream = javaClass.getResourceAsStream(filepath) - val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false).first + val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false, NullLogger.getInstance()).first + ConeOfInfluence = XcfaCoiMultiThread(xcfa) val analysis = ExplXcfaAnalysis( xcfa, @@ -238,7 +244,8 @@ class XcfaExplAnalysisTest { XcfaDporLts.random = Random(seed) println("Testing AADPOR on $filepath...") val stream = javaClass.getResourceAsStream(filepath) - val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false).first + val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false, NullLogger.getInstance()).first + ConeOfInfluence = XcfaCoiMultiThread(xcfa) val analysis = ExplXcfaAnalysis( xcfa, diff --git a/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaPredAnalysisTest.kt b/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaPredAnalysisTest.kt index 42d75b94d6..67cd2afe5a 100644 --- a/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaPredAnalysisTest.kt +++ b/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaPredAnalysisTest.kt @@ -32,6 +32,8 @@ import hu.bme.mit.theta.common.logging.NullLogger import hu.bme.mit.theta.core.type.booltype.BoolExprs import hu.bme.mit.theta.frontend.ParseContext import hu.bme.mit.theta.solver.z3.Z3SolverFactory +import hu.bme.mit.theta.xcfa.analysis.coi.ConeOfInfluence +import hu.bme.mit.theta.xcfa.analysis.coi.XcfaCoiMultiThread import hu.bme.mit.theta.xcfa.analysis.por.* import org.junit.jupiter.api.Assertions import org.junit.jupiter.params.ParameterizedTest @@ -64,7 +66,8 @@ class XcfaPredAnalysisTest { fun testNoporPred(filepath: String, verdict: (SafetyResult<*, *>) -> Boolean) { println("Testing NOPOR on $filepath...") val stream = javaClass.getResourceAsStream(filepath) - val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false).first + val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false, NullLogger.getInstance()).first + ConeOfInfluence = XcfaCoiMultiThread(xcfa) val solver = Z3SolverFactory.getInstance().createSolver() val analysis = PredXcfaAnalysis( @@ -109,7 +112,8 @@ class XcfaPredAnalysisTest { fun testSporPred(filepath: String, verdict: (SafetyResult<*, *>) -> Boolean) { println("Testing SPOR on $filepath...") val stream = javaClass.getResourceAsStream(filepath) - val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false).first + val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false, NullLogger.getInstance()).first + ConeOfInfluence = XcfaCoiMultiThread(xcfa) val solver = Z3SolverFactory.getInstance().createSolver() val analysis = PredXcfaAnalysis( @@ -155,7 +159,8 @@ class XcfaPredAnalysisTest { XcfaDporLts.random = Random(seed) println("Testing DPOR on $filepath...") val stream = javaClass.getResourceAsStream(filepath) - val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false).first + val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false, NullLogger.getInstance()).first + ConeOfInfluence = XcfaCoiMultiThread(xcfa) val solver = Z3SolverFactory.getInstance().createSolver() val analysis = PredXcfaAnalysis( @@ -199,7 +204,8 @@ class XcfaPredAnalysisTest { fun testAasporPred(filepath: String, verdict: (SafetyResult<*, *>) -> Boolean) { println("Testing AASPOR on $filepath...") val stream = javaClass.getResourceAsStream(filepath) - val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false).first + val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false, NullLogger.getInstance()).first + ConeOfInfluence = XcfaCoiMultiThread(xcfa) val solver = Z3SolverFactory.getInstance().createSolver() val analysis = PredXcfaAnalysis( @@ -245,7 +251,8 @@ class XcfaPredAnalysisTest { XcfaDporLts.random = Random(seed) println("Testing AADPOR on $filepath...") val stream = javaClass.getResourceAsStream(filepath) - val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false).first + val xcfa = getXcfaFromC(stream!!, ParseContext(), false, false, NullLogger.getInstance()).first + ConeOfInfluence = XcfaCoiMultiThread(xcfa) val solver = Z3SolverFactory.getInstance().createSolver() val analysis = PredXcfaAnalysis( diff --git a/subprojects/xcfa/xcfa-cli/build.gradle.kts b/subprojects/xcfa/xcfa-cli/build.gradle.kts index 35870a9554..054d1927e9 100644 --- a/subprojects/xcfa/xcfa-cli/build.gradle.kts +++ b/subprojects/xcfa/xcfa-cli/build.gradle.kts @@ -36,22 +36,10 @@ dependencies { implementation(project(":theta-grammar")) implementation(project(":theta-llvm2xcfa")) implementation("com.zaxxer:nuprocess:2.0.5") - runtimeOnly("org.jetbrains.kotlin:kotlin-scripting-jsr223:1.7.10") + implementation("org.jetbrains.kotlin:kotlin-scripting-jsr223:${Versions.kotlin}") } application { mainClassName = "hu.bme.mit.theta.xcfa.cli.XcfaCli" } -//tasks.test { -// if (OperatingSystem.current().isLinux) { -// val nativeLibTasks = project(":theta-llvm").tasks -// dependsOn(nativeLibTasks.build) -// -// val linkTask = nativeLibTasks.withType(LinkSharedLibrary::class).first() -// val existingLibraryPath = systemProperties["java.library.path"] -// val newLibraryPath = "${existingLibraryPath}:${linkTask.linkedFile.get().asFile.parent}" -// systemProperty("java.library.path", newLibraryPath) -// } -//} - diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/ConfigOptions.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/ConfigOptions.kt index 7013c4fb68..90efc96b98 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/ConfigOptions.kt +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/ConfigOptions.kt @@ -41,6 +41,7 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs import hu.bme.mit.theta.solver.Solver import hu.bme.mit.theta.solver.SolverFactory import hu.bme.mit.theta.xcfa.analysis.* +import hu.bme.mit.theta.xcfa.analysis.coi.ConeOfInfluence import hu.bme.mit.theta.xcfa.analysis.por.* import hu.bme.mit.theta.xcfa.cli.utils.XcfaDistToErrComparator import hu.bme.mit.theta.xcfa.collectAssumes @@ -58,7 +59,9 @@ enum class InputType { enum class Backend { CEGAR, - BMC, + KIND, + IMC, + IMC_THEN_KIND, LAZY } @@ -156,98 +159,99 @@ enum class Domain( } enum class Refinement( - val refiner: (solverFactory: SolverFactory) -> ExprTraceChecker, - val stopCriterion: StopCriterion, XcfaAction> + val refiner: (solverFactory: SolverFactory, monitorOption: CexMonitorOptions) -> ExprTraceChecker, + val stopCriterion: StopCriterion, XcfaAction>, ) { FW_BIN_ITP( - refiner = { s -> + refiner = { s, _ -> ExprTraceFwBinItpChecker.create(BoolExprs.True(), BoolExprs.True(), s.createItpSolver()) }, - stopCriterion = StopCriterions.firstCex() + stopCriterion = StopCriterions.firstCex(), ), BW_BIN_ITP( - refiner = { s -> + refiner = { s, _ -> ExprTraceBwBinItpChecker.create(BoolExprs.True(), BoolExprs.True(), s.createItpSolver()) }, stopCriterion = StopCriterions.firstCex() ), SEQ_ITP( - refiner = { s -> + refiner = { s, _ -> ExprTraceSeqItpChecker.create(BoolExprs.True(), BoolExprs.True(), s.createItpSolver()) }, stopCriterion = StopCriterions.firstCex() ), MULTI_SEQ( - refiner = { s -> + refiner = { s, m -> + if (m == CexMonitorOptions.CHECK) error("CexMonitor is not implemented for MULTI_SEQ") ExprTraceSeqItpChecker.create(BoolExprs.True(), BoolExprs.True(), s.createItpSolver()) }, stopCriterion = StopCriterions.fullExploration() ), UNSAT_CORE( - refiner = { s -> + refiner = { s, _ -> ExprTraceUnsatCoreChecker.create(BoolExprs.True(), BoolExprs.True(), s.createUCSolver()) }, stopCriterion = StopCriterions.firstCex() ), UCB( - refiner = { s -> + refiner = { s, _ -> ExprTraceUCBChecker.create(BoolExprs.True(), BoolExprs.True(), s.createUCSolver()) }, stopCriterion = StopCriterions.firstCex() ), NWT_SP( - refiner = { s -> + refiner = { s, _ -> ExprTraceNewtonChecker.create(BoolExprs.True(), BoolExprs.True(), s.createUCSolver()) .withoutIT().withSP().withoutLV() }, stopCriterion = StopCriterions.firstCex() ), NWT_WP( - refiner = { s -> + refiner = { s, _ -> ExprTraceNewtonChecker.create(BoolExprs.True(), BoolExprs.True(), s.createUCSolver()) .withoutIT().withWP().withoutLV() }, stopCriterion = StopCriterions.firstCex() ), NWT_SP_LV( - refiner = { s -> + refiner = { s, _ -> ExprTraceNewtonChecker.create(BoolExprs.True(), BoolExprs.True(), s.createUCSolver()) .withoutIT().withSP().withLV() }, stopCriterion = StopCriterions.firstCex() ), NWT_WP_LV( - refiner = { s -> + refiner = { s, _ -> ExprTraceNewtonChecker.create(BoolExprs.True(), BoolExprs.True(), s.createUCSolver()) .withoutIT().withWP().withLV() }, stopCriterion = StopCriterions.firstCex() ), NWT_IT_WP( - refiner = { s -> + refiner = { s, _ -> ExprTraceNewtonChecker.create(BoolExprs.True(), BoolExprs.True(), s.createUCSolver()) .withIT().withWP().withoutLV() }, stopCriterion = StopCriterions.firstCex() ), NWT_IT_SP( - refiner = { s -> + refiner = { s, _ -> ExprTraceNewtonChecker.create(BoolExprs.True(), BoolExprs.True(), s.createUCSolver()) .withIT().withSP().withoutLV() }, stopCriterion = StopCriterions.firstCex() ), NWT_IT_WP_LV( - refiner = { s -> + refiner = { s, _ -> ExprTraceNewtonChecker.create(BoolExprs.True(), BoolExprs.True(), s.createUCSolver()) .withIT().withWP().withLV() }, stopCriterion = StopCriterions.firstCex() ), NWT_IT_SP_LV( - refiner = { s -> + refiner = { s, _ -> ExprTraceNewtonChecker.create(BoolExprs.True(), BoolExprs.True(), s.createUCSolver()) .withIT().withSP().withLV() }, @@ -311,10 +315,34 @@ enum class InitPrec( } -// TODO CexMonitor: disable for multi_seq? +enum class ConeOfInfluenceMode( + val getLts: (XCFA, MutableMap, MutableSet>, POR) -> LTS, XcfaAction> +) { + + NO_COI({ xcfa, ivr, por -> + por.getLts(xcfa, ivr).also { NO_COI.porLts = it } + }), + COI({ xcfa, ivr, por -> + ConeOfInfluence.coreLts = por.getLts(xcfa, ivr).also { COI.porLts = it } + ConeOfInfluence.lts + }), + POR_COI({ xcfa, ivr, _ -> + ConeOfInfluence.coreLts = getXcfaLts() + XcfaAasporCoiLts(xcfa, ivr, ConeOfInfluence.lts) + }), + POR_COI_POR({ xcfa, ivr, por -> + ConeOfInfluence.coreLts = por.getLts(xcfa, ivr).also { POR_COI_POR.porLts = it } + XcfaAasporCoiLts(xcfa, ivr, ConeOfInfluence.lts) + }) + ; + + var porLts: LTS, XcfaAction>? = null +} + +// TODO CexMonitor: disable for multi_seq +// TODO add new monitor to xsts cli enum class CexMonitorOptions { CHECK, - MITIGATE, DISABLE } diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/ExitCodes.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/ExitCodes.kt index ccef7d620f..c52ce28139 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/ExitCodes.kt +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/ExitCodes.kt @@ -45,36 +45,45 @@ private fun exitProcess(debug: Boolean, e: Throwable, code: Int): Nothing { } else exitProcess(code) } +private fun Throwable.printCauseAndTrace(stacktrace: Boolean) { + if (stacktrace) printStackTrace() + val location = stackTrace.first { it.className.startsWith("hu.bme.mit.theta") }.toString() + System.err.println("Process failed! ($location, $this)") +} fun exitOnError(stacktrace: Boolean, debug: Boolean, body: () -> T): T { try { return body() } catch (e: SmtLibSolverException) { - if (stacktrace) e.printStackTrace(); + e.printCauseAndTrace(stacktrace) exitProcess(debug, e, ExitCodes.SOLVER_ERROR.code) } catch (e: SolverValidationException) { - if (stacktrace) e.printStackTrace(); + e.printCauseAndTrace(stacktrace) exitProcess(debug, e, ExitCodes.SOLVER_ERROR.code); } catch (e: Z3Exception) { - if (stacktrace) e.printStackTrace(); + e.printCauseAndTrace(stacktrace) exitProcess(debug, e, ExitCodes.SOLVER_ERROR.code); } catch (e: ClassCastException) { - if (stacktrace) e.printStackTrace(); + e.printCauseAndTrace(stacktrace) if (e.message?.contains("com.microsoft.z3") == true) exitProcess(debug, e, ExitCodes.SOLVER_ERROR.code); else exitProcess(debug, e, ExitCodes.GENERIC_ERROR.code); } catch (e: NotSolvableException) { - if (stacktrace) e.printStackTrace(); + e.printCauseAndTrace(stacktrace) exitProcess(debug, e, ExitCodes.VERIFICATION_STUCK.code); } catch (e: OutOfMemoryError) { - if (stacktrace) e.printStackTrace(); + e.printCauseAndTrace(stacktrace) exitProcess(debug, e, ExitCodes.OUT_OF_MEMORY.code); } catch (e: RuntimeException) { - if (stacktrace) e.printStackTrace(); - exitProcess(debug, e, ExitCodes.SERVER_ERROR.code); + e.printCauseAndTrace(stacktrace) + if (e.message?.contains("Solver problem") == true) { + exitProcess(debug, e, ExitCodes.SOLVER_ERROR.code); + } else { + exitProcess(debug, e, ExitCodes.SERVER_ERROR.code); + } } catch (e: Exception) { - if (stacktrace) e.printStackTrace(); + e.printCauseAndTrace(stacktrace) exitProcess(debug, e, ExitCodes.GENERIC_ERROR.code); } } \ No newline at end of file diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/GsonUtils.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/GsonUtils.kt index 904849a95a..9eaaf17630 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/GsonUtils.kt +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/GsonUtils.kt @@ -32,6 +32,7 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.utils.indexings.BasicVarIndexing import hu.bme.mit.theta.core.utils.indexings.VarIndexing +import hu.bme.mit.theta.frontend.FrontendMetadata import hu.bme.mit.theta.frontend.ParseContext import hu.bme.mit.theta.grammar.dsl.expr.ExpressionWrapper import hu.bme.mit.theta.grammar.dsl.stmt.StatementWrapper @@ -125,6 +126,8 @@ private fun getGson(scope: XcfaScope, env: Env, newScope: Boolean, domain: () -> { traceHelper(domain().stateType) })) gsonBuilder.registerTypeHierarchyAdapter(ParseContext::class.java, ParseContextAdapter { gson }) + gsonBuilder.registerTypeHierarchyAdapter(FrontendMetadata::class.java, + FrontendMetadataAdapter { gson }) gson = gsonBuilder.create() return gson } \ No newline at end of file diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/VerificationTraits.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/VerificationTraits.kt index 9cd49a5ff3..bb1749a727 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/VerificationTraits.kt +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/VerificationTraits.kt @@ -16,9 +16,9 @@ package hu.bme.mit.theta.xcfa.cli -import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.BitwiseOption +import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.ArithmeticTrait data class VerificationTraits( val multithreaded: Boolean = false, - val arithmetic: BitwiseOption = BitwiseOption.INTEGER, + val arithmeticTraits: Set = LinkedHashSet(), ) diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarConfig.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarConfig.kt index 2bef9ada62..93d1963965 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarConfig.kt +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarConfig.kt @@ -17,6 +17,7 @@ package hu.bme.mit.theta.xcfa.cli import com.beust.jcommander.Parameter +import com.google.common.base.Stopwatch import com.google.gson.reflect.TypeToken import com.zaxxer.nuprocess.NuAbstractProcessHandler import com.zaxxer.nuprocess.NuProcess @@ -52,6 +53,7 @@ import java.io.PrintWriter import java.net.Socket import java.nio.ByteBuffer import java.util.concurrent.TimeUnit +import java.util.zip.GZIPOutputStream import kotlin.system.exitProcess @@ -75,6 +77,8 @@ data class XcfaCegarConfig( var initPrec: InitPrec = InitPrec.EMPTY, @Parameter(names = ["--por-level"], description = "POR dependency level") var porLevel: POR = POR.NOPOR, + @Parameter(names = ["--coi"]) + var coi: ConeOfInfluenceMode = ConeOfInfluenceMode.NO_COI, @Parameter(names = ["--refinement-solver"], description = "Refinement solver name") var refinementSolver: String = "Z3", @Parameter(names = ["--validate-refinement-solver"], @@ -88,7 +92,9 @@ data class XcfaCegarConfig( @Parameter(names = ["--prunestrategy"], description = "Strategy for pruning the ARG after refinement") var pruneStrategy: PruneStrategy = PruneStrategy.LAZY, - @Parameter(names = ["--cex-monitor"]) + @Parameter(names = ["--cex-monitor"], + description = "Warning: With some configurations (e.g. lazy pruning) it is POSSIBLE (but rare) that analysis is stopped, " + + "even though it could still progress. If in doubt, disable this monitor and check results.") var cexMonitor: CexMonitorOptions = CexMonitorOptions.DISABLE, @Parameter(names = ["--timeout-ms"], description = "Timeout for verification (only valid with --strategy SERVER), use 0 for no timeout") @@ -105,9 +111,9 @@ data class XcfaCegarConfig( val ignoredVarRegistry = mutableMapOf, MutableSet>() - val lts = porLevel.getLts(xcfa, ignoredVarRegistry) + val lts = coi.getLts(xcfa, ignoredVarRegistry, porLevel) val waitlist = if (porLevel.isDynamic) { - (lts as XcfaDporLts).waitlist + (coi.porLts as XcfaDporLts).waitlist } else { PriorityWaitlist.create, XcfaAction>>( search.getComp(xcfa)) @@ -135,7 +141,7 @@ data class XcfaCegarConfig( ) as Abstractor val ref: ExprTraceChecker = - refinement.refiner(refinementSolverFactory) + refinement.refiner(refinementSolverFactory, cexMonitor) as ExprTraceChecker val precRefiner: PrecRefiner = domain.itpPrecRefiner(exprSplitter.exprSplitter) @@ -155,19 +161,6 @@ data class XcfaCegarConfig( else XcfaSingleExprTraceRefiner.create(ref, precRefiner, pruneStrategy, logger) - /* - // set up stopping analysis if it is stuck on same ARGs and precisions - if (disableCexMonitor) { - ArgCexCheckHandler.instance.setArgCexCheck(false, false, mitigation) - } else { - if(checkArg) { - ArgCexCheckHandler.instance.setArgCexCheck(true, true, mitigation) - } else { - ArgCexCheckHandler.instance.setArgCexCheck(true, false, mitigation) - } - } - */ - val cegarChecker = if (porLevel == POR.AASPOR) CegarChecker.create( abstractor, @@ -183,14 +176,9 @@ data class XcfaCegarConfig( } private fun initializeMonitors(cc: CegarChecker, logger: Logger) { - if (cexMonitor != CexMonitorOptions.DISABLE) { - val cm = if (cexMonitor == CexMonitorOptions.MITIGATE) { - throw RuntimeException( - "Mitigation is temporarily unusable, use DISABLE or CHECK instead") - // CexMonitor(true, logger, cc.arg) - } else { // CHECK - CexMonitor(false, logger, cc.arg) - } + MonitorCheckpoint.reset() + if (cexMonitor == CexMonitorOptions.CHECK) { + val cm = CexMonitor(logger, cc.arg) MonitorCheckpoint.register(cm, "CegarChecker.unsafeARG") } } @@ -234,20 +222,21 @@ data class XcfaCegarConfig( ProcessHandle.current().info().command().orElse("java") fun checkInProcess(xcfa: XCFA, smtHome: String, writeWitness: Boolean, sourceFileName: String, - logger: Logger, parseContext: ParseContext): () -> SafetyResult<*, *> { + logger: Logger, parseContext: ParseContext, argdebug: Boolean): () -> SafetyResult<*, *> { val pb = NuProcessBuilder(listOf( getJavaExecutable(), "-cp", - File( - XcfaCegarServer::class.java.protectionDomain.codeSource.location.toURI()).absolutePath, + File(XcfaCegarServer::class.java.protectionDomain.codeSource.location.toURI()).absolutePath, XcfaCegarServer::class.qualifiedName, "--smt-home", smtHome, "--return-safety-result", "" + !writeWitness, "--input", - sourceFileName - )) + sourceFileName, + "--gzip", + if (argdebug) "--arg-debug" else null, + ).filterNotNull()) val processHandler = ProcessHandler(logger) pb.setProcessListener(processHandler) val process: NuProcess = pb.start() @@ -273,11 +262,17 @@ data class XcfaCegarConfig( val gson = getGson(xcfa, { domain }, { getSolver(abstractionSolver, validateAbstractionSolver).createSolver() }) clientSocket.use { - val writer = PrintWriter(clientSocket.getOutputStream(), true) val reader = BufferedReader(InputStreamReader(clientSocket.getInputStream())) - writer.println(gson.toJson(this)) - writer.println(gson.toJson(xcfa)) - writer.println(gson.toJson(parseContext)) + run { + val writer = PrintWriter(GZIPOutputStream(clientSocket.getOutputStream(), 65536, true), true) + val sw = Stopwatch.createStarted() + writer.println(gson.toJson(this)) + writer.println(gson.toJson(xcfa)) + writer.println(gson.toJson(parseContext)) + logger.write(Logger.Level.RESULT, + "Serialized Config, XCFA and ParseContext in ${sw.elapsed(TimeUnit.MILLISECONDS)}ms\n") + writer.close() + } val retCode = process.waitFor(timeoutMs, TimeUnit.MILLISECONDS) if (retCode == Int.MIN_VALUE) { if (!processHandler.writingSafetyResult) { @@ -344,7 +339,7 @@ private class ProcessHandler( } } stdoutBuffer += str - val matchResults = Regex("([a-zA-Z]*)\t\\{([^}]*)}").findAll(stdoutBuffer) + val matchResults = Regex("(?s)([a-zA-Z]*)\t\\{([^}]*)}").findAll(stdoutBuffer) var length = 0 for (matchResult in matchResults) { val (level, message) = matchResult.destructured diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarServer.java b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarServer.java index 22159cae52..440b2d2d35 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarServer.java +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCegarServer.java @@ -19,14 +19,20 @@ import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.beust.jcommander.ParameterException; +import com.google.common.base.Stopwatch; import com.google.gson.Gson; import hu.bme.mit.theta.analysis.algorithm.SafetyResult; +import hu.bme.mit.theta.analysis.algorithm.debug.ARGWebDebugger; import hu.bme.mit.theta.analysis.expr.ExprAction; import hu.bme.mit.theta.analysis.expr.ExprState; import hu.bme.mit.theta.common.logging.ConsoleLabelledLogger; import hu.bme.mit.theta.common.logging.Logger; +import hu.bme.mit.theta.common.logging.Logger.Level; import hu.bme.mit.theta.frontend.ParseContext; import hu.bme.mit.theta.solver.smtlib.SmtLibSolverManager; +import hu.bme.mit.theta.xcfa.analysis.coi.XcfaCoiKt; +import hu.bme.mit.theta.xcfa.analysis.coi.XcfaCoiMultiThread; +import hu.bme.mit.theta.xcfa.analysis.coi.XcfaCoiSingleThread; import hu.bme.mit.theta.xcfa.cli.utils.XcfaWitnessWriter; import hu.bme.mit.theta.xcfa.model.XCFA; @@ -36,10 +42,14 @@ import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; +import java.nio.file.FileSystems; +import java.util.concurrent.TimeUnit; +import java.util.zip.GZIPInputStream; import static hu.bme.mit.theta.xcfa.cli.ExitCodesKt.exitOnError; import static hu.bme.mit.theta.xcfa.cli.GsonUtilsKt.getGson; @@ -73,6 +83,14 @@ class XcfaCegarServer { @Parameter(names = "--debug", description = "Debug mode (will not create a socket)") Boolean debug = false; + + @Parameter(names = "--arg-debug", description = "ARG debug mode (use the web-based debugger for ARG visualization)") + Boolean argdebug = false; + + + @Parameter(names = "--gzip", description = "Expect stdin to contain gzipped text") + Boolean gzip = false; + private void run(String[] args) { try { JCommander.newBuilder().addObject(this).build().parse(args); @@ -83,21 +101,36 @@ private void run(String[] args) { System.exit(ExitCodes.INVALID_PARAM.getCode()); } + if (argdebug) ARGWebDebugger.on = true; + final Logger logger = new ConsoleLabelledLogger(); - logger.write(Logger.Level.INFO, "Server started on port " + port + ".\n"); - exitOnError(false, debug, () -> { + exitOnError(true, debug, () -> { SolverRegistrationKt.registerAllSolverManagers(solverHome, logger); try (final ServerSocket socket = new ServerSocket(port)) { + logger.write(Logger.Level.INFO, "Server started on port " + socket.getLocalPort() + ".\n"); System.out.println("Port=(" + socket.getLocalPort() + ")"); do { try (final Socket clientSocket = debug ? null : socket.accept()) { final PrintWriter out = new PrintWriter(debug ? System.out : clientSocket.getOutputStream(), true); - final BufferedReader in = new BufferedReader(new InputStreamReader(debug ? System.in : clientSocket.getInputStream())); + InputStream stream = debug ? System.in : clientSocket.getInputStream(); + if (gzip) { + stream = new GZIPInputStream(stream, 65536); + logger.write(Level.INFO, "Using GZIP compression\n"); + } + final BufferedReader in = new BufferedReader(new InputStreamReader(stream)); + + final Stopwatch sw = Stopwatch.createStarted(); final String configStr = this.configStr == null ? in.readLine() : this.configStr; + logger.write(Level.INFO, "Read config in " + sw.elapsed(TimeUnit.MILLISECONDS) + "ms\n"); + sw.reset().start(); final String xcfaStr = this.xcfaStr == null ? in.readLine() : this.xcfaStr; + logger.write(Level.INFO, "Read XCFA in " + sw.elapsed(TimeUnit.MILLISECONDS) + "ms\n"); + sw.reset().start(); final String parseStr = this.parseContext == null ? in.readLine() : this.parseContext; + logger.write(Level.INFO, "Read ParseContext in " + sw.elapsed(TimeUnit.MILLISECONDS) + "ms\n"); + sw.reset().start(); final Gson gson = getGson(); XCFA xcfa; @@ -128,9 +161,7 @@ private void run(String[] args) { logger.write(Logger.Level.INFO, "Parsed config.\n"); ParseContext parseContext; try { -// parseContext = gson.fromJson(parseStr, ParseContext.class); - // TODO: add support for json - parseContext = new ParseContext(); + parseContext = gson.fromJson(parseStr, ParseContext.class); } catch (Exception e) { File tempFile = File.createTempFile("parsecontext", ".json"); try (BufferedWriter bw = new BufferedWriter(new FileWriter(tempFile))) { @@ -139,16 +170,25 @@ private void run(String[] args) { System.err.println("Erroneous parsecontext, see file " + tempFile.getAbsolutePath()); throw e; } + XcfaCoiKt.ConeOfInfluence = + (parseContext.getMultiThreading()) ? + new XcfaCoiMultiThread(xcfa) : + new XcfaCoiSingleThread(xcfa); logger.write(Logger.Level.INFO, "Parsed parsecontext.\n"); + logger.write(Level.INFO, "Parsed config, XCFA and ParseContext in " + sw.elapsed(TimeUnit.MILLISECONDS) + "ms\n"); + sw.reset(); + SafetyResult check = xcfaCegarConfig.check(xcfa, logger); logger.write(Logger.Level.INFO, "Safety check done.\n"); if (returnSafetyResult) { String s = gson.toJson(check); out.println(s); } else { - new XcfaWitnessWriter().writeWitness(check, new File(inputFileName), getSolver(xcfaCegarConfig.getRefinementSolver(), xcfaCegarConfig.getValidateRefinementSolver()), parseContext); + var workdir = FileSystems.getDefault().getPath("").toAbsolutePath(); + var witnessfile = new File(workdir.toString() + File.separator + "witness.graphml"); + new XcfaWitnessWriter().writeWitness(check, new File(inputFileName), getSolver(xcfaCegarConfig.getRefinementSolver(), xcfaCegarConfig.getValidateRefinementSolver()), parseContext, witnessfile); } logger.write(Logger.Level.INFO, "Server exiting.\n"); } diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCli.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCli.kt index 244e1e5548..c142862f49 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCli.kt +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCli.kt @@ -22,43 +22,60 @@ import com.google.common.base.Stopwatch import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.JsonParser +import hu.bme.mit.theta.analysis.Prec import hu.bme.mit.theta.analysis.Trace +import hu.bme.mit.theta.analysis.algorithm.ARG +import hu.bme.mit.theta.analysis.algorithm.SafetyChecker import hu.bme.mit.theta.analysis.algorithm.SafetyResult +import hu.bme.mit.theta.analysis.algorithm.debug.ARGWebDebugger import hu.bme.mit.theta.analysis.expl.ExplState +import hu.bme.mit.theta.analysis.expr.ExprAction +import hu.bme.mit.theta.analysis.expr.ExprState import hu.bme.mit.theta.analysis.utils.ArgVisualizer import hu.bme.mit.theta.analysis.utils.TraceVisualizer import hu.bme.mit.theta.c2xcfa.getXcfaFromC import hu.bme.mit.theta.common.CliUtils import hu.bme.mit.theta.common.logging.ConsoleLogger import hu.bme.mit.theta.common.logging.Logger +import hu.bme.mit.theta.common.logging.UniqueWarningLogger import hu.bme.mit.theta.common.visualization.Graph import hu.bme.mit.theta.common.visualization.writer.GraphvizWriter import hu.bme.mit.theta.common.visualization.writer.WebDebuggerLogger import hu.bme.mit.theta.frontend.ParseContext import hu.bme.mit.theta.frontend.chc.ChcFrontend -import hu.bme.mit.theta.llvm2xcfa.ArithmeticType +import hu.bme.mit.theta.frontend.transformation.ArchitectureConfig +import hu.bme.mit.theta.frontend.transformation.ArchitectureConfig.ArithmeticType import hu.bme.mit.theta.llvm2xcfa.XcfaUtils.fromFile import hu.bme.mit.theta.solver.smtlib.SmtLibSolverManager import hu.bme.mit.theta.xcfa.analysis.ErrorDetection import hu.bme.mit.theta.xcfa.analysis.XcfaAction import hu.bme.mit.theta.xcfa.analysis.XcfaState +import hu.bme.mit.theta.xcfa.analysis.coi.ConeOfInfluence +import hu.bme.mit.theta.xcfa.analysis.coi.XcfaCoiMultiThread +import hu.bme.mit.theta.xcfa.analysis.coi.XcfaCoiSingleThread import hu.bme.mit.theta.xcfa.analysis.por.XcfaDporLts +import hu.bme.mit.theta.xcfa.analysis.por.XcfaSporLts +import hu.bme.mit.theta.xcfa.cli.portfolio.complexPortfolio23 +import hu.bme.mit.theta.xcfa.cli.portfolio.complexPortfolio24 import hu.bme.mit.theta.xcfa.cli.utils.XcfaWitnessWriter import hu.bme.mit.theta.xcfa.cli.witnesses.XcfaTraceConcretizer import hu.bme.mit.theta.xcfa.model.XCFA import hu.bme.mit.theta.xcfa.model.toDot +import hu.bme.mit.theta.xcfa.passes.ChcPasses import hu.bme.mit.theta.xcfa.passes.LbePass import hu.bme.mit.theta.xcfa.passes.LoopUnrollPass +import hu.bme.mit.theta.xcfa.toC import org.antlr.v4.runtime.CharStreams import java.io.File import java.io.FileInputStream import java.io.FileReader +import java.nio.file.FileSystems import java.util.* import java.util.concurrent.TimeUnit import javax.script.Bindings +import javax.script.Compilable import javax.script.ScriptEngine import javax.script.ScriptEngineManager -import javax.script.SimpleBindings import kotlin.random.Random import kotlin.system.exitProcess @@ -77,6 +94,10 @@ class XcfaCli(private val args: Array) { description = "Level of LBE (NO_LBE, LBE_LOCAL, LBE_SEQ, LBE_FULL)") var lbeLevel: LbePass.LbeLevel = LbePass.LbeLevel.LBE_SEQ + @Parameter(names = ["--arithmetic"], + description = "Arithmetic type (efficient, bitvector, integer)") + var arithmetic: ArithmeticType = ArithmeticType.efficient + @Parameter(names = ["--unroll"], description = "Max number of loop iterations to unroll") var loopUnroll: Int = 50 @@ -95,7 +116,7 @@ class XcfaCli(private val args: Array) { @Parameter(names = ["--portfolio"], description = "Portfolio type (only valid with --strategy PORTFOLIO)") - var portfolio: File = File("complex.kts") + var portfolio: String? = null @Parameter(names = ["--smt-home"], description = "The path of the solver registry") var solverHome: String = SmtLibSolverManager.HOME.toAbsolutePath().toString() @@ -103,6 +124,10 @@ class XcfaCli(private val args: Array) { @Parameter(names = ["--debug"], description = "Debug mode (not exiting when encountering an exception)") var debug: Boolean = false + @Parameter(names = ["--arg-debug"], + description = "ARG debug mode (use the web-based debugger for ARG visualization)") + var argdebug: Boolean = false + //////////// debug options //////////// @Parameter(names = ["--stacktrace"], description = "Print full stack trace in case of exception") @@ -142,10 +167,20 @@ class XcfaCli(private val args: Array) { description = "Activates a wrapper, which validates the assertions in the solver in each (SAT) check. Filters some solver issues.") var validateConcretizerSolver: Boolean = false + @Parameter(names = ["--to-c-use-arrays"]) + var useArr: Boolean = false + + @Parameter(names = ["--to-c-use-exact-arrays"]) + var useExArr: Boolean = false + + @Parameter(names = ["--to-c-use-ranges"]) + var useRange: Boolean = false + @Parameter(names = ["--seed"], description = "Random seed used for DPOR") var randomSeed: Int = -1 - @Parameter(names = ["--arg-to-file"], description = "Visualize the resulting file here: https://ftsrg-edu.github.io/student-sisak-argviz/") + @Parameter(names = ["--arg-to-file"], + description = "Visualize the resulting file here: https://ftsrg-edu.github.io/student-sisak-argviz/") var argToFile: Boolean = false @Parameter @@ -170,45 +205,102 @@ class XcfaCli(private val args: Array) { val stopwatch = Stopwatch.createStarted() val gsonForOutput = getGson() val logger = ConsoleLogger(logLevel) - val explicitProperty: ErrorDetection = getExplicitProperty() + val uniqueWarningLogger = UniqueWarningLogger(logLevel) + val explicitProperty: ErrorDetection = getExplicitProperty(uniqueWarningLogger) + portfolio?.run { strategy = Strategy.PORTFOLIO } // propagating input variables LbePass.level = lbeLevel - if (randomSeed >= 0) XcfaDporLts.random = Random(randomSeed) + if (randomSeed >= 0) { + val random = Random(randomSeed) + XcfaSporLts.random = random + XcfaDporLts.random = random + } if (argToFile) { WebDebuggerLogger.enableWebDebuggerLogger() WebDebuggerLogger.getInstance().setTitle(input?.name) } LoopUnrollPass.UNROLL_LIMIT = loopUnroll + ARGWebDebugger.on = argdebug - - logger.write(Logger.Level.INFO, "Parsing the input $input as $inputType") + logger.write(Logger.Level.INFO, "Parsing the input $input as $inputType\n") val parseContext = ParseContext() - val xcfa = getXcfa(logger, explicitProperty, parseContext) + parseContext.arithmetic = arithmetic + val xcfa = getXcfa(logger, explicitProperty, parseContext, uniqueWarningLogger) + ConeOfInfluence = if (parseContext.multiThreading) XcfaCoiMultiThread(xcfa) else XcfaCoiSingleThread(xcfa) logger.write(Logger.Level.INFO, "Frontend finished: ${xcfa.name} (in ${ stopwatch.elapsed(TimeUnit.MILLISECONDS) } ms)\n") - preVerificationLogging(logger, xcfa, gsonForOutput) + preVerificationLogging(logger, xcfa, gsonForOutput, parseContext) if (noAnalysis) { - logger.write(Logger.Level.RESULT, "ParsingResult Success") + logger.write(Logger.Level.RESULT, "ParsingResult Success\n") return } // verification stopwatch.reset().start() - logger.write(Logger.Level.INFO, "Starting verification of ${xcfa.name} using $backend") - registerAllSolverManagers(solverHome, logger) - val config = parseConfigFromCli() - if (strategy != Strategy.PORTFOLIO && printConfigFile != null) { - printConfigFile!!.writeText(gsonForOutput.toJson(config)) - } + val safetyResult: SafetyResult<*, *> = - when (strategy) { - Strategy.DIRECT -> runDirect(xcfa, config, logger) - Strategy.SERVER -> runServer(xcfa, config, logger, parseContext) - Strategy.SERVER_DEBUG -> runServerDebug(xcfa, config, logger, parseContext) - Strategy.PORTFOLIO -> runPortfolio(xcfa, explicitProperty, logger, parseContext, debug) + if (xcfa.procedures.all { it.errorLoc.isEmpty && explicitProperty != ErrorDetection.NO_ERROR }) { + registerAllSolverManagers(solverHome, logger) + SafetyResult.safe(ARG.create { _, _ -> false }) + } else if (backend == Backend.CEGAR) { + logger.write(Logger.Level.INFO, + "Starting verification of ${if (xcfa.name == "") "UnnamedXcfa" else xcfa.name} using $backend\n") + registerAllSolverManagers(solverHome, logger) + logger.write(Logger.Level.INFO, + "Registered solver managers successfully (in ${stopwatch.elapsed(TimeUnit.MILLISECONDS)} ms)\n") + stopwatch.reset().start() + val config = parseCEGARConfigFromCli(parseContext) + if (strategy != Strategy.PORTFOLIO && printConfigFile != null) { + printConfigFile!!.writeText(gsonForOutput.toJson(config)) + } + logger.write(Logger.Level.INFO, "Parsed config (in ${stopwatch.elapsed(TimeUnit.MILLISECONDS)} ms)\n") + stopwatch.reset().start() + + when (strategy) { + Strategy.DIRECT -> runDirect(xcfa, config, logger) + Strategy.SERVER -> runServer(xcfa, config, logger, parseContext, argdebug) + Strategy.SERVER_DEBUG -> runServerDebug(xcfa, config, logger, parseContext) + Strategy.PORTFOLIO -> runPortfolio(xcfa, explicitProperty, logger, parseContext, debug, + argdebug) + } + } else { + registerAllSolverManagers(solverHome, logger) + val checker = if (backend == Backend.KIND) { + val kindConfig = parseKindConfigFromCli() + kindConfig.getKindChecker(xcfa) + } else if (backend == Backend.IMC) { + val imcConfig = parseIMCConfigFromCli() + imcConfig.getIMCChecker(xcfa) + } else if (backend == Backend.IMC_THEN_KIND) { + SafetyChecker { + val safetyResult = try { + val imcConfig = parseIMCConfigFromCli() + logger.write(Logger.Level.SUBSTEP, "Starting IMC with config $imcConfig...\n") + val ret = imcConfig.getIMCChecker(xcfa, 60).check(null) + logger.write(Logger.Level.SUBSTEP, "IMC ended\n") + ret + } catch (e: Throwable) { + logger.write(Logger.Level.SUBSTEP, "IMC threw exception: $e\n") + null + // do not do anything, kind will run + } + if (safetyResult == null) { + val kindConfig = parseKindConfigFromCli() + logger.write(Logger.Level.SUBSTEP, "Starting KIND with config $kindConfig\n") + val ret = kindConfig.getKindChecker(xcfa).check(null) as SafetyResult + logger.write(Logger.Level.SUBSTEP, "KIND ended\n") + ret + } else { + safetyResult as SafetyResult + } + } + } else { + error("Backend $backend not supported") + } + checker.check(null) } // post verification postVerificationLogging(safetyResult, parseContext) @@ -219,9 +311,9 @@ class XcfaCli(private val args: Array) { exitOnError(stacktrace, debug) { config.check(xcfa, logger) } private fun runServer(xcfa: XCFA, config: XcfaCegarConfig, - logger: ConsoleLogger, parseContext: ParseContext): SafetyResult<*, *> { + logger: ConsoleLogger, parseContext: ParseContext, argdebug: Boolean): SafetyResult<*, *> { val safetyResultSupplier = config.checkInProcess(xcfa, solverHome, true, - input!!.absolutePath, logger, parseContext) + input!!.absolutePath, logger, parseContext, argdebug) return try { safetyResultSupplier() } catch (e: ErrorCodeException) { @@ -241,23 +333,53 @@ class XcfaCli(private val args: Array) { } private fun runPortfolio(xcfa: XCFA, explicitProperty: ErrorDetection, - logger: ConsoleLogger, parseContext: ParseContext, debug: Boolean = false): SafetyResult<*, *> { - val portfolioDescriptor = portfolio - val kotlinEngine: ScriptEngine = ScriptEngineManager().getEngineByExtension("kts") + logger: ConsoleLogger, parseContext: ParseContext, debug: Boolean = false, + argdebug: Boolean): SafetyResult<*, *> { return try { - val bindings: Bindings = SimpleBindings() - bindings["xcfa"] = xcfa - bindings["parseContext"] = parseContext - bindings["property"] = explicitProperty - bindings["cFileName"] = input!!.absolutePath - bindings["logger"] = logger - bindings["smtHome"] = solverHome - bindings["traits"] = VerificationTraits( - multithreaded = parseContext.multiThreading, - arithmetic = parseContext.bitwiseOption, - ) - val portfolioResult = kotlinEngine.eval(FileReader(portfolioDescriptor), - bindings) as Pair> + val portfolioResult = if (File(portfolio).exists()) { + val portfolioDescriptor = portfolio!! + val kotlinEngine: ScriptEngine = ScriptEngineManager().getEngineByExtension("kts") + val bindings: Bindings = kotlinEngine.createBindings() + bindings["xcfa"] = xcfa + bindings["parseContext"] = parseContext + bindings["property"] = explicitProperty + bindings["cFileName"] = input!!.absolutePath + bindings["logger"] = logger + bindings["smtHome"] = solverHome + bindings["traits"] = VerificationTraits( + multithreaded = parseContext.multiThreading, + arithmeticTraits = parseContext.arithmeticTraits, + ) + bindings["argdebug"] = argdebug + + kotlinEngine as Compilable + val stopwatch = Stopwatch.createStarted() + + kotlinEngine.eval("true") as Boolean + logger.write(Logger.Level.INFO, + "Loaded script engine (in ${stopwatch.elapsed(TimeUnit.MILLISECONDS)} ms)\n") + stopwatch.reset().start() + + // 100 seems to be a safe default, based on AbstractScriptEngine + kotlinEngine.context.setBindings(bindings, 100) + val compiled = kotlinEngine.compile(FileReader(portfolioDescriptor)) + logger.write(Logger.Level.INFO, + "Compiled portfolio (in ${stopwatch.elapsed(TimeUnit.MILLISECONDS)} ms)\n") + + compiled.eval() as Pair> + } else if (portfolio == "COMPLEX23") { + complexPortfolio23(xcfa, input!!.absolutePath, logger, solverHome, VerificationTraits( + multithreaded = parseContext.multiThreading, + arithmeticTraits = parseContext.arithmeticTraits, + ), explicitProperty, parseContext, debug, + argdebug).execute() as Pair> + } else if (portfolio == "COMPLEX" || portfolio == "COMPLEX24") { + complexPortfolio24(xcfa, input!!.absolutePath, logger, solverHome, VerificationTraits( + multithreaded = parseContext.multiThreading, + arithmeticTraits = parseContext.arithmeticTraits, + ), explicitProperty, parseContext, debug, + argdebug).execute() as Pair> + } else throw Exception("No known portfolio $portfolio") concretizerSolver = portfolioResult.first.refinementSolver validateConcretizerSolver = portfolioResult.first.validateRefinementSolver @@ -269,22 +391,30 @@ class XcfaCli(private val args: Array) { } catch (e: Exception) { if (debug) throw e logger.write(Logger.Level.RESULT, - "Portfolio from $portfolioDescriptor could not be executed.") + "Portfolio '$portfolio' could not be executed.\n") e.printStackTrace() exitProcess(ExitCodes.PORTFOLIO_ERROR.code) } } - private fun preVerificationLogging(logger: ConsoleLogger, xcfa: XCFA, gsonForOutput: Gson) { + private fun preVerificationLogging(logger: ConsoleLogger, xcfa: XCFA, gsonForOutput: Gson, + parseContext: ParseContext) { if (outputResults && !svcomp) { resultFolder.mkdirs() logger.write(Logger.Level.INFO, - "Writing results to directory ${resultFolder.absolutePath}") + "Writing results to directory ${resultFolder.absolutePath}\n") val xcfaDotFile = File(resultFolder, "xcfa.dot") xcfaDotFile.writeText(xcfa.toDot()) + try { + val xcfaCFile = File(resultFolder, "xcfa.c") + xcfaCFile.writeText(xcfa.toC(parseContext, useArr, useExArr, useRange)) + } catch (e: Throwable) { + logger.write(Logger.Level.VERBOSE, "Could not emit C file\n") + } + val xcfaJsonFile = File(resultFolder, "xcfa.json") val uglyJson = gsonForOutput.toJson(xcfa) val create = GsonBuilder().setPrettyPrinting().create() @@ -310,31 +440,49 @@ class XcfaCli(private val args: Array) { val traceG: Graph = TraceVisualizer.getDefault().visualize(concrTrace) traceFile.writeText(GraphvizWriter.getInstance().writeString(traceG)) } + val witnessFile = File(resultFolder, "witness.graphml") + XcfaWitnessWriter().writeWitness(safetyResult, input!!, + getSolver(concretizerSolver, validateConcretizerSolver), parseContext, witnessFile) } else { + val workdir = FileSystems.getDefault().getPath("").toAbsolutePath() + val witnessfile = File(workdir.toString() + File.separator + "witness.graphml") XcfaWitnessWriter().writeWitness(safetyResult, input!!, - getSolver(concretizerSolver, validateConcretizerSolver), parseContext) + getSolver(concretizerSolver, validateConcretizerSolver), parseContext, witnessfile) } } } - private fun getXcfa(logger: ConsoleLogger, explicitProperty: ErrorDetection, parseContext: ParseContext) = + private fun getXcfa(logger: ConsoleLogger, explicitProperty: ErrorDetection, parseContext: ParseContext, + uniqueWarningLogger: Logger) = try { when (inputType) { InputType.CHC -> { - parseChc(logger) + parseChc(logger, parseContext, uniqueWarningLogger) } InputType.C -> { - val stream = FileInputStream(input!!) - val xcfaFromC = getXcfaFromC(stream, parseContext, false, - explicitProperty == ErrorDetection.OVERFLOW).first + val xcfaFromC = try { + val stream = FileInputStream(input!!) + getXcfaFromC(stream, parseContext, false, + explicitProperty == ErrorDetection.OVERFLOW, uniqueWarningLogger).first + } catch (e: Throwable) { + if (parseContext.arithmetic == ArchitectureConfig.ArithmeticType.efficient) { + parseContext.arithmetic = ArchitectureConfig.ArithmeticType.bitvector + logger.write(Logger.Level.INFO, "Retrying parsing with bitvector arithmetic...\n") + val stream = FileInputStream(input!!) + getXcfaFromC(stream, parseContext, false, + explicitProperty == ErrorDetection.OVERFLOW, uniqueWarningLogger).first + } else { + throw e + } + } logger.write(Logger.Level.RESULT, - "Arithmetic: ${parseContext.arithmetic}\n") + "Arithmetic: ${parseContext.arithmeticTraits}\n") xcfaFromC } - InputType.LLVM -> fromFile(input!!, ArithmeticType.efficient) + InputType.LLVM -> fromFile(input!!, hu.bme.mit.theta.llvm2xcfa.ArithmeticType.efficient) InputType.JSON -> { val gson = getGson() @@ -349,29 +497,33 @@ class XcfaCli(private val args: Array) { } } catch (e: Exception) { if (stacktrace) e.printStackTrace() - logger.write(Logger.Level.RESULT, "Frontend failed!\n") + val location = e.stackTrace.filter { it.className.startsWith("hu.bme.mit.theta") }.first().toString() + logger.write(Logger.Level.RESULT, "Frontend failed! ($location, $e)\n") exitProcess(ExitCodes.FRONTEND_FAILED.code) } - private fun parseChc(logger: ConsoleLogger): XCFA { + private fun parseChc(logger: ConsoleLogger, parseContext: ParseContext, uniqueWarningLogger: Logger): XCFA { var chcFrontend: ChcFrontend val xcfaBuilder = if (chcTransformation == ChcFrontend.ChcTransformation.PORTFOLIO) { // try forward, fallback to backward chcFrontend = ChcFrontend(ChcFrontend.ChcTransformation.FORWARD) try { - chcFrontend.buildXcfa(CharStreams.fromStream(FileInputStream(input!!))) + chcFrontend.buildXcfa(CharStreams.fromStream(FileInputStream(input!!)), + ChcPasses(parseContext, uniqueWarningLogger)) } catch (e: UnsupportedOperationException) { - logger.write(Logger.Level.INFO, "Non-linear CHC found, retrying using backward transformation...") + logger.write(Logger.Level.INFO, "Non-linear CHC found, retrying using backward transformation...\n") chcFrontend = ChcFrontend(ChcFrontend.ChcTransformation.BACKWARD) - chcFrontend.buildXcfa(CharStreams.fromStream(FileInputStream(input!!))) + chcFrontend.buildXcfa(CharStreams.fromStream(FileInputStream(input!!)), + ChcPasses(parseContext, uniqueWarningLogger)) } } else { chcFrontend = ChcFrontend(chcTransformation) - chcFrontend.buildXcfa(CharStreams.fromStream(FileInputStream(input!!))) + chcFrontend.buildXcfa(CharStreams.fromStream(FileInputStream(input!!)), + ChcPasses(parseContext, uniqueWarningLogger)) } return xcfaBuilder.build() } - private fun getExplicitProperty() = if (property != null) { + private fun getExplicitProperty(uniqueWarningLogger: Logger) = if (property != null) { remainingFlags.add("--error-detection") when { property!!.name.endsWith("unreach-call.prp") -> { @@ -382,8 +534,8 @@ class XcfaCli(private val args: Array) { property!!.name.endsWith("no-data-race.prp") -> { remainingFlags.add(ErrorDetection.DATA_RACE.toString()) if (lbeLevel != LbePass.LbeLevel.NO_LBE) { - System.err.println( - "Changing LBE type to NO_LBE because the DATA_RACE property will be erroneous otherwise") + uniqueWarningLogger.write(Logger.Level.INFO, + "Changing LBE type to NO_LBE because the DATA_RACE property will be erroneous otherwise\n") lbeLevel = LbePass.LbeLevel.NO_LBE } ErrorDetection.DATA_RACE @@ -392,8 +544,8 @@ class XcfaCli(private val args: Array) { property!!.name.endsWith("no-overflow.prp") -> { remainingFlags.add(ErrorDetection.OVERFLOW.toString()) if (lbeLevel != LbePass.LbeLevel.NO_LBE) { - System.err.println( - "Changing LBE type to NO_LBE because the OVERFLOW property will be erroneous otherwise") + uniqueWarningLogger.write(Logger.Level.INFO, + "Changing LBE type to NO_LBE because the OVERFLOW property will be erroneous otherwise\n") lbeLevel = LbePass.LbeLevel.NO_LBE } ErrorDetection.OVERFLOW @@ -401,14 +553,42 @@ class XcfaCli(private val args: Array) { else -> { remainingFlags.add(ErrorDetection.NO_ERROR.toString()) - System.err.println( - "Unknown property $property, using full state space exploration (no refinement)") + uniqueWarningLogger.write(Logger.Level.INFO, + "Unknown property $property, using full state space exploration (no refinement)\n") ErrorDetection.NO_ERROR } } } else ErrorDetection.ERROR_LOCATION - private fun parseConfigFromCli(): XcfaCegarConfig { + private fun parseIMCConfigFromCli(): XcfaImcConfig { + val imcConfig = XcfaImcConfig() + try { + JCommander.newBuilder().addObject(imcConfig).programName(JAR_NAME).build() + .parse(*remainingFlags.toTypedArray()) + } catch (ex: ParameterException) { + println("Invalid parameters, details:") + ex.printStackTrace() + ex.usage() + exitProcess(ExitCodes.INVALID_PARAM.code) + } + return imcConfig + } + + private fun parseKindConfigFromCli(): XcfaKindConfig { + val kindConfig = XcfaKindConfig() + try { + JCommander.newBuilder().addObject(kindConfig).programName(JAR_NAME).build() + .parse(*remainingFlags.toTypedArray()) + } catch (ex: ParameterException) { + println("Invalid parameters, details:") + ex.printStackTrace() + ex.usage() + exitProcess(ExitCodes.INVALID_PARAM.code) + } + return kindConfig + } + + private fun parseCEGARConfigFromCli(parseContext: ParseContext): XcfaCegarConfig { val cegarConfig = XcfaCegarConfig() try { JCommander.newBuilder().addObject(cegarConfig).programName(JAR_NAME).build() @@ -419,6 +599,9 @@ class XcfaCli(private val args: Array) { ex.usage() exitProcess(ExitCodes.INVALID_PARAM.code) } + if (parseContext.multiThreading && cegarConfig.search == Search.ERR) { + cegarConfig.search = Search.DFS; + } return cegarConfig } @@ -432,4 +615,4 @@ class XcfaCli(private val args: Array) { mainApp.run() } } -} \ No newline at end of file +} diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaImcConfig.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaImcConfig.kt new file mode 100644 index 0000000000..d5c8454319 --- /dev/null +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaImcConfig.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.xcfa.cli + +import com.beust.jcommander.Parameter +import hu.bme.mit.theta.analysis.algorithm.imc.ImcChecker +import hu.bme.mit.theta.analysis.expl.ExplState +import hu.bme.mit.theta.core.utils.ExprUtils +import hu.bme.mit.theta.xcfa.analysis.XcfaAction +import hu.bme.mit.theta.xcfa.analysis.XcfaMonolithicTransFunc +import hu.bme.mit.theta.xcfa.analysis.XcfaState +import hu.bme.mit.theta.xcfa.cli.utils.valToAction +import hu.bme.mit.theta.xcfa.cli.utils.valToState +import hu.bme.mit.theta.xcfa.model.XCFA + +data class XcfaImcConfig( + @Parameter(names = ["--imc-solver"], description = "BMC solver name") + var imcSolver: String = "Z3", + @Parameter(names = ["--validate-imc-solver"], + description = "Activates a wrapper, which validates the assertions in the solver in each (SAT) check. Filters some solver issues.") + var validateIMCSolver: Boolean = false, + @Parameter(names = ["--max-bound"], + description = "How many successors to enumerate in a transition. Only relevant to the explicit domain. Use 0 for no limit.") + var maxBound: Int = Int.MAX_VALUE, + @Parameter + var remainingFlags: MutableList = ArrayList() +) { + + fun getIMCChecker(xcfa: XCFA, timeout: Int = 0): ImcChecker, XcfaAction> { + val transFunc = XcfaMonolithicTransFunc.create(xcfa) + return ImcChecker, XcfaAction>( + transFunc, + maxBound, + getSolver(imcSolver, validateIMCSolver).createItpSolver(), + { val1 -> valToState(xcfa, val1) }, + { val1, val2 -> valToAction(xcfa, val1, val2) }, + ExprUtils.getVars(transFunc.transExpr), + timeout) + } + +} \ No newline at end of file diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaKindConfig.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaKindConfig.kt new file mode 100644 index 0000000000..2adf29c34b --- /dev/null +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaKindConfig.kt @@ -0,0 +1,68 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.xcfa.cli + +import com.beust.jcommander.Parameter +import hu.bme.mit.theta.analysis.algorithm.kind.KIndChecker +import hu.bme.mit.theta.analysis.expl.ExplState +import hu.bme.mit.theta.core.utils.ExprUtils +import hu.bme.mit.theta.xcfa.analysis.XcfaAction +import hu.bme.mit.theta.xcfa.analysis.XcfaMonolithicTransFunc +import hu.bme.mit.theta.xcfa.analysis.XcfaState +import hu.bme.mit.theta.xcfa.cli.utils.valToAction +import hu.bme.mit.theta.xcfa.cli.utils.valToState +import hu.bme.mit.theta.xcfa.model.XCFA + +data class XcfaKindConfig( + @Parameter(names = ["--bmc-solver"], description = "BMC solver name") + var bmcSolver: String = "Z3", + @Parameter(names = ["--validate-bmc-solver"], + description = "Activates a wrapper, which validates the assertions in the solver in each (SAT) check. Filters some solver issues.") + var validateBMCSolver: Boolean = false, + @Parameter(names = ["--induction-solver", "--ind-solver"], description = "Induction solver name") + var indSolver: String = "Z3", + @Parameter(names = ["--validate-induction-solver"], + description = "Activates a wrapper, which validates the assertions in the solver in each (SAT) check. Filters some solver issues.") + var validateIndSolver: Boolean = false, + @Parameter(names = ["--max-bound"], + description = "How many successors to enumerate in a transition. Only relevant to the explicit domain. Use 0 for no limit.") + var maxBound: Int = Int.MAX_VALUE, + @Parameter(names = ["--ind-min-bound"], + description = "Start induction after reaching this bound") + var indMinBound: Int = 0, + @Parameter(names = ["--ind-frequency"], + description = "Frequency of induction check") + var indFreq: Int = 1, + @Parameter + var remainingFlags: MutableList = ArrayList() +) { + + fun getKindChecker(xcfa: XCFA): KIndChecker, XcfaAction> { + val transFunc = XcfaMonolithicTransFunc.create(xcfa) + return KIndChecker, XcfaAction>( + transFunc, + maxBound, + indMinBound, + indFreq, + getSolver(bmcSolver, validateBMCSolver).createSolver(), + getSolver(indSolver, validateIndSolver).createSolver(), + { val1 -> valToState(xcfa, val1) }, + { val1, val2 -> valToAction(xcfa, val1, val2) }, + ExprUtils.getVars(transFunc.transExpr)) + } + +} \ No newline at end of file diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/complex23.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/complex23.kt new file mode 100644 index 0000000000..0dc1aba5db --- /dev/null +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/complex23.kt @@ -0,0 +1,351 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.xcfa.cli.portfolio + +import hu.bme.mit.theta.analysis.expr.refinement.PruneStrategy +import hu.bme.mit.theta.common.logging.Logger +import hu.bme.mit.theta.frontend.ParseContext +import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.ArithmeticTrait +import hu.bme.mit.theta.xcfa.analysis.ErrorDetection +import hu.bme.mit.theta.xcfa.cli.* +import hu.bme.mit.theta.xcfa.model.XCFA + +fun complexPortfolio23(xcfaTyped: XCFA, cFileNameTyped: String, loggerTyped: Logger, smtHomeTyped: String, + traitsTyped: VerificationTraits, propertyTyped: ErrorDetection, + parseContextTyped: ParseContext, debug: Boolean, + argdebug: Boolean): STM { + + val checker = { p: Boolean, config: XcfaCegarConfig -> + if (p) + config.checkInProcess(xcfaTyped, smtHomeTyped, true, cFileNameTyped, loggerTyped, parseContextTyped, + argdebug)() + else config.check(xcfaTyped, loggerTyped) + } + + var baseConfig = XcfaCegarConfig( + errorDetectionType = propertyTyped, + abstractionSolver = "Z3", + validateAbstractionSolver = false, + domain = Domain.EXPL, + maxEnum = 1, + search = Search.ERR, + initPrec = InitPrec.EMPTY, + porLevel = POR.NOPOR, + coi = ConeOfInfluenceMode.COI, + refinementSolver = "Z3", + validateRefinementSolver = false, + refinement = Refinement.SEQ_ITP, + exprSplitter = ExprSplitterOptions.WHOLE, + pruneStrategy = PruneStrategy.FULL, + cexMonitor = CexMonitorOptions.CHECK, + timeoutMs = 0 + ) + + if (traitsTyped.multithreaded) { + baseConfig = baseConfig.copy(search = Search.BFS, porLevel = POR.AASPOR, pruneStrategy = PruneStrategy.LAZY, + coi = ConeOfInfluenceMode.COI) + + if (propertyTyped == ErrorDetection.DATA_RACE) { + baseConfig = baseConfig.copy(porLevel = POR.SPOR) + } + } + + val timeoutTrigger = ExceptionTrigger( + ErrorCodeException(ExitCodes.TIMEOUT.code), + ErrorCodeException(ExitCodes.VERIFICATION_STUCK.code), + ErrorCodeException(ExitCodes.OUT_OF_MEMORY.code), + ErrorCodeException(ExitCodes.GENERIC_ERROR.code), + label = "Timeout" + ) + + val timeoutOrSolverError = ExceptionTrigger( + ErrorCodeException(ExitCodes.SOLVER_ERROR.code), + ErrorCodeException(ExitCodes.TIMEOUT.code), + ErrorCodeException(ExitCodes.VERIFICATION_STUCK.code), + ErrorCodeException(ExitCodes.OUT_OF_MEMORY.code), + ErrorCodeException(ExitCodes.GENERIC_ERROR.code), + label = "TimeoutOrSolverError" + ) + + val quickExplConfig = baseConfig.copy(initPrec = InitPrec.ALLVARS, timeoutMs = 90_000) + val emptyExplConfig = baseConfig.copy(timeoutMs = 210_000) + val predConfig = baseConfig.copy(domain = Domain.PRED_CART, refinement = Refinement.BW_BIN_ITP) + + fun integerStm(): STM { + fun getStm(inProcess: Boolean): STM { + val config_1_1 = ConfigNode("QuickFullExpl_z3_4.10.1_$inProcess", + quickExplConfig.copy(abstractionSolver = "z3:4.10.1", refinementSolver = "z3:4.10.1", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_2_1 = ConfigNode("EmptyExpl_z3_4.10.1_$inProcess", + emptyExplConfig.copy(abstractionSolver = "z3:4.10.1", refinementSolver = "z3:4.10.1", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_3_1 = ConfigNode("PredCart_z3_4.10.1_$inProcess", + predConfig.copy(abstractionSolver = "z3:4.10.1", refinementSolver = "z3:4.10.1"), checker, inProcess) + + val config_1_2 = ConfigNode("QuickFullExpl_Z3_$inProcess", quickExplConfig.copy(), checker, inProcess) + val config_2_2 = ConfigNode("EmptyExpl_Z3_$inProcess", emptyExplConfig.copy(), checker, inProcess) + val config_3_2 = ConfigNode("PredCart_Z3_$inProcess", predConfig.copy(), checker, inProcess) + + val config_1_3 = ConfigNode("QuickFullExpl_princess_2022_07_01_$inProcess", + quickExplConfig.copy(abstractionSolver = "princess:2022-07-01", + refinementSolver = "princess:2022-07-01"), + checker, inProcess) + val config_2_3 = ConfigNode("EmptyExpl_princess_2022_07_01_$inProcess", + emptyExplConfig.copy(abstractionSolver = "princess:2022-07-01", + refinementSolver = "princess:2022-07-01"), + checker, inProcess) + val config_3_3 = ConfigNode("PredCart_mathsat_5.6.8_$inProcess", + predConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8"), checker, + inProcess) + + val config_1_4 = ConfigNode("QuickFullExpl_mathsat_5.6.8_$inProcess", + quickExplConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8"), checker, + inProcess) + val config_2_4 = ConfigNode("EmptyExpl_mathsat_5.6.8_$inProcess", + emptyExplConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8"), checker, + inProcess) + val config_3_4 = ConfigNode("PredCart_princess_2022_07_01_$inProcess", + predConfig.copy(abstractionSolver = "princess:2022-07-01", refinementSolver = "princess:2022-07-01"), + checker, inProcess) + + val timeouts = setOf( + Edge(config_1_1, config_2_1, timeoutTrigger), + Edge(config_2_1, config_3_1, timeoutTrigger), + + Edge(config_1_2, config_2_2, timeoutTrigger), + Edge(config_2_2, config_3_1, timeoutTrigger), + + Edge(config_1_3, config_2_3, timeoutTrigger), + Edge(config_2_3, config_3_1, timeoutTrigger), + + Edge(config_1_4, config_2_4, + if (inProcess) timeoutOrSolverError else ExceptionTrigger(label = "Anything")), + Edge(config_2_4, config_3_1, + if (inProcess) timeoutOrSolverError else ExceptionTrigger(label = "Anything")), + ) + + val notTimeout = if (inProcess) ExceptionTrigger(ErrorCodeException(ExitCodes.SOLVER_ERROR.code), + label = "SolverError") else ExceptionTrigger(fallthroughExceptions = timeoutTrigger.exceptions, + label = "AnythingButTimeout") + + val solverExceptions = setOf( + Edge(config_1_1, config_1_2, notTimeout), + Edge(config_1_2, config_1_3, notTimeout), + Edge(config_1_3, config_1_4, notTimeout), + + Edge(config_2_1, config_2_2, notTimeout), + Edge(config_2_2, config_2_3, notTimeout), + Edge(config_2_3, config_2_4, notTimeout), + + Edge(config_3_1, config_3_2, notTimeout), + Edge(config_3_2, config_3_3, notTimeout), + Edge(config_3_3, config_3_4, notTimeout), + ) + return STM(config_1_1, timeouts union solverExceptions) + } + + val inProcess = HierarchicalNode("InProcess", + getStm(!debug)) // if not debug, then in process, else not in process + val notInProcess = HierarchicalNode("NotInprocess", getStm(false)) + + val fallbackEdge = Edge(inProcess, notInProcess, ExceptionTrigger(label = "Anything")) + + return STM(inProcess, setOf(fallbackEdge)) + } + + fun bitwiseStm(): STM { + fun getStm(inProcess: Boolean): STM { + val config_1_1 = ConfigNode("QuickFullExpl_Z3_$inProcess", + quickExplConfig.copy(refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_2_1 = ConfigNode("EmptyExpl_Z3_$inProcess", + emptyExplConfig.copy(refinement = Refinement.NWT_IT_WP), + checker, inProcess) + val config_3_1 = ConfigNode("PredCart_mathsat_5.6.8_$inProcess", + predConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8"), checker, + inProcess) + + val config_1_2 = ConfigNode("QuickFullExpl_cvc5_1.0.2_$inProcess", + quickExplConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_2_2 = ConfigNode("EmptyExpl_cvc5_1.0.2_$inProcess", + emptyExplConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_3_2 = ConfigNode("PredCart_z3_4.10.1_$inProcess", + predConfig.copy(abstractionSolver = "z3:4.10.1", refinementSolver = "z3:4.10.1"), checker, inProcess) + + val config_1_3 = ConfigNode("QuickFullExpl_mathsat_5.6.8_$inProcess", + quickExplConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_2_3 = ConfigNode("EmptyExpl_mathsat_5.6.8_$inProcess", + emptyExplConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8", + refinement = Refinement.SEQ_ITP), checker, inProcess) + val config_3_3 = ConfigNode("PredCart_cvc5_1.0.2_$inProcess", + predConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + + val timeouts = setOf( + Edge(config_1_1, config_2_1, timeoutTrigger), + Edge(config_2_1, config_3_1, timeoutTrigger), + + Edge(config_1_2, config_2_2, timeoutTrigger), + Edge(config_2_2, config_3_1, timeoutTrigger), + + Edge(config_1_3, config_2_3, + if (inProcess) timeoutOrSolverError else ExceptionTrigger(label = "Anything")), + Edge(config_2_3, config_3_1, + if (inProcess) timeoutOrSolverError else ExceptionTrigger(label = "Anything")), + ) + + val notTimeout = if (inProcess) ExceptionTrigger(ErrorCodeException(ExitCodes.SOLVER_ERROR.code), + label = "SolverError") else ExceptionTrigger(fallthroughExceptions = timeoutTrigger.exceptions, + label = "AnythingButTimeout") + + val solverExceptions = setOf( + Edge(config_1_1, config_1_2, notTimeout), + Edge(config_1_2, config_1_3, notTimeout), + + Edge(config_2_1, config_2_2, notTimeout), + Edge(config_2_2, config_2_3, notTimeout), + + Edge(config_3_1, config_3_2, notTimeout), + Edge(config_3_2, config_3_3, notTimeout), + ) + return STM(config_1_1, timeouts union solverExceptions) + } + + val inProcess = HierarchicalNode("InProcess", + getStm(!debug)) // if not debug, then in process, else not in process + val notInProcess = HierarchicalNode("NotInprocess", getStm(false)) + + val fallbackEdge = Edge(inProcess, notInProcess, ExceptionTrigger(label = "Anything")) + + return STM(inProcess, setOf(fallbackEdge)) + } + + fun floatsStm(): STM { + fun getStm(inProcess: Boolean): STM { + val config_1_1 = ConfigNode("QuickFullExpl_cvc5_1.0.2_$inProcess", + quickExplConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_2_1 = ConfigNode("EmptyExpl_cvc5_1.0.2_$inProcess", + quickExplConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_3_1 = ConfigNode("PredCart_mathsat_5.6.8_$inProcess", + predConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8"), checker, + inProcess) + + val config_1_2 = ConfigNode("QuickFullExpl_cvc5_1.0.2_seq_$inProcess", + quickExplConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.SEQ_ITP), checker, inProcess) + val config_2_2 = ConfigNode("EmptyExpl_cvc5_1.0.2_seq_$inProcess", + emptyExplConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.SEQ_ITP), checker, inProcess) + val config_3_2 = ConfigNode("PredCart_bitwuzla_latest_$inProcess", + predConfig.copy(abstractionSolver = "bitwuzla:latest", refinementSolver = "bitwuzla:latest", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + + val config_1_3 = ConfigNode("QuickFullExpl_mathsat_5.6.8_$inProcess", + quickExplConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8", + validateAbstractionSolver = true, validateRefinementSolver = true, + refinement = Refinement.NWT_IT_WP), + checker, inProcess) + val config_2_3 = ConfigNode("EmptyExpl_mathsat_5.6.8_$inProcess", + emptyExplConfig.copy(abstractionSolver = "mathsat:5.6.8", refinementSolver = "mathsat:5.6.8", + validateAbstractionSolver = true, validateRefinementSolver = true, + refinement = Refinement.NWT_IT_WP), + checker, inProcess) + val config_3_3 = ConfigNode("PredCart_cvc5_1.0.2_$inProcess", + predConfig.copy(abstractionSolver = "cvc5:1.0.2", refinementSolver = "cvc5:1.0.2", + refinement = Refinement.NWT_IT_WP), checker, inProcess) + + val config_1_4 = ConfigNode("QuickFullExpl_mathsat_fp_$inProcess", + quickExplConfig.copy(abstractionSolver = "mathsat:fp", refinementSolver = "mathsat:fp", + validateAbstractionSolver = true, validateRefinementSolver = true), checker, inProcess) + val config_2_4 = ConfigNode("EmptyExpl_mathsat_fp_$inProcess", + emptyExplConfig.copy(abstractionSolver = "mathsat:fp", refinementSolver = "mathsat:fp", + validateAbstractionSolver = true, validateRefinementSolver = true), checker, inProcess) + val config_3_4 = ConfigNode("PredCart_mathsat_fp_$inProcess", + predConfig.copy(abstractionSolver = "mathsat:fp", refinementSolver = "mathsat:fp", + validateAbstractionSolver = true, validateRefinementSolver = true), checker, inProcess) + + val config_1_5 = ConfigNode("QuickFullExpl_Z3_$inProcess", + quickExplConfig.copy(abstractionSolver = "Z3", refinementSolver = "Z3", + validateAbstractionSolver = true, + validateRefinementSolver = true, refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_2_5 = ConfigNode("EmptyExpl_Z3_$inProcess", + emptyExplConfig.copy(abstractionSolver = "Z3", refinementSolver = "Z3", + validateAbstractionSolver = true, + validateRefinementSolver = true, refinement = Refinement.NWT_IT_WP), checker, inProcess) + val config_3_5 = ConfigNode("PredCart_Z3_$inProcess", + predConfig.copy(abstractionSolver = "Z3", refinementSolver = "Z3", refinement = Refinement.NWT_IT_WP), + checker, inProcess) + + val timeouts = setOf( + Edge(config_1_1, config_2_1, timeoutTrigger), + Edge(config_2_1, config_3_1, timeoutTrigger), + + Edge(config_1_2, config_2_2, timeoutTrigger), + Edge(config_2_2, config_3_1, timeoutTrigger), + + Edge(config_1_3, config_2_3, timeoutTrigger), + Edge(config_2_3, config_3_1, timeoutTrigger), + + Edge(config_1_4, config_2_4, timeoutTrigger), + Edge(config_2_4, config_3_1, timeoutTrigger), + + Edge(config_1_5, config_2_5, + if (inProcess) timeoutOrSolverError else ExceptionTrigger(label = "Anything")), + Edge(config_2_5, config_3_1, + if (inProcess) timeoutOrSolverError else ExceptionTrigger(label = "Anything")), + ) + + val notTimeout = if (inProcess) ExceptionTrigger(ErrorCodeException(ExitCodes.SOLVER_ERROR.code), + label = "SolverError") else ExceptionTrigger(fallthroughExceptions = timeoutTrigger.exceptions, + label = "AnythingButTimeout") + + val solverExceptions = setOf( + Edge(config_1_1, config_1_2, notTimeout), + Edge(config_1_2, config_1_3, notTimeout), + Edge(config_1_3, config_1_4, notTimeout), + Edge(config_1_4, config_1_5, notTimeout), + + Edge(config_2_1, config_2_2, notTimeout), + Edge(config_2_2, config_2_3, notTimeout), + Edge(config_2_3, config_2_4, notTimeout), + Edge(config_2_4, config_2_5, notTimeout), + + Edge(config_3_1, config_3_2, notTimeout), + Edge(config_3_2, config_3_3, notTimeout), + Edge(config_3_3, config_3_4, notTimeout), + Edge(config_3_4, config_3_5, notTimeout), + ) + return STM(config_1_1, timeouts union solverExceptions) + } + + val inProcess = HierarchicalNode("InProcess", + getStm(!debug)) // if not debug, then in process, else not in process + val notInProcess = HierarchicalNode("NotInprocess", getStm(false)) + + val fallbackEdge = Edge(inProcess, notInProcess, ExceptionTrigger(label = "Anything")) + + return STM(inProcess, setOf(fallbackEdge)) + } + + return if (traitsTyped.arithmeticTraits.contains(ArithmeticTrait.FLOAT)) floatsStm() + else if (traitsTyped.arithmeticTraits.contains(ArithmeticTrait.BITWISE)) bitwiseStm() + else integerStm() +} diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/complex24.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/complex24.kt new file mode 100644 index 0000000000..bdaba9c0b3 --- /dev/null +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/complex24.kt @@ -0,0 +1,447 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.xcfa.cli.portfolio + +import hu.bme.mit.theta.analysis.expr.refinement.PruneStrategy +import hu.bme.mit.theta.common.logging.Logger +import hu.bme.mit.theta.frontend.ParseContext +import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.ArithmeticTrait +import hu.bme.mit.theta.xcfa.analysis.ErrorDetection +import hu.bme.mit.theta.xcfa.cli.* +import hu.bme.mit.theta.xcfa.model.XCFA + +fun complexPortfolio24( + xcfaTyped: XCFA, + cFileNameTyped: String, + loggerTyped: Logger, + smtHomeTyped: String, + traitsTyped: VerificationTraits, + propertyTyped: ErrorDetection, + parseContextTyped: ParseContext, + debug: Boolean, + argdebug: Boolean): STM { + + val checker = { p: Boolean, config: XcfaCegarConfig -> + if (p) + config.checkInProcess(xcfaTyped, smtHomeTyped, true, cFileNameTyped, loggerTyped, parseContextTyped, + argdebug)() + else config.check(xcfaTyped, loggerTyped) + } + + var baseConfig = XcfaCegarConfig( + errorDetectionType = propertyTyped, + abstractionSolver = "Z3", + validateAbstractionSolver = false, + domain = Domain.EXPL, + maxEnum = 1, + search = Search.ERR, + initPrec = InitPrec.EMPTY, + porLevel = POR.NOPOR, + coi = ConeOfInfluenceMode.NO_COI, + refinementSolver = "Z3", + validateRefinementSolver = false, + refinement = Refinement.SEQ_ITP, + exprSplitter = ExprSplitterOptions.WHOLE, + pruneStrategy = PruneStrategy.FULL, + cexMonitor = CexMonitorOptions.CHECK, + timeoutMs = 0 + ) + + if (traitsTyped.multithreaded) { + baseConfig = baseConfig.copy(search = Search.DFS, porLevel = POR.AASPOR, pruneStrategy = PruneStrategy.LAZY, + coi = ConeOfInfluenceMode.COI) + + if (propertyTyped == ErrorDetection.DATA_RACE) { + baseConfig = baseConfig.copy(porLevel = POR.SPOR) + } + } + val timeoutTrigger = ExceptionTrigger( + ErrorCodeException(ExitCodes.TIMEOUT.code), + ErrorCodeException(ExitCodes.VERIFICATION_STUCK.code), + ErrorCodeException(ExitCodes.OUT_OF_MEMORY.code), + ErrorCodeException(ExitCodes.GENERIC_ERROR.code), + label = "TimeoutOrGenericError" + ) + + val timeoutOrSolverError = ExceptionTrigger( + ErrorCodeException(ExitCodes.SOLVER_ERROR.code), + ErrorCodeException(ExitCodes.TIMEOUT.code), + ErrorCodeException(ExitCodes.VERIFICATION_STUCK.code), + ErrorCodeException(ExitCodes.OUT_OF_MEMORY.code), + ErrorCodeException(ExitCodes.GENERIC_ERROR.code), + label = "TimeoutOrSolverError" + ) + + val solverError = ExceptionTrigger( + ErrorCodeException(ExitCodes.SOLVER_ERROR.code), + ErrorCodeException(ExitCodes.VERIFICATION_STUCK.code), + label = "SolverError" + ) + + val anyError = ExceptionTrigger(label = "Anything") + + fun getStm(trait: ArithmeticTrait, inProcess: Boolean): STM { + val edges = LinkedHashSet() + val config_BITWISE_EXPL_NWT_IT_WP_cvc5 = ConfigNode("BITWISE_EXPL_NWT_IT_WP_cvc5:1.0.8-$inProcess", + baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "cvc5:1.0.8", + refinementSolver = "cvc5:1.0.8", + refinement = Refinement.NWT_IT_WP, + timeoutMs = 100000 + ), checker, inProcess) + val config_BITWISE_EXPL_NWT_IT_WP_Z3 = ConfigNode("BITWISE_EXPL_NWT_IT_WP_Z3-$inProcess", baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "Z3", + refinementSolver = "Z3", + refinement = Refinement.NWT_IT_WP, + timeoutMs = 100000 + ), checker, inProcess) + edges.add(Edge(config_BITWISE_EXPL_NWT_IT_WP_cvc5, config_BITWISE_EXPL_NWT_IT_WP_Z3, solverError)) + val config_BITWISE_EXPL_NWT_IT_WP_mathsat = ConfigNode("BITWISE_EXPL_NWT_IT_WP_mathsat:5.6.10-$inProcess", + baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "mathsat:5.6.10", + refinementSolver = "mathsat:5.6.10", + refinement = Refinement.NWT_IT_WP, + timeoutMs = 100000 + ), checker, inProcess) + edges.add(Edge(config_BITWISE_EXPL_NWT_IT_WP_Z3, config_BITWISE_EXPL_NWT_IT_WP_mathsat, solverError)) + val config_BITWISE_PRED_CART_SEQ_ITP_mathsat = ConfigNode("BITWISE_PRED_CART_SEQ_ITP_mathsat:5.6.10-$inProcess", + baseConfig.copy( + domain = Domain.PRED_CART, + abstractionSolver = "mathsat:5.6.10", + refinementSolver = "mathsat:5.6.10", + refinement = Refinement.SEQ_ITP, + timeoutMs = 0 + ), checker, inProcess) + edges.add(Edge(config_BITWISE_EXPL_NWT_IT_WP_cvc5, config_BITWISE_PRED_CART_SEQ_ITP_mathsat, + if (inProcess) timeoutTrigger else anyError)) + edges.add(Edge(config_BITWISE_EXPL_NWT_IT_WP_Z3, config_BITWISE_PRED_CART_SEQ_ITP_mathsat, + if (inProcess) timeoutTrigger else anyError)) + edges.add(Edge(config_BITWISE_EXPL_NWT_IT_WP_mathsat, config_BITWISE_PRED_CART_SEQ_ITP_mathsat, + if (inProcess) timeoutOrSolverError else anyError)) + val config_BITWISE_PRED_CART_SEQ_ITP_cvc5 = ConfigNode("BITWISE_PRED_CART_SEQ_ITP_cvc5:1.0.8-$inProcess", + baseConfig.copy( + domain = Domain.PRED_CART, + abstractionSolver = "cvc5:1.0.8", + refinementSolver = "cvc5:1.0.8", + refinement = Refinement.SEQ_ITP, + timeoutMs = 0 + ), checker, inProcess) + edges.add(Edge(config_BITWISE_PRED_CART_SEQ_ITP_mathsat, config_BITWISE_PRED_CART_SEQ_ITP_cvc5, solverError)) + val config_BITWISE_EXPL_SEQ_ITP_mathsat = ConfigNode("BITWISE_EXPL_SEQ_ITP_mathsat:5.6.10-$inProcess", + baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "mathsat:5.6.10", + refinementSolver = "mathsat:5.6.10", + refinement = Refinement.SEQ_ITP, + timeoutMs = 0 + ), checker, inProcess) + edges.add(Edge(config_BITWISE_PRED_CART_SEQ_ITP_mathsat, config_BITWISE_EXPL_SEQ_ITP_mathsat, + if (inProcess) timeoutTrigger else anyError)) + edges.add(Edge(config_BITWISE_PRED_CART_SEQ_ITP_cvc5, config_BITWISE_EXPL_SEQ_ITP_mathsat, + if (inProcess) timeoutOrSolverError else anyError)) + val config_BITWISE_EXPL_SEQ_ITP_cvc5 = ConfigNode("BITWISE_EXPL_SEQ_ITP_cvc5:1.0.8-$inProcess", baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "cvc5:1.0.8", + refinementSolver = "cvc5:1.0.8", + refinement = Refinement.SEQ_ITP, + timeoutMs = 0 + ), checker, inProcess) + edges.add(Edge(config_BITWISE_EXPL_SEQ_ITP_mathsat, config_BITWISE_EXPL_SEQ_ITP_cvc5, solverError)) + val config_FLOAT_EXPL_NWT_IT_WP_cvc5 = ConfigNode("FLOAT_EXPL_NWT_IT_WP_cvc5:1.0.8-$inProcess", baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "cvc5:1.0.8", + refinementSolver = "cvc5:1.0.8", + refinement = Refinement.NWT_IT_WP, + timeoutMs = 200000 + ), checker, inProcess) + val config_FLOAT_EXPL_NWT_IT_WP_Z3 = ConfigNode("FLOAT_EXPL_NWT_IT_WP_Z3-$inProcess", baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "Z3", + refinementSolver = "Z3", + refinement = Refinement.NWT_IT_WP, + timeoutMs = 200000 + ), checker, inProcess) + edges.add(Edge(config_FLOAT_EXPL_NWT_IT_WP_cvc5, config_FLOAT_EXPL_NWT_IT_WP_Z3, solverError)) + val config_FLOAT_EXPL_NWT_IT_WP_mathsat = ConfigNode("FLOAT_EXPL_NWT_IT_WP_mathsat:5.6.10-$inProcess", + baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "mathsat:5.6.10", + refinementSolver = "mathsat:5.6.10", validateRefinementSolver = true, + refinement = Refinement.NWT_IT_WP, + timeoutMs = 200000 + ), checker, inProcess) + edges.add(Edge(config_FLOAT_EXPL_NWT_IT_WP_Z3, config_FLOAT_EXPL_NWT_IT_WP_mathsat, solverError)) + val config_FLOAT_PRED_CART_SEQ_ITP_mathsat = ConfigNode("FLOAT_PRED_CART_SEQ_ITP_mathsat:5.6.10-$inProcess", + baseConfig.copy( + domain = Domain.PRED_CART, + abstractionSolver = "mathsat:5.6.10", + refinementSolver = "mathsat:5.6.10", validateRefinementSolver = true, + refinement = Refinement.SEQ_ITP, + timeoutMs = 0 + ), checker, inProcess) + edges.add(Edge(config_FLOAT_EXPL_NWT_IT_WP_cvc5, config_FLOAT_PRED_CART_SEQ_ITP_mathsat, + if (inProcess) timeoutTrigger else anyError)) + edges.add(Edge(config_FLOAT_EXPL_NWT_IT_WP_Z3, config_FLOAT_PRED_CART_SEQ_ITP_mathsat, + if (inProcess) timeoutTrigger else anyError)) + edges.add(Edge(config_FLOAT_EXPL_NWT_IT_WP_mathsat, config_FLOAT_PRED_CART_SEQ_ITP_mathsat, + if (inProcess) timeoutOrSolverError else anyError)) + val config_FLOAT_PRED_CART_SEQ_ITP_cvc5 = ConfigNode("FLOAT_PRED_CART_SEQ_ITP_cvc5:1.0.8-$inProcess", + baseConfig.copy( + domain = Domain.PRED_CART, + abstractionSolver = "cvc5:1.0.8", + refinementSolver = "cvc5:1.0.8", + refinement = Refinement.SEQ_ITP, + timeoutMs = 0 + ), checker, inProcess) + edges.add(Edge(config_FLOAT_PRED_CART_SEQ_ITP_mathsat, config_FLOAT_PRED_CART_SEQ_ITP_cvc5, solverError)) + val config_FLOAT_EXPL_SEQ_ITP_mathsat = ConfigNode("FLOAT_EXPL_SEQ_ITP_mathsat:5.6.10-$inProcess", + baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "mathsat:5.6.10", + refinementSolver = "mathsat:5.6.10", validateRefinementSolver = true, + refinement = Refinement.SEQ_ITP, + timeoutMs = 0 + ), checker, inProcess) + edges.add(Edge(config_FLOAT_PRED_CART_SEQ_ITP_mathsat, config_FLOAT_EXPL_SEQ_ITP_mathsat, + if (inProcess) timeoutTrigger else anyError)) + edges.add(Edge(config_FLOAT_PRED_CART_SEQ_ITP_cvc5, config_FLOAT_EXPL_SEQ_ITP_mathsat, + if (inProcess) timeoutOrSolverError else anyError)) + val config_FLOAT_EXPL_SEQ_ITP_cvc5 = ConfigNode("FLOAT_EXPL_SEQ_ITP_cvc5:1.0.8-$inProcess", baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "cvc5:1.0.8", + refinementSolver = "cvc5:1.0.8", + refinement = Refinement.SEQ_ITP, + timeoutMs = 0 + ), checker, inProcess) + edges.add(Edge(config_FLOAT_EXPL_SEQ_ITP_mathsat, config_FLOAT_EXPL_SEQ_ITP_cvc5, solverError)) + val config_LIN_INT_EXPL_NWT_IT_WP_mathsat = ConfigNode("LIN_INT_EXPL_NWT_IT_WP_mathsat:5.6.10-$inProcess", + baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "mathsat:5.6.10", + refinementSolver = "mathsat:5.6.10", + refinement = Refinement.NWT_IT_WP, + timeoutMs = 100000 + ), checker, inProcess) + val config_LIN_INT_EXPL_NWT_IT_WP_Z3 = ConfigNode("LIN_INT_EXPL_NWT_IT_WP_Z3-$inProcess", baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "Z3", + refinementSolver = "Z3", + refinement = Refinement.NWT_IT_WP, + timeoutMs = 100000 + ), checker, inProcess) + edges.add(Edge(config_LIN_INT_EXPL_NWT_IT_WP_mathsat, config_LIN_INT_EXPL_NWT_IT_WP_Z3, solverError)) + val config_LIN_INT_EXPL_SEQ_ITP_Z3 = ConfigNode("LIN_INT_EXPL_SEQ_ITP_Z3-$inProcess", baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "Z3", + refinementSolver = "Z3", + refinement = Refinement.SEQ_ITP, + timeoutMs = 300000 + ), checker, inProcess) + edges.add(Edge(config_LIN_INT_EXPL_NWT_IT_WP_mathsat, config_LIN_INT_EXPL_SEQ_ITP_Z3, + if (inProcess) timeoutTrigger else anyError)) + edges.add(Edge(config_LIN_INT_EXPL_NWT_IT_WP_Z3, config_LIN_INT_EXPL_SEQ_ITP_Z3, + if (inProcess) timeoutOrSolverError else anyError)) + val config_LIN_INT_EXPL_SEQ_ITP_mathsat = ConfigNode("LIN_INT_EXPL_SEQ_ITP_mathsat:5.6.10-$inProcess", + baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "mathsat:5.6.10", + refinementSolver = "mathsat:5.6.10", + refinement = Refinement.SEQ_ITP, + timeoutMs = 300000 + ), checker, inProcess) + edges.add(Edge(config_LIN_INT_EXPL_SEQ_ITP_Z3, config_LIN_INT_EXPL_SEQ_ITP_mathsat, solverError)) + val config_LIN_INT_PRED_CART_SEQ_ITP_Z3 = ConfigNode("LIN_INT_PRED_CART_SEQ_ITP_Z3-$inProcess", baseConfig.copy( + domain = Domain.PRED_CART, + abstractionSolver = "Z3", + refinementSolver = "Z3", + refinement = Refinement.SEQ_ITP, + timeoutMs = 0 + ), checker, inProcess) + edges.add(Edge(config_LIN_INT_EXPL_SEQ_ITP_Z3, config_LIN_INT_PRED_CART_SEQ_ITP_Z3, + if (inProcess) timeoutTrigger else anyError)) + edges.add(Edge(config_LIN_INT_EXPL_SEQ_ITP_mathsat, config_LIN_INT_PRED_CART_SEQ_ITP_Z3, + if (inProcess) timeoutOrSolverError else anyError)) + val config_LIN_INT_PRED_CART_SEQ_ITP_mathsat = ConfigNode("LIN_INT_PRED_CART_SEQ_ITP_mathsat:5.6.10-$inProcess", + baseConfig.copy( + domain = Domain.PRED_CART, + abstractionSolver = "mathsat:5.6.10", + refinementSolver = "mathsat:5.6.10", + refinement = Refinement.SEQ_ITP, + timeoutMs = 0 + ), checker, inProcess) + edges.add(Edge(config_LIN_INT_PRED_CART_SEQ_ITP_Z3, config_LIN_INT_PRED_CART_SEQ_ITP_mathsat, solverError)) + val config_LIN_INT_PRED_CART_SEQ_ITP_z3 = ConfigNode("LIN_INT_PRED_CART_SEQ_ITP_z3:4.12.2-$inProcess", + baseConfig.copy( + domain = Domain.PRED_CART, + abstractionSolver = "z3:4.12.2", + refinementSolver = "z3:4.12.2", + refinement = Refinement.SEQ_ITP, + timeoutMs = 0 + ), checker, inProcess) + edges.add(Edge(config_LIN_INT_PRED_CART_SEQ_ITP_mathsat, config_LIN_INT_PRED_CART_SEQ_ITP_z3, solverError)) + val config_NONLIN_INT_EXPL_NWT_IT_WP_Z3 = ConfigNode("NONLIN_INT_EXPL_NWT_IT_WP_Z3-$inProcess", baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "Z3", + refinementSolver = "Z3", + refinement = Refinement.NWT_IT_WP, + timeoutMs = 100000 + ), checker, inProcess) + val config_NONLIN_INT_EXPL_NWT_IT_WP_mathsat = ConfigNode("NONLIN_INT_EXPL_NWT_IT_WP_mathsat:5.6.10-$inProcess", + baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "mathsat:5.6.10", + refinementSolver = "mathsat:5.6.10", + refinement = Refinement.NWT_IT_WP, + timeoutMs = 100000 + ), checker, inProcess) + edges.add(Edge(config_NONLIN_INT_EXPL_NWT_IT_WP_Z3, config_NONLIN_INT_EXPL_NWT_IT_WP_mathsat, solverError)) + val config_NONLIN_INT_EXPL_SEQ_ITP_Z3 = ConfigNode("NONLIN_INT_EXPL_SEQ_ITP_Z3-$inProcess", baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "Z3", + refinementSolver = "Z3", + refinement = Refinement.SEQ_ITP, + timeoutMs = 100000 + ), checker, inProcess) + edges.add(Edge(config_NONLIN_INT_EXPL_NWT_IT_WP_Z3, config_NONLIN_INT_EXPL_SEQ_ITP_Z3, + if (inProcess) timeoutTrigger else anyError)) + edges.add(Edge(config_NONLIN_INT_EXPL_NWT_IT_WP_mathsat, config_NONLIN_INT_EXPL_SEQ_ITP_Z3, + if (inProcess) timeoutOrSolverError else anyError)) + val config_NONLIN_INT_EXPL_SEQ_ITP_mathsat = ConfigNode("NONLIN_INT_EXPL_SEQ_ITP_mathsat:5.6.10-$inProcess", + baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "mathsat:5.6.10", + refinementSolver = "mathsat:5.6.10", + refinement = Refinement.SEQ_ITP, + timeoutMs = 200000 + ), checker, inProcess) + edges.add(Edge(config_NONLIN_INT_EXPL_SEQ_ITP_Z3, config_NONLIN_INT_EXPL_SEQ_ITP_mathsat, + if (inProcess) timeoutOrSolverError else anyError)) + val config_NONLIN_INT_PRED_CART_SEQ_ITP_mathsat = ConfigNode( + "NONLIN_INT_PRED_CART_SEQ_ITP_mathsat:5.6.10-$inProcess", baseConfig.copy( + domain = Domain.PRED_CART, + abstractionSolver = "mathsat:5.6.10", + refinementSolver = "mathsat:5.6.10", + refinement = Refinement.SEQ_ITP, + timeoutMs = 0 + ), checker, inProcess) + edges.add(Edge(config_NONLIN_INT_EXPL_SEQ_ITP_mathsat, config_NONLIN_INT_PRED_CART_SEQ_ITP_mathsat, + if (inProcess) timeoutOrSolverError else anyError)) + val config_NONLIN_INT_EXPL_NWT_IT_WP_cvc5 = ConfigNode("NONLIN_INT_EXPL_NWT_IT_WP_cvc5:1.0.8-$inProcess", + baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "cvc5:1.0.8", + refinementSolver = "cvc5:1.0.8", + refinement = Refinement.NWT_IT_WP, + timeoutMs = 0 + ), checker, inProcess) + edges.add(Edge(config_NONLIN_INT_PRED_CART_SEQ_ITP_mathsat, config_NONLIN_INT_EXPL_NWT_IT_WP_cvc5, + if (inProcess) timeoutOrSolverError else anyError)) + val config_ARR_EXPL_NWT_IT_WP_cvc5 = ConfigNode("ARR_EXPL_NWT_IT_WP_cvc5:1.0.8-$inProcess", baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "cvc5:1.0.8", + refinementSolver = "cvc5:1.0.8", + refinement = Refinement.NWT_IT_WP, + timeoutMs = 100000 + ), checker, inProcess) + val config_ARR_EXPL_NWT_IT_WP_Z3 = ConfigNode("ARR_EXPL_NWT_IT_WP_Z3-$inProcess", baseConfig.copy( + domain = Domain.EXPL, + abstractionSolver = "Z3", + refinementSolver = "Z3", + refinement = Refinement.NWT_IT_WP, + timeoutMs = 100000 + ), checker, inProcess) + edges.add(Edge(config_ARR_EXPL_NWT_IT_WP_cvc5, config_ARR_EXPL_NWT_IT_WP_Z3, solverError)) + val config_ARR_PRED_CART_SEQ_ITP_Z3 = ConfigNode("ARR_PRED_CART_SEQ_ITP_Z3-$inProcess", baseConfig.copy( + domain = Domain.PRED_CART, + abstractionSolver = "Z3", + refinementSolver = "Z3", + refinement = Refinement.SEQ_ITP, + timeoutMs = 300000 + ), checker, inProcess) + edges.add(Edge(config_ARR_EXPL_NWT_IT_WP_cvc5, config_ARR_PRED_CART_SEQ_ITP_Z3, + if (inProcess) timeoutTrigger else anyError)) + edges.add(Edge(config_ARR_EXPL_NWT_IT_WP_Z3, config_ARR_PRED_CART_SEQ_ITP_Z3, + if (inProcess) timeoutOrSolverError else anyError)) + val config_ARR_PRED_CART_SEQ_ITP_z3 = ConfigNode("ARR_PRED_CART_SEQ_ITP_z3:4.12.2-$inProcess", baseConfig.copy( + domain = Domain.PRED_CART, + abstractionSolver = "z3:4.12.2", + refinementSolver = "z3:4.12.2", + refinement = Refinement.SEQ_ITP, + timeoutMs = 300000 + ), checker, inProcess) + edges.add(Edge(config_ARR_PRED_CART_SEQ_ITP_Z3, config_ARR_PRED_CART_SEQ_ITP_z3, solverError)) + val config_ARR_PRED_CART_SEQ_ITP_princess = ConfigNode("ARR_PRED_CART_SEQ_ITP_princess:2023-06-19-$inProcess", + baseConfig.copy( + domain = Domain.PRED_CART, + abstractionSolver = "princess:2023-06-19", + refinementSolver = "princess:2023-06-19", + refinement = Refinement.SEQ_ITP, + timeoutMs = 500000 + ), checker, inProcess) + edges.add(Edge(config_ARR_PRED_CART_SEQ_ITP_Z3, config_ARR_PRED_CART_SEQ_ITP_princess, + if (inProcess) timeoutTrigger else anyError)) + edges.add(Edge(config_ARR_PRED_CART_SEQ_ITP_z3, config_ARR_PRED_CART_SEQ_ITP_princess, + if (inProcess) timeoutOrSolverError else anyError)) + val config_ARR_PRED_CART_SEQ_ITP_cvc5 = ConfigNode("ARR_PRED_CART_SEQ_ITP_cvc5:1.0.8-$inProcess", + baseConfig.copy( + domain = Domain.PRED_CART, + abstractionSolver = "cvc5:1.0.8", + refinementSolver = "cvc5:1.0.8", + refinement = Refinement.SEQ_ITP, + timeoutMs = 500000 + ), checker, inProcess) + edges.add(Edge(config_ARR_PRED_CART_SEQ_ITP_princess, config_ARR_PRED_CART_SEQ_ITP_cvc5, solverError)) + if (trait == ArithmeticTrait.BITWISE) { + return STM(config_BITWISE_EXPL_NWT_IT_WP_cvc5, edges) + } + + if (trait == ArithmeticTrait.FLOAT) { + return STM(config_FLOAT_EXPL_NWT_IT_WP_cvc5, edges) + } + + if (trait == ArithmeticTrait.LIN_INT) { + return STM(config_LIN_INT_EXPL_NWT_IT_WP_mathsat, edges) + } + + if (trait == ArithmeticTrait.NONLIN_INT) { + return STM(config_NONLIN_INT_EXPL_NWT_IT_WP_Z3, edges) + } + + if (trait == ArithmeticTrait.ARR) { + return STM(config_ARR_EXPL_NWT_IT_WP_cvc5, edges) + } + + error("Unknown trait!") + } + + val mainTrait = + if (ArithmeticTrait.FLOAT in traitsTyped.arithmeticTraits) ArithmeticTrait.FLOAT + else if (ArithmeticTrait.ARR in traitsTyped.arithmeticTraits) ArithmeticTrait.ARR + else if (ArithmeticTrait.BITWISE in traitsTyped.arithmeticTraits) ArithmeticTrait.BITWISE + else if (ArithmeticTrait.NONLIN_INT in traitsTyped.arithmeticTraits) ArithmeticTrait.NONLIN_INT + else ArithmeticTrait.LIN_INT + + val inProcess = HierarchicalNode("InProcess", getStm(mainTrait, true)) + val notInProcess = HierarchicalNode("NotInprocess", getStm(mainTrait, false)) + + val fallbackEdge = Edge(inProcess, notInProcess, ExceptionTrigger(label = "Anything")) + + return if (debug) getStm(mainTrait, false) else STM(inProcess, setOf(fallbackEdge)) +} \ No newline at end of file diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/stm.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/stm.kt index 345d50d24f..ab544f379f 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/stm.kt +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/stm.kt @@ -46,7 +46,7 @@ class ConfigNode(name: String, private val config: XcfaCegarConfig, } override fun visualize(): String = config.visualize(inProcess).lines() - .map { "state $name: $it" }.reduce { a, b -> "$a\n$b" } + .map { "state ${name.replace(Regex("[:\\.-]+"), "_")}: $it" }.reduce { a, b -> "$a\n$b" } } data class Edge(val source: Node, @@ -58,7 +58,9 @@ data class Edge(val source: Node, source.outEdges.add(this) } - fun visualize(): String = """${source.name} --> ${target.name} : $trigger """ + fun visualize(): String = """${source.name.replace(Regex("[:\\.-]+"), "_")} --> ${ + target.name.replace(Regex("[:\\.-]+"), "_") + } : $trigger """ } @@ -99,7 +101,7 @@ data class STM(val initNode: Node, val edges: Set) { fun visualize(): String = """ ${visualizeNodes()} -[*] --> ${initNode.name} +[*] --> ${initNode.name.replace(Regex("[:\\.-]+"), "_")} ${edges.map { it.visualize() }.reduce { a, b -> "$a\n$b" }} """.trimMargin() diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/utils/BMCValToTrace.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/utils/BMCValToTrace.kt new file mode 100644 index 0000000000..80225eabdf --- /dev/null +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/utils/BMCValToTrace.kt @@ -0,0 +1,70 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.xcfa.cli.utils + +import hu.bme.mit.theta.analysis.expl.ExplState +import hu.bme.mit.theta.core.decl.Decls.Var +import hu.bme.mit.theta.core.model.ImmutableValuation +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.inttype.IntLitExpr +import hu.bme.mit.theta.xcfa.analysis.XcfaAction +import hu.bme.mit.theta.xcfa.analysis.XcfaProcessState +import hu.bme.mit.theta.xcfa.analysis.XcfaState +import hu.bme.mit.theta.xcfa.model.XCFA +import hu.bme.mit.theta.xcfa.model.XcfaLocation +import java.util.* + +fun valToAction(xcfa: XCFA, val1: Valuation, val2: Valuation): XcfaAction { + val val1Map = val1.toMap() + val val2Map = val2.toMap() + var i = 0 + val map: MutableMap = HashMap() + for (x in xcfa.procedures.first { it.name == "main" }.locs) { + map[x] = i++ + } + return XcfaAction( + pid = 0, + edge = xcfa.procedures.first { it.name == "main" }.edges.first { edge -> + map[edge.source] == (val1Map[val1Map.keys.first { it.name == "__loc_" }] as IntLitExpr).value.toInt() && + map[edge.target] == (val2Map[val2Map.keys.first { it.name == "__loc_" }] as IntLitExpr).value.toInt() + }) +} + +fun valToState(xcfa: XCFA, val1: Valuation): XcfaState { + val valMap = val1.toMap() + var i = 0 + val map: MutableMap = HashMap() + for (x in xcfa.procedures.first { it.name == "main" }.locs) { + map[i++] = x + } + return XcfaState( + xcfa = xcfa, + processes = mapOf(Pair(0, XcfaProcessState( + locs = LinkedList( + listOf(map[(valMap[valMap.keys.first { it.name == "__loc_" }] as IntLitExpr).value.toInt()])), + varLookup = LinkedList(), + ))), + ExplState.of( + ImmutableValuation.from( + val1.toMap() + .filter { it.key.name != "__loc_" && !it.key.name.startsWith("__temp_") } + .map { Pair(Var("_" + "_" + it.key.name, it.key.type), it.value) }.toMap())), + mutexes = emptyMap(), + threadLookup = emptyMap(), + bottom = false + ) +} \ No newline at end of file diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/utils/XcfaWitnessWriter.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/utils/XcfaWitnessWriter.kt index 14dff34e99..748f86a0fa 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/utils/XcfaWitnessWriter.kt +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/utils/XcfaWitnessWriter.kt @@ -29,8 +29,6 @@ import java.io.BufferedWriter import java.io.File import java.io.FileWriter import java.io.IOException -import java.nio.file.FileSystems -import java.nio.file.Path import java.text.DateFormat import java.text.SimpleDateFormat import java.util.* @@ -41,11 +39,10 @@ class XcfaWitnessWriter { safetyResult: SafetyResult<*, *>, inputFile: File, cexSolverFactory: SolverFactory, - parseContext: ParseContext + parseContext: ParseContext, + witnessfile: File, ) { if (safetyResult.isUnsafe) { - val workdir: Path = FileSystems.getDefault().getPath("").toAbsolutePath() - val witnessfile = File(workdir.toString() + File.separator + "witness.graphml") val concrTrace: Trace, XcfaAction> = XcfaTraceConcretizer.concretize( safetyResult.asUnsafe().trace as Trace, XcfaAction>?, cexSolverFactory) @@ -54,9 +51,6 @@ class XcfaWitnessWriter { val xml = witness.toPrettyXml() witnessfile.writeText(xml) } else if (safetyResult.isSafe) { - val workdir = FileSystems.getDefault().getPath("").toAbsolutePath() - val witnessfile = File(workdir.toString() + File.separator + "witness.graphml") - val taskHash = WitnessWriter.createTaskHash(inputFile.absolutePath) val dummyWitness = StringBuilder() dummyWitness.append( diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/witnesses/TraceToWitness.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/witnesses/TraceToWitness.kt index 4cf9867c72..a724a1038f 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/witnesses/TraceToWitness.kt +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/witnesses/TraceToWitness.kt @@ -126,7 +126,8 @@ private fun labelToEdge(lastNode: WitnessNode, node: WitnessNode, xcfaLabel: Xcf val varDecl = (xcfaLabel.stmt as HavocStmt<*>).varDecl val eval = valuation.eval(varDecl) val splitName = varDecl.name.split("::") - val rootName = splitName.subList(2, splitName.size).joinToString("::") + val rootName = if (splitName[0].matches(Regex("T[0-9]*"))) splitName.subList(2, splitName.size) + .joinToString("::") else varDecl.name if (parseContext.metadata.getMetadataValue(rootName, "cName").isPresent && eval.isPresent) "${parseContext.metadata.getMetadataValue(rootName, "cName").get()} == ${ printLit(eval.get()) @@ -140,8 +141,8 @@ private fun labelToEdge(lastNode: WitnessNode, node: WitnessNode, xcfaLabel: Xcf startline = xcfaLabel.getCMetaData()?.lineNumberStart, endline = xcfaLabel.getCMetaData()?.lineNumberStop, - startoffset = xcfaLabel.getCMetaData()?.lineNumberStart, - endoffset = xcfaLabel.getCMetaData()?.lineNumberStart, + startoffset = xcfaLabel.getCMetaData()?.offsetStart, + endoffset = xcfaLabel.getCMetaData()?.offsetEnd, threadId = if (pid != null) "$pid" else null, diff --git a/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliParseTest.kt b/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliParseTest.kt index 741b263fe6..8a242e0033 100644 --- a/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliParseTest.kt +++ b/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliParseTest.kt @@ -20,7 +20,6 @@ import hu.bme.mit.theta.xcfa.cli.XcfaCli.Companion.main import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource -import java.util.* import java.util.stream.Stream import kotlin.io.path.createTempDirectory @@ -58,6 +57,23 @@ class XcfaCliParseTest { ) } + @JvmStatic + fun simpleCFiles(): Stream { + return Stream.of( + Arguments.of("/c/litmustest/singlethread/00assignment.c"), + Arguments.of("/c/litmustest/singlethread/01cast.c"), + Arguments.of("/c/litmustest/singlethread/02types.c"), + Arguments.of("/c/litmustest/singlethread/03bitwise.c"), + Arguments.of("/c/litmustest/singlethread/14ushort.c"), + Arguments.of("/c/litmustest/singlethread/15addition.c"), + Arguments.of("/c/litmustest/singlethread/16loop.c"), + Arguments.of("/c/litmustest/singlethread/17recursive.c"), + Arguments.of("/c/litmustest/singlethread/21namecollision.c"), + Arguments.of("/c/litmustest/singlethread/22nondet.c"), + Arguments.of("/c/litmustest/singlethread/23overflow.c"), + ) + } + @JvmStatic fun llvmFiles(): Stream { return Stream.of( @@ -95,19 +111,16 @@ class XcfaCliParseTest { Arguments.of("/chc/chc-LIA-Arrays_000.smt2", ChcFrontend.ChcTransformation.PORTFOLIO), Arguments.of("/chc/chc-LIA-Lin-Arrays_000.smt2", ChcFrontend.ChcTransformation.PORTFOLIO), Arguments.of("/chc/chc-LIA-Lin_000.smt2", ChcFrontend.ChcTransformation.PORTFOLIO), - Arguments.of("/chc/chc-LIA-nonlin-Arrays-nonrecADT_000.smt2", ChcFrontend.ChcTransformation.PORTFOLIO), Arguments.of("/chc/chc-LIA_000.smt2", ChcFrontend.ChcTransformation.PORTFOLIO), // Arguments.of("/chc/chc-LIA-Arrays_000.smt2", ChcFrontend.ChcTransformation.FORWARD), // nonlin Arguments.of("/chc/chc-LIA-Lin-Arrays_000.smt2", ChcFrontend.ChcTransformation.FORWARD), Arguments.of("/chc/chc-LIA-Lin_000.smt2", ChcFrontend.ChcTransformation.FORWARD), - Arguments.of("/chc/chc-LIA-nonlin-Arrays-nonrecADT_000.smt2", ChcFrontend.ChcTransformation.FORWARD), // Arguments.of("/chc/chc-LIA_000.smt2", ChcFrontend.ChcTransformation.FORWARD), // nonlin Arguments.of("/chc/chc-LIA-Arrays_000.smt2", ChcFrontend.ChcTransformation.BACKWARD), Arguments.of("/chc/chc-LIA-Lin-Arrays_000.smt2", ChcFrontend.ChcTransformation.BACKWARD), Arguments.of("/chc/chc-LIA-Lin_000.smt2", ChcFrontend.ChcTransformation.BACKWARD), - Arguments.of("/chc/chc-LIA-nonlin-Arrays-nonrecADT_000.smt2", ChcFrontend.ChcTransformation.BACKWARD), Arguments.of("/chc/chc-LIA_000.smt2", ChcFrontend.ChcTransformation.BACKWARD), ) } @@ -157,7 +170,8 @@ class XcfaCliParseTest { main(arrayOf( "--input-type", "C", "--input", javaClass.getResource(filePath)!!.path, - "--parse-only", "--stacktrace" + "--parse-only", "--stacktrace", + "--debug" )) } @@ -182,6 +196,7 @@ class XcfaCliParseTest { "--input", javaClass.getResource(filePath)!!.path, "--parse-only", "--stacktrace", + "--debug" )) } @@ -193,6 +208,7 @@ class XcfaCliParseTest { "--input", javaClass.getResource(filePath)!!.path, "--parse-only", "--stacktrace", + "--debug" )) } @@ -204,6 +220,7 @@ class XcfaCliParseTest { "--input", javaClass.getResource(filePath)!!.path, "--parse-only", "--stacktrace", + "--debug" )) } @@ -218,6 +235,7 @@ class XcfaCliParseTest { "--stacktrace", "--output-results", "--output-directory", temp.toAbsolutePath().toString(), + "--debug" )) val xcfaJson = temp.resolve("xcfa.json").toFile() main(arrayOf( @@ -225,6 +243,31 @@ class XcfaCliParseTest { "--input", xcfaJson.absolutePath.toString(), "--parse-only", "--stacktrace", + "--debug" + )) + temp.toFile().deleteRecursively() + } + + @ParameterizedTest + @MethodSource("simpleCFiles") + fun testCParseRoundTrip(filePath: String) { + val temp = createTempDirectory() + main(arrayOf( + "--input-type", "C", + "--input", javaClass.getResource(filePath)!!.path, + "--parse-only", + "--stacktrace", + "--output-results", + "--output-directory", temp.toAbsolutePath().toString(), + "--debug" + )) + val xcfaC = temp.resolve("xcfa.c").toFile() + main(arrayOf( + "--input-type", "C", + "--input", xcfaC.absolutePath.toString(), + "--parse-only", + "--stacktrace", + "--debug" )) temp.toFile().deleteRecursively() } diff --git a/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliPortfolioTest.kt b/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliPortfolioTest.kt new file mode 100644 index 0000000000..9b71f25e64 --- /dev/null +++ b/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliPortfolioTest.kt @@ -0,0 +1,90 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.xcfa.cli + +import hu.bme.mit.theta.common.logging.Logger +import hu.bme.mit.theta.common.logging.NullLogger +import hu.bme.mit.theta.frontend.ParseContext +import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.ArithmeticTrait +import hu.bme.mit.theta.xcfa.analysis.ErrorDetection +import hu.bme.mit.theta.xcfa.cli.portfolio.STM +import hu.bme.mit.theta.xcfa.cli.portfolio.complexPortfolio23 +import hu.bme.mit.theta.xcfa.cli.portfolio.complexPortfolio24 +import hu.bme.mit.theta.xcfa.model.XCFA +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments +import org.junit.jupiter.params.provider.MethodSource +import java.util.stream.Stream + +class XcfaCliPortfolioTest { + companion object { + + + @JvmStatic + fun portfolios(): Stream { + return Stream.of( + Arguments.of({ xcfaTyped: XCFA, + cFileNameTyped: String, + loggerTyped: Logger, + smtHomeTyped: String, + traitsTyped: VerificationTraits, + propertyTyped: ErrorDetection, + parseContextTyped: ParseContext, + argdebug: Boolean -> + complexPortfolio23(xcfaTyped, cFileNameTyped, loggerTyped, smtHomeTyped, traitsTyped, propertyTyped, + parseContextTyped, true, argdebug) + }), + Arguments.of({ xcfaTyped: XCFA, + cFileNameTyped: String, + loggerTyped: Logger, + smtHomeTyped: String, + traitsTyped: VerificationTraits, + propertyTyped: ErrorDetection, + parseContextTyped: ParseContext, + argdebug: Boolean -> + complexPortfolio24(xcfaTyped, cFileNameTyped, loggerTyped, smtHomeTyped, traitsTyped, propertyTyped, + parseContextTyped, true, argdebug) + }), + ) + } + + } + + @ParameterizedTest + @MethodSource("portfolios") + fun testPortfolio(portfolio: (xcfaTyped: XCFA, + cFileNameTyped: String, + loggerTyped: Logger, + smtHomeTyped: String, + traitsTyped: VerificationTraits, + propertyTyped: ErrorDetection, + parseContextTyped: ParseContext, + argdebug: Boolean) -> STM) { + + for (value in ArithmeticTrait.values()) { + + val stm = portfolio(XCFA("name", setOf()), "", NullLogger.getInstance(), "", + VerificationTraits(arithmeticTraits = setOf(value)), + ErrorDetection.ERROR_LOCATION, ParseContext(), false) + + Assertions.assertTrue(stm.visualize().isNotEmpty()) + } + + } + + +} diff --git a/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliVerifyTest.kt b/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliVerifyTest.kt index 41d8730e48..be73d386bc 100644 --- a/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliVerifyTest.kt +++ b/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliVerifyTest.kt @@ -18,10 +18,10 @@ package hu.bme.mit.theta.xcfa.cli import hu.bme.mit.theta.frontend.chc.ChcFrontend import hu.bme.mit.theta.xcfa.cli.XcfaCli.Companion.main import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource -import java.util.* import java.util.stream.Stream import kotlin.io.path.absolutePathString import kotlin.io.path.createTempDirectory @@ -40,14 +40,9 @@ class XcfaCliVerifyTest { Arguments.of("/c/litmustest/singlethread/02types.c", null), Arguments.of("/c/litmustest/singlethread/03bitwise.c", null), Arguments.of("/c/litmustest/singlethread/04real.c", null), -// Arguments.of("/c/litmustest/singlethread/05math.c", null), // too resource-intensive Arguments.of("/c/litmustest/singlethread/06arrays.c", null), Arguments.of("/c/litmustest/singlethread/07arrayinit.c", null), Arguments.of("/c/litmustest/singlethread/08vararray.c", null), -// Arguments.of("/c/litmustest/singlethread/09struct.c", null), -// Arguments.of("/c/litmustest/singlethread/10ptr.c", null), -// Arguments.of("/c/litmustest/singlethread/11ptrs.c", null), -// Arguments.of("/c/litmustest/singlethread/12ptrtypes.c", null), Arguments.of("/c/litmustest/singlethread/13typedef.c", "--domain PRED_CART"), Arguments.of("/c/litmustest/singlethread/14ushort.c", null), Arguments.of("/c/litmustest/singlethread/15addition.c", null), @@ -62,6 +57,25 @@ class XcfaCliVerifyTest { ) } + @JvmStatic + fun singleThreadedCFiles(): Stream { + return Stream.of( + Arguments.of("/c/litmustest/singlethread/00assignment.c", null), + Arguments.of("/c/litmustest/singlethread/01cast.c", null), + Arguments.of("/c/litmustest/singlethread/02types.c", null), + Arguments.of("/c/litmustest/singlethread/03bitwise.c", null), + Arguments.of("/c/litmustest/singlethread/04real.c", null), + Arguments.of("/c/litmustest/singlethread/06arrays.c", null), + Arguments.of("/c/litmustest/singlethread/13typedef.c", "--domain PRED_CART"), + Arguments.of("/c/litmustest/singlethread/14ushort.c", null), + Arguments.of("/c/litmustest/singlethread/15addition.c", null), + Arguments.of("/c/litmustest/singlethread/20testinline.c", null), + Arguments.of("/c/litmustest/singlethread/21namecollision.c", null), + Arguments.of("/c/litmustest/singlethread/22nondet.c", null), + Arguments.of("/c/litmustest/singlethread/23overflow.c", "--domain PRED_CART"), + ) + } + @JvmStatic fun cFilesShort(): Stream { return Stream.of( @@ -79,7 +93,7 @@ class XcfaCliVerifyTest { return Stream.of( Arguments.of("/chc/chc-LIA-Lin_000.smt2", ChcFrontend.ChcTransformation.FORWARD, "--domain PRED_CART"), Arguments.of("/chc/chc-LIA-Arrays_000.smt2", ChcFrontend.ChcTransformation.BACKWARD, - "--domain PRED_CART"), + "--domain PRED_CART --search BFS"), ) } } @@ -92,6 +106,7 @@ class XcfaCliVerifyTest { "--input", javaClass.getResource(filePath)!!.path, "--stacktrace", *(extraArgs?.split(" ")?.toTypedArray() ?: emptyArray()), + "--debug" ) main(params) } @@ -105,6 +120,7 @@ class XcfaCliVerifyTest { "--input", javaClass.getResource(filePath)!!.path, "--stacktrace", *(extraArgs?.split(" ")?.toTypedArray() ?: emptyArray()), + "--debug" ) try { main(params) @@ -121,10 +137,29 @@ class XcfaCliVerifyTest { val params = arrayOf( "--input-type", "C", "--strategy", "PORTFOLIO", - "--debug", "--portfolio", javaClass.getResource("/simple.kts")!!.path, "--input", javaClass.getResource(filePath)!!.path, "--stacktrace", + "--debug", + ) + try { + main(params) + } catch (e: Throwable) { + if (!e.toString().contains("Done debugging")) { + throw e + } + } + } + + @Test + fun testCVerifyBuiltInPortfolio() { + val params = arrayOf( + "--input-type", "C", + "--strategy", "PORTFOLIO", + "--portfolio", "COMPLEX", + "--input", javaClass.getResource("/c/dekker.i")!!.path, + "--stacktrace", + "--debug", ) try { main(params) @@ -145,7 +180,8 @@ class XcfaCliVerifyTest { "--stacktrace", *(extraArgs?.split(" ")?.toTypedArray() ?: emptyArray()), "--output-results", - "--output-directory", temp.absolutePathString() + "--output-directory", temp.absolutePathString(), + "--debug" ) main(params) Assertions.assertTrue(temp.resolve("xcfa.json").exists()) @@ -162,7 +198,47 @@ class XcfaCliVerifyTest { "--input", javaClass.getResource(filePath)!!.path, "--stacktrace", *(extraArgs?.split(" ")?.toTypedArray() ?: emptyArray()), + "--debug" )) } + @ParameterizedTest + @MethodSource("singleThreadedCFiles") + fun testCVerifyKind(filePath: String, extraArgs: String?) { + val params = arrayOf( + "--backend", "KIND", + "--input-type", "C", + "--input", javaClass.getResource(filePath)!!.path, + "--stacktrace", + "--debug" + ) + main(params) + } + + @ParameterizedTest + @MethodSource("singleThreadedCFiles") + fun testCVerifyIMC(filePath: String, extraArgs: String?) { + val params = arrayOf( + "--backend", "IMC", + "--input-type", "C", + "--input", javaClass.getResource(filePath)!!.path, + "--stacktrace", + "--debug" + ) + main(params) + } + + @ParameterizedTest + @MethodSource("singleThreadedCFiles") + fun testCVerifyIMCThenKind(filePath: String, extraArgs: String?) { + val params = arrayOf( + "--backend", "IMC_THEN_KIND", + "--input-type", "C", + "--input", javaClass.getResource(filePath)!!.path, + "--stacktrace", + "--debug" + ) + main(params) + } + } diff --git a/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliWitnessTest.kt b/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliWitnessTest.kt new file mode 100644 index 0000000000..e343b70f21 --- /dev/null +++ b/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaCliWitnessTest.kt @@ -0,0 +1,139 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.xcfa.cli + +import hu.bme.mit.theta.xcfa.cli.XcfaCli.Companion.main +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments +import org.junit.jupiter.params.provider.MethodSource +import java.util.stream.Stream +import kotlin.io.path.absolutePathString +import kotlin.io.path.createTempDirectory +import kotlin.io.path.exists + +data class WitnessEdge( + val startlineRange: Pair?, + val endlineRange: Pair?, + val startoffsetRange: Pair?, + val endoffsetRange: Pair?, + val assumption: Regex?, +) + +class XcfaCliWitnessTest { + companion object { + + @JvmStatic + fun cFiles(): Stream { + return Stream.of( + Arguments.of("/c/litmustest/singlethread/witness_test.c", null, listOf( + WitnessEdge( + startlineRange = Pair(5, 5), + endlineRange = Pair(5, 5), + startoffsetRange = Pair(79, 95), + endoffsetRange = Pair(110, 125), + assumption = Regex("i *== *-1"), + ), + )), + Arguments.of("/c/litmustest/singlethread/witness_test.c", "--backend KIND", listOf( + WitnessEdge( + startlineRange = Pair(5, 5), + endlineRange = Pair(5, 5), + startoffsetRange = Pair(79, 95), + endoffsetRange = Pair(110, 125), + assumption = Regex("i *== *-1"), + ), + )), + Arguments.of("/c/litmustest/singlethread/witness_test.c", "--backend IMC", listOf( + WitnessEdge( + startlineRange = Pair(5, 5), + endlineRange = Pair(5, 5), + startoffsetRange = Pair(79, 95), + endoffsetRange = Pair(110, 125), + assumption = Regex("i *== *-1"), + ), + )), + ) + } + + } + + @ParameterizedTest + @MethodSource("cFiles") + fun testCWitness(filePath: String, extraArgs: String?, expectedWitnessEdges: List) { + val temp = createTempDirectory() + val params = arrayOf( + "--input-type", "C", + "--input", javaClass.getResource(filePath)!!.path, + *(extraArgs?.split(" ")?.toTypedArray() ?: emptyArray()), + "--stacktrace", + "--output-results", + "--output-directory", temp.absolutePathString(), + "--debug", + ) + main(params) + Assertions.assertTrue(temp.resolve("witness.graphml").exists()) + val witnessContents = temp.resolve("witness.graphml").toFile().readText() + val edges = mutableListOf>() + val edgeMatcher = Regex("(?s)(.*)") + val data = mutableMapOf() + for (dataMatch in dataMatcher.findAll(match.value)) { + val (key, value) = dataMatch.destructured + data.put(key, value) + } + edges.add(data) + println("Found edge containing data: ${data.entries.map { "${it.key}: ${it.value}" }.joinToString(", ")}") + } + for (expectedWitnessEdge in expectedWitnessEdges) { + Assertions.assertFalse( + edges.none { edge -> + val startline = expectedWitnessEdge.startlineRange?.let { + edge["startline"]?.let { v -> + Pair(it, Integer.parseInt(v)) + } + }?.let { it.first.first <= it.second && it.second <= it.first.second } ?: false + val endline = expectedWitnessEdge.endlineRange?.let { + edge["endline"]?.let { v -> + Pair(it, Integer.parseInt(v)) + } + }?.let { it.first.first <= it.second && it.second <= it.first.second } ?: false + val startoffset = expectedWitnessEdge.startoffsetRange?.let { + edge["startoffset"]?.let { v -> + Pair(it, Integer.parseInt(v)) + } + }?.let { it.first.first <= it.second && it.second <= it.first.second } ?: false + val endoffset = expectedWitnessEdge.endoffsetRange?.let { + edge["endoffset"]?.let { v -> + Pair(it, Integer.parseInt(v)) + } + }?.let { it.first.first <= it.second && it.second <= it.first.second } ?: false + val assumption = expectedWitnessEdge.assumption?.let { + edge["assumption"]?.let { v -> + Pair(it, v) + } + }?.let { it.first.matches(it.second) } ?: false + startline && endline && startoffset && endoffset && assumption + }, + "Expected witness edge not found: $expectedWitnessEdge" + ) + } + temp.toFile().deleteRecursively() + } + + +} diff --git a/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaToCTest.kt b/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaToCTest.kt new file mode 100644 index 0000000000..c96d4960ba --- /dev/null +++ b/subprojects/xcfa/xcfa-cli/src/test/java/hu/bme/mit/theta/xcfa/cli/XcfaToCTest.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.xcfa.cli + +import hu.bme.mit.theta.common.logging.NullLogger +import hu.bme.mit.theta.frontend.ParseContext +import hu.bme.mit.theta.frontend.chc.ChcFrontend +import hu.bme.mit.theta.frontend.chc.ChcFrontend.ChcTransformation +import hu.bme.mit.theta.xcfa.passes.ChcPasses +import hu.bme.mit.theta.xcfa.toC +import org.antlr.v4.runtime.CharStreams +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments +import org.junit.jupiter.params.provider.MethodSource +import java.io.FileInputStream +import java.util.stream.Stream +import kotlin.io.path.createTempDirectory + +class XcfaToCTest { + companion object { + + @JvmStatic + fun chcFiles(): Stream { + return Stream.of( + Arguments.of("/chc/chc-LIA-Lin-Arrays_000.smt2", ChcFrontend.ChcTransformation.FORWARD), + Arguments.of("/chc/chc-LIA-Arrays_000.smt2", ChcFrontend.ChcTransformation.BACKWARD), + ) + } + + @JvmStatic + fun dslFiles(): Stream { + return Stream.of( + Arguments.of("/dsl/async.xcfa.kts"), + Arguments.of("/dsl/sync.xcfa.kts"), + ) + } + } + + @ParameterizedTest + @MethodSource("chcFiles") + fun testRoundTrip(filePath: String, chcTransformation: ChcTransformation) { + val chcFrontend = ChcFrontend(chcTransformation) + val xcfa = chcFrontend.buildXcfa( + CharStreams.fromStream(FileInputStream(javaClass.getResource(filePath)!!.path)), ChcPasses( + ParseContext(), NullLogger.getInstance())).build() + val temp = createTempDirectory() + val file = temp.resolve("${filePath.split("/").last()}.c").also { + it.toFile().writeText(xcfa.toC(ParseContext(), + true, false, false)) + } + System.err.println(file) + } + +} diff --git a/subprojects/xcfa/xcfa-cli/src/test/resources/c/litmustest/singlethread/witness_test.c b/subprojects/xcfa/xcfa-cli/src/test/resources/c/litmustest/singlethread/witness_test.c new file mode 100644 index 0000000000..83276a8106 --- /dev/null +++ b/subprojects/xcfa/xcfa-cli/src/test/resources/c/litmustest/singlethread/witness_test.c @@ -0,0 +1,9 @@ +extern void reach_error(); +extern int __VERIFIER_nondet_int(void); + +int main() { + int i = __VERIFIER_nondet_int(); + + if(i + 1 == 0) reach_error(); + +} \ No newline at end of file diff --git a/subprojects/xcfa/xcfa-cli/src/test/resources/chc/chc-LIA-nonlin-Arrays-nonrecADT_000.smt2 b/subprojects/xcfa/xcfa-cli/src/test/resources/chc/chc-LIA-nonlin-Arrays-nonrecADT_000.smt2 deleted file mode 100644 index ed5bfd9131..0000000000 --- a/subprojects/xcfa/xcfa-cli/src/test/resources/chc/chc-LIA-nonlin-Arrays-nonrecADT_000.smt2 +++ /dev/null @@ -1,5209 +0,0 @@ -; ./prepared/solidity/./unit_tests/operators/delete_multid_array.sol_16_000.smt2 -(set-logic HORN) - -(declare-datatypes ((abi_type 0)) (((abi_type )))) -(declare-datatypes ((uint_array_tuple 0)) (((uint_array_tuple (uint_array_tuple_accessor_array (Array Int Int)) (uint_array_tuple_accessor_length Int))))) -(declare-datatypes ((uint_array_tuple_array_tuple 0)) (((uint_array_tuple_array_tuple (uint_array_tuple_array_tuple_accessor_array (Array Int uint_array_tuple)) (uint_array_tuple_array_tuple_accessor_length Int))))) -(declare-datatypes ((bytes_tuple 0)) (((bytes_tuple (bytes_tuple_accessor_array (Array Int Int)) (bytes_tuple_accessor_length Int))))) -(declare-datatypes ((state_type 0)) (((state_type (balances (Array Int Int)))))) -(declare-datatypes ((tx_type 0)) (((tx_type (block.basefee Int) (block.chainid Int) (block.coinbase Int) (block.difficulty Int) (block.gaslimit Int) (block.number Int) (block.timestamp Int) (blockhash (Array Int Int)) (msg.data bytes_tuple) (msg.sender Int) (msg.sig Int) (msg.value Int) (tx.gasprice Int) (tx.origin Int))))) -(declare-datatypes ((ecrecover_input_type 0)) (((ecrecover_input_type (hash Int) (v Int) (r Int) (s Int))))) -(declare-datatypes ((crypto_type 0)) (((crypto_type (ecrecover (Array ecrecover_input_type Int)) (keccak256 (Array bytes_tuple Int)) (ripemd160 (Array bytes_tuple Int)) (sha256 (Array bytes_tuple Int)))))) - -(declare-fun |block_39_function_g__102_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_60_function_i__205_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |summary_11_function_h__150_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |contract_initializer_entry_88_C_335_0| ( Int Int abi_type crypto_type tx_type state_type state_type uint_array_tuple uint_array_tuple_array_tuple uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |summary_19_function_setB__334_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |summary_17_function_setA__300_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int ) Bool) -(declare-fun |block_70_function_j__279_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int ) Bool) -(declare-fun |block_31_return_function_f__58_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int ) Bool) -(declare-fun |block_42_function_g__102_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_41_function_g__102_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_56_function_i__205_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_65_return_function_j__279_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int ) Bool) -(declare-fun |block_74_function_j__279_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int ) Bool) -(declare-fun |summary_6_function_q__27_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple state_type uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |block_37_return_function_g__102_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_73_function_j__279_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int ) Bool) -(declare-fun |block_85_function_setB__334_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_34_function_f__58_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int ) Bool) -(declare-fun |summary_9_function_g__102_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_82_return_function_setB__334_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |summary_8_function_f__58_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int ) Bool) -(declare-fun |block_36_g_101_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |error_target_45_0| ( ) Bool) -(declare-fun |summary_15_function_j__279_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int ) Bool) -(declare-fun |block_24_function_p__16_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple state_type uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |block_44_h_149_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |summary_20_function_setB__334_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_75_function_setA__300_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int ) Bool) -(declare-fun |block_43_function_h__150_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |summary_14_function_i__205_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_86_function_setB__334_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |summary_constructor_2_C_335_0| ( Int Int abi_type crypto_type tx_type state_type state_type uint_array_tuple uint_array_tuple_array_tuple uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |block_38_function_g__102_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_48_function_h__150_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_77_return_function_setA__300_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int ) Bool) -(declare-fun |block_54_i_204_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_71_function_j__279_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int ) Bool) -(declare-fun |block_22_p_15_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple state_type uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |block_21_function_p__16_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple state_type uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |contract_initializer_after_init_89_C_335_0| ( Int Int abi_type crypto_type tx_type state_type state_type uint_array_tuple uint_array_tuple_array_tuple uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |block_79_function_setA__300_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int ) Bool) -(declare-fun |summary_7_function_f__58_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int ) Bool) -(declare-fun |block_49_function_h__150_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_27_return_function_q__27_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple state_type uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |block_58_function_i__205_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |summary_16_function_j__279_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int ) Bool) -(declare-fun |block_76_setA_299_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int ) Bool) -(declare-fun |block_46_function_h__150_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_51_function_h__150_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |summary_13_function_i__205_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |implicit_constructor_entry_90_C_335_0| ( Int Int abi_type crypto_type tx_type state_type state_type uint_array_tuple uint_array_tuple_array_tuple uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |block_28_function_q__27_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple state_type uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |interface_0_C_335_0| ( Int abi_type crypto_type state_type uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |block_72_function_j__279_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int ) Bool) -(declare-fun |block_29_function_f__58_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int ) Bool) -(declare-fun |block_23_return_function_p__16_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple state_type uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |block_80_function_setB__334_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_68_function_j__279_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int ) Bool) -(declare-fun |block_25_function_q__27_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple state_type uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |block_30_f_57_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int ) Bool) -(declare-fun |summary_3_function_p__16_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple state_type uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |block_40_function_g__102_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |summary_4_function_p__16_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple state_type uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |block_83_function_setB__334_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |contract_initializer_87_C_335_0| ( Int Int abi_type crypto_type tx_type state_type state_type uint_array_tuple uint_array_tuple_array_tuple uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |block_35_function_g__102_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |summary_12_function_h__150_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_69_function_j__279_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int ) Bool) -(declare-fun |summary_5_function_q__27_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple state_type uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |summary_10_function_g__102_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_57_function_i__205_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_63_function_j__279_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int ) Bool) -(declare-fun |block_53_function_i__205_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_66_function_j__279_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int ) Bool) -(declare-fun |block_47_function_h__150_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_50_function_h__150_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_33_function_f__58_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int ) Bool) -(declare-fun |summary_18_function_setA__300_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int ) Bool) -(declare-fun |block_52_function_h__150_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_67_function_j__279_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int ) Bool) -(declare-fun |block_59_function_i__205_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_61_function_i__205_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_26_q_26_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple state_type uint_array_tuple uint_array_tuple_array_tuple ) Bool) -(declare-fun |block_55_return_function_i__205_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_32_function_f__58_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int ) Bool) -(declare-fun |block_81_setB_333_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_78_function_setA__300_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int ) Bool) -(declare-fun |block_64_j_278_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int Int ) Bool) -(declare-fun |block_84_function_setB__334_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_62_function_i__205_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) -(declare-fun |block_45_return_function_h__150_335_0| ( Int Int abi_type crypto_type tx_type state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int state_type uint_array_tuple uint_array_tuple_array_tuple Int Int Int ) Bool) - -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) ) - (=> - (and - true - ) - (block_21_function_p__16_335_0 G J C F K H A D I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) ) - (=> - (and - (block_21_function_p__16_335_0 G J C F K H A D I B E) - (and (= B A) (= I H) (= G 0) (= E D)) - ) - (block_22_p_15_335_0 G J C F K H A D I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C uint_array_tuple) (D abi_type) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G crypto_type) (H Int) (I uint_array_tuple) (J uint_array_tuple) (K Int) (L state_type) (M state_type) (N Int) (O tx_type) ) - (=> - (and - (block_22_p_15_335_0 H N D G O L A E M B F) - (and (= I B) - (= C J) - (= (uint_array_tuple_accessor_length J) - (+ 1 (uint_array_tuple_accessor_length I))) - (= K 0) - (>= (uint_array_tuple_accessor_length I) 0) - (>= K 0) - (not (<= 115792089237316195423570985008687907853269984665640564039457584007913129639933 - (uint_array_tuple_accessor_length I))) - (<= K - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (= (uint_array_tuple_accessor_array J) - (store (uint_array_tuple_accessor_array I) - (uint_array_tuple_accessor_length I) - 0))) - ) - (block_23_return_function_p__16_335_0 H N D G O L A E M C F) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) ) - (=> - (and - (block_23_return_function_p__16_335_0 G J C F K H A D I B E) - true - ) - (summary_3_function_p__16_335_0 G J C F K H A D I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) ) - (=> - (and - true - ) - (block_24_function_p__16_335_0 G J C F K H A D I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C uint_array_tuple) (D abi_type) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L state_type) (M state_type) (N state_type) (O state_type) (P Int) (Q tx_type) ) - (=> - (and - (block_24_function_p__16_335_0 I P D H Q L A E M B F) - (summary_3_function_p__16_335_0 J P D H Q N B F O C G) - (let ((a!1 (store (balances M) P (+ (select (balances M) P) K))) - (a!2 (= (select (bytes_tuple_accessor_array (msg.data Q)) 3) 106)) - (a!3 (= (select (bytes_tuple_accessor_array (msg.data Q)) 2) 136)) - (a!4 (= (select (bytes_tuple_accessor_array (msg.data Q)) 1) 232)) - (a!5 (= (select (bytes_tuple_accessor_array (msg.data Q)) 0) 154)) - (a!6 (>= (+ (select (balances M) P) K) 0)) - (a!7 (<= (+ (select (balances M) P) K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935))) - (and (= B A) - (= N (state_type a!1)) - (= M L) - a!2 - a!3 - a!4 - a!5 - (= (msg.value Q) 0) - (= (msg.sig Q) 2598930538) - (= I 0) - (>= (tx.origin Q) 0) - (>= (tx.gasprice Q) 0) - (>= (msg.value Q) 0) - (>= (msg.sender Q) 0) - (>= (block.timestamp Q) 0) - (>= (block.number Q) 0) - (>= (block.gaslimit Q) 0) - (>= (block.difficulty Q) 0) - (>= (block.coinbase Q) 0) - (>= (block.chainid Q) 0) - (>= (block.basefee Q) 0) - (>= (bytes_tuple_accessor_length (msg.data Q)) 4) - a!6 - (>= K (msg.value Q)) - (<= (tx.origin Q) 1461501637330902918203684832716283019655932542975) - (<= (tx.gasprice Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.value Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.sender Q) 1461501637330902918203684832716283019655932542975) - (<= (block.timestamp Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.number Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.gaslimit Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.difficulty Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.coinbase Q) 1461501637330902918203684832716283019655932542975) - (<= (block.chainid Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.basefee Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - a!7 - (= F E))) - ) - (summary_4_function_p__16_335_0 J P D H Q L A E O C G) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) ) - (=> - (and - (summary_4_function_p__16_335_0 G J C F K H A D I B E) - (interface_0_C_335_0 J C F H A D) - (= G 0) - ) - (interface_0_C_335_0 J C F I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) ) - (=> - (and - (summary_6_function_q__27_335_0 G J C F K H A D I B E) - (interface_0_C_335_0 J C F H A D) - (= G 0) - ) - (interface_0_C_335_0 J C F I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) ) - (=> - (and - (summary_8_function_f__58_335_0 G J C F K H A D N L I B E O M) - (interface_0_C_335_0 J C F H A D) - (= G 0) - ) - (interface_0_C_335_0 J C F I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (summary_10_function_g__102_335_0 G J C F K H A D N P L I B E O Q M) - (interface_0_C_335_0 J C F H A D) - (= G 0) - ) - (interface_0_C_335_0 J C F I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (summary_12_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - (interface_0_C_335_0 J C F H A D) - (= G 0) - ) - (interface_0_C_335_0 J C F I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (summary_14_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - (interface_0_C_335_0 J C F H A D) - (= G 0) - ) - (interface_0_C_335_0 J C F I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R Int) (S Int) ) - (=> - (and - (summary_16_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - (interface_0_C_335_0 J C F H A D) - (= G 0) - ) - (interface_0_C_335_0 J C F I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) ) - (=> - (and - (summary_18_function_setA__300_335_0 G J C F K H A D L N I B E M O) - (interface_0_C_335_0 J C F H A D) - (= G 0) - ) - (interface_0_C_335_0 J C F I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (summary_20_function_setB__334_335_0 G J C F K H A D L N P I B E M O Q) - (interface_0_C_335_0 J C F H A D) - (= G 0) - ) - (interface_0_C_335_0 J C F I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) ) - (=> - (and - (summary_constructor_2_C_335_0 G J C F K H I A D B E) - (and (= G 0) - (>= (tx.origin K) 0) - (>= (tx.gasprice K) 0) - (>= (msg.value K) 0) - (>= (msg.sender K) 0) - (>= (block.timestamp K) 0) - (>= (block.number K) 0) - (>= (block.gaslimit K) 0) - (>= (block.difficulty K) 0) - (>= (block.coinbase K) 0) - (>= (block.chainid K) 0) - (>= (block.basefee K) 0) - (<= (tx.origin K) 1461501637330902918203684832716283019655932542975) - (<= (tx.gasprice K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.value K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.sender K) 1461501637330902918203684832716283019655932542975) - (<= (block.timestamp K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.number K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.gaslimit K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.difficulty K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.coinbase K) 1461501637330902918203684832716283019655932542975) - (<= (block.chainid K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.basefee K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (= (msg.value K) 0)) - ) - (interface_0_C_335_0 J C F I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) ) - (=> - (and - true - ) - (block_25_function_q__27_335_0 G J C F K H A D I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) ) - (=> - (and - (block_25_function_q__27_335_0 G J C F K H A D I B E) - (and (= B A) (= I H) (= G 0) (= E D)) - ) - (block_26_q_26_335_0 G J C F K H A D I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J uint_array_tuple_array_tuple) (K uint_array_tuple_array_tuple) (L uint_array_tuple_array_tuple) (M uint_array_tuple) (N uint_array_tuple) (O Int) (P state_type) (Q state_type) (R Int) (S tx_type) ) - (=> - (and - (block_26_q_26_335_0 I R C H S P A D Q B E) - (let ((a!1 (= (uint_array_tuple_array_tuple_accessor_array K) - (store (uint_array_tuple_array_tuple_accessor_array J) - (uint_array_tuple_array_tuple_accessor_length J) - (uint_array_tuple ((as const (Array Int Int)) 0) 0)))) - (a!2 (= (uint_array_tuple_array_tuple_accessor_array L) - (store (uint_array_tuple_array_tuple_accessor_array K) - (+ (- 1) (uint_array_tuple_array_tuple_accessor_length K)) - N)))) - (and a!1 - (= (uint_array_tuple_accessor_array N) - (store (uint_array_tuple_accessor_array M) - (uint_array_tuple_accessor_length M) - 0)) - (= F K) - (= G L) - (= J E) - (= M (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - (= (uint_array_tuple_array_tuple_accessor_length L) - (uint_array_tuple_array_tuple_accessor_length K)) - (= (uint_array_tuple_array_tuple_accessor_length K) - (+ 1 (uint_array_tuple_array_tuple_accessor_length J))) - (= (uint_array_tuple_accessor_length N) - (+ 1 (uint_array_tuple_accessor_length M))) - (= O 0) - (>= (uint_array_tuple_array_tuple_accessor_length J) 0) - (>= (uint_array_tuple_accessor_length M) 0) - (>= O 0) - (not (<= 115792089237316195423570985008687907853269984665640564039457584007913129639933 - (uint_array_tuple_array_tuple_accessor_length J))) - (not (<= 115792089237316195423570985008687907853269984665640564039457584007913129639933 - (uint_array_tuple_accessor_length M))) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - a!2)) - ) - (block_27_return_function_q__27_335_0 I R C H S P A D Q B G) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) ) - (=> - (and - (block_27_return_function_q__27_335_0 G J C F K H A D I B E) - true - ) - (summary_5_function_q__27_335_0 G J C F K H A D I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) ) - (=> - (and - true - ) - (block_28_function_q__27_335_0 G J C F K H A D I B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C uint_array_tuple) (D abi_type) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L state_type) (M state_type) (N state_type) (O state_type) (P Int) (Q tx_type) ) - (=> - (and - (block_28_function_q__27_335_0 I P D H Q L A E M B F) - (summary_5_function_q__27_335_0 J P D H Q N B F O C G) - (let ((a!1 (store (balances M) P (+ (select (balances M) P) K))) - (a!2 (= (select (bytes_tuple_accessor_array (msg.data Q)) 3) 130)) - (a!3 (= (select (bytes_tuple_accessor_array (msg.data Q)) 2) 178)) - (a!4 (= (select (bytes_tuple_accessor_array (msg.data Q)) 1) 58)) - (a!5 (= (select (bytes_tuple_accessor_array (msg.data Q)) 0) 253)) - (a!6 (>= (+ (select (balances M) P) K) 0)) - (a!7 (<= (+ (select (balances M) P) K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935))) - (and (= B A) - (= N (state_type a!1)) - (= M L) - a!2 - a!3 - a!4 - a!5 - (= (msg.value Q) 0) - (= (msg.sig Q) 4248482434) - (= I 0) - (>= (tx.origin Q) 0) - (>= (tx.gasprice Q) 0) - (>= (msg.value Q) 0) - (>= (msg.sender Q) 0) - (>= (block.timestamp Q) 0) - (>= (block.number Q) 0) - (>= (block.gaslimit Q) 0) - (>= (block.difficulty Q) 0) - (>= (block.coinbase Q) 0) - (>= (block.chainid Q) 0) - (>= (block.basefee Q) 0) - (>= (bytes_tuple_accessor_length (msg.data Q)) 4) - a!6 - (>= K (msg.value Q)) - (<= (tx.origin Q) 1461501637330902918203684832716283019655932542975) - (<= (tx.gasprice Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.value Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.sender Q) 1461501637330902918203684832716283019655932542975) - (<= (block.timestamp Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.number Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.gaslimit Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.difficulty Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.coinbase Q) 1461501637330902918203684832716283019655932542975) - (<= (block.chainid Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.basefee Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - a!7 - (= F E))) - ) - (summary_6_function_q__27_335_0 J P D H Q L A E O C G) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) ) - (=> - (and - true - ) - (block_29_function_f__58_335_0 G J C F K H A D N L I B E O M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) ) - (=> - (and - (block_29_function_f__58_335_0 G J C F K H A D N L I B E O M) - (and (= B A) (= I H) (= G 0) (= O N) (= M L) (= E D)) - ) - (block_30_f_57_335_0 G J C F K H A D N L I B E O M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J uint_array_tuple) (K Int) (L Bool) (M uint_array_tuple) (N Int) (O Int) (P state_type) (Q state_type) (R Int) (S tx_type) (T Int) (U Int) (V Int) (W Int) ) - (=> - (and - (block_30_f_57_335_0 G R C F S P A D V T Q B E W U) - (and (= M B) - (= J B) - (= K (uint_array_tuple_accessor_length J)) - (= O U) - (= I W) - (= H 2) - (= N W) - (>= K 0) - (>= O 0) - (>= I 0) - (>= W 0) - (>= U 0) - (>= N 0) - (<= K - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 N)) (>= N (uint_array_tuple_accessor_length M))) - (= L true) - (not (= (<= K I) L))) - ) - (block_32_function_f__58_335_0 H R C F S P A D V T Q B E W U) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) ) - (=> - (and - (block_32_function_f__58_335_0 G J C F K H A D N L I B E O M) - true - ) - (summary_7_function_f__58_335_0 G J C F K H A D N L I B E O M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) ) - (=> - (and - (block_33_function_f__58_335_0 G J C F K H A D N L I B E O M) - true - ) - (summary_7_function_f__58_335_0 G J C F K H A D N L I B E O M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) ) - (=> - (and - (block_31_return_function_f__58_335_0 G J C F K H A D N L I B E O M) - true - ) - (summary_7_function_f__58_335_0 G J C F K H A D N L I B E O M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C uint_array_tuple) (D uint_array_tuple) (E abi_type) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L Int) (M uint_array_tuple) (N Int) (O Bool) (P uint_array_tuple) (Q uint_array_tuple) (R uint_array_tuple) (S Int) (T Int) (U Int) (V Int) (W Int) (X uint_array_tuple) (Y uint_array_tuple) (Z Int) (A1 Int) (B1 Bool) (C1 state_type) (D1 state_type) (E1 Int) (F1 tx_type) (G1 Int) (H1 Int) (I1 Int) (J1 Int) ) - (=> - (and - (block_30_f_57_335_0 I E1 E H F1 C1 A F I1 G1 D1 B G J1 H1) - (let ((a!1 (= C - (uint_array_tuple (store (uint_array_tuple_accessor_array Q) S W) - (uint_array_tuple_accessor_length Q))))) - (and (= B1 (= Z A1)) - (= M B) - (= Y D) - a!1 - (= D (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - (= R C) - (= Q B) - (= P B) - (= X C) - (= J I) - (= W V) - (= L J1) - (= K 3) - (= V H1) - (= S J1) - (= N (uint_array_tuple_accessor_length M)) - (= U (select (uint_array_tuple_accessor_array Q) S)) - (= T (select (uint_array_tuple_accessor_array B) S)) - (= A1 0) - (= Z (uint_array_tuple_accessor_length Y)) - (>= W 0) - (>= L 0) - (>= V 0) - (>= S 0) - (>= N 0) - (>= U 0) - (>= T 0) - (>= J1 0) - (>= H1 0) - (>= Z 0) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= L - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Z - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (= O true) - (not B1) - (not (= (<= N L) O)))) - ) - (block_33_function_f__58_335_0 K E1 E H F1 C1 A F I1 G1 D1 D G J1 H1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C uint_array_tuple) (D uint_array_tuple) (E abi_type) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L Int) (M uint_array_tuple) (N Int) (O Bool) (P uint_array_tuple) (Q uint_array_tuple) (R uint_array_tuple) (S Int) (T Int) (U Int) (V Int) (W Int) (X uint_array_tuple) (Y uint_array_tuple) (Z Int) (A1 Int) (B1 Bool) (C1 state_type) (D1 state_type) (E1 Int) (F1 tx_type) (G1 Int) (H1 Int) (I1 Int) (J1 Int) ) - (=> - (and - (block_30_f_57_335_0 I E1 E H F1 C1 A F I1 G1 D1 B G J1 H1) - (let ((a!1 (= C - (uint_array_tuple (store (uint_array_tuple_accessor_array Q) S W) - (uint_array_tuple_accessor_length Q))))) - (and (= B1 (= Z A1)) - (= M B) - (= Y D) - a!1 - (= D (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - (= R C) - (= Q B) - (= P B) - (= X C) - (= J I) - (= W V) - (= L J1) - (= K J) - (= V H1) - (= S J1) - (= N (uint_array_tuple_accessor_length M)) - (= U (select (uint_array_tuple_accessor_array Q) S)) - (= T (select (uint_array_tuple_accessor_array B) S)) - (= A1 0) - (= Z (uint_array_tuple_accessor_length Y)) - (>= W 0) - (>= L 0) - (>= V 0) - (>= S 0) - (>= N 0) - (>= U 0) - (>= T 0) - (>= J1 0) - (>= H1 0) - (>= Z 0) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= L - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Z - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (= O true) - (not (= (<= N L) O)))) - ) - (block_31_return_function_f__58_335_0 K E1 E H F1 C1 A F I1 G1 D1 D G J1 H1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) ) - (=> - (and - true - ) - (block_34_function_f__58_335_0 G J C F K H A D N L I B E O M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C uint_array_tuple) (D abi_type) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L state_type) (M state_type) (N state_type) (O state_type) (P Int) (Q tx_type) (R Int) (S Int) (T Int) (U Int) (V Int) (W Int) ) - (=> - (and - (block_34_function_f__58_335_0 I P D H Q L A E U R M B F V S) - (summary_7_function_f__58_335_0 J P D H Q N B F V S O C G W T) - (let ((a!1 (store (balances M) P (+ (select (balances M) P) K))) - (a!2 (= (select (bytes_tuple_accessor_array (msg.data Q)) 3) 46)) - (a!3 (= (select (bytes_tuple_accessor_array (msg.data Q)) 2) 170)) - (a!4 (= (select (bytes_tuple_accessor_array (msg.data Q)) 1) 209)) - (a!5 (= (select (bytes_tuple_accessor_array (msg.data Q)) 0) 19)) - (a!6 (>= (+ (select (balances M) P) K) 0)) - (a!7 (<= (+ (select (balances M) P) K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935))) - (and (= B A) - (= M L) - (= N (state_type a!1)) - a!2 - a!3 - a!4 - a!5 - (= (msg.value Q) 0) - (= (msg.sig Q) 332507694) - (= S R) - (= I 0) - (= V U) - (>= (tx.origin Q) 0) - (>= (tx.gasprice Q) 0) - (>= (msg.value Q) 0) - (>= (msg.sender Q) 0) - (>= (block.timestamp Q) 0) - (>= (block.number Q) 0) - (>= (block.gaslimit Q) 0) - (>= (block.difficulty Q) 0) - (>= (block.coinbase Q) 0) - (>= (block.chainid Q) 0) - (>= (block.basefee Q) 0) - (>= (bytes_tuple_accessor_length (msg.data Q)) 4) - a!6 - (>= K (msg.value Q)) - (<= (tx.origin Q) 1461501637330902918203684832716283019655932542975) - (<= (tx.gasprice Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.value Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.sender Q) 1461501637330902918203684832716283019655932542975) - (<= (block.timestamp Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.number Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.gaslimit Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.difficulty Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.coinbase Q) 1461501637330902918203684832716283019655932542975) - (<= (block.chainid Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.basefee Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - a!7 - (= F E))) - ) - (summary_8_function_f__58_335_0 J P D H Q L A E U R O C G W T) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - true - ) - (block_35_function_g__102_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_35_function_g__102_335_0 G J C F K H A D N P L I B E O Q M) - (and (= B A) (= I H) (= M L) (= Q P) (= O N) (= G 0) (= E D)) - ) - (block_36_g_101_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J uint_array_tuple_array_tuple) (K Int) (L Bool) (M Int) (N uint_array_tuple_array_tuple) (O Int) (P state_type) (Q state_type) (R Int) (S tx_type) (T Int) (U Int) (V Int) (W Int) (X Int) (Y Int) ) - (=> - (and - (block_36_g_101_335_0 G R C F S P A D V X T Q B E W Y U) - (and (= J E) - (= N E) - (= M Y) - (= K (uint_array_tuple_array_tuple_accessor_length J)) - (= H 5) - (= I W) - (= O W) - (>= M 0) - (>= U 0) - (>= K 0) - (>= I 0) - (>= Y 0) - (>= W 0) - (>= O 0) - (<= M - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 O)) (>= O (uint_array_tuple_array_tuple_accessor_length N))) - (= L true) - (not (= (<= K I) L))) - ) - (block_38_function_g__102_335_0 H R C F S P A D V X T Q B E W Y U) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_38_function_g__102_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_9_function_g__102_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_39_function_g__102_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_9_function_g__102_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_40_function_g__102_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_9_function_g__102_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_41_function_g__102_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_9_function_g__102_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_37_return_function_g__102_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_9_function_g__102_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J Int) (K uint_array_tuple_array_tuple) (L Int) (M Bool) (N Int) (O uint_array_tuple_array_tuple) (P Int) (Q uint_array_tuple) (R Int) (S Bool) (T uint_array_tuple_array_tuple) (U Int) (V Int) (W state_type) (X state_type) (Y Int) (Z tx_type) (A1 Int) (B1 Int) (C1 Int) (D1 Int) (E1 Int) (F1 Int) ) - (=> - (and - (block_36_g_101_335_0 G Y C F Z W A D C1 E1 A1 X B E D1 F1 B1) - (and (not (= (<= R N) S)) - (= T E) - (= O E) - (= K E) - (= Q (select (uint_array_tuple_array_tuple_accessor_array E) P)) - (= L (uint_array_tuple_array_tuple_accessor_length K)) - (= H G) - (= N F1) - (= I 6) - (= R (uint_array_tuple_accessor_length Q)) - (= J D1) - (= U D1) - (= P D1) - (= V B1) - (>= (uint_array_tuple_accessor_length Q) 0) - (>= L 0) - (>= B1 0) - (>= N 0) - (>= R 0) - (>= J 0) - (>= U 0) - (>= P 0) - (>= F1 0) - (>= D1 0) - (>= V 0) - (<= L - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= B1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= P - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 U)) (>= U (uint_array_tuple_array_tuple_accessor_length T))) - (= M true) - (= S true) - (not (= (<= L J) M))) - ) - (block_39_function_g__102_335_0 I Y C F Z W A D C1 E1 A1 X B E D1 F1 B1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J Int) (K Int) (L uint_array_tuple_array_tuple) (M Int) (N Bool) (O Int) (P uint_array_tuple_array_tuple) (Q Int) (R uint_array_tuple) (S Int) (T Bool) (U uint_array_tuple_array_tuple) (V Int) (W Int) (X uint_array_tuple) (Y Int) (Z state_type) (A1 state_type) (B1 Int) (C1 tx_type) (D1 Int) (E1 Int) (F1 Int) (G1 Int) (H1 Int) (I1 Int) ) - (=> - (and - (block_36_g_101_335_0 G B1 C F C1 Z A D F1 H1 D1 A1 B E G1 I1 E1) - (and (not (= (<= S O) T)) - (= P E) - (= L E) - (= U E) - (= X (select (uint_array_tuple_array_tuple_accessor_array E) V)) - (= R (select (uint_array_tuple_array_tuple_accessor_array E) Q)) - (= I H) - (= W I1) - (= V G1) - (= O I1) - (= K G1) - (= J 7) - (= Q G1) - (= H G) - (= M (uint_array_tuple_array_tuple_accessor_length L)) - (= S (uint_array_tuple_accessor_length R)) - (= Y E1) - (>= (uint_array_tuple_accessor_length X) 0) - (>= (uint_array_tuple_accessor_length R) 0) - (>= W 0) - (>= V 0) - (>= O 0) - (>= E1 0) - (>= K 0) - (>= Q 0) - (>= M 0) - (>= S 0) - (>= I1 0) - (>= G1 0) - (>= Y 0) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Q - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 W)) (>= W (uint_array_tuple_accessor_length X))) - (= T true) - (= N true) - (not (= (<= M K) N))) - ) - (block_40_function_g__102_335_0 J B1 C F C1 Z A D F1 H1 D1 A1 B E G1 I1 E1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L Int) (M Int) (N Int) (O uint_array_tuple_array_tuple) (P Int) (Q Bool) (R Int) (S uint_array_tuple_array_tuple) (T Int) (U uint_array_tuple) (V Int) (W Bool) (X uint_array_tuple_array_tuple) (Y uint_array_tuple_array_tuple) (Z uint_array_tuple_array_tuple) (A1 Int) (B1 Int) (C1 uint_array_tuple) (D1 uint_array_tuple) (E1 Int) (F1 Int) (G1 Int) (H1 Int) (I1 uint_array_tuple_array_tuple) (J1 uint_array_tuple_array_tuple) (K1 Int) (L1 Int) (M1 Bool) (N1 state_type) (O1 state_type) (P1 Int) (Q1 tx_type) (R1 Int) (S1 Int) (T1 Int) (U1 Int) (V1 Int) (W1 Int) ) - (=> - (and - (block_36_g_101_335_0 I P1 C H Q1 N1 A D T1 V1 R1 O1 B E U1 W1 S1) - (let ((a!1 (store (uint_array_tuple_array_tuple_accessor_array Y) - A1 - (uint_array_tuple (store (uint_array_tuple_accessor_array C1) - B1 - H1) - (uint_array_tuple_accessor_length C1)))) - (a!2 (uint_array_tuple_array_tuple - ((as const (Array Int uint_array_tuple)) - (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - 0))) - (and (not (= (<= V R) W)) - (= M1 (= K1 L1)) - (= F - (uint_array_tuple_array_tuple - a!1 - (uint_array_tuple_array_tuple_accessor_length Y))) - (= G a!2) - (= O E) - (= X E) - (= Y E) - (= J1 G) - (= S E) - (= Z F) - (= I1 F) - (= U (select (uint_array_tuple_array_tuple_accessor_array E) T)) - (= D1 (select (uint_array_tuple_array_tuple_accessor_array Y) A1)) - (= C1 (select (uint_array_tuple_array_tuple_accessor_array E) A1)) - (= K J) - (= L K) - (= K1 (uint_array_tuple_array_tuple_accessor_length J1)) - (= T U1) - (= P (uint_array_tuple_array_tuple_accessor_length O)) - (= J I) - (= R W1) - (= N U1) - (= M 8) - (= E1 (select (uint_array_tuple_accessor_array C1) B1)) - (= V (uint_array_tuple_accessor_length U)) - (= F1 (select (uint_array_tuple_accessor_array C1) B1)) - (= B1 W1) - (= A1 U1) - (= L1 0) - (= H1 G1) - (= G1 S1) - (>= (uint_array_tuple_accessor_length U) 0) - (>= (uint_array_tuple_accessor_length C1) 0) - (>= K1 0) - (>= T 0) - (>= P 0) - (>= S1 0) - (>= R 0) - (>= N 0) - (>= E1 0) - (>= V 0) - (>= F1 0) - (>= B1 0) - (>= A1 0) - (>= H1 0) - (>= G1 0) - (>= W1 0) - (>= U1 0) - (<= K1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= P - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= B1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= A1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (= Q true) - (= W true) - (not M1) - (not (= (<= P N) Q)))) - ) - (block_41_function_g__102_335_0 M P1 C H Q1 N1 A D T1 V1 R1 O1 B G U1 W1 S1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L Int) (M Int) (N Int) (O uint_array_tuple_array_tuple) (P Int) (Q Bool) (R Int) (S uint_array_tuple_array_tuple) (T Int) (U uint_array_tuple) (V Int) (W Bool) (X uint_array_tuple_array_tuple) (Y uint_array_tuple_array_tuple) (Z uint_array_tuple_array_tuple) (A1 Int) (B1 Int) (C1 uint_array_tuple) (D1 uint_array_tuple) (E1 Int) (F1 Int) (G1 Int) (H1 Int) (I1 uint_array_tuple_array_tuple) (J1 uint_array_tuple_array_tuple) (K1 Int) (L1 Int) (M1 Bool) (N1 state_type) (O1 state_type) (P1 Int) (Q1 tx_type) (R1 Int) (S1 Int) (T1 Int) (U1 Int) (V1 Int) (W1 Int) ) - (=> - (and - (block_36_g_101_335_0 I P1 C H Q1 N1 A D T1 V1 R1 O1 B E U1 W1 S1) - (let ((a!1 (store (uint_array_tuple_array_tuple_accessor_array Y) - A1 - (uint_array_tuple (store (uint_array_tuple_accessor_array C1) - B1 - H1) - (uint_array_tuple_accessor_length C1)))) - (a!2 (uint_array_tuple_array_tuple - ((as const (Array Int uint_array_tuple)) - (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - 0))) - (and (not (= (<= V R) W)) - (= M1 (= K1 L1)) - (= F - (uint_array_tuple_array_tuple - a!1 - (uint_array_tuple_array_tuple_accessor_length Y))) - (= G a!2) - (= O E) - (= X E) - (= Y E) - (= J1 G) - (= S E) - (= Z F) - (= I1 F) - (= U (select (uint_array_tuple_array_tuple_accessor_array E) T)) - (= D1 (select (uint_array_tuple_array_tuple_accessor_array Y) A1)) - (= C1 (select (uint_array_tuple_array_tuple_accessor_array E) A1)) - (= K J) - (= L K) - (= K1 (uint_array_tuple_array_tuple_accessor_length J1)) - (= T U1) - (= P (uint_array_tuple_array_tuple_accessor_length O)) - (= J I) - (= R W1) - (= N U1) - (= M L) - (= E1 (select (uint_array_tuple_accessor_array C1) B1)) - (= V (uint_array_tuple_accessor_length U)) - (= F1 (select (uint_array_tuple_accessor_array C1) B1)) - (= B1 W1) - (= A1 U1) - (= L1 0) - (= H1 G1) - (= G1 S1) - (>= (uint_array_tuple_accessor_length U) 0) - (>= (uint_array_tuple_accessor_length C1) 0) - (>= K1 0) - (>= T 0) - (>= P 0) - (>= S1 0) - (>= R 0) - (>= N 0) - (>= E1 0) - (>= V 0) - (>= F1 0) - (>= B1 0) - (>= A1 0) - (>= H1 0) - (>= G1 0) - (>= W1 0) - (>= U1 0) - (<= K1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= P - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= B1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= A1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (= Q true) - (= W true) - (not (= (<= P N) Q)))) - ) - (block_37_return_function_g__102_335_0 - M - P1 - C - H - Q1 - N1 - A - D - T1 - V1 - R1 - O1 - B - G - U1 - W1 - S1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - true - ) - (block_42_function_g__102_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C uint_array_tuple) (D abi_type) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L state_type) (M state_type) (N state_type) (O state_type) (P Int) (Q tx_type) (R Int) (S Int) (T Int) (U Int) (V Int) (W Int) (X Int) (Y Int) (Z Int) ) - (=> - (and - (block_42_function_g__102_335_0 I P D H Q L A E U X R M B F V Y S) - (summary_9_function_g__102_335_0 J P D H Q N B F V Y S O C G W Z T) - (let ((a!1 (store (balances M) P (+ (select (balances M) P) K))) - (a!2 (= (select (bytes_tuple_accessor_array (msg.data Q)) 3) 209)) - (a!3 (= (select (bytes_tuple_accessor_array (msg.data Q)) 2) 87)) - (a!4 (= (select (bytes_tuple_accessor_array (msg.data Q)) 1) 17)) - (a!5 (= (select (bytes_tuple_accessor_array (msg.data Q)) 0) 25)) - (a!6 (>= (+ (select (balances M) P) K) 0)) - (a!7 (<= (+ (select (balances M) P) K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935))) - (and (= B A) - (= N (state_type a!1)) - (= M L) - a!2 - a!3 - a!4 - a!5 - (= (msg.value Q) 0) - (= (msg.sig Q) 420566993) - (= V U) - (= I 0) - (= S R) - (= Y X) - (>= (tx.origin Q) 0) - (>= (tx.gasprice Q) 0) - (>= (msg.value Q) 0) - (>= (msg.sender Q) 0) - (>= (block.timestamp Q) 0) - (>= (block.number Q) 0) - (>= (block.gaslimit Q) 0) - (>= (block.difficulty Q) 0) - (>= (block.coinbase Q) 0) - (>= (block.chainid Q) 0) - (>= (block.basefee Q) 0) - (>= (bytes_tuple_accessor_length (msg.data Q)) 4) - a!6 - (>= K (msg.value Q)) - (<= (tx.origin Q) 1461501637330902918203684832716283019655932542975) - (<= (tx.gasprice Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.value Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.sender Q) 1461501637330902918203684832716283019655932542975) - (<= (block.timestamp Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.number Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.gaslimit Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.difficulty Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.coinbase Q) 1461501637330902918203684832716283019655932542975) - (<= (block.chainid Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.basefee Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - a!7 - (= F E))) - ) - (summary_10_function_g__102_335_0 J P D H Q L A E U X R O C G W Z T) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - true - ) - (block_43_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_43_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - (and (= B A) (= I H) (= M L) (= Q P) (= O N) (= G 0) (= E D)) - ) - (block_44_h_149_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J uint_array_tuple_array_tuple) (K Int) (L Bool) (M Int) (N uint_array_tuple_array_tuple) (O Int) (P state_type) (Q state_type) (R Int) (S tx_type) (T Int) (U Int) (V Int) (W Int) (X Int) (Y Int) ) - (=> - (and - (block_44_h_149_335_0 G R C F S P A D V X T Q B E W Y U) - (and (= J E) - (= N E) - (= M Y) - (= K (uint_array_tuple_array_tuple_accessor_length J)) - (= H 10) - (= I W) - (= O W) - (>= M 0) - (>= U 0) - (>= K 0) - (>= I 0) - (>= Y 0) - (>= W 0) - (>= O 0) - (<= M - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 O)) (>= O (uint_array_tuple_array_tuple_accessor_length N))) - (= L true) - (not (= (<= K I) L))) - ) - (block_46_function_h__150_335_0 H R C F S P A D V X T Q B E W Y U) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_46_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_11_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_47_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_11_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_48_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_11_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_49_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_11_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_50_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_11_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_51_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_11_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_45_return_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_11_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J Int) (K uint_array_tuple_array_tuple) (L Int) (M Bool) (N Int) (O uint_array_tuple_array_tuple) (P Int) (Q uint_array_tuple) (R Int) (S Bool) (T uint_array_tuple_array_tuple) (U Int) (V Int) (W state_type) (X state_type) (Y Int) (Z tx_type) (A1 Int) (B1 Int) (C1 Int) (D1 Int) (E1 Int) (F1 Int) ) - (=> - (and - (block_44_h_149_335_0 G Y C F Z W A D C1 E1 A1 X B E D1 F1 B1) - (and (not (= (<= R N) S)) - (= T E) - (= O E) - (= K E) - (= Q (select (uint_array_tuple_array_tuple_accessor_array E) P)) - (= L (uint_array_tuple_array_tuple_accessor_length K)) - (= H G) - (= N F1) - (= I 11) - (= R (uint_array_tuple_accessor_length Q)) - (= J D1) - (= U D1) - (= P D1) - (= V B1) - (>= (uint_array_tuple_accessor_length Q) 0) - (>= L 0) - (>= B1 0) - (>= N 0) - (>= R 0) - (>= J 0) - (>= U 0) - (>= P 0) - (>= F1 0) - (>= D1 0) - (>= V 0) - (<= L - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= B1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= P - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 U)) (>= U (uint_array_tuple_array_tuple_accessor_length T))) - (= M true) - (= S true) - (not (= (<= L J) M))) - ) - (block_47_function_h__150_335_0 I Y C F Z W A D C1 E1 A1 X B E D1 F1 B1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J Int) (K Int) (L uint_array_tuple_array_tuple) (M Int) (N Bool) (O Int) (P uint_array_tuple_array_tuple) (Q Int) (R uint_array_tuple) (S Int) (T Bool) (U uint_array_tuple_array_tuple) (V Int) (W Int) (X uint_array_tuple) (Y Int) (Z state_type) (A1 state_type) (B1 Int) (C1 tx_type) (D1 Int) (E1 Int) (F1 Int) (G1 Int) (H1 Int) (I1 Int) ) - (=> - (and - (block_44_h_149_335_0 G B1 C F C1 Z A D F1 H1 D1 A1 B E G1 I1 E1) - (and (not (= (<= S O) T)) - (= P E) - (= L E) - (= U E) - (= X (select (uint_array_tuple_array_tuple_accessor_array E) V)) - (= R (select (uint_array_tuple_array_tuple_accessor_array E) Q)) - (= I H) - (= W I1) - (= V G1) - (= O I1) - (= K G1) - (= J 12) - (= Q G1) - (= H G) - (= M (uint_array_tuple_array_tuple_accessor_length L)) - (= S (uint_array_tuple_accessor_length R)) - (= Y E1) - (>= (uint_array_tuple_accessor_length X) 0) - (>= (uint_array_tuple_accessor_length R) 0) - (>= W 0) - (>= V 0) - (>= O 0) - (>= E1 0) - (>= K 0) - (>= Q 0) - (>= M 0) - (>= S 0) - (>= I1 0) - (>= G1 0) - (>= Y 0) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Q - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 W)) (>= W (uint_array_tuple_accessor_length X))) - (= T true) - (= N true) - (not (= (<= M K) N))) - ) - (block_48_function_h__150_335_0 J B1 C F C1 Z A D F1 H1 D1 A1 B E G1 I1 E1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G crypto_type) (H Int) (I Int) (J Int) (K Int) (L Int) (M Int) (N uint_array_tuple_array_tuple) (O Int) (P Bool) (Q Int) (R uint_array_tuple_array_tuple) (S Int) (T uint_array_tuple) (U Int) (V Bool) (W uint_array_tuple_array_tuple) (X uint_array_tuple_array_tuple) (Y uint_array_tuple_array_tuple) (Z Int) (A1 Int) (B1 uint_array_tuple) (C1 uint_array_tuple) (D1 Int) (E1 Int) (F1 Int) (G1 Int) (H1 uint_array_tuple_array_tuple) (I1 Int) (J1 state_type) (K1 state_type) (L1 Int) (M1 tx_type) (N1 Int) (O1 Int) (P1 Int) (Q1 Int) (R1 Int) (S1 Int) ) - (=> - (and - (block_44_h_149_335_0 H L1 C G M1 J1 A D P1 R1 N1 K1 B E Q1 S1 O1) - (let ((a!1 (store (uint_array_tuple_array_tuple_accessor_array X) - Z - (uint_array_tuple (store (uint_array_tuple_accessor_array B1) - A1 - G1) - (uint_array_tuple_accessor_length B1))))) - (and (not (= (<= U Q) V)) - (= F - (uint_array_tuple_array_tuple - a!1 - (uint_array_tuple_array_tuple_accessor_length X))) - (= N E) - (= R E) - (= Y F) - (= X E) - (= W E) - (= H1 F) - (= B1 (select (uint_array_tuple_array_tuple_accessor_array E) Z)) - (= C1 (select (uint_array_tuple_array_tuple_accessor_array X) Z)) - (= T (select (uint_array_tuple_array_tuple_accessor_array E) S)) - (= S Q1) - (= G1 F1) - (= F1 O1) - (= O (uint_array_tuple_array_tuple_accessor_length N)) - (= K J) - (= M Q1) - (= L 13) - (= U (uint_array_tuple_accessor_length T)) - (= J I) - (= I H) - (= A1 S1) - (= Z Q1) - (= Q S1) - (= E1 (select (uint_array_tuple_accessor_array B1) A1)) - (= D1 (select (uint_array_tuple_accessor_array B1) A1)) - (= I1 Q1) - (>= (uint_array_tuple_accessor_length B1) 0) - (>= (uint_array_tuple_accessor_length T) 0) - (>= S 0) - (>= G1 0) - (>= F1 0) - (>= O 0) - (>= M 0) - (>= O1 0) - (>= U 0) - (>= A1 0) - (>= Z 0) - (>= Q 0) - (>= E1 0) - (>= D1 0) - (>= S1 0) - (>= Q1 0) - (>= I1 0) - (<= S - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= A1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Z - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Q - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Q1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 I1)) - (>= I1 (uint_array_tuple_array_tuple_accessor_length H1))) - (= P true) - (= V true) - (not (= (<= O M) P)))) - ) - (block_49_function_h__150_335_0 L L1 C G M1 J1 A D P1 R1 N1 K1 B F Q1 S1 O1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L Int) (M Int) (N Int) (O Int) (P uint_array_tuple_array_tuple) (Q Int) (R Bool) (S Int) (T uint_array_tuple_array_tuple) (U Int) (V uint_array_tuple) (W Int) (X Bool) (Y uint_array_tuple_array_tuple) (Z uint_array_tuple_array_tuple) (A1 uint_array_tuple_array_tuple) (B1 Int) (C1 Int) (D1 uint_array_tuple) (E1 uint_array_tuple) (F1 Int) (G1 Int) (H1 Int) (I1 Int) (J1 uint_array_tuple_array_tuple) (K1 uint_array_tuple_array_tuple) (L1 uint_array_tuple_array_tuple) (M1 Int) (N1 uint_array_tuple) (O1 uint_array_tuple) (P1 uint_array_tuple) (Q1 uint_array_tuple_array_tuple) (R1 Int) (S1 state_type) (T1 state_type) (U1 Int) (V1 tx_type) (W1 Int) (X1 Int) (Y1 Int) (Z1 Int) (A2 Int) (B2 Int) ) - (=> - (and - (block_44_h_149_335_0 I U1 C H V1 S1 A D Y1 A2 W1 T1 B E Z1 B2 X1) - (let ((a!1 (store (uint_array_tuple_array_tuple_accessor_array Z) - B1 - (uint_array_tuple (store (uint_array_tuple_accessor_array D1) - C1 - I1) - (uint_array_tuple_accessor_length D1)))) - (a!2 (= G - (uint_array_tuple_array_tuple - (store (uint_array_tuple_array_tuple_accessor_array K1) M1 O1) - (uint_array_tuple_array_tuple_accessor_length K1))))) - (and (not (= (<= W S) X)) - (= F - (uint_array_tuple_array_tuple - a!1 - (uint_array_tuple_array_tuple_accessor_length Z))) - a!2 - (= P E) - (= T E) - (= A1 F) - (= J1 F) - (= K1 F) - (= Z E) - (= Y E) - (= L1 G) - (= Q1 G) - (= D1 (select (uint_array_tuple_array_tuple_accessor_array E) B1)) - (= E1 (select (uint_array_tuple_array_tuple_accessor_array Z) B1)) - (= V (select (uint_array_tuple_array_tuple_accessor_array E) U)) - (= P1 (select (uint_array_tuple_array_tuple_accessor_array K1) M1)) - (= O1 (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - (= N1 (select (uint_array_tuple_array_tuple_accessor_array F) M1)) - (= L K) - (= Q (uint_array_tuple_array_tuple_accessor_length P)) - (= B1 Z1) - (= J I) - (= K J) - (= H1 X1) - (= U Z1) - (= M L) - (= O Z1) - (= N 14) - (= C1 B2) - (= W (uint_array_tuple_accessor_length V)) - (= S B2) - (= I1 H1) - (= G1 (select (uint_array_tuple_accessor_array D1) C1)) - (= F1 (select (uint_array_tuple_accessor_array D1) C1)) - (= M1 Z1) - (= R1 Z1) - (>= (uint_array_tuple_accessor_length D1) 0) - (>= (uint_array_tuple_accessor_length V) 0) - (>= (uint_array_tuple_accessor_length N1) 0) - (>= Q 0) - (>= B1 0) - (>= H1 0) - (>= U 0) - (>= O 0) - (>= X1 0) - (>= C1 0) - (>= W 0) - (>= S 0) - (>= I1 0) - (>= G1 0) - (>= F1 0) - (>= M1 0) - (>= B2 0) - (>= Z1 0) - (>= R1 0) - (<= Q - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= B1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= X1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= C1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= B2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Z1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 R1)) - (>= R1 (uint_array_tuple_array_tuple_accessor_length Q1))) - (= R true) - (= X true) - (not (= (<= Q O) R)))) - ) - (block_50_function_h__150_335_0 N U1 C H V1 S1 A D Y1 A2 W1 T1 B G Z1 B2 X1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L Int) (M Int) (N Int) (O Int) (P Int) (Q uint_array_tuple_array_tuple) (R Int) (S Bool) (T Int) (U uint_array_tuple_array_tuple) (V Int) (W uint_array_tuple) (X Int) (Y Bool) (Z uint_array_tuple_array_tuple) (A1 uint_array_tuple_array_tuple) (B1 uint_array_tuple_array_tuple) (C1 Int) (D1 Int) (E1 uint_array_tuple) (F1 uint_array_tuple) (G1 Int) (H1 Int) (I1 Int) (J1 Int) (K1 uint_array_tuple_array_tuple) (L1 uint_array_tuple_array_tuple) (M1 uint_array_tuple_array_tuple) (N1 Int) (O1 uint_array_tuple) (P1 uint_array_tuple) (Q1 uint_array_tuple) (R1 uint_array_tuple_array_tuple) (S1 Int) (T1 uint_array_tuple) (U1 Int) (V1 Int) (W1 Bool) (X1 state_type) (Y1 state_type) (Z1 Int) (A2 tx_type) (B2 Int) (C2 Int) (D2 Int) (E2 Int) (F2 Int) (G2 Int) ) - (=> - (and - (block_44_h_149_335_0 I Z1 C H A2 X1 A D D2 F2 B2 Y1 B E E2 G2 C2) - (let ((a!1 (= G - (uint_array_tuple_array_tuple - (store (uint_array_tuple_array_tuple_accessor_array L1) N1 P1) - (uint_array_tuple_array_tuple_accessor_length L1)))) - (a!2 (store (uint_array_tuple_array_tuple_accessor_array A1) - C1 - (uint_array_tuple (store (uint_array_tuple_accessor_array E1) - D1 - J1) - (uint_array_tuple_accessor_length E1))))) - (and (not (= (<= X T) Y)) - (= W1 (= U1 V1)) - (= Z E) - (= A1 E) - (= U E) - (= Q E) - (= B1 F) - (= M1 G) - a!1 - (= F - (uint_array_tuple_array_tuple - a!2 - (uint_array_tuple_array_tuple_accessor_length A1))) - (= L1 F) - (= K1 F) - (= R1 G) - (= W (select (uint_array_tuple_array_tuple_accessor_array E) V)) - (= E1 (select (uint_array_tuple_array_tuple_accessor_array E) C1)) - (= P1 (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - (= Q1 (select (uint_array_tuple_array_tuple_accessor_array L1) N1)) - (= F1 (select (uint_array_tuple_array_tuple_accessor_array A1) C1)) - (= O1 (select (uint_array_tuple_array_tuple_accessor_array F) N1)) - (= T1 (select (uint_array_tuple_array_tuple_accessor_array G) S1)) - (= V E2) - (= G1 (select (uint_array_tuple_accessor_array E1) D1)) - (= U1 (uint_array_tuple_accessor_length T1)) - (= D1 G2) - (= C1 E2) - (= O 15) - (= P E2) - (= K J) - (= J I) - (= L K) - (= R (uint_array_tuple_array_tuple_accessor_length Q)) - (= N M) - (= M L) - (= T G2) - (= I1 C2) - (= H1 (select (uint_array_tuple_accessor_array E1) D1)) - (= X (uint_array_tuple_accessor_length W)) - (= N1 E2) - (= J1 I1) - (= S1 E2) - (= V1 0) - (>= (uint_array_tuple_accessor_length W) 0) - (>= (uint_array_tuple_accessor_length E1) 0) - (>= (uint_array_tuple_accessor_length O1) 0) - (>= (uint_array_tuple_accessor_length T1) 0) - (>= V 0) - (>= G1 0) - (>= U1 0) - (>= D1 0) - (>= C1 0) - (>= P 0) - (>= R 0) - (>= T 0) - (>= C2 0) - (>= I1 0) - (>= H1 0) - (>= X 0) - (>= N1 0) - (>= J1 0) - (>= S1 0) - (>= G2 0) - (>= E2 0) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= C1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= P - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= C2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= X - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (= S true) - (= Y true) - (not W1) - (not (= (<= R P) S)))) - ) - (block_51_function_h__150_335_0 O Z1 C H A2 X1 A D D2 F2 B2 Y1 B G E2 G2 C2) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L Int) (M Int) (N Int) (O Int) (P Int) (Q uint_array_tuple_array_tuple) (R Int) (S Bool) (T Int) (U uint_array_tuple_array_tuple) (V Int) (W uint_array_tuple) (X Int) (Y Bool) (Z uint_array_tuple_array_tuple) (A1 uint_array_tuple_array_tuple) (B1 uint_array_tuple_array_tuple) (C1 Int) (D1 Int) (E1 uint_array_tuple) (F1 uint_array_tuple) (G1 Int) (H1 Int) (I1 Int) (J1 Int) (K1 uint_array_tuple_array_tuple) (L1 uint_array_tuple_array_tuple) (M1 uint_array_tuple_array_tuple) (N1 Int) (O1 uint_array_tuple) (P1 uint_array_tuple) (Q1 uint_array_tuple) (R1 uint_array_tuple_array_tuple) (S1 Int) (T1 uint_array_tuple) (U1 Int) (V1 Int) (W1 Bool) (X1 state_type) (Y1 state_type) (Z1 Int) (A2 tx_type) (B2 Int) (C2 Int) (D2 Int) (E2 Int) (F2 Int) (G2 Int) ) - (=> - (and - (block_44_h_149_335_0 I Z1 C H A2 X1 A D D2 F2 B2 Y1 B E E2 G2 C2) - (let ((a!1 (= G - (uint_array_tuple_array_tuple - (store (uint_array_tuple_array_tuple_accessor_array L1) N1 P1) - (uint_array_tuple_array_tuple_accessor_length L1)))) - (a!2 (store (uint_array_tuple_array_tuple_accessor_array A1) - C1 - (uint_array_tuple (store (uint_array_tuple_accessor_array E1) - D1 - J1) - (uint_array_tuple_accessor_length E1))))) - (and (not (= (<= X T) Y)) - (= W1 (= U1 V1)) - (= Z E) - (= A1 E) - (= U E) - (= Q E) - (= B1 F) - (= M1 G) - a!1 - (= F - (uint_array_tuple_array_tuple - a!2 - (uint_array_tuple_array_tuple_accessor_length A1))) - (= L1 F) - (= K1 F) - (= R1 G) - (= W (select (uint_array_tuple_array_tuple_accessor_array E) V)) - (= E1 (select (uint_array_tuple_array_tuple_accessor_array E) C1)) - (= P1 (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - (= Q1 (select (uint_array_tuple_array_tuple_accessor_array L1) N1)) - (= F1 (select (uint_array_tuple_array_tuple_accessor_array A1) C1)) - (= O1 (select (uint_array_tuple_array_tuple_accessor_array F) N1)) - (= T1 (select (uint_array_tuple_array_tuple_accessor_array G) S1)) - (= V E2) - (= G1 (select (uint_array_tuple_accessor_array E1) D1)) - (= U1 (uint_array_tuple_accessor_length T1)) - (= D1 G2) - (= C1 E2) - (= O N) - (= P E2) - (= K J) - (= J I) - (= L K) - (= R (uint_array_tuple_array_tuple_accessor_length Q)) - (= N M) - (= M L) - (= T G2) - (= I1 C2) - (= H1 (select (uint_array_tuple_accessor_array E1) D1)) - (= X (uint_array_tuple_accessor_length W)) - (= N1 E2) - (= J1 I1) - (= S1 E2) - (= V1 0) - (>= (uint_array_tuple_accessor_length W) 0) - (>= (uint_array_tuple_accessor_length E1) 0) - (>= (uint_array_tuple_accessor_length O1) 0) - (>= (uint_array_tuple_accessor_length T1) 0) - (>= V 0) - (>= G1 0) - (>= U1 0) - (>= D1 0) - (>= C1 0) - (>= P 0) - (>= R 0) - (>= T 0) - (>= C2 0) - (>= I1 0) - (>= H1 0) - (>= X 0) - (>= N1 0) - (>= J1 0) - (>= S1 0) - (>= G2 0) - (>= E2 0) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= C1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= P - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= C2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= X - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (= S true) - (= Y true) - (not (= (<= R P) S)))) - ) - (block_45_return_function_h__150_335_0 - O - Z1 - C - H - A2 - X1 - A - D - D2 - F2 - B2 - Y1 - B - G - E2 - G2 - C2) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - true - ) - (block_52_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C uint_array_tuple) (D abi_type) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L state_type) (M state_type) (N state_type) (O state_type) (P Int) (Q tx_type) (R Int) (S Int) (T Int) (U Int) (V Int) (W Int) (X Int) (Y Int) (Z Int) ) - (=> - (and - (block_52_function_h__150_335_0 I P D H Q L A E U X R M B F V Y S) - (summary_11_function_h__150_335_0 J P D H Q N B F V Y S O C G W Z T) - (let ((a!1 (store (balances M) P (+ (select (balances M) P) K))) - (a!2 (= (select (bytes_tuple_accessor_array (msg.data Q)) 3) 47)) - (a!3 (= (select (bytes_tuple_accessor_array (msg.data Q)) 2) 58)) - (a!4 (= (select (bytes_tuple_accessor_array (msg.data Q)) 1) 197)) - (a!5 (= (select (bytes_tuple_accessor_array (msg.data Q)) 0) 122)) - (a!6 (>= (+ (select (balances M) P) K) 0)) - (a!7 (<= (+ (select (balances M) P) K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935))) - (and (= B A) - (= N (state_type a!1)) - (= M L) - a!2 - a!3 - a!4 - a!5 - (= (msg.value Q) 0) - (= (msg.sig Q) 2059745839) - (= V U) - (= I 0) - (= S R) - (= Y X) - (>= (tx.origin Q) 0) - (>= (tx.gasprice Q) 0) - (>= (msg.value Q) 0) - (>= (msg.sender Q) 0) - (>= (block.timestamp Q) 0) - (>= (block.number Q) 0) - (>= (block.gaslimit Q) 0) - (>= (block.difficulty Q) 0) - (>= (block.coinbase Q) 0) - (>= (block.chainid Q) 0) - (>= (block.basefee Q) 0) - (>= (bytes_tuple_accessor_length (msg.data Q)) 4) - a!6 - (>= K (msg.value Q)) - (<= (tx.origin Q) 1461501637330902918203684832716283019655932542975) - (<= (tx.gasprice Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.value Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.sender Q) 1461501637330902918203684832716283019655932542975) - (<= (block.timestamp Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.number Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.gaslimit Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.difficulty Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.coinbase Q) 1461501637330902918203684832716283019655932542975) - (<= (block.chainid Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.basefee Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - a!7 - (= F E))) - ) - (summary_12_function_h__150_335_0 J P D H Q L A E U X R O C G W Z T) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - true - ) - (block_53_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_53_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - (and (= B A) (= I H) (= M L) (= Q P) (= O N) (= G 0) (= E D)) - ) - (block_54_i_204_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J uint_array_tuple_array_tuple) (K Int) (L Bool) (M Int) (N uint_array_tuple_array_tuple) (O Int) (P state_type) (Q state_type) (R Int) (S tx_type) (T Int) (U Int) (V Int) (W Int) (X Int) (Y Int) ) - (=> - (and - (block_54_i_204_335_0 G R C F S P A D V X T Q B E W Y U) - (and (= J E) - (= N E) - (= M Y) - (= K (uint_array_tuple_array_tuple_accessor_length J)) - (= H 17) - (= I W) - (= O W) - (>= M 0) - (>= U 0) - (>= K 0) - (>= I 0) - (>= Y 0) - (>= W 0) - (>= O 0) - (<= M - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 O)) (>= O (uint_array_tuple_array_tuple_accessor_length N))) - (= L true) - (not (= (<= K I) L))) - ) - (block_56_function_i__205_335_0 H R C F S P A D V X T Q B E W Y U) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_56_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_13_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_57_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_13_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_58_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_13_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_59_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_13_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_60_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_13_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_61_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_13_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_55_return_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - true - ) - (summary_13_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J Int) (K uint_array_tuple_array_tuple) (L Int) (M Bool) (N Int) (O uint_array_tuple_array_tuple) (P Int) (Q uint_array_tuple) (R Int) (S Bool) (T uint_array_tuple_array_tuple) (U Int) (V Int) (W state_type) (X state_type) (Y Int) (Z tx_type) (A1 Int) (B1 Int) (C1 Int) (D1 Int) (E1 Int) (F1 Int) ) - (=> - (and - (block_54_i_204_335_0 G Y C F Z W A D C1 E1 A1 X B E D1 F1 B1) - (and (not (= (<= R N) S)) - (= T E) - (= O E) - (= K E) - (= Q (select (uint_array_tuple_array_tuple_accessor_array E) P)) - (= L (uint_array_tuple_array_tuple_accessor_length K)) - (= H G) - (= N F1) - (= I 18) - (= R (uint_array_tuple_accessor_length Q)) - (= J D1) - (= U D1) - (= P D1) - (= V B1) - (>= (uint_array_tuple_accessor_length Q) 0) - (>= L 0) - (>= B1 0) - (>= N 0) - (>= R 0) - (>= J 0) - (>= U 0) - (>= P 0) - (>= F1 0) - (>= D1 0) - (>= V 0) - (<= L - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= B1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= P - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 U)) (>= U (uint_array_tuple_array_tuple_accessor_length T))) - (= M true) - (= S true) - (not (= (<= L J) M))) - ) - (block_57_function_i__205_335_0 I Y C F Z W A D C1 E1 A1 X B E D1 F1 B1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J Int) (K Int) (L uint_array_tuple_array_tuple) (M Int) (N Bool) (O Int) (P uint_array_tuple_array_tuple) (Q Int) (R uint_array_tuple) (S Int) (T Bool) (U uint_array_tuple_array_tuple) (V Int) (W Int) (X uint_array_tuple) (Y Int) (Z state_type) (A1 state_type) (B1 Int) (C1 tx_type) (D1 Int) (E1 Int) (F1 Int) (G1 Int) (H1 Int) (I1 Int) ) - (=> - (and - (block_54_i_204_335_0 G B1 C F C1 Z A D F1 H1 D1 A1 B E G1 I1 E1) - (and (not (= (<= S O) T)) - (= P E) - (= L E) - (= U E) - (= X (select (uint_array_tuple_array_tuple_accessor_array E) V)) - (= R (select (uint_array_tuple_array_tuple_accessor_array E) Q)) - (= I H) - (= W I1) - (= V G1) - (= O I1) - (= K G1) - (= J 19) - (= Q G1) - (= H G) - (= M (uint_array_tuple_array_tuple_accessor_length L)) - (= S (uint_array_tuple_accessor_length R)) - (= Y E1) - (>= (uint_array_tuple_accessor_length X) 0) - (>= (uint_array_tuple_accessor_length R) 0) - (>= W 0) - (>= V 0) - (>= O 0) - (>= E1 0) - (>= K 0) - (>= Q 0) - (>= M 0) - (>= S 0) - (>= I1 0) - (>= G1 0) - (>= Y 0) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Q - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 W)) (>= W (uint_array_tuple_accessor_length X))) - (= T true) - (= N true) - (not (= (<= M K) N))) - ) - (block_58_function_i__205_335_0 J B1 C F C1 Z A D F1 H1 D1 A1 B E G1 I1 E1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G crypto_type) (H Int) (I Int) (J Int) (K Int) (L Int) (M Int) (N uint_array_tuple_array_tuple) (O Int) (P Bool) (Q Int) (R uint_array_tuple_array_tuple) (S Int) (T uint_array_tuple) (U Int) (V Bool) (W uint_array_tuple_array_tuple) (X uint_array_tuple_array_tuple) (Y uint_array_tuple_array_tuple) (Z Int) (A1 Int) (B1 uint_array_tuple) (C1 uint_array_tuple) (D1 Int) (E1 Int) (F1 Int) (G1 Int) (H1 Int) (I1 uint_array_tuple_array_tuple) (J1 Int) (K1 Bool) (L1 uint_array_tuple_array_tuple) (M1 Int) (N1 state_type) (O1 state_type) (P1 Int) (Q1 tx_type) (R1 Int) (S1 Int) (T1 Int) (U1 Int) (V1 Int) (W1 Int) ) - (=> - (and - (block_54_i_204_335_0 H P1 C G Q1 N1 A D T1 V1 R1 O1 B E U1 W1 S1) - (let ((a!1 (store (uint_array_tuple_array_tuple_accessor_array X) - Z - (uint_array_tuple (store (uint_array_tuple_accessor_array B1) - A1 - G1) - (uint_array_tuple_accessor_length B1))))) - (and (not (= (<= O M) P)) - (not (= (<= U Q) V)) - (= W E) - (= F - (uint_array_tuple_array_tuple - a!1 - (uint_array_tuple_array_tuple_accessor_length X))) - (= X E) - (= Y F) - (= R E) - (= N E) - (= I1 F) - (= L1 F) - (= T (select (uint_array_tuple_array_tuple_accessor_array E) S)) - (= B1 (select (uint_array_tuple_array_tuple_accessor_array E) Z)) - (= C1 (select (uint_array_tuple_array_tuple_accessor_array X) Z)) - (= K J) - (= L 20) - (= J1 (uint_array_tuple_array_tuple_accessor_length I1)) - (= S U1) - (= O (uint_array_tuple_array_tuple_accessor_length N)) - (= Q W1) - (= J I) - (= I H) - (= M U1) - (= E1 (select (uint_array_tuple_accessor_array B1) A1)) - (= D1 (select (uint_array_tuple_accessor_array B1) A1)) - (= Z U1) - (= U (uint_array_tuple_accessor_length T)) - (= F1 S1) - (= A1 W1) - (= H1 W1) - (= G1 F1) - (= M1 W1) - (>= (uint_array_tuple_accessor_length T) 0) - (>= (uint_array_tuple_accessor_length B1) 0) - (>= J1 0) - (>= S 0) - (>= O 0) - (>= Q 0) - (>= S1 0) - (>= M 0) - (>= E1 0) - (>= D1 0) - (>= Z 0) - (>= U 0) - (>= F1 0) - (>= A1 0) - (>= H1 0) - (>= G1 0) - (>= W1 0) - (>= U1 0) - (>= M1 0) - (<= J1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Q - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Z - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= A1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 M1)) - (>= M1 (uint_array_tuple_array_tuple_accessor_length L1))) - (= P true) - (= V true) - (= K1 true) - (not (= (<= J1 H1) K1)))) - ) - (block_59_function_i__205_335_0 L P1 C G Q1 N1 A D T1 V1 R1 O1 B F U1 W1 S1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L Int) (M Int) (N Int) (O Int) (P uint_array_tuple_array_tuple) (Q Int) (R Bool) (S Int) (T uint_array_tuple_array_tuple) (U Int) (V uint_array_tuple) (W Int) (X Bool) (Y uint_array_tuple_array_tuple) (Z uint_array_tuple_array_tuple) (A1 uint_array_tuple_array_tuple) (B1 Int) (C1 Int) (D1 uint_array_tuple) (E1 uint_array_tuple) (F1 Int) (G1 Int) (H1 Int) (I1 Int) (J1 Int) (K1 uint_array_tuple_array_tuple) (L1 Int) (M1 Bool) (N1 uint_array_tuple_array_tuple) (O1 uint_array_tuple_array_tuple) (P1 uint_array_tuple_array_tuple) (Q1 Int) (R1 uint_array_tuple) (S1 uint_array_tuple) (T1 uint_array_tuple) (U1 uint_array_tuple_array_tuple) (V1 Int) (W1 state_type) (X1 state_type) (Y1 Int) (Z1 tx_type) (A2 Int) (B2 Int) (C2 Int) (D2 Int) (E2 Int) (F2 Int) ) - (=> - (and - (block_54_i_204_335_0 I Y1 C H Z1 W1 A D C2 E2 A2 X1 B E D2 F2 B2) - (let ((a!1 (store (uint_array_tuple_array_tuple_accessor_array Z) - B1 - (uint_array_tuple (store (uint_array_tuple_accessor_array D1) - C1 - I1) - (uint_array_tuple_accessor_length D1)))) - (a!2 (= G - (uint_array_tuple_array_tuple - (store (uint_array_tuple_array_tuple_accessor_array O1) Q1 S1) - (uint_array_tuple_array_tuple_accessor_length O1))))) - (and (not (= (<= Q O) R)) - (not (= (<= W S) X)) - (= Y E) - (= Z E) - (= T E) - (= P E) - (= A1 F) - (= N1 F) - (= O1 F) - (= F - (uint_array_tuple_array_tuple - a!1 - (uint_array_tuple_array_tuple_accessor_length Z))) - a!2 - (= K1 F) - (= P1 G) - (= U1 G) - (= V (select (uint_array_tuple_array_tuple_accessor_array E) U)) - (= D1 (select (uint_array_tuple_array_tuple_accessor_array E) B1)) - (= E1 (select (uint_array_tuple_array_tuple_accessor_array Z) B1)) - (= T1 (select (uint_array_tuple_array_tuple_accessor_array O1) Q1)) - (= S1 (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - (= R1 (select (uint_array_tuple_array_tuple_accessor_array F) Q1)) - (= U D2) - (= F1 (select (uint_array_tuple_accessor_array D1) C1)) - (= C1 F2) - (= B1 D2) - (= N 21) - (= O D2) - (= J I) - (= L1 (uint_array_tuple_array_tuple_accessor_length K1)) - (= K J) - (= Q (uint_array_tuple_array_tuple_accessor_length P)) - (= M L) - (= L K) - (= S F2) - (= H1 B2) - (= G1 (select (uint_array_tuple_accessor_array D1) C1)) - (= W (uint_array_tuple_accessor_length V)) - (= I1 H1) - (= J1 F2) - (= Q1 F2) - (= V1 F2) - (>= (uint_array_tuple_accessor_length V) 0) - (>= (uint_array_tuple_accessor_length D1) 0) - (>= (uint_array_tuple_accessor_length R1) 0) - (>= U 0) - (>= F1 0) - (>= C1 0) - (>= B1 0) - (>= O 0) - (>= L1 0) - (>= Q 0) - (>= S 0) - (>= B2 0) - (>= H1 0) - (>= G1 0) - (>= W 0) - (>= I1 0) - (>= J1 0) - (>= Q1 0) - (>= F2 0) - (>= D2 0) - (>= V1 0) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= C1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= B1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= L1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Q - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= B2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Q1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 V1)) - (>= V1 (uint_array_tuple_array_tuple_accessor_length U1))) - (= R true) - (= X true) - (= M1 true) - (not (= (<= L1 J1) M1)))) - ) - (block_60_function_i__205_335_0 N Y1 C H Z1 W1 A D C2 E2 A2 X1 B G D2 F2 B2) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L Int) (M Int) (N Int) (O Int) (P Int) (Q uint_array_tuple_array_tuple) (R Int) (S Bool) (T Int) (U uint_array_tuple_array_tuple) (V Int) (W uint_array_tuple) (X Int) (Y Bool) (Z uint_array_tuple_array_tuple) (A1 uint_array_tuple_array_tuple) (B1 uint_array_tuple_array_tuple) (C1 Int) (D1 Int) (E1 uint_array_tuple) (F1 uint_array_tuple) (G1 Int) (H1 Int) (I1 Int) (J1 Int) (K1 Int) (L1 uint_array_tuple_array_tuple) (M1 Int) (N1 Bool) (O1 uint_array_tuple_array_tuple) (P1 uint_array_tuple_array_tuple) (Q1 uint_array_tuple_array_tuple) (R1 Int) (S1 uint_array_tuple) (T1 uint_array_tuple) (U1 uint_array_tuple) (V1 uint_array_tuple_array_tuple) (W1 Int) (X1 uint_array_tuple) (Y1 Int) (Z1 Int) (A2 Bool) (B2 state_type) (C2 state_type) (D2 Int) (E2 tx_type) (F2 Int) (G2 Int) (H2 Int) (I2 Int) (J2 Int) (K2 Int) ) - (=> - (and - (block_54_i_204_335_0 I D2 C H E2 B2 A D H2 J2 F2 C2 B E I2 K2 G2) - (let ((a!1 (store (uint_array_tuple_array_tuple_accessor_array A1) - C1 - (uint_array_tuple (store (uint_array_tuple_accessor_array E1) - D1 - J1) - (uint_array_tuple_accessor_length E1)))) - (a!2 (= G - (uint_array_tuple_array_tuple - (store (uint_array_tuple_array_tuple_accessor_array P1) R1 T1) - (uint_array_tuple_array_tuple_accessor_length P1))))) - (and (not (= (<= X T) Y)) - (not (= (<= M1 K1) N1)) - (= A2 (= Y1 Z1)) - (= U E) - (= L1 F) - (= Q1 G) - (= F - (uint_array_tuple_array_tuple - a!1 - (uint_array_tuple_array_tuple_accessor_length A1))) - a!2 - (= Q E) - (= Z E) - (= A1 E) - (= B1 F) - (= P1 F) - (= O1 F) - (= V1 G) - (= F1 (select (uint_array_tuple_array_tuple_accessor_array A1) C1)) - (= T1 (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - (= U1 (select (uint_array_tuple_array_tuple_accessor_array P1) R1)) - (= W (select (uint_array_tuple_array_tuple_accessor_array E) V)) - (= E1 (select (uint_array_tuple_array_tuple_accessor_array E) C1)) - (= S1 (select (uint_array_tuple_array_tuple_accessor_array F) R1)) - (= X1 (select (uint_array_tuple_array_tuple_accessor_array G) W1)) - (= K1 K2) - (= Y1 (uint_array_tuple_accessor_length X1)) - (= H1 (select (uint_array_tuple_accessor_array E1) D1)) - (= G1 (select (uint_array_tuple_accessor_array E1) D1)) - (= L K) - (= C1 I2) - (= T K2) - (= M L) - (= J I) - (= O 22) - (= N M) - (= K J) - (= D1 K2) - (= P I2) - (= V I2) - (= R (uint_array_tuple_array_tuple_accessor_length Q)) - (= X (uint_array_tuple_accessor_length W)) - (= M1 (uint_array_tuple_array_tuple_accessor_length L1)) - (= R1 K2) - (= J1 I1) - (= I1 G2) - (= W1 K2) - (= Z1 0) - (>= (uint_array_tuple_accessor_length W) 0) - (>= (uint_array_tuple_accessor_length E1) 0) - (>= (uint_array_tuple_accessor_length S1) 0) - (>= (uint_array_tuple_accessor_length X1) 0) - (>= K1 0) - (>= Y1 0) - (>= H1 0) - (>= G1 0) - (>= C1 0) - (>= T 0) - (>= D1 0) - (>= P 0) - (>= V 0) - (>= R 0) - (>= X 0) - (>= G2 0) - (>= M1 0) - (>= R1 0) - (>= J1 0) - (>= I1 0) - (>= W1 0) - (>= K2 0) - (>= I2 0) - (<= K1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= C1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= P - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= X - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (= S true) - (= Y true) - (= N1 true) - (not A2) - (not (= (<= R P) S)))) - ) - (block_61_function_i__205_335_0 O D2 C H E2 B2 A D H2 J2 F2 C2 B G I2 K2 G2) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L Int) (M Int) (N Int) (O Int) (P Int) (Q uint_array_tuple_array_tuple) (R Int) (S Bool) (T Int) (U uint_array_tuple_array_tuple) (V Int) (W uint_array_tuple) (X Int) (Y Bool) (Z uint_array_tuple_array_tuple) (A1 uint_array_tuple_array_tuple) (B1 uint_array_tuple_array_tuple) (C1 Int) (D1 Int) (E1 uint_array_tuple) (F1 uint_array_tuple) (G1 Int) (H1 Int) (I1 Int) (J1 Int) (K1 Int) (L1 uint_array_tuple_array_tuple) (M1 Int) (N1 Bool) (O1 uint_array_tuple_array_tuple) (P1 uint_array_tuple_array_tuple) (Q1 uint_array_tuple_array_tuple) (R1 Int) (S1 uint_array_tuple) (T1 uint_array_tuple) (U1 uint_array_tuple) (V1 uint_array_tuple_array_tuple) (W1 Int) (X1 uint_array_tuple) (Y1 Int) (Z1 Int) (A2 Bool) (B2 state_type) (C2 state_type) (D2 Int) (E2 tx_type) (F2 Int) (G2 Int) (H2 Int) (I2 Int) (J2 Int) (K2 Int) ) - (=> - (and - (block_54_i_204_335_0 I D2 C H E2 B2 A D H2 J2 F2 C2 B E I2 K2 G2) - (let ((a!1 (store (uint_array_tuple_array_tuple_accessor_array A1) - C1 - (uint_array_tuple (store (uint_array_tuple_accessor_array E1) - D1 - J1) - (uint_array_tuple_accessor_length E1)))) - (a!2 (= G - (uint_array_tuple_array_tuple - (store (uint_array_tuple_array_tuple_accessor_array P1) R1 T1) - (uint_array_tuple_array_tuple_accessor_length P1))))) - (and (not (= (<= X T) Y)) - (not (= (<= M1 K1) N1)) - (= A2 (= Y1 Z1)) - (= U E) - (= L1 F) - (= Q1 G) - (= F - (uint_array_tuple_array_tuple - a!1 - (uint_array_tuple_array_tuple_accessor_length A1))) - a!2 - (= Q E) - (= Z E) - (= A1 E) - (= B1 F) - (= P1 F) - (= O1 F) - (= V1 G) - (= F1 (select (uint_array_tuple_array_tuple_accessor_array A1) C1)) - (= T1 (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - (= U1 (select (uint_array_tuple_array_tuple_accessor_array P1) R1)) - (= W (select (uint_array_tuple_array_tuple_accessor_array E) V)) - (= E1 (select (uint_array_tuple_array_tuple_accessor_array E) C1)) - (= S1 (select (uint_array_tuple_array_tuple_accessor_array F) R1)) - (= X1 (select (uint_array_tuple_array_tuple_accessor_array G) W1)) - (= K1 K2) - (= Y1 (uint_array_tuple_accessor_length X1)) - (= H1 (select (uint_array_tuple_accessor_array E1) D1)) - (= G1 (select (uint_array_tuple_accessor_array E1) D1)) - (= L K) - (= C1 I2) - (= T K2) - (= M L) - (= J I) - (= O N) - (= N M) - (= K J) - (= D1 K2) - (= P I2) - (= V I2) - (= R (uint_array_tuple_array_tuple_accessor_length Q)) - (= X (uint_array_tuple_accessor_length W)) - (= M1 (uint_array_tuple_array_tuple_accessor_length L1)) - (= R1 K2) - (= J1 I1) - (= I1 G2) - (= W1 K2) - (= Z1 0) - (>= (uint_array_tuple_accessor_length W) 0) - (>= (uint_array_tuple_accessor_length E1) 0) - (>= (uint_array_tuple_accessor_length S1) 0) - (>= (uint_array_tuple_accessor_length X1) 0) - (>= K1 0) - (>= Y1 0) - (>= H1 0) - (>= G1 0) - (>= C1 0) - (>= T 0) - (>= D1 0) - (>= P 0) - (>= V 0) - (>= R 0) - (>= X 0) - (>= G2 0) - (>= M1 0) - (>= R1 0) - (>= J1 0) - (>= I1 0) - (>= W1 0) - (>= K2 0) - (>= I2 0) - (<= K1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= C1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= P - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= X - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (= S true) - (= Y true) - (= N1 true) - (not (= (<= R P) S)))) - ) - (block_55_return_function_i__205_335_0 - O - D2 - C - H - E2 - B2 - A - D - H2 - J2 - F2 - C2 - B - G - I2 - K2 - G2) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - true - ) - (block_62_function_i__205_335_0 G J C F K H A D N P L I B E O Q M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C uint_array_tuple) (D abi_type) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L state_type) (M state_type) (N state_type) (O state_type) (P Int) (Q tx_type) (R Int) (S Int) (T Int) (U Int) (V Int) (W Int) (X Int) (Y Int) (Z Int) ) - (=> - (and - (block_62_function_i__205_335_0 I P D H Q L A E U X R M B F V Y S) - (summary_13_function_i__205_335_0 J P D H Q N B F V Y S O C G W Z T) - (let ((a!1 (store (balances M) P (+ (select (balances M) P) K))) - (a!2 (= (select (bytes_tuple_accessor_array (msg.data Q)) 3) 27)) - (a!3 (= (select (bytes_tuple_accessor_array (msg.data Q)) 2) 241)) - (a!4 (= (select (bytes_tuple_accessor_array (msg.data Q)) 1) 63)) - (a!5 (= (select (bytes_tuple_accessor_array (msg.data Q)) 0) 53)) - (a!6 (>= (+ (select (balances M) P) K) 0)) - (a!7 (<= (+ (select (balances M) P) K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935))) - (and (= B A) - (= N (state_type a!1)) - (= M L) - a!2 - a!3 - a!4 - a!5 - (= (msg.value Q) 0) - (= (msg.sig Q) 893382939) - (= V U) - (= I 0) - (= S R) - (= Y X) - (>= (tx.origin Q) 0) - (>= (tx.gasprice Q) 0) - (>= (msg.value Q) 0) - (>= (msg.sender Q) 0) - (>= (block.timestamp Q) 0) - (>= (block.number Q) 0) - (>= (block.gaslimit Q) 0) - (>= (block.difficulty Q) 0) - (>= (block.coinbase Q) 0) - (>= (block.chainid Q) 0) - (>= (block.basefee Q) 0) - (>= (bytes_tuple_accessor_length (msg.data Q)) 4) - a!6 - (>= K (msg.value Q)) - (<= (tx.origin Q) 1461501637330902918203684832716283019655932542975) - (<= (tx.gasprice Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.value Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.sender Q) 1461501637330902918203684832716283019655932542975) - (<= (block.timestamp Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.number Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.gaslimit Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.difficulty Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.coinbase Q) 1461501637330902918203684832716283019655932542975) - (<= (block.chainid Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.basefee Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - a!7 - (= F E))) - ) - (summary_14_function_i__205_335_0 J P D H Q L A E U X R O C G W Z T) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R Int) (S Int) ) - (=> - (and - true - ) - (block_63_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R Int) (S Int) ) - (=> - (and - (block_63_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - (and (= B A) (= I H) (= G 0) (= O N) (= S R) (= Q P) (= M L) (= E D)) - ) - (block_64_j_278_335_0 G J C F K H A D N P R L I B E O Q S M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J uint_array_tuple_array_tuple) (K Int) (L Bool) (M Int) (N uint_array_tuple_array_tuple) (O Int) (P state_type) (Q state_type) (R Int) (S tx_type) (T Int) (U Int) (V Int) (W Int) (X Int) (Y Int) (Z Int) (A1 Int) ) - (=> - (and - (block_64_j_278_335_0 G R C F S P A D V X Z T Q B E W Y A1 U) - (and (= N E) - (= J E) - (= O W) - (= I W) - (= H 24) - (= M Y) - (= K (uint_array_tuple_array_tuple_accessor_length J)) - (>= O 0) - (>= W 0) - (>= I 0) - (>= M 0) - (>= K 0) - (>= A1 0) - (>= Y 0) - (>= U 0) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= A1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 O)) (>= O (uint_array_tuple_array_tuple_accessor_length N))) - (= L true) - (not (= (<= K I) L))) - ) - (block_66_function_j__279_335_0 H R C F S P A D V X Z T Q B E W Y A1 U) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R Int) (S Int) ) - (=> - (and - (block_66_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - true - ) - (summary_15_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R Int) (S Int) ) - (=> - (and - (block_67_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - true - ) - (summary_15_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R Int) (S Int) ) - (=> - (and - (block_68_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - true - ) - (summary_15_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R Int) (S Int) ) - (=> - (and - (block_69_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - true - ) - (summary_15_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R Int) (S Int) ) - (=> - (and - (block_70_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - true - ) - (summary_15_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R Int) (S Int) ) - (=> - (and - (block_71_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - true - ) - (summary_15_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R Int) (S Int) ) - (=> - (and - (block_72_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - true - ) - (summary_15_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R Int) (S Int) ) - (=> - (and - (block_73_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - true - ) - (summary_15_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R Int) (S Int) ) - (=> - (and - (block_65_return_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - true - ) - (summary_15_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J Int) (K uint_array_tuple_array_tuple) (L Int) (M Bool) (N Int) (O uint_array_tuple_array_tuple) (P Int) (Q uint_array_tuple) (R Int) (S Bool) (T uint_array_tuple_array_tuple) (U Int) (V Int) (W state_type) (X state_type) (Y Int) (Z tx_type) (A1 Int) (B1 Int) (C1 Int) (D1 Int) (E1 Int) (F1 Int) (G1 Int) (H1 Int) ) - (=> - (and - (block_64_j_278_335_0 G Y C F Z W A D C1 E1 G1 A1 X B E D1 F1 H1 B1) - (and (not (= (<= R N) S)) - (= O E) - (= K E) - (= T E) - (= Q (select (uint_array_tuple_array_tuple_accessor_array E) P)) - (= H G) - (= V B1) - (= U D1) - (= N F1) - (= J D1) - (= I 25) - (= P D1) - (= L (uint_array_tuple_array_tuple_accessor_length K)) - (= R (uint_array_tuple_accessor_length Q)) - (>= (uint_array_tuple_accessor_length Q) 0) - (>= V 0) - (>= U 0) - (>= N 0) - (>= D1 0) - (>= J 0) - (>= P 0) - (>= L 0) - (>= R 0) - (>= H1 0) - (>= F1 0) - (>= B1 0) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= P - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= L - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= B1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 U)) (>= U (uint_array_tuple_array_tuple_accessor_length T))) - (= S true) - (= M true) - (not (= (<= L J) M))) - ) - (block_67_function_j__279_335_0 I Y C F Z W A D C1 E1 G1 A1 X B E D1 F1 H1 B1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J Int) (K Int) (L uint_array_tuple_array_tuple) (M Int) (N Bool) (O Int) (P uint_array_tuple_array_tuple) (Q Int) (R uint_array_tuple) (S Int) (T Bool) (U uint_array_tuple_array_tuple) (V Int) (W Int) (X uint_array_tuple) (Y Int) (Z state_type) (A1 state_type) (B1 Int) (C1 tx_type) (D1 Int) (E1 Int) (F1 Int) (G1 Int) (H1 Int) (I1 Int) (J1 Int) (K1 Int) ) - (=> - (and - (block_64_j_278_335_0 G B1 C F C1 Z A D F1 H1 J1 D1 A1 B E G1 I1 K1 E1) - (and (not (= (<= S O) T)) - (= L E) - (= P E) - (= U E) - (= R (select (uint_array_tuple_array_tuple_accessor_array E) Q)) - (= X (select (uint_array_tuple_array_tuple_accessor_array E) V)) - (= K G1) - (= Y E1) - (= H G) - (= Q G1) - (= M (uint_array_tuple_array_tuple_accessor_length L)) - (= S (uint_array_tuple_accessor_length R)) - (= J 26) - (= I H) - (= W I1) - (= O I1) - (= V G1) - (>= (uint_array_tuple_accessor_length R) 0) - (>= (uint_array_tuple_accessor_length X) 0) - (>= K 0) - (>= Y 0) - (>= Q 0) - (>= G1 0) - (>= M 0) - (>= S 0) - (>= W 0) - (>= O 0) - (>= V 0) - (>= K1 0) - (>= I1 0) - (>= E1 0) - (<= K - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Q - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 W)) (>= W (uint_array_tuple_accessor_length X))) - (= T true) - (= N true) - (not (= (<= M K) N))) - ) - (block_68_function_j__279_335_0 - J - B1 - C - F - C1 - Z - A - D - F1 - H1 - J1 - D1 - A1 - B - E - G1 - I1 - K1 - E1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G crypto_type) (H Int) (I Int) (J Int) (K Int) (L Int) (M Int) (N uint_array_tuple_array_tuple) (O Int) (P Bool) (Q Int) (R uint_array_tuple_array_tuple) (S Int) (T uint_array_tuple) (U Int) (V Bool) (W uint_array_tuple_array_tuple) (X uint_array_tuple_array_tuple) (Y uint_array_tuple_array_tuple) (Z Int) (A1 Int) (B1 uint_array_tuple) (C1 uint_array_tuple) (D1 Int) (E1 Int) (F1 Int) (G1 Int) (H1 Int) (I1 uint_array_tuple_array_tuple) (J1 Int) (K1 Bool) (L1 uint_array_tuple_array_tuple) (M1 Int) (N1 state_type) (O1 state_type) (P1 Int) (Q1 tx_type) (R1 Int) (S1 Int) (T1 Int) (U1 Int) (V1 Int) (W1 Int) (X1 Int) (Y1 Int) ) - (=> - (and - (block_64_j_278_335_0 H P1 C G Q1 N1 A D T1 V1 X1 R1 O1 B E U1 W1 Y1 S1) - (let ((a!1 (store (uint_array_tuple_array_tuple_accessor_array X) - Z - (uint_array_tuple (store (uint_array_tuple_accessor_array B1) - A1 - G1) - (uint_array_tuple_accessor_length B1))))) - (and (not (= (<= O M) P)) - (not (= (<= J1 H1) K1)) - (= Y F) - (= R E) - (= X E) - (= L1 F) - (= F - (uint_array_tuple_array_tuple - a!1 - (uint_array_tuple_array_tuple_accessor_length X))) - (= N E) - (= W E) - (= I1 F) - (= T (select (uint_array_tuple_array_tuple_accessor_array E) S)) - (= B1 (select (uint_array_tuple_array_tuple_accessor_array E) Z)) - (= C1 (select (uint_array_tuple_array_tuple_accessor_array X) Z)) - (= I H) - (= M U1) - (= M1 Y1) - (= U (uint_array_tuple_accessor_length T)) - (= Q W1) - (= E1 (select (uint_array_tuple_accessor_array B1) A1)) - (= S U1) - (= J I) - (= L 27) - (= K J) - (= A1 W1) - (= Z U1) - (= O (uint_array_tuple_array_tuple_accessor_length N)) - (= G1 F1) - (= F1 S1) - (= H1 Y1) - (= D1 (select (uint_array_tuple_accessor_array B1) A1)) - (= J1 (uint_array_tuple_array_tuple_accessor_length I1)) - (>= (uint_array_tuple_accessor_length T) 0) - (>= (uint_array_tuple_accessor_length B1) 0) - (>= M 0) - (>= M1 0) - (>= U 0) - (>= Q 0) - (>= E1 0) - (>= S 0) - (>= U1 0) - (>= A1 0) - (>= Z 0) - (>= O 0) - (>= G1 0) - (>= F1 0) - (>= H1 0) - (>= D1 0) - (>= J1 0) - (>= Y1 0) - (>= W1 0) - (>= S1 0) - (<= M - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Q - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= A1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Z - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 M1)) - (>= M1 (uint_array_tuple_array_tuple_accessor_length L1))) - (= P true) - (= K1 true) - (= V true) - (not (= (<= U Q) V)))) - ) - (block_69_function_j__279_335_0 - L - P1 - C - G - Q1 - N1 - A - D - T1 - V1 - X1 - R1 - O1 - B - F - U1 - W1 - Y1 - S1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L Int) (M Int) (N Int) (O Int) (P uint_array_tuple_array_tuple) (Q Int) (R Bool) (S Int) (T uint_array_tuple_array_tuple) (U Int) (V uint_array_tuple) (W Int) (X Bool) (Y uint_array_tuple_array_tuple) (Z uint_array_tuple_array_tuple) (A1 uint_array_tuple_array_tuple) (B1 Int) (C1 Int) (D1 uint_array_tuple) (E1 uint_array_tuple) (F1 Int) (G1 Int) (H1 Int) (I1 Int) (J1 Int) (K1 uint_array_tuple_array_tuple) (L1 Int) (M1 Bool) (N1 uint_array_tuple_array_tuple) (O1 uint_array_tuple_array_tuple) (P1 uint_array_tuple_array_tuple) (Q1 Int) (R1 uint_array_tuple) (S1 uint_array_tuple) (T1 uint_array_tuple) (U1 Int) (V1 uint_array_tuple_array_tuple) (W1 Int) (X1 Bool) (Y1 Int) (Z1 uint_array_tuple_array_tuple) (A2 Int) (B2 state_type) (C2 state_type) (D2 Int) (E2 tx_type) (F2 Int) (G2 Int) (H2 Int) (I2 Int) (J2 Int) (K2 Int) (L2 Int) (M2 Int) ) - (=> - (and - (block_64_j_278_335_0 I D2 C H E2 B2 A D H2 J2 L2 F2 C2 B E I2 K2 M2 G2) - (let ((a!1 (store (uint_array_tuple_array_tuple_accessor_array Z) - B1 - (uint_array_tuple (store (uint_array_tuple_accessor_array D1) - C1 - I1) - (uint_array_tuple_accessor_length D1)))) - (a!2 (= G - (uint_array_tuple_array_tuple - (store (uint_array_tuple_array_tuple_accessor_array O1) Q1 S1) - (uint_array_tuple_array_tuple_accessor_length O1))))) - (and (not (= (<= Q O) R)) - (not (= (<= L1 J1) M1)) - (not (= (<= W1 U1) X1)) - (= A1 F) - (= Y E) - (= Z E) - (= N1 F) - (= O1 F) - (= Z1 G) - (= V1 G) - (= F - (uint_array_tuple_array_tuple - a!1 - (uint_array_tuple_array_tuple_accessor_length Z))) - a!2 - (= P E) - (= T E) - (= K1 F) - (= P1 G) - (= V (select (uint_array_tuple_array_tuple_accessor_array E) U)) - (= D1 (select (uint_array_tuple_array_tuple_accessor_array E) B1)) - (= R1 (select (uint_array_tuple_array_tuple_accessor_array F) Q1)) - (= E1 (select (uint_array_tuple_array_tuple_accessor_array Z) B1)) - (= T1 (select (uint_array_tuple_array_tuple_accessor_array O1) Q1)) - (= S1 (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - (= W (uint_array_tuple_accessor_length V)) - (= B1 I2) - (= A2 I2) - (= J1 M2) - (= I1 H1) - (= U I2) - (= N 28) - (= O I2) - (= L K) - (= J I) - (= Q (uint_array_tuple_array_tuple_accessor_length P)) - (= M L) - (= G1 (select (uint_array_tuple_accessor_array D1) C1)) - (= F1 (select (uint_array_tuple_accessor_array D1) C1)) - (= K J) - (= S K2) - (= H1 G2) - (= C1 K2) - (= U1 K2) - (= L1 (uint_array_tuple_array_tuple_accessor_length K1)) - (= Y1 I2) - (= Q1 M2) - (= W1 (uint_array_tuple_array_tuple_accessor_length V1)) - (>= (uint_array_tuple_accessor_length V) 0) - (>= (uint_array_tuple_accessor_length D1) 0) - (>= (uint_array_tuple_accessor_length R1) 0) - (>= W 0) - (>= B1 0) - (>= A2 0) - (>= J1 0) - (>= I1 0) - (>= U 0) - (>= O 0) - (>= Q 0) - (>= G1 0) - (>= F1 0) - (>= S 0) - (>= I2 0) - (>= H1 0) - (>= C1 0) - (>= U1 0) - (>= L1 0) - (>= Y1 0) - (>= Q1 0) - (>= W1 0) - (>= M2 0) - (>= K2 0) - (>= G2 0) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= B1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= A2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Q - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= C1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= L1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Q1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 A2)) - (>= A2 (uint_array_tuple_array_tuple_accessor_length Z1))) - (= R true) - (= X true) - (= M1 true) - (= X1 true) - (not (= (<= W S) X)))) - ) - (block_70_function_j__279_335_0 - N - D2 - C - H - E2 - B2 - A - D - H2 - J2 - L2 - F2 - C2 - B - G - I2 - K2 - M2 - G2) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L Int) (M Int) (N Int) (O Int) (P Int) (Q uint_array_tuple_array_tuple) (R Int) (S Bool) (T Int) (U uint_array_tuple_array_tuple) (V Int) (W uint_array_tuple) (X Int) (Y Bool) (Z uint_array_tuple_array_tuple) (A1 uint_array_tuple_array_tuple) (B1 uint_array_tuple_array_tuple) (C1 Int) (D1 Int) (E1 uint_array_tuple) (F1 uint_array_tuple) (G1 Int) (H1 Int) (I1 Int) (J1 Int) (K1 Int) (L1 uint_array_tuple_array_tuple) (M1 Int) (N1 Bool) (O1 uint_array_tuple_array_tuple) (P1 uint_array_tuple_array_tuple) (Q1 uint_array_tuple_array_tuple) (R1 Int) (S1 uint_array_tuple) (T1 uint_array_tuple) (U1 uint_array_tuple) (V1 Int) (W1 uint_array_tuple_array_tuple) (X1 Int) (Y1 Bool) (Z1 Int) (A2 uint_array_tuple_array_tuple) (B2 Int) (C2 uint_array_tuple) (D2 Int) (E2 Bool) (F2 uint_array_tuple_array_tuple) (G2 Int) (H2 state_type) (I2 state_type) (J2 Int) (K2 tx_type) (L2 Int) (M2 Int) (N2 Int) (O2 Int) (P2 Int) (Q2 Int) (R2 Int) (S2 Int) ) - (=> - (and - (block_64_j_278_335_0 I J2 C H K2 H2 A D N2 P2 R2 L2 I2 B E O2 Q2 S2 M2) - (let ((a!1 (= G - (uint_array_tuple_array_tuple - (store (uint_array_tuple_array_tuple_accessor_array P1) R1 T1) - (uint_array_tuple_array_tuple_accessor_length P1)))) - (a!2 (store (uint_array_tuple_array_tuple_accessor_array A1) - C1 - (uint_array_tuple (store (uint_array_tuple_accessor_array E1) - D1 - J1) - (uint_array_tuple_accessor_length E1))))) - (and (not (= (<= M1 K1) N1)) - (not (= (<= X T) Y)) - (not (= (<= X1 V1) Y1)) - (not (= (<= D2 Z1) E2)) - a!1 - (= L1 F) - (= B1 F) - (= F2 G) - (= A2 G) - (= Q E) - (= F - (uint_array_tuple_array_tuple - a!2 - (uint_array_tuple_array_tuple_accessor_length A1))) - (= U E) - (= Z E) - (= A1 E) - (= Q1 G) - (= P1 F) - (= O1 F) - (= W1 G) - (= U1 (select (uint_array_tuple_array_tuple_accessor_array P1) R1)) - (= C2 (select (uint_array_tuple_array_tuple_accessor_array G) B2)) - (= W (select (uint_array_tuple_array_tuple_accessor_array E) V)) - (= E1 (select (uint_array_tuple_array_tuple_accessor_array E) C1)) - (= F1 (select (uint_array_tuple_array_tuple_accessor_array A1) C1)) - (= T1 (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - (= S1 (select (uint_array_tuple_array_tuple_accessor_array F) R1)) - (= C1 O2) - (= G1 (select (uint_array_tuple_accessor_array E1) D1)) - (= H1 (select (uint_array_tuple_accessor_array E1) D1)) - (= G2 Q2) - (= J I) - (= K J) - (= T Q2) - (= K1 S2) - (= R (uint_array_tuple_array_tuple_accessor_length Q)) - (= P O2) - (= O 29) - (= V O2) - (= M1 (uint_array_tuple_array_tuple_accessor_length L1)) - (= X (uint_array_tuple_accessor_length W)) - (= L K) - (= M L) - (= N M) - (= D1 Q2) - (= J1 I1) - (= I1 M2) - (= Z1 O2) - (= V1 Q2) - (= R1 S2) - (= B2 O2) - (= X1 (uint_array_tuple_array_tuple_accessor_length W1)) - (= D2 (uint_array_tuple_accessor_length C2)) - (>= (uint_array_tuple_accessor_length C2) 0) - (>= (uint_array_tuple_accessor_length W) 0) - (>= (uint_array_tuple_accessor_length E1) 0) - (>= (uint_array_tuple_accessor_length S1) 0) - (>= C1 0) - (>= G1 0) - (>= H1 0) - (>= G2 0) - (>= T 0) - (>= K1 0) - (>= R 0) - (>= P 0) - (>= V 0) - (>= M1 0) - (>= X 0) - (>= D1 0) - (>= O2 0) - (>= J1 0) - (>= I1 0) - (>= Z1 0) - (>= V1 0) - (>= R1 0) - (>= B2 0) - (>= X1 0) - (>= D2 0) - (>= S2 0) - (>= Q2 0) - (>= M2 0) - (<= C1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= P - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= X - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Z1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= B2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= X1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Q2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 G2)) - (>= G2 (uint_array_tuple_array_tuple_accessor_length F2))) - (= S true) - (= Y true) - (= N1 true) - (= Y1 true) - (= E2 true) - (not (= (<= R P) S)))) - ) - (block_71_function_j__279_335_0 - O - J2 - C - H - K2 - H2 - A - D - N2 - P2 - R2 - L2 - I2 - B - G - O2 - Q2 - S2 - M2) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R uint_array_tuple_array_tuple) (S Int) (T Bool) (U Int) (V uint_array_tuple_array_tuple) (W Int) (X uint_array_tuple) (Y Int) (Z Bool) (A1 uint_array_tuple_array_tuple) (B1 uint_array_tuple_array_tuple) (C1 uint_array_tuple_array_tuple) (D1 Int) (E1 Int) (F1 uint_array_tuple) (G1 uint_array_tuple) (H1 Int) (I1 Int) (J1 Int) (K1 Int) (L1 Int) (M1 uint_array_tuple_array_tuple) (N1 Int) (O1 Bool) (P1 uint_array_tuple_array_tuple) (Q1 uint_array_tuple_array_tuple) (R1 uint_array_tuple_array_tuple) (S1 Int) (T1 uint_array_tuple) (U1 uint_array_tuple) (V1 uint_array_tuple) (W1 Int) (X1 uint_array_tuple_array_tuple) (Y1 Int) (Z1 Bool) (A2 Int) (B2 uint_array_tuple_array_tuple) (C2 Int) (D2 uint_array_tuple) (E2 Int) (F2 Bool) (G2 uint_array_tuple_array_tuple) (H2 Int) (I2 uint_array_tuple) (J2 Int) (K2 state_type) (L2 state_type) (M2 Int) (N2 tx_type) (O2 Int) (P2 Int) (Q2 Int) (R2 Int) (S2 Int) (T2 Int) (U2 Int) (V2 Int) ) - (=> - (and - (block_64_j_278_335_0 I M2 C H N2 K2 A D Q2 S2 U2 O2 L2 B E R2 T2 V2 P2) - (let ((a!1 (= G - (uint_array_tuple_array_tuple - (store (uint_array_tuple_array_tuple_accessor_array Q1) S1 U1) - (uint_array_tuple_array_tuple_accessor_length Q1)))) - (a!2 (store (uint_array_tuple_array_tuple_accessor_array B1) - D1 - (uint_array_tuple (store (uint_array_tuple_accessor_array F1) - E1 - K1) - (uint_array_tuple_accessor_length F1))))) - (and (not (= (<= S Q) T)) - (not (= (<= Y U) Z)) - (not (= (<= Y1 W1) Z1)) - (not (= (<= E2 A2) F2)) - (= P1 F) - (= A1 E) - (= X1 G) - (= Q1 F) - (= B2 G) - a!1 - (= V E) - (= R E) - (= F - (uint_array_tuple_array_tuple - a!2 - (uint_array_tuple_array_tuple_accessor_length B1))) - (= B1 E) - (= C1 F) - (= M1 F) - (= R1 G) - (= G2 G) - (= F1 (select (uint_array_tuple_array_tuple_accessor_array E) D1)) - (= T1 (select (uint_array_tuple_array_tuple_accessor_array F) S1)) - (= X (select (uint_array_tuple_array_tuple_accessor_array E) W)) - (= G1 (select (uint_array_tuple_array_tuple_accessor_array B1) D1)) - (= U1 (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - (= V1 (select (uint_array_tuple_array_tuple_accessor_array Q1) S1)) - (= D2 (select (uint_array_tuple_array_tuple_accessor_array G) C2)) - (= I2 (select (uint_array_tuple_array_tuple_accessor_array G) H2)) - (= J1 P2) - (= K1 J1) - (= J2 R2) - (= S1 V2) - (= D1 R2) - (= M L) - (= K J) - (= N M) - (= W R2) - (= N1 (uint_array_tuple_array_tuple_accessor_length M1)) - (= E1 T2) - (= U T2) - (= S (uint_array_tuple_array_tuple_accessor_length R)) - (= L K) - (= J I) - (= Y (uint_array_tuple_accessor_length X)) - (= O N) - (= P 30) - (= Q R2) - (= I1 (select (uint_array_tuple_accessor_array F1) E1)) - (= H1 (select (uint_array_tuple_accessor_array F1) E1)) - (= W1 T2) - (= L1 V2) - (= C2 R2) - (= Y1 (uint_array_tuple_array_tuple_accessor_length X1)) - (= H2 T2) - (= E2 (uint_array_tuple_accessor_length D2)) - (= A2 R2) - (>= (uint_array_tuple_accessor_length F1) 0) - (>= (uint_array_tuple_accessor_length T1) 0) - (>= (uint_array_tuple_accessor_length X) 0) - (>= (uint_array_tuple_accessor_length D2) 0) - (>= (uint_array_tuple_accessor_length I2) 0) - (>= J1 0) - (>= K1 0) - (>= J2 0) - (>= S1 0) - (>= D1 0) - (>= W 0) - (>= N1 0) - (>= E1 0) - (>= U 0) - (>= S 0) - (>= Y 0) - (>= Q 0) - (>= I1 0) - (>= H1 0) - (>= R2 0) - (>= W1 0) - (>= L1 0) - (>= C2 0) - (>= Y1 0) - (>= H2 0) - (>= E2 0) - (>= A2 0) - (>= V2 0) - (>= T2 0) - (>= P2 0) - (<= J1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Q - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= L1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= C2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= H2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= A2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= P2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 J2)) (>= J2 (uint_array_tuple_accessor_length I2))) - (= Z1 true) - (= F2 true) - (= O1 true) - (= T true) - (= Z true) - (not (= (<= N1 L1) O1)))) - ) - (block_72_function_j__279_335_0 - P - M2 - C - H - N2 - K2 - A - D - Q2 - S2 - U2 - O2 - L2 - B - G - R2 - T2 - V2 - P2) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R Int) (S uint_array_tuple_array_tuple) (T Int) (U Bool) (V Int) (W uint_array_tuple_array_tuple) (X Int) (Y uint_array_tuple) (Z Int) (A1 Bool) (B1 uint_array_tuple_array_tuple) (C1 uint_array_tuple_array_tuple) (D1 uint_array_tuple_array_tuple) (E1 Int) (F1 Int) (G1 uint_array_tuple) (H1 uint_array_tuple) (I1 Int) (J1 Int) (K1 Int) (L1 Int) (M1 Int) (N1 uint_array_tuple_array_tuple) (O1 Int) (P1 Bool) (Q1 uint_array_tuple_array_tuple) (R1 uint_array_tuple_array_tuple) (S1 uint_array_tuple_array_tuple) (T1 Int) (U1 uint_array_tuple) (V1 uint_array_tuple) (W1 uint_array_tuple) (X1 Int) (Y1 uint_array_tuple_array_tuple) (Z1 Int) (A2 Bool) (B2 Int) (C2 uint_array_tuple_array_tuple) (D2 Int) (E2 uint_array_tuple) (F2 Int) (G2 Bool) (H2 uint_array_tuple_array_tuple) (I2 Int) (J2 uint_array_tuple) (K2 Int) (L2 Int) (M2 Int) (N2 Bool) (O2 state_type) (P2 state_type) (Q2 Int) (R2 tx_type) (S2 Int) (T2 Int) (U2 Int) (V2 Int) (W2 Int) (X2 Int) (Y2 Int) (Z2 Int) ) - (=> - (and - (block_64_j_278_335_0 I Q2 C H R2 O2 A D U2 W2 Y2 S2 P2 B E V2 X2 Z2 T2) - (let ((a!1 (store (uint_array_tuple_array_tuple_accessor_array C1) - E1 - (uint_array_tuple (store (uint_array_tuple_accessor_array G1) - F1 - L1) - (uint_array_tuple_accessor_length G1)))) - (a!2 (= G - (uint_array_tuple_array_tuple - (store (uint_array_tuple_array_tuple_accessor_array R1) T1 V1) - (uint_array_tuple_array_tuple_accessor_length R1))))) - (and (not (= (<= Z1 X1) A2)) - (not (= (<= Z V) A1)) - (not (= (<= F2 B2) G2)) - (not (= (<= T R) U)) - (= N2 (= L2 M2)) - (= S1 G) - (= D1 F) - (= N1 F) - (= R1 F) - (= Y1 G) - (= H2 G) - (= W E) - (= S E) - (= F - (uint_array_tuple_array_tuple - a!1 - (uint_array_tuple_array_tuple_accessor_length C1))) - a!2 - (= B1 E) - (= C1 E) - (= Q1 F) - (= C2 G) - (= G1 (select (uint_array_tuple_array_tuple_accessor_array E) E1)) - (= W1 (select (uint_array_tuple_array_tuple_accessor_array R1) T1)) - (= H1 (select (uint_array_tuple_array_tuple_accessor_array C1) E1)) - (= U1 (select (uint_array_tuple_array_tuple_accessor_array F) T1)) - (= V1 (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - (= E2 (select (uint_array_tuple_array_tuple_accessor_array G) D2)) - (= J2 (select (uint_array_tuple_array_tuple_accessor_array G) I2)) - (= Y (select (uint_array_tuple_array_tuple_accessor_array E) X)) - (= J1 (select (uint_array_tuple_accessor_array G1) F1)) - (= O1 (uint_array_tuple_array_tuple_accessor_length N1)) - (= J I) - (= Z1 (uint_array_tuple_array_tuple_accessor_length Y1)) - (= M2 0) - (= Q 31) - (= O N) - (= M L) - (= R V2) - (= I1 (select (uint_array_tuple_accessor_array G1) F1)) - (= V X2) - (= P O) - (= N M) - (= Z (uint_array_tuple_accessor_length Y)) - (= F2 (uint_array_tuple_accessor_length E2)) - (= T1 Z2) - (= K J) - (= E1 V2) - (= T (uint_array_tuple_array_tuple_accessor_length S)) - (= X V2) - (= L K) - (= K1 T2) - (= F1 X2) - (= M1 Z2) - (= L1 K1) - (= B2 V2) - (= X1 X2) - (= L2 (select (uint_array_tuple_accessor_array J2) K2)) - (= I2 X2) - (= D2 V2) - (= K2 V2) - (>= (uint_array_tuple_accessor_length G1) 0) - (>= (uint_array_tuple_accessor_length U1) 0) - (>= (uint_array_tuple_accessor_length E2) 0) - (>= (uint_array_tuple_accessor_length J2) 0) - (>= (uint_array_tuple_accessor_length Y) 0) - (>= J1 0) - (>= O1 0) - (>= Z1 0) - (>= R 0) - (>= I1 0) - (>= V 0) - (>= Z 0) - (>= F2 0) - (>= T1 0) - (>= E1 0) - (>= T 0) - (>= X 0) - (>= K1 0) - (>= F1 0) - (>= M1 0) - (>= L1 0) - (>= V2 0) - (>= B2 0) - (>= X1 0) - (>= L2 0) - (>= I2 0) - (>= D2 0) - (>= K2 0) - (>= Z2 0) - (>= X2 0) - (>= T2 0) - (<= J1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Z1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Z - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= X - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= L1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= B2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= X1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= L2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Z2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= X2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (= A2 true) - (not N2) - (= P1 true) - (= G2 true) - (= U true) - (= A1 true) - (not (= (<= O1 M1) P1)))) - ) - (block_73_function_j__279_335_0 - Q - Q2 - C - H - R2 - O2 - A - D - U2 - W2 - Y2 - S2 - P2 - B - G - V2 - X2 - Z2 - T2) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R Int) (S uint_array_tuple_array_tuple) (T Int) (U Bool) (V Int) (W uint_array_tuple_array_tuple) (X Int) (Y uint_array_tuple) (Z Int) (A1 Bool) (B1 uint_array_tuple_array_tuple) (C1 uint_array_tuple_array_tuple) (D1 uint_array_tuple_array_tuple) (E1 Int) (F1 Int) (G1 uint_array_tuple) (H1 uint_array_tuple) (I1 Int) (J1 Int) (K1 Int) (L1 Int) (M1 Int) (N1 uint_array_tuple_array_tuple) (O1 Int) (P1 Bool) (Q1 uint_array_tuple_array_tuple) (R1 uint_array_tuple_array_tuple) (S1 uint_array_tuple_array_tuple) (T1 Int) (U1 uint_array_tuple) (V1 uint_array_tuple) (W1 uint_array_tuple) (X1 Int) (Y1 uint_array_tuple_array_tuple) (Z1 Int) (A2 Bool) (B2 Int) (C2 uint_array_tuple_array_tuple) (D2 Int) (E2 uint_array_tuple) (F2 Int) (G2 Bool) (H2 uint_array_tuple_array_tuple) (I2 Int) (J2 uint_array_tuple) (K2 Int) (L2 Int) (M2 Int) (N2 Bool) (O2 state_type) (P2 state_type) (Q2 Int) (R2 tx_type) (S2 Int) (T2 Int) (U2 Int) (V2 Int) (W2 Int) (X2 Int) (Y2 Int) (Z2 Int) ) - (=> - (and - (block_64_j_278_335_0 I Q2 C H R2 O2 A D U2 W2 Y2 S2 P2 B E V2 X2 Z2 T2) - (let ((a!1 (store (uint_array_tuple_array_tuple_accessor_array C1) - E1 - (uint_array_tuple (store (uint_array_tuple_accessor_array G1) - F1 - L1) - (uint_array_tuple_accessor_length G1)))) - (a!2 (= G - (uint_array_tuple_array_tuple - (store (uint_array_tuple_array_tuple_accessor_array R1) T1 V1) - (uint_array_tuple_array_tuple_accessor_length R1))))) - (and (not (= (<= Z1 X1) A2)) - (not (= (<= Z V) A1)) - (not (= (<= F2 B2) G2)) - (not (= (<= T R) U)) - (= N2 (= L2 M2)) - (= S1 G) - (= D1 F) - (= N1 F) - (= R1 F) - (= Y1 G) - (= H2 G) - (= W E) - (= S E) - (= F - (uint_array_tuple_array_tuple - a!1 - (uint_array_tuple_array_tuple_accessor_length C1))) - a!2 - (= B1 E) - (= C1 E) - (= Q1 F) - (= C2 G) - (= G1 (select (uint_array_tuple_array_tuple_accessor_array E) E1)) - (= W1 (select (uint_array_tuple_array_tuple_accessor_array R1) T1)) - (= H1 (select (uint_array_tuple_array_tuple_accessor_array C1) E1)) - (= U1 (select (uint_array_tuple_array_tuple_accessor_array F) T1)) - (= V1 (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - (= E2 (select (uint_array_tuple_array_tuple_accessor_array G) D2)) - (= J2 (select (uint_array_tuple_array_tuple_accessor_array G) I2)) - (= Y (select (uint_array_tuple_array_tuple_accessor_array E) X)) - (= J1 (select (uint_array_tuple_accessor_array G1) F1)) - (= O1 (uint_array_tuple_array_tuple_accessor_length N1)) - (= J I) - (= Z1 (uint_array_tuple_array_tuple_accessor_length Y1)) - (= M2 0) - (= Q P) - (= O N) - (= M L) - (= R V2) - (= I1 (select (uint_array_tuple_accessor_array G1) F1)) - (= V X2) - (= P O) - (= N M) - (= Z (uint_array_tuple_accessor_length Y)) - (= F2 (uint_array_tuple_accessor_length E2)) - (= T1 Z2) - (= K J) - (= E1 V2) - (= T (uint_array_tuple_array_tuple_accessor_length S)) - (= X V2) - (= L K) - (= K1 T2) - (= F1 X2) - (= M1 Z2) - (= L1 K1) - (= B2 V2) - (= X1 X2) - (= L2 (select (uint_array_tuple_accessor_array J2) K2)) - (= I2 X2) - (= D2 V2) - (= K2 V2) - (>= (uint_array_tuple_accessor_length G1) 0) - (>= (uint_array_tuple_accessor_length U1) 0) - (>= (uint_array_tuple_accessor_length E2) 0) - (>= (uint_array_tuple_accessor_length J2) 0) - (>= (uint_array_tuple_accessor_length Y) 0) - (>= J1 0) - (>= O1 0) - (>= Z1 0) - (>= R 0) - (>= I1 0) - (>= V 0) - (>= Z 0) - (>= F2 0) - (>= T1 0) - (>= E1 0) - (>= T 0) - (>= X 0) - (>= K1 0) - (>= F1 0) - (>= M1 0) - (>= L1 0) - (>= V2 0) - (>= B2 0) - (>= X1 0) - (>= L2 0) - (>= I2 0) - (>= D2 0) - (>= K2 0) - (>= Z2 0) - (>= X2 0) - (>= T2 0) - (<= J1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Z1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Z - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= X - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= L1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= B2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= X1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= L2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Z2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= X2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T2 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (= A2 true) - (= P1 true) - (= G2 true) - (= U true) - (= A1 true) - (not (= (<= O1 M1) P1)))) - ) - (block_65_return_function_j__279_335_0 - Q - Q2 - C - H - R2 - O2 - A - D - U2 - W2 - Y2 - S2 - P2 - B - G - V2 - X2 - Z2 - T2) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) (R Int) (S Int) ) - (=> - (and - true - ) - (block_74_function_j__279_335_0 G J C F K H A D N P R L I B E O Q S M) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C uint_array_tuple) (D abi_type) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L state_type) (M state_type) (N state_type) (O state_type) (P Int) (Q tx_type) (R Int) (S Int) (T Int) (U Int) (V Int) (W Int) (X Int) (Y Int) (Z Int) (A1 Int) (B1 Int) (C1 Int) ) - (=> - (and - (block_74_function_j__279_335_0 I P D H Q L A E U X A1 R M B F V Y B1 S) - (summary_15_function_j__279_335_0 J P D H Q N B F V Y B1 S O C G W Z C1 T) - (let ((a!1 (store (balances M) P (+ (select (balances M) P) K))) - (a!2 (= (select (bytes_tuple_accessor_array (msg.data Q)) 3) 26)) - (a!3 (= (select (bytes_tuple_accessor_array (msg.data Q)) 2) 241)) - (a!4 (= (select (bytes_tuple_accessor_array (msg.data Q)) 1) 74)) - (a!5 (= (select (bytes_tuple_accessor_array (msg.data Q)) 0) 158)) - (a!6 (>= (+ (select (balances M) P) K) 0)) - (a!7 (<= (+ (select (balances M) P) K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935))) - (and (= B A) - (= M L) - (= N (state_type a!1)) - a!2 - a!3 - a!4 - a!5 - (= (msg.value Q) 0) - (= (msg.sig Q) 2655711514) - (= I 0) - (= Y X) - (= V U) - (= S R) - (= B1 A1) - (>= (tx.origin Q) 0) - (>= (tx.gasprice Q) 0) - (>= (msg.value Q) 0) - (>= (msg.sender Q) 0) - (>= (block.timestamp Q) 0) - (>= (block.number Q) 0) - (>= (block.gaslimit Q) 0) - (>= (block.difficulty Q) 0) - (>= (block.coinbase Q) 0) - (>= (block.chainid Q) 0) - (>= (block.basefee Q) 0) - (>= (bytes_tuple_accessor_length (msg.data Q)) 4) - a!6 - (>= K (msg.value Q)) - (<= (tx.origin Q) 1461501637330902918203684832716283019655932542975) - (<= (tx.gasprice Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.value Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.sender Q) 1461501637330902918203684832716283019655932542975) - (<= (block.timestamp Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.number Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.gaslimit Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.difficulty Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.coinbase Q) 1461501637330902918203684832716283019655932542975) - (<= (block.chainid Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.basefee Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - a!7 - (= F E))) - ) - (summary_16_function_j__279_335_0 J P D H Q L A E U X A1 R O C G W Z C1 T) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) ) - (=> - (and - true - ) - (block_75_function_setA__300_335_0 G J C F K H A D L N I B E M O) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) ) - (=> - (and - (block_75_function_setA__300_335_0 G J C F K H A D L N I B E M O) - (and (= B A) (= I H) (= G 0) (= O N) (= M L) (= E D)) - ) - (block_76_setA_299_335_0 G J C F K H A D L N I B E M O) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J uint_array_tuple) (K Int) (L Bool) (M uint_array_tuple) (N Int) (O Int) (P state_type) (Q state_type) (R Int) (S tx_type) (T Int) (U Int) (V Int) (W Int) ) - (=> - (and - (block_76_setA_299_335_0 G R C F S P A D T V Q B E U W) - (and (= M B) - (= J B) - (= K (uint_array_tuple_accessor_length J)) - (= O W) - (= I U) - (= H 33) - (= N U) - (>= K 0) - (>= O 0) - (>= I 0) - (>= W 0) - (>= U 0) - (>= N 0) - (<= K - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 N)) (>= N (uint_array_tuple_accessor_length M))) - (= L true) - (not (= (<= K I) L))) - ) - (block_78_function_setA__300_335_0 H R C F S P A D T V Q B E U W) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) ) - (=> - (and - (block_78_function_setA__300_335_0 G J C F K H A D L N I B E M O) - true - ) - (summary_17_function_setA__300_335_0 G J C F K H A D L N I B E M O) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) ) - (=> - (and - (block_77_return_function_setA__300_335_0 G J C F K H A D L N I B E M O) - true - ) - (summary_17_function_setA__300_335_0 G J C F K H A D L N I B E M O) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C uint_array_tuple) (D abi_type) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G crypto_type) (H Int) (I Int) (J Int) (K uint_array_tuple) (L Int) (M Bool) (N uint_array_tuple) (O uint_array_tuple) (P uint_array_tuple) (Q Int) (R Int) (S Int) (T Int) (U Int) (V state_type) (W state_type) (X Int) (Y tx_type) (Z Int) (A1 Int) (B1 Int) (C1 Int) ) - (=> - (and - (block_76_setA_299_335_0 H X D G Y V A E Z B1 W B F A1 C1) - (let ((a!1 (= C - (uint_array_tuple (store (uint_array_tuple_accessor_array O) Q U) - (uint_array_tuple_accessor_length O))))) - (and a!1 - (= K B) - (= N B) - (= P C) - (= O B) - (= Q A1) - (= I H) - (= J A1) - (= U T) - (= L (uint_array_tuple_accessor_length K)) - (= R (select (uint_array_tuple_accessor_array B) Q)) - (= T C1) - (= S (select (uint_array_tuple_accessor_array O) Q)) - (>= Q 0) - (>= J 0) - (>= U 0) - (>= L 0) - (>= R 0) - (>= C1 0) - (>= A1 0) - (>= T 0) - (>= S 0) - (<= Q - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= L - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= C1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= A1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (= M true) - (not (= (<= L J) M)))) - ) - (block_77_return_function_setA__300_335_0 I X D G Y V A E Z B1 W C F A1 C1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) ) - (=> - (and - true - ) - (block_79_function_setA__300_335_0 G J C F K H A D L N I B E M O) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C uint_array_tuple) (D abi_type) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L state_type) (M state_type) (N state_type) (O state_type) (P Int) (Q tx_type) (R Int) (S Int) (T Int) (U Int) (V Int) (W Int) ) - (=> - (and - (block_79_function_setA__300_335_0 I P D H Q L A E R U M B F S V) - (summary_17_function_setA__300_335_0 J P D H Q N B F S V O C G T W) - (let ((a!1 (store (balances M) P (+ (select (balances M) P) K))) - (a!2 (= (select (bytes_tuple_accessor_array (msg.data Q)) 3) 213)) - (a!3 (= (select (bytes_tuple_accessor_array (msg.data Q)) 2) 163)) - (a!4 (= (select (bytes_tuple_accessor_array (msg.data Q)) 1) 169)) - (a!5 (= (select (bytes_tuple_accessor_array (msg.data Q)) 0) 122)) - (a!6 (>= (+ (select (balances M) P) K) 0)) - (a!7 (<= (+ (select (balances M) P) K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935))) - (and (= B A) - (= M L) - (= N (state_type a!1)) - a!2 - a!3 - a!4 - a!5 - (= (msg.value Q) 0) - (= (msg.sig Q) 2057937877) - (= S R) - (= I 0) - (= V U) - (>= (tx.origin Q) 0) - (>= (tx.gasprice Q) 0) - (>= (msg.value Q) 0) - (>= (msg.sender Q) 0) - (>= (block.timestamp Q) 0) - (>= (block.number Q) 0) - (>= (block.gaslimit Q) 0) - (>= (block.difficulty Q) 0) - (>= (block.coinbase Q) 0) - (>= (block.chainid Q) 0) - (>= (block.basefee Q) 0) - (>= (bytes_tuple_accessor_length (msg.data Q)) 4) - a!6 - (>= K (msg.value Q)) - (<= (tx.origin Q) 1461501637330902918203684832716283019655932542975) - (<= (tx.gasprice Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.value Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.sender Q) 1461501637330902918203684832716283019655932542975) - (<= (block.timestamp Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.number Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.gaslimit Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.difficulty Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.coinbase Q) 1461501637330902918203684832716283019655932542975) - (<= (block.chainid Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.basefee Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - a!7 - (= F E))) - ) - (summary_18_function_setA__300_335_0 J P D H Q L A E R U O C G T W) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - true - ) - (block_80_function_setB__334_335_0 G J C F K H A D L N P I B E M O Q) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_80_function_setB__334_335_0 G J C F K H A D L N P I B E M O Q) - (and (= B A) (= I H) (= M L) (= Q P) (= O N) (= G 0) (= E D)) - ) - (block_81_setB_333_335_0 G J C F K H A D L N P I B E M O Q) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J uint_array_tuple_array_tuple) (K Int) (L Bool) (M Int) (N uint_array_tuple_array_tuple) (O Int) (P state_type) (Q state_type) (R Int) (S tx_type) (T Int) (U Int) (V Int) (W Int) (X Int) (Y Int) ) - (=> - (and - (block_81_setB_333_335_0 G R C F S P A D T V X Q B E U W Y) - (and (= J E) - (= N E) - (= M W) - (= K (uint_array_tuple_array_tuple_accessor_length J)) - (= H 35) - (= I U) - (= O U) - (>= M 0) - (>= U 0) - (>= K 0) - (>= I 0) - (>= Y 0) - (>= W 0) - (>= O 0) - (<= M - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 O)) (>= O (uint_array_tuple_array_tuple_accessor_length N))) - (= L true) - (not (= (<= K I) L))) - ) - (block_83_function_setB__334_335_0 H R C F S P A D T V X Q B E U W Y) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_83_function_setB__334_335_0 G J C F K H A D L N P I B E M O Q) - true - ) - (summary_19_function_setB__334_335_0 G J C F K H A D L N P I B E M O Q) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_84_function_setB__334_335_0 G J C F K H A D L N P I B E M O Q) - true - ) - (summary_19_function_setB__334_335_0 G J C F K H A D L N P I B E M O Q) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_85_function_setB__334_335_0 G J C F K H A D L N P I B E M O Q) - true - ) - (summary_19_function_setB__334_335_0 G J C F K H A D L N P I B E M O Q) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (block_82_return_function_setB__334_335_0 G J C F K H A D L N P I B E M O Q) - true - ) - (summary_19_function_setB__334_335_0 G J C F K H A D L N P I B E M O Q) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J Int) (K uint_array_tuple_array_tuple) (L Int) (M Bool) (N Int) (O uint_array_tuple_array_tuple) (P Int) (Q uint_array_tuple) (R Int) (S Bool) (T uint_array_tuple_array_tuple) (U Int) (V Int) (W state_type) (X state_type) (Y Int) (Z tx_type) (A1 Int) (B1 Int) (C1 Int) (D1 Int) (E1 Int) (F1 Int) ) - (=> - (and - (block_81_setB_333_335_0 G Y C F Z W A D A1 C1 E1 X B E B1 D1 F1) - (and (not (= (<= R N) S)) - (= T E) - (= O E) - (= K E) - (= Q (select (uint_array_tuple_array_tuple_accessor_array E) P)) - (= L (uint_array_tuple_array_tuple_accessor_length K)) - (= H G) - (= N D1) - (= I 36) - (= R (uint_array_tuple_accessor_length Q)) - (= J B1) - (= U B1) - (= P B1) - (= V F1) - (>= (uint_array_tuple_accessor_length Q) 0) - (>= L 0) - (>= B1 0) - (>= N 0) - (>= R 0) - (>= J 0) - (>= U 0) - (>= P 0) - (>= F1 0) - (>= D1 0) - (>= V 0) - (<= L - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= B1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= J - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= U - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= P - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 U)) (>= U (uint_array_tuple_array_tuple_accessor_length T))) - (= M true) - (= S true) - (not (= (<= L J) M))) - ) - (block_84_function_setB__334_335_0 I Y C F Z W A D A1 C1 E1 X B E B1 D1 F1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H Int) (I Int) (J Int) (K Int) (L uint_array_tuple_array_tuple) (M Int) (N Bool) (O Int) (P uint_array_tuple_array_tuple) (Q Int) (R uint_array_tuple) (S Int) (T Bool) (U uint_array_tuple_array_tuple) (V Int) (W Int) (X uint_array_tuple) (Y Int) (Z state_type) (A1 state_type) (B1 Int) (C1 tx_type) (D1 Int) (E1 Int) (F1 Int) (G1 Int) (H1 Int) (I1 Int) ) - (=> - (and - (block_81_setB_333_335_0 G B1 C F C1 Z A D D1 F1 H1 A1 B E E1 G1 I1) - (and (not (= (<= S O) T)) - (= P E) - (= L E) - (= U E) - (= X (select (uint_array_tuple_array_tuple_accessor_array E) V)) - (= R (select (uint_array_tuple_array_tuple_accessor_array E) Q)) - (= I H) - (= W G1) - (= V E1) - (= O G1) - (= K E1) - (= J 37) - (= Q E1) - (= H G) - (= M (uint_array_tuple_array_tuple_accessor_length L)) - (= S (uint_array_tuple_accessor_length R)) - (= Y I1) - (>= (uint_array_tuple_accessor_length X) 0) - (>= (uint_array_tuple_accessor_length R) 0) - (>= W 0) - (>= V 0) - (>= O 0) - (>= E1 0) - (>= K 0) - (>= Q 0) - (>= M 0) - (>= S 0) - (>= I1 0) - (>= G1 0) - (>= Y 0) - (<= W - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= V - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= O - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= K - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Q - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= M - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= S - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= I1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= G1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (or (not (<= 0 W)) (>= W (uint_array_tuple_accessor_length X))) - (= T true) - (= N true) - (not (= (<= M K) N))) - ) - (block_85_function_setB__334_335_0 J B1 C F C1 Z A D D1 F1 H1 A1 B E E1 G1 I1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G crypto_type) (H Int) (I Int) (J Int) (K Int) (L Int) (M uint_array_tuple_array_tuple) (N Int) (O Bool) (P Int) (Q uint_array_tuple_array_tuple) (R Int) (S uint_array_tuple) (T Int) (U Bool) (V uint_array_tuple_array_tuple) (W uint_array_tuple_array_tuple) (X uint_array_tuple_array_tuple) (Y Int) (Z Int) (A1 uint_array_tuple) (B1 uint_array_tuple) (C1 Int) (D1 Int) (E1 Int) (F1 Int) (G1 state_type) (H1 state_type) (I1 Int) (J1 tx_type) (K1 Int) (L1 Int) (M1 Int) (N1 Int) (O1 Int) (P1 Int) ) - (=> - (and - (block_81_setB_333_335_0 H I1 C G J1 G1 A D K1 M1 O1 H1 B E L1 N1 P1) - (let ((a!1 (store (uint_array_tuple_array_tuple_accessor_array W) - Y - (uint_array_tuple (store (uint_array_tuple_accessor_array A1) - Z - F1) - (uint_array_tuple_accessor_length A1))))) - (and (not (= (<= T P) U)) - (= Q E) - (= V E) - (= W E) - (= X F) - (= F - (uint_array_tuple_array_tuple - a!1 - (uint_array_tuple_array_tuple_accessor_length W))) - (= M E) - (= S (select (uint_array_tuple_array_tuple_accessor_array E) R)) - (= A1 (select (uint_array_tuple_array_tuple_accessor_array E) Y)) - (= B1 (select (uint_array_tuple_array_tuple_accessor_array W) Y)) - (= P N1) - (= D1 (select (uint_array_tuple_accessor_array A1) Z)) - (= C1 (select (uint_array_tuple_accessor_array A1) Z)) - (= L L1) - (= J I) - (= I H) - (= R L1) - (= K J) - (= N (uint_array_tuple_array_tuple_accessor_length M)) - (= Y L1) - (= T (uint_array_tuple_accessor_length S)) - (= E1 P1) - (= Z N1) - (= F1 E1) - (>= (uint_array_tuple_accessor_length S) 0) - (>= (uint_array_tuple_accessor_length A1) 0) - (>= P 0) - (>= D1 0) - (>= C1 0) - (>= L 0) - (>= L1 0) - (>= R 0) - (>= N 0) - (>= Y 0) - (>= T 0) - (>= E1 0) - (>= Z 0) - (>= P1 0) - (>= N1 0) - (>= F1 0) - (<= P - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= D1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= C1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= L - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= L1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= R - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Y - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= T - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= E1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= Z - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= P1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= N1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= F1 - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (= O true) - (= U true) - (not (= (<= N L) O)))) - ) - (block_82_return_function_setB__334_335_0 - K - I1 - C - G - J1 - G1 - A - D - K1 - M1 - O1 - H1 - B - F - L1 - N1 - P1) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - true - ) - (block_86_function_setB__334_335_0 G J C F K H A D L N P I B E M O Q) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C uint_array_tuple) (D abi_type) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K Int) (L state_type) (M state_type) (N state_type) (O state_type) (P Int) (Q tx_type) (R Int) (S Int) (T Int) (U Int) (V Int) (W Int) (X Int) (Y Int) (Z Int) ) - (=> - (and - (block_86_function_setB__334_335_0 I P D H Q L A E R U X M B F S V Y) - (summary_19_function_setB__334_335_0 J P D H Q N B F S V Y O C G T W Z) - (let ((a!1 (store (balances M) P (+ (select (balances M) P) K))) - (a!2 (= (select (bytes_tuple_accessor_array (msg.data Q)) 3) 225)) - (a!3 (= (select (bytes_tuple_accessor_array (msg.data Q)) 2) 25)) - (a!4 (= (select (bytes_tuple_accessor_array (msg.data Q)) 1) 196)) - (a!5 (= (select (bytes_tuple_accessor_array (msg.data Q)) 0) 90)) - (a!6 (>= (+ (select (balances M) P) K) 0)) - (a!7 (<= (+ (select (balances M) P) K) - 115792089237316195423570985008687907853269984665640564039457584007913129639935))) - (and (= B A) - (= N (state_type a!1)) - (= M L) - a!2 - a!3 - a!4 - a!5 - (= (msg.value Q) 0) - (= (msg.sig Q) 1522801121) - (= V U) - (= I 0) - (= S R) - (= Y X) - (>= (tx.origin Q) 0) - (>= (tx.gasprice Q) 0) - (>= (msg.value Q) 0) - (>= (msg.sender Q) 0) - (>= (block.timestamp Q) 0) - (>= (block.number Q) 0) - (>= (block.gaslimit Q) 0) - (>= (block.difficulty Q) 0) - (>= (block.coinbase Q) 0) - (>= (block.chainid Q) 0) - (>= (block.basefee Q) 0) - (>= (bytes_tuple_accessor_length (msg.data Q)) 4) - a!6 - (>= K (msg.value Q)) - (<= (tx.origin Q) 1461501637330902918203684832716283019655932542975) - (<= (tx.gasprice Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.value Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (msg.sender Q) 1461501637330902918203684832716283019655932542975) - (<= (block.timestamp Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.number Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.gaslimit Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.difficulty Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.coinbase Q) 1461501637330902918203684832716283019655932542975) - (<= (block.chainid Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - (<= (block.basefee Q) - 115792089237316195423570985008687907853269984665640564039457584007913129639935) - a!7 - (= F E))) - ) - (summary_20_function_setB__334_335_0 J P D H Q L A E R U X O C G T W Z) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) ) - (=> - (and - (and (= B A) (= I H) (= G 0) (= E D)) - ) - (contract_initializer_entry_88_C_335_0 G J C F K H I A D B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) ) - (=> - (and - (contract_initializer_entry_88_C_335_0 G J C F K H I A D B E) - true - ) - (contract_initializer_after_init_89_C_335_0 G J C F K H I A D B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) ) - (=> - (and - (contract_initializer_after_init_89_C_335_0 G J C F K H I A D B E) - true - ) - (contract_initializer_87_C_335_0 G J C F K H I A D B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) ) - (=> - (and - (let ((a!1 (uint_array_tuple_array_tuple - ((as const (Array Int uint_array_tuple)) - (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - 0))) - (and (= E D) - (= B (uint_array_tuple ((as const (Array Int Int)) 0) 0)) - (= B A) - (= I H) - (= G 0) - (>= (select (balances I) J) (msg.value K)) - (= E a!1))) - ) - (implicit_constructor_entry_90_C_335_0 G J C F K H I A D B E) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C uint_array_tuple) (D abi_type) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K state_type) (L state_type) (M state_type) (N Int) (O tx_type) ) - (=> - (and - (implicit_constructor_entry_90_C_335_0 I N D H O K L A E B F) - (contract_initializer_87_C_335_0 J N D H O L M B F C G) - (not (<= J 0)) - ) - (summary_constructor_2_C_335_0 J N D H O K M A E C G) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C uint_array_tuple) (D abi_type) (E uint_array_tuple_array_tuple) (F uint_array_tuple_array_tuple) (G uint_array_tuple_array_tuple) (H crypto_type) (I Int) (J Int) (K state_type) (L state_type) (M state_type) (N Int) (O tx_type) ) - (=> - (and - (contract_initializer_87_C_335_0 J N D H O L M B F C G) - (implicit_constructor_entry_90_C_335_0 I N D H O K L A E B F) - (= J 0) - ) - (summary_constructor_2_C_335_0 J N D H O K M A E C G) - ) - ) -) -(assert - (forall ( (A uint_array_tuple) (B uint_array_tuple) (C abi_type) (D uint_array_tuple_array_tuple) (E uint_array_tuple_array_tuple) (F crypto_type) (G Int) (H state_type) (I state_type) (J Int) (K tx_type) (L Int) (M Int) (N Int) (O Int) (P Int) (Q Int) ) - (=> - (and - (summary_12_function_h__150_335_0 G J C F K H A D N P L I B E O Q M) - (interface_0_C_335_0 J C F H A D) - (= G 10) - ) - error_target_45_0 - ) - ) -) -(assert - (forall ( (CHC_COMP_UNUSED Bool) ) - (=> - (and - error_target_45_0 - true - ) - false - ) - ) -) - -(check-sat) -(exit) diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt index c0f7c69d35..468b8a5c6c 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt @@ -16,7 +16,6 @@ package hu.bme.mit.theta.xcfa -import com.google.common.collect.Sets import hu.bme.mit.theta.common.dsl.Env import hu.bme.mit.theta.common.dsl.Symbol import hu.bme.mit.theta.common.dsl.SymbolTable @@ -29,13 +28,28 @@ import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.ExprUtils import hu.bme.mit.theta.core.utils.StmtUtils import hu.bme.mit.theta.xcfa.model.* +import java.util.function.Predicate -fun XCFA.collectVars(): Iterable> = vars.map { it.wrappedVar } - .union(procedures.map { it.vars }.flatten()) +/** + * Get flattened label list (without sequence labels). + */ +fun XcfaEdge.getFlatLabels(): List = label.getFlatLabels() + +fun XcfaLabel.getFlatLabels(): List = when (this) { + is SequenceLabel -> { + val ret = mutableListOf() + labels.forEach { ret.addAll(it.getFlatLabels()) } + ret + } -fun XCFA.collectAssumes(): Iterable> = procedures.map { - it.edges.map { it.label.collectAssumes() }.flatten() + else -> listOf(this) +} + +fun XCFA.collectVars(): Iterable> = vars.map { it.wrappedVar } union procedures.map { it.vars }.flatten() + +fun XCFA.collectAssumes(): Iterable> = procedures.map { procedure -> + procedure.edges.map { it.label.collectAssumes() }.flatten() }.flatten() fun XcfaLabel.collectAssumes(): Iterable> = when (this) { @@ -49,6 +63,14 @@ fun XcfaLabel.collectAssumes(): Iterable> = when (this) { else -> setOf() } +fun XcfaLabel.collectAssumesVars(): Set> { + return collectAssumes().flatMap { + val v = mutableSetOf>() + ExprUtils.collectVars(it, v) + v + }.toSet() +} + fun XcfaLabel.collectHavocs(): Set> = when (this) { is StmtLabel -> when (stmt) { is HavocStmt<*> -> setOf(stmt) @@ -67,14 +89,15 @@ fun XcfaLabel.collectVars(): Iterable> = when (this) { is InvokeLabel -> params.map { ExprUtils.getVars(it) }.flatten() is JoinLabel -> setOf(pidVar) is ReadLabel -> setOf(global, local) - is StartLabel -> Sets.union(params.map { ExprUtils.getVars(it) }.flatten().toSet(), - setOf(pidVar)) - + is StartLabel -> params.map { ExprUtils.getVars(it) }.flatten().toSet() union setOf(pidVar) is WriteLabel -> setOf(global, local) else -> emptySet() } +// Complex var access requests + typealias AccessType = Pair +private typealias VarAccessMap = Map, AccessType> val AccessType?.isRead get() = this?.first == true val AccessType?.isWritten get() = this?.second == true @@ -84,41 +107,63 @@ fun AccessType?.merge(other: AccessType?) = val WRITE: AccessType get() = Pair(false, true) val READ: AccessType get() = Pair(true, false) -private typealias VarAccessMap = Map, AccessType> - private fun List.mergeAndCollect(): VarAccessMap = this.fold(mapOf()) { acc, next -> (acc.keys + next.keys).associateWith { acc[it].merge(next[it]) } } +private operator fun VarAccessMap?.plus(other: VarAccessMap?): VarAccessMap = + listOfNotNull(this, other).mergeAndCollect() + +/** + * The list of mutexes acquired by the label. + */ +inline val FenceLabel.acquiredMutexes: Set + get() = labels.mapNotNull { + when { + it == "ATOMIC_BEGIN" -> "___atomic_block_mutex___" + it.startsWith("mutex_lock") -> it.substringAfter('(').substringBefore(')') + it.startsWith("cond_wait") -> it.substring("cond_wait".length + 1, it.length - 1).split(",")[1] + else -> null + } + }.toSet() + +/** + * The list of mutexes released by the label. + */ +inline val FenceLabel.releasedMutexes: Set + get() = labels.mapNotNull { + when { + it == "ATOMIC_END" -> "___atomic_block_mutex___" + it.startsWith("mutex_unlock") -> it.substringAfter('(').substringBefore(')') + it.startsWith("start_cond_wait") -> it.substring("start_cond_wait".length + 1, it.length - 1).split(",")[1] + else -> null + } + }.toSet() + +/** + * Returns the list of accessed variables by the edge associated with an AccessType object. + */ +fun XcfaEdge.collectVarsWithAccessType(): VarAccessMap = label.collectVarsWithAccessType() + /** * Returns the list of accessed variables by the label. - * The variable is associated with true if the variable is written and false otherwise. + * The variable is associated with an AccessType object based on whether the variable is read/written by the label. */ -internal fun XcfaLabel.collectVarsWithAccessType(): VarAccessMap = when (this) { +fun XcfaLabel.collectVarsWithAccessType(): VarAccessMap = when (this) { is StmtLabel -> { when (stmt) { is HavocStmt<*> -> mapOf(stmt.varDecl to WRITE) - is AssignStmt<*> -> StmtUtils.getVars(stmt).associateWith { READ } + mapOf( - stmt.varDecl to WRITE) - + is AssignStmt<*> -> ExprUtils.getVars(stmt.expr).associateWith { READ } + mapOf(stmt.varDecl to WRITE) else -> StmtUtils.getVars(stmt).associateWith { READ } } } - is NondetLabel -> { - labels.map { it.collectVarsWithAccessType() }.mergeAndCollect() - } - - is SequenceLabel -> { - labels.map { it.collectVarsWithAccessType() }.mergeAndCollect() - } - + is NondetLabel -> labels.map { it.collectVarsWithAccessType() }.mergeAndCollect() + is SequenceLabel -> labels.map { it.collectVarsWithAccessType() }.mergeAndCollect() is InvokeLabel -> params.map { ExprUtils.getVars(it) }.flatten().associateWith { READ } + is StartLabel -> params.map { ExprUtils.getVars(it) }.flatten().associateWith { READ } + mapOf(pidVar to READ) is JoinLabel -> mapOf(pidVar to READ) is ReadLabel -> mapOf(global to READ, local to READ) - is StartLabel -> params.map { ExprUtils.getVars(it) }.flatten().associateWith { READ } + mapOf( - pidVar to READ) - is WriteLabel -> mapOf(global to WRITE, local to WRITE) else -> emptyMap() } @@ -126,51 +171,108 @@ internal fun XcfaLabel.collectVarsWithAccessType(): VarAccessMap = when (this) { /** * Returns the global variables accessed by the label (the variables present in the given argument). */ -private fun XcfaLabel.collectGlobalVars(globalVars: Set>) = +private fun XcfaLabel.collectGlobalVars(globalVars: Set>): VarAccessMap = collectVarsWithAccessType().filter { labelVar -> globalVars.any { it == labelVar.key } } -inline val XcfaLabel.isAtomicBegin - get() = this is FenceLabel && this.labels.contains("ATOMIC_BEGIN") -inline val XcfaLabel.isAtomicEnd get() = this is FenceLabel && this.labels.contains("ATOMIC_END") - /** * Returns the global variables (potentially indirectly) accessed by the edge. - * If the edge starts an atomic block, all variable accesses in the atomic block is returned. + * If the edge starts an atomic block, all variable accesses in the atomic block are returned. * Variables are associated with a pair of boolean values: the first is true if the variable is read and false otherwise. The second is similar for write access. */ -fun XcfaEdge.getGlobalVars(xcfa: XCFA): Map, AccessType> { +fun XcfaEdge.collectIndirectGlobalVarAccesses(xcfa: XCFA): VarAccessMap { val globalVars = xcfa.vars.map(XcfaGlobalVar::wrappedVar).toSet() - var label = this.label - if (label is SequenceLabel && label.labels.size == 1) label = label.labels[0] - if (label.isAtomicBegin || (label is SequenceLabel && label.labels.any { it.isAtomicBegin } && label.labels.none { it.isAtomicEnd })) { - val vars = mutableMapOf, AccessType>() - val processed = mutableSetOf() - val unprocessed = mutableListOf(this) - while (unprocessed.isNotEmpty()) { - val e = unprocessed.removeFirst() - var eLabel = e.label - if (eLabel is SequenceLabel && eLabel.labels.size == 1) eLabel = eLabel.labels[0] - eLabel.collectGlobalVars(globalVars).forEach { (varDecl, accessType) -> - vars[varDecl] = accessType.merge(vars[varDecl]) - } - processed.add(e) - if (!(eLabel.isAtomicEnd || (eLabel is SequenceLabel && eLabel.labels.any { it.isAtomicEnd }))) { - unprocessed.addAll(e.target.outgoingEdges subtract processed) + val flatLabels = getFlatLabels() + val mutexes = flatLabels.filterIsInstance().flatMap { it.acquiredMutexes }.toMutableSet() + return if (mutexes.isEmpty()) { + label.collectGlobalVars(globalVars) + } else { + collectGlobalVarsWithTraversal(globalVars) { it.mutexOperations(mutexes) } + } +} + +/** + * Represents a global variable access: stores the variable declaration, the access type (read/write) and the set of + * mutexes that are needed to perform the variable access. + */ +class GlobalVarAccessWithMutexes(val varDecl: VarDecl<*>, val access: AccessType, val mutexes: Set) + +/** + * Returns the global variable accesses of the edge. + * + * @param xcfa the XCFA that contains the edge + * @param currentMutexes the set of mutexes currently acquired by the process of the edge + * @return the list of global variable accesses (c.f., [GlobalVarAccessWithMutexes]) + */ +fun XcfaEdge.getGlobalVarsWithNeededMutexes(xcfa: XCFA, currentMutexes: Set): List { + val globalVars = xcfa.vars.map(XcfaGlobalVar::wrappedVar).toSet() + val neededMutexes = currentMutexes.toMutableSet() + val accesses = mutableListOf() + getFlatLabels().forEach { label -> + if (label is FenceLabel) { + neededMutexes.addAll(label.acquiredMutexes) + } else { + val vars = label.collectGlobalVars(globalVars) + accesses.addAll(vars.mapNotNull { (varDecl, accessType) -> + if (accesses.any { it.varDecl == varDecl && (it.access == accessType && it.access == WRITE) }) { + null + } else { + GlobalVarAccessWithMutexes(varDecl, accessType, neededMutexes.toSet()) + } + }) + } + } + return accesses +} + +/** + * Returns global variables encountered in a search starting from the edge. + * + * @param goFurther the predicate that tells whether more edges have to be explored through an edge + * @return the set of encountered shared objects + */ +private fun XcfaEdge.collectGlobalVarsWithTraversal(globalVars: Set>, goFurther: Predicate) + : VarAccessMap { + val vars = mutableMapOf, AccessType>() + val exploredEdges = mutableListOf() + val edgesToExplore = mutableListOf() + edgesToExplore.add(this) + while (edgesToExplore.isNotEmpty()) { + val exploring = edgesToExplore.removeFirst() + exploring.label.collectGlobalVars(globalVars).forEach { (varDecl, access) -> + vars[varDecl] = vars[varDecl].merge(access) + } + if (goFurther.test(exploring)) { + for (newEdge in exploring.target.outgoingEdges) { + if (newEdge !in exploredEdges) { + edgesToExplore.add(newEdge) + } } } - return vars - } else { - return label.collectGlobalVars(globalVars) + exploredEdges.add(exploring) } + return vars } /** - * Returns true if the edge starts an atomic block. + * Follows the mutex operations of the given edge and updates the given set of mutexes. + * + * @param mutexes the set of mutexes currently acquired + * @return true if the set of mutexes is non-empty after the mutex operations */ -fun XcfaEdge.startsAtomic(): Boolean { - var label = this.label - if (label is SequenceLabel && label.labels.size == 1) label = label.labels[0] - return label is FenceLabel && label.labels.contains("ATOMIC_BEGIN") +fun XcfaEdge.mutexOperations(mutexes: MutableSet): Boolean { + val edgeFlatLabels = getFlatLabels() + val acquiredLocks = mutableSetOf() + val releasedLocks = mutableSetOf() + edgeFlatLabels.filterIsInstance().forEach { fence -> + releasedLocks.addAll(fence.releasedMutexes) + acquiredLocks.removeAll(fence.releasedMutexes) + + acquiredLocks.addAll(fence.acquiredMutexes) + releasedLocks.removeAll(fence.acquiredMutexes) + } + mutexes.removeAll(releasedLocks) + mutexes.addAll(acquiredLocks) + return mutexes.isNotEmpty() } fun XCFA.getSymbols(): Pair { @@ -186,25 +288,6 @@ fun XCFA.getSymbols(): Pair { return Pair(scope, env) } -private val atomicBlockInnerLocationsCache: HashMap> = HashMap() - -/** - * Returns XCFA locations that are inner locations of any atomic block (after an edge with an AtomicBegin and before - * an edge with an AtomicEnd). - * - * @param xcfaProcedure the atomic block inner locations of this XCFA procedure will be returned - * @return the list of locations in an atomic block - */ -fun getAtomicBlockInnerLocations(xcfaProcedure: XcfaProcedure): List? { - if (atomicBlockInnerLocationsCache.containsKey(xcfaProcedure)) { - return atomicBlockInnerLocationsCache[xcfaProcedure] - } - val atomicBlockInnerLocations: List = getAtomicBlockInnerLocations( - xcfaProcedure.initLoc) - atomicBlockInnerLocationsCache[xcfaProcedure] = atomicBlockInnerLocations - return atomicBlockInnerLocations -} - /** * Returns XCFA locations that are inner locations of any atomic block (after an edge with an AtomicBegin and before * an edge with an AtomicEnd). @@ -212,55 +295,32 @@ fun getAtomicBlockInnerLocations(xcfaProcedure: XcfaProcedure): List { - return getAtomicBlockInnerLocations(builder.initLoc) -} - -/** - * Get flattened label list (without sequence labels). - */ -fun XcfaEdge.getFlatLabels(): List = label.getFlatLabels() - -fun XcfaLabel.getFlatLabels(): List = when (this) { - is SequenceLabel -> { - val ret = ArrayList() - labels.forEach { ret.addAll(it.getFlatLabels()) } - ret - } - - else -> listOf(this) -} - +fun getAtomicBlockInnerLocations(builder: XcfaProcedureBuilder): List = + getAtomicBlockInnerLocations(builder.initLoc) private fun getAtomicBlockInnerLocations(initialLocation: XcfaLocation): List { - val atomicLocations: MutableList = ArrayList() - val visitedLocations: MutableList = ArrayList() - val locationsToVisit: MutableList = ArrayList() - val isAtomic: HashMap = HashMap() - locationsToVisit.add(initialLocation) - isAtomic[initialLocation] = false - while (!locationsToVisit.isEmpty()) { + val atomicLocations = mutableListOf() + val visitedLocations = mutableListOf() + val locationsToVisit = mutableListOf(initialLocation) + val isAtomic = mutableMapOf(initialLocation to false) + while (locationsToVisit.isNotEmpty()) { val visiting = locationsToVisit.removeAt(0) if (checkNotNull(isAtomic[visiting])) atomicLocations.add(visiting) visitedLocations.add(visiting) for (outEdge in visiting.outgoingEdges) { var isNextAtomic = checkNotNull(isAtomic[visiting]) - if (outEdge.getFlatLabels().stream().anyMatch { label -> - label is FenceLabel && label.labels.contains("ATOMIC_BEGIN") - }) { + if (outEdge.getFlatLabels().any { it is FenceLabel && it.labels.contains("ATOMIC_BEGIN") }) { isNextAtomic = true } - if (outEdge.getFlatLabels().stream().anyMatch { label -> - label is FenceLabel && label.labels.contains("ATOMIC_END") - }) { + if (outEdge.getFlatLabels().any { it is FenceLabel && it.labels.contains("ATOMIC_END") }) { isNextAtomic = false } val target = outEdge.target isAtomic[target] = isNextAtomic - if (atomicLocations.contains(target) && !isNextAtomic) { + if (target in atomicLocations && !isNextAtomic) { atomicLocations.remove(target) } - if (!locationsToVisit.contains(target) && !visitedLocations.contains(target)) { + if (target !in locationsToVisit && target !in visitedLocations) { locationsToVisit.add(outEdge.target) } } diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/XcfaToC.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/XcfaToC.kt new file mode 100644 index 0000000000..a36d92a35b --- /dev/null +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/XcfaToC.kt @@ -0,0 +1,371 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.xcfa + +import hu.bme.mit.theta.core.decl.VarDecl +import hu.bme.mit.theta.core.stmt.AssignStmt +import hu.bme.mit.theta.core.stmt.AssumeStmt +import hu.bme.mit.theta.core.stmt.HavocStmt +import hu.bme.mit.theta.core.type.* +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Geq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Leq +import hu.bme.mit.theta.core.type.abstracttype.DivExpr +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.abstracttype.ModExpr +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.anytype.IteExpr +import hu.bme.mit.theta.core.type.anytype.RefExpr +import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr +import hu.bme.mit.theta.core.type.arraytype.ArrayType +import hu.bme.mit.theta.core.type.arraytype.ArrayWriteExpr +import hu.bme.mit.theta.core.type.booltype.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or +import hu.bme.mit.theta.core.type.bvtype.BvLitExpr +import hu.bme.mit.theta.core.type.fptype.FpLitExpr +import hu.bme.mit.theta.core.type.fptype.FpRoundingMode +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.inttype.IntLitExpr +import hu.bme.mit.theta.core.type.rattype.RatLitExpr +import hu.bme.mit.theta.core.utils.BvUtils +import hu.bme.mit.theta.core.utils.FpUtils +import hu.bme.mit.theta.frontend.ParseContext +import hu.bme.mit.theta.frontend.transformation.model.types.complex.CComplexType +import hu.bme.mit.theta.frontend.transformation.model.types.complex.CComplexType.CComplexTypeVisitor +import hu.bme.mit.theta.frontend.transformation.model.types.complex.compound.CArray +import hu.bme.mit.theta.frontend.transformation.model.types.complex.integer.CInteger +import hu.bme.mit.theta.frontend.transformation.model.types.complex.integer.cbool.CBool +import hu.bme.mit.theta.frontend.transformation.model.types.complex.integer.cchar.CChar +import hu.bme.mit.theta.frontend.transformation.model.types.complex.integer.cint.CSignedInt +import hu.bme.mit.theta.frontend.transformation.model.types.complex.integer.cint.CUnsignedInt +import hu.bme.mit.theta.xcfa.model.* + +private const val arraySize = 10; + +fun XCFA.toC(parseContext: ParseContext, arraySupport: Boolean, exactArraySupport: Boolean, + intRangeConstraint: Boolean): String = """ + extern void abort(); + extern int __VERIFIER_nondet_int(); + extern _Bool __VERIFIER_nondet__Bool(); + extern void reach_error(); + + ${ + if (procedures.any { it.vars.any { it.type is ArrayType<*, *> } }) if (arraySupport) if (exactArraySupport) """ + // "exact" array support + typedef long unsigned int size_t; + + void * __attribute__((__cdecl__)) malloc (size_t __size) ; + void __attribute__((__cdecl__)) free (void *) ; + + + typedef struct + { + int *arr; + int size; + int def; + } int_arr; + + int_arr array_write(int_arr arr, int idx, int val) { + int_arr ret; + ret.size = arr.size > idx + 1 ? arr.size : idx + 1; + ret.arr = malloc(ret.size * sizeof(int)); + ret.def = arr.def; + for(int i = 0; i < ret.size; ++i) { + ret.arr[i] = i < arr.size ? arr.arr[i] : ret.def; + } + ret.arr[idx] = val; + return ret; + } + + int array_read(int_arr arr, int idx) { + return idx < arr.size ? arr.arr[idx] : arr.def; + } + + int array_equals(int_arr arr1, int_arr arr2) { + int i = 0; + if(arr1.def != arr2.def) return 0; + for(; i < arr1.size; i++) { + if(arr1.arr[i] != (i < arr2.size ? arr2.arr[i] : arr2.def)) return 0; + } + for(; i < arr2.size; i++) { + if(arr2.arr[i] != arr1.def) return 0; + } + + return 1; + } + """.trimIndent() else """ + // non-exact array support + + typedef struct + { + int arr[$arraySize]; + } int_arr; + + int_arr array_write(int_arr arr, int idx, int val) { + arr.arr[idx] = val; + return arr; + } + + int array_read(int_arr arr, int idx) { + return arr.arr[idx]; + } + + int array_equals(int_arr arr1, int_arr arr2) { + for(int i = 0; i < $arraySize; i++) { + if(arr1.arr[i] != arr2.arr[i]) return 0; + } + return 1; + } + """.trimIndent() else error("Array support not enabled") else "" +} + + ${procedures.joinToString("\n\n") { it.decl(parseContext) + ";" }} + + ${procedures.joinToString("\n\n") { it.def(parseContext, intRangeConstraint) }} + + ${ + if (initProcedures.size != 1) error("Exactly one initial procedure is supported.") else { + val proc = initProcedures[0] + val procName = proc.first.name.toC() + if (procName != "main") + "int main() { $procName(${proc.second.joinToString(", ") { it.toC(parseContext) }}); }" + else "" + } +} + +""".trimIndent() + + +fun XcfaProcedure.decl(parseContext: ParseContext): String = + if (params.isNotEmpty()) { + "${CComplexType.getType(params[0].first.ref, parseContext).toC()} ${name.toC()}(${ + params.subList(1, params.size).joinToString(", ") { it.decl(parseContext) } + })" + } else { + "void ${name.toC()}()" + } + +private fun VarDecl<*>.unsafeBounds(parseContext: ParseContext) = + CComplexType.getType(ref, parseContext).accept(object : CComplexTypeVisitor?>() { + override fun visit(type: CInteger, param: Unit): Expr? { + return Or(Leq(ref, Int(-1_000_000_000)), Geq(ref, Int(1_000_000_000))) + } + + override fun visit(type: CBool?, param: Unit?): Expr? { + return null + } + }, Unit) + +private fun Set>.unsafeBounds(parseContext: ParseContext, intRangeConstraint: Boolean): String { + if (!intRangeConstraint) return "" + + val conditions = this.map { (it.unsafeBounds(parseContext))?.toC(parseContext) }.filterNotNull() + return if (conditions.isNotEmpty()) + "if (" + conditions.joinToString(" || ") + ") abort();" + else + "" +} + +fun XcfaProcedure.def(parseContext: ParseContext, intRangeConstraint: Boolean): String = """ + ${decl(parseContext)} { + // return parameter + ${if (params.isNotEmpty()) params[0].decl(parseContext) + ";" else ""} + + // variables + ${(vars - params.map { it.first }.toSet()).joinToString("\n") { it.decl(parseContext) + ";" }} + + ${vars.unsafeBounds(parseContext, intRangeConstraint)} + + // main logic + goto ${initLoc.name.toC()}; + + ${ + locs.joinToString("\n") { + """ + ${it.name.toC()}: + ${it.toC(parseContext, intRangeConstraint)} + """.trimIndent() + } +} + + // return expression + ${if (params.isNotEmpty()) "return " + params[0].first.name.toC() + ";" else ""} + } +""".trimIndent() + +private fun XcfaLocation.toC(parseContext: ParseContext, intRangeConstraint: Boolean): String = + if (this.error) { + "reach_error();" + } else when (outgoingEdges.size) { + 0 -> "goto ${name.toC()};" + 1 -> outgoingEdges.first().getFlatLabels().joinToString("\n") + { it.toC(parseContext, intRangeConstraint) } + " goto ${outgoingEdges.first().target.name.toC()};" + + 2 -> + """ + switch(__VERIFIER_nondet__Bool()) { + ${ + outgoingEdges.mapIndexed { index, xcfaEdge -> + "case $index: \n" + + xcfaEdge.getFlatLabels() + .joinToString("\n", postfix = "\n") { it.toC(parseContext, intRangeConstraint) } + + "goto ${xcfaEdge.target.name.toC()};\n" + }.joinToString("\n") + } + default: abort(); + } + """.trimIndent() + + else -> + """ + switch(__VERIFIER_nondet_int()) { + ${ + outgoingEdges.mapIndexed { index, xcfaEdge -> + "case $index: \n" + + xcfaEdge.getFlatLabels() + .joinToString("\n", postfix = "\n") { it.toC(parseContext, intRangeConstraint) } + + "goto ${xcfaEdge.target.name.toC()};\n" + }.joinToString("\n") + } + default: abort(); + } + """.trimIndent() + } + +private fun XcfaLabel.toC(parseContext: ParseContext, intRangeConstraint: Boolean): String = + when (this) { + is StmtLabel -> this.toC(parseContext, intRangeConstraint) + is SequenceLabel -> labels.joinToString("\n") { it.toC(parseContext, intRangeConstraint) } + is InvokeLabel -> "${params[0].toC(parseContext)} = ${name.toC()}(${ + params.subList(1, params.size).map { it.toC(parseContext) }.joinToString(", ") + });" + + else -> TODO("Not yet supported: $this") + } + +private fun StmtLabel.toC(parseContext: ParseContext, intRangeConstraint: Boolean): String = + when (stmt) { + is HavocStmt<*> -> "${stmt.varDecl.name.toC()} = __VERIFIER_nondet_${ + CComplexType.getType(stmt.varDecl.ref, parseContext).toC() + }(); ${setOf(stmt.varDecl).unsafeBounds(parseContext, intRangeConstraint)}" + + is AssignStmt<*> -> "${stmt.varDecl.name.toC()} = ${stmt.expr.toC(parseContext)};" + is AssumeStmt -> "if(!${stmt.cond.toC(parseContext)}) abort();" + else -> TODO("Not yet supported: $stmt") + } + +fun Pair, ParamDirection>.decl(parseContext: ParseContext): String = +// if(second == ParamDirection.IN) { + first.decl(parseContext) +// } else error("Only IN params are supported right now") + +fun VarDecl<*>.decl(parseContext: ParseContext): String = + "${CComplexType.getType(ref, parseContext).toC()} ${name.toC()}" + +private fun CComplexType.toC(): String = + when (this) { + is CArray -> "${this.embeddedType.toC()}_arr" + is CSignedInt -> "int" + is CUnsignedInt -> "unsigned int" + is CChar -> "char" + is CBool -> "_Bool" + else -> this.typeName + } + +// below functions implement the serialization of expressions to C-style expressions +fun Expr<*>.toC(parseContext: ParseContext) = + when (this) { + is NullaryExpr<*> -> this.toC(parseContext) + is UnaryExpr<*, *> -> this.toC(parseContext) + is BinaryExpr<*, *> -> this.toC(parseContext) + is MultiaryExpr<*, *> -> this.toC(parseContext) + is ArrayWriteExpr<*, *> -> this.toC(parseContext) + is ArrayReadExpr<*, *> -> this.toC(parseContext) + is IteExpr<*> -> this.toC(parseContext) + else -> TODO("Not yet supported: $this") + } + +fun ArrayWriteExpr<*, *>.toC(parseContext: ParseContext): String = + "array_write(${this.array.toC(parseContext)}, ${this.index.toC(parseContext)}, ${this.elem.toC(parseContext)})" + +fun ArrayReadExpr<*, *>.toC(parseContext: ParseContext): String = + "array_read(${this.array.toC(parseContext)}, ${this.index.toC(parseContext)})" + +fun IteExpr<*>.toC(parseContext: ParseContext): String = + "(${this.cond.toC(parseContext)} ? ${this.then.toC(parseContext)} : ${this.`else`.toC(parseContext)})" + +// nullary: ref + lit +fun NullaryExpr<*>.toC(parseContext: ParseContext): String = + when (this) { + is RefExpr<*> -> this.decl.name.toC() + is LitExpr<*> -> (this as LitExpr<*>).toC(parseContext) + else -> TODO("Not yet supported: $this") + } + +fun LitExpr<*>.toC(parseContext: ParseContext): String = + when (this) { + is FalseExpr -> "0" + is TrueExpr -> "1" + is IntLitExpr -> this.value.toString() + is RatLitExpr -> "(${this.num}.0/${this.denom}.0)" + is FpLitExpr -> FpUtils.fpLitExprToBigFloat(FpRoundingMode.RNE, this).toString() + is BvLitExpr -> BvUtils.neutralBvLitExprToBigInteger(this).toString() + else -> error("Not supported: $this") + } + + +fun UnaryExpr<*, *>.toC(parseContext: ParseContext): String = + "(${this.cOperator()} ${op.toC(parseContext)})" + +fun BinaryExpr<*, *>.toC(parseContext: ParseContext): String = + if (leftOp.type is ArrayType<*, *>) { + "${this.arrayCOperator()}(${leftOp.toC(parseContext)}, ${rightOp.toC(parseContext)})" + } else if (this is ModExpr<*>) { + "( (${leftOp.toC(parseContext)} % ${rightOp.toC(parseContext)} + ${rightOp.toC(parseContext)}) % ${ + rightOp.toC(parseContext) + } )" + } else { + "(${leftOp.toC(parseContext)} ${this.cOperator()} ${rightOp.toC(parseContext)})" + } + +fun MultiaryExpr<*, *>.toC(parseContext: ParseContext): String = + ops.joinToString(separator = " ${this.cOperator()} ", prefix = "(", postfix = ")") { it.toC(parseContext) } + +fun Expr<*>.cOperator() = + when (this) { + is EqExpr<*> -> "==" + is NeqExpr<*> -> "!=" + is OrExpr -> "||" + is AndExpr -> "&&" + is NotExpr -> "!" + // is ModExpr<*> -> "%" // handled above + is DivExpr<*> -> "/" + + is UnaryExpr<*, *> -> operatorLabel + is BinaryExpr<*, *> -> operatorLabel + is MultiaryExpr<*, *> -> operatorLabel + else -> TODO("Not yet implemented operator label for expr: $this") + } + +fun Expr<*>.arrayCOperator() = + when (this) { + is EqExpr<*> -> "array_equals" + is NeqExpr<*> -> "!array_equals" + else -> TODO("Not yet implemented array operator label for expr: $this") + } + +fun String.toC() = + this.replace(Regex("[^A-Za-z_0-9]"), "_") \ No newline at end of file diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/gson/FrontendMetadataAdapter.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/gson/FrontendMetadataAdapter.kt new file mode 100644 index 0000000000..7119455cf2 --- /dev/null +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/gson/FrontendMetadataAdapter.kt @@ -0,0 +1,142 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.xcfa.gson + +import com.google.gson.Gson +import com.google.gson.TypeAdapter +import com.google.gson.stream.JsonReader +import com.google.gson.stream.JsonToken +import com.google.gson.stream.JsonWriter +import hu.bme.mit.theta.frontend.FrontendMetadata + +class FrontendMetadataAdapter(val gsonSupplier: () -> Gson) : TypeAdapter() { + + private lateinit var gson: Gson + override fun write(writer: JsonWriter, value: FrontendMetadata) { + initGson() + writer.beginArray() + + for ((owner, tup) in value.lookupKeyValue.entries) { + writer.beginObject() + writer.name("owner").value(owner) + writer.name("values").beginArray() + for ((key, _val) in tup.entries) { + writer.beginObject() + if (_val is String) { + writer.name(key).value(_val) + } + if (_val is Boolean) { + writer.name(key).value(_val) + } + writer.endObject() + } + writer.endArray() + writer.endObject() + } + + writer.endArray() + } + + override fun read(reader: JsonReader): FrontendMetadata { + initGson() + + val lookupKeyValue = mutableMapOf>() + + reader.beginArray() + while (reader.hasNext()) { + reader.beginObject() + + var owner: Int? = null + var values: Map? = null + + while (reader.hasNext()) { + when (reader.nextName()) { + "owner" -> { + owner = reader.nextInt() + } + + "values" -> { + values = readValuesArray(reader) + } + + else -> { + reader.skipValue() + } + } + } + + reader.endObject() + + if (owner != null && values != null) { + lookupKeyValue[owner] = values + } + } + reader.endArray() + + return FrontendMetadata(lookupKeyValue) + } + + private fun readValuesArray(reader: JsonReader): Map { + val values = mutableMapOf() + + reader.beginArray() + while (reader.hasNext()) { + reader.beginObject() + + var key: String? = null + var value: Any? = null + + while (reader.hasNext()) { + when (reader.nextName()) { + "key" -> { + key = reader.nextString() + } + + "value" -> { + value = readValue(reader) + } + + else -> { + reader.skipValue() + } + } + } + + reader.endObject() + + if (key != null && value != null) { + values[key] = value + } + } + reader.endArray() + + return values + } + + private fun readValue(reader: JsonReader): Any { + return when { + reader.peek() == JsonToken.STRING -> reader.nextString() + reader.peek() == JsonToken.BOOLEAN -> reader.nextBoolean() + else -> reader.skipValue() + } + } + + private fun initGson() { + if (!this::gson.isInitialized) gson = gsonSupplier() + } + +} \ No newline at end of file diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/gson/ParseContextAdapter.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/gson/ParseContextAdapter.kt index 34dc1d4117..5f37876a6a 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/gson/ParseContextAdapter.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/gson/ParseContextAdapter.kt @@ -19,8 +19,13 @@ package hu.bme.mit.theta.xcfa.gson import com.google.gson.Gson import com.google.gson.TypeAdapter import com.google.gson.stream.JsonReader +import com.google.gson.stream.JsonToken import com.google.gson.stream.JsonWriter +import hu.bme.mit.theta.frontend.FrontendMetadata import hu.bme.mit.theta.frontend.ParseContext +import hu.bme.mit.theta.frontend.transformation.ArchitectureConfig +import hu.bme.mit.theta.frontend.transformation.CStmtCounter +import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.ArithmeticTrait class ParseContextAdapter(val gsonSupplier: () -> Gson) : TypeAdapter() { @@ -28,15 +33,78 @@ class ParseContextAdapter(val gsonSupplier: () -> Gson) : TypeAdapter = mutableSetOf() + var architecture: ArchitectureConfig.ArchitectureType? = null + var multiThreading: Boolean? = null + var arithmetic: ArchitectureConfig.ArithmeticType? = null + reader.beginObject() + while (reader.hasNext()) { + when (reader.nextName()) { + "metadata" -> { + metadata = gson.fromJson(reader, FrontendMetadata::class.java) + } + + "cStmtCounter" -> { + cStmtCounter = gson.fromJson(reader, CStmtCounter::class.java) + } + + "bitwiseOption" -> { + reader.beginArray() + while (reader.peek() != JsonToken.END_ARRAY) { + val optionName = reader.nextString() + arithmeticTraits.add(ArithmeticTrait.valueOf(optionName)) + } + reader.endArray() + } + + "architecture" -> { + val architectureName = reader.nextString() + architecture = ArchitectureConfig.ArchitectureType.valueOf(architectureName) + } + + "multiThreading" -> { + multiThreading = reader.nextBoolean() + } + + "arithmetic" -> { + val arithmeticName = reader.nextString() + arithmetic = ArchitectureConfig.ArithmeticType.valueOf(arithmeticName) + } + + else -> { + reader.skipValue() + } + } + } reader.endObject() - return ParseContext() + + return ParseContext(metadata, cStmtCounter, arithmeticTraits, architecture, multiThreading, arithmetic) } private fun initGson() { diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Builders.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Builders.kt index 077a589ad1..b0dbbac1d2 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Builders.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Builders.kt @@ -30,7 +30,8 @@ class XcfaBuilder @JvmOverloads constructor( private val vars: MutableSet = LinkedHashSet(), private val procedures: MutableSet = LinkedHashSet(), private val initProcedures: MutableList>>> = ArrayList(), - val metaData: MutableMap = LinkedHashMap()) { + val metaData: MutableMap = LinkedHashMap() +) { fun getVars(): Set = vars fun getProcedures(): Set = procedures @@ -63,7 +64,7 @@ class XcfaBuilder @JvmOverloads constructor( @XcfaDsl class XcfaProcedureBuilder @JvmOverloads constructor( var name: String, - private val manager: ProcedurePassManager, + val manager: ProcedurePassManager, private val params: MutableList, ParamDirection>> = ArrayList(), private val vars: MutableSet> = LinkedHashSet(), private val locs: MutableSet = LinkedHashSet(), @@ -78,23 +79,60 @@ class XcfaProcedureBuilder @JvmOverloads constructor( var errorLoc: Optional = Optional.empty() private set lateinit var parent: XcfaBuilder - private lateinit var optimized: XcfaProcedureBuilder private lateinit var built: XcfaProcedure - fun getParams(): List, ParamDirection>> = if (this::optimized.isInitialized) optimized.params else params - fun getVars(): Set> = if (this::optimized.isInitialized) optimized.vars else vars - fun getLocs(): Set = if (this::optimized.isInitialized) optimized.locs else locs - fun getEdges(): Set = if (this::optimized.isInitialized) optimized.edges else edges + private lateinit var optimized: XcfaProcedureBuilder + private lateinit var partlyOptimized: XcfaProcedureBuilder + private var lastOptimized: Int = -1 + fun getParams(): List, ParamDirection>> = when { + this::optimized.isInitialized -> optimized.params + this::partlyOptimized.isInitialized -> partlyOptimized.params + else -> params + } + + fun getVars(): Set> = when { + this::optimized.isInitialized -> optimized.vars + this::partlyOptimized.isInitialized -> partlyOptimized.vars + else -> vars + } + + fun getLocs(): Set = when { + this::optimized.isInitialized -> optimized.locs + this::partlyOptimized.isInitialized -> partlyOptimized.locs + else -> locs + } + + fun getEdges(): Set = when { + this::optimized.isInitialized -> optimized.edges + this::partlyOptimized.isInitialized -> partlyOptimized.edges + else -> edges + } fun optimize() { if (!this::optimized.isInitialized) { var that = this - for (pass in manager.passes) { + for (pass in manager.passes.flatten()) { that = pass.run(that) } optimized = that } } + fun optimize(phase: Int): Boolean { // true, if optimization is finished (no more phases to execute) + if (this::optimized.isInitialized || phase >= manager.passes.size) return true + if (phase <= lastOptimized) return lastOptimized >= manager.passes.size - 1 + check(phase == lastOptimized + 1) { "Wrong optimization phase!" } + + var that = if (this::partlyOptimized.isInitialized) partlyOptimized else this + for (pass in manager.passes[phase]) { + that = pass.run(that) + } + + partlyOptimized = that + lastOptimized = phase + if (phase >= manager.passes.size - 1) optimized = that + return phase >= manager.passes.size - 1 + } + fun build(parent: XCFA): XcfaProcedure { if (this::built.isInitialized) return built; if (!this::optimized.isInitialized) optimize() @@ -113,21 +151,18 @@ class XcfaProcedureBuilder @JvmOverloads constructor( } fun addParam(toAdd: VarDecl<*>, dir: ParamDirection) { - check( - !this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } + check(!this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } params.add(Pair(toAdd, dir)) vars.add(toAdd) } fun addVar(toAdd: VarDecl<*>) { - check( - !this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } + check(!this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } vars.add(toAdd) } fun removeVar(toRemove: VarDecl<*>) { - check( - !this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } + check(!this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } vars.remove(toRemove) } @@ -159,8 +194,7 @@ class XcfaProcedureBuilder @JvmOverloads constructor( } fun addEdge(toAdd: XcfaEdge) { - check( - !this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } + check(!this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } addLoc(toAdd.source) addLoc(toAdd.target) edges.add(toAdd) @@ -169,8 +203,7 @@ class XcfaProcedureBuilder @JvmOverloads constructor( } fun addLoc(toAdd: XcfaLocation) { - check( - !this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } + check(!this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } if (!locs.contains(toAdd)) { check(!toAdd.error) check(!toAdd.initial) @@ -180,31 +213,33 @@ class XcfaProcedureBuilder @JvmOverloads constructor( } fun removeEdge(toRemove: XcfaEdge) { - check( - !this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } + check(!this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } toRemove.source.outgoingEdges.remove(toRemove) toRemove.target.incomingEdges.remove(toRemove) edges.remove(toRemove) } fun removeLoc(toRemove: XcfaLocation) { - check( - !this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } + check(!this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } locs.remove(toRemove) } fun removeLocs(pred: (XcfaLocation) -> Boolean) { - check( - !this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } + check(!this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } while (locs.any(pred)) { locs.removeIf(pred) - edges.removeIf { pred(it.source) } + edges.removeIf { + pred(it.source).also { removing -> + if (removing) { + it.target.incomingEdges.remove(it) + } + } + } } } fun changeVars(varLut: Map, VarDecl<*>>) { - check( - !this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } + check(!this::optimized.isInitialized) { "Cannot add/remove new elements after optimization passes!" } val savedVars = ArrayList(vars) vars.clear() savedVars.forEach { vars.add(checkNotNull(varLut[it])) } diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Dsl.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Dsl.kt index 303380f610..3be0685c52 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Dsl.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Dsl.kt @@ -312,5 +312,5 @@ fun XcfaBuilder.procedure(name: String, passManager: ProcedurePassManager, fun XcfaBuilder.procedure(name: String, lambda: XcfaProcedureBuilderContext.() -> Unit): XcfaProcedureBuilderContext { - return procedure(name, ProcedurePassManager(emptyList()), lambda) + return procedure(name, ProcedurePassManager(), lambda) } \ No newline at end of file diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XCFA.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XCFA.kt index 2f3f367246..0916e1e5ca 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XCFA.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XCFA.kt @@ -30,19 +30,29 @@ class XCFA( var cachedHash: Int? = null - var procedures: Set = // procedure definitions - procedureBuilders.map { it.build(this) }.toSet() + var procedures: Set // procedure definitions private set - var initProcedures: List>>> = // procedure names and parameter assignments - initProcedureBuilders.map { Pair(it.first.build(this), it.second) } + + var initProcedures: List>>> // procedure names and parameter assignments private set + init { + var phase = 0 + do { + var ready = true + procedureBuilders.forEach { ready = it.optimize(phase) && ready } + initProcedureBuilders.forEach { ready = it.first.optimize(phase) && ready } + phase++ + } while (!ready) + + procedures = procedureBuilders.map { it.build(this) }.toSet() + initProcedures = initProcedureBuilders.map { Pair(it.first.build(this), it.second) } + } + /** * Recreate an existing XCFA by substituting the procedures and initProcedures fields. */ - fun recreate(procedures: Set, - initProcedures: List>>> - ): XCFA { + fun recreate(procedures: Set, initProcedures: List>>>): XCFA { this.procedures = procedures this.initProcedures = initProcedures return this diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/CLibraryFunctionsPass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/CLibraryFunctionsPass.kt new file mode 100644 index 0000000000..4d9a952f18 --- /dev/null +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/CLibraryFunctionsPass.kt @@ -0,0 +1,138 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.xcfa.passes + +import hu.bme.mit.theta.core.decl.VarDecl +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.anytype.RefExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.frontend.ParseContext +import hu.bme.mit.theta.frontend.transformation.grammar.expression.Reference +import hu.bme.mit.theta.xcfa.model.* + +/** + * Transforms the library procedure calls with names in supportedFunctions into model elements. + * Requires the ProcedureBuilder be `deterministic`. + */ +class CLibraryFunctionsPass(val parseContext: ParseContext) : ProcedurePass { + + private val supportedFunctions = setOf( + "printf", + "pthread_join", + "pthread_create", + "pthread_mutex_lock", + "pthread_mutex_unlock", + "pthread_cond_wait", + "pthread_cond_signal", + "pthread_mutex_init", + "pthread_cond_init" + ) + + override fun run(builder: XcfaProcedureBuilder): XcfaProcedureBuilder { + checkNotNull(builder.metaData["deterministic"]) + for (edge in ArrayList(builder.getEdges())) { + val edges = edge.splitIf(this::predicate) + if (edges.size > 1 || (edges.size == 1 && predicate((edges[0].label as SequenceLabel).labels[0]))) { + builder.removeEdge(edge) + edges.forEach { + if (predicate((it.label as SequenceLabel).labels[0])) { + val invokeLabel = it.label.labels[0] as InvokeLabel + val metadata = invokeLabel.metadata + val labels: List = when (invokeLabel.name) { + "printf" -> listOf(NopLabel) + "pthread_join" -> { + var handle = invokeLabel.params[1] + while (handle is Reference<*, *>) handle = handle.op + check(handle is RefExpr && (handle as RefExpr).decl is VarDecl) + + listOf(JoinLabel((handle as RefExpr).decl as VarDecl<*>, metadata)) + } + + "pthread_create" -> { + var handle = invokeLabel.params[1] + while (handle is Reference<*, *>) handle = handle.op + check(handle is RefExpr && (handle as RefExpr).decl is VarDecl) + + val funcptr = invokeLabel.params[3] + check(funcptr is RefExpr && (funcptr as RefExpr).decl is VarDecl) + + val param = invokeLabel.params[4] + + listOf(StartLabel((funcptr as RefExpr).decl.name, + listOf(Int(0), param), // int(0) to solve StartLabel not handling return params + (handle as RefExpr).decl as VarDecl<*>, metadata)) + } + + "pthread_mutex_lock" -> { + var handle = invokeLabel.params[1] + while (handle is Reference<*, *>) handle = handle.op + check(handle is RefExpr && (handle as RefExpr).decl is VarDecl) + + listOf(FenceLabel(setOf("mutex_lock(${handle.decl.name})"), metadata)) + } + + "pthread_mutex_unlock" -> { + var handle = invokeLabel.params[1] + while (handle is Reference<*, *>) handle = handle.op + check(handle is RefExpr && (handle as RefExpr).decl is VarDecl) + + listOf(FenceLabel(setOf("mutex_unlock(${handle.decl.name})"), metadata)) + } + + "pthread_cond_wait" -> { + var cond = invokeLabel.params[1] + while (cond is Reference<*, *>) cond = cond.op + var handle = invokeLabel.params[2] + while (handle is Reference<*, *>) handle = handle.op + check(cond is RefExpr && (cond as RefExpr).decl is VarDecl) + check(handle is RefExpr && (handle as RefExpr).decl is VarDecl) + + listOf( + FenceLabel(setOf("start_cond_wait(${cond.decl.name},${handle.decl.name})"), + metadata), + FenceLabel(setOf("cond_wait(${cond.decl.name},${handle.decl.name})"), metadata) + ) + } + + "pthread_cond_signal" -> { + var cond = invokeLabel.params[1] + while (cond is Reference<*, *>) cond = cond.op + check(cond is RefExpr && (cond as RefExpr).decl is VarDecl) + + listOf(FenceLabel(setOf("cond_signal(${cond.decl.name})"), metadata)) + } + + "pthread_mutex_init", "pthread_cond_init" -> listOf(NopLabel) + + else -> error("Unsupported library function ${invokeLabel.name}") + } + edge.withLabel(SequenceLabel(labels)).splitIf { label -> + label is FenceLabel && label.labels.any { l -> l.startsWith("start_cond_wait") } + }.forEach(builder::addEdge) + } else { + builder.addEdge(edge.withLabel(SequenceLabel(it.label.labels))) + } + } + } + } + return builder + } + + private fun predicate(it: XcfaLabel): Boolean { + return it is InvokeLabel && it.name in supportedFunctions + } +} \ No newline at end of file diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/FpFunctionsToExprsPass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/FpFunctionsToExprsPass.kt index 9a05a150e1..6ea24362ca 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/FpFunctionsToExprsPass.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/FpFunctionsToExprsPass.kt @@ -124,7 +124,9 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { val expr = callStmt.params[0] Preconditions.checkState(expr is RefExpr<*>) val assign = Stmts.Assign((expr as RefExpr<*>).decl as VarDecl, - FpRoundToIntegralExpr.of(FpRoundingMode.RTZ, callStmt.params[1] as Expr)) + FpRoundToIntegralExpr.of(FpRoundingMode.RTZ, + TypeUtils.cast(CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), + CComplexType.getType(expr, parseContext).smtType) as Expr)) if (parseContext.getMetadata().getMetadataValue(expr, "cType").isPresent) { parseContext.getMetadata().create(assign.expr, "cType", CComplexType.getType(expr, parseContext)) } @@ -136,7 +138,9 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { val expr = callStmt.params[0] Preconditions.checkState(expr is RefExpr<*>) val assign = Stmts.Assign((expr as RefExpr<*>).decl as VarDecl, - FpRoundToIntegralExpr.of(FpRoundingMode.RTP, callStmt.params[1] as Expr)) + FpRoundToIntegralExpr.of(FpRoundingMode.RTP, + TypeUtils.cast(CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), + CComplexType.getType(expr, parseContext).smtType) as Expr)) if (parseContext.getMetadata().getMetadataValue(expr, "cType").isPresent) { parseContext.getMetadata().create(assign.expr, "cType", CComplexType.getType(expr, parseContext)) } @@ -151,7 +155,8 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { val assign: AssignStmt<*> = Stmts.Assign( TypeUtils.cast((expr as RefExpr<*>).decl as VarDecl<*>, type.smtType), TypeUtils.cast(AbstractExprs.Ite( - FpIsInfiniteExpr.of(callStmt.params[1] as Expr), type.unitValue, type.nullValue), + FpIsInfiniteExpr.of(callStmt.params[1] as Expr), + type.unitValue, type.nullValue), type.smtType)) parseContext.metadata.create(assign.expr, "cType", type) return StmtLabel(assign, metadata = callStmt.metadata) @@ -166,7 +171,8 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { val assign: AssignStmt<*> = Stmts.Assign( TypeUtils.cast((expr as RefExpr<*>).decl as VarDecl<*>, type.smtType), TypeUtils.cast(AbstractExprs.Ite( - FpIsInfiniteExpr.of(callStmt.params[1] as Expr), type.nullValue, type.unitValue), + FpIsInfiniteExpr.of(callStmt.params[1] as Expr), + type.nullValue, type.unitValue), type.smtType)) parseContext.metadata.create(assign.expr, "cType", type) return StmtLabel(assign, metadata = callStmt.metadata) @@ -191,7 +197,8 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { val assign: AssignStmt<*> = Stmts.Assign( TypeUtils.cast((expr as RefExpr<*>).decl as VarDecl<*>, type.smtType), TypeUtils.cast( - AbstractExprs.Ite(FpIsNanExpr.of(callStmt.params[1] as Expr), + AbstractExprs.Ite( + FpIsNanExpr.of(callStmt.params[1] as Expr), type.unitValue, type.nullValue), type.smtType)) parseContext.getMetadata().create(assign.expr, "cType", type) return StmtLabel(assign, metadata = callStmt.metadata) @@ -205,7 +212,9 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { val expr = callStmt.params[0] Preconditions.checkState(expr is RefExpr<*>) val assign = Stmts.Assign((expr as RefExpr<*>).decl as VarDecl, - FpRoundToIntegralExpr.of(FpRoundingMode.RNA, callStmt.params[1] as Expr)) + FpRoundToIntegralExpr.of(FpRoundingMode.RNA, + TypeUtils.cast(CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), + CComplexType.getType(expr, parseContext).smtType) as Expr)) if (parseContext.getMetadata().getMetadataValue(expr, "cType").isPresent) { parseContext.getMetadata().create(assign.expr, "cType", CComplexType.getType(expr, parseContext)) } @@ -217,7 +226,9 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { val expr = callStmt.params[0] Preconditions.checkState(expr is RefExpr<*>) val assign = Stmts.Assign((expr as RefExpr<*>).decl as VarDecl, - FpSqrtExpr.of(FpRoundingMode.RNE, callStmt.params[1] as Expr)) + FpSqrtExpr.of(FpRoundingMode.RNE, + TypeUtils.cast(CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), + CComplexType.getType(expr, parseContext).smtType) as Expr)) if (parseContext.getMetadata().getMetadataValue(expr, "cType").isPresent) { parseContext.getMetadata().create(assign.expr, "cType", CComplexType.getType(expr, parseContext)) } @@ -234,8 +245,10 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { val expr = callStmt.params[0] Preconditions.checkState(expr is RefExpr<*>) val assign = Stmts.Assign((expr as RefExpr<*>).decl as VarDecl, - FpMinExpr.of(callStmt.params[1] as Expr, - callStmt.params[2] as Expr)) + FpMinExpr.of(TypeUtils.cast(CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), + CComplexType.getType(expr, parseContext).smtType) as Expr, + TypeUtils.cast(CComplexType.getType(expr, parseContext).castTo(callStmt.params[2]), + CComplexType.getType(expr, parseContext).smtType) as Expr)) if (parseContext.getMetadata().getMetadataValue(expr, "cType").isPresent) { parseContext.getMetadata().create(assign.expr, "cType", CComplexType.getType(expr, parseContext)) } @@ -248,8 +261,10 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { val expr = callStmt.params[0] Preconditions.checkState(expr is RefExpr<*>) val assign = Stmts.Assign((expr as RefExpr<*>).decl as VarDecl, - FpMaxExpr.of(callStmt.params[1] as Expr, - callStmt.params[2] as Expr)) + FpMaxExpr.of(TypeUtils.cast(CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), + CComplexType.getType(expr, parseContext).smtType) as Expr, + TypeUtils.cast(CComplexType.getType(expr, parseContext).castTo(callStmt.params[2]), + CComplexType.getType(expr, parseContext).smtType) as Expr)) if (parseContext.getMetadata().getMetadataValue(expr, "cType").isPresent) { parseContext.getMetadata().create(assign.expr, "cType", CComplexType.getType(expr, parseContext)) } @@ -261,7 +276,9 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { val expr = callStmt.params[0] Preconditions.checkState(expr is RefExpr<*>) val assign = Stmts.Assign((expr as RefExpr<*>).decl as VarDecl, - FpRoundToIntegralExpr.of(FpRoundingMode.RTN, callStmt.params[1] as Expr)) + FpRoundToIntegralExpr.of(FpRoundingMode.RTN, + TypeUtils.cast(CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), + CComplexType.getType(expr, parseContext).smtType) as Expr)) if (parseContext.getMetadata().getMetadataValue(expr, "cType").isPresent) { parseContext.getMetadata().create(assign.expr, "cType", CComplexType.getType(expr, parseContext)) } @@ -273,7 +290,8 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { val expr = callStmt.params[0] Preconditions.checkState(expr is RefExpr<*>) val assign = Stmts.Assign((expr as RefExpr<*>).decl as VarDecl, - FpAbsExpr.of(callStmt.params[1] as Expr)) + FpAbsExpr.of(TypeUtils.cast(CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), + CComplexType.getType(expr, parseContext).smtType) as Expr)) if (parseContext.getMetadata().getMetadataValue(expr, "cType").isPresent) { parseContext.getMetadata().create(assign.expr, "cType", CComplexType.getType(expr, parseContext)) } diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/HavocPromotionAndRange.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/HavocPromotionAndRange.kt index 707fbd4db6..e05160d6fe 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/HavocPromotionAndRange.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/HavocPromotionAndRange.kt @@ -38,21 +38,13 @@ class HavocPromotionAndRange(val parseContext: ParseContext) : ProcedurePass { override fun run(builder: XcfaProcedureBuilder): XcfaProcedureBuilder { checkNotNull(builder.metaData["deterministic"]) - -// val varEdgeLut = LinkedHashMap, MutableList>() -// builder.getEdges().forEach { it.label.collectVars().forEach { v -> -// varEdgeLut.putIfAbsent(v, ArrayList()) -// varEdgeLut[v]!!.add(it) -// } } - val edges = LinkedHashSet(builder.getEdges()) for (edge in edges) { var candidates = (edge.label as SequenceLabel).labels .mapIndexed { index, it -> Pair(index, it) } .filter { it.second is StmtLabel && - (it.second as StmtLabel).stmt is HavocStmt<*> //&& -// varEdgeLut[((it.second as StmtLabel).stmt as HavocStmt<*>).varDecl]!!.size == 1 + (it.second as StmtLabel).stmt is HavocStmt<*> } if (candidates.isNotEmpty()) { val labelEdgeLut = LinkedHashMap, MutableList>() diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/InlineProceduresPass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/InlineProceduresPass.kt index 3a42d18c37..5cfbfa728c 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/InlineProceduresPass.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/InlineProceduresPass.kt @@ -34,19 +34,16 @@ class InlineProceduresPass(val parseContext: ParseContext) : ProcedurePass { override fun run(builder: XcfaProcedureBuilder): XcfaProcedureBuilder { if (!builder.canInline()) return builder checkNotNull(builder.metaData["deterministic"]) - check( - builder.metaData["inlined"] == null) { "Recursive programs are not supported by inlining." } + check(builder.metaData["inlined"] == null) { "Recursive programs are not supported by inlining." } builder.metaData["inlined"] = Unit while (true) { var foundOne = false for (edge in ArrayList(builder.getEdges())) { val pred: (XcfaLabel) -> Boolean = { it -> - it is InvokeLabel && builder.parent.getProcedures() - .any { p -> p.name == it.name } + it is InvokeLabel && builder.parent.getProcedures().any { p -> p.name == it.name } } val edges = edge.splitIf(pred) - if (edges.size > 1 || (edges.size == 1 && pred( - (edges[0].label as SequenceLabel).labels[0]))) { + if (edges.size > 1 || (edges.size == 1 && pred((edges[0].label as SequenceLabel).labels[0]))) { builder.removeEdge(edge) edges.forEach { if (pred((it.label as SequenceLabel).labels[0])) { @@ -54,10 +51,12 @@ class InlineProceduresPass(val parseContext: ParseContext) : ProcedurePass { val source = it.source val target = it.target val invokeLabel: InvokeLabel = it.label.labels[0] as InvokeLabel - val procedure = builder.parent.getProcedures() - .find { p -> p.name == invokeLabel.name } + val procedure = builder.parent.getProcedures().find { p -> p.name == invokeLabel.name } checkNotNull(procedure) - procedure.optimize() + val inlineIndex = builder.manager.passes.indexOfFirst { phase -> + phase.any { pass -> pass is InlineProceduresPass } + } + procedure.optimize(inlineIndex) val newLocs: MutableMap = LinkedHashMap() procedure.getLocs().forEach { newLocs.put(it, it.inlinedCopy()) } @@ -91,8 +90,7 @@ class InlineProceduresPass(val parseContext: ParseContext) : ProcedurePass { val finalLoc = procedure.finalLoc val errorLoc = procedure.errorLoc - builder.addEdge( - XcfaEdge(source, checkNotNull(newLocs[initLoc]), SequenceLabel(inStmts))) + builder.addEdge(XcfaEdge(source, checkNotNull(newLocs[initLoc]), SequenceLabel(inStmts))) if (finalLoc.isPresent) builder.addEdge(XcfaEdge(checkNotNull(newLocs[finalLoc.get()]), target, SequenceLabel(outStmts))) @@ -116,7 +114,6 @@ class InlineProceduresPass(val parseContext: ParseContext) : ProcedurePass { } private fun XcfaLocation.inlinedCopy(): XcfaLocation { - return copy(name + XcfaLocation.uniqueCounter(), initial = false, final = false, - error = false) + return copy(name + XcfaLocation.uniqueCounter(), initial = false, final = false, error = false) } } \ No newline at end of file diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/LbePass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/LbePass.kt index 96cbd7832a..8dc4983876 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/LbePass.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/LbePass.kt @@ -96,9 +96,9 @@ class LbePass(val parseContext: ParseContext) : ProcedurePass { * */ override fun run(builder: XcfaProcedureBuilder): XcfaProcedureBuilder { - if (level == LbeLevel.NO_LBE || builder.errorLoc.isEmpty) return builder + if (level == LbeLevel.NO_LBE) return builder - if (level == LbeLevel.LBE_SEQ || level == LbeLevel.LBE_FULL && parseContext.multiThreading) { + if ((level == LbeLevel.LBE_SEQ || level == LbeLevel.LBE_FULL) && parseContext.multiThreading) { level = LbeLevel.LBE_LOCAL } @@ -107,7 +107,9 @@ class LbePass(val parseContext: ParseContext) : ProcedurePass { this.builder = builder // Step 0 - builder.errorLoc.get().outgoingEdges.forEach(builder::removeEdge) + if (builder.errorLoc.isPresent) { + builder.errorLoc.get().outgoingEdges.forEach(builder::removeEdge) + } // Step 1 if (level == LbeLevel.LBE_LOCAL) { @@ -124,9 +126,6 @@ class LbePass(val parseContext: ParseContext) : ProcedurePass { return builder } - val isPostInlining: Boolean - get() = true - /** * Collapses atomic blocks sequentially. */ @@ -306,7 +305,10 @@ class LbePass(val parseContext: ParseContext) : ProcedurePass { private fun isNotLocal(edge: XcfaEdge): Boolean { return !edge.getFlatLabels().all { label -> !(label is StartLabel || label is JoinLabel) && label.collectVars().all(builder.getVars()::contains) && - !(label is StmtLabel && label.stmt is AssumeStmt && label.stmt.cond is FalseExpr) + !(label is StmtLabel && label.stmt is AssumeStmt && label.stmt.cond is FalseExpr) && + !(label is FenceLabel && label.labels.any { name -> + listOf("ATOMIC_BEGIN", "mutex_lock", "cond_wait").any { name.startsWith(it) } + }) } } } \ No newline at end of file diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/LoopUnrollPass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/LoopUnrollPass.kt index f8281e686a..9b7a4ac9d5 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/LoopUnrollPass.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/LoopUnrollPass.kt @@ -67,22 +67,21 @@ class LoopUnrollPass : ProcedurePass { state = transFunc.getSuccStates(state, BasicStmtAction(loopVarInit), prec).first() var cnt = 0 - while (!transFunc.getSuccStates(state, BasicStmtAction(loopCondEdge), prec) - .first().isBottom - ) { + while (!transFunc.getSuccStates(state, BasicStmtAction(loopCondEdge), prec).first().isBottom) { cnt++ if (cnt > UNROLL_LIMIT) return -1 - state = - transFunc.getSuccStates(state, BasicStmtAction(loopVarModifiers), prec).first() + state = transFunc.getSuccStates(state, BasicStmtAction(loopVarModifiers), prec).first() } return cnt } private fun XcfaLabel.removeCondition(): XcfaLabel { - val stmtToRemove = - getFlatLabels().find { it is StmtLabel && it.stmt is AssumeStmt && (it.collectVars() - loopVar).isEmpty() } + val stmtToRemove = getFlatLabels().find { + it is StmtLabel && it.stmt is AssumeStmt && (it.collectVars() - loopVar).isEmpty() + } return when { this == stmtToRemove -> NopLabel + this is SequenceLabel -> SequenceLabel( labels.map { it.removeCondition() }, metadata ) diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/NormalizePass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/NormalizePass.kt index dcb7426944..1642a24fc7 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/NormalizePass.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/NormalizePass.kt @@ -16,6 +16,8 @@ package hu.bme.mit.theta.xcfa.passes +import hu.bme.mit.theta.core.stmt.AssumeStmt +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.frontend.ParseContext import hu.bme.mit.theta.xcfa.model.* @@ -63,6 +65,9 @@ class NormalizePass(val parseContext: ParseContext) : ProcedurePass { } is NopLabel -> {} + is StmtLabel -> if (!(label.stmt is AssumeStmt && label.stmt.cond.equals( + True()))) collector.forEach { it.add(label) } + else -> collector.forEach { it.add(label) } } } diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/ProcedurePassManager.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/ProcedurePassManager.kt index ab2faf0fe3..2ab650f279 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/ProcedurePassManager.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/ProcedurePassManager.kt @@ -16,11 +16,53 @@ package hu.bme.mit.theta.xcfa.passes +import hu.bme.mit.theta.common.logging.Logger import hu.bme.mit.theta.frontend.ParseContext -open class ProcedurePassManager(val passes: List) +open class ProcedurePassManager(vararg passes: List) { -class CPasses(checkOverflow: Boolean, parseContext: ParseContext) : ProcedurePassManager(listOf( + val passes: List> = passes.toList() +} + +class CPasses(checkOverflow: Boolean, parseContext: ParseContext, uniqueWarningLogger: Logger) : ProcedurePassManager( + listOf( + // formatting + NormalizePass(parseContext), + DeterministicPass(parseContext), + // removing redundant elements + EmptyEdgeRemovalPass(parseContext), + UnusedLocRemovalPass(parseContext), + // handling intrinsics + ErrorLocationPass(checkOverflow, parseContext), + FinalLocationPass(checkOverflow, parseContext), + SvCompIntrinsicsPass(parseContext), + FpFunctionsToExprsPass(parseContext), + CLibraryFunctionsPass(parseContext), + ), + listOf( + // optimizing + SimplifyExprsPass(parseContext), + LoopUnrollPass(), + ), + listOf( + // trying to inline procedures + InlineProceduresPass(parseContext), + RemoveDeadEnds(parseContext), + EliminateSelfLoops(parseContext), + ), + listOf( + // handling remaining function calls + NondetFunctionPass(parseContext), + LbePass(parseContext), + NormalizePass(parseContext), // needed after lbe, TODO + DeterministicPass(parseContext), // needed after lbe, TODO + HavocPromotionAndRange(parseContext), + // Final cleanup + UnusedVarPass(parseContext, uniqueWarningLogger), + ) +) + +class ChcPasses(parseContext: ParseContext, uniqueWarningLogger: Logger) : ProcedurePassManager(listOf( // formatting NormalizePass(parseContext), DeterministicPass(parseContext), @@ -30,53 +72,24 @@ class CPasses(checkOverflow: Boolean, parseContext: ParseContext) : ProcedurePas // optimizing SimplifyExprsPass(parseContext), // handling intrinsics - ErrorLocationPass(checkOverflow, parseContext), - FinalLocationPass(checkOverflow, parseContext), - SvCompIntrinsicsPass(parseContext), - FpFunctionsToExprsPass(parseContext), - PthreadFunctionsPass(parseContext), - LoopUnrollPass(), +// ErrorLocationPass(false), +// FinalLocationPass(false), +// SvCompIntrinsicsPass(), +// FpFunctionsToExprsPass(), +// PthreadFunctionsPass(), // trying to inline procedures +), listOf( InlineProceduresPass(parseContext), RemoveDeadEnds(parseContext), EliminateSelfLoops(parseContext), // handling remaining function calls - NondetFunctionPass(parseContext), +// NondetFunctionPass(), LbePass(parseContext), NormalizePass(parseContext), // needed after lbe, TODO DeterministicPass(parseContext), // needed after lbe, TODO - HavocPromotionAndRange(parseContext), +// HavocPromotionAndRange(), // Final cleanup - UnusedVarPass(parseContext), + UnusedVarPass(parseContext, uniqueWarningLogger), )) -class ChcPasses : ProcedurePassManager(listOf(/* - // formatting - NormalizePass(), - DeterministicPass(), - // removing redundant elements - EmptyEdgeRemovalPass(), - UnusedLocRemovalPass(), - // optimizing - SimplifyExprsPass(), - // handling intrinsics -// ErrorLocationPass(false), -// FinalLocationPass(false), -// SvCompIntrinsicsPass(), -// FpFunctionsToExprsPass(), -// PthreadFunctionsPass(), - // trying to inline procedures - InlineProceduresPass(), - RemoveDeadEnds(), - EliminateSelfLoops(), - // handling remaining function calls -// NondetFunctionPass(), - LbePass(), - NormalizePass(), // needed after lbe, TODO - DeterministicPass(), // needed after lbe, TODO -// HavocPromotionAndRange(), - // Final cleanup - UnusedVarPass(), -*/)) - -class LitmusPasses : ProcedurePassManager(emptyList()) \ No newline at end of file +class LitmusPasses : ProcedurePassManager() \ No newline at end of file diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/PthreadFunctionsPass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/PthreadFunctionsPass.kt deleted file mode 100644 index bfe9f56947..0000000000 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/PthreadFunctionsPass.kt +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2023 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package hu.bme.mit.theta.xcfa.passes - -import hu.bme.mit.theta.core.decl.VarDecl -import hu.bme.mit.theta.core.type.Type -import hu.bme.mit.theta.core.type.anytype.RefExpr -import hu.bme.mit.theta.core.type.inttype.IntExprs.Int -import hu.bme.mit.theta.frontend.ParseContext -import hu.bme.mit.theta.frontend.transformation.grammar.expression.Reference -import hu.bme.mit.theta.xcfa.model.* - -/** - * Transforms the following pthread procedure calls into model elements: - * - pthread_create() - * - pthread_join() - * Requires the ProcedureBuilder be `deterministic`. - */ -class PthreadFunctionsPass(val parseContext: ParseContext) : ProcedurePass { - - override fun run(builder: XcfaProcedureBuilder): XcfaProcedureBuilder { - checkNotNull(builder.metaData["deterministic"]) - for (edge in ArrayList(builder.getEdges())) { - val edges = edge.splitIf(this::predicate) - if (edges.size > 1 || (edges.size == 1 && predicate( - (edges[0].label as SequenceLabel).labels[0]))) { - builder.removeEdge(edge) - val labels: MutableList = ArrayList() - edges.forEach { - if (predicate((it.label as SequenceLabel).labels[0])) { - val invokeLabel = it.label.labels[0] as InvokeLabel - val fence = when (invokeLabel.name) { - "pthread_join" -> { - var handle = invokeLabel.params[1] - while (handle is Reference<*, *>) handle = handle.op - check( - handle is RefExpr && (handle as RefExpr).decl is VarDecl) - - JoinLabel((handle as RefExpr).decl as VarDecl<*>, - metadata = invokeLabel.metadata) - } - - "pthread_create" -> { - var handle = invokeLabel.params[1] - while (handle is Reference<*, *>) handle = handle.op - check( - handle is RefExpr && (handle as RefExpr).decl is VarDecl) - - val funcptr = invokeLabel.params[3] - check( - funcptr is RefExpr && (funcptr as RefExpr).decl is VarDecl) - - val param = invokeLabel.params[4] - - StartLabel((funcptr as RefExpr).decl.name, - listOf(Int(0), param), // int(0) to solve StartLabel not handling return params - (handle as RefExpr).decl as VarDecl<*>, - metadata = invokeLabel.metadata) - } - - "pthread_mutex_lock" -> { - var handle = invokeLabel.params[1] - while (handle is Reference<*, *>) handle = handle.op - check( - handle is RefExpr && (handle as RefExpr).decl is VarDecl) - - FenceLabel(setOf("mutex_lock(${handle.decl.name})"), - metadata = invokeLabel.metadata) - } - - "pthread_mutex_unlock" -> { - var handle = invokeLabel.params[1] - while (handle is Reference<*, *>) handle = handle.op - check( - handle is RefExpr && (handle as RefExpr).decl is VarDecl) - - FenceLabel(setOf("mutex_unlock(${handle.decl.name})"), - metadata = invokeLabel.metadata) - } - - else -> error("Unknown pthread function ${invokeLabel.name}") - } - labels.add(fence) - } else { - labels.addAll(it.label.labels) - } - } - builder.addEdge(edge.withLabel(SequenceLabel(labels))) - } - } - return builder - } - - private fun predicate(it: XcfaLabel): Boolean { - return it is InvokeLabel && it.name.startsWith("pthread_") - } -} \ No newline at end of file diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/SimplifyExprsPass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/SimplifyExprsPass.kt index 7a6f23df8a..2f1d5c3540 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/SimplifyExprsPass.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/SimplifyExprsPass.kt @@ -33,7 +33,10 @@ import hu.bme.mit.theta.core.utils.StmtUtils import hu.bme.mit.theta.core.utils.TypeUtils.cast import hu.bme.mit.theta.frontend.ParseContext import hu.bme.mit.theta.frontend.transformation.model.types.complex.CComplexType +import hu.bme.mit.theta.xcfa.collectVarsWithAccessType +import hu.bme.mit.theta.xcfa.isRead import hu.bme.mit.theta.xcfa.model.* +import java.lang.UnsupportedOperationException /** * This pass simplifies the expressions inside statements and substitutes the values of constant variables @@ -46,6 +49,7 @@ class SimplifyExprsPass(val parseContext: ParseContext) : ProcedurePass { override fun run(builder: XcfaProcedureBuilder): XcfaProcedureBuilder { checkNotNull(builder.metaData["deterministic"]) + removeUnusedGlobalVarWrites(builder) val valuation = findConstVariables(builder) val edges = LinkedHashSet(builder.getEdges()) for (edge in edges) { @@ -82,6 +86,25 @@ class SimplifyExprsPass(val parseContext: ParseContext) : ProcedurePass { return builder } + private fun removeUnusedGlobalVarWrites(builder: XcfaProcedureBuilder) { + val usedVars = mutableSetOf>() + val xcfaBuilder = builder.parent + xcfaBuilder.getProcedures().flatMap { it.getEdges() }.forEach { + it.label.collectVarsWithAccessType().forEach { (varDecl, access) -> + if (access.isRead) usedVars.add(varDecl) + } + } + val unusedVars = xcfaBuilder.getVars().map { it.wrappedVar } union builder.getVars() subtract + usedVars subtract builder.getParams().map { it.first }.toSet() + xcfaBuilder.getProcedures().forEach { b -> + b.getEdges().toList().forEach { edge -> + val newLabel = edge.label.removeUnusedWrites(unusedVars) + b.removeEdge(edge) + b.addEdge(edge.withLabel(newLabel)) + } + } + } + private fun findConstVariables(builder: XcfaProcedureBuilder): Valuation { val valuation = MutableValuation() builder.parent.getProcedures() @@ -100,7 +123,10 @@ class SimplifyExprsPass(val parseContext: ParseContext) : ProcedurePass { } .filterNotNull() .forEach { assignment -> - valuation.put(assignment.varDecl, assignment.expr.eval(ImmutableValuation.empty())) + try { + valuation.put(assignment.varDecl, assignment.expr.eval(ImmutableValuation.empty())) + } catch (_: UnsupportedOperationException) { + } } return valuation } diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/UnusedVarPass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/UnusedVarPass.kt index 94de0cdb56..ac5d5f0cc9 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/UnusedVarPass.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/UnusedVarPass.kt @@ -17,6 +17,7 @@ package hu.bme.mit.theta.xcfa.passes import com.google.common.collect.Sets +import hu.bme.mit.theta.common.logging.Logger import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.frontend.ParseContext import hu.bme.mit.theta.xcfa.collectVars @@ -26,7 +27,7 @@ import hu.bme.mit.theta.xcfa.model.XcfaProcedureBuilder * Remove unused variables from the program. * Requires the ProcedureBuilder to be `deterministic` (@see DeterministicPass) */ -class UnusedVarPass(val parseContext: ParseContext) : ProcedurePass { +class UnusedVarPass(val parseContext: ParseContext, val uniqueWarningLogger: Logger) : ProcedurePass { override fun run(builder: XcfaProcedureBuilder): XcfaProcedureBuilder { checkNotNull(builder.metaData["deterministic"]) @@ -38,12 +39,13 @@ class UnusedVarPass(val parseContext: ParseContext) : ProcedurePass { builder.parent.getVars().map { it.wrappedVar }.toSet()) val varsAndParams = Sets.union(allVars, builder.getParams().map { it.first }.toSet()) if (!varsAndParams.containsAll(usedVars)) { - System.err.println( - "Warning: There are some used variables not present as declarations: \n${ - usedVars.filter { - !varsAndParams.contains(it) - } - }") + uniqueWarningLogger.write(Logger.Level.INFO, + "WARNING: There are some used variables not present as declarations: " + + "${ + usedVars.filter { + !varsAndParams.contains(it) + } + }\n") } val list = builder.getVars().filter { !usedVars.contains(it) }.toList() diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/Utils.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/Utils.kt index bab9af5875..5ae232290c 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/Utils.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/Utils.kt @@ -29,12 +29,6 @@ import hu.bme.mit.theta.xcfa.getFlatLabels import hu.bme.mit.theta.xcfa.model.* import java.util.* -fun label2edge(edge: XcfaEdge, label: XcfaLabel) { - val source = edge.source - val target = edge.target - -} - /** * XcfaEdge must be in a `deterministic` ProcedureBuilder */ @@ -154,4 +148,34 @@ private fun XcfaProcedureBuilder.canInline(tally: LinkedList): Boolean { tally.pop() metaData[if (recursive) "recursive" else "canInline"] = Unit return !recursive +} + +internal fun XcfaLabel.removeUnusedWrites(unusedVars: Set>): XcfaLabel { + return when (this) { + is SequenceLabel -> { + val newLabels = mutableListOf() + this.labels.forEach { label -> + val newLabel = label.removeUnusedWrites(unusedVars) + if (newLabel !is NopLabel) newLabels.add(newLabel) + } + SequenceLabel(newLabels) + } + + is NondetLabel -> { + val newLabels = mutableSetOf() + this.labels.forEach { label -> + val newLabel = label.removeUnusedWrites(unusedVars) + if (newLabel !is NopLabel) newLabels.add(newLabel) + } + NondetLabel(newLabels) + } + + is StmtLabel -> when (this.stmt) { + is AssignStmt<*> -> if (unusedVars.contains(this.stmt.varDecl)) NopLabel else this + is HavocStmt<*> -> if (unusedVars.contains(this.stmt.varDecl)) NopLabel else this + else -> this + } + + else -> this + } } \ No newline at end of file diff --git a/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/model/XcfaSerializationTest.kt b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/model/XcfaSerializationTest.kt new file mode 100644 index 0000000000..cb9cf24ab1 --- /dev/null +++ b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/model/XcfaSerializationTest.kt @@ -0,0 +1,81 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.xcfa.model + +import hu.bme.mit.theta.core.decl.VarDecl +import hu.bme.mit.theta.core.type.anytype.RefExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Eq +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.inttype.IntType +import hu.bme.mit.theta.frontend.ParseContext +import hu.bme.mit.theta.xcfa.model.ParamDirection.* +import hu.bme.mit.theta.xcfa.toC +import org.junit.Test + +class XcfaSerializationTest { + + private fun getXcfa() = xcfa("example") { + lateinit var x: VarDecl<*> + lateinit var y: VarDecl<*> + global { + x = "x" type Int() init "1" + } + threadlocal { + y = "y" type Int() init "2" + } + val proc1 = procedure("proc1") { + "a" type Int() direction IN + "b" type Int() direction OUT + val c = "c" type Int() direction INOUT + val d = "d" type Int() + + (init to final) { + d assign "a + c" + + havoc("b") + havoc(c) + + "x" assign d.ref + "y" assign d.ref + } + } + val main = procedure("main") { + val ret = "ret" type Int() + val param = "param" type Int() + + (init to "L0") { + param assign "0" + proc1("1", ret.ref, param.ref) + proc1.invoke("1", ret.ref, param.ref) + proc1.invoke("2", ret.ref, param.ref) + } + ("L0" to final) { + assume(Eq(x.ref as RefExpr, y.ref as RefExpr)) + } + ("L0" to err) { + assume("(/= x y)") + } + } + + main.start() + } + + @Test + fun serializeXcfa() { + getXcfa().toC(ParseContext(), true, true, true) + } + +} \ No newline at end of file diff --git a/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/passes/PassTests.kt b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/passes/PassTests.kt index 1bc7f624e8..b85a7f9205 100644 --- a/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/passes/PassTests.kt +++ b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/passes/PassTests.kt @@ -15,6 +15,7 @@ */ package hu.bme.mit.theta.xcfa.passes +import hu.bme.mit.theta.common.logging.NullLogger import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.stmt.AssignStmt @@ -30,7 +31,8 @@ import hu.bme.mit.theta.frontend.transformation.model.types.complex.real.CFloat import hu.bme.mit.theta.xcfa.getFlatLabels import hu.bme.mit.theta.xcfa.model.* import org.junit.jupiter.api.Assertions -import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments @@ -94,7 +96,7 @@ class PassTests { ), input = { (init to "L1") { - assume("true") + assume("1 == 1") } ("L1" to final) { assume("false") @@ -102,7 +104,7 @@ class PassTests { }, output = { (init to final) { - assume("true") + assume("1 == 1") assume("false") } }, @@ -117,10 +119,10 @@ class PassTests { ), input = { (init to "L1") { - assume("true") + assume("1 == 1") } ("L1" to "L2") { - assume("true") + assume("1 == 1") } ("L2" to final) { assume("false") @@ -131,8 +133,8 @@ class PassTests { }, output = { (init to final) { - assume("true") - assume("true") + assume("1 == 1") + assume("1 == 1") nondet { assume("false") assume("1 == 2") @@ -209,6 +211,56 @@ class PassTests { } }, ), + PassTestData( + global = { "x" type Int() init "0"; }, + passes = listOf( + LoopUnrollPass() + ), + input = { + (init to "L1") { + "x".assign("0") + } + ("L1" to "L2") { + assume("(< x 3)") + "x".assign("(+ x 1)") + } + ("L2" to "L1") { + skip() + } + ("L1" to final) { + assume("(= x 3)") + } + }, + output = { + (init to "L1") { + "x".assign("0") + } + ("L1" to "loop0_L2") { + nop() + "x".assign("(+ x 1)") + } + ("loop0_L2" to "loop0_L1") { + skip() + } + ("loop0_L1" to "loop1_L2") { + nop() + "x".assign("(+ x 1)") + } + ("loop1_L2" to "loop1_L1") { + skip() + } + ("loop1_L1" to "loop2_L2") { + nop() + "x".assign("(+ x 1)") + } + ("loop2_L2" to "loop2_L1") { + skip() + } + ("loop2_L1" to final) { + nop() + } + }, + ), PassTestData( global = { "y" type BvType(32) init "0" @@ -341,10 +393,10 @@ class PassTests { ), input = { (init to "L1") { - assume("true") + assume("1 == 1") } (init to "L2") { - assume("true") + assume("1 == 1") } ("L2" to "L3") { assume("false") @@ -373,7 +425,7 @@ class PassTests { passes = listOf( NormalizePass(parseContext), DeterministicPass(parseContext), - PthreadFunctionsPass(parseContext), + CLibraryFunctionsPass(parseContext), ), input = { (init to "L1") { @@ -451,7 +503,7 @@ class PassTests { passes = listOf( NormalizePass(parseContext), DeterministicPass(parseContext), - UnusedVarPass(parseContext) + UnusedVarPass(parseContext, NullLogger.getInstance()) ), input = { "tmp" type Int() @@ -468,7 +520,7 @@ class PassTests { ), input = { ("L1" to "L1") { - assume("true") + assume("1 == 1") } }, output = null, @@ -520,7 +572,7 @@ class PassTests { } procedure("proc1") { (init to final) { - assume("true") + assume("1 == 1") } } } @@ -533,14 +585,14 @@ class PassTests { @Test fun testCPipeline() { val xcfaSource = xcfa("example") { - procedure("main", CPasses(false, parseContext)) { + procedure("main", CPasses(false, parseContext, NullLogger.getInstance())) { (init to final) { "proc1"() } } procedure("proc1") { (init to final) { - assume("true") + assume("1 == 1") } } } @@ -554,11 +606,11 @@ class PassTests { fun testSplit() { lateinit var edge: XcfaEdge val xcfaSource = xcfa("example") { - procedure("main", CPasses(false, parseContext)) { + procedure("main", CPasses(false, parseContext, NullLogger.getInstance())) { edge = (init to final) { - assume("true") + assume("1 == 1") "proc1"() - assume("true") + assume("1 == 1") } } } diff --git a/subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/XstsToMonoliticTransFunc.java b/subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/XstsToMonoliticTransFunc.java new file mode 100644 index 0000000000..be632f09a9 --- /dev/null +++ b/subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/XstsToMonoliticTransFunc.java @@ -0,0 +1,56 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.xsts.analysis; + +import hu.bme.mit.theta.analysis.algorithm.AbstractMonolithicTransFunc; +import hu.bme.mit.theta.analysis.algorithm.MonolithicTransFunc; +import hu.bme.mit.theta.analysis.expl.ExplState; +import hu.bme.mit.theta.core.decl.VarDecl; +import hu.bme.mit.theta.core.model.Valuation; +import hu.bme.mit.theta.core.stmt.Stmts; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.utils.StmtUnfoldResult; +import hu.bme.mit.theta.core.utils.StmtUtils; +import hu.bme.mit.theta.core.utils.indexings.VarIndexing; +import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory; +import hu.bme.mit.theta.solver.SolverFactory; +import hu.bme.mit.theta.xsts.XSTS; + +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.function.Function; + +import static hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.And; + +public class XstsToMonoliticTransFunc extends AbstractMonolithicTransFunc { + private XstsToMonoliticTransFunc(XSTS xsts) { + final StmtUnfoldResult initUnfoldResult = StmtUtils.toExpr(xsts.getInit(), VarIndexingFactory.indexing(0)); + initExpr = And(And(initUnfoldResult.getExprs()), xsts.getInitFormula()); + firstIndex = initUnfoldResult.getIndexing(); + final var envTran = Stmts.SequenceStmt(List.of(xsts.getEnv(), xsts.getTran())); + final StmtUnfoldResult envTranUnfoldResult = StmtUtils.toExpr(envTran, VarIndexingFactory.indexing(0)); + transExpr = And(envTranUnfoldResult.getExprs()); + offsetIndex = envTranUnfoldResult.getIndexing(); + propExpr = xsts.getProp(); + + } + + public static MonolithicTransFunc create(XSTS xsts) { + return new XstsToMonoliticTransFunc(xsts); + } +} diff --git a/subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/config/XstsConfigBuilder.java b/subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/config/XstsConfigBuilder.java index 452a25ec62..f1dba9edaf 100644 --- a/subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/config/XstsConfigBuilder.java +++ b/subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/config/XstsConfigBuilder.java @@ -93,6 +93,12 @@ public class XstsConfigBuilder { + public enum Algorithm { + CEGAR, + KINDUCTION, + IMC + } + public enum Domain { EXPL, PRED_BOOL, PRED_CART, PRED_SPLIT, EXPL_PRED_BOOL, EXPL_PRED_CART, EXPL_PRED_SPLIT, EXPL_PRED_COMBINED } diff --git a/subprojects/xsts/xsts-analysis/src/test/resources/model/count_up_down.xsts b/subprojects/xsts/xsts-analysis/src/test/resources/model/count_up_down.xsts index a1fcdaf03a..436b85bca2 100644 --- a/subprojects/xsts/xsts-analysis/src/test/resources/model/count_up_down.xsts +++ b/subprojects/xsts/xsts-analysis/src/test/resources/model/count_up_down.xsts @@ -5,6 +5,8 @@ trans { assume x>0; x := x - 1; y := y + 1; +}or{ + } init {} diff --git a/subprojects/xsts/xsts-analysis/src/test/resources/model/counter5.xsts b/subprojects/xsts/xsts-analysis/src/test/resources/model/counter5.xsts index ed7b207596..b5584f96ed 100644 --- a/subprojects/xsts/xsts-analysis/src/test/resources/model/counter5.xsts +++ b/subprojects/xsts/xsts-analysis/src/test/resources/model/counter5.xsts @@ -4,7 +4,7 @@ trans { assume x<5; x:=x+1; } or { - x:=x; + x:=0; } init {} diff --git a/subprojects/xsts/xsts-cli/src/main/java/hu/bme/mit/theta/xsts/cli/XstsCli.java b/subprojects/xsts/xsts-cli/src/main/java/hu/bme/mit/theta/xsts/cli/XstsCli.java index c174482d82..70f0999c03 100644 --- a/subprojects/xsts/xsts-cli/src/main/java/hu/bme/mit/theta/xsts/cli/XstsCli.java +++ b/subprojects/xsts/xsts-cli/src/main/java/hu/bme/mit/theta/xsts/cli/XstsCli.java @@ -22,6 +22,9 @@ import hu.bme.mit.theta.analysis.Trace; import hu.bme.mit.theta.analysis.algorithm.SafetyResult; import hu.bme.mit.theta.analysis.algorithm.cegar.CegarStatistics; +import hu.bme.mit.theta.analysis.algorithm.imc.ImcChecker; +import hu.bme.mit.theta.analysis.algorithm.kind.KIndChecker; +import hu.bme.mit.theta.analysis.expl.ExplState; import hu.bme.mit.theta.analysis.expr.refinement.PruneStrategy; import hu.bme.mit.theta.analysis.utils.ArgVisualizer; import hu.bme.mit.theta.analysis.utils.TraceVisualizer; @@ -34,6 +37,7 @@ import hu.bme.mit.theta.common.table.TableWriter; import hu.bme.mit.theta.common.visualization.Graph; import hu.bme.mit.theta.common.visualization.writer.GraphvizWriter; +import hu.bme.mit.theta.core.stmt.SkipStmt; import hu.bme.mit.theta.solver.SolverFactory; import hu.bme.mit.theta.solver.SolverManager; import hu.bme.mit.theta.solver.smtlib.SmtLibSolverManager; @@ -42,17 +46,32 @@ import hu.bme.mit.theta.xsts.XSTS; import hu.bme.mit.theta.xsts.analysis.XstsAction; import hu.bme.mit.theta.xsts.analysis.XstsState; +import hu.bme.mit.theta.xsts.analysis.XstsToMonoliticTransFunc; import hu.bme.mit.theta.xsts.analysis.concretizer.XstsStateSequence; import hu.bme.mit.theta.xsts.analysis.concretizer.XstsTraceConcretizerUtil; import hu.bme.mit.theta.xsts.analysis.config.XstsConfig; import hu.bme.mit.theta.xsts.analysis.config.XstsConfigBuilder; -import hu.bme.mit.theta.xsts.analysis.config.XstsConfigBuilder.*; +import hu.bme.mit.theta.xsts.analysis.config.XstsConfigBuilder.Algorithm; +import hu.bme.mit.theta.xsts.analysis.config.XstsConfigBuilder.AutoExpl; +import hu.bme.mit.theta.xsts.analysis.config.XstsConfigBuilder.Domain; +import hu.bme.mit.theta.xsts.analysis.config.XstsConfigBuilder.InitPrec; +import hu.bme.mit.theta.xsts.analysis.config.XstsConfigBuilder.OptimizeStmts; +import hu.bme.mit.theta.xsts.analysis.config.XstsConfigBuilder.PredSplit; +import hu.bme.mit.theta.xsts.analysis.config.XstsConfigBuilder.Refinement; +import hu.bme.mit.theta.xsts.analysis.config.XstsConfigBuilder.Search; import hu.bme.mit.theta.xsts.dsl.XstsDslManager; import hu.bme.mit.theta.xsts.pnml.PnmlParser; import hu.bme.mit.theta.xsts.pnml.PnmlToXSTS; import hu.bme.mit.theta.xsts.pnml.elements.PnmlNet; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.SequenceInputStream; +import java.io.StringWriter; import java.nio.file.Path; import java.util.concurrent.TimeUnit; import java.util.stream.Stream; @@ -63,6 +82,9 @@ public class XstsCli { private final String[] args; private final TableWriter writer; + @Parameter(names = {"--algorithm"}, description = "Algorithm") + Algorithm algorithm = Algorithm.CEGAR; + @Parameter(names = {"--domain"}, description = "Abstract domain") Domain domain = Domain.PRED_CART; @@ -177,9 +199,27 @@ private void run() { return; } - final XstsConfig configuration = buildConfiguration(xsts); - final SafetyResult status = check(configuration); - sw.stop(); + final SafetyResult status; + if (algorithm.equals(Algorithm.CEGAR)) { + final XstsConfig configuration = buildConfiguration(xsts); + status = check(configuration); + sw.stop(); + } else if (algorithm.equals(Algorithm.KINDUCTION)) { + var transFunc = XstsToMonoliticTransFunc.create(xsts); + var checker = new KIndChecker, XstsAction>(transFunc, Integer.MAX_VALUE, 0, 1, Z3SolverFactory.getInstance().createSolver(), Z3SolverFactory.getInstance().createSolver(), (x) -> XstsState.of(ExplState.of(x), false, true), (val1, val2) -> XstsAction.create(SkipStmt.getInstance()), xsts.getVars()); + status = checker.check(null); + logger.write(Logger.Level.RESULT, "%s%n", status); + sw.stop(); + } else if (algorithm.equals(Algorithm.IMC)) { + var transFunc = XstsToMonoliticTransFunc.create(xsts); + var checker = new ImcChecker<>(transFunc, Integer.MAX_VALUE, Z3SolverFactory.getInstance().createItpSolver(), (x) -> XstsState.of(ExplState.of(x), false, true), xsts.getVars(), null); + status = checker.check(null); + logger.write(Logger.Level.RESULT, "%s%n", status); + sw.stop(); + } else { + throw new IllegalArgumentException("Unknown algorithm: " + algorithm); + } + printResult(status, xsts, sw.elapsed(TimeUnit.MILLISECONDS)); if (status.isUnsafe() && cexfile != null) { writeCex(status.asUnsafe(), xsts); @@ -253,7 +293,8 @@ private XSTS loadModel() throws Exception { } private void printResult(final SafetyResult status, final XSTS sts, final long totalTimeMs) { - final CegarStatistics stats = (CegarStatistics) status.getStats().get(); + final CegarStatistics stats = (CegarStatistics) + status.getStats().orElse(new CegarStatistics(0, 0, 0, 0)); if (benchmarkMode) { writer.cell(status.isSafe()); writer.cell(totalTimeMs); From cf6517b648e9afde468c5cff595c6f4899e7ef5d Mon Sep 17 00:00:00 2001 From: s0mark Date: Mon, 20 Nov 2023 20:46:57 +0100 Subject: [PATCH 11/14] added copyright --- .../java/hu/bme/mit/theta/xcfa/analysis/Utils.kt | 15 +++++++++++++++ .../bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt | 15 +++++++++++++++ .../xcfa/analysis/XcfaSingeExprTraceRefiner.kt | 15 +++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt index ef6a88c80b..ffdfce0922 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.xcfa.analysis import hu.bme.mit.theta.analysis.expl.ExplState diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt index 4ab4cb4219..72ce3a9026 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.xcfa.analysis import com.google.common.base.Preconditions diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt index 28003bcd27..ac696bc1f0 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2023 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.xcfa.analysis import com.google.common.base.Preconditions From c6860e6df916a0f282710bd936d6bcf13504b759 Mon Sep 17 00:00:00 2001 From: s0mark Date: Mon, 20 Nov 2023 22:25:46 +0100 Subject: [PATCH 12/14] formatting stack abstraction files --- .../algorithm/cegar/BasicAbstractor.java | 2 +- .../refinement/SingleExprTraceRefiner.java | 10 +++++----- .../hu/bme/mit/theta/xcfa/analysis/Utils.kt | 14 +++++++++---- .../mit/theta/xcfa/analysis/XcfaAbstractor.kt | 8 +++++--- .../mit/theta/xcfa/analysis/XcfaAnalysis.kt | 20 ++++++++++--------- .../analysis/XcfaSingeExprTraceRefiner.kt | 19 ++++++++++-------- 6 files changed, 43 insertions(+), 30 deletions(-) diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/BasicAbstractor.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/BasicAbstractor.java index 43bf8d074c..f731a7cd70 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/BasicAbstractor.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/cegar/BasicAbstractor.java @@ -50,7 +50,7 @@ public class BasicAbstractor protected final Logger logger; protected BasicAbstractor(final ArgBuilder argBuilder, final Function projection, - final Waitlist> waitlist, final StopCriterion stopCriterion, final Logger logger) { + final Waitlist> waitlist, final StopCriterion stopCriterion, final Logger logger) { this.argBuilder = checkNotNull(argBuilder); this.projection = checkNotNull(projection); this.waitlist = checkNotNull(waitlist); diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/expr/refinement/SingleExprTraceRefiner.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/expr/refinement/SingleExprTraceRefiner.java index d1b406ff1e..8594753d9f 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/expr/refinement/SingleExprTraceRefiner.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/expr/refinement/SingleExprTraceRefiner.java @@ -45,8 +45,8 @@ public class SingleExprTraceRefiner exprTraceChecker, - final PrecRefiner precRefiner, - final PruneStrategy pruneStrategy, final Logger logger) { + final PrecRefiner precRefiner, + final PruneStrategy pruneStrategy, final Logger logger) { this.exprTraceChecker = checkNotNull(exprTraceChecker); this.precRefiner = checkNotNull(precRefiner); this.pruneStrategy = checkNotNull(pruneStrategy); @@ -55,9 +55,9 @@ protected SingleExprTraceRefiner(final ExprTraceChecker exprTraceChecker, } protected SingleExprTraceRefiner(final ExprTraceChecker exprTraceChecker, - final PrecRefiner precRefiner, - final PruneStrategy pruneStrategy, final Logger logger, - final NodePruner nodePruner) { + final PrecRefiner precRefiner, + final PruneStrategy pruneStrategy, final Logger logger, + final NodePruner nodePruner) { this.exprTraceChecker = checkNotNull(exprTraceChecker); this.precRefiner = checkNotNull(precRefiner); this.pruneStrategy = checkNotNull(pruneStrategy); diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt index ffdfce0922..cf112f301d 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt @@ -44,11 +44,13 @@ internal fun XcfaState.withGeneralizedVars(): S { return when (sGlobal) { is ExplState -> ExplState.of(sGlobal.getVal().changeVars(varLookup)) is PredState -> PredState.of(sGlobal.preds.map { p -> p.changeVars(varLookup) }) - else -> throw NotImplementedError("Generalizing variable instances is not implemented for data states that are not explicit or predicate.") + else -> throw NotImplementedError( + "Generalizing variable instances is not implemented for data states that are not explicit or predicate.") } as S } class LazyDelegate(val getProperty: T.() -> P) { + private var calculated = false private lateinit var property: P @@ -62,7 +64,11 @@ class LazyDelegate(val getProperty: T.() -> P) { } val XCFA.isInlined: Boolean by LazyDelegate { - !this.procedures.any { p -> p.edges.any { e -> e.getFlatLabels().any { l -> - l is InvokeLabel && this.procedures.any { it.name == l.name } - } } } + !this.procedures.any { p -> + p.edges.any { e -> + e.getFlatLabels().any { l -> + l is InvokeLabel && this.procedures.any { it.name == l.name } + } + } + } } \ No newline at end of file diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt index 72ce3a9026..3d0f25823b 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAbstractor.kt @@ -90,7 +90,6 @@ class XcfaAbstractor( waitlist.clear() // Optimization - return if (arg.isSafe) { Preconditions.checkState(arg.isComplete, "Returning incomplete ARG as safe") AbstractorResult.safe() @@ -120,14 +119,17 @@ class XcfaAbstractor( } } - companion object{ - fun builder(argBuilder: ArgBuilder): BasicAbstractor.Builder { + companion object { + + fun builder( + argBuilder: ArgBuilder): BasicAbstractor.Builder { return Builder(argBuilder) } } class Builder(argBuilder: ArgBuilder) : BasicAbstractor.Builder(argBuilder) { + override fun build(): BasicAbstractor { return XcfaAbstractor(argBuilder, projection, waitlist, stopCriterion, logger) } diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt index b8e04eb29a..a662316543 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaAnalysis.kt @@ -169,10 +169,11 @@ fun getXcfaErrorPredicate( fun getPartialOrder(partialOrd: PartialOrd) = PartialOrd> { s1, s2 -> - s1.processes == s2.processes && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes && partialOrd.isLeq(s1.sGlobal, s2.sGlobal) + s1.processes == s2.processes && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes && partialOrd.isLeq( + s1.sGlobal, s2.sGlobal) } -private fun stackIsLeq(s1: XcfaState, s2: XcfaState) = s2.processes.keys.all { pid -> +private fun stackIsLeq(s1: XcfaState, s2: XcfaState) = s2.processes.keys.all { pid -> s1.processes[pid]?.let { ps1 -> val ps2 = s2.processes.getValue(pid) ps1.locs.peek() == ps2.locs.peek() && ps1.paramsInitialized && ps2.paramsInitialized @@ -181,7 +182,8 @@ private fun stackIsLeq(s1: XcfaState, s2: XcfaState) = s2.p fun getStackPartialOrder(partialOrd: PartialOrd) = PartialOrd> { s1, s2 -> - s1.processes.size == s2.processes.size && stackIsLeq(s1, s2) && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes + s1.processes.size == s2.processes.size && stackIsLeq(s1, + s2) && s1.bottom == s2.bottom && s1.mutexes == s2.mutexes && partialOrd.isLeq(s1.withGeneralizedVars(), s2.withGeneralizedVars()) } @@ -189,7 +191,7 @@ private fun , P : XcfaPrec> getXcfaArgBui analysis: Analysis, lts: LTS, XcfaAction>, errorDetection: ErrorDetection) - : ArgBuilder = + : ArgBuilder = ArgBuilder.create( lts, analysis, @@ -216,7 +218,7 @@ fun , P : XcfaPrec> getXcfaAbstractor( /// EXPL private fun getExplXcfaInitFunc(xcfa: XCFA, - solver: Solver): (XcfaPrec) -> List> { + solver: Solver): (XcfaPrec) -> List> { val processInitState = xcfa.initProcedures.mapIndexed { i, it -> val initLocStack: LinkedList = LinkedList() initLocStack.add(it.first.initLoc) @@ -230,7 +232,7 @@ private fun getExplXcfaInitFunc(xcfa: XCFA, } private fun getExplXcfaTransFunc(solver: Solver, - maxEnum: Int): (XcfaState, XcfaAction, XcfaPrec) -> List> { + maxEnum: Int): (XcfaState, XcfaAction, XcfaPrec) -> List> { val explTransFunc = ExplStmtTransFunc.create(solver, maxEnum) return { s, a, p -> val (newSt, newAct) = s.apply(a) @@ -241,7 +243,7 @@ private fun getExplXcfaTransFunc(solver: Solver, } class ExplXcfaAnalysis(xcfa: XCFA, solver: Solver, maxEnum: Int, - partialOrd: PartialOrd>) : XcfaAnalysis( + partialOrd: PartialOrd>) : XcfaAnalysis( corePartialOrd = partialOrd, coreInitFunc = getExplXcfaInitFunc(xcfa, solver), coreTransFunc = getExplXcfaTransFunc(solver, maxEnum) @@ -250,7 +252,7 @@ class ExplXcfaAnalysis(xcfa: XCFA, solver: Solver, maxEnum: Int, /// PRED private fun getPredXcfaInitFunc(xcfa: XCFA, - predAbstractor: PredAbstractor): (XcfaPrec) -> List> { + predAbstractor: PredAbstractor): (XcfaPrec) -> List> { val processInitState = xcfa.initProcedures.mapIndexed { i, it -> val initLocStack: LinkedList = LinkedList() initLocStack.add(it.first.initLoc) @@ -275,7 +277,7 @@ private fun getPredXcfaTransFunc( } class PredXcfaAnalysis(xcfa: XCFA, solver: Solver, predAbstractor: PredAbstractor, - partialOrd: PartialOrd>) : XcfaAnalysis( + partialOrd: PartialOrd>) : XcfaAnalysis( corePartialOrd = partialOrd, coreInitFunc = getPredXcfaInitFunc(xcfa, predAbstractor), coreTransFunc = getPredXcfaTransFunc(predAbstractor) diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt index ac696bc1f0..432e88a0e9 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaSingeExprTraceRefiner.kt @@ -29,6 +29,7 @@ import java.util.LinkedList class XcfaSingleExprTraceRefiner : SingleExprTraceRefiner { + private constructor( exprTraceChecker: ExprTraceChecker, precRefiner: PrecRefiner, @@ -47,14 +48,15 @@ class XcfaSingleExprTraceRefiner): Pair>? { trace.states.forEachIndexed { i, s -> val state = s as XcfaState - state.processes.entries.find { (_, processState) -> processState.popped != null }?.let { (pid, processState) -> - val stackBeforePop = LinkedList(processState.locs) - stackBeforePop.push(processState.popped) - val processesBeforePop = state.processes.toMutableMap() - processesBeforePop[pid] = processState.copy(locs = stackBeforePop) - val stateBeforePop = state.copy(processes = processesBeforePop) - return Pair(i, stateBeforePop) - } + state.processes.entries.find { (_, processState) -> processState.popped != null } + ?.let { (pid, processState) -> + val stackBeforePop = LinkedList(processState.locs) + stackBeforePop.push(processState.popped) + val processesBeforePop = state.processes.toMutableMap() + processesBeforePop[pid] = processState.copy(locs = stackBeforePop) + val stateBeforePop = state.copy(processes = processesBeforePop) + return Pair(i, stateBeforePop) + } } return null } @@ -94,6 +96,7 @@ class XcfaSingleExprTraceRefiner create( exprTraceChecker: ExprTraceChecker, precRefiner: PrecRefiner, pruneStrategy: PruneStrategy, logger: Logger From b1d8c2658b4814eddeec5568fccad27e4799c7d9 Mon Sep 17 00:00:00 2001 From: s0mark Date: Tue, 21 Nov 2023 20:19:35 +0100 Subject: [PATCH 13/14] refined var lookup in xcfa prec --- .../mit/theta/xcfa/analysis/XcfaPrecRefiner.kt | 16 +++++++++++++--- .../theta/xcfa/analysis/XcfaPredAnalysisTest.kt | 10 +++++----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaPrecRefiner.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaPrecRefiner.kt index 6c3039d55d..ea5eea4307 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaPrecRefiner.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaPrecRefiner.kt @@ -39,11 +39,21 @@ class XcfaPrecRefiner(refToPrec: Refuta Preconditions.checkNotNull(trace) Preconditions.checkNotNull(prec) Preconditions.checkNotNull(refutation) + val checkForPop = !(trace.states.first() as XcfaState<*>).xcfa!!.isInlined var runningPrec: P = prec.p for (i in trace.states.indices) { - val tempLookup = if (i > 0) getTempLookup(trace.actions[i - 1].edge.label).entries - .associateBy({ it.value }) { it.key } else emptyMap() - val precFromRef = refToPrec.toPrec(refutation, i).changeVars(tempLookup) + val reverseLookup = trace.states[i].processes.values.map { + it.varLookup.map { + it.map { + Pair(it.value, it.key) + } + }.flatten() + }.flatten().toMap() + val additionalLookup = if (i > 0) getTempLookup( + trace.actions[i - 1].edge.label).entries.associateBy( + { it.value }) { it.key } else emptyMap() + val varLookup = if (checkForPop) additionalLookup else (reverseLookup + additionalLookup) + val precFromRef = refToPrec.toPrec(refutation, i).changeVars(varLookup) runningPrec = refToPrec.join(runningPrec, precFromRef) } return prec.refine(runningPrec) diff --git a/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaPredAnalysisTest.kt b/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaPredAnalysisTest.kt index 67cd2afe5a..f18d9f3cba 100644 --- a/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaPredAnalysisTest.kt +++ b/subprojects/xcfa/xcfa-analysis/src/test/java/hu/bme/mit/theta/xcfa/analysis/XcfaPredAnalysisTest.kt @@ -91,7 +91,7 @@ class XcfaPredAnalysisTest { ItpRefToPredPrec(ExprSplitters.whole())) val refiner = - SingleExprTraceRefiner.create( + XcfaSingleExprTraceRefiner.create( ExprTraceBwBinItpChecker.create(BoolExprs.True(), BoolExprs.True(), Z3SolverFactory.getInstance().createItpSolver()), precRefiner, PruneStrategy.FULL, @@ -137,7 +137,7 @@ class XcfaPredAnalysisTest { ItpRefToPredPrec(ExprSplitters.whole())) val refiner = - SingleExprTraceRefiner.create( + XcfaSingleExprTraceRefiner.create( ExprTraceBwBinItpChecker.create(BoolExprs.True(), BoolExprs.True(), Z3SolverFactory.getInstance().createItpSolver()), precRefiner, PruneStrategy.FULL, @@ -183,7 +183,7 @@ class XcfaPredAnalysisTest { ItpRefToPredPrec(ExprSplitters.whole())) val refiner = - SingleExprTraceRefiner.create( + XcfaSingleExprTraceRefiner.create( ExprTraceBwBinItpChecker.create(BoolExprs.True(), BoolExprs.True(), Z3SolverFactory.getInstance().createItpSolver()), precRefiner, PruneStrategy.FULL, @@ -229,7 +229,7 @@ class XcfaPredAnalysisTest { val atomicNodePruner = AtomicNodePruner, XcfaAction>() val refiner = - SingleExprTraceRefiner.create( + XcfaSingleExprTraceRefiner.create( ExprTraceBwBinItpChecker.create(BoolExprs.True(), BoolExprs.True(), Z3SolverFactory.getInstance().createItpSolver()), precRefiner, PruneStrategy.FULL, NullLogger.getInstance(), @@ -274,7 +274,7 @@ class XcfaPredAnalysisTest { val precRefiner = XcfaPrecRefiner(ItpRefToPredPrec(ExprSplitters.whole())) val refiner = - SingleExprTraceRefiner.create( + XcfaSingleExprTraceRefiner.create( ExprTraceBwBinItpChecker.create(BoolExprs.True(), BoolExprs.True(), Z3SolverFactory.getInstance().createItpSolver()), precRefiner, PruneStrategy.FULL, From b56a6ac0b046c320d06a6c3f996def849e89864a Mon Sep 17 00:00:00 2001 From: s0mark Date: Wed, 22 Nov 2023 15:39:40 +0100 Subject: [PATCH 14/14] updated portfolio --- .../src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt | 3 ++- .../java/hu/bme/mit/theta/xcfa/cli/portfolio/complex24.kt | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt index cf112f301d..b16cacd6c6 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/Utils.kt @@ -41,7 +41,8 @@ fun Valuation.changeVars(varLut: Map, VarDecl<*>>): Valuation { internal fun XcfaState.withGeneralizedVars(): S { val varLookup = processes.mapNotNull { (_, process) -> process.varLookup.peek()?.reverseMapping() } .reduceOrNull(Map, VarDecl<*>>::plus) ?: mapOf() - return when (sGlobal) { + return if (sGlobal.isBottom) sGlobal + else when (sGlobal) { is ExplState -> ExplState.of(sGlobal.getVal().changeVars(varLookup)) is PredState -> PredState.of(sGlobal.preds.map { p -> p.changeVars(varLookup) }) else -> throw NotImplementedError( diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/complex24.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/complex24.kt index b812d15475..65e8feee70 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/complex24.kt +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/portfolio/complex24.kt @@ -21,6 +21,7 @@ import hu.bme.mit.theta.common.logging.Logger import hu.bme.mit.theta.frontend.ParseContext import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.ArithmeticTrait import hu.bme.mit.theta.xcfa.analysis.ErrorDetection +import hu.bme.mit.theta.xcfa.analysis.isInlined import hu.bme.mit.theta.xcfa.cli.* import hu.bme.mit.theta.xcfa.model.XCFA @@ -61,6 +62,9 @@ fun complexPortfolio24( timeoutMs = 0 ) + if (!xcfaTyped.isInlined) { + baseConfig = baseConfig.copy(search = Search.BFS, pruneStrategy = PruneStrategy.LAZY) + } if (traitsTyped.multithreaded) { baseConfig = baseConfig.copy(search = Search.DFS, porLevel = POR.AASPOR, pruneStrategy = PruneStrategy.FULL, coi = ConeOfInfluenceMode.COI)