From 73cd845b7af466c40e7199338c4004bc3c5b7d3d Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Tue, 30 Nov 2021 17:03:21 +0100
Subject: [PATCH] Use c_sdp_W_statistics_sz. Add func_sdp_get_stat_from_mm_*().

---
 .../lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd | 56 +++++++++++++------
 1 file changed, 40 insertions(+), 16 deletions(-)

diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd
index 411e19c0f3..5512ee4aac 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd
@@ -99,6 +99,7 @@ PACKAGE sdp_pkg is
   CONSTANT c_sdp_W_beamlet                 : NATURAL := 8;
   CONSTANT c_sdp_W_gn_id                   : NATURAL := 5;
   CONSTANT c_sdp_W_statistic               : NATURAL := 64;
+  CONSTANT c_sdp_W_statistic_sz            : NATURAL := 2;   -- = c_sdp_W_statistic / c_word_w
   CONSTANT c_sdp_W_sub_weight              : NATURAL := 16;  -- = w in s(w, p), s = signed
   CONSTANT c_sdp_W_sub_weight_fraction     : NATURAL := 13;  -- = p in s(w, p)
   CONSTANT c_sdp_W_sub_weight_magnitude    : NATURAL := c_sdp_W_sub_weight - c_sdp_W_sub_weight_fraction - 1;  -- = 2
@@ -146,7 +147,7 @@ PACKAGE sdp_pkg is
     (1, c_sdp_N_fft, 0, c_sdp_P_pfb,
     c_sdp_N_taps, 0, c_sdp_W_adc, 17, c_sdp_W_fir_coef,
     true, false, true, 17, c_sdp_W_subband, 0, 22, 1,
-    true, 54, 2, 195313, c_fft_pipeline, c_fft_pipeline,
+    true, 54, c_sdp_W_statistic_sz, 195313, c_fft_pipeline, c_fft_pipeline,
     c_fil_ppf_pipeline);
 
   -----------------------------------------------------------------------------
@@ -161,17 +162,18 @@ PACKAGE sdp_pkg is
   --   https://git.astron.nl/desp/hdl/-/blob/master/boards/uniboard2b/libraries/unb2b_board/src/vhdl/ctrl_unb2b_board.vhd
 
   --CONSTANT c_sdp_offload_time : NATURAL := 13000;  -- from wave window 62855nS / 5nS = 12571 cycles.
-  CONSTANT c_sdp_offload_time : NATURAL := 600000;  -- L2SDP-452
+  CONSTANT c_sdp_offload_time : NATURAL := 600000;  -- see L2SDP-452
 
   -- packet lengths, see ICD SC-SDP
-  CONSTANT c_sdp_stat_data_sz            : NATURAL := 2;  -- = 2 words = 64 bit data (= c_sdp_wpfb_subbands.stat_data_sz)
-  CONSTANT c_sdp_stat_data_byte_sz       : NATURAL := c_sdp_stat_data_sz * c_word_sz;  -- = 8 bytes = 64 bit data
-  CONSTANT c_sdp_nof_bytes_per_statistic : NATURAL := 8;
+  CONSTANT c_sdp_nof_bytes_per_statistic : NATURAL := 8;  -- c_sdp_W_statistic_sz * c_word_sz = 2 * 4 = 8
 
   CONSTANT c_sdp_stat_app_header_len    : NATURAL := 32;
 
   FUNCTION func_sdp_get_stat_marker(g_statistics_type : STRING) RETURN NATURAL;
   FUNCTION func_sdp_get_stat_nof_signal_inputs(g_statistics_type : STRING) RETURN NATURAL;
+  FUNCTION func_sdp_get_stat_from_mm_data_size(g_statistics_type : STRING) RETURN NATURAL;
+  FUNCTION func_sdp_get_stat_from_mm_step_size(g_statistics_type : STRING) RETURN NATURAL;
+  FUNCTION func_sdp_get_stat_from_mm_nof_data(g_statistics_type : STRING) RETURN NATURAL;
   FUNCTION func_sdp_get_stat_nof_statistics_per_packet(g_statistics_type : STRING) RETURN NATURAL;
   FUNCTION func_sdp_get_stat_app_total_length(g_statistics_type : STRING) RETURN NATURAL;
   FUNCTION func_sdp_get_stat_udp_total_length(g_statistics_type : STRING) RETURN NATURAL;
@@ -180,7 +182,7 @@ PACKAGE sdp_pkg is
   -- . For XST func_sdp_get_stat_nof_packets returns the maximum nof_packets.
   --   The actual nof_packets for XST will depend on the MM programmable
   --   nof_crosslets <= c_sdp_N_crosslets_max in sdp_statistics_offload.
