blob: a15d94a9f1818692d9d1b0d9445eea57e2c417c9 [file] [log] [blame]
****************************
CVC Input Language Reference
****************************
.. highlight:: lisp
This page contains a description for the input language that STP expects
by default.
Declarations
============
Bitvector expressions (or terms) are constructed out of bitvector
constants, bitvector variables and the functions listed below. In STP
all variables have to declared before the point of use. An example
declaration of a bitvector variable of length 32 is as follows:
``x : BITVECTOR(32);``. An example of an array declaration is as
follows:
::
x_arr : ARRAY BITVECTOR(32) OF BITVECTOR(5000);
Functions and Terms
===================
Bitvector variables (or terms) of length 0 are not allowed. Bitvector
constants can be represented in binary or hexadecimal format. The
rightmost bit is called the least significant bit (LSB), and the
leftmost bit is the most significant bit (MSB). The index of the LSB is
0, and the index of the MSB is *n*-1 for an *n*-bit constant. This
convention naturally extends to all bitvector expressions. Following
are some examples of bitvector constants in binary and hexadecimal:
::
0bin0000111101010000
0hex0f50
The Bitvector implementation in STP supports a very large number of
functions and predicates. The functions are categorized into word-level
functions, bitwise functions, and arithmetic functions.
Word-level functions
~~~~~~~~~~~~~~~~~~~~
+-----------------------+-----------------------+-----------------------+
| Name | Symbol | Example |
+=======================+=======================+=======================+
| Concatenation | ``@`` | ``t1@t2@...@tm`` |
+-----------------------+-----------------------+-----------------------+
| Extraction | ``[i:j]`` | ``x[31:26]`` |
+-----------------------+-----------------------+-----------------------+
| left shift | ``<<`` | ``0bin0011 << 3 = 0bi |
| | | n0011000`` |
+-----------------------+-----------------------+-----------------------+
| right shift | ``>>`` | ``x[24:17] >> 5``, |
| | | another example: |
| | | ``0bin1000 >> 3 = 0bi |
| | | n0001`` |
+-----------------------+-----------------------+-----------------------+
| sign extension | ``BVSX(bv,n)`` | ``BVSX(0bin100, 5) = |
| | | 0bin11100`` |
+-----------------------+-----------------------+-----------------------+
| Array READ | ``[index]`` | ``x_arr[t1]`` |
+-----------------------+-----------------------+-----------------------+
| Array WRITE | ``WITH`` | ``x_arr WITH [index] |
| | | := value`` |
+-----------------------+-----------------------+-----------------------+
Notes:
- For extraction terms, say ``t[i:j]``, *n* > *i* >= *j* >= 0, where
*n* is the length of *t*.
- For left shift terms, ``t << k`` is equal to *k* 0s appended to *t*. The length
of ``t << k`` is *n*+*k*.
- For right shift terms, say ``t >> k``, the term is equal to the bitvector
obtained by *k* 0s followed by ``t[n-1:k]``. The length of ``t >> k`` is *n*.
Bitwise functions
~~~~~~~~~~~~~~~~~
+--------------+------------+------------------------+
| Name | Symbol | Example |
+==============+============+========================+
| Bitwise AND | ``&`` | ``t1 & t2 & ... & tm`` |
+--------------+------------+------------------------+
| Bitwise OR | ``|`` | ``t1 | t2 | ... | tm`` |
+--------------+------------+------------------------+
| Bitwise NOT | ``~`` | ``~t1`` |
+--------------+------------+------------------------+
| Bitwise XOR | ``BVXOR`` | ``BVXOR(t1,t2)`` |
+--------------+------------+------------------------+
| Bitwise NAND | ``BVNAND`` | ``BVNAND(t1,t2)`` |
+--------------+------------+------------------------+
| Bitwise NOR | ``BVNOR`` | ``BVNOR(t1,t2)`` |
+--------------+------------+------------------------+
| Bitwise XNOR | ``BVXNOR`` | ``BVXNOR(t1,t2)`` |
+--------------+------------+------------------------+
NOTE: It is required that all the arguments of bitwise functions have
the same length
Arithmetic functions
~~~~~~~~~~~~~~~~~~~~
+-----------------------+-----------------------+-----------------------+
| Name | Symbol | Example |
+=======================+=======================+=======================+
| Bitvector Add | ``BVPLUS`` | ``BVPLUS(n,t1,t2,..., |
| | | tm)`` |
+-----------------------+-----------------------+-----------------------+
| Bitvector Multiply | ``BVMULT`` | ``BVMULT(n,t1,t2)`` |
+-----------------------+-----------------------+-----------------------+
| Bitvector Subtract | ``BVSUB`` | ``BVSUB(n,t1,t2)`` |
+-----------------------+-----------------------+-----------------------+
| Bitvector Unary Minus | ``BVUMINUS`` | ``BVUMINUS(t1)`` |
+-----------------------+-----------------------+-----------------------+
| Bitvector Divide | ``BVDIV`` | ``BVDIV(n,t1,t2)``, |
| | | where ``t1`` is the |
| | | dividend and ``t2`` |
| | | is the divisor |
+-----------------------+-----------------------+-----------------------+
| Signed Bitvector | ``SBVDIV`` | ``SBVDIV(n,t1,t2)``, |
| Divide | | where ``t1`` is the |
| | | dividend and ``t2`` |
| | | is the divisor |
+-----------------------+-----------------------+-----------------------+
| Bitvector Modulo | ``BVMOD`` | ``BVMOD(n,t1,t2)``, |
| | | where ``t1`` is the |
| | | dividend and ``t2`` |
| | | is the divisor |
+-----------------------+-----------------------+-----------------------+
| Signed Bitvector | ``SBVMOD`` | ``SBVMOD(n,t1,t2)``, |
| Modulo | | where ``t1`` is the |
| | | dividend and ``t2`` |
| | | is the divisor |
+-----------------------+-----------------------+-----------------------+
Notes:
- The number of output bits must be specified (expect for unary minus).
- All inputs must be of the same length.
- ``BVUMINUS(t)`` is a short-hand for ``BVPLUS(n,~t,0bin1)``, where *n* is the
length of *t*.
- ``BVSUB(n,t1,t2))`` is a short-hand for ``BVPLUS(n,t1,BVUMINUS(t2))``.
STP also supports conditional terms, e.g., ``IF cond THEN t1 ELSE t2 ENDIF``,
where *cond* is a boolean term, and *t*\ 1 and *t*\ 2 can be bitvector terms. This
allows us to simulate multiplexors. An example is:
::
x, y : BITVECTOR(1);
QUERY(x = (IF 0bin0 = x THEN y ELSE BVUMINUS(y) ENDIF));
Predicates
==========
Following are the predicates supported by STP:
+---------------------------------+-----------+------------------+
| Name | Symbol | Example |
+=================================+===========+==================+
| Equality | ``=`` | ``t1=t2`` |
+---------------------------------+-----------+------------------+
| Less Than | ``BVLT`` | ``BVLT(t1,t2)`` |
+---------------------------------+-----------+------------------+
| Greater Than | ``BVGT`` | ``BVGT(t1,t2)`` |
+---------------------------------+-----------+------------------+
| Less Than Or Equal To | ``BVLE`` | ``BVLE(t1,t2)`` |
+---------------------------------+-----------+------------------+
| Greater Than Or Equal To | ``BVGE`` | ``BVGE(t1,t2)`` |
+---------------------------------+-----------+------------------+
| Signed Less Than | ``SBVLT`` | ``SBVLT(t1,t2)`` |
+---------------------------------+-----------+------------------+
| Signed Greater Than | ``SBVGT`` | ``SBVGT(t1,t2)`` |
+---------------------------------+-----------+------------------+
| Signed Less Than Or Equal To | ``SBVLE`` | ``SBVLE(t1,t2)`` |
+---------------------------------+-----------+------------------+
| Signed Greater Than Or Equal To | ``SBVGE`` | ``SBVGE(t1,t2)`` |
+---------------------------------+-----------+------------------+
Note: STP requires that in atomic formulas such as ``x = y``, ``x`` and
``y`` are expressions of the same length. STP accepts boolean
combination of atomic formulas.
Comments
========
Any line whose first character is ``%`` is a comment.
Some Examples
=============
Example 1 illustrates the use of arithmetic, word-level and bitwise NOT
operations:
::
x : BITVECTOR(5);
y : BITVECTOR(4);
QUERY(
BVPLUS(9, x@0bin0000, (0bin000@(~y)@0bin11))[8:4]
=
BVPLUS(5, x, 0bin000@~(y[3:2]))
);
Example 2 illustrates the use of arithmetic, word-level and multiplexor
terms:
::
bv : BITVECTOR(10);
a : BOOLEAN;
QUERY(
(0bin01100000[5:3] = (0bin1111001@bv[0:0])[4:2])
AND
(
0bin1@(IF a THEN 0bin0 ELSE 0bin1 ENDIF)
=
(IF a THEN 0bin110 ELSE 0bin011 ENDIF)[1:0]
)
);
Example 3 illustrates the use of bitwise operations:
::
x, y, z, t, q : BITVECTOR(1024);
ASSERT(x = ~x);
ASSERT(x & y & t & z & q = x);
ASSERT(x | y = t);
ASSERT(BVXOR(x, ~x) = t);
QUERY(FALSE);
Example 4 illustrates the use of predicates and all the arithmetic
operations:
::
x, y : BITVECTOR(8);
ASSERT(x = 0hex05);
ASSERT(y = 0bin00000101);
QUERY(
(BVMULT(8,x,y) = BVMULT(8,y,x))
AND
NOT(BVLT(x,y))
AND
BVLE(BVSUB(8,x,y), BVPLUS(8, x, BVUMINUS(x)))
AND
(x = BVSUB(8, BVUMINUS(x), BVPLUS(8, x,0hex01)))
);
Example 5 illustrates the use of shift functions
::
x, y : BITVECTOR(8);
z, t : BITVECTOR(12);
ASSERT(x = 0hexff);
ASSERT(z = 0hexff0);
QUERY(z = x << 4);
For invalid inputs, the ``COUNTEREXAMPLE`` command can be used to generate
appropriate counterexamples. The generated counter example is
essentially a bitwise assignment to the variables in the input.