From 31e6b575293c541e7f1b6bf2f91a4ee61ad25c9c Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Thu, 14 Sep 2023 16:29:57 +0200
Subject: [PATCH] Support design revision parameter
 use_bdo_multiple_destinations.

---
 .../src/vhdl/lofar2_unb2b_sdp_station.vhd     | 27 +++++++-------
 .../src/vhdl/lofar2_unb2b_sdp_station_pkg.vhd | 37 ++++++++++---------
 .../src/vhdl/lofar2_unb2c_sdp_station.vhd     | 25 +++++++------
 .../src/vhdl/lofar2_unb2c_sdp_station_pkg.vhd | 37 ++++++++++---------
 .../sdp/src/vhdl/node_sdp_beamformer.vhd      | 20 +++++-----
 .../sdp/src/vhdl/sdp_beamformer_output.vhd    |  7 ++--
 .../libraries/sdp/src/vhdl/sdp_station.vhd    | 18 +++++----
 7 files changed, 90 insertions(+), 81 deletions(-)

diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd
index 76c4d3cc12..d1081da37d 100644
--- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd
+++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd
@@ -804,19 +804,20 @@ begin
   -----------------------------------------------------------------------------
   u_sdp_station : entity lofar2_sdp_lib.sdp_station
   generic map (
-    g_sim                    => g_sim,
-    g_wpfb                   => g_wpfb,
-    g_wpfb_complex           => g_wpfb_complex,
-    g_bsn_nof_clk_per_sync   => g_bsn_nof_clk_per_sync,
-    g_scope_selected_subband => g_scope_selected_subband,
-    g_no_jesd                => c_revision_select.no_jesd,
-    g_use_fsub               => c_revision_select.use_fsub,
-    g_use_oversample         => c_revision_select.use_oversample,
-    g_use_xsub               => c_revision_select.use_xsub,
-    g_use_bf                 => c_revision_select.use_bf,
-    g_use_bdo_transpose      => c_revision_select.use_bdo_transpose,
-    g_use_ring               => c_revision_select.use_ring,
-    g_P_sq                   => c_revision_select.P_sq
+    g_sim                           => g_sim,
+    g_wpfb                          => g_wpfb,
+    g_wpfb_complex                  => g_wpfb_complex,
+    g_bsn_nof_clk_per_sync          => g_bsn_nof_clk_per_sync,
+    g_scope_selected_subband        => g_scope_selected_subband,
+    g_no_jesd                       => c_revision_select.no_jesd,
+    g_use_fsub                      => c_revision_select.use_fsub,
+    g_use_oversample                => c_revision_select.use_oversample,
+    g_use_xsub                      => c_revision_select.use_xsub,
+    g_use_bf                        => c_revision_select.use_bf,
+    g_use_bdo_transpose             => c_revision_select.use_bdo_transpose,
+    g_use_bdo_multiple_destinations => c_revision_select.use_bdo_multiple_destinations,
+    g_use_ring                      => c_revision_select.use_ring,
+    g_P_sq                          => c_revision_select.P_sq
   )
   port map (
 
diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station_pkg.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station_pkg.vhd
index 0c5ca0f1ac..e65f35ec02 100644
--- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station_pkg.vhd
+++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station_pkg.vhd
@@ -31,30 +31,31 @@ package lofar2_unb2b_sdp_station_pkg is
   -----------------------------------------------------------------------------
 
   type t_lofar2_unb2b_sdp_station_config is record
-    no_jesd           : boolean;
-    use_fsub          : boolean;
-    use_oversample    : boolean;
-    use_bf            : boolean;
-    use_bdo_transpose : boolean;
-    use_xsub          : boolean;
-    use_ring          : boolean;
-    P_sq              : natural;
+    no_jesd                       : boolean;
+    use_fsub                      : boolean;
+    use_oversample                : boolean;
+    use_bf                        : boolean;
+    use_bdo_transpose             : boolean;
+    use_bdo_multiple_destinations : boolean;
+    use_xsub                      : boolean;
+    use_ring                      : boolean;
+    P_sq                          : natural;
   end record;
 
-  constant c_ait        : t_lofar2_unb2b_sdp_station_config := (false, false, false, false, false, false, false, 0);
-  constant c_fsub       : t_lofar2_unb2b_sdp_station_config := (false, true,  false, false, false, false, false, 0);
+  constant c_ait        : t_lofar2_unb2b_sdp_station_config := (false, false, false, false, false, false, false, false, 0);
+  constant c_fsub       : t_lofar2_unb2b_sdp_station_config := (false, true,  false, false, false, false, false, false, 0);
   -- use c_bf on one node also to simulate bdo transpose
   -- use c_bf_ring with ring also to simulate bdo identity
-  constant c_bf         : t_lofar2_unb2b_sdp_station_config := (false, true,  false, true,  false, false, false, 0);
-  constant c_bf_ring    : t_lofar2_unb2b_sdp_station_config := (false, true,  false, true,  false, false, true,  0);
-  constant c_xsub_one   : t_lofar2_unb2b_sdp_station_config := (false, true,  false, false, false, true,  false, 1);
-  constant c_xsub_ring  : t_lofar2_unb2b_sdp_station_config := (false, true,  false, false, false, true,  true,  9);
+  constant c_bf         : t_lofar2_unb2b_sdp_station_config := (false, true,  false, true,  false, false, false, false, 0);
+  constant c_bf_ring    : t_lofar2_unb2b_sdp_station_config := (false, true,  false, true,  false, false, false, true,  0);
+  constant c_xsub_one   : t_lofar2_unb2b_sdp_station_config := (false, true,  false, false, false, false, true,  false, 1);
+  constant c_xsub_ring  : t_lofar2_unb2b_sdp_station_config := (false, true,  false, false, false, false, true,  true,  9);
   -- use c_full_wg for SDP regression test on Arts-unb2b
-  constant c_full_wg    : t_lofar2_unb2b_sdp_station_config := (true,  true,  false, true,  true,  true,  true,  9);
-  constant c_full       : t_lofar2_unb2b_sdp_station_config := (false, true,  false, true,  false, true,  true,  9);
-  constant c_full_wg_os : t_lofar2_unb2b_sdp_station_config := (true,  true,  true,  true,  false, true,  true,  9);
+  constant c_full_wg    : t_lofar2_unb2b_sdp_station_config := (true,  true,  false, true,  true,  false, true,  true,  9);
+  constant c_full       : t_lofar2_unb2b_sdp_station_config := (false, true,  false, true,  false, false, true,  true,  9);
+  constant c_full_wg_os : t_lofar2_unb2b_sdp_station_config := (true,  true,  true,  true,  false, false, true,  true,  9);
   -- use c_full_os for SDP on LTS-unb2b of Disturb2
-  constant c_full_os    : t_lofar2_unb2b_sdp_station_config := (false, true,  true,  true,  false, true,  true,  9);
+  constant c_full_os    : t_lofar2_unb2b_sdp_station_config := (false, true,  true,  true,  false, false, true,  true,  9);
 
   -- Function to select the revision configuration.
   function func_sel_revision_rec(g_design_name : string) return t_lofar2_unb2b_sdp_station_config;
diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd
index 8635117451..6862b4620f 100644
--- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd
@@ -770,18 +770,19 @@ begin
   -----------------------------------------------------------------------------
   u_sdp_station : entity lofar2_sdp_lib.sdp_station
   generic map (
-    g_sim                    => g_sim,
-    g_wpfb                   => g_wpfb,
-    g_bsn_nof_clk_per_sync   => g_bsn_nof_clk_per_sync,
-    g_scope_selected_subband => g_scope_selected_subband,
-    g_no_jesd                => c_revision_select.no_jesd,
-    g_use_fsub               => c_revision_select.use_fsub,
-    g_use_oversample         => c_revision_select.use_oversample,
-    g_use_xsub               => c_revision_select.use_xsub,
-    g_use_bf                 => c_revision_select.use_bf,
-    g_use_bdo_transpose      => c_revision_select.use_bdo_transpose,
-    g_use_ring               => c_revision_select.use_ring,
-    g_P_sq                   => c_revision_select.P_sq
+    g_sim                           => g_sim,
+    g_wpfb                          => g_wpfb,
+    g_bsn_nof_clk_per_sync          => g_bsn_nof_clk_per_sync,
+    g_scope_selected_subband        => g_scope_selected_subband,
+    g_no_jesd                       => c_revision_select.no_jesd,
+    g_use_fsub                      => c_revision_select.use_fsub,
+    g_use_oversample                => c_revision_select.use_oversample,
+    g_use_xsub                      => c_revision_select.use_xsub,
+    g_use_bf                        => c_revision_select.use_bf,
+    g_use_bdo_transpose             => c_revision_select.use_bdo_transpose,
+    g_use_bdo_multiple_destinations => c_revision_select.use_bdo_multiple_destinations,
+    g_use_ring                      => c_revision_select.use_ring,
+    g_P_sq                          => c_revision_select.P_sq
   )
   port map (
 
diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station_pkg.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station_pkg.vhd
index fead337700..89fdb57b34 100644
--- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station_pkg.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station_pkg.vhd
@@ -31,29 +31,30 @@ package lofar2_unb2c_sdp_station_pkg is
   -----------------------------------------------------------------------------
 
   type t_lofar2_unb2c_sdp_station_config is record
-    no_jesd           : boolean;
-    use_fsub          : boolean;
-    use_oversample    : boolean;
-    use_bf            : boolean;
-    use_bdo_transpose : boolean;
-    use_xsub          : boolean;
-    use_ring          : boolean;
-    P_sq              : natural;
+    no_jesd                       : boolean;
+    use_fsub                      : boolean;
+    use_oversample                : boolean;
+    use_bf                        : boolean;
+    use_bdo_transpose             : boolean;
+    use_bdo_multiple_destinations : boolean;
+    use_xsub                      : boolean;
+    use_ring                      : boolean;
+    P_sq                          : natural;
   end record;
 
-  constant c_ait        : t_lofar2_unb2c_sdp_station_config := (false, false, false, false, false, false, false, 0);
-  constant c_fsub       : t_lofar2_unb2c_sdp_station_config := (false, true,  false, false, false, false, false, 0);
+  constant c_ait        : t_lofar2_unb2c_sdp_station_config := (false, false, false, false, false, false, false, false, 0);
+  constant c_fsub       : t_lofar2_unb2c_sdp_station_config := (false, true,  false, false, false, false, false, false, 0);
   -- use c_bf on one node also to simulate bdo transpose
   -- use c_bf_ring with ring also to simulate bdo identity
-  constant c_bf         : t_lofar2_unb2c_sdp_station_config := (false, true,  false, true,  true,  false, false, 0);
-  constant c_bf_ring    : t_lofar2_unb2c_sdp_station_config := (false, true,  false, true,  false, false, true,  0);
-  constant c_xsub_one   : t_lofar2_unb2c_sdp_station_config := (false, true,  false, false, false, true,  false, 1);
-  constant c_xsub_ring  : t_lofar2_unb2c_sdp_station_config := (false, true,  false, false, false, true,  true,  9);
-  constant c_full_wg    : t_lofar2_unb2c_sdp_station_config := (true,  true,  false, true,  true,  true,  true,  9);
+  constant c_bf         : t_lofar2_unb2c_sdp_station_config := (false, true,  false, true,  true,  false, false, false, 0);
+  constant c_bf_ring    : t_lofar2_unb2c_sdp_station_config := (false, true,  false, true,  false, false, false, true,  0);
+  constant c_xsub_one   : t_lofar2_unb2c_sdp_station_config := (false, true,  false, false, false, false, true,  false, 1);
+  constant c_xsub_ring  : t_lofar2_unb2c_sdp_station_config := (false, true,  false, false, false, false, true,  true,  9);
+  constant c_full_wg    : t_lofar2_unb2c_sdp_station_config := (true,  true,  false, true,  true,  false, true,  true,  9);
   -- Use c_full for LOFAR2 Station SDP operations
-  constant c_full       : t_lofar2_unb2c_sdp_station_config := (false, true,  false, true,  true,  true,  true,  9);
-  constant c_full_wg_os : t_lofar2_unb2c_sdp_station_config := (true,  true,  true,  true,  true,  true,  true,  9);
-  constant c_full_os    : t_lofar2_unb2c_sdp_station_config := (false, true,  true,  true,  true,  true,  true,  9);
+  constant c_full       : t_lofar2_unb2c_sdp_station_config := (false, true,  false, true,  true,  false, true,  true,  9);
+  constant c_full_wg_os : t_lofar2_unb2c_sdp_station_config := (true,  true,  true,  true,  true,  false, true,  true,  9);
+  constant c_full_os    : t_lofar2_unb2c_sdp_station_config := (false, true,  true,  true,  true,  false, true,  true,  9);
 
   -- Function to select the revision configuration.
   function func_sel_revision_rec(g_design_name : string) return t_lofar2_unb2c_sdp_station_config;
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd
index d278d1ab57..6a5a17961a 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_beamformer.vhd
@@ -40,14 +40,15 @@ use work.sdp_pkg.all;
 
 entity node_sdp_beamformer is
   generic (
-    g_sim                    : boolean := false;
-    g_sim_sdp                : t_sdp_sim := c_sdp_sim;
-    g_beamset_id             : natural := 0;
-    g_use_bdo_transpose      : boolean := false;
-    g_scope_selected_beamlet : natural := 0;
+    g_sim                           : boolean := false;
+    g_sim_sdp                       : t_sdp_sim := c_sdp_sim;
+    g_beamset_id                    : natural := 0;
+    g_use_bdo_transpose             : boolean := false;
+    g_use_bdo_multiple_destinations : boolean := false;
+    g_scope_selected_beamlet        : natural := 0;
     -- Use no default raw width, to force instance to set it
-    g_subband_raw_dat_w      : natural;  -- default: c_sdp_W_subband;
-    g_subband_raw_fraction_w : natural  -- default: 0
+    g_subband_raw_dat_w             : natural;  -- default: c_sdp_W_subband;
+    g_subband_raw_fraction_w        : natural  -- default: 0
   );
   port (
     dp_clk        : in  std_logic;
@@ -255,8 +256,9 @@ begin
   ---------------------------------------------------------------
   u_sdp_beamformer_output : entity work.sdp_beamformer_output
   generic map(
-    g_beamset_id    => g_beamset_id,
-    g_use_transpose => g_use_bdo_transpose
+    g_beamset_id                => g_beamset_id,
+    g_use_transpose             => g_use_bdo_transpose,
+    g_use_multiple_destinations => g_use_bdo_multiple_destinations
   )
   port map (
     mm_rst => mm_rst,
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd
index 4012eabd82..159ec45ff8 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd
@@ -45,8 +45,9 @@ use work.sdp_pkg.all;
 
 entity sdp_beamformer_output is
   generic (
-    g_beamset_id    : natural := 0;
-    g_use_transpose : boolean := false
+    g_beamset_id                : natural := 0;
+    g_use_transpose             : boolean := false;
+    g_use_multiple_destinations : boolean := false
   );
   port (
     dp_clk   : in  std_logic;
@@ -303,7 +304,7 @@ begin
   dp_packet_reorder_word <= unpack_data(dp_packet_reorder_src_out.data(c_sdp_W_dual_pol_beamlet - 1 downto 0));
 
   -- Use synchronous reset in d signals
-  p_dp_clk_synchronous : process(dp_clk)
+  p_dp_clk : process(dp_clk)
   begin
     if rising_edge(dp_clk) then
       r_identity  <= d_identity;
diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd
index ebd79dc6d4..77a525d30f 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd
@@ -66,7 +66,8 @@ entity sdp_station is
     g_use_oversample         : boolean := false;
     g_use_xsub               : boolean := true;
     g_use_bf                 : boolean := true;
-    g_use_bdo_transpose      : boolean := false;
+    g_use_bdo_transpose             : boolean := false;
+    g_use_bdo_multiple_destinations : boolean := false;
     g_use_ring               : boolean := true;
     g_P_sq                   : natural := 1
   );
@@ -908,13 +909,14 @@ begin
     gen_bf : for beamset_id in 0 to c_sdp_N_beamsets - 1 generate
       u_bf : entity work.node_sdp_beamformer
       generic map(
-        g_sim                    => g_sim,
-        g_sim_sdp                => g_sim_sdp,
-        g_beamset_id             => beamset_id,
-        g_use_bdo_transpose      => g_use_bdo_transpose,
-        g_scope_selected_beamlet => g_scope_selected_subband,
-        g_subband_raw_dat_w      => c_subband_raw_dat_w,
-        g_subband_raw_fraction_w => c_subband_raw_fraction_w
+        g_sim                           => g_sim,
+        g_sim_sdp                       => g_sim_sdp,
+        g_beamset_id                    => beamset_id,
+        g_use_bdo_transpose             => g_use_bdo_transpose,
+        g_use_bdo_multiple_destinations => g_use_bdo_multiple_destinations,
+        g_scope_selected_beamlet        => g_scope_selected_subband,
+        g_subband_raw_dat_w             => c_subband_raw_dat_w,
+        g_subband_raw_fraction_w        => c_subband_raw_fraction_w
       )
       port map(
         dp_clk                   => dp_clk,
-- 
GitLab