BNF

abstract_literal

abstract_literal ::= decimal_literal | based_literal

access_type_definition

access_type_definition ::= access subtype_indication

actual_designator

actual_designator ::=
      expression
    | signal _name
    | variable _name
    | file _name
    | open

actual_parameter_part

actual_parameter_part ::= parameter _association_list

actual_part

actual_part ::=
      actual_designator
    | function _name ( actual_designator )
    | type_mark ( actual_designator )

adding_operator

adding_operator ::= + | - | &

aggregate

aggregate ::=
     ( element_association { , element_association } )

alias_declaration

alias_declaration ::=
     alias alias_designator [ : subtype_indication ] is name [ signature ] ;

alias_designator

alias_designator ::= identifier | character_literal | operator_symbol

allocator

allocator ::=
      new subtype_indication
    | new qualified_expression

architecture_body

architecture_body ::=
     architecture identifier of entity _name is
         architecture_declarative_part
    begin
             architecture_statement_part
    end [architecture] [ architecture _simple_name ] ;

architecture_declarative_part

architecture_declarative_part ::=
     { block_declarative_item }

architecture_statement_part

architecture_statement_part ::=
     { concurrent_statement }

array_type_definition

array_type_definition ::=
     unconstrained_array_definition | constrained_array_definition

assertion

assertion ::=
     assert condition
        [ report expression ]
        [ severity expression ]

assertion_statement

assertion_statement ::= [ label : ] assertion ;

association_element

association_element ::=
     [ formal_part => ] actual_part

association_list

association_list ::=
     association_element { , association_element }

attribute_declaration

attribute_declaration ::=
     attribute identifier : type_mark ;

attribute_designator

attribute_designator ::= attribute _simple_name

attribute_name

attribute_name ::=
     prefix [ signature ] ' attribute_designator [ ( expression ) ]

attribute_specification

attribute_specification ::=
     attribute attribute_designator of entity_specification is expression ;

base

base ::= integer

base_specifier

base_specifier ::= B | O | X

based_integer

based_integer ::=
     extended_digit { [ underline ] extended_digit }

based_literal

based_literal ::=
     base # based_integer [ . based_integer ] # [ exponent ]

basic_character

basic_character ::=
     basic_graphic_character | format_effector

basic_graphic_character

basic_graphic_character ::=
     upper_case_letter | digit | special_character| space_character

basic_identifier

basic_identifier ::= letter { [ underline ] letter_or_digit }

binding_indication

binding_indication ::=
      [ use entity_aspect ]
    [ generic_map_aspect ]
    [ port_map_aspect ]

bit_string_literal

bit_string_literal ::= base_specifier " [ bit_value ] "

bit_value

bit_value ::= extended_digit { [ underline ] extended_digit }

block_configuration

block_configuration ::=
     for block_specification
        { use_clause }
        { configuration_item }
    end for ;

block_declarative_item

block_declarative_item ::=
      subprogram_declaration
    | subprogram_body
    | type_declaration
    | subtype_declaration
    | constant_declaration
    | signal_declaration
    | shared _variable_declaration
    | file_declaration
    | alias_declaration
    | component_declaration
    | attribute_declaration
    | attribute_specification
    | configuration_specification
    | disconnection_specification
    | use_clause
    | group_template_declaration
    | group_ declaration

block_declarative_part

block_declarative_part ::=
     { block_declarative_item }

block_header

block_header ::=
      [ generic_clause
    [ generic_map_aspect ; ] ]
    [ port_clause
    [ port_map_aspect ; ] ]

block_specification

block_specification ::=
      architecture _name
    | block_statement _label
    | generate_statement _label [ ( index_specification ) ]

block_statement

block_statement ::=
      block _label :
        block [ ( guard _expression ) ] [ is ]
            block_header
            block_declarative_part
        begin
             block_statement_part
        end block [ block _label ] ;

block_statement_part

block_statement_part ::=
     { concurrent_statement }

case_statement

case_statement ::=
     case expression is
             case_statement_alternative
            { case_statement_alternative }
        end case [ case_label ] ;

