<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>metaSMT: Focus On Your Application Not On Solver Integration</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Finn Haedicke</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Rolf Drechsler</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Stefan Frehse Go ̈ rschwin Fey Daniel Große Institute of Computer Science University of Bremen</institution>
          ,
          <addr-line>28359 Bremen</addr-line>
          ,
          <country country="DE">Germany</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>-Decision procedures are used as core technique in many applications today. In this context, automated reasoning based on Satisfiability Modulo Theories (SMT) is very effective. However, developers have to decide which concrete engine to use and how to integrate the engine into the application. Even if file formats like SMTLIB standardize the input of many engines, advanced features remain unused and the integration of the engine is left to the programmer. This work presents metaSMT, a framework that integrates advanced reasoning engines into the program code of the respective application. metaSMT provides an easy to use language that allows engine independent programming while gaining from high performance reasoning engines. State-of-the-art solvers for satisfiability and other theories are available for the user via metaSMT with minimal programming effort. For two examples we show how metaSMT is used in current research projects.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>I. INTRODUCTION</title>
    </sec>
    <sec id="sec-2">
      <title>In recent years, formal methods have become attractive to solve complex computational hard problems. Decision procedures are applied in many applications, like e.g.,</title>
      <sec id="sec-2-1">
        <title>Model Checking [1], [2], Synthesis [3], [4] and, Automatic</title>
      </sec>
      <sec id="sec-2-2">
        <title>Test Pattern Generation (ATPG) [5].</title>
        <p>
          Despite the successful research and application of
decision procedures, the increasing complexity of
software and hardware systems demands for more effective
reasoning engines to overcome complexity issues. In
the last years, solvers for Satisfiability Modulo
Theories (SMT) have been developed. Different theories are
combined to formulate the problem. Various works gave
empirical evidence that SMT reasoning engines increase
the efficiency of formal methods [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ], [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ], [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ].
        </p>
        <p>
          The performance of SMT reasoning engines remains an
active research topic. Annual SMT competitions [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ], [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ]
show their advances. However, SMT reasoning engines
have different strengths on different problem instances.
Therefore, evaluating different engines with respect to a
given problem instance allows to find the best performing
engine.
        </p>
        <p>
          When using SMT in a concrete algorithm, the most
common way is to generate a problem instance in
SMT-LIB format [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ]. Taking a user created
SMTLIB file as input, an SMT solver decides whether the
instance is satisfiable or unsatisfiable. However, many
solvers additionally have custom native interfaces. These
interfaces are used to pass the instance to the engine and
        </p>
        <p>
          This work was supported in part by the German Federal Ministry
of Education and Research (BMBF) within the project SANITAS
under contract no. 01M3088.
check for satisfiability. Furthermore, advanced features
are available, e.g., computing interpolants which are
utilized in SAT-based Model Checking [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ]. Moreover
learnt information generated while reasoning can be
reused very efficiently in consecutive reasoning processes
to prune the search space [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ]. Usually this can only be
done by calling native functions which access the learnt
information.
        </p>
        <p>This work presents metaSMT a publicly available, easy
to use and powerful tool1 which provides an integration
of the native Application Programming Interface (API) of
modern reasoning engines into C++ code. The advantages
of metaSMT are: (1) engine independence through
efficient abstraction layers (2) simple use of various decision
procedures (3) extensibility in terms of input language
and reasoning engines (4) customizability in terms of
optimization and infrastructure (5) translation of the input
language into native engine calls at compile time.</p>
        <p>The remaining work is structured as follows: Section II
gives a basic introduction into SMT and the programming
methods used in metaSMT. Afterwards an example
of a metaSMT-based application is given before in
Section IV the architecture of metaSMT is described.
Section V describes how this architecture is implemented
in metaSMT and Section VI gives an empirical evaluation
of metaSMT including its use in current research projects.
The work closes with conclusions.</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>II. PRELIMINARIES</title>
    </sec>
    <sec id="sec-4">
      <title>This section provides background information. However, basic knowledge of C++ is assumed.</title>
      <sec id="sec-4-1">
        <title>A. Satisfiability Modulo Theories</title>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Boolean satisfiability is a decision problem, also known</title>
      <p>
        as the SAT problem. The problem asks whether there
exists an assignment of Boolean variables such that the
Boolean function evaluates to true. The problem has
been proven NP-complete [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]. In spite of the huge
complexity of the problem, sophisticated algorithms
and clever heuristics help to solve instances with many
thousands variables and clauses very efficiently. Usually,
SAT solvers work on a Conjunctive Normal Form (CNF)
of a Boolean function that is a disjunction of conjunctions
of literals, where each literal is variable or its negation.
      </p>
      <sec id="sec-5-1">
        <title>Satisfiability Modulo Theories is also a decision</title>
        <p>problem but with more complex theories rather than
only propositional logic. A detailed introduction is given</p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>1Available online at http://www.informatik.uni-bremen.de/agra/eng/</title>
      <p>metasmt.php</p>
      <p>
        Listing 1. SMT instance for a b = 21466342967
