Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
language:types2 [2025/04/21 15:34] – [Functions] rajitlanguage:types2 [2025/09/19 10:22] (current) – [Functions] rajit
Line 199: Line 199:
  
 Note that ACT is very strict about type-checking; so, for example, ''driver<4>'' and ''driver<4,true>'' are //not// treated as the same type even though the default parameter value for the second template parameter is ''true''. Note that ACT is very strict about type-checking; so, for example, ''driver<4>'' and ''driver<4,true>'' are //not// treated as the same type even though the default parameter value for the second template parameter is ''true''.
 +
 +==== Grouping parameters ====
 +
 +Parameters can be combined into [[language:types2:data#parameter_structures|parameter structures]], to organize a large number of parameters and treat them as a group. Parameter structures can also be used as a template parameter types.
 +
 ===== Direction flags  ===== ===== Direction flags  =====
  
Line 311: Line 316:
 ==== Functions ==== ==== Functions ====
  
-In addition to macros, [[language:types2:data#pure_structures|pure structures]] can also include user-defined functions.+In addition to macros, [[language:types2:data#pure_structures|pure structures]] can also include user-defined functions. User-defined functions within pure structures have similar syntax to macros. The following is an illustrative example 
 + 
 +<code act> 
 +deftype signed_int (bool s; int<7> v) 
 +
 +    methods { 
 +        function negative() : bool 
 +        { 
 +            chp { 
 +              self := s 
 +            } 
 +        } 
 +        function mag() : int<7> 
 +        { 
 +            chp { 
 +               self := v 
 +            } 
 +        }        
 +   } 
 +
 +</code> 
 + 
 +With this definition, a user can use method calls to access the fields of the structure as follows: 
 + 
 +<code act> 
 + signed_int s; 
 + ... 
 +chp { 
 +    ...  
 +    [ s.negative() -> log ("Negative number!"
 +    [] else -> log ("Positive number!"
 +    ] 
 +}     
 +... 
 +</code>
  
 +Note that functions cannot have any side-effects; in particular, this means that a function cannot change
 +any of the members of the pure structure. Macros can be used to change those.
  
 +==== Operator overloading ====
  
-=== Operator overloading ===+Functions within pure structures are also used to support operator overloading. In particular, the following function methods are interpreted to be the definition of operator overloading for arithmetic operators: 
 +   * ''plus'', ''minus'', ''mult'', ''div'', ''mod'' : addition, subtraction, multiplication, division, and modulo operators 
 +   * ''uminus'' : unary minus 
 +   * ''and'', ''or'', ''xor'' : logical operators 
 +   * ''lsl'', ''lsr'', ''asr'' : logical shift left, logical shift right, arithmetic shift right 
 +   * ''lt'', ''gt'', ''le'', ''ge'', ''eq'', ''ne'' : comparison operators 
 +   * ''not'' : logical negation 
 +An example of a fixed-point arithmetic datatype is provided in the [[https://github.com/asyncvlsi/stdlib/blob/main/math/fxp.act|ACT standard library]], and serves as a useful reference for using operator overloading. 
 +In the linked example, ''fixpoint<a,b>'' corresponds to a fixed-point number with ''a'' integer bits and ''b'' fractional bits following the standard Q(a,b) format.