python: Fix m5's tick rounding mechanism
authorHoa Nguyen <hoanguyen@ucdavis.edu>
Fri, 29 May 2020 00:20:06 +0000 (17:20 -0700)
committerBobby R. Bruce <bbruce@ucdavis.edu>
Mon, 1 Jun 2020 19:40:49 +0000 (19:40 +0000)
Partially reverts:
https://gem5-review.googlesource.com/c/public/gem5/+/29372 where the
`math.ceil` function was used to fix an issue where 0.5 was rounded to
zero in python3. This has the side effect of giving incorrect clock
frequences due to rounding errors. To demonstrate:

```
>>> import math
>>> 1e-9*1000000000000
1000.0000000000001
>>> int(math.ceil(1e-9*1000000000000))
1001
```

The solution to this problem is to use Python's `decimal` module to
round values.

Issue-on: https://gem5.atlassian.net/browse/GEM5-616
Signed-off-by: Hoa Nguyen <hoanguyen@ucdavis.edu>
Change-Id: Ic76736ccb4b6b8c037103a34493aff7d9731d314
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/29577
Reviewed-by: Tiago Mück <tiago.muck@arm.com>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/python/m5/ticks.py

index 047116ac781edf07aff4070e1b0d2a1c79038d0d..cdba1e86aeb4866d39dc95096d1b2961f6d10666 100644 (file)
@@ -25,7 +25,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 from __future__ import print_function
-from math import ceil
+import decimal
 import six
 if six.PY3:
     long = int
@@ -74,7 +74,8 @@ def fromSeconds(value):
     # convert the value from time to ticks
     value *= _m5.core.getClockFrequency()
 
-    int_value = int(ceil(value))
+    int_value = int(
+            decimal.Decimal(value).to_integral_value( decimal.ROUND_HALF_UP))
     err = (value - int_value) / value
     if err > frequency_tolerance:
         warn("rounding error > tolerance\n    %f rounded to %d", value,