c81127c0f81d1febc2f20ccee699667bf8583cd8
1 # SPDX-License-Identifier: LGPL-2.1-or-later
2 # See Notices.txt for copyright information
4 from nmigen
.hdl
.ast
import Const
5 from .algorithm
import (div_rem
, UnsignedDivRem
, DivRem
,
6 Fixed
, fixed_sqrt
, FixedSqrt
, fixed_rsqrt
, FixedRSqrt
)
10 class TestDivRemFn(unittest
.TestCase
):
11 def test_signed(self
):
13 # numerator, denominator, quotient, remainder
126 (-8, -1, -8, 0), # overflows and wraps around
271 for (n
, d
, q
, r
) in test_cases
:
272 self
.assertEqual(div_rem(n
, d
, 4, True), (q
, r
))
274 def test_unsigned(self
):
281 # div_rem matches // and % for unsigned integers
284 self
.assertEqual(div_rem(n
, d
, 4, False), (q
, r
))
287 class TestUnsignedDivRem(unittest
.TestCase
):
288 def helper(self
, log2_radix
):
290 for n
in range(1 << bit_width
):
291 for d
in range(1 << bit_width
):
292 q
, r
= div_rem(n
, d
, bit_width
, False)
293 with self
.subTest(n
=n
, d
=d
, q
=q
, r
=r
):
294 udr
= UnsignedDivRem(n
, d
, bit_width
, log2_radix
)
295 for _
in range(250 * bit_width
):
296 self
.assertEqual(n
, udr
.quotient
* udr
.divisor
298 if udr
.calculate_stage():
301 self
.fail("infinite loop")
302 self
.assertEqual(n
, udr
.quotient
* udr
.divisor
304 self
.assertEqual(udr
.quotient
, q
)
305 self
.assertEqual(udr
.remainder
, r
)
307 def test_radix_2(self
):
310 def test_radix_4(self
):
313 def test_radix_8(self
):
316 def test_radix_16(self
):
320 class TestDivRem(unittest
.TestCase
):
321 def helper(self
, log2_radix
):
323 for n
in range(1 << bit_width
):
324 for d
in range(1 << bit_width
):
325 for signed
in False, True:
326 n
= Const
.normalize(n
, (bit_width
, signed
))
327 d
= Const
.normalize(d
, (bit_width
, signed
))
328 q
, r
= div_rem(n
, d
, bit_width
, signed
)
329 with self
.subTest(n
=n
, d
=d
, q
=q
, r
=r
, signed
=signed
):
330 dr
= DivRem(n
, d
, bit_width
, signed
, log2_radix
)
331 for _
in range(250 * bit_width
):
332 if dr
.calculate_stage():
335 self
.fail("infinite loop")
336 self
.assertEqual(dr
.quotient
, q
)
337 self
.assertEqual(dr
.remainder
, r
)
339 def test_radix_2(self
):
342 def test_radix_4(self
):
345 def test_radix_8(self
):
348 def test_radix_16(self
):
351 # FIXME: add tests for Fract, fract_sqrt, FractSqrt, fract_rsqrt, and FractRSqrt