(benchmark factorization.smt
:logic QF_BV
:extrafuns ((a BitVec[
        <xref ref-type="bibr" rid="ref32">32</xref>
        ]))
:extrafuns ((b BitVec[
        <xref ref-type="bibr" rid="ref32">32</xref>
        ]))
:assumption (not (= a bv1[
        <xref ref-type="bibr" rid="ref32">32</xref>
        ]))
:assumption (not (= b bv1[
        <xref ref-type="bibr" rid="ref32">32</xref>
        ]))
)
))
:formula (=
bv21466342967[64]
(bvmul
(zero_extend[
        <xref ref-type="bibr" rid="ref32">32</xref>
        ] a)
(zero_extend[
        <xref ref-type="bibr" rid="ref32">32</xref>
        ] b)
      </p>
      <sec id="sec-6-1">
        <title>B. Boost.Proto</title>
        <p>
          The Boost project [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ] is a collection of libraries that
cover many features not included in the C++ standard
library. In particular, Boost.Proto [
          <xref ref-type="bibr" rid="ref17">17</xref>
          ] provides tools to
integrate Domain Specific Embedded Languages (DSEL)
into C++. Given a programming language, a DSEL in
that language is dedicated to a domain, e.g., parsing [
          <xref ref-type="bibr" rid="ref18">18</xref>
          ]
or vector arithmetic [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ]. The DSEL provides a syntax
designed for this domain and, therefore, is easier to handle
than the original language. Due to space constraints an
in-depth description of Boost.Proto is omitted, the reader
is referred to the Boost documentation.
        </p>
        <p>
          Technically, this work uses Boost.Proto to implement
a domain specific language for SMT logics in metaSMT.
in [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ]. Already available SMT-solvers handle complex
formulas. In addition to the logics the SMT-LIB standard III. MOTIVATING EXAMPLE
also specifies a textual format that is commonly used for Before the subsequent sections give a complete
descripinput files of the solvers. Listing 1 shows an example of tion of metaSMT this section demonstrates how metaSMT
such an SMT file: Two variables, a, b are declared as bit- is used in a complete example application.
vectors and constrained to be the two factors of a product The usual integration of reasoning engines iteratively
resulting in the 64 bit number 21; 466; 342; 967. When calls API functions to construct the problem instance.
called with this input, an SMT-QF BV solver outputs However, this reduces the readability of the source code
satisfiable and e.g., the assignment a = 740; 218; 723 and and makes it difficult to understand the program. A typical
b = 29. example can be constructed using the Boolector API for
        </p>
        <p>Moreover, in addition to the SMT-LIB format many the C programming language. Figure 1 (a) shows the
solvers provide an Application Programming Inter- code to construct the simple constraint c = a b using the
face (API) that exposes features like incremental solving, Boolector C API (not including memory management).
where the SMT instance can be changed after the The same expression, written quite concise in the
SMTsatisfiability check. Learnt information about the instance LIB format is shown in Figure 1 (b). The goal of metaSMT
is kept and reused. Consequently, using the API may is to allow this compact syntax to be used in C++
increase the overall performance. programs. Due to the limitations of C++ this requires
adaptions. Most notably, the expressions cannot easily be</p>
        <p>An SMT solver can be utilized within an application in written in a symbolic expression (S-expression) syntax as
different ways. Each of the following options has certain in the SMT-LIB format, where each function is enclosed
advantages and disadvantages: in parenthesis. The syntax for calling functions is used
1) Generate an instance file according to SMT-LIB spec- instead. Moreover, the solver is passed into the expression
ification and call the solver. Different SMT solvers using the context e.g., as btor_ctx in Figure 1 (c).
can easily be evaluated. However, the instance In order to illustrate the programming interface of
generation and result retrieval requires handling of metaSMT an example written in C++ code is presented
files and text within the application. in Listing 2. The listing shows the factorization of an
2) Use the solver specific API to call an SMT solver’s integer into two integers. More precisely, given an integer
functions directly. In particular, incremental satis- in bit-vector representation ~c 2 B2n, compute two integers
fiability can be exploited. But the application is ~a;~b 2 Bn, such that ~a ~b = ~c. To enforce non-trivial
restricted to a specific solver. factorization, both integers a and b may not be 1. As
3) Introduce an abstraction layer specific to the appli- the bit-vectors ~a and ~b are zero-extended, no overflows
cation. This technique combines high performance are possible and as a result a valid assignment to the
using incremental satisfiability with the ability to constraint either gives a valid factorization of ~c or proves
evaluate different solvers. However a custom layer that it is prime. The integer value of ~c is randomly
is not portable to different applications. chosen and changed in each iteration of a loop for
10,000 iterations. A similar example is reconsidered in</p>
        <p>This work separates the programming model from the empirical evaluation.
the reasoning engine. With metaSMT the application The first line in Listing 2 defines the solver context,
specifies the instance in a simple, common notation. Many which is not explained here but described later in this
reasoning engines are available without modifications of work. The context specifies which reasoning engine to use
the algorithm. and how the input is handled by metaSMT. The next line</p>
        <p>
          The Java package jSMTLIB [
          <xref ref-type="bibr" rid="ref15">15</xref>
          ] provides an interface is a user parameter, which defines the bit-vector width of
for the usage of different SMT solvers. The package reads, the operands. The algorithm is therefore scalable to an
checks and generates SMT-LIB files and executes the abitrary bit-width. In lines 4-6 the bit-vectors a, b and
respective SMT-solver executables. However, jSMTLIB c are declared and initialized.
currently does not provide an embedded language for Lines 8 and 9 constrain the operands to be different
instance generation directly from the application. from 1 in bit-vector representation. In line 11 the
        </p>
        <p>Listing 2. metaSMT factorization and prime test
