Skip to content

Commit 5e4b551

Browse files
committed
Solved an issue with float resize
1 parent 02588ca commit 5e4b551

File tree

3 files changed

+64
-62
lines changed

3 files changed

+64
-62
lines changed

myhdl/test/__init__.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,35 +37,37 @@ def wrap(val, value_format):
3737

3838
def resize(value, value_format):
3939
val = float(value)
40-
lim = ldexp(1.0, value_format.high - 1)
40+
lim = (1 << (value_format.high - value_format.low - 1))
41+
lim_neg = -ldexp(lim, value_format.low)
42+
lim_pos = ldexp(lim - 1, value_format.low)
4143
margin = ldexp(1.0, value_format.high)
4244

4345
rounding = False
4446

4547
if value_format.overflow == fixmath.overflows.saturate:
46-
if val >= lim:
47-
val = lim - ldexp(1.0, value_format.low)
48-
elif val < -lim:
49-
val = -lim
48+
if val > lim_pos:
49+
val = lim_pos
50+
elif val < lim_neg:
51+
val = lim_neg
5052
else:
5153
rounding = True
5254
elif value_format.overflow == fixmath.overflows.wrap:
53-
if val < -lim or val >= lim:
55+
if val <= -lim_neg or val > lim_pos:
5456
val = fmod(val, margin)
55-
if val < -lim:
57+
if val < -lim_neg:
5658
val += margin
57-
elif val > lim:
59+
elif val > lim_pos:
5860
val -= margin
5961
rounding = True
6062

6163
if rounding and value_format.rounding == fixmath.roundings.round:
6264
tmp = ldexp(val, -value_format.low)
63-
#str_tmp = '{0:.4f}'.format(tmp)
65+
# str_tmp = '{0:.4f}'.format(tmp)
6466
d = Decimal(tmp).quantize(0, rounding=ROUND_HALF_EVEN)
6567
rtmp = float(d)
66-
#if (rtmp == 0.0) and tmp < 0 and tmp > -0.25:
68+
# if (rtmp == 0.0) and tmp < 0 and tmp > -0.25:
6769
# val = ldexp(-1.0, value_format.low)
68-
#else:
70+
# else:
6971
# val = ldexp(rtmp, value_format.low)
7072
val = ldexp(rtmp, value_format.low)
7173
elif value_format.rounding == fixmath.roundings.truncate:
@@ -78,6 +80,7 @@ def resize(value, value_format):
7880
else:
7981
return val
8082

83+
8184
class _GenId(object):
8285
_id = 0
8386

myhdl/test/conversion/numeric/test_resize.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -46,38 +46,38 @@ def test_sfixba_resize_sfixba():
4646

4747

4848
def resize_vectors():
49-
return [(delta, i, j, k)
50-
for delta in range(-3, 1)
49+
return [(delta, i, j)
50+
for delta in range(-4, 1)
5151
for i in range(0, 5, 2)
52-
for j in range(delta, i, 2)
53-
for k in ([0] + [s * (2 ** p) for p in range(0, 7, 2)
54-
for s in [-1, 1]])]
52+
for j in range(delta, i - 1, 2)]
5553

5654

57-
def sfixba_resize(delta, i, j, k):
55+
def sfixba_resize(delta, i, j):
56+
k = 128
5857
value = Signal(sfixba(k))
5958
scaled = Signal(sfixba(k).scalb(delta))
6059
data = Signal(sfixba(0, i, j))
6160

6261
@instance
6362
def logic():
64-
value.next = sfixba(k)
65-
yield delay(10)
66-
scaled.next = value
67-
yield delay(10)
68-
data.next = scaled.resize(i, j)
69-
yield delay(10)
70-
print("k: ", k)
71-
print("value: ", value)
72-
print("i: ", i)
73-
print("j: ", j)
74-
print("data: ", data)
63+
for k in range(-128, 128):
64+
value.next = sfixba(k)
65+
yield delay(10)
66+
scaled.next = value.scalb(delta)
67+
yield delay(10)
68+
data.next = scaled.resize(i, j)
69+
yield delay(10)
70+
print("k: ", k)
71+
print("value: ", value)
72+
print("i: ", i)
73+
print("j: ", j)
74+
print("data: ", data)
7575

7676
return logic
7777

7878

