mirror of
https://github.com/steveicarus/iverilog.git
synced 2026-08-28 16:53:45 +02:00
SystemVerilog supports forward type declarations. This allows to declare a type identifier and use it, e.g. in a signal declaration, before declaring what the actual type is. The type still needs to be fully defined eventually in the same scope as its forward type declaration. E.g. ``` typedef T; T x; typedef int T; ``` The forward type definition can also contain the kind of the type it is going to be. E.g struct, union, class, etc. The LRM calls this the basic type. If the actual type is not of the basic type specified in the forward type declaration this is an error. E.g. ``` typedef struct T; typedef int T; // Error, int is not a struct ``` It is legal to have more than one forward type declaration for the same type name, as long as the basic type is the compatible. It is even legal to have a forward type declaration after the actual type has already been declared. E.g. ``` typedef T; typedef int T; typedef T; ``` Implement support for forward type definitions as part of the new typedef_t. The basic type will be attached to the typedef_t. The compatibility of the basic type for multiple forward type declarations will be checked in the parser. The compatibility of the basic type to the actual type will be checked during elaboration, once the actual type is known. Signed-off-by: Lars-Peter Clausen <[email protected]>
92 lines
1.9 KiB
C++
92 lines
1.9 KiB
C++
/*
|
|
* Copyright (c) 2007-2019 Stephen Williams ([email protected])
|
|
*
|
|
* This source code is free software; you can redistribute it
|
|
* and/or modify it in source code form under the terms of the GNU
|
|
* General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
|
|
# include "pform_types.h"
|
|
|
|
data_type_t::~data_type_t()
|
|
{
|
|
}
|
|
|
|
PNamedItem::SymbolType data_type_t::symbol_type() const
|
|
{
|
|
return TYPE;
|
|
}
|
|
|
|
string_type_t::~string_type_t()
|
|
{
|
|
}
|
|
|
|
atom_type_t size_type (atom_type_t::INT, true);
|
|
|
|
PNamedItem::SymbolType enum_type_t::symbol_type() const
|
|
{
|
|
return ENUM;
|
|
}
|
|
|
|
PNamedItem::SymbolType class_type_t::symbol_type() const
|
|
{
|
|
return CLASS;
|
|
}
|
|
|
|
bool typedef_t::set_data_type(data_type_t *t)
|
|
{
|
|
if (data_type.get())
|
|
return false;
|
|
|
|
data_type.reset(t);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool typedef_t::set_basic_type(enum basic_type bt)
|
|
{
|
|
if (bt == ANY)
|
|
return true;
|
|
if (basic_type != ANY && bt != basic_type)
|
|
return false;
|
|
|
|
basic_type = bt;
|
|
|
|
return true;
|
|
}
|
|
|
|
std::ostream& operator<< (std::ostream&out, enum typedef_t::basic_type bt)
|
|
{
|
|
switch (bt) {
|
|
case typedef_t::ANY:
|
|
out << "any";
|
|
break;
|
|
case typedef_t::ENUM:
|
|
out << "enum";
|
|
break;
|
|
case typedef_t::STRUCT:
|
|
out << "struct";
|
|
break;
|
|
case typedef_t::UNION:
|
|
out << "union";
|
|
break;
|
|
case typedef_t::CLASS:
|
|
out << "class";
|
|
break;
|
|
}
|
|
|
|
return out;
|
|
}
|