1 Context ctx;
2 const unsigned width = &lt;parameter&gt;;
3
4 bitvector a = new_bitvector(width);
5 bitvector b = new_bitvector(width);
6 bitvector c = new_bitvector(width);
7
8 assertion(ctx, nequal(a, bvuint(1,width)) );
9 assertion(ctx, nequal(b, bvuint(1,width)) );
10
11 assertion( ctx, equal( zero_extend(width, c)
, bvmul( zero_extend(width, a),
zero_extend(width, b)) ));
12
13 for (unsigned i=0; i &lt; 10000; ++i) {
14 unsigned r = random_number ( 2, 2ˆwidth</p>
        <p>1 );
15 assumption( ctx, equal(c, bvuint(r, 2*</p>
        <p>width)) );
if( solve( ctx ) ) {
unsigned a_value = read_value( ctx, a );
unsigned b_value = read_value( ctx, b );
printf("factorized %d into %d * %d\n", r</p>
        <p>, a_value, b_value);
} else {
printf("%d is prime.", r);</p>
      </sec>
    </sec>
    <sec id="sec-7">
      <title>FRONTEND (C++) QF BV</title>
    </sec>
    <sec id="sec-8">
      <title>Core</title>
    </sec>
    <sec id="sec-9">
      <title>Array</title>
    </sec>
    <sec id="sec-10">
      <title>MIDDLE-END</title>
    </sec>
    <sec id="sec-11">
      <title>DirectSolver</title>
    </sec>
    <sec id="sec-12">
      <title>BitBlast</title>
      <p>the input languages, defined in the SMT-LIB format
(e.g., Core Boolean logic, QF BV). The middle-end
multiplication ~a ~b = ~c is constrained. However the layer provides translations, intermediate representation
multiplication is done in double width to avoid overflows. and optimizations of the input expressions. Optionally,</p>
      <p>These constraints are identical for each iteration of expressions can directly be passed to the the backend
the loop starting in line 13, therefore they are declared layer where the solvers are integrated via their native API.
outside the loop as an assertion, which is permanent. Various configurations of middle-ends with backends are</p>
      <p>Inside the loop, in lines 14-15 c is set equal to a random possible. The frontends allow to combine each translation
number from 2 to 2width 1 using an assumption, middle-end with any compatible backend. However, not
which is only valid for the next satisfiability check of the every backend supports every logic. Therefore, some
solver, i.e., for one loop iteration. middle-ends supply emulation or translations to other</p>
      <p>After setting up the SMT instance, the satisfiability logics, e.g, a bit-vector expression can be translated into
check is performed in line 17. If the instance is sat- a set of Boolean expressions.
isfiable, the values of a and b are determined using The frontends are independent from the underlying
read_value. Both operands are printed out in line 21. two layers and have no semantics attached. To evaluate
Otherwise the instance is unsatisfiable, the else branch frontend expressions, a context is used that defines their
is executed, which outputs c is prime. meaning. The context is the combination of at least
one middle-end and one backend, where the middle-end
IV. ARCHITECTURE defines how the input language is mapped to function
calls of the backend.
Furthermore, Boolean constants are available, i.e., true 4) BitBlast: This emulation of a QF BV bit-vector
and false. This logic also defines primitive Boolean backend uses only Core Boolean logic operations to allow
functions, e.g., Or, And. The frontend creates a static the transparent use of SAT or BDD solvers with bit-vector
syntax tree for the expression described in the code. This expressions. The translation is performed in a standard
syntax tree is passed to the middle-end. way: Given only the Core Boolean logic, each bit-vector
C. Middle-ends is transformed into a vector of Boolean variables. The
bitwise operations can be applied easily, e.g., an
exclusive</p>
      <p>The core of metaSMT are basic optimizations and or over two bit-vectors is a bitwise exclusive-or for
translations from the frontend to the backend. While the each pair of Boolean variables. The bit-vector predicates
frontends provide languages and the backends provide (equal, less-than, etc.) are mapped to a sequence
solver integrations, the middle-ends allow the user to of Boolean predicates, e.g., a conjunction of
exclusivecustomize metaSMT, i.e., on how the input language is nors for equal. Arithmetic operations are reduced to an
mapped to the backend. Even in the middle-end itself, equivalent Boolean expression.
several modules can be combined.</p>
      <p>1) DirectSolver: To enable a low-overhead translation D. Backends
from a frontend to a backend the DirectSolver The respective solvers and other constraint solving
is provided. All the elements of the input expression techniques are integrated as backends. For each reasoning
are directly evaluated in the backend. Variables are engine a dedicated backend is created that maps from the
guaranteed to be constructed only once and are stored internal metaSMT API to the API of the engine. Backends
in a lookup table. For example, given a multiplication do not have an explicit interface to inherit from. They
operation in QF BV logic directly corresponds to a implement the required methods for the languages they
multiplication operation in the SMT solver Boolector. support using C++ template mechanisms to integrate</p>
      <p>The direct middle-end is very lightweight and allows them into a context. This allows the compiler to optimize
the compiler to inline all function calls. For a modern the code and, in the case of DirectSolver, produces
compiler the resulting executable should perform equally code that is close to a hand-coded implementation using
well to a hand-written application using the same backend. the same API.</p>
      <p>2) GraphSolver: Instead of adding the frontend ex- This section gives an overview of the backends
intepressions directly to the solver, they are first inserted grated into metaSMT. They are grouped by the input
into a directed graph. The graph models the explicit language they support. The compatibility of the solvers
syntax tree of the expression as a Directed Acyclic is also summarized in Table I.</p>
      <p>
        Graph (DAG). Formally a node in the graph is a tuple 1) Core Boolean logic backends: Several core logic
(Operation; Static Arguments) where the SMT command backends as well as higher level backends are available.
and its static arguments are captured (e.g. extract and Core logic is directly supported by backends that accept
the range to extract). The edges point from an operation all common Boolean operations. For example, the Binary
to the SMT expressions used in this command. A label Decision Diagram (BDD) package CUDD [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ] supports
on the edges stores the position of the subexpression in all Boolean operations and is integrated in metaSMT.
the command. Each time a new expression is evaluated Furthermore, with some minor transformations based on
it is first searched in a lookup table before a new node is De-Morgan And-Inverter-Graphs (AIGs) are also able to
created, when the node is not found. When the instance handle Boolean operations. Those AIGs are internally
is checked for satisfiability, the graph is traversed and represented by the AIGER package [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ]. SAT solvers
evaluated in the backend. can receive Boolean logic expressions either via the
      </p>
      <p>
        The graph-based translation provides a way to auto- SAT Clause adapter that creates one or more clauses
matically detect common subexpressions and efficiently per logic operation or via the SAT Aiger adapter, that
handle them to create smaller SMT instances which po- builds an AIG for the expression using the AIGER
tentially increases performance of the reasoning process. backend. Afterwards, the AIG is translated into a set
This is especially useful if the user wants to automate this of clauses. This infrastructure allow the usage of any
process, but either does not want to manually optimize the SAT solver supporting CNF as input language either by
SMT instance or does not know the instance in advance an API or externally through files. PicoSAT [
        <xref ref-type="bibr" rid="ref22">22</xref>
        ] as well