case_statement_alternative

case_statement_alternative ::=
     when choices =>
        sequence_of_statements

character_literal

character_literal ::= ' graphic_character '

choice

choice ::=
      simple_expression
    | discrete_range
    | element _simple_name
    | others

choices

choices ::= choice { | choice }

component_configuration

component_configuration ::=
     for component_specification
        [ binding_indication ; ]
        [ block_configuration ]
    end for ;

component_declaration

component_declaration ::=
     component identifier [ is ]
        [ local _generic_clause ]
        [ local _port_clause ]
    end component [ component _simple_name ] ;

component_instantiation_statement

component_instantiation_statement ::=
      instantiation _label :
         instantiated_unit
            [ generic_map_aspect ]
            [ port_map_aspect ] ;

component_specification

component_specification ::=
     instantiation_list : component _name

composite_type_definition

composite_type_definition ::=
      array_type_definition
    | record_type_definition

concurrent_assertion_statement

concurrent_assertion_statement ::=
     [ label : ] [ postponed ] assertion ;

concurrent_procedure_call_statement

concurrent_procedure_call_statement ::=
     [ label : ] [ postponed ] procedure_call ;

concurrent_signal_assignment_statement

concurrent_signal_assignment_statement ::=
      [ label : ] [ postponed ] conditional_signal_assignment
    | [ label : ] [ postponed ] selected_signal_assignment

concurrent_statement

concurrent_statement ::=
      block_statement
    | process_statement
    | concurrent_procedure_call_statement
    | concurrent_assertion_statement
    | concurrent_signal_assignment_statement
    | component_instantiation_statement
    | generate_statement

condition

condition ::= boolean _expression

condition_clause

condition_clause ::= until condition

conditional_signal_assignment

conditional_signal_assignment ::=
     target <= options conditional_waveforms ;

conditional_waveforms

conditional_waveforms ::=
     { waveform when condition else }
    waveform [ when condition ]

configuration_declaration

configuration_declaration ::=
     configuration identifier of entity _name is
         configuration_declarative_part
        block_configuration
    end [ configuration ] [ configuration _simple_name ] ;

configuration_declarative_item

configuration_declarative_item ::=
      use_clause
    | attribute_specification
    | group_ declaration

configuration_declarative_part

configuration_declarative_part ::=
     { configuration_declarative_item }

configuration_item

configuration_item ::=
      block_configuration
    | component_configuration

configuration_specification

configuration_specification ::=
     for component_specification binding_indication ;

constant_declaration

constant_declaration ::=
     constant identifier_list : subtype_indication [ := expression ] ;

constrained_array_definition

constrained_array_definition ::=
     array index_constraint of element _subtype_indication

constraint

constraint ::=
      range_constraint
    | index_constraint

context_clause

context_clause ::= { context_item }

context_item

context_item ::=
      library_clause
    | use_clause

decimal_literal

decimal_literal ::= integer [ . integer ] [ exponent ]

declaration

declaration ::=
      type_declaration
    | subtype_declaration
    | object_declaration
    | interface_declaration
    | alias_declaration
    | attribute_declaration
    | component_declaration
    | group_template_declaration
    | group_ declaration
    | entity_declaration
    | configuration_declaration
    | subprogram_declaration
    | package_declaration

delay_mechanism

delay_mechanism ::=
      transport
     | [ reject time _expression ] inertial

design_file

design_file ::= design_unit { design_unit }

design_unit

design_unit ::= context_clause library_unit

designator

designator ::= identifier | operator_symbol

direction

direction ::= to | downto

disconnection_specification

disconnection_specification ::=
     disconnect guarded_signal_specification after time _expression ;

discrete_range

discrete_range ::= discrete _subtype_indication | range

element_association

element_association ::=
[ choices => ] expression

element_declaration

element_declaration ::=
     identifier_list : element_subtype_definition ;

element_subtype_definition

element_subtype_definition ::= subtype_indication

entity_aspect

entity_aspect ::=
      entity entity _name [ ( architecture _identifier) ]
    | configuration configuration _name
    | open

