@@ -15,6 +15,18 @@ Author: Daniel Kroening, kroening@kroening.com
1515#include < util/prefix.h>
1616
1717#include " verilog_typecheck_base.h"
18+ #include " verilog_types.h"
19+
20+ verilog_wildcard_equality_exprt::verilog_wildcard_equality_exprt (
21+ exprt lhs,
22+ exprt rhs)
23+ : binary_exprt(
24+ std::move (lhs),
25+ ID_verilog_wildcard_equality,
26+ std::move(rhs),
27+ verilog_unsignedbv_typet{1 })
28+ {
29+ }
1830
1931typet verilog_declaratort::merged_type (const typet &declaration_type) const
2032{
@@ -340,3 +352,42 @@ exprt verilog_streaming_concatenation_exprt::lower() const
340352 else
341353 PRECONDITION (false );
342354}
355+
356+ exprt verilog_inside_exprt::lower () const
357+ {
358+ exprt::operandst disjuncts;
359+
360+ for (auto &range : range_list ())
361+ {
362+ if (range.id () == ID_verilog_value_range)
363+ {
364+ auto &range_expr = to_verilog_value_range_expr (range);
365+ DATA_INVARIANT (
366+ op ().type () == range_expr.lhs ().type (),
367+ " inside_exprt type consistency" );
368+ DATA_INVARIANT (
369+ op ().type () == range_expr.rhs ().type (),
370+ " inside_exprt type consistency" );
371+ disjuncts.push_back (and_exprt{
372+ binary_relation_exprt{op (), ID_ge, range_expr.lhs ()},
373+ binary_relation_exprt{op (), ID_le, range_expr.rhs ()}});
374+ }
375+ else
376+ {
377+ DATA_INVARIANT (
378+ op ().type () == range.type (), " inside_exprt type consistency" );
379+ auto &range_type = range.type ();
380+ if (
381+ range_type.id () == ID_verilog_unsignedbv ||
382+ range_type.id () == ID_verilog_signedbv)
383+ {
384+ disjuncts.push_back (typecast_exprt{
385+ verilog_wildcard_equality_exprt{op (), range}, bool_typet ()});
386+ }
387+ else
388+ disjuncts.push_back (equal_exprt{op (), range});
389+ }
390+ }
391+
392+ return disjunction (disjuncts);
393+ }
0 commit comments