Accelerating Temporal Verification of Simulink Diagrams Using Satisfiability Modulo Theories
Transcription
Accelerating Temporal Verification of Simulink Diagrams Using Satisfiability Modulo Theories
Software Quality Journal manuscript No. (will be inserted by the editor) Accelerating Temporal Verification of Simulink Diagrams Using Satisfiability Modulo Theories Petr Bauch · Vojtˇ ech Havel · Jiˇ r´ı Barnat Received: date / Accepted: date Abstract Automatic verification of programs and computer systems with input variables represents a significant and well-motivated challenge. The case of Simulink diagrams is especially difficult, because there the inputs are read iteratively and the number of input variables is in theory unbounded. We apply the techniques of explicit model checking to account for the temporal (control) aspects of verification and use set-based representation of data, thus handling both sources of non-determinism present in the verification. Two different representations of sets are evaluated in scalability with respect to the range of input variables. Explicit (enumerating) sets are very fast for small ranges but fail to scale. Symbolic sets, represented as first-order formulas in the bit-vector theory and compared using satisfiability modulo theory solvers, scale well to arbitrary (though still bounded) range of input variables. To leverage the combined strengths of explicit and symbolic representations, we have designed a hybrid representation which we showed to outperform both pure representations. Thus the proposed method allows complete automatic verification without the need to limit the non-determinism of input. Moreover, the principle underlying the hybrid representation entails inferring knowledge about the system under verification, which the developers did not explicitly include in the system, and which can significantly accelerate the verification process. The research leading to these results has received funding from the European Union’s Seventh Framework Program (FP7/2007-2013) for CRYSTAL – Critical System Engineering Acceleration Joint Undertaking under grant agreement Number 332830 and from specific national programs and/or funding authorities. Petr Bauch, Vojtˇ ech Havel, and Jiˇr´ı Barnat Faculty of Informatics, Masaryk University, Botanick´ a 68a, Brno, Czech Republic Tel.: +420 549 491 869 E-mail: {xbauch,xhavel1,barnat}@fi.muni.cz 2 Petr Bauch et al. Keywords Formal verification · model checking · circuit analysis · satisfiability modulo theories 1 Introduction The primary motivation of this paper is the verification of Simulink diagrams against specifications given as linear temporal logic (LTL) formulas. The methodology we propose is more general and can accommodate a wider class of systems and models, but the research is guided by this concrete application. Consider the diagram in Figure 1. A Simulink diagram is an oriented graph, which can be interpreted as an abstract syntactic tree, except it may contain self-referencing cycles. The expression associated with a node is described by the tree underneath it, e.g. in our diagram the next value of the delay d1 is computed as the multiplication of the two subtrees of the node labeled by ∗ to the left of the d1 node1 . Other than the arithmetic and logical operators there are 4 types of nodes: delays (box), inports (circle), outports (ellipse), and constants (plain). Only delays are self-referential and the semantics is that of a single element memory storage: whenever referred to, the delay node provides the stored value. That stored value d is initiated to 0 and is replaced by d0 with every tick of the Simulink global clock. Since the inport nodes serve as inputs – providing a new, non-deterministic value after every tick – a Simulink diagram generates a transition system of the possible values stored in delays. Such a transition system represents the possible evolution of the diagram, describing its behavior as it changes in time. Similarly as with parallel and reactive programs, a developer may need to verify that the behavior of a system complies with the specification. Consider for example a specification requiring that: whenever the inport sv1 is negative in three consecutive ticks, the value of pm2 will eventually be positive. Such a specification cannot be expressed in terms of safety, i.e. as a reachability of bad states, because if the system were incorrect the violating run would be infinite. Consequently, verification procedures that do not allow temporal specification, such as most implementations of symbolic execution by King (1976), static analysis by Cousot and Cousot (1977) or deductive verification by Owicki and Gries (1976), cannot be used in this case. Model checking, initiated by Clarke et al (1986); Vardi and Wolper (1986), allows verification against temporal properties, yet Simulink diagrams and similar systems with input variables pose another obstacle in the form of data-flow non-determinism. In order to answer temporal verification queries automatically, an algorithm must allow evaluation of Peano arithmetic expressions that form subtrees in the diagram. At the same time the input variables may be evaluated to an arbitrary number (which in practice is bounded, e.g. by the number of bits used to express the value) and each of these evaluations must be considered for the 1 Translated into a full equation, the value of d 1 in the next tick equals d01 = min{c3 , (¬sv1 ∨ c1 > sd13 )?c4 : d1 } ∗ int(¬sv1 ∨ c1 > sd13 ). + ite Title Suppressed Due to Excessive Length pm1 ≥ min min c3 ≥ 3 pm3 sd inport + ite d delay ≥ pm2 min ite ∗ d1 pm c4 sm2 sv1 cnv ∨ ¬ sd13 > c1 outport Fig. 1: A partial Simulink diagram for the VoterCore system: the complete diagram was verified during the experimental evaluation (see Section 5.2). Delay nodes form the state space, inport nodes generate new evaluations with every tick, and outport nodes can be referred to in the specification requirements. verification to be exhaustive. Standard symbolic model checking approaches are either restricted to only a subset of Peano arithmetic, see Bultan et al (1997), or are concerned with Boolean input variables, as demonstrated by McMillan (1992). Standard explicit approaches to model checking already suffer from the state space explosion caused by the control-flow non-determinism and thus cannot scale to any considerable degree with the allowed ranges of input variables, as we showed in Barnat et al (2012). Hence the motivation for LTL verification of Simulink diagrams: it has the potential to replace testing in the design phase of software (or systems) development. In this sense, our work in Barnat et al (2012) succeeded only in part. In a tool-chain, and preceded by a tool to formalize pattern-based, human language requirements into LTL formulas, a model checker could provide similar results as testing for considerably smaller expenses. Yet the severely limited domains of input variables the standard model checking allows still enforce a test-like approach to correctness validation. Effectively, the developer still has to mechanically test (a smaller number of) instances of the same validation query with different (intervals of) input values. This paper meliorates the limitations of previous approaches by proposing a model checking technique that scales to arbitrarily large domains of input variables. Through the reduction of certain crucial operations required by the model checking process to Satisfiability Modulo Theories (SMT) queries, we have achieved a method for complete verification (for large but finite domains). Though the experiments were conducted on a relatively small Simulink model, they still convey the most important practical result: appropriately adapted model checking may be used to replace testing of safety-critical units as early as in the modeling phase of software development. 4 Petr Bauch et al. 2 Contribution We have first formalized the process of model checking of Simulink diagrams, building on the concept of set-based reduction of the underlying state space, proposed in Barnat and Bauch (2013). This reduction can significantly decrease the number of states, but does not lead to any reduction in the worst case. Also the representation used for the sets of variable evaluations determines the resulting complexity, which can differ exponentially for particular representations. We have implemented the set-based reduction using explicit sets as one representation and using bit-vector formulas as another representation. Explicit sets are exponential in both the number of variables represented and in their ranges, but allow simple implementation of state matching, i.e. deciding if two states represent the same evaluations. The representation using formulas is exponentially more succinct, but the state matching is a complex operation that requires deciding satisfiability (SAT) of quantified bit-vector formulas. Finally, the results of this paper show that (1) in the case of Simulink diagrams the set-based reduction is efficient, leading to exponentially smaller states spaces; (2) the representation using explicit sets allows fast verification but only for small ranges of variables; and (3) the representation using bit-vector formulas scales to arbitrary (bounded) ranges, though the state matching is resource expensive. In the terms of practical results, the proposed SAT-based verification is fully automated. Provided that the LTL specification and the Simulink model are available, the developer can demonstrate the correctness without any additional manual effort. This paper is an extended version of Barnat et al (2014) in the following aspects. We have expanded the related work section, comparing our work with the areas of module checking and symbolic transition graphs and we have also provided an extensive list of other methods combining explicit and symbolic approaches. Preliminaries to the theory of automata-based model checking are now less dense, to ease understanding for wider audience. Similar reasons lead to the addition of a Simulink diagram to Example 2: the reader can now follow its formalization into bit-vector formulas. The proof of correctness of the equality computation was added in full length, and there are also two new paragraphs describing the complexity aspects of the proposed algorithm. In order to further improve repeatability of our experiments we have extended the section on implementation with two examples of the generation of SMT files: the first is more general and leads to a query assessing the satisfiability of the path condition, the second then demonstrated how state equality via a quantified query can be encoded. Section 6 was added completely and presents further insight into the SAT-based representation and suggests what is the cause for its high computational complexity. Most importantly, Section 4.3 contains detailed description of the hybrid representation and the methodology behind combining explicit and SAT-based representations, which was in no part included in the conference version. Consequently, Section 5.2.3 is also completely new, and describes the experimental evaluation of the hybrid representation. Also Section 5.1 describing implemen- Title Suppressed Due to Excessive Length 5 tation and the Conclusion have been extended to describe the aspects of the hybrid representation relevant for these sections. The hybrid representation incorporates both the explicit and the symbolic representations, thus allowing to utilize the hidden limits of input values if these are present but can also cope with systems without anyhow restricted inputs. We consider this novel methodology to be the most important added value of this publication. 3 Preliminaries We assume the theory of bit-vectors (BV), a first-order theory where a bit width q is associated with every term. The universe of this theory is that of natural numbers whose binary representation uses at most q bits; we will denote this domain as bvq. The signature of BV subsumes Peano arithmetic – all operations are computed modulo q, as is common in many programming languages – and it also contains bit-level operations. The ability to precisely reason about computer arithmetic and the existence of efficient decision procedures are the two main reasons why BV is popular in automating both hardware and software verification. In the following we will assume notation similar to that of Kroening and Strichman (2010), i.e. a first-order evaluation ν maps a predicate p to a Boolean value: ν |= p; a function f is evaluated to ν[f ]; finally, ν / {x 7→ y} is ν except the variable x is now mapped to y. Let X be a set of bvq variables. Then we can define the LTL recursively as follows: Ψ ::= pX | ¬Ψ | Ψ ∧ Ψ | X Ψ | Ψ U Ψ, where pX is a BV predicate over the variables from X . A parallel program with t threads and with inputs, bvq variables I, can be modeled as a transition system M = (S, →, s0 ). There the states S are triplets ((l1 , . . . , lt ), ν : X → bvq, pX ∪I ), li are program locations of individual threads, ν is a BV valuation of variables and pX ∪I a path condition, i.e. a predicate stating the condition that would lead the execution to this state. The transition relation →⊆ S × Act × Con × S, where Act = {(x0 , fX ∪I ) | x ∈ X } (denoting an update to x) and Con is the (x0 ,fX ∪I ) set of predicates over X , will be denoted as s −−−−−−→ s0 . pX Let πi be the standard projection functions, then a run of M is an in(x0 ,f ) finite sequence w = s0 , s1 , . . ., where for all i ∈ N: si −−−−→ si+1 and for p pˆ = p[x/π2 (si )(x)] it holds that π3 (si+1 ) = π3 (si ) ∧ pˆ is satisfiable; finally we need to change the valuation of x: π2 (si+1 ) = π2 (si )/{x 7→ π2 (si )[f ](π2 (si )(x))}. A run w satisfies an LTL formula Ψ , w |= Ψ : w w w w w |= p |= ¬Ψ |= Ψ1 ∧ Ψ2 |= X Ψ |= Ψ1 U Ψ2 iff iff iff iff iff π2 (w(0)) |= p, w 6|= Ψ, w |= Ψ1 and w |= Ψ2 , w1 |= Ψ, ∃i∀j < i : wj |= Ψ1 , wi |= Ψ2 . 6 Petr Bauch et al. Where w(i) is the i-th state of w and wi = si , si+1 , . . . the i-th suffix. Every LTL formula Ψ can be translated into a B¨ uchi automaton AΨ = (S, →, F ), where →⊆ S × Con × S and F ⊆ S is the set of accepting states. For AΨ it holds that a run w of M satisfies Ψ if there exists a run w0 = s01 , s02 , . . . in AΨ such that ∀i ∈ N, s0i − → s0i+1 we have π2 (si ) |= p and infinitely many states of p w0 are in F . One can construct a product of M and AΨ , where the only runs are those satisfying Ψ . (Then the states are still triples only the sequence of program locations is longer by one, lt+1 denoting the state of AΨ .) It follows that deciding whether M satisfies Ψ can be reduced to locating cycles with accepting states in such a product. Note that under this definition, which is very similar to that of Lin (1996), both sources of non-determinism that occur in parallel programs – the interleaving of threads and the evaluation of input variables – are represented explicitly. In symbolic execution, initiated by King (1976), the transition system is unfolded (acyclic and infinite), S is thus a multi-set and the second component of a state is a set of possible evaluations, represented symbolically (every x ∈ X is associated with a BV function over I). In Barnat and Bauch (2013) we have proposed a set-based reduction of M, where two states are equal if they have the same sequence of program locations and their sets of evaluations are the same. Hence the set-based reduction extends the approach of symbolic execution by allowing the detection of accepting cycles, and consequently, verification of LTL properties. Example 1 The figure bellow depicts a program with input on the left-hand 1:read a; 2:if(a>5) 3: a++; 4:else 5: a--; (0, (a, 0), >) (a0 , ι1 ) (1, (a, ι1 ), >) a≤5 a>5 (2, (a, ι1 ), ι1 > 5) (a , a + 1) (3, (a, ι1 + 1), ι1 > 5) 0 (4, (a, ι1 ), ι1 ≤ 5) (a , a − 1) (5, (a, ι1 − 1), ι1 ≤ 5) 0 side and its associated transition system on the right-hand side. The set of evaluations (of the one variable a) is represented symbolically, as a function over input symbols from I, here only ι1 . 4 4 Methods We start by formalizing the Simulink diagrams, presented in the introduction. There are several specific details of Simulink diagrams with respect to the general programs with inputs presented above, which may simplify the verification Title Suppressed Due to Excessive Length 7 and thus need to be pointed out in detail. Also, until specified otherwise, the logical system used in our description is the quantifier-free fragment of BV with the bit-width q, i.e. over sort bvq (although constants are written in the decimal system). A state of a Simulink system is described by the evaluation of delay variables, X = {d1 , . . . , dm }, where their values for the next iteration are given by a function fX ∪I , denoted as δi . There is a finite number of input variable templates, I = {i1 , . . . , in }, which can be read iteratively, but for each there are bit-vector constraints limiting its possible evaluation (represented by a predicate pI , denoted as ιi ). Finally, the complete description of a system also requires the outport functions O = {σ1 , . . . , σk } (each of which is fX ∪I ). On the side of the specification, we will abstract the given B¨ uchi automaton to only the predicates pX ∪I∪O labeling its transitions, Φ = {ϕ1 , . . . , ϕl }, and assume that the transition system, the order in which the predicates occur, is given implicitly. Hence the example below contains all the information needed for a Simulink diagram verification query Q = (X , I, O, Φ). Example 2 Let Q1 = (X , I, O, Φ), where X = {d1 , d2 } o2 δ1 : (i1 + d1 ) ∗ (i2 + d2 ) δ2 : d1 O = {σ1 , σ2 , σ3 } ite σ1 : max(i1 , i2 , i3 ) σ2 : ite (i1 > 7) d1 d2 σ3 : d1 + i3 d2 d1 > 7 I = {i1 , i2 , i3 } + ∗ + i1 i2 i3 max o1 ι1 : 1 ≤ i1 ≤ 20 ι2 : 3 ≤ i2 ≤ 5 ι3 : 5 ≤ i3 ≤ 10 Φ = {ϕ1 , ϕ2 } ϕ1 : σ2 > 3 ∨ i1 ≤ σ1 /2 ϕ2 : σ1 = σ2 ⇒ i2 ≤ 4 4 As mentioned above, the states of a Simulink transition system are sets of evaluations of the variables from X . The initial state consists of a single evaluation {di 7→ 0}. Let I = {x := {ij 7→ y} | x |= ιj } be the |I|-dimensional polyhedron of allowed inport evaluations, for Q1 it would be {1..20} × {3..5} × {5..10}. Then, computing every transition consists of three steps: 1. compute the Cartesian product (of this state) with I: results in a set of evaluations of variables from X ∪ I; 8 Petr Bauch et al. 2. create a new state, initialized with the above set of evaluations, for every available specification formula ϕ (there can be more that one, hence the transition system may branch at this point) and remove those evaluations that do not satisfy ϕ; 3. apply δ functions to compute the new evaluations of X . Assuming that the computation is in state s, represented as the evaluation of delay variables, and that the relevant transition is associated with a specification ϕ, then s0 = {x := {di 7→ v[δi ](v(d), v(i))} | v ∈ s × I ∧ x |= ϕ} is the resulting state. The system can reach a deadlock if there is no such v ∈ s × I for which {di 7→ v[δi ](v(d), v(i))} |= ϕ. The model checking process computes the graph of the Simulink computation, where identical states are unified, i.e. if a newly generated state s00 (as a successor of s) is found equal to an already existing state s0 , then s00 is discarded and s0 is acknowledged as a successor of s. For the purpose of providing the user with counterexample traces, the states also contain an |I|-long sequence of inport values that satisfies the specification condition. But that is easily implementable, and will only be mention if a significant change in the computation was necessary to incorporate the counterexample traces. Example 3 We continue with the query Q1 from Example 2 and simplify the notation by establishing two transformations. First, ϕei maps a set of evaluations of X ∪ I to that subset where every evaluation satisfies ϕi , formally e maps a set of the same A ⊆ bvqX ∪I 7→ {x ∈ A | x |= ϕi }. Second, ∆ evaluations to evaluations of X , after the δ functions have been applied, hence A ⊆ bvqX ∪I 7→ {{di 7→ x[δi ]} | x ∈ A}. Hence a part of the transition system of Q1 is as follows: e◦ϕ s01 = ∆ f1 (s0 × I) s0 = {di 7→ 0} e◦ϕ e◦ϕ s011 = ∆ f1 (∆ f1 (s0 × I) × I) e◦ϕ s02 = ∆ f2 (s0 × I) e◦ϕ s012 = ∆ f2 (s01 × I) Concretely, the set s0 × I has 360 elements. ϕ f1 (s0 × I) and ϕ f2 (s0 × I) have 63 and 315 elements, respectively; s01 has 12 elements and s02 has 45 elements. For example s01 = {(3, 0), (4, 0), (5, 0), (6, 0), (8, 0), (9, 0), (10, 0), (12, 0), (15, 0), (16, 0), (20, 0), (25, 0)}. 4 The process described so far produces a transition system, where the states are evaluations of delay variables and a location of the B¨ uchi automaton, and the branching is given by that same automaton. Without going into details with respect to the product of program and its specification – where we went in the previous section – the answer to a verification query Q is equivalent to the presence of accepting cycles in the produced transition system. The efficiency Title Suppressed Due to Excessive Length 9 of answering a verification query, the complexity of Simulink model checking, is most noticeably influenced by the choice of how to represent the sets of evaluations. That is the biggest contributor to the state space explosion, since, unlike in parallel programs, the control-flow non-determinism is negligible in Simulink models. 4.1 Verification with Explicit Sets The first representation considered in this paper stores the allowed evaluations in an explicit set, enumerating all possible combinations of individual variable evaluations. This approach is closely related to the one we proposed in Barnat et al (2012) but improves on it in several aspects. Effectively, rather than repetitive executions for every evaluation of both inport and delay variables, we only represent the delay variables in an explicit evaluation; the inport variables are stored purely symbolically, only as their constructing predicates ιj , outside individual states. The above description of Simulink verification semantics justifies this optimisation, since the inports are only used for the evaluation of Φ predicates from the specification. They are discarded during e transformation, and can be recovered using an inverse transformation if the ∆ necessary, e.g. during counterexample generation. The implementation itself is then a relatively straightforward extension of the purely explicit approach. The states enumerate every allowed evaluation and thus a separate access to each of these evaluations is permitted. Computing the Cartesian product with I amounts to enumerating all combinations of e transformations, one delay and inport variable evaluations. For the ϕ e and ∆ iteratively considers individual evaluations and removes those not satisfying ϕ and applies the δ function, respectively. Most importantly, however, deciding equality of states is possible on the level of syntax: two states are the same if their representations in memory match. Verification with explicit sets clearly retains the biggest limitation of the purely explicit approach, i.e. the spacial complexity grows exponentially with the ranges of inport variables. We will postpone the discussion of the comparison between the explicit set approach and the purely explicit approach until Section 5.2 and only remark that while the improvement is considerable, it does not allow specification of ranges with respect to their bit-width. That ability appears to require a symbolic representation and we continue our analysis towards temporal verification of Simulink models with a method which uses BV formulas and the satisfiability modulo theories (SMT) procedures for this theory. 4.2 SAT-Based Verification The need to iteratively read from inputs via the inport variables complicates the otherwise relatively straightforward application of symbolic execution. Later we 10 Petr Bauch et al. will show that the execution-based approach, where current values of variables are represented as symbolic functions over input variables, entails another complication in deciding state equality. In standard symbolic execution, the variables are initialized to an arbitrary value only once, at the beginning. Thus reading from inports requires to strengthen the standard symbolic execution to allow computation with potentially infinite number of input variables. Henceforth, only the inport variables are considered as first-order variables, the delays and outports are only functions in the BV theory (over inport variables). The inports are history-dependent and thus one may label the symbols from I to stand for the inport variables, i.e. I 0 , I 1 , I 2 and so on. Given that the only branching in the transition system is caused by the particular choice of a specification transition, the states can be represented as l-long sequences of numbers ρ = (r1 , . . . , rl ), where l is the length of this computation. Each number in this sequence represents which specification formula was selected in the respective branching of the computation. Indeed, the functions representing delays δ l , outports σ l and the specification predicates ϕl are unambiguously defined for each l recursively as follows: δ 0 = δ[ij /i0j , dj /0], σ 0 = σ[ij /ilj , dj /0], ϕ0 = ϕ[σj /σj0 , ij /i0j , dj /0], l δ l+1 = δ[ij /il+1 j , dj /δj ]; l+1 l+1 σ = σ[ij /ij , dj /δjl ]; l ϕl+1 = ϕ[σj /σjl , ij /il+1 j , dj /δj ], (1) where f [x/y] is the formula f with every occurrence of x replaced by y. Hence every formula at any point of the verification computation uses only the inport variables decorated with history indices. As mentioned above, the system reaches a deadlock if no value satisfies the specification formula. Let the computation be in a state represented by ρ and the outgoing transition labeled with formula ϕp . Then checking whether this transition leads to a deadlock is equivalent to checking satisfiability of the following recursive path condition formula, where is an empty sequence: V pc() = 1≤j≤|I| ι0j , V |ρ|+1 |ρ|+1 pc(ρ.p) = pc(ρ) ∧ 1≤j≤|I| ιj ∧ ϕp . Also note that the model of this formula, the satisfying evaluation of inport variables, is a counterexample trace (one of them to be precise) which the SMT solver can generate while deciding the satisfiability. Finally, to complete the verification process, one needs to be able to decide if two states are the same. Let ρ and ρ0 be two states, of which it needs to be assessed whether they are identical, i.e. if the sets of possible evaluations of |ρ| the delay variables are the same. Then the function δj represents the possible 0 values of dj in ρ, provided that |= pc(ρ) ∧ pc(ρ ), i.e. both path conditions are satisfiable. However, the δ functions represent the current values of delays by the means of inport variables, describing to what evaluation of delays does a particular combination of inputs lead. The states ρ, ρ0 may not be of the same length and thus may differ in the number of inputs. Consequently, comparing two states amounts to comparing the images of the δ functions, i.e. comparing Title Suppressed Due to Excessive Length 11 Algorithm 1: Successor generation Input : storage of seen states S; state s; specification automaton AΦ Output : S0 where all successors of s have been correctly added ϕ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 foreach ϕi , b0 such that exp(s) →i b0 ∈ AΦ do ρ ← sym(s).i if SAT QFBV(pc(ρ)) then seen ← false foreach s0 ∈ S such that exp(s0 ) = b0 do ρ0 ← sym(s0 ) if SAT QBV(ψ(ρ, ρ0 )) then s0 is a successor of s seen ← true break if ¬seen then exp(s00 ), sym(s00 ) ← b0 , ρ S0 ← store(S, s00 ) s00 is a successor of s the sets of possible evaluations. We will continue this argument in Section 6 and for now simply state the quantified version of ψ(ρ, ρ0 ) := Ψρρ0 ∨ Ψρ0 ρ – a formula which is satisfiable iff ρ and ρ0 are two different states: Ψρρ0 : pc(ρ) ∧ (∀y1 , . . . , y|ρ0 |∗|I| )(pc(ρ0 )[i0b a /ya∗b ] ⇒ W|X | |ρ| |ρ0 | 0b δ = 6 δ [i /y ] . a∗b a j j=1 j Put together the SAT-based verification of Simulink works as shown in Algorithm 1 – we only describe generation of one successor of a state s, the rest is the same as in standard model checking. That is, a particular accepting cycle detection algorithm traverses the state space by the means of successor generation. Given that the states already visited are known, a property that has to be preserved by any implementation of successor generation, the model checking process is indeed similar to the standard explicit model checking, described for example by Vardi and Wolper (1986). The functions in the teletype font have their expected meaning, i.e. sym and exp return the symbolic and explicit part of the state given as their parameter. As described in Section 3, the symbolic part is the set of evaluations of input variables (here succinctly represented as the sequence of specification formulas indices) and the explicit part is the control state (here only the state of the B¨ uchi automaton is relevant). One interesting observation is that the search for equivalent states (cycle on lines 5–10) is in standard model checking a constant time operation, using a hashing function. But our approach prohibits hashing because a representation using BV function is not canonical, leading to identical states with different hashes. The explicit part, which is canonical, is used (line 5) for a partial hashbased search, thus the body of the cycle only considers states with the same 12 Petr Bauch et al. explicit part. Hence the inner cycle computes the linear search among states with a common explicit part, where each comparison requires calling the state matching procedures (line 7), i.e. deciding satisfiability of the quantified formula ψ. Correctness and Complexity : One thing that may not be obvious, and which is crucial when arguing correctness is that the proposed equality of states using the function ψ is correct with respect to the semantics of Simulink diagrams, i.e. ∀ρ, ρ0 : ψ(ρ, ρ0 ) ⇔ sρ 6= sρ0 . This can be easily reduced to Ψρρ0 ⇔ sρ 6⊆ sρ0 and similarly for the other inclusion. Furthermore, Ψρρ0 ⇔ ∃x.x ∈ sρ ∧ x ∈ / sρ0 and |κ| 1 x ∈ sκ ⇔ ∃j11 , . . . , j|I| , j12 , . . . , j|I| .x = d(κ, J1 , . . . , J|κ| ), l where Jl unrolls to j1l , . . . , j|I| and |X | e◦ϕ e g d(<a1 , . . . , an>, J1 , . . . , Jn ) = ∆ g , J1 }) . . . × {Jn }). an (. . . ∆ ◦ ϕ a1 ({0 |κ| 1 One then only needs to show that ∀j11 , . . . , j|I| , j12 , . . . , j|I| if pc(κ)[iab /jba ] then |κ| |κ| <ν[δ1 [iab /jba ]], . . . , ν[δ|I| [iab /jba ]]>= d(κ, J1 , . . . , J|κ| ). That can be done by induction on the length of κ. For the base case we have n+1 that for arbitrary interpretation ν, ν[δi0 ] = 0 = πi (d()). Assume j1n+1 , . . . , j|I| are in some ν evaluated such that ϕk [ia /jan+1 ]. Then ∀1 ≤ l ≤ |X | it holds that e◦ϕ ν[δl [ia /jan+1 , da /πl (d(κ, J1 , . . . , Jn ))]] = πl (∆ fk (d(κ, J1 , . . . , Jn ) × {Jn+1 })), which finally equals πl (d(κ.k, J1 , . . . , Jn+1 )). Having established the correctness of the ψ function, i.e. equivalence among states that represent sets of variable evaluations, the rest follows from the correctness of the set-based reduction, which we proved in Barnat and Bauch (2013). The complexity of the process is much more difficult to establish. On the one hand, the set-based reduction may, in the worst case, lead to no reduction at all. This closely relates to computation of the fix points of operations on program cycles, which is discussed in detail by Lin (1996); Hungar et al (1995) among others. The reader should note, however, that in the case of the Simulink diagram and the verified properties used in our experiments this phenomenon did not occur. In fact the transition systems were exponentially smaller than in the case when no reduction was used. On the other hand, even with exponentially smaller state spaces, every instance of state matching requires decision of satisfiability in the quantified BV theory. That is asymptotically equivalent to satisfiability of quantified Boolean formulas, and thus NEXPTIME-complete, as proved by Wintersteiger et al (2013). Given the results of our experiments (Section 5.2), this high complexity does not prevent from practical use, since many of these decision instances are in fact trivial. Title Suppressed Due to Excessive Length 13 4.3 Hybrid Representation Although the SAT-based representation already achieves viable results for the real-world Simulink model we have experimented on, there is still space for further improvement. In some sense, both explicit and SAT-based representations carried out an excessive amount of work in testing all possible input values. There may be a large number of values that the Simulink engineers did not intend to use, yet this information was not included into the model: either intentionally or because the language does not permit other than interval constraints. Such tacit knowledge may be inferred and utilized to accelerate the verification process. Assume that we want to generate the successor ρ0 of a state ρ, represented V|X | |ρ| as a conjunction of BV terms j=1 δj and the accumulated path condition pc(ρ), using a transition guarded by ϕ. A single evaluation of delay variables belonging to the successor can be obtained by reading the satisfiability model of the formula |X | ^ |ρ| dj = δj ∧ pc(ρ.ϕ). j=1 A satisfiability model is an evaluation of all free variables that satisfies the formula. The input variables can be ignored but we will store the evaluation of delay variables as a sequence d1 =<d11 , . . . , d1|X |>. Now we can extend the above formula to |X | ^ j=1 |X | dj = |ρ| δj ∧ pc(ρ.ϕ) ∧ _ dj 6= d1j , j=1 whose satisfiability model (provided the formula is still satisfiable) contains evaluation of delay variables d2 different from d1 . This processes can be repeated until the resulting formula η (Formula 2 below) becomes unsatisfiable, at which point we have all satisfying evaluation, and thus the explicit representation of the successor ρ0 . There are several notes to be made regarding the above procedure. It is clearly impractical in cases when there are many evaluations forming ρ0 . Yet in many cases the Simulink design permits only a very small number of evaluations. The procedure is intended to be a heuristic: detecting that only few evaluations are admissible or reverting to the classical, symbolic representation. Such detection can be implemented by setting a user-specified threshold thr on the number of evaluations. It immediately follows that using this heuristic will require the ability to switch from symbolic to hybrid representation and vice versa. In the general case, the hybrid state comprises of a pair: the accumulated path condition pc and a non-empty set of delay evaluations D = {d}i . We can assume D to be non-empty because, initially, D = {<0, . . . , 0>} and with every computation step the evaluations in D are either replaced with new evaluations D0 or the path condition is extended (in which case D remains unmodified). The 14 Petr Bauch et al. first case occurs when the successor contains less than thr values, |D0 | < thr and η is unsatisfiable, and the hybrid successor state is < true, D0 >. The second case occurs when |D0 | ≥ thr, the successor is <pc.ϕ, D>, where ϕ is the transition guard. We are now ready to formulate the formula η, employed in the generation of successor evaluations: |D 0 | |X | |X | η: ^ dj = |ρ| δj ∧ pc(ρ.ϕ) ∧ j=1 ^ _ dj 6= dkj . (2) k=1 j=1 The hybrid representation thus maintains invariant the property that a state is formed by a certain concrete evaluation of delay variables D and a symbolic path condition, consisting of n formulas. This state, however, represents the result of a computation of n + m steps, where the effect of the first m steps is precisely represented and stored in D. The only modification of the preceding SAT-based verification required to incorporate hybrid representation is an additional set of formulas restricting the initial delay evaluations. More precisely, the set of recursive equations from Definition 1 has to be preceded by |D| |X | _ ^ d0 = dkj . k=1 j=1 The size of D is initially 1 and never grows above thr: if the successor state contains more than thr values of delays – a fact which is automatically deduced – the verification proceeds with the symbolic representation. Yet whenever the successor contains at most thr values, our hybrid representation becomes fully explicit, succinctly representing the complete information about the system’s computation up to this point. 5 Results We report the results of the verification of the VoterCore diagram, which was partly presented in Section 1: the figure shows one third of the whole diagram, the other two thirds are connected via the c3 constant. This diagram was selected for two reasons: (1) the operations that must be computed during state space traversal are sufficiently complex to demonstrate the strength of SMT, (2) the diagram itself is reasonably simple so that scalability compared to other approaches can be demonstrated. Note that even though this diagram comes from a real-world development, it does not represent the full model used in the design phase. It was identified as a crucial unit and extracted manually for verification purposes. The above mentioned diagram was verified against three LTL specifications: φ1 : G (sd23 > 1 ∧ ¬sv1 ) ⇒ sm1 ; φ2 : G(pm1 ⇒ G pm1 ); φ3 : G(sm1 ∧ Xsm1 ∧ XXsm1 ∧ XXXsm1 ⇒ XXXpm1 ), Title Suppressed Due to Excessive Length 15 where the model satisfied φ1 , and φ2 , but was incorrect with respect to φ3 . The previous, purely explicit solution, which we described in Barnat et al (2012) and refer to it here as expl, is compared with the two solutions proposed in this paper: verification using explicit sets (set) and the SAT-based verification (sat). Finally, the hybrid representation (hyb) is compared to sat on a set of experiments using the same model but focusing also on a collection of extreme cases, where sat behaved poorly. 5.1 Implementation Both explicit-set and SAT-based approaches to verification of Simulink diagrams were implemented2 in a clone of the DiVinE verification environment, which already supported these diagrams as input, in the form of CESMI intermediate language (see Barnat et al (2013) for details). The implementation of set is a relatively straightforward extension of expl: instead of keeping the evaluations in separate states there are fewer multi-states for every explicit control state. Furthermore, only the delay variables are represented; the inport variables are stored separately only once for the whole diagram. The implementation of sat first needed the expressions represented by Simulink blocks to be translated into BV formulas. Algorithm 1 demonstrates how to implement the model checking process, with a function for generating successors, using syntactic substitution. Initially, the state matching was implemented exactly as described, where only the inport variables were quantified. But the experiments revealed that much better verification times can be achieved when all variables are quantified and the substitution is not recursive, but uses only the previous history version of a particular variable. At least for the Z3 de Moura and Bjørner (2008) solver, this leads to better results. Communication with the SMT solver is facilitated by the SMT2 Barrett et al (2010) format, and thus any solver of quantified BV theory could have been used; to the best of our knowledge, however, Z3 Wintersteiger et al (2013) is the only one at this time. As mentioned in Section 3, the states comprise of two parts: explicit and symbolic. The explicit part contains, most importantly, the state of the B¨ uchi automaton and the model checker uses hashing on this part of a state to partially solve the state matching. The symbolic part contains the path condition vector and must be excluded from hashing. During successor generation, the path condition of the original state (in a conjunction with a formula labeling the B¨ uchi automaton transition) is tested for satisfiability. The resulting formula does not contain quantifiers, and thus a decision procedure for quantifier-free BV is sufficient: line 3 of Algorithm 1. The SMT2 file communicating the request would then be as follows: (set-option :produce-models true) (set-logic QF BV) 2 Code available at http://anna.fi.muni.cz/~xbauch/code.html#simulink. 16 Petr Bauch et al. (declare-fun a0x0 () ( BitVec 4)) (declare-fun a1x1 () ( BitVec 4)) (declare-fun a12x1 () ( BitVec 4)) ... (assert (= a0x0 #x0)) (assert (and (bvuge a1x1 #x0)(bvule a1x1 #x3))) (assert (= a12x1 (ite (bvuge (bvadd (ite (or (bvugt a1x1 #x1) (not (= a2x1 #x1))) #x1 #x0) (ite (bvult (ite (or (bvugt a1x1 #x1) (not (= a2x1 #x1))) a0x0 #x0) #3) (ite (or (bvugt a1x1 #x1) (not (= a2x1 #x1))) a0x0 #x0) #x3)) #x3) #x1 #x0))) ... (assert (and(= a12x1 #x1)(= a12x1 #x0))) (check-sat) (get-value (a1x1 a2x1 a4x1 a5x1 a7x1 a8x1)) where the variables a0x0, a1x1, and a12x1 are examples of delay, inport, and outport variables, respectively; also the xi suffix denotes the history index. The third line from the end is the current path condition: the algorithm is generating successors of the first state, thus only one specification formula is present. Finally, the last line requests the model of the system of formulas: the inport variables evaluation for counterexample generation. State matching, on the other hand, leads to a formula in quantified BV, see line 7 of Algorithm 1, and adequately powerful solver needs to be used. The following fragment shows the interesting part of the communicated SMT2 file: (assert (forall ((b0x0 Full)(b3x0 Full)(b6x0 Full)) (=> (and (= b0x0 #x0) (= b3x0 #x0) (= b6x0 #x0)) (or (distinct a0x1 b0x0) (distinct a3x1 b3x0) (distinct a6x1 b6x0))))) where Full is the domain of delay variables (ai and bi refer to the same variables in different states). Note also that the algorithm allows comparison between delay variables with different history indices, i.e. those from states represented by path conditions of unequal length. Hybrid Representation Implementation: With regards to the hybrid representation of Section 4.3, there are two interesting implementation details: the generation of delay values using SMT queries and the modification of searching among known states. Other than these two changes, both path condition satisfiability and state matching have to be extended with the enumeration of initial delay values: (assert (or (and (= a6x0 #x0) (= a7x0 #x0) (= a8x0 #x0)) (and (= a6x0 #x0) (= a7x0 #x0) (= a8x0 #x1)) (and (= a6x0 #x0) (= a7x0 #x0) (= a8x0 #x2)) )) which are then referenced in expressions for other Simulink variables (and possibly delays with higher history index). These initial delays are the only variables with history index zero and they retain it throughout the computation. This is justified because the length of the computation represented symbolically is equal to the length of the pc sequence, thus we can always label the Simulink variables with the correct index. The generation of delay values is an extension of the path condition satisfiability checking: there as well has to be the enumeration of initial delay values but instead of collecting the values of input variables from the satisfiability Title Suppressed Due to Excessive Length 17 model, we are interested in the values of delays. These values are stored and later used in subsequent queries so that the enumeration could be exhaustive. The interesting part of the query would thus have the following structure: (assert (and (or (distinct a6x2 #x0) (distinct a7x2 #x2) (distinct a8x2 #x7)) (or (distinct a6x2 #x3) (distinct a7x2 #x0) (distinct a8x2 #x0)) )) (check-sat) (get-value (a6x2) (a7x2) (a8x2)) which instruments the SMT solver to check satisfiability of the path condition using only such inputs whose evaluation leads to any value of delays different from those explicitly enumerated. Storing delay evaluations explicitly in the hybrid representation provides a very important property for model checking and that the representation is canonical. Hence the slow linear search on lines 5–10 of Algorithm 1 may be replaced with an effectively constant time hash-based search. Given that the states are completely represented by the delay evaluations, moving these evaluations into the explicit part of the state suffices to implement such hashbased search. Only those states with path conditions consisting of at least one formula would need to be distinguished using the above SMT queries and only among themselves. Two states <pc, D > and <pc0 , D0 > can only be equal if |pc| = 0 ⇔ |pc0 | = 0, i.e. if either both have been exhaustively concretized in the previous step or neither of them. Since two equal states must contain the same number of possible delay evaluations, it follows that the generating procedure would either report that there are more than thr values or successfully enumerate both states. 5.2 Experiments Similar execution conditions were chosen for the comparison between the purely explicit approach (unmodified DiVinE) and the new hybrid approaches: the codes were compiled with optimisation option -O2 using GCC version 4.7.2 and ran on a dedicated Linux workstation with quad core Intel Xeon 5130 @ 2GHz and 16GB RAM. Given that DiVinE uses on-the-fly verification – the traversal terminates when an accepting cycle is detected – the progression of the verification process is prone to vary. Furthermore, parallel algorithms tend to differ in the runtime between individual executions, hence we have executed every experiment 10 times and report the average of those. 5.2.1 Purely Explicit versus Explicit Sets The 6 plots in Figure 2 contain all the measured experiments: the left-hand side reports time results and the right-hand side reports space results; each row refers to experiments against different temporal specification φ1 , φ2 , and φ3 described above. Each plot has the range of inport variables placed on the linear x-axis and either time or space on the logarithmic y-axis. The crucial observation to be made from the figures is that the set experiments scale 18 Petr Bauch et al. 1000 Space (kB) 100 Time (s) 1e+07 expl-seq expl-par set-seq set-par 10 1 0.1 1 2 3 4 5 6 7 8 expl-seq expl-par set-seq set-par 1e+06 100000 10000 9 1 2 3 Range of variables 4 5 6 7 8 9 7 8 9 7 8 9 Range of variables (a) Verification complexity for property φ1 1000 Space (kB) 100 Time (s) 1e+07 expl-seq expl-par set-seq set-par 10 1 0.1 1 2 3 4 5 6 7 8 expl-seq expl-par set-seq set-par 1e+06 100000 10000 9 1 2 3 Range of variables 4 5 6 Range of variables (b) Verification complexity for property φ2 1000 Space (kB) 100 Time (s) 1e+07 expl-seq expl-par set-seq set-par 10 1 expl-seq expl-par set-seq set-par 1e+06 100000 0.1 0.01 1 2 3 4 5 6 7 8 9 Range of variables 10000 1 2 3 4 5 6 Range of variables (c) Verification complexity for property φ3 Fig. 2: Plots that report the results of the VoterCore Simulink diagram verification, comparing the purely explicit approach (expl) with the approach that uses explicit sets of variable evaluations (set). The sequential verification (-seq) is compared with the parallel verification (-par) which used four processor cores. The range z of input variables on the x-axis corresponds to the domain {0 . . . z}. The expl experiments had a time-out limit of 1000 seconds and a memory limit of 10GB. For example the unreduced state space of range 5 has 375000 states and 500 million transitions. with the range of variables much more effectively than expl experiments. This observation, however, is obfuscated by two phenomena: the difference between parallel and sequential algorithms (treated in the next paragraph) and the results for property φ3 . The VoterCore system is not a model of φ3 and hence Title Suppressed Due to Excessive Length 19 there is an accepting cycle in the system. On-the-fly verification enables very fast detection in some cases (when the cycle is near the initial state) and thus the expl experiments are better on smaller ranges (though the time and space are negligible for both approaches), because for set experiments the generation of every successor involves nontrivial amount of computation. The difference between parallel and sequential algorithms used in the experiments deserves placing under closer scrutiny. Parallel algorithms (expl-par and set-par in the plots) employ breadth-first search unlike sequential algorithms (expl-seq and set-seq) that employ depth-first search. Given that the resulting transition system is very shallow (the longest paths have approx. 20 edges) and at the same time extremely wide (the data-flow explosion causes each state to have many successors), the depth-first approach has a considerable advantage with respect to the space complexity. This can be observed on all the right-hand side figures for expl experiments, yet the set experiments cannot profit from the same phenomenon: the data-flow explosion of the number of successors was transformed into the complexity of their generation, which is common to both parallel and sequential approaches. Hence while retaining the parallel scalability (par experiments use all four processor cores) in time, in space the set experiments demonstrate superiority only compared to par experiments. (φ1 experiments are anomalous because the property transition system has no branching and thus set experiments traverse a linear system and cannot scale in parallel even in theory.) 5.2.2 Explicit Sets versus SAT-Based Verification The next 6 plots in Figure 3 compare the two approaches proposed in this paper. The setting is exactly the same as before, except this time we do not include the results of parallel verification not to obfuscate the main message. Most importantly, for the VoterCore diagram and for domains of input variables larger than approximately 40, the SAT-based representation surpasses the one using explicit sets. The plots only report a part of the experiments, the limit on the x-axis is artificial so that the phenomena before the range of 40 remain clear. In fact the sat experiments continued to a range corresponding to the domain 0 − 232 of standard unsigned integers, which degraded the time performance at most twice compared to, for example, the range 10. Furthermore, the spacial requirements of such verification were almost negligible for arbitrary range, rarely higher than 500 MB. For very small ranges of variables, strictly smaller than 40, the spacial requirements of the set approach are tolerable and the time complexity is better than that of the sat approach. The outstanding spikes in the complexity of sat also deserve further explanation. They correspond to ranges 2n − 1 for some n. We postulate that this relates to the specific procedure that Z3 uses to decide satisfiability of quantified BV formulas. The precise explanation would probably require a detailed exposition of the functioning of the particular decision procedure employed in Z3, and we encourage the interested readers to follow it in Wintersteiger et al (2013). The high level process in fact incorporates a model 20 Petr Bauch et al. 10000 1e+07 sat set sat set Space (kB) Time (s) 1000 100 10 1 100 101 102 103 104 105 106 107 108 109 Range of variables 1e+06 100000 10000 100 101 102 103 104 105 106 107 108 109 Range of variables (a) Verification complexity for property φ1 10000 1e+07 sat set sat set Space (kB) Time (s) 1000 100 10 1 100 101 102 103 104 105 106 107 108 109 Range of variables 1e+06 100000 10000 100 101 102 103 104 105 106 107 108 109 Range of variables (b) Verification complexity for property φ2 10000 1e+07 sat set sat set 100 10 1 100 101 102 103 104 105 106 107 108 109 Range of variables Space (kB) Time (s) 1000 1e+06 100000 10000 100 101 102 103 104 105 106 107 108 109 Range of variables (c) Verification complexity for property φ3 Fig. 3: Plots that report the results of VoterCore Simulink diagram verification, comparing the representations based on explicit sets (set) and BV formulas (sat). The range z of input variables on the x-axis corresponds to the domain {0 . . . z}. The set experiments had a memory limit of 10GB. checking of quantifier instantiations, guided by previously tried unsuccessful counterexamples. It appears that limiting the range to a value very close to 2n forces a larger number of wrong instantiations. Title Suppressed Due to Excessive Length 21 5.2.3 Evaluation of the Hybrid Representation As will become clear once the results pertaining to the verification using hybrid representation (hyb) are presented, there is no need to compare it with the explicit verification. Both time and space requirements of hyb are lower than the respective requirements of expl, except on the most trivial instances. Yet the theoretical comparison of the two approaches is particularly interesting because the states themselves have exactly the same representation, i.e. explicit enumeration of delay variable evaluations. The only difference is in the process by which these evaluations were generated. Unlike in expl where we have to test all evaluations of inputs to see which delay evaluations they produce, in hyb we only employ those combinations of inputs for which we know that they will produce different delays. This knowledge about the Simulink system is obtained using further SMT queries, and may by itself help the designer in validation that the modeled system is the one intended. The plots in Figure 4 compare the purely symbolic and the hybrid representations with respect to the verification time. (We are not comparing the spacial requirements because they were negligible in sat already and in hyb the peak memory consumption never surpassed 6MB.) The timing results for sat are exactly the same as in Figure 3, only here we intentionally pinpoint the difficult domain sizes, i.e. the cases when input ranges are 0 − (2n − 1). The SMT solver struggles in these cases if it must produce a proof of unsatisfiability for a quantified query. We hypothesize that this phenomenon is caused by the model-based instantiation of quantified variables, used as one of the techniques in Z3. Setting the upper bound of input range this close to the limit posed by the fixed bit width seems to force the instantiation to choose from a larger set of values, before the solver can deduce unsatisfiability. It may thus be possible to modify the solver to achieve better results, and we are presently investigating this possibility. What these plots immediate show is that the undesirable behavior on difficult domain sizes was completely eliminated with the employment of hyb. Even though it occurred in a logarithmic number of cases, it would still be very unpleasant if the system designer chose such a case. Disregarding these extreme cases, with hyb we have achieved 2.4, 6.7, and 2.5 speedup for the three verified properties respectively. With the new representation, the verification process scales even better and the complexity is in fact only dependent on the number of steps needed to resolve the verification query. On the other hand, the complexity of individual SMT queries in hyb does not grow with the number of steps. It is not the case for sat, where the number of quantified variables is directly related to the length of the current path condition. Hence the difference in speedups for the three verified properties: checking ϕ2 required building a state state space with the longest path twice the length as for the other properties. We thus conclude that for more complex systems and in cases when hyb is applicable, as discussed in Section 4.3, it would produce even better speedup when compared to sat. 22 Petr Bauch et al. Time (s) 1000 sat hyb 100 10 1 20 22 24 28 216 Range of variables 232 (a) Verification complexity for property φ1 Time (s) 10000 sat hyb 1000 100 10 20 22 24 28 216 Range of variables 232 (b) Verification complexity for property φ2 Time (s) 10000 sat hyb 1000 100 10 20 22 24 28 216 Range of variables 232 (c) Verification complexity for property φ3 Fig. 4: Plots that report the results of VoterCore Simulink diagram verification, comparing the representation based on BV formulas (sat) and the hybrid representation (hyb). The range z of input variables on the x-axis corresponds to the domain {0 . . . z}. 6 Discussion By reducing deadlock checking and state matching to SMT queries we have managed to accelerate the model checking process to a point when the developer Title Suppressed Due to Excessive Length 23 can omit specifying the unit testing input and verify that the design is correct for all possible values. Given that the process still requires large amounts of computational resources, the newly proposed hybrid representation accelerates the method further, thus rendering it even more applicable for verifying critical units in Simulink designs. To summarize the findings of our experiments with verification of Simulink diagrams, we propose a combination of the set and sat/hyb approaches. Such a combining verification is possible, because the two approaches allow identical models as the input. The result would correspond to the composition of (the better of) the solid and dotted lines of Figure 3. The developer could decide which representation to use, based on the range of variables they need to verify against. Or – better yet, and fully automatically – the two approaches can be run in parallel, the one finishing first reporting the results of the verification. Arguably, the experimental results and the achieved empirical findings remain largely academic. Even though the VoterCore model used in our experiments comes from a real-world design, it is only a part of a larger Simulink model. Industrial application of the proposed method would equally require manually selecting a safety-critical part of the verified model and verifying that this part has the desired properties. Our experiments already show the limits of using SMT solvers for LTL verification, even when the new hybrid representation is employed. More importantly, however, the experiments also show that if the input model is sufficiently small for the verification to finish in reasonable time, then a complete coverage across all possible input values is provided. Which is a quality that the established techniques based on testing cannot provide. 6.1 Theoretical Limitations Given that the proposed verification technique reduces the problem of LTL model checking to a sequence of SMT-queries, the limitations of the technique derives from the state-of-the-art of the SMT solvers. It follows that improvements in the efficiency of SMT solvers will also improve our technique and this improvement will require no further modifications. On the other hand, solving quantified SMT queries is a computationally demanding task. We will thus discuss the state matching – the part of our technique that seems to require solving quantified queries – in a greater detail. The Figure 5 below shows a part of the verification process, where the x-axis lists the individual instances of state matching as they appeared in time. The y-axis represents the number of quantifier instantiations the solver needed to employ before finding a counterexample or a proof. Finding counterexamples, i.e. evaluations of delay variables that exist in one state but not in the other, appears to be a considerably simpler task, in the figure corresponding to steps of less than 40 instantiations. Finding proof of equality between the two states was much more difficult, often requiring more than 400 instantiations with Petr Bauch et al. Instantiations 24 1000 100 10 1 10 20 30 40 50 60 70 80 90 100 Fig. 5: Time progression of the complexity of individual state matching instances. equivalently higher time and space complexity. These higher spikes occur in consecutive pairs, one for each subset inclusion. 6.2 State Matching by Comparing Function Images Returning back to the claimed necessity of resorting to quantified formulas 0 for state matching, note that computing the equivalence between δ |ρ| and δ |ρ | would be sufficient for state matching, if the inputs were read only once at the beginning. The state space would be larger as some states with the same sets of values would have semantically different representing functions. In Simulink, where inputs are read iteratively, however, such an approach would lead to infinite transition systems in all nontrivial instances. Computing equivalence between the two δ functions does not yield a correct result with respect to image comparison. For example on the Boolean domain the functions negation and identity are not equivalent, yet their images are the same. Consequently, stating the comparison as satisfiability in the BV theory must be different than simple equality. Assume that the formula Ψρρ0 is satisfiable iff ρ and ρ0 are two different states. Then the model of Ψρρ0 must encode an element, current evaluation of delay variables, of either ρ or ρ0 that is not in the other state. But Ψρρ0 can only refer to the domains of δ functions, the input variables, because in symbolic execution the current values are represented as functions on input variables. It follows that the satisfying evaluation of input variables in ρ must be such that for any evaluation of the inputs in ρ0 the δ functions evaluate to different values. It appears that stating functional image comparison within symbolic execution as a satisfiability decision requires the use of quantifiers. That much seems to hold if it is the input variables that are free in Ψρρ0 as argued above. The more general question, whether for bit-vector functions f : bvqn → bvq, f 0 : bvqm → bvq, there is a quantifier-free bit-vector formula ψ such that n m |ψ| ∈ poly(n + m) and ψ is satisfiable iff f (2bvq ) = f 0 (2bvq ), is outside the scope of this work and we leave it open for future research. The more interesting question, at least from the practical point of view, is how to implement the state matching in set-based reduced transition system, regardless of how the sets are represented. Consider for example that one can represent the sets of evaluations using their characteristic functions, i.e. Title Suppressed Due to Excessive Length 25 functions over state-forming variables that, when provided with an evaluation of those variables, return either 1 or 0, whether or not this evaluation is part of the set. (In other words representing evaluations of variables as the collected post-conditions.) Then the state matching would reduce to deciding semantic equivalence of these characteristic functions, or, if a canonical representation was available, even to syntactic equivalence. 7 Related Work Firstly, there are three practical papers, that we are aware of, describing LTL verification of Simulink diagrams. Miller et al (2005) translate Simulink models into the synchronous data-flow language Lustre, created by Halbwachs et al (1991), and then into the native language of the symbolic model checker NuSMV, created by Cimatti et al (2002). NuSMV was then used to verify correctness of the model with respect to a set of specifications (mostly in CTL, but NuSMV can verify full LTL as well) using BDD-based (Binary Decision Diagrams: see McMillan (1992), for a classical approach) representation of the state space. Although it was not a limitation in the input diagrams they used, BDDs are not readily able to support complex data types with Peano arithmetic, at least not while preserving their efficiency, as we will discuss later in this subsection. Similarly, Meenakshi et al (2006) translate Simulink diagrams for the verification using NuSMV, but in this case the translation is direct, without an intermediate language. This work is more relevant because the diagrams used contained integer data types and full Peano arithmetic (NuSMV flattens integer types into Boolean types, but represents the stored values precisely). The authors do not mention explicitly if they used the BDD-based branch or SAT-based branch of verification. Unfortunately, we could not compare that approach with the one proposed in this paper, since the implementation is not available. Its efficiency can be only assumed from the reported results: when input variables were not bounded explicitly, i.e. allowed values between 0 and 232 , the verification time was almost a week; the bounds for reasonably fast verification had to be relatively small: between 0 and 60. Explicit model checking was also used for verification of Simulink diagrams by Barnat et al (2012), but there the data-flow non-determinism in the form of input variables had even greater detrimental effect. This is the only comparable implementation presently available and we provide detailed comparison between this purely explicit approach and the hybrid, control explicit—data symbolic approaches described in this paper in Section 5. From a theoretical point of view, the method proposed in this paper is effectively equivalent to symbolic execution extended with LTL verification. This combination was attempted before by Braione et al (2008), but classical symbolic execution does not allow state matching and thus only a small subset (safety properties) of LTL was supported. Without state matching, an infinite violating run would cause the tool to diverge, never yielding an answer. On the 26 Petr Bauch et al. other hand it is possible to implement state subsumption (a state represents more heap configurations than another state) in symbolic execution, as shown by Xie et al (2005), but subsumption is not correct with respect to LTL even though it can significantly reduce the state space (and make it finite). A considerable amount of work pertained to allowing symbolic model checking to use more complex data types than Booleans. The problem is that BDDs grow exponentially in the presence of integer multiplication, as proved by Bryant (1991). Other symbolic representations were designed that represent variables on the word level rather than binary level, such as Binary Moment Diagrams, used by Bryant and Chen (1995), or Boolean Expression Diagrams, used by Williams et al (2000), even though these are no longer canonical. Similarly to our approach, symbolic model checking can also use first-order formulas directly, leading to SAT-based and SMT-based approaches, invented by Biere et al (1999) and Armando et al (2006), respectively, provided that the procedure is bounded in depth, and consequently incomplete. Various approaches to unbounding have been proposed, most recently the IC3 method of Bradley (2011), but these are rather theoretical, without implementation, or limited to weaker arithmetics, see e.g. the model checker Kind based on k-induction and created by Hagen and Tinelli (2008). Module checking, introduced by Kupferman and Vardi (1996) and detailed by Godefroid (2003), allows verification of open systems. A system is open in the sense that the environment may restrict the non-determinism and the verification has to be robust with respect to arbitrary restrictions. Consequently, the approach to verifying open systems also differs since only branching time logics can distinguish open from closed systems, in the module checking sense. For linear time logics, every path has to satisfy the property and thus open and closed systems collapse into one source of non-determinism. Much closer to our separation between control and data is the work initiated by Lin (1996). Lin’s Symbolic Transition Graphs with Assignments represent precisely parallel programs with input variables using a combination of firstorder logic and process algebra for communicating systems. Similarly as for symbolic execution, the most complicated aspect of this representation is the handling of loops. Lin’s solution computes the greatest fix point of a predicate system representing the first-order term for each loop. Then two transition graphs are bisimilar if the predicate systems representing their loops are equivalent. The set-based reduction of transition systems used in this paper effectively compute the fix points explicitly, represented as sets of variable evaluations. Finally, various combinations of different approaches and representations have been devised and experimented with. When multiple representations were combined, it was mostly to improve on weak aspects of either of the representations, for example by Yang et al (2006) multiple symbolic representations for Boolean and integer variables were employed in combination. Presburger constraints were combined with BDDs by Bultan et al (1998) to allow, with some restrictions, the verification of infinite state spaces. Finally, the two approaches to model checking, explicit and symbolic, were combined Title Suppressed Due to Excessive Length 27 to improve solely upon control-flow non-determinism. Some improvement was achieved by storing multiple explicit states in a single symbolic state, implemented by Duret-Lutz et al (2011), or by storing explicitly the property and symbolically the system description, implemented by Sebastiani et al (2005). The approach described by Hungar et al (1995) represents control using symbolic model checking and data by purely symbolic manipulation of first-order formulas. There the symbolic data are limited in the sense that they cannot influence the control flow. 8 Conclusion This paper combines explicit model checking with a representation of data variables based on sets of possible evaluations. The resulting verification method allows temporal verification of systems that read from non-deterministic inputs. When the sets of evaluations are represented symbolically – as bit-vector formulas – the major obstacle that we faced and solved is the solution of state matching. The state matching procedure proposed here requires deciding satisfiability of quantified bit-vector formulas, which is a resource-intensive process, but the experimental evaluation on Simulink diagrams indicates that for such systems is the cost acceptable. Still, in order to improve the effectivity of design supported by verification, we have proposed, implemented and evaluated a combing approach using a hybrid representation of data. This representation leverages the positive aspects of both the concrete and symbolic representations while employing some knowledge about the Simulink diagram which was not explicitly stated by the developer. We have demonstrated how SMT solvers can be used to infer this tacit knowledge, which can subsequently enable the hybrid representation to achieve considerably better performance. For the use in verification of parallel programs or at least safety critical segments of programs, the cost would probably be prohibitive. We discuss ideas that could lead to expressing the state matching problem without the use of quantifiers, but leave that direction of research to future work. Yet in the case of Simulink diagrams, our approach scales with the ranges of input variables and thus allows the developer to use the range limit of the used data type, e.g. 32 bits integers, where before the developers had to test for ranges that were exponentially smaller. This improvement effectively automates the verification process, replacing completely any manual testing, since the resulting confidence in the correctness of the system with model checking is at least as high as it was with classical testing. References Armando A, Mantovani J, Platania L (2006) Bounded Model Checking of Software Using SMT Solvers Instead of SAT Solvers. In: SPIN, LNCS, vol 3925, Springer, pp 146–162, DOI 10.1007/11691617 9 Barnat J, Bauch P (2013) Control Explicit—Data Symbolic Model Checking: An Introduction. Tech. rep., Masaryk University, http://arxiv.org/abs/1303.7379 28 Petr Bauch et al. Barnat J, Beran J, Brim L, Kratochv´ıla T, Roˇ ckai P (2012) Tool Chain to Support Automated Formal Verification of Avionics Simulink Designs. In: FMICS, LNCS, vol 7437, Springer, pp 78–92, DOI 10.1007/978-3-642-32469-7 6 ˇ Barnat J, Brim L, Havel V, Havl´ıˇ cek J, Kriho J, Lenˇ co M, Roˇ ckai P, Still V, Weiser J (2013) DiVinE 3.0 – Explicit-state Model-checker for Multithreaded C/C++ Programs. In: CAV, pp 863–868, DOI 10.1007/978-3-642-39799-8 60 Barnat J, Bauch P, Havel V (2014) Temporal Verification of Simulink Diagrams. In: Proc. of HASE, pp 81–88, DOI http://dx.doi.org/10.1109/HASE.2014.20 Barrett C, Stump A, Tinelli C (2010) The SMT-LIB Standard: Version 2.0. Tech. rep., The University of Iowa Biere A, Cimatti A, Clarke E, Fujita M, Zhu Y (1999) Symbolic Model Checking Using SAT Procedures instead of BDDs. In: Proc. of DAC, ACM, pp 317–320, DOI 10.1145/309847. 309942 Bradley A (2011) SAT-Based Model Checking without Unrolling. In: VMCAI, pp 70–87, DOI 10.1007/978-3-642-18275-4 7 Braione P, Denaro G, Kˇrena B, Pezz` e M (2008) Verifying LTL Properties of Bytecode with Symbolic Execution. In: Proc. of Bytecode, Elsevier Science, pp 1–14 Bryant R (1991) On the Complexity of VLSI Implementations and Graph Representations of Boolean Functions with Application to Integer Multiplication. IEEE Trans Comput 40(2):205–213, DOI 10.1109/12.73590 Bryant R, Chen YA (1995) Verification of Arithmetic Circuits with Binary Moment Diagrams. In: Proc. of DAC, pp 535–541, DOI 10.1145/217474.217583 Bultan T, Gerber R, Pugh W (1997) Symbolic Model Checking of Infinite State Systems Using Presburger Arithmetic. In: CAV, LNCS, vol 1254, Springer, pp 400–411, DOI 10.1007/3-540-63166-6 39 Bultan T, Gerber R, League C (1998) Verifying Systems with Integer Constraints and Boolean Predicates: A Composite Approach. In: Proc. of ISSTA, pp 113–123, DOI 10.1145/271771.271799 Cimatti A, Clarke E, Giunchiglia E, Giunchiglia F, Pistore M, Roveri M, Sebastiani R, Tacchella A (2002) NuSMV 2: An OpenSource Tool for Symbolic Model Checking. In: CAV, pp 241–268, DOI 10.1007/3-540-45657-0 29 Clarke E, Emerson E, Sistla A (1986) Automatic Verification of Finite-State Concurrent Systems Using Temporal Logic Specifications. ACM T Progr Lang Sys 8(2):244–263, DOI 10.1145/5397.5399 Cousot P, Cousot R (1977) Abstract Interpretation: A Unified Lattice Model for Static Analysis of Programs by Construction or Approximation of Fixpoints. In: Proc. of POPL, ACM, pp 238–252, DOI 10.1145/512950.512973 Duret-Lutz A, Klai K, Poitrenaud D, Thierry-Mieg Y (2011) Self-Loop Aggregation Product — A New Hybrid Approach to On-the-Fly LTL Model Checking. In: ATVA, LNCS, vol 6996, Springer, pp 336–350, DOI 10.1007/978-3-642-24372-1 24 Godefroid P (2003) Reasoning about Abstract Open Systems with Generalized Module Checking. In: EMSOFT, LNCS, vol 2855, Springer, pp 223–240, DOI 10.1007/ 978-3-540-45212-6 15 Hagen G, Tinelli C (2008) Scaling Up the Formal Verification of Lustre Programs with SMTBased Techniques. In: Proc. of FMCAD, pp 1–9, DOI 10.1109/FMCAD.2008.ECP.19 Halbwachs N, Caspi P, Raymond P, Pilaud D (1991) The Synchronous Data Flow Programming Language LUSTRE. Proc IEEE 79(9):1305–1320, DOI 10.1109/5.97300 Hungar H, Grumberg O, Damm W (1995) What if Model Checking Must Be Truly Symbolic. In: CHARME, LNCS, vol 987, Springer, pp 1–20, DOI 10.1007/3-540-60385-9 1 King J (1976) Symbolic Execution and Program Testing. Commun ACM 19(7):385–394, DOI 10.1145/360248.360252 Kroening D, Strichman O (2010) Decision Procedures: An Algorithmic Point of View. Springer Kupferman O, Vardi M (1996) Module Checking. In: CAV, LNCS, vol 1102, Springer, pp 75–86, DOI 10.1007/3-540-61474-5 59 Lin H (1996) Symbolic Transition Graph with Assignment. In: CONCUR, LNCS, vol 1119, Springer, pp 50–65, DOI 10.1007/3-540-61604-7 47 McMillan K (1992) Symbolic Model Checking. PhD thesis, Carnegie Mellon University Title Suppressed Due to Excessive Length 29 Meenakshi B, Bhatnagar A, Roy S (2006) Tool for Translating Simulink Models into Input Language of a Model Checker. In: ICFEM, LNCS, vol 4260, Springer, pp 606–620, DOI 10.1007/11901433 33 Miller S, Anderson E, Wagner L, Whalen M, Heimdahl M (2005) Formal Verification of Flight Critical Software. In: Proc. of GNC, pp 1–16 de Moura L, Bjørner N (2008) Z3: An Efficient SMT Solver. In: TACAS, LNCS, vol 4963, Springer, pp 337–340, DOI 10.1007/978-3-540-78800-3 24 Owicki S, Gries D (1976) An Axiomatic Proof Technique for Parallel Programs I. Acta Inform 6:319–340, DOI 10.1007/BF00268134 Sebastiani R, Tonetta S, Vardi M (2005) Symbolic Systems, Explicit Properties: On Hybrid Approaches for LTL Symbolic Model Checking. In: CAV, LNCS, vol 3576, Springer, pp 100–246, DOI 10.1007/11513988 35 Vardi M, Wolper P (1986) An Automata-Theoretic Approach to Automatic Program Verification. In: Proc. of LICS, IEEE Computer Society Press, pp 332–344 Williams P, Biere A, Clarke E, Gupta A (2000) Combining Decision Diagrams and SAT Procedures for Efficient Symbolic Model Checking. In: CAV, LNCS, vol 1855, Springer, pp 124–138, DOI 10.1007/10722167 13 Wintersteiger C, Hamadi Y, de Moura L (2013) Efficiently Solving Quantified Bit-Vector Formulas. Form Method Syst Des 42(1):3–23, DOI 10.1007/s10703-012-0156-2 Xie T, Marinov D, Schulte W, Notkin D (2005) Symstra: A Framework for Generating Object-Oriented Unit Tests Using Symbolic Execution. In: TACAS, LNCS, vol 3440, Springer, pp 365–381, DOI 10.1007/978-3-540-31980-1 24 Yang Z, Wang C, Gupta A, Ivanˇ ci´ c F (2006) Mixed Symbolic Representations for Model Checking Software Programs. In: Proc. of MEMOCODE, pp 17–26, DOI 10.1109/ MEMCOD.2006.1695896