-  FUNCTION func_sdp_get_stat_nof_packets(g_statistics_type : STRING; S_pn, P_sq : NATURAL) RETURN NATURAL;
+  FUNCTION func_sdp_get_stat_nof_packets(g_statistics_type : STRING; S_pn, P_sq, nof_crosslets : NATURAL) RETURN NATURAL;
   FUNCTION func_sdp_get_stat_nof_packets(g_statistics_type : STRING) RETURN NATURAL;
 
   CONSTANT c_sdp_stat_eth_dst_mac       : STD_LOGIC_VECTOR(47 DOWNTO 0) := x"001B217176B9";  -- 001B217176B9 = DOP36-enp2s0
@@ -429,7 +431,7 @@ PACKAGE sdp_pkg is
 
   -- FSUB MM address widths
   CONSTANT c_sdp_ram_fil_coefs_addr_w       : NATURAL := ceil_log2(c_sdp_N_fft * c_sdp_N_taps);
-  CONSTANT c_sdp_ram_st_sst_addr_w          : NATURAL := ceil_log2(c_sdp_P_pfb * c_sdp_N_sub * c_sdp_Q_fft * c_sdp_stat_data_sz);
+  CONSTANT c_sdp_ram_st_sst_addr_w          : NATURAL := ceil_log2(c_sdp_P_pfb * c_sdp_N_sub * c_sdp_Q_fft * c_sdp_W_statistic_sz);
   CONSTANT c_sdp_reg_si_addr_w              : NATURAL := 1; --enable/disable
   CONSTANT c_sdp_ram_equalizer_gains_addr_w : NATURAL := ceil_log2(c_sdp_P_pfb*c_sdp_N_sub*c_sdp_Q_fft);
   CONSTANT c_sdp_reg_dp_selector_addr_w     : NATURAL := 1; --Select input 0 or 1.
@@ -443,7 +445,7 @@ PACKAGE sdp_pkg is
   CONSTANT c_sdp_ram_bf_weights_addr_w      : NATURAL := ceil_log2(c_sdp_N_beamsets) + ceil_log2(c_sdp_N_pol_bf * c_sdp_P_pfb * c_sdp_S_sub_bf * c_sdp_Q_fft);
   CONSTANT c_sdp_reg_bf_scale_addr_w        : NATURAL := ceil_log2(c_sdp_N_beamsets) + 1;  
   CONSTANT c_sdp_reg_dp_xonoff_addr_w       : NATURAL := ceil_log2(c_sdp_N_beamsets) + 1;
-  CONSTANT c_sdp_ram_st_bst_addr_w          : NATURAL := ceil_log2(c_sdp_N_beamsets) + ceil_log2(c_sdp_S_sub_bf * c_sdp_N_pol_bf * c_sdp_stat_data_sz);
+  CONSTANT c_sdp_ram_st_bst_addr_w          : NATURAL := ceil_log2(c_sdp_N_beamsets) + ceil_log2(c_sdp_S_sub_bf * c_sdp_N_pol_bf * c_sdp_W_statistic_sz);
   CONSTANT c_sdp_reg_stat_enable_bst_addr_w : NATURAL := ceil_log2(c_sdp_N_beamsets) + c_sdp_reg_stat_enable_addr_w;
   CONSTANT c_sdp_reg_stat_hdr_dat_bst_addr_w: NATURAL := ceil_log2(c_sdp_N_beamsets) + c_sdp_reg_stat_hdr_dat_addr_w;
 
@@ -478,7 +480,7 @@ PACKAGE sdp_pkg is
   CONSTANT c_sdp_reg_crosslets_info_addr_w          : NATURAL := c_sdp_mm_reg_crosslets_info.adr_w;
   CONSTANT c_sdp_reg_nof_crosslets_addr_w           : NATURAL := c_sdp_mm_reg_nof_crosslets.adr_w;
   CONSTANT c_sdp_reg_bsn_sync_scheduler_xsub_addr_w : NATURAL := 4; 
-  CONSTANT c_sdp_ram_st_xsq_addr_w                  : NATURAL := ceil_log2(c_sdp_P_sq) + ceil_log2(c_sdp_N_crosslets_max * c_sdp_X_sq * c_nof_complex * c_sdp_stat_data_sz );
+  CONSTANT c_sdp_ram_st_xsq_addr_w                  : NATURAL := ceil_log2(c_sdp_P_sq) + ceil_log2(c_sdp_N_crosslets_max * c_sdp_X_sq * c_nof_complex * c_sdp_W_statistic_sz );
 
   -- RING MM address widths
   CONSTANT c_sdp_reg_bsn_monitor_v2_ring_rx_addr_w        : NATURAL := ceil_log2(c_sdp_N_ring_lanes_max) + ceil_log2(c_sdp_N_pn_max) + ceil_Log2(7); 
@@ -525,11 +527,33 @@ PACKAGE BODY sdp_pkg IS
                                             1));  -- SST
   END func_sdp_get_stat_nof_signal_inputs;
 