79-
@mark.parametrize("delta, i, j, k", resize_vectors())
80-
def test_resize(delta, i, j, k):
79+
@mark.parametrize("delta, i, j", resize_vectors())
80+
def test_resize(delta, i, j):
8181
toVHDL.name = "sfixba_resize_" + genId()
82-
assert conversion.verify(sfixba_resize, delta, i, j, k) == 0
82+
assert conversion.verify(sfixba_resize, delta, i, j) == 0
8383
toVHDL.name = None

myhdl/test/numeric/test_sfixba.py

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def testPIntValue(self):
6262
self.assertEqual(value.max, 8, "Wrong maximum value")
6363
self.assertEqual(value.min, -8, "Wrong minimum value")
6464
self.assertEqual(str(value), "0101", "Wrong binary string "
65-
"high={0}, low={1}".format(value.high, value.low))
65+
"high={0}, low={1}".format(value.high, value.low))
6666

6767
def testMIntValue(self):
6868
warnings.filterwarnings('error')
@@ -73,7 +73,7 @@ def testMIntValue(self):
7373
self.assertEqual(value.max, 8, "Wrong maximum value")
7474
self.assertEqual(value.min, -8, "Wrong minimum value")
7575
self.assertEqual(str(value), "1011", "Wrong binary string "
76-
"high={0}, low={1}".format(value.high, value.low))
76+
"high={0}, low={1}".format(value.high, value.low))
7777

7878
def testIntPLowValue(self):
7979
warnings.filterwarnings('error')
@@ -94,7 +94,7 @@ def testIntSLowValue(self):
9494
self.assertEqual(value.max, 32, "Wrong maximum value")
9595
self.assertEqual(value.min, -32, "Wrong minimum value")
9696
self.assertEqual(int(value), -(17 >> 3))
97-
self.assertEqual(float(value), -17/8.)
97+
self.assertEqual(float(value), -17 / 8.)
9898

9999
def testIntPHighValue(self):
100100
warnings.filterwarnings('error')
@@ -207,7 +207,7 @@ def testMFloatValue(self):
207207

208208
def testLargeFloatValue(self):
209209
warnings.filterwarnings('error')
210-
f = 2.**.5
210+
f = 2. ** .5
211211
i_f = 6369051672525773
212212
result = "010110101000001001111001100110011111110011101111001101"
213213
cases = (-6, -5, 0, 50, 56, 57, 0)
@@ -251,11 +251,11 @@ def testLargeFloatValue(self):
251251
if float(data) != check:
252252
check = resize(f_value, data)
253253
self.assertEqual(float(data), check, "value: {0}, "
254-
"fix: {1}, float(fix): {2}, float: {3}, "
255-
"high:{4}, low: {5}".format(f_value,
256-
data,
257-
float(data),
258-
check, j, k))
254+
"fix: {1}, float(fix): {2}, float: {3}, "
255+
"high:{4}, low: {5}".format(f_value,
256+
data,
257+
float(data),
258+
check, j, k))
259259

260260
def testValue(self):
261261
x = sfixba(0, 5, -5)
@@ -277,11 +277,10 @@ def testValue(self):
277277
self.assertTrue(isinstance(x, sfixba))
278278
self.assertNotEqual(x, sfixba(y))
279279

280-
281280
def testResize(self):
282-
for delta in range(-5, 0):
283-
for i in range(0, 8):
284-
for j in range(delta, i-1):
281+
for delta in range(-4, 1):
282+
for i in range(0, 5, 2):
283+
for j in range(delta, i - 1, 2):
285284
for k in range(-128, 128):
286285
f_value = ldexp(k, delta)
287286
value = sfixba(k).scalb(delta)
@@ -296,20 +295,20 @@ def testResize(self):
296295
check = resize(f_value, data)
297296

298297
self.assertEqual(data, check, "integer: {0}, "
299-
"delta: {1}, i: {2}, "
300-
"j: {3}, data: {4}, "
301-
"float: {5}".format(k, delta, i,
302-
j,
303-
data,
304-
check))
298+
"delta: {1}, i: {2}, "
299+
"j: {3}, data: {4}, "
300+
"float: {5}".format(k, delta, i,
301+
j,
302+
data,
303+
check))
305304

