Skip to content

Commit

Permalink
Use real_type_t as the data type for real type signals
Browse files Browse the repository at this point in the history
Currently a `vector_type_t` with the base type set to `IVL_VT_REAL` is used as
the data type for real type signals. But there is also the `real_type_t` data
type, which is used as the data type for function return types and class
properties.

Move signals also over to using `real_type_t`. This ensures consistent
behavior between all sorts of constructs with a data type, makes sure that
`vector_type_t` is only used for vector types.

It also allows to eventually differentiate between `real` and `shortreal`
at the elaboration stage. Currently this information is discarded by the
parser.

Signed-off-by: Lars-Peter Clausen <[email protected]>
  • Loading branch information
larsclausen committed Apr 12, 2022
1 parent 4d0f005 commit 1bf568d
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 17 deletions.
10 changes: 2 additions & 8 deletions elab_sig.cc
Original file line number Diff line number Diff line change
Expand Up @@ -937,12 +937,7 @@ bool test_ranges_eeq(const vector<netrange_t>&lef, const vector<netrange_t>&rig)
ivl_type_t PWire::elaborate_type(Design*des, NetScope*scope,
const std::vector<netrange_t>&packed_dimensions) const
{
if (dynamic_cast<struct_type_t*>(set_data_type_) ||
dynamic_cast<enum_type_t*>(set_data_type_) ||
dynamic_cast<string_type_t*>(set_data_type_) ||
dynamic_cast<class_type_t*>(set_data_type_) ||
dynamic_cast<parray_type_t*>(set_data_type_) ||
dynamic_cast<atom_type_t*>(set_data_type_)) {
if (set_data_type_ && !dynamic_cast<vector_type_t*>(set_data_type_)) {
ivl_type_t use_type = set_data_type_->elaborate_type(des, scope);
ivl_assert(*this, packed_dimensions.empty());
return use_type;
Expand All @@ -962,8 +957,7 @@ ivl_type_t PWire::elaborate_type(Design*des, NetScope*scope,
}

ivl_assert(*this, use_data_type == IVL_VT_LOGIC ||
use_data_type == IVL_VT_BOOL ||
use_data_type == IVL_VT_REAL);
use_data_type == IVL_VT_BOOL);

netvector_t*vec = new netvector_t(packed_dimensions, use_data_type);
vec->set_signed(get_signed());
Expand Down
1 change: 1 addition & 0 deletions netlist.cc
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
# include "netdarray.h"
# include "netenum.h"
# include "netparray.h"
# include "netscalar.h"
# include "netqueue.h"
# include "netstruct.h"
# include "netvector.h"
Expand Down
13 changes: 5 additions & 8 deletions pform.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2569,7 +2569,6 @@ void pform_module_define_port(const struct vlltype&li,
list<named_pexpr_t>*attr,
bool keep_attr)
{
data_type_t*packed_type = 0;
ivl_variable_type_t data_type = IVL_VT_NO_TYPE;
bool signed_flag = false;

Expand Down Expand Up @@ -2601,6 +2600,7 @@ void pform_module_define_port(const struct vlltype&li,
data_type = vec_type->base_type;
signed_flag = vec_type->signed_flag;
prange = vec_type->pdims.get();
vtype = 0;
} else if (real_type_t*rtype = dynamic_cast<real_type_t*>(vtype)) {
data_type = IVL_VT_REAL;
signed_flag = true;
Expand All @@ -2614,7 +2614,6 @@ void pform_module_define_port(const struct vlltype&li,
} else if (vtype) {
if (vtype->figure_packed_base_type() != IVL_VT_NO_TYPE) {
data_type = vtype->figure_packed_base_type();
packed_type = vtype;
} else {
VLerror(li, "sorry: Given type %s not supported here (%s:%d).",
typeid(*vtype).name(), __FILE__, __LINE__);
Expand All @@ -2631,10 +2630,10 @@ void pform_module_define_port(const struct vlltype&li,

cur->set_signed(signed_flag);

if (packed_type) {
cur->set_data_type(packed_type);
if (vtype)
cur->set_data_type(vtype);

} else if (prange == 0) {
if (prange == 0) {
cur->set_range_scalar((type == NetNet::IMPLICIT) ? SR_PORT : SR_BOTH);

} else {
Expand Down Expand Up @@ -2966,8 +2965,7 @@ vector<pform_tf_port_t>*pform_make_task_ports(const struct vlltype&loc,
}

if (/*real_type_t*real_type = */ dynamic_cast<real_type_t*> (vtype)) {
ret = pform_make_task_ports(loc, pt, IVL_VT_REAL,
true, 0, ports);
ret = do_make_task_ports(loc, pt, IVL_VT_REAL, vtype, ports);
}

if (dynamic_cast<string_type_t*> (vtype)) {
Expand Down Expand Up @@ -3442,7 +3440,6 @@ void pform_set_data_type(const struct vlltype&li, data_type_t*data_type, list<pe
}

else if (/*real_type_t*real_type =*/ dynamic_cast<real_type_t*> (data_type)) {
pform_set_net_range(names, 0, true, 0);
vt = IVL_VT_REAL;
}

Expand Down
4 changes: 3 additions & 1 deletion pform_disciplines.cc
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,9 @@ void pform_attach_discipline(const struct vlltype&loc,
error_count += 1;

} else {
cur_net->set_data_type(IVL_VT_REAL);
data_type_t *type = new real_type_t(real_type_t::REAL);
FILE_NAME(type, loc);
cur_net->set_data_type(type);
cur_net->set_discipline(discipline);
}
}
Expand Down

0 comments on commit 1bf568d

Please sign in to comment.