Fix base type for nested types with enum or atom2 sub-types

To determine the base type structs and packed arrays call the
figure_packed_base_type() for their sub-types.

This method is not defined for enum or atom2 types and the default
implementation returns IVL_VT_NO_TYPE.

As a result packed arrays of enum or atom2 types and packed structs with
members of enum or atom2 types get elaborated with IVL_VT_NO_TYPE
as the base type.

For example

```
struct packed {
  bit signed [31:0] x;
} s1;
```

gets elaborated with a base type of IVL_VT_BOOL, while

```
struct packed {
  int x;
} s2;
```

gets elaborated with a base type of IVL_VT_NONE.

To fix this define the figure_packed_base_type() for enum_type_t and
atom2_type_t.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
Lars-Peter Clausen 2022-01-08 14:20:35 +01:00
parent 52925ce9ff
commit adf64f3cc8
2 changed files with 14 additions and 0 deletions

View File

@ -48,6 +48,16 @@ ivl_variable_type_t vector_type_t::figure_packed_base_type(void) const
return base_type;
}
ivl_variable_type_t enum_type_t::figure_packed_base_type() const
{
return base_type;
}
ivl_variable_type_t atom2_type_t::figure_packed_base_type() const
{
return IVL_VT_BOOL;
}
atom2_type_t size_type (32, true);
PNamedItem::SymbolType enum_type_t::symbol_type() const

View File

@ -182,6 +182,8 @@ struct enum_type_t : public data_type_t {
// Return the elaborated version of the type.
virtual ivl_type_s*elaborate_type_raw(Design*des, NetScope*scope) const;
ivl_variable_type_t figure_packed_base_type() const;
SymbolType symbol_type() const;
ivl_variable_type_t base_type;
@ -217,6 +219,8 @@ struct atom2_type_t : public data_type_t {
virtual std::ostream& debug_dump(std::ostream&out) const;
ivl_type_s* elaborate_type_raw(Design*des, NetScope*scope) const;
ivl_variable_type_t figure_packed_base_type() const;
};
extern atom2_type_t size_type;