diff --git a/src/verilog.y b/src/verilog.y index 6f509afa4..414043f6b 100644 --- a/src/verilog.y +++ b/src/verilog.y @@ -2165,15 +2165,39 @@ implicit_typeE: // IEEE: part of *data_type_or_implicit //UNSUP ; type_declaration: // ==IEEE: type_declaration - // // Use idAny, as we can redeclare a typedef on an existing typedef - yTYPEDEF data_type idAny variable_dimensionListE dtypeAttrListE ';' - { $$ = GRAMMARP->createTypedef($3, *$3, $5, $2, $4); } + // Data_type expanded + yTYPEDEF data_typeNoRef + /*cont*/ idAny variable_dimensionListE dtypeAttrListE ';' + { AstNodeDType* dtp = $2; + $$ = GRAMMARP->createTypedef($3, *$3, $5, dtp, $4); } + | yTYPEDEF packageClassScope idType packed_dimensionListE + /*cont*/ idAny variable_dimensionListE dtypeAttrListE ';' + { AstRefDType* refp = new AstRefDType($3, *$3, $2, nullptr); + AstNodeDType* dtp = GRAMMARP->createArray(refp, $4, true); + $$ = GRAMMARP->createTypedef($5, *$5, $7, dtp, $6); } + | yTYPEDEF packageClassScope idType parameter_value_assignmentClass packed_dimensionListE + /*cont*/ idAny variable_dimensionListE dtypeAttrListE ';' + { AstRefDType* refp = new AstRefDType($3, *$3, $2, $4); + AstNodeDType* dtp = GRAMMARP->createArray(refp, $5, true); + $$ = GRAMMARP->createTypedef($6, *$6, $8, dtp, $7); } + | yTYPEDEF idType packed_dimensionListE + /*cont*/ idAny variable_dimensionListE dtypeAttrListE ';' + { AstRefDType* refp = new AstRefDType($2, *$2, nullptr, nullptr); + AstNodeDType* dtp = GRAMMARP->createArray(refp, $3, true); + $$ = GRAMMARP->createTypedef($4, *$4, $6, dtp, $5); } + | yTYPEDEF idType parameter_value_assignmentClass packed_dimensionListE + /*cont*/ idAny variable_dimensionListE dtypeAttrListE ';' + { AstRefDType* refp = new AstRefDType($2, *$2, nullptr, $3); + AstNodeDType* dtp = GRAMMARP->createArray(refp, $4, true); + $$ = GRAMMARP->createTypedef($5, *$5, $7, dtp, $6); } + // // | yTYPEDEF id/*interface*/ '.' idAny/*type*/ idAny/*type*/ ';' { $$ = nullptr; BBUNSUP($1, "Unsupported: SystemVerilog 2005 typedef in this context"); } + // // Allow redeclaring same typedef again + // // Alternative is use of idAny below, but this will cause conflicts with ablve + | yTYPEDEF idType ';' { $$ = GRAMMARP->createTypedefFwd($2, *$2); } // // Combines into above "data_type id" rule // // Verilator: Not important what it is in the AST, just need to make sure the yaID__aTYPE gets returned - //UNSUP // Below should be idAny to allow duplicate forward defs; need to expand - // // data_type to exclude IDs, or add id__SEMI rule | yTYPEDEF id ';' { $$ = GRAMMARP->createTypedefFwd($2, *$2); } | yTYPEDEF yENUM idAny ';' { $$ = GRAMMARP->createTypedefFwd($3, *$3); } | yTYPEDEF ySTRUCT idAny ';' { $$ = GRAMMARP->createTypedefFwd($3, *$3); } @@ -6192,9 +6216,9 @@ dist_list: // ==IEEE: dist_list ; dist_item: // ==IEEE: dist_item + dist_weight - value_range { $$ = $1; } - | value_range yP_COLONEQ expr { $$ = $1; BBUNSUP($1, "Unsupported: dist :="); } - | value_range yP_COLONDIV expr { $$ = $1; BBUNSUP($1, "Unsupported: dist :/"); } + value_range { $$ = $1; /* Same as := 1 */ } + | value_range yP_COLONEQ expr { $$ = $1; nullptr; /*UNSUP-no-UVM*/ } + | value_range yP_COLONDIV expr { $$ = $1; nullptr; /*UNSUP-no-UVM*/ } ; //UNSUPextern_constraint_declaration: // ==IEEE: extern_constraint_declaration diff --git a/test_regress/t/t_randomize.out b/test_regress/t/t_randomize.out index 960ede653..7f05355de 100644 --- a/test_regress/t/t_randomize.out +++ b/test_regress/t/t_randomize.out @@ -4,15 +4,6 @@ %Error-UNSUPPORTED: t/t_randomize.v:29:29: Unsupported: solve before 29 | constraint order { solve length before header; } | ^~~~~~ -%Error-UNSUPPORTED: t/t_randomize.v:32:16: Unsupported: dist :/ - 32 | x dist { [100:102] :/ 1, 200 := 2, 300 := 5, 400}; - | ^ -%Error-UNSUPPORTED: t/t_randomize.v:32:32: Unsupported: dist := - 32 | x dist { [100:102] :/ 1, 200 := 2, 300 := 5, 400}; - | ^~~ -%Error-UNSUPPORTED: t/t_randomize.v:32:42: Unsupported: dist := - 32 | x dist { [100:102] :/ 1, 200 := 2, 300 := 5, 400}; - | ^~~ %Error-UNSUPPORTED: t/t_randomize.v:32:9: Unsupported: dist 32 | x dist { [100:102] :/ 1, 200 := 2, 300 := 5, 400}; | ^~~~ diff --git a/test_regress/t/t_typedef.v b/test_regress/t/t_typedef.v index 8b135cc9b..0ea3d25de 100644 --- a/test_regress/t/t_typedef.v +++ b/test_regress/t/t_typedef.v @@ -4,11 +4,15 @@ // any use, without warranty, 2009 by Wilson Snyder. // SPDX-License-Identifier: CC0-1.0 +package pkg; + typedef bit pkg_bit_t; +endpackage + program t; parameter SIZE = 5; typedef vec_t; // Forward - //UNSUP typedef vec_t; // Multi-forward is ok + typedef vec_t; // Multi-forward is ok typedef reg [SIZE-1:0] vec_t; vec_t a; initial a =0; @@ -20,6 +24,8 @@ program t; typedef array_t array2_t [2]; array2_t ar [1]; + typedef pkg::pkg_bit_t lcl_pkg_bit_t; + // Define before use // Not sure how well supported this is elsewhere //UNSUP typedef preuse;