From 1e126f8cfecb3c76b3117e05f82753cc7213218e Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Mon, 21 Aug 2023 15:40:54 +0200
Subject: [PATCH] Use python script to verify VHDL function
 func_sdp_bdo_transpose_packet().

---
 .../python/test_func_sdp_transpose_packet.py  | 48 +++++++++++++++++++
 .../libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd      | 40 +++++++++++-----
 2 files changed, 75 insertions(+), 13 deletions(-)
 create mode 100644 applications/lofar2/libraries/sdp/python/test_func_sdp_transpose_packet.py

diff --git a/applications/lofar2/libraries/sdp/python/test_func_sdp_transpose_packet.py b/applications/lofar2/libraries/sdp/python/test_func_sdp_transpose_packet.py
new file mode 100644
index 0000000000..f1063a7473
--- /dev/null
+++ b/applications/lofar2/libraries/sdp/python/test_func_sdp_transpose_packet.py
@@ -0,0 +1,48 @@
+###############################################################################
+#
+# Copyright 2023
+# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+###############################################################################
+
+# Author: Eric Kooistra
+# Date: Aug 2023
+# Purpose:
+#   Use Python to verify equivalent VHDL function func_sdp_bdo_transpose_packet()
+#   in tb_sdp_pkg.vhd
+# Usage:
+# > python test_func_sdp_bdo_transpose_packet.py > x
+# > more x
+# > tail -n 50 x
+
+c_sdp_N_pol_bf = 2
+
+def func_sdp_bdo_transpose_packet(nof_blocks_per_packet, nof_beamlets_per_block, packet_list):
+    v_list = [0] * len(packet_list)
+    for blk in range(nof_blocks_per_packet):
+        for blet in range(nof_beamlets_per_block):
+            for pol_bf in range(c_sdp_N_pol_bf):
+                v_in = (blk * nof_beamlets_per_block + blet) * c_sdp_N_pol_bf + pol_bf
+                v_out = (blet * nof_blocks_per_packet + blk) * c_sdp_N_pol_bf + pol_bf
+                v_list[v_out] = packet_list[v_in]
+    return v_list
+
+nof_blocks_per_packet = 4
+nof_beamlets_per_block = 488
+packet_list = list(range(0, nof_beamlets_per_block * nof_blocks_per_packet * c_sdp_N_pol_bf))
+out_list = func_sdp_bdo_transpose_packet(nof_blocks_per_packet, nof_beamlets_per_block, packet_list)
+for d in out_list:
+    print('%d' % d)
diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd
index 566e679387..7287d2c25d 100644
--- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd
+++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd
@@ -114,9 +114,11 @@ package tb_sdp_pkg is
   subtype t_sdp_beamlet_part_arr is t_slv_8_arr(0 to c_sdp_cep_nof_beamlets_per_longword * c_sdp_N_pol_bf - 1);
 
   -- beamlet part index in packet with 4 blocks [0 : 4 * 488 * 2 - 1] = [0 : 3903]
+  -- . use separate list for re and for im
   subtype t_sdp_beamlet_packet_list is t_slv_8_arr(0 to c_sdp_cep_nof_beamlets_per_packet * c_sdp_N_pol_bf - 1);
 
   -- beamlet part index in one block [0 : 488 * 2 - 1] =  [0 : 975]
+  -- . use separate list for re and for im
   subtype t_sdp_beamlet_block_list is t_slv_8_arr(0 to c_sdp_cep_nof_beamlets_per_block * c_sdp_N_pol_bf - 1);
 
   function func_sdp_bdo_transpose_packet(nof_blocks_per_packet : natural;
@@ -493,16 +495,26 @@ package body tb_sdp_pkg is
     return v_tuple;
   end;
 
+  -- BDO transpose:
+  -- . See sdp/python/test_func_sdp_bdo_transpose_packet.py to verify that
+  --   v_out = func_sdp_bdo_transpose_packet(4, 488, v_in) yields the expected v_out.
+  -- . See data repacking section in:
+  --   https://support.astron.nl/confluence/pages/viewpage.action?spaceKey=L2M&title=L4+SDPFW+Decision%3A+Multiple+beamlet+output+destinations
+  -- . Use separate packet_list for re and im
   -- input packet_list:
-  -- . blk       0,     1,     2,     3,  for nof_blocks_per_packet = 4
-  -- . blet  0:487, 0:487, 0:487, 0:487,  for nof_beamlets_per_block = 488
-  -- . v_in  0,1,2, ...            1951
+  -- . blk               0,            1,            2,            3,  for nof_blocks_per_packet = 4
+  -- . blet   0,   ... 487, 0,   ... 487, 0,   ... 487, 0,   ... 487,  for nof_beamlets_per_block = 488
+  -- . pol_bf X,Y, ... X,Y, X,Y, ... X,Y, X,Y, ... X,Y, X,Y, ... X,Y,  for N_pol_bf = 2, X,Y = 0,1
+  -- . v_in   0,   ... 975, 976, ...1951,1952, ...2927,2928, ...3903,  input list index
   -- return v_list = transposed packet_list:
-  --                      0,              1, ...,               487
-  --                    0:3,            0:3, ...,               0:3
-  --         0,488,976,1464, 1,489,977,1465, ..., 487,975,1463,1951
-  --
-  -- . v_out 0,4,8,...,1948, 1,5,9,...,1949, 2,6,10,...,1950, 3,7,11,...,1951
+  -- . pol_bf              X,Y,X,Y,X,Y,X,Y, ..., X,Y,X,Y,X,Y,X,Y,  for N_pol_bf = 2, X,Y = 0,1
+  -- . blk                   0,  1,  2,  3, ...,   0,  1,  2,  3,  for nof_blocks_per_packet = 4
+  -- . blet                              0, ...,             487,  for nof_beamlets_per_block = 488
+  -- . v_out 0,1,  976, 977, 1952,1953, 2928,2929,
+  --         2,3,  978, 979, 1954,1955, 2930,2931,
+  --         ...,       ...,       ...,       ...,
+  --     972,973, 1948,1949, 2924,2925, 3900,3901,
+  --     974,775, 1950,1951, 2926,2927, 3902,3903, output list index
   function func_sdp_bdo_transpose_packet(nof_blocks_per_packet : natural;
                                          nof_beamlets_per_block : natural;
                                          packet_list : t_sdp_beamlet_packet_list) return t_sdp_beamlet_packet_list is
@@ -512,12 +524,14 @@ package body tb_sdp_pkg is
   begin
     for blk in 0 to nof_blocks_per_packet - 1 loop
       for blet in 0 to nof_beamlets_per_block - 1 loop
-        v_in := blk * nof_beamlets_per_block + blet;
-        v_out := blet * nof_blocks_per_packet + blk;
-        v_list(v_out) := packet_list(v_in);
+        for pol_bf in 0 to c_sdp_N_pol_bf - 1 loop
+          v_in := (blk * nof_beamlets_per_block + blet) * c_sdp_N_pol_bf + pol_bf;
+          v_out := (blet * nof_blocks_per_packet + blk) * c_sdp_N_pol_bf + pol_bf;
+          v_list(v_out) := packet_list(v_in);
+        end loop;
       end loop;
-   end loop;
-   return v_list;
+    end loop;
+    return v_list;
   end func_sdp_bdo_transpose_packet;
 
 end tb_sdp_pkg;
-- 
GitLab