main_axiome ::=
des_unit
des_unit ::=
module_declaration
| udp_declaration
| discipline_declaration
| nature_declaration
| connectmodule_declaration
| connect_specification
module_declaration ::=
module_keyword
IDENTIFIER
[
list_of_ports
]
';'
{
module_item
}
'endmodule'
module_keyword ::=
'module'
| 'macromodule'
list_of_ports ::=
'('
port
{
','
port
}
')'
port ::=
[
port_expression
]
| '.'
IDENTIFIER
'('
[
port_expression
]
')'
port_expression ::=
port_reference
| '{'
port_reference
{
','
port_reference
}
'}'
port_reference ::=
identifier
[
port_reference_end
]
port_reference_end ::=
'['
constant_expression
port_reference_end_end
port_reference_end_end ::=
']'
| ':'
constant_expression
']'
module_item ::=
module_item_declaration
| parameter_override
| continuous_assign
| gate_instantiation
| module_or_udp_instantiation_or_net_discipline_declaration
| specify_block
| initial_construct
| always_construct
| something_beginning_by_analog
something_beginning_by_analog ::=
'analog'
analog_block
| analog_function_declaration
module_item_declaration ::=
parameter_declaration
| input_declaration
| output_declaration
| inout_declaration
| net_declaration
| reg_declaration
| integer_declaration
| real_declaration
| time_declaration
| realtime_declaration
| event_declaration
| task_declaration
| function_declaration
| ground_declaration
| genvar_declaration
| branch_declaration
parameter_override ::=
'defparam'
list_of_def_param_assignments
';'
nature_declaration ::=
'nature'
nature_name
[
nature_descriptions
]
'endnature'
nature_name ::=
IDENTIFIER
[
':'
parent_identifier
]
parent_identifier ::=
IDENTIFIER
[
'.'
pot_or_flow
]
nature_descriptions ::=
nature_description
{
nature_description
}
nature_description ::=
'abstol'
'='
constant_expression
';'
| 'access'
'='
IDENTIFIER
';'
| 'units'
'='
STRING
';'
| 'idt_nature'
'='
IDENTIFIER
';'
| 'ddt_nature'
'='
IDENTIFIER
';'
| IDENTIFIER
'='
constant_expression
';'
nature_attribute ::=
'abstol'
| 'access'
| 'ddt_nature'
| 'idt_nature'
| 'units'
| IDENTIFIER
discipline_declaration ::=
'discipline'
IDENTIFIER
[
discipline_descriptions
]
'enddiscipline'
discipline_descriptions ::=
discipline_description
{
discipline_description
}
discipline_description ::=
net_binding_or_attr_override
| domain_binding
net_binding_or_attr_override ::=
pot_or_flow
nature_binding
| attr_override
nature_binding ::=
IDENTIFIER
';'
attr_override ::=
'.'
nature_description
pot_or_flow ::=
'potential'
| 'flow'
domain_binding ::=
'domain'
'discrete'
| 'continuous'
';'
parameter_declaration ::=
'parameter'
[
opt_type
]
list_of_param_assignments
';'
opt_type ::=
'real'
| 'integer'
list_of_param_assignments ::=
declarator_init
{
','
declarator_init
}
list_of_def_param_assignments ::=
def_param_assignment
{
','
def_param_assignment
}
declarator_init ::=
IDENTIFIER
'='
constant_expression
{
opt_value_range
}
| range
'='
constant_som_concatenation
{
opt_value_range
}
opt_value_range ::=
'from'
value_range_specifier
| 'exclude'
constant_expression
value_range_specifier ::=
start_paren
constant_expression
':'
constant_expression
end_paren
start_paren ::=
'('
| '['
end_paren ::=
')'
| ']'
def_param_assignment ::=
identifier
'='
constant_expression
input_declaration ::=
'input'
[
range
]
list_of_port_identifiers
';'
output_declaration ::=
'output'
[
range
]
list_of_port_identifiers
';'
inout_declaration ::=
'inout'
[
range
]
list_of_port_identifiers
';'
list_of_port_identifiers ::=
IDENTIFIER
{
','
IDENTIFIER
}
reg_declaration ::=
'reg'
[
range
]
list_of_register_identifiers
';'
time_declaration ::=
'time'
list_of_variable_identifiers
';'
integer_declaration ::=
'integer'
list_of_variable_identifiers
';'
list_of_variable_identifiers ::=
variable_name
{
','
variable_name
}
variable_name ::=
IDENTIFIER
[
range
]
real_declaration ::=
'real'
list_of_variable_identifiers
';'
realtime_declaration ::=
'realtime'
list_of_real_identifiers
';'
event_declaration ::=
'event'
list_of_event_identifiers
';'
list_of_real_identifiers ::=
IDENTIFIER
{
','
IDENTIFIER
}
list_of_event_identifiers ::=
IDENTIFIER
{
','
IDENTIFIER
}
list_of_register_identifiers ::=
register_name
{
','
register_name
}
register_name ::=
IDENTIFIER
[
range
]
range ::=
'['
constant_expression
':'
constant_expression
']'
ground_declaration ::=
'ground'
[
range
]
list_of_grounds
';'
list_of_grounds ::=
IDENTIFIER
[
range
]
{
','
IDENTIFIER
[
range
]
}
list_of_nets ::=
IDENTIFIER
[
range
]
{
','
IDENTIFIER
[
range
]
}
branch_declaration ::=
'branch'
list_of_branches
';'
list_of_branches ::=
terminals
list_of_branch_identifiers
terminals ::=
'('
net_or_port_scalar_expression
[
','
net_or_port_scalar_expression
]
')'
list_of_branch_identifiers ::=
IDENTIFIER
[
range
]
{
','
IDENTIFIER
[
range
]
}
genvar_declaration ::=
'genvar'
list_of_genvar_identifiers
';'
list_of_genvar_identifiers ::=
IDENTIFIER
{
','
IDENTIFIER
}
analog_function_declaration ::=
'function'
[
type
]
identifier
';'
function_item_declaration
{
function_item_declaration
}
ad_statement
'endfunction'
type ::=
'real'
| 'integer'
net_declaration ::=
net_type
[
'vectored'
| 'scalared'
]
[
drive_strgth
]
[
range
]
[
delay3
]
list_of_net_ident_or_decl_assign
';'
| 'trireg'
[
'vectored'
| 'scalared'
]
[
'('
charge_strgth
')'
]
[
range
]
[
delay3
]
list_of_net_identifiers
';'
| 'wreal'
list_of_wreal_nets
';'
list_of_wreal_nets ::=
IDENTIFIER
[
range
]
{
','
IDENTIFIER
[
range
]
}
list_of_net_ident_or_decl_assign ::=
IDENTIFIER
list_of_net_ident_or_decl_assign_end
list_of_net_ident_or_decl_assign_end ::=
'='
expression
{
','
net_decl_assignment
}
| {
','
IDENTIFIER
}
net_decl_assignment ::=
IDENTIFIER
'='
expression
net_type ::=
'wire'
| 'tri'
| 'tri1'
| 'supply0'
| 'wand'
| 'triand'
| 'tri0'
| 'supply1'
| 'wor'
| 'trior'
list_of_net_identifiers ::=
IDENTIFIER
{
','
IDENTIFIER
}
drive_strgth ::=
'('
strength_or_high
','
strength_or_high
')'
strength_or_high ::=
strength0
| strength1
| high
strength0 ::=
'supply0'
| 'strong0'
| 'pull0'
| 'weak0'
strength1 ::=
'supply1'
| 'strong1'
| 'pull1'
| 'weak1'
high ::=
'highz1'
| 'highz0'
charge_strgth ::=
'small'
| 'medium'
| 'large'
delay3 ::=
'#'
delay3_end
delay3_end ::=
simple_delay_value
| '('
del_value
[
','
del_value
[
','
del_value
]
]
')'
delay2 ::=
'#'
delay2_end
delay2_end ::=
simple_delay_value
| '('
del_value
[
','
del_value
]
')'
del_value ::=
constant_mintypmax_expression
simple_delay_value ::=
identifier
| number
function_declaration ::=
'function'
[
range_or_type
]
IDENTIFIER
';'
function_item_declaration
{
function_item_declaration
}
statement
'endfunction'
range_or_type ::=
'integer'
| 'real'
| 'realtime'
| 'time'
| range
function_item_declaration ::=
block_item_declaration
| input_declaration
task_declaration ::=
'task'
IDENTIFIER
';'
{
task_argument_declaration
}
[
statement_or_null
]
'endtask'
task_argument_declaration ::=
block_item_declaration
| output_declaration
| input_declaration
| inout_declaration
block_item_declaration ::=
parameter_declaration
| reg_declaration
| integer_declaration
| real_declaration
| time_declaration
| realtime_declaration
| event_declaration
gate_instantiation ::=
n_input_gatetype
n_input_gate_instantiation
';'
| n_output_gatetype
n_output_gate_instantiation
';'
| enable_gatetype
enable_gate_instantiation
';'
| mos_switchtype
[
delay3
]
mos_switch_instance
{
','
mos_switch_instance
}
';'
| pass_switchtype
pass_switch_instance
{
','
pass_switch_instance
}
';'
| pass_en_switchtype
[
delay3
]
pass_en_switch_instance
{
','
pass_en_switch_instance
}
';'
| cmos_switchtype
[
delay3
]
cmos_switch_instance
{
','
cmos_switch_instance
}
';'
| 'pullup'
pullup_instantiation
';'
| 'pulldown'
pulldown_instantiation
';'
n_input_gate_instantiation ::=
'#'
delay2_end
n_input_gate_instance
{
','
n_input_gate_instance
}
| '('
n_input_gate_instantiation_2
| name_of_gate_instance
'('
output_terminal
','
input_terminal
{
','
input_terminal
}
')'
{
','
n_input_gate_instance
}
n_input_gate_instantiation_2 ::=
drv_strength_2
[
delay2
]
n_input_gate_instance
{
','
n_input_gate_instance
}
| output_terminal
','
input_terminal
{
','
input_terminal
}
')'
{
','
n_input_gate_instance
}
drv_strength_2 ::=
strength_or_high
','
strength_or_high
')'
n_output_gate_instantiation ::=
'#'
delay2_end
n_output_gate_instance
{
','
n_output_gate_instance
}
| '('
n_output_gate_instantiation_2
| name_of_gate_instance
'('
output_terminal
','
input_or_output_terminal
{
','
input_or_output_terminal
}
')'
{
','
n_output_gate_instance
}
n_output_gate_instantiation_2 ::=
drv_strength_2
[
delay2
]
n_output_gate_instance
{
','
n_output_gate_instance
}
| output_terminal
','
input_or_output_terminal
{
','
input_or_output_terminal
}
')'
{
','
n_output_gate_instance
}
pullup_instantiation ::=
name_of_gate_instance
'('
output_terminal
')'
{
','
pull_gate_instance
}
| '('
pullup_instantiation_2
pullup_instantiation_2 ::=
pullup_strength_2
pull_gate_instance
{
','
pull_gate_instance
}
| output_terminal
')'
{
','
pull_gate_instance
}
pullup_strength_2 ::=
strength0
[
','
strength1
]
')'
| strength1
[
','
strength0
]
')'
pulldown_instantiation ::=
name_of_gate_instance
'('
output_terminal
')'
{
','
pull_gate_instance
}
| '('
pulldown_instantiation_2
pulldown_instantiation_2 ::=
pulldown_strength_2
pull_gate_instance
{
','
pull_gate_instance
}
| output_terminal
')'
{
','
pull_gate_instance
}
pulldown_strength_2 ::=
strength1
[
','
strength0
]
')'
| strength0
[
','
strength1
]
')'
enable_gate_instantiation ::=
'#'
delay3_end
enable_gate_instance
{
','
enable_gate_instance
}
| '('
enable_gate_instantiation_2
| name_of_gate_instance
'('
output_terminal
','
input_terminal
','
enable_terminal
')'
{
','
enable_gate_instance
}
enable_gate_instantiation_2 ::=
drv_strength_2
[
delay3
]
enable_gate_instance
{
','
enable_gate_instance
}
| output_terminal
','
input_terminal
','
enable_terminal
')'
{
','
enable_gate_instance
}
n_input_gate_instance ::=
[
name_of_gate_instance
]
'('
output_terminal
','
input_terminal
{
','
input_terminal
}
')'
n_output_gate_instance ::=
[
name_of_gate_instance
]
'('
output_terminal
','
input_or_output_terminal
{
','
input_or_output_terminal
}
')'
input_or_output_terminal ::=
expression
enable_gate_instance ::=
[
name_of_gate_instance
]
'('
output_terminal
','
input_terminal
','
enable_terminal
')'
mos_switch_instance ::=
[
name_of_gate_instance
]
'('
output_terminal
','
input_terminal
','
enable_terminal
')'
pass_switch_instance ::=
[
name_of_gate_instance
]
'('
inout_terminal
','
inout_terminal
')'
pass_en_switch_instance ::=
[
name_of_gate_instance
]
'('
inout_terminal
','
inout_terminal
','
enable_terminal
')'
cmos_switch_instance ::=
[
name_of_gate_instance
]
'('
output_terminal
','
input_terminal
','
ncontrol_terminal
','
pcontrol_terminal
')'
pull_gate_instance ::=
[
name_of_gate_instance
]
'('
output_terminal
')'
name_of_gate_instance ::=
IDENTIFIER
[
range
]
pullup_strength ::=
'('
pullup_strength_2
pulldown_strength ::=
'('
pulldown_strength_2
input_terminal ::=
expression
enable_terminal ::=
expression
ncontrol_terminal ::=
expression
pcontrol_terminal ::=
expression
output_terminal ::=
identifier
[
'['
constant_expression
']'
]
inout_terminal ::=
identifier
[
'['
constant_expression
']'
]
n_input_gatetype ::=
'and'
| 'nand'
| 'or'
| 'nor'
| 'xor'
| 'xnor'
n_output_gatetype ::=
'buf'
| 'not'
enable_gatetype ::=
'bufif0'
| 'bufif1'
| 'notif0'
| 'notif1'
mos_switchtype ::=
'nmos'
| 'pmos'
| 'rnmos'
| 'rpmos'
pass_switchtype ::=
'tran'
| 'rtran'
pass_en_switchtype ::=
'tranif0'
| 'tranif1'
| 'rtranif0'
| 'rtranif1'
cmos_switchtype ::=
'cmos'
| 'rcmos'
module_or_udp_instantiation_or_net_discipline_declaration ::=
IDENTIFIER
module_or_udp_instantiation_or_net_discipline_declaration_2
module_or_udp_instantiation_or_net_discipline_declaration_2 ::=
'('
module_or_udp_instantiation_or_net_discipline_declaration_3
| '#'
parameter_value_assignment_2
| simple_delay_value
[
name_of_instance
]
'('
[
module_or_udp_instance_end
]
')'
{
','
module_or_udp_instance
}
';'
| IDENTIFIER
[
range
]
'('
[
module_or_udp_instance_end
]
')'
{
','
module_or_udp_instance
}
| {
','
IDENTIFIER
[
range
]
}
';'
| range
list_of_nets
';'
module_or_udp_instantiation_or_net_discipline_declaration_3 ::=
drv_strength_2
[
'#'
parameter_value_assignment_2
| simple_delay_value
]
module_or_udp_instance
{
','
module_or_udp_instance
}
';'
| [
module_or_udp_instance_end
]
')'
{
','
module_or_udp_instance
}
';'
module_or_udp_instance ::=
[
name_of_instance
]
'('
[
module_or_udp_instance_end
]
')'
module_or_udp_instance_end ::=
named_port_connection
{
','
named_port_connection
}
| ordered_port_connection
{
','
ordered_port_connection
}
parameter_value_assignment_2 ::=
'('
constant_expression
{
','
constant_expression
}
| named_param_override
{
','
named_param_override
}
')'
named_param_override ::=
'.'
IDENTIFIER
'('
constant_expression
')'
name_of_instance ::=
IDENTIFIER
[
range
]
ordered_port_connection ::=
[
net_expression
]
named_port_connection ::=
'.'
IDENTIFIER
'('
[
net_expression
]
')'
net_expression ::=
identifier
[
'['
expression
[
':'
constant_expression
]
']'
]
| net_concatenation
net_concatenation ::=
'{'
net_expression
{
','
net_expression
}
'}'
udp_declaration ::=
primitive_keyword
IDENTIFIER
'('
udp_port_list
')'
';'
udp_port_declaration
{
udp_port_declaration
}
udp_body
'endprimitive'
primitive_keyword ::=
'primitive'
udp_port_list ::=
IDENTIFIER
','
IDENTIFIER
{
','
IDENTIFIER
}
udp_port_declaration ::=
output_declaration
| input_declaration
| reg_declaration
udp_body ::=
combinational_or_sequential_body
combinational_or_sequential_body ::=
[
udp_initial_statement
]
'table'
combinational_or_sequential_entry
{
combinational_or_sequential_entry
}
'endtable'
combinational_or_sequential_entry ::=
level_or_edge_input_list
':'
level_symbol
comb_or_seq_entry_end
comb_or_seq_entry_end ::=
':'
next_state
';'
| ';'
level_or_edge_input_list ::=
{
level_symbol
}
[
edge_indicator
{
level_symbol
}
]
next_state ::=
output_symbol
| '-'
edge_indicator ::=
'('
level_symbol
level_symbol
')'
| edge_symbol
edge_symbol ::=
'R'
| 'F'
| 'P'
| 'N'
| '*'
output_symbol ::=
'0'
| '1'
| 'X'
level_symbol ::=
'0'
| '1'
| 'X'
| '?'
| 'B'
udp_initial_statement ::=
'initial'
identifier
'='
init_val
';'
init_val ::=
BINARY NUMBER
| DECIMAL NUMBER
connectmodule_declaration ::=
'connectmodule'
IDENTIFIER
'('
connect_port
','
connect_port
')'
';'
[
connectmodule_items
]
'endmodule'
connect_port ::=
IDENTIFIER
connectmodule_items ::=
{
connectmodule_item
}
connectmodule_item ::=
module_item
| net_resolution_task
net_resolution_task ::=
'net_resolution'
'('
net_or_port_scalar_expression
','
analog_expression
')'
connect_specification ::=
'connectrules'
IDENTIFIER
';'
{
connect_spec_item
}
'endconnectrules'
';'
connect_spec_item ::=
'connect'
IDENTIFIER
connect_insertion
| connect_resolution
connect_insertion ::=
connect_attributes
[
[
direction
]
IDENTIFIER
','
[
direction
]
IDENTIFIER
]
';'
connect_attributes ::=
[
connect_mode
]
[
'#'
'('
attribute_list
')'
]
connect_mode ::=
'merge[d]'
| 'split'
attribute_list ::=
connect_attribute
{
','
connect_attribute
}
connect_attribute ::=
'.'
IDENTIFIER
'('
expression
')'
direction ::=
'input'
| 'output'
| 'inout'
connect_resolution ::=
discipline_list
'resolveto'
IDENTIFIER
';'
discipline_list ::=
{
','
IDENTIFIER
}
analog_block ::=
analog_statement
analog_statement ::=
analog_seq_block
| analog_contribution_or_procedural_assignment
| ad_conditional_statement
| ad_for_statement
| ad_case_statement
| event_control_statement
| system_task_enble
| ad_loop_statement
ad_statement ::=
seq_block
| procedural_assignment
';'
| ad_conditional_statement
| ad_for_statement
| ad_case_statement
| ad_loop_statement
event_control_statement ::=
evt_control
statement_or_null
ad_expression ::=
expression
ad_loop_statement ::=
'while'
'('
expression
')'
ad_statement
| 'repeat'
'('
expression
')'
ad_statement
analog_seq_block ::=
'begin'
[
':'
IDENTIFIER
{
block_item_declaration
}
]
{
analog_statement
}
'end'
analog_statement_or_null ::=
analog_statement
| ';'
analog_contribution_or_procedural_assignment ::=
identifier
'='
analog_expression
';'
| '['
expression
']'
'='
analog_expression
';'
| '('
analog_signal_list
')'
analog_branch_contribution
| analog_indirect_branch_assignment
analog_branch_contribution ::=
'<+'
analog_expression
';'
analog_indirect_branch_assignment ::=
':'
nexpr
'=='
analog_expression
';'
nexpr ::=
access_function_reference
| 'ddt'
'('
access_function_reference
')'
| 'idt'
'('
access_function_reference
')'
ad_conditional_statement ::=
'if'
'('
ad_expression
')'
analog_statement_or_null
[
'else'
analog_statement_or_null
]
case_kw ::=
'case'
| 'casex'
| 'casez'
ad_case_statement ::=
case_kw
'('
ad_expression
')'
ad_case_item
{
ad_case_item
}
'endcase'
ad_case_item ::=
ad_expression
{
','
ad_expression
}
':'
analog_statement_or_null
| 'default'
[
':'
]
analog_statement_or_null
ad_for_statement ::=
'for'
'('
procedural_assignment
';'
ad_expression
';'
procedural_assignment
')'
analog_statement
lexpr ::=
identifier
| [
'['
expression
']'
]
procedural_assignment ::=
lexpr
'='
expression
global_event ::=
'initial_step'
[
'('
analysis_list
')'
]
| 'final_step'
[
'('
analysis_list
')'
]
analysis_list ::=
analysis_name
{
','
analysis_name
}
analysis_name ::=
STRING
event_function ::=
cross_function
| timer_function
| driver_update_function
cross_function ::=
'cross'
'('
arg_list
')'
timer_function ::=
'timer'
'('
arg_list
')'
driver_update_function ::=
'driver_update'
'('
net_or_port_scalar_expression
')'
continuous_assign ::=
'assign'
[
drive_strgth
]
[
delay3
]
list_of_net_assignments
';'
list_of_net_assignments ::=
net_assignment
{
','
net_assignment
}
net_assignment ::=
net_lvalue
'='
expression
initial_construct ::=
'initial'
statement
always_construct ::=
'always'
statement
statement ::=
assign_or_task_enable
| procedural_continuous_assignment
| procedural_timing_control_statement
| conditional_statement
| case_statement
| loop_statement
| wait_statement
| disable_statement
| event_trigger
| seq_block
| par_block
| system_task_enble
| repeat_statement_or_event_control
statement_or_null ::=
statement
| ';'
assign_or_task_enable ::=
reg_lvalue
assign_or_task_enable_end
assign_or_task_enable_end ::=
'='
[
delay_or_event_control
]
expression
';'
| '<-'
[
delay_or_event_control
]
expression
';'
| [
'('
expression
{
','
expression
}
')'
]
';'
procedural_continuous_assignment ::=
'assign'
reg_assignment
';'
| 'deassign'
reg_lvalue
';'
| 'force'
net_or_reg_assignment
';'
| 'release'
net_or_reg_lvalue
';'
procedural_timing_control_statement ::=
delay_control
| evt_control
statement_or_null
delay_or_event_control ::=
delay_control
| evt_control
| repeat_event_control
repeat_event_control ::=
'repeat'
'('
expression
')'
evt_control
delay_control ::=
'#'
delay_control_end
delay_control_end ::=
simple_delay_value
| '('
mintypmax_expression
')'
evt_control ::=
'@'
event_control_end
event_control_end ::=
identifier
| '('
event_expression
')'
event_expression ::=
primary_event_expression
[
'or'
event_expression
]
primary_event_expression ::=
'posedge'
expression
| 'negedge'
expression
| global_event
| event_function
| expression
conditional_statement ::=
'if'
'('
expression
')'
statement_or_null
[
'else'
statement_or_null
]
case_statement ::=
'case'
'('
expression
')'
case_item
{
case_item
}
'endcase'
| 'casez'
'('
expression
')'
case_item
{
case_item
}
'endcase'
| 'casex'
'('
expression
')'
case_item
{
case_item
}
'endcase'
case_item ::=
expression
{
','
expression
}
':'
statement_or_null
| 'default'
[
':'
]
statement_or_null
loop_statement ::=
'forever'
statement
| 'while'
'('
expression
')'
statement
| 'for'
'('
reg_assignment
';'
expression
';'
reg_assignment
')'
statement
repeat_statement_or_event_control ::=
'repeat'
'('
expression
')'
event_control_or_statement
event_control_or_statement ::=
statement
reg_assignment ::=
reg_lvalue
'='
expression
net_or_reg_assignment ::=
net_or_reg_lvalue
'='
expression
wait_statement ::=
'wait'
'('
expression
')'
statement_or_null
event_trigger ::=
'->'
identifier
';'
disable_statement ::=
'disable'
identifier
';'
seq_block ::=
'begin'
[
':'
identifier
{
block_item_declaration
}
]
{
statement
}
'end'
par_block ::=
'fork'
[
':'
identifier
{
block_item_declaration
}
]
{
statement
}
'join'
system_task_enble ::=
system_task_name
[
'('
[
expression
]
{
','
[
expression
]
}
')'
]
';'
system_task_name ::=
'$'
IDENTIFIER
specify_block ::=
'specify'
{
specify_item
}
'endspecify'
specify_item ::=
specparam_declaration
| path_declaration
| system_timing_check
specparam_declaration ::=
'specparam'
list_of_specparam_assignments
';'
list_of_specparam_assignments ::=
specparam_assignment
{
','
specparam_assignment
}
specparam_assignment ::=
IDENTIFIER
'='
constant_mintypmax_expression
| pulse_control_specparam
pulse_control_specparam ::=
'$PATHPULSE'
pulse_control_specparam_end
pulse_control_specparam_end ::=
'='
'('
limit_value
[
','
limit_value
]
')'
| specify_input_terminal_descriptor
'$'
specify_output_terminal_descriptor
'='
'('
limit_value
[
','
limit_value
]
')'
limit_value ::=
constant_mintypmax_expression
path_declaration ::=
state_dependent_path_declaration
';'
| edge_or_simple_path_declaration
';'
edge_or_simple_path_declaration ::=
path_description
'='
path_delay_value
path_description ::=
'('
[
edge_identifier
]
list_of_path_inputs
[
polarity_operator
]
path_description_end
path_description_end ::=
'=>'
specify_output_terminal_descriptor
| par_edge_sens_path_desc_end
')'
| '*>'
list_of_path_outputs
| full_edge_sens_path_desc_end
')'
par_edge_sens_path_desc_end ::=
'('
specify_output_terminal_descriptor
[
polarity_operator
]
':'
data_source_expression
')'
full_edge_sens_path_desc_end ::=
'('
list_of_path_outputs
[
polarity_operator
]
':'
data_source_expression
')'
list_of_path_inputs ::=
specify_input_terminal_descriptor
{
','
specify_input_terminal_descriptor
}
list_of_path_outputs ::=
specify_output_terminal_descriptor
{
','
specify_output_terminal_descriptor
}
specify_input_terminal_descriptor ::=
identifier
[
'['
constant_expression
[
':'
constant_expression
]
']'
]
specify_output_terminal_descriptor ::=
identifier
[
'['
constant_expression
[
':'
constant_expression
]
']'
]
polarity_operator ::=
'+'
| '-'
path_delay_value ::=
simple_path_delay_expression
list_of_path_delay_expressions_end
| '('
list_of_path_delay_expressions
')'
list_of_path_delay_expressions ::=
path_delay_expression
[
','
path_delay_expression
[
','
path_delay_expression
[
','
path_delay_expression
','
path_delay_expression
','
path_delay_expression
[
','
path_delay_expression
','
path_delay_expression
','
path_delay_expression
','
path_delay_expression
','
path_delay_expression
','
path_delay_expression
]
]
]
]
list_of_path_delay_expressions_end ::=
[
','
path_delay_expression
[
','
path_delay_expression
[
','
path_delay_expression
','
path_delay_expression
','
path_delay_expression
[
','
path_delay_expression
','
path_delay_expression
','
path_delay_expression
','
path_delay_expression
','
path_delay_expression
','
path_delay_expression
]
]
]
]
path_delay_expression ::=
constant_mintypmax_expression
simple_path_delay_expression ::=
identifier
| number
[
':'
constant_expression
':'
constant_expression
]
data_source_expression ::=
expression
edge_identifier ::=
'posedge'
| 'negedge'
state_dependent_path_declaration ::=
'if'
'('
expression
')'
edge_or_simple_path_declaration
| 'ifnone'
edge_or_simple_path_declaration
system_timing_check ::=
'$'
system_timing_check_end
system_timing_check_end ::=
'setup'
'('
timing_check_event
','
timing_check_event
','
timing_check_limit
[
','
notify_register
]
')'
';'
| 'hold'
'('
timing_check_event
','
timing_check_event
','
timing_check_limit
[
','
notify_register
]
')'
';'
| 'period'
'('
controlled_timing_check_event
','
timing_check_limit
[
','
notify_register
]
')'
';'
| 'width'
'('
controlled_timing_check_event
','
timing_check_limit
[
','
constant_expression
[
','
notify_register
]
]
')'
';'
| 'skew'
'('
timing_check_event
','
timing_check_event
','
timing_check_limit
[
','
notify_register
]
')'
';'
| 'recovery'
'('
controlled_timing_check_event
','
timing_check_event
','
timing_check_limit
[
','
notify_register
]
')'
';'
| 'setuphold'
'('
timing_check_event
','
timing_check_event
','
timing_check_limit
','
timing_check_limit
[
','
notify_register
]
')'
';'
| 'nochange'
'('
timing_check_event
','
timing_check_event
','
timing_check_limit
','
timing_check_limit
[
','
notify_register
]
')'
';'
timing_check_event ::=
[
timing_check_event_control
]
specify_terminal_descriptor
[
'&&&'
timing_check_condition
]
specify_terminal_descriptor ::=
specify_input_terminal_descriptor
controlled_timing_check_event ::=
timing_check_event_control
specify_terminal_descriptor
[
'&&&'
timing_check_condition
]
timing_check_event_control ::=
'posedge'
| 'negedge'
| edge_control_specifier
edge_control_specifier ::=
'edge'
'['
edge_descriptor
{
','
edge_descriptor
}
']'
edge_descriptor ::=
'01'
| '10'
| '0x'
| 'x1'
| '1x'
| 'x0'
timing_check_condition ::=
scalar_timing_check_condition
scalar_timing_check_condition ::=
expression
[
scal_ti_che_cond_end
]
scal_ti_che_cond_end ::=
'=='
scalar_constant
| '==='
scalar_constant
| '!='
scalar_constant
| '!=='
scalar_constant
timing_check_limit ::=
mintypmax_expression
scalar_constant ::=
BINARY NUMBER
| DECIMAL NUMBER
notify_register ::=
identifier
analog_expression ::=
expression
analog_operator_arg_list ::=
analog_operator_argument
{
','
analog_operator_argument
}
analog_operator_argument ::=
expression
analog_operator ::=
'ddt'
| 'idt'
| 'idtmod'
| 'absdelay'
| 'transition'
| 'slew'
| 'laplace_zd'
| 'laplace_zp'
| 'laplace_np'
| 'laplace_nd'
| 'zi_zp'
| 'zi_zd'
| 'zi_np'
| 'zi_nd'
| 'last_crossing'
| 'ac_stim'
| 'limexp'
| 'white_noise'
| 'flicker_noise'
| 'noise_table'
genvar_expression ::=
expression
genvar_assignment ::=
identifier
'='
genvar_expression
net_lvalue ::=
simple_or_multiple_concatenation
| identifier
[
net_lvalue_end
]
net_lvalue_end ::=
'['
expression
[
':'
expression
]
']'
reg_lvalue ::=
simple_or_multiple_concatenation
| identifier
[
reg_lvalue_end
]
reg_lvalue_end ::=
'['
expression
[
':'
expression
]
']'
constant_mintypmax_expression ::=
constant_expression
[
':'
constant_expression
':'
constant_expression
]
mintypmax_expression ::=
expression
[
':'
expression
':'
expression
]
expression ::=
logical_or_exp
[
'?'
expression
':'
expression
]
logical_or_exp ::=
logical_and_exp
{
'||'
logical_and_exp
}
logical_and_exp ::=
bit_wise_or_exp
{
'&&'
bit_wise_or_exp
}
bit_wise_or_exp ::=
bit_wise_excl_or_exp
{
'|'
| '~|'
bit_wise_excl_or_exp
}
bit_wise_excl_or_exp ::=
bit_wise_and_exp
{
'^'
| '~^'
| '^~'
bit_wise_and_exp
}
bit_wise_and_exp ::=
equality_expr
{
'&'
| '~&'
equality_expr
}
equality_expr ::=
compare_expr
{
'=='
| '!='
| '==='
| '!=='
compare_expr
}
compare_expr ::=
shift_expr
{
'<'
| '<-'
| '>'
| '>='
shift_expr
}
shift_expr ::=
add_expr
{
'<<'
| '>>'
add_expr
}
add_expr ::=
factor
{
'+'
| '-'
factor
}
factor ::=
operand
{
'*'
| '/'
| '%'
operand
}
operand ::=
[
unary_operator
]
primary
unary_operator ::=
'+'
| '-'
| '!'
| '~'
| '&'
| '~&'
| '|'
| '~|'
| '^'
| '~^'
| '^~'
primary ::=
number
| ident_or_func_call_or_attr_ref
| simple_or_multiple_concatenation
| '('
mintypmax_expression
')'
| system_function_call
| STRING
| 'analysis'
'('
arg_list
')'
| analog_operator
'('
analog_operator_arg_list
')'
| built_in_function
'('
arg_list
')'
ident_or_func_call_or_attr_ref ::=
IDENTIFIER
[
'.'
hierarchical_aux
| '('
args
')'
| '['
expression
[
':'
constant_expression
]
']'
]
hierarchical_aux ::=
ident_or_func_call_or_attr_ref
| pot_or_flow
'.'
nature_attribute
args ::=
expression
{
','
expression
}
| port_scalar_expression
system_function_call ::=
'$'
IDENTIFIER
| 'time'
| 'realtime'
[
'('
[
expression
]
{
','
[
expression
]
}
')'
]
number ::=
DECIMAL NUMBER
| OCTAL NUMBER
| BINARY NUMBER
| HEXADECIMAL NUMBER
| REAL NUMBER
simple_or_multiple_concatenation ::=
'{'
expression
[
som_concatenation_end
]
'}'
som_concatenation_end ::=
','
expression
{
','
expression
}
| '{'
expression
{
','
expression
}
'}'
constant_expression ::=
constant_logical_or_exp
[
'?'
constant_expression
':'
constant_expression
]
constant_logical_or_exp ::=
constant_logical_and_exp
{
'||'
constant_logical_and_exp
}
constant_logical_and_exp ::=
constant_bit_wise_or_exp
{
'&&'
constant_bit_wise_or_exp
}
constant_bit_wise_or_exp ::=
constant_bit_wise_excl_or_exp
{
'|'
| '~|'
constant_bit_wise_excl_or_exp
}
constant_bit_wise_excl_or_exp ::=
constant_bit_wise_and_exp
{
'^'
| '~^'
| '^~'
constant_bit_wise_and_exp
}
constant_bit_wise_and_exp ::=
constant_equality_expr
{
'&'
| '~&'
constant_equality_expr
}
constant_equality_expr ::=
constant_compare_expr
{
'=='
| '!='
| '==='
| '!=='
constant_compare_expr
}
constant_compare_expr ::=
constant_shift_expr
{
'<'
| '<-'
| '>'
| '>='
constant_shift_expr
}
constant_shift_expr ::=
constant_add_expr
{
'<<'
| '>>'
constant_add_expr
}
constant_add_expr ::=
constant_factor
{
'+'
| '-'
constant_factor
}
constant_factor ::=
constant_operand
{
'*'
| '/'
| '%'
constant_operand
}
constant_operand ::=
[
unary_operator
]
constant_primary
| built_in_function
'('
const_arg_list
')'
hierarchical_name ::=
IDENTIFIER
[
'.'
identifier
[
'.'
pot_or_flow
'.'
nature_attribute
]
| pot_or_flow
'.'
nature_attribute
]
constant_primary ::=
number
| 'inf'
| hierarchical_name
| constant_som_concatenation
| STRING
| constant_mintypmax_expression_or_value_range_specifier
constant_mintypmax_expression_or_value_range_specifier ::=
start_paren
constant_expression
')'
| ':'
constant_expression
end_paren
| ':'
constant_expression
')'
constant_som_concatenation ::=
'{'
constant_expression
[
constant_som_concatenation_end
]
'}'
constant_som_concatenation_end ::=
','
constant_expression
{
','
constant_expression
}
| '{'
constant_expression
{
','
constant_expression
}
'}'
net_or_reg_lvalue ::=
simple_or_multiple_concatenation
| identifier
[
net_or_reg_lvalue_end
]
net_or_reg_lvalue_end ::=
'['
expression
[
':'
expression
]
']'
identifier ::=
IDENTIFIER
{
'.'
IDENTIFIER
}
const_arg_list ::=
constant_expression
{
','
constant_expression
}
arg_list ::=
expression
{
','
expression
}
access_function_reference ::=
IDENTIFIER
'('
analog_signal_list
| port_scalar_expression
')'
bvalue ::=
IDENTIFIER
'('
analog_signal_list
')'
analog_signal_list ::=
net_or_port_scalar_expression
[
','
net_or_port_scalar_expression
]
net_or_port_scalar_expression ::=
identifier
[
'['
genvar_expression
']'
]
pvalue ::=
IDENTIFIER
'('
port_scalar_expression
')'
port_scalar_expression ::=
'<'
net_or_port_scalar_expression
'>'
built_in_function ::=
'ln'
| 'log'
| 'exp'
| 'sqrt'
| 'min'
| 'max'
| 'abs'
| 'pow'
| 'ceil'
| 'floor'
| 'sin'
| 'cos'
| 'tan'
| 'asin'
| 'acos'
| 'atan'
| 'atan2'
| 'sinh'
| 'cosh'
| 'tanh'
| 'asinh'
| 'acosh'
| 'atanh'
| 'hypot'