From af197f2cebd1334adc15d7abad97e557571b3cae Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Mon, 29 Jun 2020 21:03:14 -0400 Subject: [PATCH] Parser: Move 'virtual class' block unsupported messages down out of parser --- src/V3AstNodes.h | 3 +++ src/V3Width.cpp | 1 + src/verilog.y | 7 ++++--- test_regress/t/t_class_unsup_bad.out | 3 --- test_regress/t/t_class_virtual.out | 4 ++++ test_regress/t/t_class_virtual.pl | 19 +++++++++++++++++++ test_regress/t/t_class_virtual.v | 8 ++++++++ test_regress/t/t_class_vparam_unsup.out | 3 --- 8 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 test_regress/t/t_class_virtual.out create mode 100755 test_regress/t/t_class_virtual.pl create mode 100644 test_regress/t/t_class_virtual.v diff --git a/src/V3AstNodes.h b/src/V3AstNodes.h index f8edd6d32..1cc314c45 100644 --- a/src/V3AstNodes.h +++ b/src/V3AstNodes.h @@ -301,6 +301,7 @@ class AstClass : public AstNodeModule { // MEMBERS MemberNameMap m_members; // Members or method children AstClassPackage* m_packagep; // Class package this is under + bool m_virtual; // Virtual class void insertCache(AstNode* nodep); public: @@ -333,6 +334,8 @@ public: MemberNameMap::const_iterator it = m_members.find(name); return (it == m_members.end()) ? NULL : it->second; } + bool isVirtual() const { return m_virtual; } + void isVirtual(bool flag) { m_virtual = flag; } }; class AstClassExtends : public AstNode { diff --git a/src/V3Width.cpp b/src/V3Width.cpp index 129f4ec36..914e72665 100644 --- a/src/V3Width.cpp +++ b/src/V3Width.cpp @@ -1962,6 +1962,7 @@ private: virtual void visit(AstClass* nodep) VL_OVERRIDE { if (nodep->didWidthAndSet()) return; userIterateChildren(nodep, NULL); // First size all members + if (nodep->isVirtual()) nodep->v3warn(E_UNSUPPORTED, "Unsupported: virtual class"); nodep->repairCache(); } virtual void visit(AstClassRefDType* nodep) VL_OVERRIDE { diff --git a/src/verilog.y b/src/verilog.y index ad2566570..544afbed7 100644 --- a/src/verilog.y +++ b/src/verilog.y @@ -5804,6 +5804,7 @@ class_declaration: // ==IEEE: part of class_declaration classFront: // IEEE: part of class_declaration classVirtualE yCLASS lifetimeE idAny/*class_identifier*/ { $$ = new AstClass($2, *$4); + $$->isVirtual($1); $$->lifetime($3); SYMP->pushNew($$); } // // IEEE: part of interface_class_declaration @@ -5814,9 +5815,9 @@ classFront: // IEEE: part of class_declaration BBUNSUP($2, "Unsupported: interface classes"); } ; -classVirtualE: - /* empty */ { } - | yVIRTUAL__CLASS { BBUNSUP($1, "Unsupported: virtual classes"); } +classVirtualE: + /* empty */ { $$ = false; } + | yVIRTUAL__CLASS { $$ = true; } ; classExtendsE: // IEEE: part of class_declaration diff --git a/test_regress/t/t_class_unsup_bad.out b/test_regress/t/t_class_unsup_bad.out index 5d0eef765..8adc7beca 100644 --- a/test_regress/t/t_class_unsup_bad.out +++ b/test_regress/t/t_class_unsup_bad.out @@ -22,9 +22,6 @@ %Error-UNSUPPORTED: t/t_class_unsup_bad.v:29:4: Unsupported: extern class method prototype 29 | extern task exttask; | ^~~~~~ -%Error-UNSUPPORTED: t/t_class_unsup_bad.v:32:1: Unsupported: virtual classes - 32 | virtual class VC; - | ^~~~~~~ %Error-UNSUPPORTED: t/t_class_unsup_bad.v:42:4: Unsupported: virtual class member qualifier 42 | virtual function uvm_root get_root(); | ^~~~~~~ diff --git a/test_regress/t/t_class_virtual.out b/test_regress/t/t_class_virtual.out new file mode 100644 index 000000000..7dbccdbfd --- /dev/null +++ b/test_regress/t/t_class_virtual.out @@ -0,0 +1,4 @@ +%Error-UNSUPPORTED: t/t_class_virtual.v:7:9: Unsupported: virtual class + 7 | virtual class VC; + | ^~~~~ +%Error: Exiting due to diff --git a/test_regress/t/t_class_virtual.pl b/test_regress/t/t_class_virtual.pl new file mode 100755 index 000000000..009248fc5 --- /dev/null +++ b/test_regress/t/t_class_virtual.pl @@ -0,0 +1,19 @@ +#!/usr/bin/env perl +if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; } +# DESCRIPTION: Verilator: Verilog Test driver/expect definition +# +# Copyright 2020 by Wilson Snyder. This program is free software; you +# can redistribute it and/or modify it under the terms of either the GNU +# Lesser General Public License Version 3 or the Perl Artistic License +# Version 2.0. +# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 + +scenarios(vlt => 1); + +lint( + fails => 1, + expect_filename => $Self->{golden_filename}, + ); + +ok(1); +1; diff --git a/test_regress/t/t_class_virtual.v b/test_regress/t/t_class_virtual.v new file mode 100644 index 000000000..b386c6b8b --- /dev/null +++ b/test_regress/t/t_class_virtual.v @@ -0,0 +1,8 @@ +// DESCRIPTION: Verilator: Verilog Test module +// +// This file ONLY is placed under the Creative Commons Public Domain, for +// any use, without warranty, 2019 by Wilson Snyder. +// SPDX-License-Identifier: CC0-1.0 + +virtual class VC; +endclass diff --git a/test_regress/t/t_class_vparam_unsup.out b/test_regress/t/t_class_vparam_unsup.out index 22a63a886..084f5eeb2 100644 --- a/test_regress/t/t_class_vparam_unsup.out +++ b/test_regress/t/t_class_vparam_unsup.out @@ -1,6 +1,3 @@ -%Error-UNSUPPORTED: t/t_class_vparam_unsup.v:12:1: Unsupported: virtual classes - 12 | virtual class vclass #(type CTYPE_t = arg_class_t); - | ^~~~~~~ %Error-UNSUPPORTED: t/t_class_vparam_unsup.v:13:58: Unsupported: Parameter classes 13 | pure virtual function void funcname(paramed_class_t #(CTYPE_t) v); | ^~~~~~~