because it is created dynamically inside the program. as MiniSAT [
        <xref ref-type="bibr" rid="ref23">23</xref>
        ] are directly supported as Core logic
3) Groups: This middle-end provides an interface and backends via their APIs. Other solvers are supported by
implementation of constraint groups for solvers that do generating CNF files and calling the executable of the
not have native support for groups. A group is a set SAT solvers.
of constraints that belong together. The user can create Furthermore, all SMT QF BV backends natively
supgroups, add expressions to them and delete them at any port Core logic as a subset of the language.
time. The solver will then disable all expressions in 2) SMT QF BV backends: Native SMT bit-vector
the group. Groups are emulated using guard variables solvers like Boolector [
        <xref ref-type="bibr" rid="ref24">24</xref>
        ], SWORD [
        <xref ref-type="bibr" rid="ref25">25</xref>
        ] and Z3 [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ]
and temporary assumptions, e.g., the expression x ^ y are directly connected through their API for QF BV
in group 1 is transformed to g1 ! (x ^ y) using the support. Furthermore, the BitBlast middle-end provides an
guard variable g1 and an implication. Depending on the emulation for QF BV using only basic logic operations.
solver deleting a group can either lead to the removal This emulation permits using QF BV expressions in
of the constraints or to the constraint just being disabled solvers that do not support them natively but support
permanently. Core Boolean logic e.g., CUDD or SAT-solvers.
      </p>
      <sec id="sec-12-1">
        <title>3) SMT QF ABV backends: In addition to Core</title>
        <p>Boolean logic and bit-vector logic the Boolector and
Z3 backends also support arrays in the form of QF QBV
logic. Therefore metaSMT supports declaring and
working with arrays over bit-vectors.</p>
      </sec>
    </sec>
    <sec id="sec-13">
      <title>V. IMPLEMENTATION</title>
    </sec>
    <sec id="sec-14">
      <title>This section describes how the architecture is implemented in metaSMT and how metaSMT is integrated in C++ programs.</title>
      <sec id="sec-14-1">
        <title>A. Syntax and Semantics</title>
      </sec>
    </sec>
    <sec id="sec-15">
      <title>GraphSolver</title>
      <p>For the evaluation of metaSMT expressions a context Figure 4 gives some example contexts and visualizes
is used which defines syntax and semantics. The context the data flow inside. This illustrates how different
concept and different kinds of contexts are described in contexts can change the evaluation of a constraint. The
this section. first context defines a solver using Boolector without</p>
      <p>The syntax component is provided by Boost.Proto. An intermediate representation (DirectSolver). The context
expression like equal(c, bvmul(a, b)) is created directly supports Core Boolean logic and QF BV. In
from the custom Boost.Proto functions equal and contrast, in the last example, MiniSAT is used. QF BV
bvmul as well as the variables a, b and c. From the as well as Core Boolean logic are emulated for this clause
expression the syntax tree in Figure 3 is created. The based backend. Furthermore this context uses a graph
nodes are labeled with the C++ type and strings inside and an AIG as intermediate representations.
the curly braces denote the content of the respective The GraphSolver-based and AIGER-based context first
nodes. For metaSMT the tree is used as static type of the create an internal representation and pass the complete
exexpression. The expression and the syntax tree are data, pression directly before solving. When using approaches
i.e., they neither have semantics attached nor trigger any without intermediate representation, the requests are
actions. forwarded to the next layer until they reach the backend.</p>
      <p>The semantics for the expression is introduced by Only explicit transformations are applied before passing
the metaSMT context, that defines how the syntax tree the expression (e.g., BitBlast, SAT Clause).
is evaluated and transformed for a specific solver. The
evaluation of Boost.Proto-based expressions is performed B. Usage and API
in the metaSMT translation middle-end (e.g., GraphSolver
or DirectSolver) so that the backends do not need to The example from Listing 2 contains most of the
handle Boost.Proto expressions directly. This reduces the core commands of metaSMT. These are summarized in
overhead to implement new backends. Listing 3.</p>
      <p>Listing 5. Using a shared graph for different contexts
1 GraphSolver_Context&lt;SWORD&gt; sword;
2 GraphSolver_Context&lt;Boolector&gt; btor(sword);
3
4 GraphSolver_Context&lt;SWORD&gt;::result_type x =</p>
      <p>evaluate(sword, bvuint(0, 8));
5
6 for( ... ) {
7 x = evaluate(sword, equal( x, bvmul(x,
...)));
Listing 4. Programmatic constraint construction using temporary
Variables
1 bitvector x = new_bitvector(8);
2 for( ... ) {
3 bitvector tmp = x;
4 x = new_bitvector(8);
5 assertion(ctx, equal( x, bvmul(tmp, ...)));
6 }
7 ...
8 solve(ctx)
8 }
9 assertion(sword, x);</p>
      <p>The first three functions accept frontend expressions, 10 assertion(btor, x);
however they have different effects. The functions 11 solve(sword) == solve(btor);
assertion and assumption create the constraint
instance where the first adds a constraint permanently to When a GraphSolver is constructed using the copy
the (incremental) solver context while the latter adds the constructor, a shared graph is internally used by the
constraint for the next call of the solver only. In both contexts. The newly created solver also copies all
cases the expression needs to have a Boolean result. The assertions and assumptions, so that both solvers have
third function evaluate does not change the instance the same internal state. In this setup the results of
but returns a context specific representation of the input evaluate can be shared among the solvers. Each
expression only. backend will only evaluate the parts of the graph that</p>
      <p>To query a context for satisfiability, the solve are required as parts of assertions or assumptions. The
function is provided. The result is a Boolean value directly application of evaluate is demonstrated in Listing 5.
representing SAT (true) or UNSAT (false). After a call to This can be used for example when building multiple
solve the assumptions are discarded while the assertions instances from the same base. At a specific point the
are still valid for the subsequent calls. context can be copied and from there both contexts can</p>
      <p>Getting a SAT result for solve(ctx), i.e., the diverge into seperate instances.
