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
Last revision Both sides next revision
language:impl [2021/11/21 12:37]
rajit [Refinement]
language:impl [2023/04/09 18:06]
rajit [Overrides]
Line 59: Line 59:
 port list. As an illustration, consider: port list. As an illustration, consider:
  
-<code>+<code act>
 defproc type1 (bool a, b) { ... } defproc type1 (bool a, b) { ... }
 defproc type2 <: type1 (bool c) { ... } defproc type2 <: type1 (bool c) { ... }
Line 72: Line 72:
 the port list example above. the port list example above.
  
-<code>+<code act>
 template<pint N> template<pint N>
 defproc type1 (bool a, b) { ... } defproc type1 (bool a, b) { ... }
Line 82: Line 82:
 However, we can also define ''type2'' in the following manner: However, we can also define ''type2'' in the following manner:
  
-<code>+<code act>
 template<pint N> template<pint N>
 defproc type1 (bool a, b) { ... } defproc type1 (bool a, b) { ... }
Line 103: Line 103:
 as follows: as follows:
  
-<code>+<code act>
 type2<5> x; type2<5> x;
 // x.N, x.M are both accessible! // x.N, x.M are both accessible!
Line 113: Line 113:
 the instance the instance
  
-<code>+<code act>
 type2<5,7> x; type2<5,7> x;
 // x.M=5, x.N=7 // x.M=5, x.N=7
 </code> </code>
  
-would set ''N'' (the new template parameter) to ''5'', and +would set ''M'' (the new template parameter) to ''5'', and 
-''M'' (the parent, still definable parameter) to ''7''. Finally,+''N'' (the parent, still definable parameter) to ''7''. Finally,
 the following would be an error: the following would be an error:
  
-<code>+<code act>
 template<pint N> defproc type1 (bool a, b) { ... } template<pint N> defproc type1 (bool a, b) { ... }
 template<pint N> defproc type2 <: type1 (bool c) { ... } template<pint N> defproc type2 <: type1 (bool c) { ... }
 +</code>
 +<code>
 -[ERROR]-> Duplicate meta-parameter name in port list: `N' -[ERROR]-> Duplicate meta-parameter name in port list: `N'
            Conflict occurs due to parent type: type1            Conflict occurs due to parent type: type1
Line 134: Line 136:
 consider the following example:  consider the following example: 
  
-<code>+<code act>
 defproc buffer (e1of2? l, e1of2! r) defproc buffer (e1of2? l, e1of2! r)
 { {
Line 149: Line 151:
 define a specific implementation as follows: define a specific implementation as follows:
  
-<code>+<code act>
 defproc wchb <: buffer () defproc wchb <: buffer ()
 { {
Line 167: Line 169:
 specification for a buffer at the CHP level of abstraction would be: specification for a buffer at the CHP level of abstraction would be:
  
-<code>+<code act>
 defproc buffer (chan?(bool) l, chan!(bool) r) defproc buffer (chan?(bool) l, chan!(bool) r)
 { {
Line 191: Line 193:
 implementation of the original. The syntax for this is shown below: implementation of the original. The syntax for this is shown below:
  
-<code>+<code act>
 defproc wchb <: buffer() defproc wchb <: buffer()
 +{ e1of2 l, r; } // override block +{ e1of2 l, r; } // override block
Line 210: Line 212:
 only syntax permited is of the form within an override block is only syntax permited is of the form within an override block is
  
-<code>+<code act>
 +{ +{
     type list-of-ids;     type list-of-ids;
Line 243: Line 245:
 representation of the Boolean variable. representation of the Boolean variable.
  
 +=== Overriding conditional instances and templated types ===
  
 +An instance created in a type definition may be created only under certain circumstances. 
 +This can occur in templated types, where template parameters can affect the instances within the type.
 +The override block has the simple syntax shown above. However, to account for conditional instances,
 +the override block directives implicitly check if the instance exists before applying the override. (Note that
 +ACT does not permit different types for the same instance name under different conditions.)
  
 +When a type is being overridden by another, the new implementation may have additional template parameters.
 +The override syntax above requires the complete list of template parameters to be specified. Instead, we also
 +provide a single extension override syntax
  
-===== The ptype ===== +<code act> 
- ++{ 
-**XXX: this section not yet implemented** +    type<param>+ id;   // single ID only 
- +    ... 
-The special ''ptype'' meta-parameter type is used to pass in types + }
-into a process definitionThese types can be used to build a process +
-using other processes as building blocksThe syntax for using a +
-''ptype'' is the following: +
- +
-<code> +
-ptype(foo) x;+
 </code> </code>
- +The ''+'' indicates that this is an extra template parameter that should be added to the existing ones that have already been specified in the instance for ''id''.
-This says that ''x'' is a variable that is a type, with the +
-constraint that ''x'' must satisfy the type signature specified by +
-''foo''. In other words, ''x'' is guaranteed to support all the +
-operations supported by type ''foo'' +
- +
-''ptype'' parameters can also be used in templates. Consider the +
-following example: +
- +
-<code> +
-// A constructor for a datapath with W-bit ripple connections, and +
-// where each component has M inputs and one output +
- +
-// A skeleton +
-template<pint W, pint M> +
-defproc bitslice (e1of2? rin[W]; e1of2! rout[W];  +
-                  e1of2? in[M]; e1of2! out) { } +
- +
-// the constructor +
-template<pint N, pint M, pint W, ptype(bitslice<W,M>) t> +
-defproc build_dpath (e1of2? rin[W]; e1of2! rout[W];  +
-                     e1of2? in[M*N]; e1of2! out[N]) +
-+
-   t x[N]; +
- +
-   // ripple connections +
-   (;i:N-1: x[i].rout=x[i+1].rin); +
-   x[0].rin=rin; +
-   x[N-1].rout=rout;    +
- +
-   // i/o connections +
-   (;i:N: x[i].in[i*M..(i+1)*M-1] = in[i*M..(i+1)*M-1]; +
-          x[i].out=out[i] ) +
-+
- +
-// A one-bit adder +
-defproc onebit (e1of2? in[2], rin[1]; e1of2! out, rout[1]) { ... } +
- +
-defproc ripple_adder (e1of2? a[32], b[32], cin; e1of2! out[32], cout) +
-+
-    build_dpath<32,2,1,onebit> dp; +
- +
-    (; i : 32 : dp.in[2*i] = a[i]; dp.in[2*i+1] = b[i]); +
-    dp.out = out; +
-    dp.rin[0] = cin; +
-    dp.rout[0] = cout +
-+
-</code> +
- +
- +
- +
- +
- +