entity_class

entity_class ::=
      entity
    | architecture
    | configuration
    | procedure
    | function
    | package
    | type
    | subtype
    | constant
    | signal
    | variable
    | component
    | label
    | literal
    | units
    | group
    | file

entity_class_entry

entity_class_entry ::= entity_class [ <> ]

entity_class_entry_list

entity_class_entry_list ::=
     entity_class_entry { , entity_class_entry }

entity_declaration

entity_declaration ::=
     entity identifier is
         entity_header
        entity_declarative_part
    [ begin
         entity_statement_part ]
    end [ entity ] [ entity _simple_name ] ;

entity_declarative_item

entity_declarative_item ::=
      subprogram_declaration
    | subprogram_body
    | type_declaration
    | subtype_declaration
    | constant_declaration
    | signal_declaration
    | shared _variable_declaration
    | file_declaration
    | alias_declaration
    | attribute_declaration
    | attribute_specification
    | disconnection_specification
    | use_clause
    | group_template_declaration
    | group_ declaration

entity_declarative_part

entity_declarative_part ::=
     { entity_declarative_item }

entity_designator

entity_designator ::= entity_tag [ signature ]

entity_header

entity_header ::=
      [ formal _generic_clause ]
    [ formal _port_clause ]

entity_name_list

entity_name_list ::=
      entity_designator { , entity_designator }
    | others
     | all

entity_specification

entity_specification ::=
     entity_name_list : entity_class

entity_statement

entity_statement ::=
      concurrent_assertion_statement
    | passive _concurrent_procedure_call_statement
    | passive _process_statement

entity_statement_part

entity_statement_part ::=
     { entity_statement }

entity_tag

entity_tag ::= simple_name | character_literal | operator_symbol

enumeration_literal

enumeration_literal ::= identifier | character_literal

enumeration_type_definition

enumeration_type_definition ::=
     ( enumeration_literal { , enumeration_literal } )

exit_statement

exit_statement ::=
     [ label : ] exit [ loop _label ] [ when condition ] ;

exponent

exponent ::= E [ + ] integer | E -integer

expression

expression ::=
      relation { and relation }
    | relation { or relation }
    | relation { xor relation }
    | relation [ nand relation ]
    | relation [ nor relation ]
    | relation { xnor relation }

extended_digit

extended_digit ::= digit | letter

extended_identifier

extended_identifier ::= \ graphic_character { graphic_character } \

factor

factor ::=
      primary [ ** primary ]
    | abs primary
    | not primary

file_declaration

file_declaration ::=
     file identifier_list : subtype_indication [ file_open_information ] ;

file_logical_name

file_logical_name ::= string _expression

file_open_information

file_open_information ::=
     [ open file_open_kind _expression ] is file_logical_name

file_type_definition

file_type_definition ::=
     file of type_mark

floating_type_definition

floating_type_definition ::= range_constraint

formal_designator

formal_designator ::=
      generic _name
    | port _name
    | parameter _name

formal_parameter_list

formal_parameter_list ::= parameter _interface_list

formal_part

formal_part ::=
      formal_designator
    | function _name ( formal_designator )
    | type_mark ( formal_designator )

full_type_declaration

full_type_declaration ::=
     type identifier is type_definition ;

function_call

function_call ::=
      function _name [ ( actual_parameter_part ) ]

generate_statement

generate_statement ::=
      generate _label :
        generation_scheme generate
             [ { block_declarative_item }
        begin ]
            { concurrent_statement }
        end generate [ generate _label ] ;

generation_scheme

generation_scheme ::=
     for generate _parameter_specification
    | if condition

generic_clause

generic_clause ::=
     generic ( generic_list ) ;

generic_list

generic_list ::= generic _interface_list

generic_map_aspect

generic_map_aspect ::=
     generic map ( generic _association_list )

graphic_character

graphic_character ::=
     basic_graphic_character | lower_case_letter | other_special_character

group_constituent

group_constituent ::= name | character_literal

group_constituent_list

group_constituent_list ::= group_constituent { , group_constituent }

