source: CIVL/doc/manual/part-language.tex@ b6632d9

1.23 2.0 acw/focus-triggers main test-branch
Last change on this file since b6632d9 was b6632d9, checked in by Manchun Zheng <zmanchun@…>, 12 years ago

updated manual: modified the description of assertions; added descriptions of some of .cvh headers.

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@1488 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 75.6 KB
Line 
1\part{Language}
2\label{part:lang}
3
4\chapter{Overview of CIVL-C}
5
6\section{Main Concepts}
7
8CIVL-C is an extension of a subset of the C11 dialect of C. It
9includes the most commonly-used elements of C, including most of the
10syntax, types, expressions, and statements. Missing are some of the
11more esoteric type qualifiers, bitwise operations (at least for now),
12and much of the standard library. Moreover, none of the C11 language
13elements dealing with concurrency are included, as CIVL-C has its own
14concurrency primitives.
15
16The keywords in CIVL-C not already in C begin with the symbol \cckey.
17This makes them readily identifiable and also prevents any naming
18conflicts with identifiers in C programs. This means that most legal
19C programs will also be legal CIVL-C programs.
20
21One of the most important features of CIVL-C not found in standard C
22is the ability to define functions in any scope. (Standard C allows
23function definitions only in the file scope.) This feature is also
24found in GNU C, the GNU extension of C.
25
26Another central CIVL-C feature is the ability to \emph{spawn}
27functions, i.e., run the function in a new \emph{process} (thread).
28
29\emph{Scopes} and \emph{processes} are the two central themes of
30CIVL-C. Each has a static and a dynamic aspect. The static scopes
31correspond to the lexical scopes in the program---typically, regions
32delimited by curly braces \lb \ldots \rb. At runtime, these scopes
33are \emph{instantiated} when control in a process reaches the
34beginning of the scope. Processes are created dynamically by
35\emph{spawning} functions; hence the functions are the static
36representation of processes.
37
38\section{Example Illustrating Scopes and Processes}
39
40To understand the static and dynamic nature of scopes and processes,
41and the relations between them, we consider the (artificial) example
42code of Figure \ref{fig:scopecodeex}. The static scopes in the scope
43are numbered from $0$ to $6$.
44
45\begin{figure}[t]
46 \centering
47 \includegraphics[scale=1.2]{scopeCodeExample}
48 \caption{CIVL-C code skeleton to illustrate scope hierarchy}
49 \label{fig:scopecodeex}
50\end{figure}
51
52\begin{figure}
53 \centering
54 \includegraphics[scale=1.2]{scopeStateExample}
55 \caption{Static scope tree and a state for example program}
56 \label{fig:scopestateex}
57\end{figure}
58
59The static scopes have a tree structure: one scope is a child of
60another if the first is immediately contained in the second. Scope 0,
61which is the file scope (or \emph{root} scope) is the root of this
62tree. The static scope tree is depicted in Figure
63\ref{fig:scopestateex} (left). Each scope is identified by its
64integer ID. Additionally, if the scope happens to be the scope of a
65function definition, the name of the function is included in this
66identifier. A node in this tree also shows the variables and
67functions declared in the scope. For brevity, we omit the \emph{proc}
68variables.
69
70We now look at what happens when this program executes. Figure
71\ref{fig:scopestateex} (right) illustrates a possible state of the
72program at one point in an execution. We now explain how
73this state is arrived at.
74
75First, there is an implicit \emph{root function} placed around the
76entire code. The body of the \emph{main} function becomes the body
77of the root function, and the \emph{main} function itself disappears.
78This minor transformation does not change the structure of the scope
79tree.
80
81Execution begins by spawning a process $p_0$ to execute the root
82function. This causes scope $0$ to be instantiated. An instance of a
83static scope is known as a \emph{dynamic scope}, or \emph{dyscopes}
84for short. The dynamic scopes are represented by the ovals with
85double borders on the right side of Figure \ref{fig:scopestateex}.
86Each dyscope specifies a value for every variable declared in the
87corresponding static scope. In this case, the value $3$ has been
88assigned to variable \texttt{x}.
89
90The state of process $p_0$ is represented by a \emph{call stack}
91(green). The entries on this stack are \emph{activation frames}.
92Each frame contains two data: a reference to a dyscope (indicated by
93blue arrows) and a current location (or programmer counter vaule) in
94the static scope corresponding to that dyscope (not shown). The
95dyscope defines the environment in which the process evaluates
96expressions and executes statements. The currently executing function
97of a process, corresponding to the top frame in the call stack, can
98``see'' only the variables in its dyscope and those of all the
99ancestors of its dyscope in the dyscope tree.
100
101Returning to the example, $p_0$ enters scope 6, instanitating that
102scope, and then spawns procedure \texttt{f}. This creates process
103$p_1$, with a new stack with a frame pointing to a dyscope
104corresponding to static scope 1. The new process proceed to run
105concurrently with $p_0$. Meanwhile, $p_0$ calls procedure \texttt{g},
106which pushes a new entry onto its call stack, and instantiates scope
1075. Hence $p_0$ has two entries on its stack: the bottom one pointing
108to the instance of scope 6, the top one pointing to the instance of
109scope 5.
110
111Meanwhile, assume $\texttt{x}>0$, so that $p_1$ takes the \emph{true}
112branch of the \texttt{if} statement, instantiating scope 3 under the
113instance of scope 1. It then spawns two copies of procedure
114\texttt{f1}, creating processes $p_2$ and $p_3$ and two instances of
115scope 2. Then $p_1$ spawns \texttt{f2}, creating process $p_4$ and an
116instance of scope 4. Note that the instance of scope 4 is a child of
117the instance of scope 3, since the (static) scope 4 is a child of
118scope 3. Finally, $p_1$ calls \texttt{f2}, pushing a new entry on its
119stack and creating another instance of scope 4. The final state
120arrived at is the one shown.
121
122There are few key points to understand:
123\begin{itemize}
124\item In any state, there is a mapping from the dyscope tree to the
125 static scope tree which maps a dyscope to the static scope of which
126 it is an instance. This mapping is a \emph{tree homomorphism},
127 i.e., if dyscope $u$ is a child of dyscope $v$, then the static
128 scope corresponding to $u$ is a child of the static scope
129 corresponding to $v$.
130\item A static scope may have any number of instances, including 0.
131\item Dynamic scopes are created when control enters the corresponding
132 static scope; they disappear from the state when they become
133 unreachable. A dyscope $v$ is ``reachable'' if some process has a
134 frame pointing to a dyscope $u$ and there is a path from $u$ up to
135 $v$ that follows the parent edges in the dyscope tree.
136\item Processes are created when functions are spawned; they disappear
137 from the state when their stack becomes empty (either because the
138 process terminates normally or invokes the \emph{exit} system
139 function).
140\end{itemize}
141
142\section{Structure of a CIVL-C program}
143
144A CIVL-C program is structured very much like a standard C program.
145In particular, a CIVL-C program may use the preprocessor directives
146specified in the C Standard, and with the same meaning. A source
147program is preprocessed, then parsed, resulting in a translation unit,
148just as with standard C. The main differences are the nesting of
149function definitions and the new primitives beginning with
150\texttt{\$}, which are described in detail in the remainder of this
151part of the manual.
152
153A CIVL-C program must begin with the line
154\begin{verbatim}
155#include <civlc.h>
156\end{verbatim}
157which includes the main CIVL-C header file, which declares all the
158types and other CIVL primitives.
159
160As usual, a translation unit consists of a sequence of variable
161declarations, function prototypes, and function definitions in file
162scope. In addition, \emph{assume} statements may occur in the file
163scope. These are used to state assumptions on the input values
164to a program.
165
166\chapter{Sequential Elements}
167
168In this chapter we describe the main sequential elements of the
169language. For the most part these are the same as in C.
170Primitives dealing with concurrency are introduced in Chapter
171\ref{chap:concurrency}.
172
173\section{Types}
174
175\subsection{Standard types inherited from C}
176
177The boolean type is denoted \verb!_Bool!, as in C. Its values are $0$
178and $1$, which are also denoted by $\cfalse$ and $\ctrue$,
179respectively.
180
181There is one integer type, corresponding to the mathematical integers.
182Currently, all of the C integer types \texttt{int}, \texttt{long},
183\texttt{unsigned\ int}, \texttt{short}, etc., are mapped to the CIVL
184integer type.
185
186There is one real type, corresponding to the mathematical real
187numbers. Currently, all of the C real types \texttt{double},
188\texttt{float}, etc., are mapped to the CIVL real type.
189
190Array types, \texttt{struct} and \texttt{union} types, \texttt{char},
191and pointer types (including pointers to functions) are all exactly as
192in C.
193
194% \subsection{The heap type $\cheap$ and handles}
195
196% Unlike C, a CIVL-C program does not necessarily have access to a
197% single, global heap. Instead, there is a $\cheap$ type, and heaps may
198% be declared explicitly wherever they are needed. Hence a CIVL-C
199% program may have several heaps, and these may exist in different
200% scopes.
201
202% A heap is declared and created as follows:
203% \begin{verbatim}
204% $heap h = $heap_create();
205% \end{verbatim}
206% The function \verb!$heap_create()! creates a new empty heap in the
207% current scope and returns a \emph{handle} to that heap. A handle is
208% like a pointer: it is a reference to another object. However, a handle
209% is much more restricted than a general pointer. In particular, it
210% cannot be dereferenced (by the \ct{*} operator). The underlying heap
211% object can only be accessed by using a handle to it as an argument to
212% a system function.
213
214% Handles can be used in assignments and passed as arguments to functions.
215% For example, this declaration could follow the one above:
216% \begin{verbatim}
217% $heap h2=h;
218% \end{verbatim}
219% After executing this code, \ct{h2} and \ct{h} will be aliased, i.e., the two
220% handles will refer to the same heap object.
221
222% The heap object exists in the scope in which it is created. In
223% particular, it will disappear when that scope disappears, i.e., when
224% control reaches the right curly brace that defines the end of the
225% scope. At that point, any references into the heap become invalid.
226
227% The following system functions deal with heaps:
228% \begin{verbatim}
229% void* $malloc($heap h, int size);
230% void free(void *p)
231% \end{verbatim}
232% The first function is like C's \texttt{malloc}, except that you
233% specify the heap in which the allocation takes place.
234% This modifies the specified heap and returns a pointer to the new object.
235% The function can only occur in a context in which the type of the object is
236% specified, as in:
237% \begin{verbatim}
238% $heap h;
239% int n = 10;
240% double *p = (double*)$malloc(h, n*sizeof(double));
241% \end{verbatim}
242% The function \ct{free} is exactly the same as in C. Note that
243% \texttt{free} modifies the heap which was used to allocate \texttt{p}.
244
245
246\subsection{The bundle type: \cbundle}
247
248CIVL-C includes a type named \cbundle, declared in the CIVL-C standard header \texttt{bundle.cvh}. A bundle is basically a
249sequence of data, wrapped into an atomic package. A bundle is created
250using a function that specifies a region of memory. One can create a
251bundle from an array of integers, and another bundle from an array of
252reals. Both bundles have the same type, \cbundle. They can therefore
253be entered into an array of \cbundle, for example. Hence bundles are
254useful for mixing objects of different (even statically unknown) types
255into a single data structure. Later, the contents of a bundle can be
256extracted with another function that specifies a region of memory into
257which to unpack the bundle; if that memory does not have the right
258type to receive the contents of the bundle, a runtime error is
259generated.
260
261The relevant functions for creating and manipulating bundles
262are given in Section \ref{subsec:bundleLibrary}.
263
264\subsection{The \cscope{} type}
265\label{sec:scopetype}
266
267An object of type $\cscope$ is a reference to a dynamic scope. It may
268be thought of as a ``dynamic scope ID, '' but it is not an integer and
269cannot be converted to an integer. Operations defined on scopes are
270discussed in Section \ref{sec:scopeexpr}.
271
272\subsection{The \crange{} and \cdomain{} types}
273
274CIVL-C provides certain abstract datatypes that are useful for
275representing iteration spaces of loops in an abstract way.
276
277First, there is a built-in type $\crange$. An object of this type
278represents an ordered set of integers. There are expressions for
279specifying range values; these are described in Section
280\ref{sec:range_expr}. Ranges are typically used as a step
281in constructing \emph{domains}, described next.
282
283A domain type is used to represent a set of tuples of integer values.
284Every tuple in a domain object has the same arity (i.e., number of
285components). The arity must be at least 1, and is called the
286\emph{dimension} of the domain object.
287
288For each integer constant expression $n$, there is a type
289\cdomainof{\(n\)}, representing domains of dimension $n$.
290% \texttt{\cdomain{}(}]\(n\)\texttt{)}
291The \emph{universal domain type}, denoted \cdomain{}, represents
292domains of all positive dimensions, i.e., it is the union over all
293$n\geq 1$ of \cdomainof{\(n\)}. In particular, each \cdomainof{\(n\)}
294is a subtype of \cdomain{}.
295
296There are expressions for specifying domain values; these are
297described in Section \ref{sec:domain_expr}. There are also certains
298statements that use domains, such as the ``CIVL-\emph{for}'' loop
299\cfor; see Section \ref{sec:cfor}.
300
301
302\section{Expressions}
303
304\subsection{Expressions inherited from C}
305
306The following C expressions are included in CIVL:
307\begin{itemize}
308\item \emph{constant} expressions
309\item \emph{identifier} expressions (\texttt{x})
310\item parenthetical expressions (\verb!(e)!)
311\item numerical \emph{addition} (\verb!a+b!), \emph{subtraction} (\verb!a-b!),
312 \emph{multiplication} (\verb!a*b!), \emph{division} (\verb!a/b!),
313 \emph{unary plus} (\verb!+a!), \emph{unary minus} (\verb!-a!),
314 \emph{integer division} (\verb!a/b!) and \emph{modulus} (\verb!a%b!),
315 all with their ideal mathematical interpretations
316\item array \emph{index} expressions (\verb!a[e]!) and struct or union
317 \emph{navigation} expressions (\verb!x.f!, \verb!p->f!)
318\item \emph{address-of} (\verb!&e!), pointer \emph{dereference} (\verb!*p!),
319 pointer \emph{addition} (\verb!p+i!) and \emph{subtraction} (\verb!p-q!)
320 expressions
321\item relational expressions (\verb!a==b!, \verb~a!=b~, \verb!a>=b!,
322 \verb!a<=b!, \verb!a<b!, \verb!a>b!)
323\item logical \emph{not} (\verb~!p~), \emph{and} (\verb!p&&q!), and
324 \emph{or} (\verb!p||q!)
325\item \emph{sizeof} a type (\verb!sizeof(t)!) or expression (\verb!sizeof(e)!)
326\item \emph{assignment} expressions (\verb!a=b!, \verb!a+=b!, \verb!a-=b!,
327 \verb!a*=b!, \verb!a/=b!, \verb!a%=b!, \verb!a++!, \verb!a--!)
328\item function \emph{calls} \verb!f(e1,...,en)!
329\item \emph{conditional} expressions (\verb!b ? e : f!).
330\item \emph{cast} expressions (\verb!(t)e!)
331\end{itemize}
332
333Bit-wise operations are not yet supported.
334
335\subsection{Scope expressions}
336\label{sec:scopeexpr}
337
338As mentioned in Section \ref{sec:scopetype}, CIVL-C provides a type
339\cscope. An object of this type is a reference to a dynamic scope.
340Several constants, expressions, and functions dealing with the
341\cscope{} type are also provided.
342
343The $\cscope$ type is like any other object type. It may be used as
344the element type of an array, a field in a structure or union, and so
345on. Expressions of type $\cscope$ may occur on the left or right-hand
346sides of assignments and as arguments in function calls just like any
347other expression. Two different variables of type $\cscope$ may be
348aliased, i.e., they may refer to the same dynamic scope.
349
350A dynamic scope $\delta$ is \emph{reachable} if there exists a path
351which starts from the dyscope referenced by some frame on the call
352stack of a process, follows the parent edges in the dyscope tree, and
353terminates in $\delta$. If a dyscope is not reachable, it can never
354become reachable, and it cannot have any effect on the subsequent
355execution of the program.
356
357Normally, a dynamic scope will eventually become unreachable. At some
358point after it becomes unreachable, it will be collected in a
359garbage-collection-like sweep, and any existing references to that
360scope will become \emph{undefined}. An object of type $\cscope$ is
361also undefined before it is initialized. Any use of an undefined
362value is reported as an error by CIVL, so it is important to be sure
363that a scope variable is defined before using it.
364
365
366\subsubsection{Checking if a dyscope is defined: \cscopedefined}
367
368The header \texttt{civlc.cvh} provides a function \cscopedefined{}, which checks if a given
369value of \cscope{} type is defined, as described in Section \ref{subsubsec:scopedefined}.
370
371\subsubsection{The constant \chere}
372
373A constant \chere{} exists in every scope. This constant has
374type \cscope{} and refers to the dynamic scope in which it is
375contained. For example,
376\begin{verbatim}
377 { // scope s
378 int *p = (int*)$malloc($here, n*sizeof(int));
379 }
380\end{verbatim}
381allocates an object consisting of $n$ ints in the scope $s$.
382
383\subsubsection{The constant \cscoperoot{}}
384
385There is a global constant \cscoperoot{} of type $\cscope$ which
386refers to the root dynamic scope.
387
388
389\subsubsection{Scope relational operators}
390
391Let $s_1$ and $s_2$ be expressions of type \cscope. The following are
392all CIVL-C expressions of boolean type:
393\begin{itemize}
394\item $s_1$ \ct{==} $s_2$. This is \emph{true} iff $s_1$ and $s_2$
395 refer to the same dynamic scope.
396\item $s_1$ \ct{!=} $s_2$. This is \emph{true} iff $s_1$ and $s_2$
397 refer to different dynamic scopes.
398\item $s_1$ \ct{<=} $s_2$. This is \emph{true} iff $s_1$ is equal to
399 or a descendant of $s_2$, i.e., $s_1$ is equal to or contained in $s_2$.
400\item $s_1$ \ct{<} $s_2$. This is \emph{true} iff $s_1$ is a strict
401 descendant of $s_2$, i.e., $s_1$ is contained in $s_2$ and is not
402 equal to $s_2$.
403\item $s_1$ \ct{>} $s_2$. This is equivalent to $s_2$ \ct{<} $s_1$.
404\item $s_1$ \ct{>=} $s_2$. This is equivalent to $s_2$ \ct{<=} $s_1$.
405\end{itemize}
406If $s_1$ or $s_2$ is undefined in any of these expressions, an error
407will be reported.
408
409\subsubsection{Scope parent function \texorpdfstring{\cscopeparent}{\$scope\_parent}}
410
411The CIVL-C header \texttt{scope.cvh} provides the function \cscopeparent{} that computes the immediate
412parent of a dynamic scope, as described in Section \ref{subsec:scopeLibrary}.
413
414\subsubsection{Lowest Common Ancestor: \ct{+}}
415
416The expression $s_1$ \ct{+} $s_2$, where $s_1$ and $s_2$ are
417expressions of type \cscope, evaluates to the lowest common ancestor
418of $s_1$ and $s_2$ in the dynamic scope tree. This is the smallest
419dynamic scope containing both $s_1$ and $s_2$.
420
421\subsubsection{The \cscopeof{} expression}
422
423Given any left-hand-side expression \ct{expr}, the expression
424\begin{verbatim}
425 $scopeof(expr)
426\end{verbatim}
427evaluates to the dynamic scope containing the object specified by
428\ct{expr}.
429
430The following example illustrates the semantics of the \cscopeof{}
431operator. All of the assertions hold:
432\begin{verbatim}
433{
434 $scope s1 = $here;
435 int x;
436 double a[10];
437
438 {
439 $scope s2 = $here;
440 int *p = &x;
441 double *q = &a[4];
442
443 assert($scopeof(x)==s1);
444 assert($scopeof(p)==s2);
445 assert($scopeof(*p)==s1);
446 assert($scopeof(a)==s1);
447 assert($scopeof(a[5])==s1);
448 assert($scopeof(q)==s2);
449 assert($scopeof(*q)==s1);
450 }
451}
452\end{verbatim}
453
454\subsection{Range and domain expressions}
455
456\subsubsection{Regular range expressions}
457\label{sec:range_expr}
458
459An expression of the form
460\begin{verbatim}
461 lo .. hi
462\end{verbatim}
463where \texttt{lo} and \texttt{hi} are integer expressions, represents
464the range consisting of the integers $\texttt{lo}, \texttt{lo}+1,
465\ldots, \texttt{hi}$ (in that order).
466
467An expression of the form
468\begin{verbatim}
469 lo .. hi # step
470\end{verbatim}
471where \texttt{lo}, \texttt{hi}, and \texttt{step} are integer
472expressions is interpreted as follows. If \texttt{step} is positive,
473it represents the range consisting of $\texttt{lo},
474\texttt{lo}+\texttt{step}, \texttt{lo}+2*\texttt{step}, \ldots$, up to
475and possibly including \texttt{hi}. To be precise, the infinite
476sequence is intersected with the set of integers less than or equal to
477\texttt{hi}.
478
479If \texttt{step} is negative, the expression represents the range
480consisting of $\texttt{hi}, \texttt{hi}+\texttt{step},
481\texttt{hi}+2*\texttt{step}, \ldots$, down to and possibly including
482\texttt{lo}. Precisely, the infinite sequence is intersected with the
483set of integers greater than or equal to \texttt{lo}.
484
485\subsubsection{Cartesian domain expressions}
486\label{sec:domain_expr}
487
488An expression of the form
489\begin{verbatim}
490 ($domain) { r1, ..., rn }
491\end{verbatim}
492where \texttt{r1}, \ldots, \texttt{rn} are $n$ expressions of type
493\crange, is a \emph{Cartesian domain expression}. It represents the
494domain of dimension $n$ which is the Cartesian product of the $n$
495ranges, i.e., it consists of all $n$-tuples $(x_1,\ldots,x_n)$ where
496$x_1\in\texttt{r1}$, \ldots, $x_n\in\texttt{rn}$. The order on the
497domain is the dictionary order on tuples. The type of this expression
498is \cdomainof{\(n\)}.
499
500When a Cartesian domain expression is used to initialize an object of
501domain type, the ``\texttt{(}\cdomain\texttt{)}'' may be omitted.
502For example:
503\begin{verbatim}
504 $domain(3) dom = { 0 .. 3, r2, 10 .. 2 # -2 };
505\end{verbatim}
506
507
508\section{Statements}
509
510\subsection{C Statements}
511
512The usual C statements are supported:
513\begin{itemize}
514\item \emph{no-op} (\ct{;})
515\item expression statements (\ct{e;})
516\item labeled statements, including \ct{case} and \ct{default} labels
517 (\ct{l: s})
518\item \emph{for} (\ct{for (init; cond; inc) s}), \emph{while}
519 (\ct{while (cond) s}) and \emph{do} (\ct{do s while (cond)})
520 loops
521\item compound statements (\lb \ct{s1;s2;} \ldots \rb)
522\item \texttt{if} and \verb!if! \ldots \verb!else!
523\item \verb!goto!
524\item \verb!switch!
525\item \verb!break!
526\item \verb!continue!
527\item \verb!return!
528\end{itemize}
529
530\subsection{Guards and nondeterminism}
531
532\subsubsection{Guarded commands: \cwhen}
533
534A guarded command is encoded in CIVL-C using a $\cwhen$ statement:
535\begin{verbatim}
536 $when (expr) stmt;
537\end{verbatim}
538All statements have a guard, either implicit or explicit. For most
539statements, the guard is \ctrue. The \cwhen{} statement allows one to
540attach an explicit guard to a statement.
541
542When \texttt{expr} is \emph{true}, the statement is enabled, otherwise
543it is disabled. A disabled statement is \emph{blocked}---it will not
544be scheduled for execution. When it is enabled, it may execute by
545moving control to the \texttt{stmt} and executing the first atomic
546action in the \texttt{stmt}.
547
548If \texttt{stmt} itself has a non-trivial guard, the guard of the
549\cwhen{} statement is effectively the conjunction of the \texttt{expr}
550and the guard of \texttt{stmt}.
551
552The evaluation of \texttt{expr} and the first atomic action of
553\texttt{stmt} effectively occur as a single atomic action. There is
554no guarantee that execution of \texttt{stmt} will continue atomically
555if it contains more than one atomic action, i.e., other processes may
556be scheduled.
557
558Examples:
559\begin{verbatim}
560 $when (s>0) s--;
561\end{verbatim}
562This will block until \texttt{s} is positive and then decrement
563\texttt{s}. The execution of \texttt{s--} is guaranteed to take place
564in an environment in which \texttt{s} is positive.
565
566\begin{verbatim}
567 $when (s>0) {s--; t++}
568\end{verbatim}
569The execution of \texttt{s--} must happen when \texttt{s>0}, but
570between \texttt{s--} and \texttt{t++}, other processes may execute.
571
572\begin{verbatim}
573 $when (s>0) $when (t>0) x=y*t;
574\end{verbatim}
575This blocks until both \texttt{x} and \texttt{t} are positive then
576executes the assignment in that state. It is equivalent to
577\begin{verbatim}
578 $when (s>0 && t>0) x=y*t;
579\end{verbatim}
580
581\subsubsection{Nondeterministic selection statement: \cchoose}
582
583A \cchoose{} statement has the form
584\begin{verbatim}
585 $choose {
586 stmt1;
587 stmt2;
588 ...
589 default: stmt
590 }
591\end{verbatim}
592The \texttt{default} clause is optional.
593
594The guards of the statements are evaluated and among those that are
595\emph{true}, one is chosen nondeterministically and executed. If none
596are \emph{true} and the \texttt{default} clause is present, it is
597chosen. The \texttt{default} clause will only be selected if all
598guards are \emph{false}. If no \texttt{default} clause is present and
599all guards are \emph{false}, the statement blocks. Hence the implicit
600guard of the \cchoose{} statement without a \texttt{default} clause is
601the disjunction of the guards of its sub-statements. The implicit
602guard of the \cchoose{} statement with a default clause is
603\emph{true}.
604
605Example: this shows how to encode a ``low-level'' CIVL guarded
606transition system:
607
608\begin{verbatim}
609 l1: $choose {
610 $when (x>0) {x--; goto l2;}
611 $when (x==0) {y=1; goto l3;}
612 default: {z=1; goto l4;}
613 }
614 l2: $choose {
615 ...
616 }
617 l3: $choose {
618 ...
619 }
620\end{verbatim}
621
622
623\subsubsection{Nondeterministic choice of integer:
624 \texorpdfstring{\cchooseint}{\$choose\_int}}
625The header \texttt{civlc.cvh} provides the function \cchooseint{} that returns an integer between 0 and the specified value
626in a nondeterministic way, as described in Section \ref{subsubsec:chooseint}.
627
628\subsection{Iteration using domains with \cfor}
629\label{sec:cfor}
630
631A \emph{CIVL-for} statement has the form
632\begin{verbatim}
633 $for (int i1, ..., in : dom) S
634\end{verbatim}
635where \texttt{i1}, \ldots, \texttt{in} are $n$ identifiers,
636\texttt{dom} is an expression of type \cdomainof{\(n\)}, and
637\texttt{S} is a statement. The identifiers declare $n$ variables of
638integer type. Control iterates over the values of the domain,
639assigning the integer variables the components of the current tuple in
640the domain at the start of each iteration. The scope of the variables
641extends to the end of \texttt{S}. The iterations takes place in the
642order specified by the domain, e.g., dictionary order for a Caretesian
643domain.
644
645There is a also a parallel version of this construct, \cparfor,
646described in \ref{sec:parfor}.
647
648\section{Functions}
649\subsection{Abstract function: \cabstract}
650
651An abstract function declares a function without a body, and it has the form
652
653\begin{verbatim}
654 $abstract type function(list-of-parameters);
655\end{verbatim}
656
657It is required that the function should have a non-void return type and take at least one parameter.
658The return value of the function is evaluated symbolically using the actual arguments of the function call.
659
660\chapter{Concurrency}
661\label{chap:concurrency}
662
663\section{Process creation and management}
664
665\subsection{The process type: \cproc}
666
667This is a primitive object type and functions like any other primitive
668C type (e.g., \texttt{int}). An object of this type refers to a
669process. It can be thought of as a process ID, but it is not an
670integer and cannot be cast to one. It is analogous to the $\cscope$
671type for dynamic scopes.
672
673Certain expressions take an argument of \cproc{} type and some return
674something of \cproc{} type. The operators \verb!==! and \verb~!=~ may
675be used with two arguments of type \cproc{} to determine whether the
676two arguments refer to the same process.
677
678\subsection{Checking if a process is defined: \cprocdefined}
679
680An object of type \cproc{} is initially undefined, so a use of that
681object would result in an error. One can check whether a \cproc{}
682object is defined using the function \cprocdefined, declared by the header \texttt{civlc.cvh}, as
683described in Section \ref{subsubsec:procdefined}.
684
685\subsection{The \emph{self} process constant: \cself}
686
687This is a constant of type \cproc. It can be used wherever an argument
688of type \cproc{} is called for. It refers to the process that is
689evaluating the expression containing \cself.
690
691\subsection{The \emph{null} process constant: \cprocNull}
692
693This is a constant of type \cproc. It can be used wherever an argument
694of type \cproc{} is called for. It simply means that the object doesnt refer to any process.
695
696\subsection{Spawning a new process: \cspawn}
697
698A \emph{spawn} expression is an expression with side-effects. It
699spawns a new process and returns a reference to the new process, i.e.,
700an object of type \cproc. The syntax is the same as a procedure
701invocation with the keyword \cspawn{} inserted in front:
702\begin{verbatim}
703 $spawn f(expr1, ..., exprn)
704\end{verbatim}
705Typically the returned value is assigned to a variable, e.g.,
706\begin{verbatim}
707 $proc p = $spawn f(i);
708\end{verbatim}
709If the invoked function \texttt{f} returns a value, that value is
710simply ignored.
711
712\subsection{Waiting for process(es) to terminate: \cwait\ and \cwaitall}
713
714Once the system function \cwait(\cwaitall) provided by the CIVL-C standard header \texttt{civlc.cvh}
715gets invoked, it will not return until the specified process(es) terminates(terminate), as described in Sections \ref{subsubsec:wait} and
716\ref{subsubsec:wait}.
717
718\subsection{Terminating a process immediately: \cexit}
719Once the function \cexit\, declared in the header \texttt{civlc.cvh}, is called, the calling process terminates immediately, as described in Section \ref{subsubsec:exit}.
720
721\section{Atomicity}
722
723\subsection{Atom blocks: \catom} This defines a number of statements
724to be executed as a single atomic transition. An \catom~block has the
725following form:
726\begin{verbatim}
727 $atom {
728 stmt1;
729 stmt2;
730 ...
731 }
732\end{verbatim}
733
734The statements inside an \catom\ block are to be executed as one
735transition. It is required that the execution of the statements in an
736\catom\ block satisfy all of the following properties:
737\begin{enumerate}
738\item \emph{deterministic}: at each step in the execution of the atom
739 block, there must be at most one enabled statement;
740\item \emph{nonblocking}: at each step in the execution, there must be
741 at least one enabled statement, hence, together with (1), there must
742 be exactly one enabled statement;
743\item \emph{finite}: the execution of the atom block must terminate
744 after a finite number of steps; and
745\item \emph{isolated}: there are no jumps from outside the atom block
746 to inside the atom block, or from inside the atomc block to outside
747 of it.
748\end{enumerate}
749
750Violations of the \emph{deterministic}, \emph{nonblocking}, or
751\emph{isolated} properties will be reported either statically or
752dynamically. If the \emph{finite} property is violated, the
753verification may just run forever.
754
755Once the process enters an \catom\ block is said to be \emph{executing
756 atomly}. The process remains executing atomly until it reaches the
757terminating right brace of the block. Hence \emph{executing atomly}
758is a dynamic, not static condition. For example, the block might
759contain a function call which takes the process to a point in code
760which is not statically contained in an atom block; that process is
761nevertheless still executing atomly and is subject to the rules above.
762The process only stops executing atomly when that function call
763returns and control finally reaches the right curly brace at the end
764of the atom block (assuming the block is not contained in another atom
765block).
766
767\emph{Note:} \cwait\ or \cwaitall\ calls are not allowed in \catom\ blocks.
768The rationale for this is that there is never a way to know for
769certain that another process has terminated (until \cwait\ or \cwaitall\ has
770returned) so there is never a way to be certain the \cwait\ or \cwaitall call
771will not block. If one does occur in an \catom\ block, an error will
772be reported statically (if it can be detected statically) or
773dynamically (otherwise). Note that it is not always possible to
774detect this statically because the \catom\ block may contain a
775function call, and the function may contain \cwait\ or \cwaitall\ calls.
776
777\subsection{Atomic blocks: \catomic}
778
779The statements in an \emph{atomic} block will be executed without
780other processes interleaving, to the extent possible. It has the
781form:
782\begin{verbatim}
783 $atomic {
784 stmt1;
785 stmt2;
786 ...
787 }
788\end{verbatim}
789It is essentially a weaker form of \catom. Unlike \catom, there are
790no restrictions on the statements that can go inside an \catomic\
791block. A process executing an \catomic~block will try to execute the
792statements without interleaving with other processes, unless it
793becomes blocked. Unlike an \catom, the statements in an atomic block
794do not necessarily execute as a single transition; they may be spread
795out over multiple transitions.
796
797When no statement is enabled, the execution of the \catomic\ block
798will be interrupted. At this point, other processes are allowed to
799execute. Eventually, if the original process becomes enabled due to
800the actions of other processes, it may be scheduled again, in which
801case it regains atomicity and continues where it left off. For
802example, after executing the first loop, the process executing the
803following code will become blocked at the first \cwait\ or \cwaitall\ call:
804 \begin{verbatim}
805$atomic{
806 for(int i = 0; i < 5; i++) p[i] = $spawn foo(i);
807 for(int i = 0; i < 5; i++) $wait p[i];
808}
809\end{verbatim}
810Other processes will then execute. Eventually, if the process being
811waited on terminates, the original process becomes enabled and may be
812scheduled, in which case it regain atomicity, increments \texttt{i}
813and proceeds to the next $\cwait$ or \cwaitall\ call. This is in fact a common
814idiom for spawning and waiting on a set of processes.
815
816A process that enters an $\catomic$ block is said to be
817\emph{executing atomically}; it remains executing atomically until it
818reaches the closing curly brace.
819
820Both $\catom$ and $\catomic$ blocks can be nested arbitrarily, but
821$\catom$ overrides $\catomic$: a process that is executing atomly will
822continue executing atomly if it encounters an $\catomic$ statement;
823but a process executing atomically that encounters an $\catom$ will
824begin executing atomly.
825
826The atomic semantics are defined more precisely as follows: there is a
827single global variable called the \emph{atomic lock}. This variable
828can either be null (meaning the atomic lock is ``free''), or it can
829hold the PID of a process; that process is said to ``hold'' the atomic
830lock. Moreover, each process contains a special integer variable, its
831\emph{atomic counter}, which is initially 0. Every time a process
832enters an atomic block, it increments its atomic counter; every time
833it exits an atomic block, it decrements its counter. In order to
834increment its counter from $0$ to $1$, it must first wait for the
835atomic lock to become free, and then take the lock. When it
836decrements its counter from $1$ to $0$, it releases the atomic lock.
837When a process executing atomically becomes blocked, it releases the
838lock (without changing the value of its atomic counter).
839
840\section{Parallel loops with \cparfor}
841\label{sec:parfor}
842
843A parallel loop statement has the form
844\begin{verbatim}
845 $parfor (int i1, ..., in : dom) S
846\end{verbatim}
847The syntax is exactly the same as that for the sequential loop \cfor
848(Section \ref{sec:cfor}), only with \cparfor{} replacing \cfor.
849
850The semantics are as follows: when control reaches the loop, one
851process in spawned for each element of the domain. That process has
852local variables corresponding to the iteration variables, and those
853local variables are initialized with the components of the tuple for
854the element of the domain that process is assigned. Each process
855executes the statement \texttt{S} in this context. Finally, each of
856these processes is waited on at the end. In particular, there is an
857effective barrier at the end of the loop, and all the spawned
858processes disappear after this point.
859
860\section{Message-Passing}
861
862CIVL-C provides a number of additional primitives that can be used to
863model message-passing systems. This part of the language is built in
864two layers: the lower layer defines an abstract data type for
865representing messages; the higher layer defines an abstract data type
866of \emph{communicators} for managing sets of messages being
867transferred among some set of processes.
868
869\subsection{Messages: \cmessage}
870
871Messages are similar to bundles, but with some additional meta-data.
872The \emph{data} component of the message is the ``contents'' of the
873message and is formed and extracted much like a bundle. The meta-data
874consists of an integer identifier for the \emph{source} place of the
875message, an integer identifier for the message \emph{destination}
876place, and an integer \emph{tag} which can be used by a process to
877discriminate among messages for reception. This is very similar to
878MPI.
879
880\begin{figure}
881 \begin{small}
882\begin{verbatim}
883/* creates a new message, copying data from the specified buffer */
884$message $message_pack(int source, int dest, int tag, void *data, int size);
885
886/* returns the message source */
887int $message_source($message message);
888
889/* returns the message tag */
890int $message_tag($message message);
891
892/* returns the message destination */
893int $message_dest($message message);
894
895/* returns the message size */
896int $message_size($message message);
897
898/* transfers message data to buf, throwing exception if message
899 * size exceeds specified size */
900void $message_unpack($message message, void *buf, int size);
901\end{verbatim}
902 \end{small}
903 \caption{The \emph{message} abstract data type}
904 \label{fig:message}
905\end{figure}
906
907The functions for creating, and extracting information from, messages
908are given in Figure \ref{fig:message}.
909
910\subsection{Communicators: \cgcomm{} and \ccomm}
911\label{sec:communicators}
912
913CIVL-C defines a \emph{global communicator} type $\cgcomm$ and a
914\emph{local communicator} type $\ccomm$. The global communicator is an
915abstraction for a ``communication universe'' that stores buffered
916messages and perhaps other data. The local communicator wraps
917together a reference to a global communicator and an integer
918\emph{place}. Most of the message-passing commands take a local
919communicator as an argument to specify the communication universe used
920for that operation and the place from which that operation will be
921executed. The communication universes are isolated from one
922another---a message sent on one can never be received using a
923different communicator, for example.
924
925The global communicator is the shared object that must be declared in
926a scope containing all scopes in which communication in that universe
927will take place. It is created by specifying the number of
928\emph{places} that will comprise the communicator. A place is an
929address to which messages may be sent or where they may be received.
930There is not necessarily a one-to-one correspondence between places and
931processes: many processes can use the same place.
932
933Local communicators are created (typically in some child scope of the
934scope in which the global communicator is declared) by specifying the
935gobal communicator to which the local one will be associated and the
936place ID. The local communicator will be used in most of the
937message-passing functions; it may be thought of as an ordered pair
938consisting of a reference to the global communicator and the integer
939place ID. The place ID must be in $[0,\texttt{size}-1]$, where
940\texttt{size} is the size of the global communicator. The place ID
941specifies the place in the global communication universe that will be
942occupied by the local communicator. The local communicator handle may
943be used by more than one process, but all of those processes will be
944viewed as occupying the same place. Only one call to \ccommcreate{}
945may occur for each gcomm-place pair.
946
947
948Both types ($\cgcomm$ and $\ccomm$) are handle types. When declared
949with a call to the corresponding creation function, they create an
950object in the specified scope and return a handle to that object. The
951object can only be accessed through the specified system functions
952that take this handle as an argument.
953
954 % This local communicator handle will be used as an
955 % * argument in most message-passing functions. The place must be in
956 % * [0,size-1] and specifies the place in the global communication universe
957 % * that will be occupied by the local communicator. The local communicator
958 % * handle may be used by more than one process, but all of those
959 % * processes will be viewed as occupying the same place.
960 % * Only one call to $comm_create may occur for each gcomm-place pair.
961
962\begin{figure}
963 \begin{small}
964\begin{verbatim}
965/* Creates a new global communicator object and returns a handle to it.
966 * The global communicator will have size communication places. The
967 * global communicator defines a communication "universe" and encompasses
968 * message buffers and all other components of the state associated to
969 * message-passing. The new object will be allocated in the given scope. */
970$gcomm $gcomm_create($scope s, int size);
971
972void $gcomm_destroy($gcomm gcomm); // Destroys the gcomm
973
974_Bool $gcomm_defined($gcomm gcomm); // Is the gcomm object defined?
975
976/* Creates a new local communicator object and returns a handle to it.
977 * The new communicator will be affiliated with the specified global
978 * communicator. The new object will be allocated in the given scope. */
979$comm $comm_create($scope s, $gcomm gcomm, int place);
980
981void $comm_destroy($comm comm); // Destroys the comm
982
983_Bool $comm_defined($comm comm); // Is the comm object defined?
984
985/* Returns the size (number of places) in the global communicator associated
986 * to the given comm. */
987int $comm_size($comm comm);
988
989/* Returns the place of the local communicator. This is the same as the
990 * place argument used to create the local communicator. */
991int $comm_place($comm comm);
992
993/* Adds the message to the appropriate message queue in the communication
994 * universe specified by the comm. The source of the message must equal
995 * the place of the comm. */
996void $comm_enqueue($comm comm, $message message);
997
998/* Returns true iff a matching message exists in the communication universe
999 * specified by the comm. A message matches the arguments if the destination
1000 * of the message is the place of the comm, and the sources and tags match. */
1001_Bool $comm_probe($comm comm, int source, int tag);
1002
1003/* Finds the first matching message and returns it without modifying
1004 * the communication universe. If no matching message exists, returns a message
1005 * with source, dest, and tag all negative. */
1006$message $comm_seek($comm comm, int source, int tag);
1007
1008/* Finds the first matching message, removes it from the communicator,
1009 * and returns the message */
1010$message $comm_dequeue($comm comm, int source, int tag);
1011\end{verbatim}
1012 \end{small}
1013 \caption{The \emph{communicator} interface specifies handle
1014 types $\cgcomm$ and $\ccomm$ and the functions above}
1015 \label{fig:comm}
1016\end{figure}
1017
1018The communicator interface is given in Figure \ref{fig:comm}.
1019
1020Certain restrictions are enforced on some relations between the
1021objects involved in a communication universe.
1022
1023Fix a \cgcomm{} object. This object corresponds to a single
1024communication universe with, say, $n$ places. At any time, there can
1025be \emph{at most one} \ccomm{} object associated to a given place. If
1026a program attempts to create a \ccomm{} object with the same \cgcomm{}
1027and place as an earlier created \ccomm{} object, a runtime error will
1028occur. In particular, there can be at most $n$ \ccomm{} objects
1029associated to the \cgcomm.
1030
1031The relation between processes and \ccomm{} objects is unconstrained.
1032One process may use any number of \ccomm{} objects. (Of course, the
1033process must have access to handles for those \ccomm{} objects.)
1034Dually, a single \ccomm{} object may be used by any number of
1035processes; this situation arises naturally when modeling a
1036multi-threaded MPI program.
1037
1038\begin{figure}
1039 \begin{small}
1040\begin{verbatim}
1041$gcomm gcomm = $gcomm_create($here, nprocs);
1042void Process(int rank) {
1043 $comm comm = $comm_create($here, gcomm, rank);
1044
1045 void Thread(int tid) {
1046 ...$comm_enqueue(comm, msg)...
1047 ...$comm_dequeue(comm, source, tag)...
1048 }
1049
1050 for (int i=0; i<nthreads; i++) $spawn Thread(i);
1051 ...
1052 $comm_destroy(comm);
1053}
1054for (int i=0; i<nprocs; i++) $spawn Process(i);
1055...
1056$gcomm_destroy(gcomm);
1057\end{verbatim}
1058 \end{small}
1059 \caption{Code skeleton for model of multithreaded MPI program
1060 showing placement of global and local communicator objects}
1061 \label{fig:mpi-threads-comm}
1062\end{figure}
1063
1064There is no special status given to the process which creates the
1065\ccomm{} object of a given place. Any process which can access a
1066handle for that \ccomm{} object can use it to send or receive
1067messages, regardless of whether that process was the one that created
1068the \ccomm{} object. However, users should be aware that verification
1069is likely to be most efficient when variables are declared as locally
1070as possible, so it is best to declare the \ccomm{} object in the
1071innermost scope possible. Figure \ref{fig:mpi-threads-comm}
1072illustrates an effective way to do this in the context of modeling a
1073multithreaded MPI program. In the code skeleton, each thread can
1074access the local communicator object of its process, but not that of
1075any other process.
1076
1077\subsection{Barriers: \cgbarrier{} and \cbarrier}
1078\label{sec:barriers}
1079
1080CIVL-C defines a \emph{global barrier} type $\cgbarrier$ and a
1081\emph{local barrier} type $\cbarrier$. They provide an implementation of
1082a barrier for concurrent programs.
1083
1084The global barrier is a shared object that must be declared in
1085a scope containing all scopes in which the barrier will be called.
1086 It is created by specifying the number of
1087\emph{places} that will comprise the barrier.
1088
1089Local barriers are created (typically in some child scope of the
1090scope in which the global barrier is declared) by specifying the
1091gobal barrier to which the local one will be associated and the
1092place ID. The local barrier will be used in the call to the barrier;
1093it may be thought of as an ordered pair
1094consisting of a reference to the global barrier and the integer
1095place ID. The place ID must be in $[0,\texttt{size}-1]$, where
1096\texttt{size} is the size of the global barrier.
1097Only one call to \cbarriercreate{}
1098may occur for each gbarrier-place pair.
1099
1100
1101Both types ($\cgbarrier$ and $\cbarrier$) are handle types. When declared
1102with a call to the corresponding creation function, they create an
1103object in the specified scope and return a handle to that object. The
1104object can only be accessed through the specified system functions
1105that take this handle as an argument.
1106
1107
1108\begin{figure}
1109 \begin{small}
1110\begin{verbatim}
1111/* Creates a new barrier object and returns a handle to it.
1112 * The barrier has the specified size.
1113 * The new object will be allocated in the given scope. */
1114$gbarrier $gbarrier_create($scope scope, int size);
1115
1116/* Destroys the gbarrier */
1117void $gbarrier_destroy($gbarrier barrier);
1118
1119/* Creates a new local barrier object and returns a handle to it.
1120 * The new barrier will be affiliated with the specified global
1121 * barrier. This local barrier handle will be used as an
1122 * argument in most barrier functions. The place must be in
1123 * [0,size-1] and specifies the place in the global barrier
1124 * that will be occupied by the local barrier.
1125 * Only one call to $barrier_create may occur for each barrier-place pair.
1126 * The new object will be allocated in the given scope. */
1127$barrier $barrier_create($scope scope, $gbarrier gbarrier, int place);
1128
1129/* Calls the barrier associated with this local barrier object.*/
1130void $barrier_call($barrier barrier);
1131
1132/* Destroys the barrier. */
1133void $barrier_destroy($barrier barrier);
1134\end{verbatim}
1135 \end{small}
1136 \caption{The \emph{barrier} interface specifies handle
1137 types $\cgbarrier$ and $\cbarrier$ and the functions above}
1138 \label{fig:barrier}
1139\end{figure}
1140
1141The barrier interface is given in Fig.\ \ref{fig:barrier}.
1142
1143\chapter{Specification}
1144
1145\section{Overview}
1146
1147Specification is the means by which one expresses what a program is
1148supposed to do, i.e., what it means for it to be correct.
1149
1150There are several specification mechanisms in CIVL-C. First, there are
1151the default properties: these are generic properties which are checked
1152by default in any program, and require no additional specification
1153effort. These properties include absence of deadlocks, division by 0,
1154illegal pointer dereferences, and out of bounds array indexes.
1155
1156Many more program-specific properties can be specified using
1157assertions. CIVL-C has a rich assertion language which extends the
1158language of boolean-valued C expressions. Assumptions are a
1159specification dual to assertions in that they restrict the set
1160of executions on which the assertions are checked.
1161
1162Functional equivalence is a power specification mechanism. In this
1163approach, two programs are provided, one playing the role of the
1164specification, the other the role of the implementation. The
1165implementation is correct if, for all inputs $x$, it produces the same
1166output as that produced by the specification on input $x$. In other
1167words, the two programs define the same function; this is sometimes
1168known as \emph{input-output equivalence}. In order to take this
1169approach, one must first have a way to specify what the inputs and
1170outputs of a programs are; CIVL-C provides special keywords for this.
1171
1172Procedure contracts are another powerful specification mechanisms.
1173These typically involve specifying preconditions and postconditions
1174for a function. The function is correct if, whenever it is called in a
1175state satisfying the precondition, when it returns the state will
1176satsify the postcondition. A program is correct if all its functions
1177satsify their contract.
1178
1179\section{Input-output signature}
1180
1181\subsection{Input type qualifier: \cinput}
1182
1183The declaration of a variable in the root scope may
1184include the type qualifier \cinput, e.g.,
1185\begin{verbatim}
1186 $input int n;
1187\end{verbatim}
1188This declares the variable to be an input variable, i.e., one which is
1189considered to be an input to the program. Such a variable is
1190initialized with an arbitrary (unconstrained) value of its type. When
1191using symbolic execution to verify a program, such a variable will be
1192assigned a unique symbolic constant of its type.
1193
1194In contrast, variables in the root scope which are not input variables
1195will instead be initialized with the ``undefined'' value. If an
1196undefined value is used in some way (such as in an argument to an
1197operator), an error occurs.
1198
1199In addition, input variables may only be read, never written to.
1200
1201Alternatively, it is also possible to specify a particular concrete
1202initial value for an input variable. This is done using a command
1203line argument when verifying or running the program.
1204
1205Input (and output) variables also play a key role when determining
1206whether two programs are functionally equivalent. Two programs are
1207considered functionally equivalent if, whenever they are given the
1208same inputs (i.e., corresponding \cinput{} variables are initialized
1209with the same values) they will produce the same outputs (i.e.,
1210corresponding \coutput{} variables will end up with the same values at
1211termination).
1212
1213\subsection{Output type qualifier: \coutput}
1214
1215A variable in the root scope may be declared with this type qualifier
1216to declare it to be an output variable. Output variables are ``dual''
1217to input variables. They may only be written to, never read. They
1218are used primarily in functional equivalence checking.
1219
1220\section{Assertions and assumptions}
1221
1222\subsection{Assertions: \cassert}
1223
1224
1225An \emph{assert statement} has the either of the forms below
1226\begin{verbatim}
1227 $assert expr;
1228 $assert expr : msg, msg_arg0, msg_arg1, ... ;
1229\end{verbatim}
1230
1231It takes an boolean type expression and a number of optional expressions which are used to construct an error message.
1232Note that CIVL-C boolean expressions have a richer syntax than C
1233expressions, and may include universal or existential quantifiers
1234(see below), and the boolean values \ctrue{} and \cfalse{}.
1235
1236During verification, the assertion is checked. If it cannot be proved
1237that it must hold, a violation is reported. If additional arguments are present, then a specific message is prented as well if the assertion is violated. These
1238additional arguments are similar in form to those used in C's
1239\texttt{printf} statement: a format string, followed by some number of
1240arguments which are evaluated and substituted for successive codes in
1241the format string. For example,
1242\begin{verbatim}
1243 $assert x<=B : "x-coordinate %f exceeds bound %f", x, B;
1244\end{verbatim}
1245
1246%The C function \texttt{assert}, included in the standard library
1247%\texttt{assert.h}, is identical to \cassert. Programmers are
1248%free to use either one.
1249
1250
1251\subsection{Assume statements: \cassume}
1252
1253An \emph{assume statement} has the form
1254\begin{verbatim}
1255 $assume expr;
1256\end{verbatim}
1257During verification, the assumed expression is assumed to hold. If
1258this leads to a contradiction on some execution, that execution is
1259simply ignored. It never reports a violation, it only restricts the
1260set of possible executions that will be explored by the verification
1261algorithm.
1262
1263Like as assertion statement, as assume statement can be used any place
1264a statement is expected. In addition, as assume statement can be used
1265in file scope to place restrictions on the global variables of the
1266programs. For example,
1267\begin{verbatim}
1268$input int B;
1269$input int N;
1270$assume 0<=N && N<=B;
1271\end{verbatim}
1272declares \texttt{N} and \texttt{B} to be integer inputs and restricts
1273consideration to inputs satisfying $0\leq\texttt{N}\leq\texttt{B}$.
1274
1275
1276\section{Formulas}
1277
1278A formula is a boolean expression that can be used in an assert
1279statement, assume statement, procedure contract (below), or invariant.
1280Any ordinary C boolean expression is a formula. CIVL-C provides some
1281additional kinds of formulas, described below.
1282
1283\subsection{Implication: \cimplies}
1284
1285The binary operation \cimplies{} represents logical implication.
1286The expression \verb!p=>q! is equivalent to \verb~(!p)||q~.
1287
1288\subsection{Universal quantifier: \cforall}
1289
1290The universally qunatified formula has the form
1291\begin{verbatim}
1292 $forall { type identifier | restriction} expr
1293\end{verbatim}
1294where \verb!type! is a type name (e.g., \texttt{int} or
1295\texttt{double}), \verb!identifier! is the name of the bound variable,
1296\verb!restriction! is a boolean expression which expresses some
1297restriction on the values that the bound variable can take, and
1298\verb!expr! is a formula. The universally quantified formula
1299holds iff for all values assignable to the bound variable
1300for which the restriction holds, the formula \ct{expr} holds.
1301
1302A variation on the construct above can be used in the special case
1303where the bound variable is to range over a finite interval
1304of integers. In this case the quantified formula may be written:
1305\begin{verbatim}
1306 $forall { type identifier=lower .. upper } expr
1307\end{verbatim}
1308where \ct{lower} and \ct{upper} are integer expressions.
1309
1310\subsection{Existential quantifier: \cexists}
1311
1312The syntax for existentially quantified expressions is exactly the
1313same as for universally quantified expressions, with \cexists{} in
1314place of \cforall{}.
1315
1316\section{Contracts}
1317
1318\subsection{Procedure contracts: \crequires{} and \censures{}}
1319The \crequires{} and \censures{} primitives are used to encode
1320procedure contracts. There are optional
1321elements that may occur in a procedure declaration or definition,
1322as follows. For a function prototype:
1323\begin{verbatim}
1324 T f(...)
1325 $requires expr;
1326 $ensures expr;
1327 ;
1328\end{verbatim}
1329For a function definition:
1330\begin{verbatim}
1331 T f(...)
1332 $requires expr;
1333 $ensures expr;
1334 {
1335 ...
1336 }
1337\end{verbatim}
1338The value \cresult{} may be used in post-conditions to refer
1339to the result returned by a procedure.
1340
1341\emph{Status}: parsed, but nothing is currently done with this
1342information.
1343
1344\subsection{Loop invariants: \cinvariant}
1345
1346This indicates a loop invariant. Each C loop
1347construct has an optional invariant clause as follows:
1348\begin{verbatim}
1349 while (expr) $invariant (expr) stmt
1350 for (e1; e2; e3) $invariant (expr) stmt
1351 do stmt while (expr) $invariant (expr) ;
1352\end{verbatim}
1353The invariant encodes the claim that if \texttt{expr} holds upon
1354entering the loop and the loop condition holds, then it will hold
1355after completion of execution of the loop body. The invariant is used
1356by certain verification techniques.
1357
1358\emph{Status:} parsed, but nothing is currently done with this
1359information.
1360
1361\section{Concurrency specification}
1362
1363\subsection{Remote expressions: \texttt{e@x}}.
1364
1365These have the form \verb!expr@x! and refer to a variable in another
1366process, e.g., \verb!procs[i]@x!. This special kind of expression is
1367used in collective expressions, which are used to formulate collective
1368assertions and invariants.
1369
1370The expression \verb!expr! must have \cproc{} type. The variable
1371\texttt{x} must be a statically visible variable in the context in
1372which it is occurs. When this expression is evaluated, the evaluation
1373context will be shifted to the process referred to by \texttt{expr}.
1374
1375\emph{Status}: not implemented.
1376
1377\subsection{Collective expressions: \ccollective}. These have the form
1378\begin{verbatim}
1379 $collective(proc_expr, int_expr) expr
1380\end{verbatim}
1381This is a collective expression over a set of processes. The
1382expression \texttt{proc{\U}expr} yields a pointer to the first element
1383of an array of \cproc. The expression \texttt{int{\U}expr} gives the
1384length of that array, i.e., the number of processes. Expression
1385\texttt{expr} is a boolean-valued expression; it may use remote
1386expressions to refer to variables in the processes specified in the
1387array. Example:
1388\begin{verbatim}
1389 $proc procs[N];
1390 ...
1391 $assert $collective(procs, N) i==procs[(pid+1)%N]@i ;
1392\end{verbatim}
1393
1394\emph{Status}: not implemented.
1395
1396\chapter{Pointers and Heaps}
1397\label{chap:pointers}
1398
1399CIVL-C supports pointers, using the same operators with the same
1400meanings as C (\texttt{\&}, \texttt{*}, pointer arithmetic). There is
1401also a heap in every scope, and system functions to allocate and
1402deallocate objects in the specified scope.
1403
1404\section{Memory functions: \texttt{memcpy}}
1405
1406The function \texttt{memcpy} is defined in the standard C library
1407\texttt{string.h} and works exactly the same in CIVL: it copies
1408data from the region pointed to by \ct{q} to that pointed to by
1409\ct{p}. The signature is
1410
1411\begin{verbatim}
1412 void memcpy(void *p, void *q, size_t size);
1413\end{verbatim}
1414
1415\section{Heaps, \cmalloc{} and \cfree}
1416
1417As mentioned above, each dynamic scope has an implicit heap on which
1418objects can be allocated and deallocated dynamically. The CIVL-C header
1419\texttt{civlc.cvh} provides the functions \cmalloc{} and \cfree{} for allocating and dealocating
1420memory, repectively, as described in Section \ref{subsubsec:mallocandfree}.
1421
1422% \section{Pointer types}
1423
1424% Given any object type $T$ and a static scope $s$ in a CIVL-C program,
1425% there is a type \emph{pointer-to-$T$-in-$s$}. The type is used to
1426% represent a pointer to a memory location of type $T$ in scope $s$ or a
1427% descendant of $s$ (i.e., some scope contained in $s$).
1428
1429% If scope $s_1$ is a descendant of $s_2$ (i.e., $s_1$ is lexically
1430% contained in $s_2$), the type \emph{pointer-to-$T$-in-$s_1$} is a
1431% subtype of \emph{pointer-to-$T$-in-$s_2$}. This means that any
1432% expression of the first type can be used wherever an object of the
1433% second type is expected. In particular, any expression $e$ of the
1434% subtype can be assigned to a left-hand-side expression of the
1435% supertype without explicit casts; also $e$ can be used as an argument
1436% to a function for which the corresponding parameter has the supertype.
1437
1438% The syntax for denoting this type adheres to the usual C syntax for
1439% denoting the type \emph{pointer-to-$T$} with the addition of a scope
1440% parameter within angular brackets immediately following the \texttt{*}
1441% token. For example, to declare a variable \texttt{p} of type
1442% \emph{pointer-to-$T$-in-$s$}, one writes
1443% \begin{verbatim}
1444% int *<s> p;
1445% \end{verbatim}
1446% If the scope modifier \texttt{<...>} is absent, the scope is taken to
1447% be the root scope $s_0$. The object has type
1448% \emph{pointer-to-$T$-in-$s_0$}, which is abreviated as
1449% \emph{pointer-to-$T$}. In this way, stanard C programs can be
1450% interpreted as CIVL-C programs.
1451
1452% \section{Address-of operator}
1453
1454% The address-of operator \texttt{\&} returns a pointer of the
1455% appropriate subtype using the innermost scope in which its left-hand-side
1456% argument is declared. For example
1457
1458% \begin{verbatim}
1459% {
1460% $scope s1 = $here();
1461% int x;
1462% double a[N];
1463% int *<s1> p = &x;
1464% double *<s1> q = &a[2];
1465% }
1466% \end{verbatim}
1467% is correct (in particular, it is type-correct) because \texttt{\&x}
1468% has type \emph{pointer-to-\texttt{int}-in-\texttt{s1}}, since
1469% \texttt{s1} is the scope in which \texttt{x} is declared.
1470
1471% Another pointer example:
1472% \begin{small}
1473% \begin{verbatim}
1474% { $scope s0 = $here();
1475% { $scope s1 = $here();
1476% double x;
1477% { $scope s2 = $here();
1478% double y;
1479% double *<s1> p;
1480% /* p can only point to something in s1 or descendant, for example, s2 */
1481% p = &x; // fine
1482% p = &y; // fine
1483% p = (double*)$malloc(s0, 10*sizeof(double)); // static type error
1484% }
1485% }
1486% }
1487% \end{verbatim}
1488% \end{small}
1489
1490% \section{Pointer addition and subtractions}
1491
1492% If \texttt{e} is an expression of type \emph{pointer-to-$T$-in-$s$}
1493% and \texttt{i} is an expression of integer type then \texttt{e+i} also
1494% has type \emph{pointer-to-$T$-in-$s$}. In other words, pointer
1495% addition cannot leave the scope of the original pointer. This
1496% reflects the fact that every object is contained in one scope, and
1497% pointer addition cannot leave the object.
1498
1499% Pointer subtraction is defined on two pointers of the same type, where
1500% ``same'' includes the scope. That is checked statically. As in C, it
1501% is only defined if the two pointers point to the same object. In
1502% CIVL-C, a runtime error will be thrown if they do not point to the
1503% same object.
1504
1505% \section{Semantics of scopes and pointer types}
1506
1507% A variable of type \cscope{} is treated like any other variable.
1508% It becomes part of the state when the scope in which it is declared
1509% is instantiated to form a dynamic scope. The variable is
1510% initialized at that time and its value cannot change.
1511
1512% Each time a dynamic scope is instantiated, it is assigned a unique ID
1513% number. The exactly value of the ID number is not relevant, it just
1514% has to be distince from any other scope ID number that currently
1515% exists in the state. This is the value that is assigned to the scope
1516% variable. Therefore, if a static scope contains a scope variable, and
1517% that scope is instantiated twice to form two distinct dynamic scopes,
1518% the values assigned to the two variables will be distinct.
1519
1520% A pointer value is an ordered pair $\langle \delta,r \rangle$, where
1521% $\delta$ is a dynamic scope ID and $r$ is a reference to a memory
1522% location in the static scope associated to $\delta$. (We will define
1523% the exact form of a reference later.)
1524
1525% When a dynamic scope is instantiated, each new variable created is
1526% assigned a \emph{dynamic type}. This is a refinement of the static
1527% type associated to the static variable. Every dynamic type
1528% is an instance of exactly one static type. The dynamic
1529% type of the newly instantiated variable is an instance of the
1530% static type of the static variable.
1531
1532% The dynamic pointer types have the form
1533% \emph{pointer-to-$t$-in-$\delta$}, where $t$ is a dynamic type and
1534% $\delta$ is a dynamic scope ID. For a program to be dynamically type
1535% safe, such a variable should hold only values of the form $\langle
1536% \delta, r\rangle$. In particular, the variable should never be
1537% assigned a value where the dynamic scope component is a different
1538% instance of the static scope $s$ associated to $\delta$.
1539
1540% \section{Pointer casts}
1541
1542% If scope $s_1$ is contained in scope $s_2$, an expression of type
1543% \emph{pointer-to-$T$-in-$s_1$} can always be cast to
1544% \emph{pointer-to-$T$-in-$s_2$},
1545% because the first is a subtype of the second. (As described above,
1546% the cast is unnecessary.)
1547
1548% The cast in the other direction is also allowed, but the dynamic type
1549% safety of that cast will only be checked at runtime. In particular, a
1550% runtime error will result if the cast attempts to cast the pointer
1551% value to a dynamic scope which does not contain (is an ancestor of)
1552% the dynamic scope component of the pointer value.
1553
1554% A type \emph{pointer-to-$T_1$-in-$s$} can be cast to a type
1555% \emph{pointer-to-$T_2$-in-$s$} according to the usual rules of C. In
1556% other words, usual casting rules apply as long as you don't change the
1557% scope.
1558
1559% \section{Scope-Parameterized Functions}
1560
1561% Coming soon. (Parsed, type checked, not currently used otherwise.)
1562
1563% \section{Scope-Parameterized Type Definitions}
1564
1565% Coming soon. (Ditto.)
1566
1567\chapter{Libraries}
1568
1569\section{Standard CIVL-C headers}
1570CIVL-C headers have the suffix \texttt{.cvh}. Here is the list of standard libraries provided by CIVL:
1571\begin{itemize}
1572\item \texttt{civlc} provides types and functions that are used frequently by CIVL-C programs;
1573\item \texttt{scope} provides utility functions related to dynamic scopes;
1574\item \texttt{pointer} provides utility functions dealing with pointers;
1575\item \texttt{seq} provides utility functions of sequences (realized as incomplete array in CIVL-C);
1576\item \texttt{concurrency} provides concurrency utilities such as the barrier;
1577\item \texttt{bundle} provides bundle types and methods;
1578\item \texttt{comm} provides communicators and methods;
1579\item \texttt{civlmpi} provides CIVL-C types for MPI.
1580\end{itemize}
1581
1582\subsection{CIVL basics \texttt{civlc.cvh}}
1583\label{subsec:civlcLibrary}
1584The header \texttt{civlc.cvh} declares four types, three macros and several functions. The types declared are \texttt{size\_t}, \texttt{\$proc},
1585\texttt{\$scope} and \texttt{\$int\_iter}. The declared macros are \texttt{\$true}, \texttt{\$false} and \texttt{NULL}. The functions provided in this header
1586will be described in the following.
1587
1588\subsubsection{The \cwait\ function}
1589\label{subsubsec:wait}
1590The \cwait\ function has signature
1591\begin{verbatim}
1592 void $wait($proc p);
1593\end{verbatim}
1594
1595When invoked, this function will not return until the process
1596referenced by \ct{p} has terminated. Note that $p$ can be any
1597expression of type \cproc{}, not just a variable.
1598
1599\subsubsection{The \cwaitall\ function}
1600\label{subsubsec:waitall}
1601The $\cwaitall$ function has signature
1602\begin{verbatim}
1603 void $waitall($proc *procs, int numProcs);
1604\end{verbatim}
1605When invoked, this function will not return until all the \ct{numProcs} processes
1606referenced by the memory specified by \ct{procs} have terminated.
1607
1608\subsubsection{The \cexit\ function}
1609\label{subsubsec:exit}
1610This function takes no arguments. It causes the
1611calling process to terminate immediately, regardless of the state of
1612its call stack:
1613\begin{verbatim}
1614 void $exit(void);
1615\end{verbatim}
1616
1617\subsubsection{The \cchooseint{} function}
1618\label{subsubsec:chooseint}
1619
1620The function \cchooseint{} has the following signature:
1621\begin{verbatim}
1622 int $choose_int(int n);
1623\end{verbatim}
1624This function takes as input a positive integer \texttt{n} and
1625nondeterministicaly returns an integer in the range
1626$[0,\texttt{n}-1]$.
1627
1628\subsubsection{The \cscopedefined{} function}
1629\label{subsubsec:scopedefined}
1630
1631The function \cscopedefined{} has signature
1632\begin{verbatim}
1633 _Bool $scope_defined($scope s);
1634\end{verbatim}
1635It returns \emph{true} if the dynamic scope specified by \texttt{s} is
1636defined, else it returns \emph{false}.
1637
1638\subsubsection{The \cprocdefined{} function}
1639\label{subsubsec:procdefined}
1640
1641The function \cprocdefined{} has signature
1642\begin{verbatim}
1643 _Bool $proc_defined($proc p);
1644\end{verbatim}
1645
1646It returns \ctrue if and only if the given object of \cproc{} type is defined.
1647
1648
1649\subsubsection{The heap-related functions: \cmalloc{} and \cfree}
1650\label{subsubsec:mallocandfree}
1651
1652The memory allocation function $\cmalloc$ is like C's \texttt{malloc}, but takes
1653an extra scope argument:
1654\begin{verbatim}
1655 void * $malloc($scope scope, int size);
1656\end{verbatim}
1657To allocate an object, one first needs a reference to the dynamic scope to be used.
1658
1659The function \cfree{} is used to deallocate a heap object;
1660it is just like C's \texttt{free}:
1661\begin{verbatim}
1662 void $free(void *p);
1663\end{verbatim}
1664An error is generated if the pointer is not one that was returned by
1665\cmalloc, or if it was already freed.
1666
1667\subsection{Scope utilities \texttt{scope.cvh}}
1668\label{subsec:scopeLibrary}
1669
1670The header \texttt{scope.cvh} declares one function: \texttt{\$scope\_parent}, which has signature
1671
1672\begin{verbatim}
1673 $scope $scope_parent($scope s);
1674\end{verbatim}
1675This function returns the parent dynamic scope of the dynamic scope referenced by
1676\ct{s}. If \ct{s} is the root dynamic scope, it returns the undefined
1677value of type $\cscope$.
1678
1679\subsection{Pointer utilities \texttt{pointer.cvh}}
1680\label{subsec:pointerLibrary}
1681The header \texttt{pointer.cvh} declares functions taking pointers as the arguments for different purposes, including:
1682\begin{itemize}
1683\item function \cequals{} for equality checking;
1684\item function \ccontains{} for membership testing;
1685\item function \texttt{\$translate\_ptr} for pointer translation;
1686\item function \ccopy{} for copying data through pointers.
1687\end{itemize}
1688
1689\subsubsection{The \cequals{} function}
1690
1691The \cequals{} function has the signature
1692\begin{verbatim}
1693 _Bool $equals(void *x, void *y);
1694\end{verbatim}
1695
1696This function takes two non-null pointers as input. If the two objects that the pointers refer to have the same value, then the
1697function returns \ctrue. Otherwise, it returns \cfalse.
1698
1699\subsubsection{The \ccontains{} function}
1700
1701The function \ccontains{} has the signature
1702\begin{verbatim}
1703 _Bool $contains(void *ptr1, void *ptr2);
1704\end{verbatim}
1705
1706This function takes two non-null pointers as input. If the object that the pointer \texttt{ptr1} points to contains the object pointed to by \texttt{ptr2}, then the
1707function returns \ctrue. Otherwise, it returns \cfalse. For example, given
1708\begin{verbatim}
1709 int a[10];
1710 struct foo {int x; double y} f;
1711 struct foo b[10];
1712
1713 // ... initialize a, f and b
1714\end{verbatim}
1715
1716Here are the results of several invocations of \ccontains:
1717
1718\begin{itemize}
1719\item \texttt{\ccontains(\&a, \&a[3])} returns \ctrue, since the array \texttt{a} contains the cell \texttt{a[3]};
1720\item \texttt{\ccontains(\&a[2], \&a[3])} returns \cfalse;
1721\item \texttt{\ccontains(\&a[2], \&a[2])} returns \ctrue, because the relation is relexive;
1722\item \texttt{\ccontains(\&f, \&f.y)} returns \ctrue, since the struct \texttt{f} contains its field \texttt{f.y};
1723\item \texttt{\ccontains(\&b, \&b[2].x)} returns \ctrue.
1724\end{itemize}
1725
1726\subsubsection{The \texttt{\$translate\_ptr} function}
1727The function \texttt{\$translate\_ptr} has the signature
1728\begin{verbatim}
1729 void * $translate_ptr(void *ptr, void *obj);
1730\end{verbatim}
1731
1732This function translates a pointer into one object (\texttt{ptr}) to a pointer into a different object (\texttt{obj}) with similar structure.
1733
1734For example:
1735\begin{verbatim}
1736 typedef struct node{
1737 int x;
1738 int y;
1739 } node;
1740 typedef struct point{
1741 double a;
1742 double b;
1743 double c;
1744 }point;
1745 node nodes[3];
1746 point points[5];
1747 ... // initialize nodes and points
1748 double *p = $translate_ptr(&(nodes[2].y), &points);
1749 // after the translation, p = &(points[2].b);
1750\end{verbatim}
1751
1752\subsubsection{The \ccopy{} function}
1753
1754The \ccopy{} function has the signature
1755\begin{verbatim}
1756 void $copy(void *ptr, void *value_ptr);
1757\end{verbatim}
1758
1759It copies the value pointed to by \texttt{value\_ptr} to the memory
1760location specified by \texttt{ptr}. This function is different from \texttt{memcpy} only in the way that
1761it can take pointers to (incomplete) array as the argument and copy the whole array to the other.
1762
1763\subsection{Sequence utilities \texttt{seq.cvh}}
1764\label{subsec:seqLibrary}
1765The header \texttt{seq.cvh} provides utility functions dealing with sequences. A sequence is realized as an incomplete array (i.e., an array with no extent specified) of any type \texttt{T}, which applies for all functions of \texttt{seq.cvh}. Functions declared in this header include:
1766\begin{itemize}
1767\item function \cseqinit{} for initializing sequences;
1768\item function \cseqlen{} for computing the length of a sequence;
1769\item function \cseqinsert{} for element insertion to a sequence;
1770\item function \cseqrm{} for element removal of a sequence.
1771\end{itemize}
1772
1773\subsubsection{The \cseqinit{} function}
1774
1775The \cseqinit{} function has the signature
1776\begin{verbatim}
1777 void $seq_init(void *seq, int count, void *value);
1778\end{verbatim}
1779
1780Given a pointer to a sequence of type \texttt{T}, this function sets that sequence to be an array of length \texttt{count} in which every element has the same value, specified by the given pointer \texttt{value}. The parameter \texttt{seq} has the type pointer-to-incomplete-array-of-T, \texttt{count} has any integer type and must be nonnegative, and \texttt{value} has the type pointer-to-T.
1781
1782\subsubsection{The \cseqlen{} function}
1783The \cseqlen{} function has the signature
1784\begin{verbatim}
1785 int $seq_length(void *seq);
1786\end{verbatim}
1787This function returns the length of the sequence pointed to by the pointer \texttt{seq}. The contract is that \texttt{seq} must be a pointer of a sequence of type \texttt{T}, i.e., \texttt{seq} should have the type pointer-to-incomplete-array-of-T.
1788
1789\subsubsection{The \cseqinsert{} function}
1790The \cseqinsert{} function has the signature
1791\begin{verbatim}
1792 void $seq_insert(void *seq, int index, void *values, int count);
1793\end{verbatim}
1794
1795Given a pointer to a sequence of type T, this function inserts \texttt{count} elements into the sequence starting at position
1796 \texttt{index}. The subsequence elements of the original sequence are shifted up, and the final length of the array will be its original length
1797plus \texttt{count}. The values to be inserted are taken from the region specified by \texttt{values}, which has type pointer-to-T.
1798
1799It is required that \texttt{0<=index<=length}, where length is the orginal length of the seqence. If \texttt{index=length}, this function appends the elements to the end of the array. If \texttt{index=0}, this inserts the elements at the beginning of the sequence. If \texttt{count=0}, this function is a no-op and \texttt{values} will never be evaluated (hence may be NULL).
1800
1801\subsubsection{The \cseqrm{} function}
1802The \cseqrm{} function has the signature
1803\begin{verbatim}
1804 void $seq_remove(void *seq, int index, void *values, int count);
1805\end{verbatim}
1806
1807This function removes \texttt{count} elements from the sequence of type T pointed to by \texttt{seq}, starting at position
1808\texttt{index}.
1809
1810If \texttt{values} is not NULL, the removed elements will be copied to the memory region beginning with \texttt{values}, which shoud have the type pointer-to-T. It is required that \texttt{0<=index<length} and \texttt{0<=count<=length-index}. If \texttt{count=0}, this function is a no-op.
1811
1812\subsection{Bundle type and functions \texttt{bundle.cvh}}
1813\label{subsec:bundleLibrary}
1814
1815The header \texttt{bundle.cvh} declares four the type \cbundle and the following functions:
1816
1817%\begin{figure}
1818\begin{verbatim}
1819/* Returns the size of the given bundle b. */
1820int $bundle_size($bundle b);
1821
1822/* Creates a bundle from the memory region specified by ptr and size,
1823 * copying the data into the new bundle. */
1824$bundle $bundle_pack(void *ptr, int size);
1825
1826/* Returns the size (number of bytes) of the bundle. */
1827int $bundle_size($bundle b);
1828
1829/* Copies the data out of the bundle into the region specified. */
1830void $bundle_unpack($bundle bundle, void *ptr);
1831
1832/* Unpacks the bundle and applies the specified operation on the content
1833 * of the bundle. For every binary operarion defined in operation, the
1834 * content of the bundle will be used as the left operand and buf will
1835 * be used as the right operand. The result of the operation is stored
1836 * in buf once is it is done. */
1837void $bundle_unpack_apply($bundle data, void *buf, int size, $operation op);
1838
1839\end{verbatim}
1840 %\caption{The \emph{bundle} abstract data type}
1841% \label{fig:bundle}
1842%\end{figure}
1843
1844
1845\section{C libraries}
1846
1847Each of the following libraries is at least partially implemented and can
1848be included in a CIVL-C program:
1849\begin{itemize}
1850\item \ct{assert}
1851 \begin{itemize}
1852 \item \verb!void assert(_Bool expr);!\\This is equivalent to an \cassert{} statement without error messages.
1853 \end{itemize}
1854\item \ct{math}
1855 \begin{itemize}
1856 \item \verb!double sqrt(double x);!
1857 \item \verb!double ceil(double x);!
1858 \item \verb!double exp(double x);!
1859 \end{itemize}
1860\item \ct{stdlib}
1861 \begin{itemize}
1862 \item \verb!size_t!
1863 \item \verb!void * malloc(size_t size);!\\
1864 This is equivalent to \verb!$malloc($root, size)!.
1865 \item \verb!void free(void * ptr);!\\
1866 This is identical to \verb!$free(ptr)!.
1867 \end{itemize}
1868\item \ct{stdbool}
1869 \begin{itemize}
1870 \item \verb!true!\\
1871 This is equivalent to \ctrue.
1872 \item \verb!false!\\
1873 This is equivalent to \cfalse.
1874 \end{itemize}
1875\item \ct{stddef}
1876 \begin{itemize}
1877 \item \verb!size_t!
1878 \item \verb!NULL!
1879 \end{itemize}
1880\item \ct{stdio}
1881 \begin{itemize}
1882 \item \verb!int printf(const char * restrict format, ...);!
1883 \end{itemize}
1884\item \ct{string}
1885 \begin{itemize}
1886 \item \verb!size_t!
1887 \item \verb!NULL!
1888 \item \verb!void memcpy(void * restrict dst, const void * restrict src, size_t n);!
1889 \end{itemize}
1890\end{itemize}
Note: See TracBrowser for help on using the repository browser.