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
7 changes: 7 additions & 0 deletions regression/ebmc/smv-word-level/verilog6.desc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
CORE
verilog6.sv
--smv-word-level
^CTLSPEC 0ud8_1 \+ 0ub6_000000 :: -0sd2_1 = 0ud8_4$
^EXIT=0$
^SIGNAL=0$
--
6 changes: 6 additions & 0 deletions regression/ebmc/smv-word-level/verilog6.sv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module main(input clk, input in);

// The RHS of the addition will be zero-extended
initial p1: assert property (8'b1 + 2'sb11 == 8'b100);

endmodule
36 changes: 36 additions & 0 deletions src/smvlang/expr2smv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,25 @@ expr2smvt::resultt expr2smvt::convert_typecast(const typecast_exprt &expr)

/*******************************************************************\

Function: expr2smvt::convert_zero_extend

Inputs:

Outputs:

Purpose:

\*******************************************************************/

expr2smvt::resultt expr2smvt::convert_zero_extend(const zero_extend_exprt &expr)
{
// Both "extend" and "resize" do sign extension.
// Hence, use lowering.
return convert_rec(expr.lower());
}

/*******************************************************************\

Function: expr2smvt::convert_rtctl

Inputs:
Expand Down Expand Up @@ -662,6 +681,20 @@ expr2smvt::resultt expr2smvt::convert_constant(const constant_exprt &src)
dest = minus + std::string("0") + sign_specifier + 'd' +
std::to_string(word_width) + '_' + integer2string(value_abs);
}
else if(type.id() == ID_bv)
{
auto &bv_type = to_bv_type(type);
auto width = bv_type.width();
auto &src_value = src.get_value();
dest = std::string("0ub");
dest += std::to_string(width);
dest += '_';
for(std::size_t i = 0; i < width; i++)
{
bool bit = get_bvrep_bit(src_value, width, width - i - 1);
dest += bit ? '1' : '0';
}
}
else
return convert_norep(src);

Expand Down Expand Up @@ -912,6 +945,9 @@ expr2smvt::resultt expr2smvt::convert_rec(const exprt &src)
return convert_typecast(to_typecast_expr(src));
}

else if(src.id() == ID_zero_extend)
return convert_zero_extend(to_zero_extend_expr(src));

else // no SMV language expression for internal representation
return convert_norep(src);
}
Expand Down
2 changes: 2 additions & 0 deletions src/smvlang/expr2smv_class.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,8 @@ class expr2smvt

resultt convert_typecast(const typecast_exprt &);

resultt convert_zero_extend(const zero_extend_exprt &);

resultt convert_norep(const exprt &);
};

Expand Down
3 changes: 3 additions & 0 deletions src/verilog/expr2verilog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2007,6 +2007,9 @@ expr2verilogt::resultt expr2verilogt::convert_rec(const exprt &src)
return convert_function(src.id_string(), src);
}

else if(src.id() == ID_zero_extend)
return convert_rec(to_zero_extend_expr(src).op());

// no VERILOG language expression for internal representation
return convert_norep(src);
}
Expand Down
35 changes: 1 addition & 34 deletions src/verilog/verilog_typecheck_expr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -302,39 +302,6 @@ void verilog_typecheck_exprt::assignment_conversion(

/*******************************************************************\

Function: zero_extend

Inputs:

Outputs:

Purpose:

\*******************************************************************/

static exprt zero_extend(const exprt &expr, const typet &type)
{
auto old_width = expr.type().id() == ID_bool ? 1
: expr.type().id() == ID_integer
? 32
: to_bitvector_type(expr.type()).get_width();

// first make unsigned
typet tmp_type;

if(type.id() == ID_unsignedbv)
tmp_type = unsignedbv_typet{old_width};
else if(type.id() == ID_verilog_unsignedbv)
tmp_type = verilog_unsignedbv_typet{old_width};
else
PRECONDITION(false);

return typecast_exprt::conditional_cast(
typecast_exprt::conditional_cast(expr, tmp_type), type);
}

/*******************************************************************\

Function: verilog_typecheck_exprt::downwards_type_progatation

Inputs:
Expand Down Expand Up @@ -411,7 +378,7 @@ void verilog_typecheck_exprt::downwards_type_propagation(
// "If the operand shall be extended, then it shall be sign-extended only
// if the propagated type is signed."
// A typecast from signed to a larger unsigned would sign extend.
expr = zero_extend(expr, type);
expr = zero_extend_exprt{expr, type};
}
else
{
Expand Down
Loading