Aggregate
  
    
    
     
   
   Formal Definition
  
   A basic operation that combines 
   one or more values into a composite value of a record or array type. 
  
   Syntax:
  
   aggregate ::= ( element_association { , element association } ) 
   element_association ::= [choices => ] expression choices ::= 
   choice { | choice } choice ::= simple expression 
            | 
   discrete_range          |
    element_simple_name 
            | others 
  
   Description
  
   The aggregate assigns one 
   or more values to the elements of a record or array creating the 
   composite value of this type. Aggregates are composed of element 
   associations, which associate expressions to elements (one expression 
   per one or more elements). Element associations are specified in 
   parentheses and are separated by commas. 
  
   An expression assigned to an element or elements must be of the same 
   type as the element(s). 
  
   Elements can be referred to either by textual order they have in the 
   object declaration (so called positional 
   associations - example 1) or by its name (named 
   associations - example 2). Both methods can be used in the same 
   aggregate, but in such a case all positional associations appear 
   first (in textual order) and all named associations appearing next 
   (in any order). In any case if the association others 
   is used, it must be the last one in an aggregate. 
  
   The choice clause, denoting selection of element(s) can have any of 
   the following forms: simple expression, discrete range, simple name 
   or reserved word others. 
  
   A value of simple expression can be applied in arrays only and must 
   belong to discrete range of an array type. A simple expression 
   specifies the element at the corresponding index value. Example 2 
   illustrates this concept. 
  
   A discrete range must meet the same conditions as a simple 
   expression. It is useful when several consecutive elements of an 
   array are assigned the same value (example 3). A discrete range 
   serves for defining the set of indexes only and the direction 
   specified or implied has no significance. 
  
   The use of element simple name as a choice is restricted to records 
   only. In this case, each element is identified by its name (Example 4). 
  
   When some elements are assigned different values and the remaining 
   elements will receive some other value, reserved word others 
   can be used to denote those elements (Example 5). Such a choice must 
   be the last in an aggregate and can be used both in arrays and in 
   records, provided that the remaining elements of the records are of 
   the same type. 
  
   The choice others can serve 
   as a very convenient way to assign the same value to all elements of 
   some array, e.g. to reset a wide bus (Example 6). 
  
   If several elements are assigned the same value, a multiple choice 
   can be used. In such a case a bar sign (|) separates references to 
   elements (Example 7). If a multiple choice is used in an array 
   aggregate, it may not be mixed with positional associations. 
  
   Examples
  
   Example 1 
  
   variable Data_1 : BIT_VECTOR 
   (0 to 3) := ('0','1','0','1'); 
  
     
   Bits number 0 and 2 are assigned the value '0', while bits 1 and 3 
   are assigned '1'. All element associations here are positional. 
  
   Example 2 
  
   variable Data_2 : BIT_VECTOR 
   (0 to 3) := (1=>'1',0=>'0',3=>'1',2=>'0'); 
  
     
   Like in the previous example, bits number 0 and 2 are assigned the 
   value '0', while bits 1 and 3 are assigned '1'. The element 
   associations here, however, are named. Note that in this case the 
   elements can be listed in arbitrary order. 
  
   Example 3 
  
   signal Data_Bus : 
   Std_Logic_Vector (15 downto 0); 
   . . . 
   Data_Bus <= (15 downto 8 
   => '0', 7 downto 0 => '1'); 
  
     
   Data_Bus will be assigned the value of "0000000011111111". 
   The first element is associated a value in positional way (thus it is 
   bit number 15), and the other two groups are assigned values using 
   discrete ranges. 
  
   Example 4 
  
   type Status_Record is record 
        Code : Integer; 
        Name : String (1 to 4); 
   end record; 
   variable Status_Var : 
   Status_Record := (Code => 57, Name => "MOVE"); 
  
     
   Choice as an element simple name can be used in record aggregates - 
   each element is associated a value (of the same type as the element itself). 
  
   Example 5 
  
   signal Data_Bus : 
   Std_Logic_Vector (15 downto 0); 
   . . . 
   Data_Bus <= (14 downto 8 
   => '0', others => '1'); 
  
     
   Data_Bus will be assigned the same value as in example 3 
   ("1000000011111111"), but this aggregate is written in more 
   compact way. Apart from bits 14 through 8, which receive value '0' 
   all the others (15 and 7 through 0) will be assigned '1'. Note that 
   the choice others is the last in the aggregate. 
  
   Example 6 
  
   signal Data_Bus : 
   Std_Logic_Vector (15 downto 0); 
   . . . 
   Data_Bus <= (others => 'Z'); 
  
     
   Instead of assigning "ZZZZZZZZZZZZZZZZ" to Data_Bus in 
   order to put it in high impedance state, an aggregate with the others 
   choice representing all the elements can be used. 
  
   Example 7 
  
   signal Data_Bus : 
   Std_Logic_Vector (15 downto 0); 
   . . . 
   Data_Bus <= (15 | 7 downto 
   0 => '1', 
                 others 
   => '0'); 
  
     
   Note the multiple choice specification of the assignment to the bits 
   15 and 7 through 0. The result of the assignment to Data_Bus will be 
   the same as in examples 3 and 5 ("1000000011111111"). 
  
   Important Notes
  
   - 
   
    Associations with elements' simple names are allowed in record 
    aggregates only. 
    - 
   
    Associations with simple expressions or discrete ranges as choices 
    are allowed only in array aggregates. 
    - 
   
    Each element of the value defined by an aggregate must be represented 
    once and only once in the aggregate. 
    - 
   
    Aggregates containing the single element association must always be 
    specified using named association in order to distinguish them from 
    parenthesized expressions. 
    - 
   
    The others choice can be 
    only the last in an aggregate. 
     
  
    
 
    |