diff --git a/src/finn/util/data_packing.py b/src/finn/util/data_packing.py index ad34399f82bf74f734f40345fbf6c2599f690751..db60e4dbab3fe0cc2c740c5a80f29dd7291c1e15 100644 --- a/src/finn/util/data_packing.py +++ b/src/finn/util/data_packing.py @@ -242,3 +242,24 @@ def finnpy_to_packed_bytearray(ndarray, dtype): return np.asarray(list(map(hexstring2npbytearray, x))) return np.apply_along_axis(fn, packed_hexstring.ndim - 1, packed_hexstring) + + +def packed_bytearray_to_finnpy(packed_bytearray, dtype): + """Given a packed numpy uint8 ndarray, unpack it into a FINN array of + given DataType.""" + # TODO how to handle un-padding here? + packed_dim = packed_bytearray.ndim - 1 + packed_bits = packed_bytearray.shape[packed_dim] * 8 + target_bits = dtype.bitwidth() + assert packed_bits % target_bits == 0 + n_target_elems = packed_bits // target_bits + retshape = packed_bytearray.shape[:-1] + (n_target_elems,) + # convert innermost dim of byte array to hex strings + packed_hexstring = np.apply_along_axis( + npbytearray2hexstring, packed_dim, packed_bytearray + ) + ret = unpack_innermost_dim_from_hex_string( + packed_hexstring, dtype, retshape, packed_bits, target_bits + ) + + return ret