@@ -122,6 +122,22 @@ exprt aval(const exprt &src)
122122 }
123123}
124124
125+ exprt aval_underlying (const exprt &src)
126+ {
127+ if (is_aval_bval (src.type ()))
128+ {
129+ auto type = aval_bval_underlying (src.type ());
130+ if (type.id () == ID_bool)
131+ return extractbit_exprt{src, 0 };
132+ else
133+ return extractbits_exprt{src, 0 , type};
134+ }
135+ else
136+ {
137+ return src;
138+ }
139+ }
140+
125141exprt bval (const exprt &src)
126142{
127143 if (is_aval_bval (src.type ()))
@@ -225,10 +241,11 @@ exprt has_xz(const exprt &expr)
225241}
226242
227243// / return 'x', one bit
228- exprt make_x ()
244+ exprt make_x (const typet &type )
229245{
230- auto type = verilog_unsignedbv_typet{1 };
231- return lower_to_aval_bval (constant_exprt{ID_x, type});
246+ PRECONDITION (is_four_valued (type));
247+ auto width = to_bitvector_type (type).get_width ();
248+ return lower_to_aval_bval (constant_exprt{std::string (width, ' x' ), type});
232249}
233250
234251exprt aval_bval (const verilog_logical_equality_exprt &expr)
@@ -239,7 +256,9 @@ exprt aval_bval(const verilog_logical_equality_exprt &expr)
239256 auto has_xz = or_exprt{::has_xz (expr.lhs ()), ::has_xz (expr.rhs ())};
240257 auto equality = equal_exprt{expr.lhs (), expr.rhs ()};
241258 return if_exprt{
242- has_xz, make_x (), aval_bval_conversion (equality, lower_to_aval_bval (type))};
259+ has_xz,
260+ make_x (type),
261+ aval_bval_conversion (equality, lower_to_aval_bval (type))};
243262}
244263
245264exprt aval_bval (const verilog_logical_inequality_exprt &expr)
@@ -250,7 +269,9 @@ exprt aval_bval(const verilog_logical_inequality_exprt &expr)
250269 auto has_xz = or_exprt{::has_xz (expr.lhs ()), ::has_xz (expr.rhs ())};
251270 auto equality = notequal_exprt{expr.lhs (), expr.rhs ()};
252271 return if_exprt{
253- has_xz, make_x (), aval_bval_conversion (equality, lower_to_aval_bval (type))};
272+ has_xz,
273+ make_x (type),
274+ aval_bval_conversion (equality, lower_to_aval_bval (type))};
254275}
255276
256277exprt aval_bval (const verilog_wildcard_equality_exprt &expr)
@@ -289,12 +310,26 @@ exprt aval_bval(const verilog_wildcard_inequality_exprt &expr)
289310
290311exprt aval_bval (const not_exprt &expr)
291312{
292- PRECONDITION (is_four_valued (expr.type ()));
313+ auto &type = expr.type ();
314+ PRECONDITION (is_four_valued (type));
293315 PRECONDITION (is_aval_bval (expr.op ()));
294316
295317 auto has_xz = ::has_xz (expr.op ());
296318 auto not_expr =
297319 not_exprt{extractbit_exprt{expr.op (), natural_typet{}.zero_expr ()}};
298- auto x = make_x ();
320+ auto x = make_x (type );
299321 return if_exprt{has_xz, x, aval_bval_conversion (not_expr, x.type ())};
300322}
323+
324+ exprt aval_bval (const power_exprt &expr)
325+ {
326+ PRECONDITION (is_four_valued (expr.type ()));
327+ PRECONDITION (is_aval_bval (expr.lhs ()));
328+ PRECONDITION (is_aval_bval (expr.rhs ()));
329+
330+ auto has_xz = or_exprt{::has_xz (expr.lhs ()), ::has_xz (expr.rhs ())};
331+ auto power_expr =
332+ power_exprt{aval_underlying (expr.lhs ()), aval_underlying (expr.rhs ())};
333+ auto x = make_x (expr.type ());
334+ return if_exprt{has_xz, x, aval_bval_conversion (power_expr, x.type ())};
335+ }
0 commit comments