From 79c5a1706ecd6f8c70bac4400c526c405f6881a0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivar=20H=C3=A4rnqvist?= <ivarhar@outlook.com>
Date: Tue, 19 May 2020 19:08:09 +0200
Subject: [PATCH] fix incorrect bit mask

---
 src/simulation/compile.cpp   | 4 ++--
 src/simulation/run.cpp       | 2 +-
 test/test_fast_simulation.py | 6 ++++++
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/simulation/compile.cpp b/src/simulation/compile.cpp
index 1f93b921..7fa7ac67 100644
--- a/src/simulation/compile.cpp
+++ b/src/simulation/compile.cpp
@@ -204,8 +204,8 @@ private:
 			if (bits > 64) {
 				throw py::value_error{"Cannot truncate to more than 64 bits"};
 			}
-			this->add_instruction(instruction_type::truncate, no_result_index, 0).bit_mask = static_cast<std::int64_t>(std::int64_t{1}
-																													   << bits);
+			this->add_instruction(instruction_type::truncate, no_result_index, 0).bit_mask = static_cast<std::int64_t>(
+				(std::int64_t{1} << bits) - 1);
 		}
 	}
 
diff --git a/src/simulation/run.cpp b/src/simulation/run.cpp
index 1f27b0c7..c14fa192 100644
--- a/src/simulation/run.cpp
+++ b/src/simulation/run.cpp
@@ -31,7 +31,7 @@ namespace asic {
 		if (*bits_override > 64) {
 			throw py::value_error{"Cannot truncate to more than 64 bits"};
 		}
-		return static_cast<std::int64_t>(std::int64_t{1} << *bits_override); // Return the bit mask override to use.
+		return static_cast<std::int64_t>((std::int64_t{1} << *bits_override) - 1); // Return the bit mask override to use.
 	}
 	bits_override.reset(); // Don't use bits_override if truncate is false.
 	return std::int64_t{};
diff --git a/test/test_fast_simulation.py b/test/test_fast_simulation.py
index 6eb3b251..acdea48d 100644
--- a/test/test_fast_simulation.py
+++ b/test/test_fast_simulation.py
@@ -122,6 +122,12 @@ class TestRunFor:
         assert simulation.results["0"][4] == -6
         assert simulation.results["0"][5] == 7
 
+    def test_find_result_key(self, precedence_sfg_delays):
+        sim = FastSimulation(precedence_sfg_delays, [[0, 4, 542, 42, 31.314, 534.123, -453415, 5431]])
+        sim.run()
+        assert sim.results[precedence_sfg_delays.find_result_keys_by_name("ADD2")[0]][4] == 31220
+        assert sim.results[precedence_sfg_delays.find_result_keys_by_name("A1")[0]][2] == 80
+
 class TestRun:
     def test_save_results(self, sfg_two_inputs_two_outputs):
         simulation = FastSimulation(sfg_two_inputs_two_outputs, [2, 3])
-- 
GitLab