The complex conditionals are ``case'' and ``switch''. A ``case'' statement has the form:
case{
<cond1> : <stmt1>
<cond2> : <stmt2>
...
<condn> : <stmtn>
[default : <dftlstmt>]
}
This statement is exactly equivalent to
if (<cond1>) <stmt1>
else if (<cond2>) <stmt2>
...
else if (<condn>) <stmtn>
[else <dfltstmt>]
Note this means that if all the conditions are false, and there is no default statement, then no assignments are made.
A ``switch'' statement has the form:
switch(<expr>){
<case1> : <stmt1>
<case2> : <stmt2>
...
<casen> : <stmtn>
[default : <dftlstmt>]
}
This is exactly equivalent to:
case{
<expr> in <case1> : <stmt1>
<expr> in <case2> : <stmt2>
...
<expr> in <casen> : <stmtn>
[default : <dftlstmt>]
}
Note that the set inclusion operator ``in'' is used instead of ``=''. This means that each case may be a set of values rather than a single value. For example, if we want a counter that waits for a signal ``start'', counts to seven, asserts a signal ``done'', and resets, we might write:
default
done := 0;
in
switch(count){
0 : if start then next(count) := 1;
1..6 : next(count) := count + 1;
7 : {
next(count) := 0;
done := 1;
}
}