Rework parse rules to handle more net types.

This makes the rules for types to be more in line with IEEE1800.
This commit is contained in:
Stephen Williams 2012-09-03 11:20:29 -07:00
parent f24d6b055d
commit b8093be42f
2 changed files with 37 additions and 64 deletions

85
parse.y
View File

@ -2,6 +2,7 @@
%{ %{
/* /*
* Copyright (c) 1998-2012 Stephen Williams (steve@icarus.com) * Copyright (c) 1998-2012 Stephen Williams (steve@icarus.com)
* Copyright CERN 2012 / Stephen Williams (steve@icarus.com)
* *
* This source code is free software; you can redistribute it * This source code is free software; you can redistribute it
* and/or modify it in source code form under the terms of the GNU * and/or modify it in source code form under the terms of the GNU
@ -566,7 +567,7 @@ static void current_function_set_statement(const YYLTYPE&loc, vector<Statement*>
%type <nettype> net_type var_type net_type_opt %type <nettype> net_type var_type net_type_opt
%type <gatetype> gatetype switchtype %type <gatetype> gatetype switchtype
%type <porttype> port_direction port_direction_opt %type <porttype> port_direction port_direction_opt
%type <vartype> primitive_type primitive_type_opt bit_logic %type <vartype> bit_logic
%type <vartype> integer_vector_type %type <vartype> integer_vector_type
%type <parmvalue> parameter_value_opt %type <parmvalue> parameter_value_opt
@ -3891,22 +3892,17 @@ module_item
/* Modules can contain further sub-module definitions. */ /* Modules can contain further sub-module definitions. */
: module : module
/* This rule detects net declarations that possibly include a | attribute_list_opt net_type data_type_or_implicit delay3_opt net_variable_list ';'
primitive type, an optional vector range and signed flag. This
also includes an optional delay set. The values are then applied
to a list of names. If the primitive type is not specified, then
resort to the default type LOGIC. */
| attribute_list_opt net_type { data_type_t*data_type = $3;
primitive_type_opt unsigned_signed_opt range_opt if (data_type == 0) {
delay3_opt data_type = new vector_type_t(IVL_VT_LOGIC, false, 0);
net_variable_list ';' FILE_NAME(data_type, @2);
}
{ vector_type_t*tmp = new vector_type_t($3, $4, $5); pform_set_data_type(@2, data_type, $5, $2, $1);
pform_set_data_type(@2, tmp, $7, $2, $1); if ($4 != 0) {
if ($6 != 0) { yyerror(@2, "sorry: net delays not supported.");
yyerror(@6, "sorry: net delays not supported."); delete $4;
delete $6;
} }
delete $1; delete $1;
} }
@ -3931,15 +3927,13 @@ module_item
net_decl_assigns, which are <name> = <expr> assignment net_decl_assigns, which are <name> = <expr> assignment
declarations. */ declarations. */
| attribute_list_opt net_type | attribute_list_opt net_type data_type_or_implicit delay3_opt net_decl_assigns ';'
primitive_type_opt unsigned_signed_opt range_opt { data_type_t*data_type = $3;
delay3_opt net_decl_assigns ';' if (data_type == 0) {
data_type = new vector_type_t(IVL_VT_LOGIC, false, 0);
{ ivl_variable_type_t dtype = $3; FILE_NAME(data_type, @2);
if (dtype == IVL_VT_NO_TYPE) }
dtype = IVL_VT_LOGIC; pform_makewire(@2, $4, str_strength, $5, $2, data_type);
vector_type_t*data_type = new vector_type_t(dtype, $4, $5);
pform_makewire(@2, $6, str_strength, $7, $2, data_type);
if ($1) { if ($1) {
yyerror(@2, "sorry: Attributes not supported " yyerror(@2, "sorry: Attributes not supported "
"on net declaration assignments."); "on net declaration assignments.");
@ -3947,34 +3941,16 @@ module_item
} }
} }
/* Allow struct nets. */
| attribute_list_opt net_type struct_data_type net_variable_list ';'
{ pform_set_data_type(@2, $3, $4, $2, $1);
delete $1;
}
| attribute_list_opt net_type struct_data_type error ';'
{ yyerror(@5, "error: Errors in net variable list.");
}
| attribute_list_opt net_type TYPE_IDENTIFIER net_variable_list ';'
{ yyerror(@2, "sorry: Nets of named types not supported."); }
/* This form doesn't have the range, but does have strengths. This /* This form doesn't have the range, but does have strengths. This
gives strength to the assignment drivers. */ gives strength to the assignment drivers. */
| attribute_list_opt net_type | attribute_list_opt net_type data_type_or_implicit drive_strength net_decl_assigns ';'
primitive_type_opt unsigned_signed_opt { data_type_t*data_type = $3;
drive_strength net_decl_assigns ';' if (data_type == 0) {
data_type = new vector_type_t(IVL_VT_LOGIC, false, 0);
{ ivl_variable_type_t dtype = $3; FILE_NAME(data_type, @2);
if (dtype == IVL_VT_NO_TYPE) }
dtype = IVL_VT_LOGIC; pform_makewire(@2, 0, $4, $5, $2, data_type);
vector_type_t*data_type = new vector_type_t(dtype, $4, 0);
pform_makewire(@2, 0, $5, $6, $2, data_type);
if ($1) { if ($1) {
yyerror(@2, "sorry: Attributes not supported " yyerror(@2, "sorry: Attributes not supported "
"on net declaration assignments."); "on net declaration assignments.");
@ -4369,20 +4345,11 @@ net_decl_assigns
} }
; ;
primitive_type
: K_logic { $$ = IVL_VT_LOGIC; }
| K_bool { $$ = IVL_VT_BOOL; /* Icarus Verilog xtypes */}
| K_bit { $$ = IVL_VT_BOOL; /* IEEE1800 / IEEE1364-2009 */}
| K_real { $$ = IVL_VT_REAL; }
;
bit_logic bit_logic
: K_logic { $$ = IVL_VT_LOGIC; } : K_logic { $$ = IVL_VT_LOGIC; }
| K_bit { $$ = IVL_VT_BOOL; /* IEEE1800 / IEEE1364-2009 */} | K_bit { $$ = IVL_VT_BOOL; /* IEEE1800 / IEEE1364-2009 */}
; ;
primitive_type_opt : primitive_type { $$ = $1; } | { $$ = IVL_VT_NO_TYPE; } ;
net_type net_type
: K_wire { $$ = NetNet::WIRE; } : K_wire { $$ = NetNet::WIRE; }
| K_tri { $$ = NetNet::TRI; } | K_tri { $$ = NetNet::TRI; }

View File

@ -2880,6 +2880,11 @@ static void pform_set_enum(const struct vlltype&li, enum_type_t*enum_type,
*/ */
void pform_set_data_type(const struct vlltype&li, data_type_t*data_type, list<perm_string>*names, NetNet::Type net_type, list<named_pexpr_t>*attr) void pform_set_data_type(const struct vlltype&li, data_type_t*data_type, list<perm_string>*names, NetNet::Type net_type, list<named_pexpr_t>*attr)
{ {
if (data_type == 0) {
VLerror(li, "internal error: data_type==0.");
assert(0);
}
if (atom2_type_t*atom2_type = dynamic_cast<atom2_type_t*> (data_type)) { if (atom2_type_t*atom2_type = dynamic_cast<atom2_type_t*> (data_type)) {
pform_set_integer_2atom(atom2_type->type_code, atom2_type->signed_flag, names, net_type, attr); pform_set_integer_2atom(atom2_type->type_code, atom2_type->signed_flag, names, net_type, attr);
return; return;
@ -2922,6 +2927,7 @@ void pform_set_data_type(const struct vlltype&li, data_type_t*data_type, list<pe
return; return;
} }
VLerror(li, "internal error: Unexpected data_type.");
assert(0); assert(0);
} }