instance is satisfiable, a model is generated. The model
can be retrieved with the read_value function. The VI. EMPERICAL EVALUATION
function takes a context and a variable and returns the This section presents two different applications of
assignment of this variable in the given context. The metaSMT. Furthermore, a comparison of metaSMT with
result of read_value is automatically convertible to the native API of an SMT solver is presented. The
many C++ datatypes, including strings, bit-vectors (vector experiments have been performed on a system with AMD
of bool, tribool, bitset) or integers. Opteron 2222 SE processor, 32 GB RAM and a Linux</p>
      <p>
        In addition to these core commands, custom middle- operating system. In the following, the run times are
ends may provide additional extensions. The Group always given in CPU seconds.
middle-end for example provides functions to add groups,
change the active group and delete groups. These func- A. Exact Synthesis
tions cannot be used in any other context. This section presents examples from exact synthesis of
reversible circuits [
        <xref ref-type="bibr" rid="ref28">28</xref>
        ], [
        <xref ref-type="bibr" rid="ref29">29</xref>
        ]. A reversible circuit computes
C. Expression Creation a bijective function, i.e., there is a unique input and output
      </p>
      <p>
        Typically it is necessary to create the metaSMT ex- mapping. Those circuits purely consist of reversible gates
pression at run time, e.g., in a loop. As metaSMT syntax – here, the universal Toffoli gate and basic quantum gates
trees are statically typed, an extension of the syntax tree are considered. The synthesis problem searches for a
is not possible. To work around this limitation, metaSMT reversible circuit consisting of reversible gates which
provides two options. The first option is to create a partial computes the function specified by a truth table. There
expression and constrain equality to a temporary variable are several exact approaches to synthesize those circuits.
that is later reused to create the complete expression. We considered the approach from [
        <xref ref-type="bibr" rid="ref28">28</xref>
        ], which translates
This would allow strict grammar checking but introduces the problem into a decision problem and asks for a circuit
a temporary variable and a constraint, see Listing 4. realization for a given number of gates. The size of the
      </p>
      <p>The second option is the use of the evaluate(Ctx, problem instances grows exponentially with number of
Expr) function and the context’s result_type. The input variables, because the entire truth table has to be
function takes a context and a frontend expression taken into account. This usually results in hard problem
and returns the context specific representation of the instances even for small truth tables.
expression. The result of the evaluation is of the backend The underlying problem formulation has been encoded
specific type Ctx::result_type. This expression in QF BV and an incremental algorithm searches for
can be stored and later be used in other expressions. a valid circuit implementation. Using metaSMT
sixNote however that the return value is solver specific and teen different configurations have been evaluated. The
therefore not portable or reusable in other contexts, not configurations consist of four internal API backend
even contexts of the same type. solvers, i.e. Boolector, Z3, MiniSAT, and PicoSAT.</p>
      <p>
        A powerful exception to this rule is the Additionally, metaSMT is used to generated CNF files
result_type of a GraphSolver-based context, to run the external solvers PicoSAT, MiniSAT,
Prewhere the result is a node in the internal graph. coSAT, and Plingeling [
        <xref ref-type="bibr" rid="ref30">30</xref>
        ]. All eight backends are used
      </p>
      <p>lete_15
decod24-v0_incomp eres_complete_4
p
toffoli_comp
lete_1
4mod5-v0_incomp graycode6_comp fredkin_comp</p>
      <p>lete_3
lete_8
lete_19
alu-v0_incomp graycode6_comp
lete_10
lete_19
m
iller_comp
lete_5
toffoli_double_comphwb4_complete_20
lete_2
with the DirectSolver middle-end as well as the
GraphSolver middle-end.</p>
      <p>
        For the synthesis 11 specifications were used which are
publicly available from [
        <xref ref-type="bibr" rid="ref31">31</xref>
        ]. A timeout of 3,600 seconds
was applied. The results are presented in Figure 5. On
the x-axis the respective benchmark is shown, whereas
the y-axis denotes the run time in seconds for each
configuration in logarithmic scale. Externally called
solvers are marked with .
      </p>
      <p>From Figure 5 it is clear that no single solver
dominates the benchmarks. For example, for the
benchmarks from decode24-v0_incomple_5 to
graycode6_complete_19 Boolector performs much
better than any other solver. But for the benchmarks from
miller_complete_5, Boolector is outperformed by
the SAT solvers. MiniSAT as well as PicoSAT are
evaluated as internal and external versions. The accumulated
run times of the solvers MiniSAT and PicoSAT over all
benchmarks are 18,790 seconds for the internal version
and 8,989 seconds for the external version. Surprisingly,
the externally called solvers are much better here than the
internal called solvers, though the internal solvers may
benefit from learnt information. Overall, the externally
called PrecoSAT solver needs 326.24 seconds over all
benchmarks and Boolector needs 3,285.05 seconds.</p>
      <p>To summarize, all the presented results can be achieved
very easily by using metaSMT. Only one parameter needs
to be switched to run a different solver.
Boolector contexts and the graph-based MiniSAT perform
better. However, for difficult instances with a run time
over 1 minute, the graph-based Boolector context is
fastest while MiniSAT-based contexts require significantly
more time. For these harder instances the GraphSolver
middle-end outperforms the direct variant of the same
backend. This effect is most likely due to the removal
of redundancies in the graph. For MiniSAT this amounts
to run time reductions of around 50%. With metaSMT
as abstraction layer it is easy to evaluate the effects of
different contexts or optimizations. When changes are
only in the abstraction layer no application code needs
to be changed and only little effort is required.</p>
      <sec id="sec-15-1">
        <title>C. Comparison with direct API</title>
      </sec>
    </sec>
    <sec id="sec-16">
      <title>For the factorization algorithm from Listing 2 a hand</title>
      <p>coded implementation using the Boolector C API is
compared to a metaSMT DirectSolver-based implementation
B. Mutation Testing with the Boolector backend. The resulting application is</p>
      <p>
        Given a program, by mutation several faulty variants available as part of the metaSMT package.
of the program are created and combined into a single The experiment has the following setup: The algorithm
program called meta-mutant. Using metaSMT the meta- from Listing 2 was changed to work on sequences instead
mutant is encoded into a set of constraints. Each satisfying of generating random numbers. A sequence of 10,000
assignment yields a test case that discovers at least one random 64 bit numbers is generated and the algorithm it
fault. Experiments of [
        <xref ref-type="bibr" rid="ref32">32</xref>
        ] where executed on a set of applied to it 10 times. The same sequence is used for both
metaSMT contexts. The results are shown in Table II. the hand coded and the metaSMT-based implementation
Comparing the Boolector backend with the MiniSAT of the algorithm. The complete experiment was repeated 5
backend using DirectSolver as well as GraphSolver times with Boolector being executed first and 5 times with
middle-ends. metaSMT being executed first. Altogether each solver was
      </p>
      <p>The results significantly vary with the difficulty of forced to solve 1,000,000 constraints of 64 bit numbers
the instance. For easy instances the directly connected factorized into two 32 bit numbers.</p>
    </sec>
    <sec id="sec-17">
      <title>The results showed no significant difference caused by</title>
      <p>the metaSMT abstraction layer: 1; 736s for plain
Boolector compared to 1; 729s for metaSMT with Boolector,
i.e., 1:7 seconds for 10,000 factorizations.</p>
      <sec id="sec-17-1">
        <title>D. Other applications</title>
      </sec>
    </sec>
    <sec id="sec-18">
      <title>In addition to the aforementioned projects metaSMT is also used in a Constraint Random Stimuli generation Library. In the library elements of the SystemC Verification Library [33] and techniques from [34] are combined.</title>
    </sec>
    <sec id="sec-19">
      <title>VII. CONCLUSIONS</title>
      <p>metaSMT is a library that abstracts details of reasoning
engines. Based on metaSMT very little programming
effort is required to integrate formal methods into a user‘s
application. Once this has been done, a wide range of
solvers as well as optimization techniques can be selected.</p>
      <p>Various research projects already integrate metaSMT.
Future work on metaSMT includes the development
of the following features: New frontend logics will
complete the support for SMT logics (e.g. uninterpreted
functions, integer arithmetic), while new middle-ends
will increase solving performance (e.g. portfolio or
multithreaded contexts) and new backends will provide access
to additional SMT solvers.</p>
    </sec>
    <sec id="sec-20">
      <title>VIII. ACKNOWLEDGMENTS</title>
    </sec>
    <sec id="sec-21">
      <title>We would like to thank Hoang M. Le, Heinz Riener</title>
      <p>and Fereshta Yazdani for the helpful discussions, their
