Skip to content

Commit cb249de

Browse files
committed
Verilog: use zero_extend_exprt
This replaces a custom encoding via typecast_exprt used in the Verilog front-end by zero_extend_exprt.
1 parent 2ef7d0f commit cb249de

File tree

3 files changed

+34
-34
lines changed

3 files changed

+34
-34
lines changed

src/verilog/expr2verilog.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2007,6 +2007,9 @@ expr2verilogt::resultt expr2verilogt::convert_rec(const exprt &src)
20072007
return convert_function(src.id_string(), src);
20082008
}
20092009

2010+
else if(src.id() == ID_zero_extend)
2011+
return convert_rec(to_zero_extend_expr(src).op());
2012+
20102013
// no VERILOG language expression for internal representation
20112014
return convert_norep(src);
20122015
}

src/verilog/verilog_lowering.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,36 @@ exprt verilog_lowering(exprt expr)
625625
else
626626
return expr;
627627
}
628+
else if(expr.id() == ID_zero_extend)
629+
{
630+
auto tmp_op = to_zero_extend_expr(expr).op();
631+
632+
if(tmp_op.type().id() == ID_bool)
633+
{
634+
tmp_op = typecast_exprt{expr, unsignedbv_typet{1}};
635+
}
636+
else if(expr.type().id() == ID_integer)
637+
{
638+
tmp_op = typecast_exprt{expr, unsignedbv_typet{32}};
639+
}
640+
641+
auto old_width = to_bitvector_type(tmp_op.type()).get_width();
642+
643+
// first make unsigned
644+
typet tmp_type;
645+
646+
if(expr.type().id() == ID_unsignedbv)
647+
tmp_type = unsignedbv_typet{old_width};
648+
else if(expr.type().id() == ID_verilog_unsignedbv)
649+
tmp_type = verilog_unsignedbv_typet{old_width};
650+
else
651+
PRECONDITION(false);
652+
653+
auto unsigned_op = verilog_lowering_cast(typecast_exprt{tmp_op, tmp_type});
654+
655+
// then cast to target type
656+
return verilog_lowering_cast(typecast_exprt{unsigned_op, expr.type()});
657+
}
628658
else
629659
return expr; // leave as is
630660

src/verilog/verilog_typecheck_expr.cpp

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -222,39 +222,6 @@ void verilog_typecheck_exprt::propagate_type(
222222

223223
/*******************************************************************\
224224
225-
Function: zero_extend
226-
227-
Inputs:
228-
229-
Outputs:
230-
231-
Purpose:
232-
233-
\*******************************************************************/
234-
235-
static exprt zero_extend(const exprt &expr, const typet &type)
236-
{
237-
auto old_width = expr.type().id() == ID_bool ? 1
238-
: expr.type().id() == ID_integer
239-
? 32
240-
: to_bitvector_type(expr.type()).get_width();
241-
242-
// first make unsigned
243-
typet tmp_type;
244-
245-
if(type.id() == ID_unsignedbv)
246-
tmp_type = unsignedbv_typet{old_width};
247-
else if(type.id() == ID_verilog_unsignedbv)
248-
tmp_type = verilog_unsignedbv_typet{old_width};
249-
else
250-
PRECONDITION(false);
251-
252-
return typecast_exprt::conditional_cast(
253-
typecast_exprt::conditional_cast(expr, tmp_type), type);
254-
}
255-
256-
/*******************************************************************\
257-
258225
Function: verilog_typecheck_exprt::downwards_type_progatation
259226
260227
Inputs:
@@ -331,7 +298,7 @@ void verilog_typecheck_exprt::downwards_type_propagation(
331298
// "If the operand shall be extended, then it shall be sign-extended only
332299
// if the propagated type is signed."
333300
// A typecast from signed to a larger unsigned would sign extend.
334-
expr = zero_extend(expr, type);
301+
expr = zero_extend_exprt{expr, type};
335302
}
336303
else
337304
{

0 commit comments

Comments
 (0)