#### Formal Definition

*A specified subset of values of a scalar type.*

#### Simplified Syntax

**range** left_bound **to **right_bound

**range** left_bound **downto **right_bound

**range** **<>**

#### Description

The *range* specifies a subset of values of a scalar type. This range can be null range if the set contains no values. A *range* can be either ascending or descending.

A *range* is called *ascending* if it is specified with the keyword **to **as the direction and the left bound value is smaller than the right bound (otherwise the range is null). A *range* is*descending* if the range is specified with the keyword **downto** as the direction and the left bound is greater than the right bound (otherwise the range is null).

A value X belongs to a range if this range is not a null range and the following relation holds:

lower bound of the range <= X <= upper bound of the range

A range can be undefined. Such a range is used in declaration of unconstrained arrays and is illustrated in example 2.

#### Examples

Example 1

1 **to** 100

7 **downto** 0

5 **to** 0

The first range is an ascending range of the values of integer type. The second range is also of integer type, but descending. Finally, the third range is null.

Example 2

**type** Mem **is** **array** (NATURAL **range** <>) **of** Bit_Vector(7 **downto** 0);

The type Mem is declared as an unconstrained array of bytes (8-bit wide vectors of bits). Note the way an undefined range is declared.

#### Important Notes

· Ranges do not have to be bounded by discrete numbers. Enumeration types can also be used for ranges (for example 'a' to 'z').

## No comments:

## Post a Comment