Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
language:controlflow [2019/04/18 14:22]
rajit
language:controlflow [2022/07/17 08:07]
rajit [Loops]
Line 11: Line 11:
 An example of the loop construct in ACT is shown below: An example of the loop construct in ACT is shown below:
  
-<code>+<code act>
 ( i : 10 : bool x[i..i]; ) ( i : 10 : bool x[i..i]; )
 </code> </code>
Line 20: Line 20:
 range ''0..9''. The body of the loop is the statement ''bool x[i..i];''. The effect of this statement is the same as range ''0..9''. The body of the loop is the statement ''bool x[i..i];''. The effect of this statement is the same as
  
-<code>+<code act>
 bool x[0..0]; bool x[0..0];
 bool x[1..1]; bool x[1..1];
Line 31: Line 31:
 is shown below: is shown below:
  
-<code>+<code act>
 register r[1..8]; register r[1..8];
 (i : 1..8 : r[i](in[i],out[i],control); ) (i : 1..8 : r[i](in[i],out[i],control); )
Line 48: Line 48:
 command language. command language.
  
-<code>+<code act>
 pint i; pint i;
 i=0; i=0;
Line 65: Line 65:
  
 In production rule bodies, the loop In production rule bodies, the loop
-<code>+<code act>
 (&i:3: x[i]) (&i:3: x[i])
 </code> </code>
 expands to expands to
-<code>+<code act>
 x[0] & x[1] & x[2] x[0] & x[1] & x[2]
 </code> </code>
Line 75: Line 75:
 syntax). The ''&'' symbol separates the body of the loop that is syntax). The ''&'' symbol separates the body of the loop that is
 instantiated for different values of ''i'' instantiated for different values of ''i''
 +
 +The syntactic replication construct is written as follows:
 +<code act>
 +(sym id : range : body )
 +</code>
 +The ''sym'' (symbol) might be empty. ''id'' is a variable that can be used in ''body'', and takes the range specified by ''range''. ''range'' can be either an integer-valued expression or ''start .. end'' to indicate a start and end index. The result of the replication is
 +<code act>
 + body(id set to lo) sym body(id set to lo+1) sym ... sym body(id set to hi)
 +</code>
 +where ''lo'' is the starting index of the range, and ''hi'' is the ending index, and ''body(id set to x)'' means ''body'' with the value of ''x'' substituted by the constant ''id''.
  
  
 ===== Selections ===== ===== Selections =====
 +
 +Conditional execution is supported by the selection statement. The
 +syntax of a selection statement is:
 +
 +<code act>
 +[ boolean_expression -> body 
 +[] boolean_expression -> body
 +..
 +]
 +</code>
 +The last Boolean expression in the conditional can be the keyword
 +''else'', which is short-hand for 'all other guards are false.'
 +
 +Any one body whose corresponding Boolean expression is true is
 +executed. For instance, we can create 32 registers with
 +something special for register 0 as follows:
 +
 +<code act>
 +(i : 32 : 
 +    [ i = 0 -> r0(in[i],out[i],control);
 +   [] else -> r[i](in[i],out[i],control);
 +    ]
 +)
 +</code>
 +
 +Boolean expressions can be constructed from Boolean variables, the
 +constants ''true'' and ''false'', and the Boolean operators
 +''&'', ''|'', and ''~'' denoting the and, or, and negation
 +operations respectively.  Numeric expressions can be compared using
 +''<'', ''< ='', ''>'', ''>='', ''='', and ''!='' for
 +the operators less than, less than or equal to, greater than, greater
 +than or equal to, equal to, and not equal to respectively.
 +
 +===== Recursion =====
 +
 +Type definitions can be recursive. For instance, the following
 +definition can be used to create a tree structure.
 +
 +<code act>
 +template<pint N>
 +defproc tree (bool a[N])
 +{
 +  [ N = 1 -> leaf l(a[0]);
 + [] N > 1 -> tree<N/2> t0(a[0..N/2-1]);
 +             tree<N-N/2> t1(a[N/2..N-1]);
 +  ]
 +}
 +</code>
 +