From b8093be42fab3cd9fcae1f4e776324e1b55eeb92 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Mon, 3 Sep 2012 11:20:29 -0700 Subject: [PATCH] Rework parse rules to handle more net types. This makes the rules for types to be more in line with IEEE1800. --- parse.y | 95 ++++++++++++++++++-------------------------------------- pform.cc | 6 ++++ 2 files changed, 37 insertions(+), 64 deletions(-) diff --git a/parse.y b/parse.y index 552b7d6db..b0675235a 100644 --- a/parse.y +++ b/parse.y @@ -2,6 +2,7 @@ %{ /* * 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 * 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 %type net_type var_type net_type_opt %type gatetype switchtype %type port_direction port_direction_opt -%type primitive_type primitive_type_opt bit_logic +%type bit_logic %type integer_vector_type %type parameter_value_opt @@ -3891,22 +3892,17 @@ module_item /* Modules can contain further sub-module definitions. */ : module - /* This rule detects net declarations that possibly include a - 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_or_implicit delay3_opt net_variable_list ';' - | attribute_list_opt net_type - primitive_type_opt unsigned_signed_opt range_opt - delay3_opt - net_variable_list ';' - - { vector_type_t*tmp = new vector_type_t($3, $4, $5); - pform_set_data_type(@2, tmp, $7, $2, $1); - if ($6 != 0) { - yyerror(@6, "sorry: net delays not supported."); - delete $6; + { data_type_t*data_type = $3; + if (data_type == 0) { + data_type = new vector_type_t(IVL_VT_LOGIC, false, 0); + FILE_NAME(data_type, @2); + } + pform_set_data_type(@2, data_type, $5, $2, $1); + if ($4 != 0) { + yyerror(@2, "sorry: net delays not supported."); + delete $4; } delete $1; } @@ -3931,50 +3927,30 @@ module_item net_decl_assigns, which are = assignment declarations. */ - | attribute_list_opt net_type - primitive_type_opt unsigned_signed_opt range_opt - delay3_opt net_decl_assigns ';' - - { ivl_variable_type_t dtype = $3; - if (dtype == IVL_VT_NO_TYPE) - dtype = IVL_VT_LOGIC; - vector_type_t*data_type = new vector_type_t(dtype, $4, $5); - pform_makewire(@2, $6, str_strength, $7, $2, data_type); - if ($1) { - yyerror(@2, "sorry: Attributes not supported " - "on net declaration assignments."); - delete $1; - } - } - - /* 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 data_type_or_implicit delay3_opt net_decl_assigns ';' + { data_type_t*data_type = $3; + if (data_type == 0) { + data_type = new vector_type_t(IVL_VT_LOGIC, false, 0); + FILE_NAME(data_type, @2); + } + pform_makewire(@2, $4, str_strength, $5, $2, data_type); + if ($1) { + yyerror(@2, "sorry: Attributes not supported " + "on net declaration assignments."); + 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 gives strength to the assignment drivers. */ - | attribute_list_opt net_type - primitive_type_opt unsigned_signed_opt - drive_strength net_decl_assigns ';' - - { ivl_variable_type_t dtype = $3; - if (dtype == IVL_VT_NO_TYPE) - dtype = IVL_VT_LOGIC; - vector_type_t*data_type = new vector_type_t(dtype, $4, 0); - pform_makewire(@2, 0, $5, $6, $2, data_type); + | attribute_list_opt net_type data_type_or_implicit drive_strength net_decl_assigns ';' + { data_type_t*data_type = $3; + if (data_type == 0) { + data_type = new vector_type_t(IVL_VT_LOGIC, false, 0); + FILE_NAME(data_type, @2); + } + pform_makewire(@2, 0, $4, $5, $2, data_type); if ($1) { yyerror(@2, "sorry: Attributes not supported " "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 : K_logic { $$ = IVL_VT_LOGIC; } | K_bit { $$ = IVL_VT_BOOL; /* IEEE1800 / IEEE1364-2009 */} ; -primitive_type_opt : primitive_type { $$ = $1; } | { $$ = IVL_VT_NO_TYPE; } ; - net_type : K_wire { $$ = NetNet::WIRE; } | K_tri { $$ = NetNet::TRI; } diff --git a/pform.cc b/pform.cc index fb5d8650b..bdf89b653 100644 --- a/pform.cc +++ b/pform.cc @@ -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*names, NetNet::Type net_type, list*attr) { + if (data_type == 0) { + VLerror(li, "internal error: data_type==0."); + assert(0); + } + if (atom2_type_t*atom2_type = dynamic_cast (data_type)) { pform_set_integer_2atom(atom2_type->type_code, atom2_type->signed_flag, names, net_type, attr); return; @@ -2922,6 +2927,7 @@ void pform_set_data_type(const struct vlltype&li, data_type_t*data_type, list