~~NOTOC~~ ====== 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 ]