proposals for improvements, testing and contributions to
metaSMT.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>A.</given-names>
            <surname>Biere</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Cimatti</surname>
          </string-name>
          , E. Clarke, and
          <string-name>
            <given-names>Y.</given-names>
            <surname>Zhu</surname>
          </string-name>
          , “
          <article-title>Symbolic model checking without BDDs,” in Tools and Algorithms for the Construction and Analysis of Systems, ser</article-title>
          .
          <source>LNCS</source>
          , vol.
          <volume>1579</volume>
          . Springer Verlag,
          <year>1999</year>
          , pp.
          <fpage>193</fpage>
          -
          <lpage>207</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>K.</given-names>
            <surname>McMillan</surname>
          </string-name>
          , “
          <article-title>Interpolation and SAT-based model checking,” in Computer Aided Verification, ser</article-title>
          .
          <source>LNCS</source>
          . Springer Berlin / Heidelberg,
          <year>2003</year>
          , vol.
          <volume>2725</volume>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>13</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>E.</given-names>
            <surname>Arbel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Rokhlenko</surname>
          </string-name>
          , and
          <string-name>
            <given-names>K.</given-names>
            <surname>Yorav</surname>
          </string-name>
          , “
          <article-title>SAT-based synthesis of clock gating functions using 3-valued abstraction</article-title>
          ,” in Formal Methods in Computer-Aided Design,
          <year>2009</year>
          ,
          <year>2009</year>
          , pp.
          <fpage>198</fpage>
          -
          <lpage>204</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>F.</given-names>
            <surname>Haedicke</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Alizadeh</surname>
          </string-name>
          , G. Fey,
          <string-name>
            <given-names>M.</given-names>
            <surname>Fujita</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Drechsler</surname>
          </string-name>
          , “
          <article-title>Polynomial datapath optimization using constraint solving and formal modelling,” in Computer-Aided Design (ICCAD</article-title>
          ),
          <year>2010</year>
          IEEE/ACM International Conference on,
          <year>2010</year>
          , pp.
          <fpage>756</fpage>
          -
          <lpage>761</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>R.</given-names>
            <surname>Drechsler</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Eggersgluss</surname>
          </string-name>
          ,
          <string-name>
            <given-names>G.</given-names>
            <surname>Fey</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Glowatz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Hapke</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Schloeffel</surname>
          </string-name>
          , and
          <string-name>
            <given-names>D.</given-names>
            <surname>Tille</surname>
          </string-name>
          , “
          <article-title>On acceleration of SAT-based ATPG for industrial designs,” Computer-Aided Design of Integrated Circuits and Systems</article-title>
          , IEEE Transactions on, vol.
          <volume>27</volume>
          , no.
          <issue>7</issue>
          , pp.
          <fpage>1329</fpage>
          -
          <lpage>1333</lpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>M. K.</given-names>
            <surname>Ganai</surname>
          </string-name>
          and
          <string-name>
            <given-names>A.</given-names>
            <surname>Gupta</surname>
          </string-name>
          , “
          <article-title>Accelerating high-level bounded model checking</article-title>
          ,” in International Conference on Computeraided design. New York, NY, USA: ACM,
          <year>2006</year>
          , pp.
          <fpage>794</fpage>
          -
          <lpage>801</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>P.</given-names>
            <surname>Bjesse</surname>
          </string-name>
          , “
          <article-title>A practical approach to word level model checking of industrial netlists</article-title>
          ,” in International Conference on Computer Aided Verification,
          <year>2008</year>
          , pp.
          <fpage>446</fpage>
          -
          <lpage>458</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>A.</given-names>
            <surname>Armando</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Mantovani</surname>
          </string-name>
          , and L. Platania, “
          <article-title>Bounded model checking of software using SMT solvers instead of SAT solvers,”</article-title>
          <string-name>
            <given-names>Int. J. Softw. Tools</given-names>
            <surname>Technol</surname>
          </string-name>
          . Transf., vol.
          <volume>11</volume>
          , pp.
          <fpage>69</fpage>
          -
          <lpage>83</lpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <surname>“</surname>
            <given-names>SMT-COMP</given-names>
          </string-name>
          <year>2009</year>
          ,” http://www.smtcomp.org/
          <year>2009</year>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <surname>“</surname>
            <given-names>SMT-COMP</given-names>
          </string-name>
          <year>2010</year>
          ,” http://www.smtcomp.org/
          <year>2010</year>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>S.</given-names>
            <surname>Ranise</surname>
          </string-name>
          and
          <string-name>
            <given-names>C.</given-names>
            <surname>Tinelli</surname>
          </string-name>
          , “
          <article-title>The Satisfiability Modulo Theories Library (SMT-LIB)</article-title>
          ,” http://www.smtlib.org,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>O.</given-names>
            <surname>Shtrichman</surname>
          </string-name>
          , “
          <article-title>Pruning techniques for the SAT-based bounded model checking problem,” in CHARME, ser</article-title>
          .
          <source>LNCS</source>
          , vol.
          <volume>2144</volume>
          ,
          <year>2001</year>
          , pp.
          <fpage>58</fpage>
          -
          <lpage>70</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>S.</given-names>
            <surname>Cook</surname>
          </string-name>
          , “
          <article-title>The complexity of theorem proving procedures,” in 3</article-title>
          .
          <source>ACM Symposium on Theory of Computing</source>
          ,
          <year>1971</year>
          , pp.
          <fpage>151</fpage>
          -
          <lpage>158</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>C.</given-names>
            <surname>Barrett</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Sebastiani</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S. A.</given-names>
            <surname>Seshia</surname>
          </string-name>
          , and
          <string-name>
            <given-names>C.</given-names>
            <surname>Tinelli</surname>
          </string-name>
          , Satisfiability Modulo Theories, ser.
          <source>Frontiers in Artificial Intelligence and Applications</source>
          . IOS Press,
          <year>February 2009</year>
          , vol.
          <volume>185</volume>
          , ch. 26, pp.
          <fpage>825</fpage>
          -
          <lpage>885</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>D. R.</given-names>
            <surname>Cok</surname>
          </string-name>
          , “jSMTLIB:
          <article-title>Tutorial, validation and adapter tools for smt-libv2,” in NASA Formal Methods, ser</article-title>
          .
          <source>LNCS</source>
          ,
          <year>2011</year>
          , vol.
          <volume>6617</volume>
          , pp.
          <fpage>480</fpage>
          -
          <lpage>486</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <surname>“Boost</surname>
            <given-names>C</given-names>
          </string-name>
          ++ libraries,” http://www.boost.org/.
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>E.</given-names>
            <surname>Niebler</surname>
          </string-name>
          , “
          <article-title>Proto: A compiler construction toolkit for DSELs,” in Proceedings of the 2007 Symposium on Library-Centric Software Design, ser</article-title>
          .
          <source>LCSD '07</source>
          . New York, NY, USA: ACM,
          <year>2007</year>
          , pp.
          <fpage>42</fpage>
          -
          <lpage>51</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <surname>J. de Guzman</surname>
            and
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Nuffer</surname>
          </string-name>
          , “
          <article-title>The Spirit library: Inline parsing in C++</article-title>
          ,” C/C++
          <source>User Journal</source>
          , vol.
          <volume>21</volume>
          , no.
          <issue>9</issue>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>T. L.</given-names>
            <surname>Veldhuizen</surname>
          </string-name>
          , “Arrays in Blitz++,” in
          <source>Proceedings of the Second International Symposium on Computing in ObjectOriented Parallel Environments</source>
          ,
          <year>1998</year>
          , pp.
          <fpage>223</fpage>
          -
          <lpage>230</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <given-names>F.</given-names>
            <surname>Somenzi</surname>
          </string-name>
          ,
          <source>CUDD: CU Decision Diagram Package Release 2.4</source>
          .1. University of Colorado at Boulder,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>[21] “Aiger,” http://fmv.jku.at/aiger/.</mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <given-names>A.</given-names>
            <surname>Biere</surname>
          </string-name>
          , “Picosat essentials,
          <source>” JSAT</source>
          , vol.
          <volume>4</volume>
          , no.
          <issue>2-4</issue>
          , pp.
          <fpage>75</fpage>
          -
          <lpage>97</lpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <given-names>N.</given-names>
            <surname>Ee</surname>
          </string-name>
          <article-title>´n and N. So¨rensson, “An extensible sat-solver,” in SAT, ser</article-title>
          . LNCS,
          <string-name>
            <given-names>E.</given-names>
            <surname>Giunchiglia</surname>
          </string-name>
          and
          <string-name>
            <surname>A</surname>
          </string-name>
          . Tacchella, Eds., vol.
          <volume>2919</volume>
          . Springer,
          <year>2003</year>
          , pp.
          <fpage>502</fpage>
          -
          <lpage>518</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [24]
          <string-name>
            <given-names>R.</given-names>
            <surname>Brummayer</surname>
          </string-name>
          and
          <string-name>
            <given-names>A.</given-names>
            <surname>Biere</surname>
          </string-name>
          , “
          <article-title>Boolector: An efficient SMT solver for bit-vectors and arrays,” in Tools and Algorithms for the Construction</article-title>
          and
          <source>Analysis of Systems</source>
          ,
          <year>2009</year>
          , pp.
          <fpage>174</fpage>
          -
          <lpage>177</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <given-names>R.</given-names>
            <surname>Wille</surname>
          </string-name>
          ,
          <string-name>
            <given-names>G.</given-names>
            <surname>Fey</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Große</surname>
          </string-name>
          ,
          <string-name>
            <surname>S.</surname>
          </string-name>
          <article-title>Eggersglu¨ß, and</article-title>
          <string-name>
            <given-names>R.</given-names>
            <surname>Drechsler</surname>
          </string-name>
          , “
          <article-title>Sword: A SAT like prover using word level information,” in VLSI of System-on-</article-title>
          <string-name>
            <surname>Chip</surname>
          </string-name>
          ,
          <year>2007</year>
          , pp.
          <fpage>88</fpage>
          -
          <lpage>93</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          [26]
          <string-name>
            <surname>L. M. de Moura</surname>
            and
            <given-names>N.</given-names>
          </string-name>
          <string-name>
            <surname>Bjørner</surname>
          </string-name>
          , “
          <article-title>Z3: An efficient smt solver,” in TACAS, ser</article-title>
          . LNCS,
          <string-name>
            <given-names>C. R.</given-names>
            <surname>Ramakrishnan</surname>
          </string-name>
          and J. Rehof, Eds., vol.
          <volume>4963</volume>
          . Springer,
          <year>2008</year>
          , pp.
          <fpage>337</fpage>
          -
          <lpage>340</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          [27]
          <string-name>
            <given-names>M.</given-names>
            <surname>Soeken</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Frehse</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Wille</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Drechsler</surname>
          </string-name>
          , “
          <article-title>RevKit: A toolkit for reversible circuit design</article-title>
          ,” in Workshop on Reversible Computation,
          <year>2010</year>
          , pp.
          <fpage>69</fpage>
          -
          <lpage>72</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          [28]
          <string-name>
            <given-names>D.</given-names>
            <surname>Große</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Wille</surname>
          </string-name>
          , G. Dueck, and
          <string-name>
            <given-names>R.</given-names>
            <surname>Drechsler</surname>
          </string-name>
          , “
          <article-title>Exact multiple-control toffoli network synthesis with SAT techniques,” Computer-Aided Design of Integrated Circuits and Systems</article-title>
          , IEEE Transactions on, vol.
          <volume>28</volume>
          , no.
          <issue>5</issue>
          , pp.
          <fpage>703</fpage>
          -
          <lpage>715</lpage>
          , May
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref29">
        <mixed-citation>
          [29]
          <string-name>
            <given-names>R.</given-names>
            <surname>Wille</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Große</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Soeken</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Drechler</surname>
          </string-name>
          , “
          <article-title>Using higher levels of abstraction for solving optimization problems by boolean satisfiability</article-title>
          ,” in Symposium on VLSI,
          <year>2008</year>
          . ISVLSI '08. IEEE Computer Society Annual,
          <year>2008</year>
          , pp.
          <fpage>411</fpage>
          -
          <lpage>416</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref30">
        <mixed-citation>
          [30]
          <string-name>
            <given-names>A.</given-names>
            <surname>Biere</surname>
          </string-name>
          , “Lingeling, plingeling,
          <source>picosat and precosat at SAT race</source>
          <year>2010</year>
          ,” Tech. Rep.,
          <year>2010</year>
          . [Online]. Available: http://fmv.jku.at/papers/Biere-FMV-TR-
          <volume>10</volume>
          -1.pdf
        </mixed-citation>
      </ref>
      <ref id="ref31">
        <mixed-citation>
          [31]
          <string-name>
            <given-names>R.</given-names>
            <surname>Wille</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Große</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Teuber</surname>
          </string-name>
          ,
          <string-name>
            <given-names>G. W.</given-names>
            <surname>Dueck</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Drechsler</surname>
          </string-name>
          , “
          <article-title>RevLib: An online resource for reversible functions and reversible circuits,” in Int'l Symp</article-title>
          . on
          <string-name>
            <surname>Multi-Valued Logic</surname>
          </string-name>
          ,
          <year>2008</year>
          , pp.
          <fpage>220</fpage>
          -
          <lpage>225</lpage>
          , RevLib is available at http://www.revlib.org.
        </mixed-citation>
      </ref>
      <ref id="ref32">
        <mixed-citation>
          [32]
          <string-name>
            <given-names>H.</given-names>
            <surname>Riener</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Bloem</surname>
          </string-name>
          , and G. Fey, “
          <article-title>Test case generation from mutants using model checking techniques</article-title>
          ,
          <source>” in International Conference on Software Testing, Verification and Validation Workshops</source>
          ,
          <year>2011</year>
          , pp.
          <fpage>388</fpage>
          -
          <lpage>397</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref33">
        <mixed-citation>
          [33]
          <article-title>SystemC Verification Standard Specification Version 1</article-title>
          .0e, SystemC Verification Working Group.
        </mixed-citation>
      </ref>
      <ref id="ref34">
        <mixed-citation>
          [34]
          <string-name>
            <given-names>R.</given-names>
            <surname>Wille</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Große</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Haedicke</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Drechsler</surname>
          </string-name>
          , “
          <article-title>SMTbased stimuli generation in the SystemC verification library,” in Advances in Design Methods from Modeling Languages for Embedded Systems and SoC's: Selected Contributions on Specification, Design, and Verification from FDL 2009, ser</article-title>
          . Lecture Notes in Electrical Engineering, D. Borrione, Ed. Springer Netherlands,
          <year>2010</year>
          , vol.
          <volume>63</volume>
          , pp.
          <fpage>227</fpage>
          -
          <lpage>244</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>