+  FUNCTION func_sdp_get_stat_from_mm_data_size(g_statistics_type : STRING) RETURN NATURAL IS
+  BEGIN
+    RETURN sel_a_b(g_statistics_type="BST", c_sdp_N_pol_bf * c_sdp_W_statistic_sz,  -- = 4
+           sel_a_b(g_statistics_type="XST", c_nof_complex * c_sdp_W_statistic_sz,   -- = 4
+                                            c_sdp_W_statistic_sz));                 -- = 2, SST
+  END func_sdp_get_stat_from_mm_data_size;
+
+  FUNCTION func_sdp_get_stat_from_mm_step_size(g_statistics_type : STRING) RETURN NATURAL IS
+    CONSTANT c_data_size : NATURAL := func_sdp_get_stat_from_mm_data_size(g_statistics_type);
+  BEGIN
+    RETURN sel_a_b(g_statistics_type="BST", c_data_size,                  -- = 4
+           sel_a_b(g_statistics_type="XST", c_data_size,                  -- = 4
+                                            c_sdp_Q_fft * c_data_size));  -- = 4, SST
+  END func_sdp_get_stat_from_mm_step_size;
+
+  FUNCTION func_sdp_get_stat_from_mm_nof_data(g_statistics_type : STRING) RETURN NATURAL IS
+  BEGIN
+    RETURN sel_a_b(g_statistics_type="BST", c_sdp_S_sub_bf,  -- = 488
+           sel_a_b(g_statistics_type="XST", c_sdp_X_sq,      -- = 144
+                                            c_sdp_N_sub));   -- = 512, SST
+  END func_sdp_get_stat_from_mm_nof_data;
+
   FUNCTION func_sdp_get_stat_nof_statistics_per_packet(g_statistics_type : STRING) RETURN NATURAL IS
   BEGIN
-    RETURN sel_a_b(g_statistics_type="BST", c_sdp_N_pol_bf * c_sdp_S_sub_bf,          -- = 976
-           sel_a_b(g_statistics_type="XST", c_sdp_S_pn * c_sdp_S_pn * c_nof_complex,  -- = 288
-                                            c_sdp_N_sub));                            -- = 512, SST
+    RETURN sel_a_b(g_statistics_type="BST", c_sdp_S_sub_bf * c_sdp_N_pol_bf,  -- = 976
+           sel_a_b(g_statistics_type="XST", c_sdp_X_sq * c_nof_complex,       -- = 288
+                                            c_sdp_N_sub));                    -- = 512, SST
   END func_sdp_get_stat_nof_statistics_per_packet;
 
   FUNCTION func_sdp_get_stat_app_total_length(g_statistics_type : STRING) RETURN NATURAL IS
@@ -539,7 +563,7 @@ PACKAGE BODY sdp_pkg IS
     -- . SST : 4128 (= 4096 + 32)
     -- . BST : 7840 (= 7808 + 32)
     -- . XST : 2336 (= 2304 + 32)
-    RETURN c_nof_statistics_per_packet * c_sdp_stat_data_byte_sz + c_sdp_stat_app_header_len;
+    RETURN c_nof_statistics_per_packet * c_sdp_nof_bytes_per_statistic + c_sdp_stat_app_header_len;
   END func_sdp_get_stat_app_total_length;
 
   FUNCTION func_sdp_get_stat_udp_total_length(g_statistics_type : STRING) RETURN NATURAL IS
@@ -562,16 +586,16 @@ PACKAGE BODY sdp_pkg IS
     RETURN c_sdp_udp_total_length + c_network_ip_header_len;
   END func_sdp_get_stat_ip_total_length;
 
-  FUNCTION func_sdp_get_stat_nof_packets(g_statistics_type : STRING; S_pn, P_sq : NATURAL) RETURN NATURAL IS
+  FUNCTION func_sdp_get_stat_nof_packets(g_statistics_type : STRING; S_pn, P_sq, nof_crosslets : NATURAL) RETURN NATURAL IS
   BEGIN
     RETURN sel_a_b(g_statistics_type="BST", 1,
-           sel_a_b(g_statistics_type="XST", P_sq * c_sdp_N_crosslets_max,
+           sel_a_b(g_statistics_type="XST", P_sq * nof_crosslets,
                                             S_pn));  -- SST
   END func_sdp_get_stat_nof_packets;
 
   FUNCTION func_sdp_get_stat_nof_packets(g_statistics_type : STRING) RETURN NATURAL IS
   BEGIN
-    RETURN func_sdp_get_stat_nof_packets(g_statistics_type, c_sdp_S_pn, c_sdp_P_sq);
+    RETURN func_sdp_get_stat_nof_packets(g_statistics_type, c_sdp_S_pn, c_sdp_P_sq, c_sdp_N_crosslets_max);
   END func_sdp_get_stat_nof_packets;
 
 
-- 
GitLab