Skip to content

Commit 9ee1fa2

Browse files
authored
Merge pull request #569 from diffblue/avalbval-tc
cast from 2-valued to aval/bval 4-valued vectors
2 parents b991263 + f4913b1 commit 9ee1fa2

File tree

4 files changed

+25
-20
lines changed

4 files changed

+25
-20
lines changed

regression/verilog/expressions/equality2.desc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG
1+
CORE broken-smt-backend
22
equality2.v
33
--bound 0
44
^EXIT=0$

regression/verilog/expressions/equality2.v

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ module main;
22

33
always assert property01: (10===10)==1;
44
always assert property02: (10===20)==0;
5-
always assert property03: (10!==10)==1;
6-
always assert property04: (10!==20)==0;
5+
always assert property03: (10!==10)==0;
6+
always assert property04: (10!==20)==1;
77
always assert property05: ('bx==='bx)==1;
88
always assert property06: ('bz==='bz)==1;
99
always assert property07: ('bx==='bz)==0;
1010
always assert property08: ('bx==='b1)==0;
1111
always assert property09: ('bz==='b1)==0;
1212
always assert property10: ('b1==='b01)==1; // zero extension
13-
always assert property11: ('b1==='sb11)==0; // zero extension
14-
always assert property12: ('sb1==='sb11)==1; // sign extension
13+
always assert property11: ('b011==='sb11)==1; // zero extension
14+
always assert property12: ('sb011==='sb11)==1; // sign extension
1515

1616
endmodule

src/verilog/aval_bval_encoding.cpp

+19-9
Original file line numberDiff line numberDiff line change
@@ -146,22 +146,32 @@ combine_aval_bval(const exprt &aval, const exprt &bval, const typet &dest)
146146

147147
exprt aval_bval_conversion(const exprt &src, const typet &dest)
148148
{
149-
PRECONDITION(is_aval_bval(src.type()));
150149
PRECONDITION(is_aval_bval(dest));
151-
152-
auto src_width = aval_bval_width(src.type());
153150
auto dest_width = aval_bval_width(dest);
154151

155-
if(src_width == dest_width)
152+
if(is_aval_bval(src.type()))
156153
{
157-
// same size
158-
return typecast_exprt{src, dest};
154+
auto src_width = aval_bval_width(src.type());
155+
156+
if(src_width == dest_width)
157+
{
158+
// same size
159+
return typecast_exprt{src, dest};
160+
}
161+
else
162+
{
163+
auto new_aval = adjust_size(aval(src), dest_width);
164+
auto new_bval = adjust_size(bval(src), dest_width);
165+
return combine_aval_bval(new_aval, new_bval, dest);
166+
}
159167
}
160168
else
161169
{
162-
auto new_aval = adjust_size(aval(src), dest_width);
163-
auto new_bval = adjust_size(bval(src), dest_width);
164-
return combine_aval_bval(new_aval, new_bval, dest);
170+
const bv_typet bv_type{dest_width};
171+
auto aval =
172+
typecast_exprt{typecast_exprt{src, aval_bval_underlying(dest)}, bv_type};
173+
auto bval = bv_type.all_zeros_expr();
174+
return combine_aval_bval(aval, bval, dest);
165175
}
166176
}
167177

src/verilog/verilog_synthesis.cpp

+1-6
Original file line numberDiff line numberDiff line change
@@ -268,12 +268,7 @@ exprt verilog_synthesist::synth_expr(exprt expr, symbol_statet symbol_state)
268268
dest_type.id() == ID_verilog_signedbv)
269269
{
270270
auto aval_bval_type = lower_to_aval_bval(dest_type);
271-
272-
if(is_aval_bval(src_type))
273-
{
274-
// separately convert aval and bval
275-
return aval_bval_conversion(typecast_expr.op(), aval_bval_type);
276-
}
271+
return aval_bval_conversion(typecast_expr.op(), aval_bval_type);
277272
}
278273
else if(dest_type.id() == ID_struct)
279274
{

0 commit comments

Comments
 (0)