306305
def testFloatPLowValue(self):
307306
warnings.filterwarnings('error')
308307
f_value = 17.0
309308
low = 3
310309
value = sfixba(f_value, low=low)
311-
i_value = int(round(f_value*(2.0 ** -low)))
312-
self.assertEqual(value.internal, i_value,
310+
i_value = int(round(f_value * (2.0 ** -low)))
311+
self.assertEqual(value.internal, i_value,
313312
"Wrong value {0}, {1}".format(value, i_value))
314313
self.assertEqual(value.high, 6, "Wrong high value")
315314
self.assertEqual(value.low, 3, "Wrong low value")
@@ -335,7 +334,7 @@ def testFloatRoundingValue(self):
335334
maths = fixmath(rounding=fixmath.roundings.round,
336335
guard_bits=guard_bits)
337336
for i in range(-10 * scale, 10 * scale, step):
338-
f = i/float(scale)
337+
f = i / float(scale)
339338
value = sfixba(f, high=7, low=0, maths=maths)
340339
check = resize(f, value)
341340
self.assertEqual(value, check,
@@ -352,14 +351,14 @@ def testSFixBaRoundingValue(self):
352351
warnings.filterwarnings('error')
353352
maths = fixmath(rounding=fixmath.roundings.round)
354353
for i in range(-2000, 2000, 125):
355-
f = i/1000.
354+
f = i / 1000.
356355
f_value = sfixba(f, high=7, low=-8)
357356
value = sfixba(f_value, high=7, low=0, maths=maths)
358357
check = f_value.resize(value)
359358
self.assertEqual(value, check,
360359
"Incorrect rounding: " \
361360
"{0}, {1}, {2}".format(f, check.hex(),
362-
value.hex()))
361+
value.hex()))
363362
self.assertEqual(value.high, 7, "Wrong high value")
364363
self.assertEqual(value.low, 0, "Wrong low value")
365364
self.assertEqual(value.max, 64, "Wrong maximum value")
@@ -369,7 +368,7 @@ def testFloatTruncateValue(self):
369368
warnings.filterwarnings('error')
370369
maths = fixmath(rounding=fixmath.roundings.truncate)
371370
for i in range(-2000, 2000):
372-
f = (int((i/1000.)*8)/8.)
371+
f = (int((i / 1000.) * 8) / 8.)
373372
value = sfixba(f, high=7, low=0, maths=maths)
374373
check = int(ldexp(f, 4)) >> 4
375374
if value != check:
@@ -569,7 +568,7 @@ def testGetSliceLeftOpen(self):
569568
if res_sum != -1:
570569
resi + ref
571570
self.assertEqual(res_sum, -1, "Incorrect "
572-
"result: " +
571+
"result: " +
573572
"{0}, {1}, {2}".format(repr(resi),
574573
repr(ref), -1))
575574
self.assertEqual(type(res), sfixba)
@@ -653,11 +652,11 @@ def testSetSliceLeftOpen(self):
653652
if isinstance(val, int):
654653
self.assertTrue((val.bit_length() >
655654
(ba.high - j)) or
656-
((-1-val).bit_length() >
655+
((-1 - val).bit_length() >
657656
(bai.high - j - 1)))
658657
else:
659658
self.assertTrue((len(val) != (ba.high - j)) or
660-
(len(-1-val) != (bai.high - j)))
659+
(len(-1 - val) != (bai.high - j)))
661660
else:
662661
ref = int(setSliceLeftOpen(s, j, v), 2)
663662
self.assertEqual(ba, wrap(ref, ba),
@@ -1021,11 +1020,11 @@ def comparisonCheck(self, op, imin=0, imax=None, jmin=0, jmax=None):
10211020
r2 = op(i, bj)
10221021
r3 = op(bi, bj)
10231022
self.assertEqual(r1, op(i, j), "bi, j, i, rj: "
1024-
"{0}, {1}, {2}, {3}".format(bi, j, i, rj))
1023+
"{0}, {1}, {2}, {3}".format(bi, j, i, rj))
10251024
self.assertEqual(r2, op(i, j), "i, bj, ri, j: "
1026-
"{0}, {1}, {2}, {3}".format(i, bj, ri, j))
1025+
"{0}, {1}, {2}, {3}".format(i, bj, ri, j))
10271026
self.assertEqual(r3, ref, "bi, bj, i, j: "
1028-
"{0}, {1}, {2}, {3}".format(bi, bj, i, j))
1027+
"{0}, {1}, {2}, {3}".format(bi, bj, i, j))
10291028

10301029
def testAdd(self):
10311030
self.binaryMathCheck(operator.add, imin=-512, imax=512,

0 commit comments

Comments
 (0)