@@ -39,20 +39,21 @@ array_typet verilog_typecheck_exprt::convert_unpacked_array_type(
3939 const exprt &size_expr = static_cast <const exprt &>(src.find (ID_size));
4040
4141 mp_integer size, offset;
42- bool little_endian ;
42+ bool big_endian ;
4343
4444 if (range_expr.is_not_nil ())
4545 {
4646 // these may be negative
4747 mp_integer msb, lsb;
4848 convert_range (range_expr, msb, lsb);
49- little_endian = (lsb <= msb);
50- size = (little_endian ? msb - lsb : lsb - msb) + 1 ;
51- offset = little_endian ? lsb : msb;
49+ big_endian = (lsb > msb);
50+ size = (big_endian ? lsb - msb : msb - lsb) + 1 ;
51+ DATA_INVARIANT (size >= 0 , " array size must not be negative" );
52+ offset = big_endian ? msb : lsb;
5253 }
5354 else if (size_expr.is_not_nil ())
5455 {
55- little_endian = true ;
56+ big_endian = false ;
5657 size = convert_integer_constant_expression (size_expr);
5758 offset = 0 ;
5859 if (size < 0 )
@@ -73,7 +74,7 @@ array_typet verilog_typecheck_exprt::convert_unpacked_array_type(
7374 const exprt final_size_expr = from_integer (size, integer_typet ());
7475 auto result = array_typet{element_type, final_size_expr};
7576 result.set (ID_offset, from_integer (offset, integer_typet ()));
76- result.set (ID_C_little_endian, little_endian );
77+ result.set (ID_C_big_endian, big_endian );
7778
7879 return result;
7980}
@@ -182,11 +183,11 @@ typet verilog_typecheck_exprt::convert_type(const typet &src)
182183 mp_integer msb, lsb;
183184 convert_range (range, msb, lsb);
184185
185- bool little_endian=(lsb<=msb);
186+ bool big_endian = (lsb > msb);
187+
188+ mp_integer width = (big_endian ? lsb - msb : msb - lsb) + 1 ;
189+ mp_integer offset = big_endian ? msb : lsb;
186190
187- mp_integer width=(little_endian?msb-lsb:lsb-msb)+1 ;
188- mp_integer offset=little_endian?lsb:msb;
189-
190191 // let's look at the subtype
191192 const auto subtype =
192193 static_cast <const typet &>(src).has_subtype ()
@@ -204,7 +205,7 @@ typet verilog_typecheck_exprt::convert_type(const typet &src)
204205
205206 dest.add_source_location () = source_location;
206207 dest.set_width (width.to_ulong ());
207- dest.set (ID_C_little_endian, little_endian );
208+ dest.set (ID_C_big_endian, big_endian );
208209 dest.set (ID_C_offset, integer2string (offset));
209210
210211 return std::move (dest).with_source_location (source_location);
0 commit comments