group_declaration

group_ declaration ::=
     group identifier : group_ template _name ( group_constituent_list ) ;

group_template_declaration

group_template_declaration ::=
     group identifier is ( entity_class_entry_list ) ;

guarded_signal_specification

guarded_signal_specification ::=
      guarded _signal_list : type_mark

identifier

identifier ::= basic_identifier | extended_identifier

identifier_list

identifier_list ::= identifier { , identifier }

if_statement

if_statement ::=
     [ if _label : ]
        if condition then
             sequence_of_statements
        { elsif condition then
             sequence_of_statements }
        [ else
             sequence_of_statements ]
        end if [ if _label ] ;

incomplete_type_declaration

incomplete_type_declaration ::= type identifier ;

index_constraint

index_constraint ::= ( discrete_range { , discrete_range } )

index_specification

index_specification ::=
      discrete_range
    | static _expression

index_subtype_definition

index_subtype_definition ::= type_mark range <>

indexed_name

indexed_name ::= prefix ( expression { , expression } )

instantiated_unit

instantiated_unit ::=
      [ component ] component _name
    | entity entity _name [ ( architecture _identifier ) ]
    | configuration configuration _name

instantiation_list

instantiation_list ::=
      instantiation _label { , instantiation _label }
    | others
     | all

integer

integer ::= digit { [ underline ] digit }

integer_type_definition

integer_type_definition ::= range_constraint

interface_constant_declaration

interface_constant_declaration ::=
     [ constant ] identifier_list : [ in ] subtype_indication [ := static _expression ]

interface_declaration

interface_declaration ::=
      interface_constant_declaration
    | interface_signal_declaration
    | interface_variable_declaration
    | interface_file_declaration

interface_element

interface_element ::= interface_declaration

interface_file_declaration

interface_file_declaration ::=
     file identifier_list : subtype_indication

interface_list

interface_list ::=
     interface_element { ; interface_element }

interface_signal_declaration

interface_signal_declaration ::=
     [ signal ] identifier_list : [ mode ] subtype_indication [ bus ] [ := static _expression ]

interface_variable_declaration

interface_variable_declaration ::=
     [ variable ] identifier_list : [ mode ] subtype_indication [ := static _expression ]

iteration_scheme

iteration_scheme ::=
      while condition
    | for loop _parameter_specification

label

label ::= identifier

letter

letter ::= upper_case_letter | lower_case_letter

letter_or_digit

letter_or_digit ::= letter | digit

library_clause

library_clause ::= library logical_name_list ;

library_unit

library_unit ::=
      primary_unit
    | secondary_unit

literal

literal ::=
      numeric_literal
    | enumeration_literal
    | string_literal
    | bit_string_literal
    | null

logical_name

logical_name ::= identifier

logical_name_list

logical_name_list ::= logical_name { , logical_name }

logical_operator

logical_operator ::= and | or | nand | nor | xor | xnor

loop_statement

loop_statement ::=
     [ loop _label : ]
        [ iteration_scheme ] loop
             sequence_of_statements
        end loop [ loop _label ] ;

miscellaneous_operator

miscellaneous_operator ::= ** | abs | not

mode

mode ::= in | out | inout | buffer | linkage

multiplying_operator

multiplying_operator ::= * | / | mod | rem

name

name ::=
      simple_name
    | operator_symbol
    | selected_name
    | indexed_name
    | slice_name
    | attribute_name

next_statement

next_statement ::=
     [ label : ] next [ loop _label ] [ when condition ] ;

null_statement

null_statement ::= [ label : ] null ;

numeric_literal

numeric_literal ::=
      abstract_literal
    | physical_literal

object_declaration

object_declaration ::=
      constant_declaration
    | signal_declaration
    | variable_declaration
    | file_declaration

operator_symbol

operator_symbol ::= string_literal

options

options ::= [ guarded ] [ delay_mechanism ]

package_body

package_body ::=
     package body package _simple_name is
         package_body_declarative_part
    end [ package_body ] [ package _simple_name ] ;

package_body_declarative_item

