|
LCS-2016-080a |
|
2 |
|
18-Dec-16 |
|
Ballot |
|
Brent Hayhoe |
|
|
|
Deferred Shared Variables |
|
Enable a shared variable declaration within the same package as its associated protected type declaration |
|
LCS-2016-080b |
package_declaration ::=
package identifier is
package_header
package_declarative_part
end [ package ] [ package_simple_name ] ;
package_header ::=
[ generic_clause
[ generic_map_aspect ; ] ]
package_declarative_part ::=
{ general_package_declarative_itempart }
| { concurrent_package_declarative_part }
| { sequential_package_declarative_part }
general_package_declarative_part ::=
general_package_declarative_item
concurrent_package_declarative_part ::=
general_package_declarative_item
| concurrent_package_declarative_item
sequential_package_declarative_part ::=
general_package_declarative_item
| sequential_package_declarative_item
general_package_declarative_item ::=
subprogram_declaration
| subprogram_instantiation_declaration
| package_declaration
| package_instantiation_declaration
| nonprotected_type_declaration
| subtype_declaration
| protected_type_declaration
| normal_constant_declaration
| deferred_constant_declaration
| signal_declaration
| variable_declaration
| file_declaration
| alias_declaration
| component_declaration
| attribute_declaration
| attribute_specification
| disconnection_specification
| use_clause
| group_template_declaration
| group_declaration
| PSL_Property_Declaration
| PSL_Sequence_Declaration
concurrent_package_declarative_item ::=
normal_signal_declaration
| deferred_signal_declaration
| normal_shared_variable_declaration
| deferred_shared_variable_declaration
| disconnection_specification
| PSL_Property_Declaration
| PSL_Sequence_Declaration
sequential_package_declarative_item ::=
normal_variable_declaration
| deferred_variable_declaration
-- A package declaration that needs a package body:
package TriState is
type Tri is ('0', '1', 'Z', 'E');
function BitVal (Value: Tri) return Bit;
function TriVal (Value: Bit) return Tri;
type TriVector is array (Natural range <> of Tri;
function Resolve (Sources: TriVector) return Tri;
constant TriA_c : Tri;
deferred constant TriB_c : Tri;
type Tri_pt is
protected
impure function Get return Tri;
procedure Put (Value : Tri);
end protected Tri_pt;
deferred shared variable Tri_sv : Tri_pt;
deferred signal Tri_s : Tri;
end package TriState;
-- or:
package TriState2 is
type Tri is ('0', '1', 'Z', 'E');
function BitVal (Value: Tri) return Bit;
function TriVal (Value: Bit) return Tri;
type TriVector is array (Natural range <> of Tri;
function Resolve (Sources: TriVector) return Tri;
constant TriA_c : Tri;
deferred constant TriB_c : Tri;
type Tri_pt is
protected
impure function Get return Tri;
procedure Put (Value : Tri);
end protected Tri_pt;
deferred variable Tri1_v : Tri;
deferred variable Tri2_v : Tri_pt;
end package TriState2;
package_body ::=
package body package_simple_name is
package_body_declarative_part
end [ package body ] [ package_simple_name ] ;
package_body_declarative_part ::=
{ general_package_body_declarative_itempart }
| { concurrent_package_body_declarative_part }
| { sequential_package_body_declarative_part }
general_package_body_declarative_part ::=
general_package_body_declarative_item
concurrent_package_body_declarative_part ::=
general_package_body_declarative_item
| concurrent_package_body_declarative_item
sequential_package_body_declarative_part ::=
general_package_body_declarative_item
| sequential_package_body_declarative_item
general_package_body_declarative_item ::=
subprogram_declaration
| subprogram_body
| subprogram_instantiation_declaration
| package_declaration
| package_body
| package_instantiation_declaration
| nonprotected_type_declaration
| subtype_declaration
| protected_type_declaration
| protected_type_body
| normal_constant_declaration
| variable_declaration
| file_declaration
| alias_declaration
| component_declaration
| attribute_declaration
| attribute_specification
| use_clause
| group_template_declaration
| group_declaration
concurrent_package_body_declarative_item ::=
normal_signal_declaration
| normal_shared_variable_declaration
sequential_package_body_declarative_item ::=
normal_variable_declaration
constant_declaration ::=
normal_constant_declaration
| deferred_constant_declaration
normal_constant_declaration ::=
constant identifier_list : constant_subtype_indication [ := expression ] ;
deferred_constant_declaration ::=
[ deferred ] constant identifier_list : constant_subtype_indication ;
constant TOLER: DISTANCE := 1.5 nm;
constant PI: REAL := 3.141592;
constant CYCLE_TIME: TIME := 100 ns;
constant Propagation_Delay: DELAY_LENGTH; -- A deferred constant.
deferred constant Propagation_Delay: DELAY_LENGTH; -- A deferred constant.
signal_declaration ::=
normal_signal_declaration
| deferred_signal_declaration
normal_signal_declaration ::=
signal identifier_list : signal_subtype_indication [ signal_kind ] [ := expression ] ;
deferred_signal_declaration ::=
deferred signal identifier_list : signal_subtype_indication [ signal_kind ] ;
signal_kind ::= register | bus
signal S: STANDARD.BIT_VECTOR (1 to 10);
signal CLK1, CLK2: TIME;
signal OUTPUT: WIRED_OR MULTI_VALUED_LOGIC;
deferred signal INPUT: BIT; -- A deferred signal.
variable_declaration ::=
local_variable_declaration
| shared_variable_declaration
local_variable_declaration ::=
normal_variable_declaration
| deferred_variable_declaration
normal_variable_declaration ::=
[ shared ] variable identifier_list : nonprotected_subtype_indication [ := expression ] ;
| variable identifier_list : protected_subtype_indication ;
deferred_variable_declaration ::=
deferred variable identifier_list : subtype_indication
shared_variable_declaration ::=
normal_shared_variable_declaration
| deferred_shared_variable_declaration
normal_shared_variable_declaration ::=
shared variable identifier_list : protected_subtype_indication ;
deferred_shared_variable_declaration ::=
deferred shared variable identifier_list : protected_subtype_indication ;
variable INDEX: INTEGER range 0 to 99 := 0;
-- Initial value is determined by the initial value expression
variable COUNT: POSITIVE;
-- Initial value is POSITIVE'LEFT; that is,1
variable MEMORY: BIT_MATRIX (0 to 7, 0 to 1023);
-- Initial value is the aggregate of the initial values of each element
shared variable Counter: SharedCounter;
-- See 5.6.2 and 5.6.3 for the definitions of SharedCounter
shared variable addend, augend, result: ComplexNumber;
-- See 5.6.2 and 5.6.3 for the definition of ComplexNumber
variable bit_stack: VariableSizeBitArray;
-- See 5.6.2 and 5.6.3 for the definition of VariableSizeBitArray;
type SharedCount is protected
function get return COUNT;
procedure set(value : COUNT);
end protected SharedCount;
-- Protected type for deferred variable and deferred shared variable
deferred variable COUNT: POSITIVE; -- A deferred variable.
deferred variable COUNT2: SharedCount; -- A deferred variable.
deferred shared variable COUNT3: SharedCount; -- A deferred shared variable.
-- Methods and variable(s) defined in the package body
interface_object_declaration ::=
interface_constant_declaration
| interface_signal_declaration
| interface_variable_declaration
| interface_file_declaration
interface_constant_declaration ::=
[ constant ] identifier_list : [ in ] constant_subtype_indication [ := static_expression ]
interface_signal_declaration ::=
[ signal ] identifier_list : [ mode ] signal_subtype_indication [ bus ] [ := static_expression ]
interface_variable_declaration ::=
[ variable ] identifier_list : [ mode ] nonprotected_subtype_indication [ := static_expression ]
| [ variable ] identifier_list : inout protected_subtype_indication
interface_file_declaration ::=
file identifier_list : file_subtype_indication
mode ::= in | out | inout | buffer | linkage
constant_declaration ::= [§ 6.4.2.2]
constant identifier_list : subtype_indication [ := expression ] ;
normal_constant_declaration
| deferred_constant_declaration
deferred_constant_declaration ::= [§ 6.4.2.2]
[ deferred ] constant identifier_list : constant_subtype_indication ;
deferred_shared_variable_declaration ::= [§ 6.4.2.4]
deferred shared variable identifier_list : protected_subtype_indication ;
deferred_signal_declaration ::= [§ 6.4.2.3]
deferred signal identifier_list : signal_subtype_indication [ signal_kind ] ;
deferred_variable_declaration ::= [§ 6.4.2.4]
deferred variable identifier_list : subtype_indication ;
interface_constant_declaration ::= [§ 6.5.2]
[ constant ] identifier_list : [ in ] constant_subtype_indication [ := static_expression ]
interface_signal_declaration ::= [§ 6.5.2]
[ signal ] identifier_list : [ mode ] signal_subtype_indication [ bus ] [ := static_expression ]
interface_variable_declaration ::= [§ 6.5.2]
[ variable ] identifier_list : [ mode ] nonprotected_subtype_indication [ := static_expression ]
| [ variable ] identifier_list : inout protected_subtype_indication
local_variable_declaration ::= [§ 6.4.2.4]
normal_variable_declaration
| deferred_variable_declaration
normal_constant_declaration ::= [§ 6.4.2.2]
constant identifier_list : constant_subtype_indication := expression ;
normal_shared_variable_declaration ::= [§ 6.4.2.4]
shared variable identifier_list : protected_subtype_indication ;
normal_signal_declaration ::= [§ 6.4.2.3]
signal identifier_list : signal_subtype_indication [ signal_kind ] [ := expression ] ;
normal_variable_declaration ::= [§ 6.4.2.4]
variable identifier_list : nonprotected_subtype_indication [ := expression ] ;
| variable identifier_list : protected_subtype_indication ;
shared_variable_declaration ::= [§ 6.4.2.4]
normal_shared_variable_declaration
| deferred_shared_variable_declaration
signal_declaration ::= [§ 6.4.2.3]
signal identifier_list : subtype_indication [ signal_kind ] [ := expression ] ;
normal_signal_declaration
| deferred_signal_declaration
variable_declaration ::= [§ 6.4.2.4]
[ shared ] variable identifier_list : subtype_indication [ := expression ] ;
local_variable_declaration
| shared_variable_declaration
constant_declaration ::= normal_constant_declaration | deferred_constant_declaration normal_constant_declaration ::= constant identifier_list : constant_ subtype_indication [ := expression ] ; deferred_constant_declaration ::= [ deferred ] constant identifier_list : constant_subtype_indication ;