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