diff options
author | Andy Knowles <andy.knowles@gmail.com> | 2020-08-12 21:04:34 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-12 21:04:34 +0200 |
commit | 5829d16fcd9a7645ea22eee3a489499780acc79c (patch) | |
tree | 076cc7b433b80926cfdc3d9a6ad6a03b98113a44 /backends | |
parent | 1227c3681be8e6365e91e77b06dcbe58ff6c7593 (diff) | |
download | yosys-5829d16fcd9a7645ea22eee3a489499780acc79c.tar.gz yosys-5829d16fcd9a7645ea22eee3a489499780acc79c.tar.bz2 yosys-5829d16fcd9a7645ea22eee3a489499780acc79c.zip |
cxxrtl.h: Fix incorrect CarryOut in alu()
Diffstat (limited to 'backends')
-rw-r--r-- | backends/cxxrtl/cxxrtl.h | 11 |
1 files changed, 3 insertions, 8 deletions
diff --git a/backends/cxxrtl/cxxrtl.h b/backends/cxxrtl/cxxrtl.h index dfdb49929..e3c96d422 100644 --- a/backends/cxxrtl/cxxrtl.h +++ b/backends/cxxrtl/cxxrtl.h @@ -450,18 +450,13 @@ struct value : public expr_base<value<Bits>> { std::pair<value<Bits>, bool /*CarryOut*/> alu(const value<Bits> &other) const { value<Bits> result; bool carry = CarryIn; - // Handle full chunks first - for (size_t n = 0; n < result.chunks - 1; n++) { + for (size_t n = 0; n < result.chunks; n++) { result.data[n] = data[n] + (Invert ? ~other.data[n] : other.data[n]) + carry; + if (result.chunks - 1 == n) + result.data[result.chunks - 1] &= result.msb_mask; carry = (result.data[n] < data[n]) || (result.data[n] == data[n] && carry); } - // Handle last chunk (mask before updating carry) - constexpr size_t last = result.chunks - 1; - result.data[last] = data[last] + (Invert ? ~other.data[last] : other.data[last]) + carry; - result.data[last] &= result.msb_mask; - carry = (result.data[last] < data[last]) || - (result.data[last] == data[last] && carry); return {result, carry}; } |