Skip to content

Commit 3b71c1d

Browse files
strainmikemgumble
authored andcommitted
Minor fxp changes (#21)
* Minor performance changes Cache some values to make things slightly faster. Decimal is still really slow to use though. * Making _FxpFIFO return the correct datatype Its underlying type is still U64 though.
1 parent 1ce9511 commit 3b71c1d

File tree

3 files changed

+15
-8
lines changed

3 files changed

+15
-8
lines changed

nifpga/bitfile.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,9 @@ def __init__(self, name, type_xml):
369369
self._maximum = self._calculate_maximum()
370370
self._size_in_bits = self._calculate_size_in_bits()
371371
self._data_mask = (1 << self._size_in_bits) - 1
372+
self._word_length_mask = (1 << self._word_length) - 1
373+
if self._signed:
374+
self._signed_bit_mask = 1 << (self._word_length - 1)
372375

373376
@property
374377
def datatype(self):
@@ -439,7 +442,7 @@ def unpack_data(self, data):
439442

440443
if self._signed:
441444
data = self._integer_twos_comp(data)
442-
decimal_value = Decimal(data * self._delta)
445+
decimal_value = data * self._delta
443446
if self._overflow_enabled:
444447
return (overflow, decimal_value)
445448
else:
@@ -457,14 +460,13 @@ def _get_overflow_value(self, data):
457460
def _remove_overflow_bit(self, data):
458461
""" This helper method masks out all bits not inside the word length,
459462
ultimately returning a value of data without the overflow bit. """
460-
return data & (2**(self._word_length) - 1)
463+
return data & self._word_length_mask
461464

462465
def _integer_twos_comp(self, data):
463466
""" Checks the signed bit and determines if the value is negative, If
464467
so take the twos complement of the input."""
465-
signed_bit_mask = 2**(self._word_length - 1)
466-
if data & signed_bit_mask > 0:
467-
data = data ^ (2 ** (self._word_length) - 1)
468+
if data & self._signed_bit_mask > 0:
469+
data = data ^ self._word_length_mask
468470
data += 1
469471
data *= -1
470472
return data
@@ -485,9 +487,8 @@ def pack_data(self, data_to_pack, packed_data):
485487
if self._signed and data < 0:
486488
fxp_representation = self._integer_twos_comp(fxp_representation)
487489

488-
if self._overflow_enabled:
489-
if overflow:
490-
fxp_representation += 2**(self._word_length)
490+
if overflow:
491+
fxp_representation += 2**(self._word_length)
491492

492493
packed_data <<= self._size_in_bits
493494
packed_data |= fxp_representation

nifpga/session.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -847,6 +847,10 @@ def __init__(self,
847847
datatype=DataType.U64)
848848
self._fxp = bitfile_fifo.type
849849

850+
@property
851+
def datatype(self):
852+
return DataType.Fxp
853+
850854
def write(self, data, timeout_ms=0):
851855
""" Writes the specified data to the FIFO.
852856

nifpga/tests/test_FXP.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ def __init__(self,
2222
self._overflow_enabled = enableOverflowStatus
2323
self._size_in_bits = self._calculate_size_in_bits()
2424
self._data_mask = (1 << self._size_in_bits) - 1
25+
self._word_length_mask = (1 << self._word_length) - 1
26+
self._signed_bit_mask = 1 << (self._word_length - 1)
2527
self.set_register_attributes()
2628

2729
def set_register_attributes(self):

0 commit comments

Comments
 (0)