Skip to content

Commit 482a91a

Browse files
committed
SystemVerilog: delay expansion of string literals
This delays the expansion of string literals to preserve these in property descriptions.
1 parent e3fe283 commit 482a91a

File tree

3 files changed

+61
-3
lines changed

3 files changed

+61
-3
lines changed

src/verilog/expr2verilog.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Author: Daniel Kroening, [email protected]
2424

2525
#include <algorithm>
2626
#include <cstdlib>
27+
#include <iomanip>
2728
#include <sstream>
2829

2930
/*******************************************************************\
@@ -1208,6 +1209,54 @@ expr2verilogt::resultt expr2verilogt::convert_constant(
12081209
ieee_float.from_expr(tmp);
12091210
return {precedence, ieee_float.to_ansi_c_string()};
12101211
}
1212+
else if(type.id() == ID_string)
1213+
{
1214+
dest = '"';
1215+
1216+
for(auto &ch : id2string(src.get_value()))
1217+
{
1218+
// Follows Table Table 5-1 in 1800-2017.
1219+
switch(ch)
1220+
{
1221+
case '\n':
1222+
dest += "\\n";
1223+
break;
1224+
case '\t':
1225+
dest += "\\t";
1226+
break;
1227+
case '\\':
1228+
dest += "\\\\";
1229+
break;
1230+
case '"':
1231+
dest += "\\\"";
1232+
break;
1233+
case '\v':
1234+
dest += "\\v";
1235+
break;
1236+
case '\f':
1237+
dest += "\\f";
1238+
break;
1239+
case '\a':
1240+
dest += "\\a";
1241+
break;
1242+
default:
1243+
if(
1244+
(unsigned(ch) >= ' ' && unsigned(ch) <= 126) ||
1245+
(unsigned(ch) >= 128 && unsigned(ch) <= 254))
1246+
{
1247+
dest += ch;
1248+
}
1249+
else
1250+
{
1251+
std::ostringstream oss;
1252+
oss << "\\x" << std::setw(2) << std::setfill('0') << std::hex << ch;
1253+
dest += oss.str();
1254+
}
1255+
}
1256+
}
1257+
1258+
dest += '"';
1259+
}
12111260
else
12121261
return convert_norep(src, precedence);
12131262

src/verilog/verilog_lowering.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Author: Daniel Kroening, [email protected]
1515
#include <util/ieee_float.h>
1616

1717
#include "aval_bval_encoding.h"
18+
#include "convert_literals.h"
1819
#include "verilog_bits.h"
1920
#include "verilog_expr.h"
2021

@@ -167,12 +168,14 @@ exprt verilog_lowering(exprt expr)
167168

168169
if(expr.id() == ID_constant)
169170
{
171+
auto &constant_expr = to_constant_expr(expr);
172+
170173
if(
171174
expr.type().id() == ID_verilog_unsignedbv ||
172175
expr.type().id() == ID_verilog_signedbv)
173176
{
174177
// encode into aval/bval
175-
return lower_to_aval_bval(to_constant_expr(expr));
178+
return lower_to_aval_bval(constant_expr);
176179
}
177180
else if(
178181
expr.type().id() == ID_verilog_real ||
@@ -183,6 +186,12 @@ exprt verilog_lowering(exprt expr)
183186
// no need to change value
184187
expr.type() = lower_verilog_real_types(expr.type());
185188
}
189+
else if(expr.type().id() == ID_string)
190+
{
191+
auto result = convert_string_literal(constant_expr.get_value());
192+
result.add_source_location() = expr.source_location();
193+
expr = std::move(result);
194+
}
186195

187196
return expr;
188197
}

src/verilog/verilog_typecheck_expr.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1278,8 +1278,8 @@ exprt verilog_typecheck_exprt::convert_constant(constant_exprt expr)
12781278
if(expr.type().id()==ID_string)
12791279
{
12801280
auto result = convert_string_literal(expr.get_value());
1281-
result.add_source_location() = source_location;
1282-
return std::move(result);
1281+
// only add a typecast for now
1282+
return typecast_exprt{std::move(expr), std::move(result.type())};
12831283
}
12841284
else if(expr.type().id()==ID_unsignedbv ||
12851285
expr.type().id()==ID_signedbv ||

0 commit comments

Comments
 (0)