%{ /************************************************************************** ** Official GCF Version 1.2 basic yacc grammar ** Last changed Fri Aug 22 11:26:20 PDT 1997 *************************************************************************/ #include #include "lex.h" %} /* * A minimal set of value types for the value stack, required for * communication of values from the lexer to yacc rules. More types * would be needed in a real GCF parser for communication of values * between rules. */ %union { char character; long integer; double real; char *string; } /* * tokens and token types */ %token ANYEDGE_TOKEN %token ARC_TOKEN %token AREA_SCALE_TOKEN %token AREA_TOKEN %token ARRIVAL_TOKEN %token AVERAGE_CELL_POWER_TOKEN %token AVERAGE_NET_POWER_TOKEN %token BORROW_LIMIT_TOKEN %token CAP_SCALE_TOKEN %token CASE_TOKEN %token CELL_TOKEN %token CELL_TYPE_TOKEN %token CLOCK_DELAY_TOKEN %token CLOCK_GROUP_TOKEN %token CLOCK_TOKEN %token CONSTANT_TOKEN %token CONSTRAINTS_TOKEN %token DATE_TOKEN %token DELIMITERS_TOKEN %token DEPARTURE_TOKEN %token DERIVED_WAVEFORM_TOKEN %token DESIGN_TOKEN %token DISABLE_TOKEN %token DNUMBER_TOKEN %token DRIVER_CELL_TOKEN %token DRIVER_STRENGTH_TOKEN %token EDGE_PATTERN_TOKEN %token ENVIRONMENT_TOKEN %token EXCEPTIONS_TOKEN %token EXTENSION_TOKEN %token EXTERNAL_DELAY_TOKEN %token EXTERNAL_FANOUT_TOKEN %token EXTERNAL_LOAD_TOKEN %token FANOUT_TOKEN %token FROM_TOKEN %token GCF_TOKEN %token GLOBALS_SUBSET_TOKEN %token GLOBALS_TOKEN %token HEADER_TOKEN %token HOLD_TOKEN %token IDENTIFIER_TOKEN %token INPUT_SLEW_TOKEN %token INSERTION_DELAY_TOKEN %token INSTANCE_TOKEN %token INTERNAL_FANOUT_TOKEN %token INTERNAL_LOAD_TOKEN %token INTERNAL_SLEW_TOKEN %token INUMBER_TOKEN %token LENGTH_SCALE_TOKEN %token LEVEL_TOKEN %token LIBRARY_TOKEN %token LOAD_TOKEN %token MASTER_TOKEN %token MAX_TRANSITION_TIME_TOKEN %token META_TOKEN %token MULTI_CYCLE_TOKEN %token NAME_PREFIXES_TOKEN %token NEGEDGE_TOKEN %token NUMBER_TOKEN %token OPERATING_CONDITIONS_TOKEN %token PARALLEL_DRIVERS_TOKEN %token PARASITICS_TOKEN %token PATH_DELAY_TOKEN %token PATH_TOKEN %token PERIOD_MULTIPLIER_TOKEN %token PHASE_SHIFT_TOKEN %token POROSITY_TOKEN %token POSEDGE_TOKEN %token POWER_SCALE_TOKEN %token POWER_TOKEN %token PRECEDENCE_TOKEN %token PRIMITIVE_AREA_TOKEN %token PROCESS_TOKEN %token PROGRAM_TOKEN %token QSTRING_TOKEN %token RES_SCALE_TOKEN %token RNUMBER_TOKEN %token SETUP_TOKEN %token SKEW_ADJUSTMENT_TOKEN %token SKEW_TOKEN %token SLEW_TOKEN %token SOURCE_TOKEN %token SUBSET_TOKEN %token TARGET_TOKEN %token TEMPERATURE_TOKEN %token THRU_ALL_TOKEN %token THRU_TOKEN %token TIME_SCALE_TOKEN %token TIMING_TOKEN %token TOTAL_AREA_TOKEN %token TO_TOKEN %token VERSION_TOKEN %token VIEW_TOKEN %token VOLTAGE_SCALE_TOKEN %token VOLTAGE_TOKEN %token VOLTAGE_THRESHOLD_TOKEN %token WAVEFORM_TOKEN /* * The lexer itself should handle included files, so that * yacc only sees the contents of the included file. Therefore, * the include constructs present in the GCF BNF are not included * in the yacc grammar. */ %start gcf_file %% /* the rules ... */ gcf_file : '(' GCF_TOKEN gcf_header gcf_section_list ')' ; gcf_header : '(' HEADER_TOKEN version opt_header_info_list ')' ; gcf_section_list : gcf_section_list gcf_section | gcf_section ; gcf_section : globals | cell_spec | extension | meta_data ; version : '(' VERSION_TOKEN QSTRING_TOKEN ')' ; opt_header_info_list : header_info_list | /* empty */ ; header_info_list : header_info_list header_info | header_info ; header_info : design_name | date | program | delimiters | time_scale | cap_scale | res_scale | length_scale | area_scale | voltage_scale | power_scale | extension ; design_name : '(' DESIGN_TOKEN QSTRING_TOKEN ')' ; date : '(' DATE_TOKEN QSTRING_TOKEN ')' ; program : '(' PROGRAM_TOKEN program_name program_version program_company ')' ; program_name : QSTRING_TOKEN ; program_version : QSTRING_TOKEN ; program_company : QSTRING_TOKEN ; delimiters : '(' DELIMITERS_TOKEN QSTRING_TOKEN ')' ; time_scale : '(' TIME_SCALE_TOKEN multiplier ')' ; cap_scale : '(' CAP_SCALE_TOKEN multiplier ')' ; res_scale : '(' RES_SCALE_TOKEN multiplier ')' ; length_scale : '(' LENGTH_SCALE_TOKEN multiplier ')' ; area_scale : '(' AREA_SCALE_TOKEN multiplier ')' ; voltage_scale : '(' VOLTAGE_SCALE_TOKEN multiplier ')' ; power_scale : '(' POWER_SCALE_TOKEN multiplier ')' ; multiplier : number ; /* * The assumption here is that the actions for the extension will * cooperate with the lexer to hand off the extension constructs * which follow the QSTRING_TOKEN to a separate (tool-specific) * grammar. That grammar and the lexer should detect when the last * extension construct has been read, and return the final closing * parenthesis back to this grammar. */ extension : '(' EXTENSION_TOKEN QSTRING_TOKEN { /* special processing here */ if ( gcfLexSkipToClosingParen() ) { YYABORT; } } ')' ; label_id_list : label_id_list label_id | label_id ; opt_label : label | /* empty */ ; label : label_id ':' ; label_id : IDENTIFIER_TOKEN | QSTRING_TOKEN ; meta_data : '(' level_one meta_data_1_list ')' ; level_one : LEVEL_TOKEN dnumber { if ( $2 != 1 ) { yyerror( "Invalid level number: must be 1 in GCF 1.1" ); YYABORT; } } ; meta_data_1_list : meta_data_1_list meta_data_1 | meta_data_1 ; meta_data_1 : '(' META_TOKEN meta_construct_list ')' ; meta_construct_list : meta_construct_list meta_construct | meta_construct ; meta_construct : precedence | meta_reserved ; precedence : '(' PRECEDENCE_TOKEN '(' label_id label_id_list ')' ')' ; meta_reserved : '(' IDENTIFIER_TOKEN ')' ; min_and_max : number number ; r_min_and_max : rnumber rnumber ; min_max : number number | number ; r_min_max : rnumber | rnumber rnumber ; rise_fall_min_max : number | number number | number number number number ; r_rise_fall_min_max : rnumber | rnumber rnumber | rnumber rnumber rnumber rnumber ; rise_fall : number | number number ; r_rise_and_fall : rnumber rnumber ; rnumber : RNUMBER_TOKEN | NUMBER_TOKEN | INUMBER_TOKEN | DNUMBER_TOKEN ; number : NUMBER_TOKEN | INUMBER_TOKEN | DNUMBER_TOKEN ; dnumber : DNUMBER_TOKEN ; inumber : INUMBER_TOKEN | DNUMBER_TOKEN ; globals : '(' GLOBALS_TOKEN globals_subset_list ')' ; globals_subset_list : globals_subset_list globals_subset | globals_subset ; globals_subset : env_globals_subset | timing_globals_subset | extension | meta_data ; env_globals_subset : '(' GLOBALS_SUBSET_TOKEN ENVIRONMENT_TOKEN env_globals_body ')' ; env_globals_body : env_globals_spec_list ; env_globals_spec_list : env_globals_spec_list env_globals_spec | env_globals_spec ; env_globals_spec : env_globals_spec_0 | env_globals_spec_1 ; env_globals_spec_0 : process | voltage | temperature | operating_conditions | voltage_threshold | extension | meta_data ; process : '(' opt_label PROCESS_TOKEN min_and_max ')' ; voltage : '(' opt_label VOLTAGE_TOKEN r_min_and_max ')' ; temperature : '(' opt_label TEMPERATURE_TOKEN r_min_and_max ')' ; operating_conditions : '(' opt_label OPERATING_CONDITIONS_TOKEN QSTRING_TOKEN process_value voltage_value temperature_value ')' ; process_value : number ; voltage_value : rnumber ; temperature_value : rnumber ; voltage_threshold : '(' opt_label VOLTAGE_THRESHOLD_TOKEN min_and_max ')' ; env_globals_spec_1 : '(' level_one env_globals_1_list ')' ; env_globals_1_list : env_globals_1_list env_globals_1 | env_globals_1 ; env_globals_1 : env_globals_case ; env_globals_case : '(' CASE_TOKEN identifier env_globals_case_spec_list ')' ; env_globals_case_spec_list : env_globals_case_spec_list env_globals_case_spec | env_globals_case_spec ; env_globals_case_spec : env_globals_spec_0 ; timing_globals_subset : '(' GLOBALS_SUBSET_TOKEN TIMING_TOKEN timing_globals_body ')' ; timing_globals_body : timing_globals_spec_list ; timing_globals_spec_list : timing_globals_spec_list timing_globals_spec | timing_globals_spec ; timing_globals_spec : timing_globals_spec_0 | timing_globals_spec_1 ; timing_globals_spec_0 : primary_waveform | extension | meta_data ; primary_waveform : '(' opt_label WAVEFORM_TOKEN waveform_name period edge_pair_list ')' ; waveform_name_list : waveform_name_list waveform_name | waveform_name ; waveform_name : QSTRING_TOKEN ; period : number ; edge_pair_list : pos_pair_list | neg_pair_list ; pos_pair_list : pos_pair_list pos_pair | pos_pair ; pos_pair : pos_edge neg_edge ; pos_edge : '(' POSEDGE_TOKEN min_max ')' ; neg_edge : '(' NEGEDGE_TOKEN min_max ')' ; neg_pair_list : neg_pair_list neg_pair | neg_pair ; neg_pair : neg_edge pos_edge ; timing_globals_spec_1 : '(' level_one timing_globals_1_list ')' ; timing_globals_1_list : timing_globals_1_list timing_globals_1 | timing_globals_1 ; timing_globals_1 : timing_globals_no_case_1 | timing_globals_case ; timing_globals_no_case_1 : derived_waveform | clock_group ; derived_waveform : '(' opt_label DERIVED_WAVEFORM_TOKEN waveform_name parent_waveform_name derived_waveform_option_list ')' parent_waveform_name : QSTRING_TOKEN ; derived_waveform_option_list : derived_waveform_option_list derived_waveform_option | derived_waveform_option ; derived_waveform_option : period_multiplier | phase_shift | skew_adjustment ; period_multiplier : '(' PERIOD_MULTIPLIER_TOKEN dnumber ')' ; phase_shift : '(' PHASE_SHIFT_TOKEN rnumber ')' ; skew_adjustment : '(' SKEW_ADJUSTMENT_TOKEN edge_pair_list ')' ; clock_group : '(' opt_label CLOCK_GROUP_TOKEN clock_group_name waveform_name_list ')' ; clock_group_name : QSTRING_TOKEN ; timing_globals_case : '(' CASE_TOKEN identifier timing_globals_case_spec_list ')' ; timing_globals_case_spec_list : timing_globals_case_spec_list timing_globals_case_spec | timing_globals_case_spec ; timing_globals_case_spec : timing_globals_spec_0 | timing_globals_no_case_1 ; /* * The assumption here is that the lexer takes care of recognizing * hierarchical identifiers as well as bit specs. The IDENTIFIER_TOKEN * should not include an HCHAR, but it may include bitspecs. The * PATH_TOKEN includes at least one HCHAR and may or may not include * bitspecs. * * All identifier-like tokens must be included here to ensure that * GCF keywords are accepted when used as identifiers. * Specific tokens to exclude here are * PATH_TOKEN, DNUMBER_TOKEN, NUMBER_TOKEN, RNUMBER_TOKEN, * QSTRING_TOKEN, and EDGE_PATTERN_TOKEN. */ identifier : ANYEDGE_TOKEN | ARC_TOKEN | AREA_SCALE_TOKEN | AREA_TOKEN | ARRIVAL_TOKEN | AVERAGE_CELL_POWER_TOKEN | AVERAGE_NET_POWER_TOKEN | BORROW_LIMIT_TOKEN | CAP_SCALE_TOKEN | CASE_TOKEN | CELL_TOKEN | CELL_TYPE_TOKEN | CLOCK_DELAY_TOKEN | CLOCK_GROUP_TOKEN | CLOCK_TOKEN | CONSTANT_TOKEN | CONSTRAINTS_TOKEN | DATE_TOKEN | DELIMITERS_TOKEN | DEPARTURE_TOKEN | DERIVED_WAVEFORM_TOKEN | DESIGN_TOKEN | DISABLE_TOKEN | DRIVER_CELL_TOKEN | DRIVER_STRENGTH_TOKEN | ENVIRONMENT_TOKEN | EXCEPTIONS_TOKEN | EXTENSION_TOKEN | EXTERNAL_DELAY_TOKEN | EXTERNAL_FANOUT_TOKEN | EXTERNAL_LOAD_TOKEN | FANOUT_TOKEN | FROM_TOKEN | GCF_TOKEN | GLOBALS_SUBSET_TOKEN | GLOBALS_TOKEN | HEADER_TOKEN | HOLD_TOKEN | IDENTIFIER_TOKEN | INPUT_SLEW_TOKEN | INSERTION_DELAY_TOKEN | INSTANCE_TOKEN | INTERNAL_FANOUT_TOKEN | INTERNAL_LOAD_TOKEN | INTERNAL_SLEW_TOKEN | LENGTH_SCALE_TOKEN | LEVEL_TOKEN | LIBRARY_TOKEN | LOAD_TOKEN | MASTER_TOKEN | MAX_TRANSITION_TIME_TOKEN | META_TOKEN | MULTI_CYCLE_TOKEN | NAME_PREFIXES_TOKEN | NEGEDGE_TOKEN | PARALLEL_DRIVERS_TOKEN | PARASITICS_TOKEN | PATH_DELAY_TOKEN | PERIOD_MULTIPLIER_TOKEN | PHASE_SHIFT_TOKEN | POROSITY_TOKEN | POSEDGE_TOKEN | POWER_SCALE_TOKEN | POWER_TOKEN | PRECEDENCE_TOKEN | PRIMITIVE_AREA_TOKEN | PROCESS_TOKEN | PROGRAM_TOKEN | RES_SCALE_TOKEN | SETUP_TOKEN | SKEW_ADJUSTMENT_TOKEN | SKEW_TOKEN | SLEW_TOKEN | SOURCE_TOKEN | SUBSET_TOKEN | TARGET_TOKEN | TEMPERATURE_TOKEN | THRU_ALL_TOKEN | THRU_TOKEN | TIME_SCALE_TOKEN | TIMING_TOKEN | TOTAL_AREA_TOKEN | TO_TOKEN | VERSION_TOKEN | VIEW_TOKEN | VOLTAGE_SCALE_TOKEN | VOLTAGE_TOKEN | WAVEFORM_TOKEN ; path : identifier | PATH_TOKEN ; partial_path : path ; name_prefixes : '(' NAME_PREFIXES_TOKEN num_prefixes name_prefix_list ')' ; num_prefixes : DNUMBER_TOKEN ; name_prefix_list : name_prefix_list name_prefix | name_prefix ; name_prefix : prefix_id QSTRING_TOKEN ; prefix_id : dnumber ; cell_instance_list : cell_instance_list cell_instance | cell_instance ; cell_instance : path | '(' prefix_id ')' | '(' prefix_id partial_path ')' ; opt_port_instance_list : port_instance_list | /* empty */ ; port_instance_list : port_instance_list port_instance | port_instance ; port_instance : path | '(' prefix_id partial_path ')' ; input_port : scalar_port ; output_port : scalar_port ; opt_scalar_port_list : scalar_port_list | /* empty */ ; scalar_port_list : scalar_port_list scalar_port | scalar_port ; scalar_port : identifier ; cell_or_port_instance : path | '(' prefix_id ')' | '(' prefix_id partial_path ')' ; cell_id : '(' CELL_TYPE_TOKEN cell_name ')' | '(' CELL_TYPE_TOKEN library_name cell_name opt_view_name ')' ; cell_name : QSTRING_TOKEN ; library_name : QSTRING_TOKEN ; view_name : QSTRING_TOKEN ; opt_view_name_list : view_name_list | /* empty */ ; view_name_list : view_name_list view_name | view_name ; opt_view_name : view_name | /* empty */ ; cell_spec : '(' CELL_TOKEN cell_instance_spec cell_body_spec_list ')' ; cell_instance_spec : cell_instance_path | '(' cell_instance_path_list ')' | '(' ')' /* no instance (top level) */ | cell_views ; cell_instance_path_list : cell_instance_path_list cell_instance_path | cell_instance_path ; cell_instance_path : path ; cell_views : '(' CELL_TYPE_TOKEN cell_name ')' | '(' CELL_TYPE_TOKEN library_name cell_name opt_view_name_list ')' ; cell_body_spec_list : cell_body_spec_list cell_body_spec | cell_body_spec ; cell_body_spec : name_prefixes | subset | extension | meta_data ; subset : timing_subset | parasitics_subset | area_subset | power_subset ; timing_subset : '(' SUBSET_TOKEN TIMING_TOKEN timing_subset_body ')' ; timing_subset_body : timing_subset_spec_list ; timing_subset_spec_list : timing_subset_spec_list timing_subset_spec | timing_subset_spec ; timing_subset_spec : timing_environment | timing_exceptions | extension | meta_data ; timing_environment : '(' ENVIRONMENT_TOKEN timing_env_spec_list ')' ; timing_env_spec_list : timing_env_spec_list timing_env_spec | timing_env_spec ; timing_env_spec : timing_env_spec_0 | timing_env_spec_1 ; timing_env_spec_0 : clock_spec | arrival_spec | departure_spec | external_delay_spec | driver_spec | input_slew_spec | extension | meta_data ; clock_spec : '(' opt_label CLOCK_TOKEN waveform_name port_instance_list ')' ; arrival_spec : '(' opt_label ARRIVAL_TOKEN waveform_edge arrival_value opt_port_instance_list ')' ; arrival_value : '(' waveform_edge_identifier r_min_max ')' | r_rise_fall_min_max ; departure_spec : '(' opt_label DEPARTURE_TOKEN waveform_edge departure_value opt_port_instance_list ')' ; departure_value : setup_rise_fall hold_rise_fall | '(' waveform_edge_identifier setup_value hold_value ')' ; waveform_edge : '(' waveform_edge_identifier waveform_name ')' ; setup_rise_fall : r_rise_and_fall ; hold_rise_fall : r_rise_and_fall ; setup_value : rnumber ; hold_value : rnumber ; external_delay_spec : '(' opt_label EXTERNAL_DELAY_TOKEN external_delay_value endpoints_spec_list ')' ; external_delay_value : '(' waveform_edge_identifier r_min_max ')' | r_rise_fall_min_max ; driver_spec : driver_cell_spec | driver_strength_spec ; driver_cell_spec : '(' opt_label DRIVER_CELL_TOKEN driver_cell_port_spec driver_cell_options opt_port_instance_list ')' | '(' opt_label DRIVER_CELL_TOKEN driver_cell_port_spec opt_port_instance_list ')' ; driver_cell_port_spec : '(' cell_id ')' | '(' cell_id output_port ')' | '(' cell_id input_port output_port ')' ; driver_cell_options : '(' driver_cell_option_list ')' ; driver_cell_option_list : driver_cell_option_list driver_cell_option | driver_cell_option ; driver_cell_option : drive_multiplier | driver_input_slew | waveform_edge_identifier ; drive_multiplier : '(' PARALLEL_DRIVERS_TOKEN dnumber ')' ; driver_input_slew : '(' INPUT_SLEW_TOKEN slew_value opt_scalar_port_list ')' ; slew_value : rise_fall_min_max ; driver_strength_spec : '(' opt_label DRIVER_STRENGTH_TOKEN strength_value opt_port_instance_list ')' ; strength_value : rise_fall ; input_slew_spec : '(' opt_label INPUT_SLEW_TOKEN slew_value opt_port_instance_list ')' ; timing_env_spec_1 : '(' level_one timing_env_1_list ')' ; timing_env_1_list : timing_env_1_list timing_env_1 | timing_env_1 ; timing_env_1 : timing_env_no_case_1 | timing_env_case ; timing_env_no_case_1 : constant_spec | operating_conditions | internal_slew_spec ; constant_spec : '(' opt_label CONSTANT_TOKEN constant_value port_instance_list ')' ; constant_value : dnumber /* must be 0 or 1 */ { if ( $1 != 0 && $1 != 1 ) { yyerror( "Invalid constant value: must be 0 or 1" ); YYABORT; } } ; internal_slew_spec : '(' opt_label INTERNAL_SLEW_TOKEN slew_value opt_port_instance_list ')' ; timing_env_case : '(' CASE_TOKEN identifier timing_env_case_spec_list ')' ; timing_env_case_spec_list : timing_env_case_spec_list timing_env_case_spec | timing_env_case_spec ; timing_env_case_spec : timing_env_spec_0 | timing_env_no_case_1 ; timing_exceptions : '(' EXCEPTIONS_TOKEN timing_exception_spec_list ')' ; timing_exception_spec_list : timing_exception_spec_list timing_exception_spec | timing_exception_spec ; timing_exception_spec : timing_exception_spec_0 | timing_exception_spec_1 ; timing_exception_spec_0 : disable_spec_0 | multi_cycle_spec_0 | path_delay_spec_0 | transition_time_spec | extension | meta_data ; timing_exception_spec_1 : '(' level_one timing_exception_1_list ')' ; timing_exception_1_list : timing_exception_1_list timing_exception_1 | timing_exception_1 ; timing_exception_1 : timing_exception_no_case_1 | timing_exception_case ; timing_exception_no_case_1 : disable_spec_1 | multi_cycle_spec_1 | path_delay_spec_1 | borrow_limit_spec | clock_delay_spec ; timing_exception_case : '(' CASE_TOKEN identifier timing_exception_case_spec_list ')' ; timing_exception_case_spec_list : timing_exception_case_spec_list timing_exception_case_spec | timing_exception_case_spec ; timing_exception_case_spec : timing_exception_spec_0 | timing_exception_no_case_1 ; arc_spec : '(' ARC_TOKEN port_instance port_instance ')' ; endpoints_spec_list : endpoints_spec_list endpoints_spec | endpoints_spec ; endpoints_spec : from_spec | to_spec | '(' from_spec to_spec ')' ; from_spec : '(' FROM_TOKEN from_to_item_list ')' ; to_spec : '(' TO_TOKEN from_to_item_list ')' ; from_to_item_list : from_to_item_list from_to_item | from_to_item ; /* * Without reference to netlist data, a GCF parser can't reliably * distinguish between a cell instance and a port instance, so they * are lumped together here. */ from_to_item : cell_or_port_instance | waveform_name ; thru_spec : '(' THRU_TOKEN port_instance ')' ; thru_all_spec : '(' THRU_ALL_TOKEN port_instance port_instance_list ')' ; disable_spec_0 : disable_item_spec_0 | disable_endpoints_spec_0 ; disable_item_spec_0 : '(' opt_label DISABLE_TOKEN disable_item_0_list ')' ; disable_item_0_list : disable_item_0_list disable_item_0 | disable_item_0 ; disable_item_0 : cell_or_port_instance | arc_spec ; disable_endpoints_spec_0 : '(' opt_label DISABLE_TOKEN endpoints_spec_list disable_endpoints_options ')' ; disable_endpoints_options : timing_check | edge_identifier | timing_check edge_identifier | /* empty */ ; opt_timing_check : timing_check | /* empty */ ; timing_check : SETUP_TOKEN | HOLD_TOKEN ; disable_spec_1 : disable_edges_spec_1 | disable_cell_spec_1 ; disable_edges_spec_1 : '(' opt_label DISABLE_TOKEN disable_edges_path_spec_list opt_timing_check ')' ; disable_edges_path_spec_list : disable_edges_path_spec_list disable_edges_path_spec | disable_edges_path_spec ; disable_edges_path_spec : thru_edge_spec | arc_edges_spec | thru_all_edges_spec ; thru_edge_spec : '(' THRU_TOKEN port_instance_edge ')' ; arc_edges_spec : '(' ARC_TOKEN port_instance_edge port_instance_edge ')' ; thru_all_edges_spec : '(' THRU_ALL_TOKEN port_instance_edge port_instance_edge_list ')' ; port_instance_edge_list : port_instance_edge_list port_instance_edge | port_instance_edge ; port_instance_edge : '(' edge_identifier port_instance ')' ; disable_cell_spec_1 : '(' opt_label DISABLE_TOKEN disable_cell_path_spec_list ')' ; disable_cell_path_spec_list : disable_cell_path_spec_list disable_cell_path_spec | disable_cell_path_spec ; disable_cell_path_spec : disable_instance_spec | disable_master_spec ; disable_instance_spec : '(' INSTANCE_TOKEN cell_instance_list ')' ; disable_master_spec : '(' MASTER_TOKEN cell_id ')' ; multi_cycle_spec_0 : '(' opt_label MULTI_CYCLE_TOKEN multi_cycle_option_list endpoints_spec_list ')' ; multi_cycle_option_list : multi_cycle_option_list multi_cycle_option | multi_cycle_option ; multi_cycle_option : timing_check_offset | edge_identifier ; timing_check_offset : '(' timing_check num_cycles opt_reference_clock ')' ; opt_reference_clock : reference_clock | /* empty */ ; reference_clock : SOURCE_TOKEN | TARGET_TOKEN ; num_cycles : inumber ; multi_cycle_spec_1 : '(' opt_label MULTI_CYCLE_TOKEN multi_cycle_option_list multi_cycle_path_spec_1_list ')' ; multi_cycle_path_spec_1_list : multi_cycle_path_spec_1_list multi_cycle_path_spec_1 | multi_cycle_path_spec_1 ; multi_cycle_path_spec_1 : arc_spec | thru_spec | thru_all_spec ; path_delay_spec_0 : '(' opt_label PATH_DELAY_TOKEN path_delay_value endpoints_spec_list ')' ; path_delay_spec_1 : '(' opt_label PATH_DELAY_TOKEN path_delay_value path_delay_path_spec_1_list ')' ; path_delay_value : '(' timing_check waveform_edge_identifier number ')' | rise_fall_min_max ; path_delay_path_spec_1_list : path_delay_path_spec_1_list path_delay_path_spec_1 | path_delay_path_spec_1 ; path_delay_path_spec_1 : arc_spec | thru_spec | thru_all_spec ; transition_time_spec : '(' opt_label MAX_TRANSITION_TIME_TOKEN rise_fall opt_port_instance_list ')' ; borrow_limit_spec : '(' opt_label BORROW_LIMIT_TOKEN number opt_port_instance_list ')' ; clock_delay_spec : '(' opt_label CLOCK_DELAY_TOKEN clock_root leaf_spec_list ')' ; clock_root : port_instance | '(' cell_instance input_port output_port ')' ; leaf_spec_list : leaf_spec_list leaf_spec | leaf_spec ; leaf_spec : '(' leaf_delay_spec_list opt_port_instance_list ')' ; leaf_delay_spec_list : leaf_delay_spec_list leaf_delay_spec | leaf_delay_spec ; leaf_delay_spec : insertion_delay_spec | clock_skew_spec | clock_slew_spec ; insertion_delay_spec : '(' INSERTION_DELAY_TOKEN rise_fall_min_max ')' ; clock_skew_spec : '(' SKEW_TOKEN min_max ')' ; clock_slew_spec : '(' SLEW_TOKEN slew_value ')' ; /**************************************/ /* parasitics subset */ /**************************************/ parasitics_subset : '(' SUBSET_TOKEN PARASITICS_TOKEN parasitics_subset_body ')' ; parasitics_subset_body : parasitics_subset_spec_list ; parasitics_subset_spec_list : parasitics_subset_spec_list parasitics_subset_spec | parasitics_subset_spec ; parasitics_subset_spec : parasitics_environment | parasitics_constraints | extension | meta_data ; parasitics_environment : '(' ENVIRONMENT_TOKEN parasitics_env_spec_list ')' ; parasitics_env_spec_list : parasitics_env_spec_list parasitics_env_spec | parasitics_env_spec ; parasitics_env_spec : parasitics_env_spec_0 | parasitics_env_spec_1 ; parasitics_env_spec_0 : external_load_spec | extension | meta_data ; external_load_spec : '(' opt_label EXTERNAL_LOAD_TOKEN capacitance_value opt_port_instance_list ')' ; capacitance_value : min_max ; parasitics_env_spec_1 : '(' level_one parasitics_env_1_list ')' ; parasitics_env_1_list : parasitics_env_1_list parasitics_env_1 | parasitics_env_1 ; parasitics_env_1 : parasitics_env_no_case_1 | parasitics_env_case ; parasitics_env_no_case_1 : external_fanout_spec ; external_fanout_spec : '(' opt_label EXTERNAL_FANOUT_TOKEN num_loads opt_port_instance_list ')' ; num_loads : min_max ; parasitics_env_case : '(' CASE_TOKEN identifier parasitics_env_case_spec_list ')' ; parasitics_env_case_spec_list : parasitics_env_case_spec_list parasitics_env_case_spec | parasitics_env_case_spec ; parasitics_env_case_spec : parasitics_env_spec_0 | parasitics_env_no_case_1 ; parasitics_constraints : '(' CONSTRAINTS_TOKEN parasitics_constraint_list ')' ; parasitics_constraint_list : parasitics_constraint_list parasitics_constraint | parasitics_constraint ; parasitics_constraint : parasitics_cnstr_spec_0 | parasitics_cnstr_spec_1 ; parasitics_cnstr_spec_0 : internal_load_spec | load_spec | extension | meta_data ; internal_load_spec : '(' opt_label INTERNAL_LOAD_TOKEN capacitance_value opt_port_instance_list ')' ; load_spec : '(' opt_label LOAD_TOKEN capacitance_value opt_port_instance_list ')' ; parasitics_cnstr_spec_1 : '(' level_one parasitics_cnstr_1_list ')' ; parasitics_cnstr_1_list : parasitics_cnstr_1_list parasitics_cnstr_1 | parasitics_cnstr_1 ; parasitics_cnstr_1 : parasitics_cnstr_no_case_1 | parasitics_cnstr_case ; parasitics_cnstr_no_case_1 : internal_fanout_spec | fanout_spec ; internal_fanout_spec : '(' opt_label INTERNAL_FANOUT_TOKEN num_loads opt_port_instance_list ')' ; fanout_spec : '(' opt_label FANOUT_TOKEN num_loads opt_port_instance_list ')' ; parasitics_cnstr_case : '(' CASE_TOKEN identifier parasitics_cnstr_case_spec_list ')' ; parasitics_cnstr_case_spec_list : parasitics_cnstr_case_spec_list parasitics_cnstr_case_spec | parasitics_cnstr_case_spec ; parasitics_cnstr_case_spec : parasitics_cnstr_spec_0 | parasitics_cnstr_no_case_1 ; /**************************************/ /* area subset */ /**************************************/ area_subset : '(' SUBSET_TOKEN AREA_TOKEN area_subset_body ')' ; area_subset_body : area_cnstr_spec_list ; area_cnstr_spec_list : area_cnstr_spec_list area_cnstr_spec | area_cnstr_spec ; area_cnstr_spec : area_cnstr_spec_0 | area_cnstr_spec_1 ; area_cnstr_spec_0 : primitive_area_spec | total_area_spec | extension | meta_data ; primitive_area_spec : '(' opt_label PRIMITIVE_AREA_TOKEN area_value ')' ; area_value : min_max ; total_area_spec : '(' opt_label TOTAL_AREA_TOKEN area_value ')' ; area_cnstr_spec_1 : '(' level_one area_cnstr_1_list ')' ; area_cnstr_1_list : area_cnstr_1_list area_cnstr_1 | area_cnstr_1 ; area_cnstr_1 : area_cnstr_no_case_1 | area_cnstr_case ; area_cnstr_no_case_1 : porosity_spec ; porosity_spec : '(' opt_label POROSITY_TOKEN porosity_value ')' ; porosity_value : min_max ; area_cnstr_case : '(' CASE_TOKEN identifier area_cnstr_case_spec_list ')' ; area_cnstr_case_spec_list : area_cnstr_case_spec_list area_cnstr_case_spec | area_cnstr_case_spec ; area_cnstr_case_spec : area_cnstr_spec_0 | area_cnstr_no_case_1 ; /**************************************/ /* power subset */ /**************************************/ power_subset : '(' SUBSET_TOKEN POWER_TOKEN power_subset_body ')' ; power_subset_body : power_subset_spec_list ; power_subset_spec_list : power_subset_spec_list power_subset_spec | power_subset_spec ; power_subset_spec : power_cnstr_spec_0 | power_cnstr_spec_1 ; power_cnstr_spec_0 : average_cell_power_spec | average_net_power_spec | extension | meta_data ; average_cell_power_spec : '(' opt_label AVERAGE_CELL_POWER_TOKEN power_value ')' ; power_value : min_max ; average_net_power_spec : '(' opt_label AVERAGE_NET_POWER_TOKEN power_value port_instance ')' ; power_cnstr_spec_1 : '(' level_one power_cnstr_1_list ')' ; power_cnstr_1_list : power_cnstr_1_list power_cnstr_1 | power_cnstr_1 ; power_cnstr_1 : power_case ; power_case : '(' CASE_TOKEN identifier power_case_spec_list ')' ; power_case_spec_list : power_case_spec_list power_case_spec | power_case_spec ; power_case_spec : power_cnstr_spec_0 ; waveform_edge_identifier : POSEDGE_TOKEN | NEGEDGE_TOKEN ; edge_identifier : POSEDGE_TOKEN | NEGEDGE_TOKEN | ANYEDGE_TOKEN | EDGE_PATTERN_TOKEN /* 0z, z1, 1z, or z0 */ ; %%