From 4bd56883e42b6b2258543697dfb5ad515d0e864b Mon Sep 17 00:00:00 2001
From: Yaman Umuroglu <maltanar@gmail.com>
Date: Thu, 6 Feb 2020 18:22:16 +0100
Subject: [PATCH] [Util] add a first version of packed_bytearray_to_finnpy

---
 src/finn/util/data_packing.py | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/src/finn/util/data_packing.py b/src/finn/util/data_packing.py
index ad34399f8..db60e4dba 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
-- 
GitLab