16
16
#include < util/prefix.h>
17
17
#include < util/simplify_expr.h>
18
18
#include < util/std_expr.h>
19
+ #include < util/string2int.h>
19
20
20
21
#include " expr2verilog.h"
21
22
#include " sva_expr.h"
@@ -1223,14 +1224,14 @@ exprt verilog_typecheck_exprt::convert_constant(constant_exprt expr)
1223
1224
// check representation
1224
1225
1225
1226
std::string::size_type pos=rest.find (' \' ' );
1226
- unsigned bits= 0 ;
1227
+ std:: size_t bits = 0 ;
1227
1228
bool bits_given=false ;
1228
1229
1229
1230
if (pos!=std::string::npos) // size given?
1230
1231
{
1231
1232
if (rest[0 ]!=' \' ' )
1232
1233
{
1233
- bits= atoi (rest. c_str () );
1234
+ bits = safe_string2size_t (rest);
1234
1235
bits_given=true ;
1235
1236
1236
1237
if (bits==0 )
@@ -1273,14 +1274,13 @@ exprt verilog_typecheck_exprt::convert_constant(constant_exprt expr)
1273
1274
bool is_signed=!based || s_flag_given;
1274
1275
1275
1276
// check for z/x
1276
-
1277
- bool other=false ;
1277
+ bool four_valued = false ;
1278
1278
1279
1279
for (unsigned i=0 ; i<rest.size (); i++)
1280
1280
if (rest[i]==' ?' || rest[i]==' z' || rest[i]==' x' )
1281
- other= true ;
1281
+ four_valued = true ;
1282
1282
1283
- if (other) // z/x/? found
1283
+ if (base != 10 )
1284
1284
{
1285
1285
// expand bits
1286
1286
@@ -1370,17 +1370,51 @@ exprt verilog_typecheck_exprt::convert_constant(constant_exprt expr)
1370
1370
bits=fvalue.size ();
1371
1371
}
1372
1372
1373
- if (is_signed)
1374
- expr.type ()=verilog_signedbv_typet (bits);
1375
- else
1376
- expr.type ()=verilog_unsignedbv_typet (bits);
1373
+ if (four_valued)
1374
+ {
1375
+ // we do a 32-bit minimum if the number of bits isn't given
1376
+ if (!bits_given)
1377
+ {
1378
+ if (bits < 32 )
1379
+ {
1380
+ // do sign extension
1381
+ char extension = is_signed ? fvalue.front () : ' 0' ;
1382
+ fvalue = std::string (32 - bits, extension) + fvalue;
1383
+ bits = 32 ;
1384
+ }
1385
+ }
1386
+
1387
+ if (is_signed)
1388
+ expr.type () = verilog_signedbv_typet (bits);
1389
+ else
1390
+ expr.type () = verilog_unsignedbv_typet (bits);
1377
1391
1378
- expr.set (ID_value, fvalue);
1392
+ // stored as individual bits
1393
+ expr.set_value (fvalue);
1394
+ }
1395
+ else // two valued
1396
+ {
1397
+ mp_integer int_value = binary2integer (fvalue, is_signed);
1398
+
1399
+ // we do a 32-bit minimum if the number of bits isn't given
1400
+ if (!bits_given)
1401
+ if (bits < 32 )
1402
+ bits = 32 ;
1403
+
1404
+ if (is_signed)
1405
+ expr.type () = signedbv_typet (bits);
1406
+ else
1407
+ expr.type () = unsignedbv_typet (bits);
1408
+
1409
+ // stored as bvrep
1410
+ expr.set_value (integer2bvrep (int_value, bits));
1411
+ }
1379
1412
}
1380
1413
else
1381
1414
{
1415
+ // base 10, never negative
1382
1416
mp_integer int_value=string2integer (rest, base);
1383
-
1417
+
1384
1418
if (!bits_given)
1385
1419
{
1386
1420
bits = address_bits (int_value + 1 );
@@ -1393,7 +1427,7 @@ exprt verilog_typecheck_exprt::convert_constant(constant_exprt expr)
1393
1427
else
1394
1428
expr.type ()=unsignedbv_typet (bits);
1395
1429
1396
- expr.set (ID_value, integer2bvrep (int_value, bits));
1430
+ expr.set_value ( integer2bvrep (int_value, bits));
1397
1431
}
1398
1432
1399
1433
return std::move (expr);
0 commit comments