package_body_declarative_item ::=
      subprogram_declaration
    | subprogram_body
    | type_declaration
    | subtype_declaration
    | constant_declaration
    | shared _variable_declaration
    | file_declaration
    | alias_declaration
    | use_clause
    | group_template_declaration
    | group_ declaration

package_body_declarative_part

package_body_declarative_part ::=
     { package_body_declarative_item }

package_declaration

package_declaration ::=
     package identifier is
         package_declarative_part
    end [ package ] [ package _simple_name ] ;

package_declarative_item

package_declarative_item ::=
      subprogram_declaration
    | type_declaration
    | subtype_declaration
    | constant_declaration
    | signal_declaration
    | shared _variable_declaration
    | file_declaration
    | alias_declaration
    | component_declaration
    | attribute_declaration
    | attribute_specification
    | disconnection_specification
    | use_clause
    | group_template_declaration
    | group_ declaration

package_declarative_part

package_declarative_part ::=
     { package_declarative_item }

parameter_specification

parameter_specification ::=
     identifier in discrete_range

physical_literal

physical_literal ::= [ abstract_literal ] unit _name

physical_type_definition

physical_type_definition ::=
     range_constraint
        units
             base_unit_declaration
            { secondary_unit_declaration }
        end units [ physical_type _simple_name ]

port_clause

port_clause ::=
     port ( port_list ) ;

port_list

port_list ::= port _interface_list

port_map_aspect

port_map_aspect ::=
     port map ( port _association_list )

prefix

prefix ::=
      name
    | function_call

primary

primary ::=
      name
    | literal
    | aggregate
    | function_call
    | qualified_expression
    | type_conversion
    | allocator
    | ( expression )

primary_unit

primary_unit ::=
      entity_declaration
    | configuration_declaration
    | package_declaration

primary_unit_declaration

primary_unit_declaration ::= identifier ;

procedure_call

procedure_call ::=
      procedure _name [ ( actual_parameter_part ) ]

procedure_call_statement

procedure_call_statement ::= [ label : ] procedure_call ;

process_declarative_item

process_declarative_item ::=
      subprogram_declaration
    | subprogram_body
    | type_declaration
    | subtype_declaration
    | constant_declaration
    | variable_declaration
    | file_declaration
    | alias_declaration
    | attribute_declaration
    | attribute_specification
    | use_clause
    | group_template_declaration
    | group_ declaration

process_declarative_part

process_declarative_part ::=
     { process_declarative_item }

process_statement

process_statement ::=
      [ process _label : ]
        [ postponed ] process [ ( sensitivity_list ) ] [ is ]
            process_declarative_part
        begin
             process_statement_part
        end [ postponed ] process [ process _label ] ;

process_statement_part

process_statement_part ::=
     { sequential_statement }

qualified_expression

qualified_expression ::=
    type_mark ' ( expression )
    | type_mark ' aggregate

range

range ::=
      range _attribute_name
    | simple_expression direction simple_expression

range_constraint

range_constraint ::= range range

record_type_definition

record_type_definition ::=
     record
         element_declaration
        { element_declaration }
    end record [ record_type _simple_name ]

relation

relation ::=
     shift_expression [ relational_operator shift_expression ]

relational_operator

relational_operator ::= = | /= | < | <=|> | >=

report_statement

report_statement ::=
    [ label : ]
        report expression
            [ severity expression ] ;

return_statement

return_statement ::=     [ label ] return [ expression ] ;

scalar_type_definition

scalar_type_definition ::=
      enumeration_type_definition
    | integer_type_definition
    | floating_type_definition
    | physical_type_definition

secondary_unit

secondary_unit ::=
      architecture_body
    | package_body

secondary_unit_declaration

secondary_unit_declaration ::= identifier = physical_literal ;

selected_name

selected_name ::= prefix . suffix

selected_signal_assignment

selected_signal_assignment ::=
     with expression select
         target <= options selected_waveforms ;

selected_waveforms

selected_waveforms ::=
     { waveform when choices , }
    waveform when choices

sensitivity_clause

sensitivity_clause ::= on sensitivity_list

