parse.y: Refector enum rule
Refactor the enum rule by adding a enum_base_type rule which handles the type specific initialization. This allows to keep the non-type specific parts in a common rule, which makes it easier to modify in future changes. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
parent
bedc68707e
commit
74b433c083
61
parse.y
61
parse.y
|
|
@ -600,7 +600,7 @@ static void current_function_set_statement(const YYLTYPE&loc, std::vector<Statem
|
||||||
%type <expr> tf_port_item_expr_opt value_range_expression
|
%type <expr> tf_port_item_expr_opt value_range_expression
|
||||||
|
|
||||||
%type <named_pexprs> enum_name_list enum_name
|
%type <named_pexprs> enum_name_list enum_name
|
||||||
%type <enum_type> enum_data_type
|
%type <enum_type> enum_data_type enum_base_type
|
||||||
|
|
||||||
%type <tf_ports> function_item function_item_list function_item_list_opt
|
%type <tf_ports> function_item function_item_list function_item_list_opt
|
||||||
%type <tf_ports> task_item task_item_list task_item_list_opt
|
%type <tf_ports> task_item task_item_list task_item_list_opt
|
||||||
|
|
@ -2863,65 +2863,50 @@ type_declaration
|
||||||
for an optional base type. The default base type is "int", but it
|
for an optional base type. The default base type is "int", but it
|
||||||
can be any of the integral or vector types. */
|
can be any of the integral or vector types. */
|
||||||
|
|
||||||
enum_data_type
|
enum_base_type /* IEEE 1800-2012 A.2.2.1 */
|
||||||
: K_enum '{' enum_name_list '}'
|
:
|
||||||
{ enum_type_t*enum_type = new enum_type_t;
|
{ enum_type_t*enum_type = new enum_type_t;
|
||||||
FILE_NAME(enum_type, @1);
|
|
||||||
enum_type->names .reset($3);
|
|
||||||
enum_type->base_type = IVL_VT_BOOL;
|
enum_type->base_type = IVL_VT_BOOL;
|
||||||
enum_type->signed_flag = true;
|
enum_type->signed_flag = true;
|
||||||
enum_type->integer_flag = false;
|
enum_type->integer_flag = false;
|
||||||
enum_type->range.reset(make_range_from_width(32));
|
enum_type->range.reset(make_range_from_width(32));
|
||||||
$$ = enum_type;
|
$$ = enum_type;
|
||||||
}
|
}
|
||||||
| K_enum atom2_type signed_unsigned_opt '{' enum_name_list '}'
|
| atom2_type signed_unsigned_opt
|
||||||
{ enum_type_t*enum_type = new enum_type_t;
|
{ enum_type_t*enum_type = new enum_type_t;
|
||||||
FILE_NAME(enum_type, @1);
|
|
||||||
enum_type->names .reset($5);
|
|
||||||
enum_type->base_type = IVL_VT_BOOL;
|
enum_type->base_type = IVL_VT_BOOL;
|
||||||
enum_type->signed_flag = $3;
|
enum_type->signed_flag = $2;
|
||||||
enum_type->integer_flag = false;
|
enum_type->integer_flag = false;
|
||||||
enum_type->range.reset(make_range_from_width($2));
|
enum_type->range.reset(make_range_from_width($1));
|
||||||
$$ = enum_type;
|
$$ = enum_type;
|
||||||
}
|
}
|
||||||
| K_enum K_integer signed_unsigned_opt '{' enum_name_list '}'
|
| K_integer signed_unsigned_opt
|
||||||
{ enum_type_t*enum_type = new enum_type_t;
|
{ enum_type_t*enum_type = new enum_type_t;
|
||||||
FILE_NAME(enum_type, @1);
|
|
||||||
enum_type->names .reset($5);
|
|
||||||
enum_type->base_type = IVL_VT_LOGIC;
|
enum_type->base_type = IVL_VT_LOGIC;
|
||||||
enum_type->signed_flag = $3;
|
enum_type->signed_flag = $2;
|
||||||
enum_type->integer_flag = true;
|
enum_type->integer_flag = true;
|
||||||
enum_type->range.reset(make_range_from_width(integer_width));
|
enum_type->range.reset(make_range_from_width(integer_width));
|
||||||
$$ = enum_type;
|
$$ = enum_type;
|
||||||
}
|
}
|
||||||
| K_enum K_logic unsigned_signed_opt dimensions_opt '{' enum_name_list '}'
|
| integer_vector_type unsigned_signed_opt dimensions_opt
|
||||||
{ enum_type_t*enum_type = new enum_type_t;
|
{ ivl_variable_type_t use_vtype = $1;
|
||||||
FILE_NAME(enum_type, @1);
|
if (use_vtype == IVL_VT_NO_TYPE)
|
||||||
enum_type->names .reset($6);
|
use_vtype = IVL_VT_LOGIC;
|
||||||
enum_type->base_type = IVL_VT_LOGIC;
|
|
||||||
enum_type->signed_flag = $3;
|
enum_type_t*enum_type = new enum_type_t;
|
||||||
|
enum_type->base_type = use_vtype;
|
||||||
|
enum_type->signed_flag = $2;
|
||||||
enum_type->integer_flag = false;
|
enum_type->integer_flag = false;
|
||||||
enum_type->range.reset($4 ? $4 : make_range_from_width(1));
|
enum_type->range.reset($3 ? $3 : make_range_from_width(1));
|
||||||
$$ = enum_type;
|
$$ = enum_type;
|
||||||
}
|
}
|
||||||
| K_enum K_reg unsigned_signed_opt dimensions_opt '{' enum_name_list '}'
|
;
|
||||||
{ enum_type_t*enum_type = new enum_type_t;
|
|
||||||
|
enum_data_type /* IEEE 1800-2012 A.2.2.1 */
|
||||||
|
: K_enum enum_base_type '{' enum_name_list '}'
|
||||||
|
{ enum_type_t*enum_type = $2;
|
||||||
FILE_NAME(enum_type, @1);
|
FILE_NAME(enum_type, @1);
|
||||||
enum_type->names .reset($6);
|
enum_type->names.reset($4);
|
||||||
enum_type->base_type = IVL_VT_LOGIC;
|
|
||||||
enum_type->signed_flag = $3;
|
|
||||||
enum_type->integer_flag = false;
|
|
||||||
enum_type->range.reset($4 ? $4 : make_range_from_width(1));
|
|
||||||
$$ = enum_type;
|
|
||||||
}
|
|
||||||
| K_enum K_bit unsigned_signed_opt dimensions_opt '{' enum_name_list '}'
|
|
||||||
{ enum_type_t*enum_type = new enum_type_t;
|
|
||||||
FILE_NAME(enum_type, @1);
|
|
||||||
enum_type->names .reset($6);
|
|
||||||
enum_type->base_type = IVL_VT_BOOL;
|
|
||||||
enum_type->signed_flag = $3;
|
|
||||||
enum_type->integer_flag = false;
|
|
||||||
enum_type->range.reset($4 ? $4 : make_range_from_width(1));
|
|
||||||
$$ = enum_type;
|
$$ = enum_type;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue