working on fixing DivPipeCore's test cases
[ieee754fpu.git] / src / ieee754 / div_rem_sqrt_rsqrt / test_algorithm.py
old mode 100644 (file)
new mode 100755 (executable)
index c5c3e7b..9200b3b
@@ -1,3 +1,4 @@
+#!/usr/bin/env python3
 # SPDX-License-Identifier: LGPL-2.1-or-later
 # See Notices.txt for copyright information
 
@@ -296,14 +297,22 @@ class TestUnsignedDivRem(unittest.TestCase):
                 with self.subTest(n=n, d=d, q=q, r=r):
                     udr = UnsignedDivRem(n, d, bit_width, log2_radix)
                     for _ in range(250 * bit_width):
-                        self.assertEqual(n, udr.quotient * udr.divisor
-                                         + udr.remainder)
+                        self.assertEqual(udr.dividend, n)
+                        self.assertEqual(udr.divisor, d)
+                        self.assertEqual(udr.quotient_times_divisor,
+                                         udr.quotient * udr.divisor)
+                        self.assertGreaterEqual(udr.dividend,
+                                                udr.quotient_times_divisor)
                         if udr.calculate_stage():
                             break
                     else:
                         self.fail("infinite loop")
-                    self.assertEqual(n, udr.quotient * udr.divisor
-                                     + udr.remainder)
+                    self.assertEqual(udr.dividend, n)
+                    self.assertEqual(udr.divisor, d)
+                    self.assertEqual(udr.quotient_times_divisor,
+                                     udr.quotient * udr.divisor)
+                    self.assertGreaterEqual(udr.dividend,
+                                            udr.quotient_times_divisor)
                     self.assertEqual(udr.quotient, q)
                     self.assertEqual(udr.remainder, r)
 
@@ -1069,3 +1078,59 @@ class TestFixedUDivRemSqrtRSqrt(unittest.TestCase):
 
     def test_radix_16_RSqrt(self):
         self.helper(4, Operation.RSqrtRem)
+
+    def test_int_div(self):
+        bit_width = 8
+        fract_width = 4
+        log2_radix = 3
+        for dividend in range(1 << bit_width):
+            for divisor in range(1, 1 << bit_width):
+                obj = FixedUDivRemSqrtRSqrt(dividend,
+                                            divisor,
+                                            Operation.UDivRem,
+                                            bit_width,
+                                            fract_width,
+                                            log2_radix)
+                obj.calculate()
+                quotient, remainder = div_rem(dividend,
+                                              divisor,
+                                              bit_width,
+                                              False)
+                shifted_remainder = remainder << fract_width
+                with self.subTest(dividend=dividend,
+                                  divisor=divisor,
+                                  quotient=quotient,
+                                  remainder=remainder,
+                                  shifted_remainder=shifted_remainder):
+                    self.assertEqual(obj.quotient_root, quotient)
+                    self.assertEqual(obj.remainder, shifted_remainder)
+
+    def test_fract_div(self):
+        bit_width = 8
+        fract_width = 4
+        log2_radix = 3
+        for dividend in range(1 << bit_width):
+            for divisor in range(1, 1 << bit_width):
+                obj = FixedUDivRemSqrtRSqrt(dividend << fract_width,
+                                            divisor,
+                                            Operation.UDivRem,
+                                            bit_width,
+                                            fract_width,
+                                            log2_radix)
+                obj.calculate()
+                quotient = (dividend << fract_width) // divisor
+                if quotient >= (1 << bit_width):
+                    continue
+                remainder = (dividend << fract_width) % divisor
+                shifted_remainder = remainder << fract_width
+                with self.subTest(dividend=dividend,
+                                  divisor=divisor,
+                                  quotient=quotient,
+                                  remainder=remainder,
+                                  shifted_remainder=shifted_remainder):
+                    self.assertEqual(obj.quotient_root, quotient)
+                    self.assertEqual(obj.remainder, shifted_remainder)
+
+
+if __name__ == '__main__':
+    unittest.main()