sensitivity_list

sensitivity_list ::= signal _name { , signal _name }

sequence_of_statements

sequence_of_statements ::=
     { sequential_statement }

sequential_statement

sequential_statement ::=
      wait_statement
    | assertion_statement
    | report_statement
    | signal_assignment_statement
    | variable_assignment_statement
    | procedure_call_statement
    | if_statement
    | case_statement
    | loop_statement
    | next_statement
    | exit_statement
    | return_statement
    | null_statement

shift_expression

shift_expression ::=
     simple_expression [ shift_operator simple_expression ]

shift_operator

shift_operator ::= sll | srl | sla | sra | rol | ror

sign

sign ::= + | -

signal_assignment_statement

signal_assignment_statement ::=
     [ label : ] target <= [ delay_mechanism ] waveform ;

signal_declaration

signal_declaration ::=
     signal identifier_list : subtype_indication [ signal_kind ] [ := expression ] ;

signal_kind

signal_kind ::= register | bus

signal_list

signal_list ::=
      signal _name { , signal _name }
    | others
     | all

signature

signature ::= [ [ type_mark { , type_mark } ] [ return type_mark ] ]

simple_expression

simple_expression ::=
     [ sign ] term { adding_operator term }

simple_name

simple_name ::= identifier

slice_name

slice_name ::= prefix ( discrete_range )

string_literal

string_literal ::= " { graphic_character } "

subprogram_body

subprogram_body ::=
     subprogram_specification is
         subprogram_declarative_part
    begin
         subprogram_statement_part
    end [ subprogram_kind ] [ designator ] ;

subprogram_declaration

subprogram_declaration ::=
     subprogram_specification ;

subprogram_declarative_item

subprogram_declarative_item ::=
      subprogram_declaration
    | subprogram_body
    | type_declaration
    | subtype_declaration
    | constant_declaration
    | variable_declaration
    | file_declaration
    | alias_declaratio
    | attribute_declaration
    | attribute_specification
    | use_clause
    | group_template_declaration
    | group_ declaratio

subprogram_declarative_part

subprogram_declarative_part ::=
     { subprogram_declarative_item }

subprogram_kind

subprogram_kind ::= procedure | function

subprogram_specification

subprogram_specification ::=
     procedure designator [ ( formal_parameter_list ) ]
    | [ pure | impure ] function designator [ ( formal_parameter_list ) ]
        return type_mark

subprogram_statement_part

subprogram_statement_part ::=
     { sequential_statement }

subtype_declaration

subtype_declaration ::=
     subtype identifier is subtype_indication ;

subtype_indication

subtype_indication ::=
     [ resolution_function _name ] type_mark [ constraint ]

suffix

suffix ::=
      simple_name
    | character_literal
    | operator_symbol
    | all

target

target ::=
      name
    | aggregate

term

term ::=
     factor { multiplying_operator factor }

timeout_clause

timeout_clause ::= for time _expression

type_conversion

type_conversion ::= type_mark ( expression )

type_declaration

type_declaration ::=
      full_type_declaration
    | incomplete_type_declaration

type_definition

type_definition ::=
      scalar_type_definition
    | composite_type_definition
    | access_type_definition
    | file_type_definition

type_mark

type_mark ::=
      type _name
    | subtype _name

unconstrained_array_definition

unconstrained_array_definition ::=
     array ( index_subtype_definition { , index_subtype_definition } )
        of element _subtype_indication

use_clause

use_clause ::=
     use selected_name { , selected_name } ;

variable_assignment_statement

variable_assignment_statement ::=
     [ label : ] target := expression ;

variable_declaration

variable_declaration ::=
     [ shared ] variable identifier_list : subtype_indication [ := expression ] ;

wait_statement

wait_statement ::=
     [ label : ] wait [ sensitivity_clause ] [ condition_clause ] [ timeout_clause ] ;

waveform

waveform ::=
      waveform_element { , waveform_element }
    | unaffected

waveform_element

waveform_element ::=
      value _expression [ after time _expression ]
    | null [ after time _expression ]