The
scm textual language was introduced in the Ph.D. thesis of Tristan Le Gall. An
scm model contains the description of a system of communicating machines. This description is composed of two parts:
–
A header that specifies the set of fifo channels and the message alphabet.
–
A list of automata, each modeling a communicating machine.
For model-checking purposes, the format also permits the specification of a set of
bad configurations.
Header
1.
Start the description of a system of communicating machines and specify its name:
scm ident :
2.
Specify the number of channels:
nb_channels = integer ;
The set of channels is {0, ...,
n-1} where
n is the number of channels. By default, all channels are perfect.
3.
Tag some channels as lossy (optional):
[lossy : integer [, integer ...]]
4.
Declare the message alphabet as follows:
parameters : [{int | real} ident [= expr] ; ...]
The alphabet is the same for all channels. Each message holds a typed numerical value.
Automata
1.
Start the description of an automaton and specify its name:
automaton ident :
2.
Declare the automaton's local variables (optional):
[{int | real} ident [= expr] ; ...]
3.
Specify the automaton's initial states:
initial : integer [, integer ...]
4.
Declare the automaton's states together with outgoing transitions:
state integer : [to integer : command ; ...]
where
command is of the following form:
when cond [, integer {! | ?} ident] [with ident = expr [, ident = expr ...]]
Semantics
The operational semantics of a system of communicating machines is the usual one: the automata move asynchronously according to their local transitions, and they communicate exclusively through the channels. Communication actions are ! (send) and ? (receive). Channels are fifo, unbounded, and initially empty. Note that channels need not be point-to-point, they are shared by all automata.
Bad Configurations
The description of the system of communicating machines is, optionally, followed by the specification of a set of bad configurations:
bad_states : ( automaton ident : badlocal ... [with regexp] ) ...
where
badlocal is of the following form:
in integer : cond ...
The local constraints in a
badlocal specification are
disjuncted together. The
badlocal specifications in a
bad_states declaration are
conjuncted together.
The symbol
# is used to separate channels in
regexp. Each word matched by
regexp must contain exactly
n-1 occurrences of
# where
n is the number of channels.