Skip to content

Commit b75fcbc

Browse files
author
Daniel Kroening
committed
smt2 implementation for bswap_exprt
1 parent 9a0aa9c commit b75fcbc

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

src/solvers/smt2/smt2_conv.cpp

+57
Original file line numberDiff line numberDiff line change
@@ -1809,6 +1809,63 @@ void smt2_convt::convert_expr(const exprt &expr)
18091809
"smt2_convt::convert_expr: `"+expr.id_string()+
18101810
"' is not yet supported");
18111811
}
1812+
else if(expr.id() == ID_bswap)
1813+
{
1814+
if(expr.operands().size() != 1)
1815+
INVALIDEXPR("bswap gets one operand");
1816+
1817+
if(expr.op0().type() != expr.type())
1818+
INVALIDEXPR("bswap gets one operand with same type");
1819+
1820+
// first 'let' the operand
1821+
out << "(let ((bswap_op ";
1822+
convert_expr(expr.op0());
1823+
out << ")) ";
1824+
1825+
if(expr.type().id() == ID_signedbv || expr.type().id() == ID_unsignedbv)
1826+
{
1827+
const std::size_t width = to_bitvector_type(expr.type()).get_width();
1828+
1829+
// width must be multiple of bytes
1830+
if(width % 8 != 0)
1831+
INVALIDEXPR("bswap must get bytes");
1832+
1833+
const std::size_t bytes = width / 8;
1834+
1835+
if(bytes <= 1)
1836+
out << "bswap_op";
1837+
else
1838+
{
1839+
// do a parallel 'let' for each byte
1840+
out << "(let (";
1841+
1842+
for(std::size_t byte = 0; byte < bytes; byte++)
1843+
{
1844+
if(byte != 0)
1845+
out << ' ';
1846+
out << "(bswap_byte_" << byte << ' ';
1847+
out << "((_ extract " << (byte * 8 + 7) << " " << (byte * 8)
1848+
<< ") bswap_op)";
1849+
out << ')';
1850+
}
1851+
1852+
out << ") ";
1853+
1854+
// now stitch back together with 'concat'
1855+
out << "(concat";
1856+
1857+
for(std::size_t byte = 0; byte < bytes; byte++)
1858+
out << " bswap_byte_" << byte;
1859+
1860+
out << ')'; // concat
1861+
out << ')'; // let bswap_byte_*
1862+
}
1863+
}
1864+
else
1865+
UNEXPECTEDCASE("bswap must get bitvector operand");
1866+
1867+
out << ')'; // let bswap_op
1868+
}
18121869
else
18131870
UNEXPECTEDCASE(
18141871
"smt2_convt::convert_expr: `"+expr.id_string()+"' is unsupported");

0 commit comments

Comments
 (0)