Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/hw_cbmc_irep_ids.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ IREP_ID_ONE(verilog_associative_array)
IREP_ID_ONE(verilog_declarations)
IREP_ID_ONE(verilog_default_clocking)
IREP_ID_ONE(verilog_default_disable)
IREP_ID_ONE(verilog_identifier)
IREP_ID_ONE(verilog_interconnect)
IREP_ID_ONE(verilog_lifetime)
IREP_ID_ONE(verilog_logical_equality)
Expand Down
1 change: 1 addition & 0 deletions src/verilog/parser.y
Original file line number Diff line number Diff line change
Expand Up @@ -4768,6 +4768,7 @@ hierarchical_identifier:
| hierarchical_identifier '.' identifier
{ init($$, ID_hierarchical_identifier);
stack_expr($$).reserve_operands(2);
stack_expr($3).id(ID_verilog_identifier);
mto($$, $1);
mto($$, $3);
}
Expand Down
36 changes: 33 additions & 3 deletions src/verilog/verilog_expr.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,36 @@ Author: Daniel Kroening, kroening@kroening.com

#include <util/std_expr.h>

/// A simple Verilog identifier, unqualified
class verilog_identifier_exprt : public nullary_exprt
{
public:
const irep_idt &base_name() const
{
return get(ID_base_name);
}

void identifier(irep_idt _base_name)
{
set(ID_base_name, _base_name);
}
};

inline const verilog_identifier_exprt &
to_verilog_identifier_expr(const exprt &expr)
{
PRECONDITION(expr.id() == ID_verilog_identifier);
verilog_identifier_exprt::check(expr);
return static_cast<const verilog_identifier_exprt &>(expr);
}

inline verilog_identifier_exprt &to_verilog_identifier_expr(exprt &expr)
{
PRECONDITION(expr.id() == ID_verilog_identifier);
verilog_identifier_exprt::check(expr);
return static_cast<verilog_identifier_exprt &>(expr);
}

/// The syntax for these A.B, where A is a module identifier and B
/// is an identifier within that module. B is given als symbol_exprt.
class hierarchical_identifier_exprt : public binary_exprt
Expand All @@ -21,12 +51,12 @@ class hierarchical_identifier_exprt : public binary_exprt
return op0();
}

const symbol_exprt &item() const
const verilog_identifier_exprt &item() const
{
return static_cast<const symbol_exprt &>(binary_exprt::op1());
return static_cast<const verilog_identifier_exprt &>(binary_exprt::op1());
}

const symbol_exprt &rhs() const
const verilog_identifier_exprt &rhs() const
{
return item();
}
Expand Down
4 changes: 2 additions & 2 deletions src/verilog/verilog_synthesis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -510,12 +510,12 @@ void verilog_synthesist::expand_hierarchical_identifier(
const irep_idt &lhs_identifier = expr.lhs().get(ID_identifier);

// rhs
const irep_idt &rhs_identifier = expr.rhs().get_identifier();
const irep_idt &rhs_base_name = expr.rhs().base_name();

// just patch together

irep_idt full_identifier =
id2string(lhs_identifier) + '.' + id2string(rhs_identifier);
id2string(lhs_identifier) + '.' + id2string(rhs_base_name);

// Note: the instance copy may not yet be in symbol table,
// as the inst module item may be later.
Expand Down
2 changes: 1 addition & 1 deletion src/verilog/verilog_typecheck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -962,7 +962,7 @@ void verilog_typecheckt::convert_parameter_override(

auto module_instance =
to_symbol_expr(hierarchical_identifier.module()).get_identifier();
auto parameter_base_name = hierarchical_identifier.item().get_identifier();
auto parameter_base_name = hierarchical_identifier.item().base_name();

// The rhs must be a constant at this point.
auto rhs_value =
Expand Down
18 changes: 10 additions & 8 deletions src/verilog/verilog_typecheck_expr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1421,19 +1421,21 @@ exprt verilog_typecheck_exprt::convert_hierarchical_identifier(
{
convert_expr(expr.lhs());

DATA_INVARIANT(expr.rhs().id() == ID_symbol, "expected symbol on rhs of `.'");
DATA_INVARIANT(
expr.rhs().id() == ID_verilog_identifier,
"expected verilog_identifier as rhs of `.'");

const irep_idt &rhs_identifier = expr.rhs().get_identifier();
const irep_idt &rhs_base_name = expr.rhs().base_name();

if(expr.lhs().type().id() == ID_struct || expr.lhs().type().id() == ID_union)
{
// look up the component
auto &compound_type = to_struct_union_type(expr.lhs().type());
auto &component = compound_type.get_component(rhs_identifier);
auto &component = compound_type.get_component(rhs_base_name);
if(component.is_nil())
throw errort().with_location(expr.source_location())
<< compound_type.id() << " does not have a member named "
<< rhs_identifier;
<< rhs_base_name;

// create the member expression
return member_exprt{expr.lhs(), component.get_name(), component.type()}
Expand Down Expand Up @@ -1467,7 +1469,7 @@ exprt verilog_typecheck_exprt::convert_hierarchical_identifier(

// the identifier in the module
const irep_idt full_identifier =
id2string(module) + "." + id2string(rhs_identifier);
id2string(module) + "." + id2string(rhs_base_name);

const symbolt *symbol;
if(!ns.lookup(full_identifier, symbol))
Expand All @@ -1485,7 +1487,7 @@ exprt verilog_typecheck_exprt::convert_hierarchical_identifier(
else
{
throw errort().with_location(expr.source_location())
<< "identifier `" << rhs_identifier << "' not found in module `"
<< "identifier `" << rhs_base_name << "' not found in module `"
<< module_instance_symbol->pretty_name << "'";
}

Expand All @@ -1497,7 +1499,7 @@ exprt verilog_typecheck_exprt::convert_hierarchical_identifier(
else if(expr.lhs().type().id() == ID_named_block)
{
const irep_idt full_identifier =
id2string(lhs_identifier) + "." + id2string(rhs_identifier);
id2string(lhs_identifier) + "." + id2string(rhs_base_name);

const symbolt *symbol;
if(!ns.lookup(full_identifier, symbol))
Expand All @@ -1519,7 +1521,7 @@ exprt verilog_typecheck_exprt::convert_hierarchical_identifier(
else
{
throw errort().with_location(expr.source_location())
<< "identifier `" << rhs_identifier << "' not found in named block";
<< "identifier `" << rhs_base_name << "' not found in named block";
}
}
else
Expand Down
Loading