From b948db5c0d311851f01a7d58bf6d51bce25ff5e8 Mon Sep 17 00:00:00 2001
From: Daniel van der Schuur <schuur@astron.nl>
Date: Fri, 27 Jul 2018 13:05:02 +0000
Subject: [PATCH] Updated arts_unb2b_sc3 such that it compiles in ModelSim. .
 Completed data path from inputs to outputs through all stages. Updated
 arts_unb2b_sc3 such that it compiles in Quartus. . Commented out MMM due to
 QSYS IP issues . Added IP for 3-channel 10GbE base-R (all mods in technology
 dir) . Added g_direction generic to unb2b_board_10gbe in anticipation of  
 having to split up the now duplex I/O to   . the RX part in the input stage  
 . the TX part in the output stage

---
 .../arts/designs/arts_unb2b_sc3/hdllib.cfg    |  18 +-
 .../src/vhdl/arts_unb2b_sc3.vhd               | 468 +++++++------
 .../src/vhdl/arts_unb2b_sc3_input.vhd         | 516 ++++++++++----
 .../src/vhdl/arts_unb2b_sc3_mm_master.vhd     |   5 +-
 .../src/vhdl/arts_unb2b_sc3_output.vhd        | 199 +++++-
 .../src/vhdl/arts_unb2b_sc3_processing.vhd    |  89 ++-
 .../src/vhdl/unb2_board_10gbe.vhd             |   2 +
 libraries/technology/10gbase_r/hdllib.cfg     |   5 +
 .../10gbase_r/tech_10gbase_r_arria10_e1sg.vhd |  82 ++-
 .../tech_10gbase_r_component_pkg.vhd          |  74 +++
 .../phy_10gbase_r_3/compile_ip.tcl            |  35 +
 .../phy_10gbase_r_3/generate_ip.sh            |  44 ++
 .../phy_10gbase_r_3/hdllib.cfg                |  19 +
 .../ip_arria10_e1sg_phy_10gbase_r_3.qsys      | 628 ++++++++++++++++++
 .../compile_ip.tcl                            |  34 +
 .../generate_ip.sh                            |  44 ++
 .../transceiver_reset_controller_3/hdllib.cfg |  19 +
 ...0_e1sg_transceiver_reset_controller_3.qsys | 175 +++++
 18 files changed, 2068 insertions(+), 388 deletions(-)
 create mode 100644 libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/compile_ip.tcl
 create mode 100755 libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/generate_ip.sh
 create mode 100644 libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/hdllib.cfg
 create mode 100644 libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/ip_arria10_e1sg_phy_10gbase_r_3.qsys
 create mode 100644 libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/compile_ip.tcl
 create mode 100755 libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/generate_ip.sh
 create mode 100644 libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/hdllib.cfg
 create mode 100644 libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/ip_arria10_e1sg_transceiver_reset_controller_3.qsys

diff --git a/applications/arts/designs/arts_unb2b_sc3/hdllib.cfg b/applications/arts/designs/arts_unb2b_sc3/hdllib.cfg
index 369c5aa3e1..ca9b1d5b0a 100644
--- a/applications/arts/designs/arts_unb2b_sc3/hdllib.cfg
+++ b/applications/arts/designs/arts_unb2b_sc3/hdllib.cfg
@@ -1,6 +1,6 @@
 hdl_lib_name = arts_unb2b_sc3
 hdl_library_clause_name = arts_unb2b_sc3_lib
-hdl_lib_uses_synth = common technology mm unb2b_board unb2b_board_10gbe dp eth tech_tse tr_10GbE diagnostics diag tech_mac_10g arts_unb1_sc4
+hdl_lib_uses_synth = common technology mm unb2b_board unb2b_board_10gbe dp eth tech_tse tr_10GbE diagnostics diag tech_mac_10g arts_unb1_sc4 apertif arts_tab_beamformer iquv 
 hdl_lib_uses_sim = 
 hdl_lib_technology = ip_arria10_e1sg
 hdl_lib_include_ip = 
@@ -11,12 +11,14 @@ hdl_lib_include_ip =
                      ip_arria10_e1sg_transceiver_pll_10g
                      
                      ip_arria10_e1sg_phy_10gbase_r
+                     ip_arria10_e1sg_phy_10gbase_r_3
                      ip_arria10_e1sg_phy_10gbase_r_4
                      ip_arria10_e1sg_phy_10gbase_r_12
                      ip_arria10_e1sg_phy_10gbase_r_24
                      ip_arria10_e1sg_phy_10gbase_r_48
                      
                      ip_arria10_e1sg_transceiver_reset_controller_1
+                     ip_arria10_e1sg_transceiver_reset_controller_3
                      ip_arria10_e1sg_transceiver_reset_controller_4
                      ip_arria10_e1sg_transceiver_reset_controller_12
                      ip_arria10_e1sg_transceiver_reset_controller_24
@@ -25,13 +27,19 @@ hdl_lib_include_ip =
 synth_files =
     src/vhdl/qsys_arts_unb2b_sc3_pkg.vhd
     src/vhdl/arts_unb2b_sc3_mm_master.vhd
-    # src/vhdl/arts_unb2b_sc3_input.vhd
-    # src/vhdl/arts_unb2b_sc3_processing.vhd
-    # src/vhdl/arts_unb2b_sc3_output.vhd
+    src/vhdl/arts_unb2b_sc3_input.vhd
+    src/vhdl/arts_unb2b_sc3_processing.vhd
+    # Workaround; we can't use unb1 libs in unb2b Questasim (yet).
+    $RADIOHDL/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4_output_tab_i_reorder.vhd
+    $RADIOHDL/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4_output_tab_i_packetizer.vhd
+    $RADIOHDL/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4_output_tab_iquv_buffer.vhd
+    $RADIOHDL/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4_output_tab_iquv_packetizer.vhd
+    $RADIOHDL/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4_output_tab.vhd
+    src/vhdl/arts_unb2b_sc3_output.vhd
     src/vhdl/arts_unb2b_sc3.vhd
 
 test_bench_files = 
-    tb/vhdl/tb_arts_unb2b_sc3.vhd
+#    tb/vhdl/tb_arts_unb2b_sc3.vhd
 
 [modelsim_project_file]
 
diff --git a/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3.vhd b/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3.vhd
index ec9178ba5f..61ed63c6e6 100644
--- a/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3.vhd
+++ b/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3.vhd
@@ -110,32 +110,31 @@ ENTITY arts_unb2b_sc3 IS
     MB_I_REF_CLK  : IN   STD_LOGIC := '0';  -- Reference clock for MB_I
     MB_II_REF_CLK : IN   STD_LOGIC := '0';  -- Reference clock for MB_II
 
-
     -- pmbus
     PMBUS_SC     : INOUT STD_LOGIC;
     PMBUS_SD     : INOUT STD_LOGIC;
     PMBUS_ALERT  : IN    STD_LOGIC := '0';
 
     -- front transceivers
-    --QSFP_0_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0); -- Input
-    --QSFP_0_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-    --QSFP_1_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-    --QSFP_1_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-    --QSFP_2_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-    --QSFP_2_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-    --QSFP_3_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-    --QSFP_3_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-    --QSFP_4_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-    --QSFP_4_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-    --QSFP_5_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-    --QSFP_5_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-
-    --QSFP_SDA     : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.i2c_w-1 downto 0);
-    --QSFP_SCL     : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.i2c_w-1 downto 0);
-    --QSFP_RST     : INOUT STD_LOGIC;
+    QSFP_0_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0); -- Inputs 0..3
+    QSFP_0_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0); -- Outputs 0..3
+    QSFP_1_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0); -- Inputs 4..7
+    QSFP_1_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0); -- Outputs 4..7
+    QSFP_2_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0); -- Inputs 8..11
+    QSFP_2_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
+    QSFP_3_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0); -- Inputs 12..15
+    QSFP_3_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
+    QSFP_4_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0); -- Inputs 16..19
+    QSFP_4_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
+    QSFP_5_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0); -- Inputs 20..23
+    QSFP_5_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
+
+    QSFP_SDA     : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.i2c_w-1 downto 0);
+    QSFP_SCL     : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.i2c_w-1 downto 0);
+    QSFP_RST     : INOUT STD_LOGIC;
 
     -- Leds
-    QSFP_LED     : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp_nof_leds-1 DOWNTO 0)
+    QSFP_LED     : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp_nof_leds-1 DOWNTO 0) --2 LEDs per QSFP so not usable in quad 10G mode
   );
 END arts_unb2b_sc3;
 
@@ -145,22 +144,42 @@ ARCHITECTURE str OF arts_unb2b_sc3 IS
   -------------------------------------------------------------------------------
   -- ARTS SC3 constants
   -------------------------------------------------------------------------------
-  CONSTANT c_nof_dishes       : NATURAL := 8;   -- Equidistant dishes RT2..RT9
-  CONSTANT c_nof_tabs         : NATURAL := 9;   -- 9 instead of 12 (SC4) to match Arria10 resources
-  CONSTANT c_nof_cbsets       : NATURAL := 8;   -- Matches the number of processing FPGAs/UniBoard in SC4
-  CONSTANT c_data_w           : NATURAL := 9;   -- 9b complex input data
-  CONSTANT c_weights_w        : NATURAL := 8;   -- 8b complex weigths
-  CONSTANT c_nof_beamlets     : NATURAL := 120; -- 960 Beamlets in 6b mode, 88 Beamlets in 8b mode
-  CONSTANT c_nof_cb           : NATURAL := 40;  -- 40 Compound Beams = number of GPU cluster nodes
-  CONSTANT c_nof_channels_in  : NATURAL := 64;  -- 64 channels per timesamples coming from XC
-  CONSTANT c_nof_channels_out : NATURAL := 4;   --  4 channels per timesample at the IQUV output
-  CONSTANT c_iquv_nof_int     : NATURAL := c_nof_channels_in/c_nof_channels_out; --16
-  CONSTANT c_iquv_data_w_out  : NATURAL := 8;   -- 8b Stokes parameters
+  CONSTANT c_nof_cbsets          : NATURAL := 1;   -- Matches the number of processing FPGAs/UniBoard in SC4
+  CONSTANT c_nof_dishes          : NATURAL := 8;   -- Equidistant dishes RT2..RT9
+  CONSTANT c_nof_tabs            : NATURAL := 9;   -- 9 instead of 12 (SC4) to match Arria10 resources
+  CONSTANT c_data_w              : NATURAL := 9;   -- 9b complex input data
+  CONSTANT c_weights_w           : NATURAL := 9;   -- 9b complex weigths
+  CONSTANT c_nof_beamlets        : NATURAL := 120; -- 960 Beamlets in 6b mode, 88 Beamlets in 8b mode
+  CONSTANT c_nof_cb_per_set      : NATURAL := 5;   -- 40 Compound Beams in total = number of GPU cluster nodes
+  CONSTANT c_nof_subbands_per_cb : NATURAL := 24;  -- 120 beamlets / 5 CB
+  CONSTANT c_nof_channels_in     : NATURAL := 64;  -- 64 channels per timesamples coming from XC
+  CONSTANT c_nof_channels_out    : NATURAL := 4;   --  4 channels per timesample at the IQUV output
+  CONSTANT c_iquv_nof_int        : NATURAL := c_nof_channels_in/c_nof_channels_out; --16
+  CONSTANT c_iquv_data_w_out     : NATURAL := 8;   -- 8b Stokes parameters
+  CONSTANT c_nof_timesamples     : NATURAL := 12500;
 
   -------------------------------------------------------------------------------
   -- arts_unb2b_sc3_input
   -------------------------------------------------------------------------------
-  SIGNAL arts_unb2b_sc3_input_src_out_2arr : t_dp_sosi_2arr_8(c_nof_cbsets-1 DOWNTO 0); -- 8 CB sets * 8 dishes
+  SIGNAL arts_unb2b_sc3_input_src_out_2arr_8 : t_dp_sosi_2arr_8(c_nof_cbsets-1 DOWNTO 0); -- 8 CB sets * 8 dishes
+  SIGNAL general_bsn_arr                     : t_slv_64_arr(c_nof_cbsets-1 DOWNTO 0);
+
+  SIGNAL reg_dp_bsn_align_mosi               : t_mem_mosi;   
+  SIGNAL reg_dp_bsn_align_miso               : t_mem_miso;   
+
+  -------------------------------------------------------------------------------
+  -- arts_unb2b_sc3_processing
+  -------------------------------------------------------------------------------
+  SIGNAL arts_unb2b_sc3_processing_src_out_2arr_9 : t_dp_sosi_2arr_9(c_nof_cbsets-1 DOWNTO 0); -- 8 CB sets * 9 TABs
+
+  SIGNAL ram_arts_tab_beamformer_mosi             : t_mem_mosi; --FIXME connect in QSYS
+  SIGNAL ram_arts_tab_beamformer_miso             : t_mem_miso := c_mem_miso_rst;   
+
+  -------------------------------------------------------------------------------
+  -- arts_unb2b_sc3_output:
+  -------------------------------------------------------------------------------
+  SIGNAL arts_unb2b_sc3_output_src_out_arr : t_dp_sosi_arr(c_nof_cbsets-1 DOWNTO 0); --8 CB sets, 1 CB set per output 10GbE fiber
+  SIGNAL arts_unb2b_sc3_output_src_in_arr  : t_dp_siso_arr(c_nof_cbsets-1 DOWNTO 0);
 
   -------------------------------------------------------------------------------
   -- ctrl_unb2_board
@@ -247,186 +266,239 @@ BEGIN
   --   . [  8 CB sets * 3 10G ] * [ packed data  ]
   --     (<--- 24 streams --->) * (<-- 9 Gbps -->)
   --     (<--- 24 streams * 9 Gbps = 216 Gbps -->)
-  -- . Output : arts_unb2b_sc3_input_src_out_2arr ($10.2 - Equation 101):
+  -- . Output : arts_unb2b_sc3_input_src_out_2arr_8 ($10.2 - Equation 101):
   --   . [8 CB sets * 8 dishes] * [[5 CB][24 sb][12500 samples][64 channels][2 pols][18 bits] / 1.024s]
   --     (<--- 64 streams --->) * (<---------------- 187.5 Msps * 18b = 3.375 Gbps ------------------->)
   --     (<-------------------------- 64 streams * 3.375 Gbps = 216 Gbps ----------------------------->)
+  -- . TODO: Keep an eye on the resource usage of these 24 (!) 10GbE MACs!
   -------------------------------------------------------------------------------
-  --u_arts_unb2b_sc3_input : ENTITY work.arts_unb2b_sc3_input
-  --GENERIC MAP (
-  --  g_sim        => g_sim,
-  --  g_nof_cbsets => c_nof_cbsets
-  --)
-  --PORT MAP (
-  --  SA_CLK    => SA_CLK, 
-                            
-  --  QSFP_0_RX => QSFP_0_RX,
-  --  QSFP_0_TX => QSFP_0_TX,
-  --  QSFP_1_RX => QSFP_1_RX,
-  --  QSFP_1_TX => QSFP_1_TX,
-  --  QSFP_2_RX => QSFP_2_RX,
-  --  QSFP_2_TX => QSFP_2_TX,
-  --  QSFP_3_RX => QSFP_3_RX,
-  --  QSFP_3_TX => QSFP_3_TX,
-  --  QSFP_4_RX => QSFP_4_RX,
-  --  QSFP_4_TX => QSFP_4_TX,
-  --  QSFP_5_RX => QSFP_5_RX,
-  --  QSFP_5_TX => QSFP_5_TX,
-
-  --  QSFP_SDA  => QSFP_SDA, 
-  --  QSFP_SCL  => QSFP_SCL,
-  --  QSFP_RST  => QSFP_RST,
-  --  QSFP_LED  => QSFP_LED,
-
-  --  src_out_2arr => arts_unb2b_sc3_input_src_out_2arr
-  --);
-
-  ---------------------------------------------------------------------------------
-  ---- arts_unb2b_sc3_processing:
-  ---- . Purpose:
-  ----   . Create 9 TABs + integrated Stokes params for 40 Compound Beams 
-  ---- . Input : arts_unb2b_sc3_input_src_out_2arr ($10.2 - Equation 101):
-  ---- . Output: arts_unb2b_sc3_processing_src_out_2arr ($10.7 - Equation 112):
-  ----   . [8 CB sets * 9 TABs] * [[5 CB][24 sb][12500 samples][4 channels][4*8 bits] / 1.024s]
-  ----     (<-- 72 streams -->) * (<---------- 11.718750 Msps * 4*8b = 187.5 Mbps ----------->)
-  ----     (<--------------------- 72 streams * 187.5 Mbps = 13.5 Gbps ---------------------->)
-  ---------------------------------------------------------------------------------
-  --u_arts_unb2b_sc3_processing : ENTITY work.arts_unb2b_sc3_processing
-  --GENERIC MAP (
-  --  g_sim             => g_sim,
-  --  g_nof_dishes      => c_nof_dishes,
-  --  g_nof_cbsets      => c_nof_cbsets,
-  --  g_data_w          => c_data_w,
-  --  g_weights_w       => c_weights_w,
-  --  g_nof_beamlets    => c_nof_beamlets,
-  --  g_nof_tabs        => c_nof_tabs,
-  --  g_iquv_nof_int    => c_nof_int_iquv,
-  --  g_iquv_data_w_out => c_iquv_data_w_out
-  --)
-  --PORT MAP (
-  --  snk_in_2arr  => arts_unb2b_sc3_input_src_out_2arr,
-  --  src_out_2arr => arts_unb2b_sc3_processing_src_out_2arr
-  --);
-
-  ---------------------------------------------------------------------------------
-  ---- arts_unb2b_sc3_output:
-  ---- . Purpose:
-  ----   .  
-  ---- . Input : arts_unb2b_sc3_processing_src_out_2arr
-  ---- . Output:
-  ----   . TODO
-  ---------------------------------------------------------------------------------
-  --u_arts_unb2b_sc3_output : ENTITY work.arts_unb2b_sc3_output
-  --GENERIC MAP (
-  --  g_sim             => g_sim,
-  --  g_nof_cbsets      => c_nof_cbsets,
-  --  g_nof_cb          => c_nof_cb,
-  --  g_nof_tabs        => c_nof_tabs,
-  --  g_iquv_data_w_out => c_iquv_data_w_out
-  --)
-  --PORT MAP (
-  --  snk_in_2arr => arts_unb2b_sc3_processing_src_out_2arr,
-  --  src_out_arr => arts_unb2b_sc3_output_src_out_arr
-  --);
-
-  -----------------------------------------------------------------------------
-  -- MM master
-  -----------------------------------------------------------------------------
-  u_arts_unb2b_sc3_mm_master : ENTITY work.arts_unb2b_sc3_mm_master
+  u_arts_unb2b_sc3_input : ENTITY work.arts_unb2b_sc3_input
   GENERIC MAP (
-    g_sim               => g_sim,
-    g_sim_unb_nr        => g_sim_unb_nr,
-    g_sim_node_nr       => g_sim_node_nr,
-    g_technology        => g_technology,
-    g_nof_streams_qsfp  => c_nof_streams_qsfp,
-    g_nof_streams_ring  => c_nof_streams_qsfp
-   )
-  PORT MAP(  
-    mm_rst                   => mm_rst,
-    mm_clk                   => mm_clk,       
-
-    -- PIOs
-    pout_wdi                 => pout_wdi,
-
-    -- Manual WDI override
-    reg_wdi_mosi             => reg_wdi_mosi,
-    reg_wdi_miso             => reg_wdi_miso,
-
-    -- system_info
-    reg_unb_system_info_mosi => reg_unb_system_info_mosi,
-    reg_unb_system_info_miso => reg_unb_system_info_miso,
-    rom_unb_system_info_mosi => rom_unb_system_info_mosi,
-    rom_unb_system_info_miso => rom_unb_system_info_miso, 
-
-    -- UniBoard I2C sensors
-    reg_unb_sens_mosi        => reg_unb_sens_mosi,
-    reg_unb_sens_miso        => reg_unb_sens_miso, 
- 
-    reg_unb_pmbus_mosi       => reg_unb_pmbus_mosi,
-    reg_unb_pmbus_miso       => reg_unb_pmbus_miso,    
-
-    -- FPGA sensors
-    reg_fpga_temp_sens_mosi  => reg_fpga_temp_sens_mosi,
-    reg_fpga_temp_sens_miso  => reg_fpga_temp_sens_miso,
-    reg_fpga_voltage_sens_mosi  => reg_fpga_voltage_sens_mosi,
-    reg_fpga_voltage_sens_miso  => reg_fpga_voltage_sens_miso,
-
-    -- PPSH
-    reg_ppsh_mosi            => reg_ppsh_mosi,
-    reg_ppsh_miso            => reg_ppsh_miso, 
-  
-    -- eth1g ch0
-    eth1g_eth0_mm_rst        => eth1g_eth0_mm_rst,
-    eth1g_eth0_tse_mosi      => eth1g_eth0_tse_mosi,
-    eth1g_eth0_tse_miso      => eth1g_eth0_tse_miso,
-    eth1g_eth0_reg_mosi      => eth1g_eth0_reg_mosi,
-    eth1g_eth0_reg_miso      => eth1g_eth0_reg_miso,
-    eth1g_eth0_reg_interrupt => eth1g_eth0_reg_interrupt,
-    eth1g_eth0_ram_mosi      => eth1g_eth0_ram_mosi,
-    eth1g_eth0_ram_miso      => eth1g_eth0_ram_miso,
-
-    -- eth1g ch1
-    eth1g_eth1_mm_rst        => eth1g_eth1_mm_rst,
-    eth1g_eth1_tse_mosi      => eth1g_eth1_tse_mosi,
-    eth1g_eth1_tse_miso      => eth1g_eth1_tse_miso,
-    eth1g_eth1_reg_mosi      => eth1g_eth1_reg_mosi,
-    eth1g_eth1_reg_miso      => eth1g_eth1_reg_miso,
-    eth1g_eth1_reg_interrupt => eth1g_eth1_reg_interrupt,
-    eth1g_eth1_ram_mosi      => eth1g_eth1_ram_mosi,
-    eth1g_eth1_ram_miso      => eth1g_eth1_ram_miso,
-
-    -- EPCS read
-    reg_dpmm_data_mosi       => reg_dpmm_data_mosi,
-    reg_dpmm_data_miso       => reg_dpmm_data_miso,
-    reg_dpmm_ctrl_mosi       => reg_dpmm_ctrl_mosi,
-    reg_dpmm_ctrl_miso       => reg_dpmm_ctrl_miso,
+    g_sim        => g_sim,
+    g_nof_cbsets => c_nof_cbsets
+  )
+  PORT MAP (
+    SA_CLK                => SA_CLK, 
+
+    dp_clk                => dp_clk,
+    dp_rst                => dp_rst,
+
+    mm_rst                => mm_rst,
+    mm_clk                => mm_clk,    
+                                      
+    QSFP_0_RX             => QSFP_0_RX,
+    QSFP_0_TX             => QSFP_0_TX,
+    QSFP_1_RX             => QSFP_1_RX,
+    QSFP_1_TX             => QSFP_1_TX,
+    QSFP_2_RX             => QSFP_2_RX,
+    QSFP_2_TX             => QSFP_2_TX,
+    QSFP_3_RX             => QSFP_3_RX,
+    QSFP_3_TX             => QSFP_3_TX,
+    QSFP_4_RX             => QSFP_4_RX,
+    QSFP_4_TX             => QSFP_4_TX,
+    QSFP_5_RX             => QSFP_5_RX,
+    QSFP_5_TX             => QSFP_5_TX,
+
+    QSFP_SDA              => QSFP_SDA, 
+    QSFP_SCL              => QSFP_SCL,
+    QSFP_RST              => QSFP_RST,
+    QSFP_LED              => QSFP_LED,
+
+    reg_dp_bsn_align_mosi => reg_dp_bsn_align_mosi,
+    reg_dp_bsn_align_miso => reg_dp_bsn_align_miso,
+
+    src_out_2arr_8        => arts_unb2b_sc3_input_src_out_2arr_8,
+    general_bsn_arr       => general_bsn_arr,
+
+    snk_in_arr            => arts_unb2b_sc3_output_src_out_arr, -- Not input related; feeds the 10G transmitters
+    snk_out_arr           => arts_unb2b_sc3_output_src_in_arr
+  );
 
-    -- EPCS write
-    reg_mmdp_data_mosi       => reg_mmdp_data_mosi,
-    reg_mmdp_data_miso       => reg_mmdp_data_miso,
-    reg_mmdp_ctrl_mosi       => reg_mmdp_ctrl_mosi,
-    reg_mmdp_ctrl_miso       => reg_mmdp_ctrl_miso,
+  -------------------------------------------------------------------------------
+  -- arts_unb2b_sc3_processing:
+  -- . Purpose:
+  --   . Create 9 TABs + integrated Stokes params for 40 Compound Beams 
+  -- . Input : arts_unb2b_sc3_input_src_out_2arr_8 ($10.2 - Equation 101):
+  -- . Output: arts_unb2b_sc3_processing_src_out_2arr_9 ($10.7 - Equation 112):
+  --   . [8 CB sets * 9 TABs] * [[5 CB][24 sb][12500 samples][4 channels][4*8 bits] / 1.024s]
+  --     (<-- 72 streams -->) * (<---------- 11.718750 Msps * 4*8b = 187.5 Mbps ----------->)
+  --     (<--------------------- 72 streams * 187.5 Mbps = 13.5 Gbps ---------------------->)
+  -------------------------------------------------------------------------------
+  u_arts_unb2b_sc3_processing : ENTITY work.arts_unb2b_sc3_processing
+  GENERIC MAP (
+    g_sim             => g_sim,
+    g_nof_dishes      => c_nof_dishes,
+    g_nof_cbsets      => c_nof_cbsets,
+    g_data_w          => 12, --c_data_w, FIXME SC4 uses 12b data, we use 9b. Causes error in tab_beamformer w.r.t quantization.
+    g_weights_w       => c_weights_w,
+    g_nof_beamlets    => c_nof_beamlets,
+    g_nof_tabs        => c_nof_tabs,
+    g_iquv_nof_int    => c_iquv_nof_int,
+    g_iquv_data_w_out => c_iquv_data_w_out
+  )
+  PORT MAP (
+    dp_clk                       => dp_clk,
+    dp_rst                       => dp_rst,
 
-    -- EPCS status/control
-    reg_epcs_mosi            => reg_epcs_mosi,
-    reg_epcs_miso            => reg_epcs_miso,
+    mm_clk                       => mm_clk,    
+    mm_rst                       => mm_rst,
 
-    -- Remote Update
-    reg_remu_mosi            => reg_remu_mosi,
-    reg_remu_miso            => reg_remu_miso,
+    snk_in_2arr_8                => arts_unb2b_sc3_input_src_out_2arr_8,
+    src_out_2arr_9               => arts_unb2b_sc3_processing_src_out_2arr_9,
 
-    -- 10GbE
-    reg_ip_arria10_e1sg_phy_10gbase_r_24_mosi => reg_ip_arria10_e1sg_phy_10gbase_r_24_mosi,
-    reg_ip_arria10_e1sg_phy_10gbase_r_24_miso => reg_ip_arria10_e1sg_phy_10gbase_r_24_miso,      
-    
-    reg_tr_10GbE_qsfp_ring_mosi    => reg_tr_10GbE_qsfp_ring_mosi,
-    reg_tr_10GbE_qsfp_ring_miso    => reg_tr_10GbE_qsfp_ring_miso,
+    ram_arts_tab_beamformer_mosi => ram_arts_tab_beamformer_mosi, 
+    ram_arts_tab_beamformer_miso => ram_arts_tab_beamformer_miso 
+  );
 
-    -- eth10g status
-    reg_eth10g_qsfp_ring_mosi      => reg_eth10g_qsfp_ring_mosi,
-    reg_eth10g_qsfp_ring_miso      => reg_eth10g_qsfp_ring_miso
+  -------------------------------------------------------------------------------
+  -- arts_unb2b_sc3_output:
+  -- . Purpose:
+  --   .  
+  -- . Input : arts_unb2b_sc3_processing_src_out_2arr_9
+  -- . Output:
+  --   . TODO
+  -------------------------------------------------------------------------------
+  u_arts_unb2b_sc3_output : ENTITY work.arts_unb2b_sc3_output
+  GENERIC MAP (
+    g_sim                 => g_sim,
+    g_nof_cbsets          => c_nof_cbsets,
+    g_nof_cb_per_set      => c_nof_cb_per_set,
+    g_nof_subbands_per_cb => c_nof_subbands_per_cb,
+    g_nof_channels        => c_nof_channels_out,
+    g_nof_timesamples     => c_nof_timesamples,
+    g_nof_tabs            => c_nof_tabs,
+    g_iquv_data_w_out     => c_iquv_data_w_out
+  )
+  PORT MAP (
+    dp_clk                                  => dp_clk,
+    dp_rst                                  => dp_rst,
+
+    mm_clk                                  => mm_clk,    
+    mm_rst                                  => mm_rst,
+
+    snk_in_2arr_9                           => arts_unb2b_sc3_processing_src_out_2arr_9,
+    general_bsn_arr                         => general_bsn_arr,
+
+    src_out_arr                             => arts_unb2b_sc3_output_src_out_arr,
+    src_in_arr                              => arts_unb2b_sc3_output_src_in_arr,
+
+    reg_dp_offload_tx_tab_iquv_hdr_dat_mosi => c_mem_mosi_rst,
+    reg_dp_offload_tx_tab_iquv_hdr_dat_miso => OPEN,          
+    reg_dp_xonoff_tab_iquv_mosi             => c_mem_mosi_rst,
+    reg_dp_xonoff_tab_iquv_miso             => OPEN,          
+    reg_dp_offload_tx_tab_i_hdr_dat_mosi    => c_mem_mosi_rst,
+    reg_dp_offload_tx_tab_i_hdr_dat_miso    => OPEN,          
+    reg_tab_dest_ip_mosi                    => c_mem_mosi_rst,
+    reg_tab_dest_ip_miso                    => OPEN,          
+    reg_tab_dest_mac_mosi                   => c_mem_mosi_rst,
+    reg_tab_dest_mac_miso                   => OPEN,          
+    reg_dp_xonoff_tab_i_mosi                => c_mem_mosi_rst,
+    reg_dp_xonoff_tab_i_miso                => OPEN,
+
+    ID                                      => ID
   );
 
+  -----------------------------------------------------------------------------
+  -- MM master
+  -----------------------------------------------------------------------------
+--  u_arts_unb2b_sc3_mm_master : ENTITY work.arts_unb2b_sc3_mm_master
+--  GENERIC MAP (
+--    g_sim               => g_sim,
+--    g_sim_unb_nr        => g_sim_unb_nr,
+--    g_sim_node_nr       => g_sim_node_nr,
+--    g_technology        => g_technology,
+--    g_nof_streams_qsfp  => c_nof_streams_qsfp,
+--    g_nof_streams_ring  => c_nof_streams_qsfp
+--   )
+--  PORT MAP(  
+--    mm_rst                   => mm_rst,
+--    mm_clk                   => mm_clk,       
+--
+--    -- PIOs
+--    pout_wdi                 => pout_wdi,
+--
+--    -- Manual WDI override
+--    reg_wdi_mosi             => reg_wdi_mosi,
+--    reg_wdi_miso             => reg_wdi_miso,
+--
+--    -- system_info
+--    reg_unb_system_info_mosi => reg_unb_system_info_mosi,
+--    reg_unb_system_info_miso => reg_unb_system_info_miso,
+--    rom_unb_system_info_mosi => rom_unb_system_info_mosi,
+--    rom_unb_system_info_miso => rom_unb_system_info_miso, 
+--
+--    -- UniBoard I2C sensors
+--    reg_unb_sens_mosi        => reg_unb_sens_mosi,
+--    reg_unb_sens_miso        => reg_unb_sens_miso, 
+-- 
+--    reg_unb_pmbus_mosi       => reg_unb_pmbus_mosi,
+--    reg_unb_pmbus_miso       => reg_unb_pmbus_miso,    
+--
+--    -- FPGA sensors
+--    reg_fpga_temp_sens_mosi  => reg_fpga_temp_sens_mosi,
+--    reg_fpga_temp_sens_miso  => reg_fpga_temp_sens_miso,
+--    reg_fpga_voltage_sens_mosi  => reg_fpga_voltage_sens_mosi,
+--    reg_fpga_voltage_sens_miso  => reg_fpga_voltage_sens_miso,
+--
+--    -- PPSH
+--    reg_ppsh_mosi            => reg_ppsh_mosi,
+--    reg_ppsh_miso            => reg_ppsh_miso, 
+--  
+--    -- eth1g ch0
+--    eth1g_eth0_mm_rst        => eth1g_eth0_mm_rst,
+--    eth1g_eth0_tse_mosi      => eth1g_eth0_tse_mosi,
+--    eth1g_eth0_tse_miso      => eth1g_eth0_tse_miso,
+--    eth1g_eth0_reg_mosi      => eth1g_eth0_reg_mosi,
+--    eth1g_eth0_reg_miso      => eth1g_eth0_reg_miso,
+--    eth1g_eth0_reg_interrupt => eth1g_eth0_reg_interrupt,
+--    eth1g_eth0_ram_mosi      => eth1g_eth0_ram_mosi,
+--    eth1g_eth0_ram_miso      => eth1g_eth0_ram_miso,
+--
+--    -- eth1g ch1
+--    eth1g_eth1_mm_rst        => eth1g_eth1_mm_rst,
+--    eth1g_eth1_tse_mosi      => eth1g_eth1_tse_mosi,
+--    eth1g_eth1_tse_miso      => eth1g_eth1_tse_miso,
+--    eth1g_eth1_reg_mosi      => eth1g_eth1_reg_mosi,
+--    eth1g_eth1_reg_miso      => eth1g_eth1_reg_miso,
+--    eth1g_eth1_reg_interrupt => eth1g_eth1_reg_interrupt,
+--    eth1g_eth1_ram_mosi      => eth1g_eth1_ram_mosi,
+--    eth1g_eth1_ram_miso      => eth1g_eth1_ram_miso,
+--
+--    -- EPCS read
+--    reg_dpmm_data_mosi       => reg_dpmm_data_mosi,
+--    reg_dpmm_data_miso       => reg_dpmm_data_miso,
+--    reg_dpmm_ctrl_mosi       => reg_dpmm_ctrl_mosi,
+--    reg_dpmm_ctrl_miso       => reg_dpmm_ctrl_miso,
+--
+--    -- EPCS write
+--    reg_mmdp_data_mosi       => reg_mmdp_data_mosi,
+--    reg_mmdp_data_miso       => reg_mmdp_data_miso,
+--    reg_mmdp_ctrl_mosi       => reg_mmdp_ctrl_mosi,
+--    reg_mmdp_ctrl_miso       => reg_mmdp_ctrl_miso,
+--
+--    -- EPCS status/control
+--    reg_epcs_mosi            => reg_epcs_mosi,
+--    reg_epcs_miso            => reg_epcs_miso,
+--
+--    -- Remote Update
+--    reg_remu_mosi            => reg_remu_mosi,
+--    reg_remu_miso            => reg_remu_miso,
+--
+--    -- 10GbE
+--    reg_ip_arria10_e1sg_phy_10gbase_r_24_mosi => reg_ip_arria10_e1sg_phy_10gbase_r_24_mosi,
+--    reg_ip_arria10_e1sg_phy_10gbase_r_24_miso => reg_ip_arria10_e1sg_phy_10gbase_r_24_miso,      
+--    
+--    reg_tr_10GbE_qsfp_ring_mosi    => reg_tr_10GbE_qsfp_ring_mosi,
+--    reg_tr_10GbE_qsfp_ring_miso    => reg_tr_10GbE_qsfp_ring_miso,
+--
+--    -- eth10g status
+--    reg_eth10g_qsfp_ring_mosi      => reg_eth10g_qsfp_ring_mosi,
+--    reg_eth10g_qsfp_ring_miso      => reg_eth10g_qsfp_ring_miso,
+--    --TODO add to QSYS
+--    reg_dp_bsn_align_mosi    => reg_dp_bsn_align_mosi,
+--    reg_dp_bsn_align_miso    => reg_dp_bsn_align_miso
+--  );
+
   -----------------------------------------------------------------------------
   -- General control function
   -----------------------------------------------------------------------------
diff --git a/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_input.vhd b/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_input.vhd
index cd470192db..1a78c303b3 100644
--- a/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_input.vhd
+++ b/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_input.vhd
@@ -57,71 +57,197 @@
 --    .  [t][5 CB][24 sb][12500 samples][64 channels][2 pols][18 bits]
 --       . t = correlator integration interval 1.024s
 -- . Each of these 8 sets carry 120 beamlets, for a total of 960 beamlets.
+-- . The snk_in_arr inputs are used to access the 10G transmitters. This is not 
+--   part of this input stage (but fed by the output stage).
 
-LIBRARY IEEE, common_lib, unb2b_board_lib, unb2b_board_10gbe_lib, dp_lib, tr_10GbE_lib, technology_lib;
+LIBRARY IEEE, common_lib, unb2b_board_lib, unb2b_board_10gbe_lib, dp_lib, tr_10GbE_lib, technology_lib, apertif_lib;
 USE IEEE.STD_LOGIC_1164.ALL;
 USE IEEE.NUMERIC_STD.ALL;
 USE common_lib.common_pkg.ALL;
 USE common_lib.common_mem_pkg.ALL;
 USE technology_lib.technology_pkg.ALL;
 USE dp_lib.dp_stream_pkg.ALL;
+USE unb2b_board_lib.unb2_board_pkg.ALL;
+USE apertif_lib.apertif_udp_offload_pkg.ALL; --TODO Replace this with arts_unb2b_xc_emu_lib.udp_offload_pkg when available
+USE common_lib.common_field_pkg.ALL;
 
 ENTITY arts_unb2b_sc3_input IS
   GENERIC (
     g_technology : NATURAL := c_tech_arria10_e1sg;
     g_sim        : BOOLEAN := FALSE;
-    g_nof_cbsets : NATURAL
+    g_nof_cbsets : NATURAL -- 1..8 where each CBset comes in on 3 fibers
    );
   PORT (
-    -- Front transceivers
-    SA_CLK       : IN    STD_LOGIC := '0'; -- Clock 10GbE front (qsfp) and ring lines
-
-    QSFP_0_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0) := (OTHERS=>'0');
-    QSFP_0_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-    QSFP_1_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0) := (OTHERS=>'0');
-    QSFP_1_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-    QSFP_2_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0) := (OTHERS=>'0');
-    QSFP_2_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-    QSFP_3_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0) := (OTHERS=>'0');
-    QSFP_3_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-    QSFP_4_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0) := (OTHERS=>'0');
-    QSFP_4_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-    QSFP_5_RX    : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0) := (OTHERS=>'0');
-    QSFP_5_TX    : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
-
-    QSFP_SDA     : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.i2c_w-1 downto 0);
-    QSFP_SCL     : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.i2c_w-1 downto 0);
-    QSFP_RST     : INOUT STD_LOGIC;
-    QSFP_LED     : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp_nof_leds-1 DOWNTO 0);
-
-    src_out_2arr : OUT t_dp_sosi_2arr_8(g_nof_cbsets-1 DOWNTO 0) -- 8 CB sets * 8 dishes
-  );
+    SA_CLK                : IN    STD_LOGIC := '0'; -- Clock 10GbE front (qsfp) and ring lines
+
+    dp_clk                : IN    STD_LOGIC;
+    dp_rst                : IN    STD_LOGIC;
+
+    mm_clk                : IN    STD_LOGIC;
+    mm_rst                : IN    STD_LOGIC;
+
+    QSFP_0_RX             : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0) := (OTHERS=>'0');
+    QSFP_0_TX             : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
+    QSFP_1_RX             : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0) := (OTHERS=>'0');
+    QSFP_1_TX             : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
+    QSFP_2_RX             : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0) := (OTHERS=>'0');
+    QSFP_2_TX             : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
+    QSFP_3_RX             : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0) := (OTHERS=>'0');
+    QSFP_3_TX             : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
+    QSFP_4_RX             : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0) := (OTHERS=>'0');
+    QSFP_4_TX             : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
+    QSFP_5_RX             : IN    STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0) := (OTHERS=>'0');
+    QSFP_5_TX             : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.bus_w-1 downto 0);
+
+    QSFP_SDA              : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.i2c_w-1 downto 0);
+    QSFP_SCL              : INOUT STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.i2c_w-1 downto 0);
+    QSFP_RST              : INOUT STD_LOGIC;
+    QSFP_LED              : OUT   STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp_nof_leds-1 DOWNTO 0);
+
+    reg_dp_bsn_align_mosi : IN  t_mem_mosi;
+    reg_dp_bsn_align_miso : OUT t_mem_miso := c_mem_miso_rst;
+
+    src_out_2arr_8        : OUT t_dp_sosi_2arr_8(g_nof_cbsets-1 DOWNTO 0); -- 8 CB sets * 8 dishes
+    general_bsn_arr       : OUT t_slv_64_arr(g_nof_cbsets-1 DOWNTO 0);
+ 
+    snk_in_arr            : IN  t_dp_sosi_arr(g_nof_cbsets-1 DOWNTO 0); -- Not input related; feeds the 10G transmitters
+    snk_out_arr           : OUT t_dp_siso_arr(g_nof_cbsets-1 DOWNTO 0)
+   );
 END arts_unb2b_sc3_input;
 
 
 ARCHITECTURE str OF arts_unb2b_sc3_input IS
 
+  -------------------------------------------------------------------------------
+  -- Front transceiver I/O and corresponding LEDs
+  -------------------------------------------------------------------------------
+  CONSTANT c_nof_fibers_per_cb_set              : NATURAL := 3; --3 optical inputs per CB set
+  CONSTANT c_nof_10GbE_streams                  : NATURAL := g_nof_cbsets*c_nof_fibers_per_cb_set;
+  CONSTANT c_nof_qsfp_bus                       : NATURAL := ceil_div(c_nof_10GbE_streams, c_unb2_board_tr_qsfp.bus_w);
+
+  SIGNAL unb2_board_front_io_qsfp_tx            : t_unb2_board_qsfp_bus_2arr(c_nof_qsfp_bus-1 DOWNTO 0); 
+  SIGNAL unb2_board_front_io_qsfp_rx            : t_unb2_board_qsfp_bus_2arr(c_nof_qsfp_bus-1 DOWNTO 0);
+ 
+  SIGNAL unb2_board_front_io_serial_tx_arr      : STD_LOGIC_VECTOR(c_nof_qsfp_bus*c_unb2_board_tr_qsfp.bus_w-1 DOWNTO 0) := (OTHERS=>'0');
+  SIGNAL unb2_board_front_io_serial_rx_arr      : STD_LOGIC_VECTOR(c_nof_qsfp_bus*c_unb2_board_tr_qsfp.bus_w-1 DOWNTO 0);
+
+  SIGNAL unb2_board_qsfp_leds_tx_snk_in_arr     : t_dp_sosi_arr(c_nof_qsfp_bus*c_unb2_board_tr_qsfp.bus_w-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst);
+  SIGNAL unb2_board_qsfp_leds_tx_src_in_arr     : t_dp_siso_arr(c_nof_qsfp_bus*c_unb2_board_tr_qsfp.bus_w-1 DOWNTO 0) := (OTHERS => c_dp_siso_rst);
+  SIGNAL unb2_board_qsfp_leds_rx_snk_in_arr     : t_dp_sosi_arr(c_nof_qsfp_bus*c_unb2_board_tr_qsfp.bus_w-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst);
+ 
+  SIGNAL unb2_board_front_io_qsfp_green_led_arr : STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.nof_bus-1 DOWNTO 0);
+  SIGNAL unb2_board_front_io_qsfp_red_led_arr   : STD_LOGIC_VECTOR(c_unb2_board_tr_qsfp.nof_bus-1 DOWNTO 0);
+
+  -------------------------------------------------------------------------------
+  -- 10GbE MAC
+  -------------------------------------------------------------------------------
+  SIGNAL unb2_board_10gbe_snk_in_arr  : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst);
+  SIGNAL unb2_board_10gbe_snk_out_arr : t_dp_siso_arr(c_nof_10GbE_streams-1 DOWNTO 0) := (OTHERS => c_dp_siso_rst);
+
+  SIGNAL unb2_board_10gbe_src_out_arr : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst);
+  SIGNAL unb2_board_10gbe_src_in_arr  : t_dp_siso_arr(c_nof_10GbE_streams-1 DOWNTO 0) := (OTHERS => c_dp_siso_rst); 
+ 
+  -------------------------------------------------------------------------------
+  -- dp_offload_rx
+  -------------------------------------------------------------------------------
+  SIGNAL dp_offload_rx_src_out_arr          : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0); 
+  SIGNAL dp_offload_rx_src_in_arr           : t_dp_siso_arr(c_nof_10GbE_streams-1 DOWNTO 0);
+ 
+  SIGNAL hdr_fields_out_arr                 : t_slv_1024_arr(c_nof_10GbE_streams-1 DOWNTO 0);
+
+  SIGNAL dp_offload_rx_restored_src_out_arr : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0) := (OTHERS=> c_dp_sosi_rst);
+
+  -------------------------------------------------------------------------------                  
+  -- BSN Aligner + FIFOs 
+  -------------------------------------------------------------------------------
+  CONSTANT c_block_size               : NATURAL := 176;
+  CONSTANT c_block_period             : NATURAL := c_block_size + 10; -- FIXME Based on....?
+  CONSTANT c_bsn_align_latency        : NATURAL := 3;
+  CONSTANT c_bsn_align_sop_timeout    : NATURAL := (c_bsn_align_latency + 1) * c_block_period;  -- wait somewhat more than c_bsn_align_latency periods
+  CONSTANT c_bsn_align_xoff_timeout   : NATURAL :=  c_bsn_align_latency * 2  * c_block_period;  -- flush factor 2 longer than needed
+  CONSTANT c_dp_fifo_size             : NATURAL := (c_bsn_align_latency + 5) * c_block_size;    -- be able to fit blocks for as long as sop time out;
+  CONSTANT c_dp_fifo_fill             : NATURAL := c_block_size;
+
+  SIGNAL dp_fifo_fill_src_out_arr     : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0);
+  SIGNAL dp_fifo_fill_src_in_arr      : t_dp_siso_arr(c_nof_10GbE_streams-1 DOWNTO 0);
 
+  SIGNAL dp_bsn_align_snk_in_2arr_3   : t_dp_sosi_2arr_3(g_nof_cbsets-1 DOWNTO 0);  
+  SIGNAL dp_bsn_align_snk_out_2arr_3  : t_dp_siso_2arr_3(g_nof_cbsets-1 DOWNTO 0);  
 
+  SIGNAL dp_bsn_align_src_out_2arr_3  : t_dp_sosi_2arr_3(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL dp_bsn_align_src_in_2arr_3   : t_dp_siso_2arr_3(g_nof_cbsets-1 DOWNTO 0);
+
+  SIGNAL reg_dp_bsn_align_mosi_arr    : t_mem_mosi_arr(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL reg_dp_bsn_align_miso_arr    : t_mem_miso_arr(g_nof_cbsets-1 DOWNTO 0); 
+
+  -------------------------------------------------------------------------------
+  -- dp_repack_data
+  -------------------------------------------------------------------------------
+  SIGNAL dp_repack_data_src_out_2arr_3 : t_dp_sosi_2arr_3(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL dp_repack_data_src_in_2arr_3  : t_dp_siso_2arr_3(g_nof_cbsets-1 DOWNTO 0);
+
+  -------------------------------------------------------------------------------
+  -- DP sync checker / insert
+  -------------------------------------------------------------------------------
+  CONSTANT c_nof_blk_per_sync  : NATURAL := 800000;
+
+  SIGNAL dp_sync_checker_fake_sync_enable : STD_LOGIC := '1';  -- generate an artificial sync during simulation
+
+  SIGNAL dp_sync_checker_snk_in_2arr_3  : t_dp_sosi_2arr_3(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL dp_sync_checker_src_out_2arr_3 : t_dp_sosi_2arr_3(g_nof_cbsets-1 DOWNTO 0);
+
+  -------------------------------------------------------------------------------
+  -- Final output rewiring
+  -------------------------------------------------------------------------------
+  SIGNAL concatenated_144b_sosi_arr : t_dp_sosi_arr(g_nof_cbsets-1 DOWNTO 0);
 
 BEGIN
 
   -------------------------------------------------------------------------------
-  -- Wire up the front transceiver I/O and corresponding LEDs
+  -- Front transceiver I/O and corresponding LEDs
+  -- . We have 8 CB sets coming in as 24 optical inputs. Since g_nof_cbsets can
+  --   be 1..8, we round the number of optical inputs up per QSFP (4 inputs)
+  --   as follows:
+  -- 
+  --   g_nof_cbsets |c_nof_10GbE_streams | c_nof_qsfp_bus 
+  --   -------------+-------------------+----------------
+  --              8 |                24 |              6 
+  --              7 |                21 |              6 
+  --              6 |                18 |              5 
+  --              5 |                15 |              4 
+  --              4 |                12 |              3 
+  --              3 |                 9 |              3 
+  --              2 |                 6 |              2 
+  --              1 |                 3 |              1 
+  -- 
+  -- TODO Make sure to define c_nof_10GbE_streams pins in the TCL pin file, 
+  --      (corresponding to g_nof_cbsets for that revision), *not* 
+  --      c_nof_qsfp_bus*4 pins.
   -------------------------------------------------------------------------------
-  unb2_board_front_io_qsfp_rx(0) <= QSFP_0_RX;
-  unb2_board_front_io_qsfp_rx(1) <= QSFP_1_RX;
-  unb2_board_front_io_qsfp_rx(2) <= QSFP_2_RX;
-  unb2_board_front_io_qsfp_rx(3) <= QSFP_3_RX;
-  unb2_board_front_io_qsfp_rx(4) <= QSFP_4_RX;
-  unb2_board_front_io_qsfp_rx(5) <= QSFP_5_RX;
-
-  QSFP_0_TX <= unb2_board_front_io_qsfp_tx(0);
-  QSFP_1_TX <= unb2_board_front_io_qsfp_tx(1);
-  QSFP_2_TX <= unb2_board_front_io_qsfp_tx(2);
-  QSFP_3_TX <= unb2_board_front_io_qsfp_tx(3);
-  QSFP_4_TX <= unb2_board_front_io_qsfp_tx(4);
-  QSFP_5_TX <= unb2_board_front_io_qsfp_tx(5);
+  gen_qsfp_0: IF c_nof_qsfp_bus>0 GENERATE 
+    unb2_board_front_io_qsfp_rx(0) <= QSFP_0_RX;
+    QSFP_0_TX <= unb2_board_front_io_qsfp_tx(0);
+  END GENERATE;
+  gen_qsfp_1: IF c_nof_qsfp_bus>1 GENERATE 
+    unb2_board_front_io_qsfp_rx(1) <= QSFP_1_RX; 
+    QSFP_1_TX <= unb2_board_front_io_qsfp_tx(1);
+  END GENERATE;
+  gen_qsfp_2: IF c_nof_qsfp_bus>2 GENERATE 
+    unb2_board_front_io_qsfp_rx(2) <= QSFP_2_RX;
+    QSFP_2_TX <= unb2_board_front_io_qsfp_tx(2);
+  END GENERATE;
+  gen_qsfp_3: IF c_nof_qsfp_bus>3 GENERATE
+    unb2_board_front_io_qsfp_rx(3) <= QSFP_3_RX; 
+    QSFP_3_TX <= unb2_board_front_io_qsfp_tx(3);
+  END GENERATE;
+  gen_qsfp_4: IF c_nof_qsfp_bus>4 GENERATE 
+    unb2_board_front_io_qsfp_rx(4) <= QSFP_4_RX;
+    QSFP_4_TX <= unb2_board_front_io_qsfp_tx(4);
+  END GENERATE;
+  gen_qsfp_5: IF c_nof_qsfp_bus>5 GENERATE
+    unb2_board_front_io_qsfp_rx(5) <= QSFP_5_RX;
+    QSFP_5_TX <= unb2_board_front_io_qsfp_tx(5);
+  END GENERATE;
 
   u_unb2_board_front_io : ENTITY unb2b_board_lib.unb2_board_front_io
   GENERIC MAP (
@@ -143,7 +269,6 @@ BEGIN
   u_unb2_board_qsfp_leds : ENTITY unb2b_board_lib.unb2_board_qsfp_leds
   GENERIC MAP (
     g_sim             => g_sim,
-    g_factory_image   => g_factory_image,
     g_nof_qsfp        => c_nof_qsfp_bus,
     g_pulse_us        => 1000 / (10**9 / c_unb2_board_ext_clk_freq_200M) -- nof clk cycles to get us period
   )
@@ -161,47 +286,57 @@ BEGIN
 
   -------------------------------------------------------------------------------
   -- 10GbE MAC
+  -- FIXME FIXME FIXME g_nof_macs cannot be anything other than 1,4,12 or 24 !!!
+  -- . Note - I added IP for 3 channels (g_nof_macs).
   -------------------------------------------------------------------------------
-  u_unb2_board_10gbe: ENTITY unb2b_board_10gbe_lib.unb2_board_10gbe --FIXME tr_10GbE is tech independent! We don want this!
+  u_unb2_board_10gbe: ENTITY unb2b_board_10gbe_lib.unb2_board_10gbe --FIXME tr_10GbE is tech independent, We don want this
   GENERIC MAP (
     g_sim           => g_sim,
     g_sim_level     => 1,
     g_technology    => g_technology,
-    g_nof_macs      => c_nof_streams_qsfp,
-    g_tx_fifo_fill  => c_def_10GbE_block_size,
-    g_tx_fifo_size  => c_def_10GbE_block_size*2
+    g_nof_macs      => c_nof_10GbE_streams,
+    g_direction     => "TX_RX"
   )
   PORT MAP (
     tr_ref_clk          => SA_CLK,
-    mm_rst              => mm_rst,
+
     mm_clk              => mm_clk,
-    reg_mac_mosi        => reg_tr_10GbE_qsfp_ring_mosi, --FIXME Ring? We don't use the ring!
-    reg_mac_miso        => reg_tr_10GbE_qsfp_ring_miso,
-    reg_eth10g_mosi     => reg_eth10g_qsfp_ring_mosi,
-    reg_eth10g_miso     => reg_eth10g_qsfp_ring_miso,
-    reg_ip_arria10_e1sg_phy_10gbase_r_24_mosi => reg_ip_arria10_e1sg_phy_10gbase_r_24_mosi, --FIXME rename this to base_r_mosi
-    reg_ip_arria10_e1sg_phy_10gbase_r_24_miso => reg_ip_arria10_e1sg_phy_10gbase_r_24_miso,      
+    mm_rst              => mm_rst,
 
-    dp_rst              => dp_rst,
     dp_clk              => dp_clk,
+    dp_rst              => dp_rst,
+
+-- TODO: feed this through the entity and connect to MMM
+--    reg_mac_mosi        => reg_tr_10GbE_qsfp_ring_mosi, --FIXME Ring? We don't use the ring!
+--    reg_mac_miso        => reg_tr_10GbE_qsfp_ring_miso,
+--    reg_eth10g_mosi     => reg_eth10g_qsfp_ring_mosi,
+--    reg_eth10g_miso     => reg_eth10g_qsfp_ring_miso,
+--    reg_ip_arria10_e1sg_phy_10gbase_r_24_mosi => reg_ip_arria10_e1sg_phy_10gbase_r_24_mosi,
+--    reg_ip_arria10_e1sg_phy_10gbase_r_24_miso => reg_ip_arria10_e1sg_phy_10gbase_r_24_miso,      
 
     src_out_arr         => unb2_board_10gbe_src_out_arr,
     src_in_arr          => unb2_board_10gbe_src_in_arr,
     snk_out_arr         => unb2_board_10gbe_snk_out_arr,
     snk_in_arr          => unb2_board_10gbe_snk_in_arr,
 
-    serial_tx_arr       => unb2_board_front_io_serial_tx_arr,
-    serial_rx_arr       => unb2_board_front_io_serial_rx_arr
+    serial_tx_arr       => unb2_board_front_io_serial_tx_arr(c_nof_10GbE_streams-1 DOWNTO 0),
+    serial_rx_arr       => unb2_board_front_io_serial_rx_arr(c_nof_10GbE_streams-1 DOWNTO 0)
   );
+  
+  -- 10G TX inputs
+  unb2_board_10gbe_snk_in_arr(g_nof_cbsets-1 DOWNTO 0) <= snk_in_arr;
+  snk_out_arr <= unb2_board_10gbe_snk_out_arr(g_nof_cbsets-1 DOWNTO 0);
 
   -----------------------------------------------------------------------------
   -- dp_offload_rx
+  -- . TODO We're using the g_hdr_field_arr of apertif_udp_offload_pkg first.
+  --        Replace this with c_hdr_field arr of arts_unb2b_xc_emu when available.
   -----------------------------------------------------------------------------
   u_dp_offload_rx : ENTITY dp_lib.dp_offload_rx
   GENERIC MAP (
     g_nof_streams         => c_nof_10GbE_streams,
-    g_data_w              => c_xgmii_data_w,
-    g_hdr_field_arr       => c_apertif_udp_offload_hdr_field_arr,
+    g_data_w              => 64,
+    g_hdr_field_arr       => c_apertif_udp_offload_hdr_field_arr, --TODO Replace this with c_hdr_field arr of arts_unb2b_xc_emu when available
     g_remove_crc          => FALSE,
     g_crc_nof_words       => 0 
    )
@@ -212,14 +347,11 @@ BEGIN
     dp_rst                => dp_rst,
     dp_clk                => dp_clk,
   
-    reg_hdr_dat_mosi      => reg_dp_offload_rx_hdr_dat_mosi,
-    reg_hdr_dat_miso      => reg_dp_offload_rx_hdr_dat_miso,
-  
-    snk_in_arr            => dp_offload_rx_snk_in_arr,
-    snk_out_arr           => dp_offload_rx_snk_out_arr,
+    snk_in_arr            => unb2_board_10gbe_src_out_arr,
+    snk_out_arr           => unb2_board_10gbe_src_in_arr,
                
     src_out_arr           => dp_offload_rx_src_out_arr,
-    src_in_arr            => (OTHERS=>c_dp_siso_rdy), --dp_offload_rx_src_in_arr,
+    src_in_arr            => dp_offload_rx_src_in_arr,
   
     hdr_fields_out_arr    => hdr_fields_out_arr
     );
@@ -228,9 +360,9 @@ BEGIN
     dp_offload_rx_restored_src_out_arr(i).sync <=          sl(hdr_fields_out_arr(i)(field_hi(c_apertif_udp_offload_hdr_field_arr, "dp_sync") DOWNTO field_lo(c_apertif_udp_offload_hdr_field_arr, "dp_sync" )));
     dp_offload_rx_restored_src_out_arr(i).bsn  <= RESIZE_UVEC(hdr_fields_out_arr(i)(field_hi(c_apertif_udp_offload_hdr_field_arr, "dp_bsn" ) DOWNTO field_lo(c_apertif_udp_offload_hdr_field_arr, "dp_bsn"  )), c_dp_stream_bsn_w);
   
-    --dp_offload_rx_restored_src_out_arr(i).data  <= dp_offload_rx_src_out_arr(i).data;
-    dp_offload_rx_restored_src_out_arr(i).re    <= dp_offload_rx_src_out_arr(i).re;
-    dp_offload_rx_restored_src_out_arr(i).im    <= dp_offload_rx_src_out_arr(i).im;
+    dp_offload_rx_restored_src_out_arr(i).data  <= dp_offload_rx_src_out_arr(i).data;
+--    dp_offload_rx_restored_src_out_arr(i).re(8 DOWNTO 0)    <= dp_offload_rx_src_out_arr(i).re(8 DOWNTO 0);
+--    dp_offload_rx_restored_src_out_arr(i).im(8 DOWNTO 0)    <= dp_offload_rx_src_out_arr(i).im(8 DOWNTO 0);
     dp_offload_rx_restored_src_out_arr(i).valid <= dp_offload_rx_src_out_arr(i).valid;
     dp_offload_rx_restored_src_out_arr(i).sop   <= dp_offload_rx_src_out_arr(i).sop;
     dp_offload_rx_restored_src_out_arr(i).eop   <= dp_offload_rx_src_out_arr(i).eop;
@@ -238,36 +370,45 @@ BEGIN
   END GENERATE;
  
   -----------------------------------------------------------------------------
-  -- BSN alignment + FIFOs  (TODO not in sim!) 
+  -- BSN alignment + FIFOs
+  -- . Note: 1 FIFO per input fiber
+  --         1 BSN aligner per CB set
   -----------------------------------------------------------------------------
-  gen_mms_dp_bsn_align : IF g_sim = FALSE GENERATE
-
   gen_dp_fifo_fill: FOR i IN 0 TO c_nof_10GbE_streams-1 GENERATE
     u_dp_fifo_fill : ENTITY dp_lib.dp_fifo_fill
     GENERIC MAP (
-      g_data_w         => c_xgmii_data_w,
+      g_data_w         => 64,
       g_bsn_w          => c_dp_stream_bsn_w,
       g_channel_w      => c_dp_stream_channel_w,
       g_use_bsn        => TRUE,
-      g_use_channel    => TRUE,
-      g_use_error      => TRUE,
+      g_use_channel    => FALSE,
+      g_use_error      => FALSE,
       g_use_sync       => TRUE,
-      g_use_complex    => TRUE,
+      g_use_complex    => FALSE,
       g_fifo_fill      => c_dp_fifo_fill,
       g_fifo_size      => c_dp_fifo_size
     )
     PORT MAP (
-      rst       => dp_rst,
       clk       => dp_clk,
+      rst       => dp_rst,
   
+      snk_in    => dp_offload_rx_restored_src_out_arr(i),
       snk_out   => dp_offload_rx_src_in_arr(i),
-      snk_in    => dp_force_src_out_arr(i),
   
-      src_in    => dp_fifo_fill_src_in_arr(i),
-      src_out   => dp_fifo_fill_src_out_arr(i)
+      src_out   => dp_fifo_fill_src_out_arr(i),
+      src_in    => dp_fifo_fill_src_in_arr(i)
     );
   END GENERATE;
 
+  -- Wire flat fiber array [c_nof_10GbE_streams] to 2d array [g_nof_cbsets][3 fibers]
+  gen_dp_bsn_align_snk_in_2arr_3: FOR i IN 0 TO g_nof_cbsets-1 GENERATE
+    gen_j: FOR j IN 0 TO c_nof_10GbE_streams-1 GENERATE
+      dp_bsn_align_snk_in_2arr_3(i)(j) <= dp_fifo_fill_src_out_arr(i*c_nof_10GbE_streams+j);
+      dp_fifo_fill_src_in_arr(i*c_nof_10GbE_streams+j) <= dp_bsn_align_snk_out_2arr_3(i)(j);
+    END GENERATE;
+  END GENERATE;
+
+  gen_mms_dp_bsn_align: FOR i IN 0 TO g_nof_cbsets-1 GENERATE
     u_mms_dp_bsn_align : ENTITY dp_lib.mms_dp_bsn_align
     GENERIC MAP (
       g_block_size           => c_block_size,
@@ -279,91 +420,182 @@ BEGIN
       g_bsn_request_pipeline => 2
     )
     PORT MAP (
-      dp_rst      => dp_rst,
       dp_clk      => dp_clk,
-  
-      snk_out_arr => dp_fifo_fill_src_in_arr,
-      snk_in_arr  => dp_bsn_align_snk_in_arr,
-  
-      src_in_arr  => (OTHERS=>c_dp_siso_rdy),
-      src_out_arr => dp_bsn_align_src_out_arr,
+      dp_rst      => dp_rst,
 
-      mm_rst      => mm_rst,
       mm_clk      => mm_clk,
-
-      reg_mosi    => reg_dp_bsn_align_input_mosi,
-      reg_miso    => reg_dp_bsn_align_input_miso
+      mm_rst      => mm_rst,
   
-  -----------------------------------------------------------------------------
-  -- RX: BSN monitors (TODO not in sim!)
-  -----------------------------------------------------------------------------
-  dp_bsn_monitor_input_in_sosi_arr(2 DOWNTO 0) <= dp_force_src_out_arr; --Un-aligned, non-flow controlled input streams
-  dp_bsn_monitor_input_in_siso_arr(2 DOWNTO 0) <= (OTHERS=>c_dp_siso_rdy);
+      snk_in_arr  => dp_bsn_align_snk_in_2arr_3(i),
+      snk_out_arr => dp_bsn_align_snk_out_2arr_3(i),
+  
+      src_in_arr  => dp_bsn_align_src_in_2arr_3(i),
+      src_out_arr => dp_bsn_align_src_out_2arr_3(i),
 
-  dp_bsn_monitor_input_in_sosi_arr(5 DOWNTO 3) <= dp_bsn_align_src_out_arr; --BSN aligned streams
-  dp_bsn_monitor_input_in_siso_arr(5 DOWNTO 3) <= dp_fifo_fill_src_in_arr;
+      reg_mosi    => reg_dp_bsn_align_mosi_arr(i),
+      reg_miso    => reg_dp_bsn_align_miso_arr(i)
+    );
+  END GENERATE;
 
-  u_dp_bsn_monitor_input : ENTITY dp_lib.mms_dp_bsn_monitor
-  GENERIC MAP (
-    g_nof_streams        => c_nof_10GbE_streams*2,
-    g_sync_timeout       => 225280000, --200000000*1.024*1.1 (1.1 = margin)
-    g_log_first_bsn      => FALSE
+  -- MM bus multiplexer
+  u_common_mem_mux : ENTITY common_lib.common_mem_mux
+  GENERIC MAP (    
+    g_nof_mosi    => g_nof_cbsets,
+    g_mult_addr_w => ceil_log2(c_nof_10GbE_streams)
   )
   PORT MAP (
-    mm_rst      => mm_rst,
-    mm_clk      => mm_clk,
-    reg_mosi    => reg_dp_bsn_monitor_input_mosi,
-    reg_miso    => reg_dp_bsn_monitor_input_miso,
-    
-    dp_rst      => dp_rst,
-    dp_clk      => dp_clk,
-    sync_in     => dp_pps,
-    in_siso_arr => dp_bsn_monitor_input_in_siso_arr,
-    in_sosi_arr => dp_bsn_monitor_input_in_sosi_arr
+    mosi     => reg_dp_bsn_align_mosi,
+    miso     => reg_dp_bsn_align_miso,
+    mosi_arr => reg_dp_bsn_align_mosi_arr,
+    miso_arr => reg_dp_bsn_align_miso_arr
   );
 
   -------------------------------------------------------------------------------
-  -- DP Sync Checker (TODO not in sim!)
-  -- . Make sure there are 88 beamlets*800000 timesamples per sync pulse.
+  -- Repack the 64b 10G input data to 48b
+  -- . this is done here so we can use the pre-BSN align FIFOs (dp_sync_checker
+  --   does not support flow control).
   -------------------------------------------------------------------------------
-  gen_dp_sync_checker : FOR i IN 0 TO g_nof_telescopes-1 GENERATE
-    u_dp_sync_checker : ENTITY dp_lib.dp_sync_checker
-    GENERIC MAP(
-      g_nof_blk_per_sync => g_nof_blk_per_sync -- 800000 = 88 beamlets * 800000 timesamples / 88 (nof timesamples/block)
-    )                      
-    PORT MAP(
-      dp_clk   => dp_clk,
-      dp_rst   => dp_rst,
-      snk_out  => OPEN,         
-      snk_in   => dp_sync_checker_snk_in_arr(i),          
-      src_in   => c_dp_siso_rdy,          
-      src_out  => dp_sync_checker_src_out_arr(i)
-    );
+  gen_dp_repack_data : FOR i IN 0 TO g_nof_cbsets-1 GENERATE
+    gen_j : FOR j IN 0 TO c_nof_10GbE_streams-1 GENERATE
+      u_dp_repack_data : ENTITY dp_lib.dp_repack_data
+      GENERIC MAP (
+        g_in_dat_w      => 64,
+        g_in_nof_words  => 3,
+        g_out_dat_w     => 48,
+        g_out_nof_words => 4
+      )
+      PORT MAP (
+        clk            => dp_clk,
+        rst            => dp_rst,
+    
+        snk_in         => dp_bsn_align_src_out_2arr_3(i)(i),
+        snk_out        => dp_bsn_align_src_in_2arr_3(i)(j),
+                       
+        src_out        => dp_repack_data_src_out_2arr_3(i)(j),
+        src_in         => c_dp_siso_rdy
+      );
+    END GENERATE;
   END GENERATE;
 
+  -------------------------------------------------------------------------------
+  -- Insert a fake sync on the first frame after a reset to speed up simulation
+  -------------------------------------------------------------------------------
+  gen_nofakesync : IF g_sim = FALSE GENERATE
+    dp_sync_checker_snk_in_2arr_3 <= dp_repack_data_src_out_2arr_3;
+  END GENERATE;
 
+  gen_fakesync : IF g_sim = TRUE GENERATE
+    p_insert_fakesync : PROCESS(dp_sync_checker_fake_sync_enable,dp_repack_data_src_out_2arr_3)
+    BEGIN
+      FOR i IN 0 TO g_nof_cbsets-1 LOOP
+        FOR j IN 0 TO c_nof_10GbE_streams-1 LOOP
+          dp_sync_checker_snk_in_2arr_3(i)(j)        <= dp_repack_data_src_out_2arr_3(i)(j); -- SOSI ctrl and data
+          dp_sync_checker_snk_in_2arr_3(i)(j).sync   <= dp_repack_data_src_out_2arr_3(i)(j).sop and dp_sync_checker_fake_sync_enable; -- Override the sync
+        END LOOP;
+      END LOOP;
+    END PROCESS;
+  
+    p_ctrl_fakesync : PROCESS(dp_clk,dp_rst)
+    BEGIN
+      IF dp_rst = '1' THEN
+        dp_sync_checker_fake_sync_enable <= '1';
+      ELSE
+        IF dp_clk'event and dp_clk = '1' THEN
+          FOR i IN 0 TO g_nof_cbsets-1 LOOP
+            IF dp_repack_data_src_out_2arr_3(i)(0).sop = '1' and dp_sync_checker_fake_sync_enable = '1' THEN
+              dp_sync_checker_fake_sync_enable <= '0';
+            END IF;
+          END LOOP;
+        END IF;
+      END IF;
+    END PROCESS;
+  END GENERATE;
 
   -------------------------------------------------------------------------------
-  -- DP Sync Insert (to tag beamlet boundaries)
+  -- DP Sync Checker
+  -- . Make sure there are 88 beamlets*800000 timesamples per sync pulse.
   -------------------------------------------------------------------------------
-  dp_sync_insert_snk_in_arr <= dp_sync_checker_src_out_arr;
-
-  gen_dp_sync_insert : FOR i IN 0 TO g_nof_telescopes-1 GENERATE
-    u_dp_sync_insert : ENTITY dp_lib.dp_sync_insert
-    GENERIC MAP(
-      g_nof_data_per_blk => g_nof_fft_bins*g_nof_polarizations, -- 32 samples * 2 pols=64
-      g_nof_blk_per_sync => g_nof_blk_per_sync/g_nof_fft_bins   -- 800000/32=25000
-    )             
-    PORT MAP(         
-      rst        => dp_rst,
-      clk        => dp_clk,
-  
-      snk_in     => dp_sync_insert_snk_in_arr(i),
- 
-      src_out    => dp_sync_insert_src_out_arr(i)
-    );
+  gen_dp_sync_checker : FOR i IN 0 TO g_nof_cbsets-1 GENERATE
+    gen_j : FOR j IN 0 TO c_nof_10GbE_streams-1 GENERATE
+      u_dp_sync_checker : ENTITY dp_lib.dp_sync_checker
+      GENERIC MAP(
+        g_nof_blk_per_sync => c_nof_blk_per_sync -- 800000 = 88 beamlets * 800000 timesamples / 88 (nof timesamples/block)
+      )                      
+      PORT MAP(
+        dp_clk   => dp_clk,
+        dp_rst   => dp_rst,
+     
+        snk_in   => dp_sync_checker_snk_in_2arr_3(i)(j),  
+        snk_out  => OPEN, -- Beware! snk_out always ready, cannot be used.   
+               
+        src_out  => dp_sync_checker_src_out_2arr_3(i)(j),
+        src_in   => c_dp_siso_rdy
+      );
+    END GENERATE;
   END GENERATE;
 
+  -------------------------------------------------------------------------------
+  -- Concatenate 3*48b into 144b
+  -------------------------------------------------------------------------------
+  p_concatenate_3x48_to_144 : PROCESS(dp_sync_checker_src_out_2arr_3)
+  BEGIN
+    FOR i IN 0 TO g_nof_cbsets-1 LOOP
+      FOR j IN 0 TO c_nof_10GbE_streams-1 LOOP
+        concatenated_144b_sosi_arr(i) <= dp_sync_checker_src_out_2arr_3(i)(0);
+        concatenated_144b_sosi_arr(i).data(j*48+48-1 DOWNTO j*48) <= dp_sync_checker_src_out_2arr_3(i)(j).data(48-1 DOWNTO 0);
+     END LOOP;
+    END LOOP;
+  END PROCESS;
+
+  -------------------------------------------------------------------------------
+  -- Extract the 8 dish streams from the 144b data
+  -------------------------------------------------------------------------------
+  p_src_out_2arr_8:PROCESS(concatenated_144b_sosi_arr)
+  BEGIN
+    FOR i IN 0 TO g_nof_cbsets-1 LOOP
+      src_out_2arr_8(i)(7)    <= concatenated_144b_sosi_arr(i);
+      src_out_2arr_8(i)(7).im(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data(143 DOWNTO 135); --RT9
+      src_out_2arr_8(i)(7).re(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data(134 DOWNTO 126);
+      src_out_2arr_8(i)(6)    <= concatenated_144b_sosi_arr(i);
+      src_out_2arr_8(i)(6).im(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data(125 DOWNTO 117); --RT8
+      src_out_2arr_8(i)(6).re(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data(116 DOWNTO 108);
+      src_out_2arr_8(i)(5)    <= concatenated_144b_sosi_arr(i);
+      src_out_2arr_8(i)(5).im(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data(107 DOWNTO  99); --RT7
+      src_out_2arr_8(i)(5).re(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data( 98 DOWNTO  90);
+      src_out_2arr_8(i)(4)    <= concatenated_144b_sosi_arr(i);
+      src_out_2arr_8(i)(4).im(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data( 89 DOWNTO  81); --RT6
+      src_out_2arr_8(i)(4).re(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data( 80 DOWNTO  72);
+      src_out_2arr_8(i)(3)    <= concatenated_144b_sosi_arr(i);
+      src_out_2arr_8(i)(3).im(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data( 71 DOWNTO  63); --RT5
+      src_out_2arr_8(i)(3).re(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data( 62 DOWNTO  54);
+      src_out_2arr_8(i)(2)    <= concatenated_144b_sosi_arr(i);
+      src_out_2arr_8(i)(2).im(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data( 53 DOWNTO  45); --RT4
+      src_out_2arr_8(i)(2).re(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data( 44 DOWNTO  36);
+      src_out_2arr_8(i)(1)    <= concatenated_144b_sosi_arr(i);
+      src_out_2arr_8(i)(1).im(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data( 35 DOWNTO  27); --RT3
+      src_out_2arr_8(i)(1).re(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data( 26 DOWNTO  18);
+      src_out_2arr_8(i)(0)    <= concatenated_144b_sosi_arr(i);
+      src_out_2arr_8(i)(0).im(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data( 17 DOWNTO   9); --RT2
+      src_out_2arr_8(i)(0).re(8 DOWNTO 0) <= concatenated_144b_sosi_arr(i).data(  8 DOWNTO   0);
+    END LOOP;
+  END PROCESS;
+
+  -----------------------------------------------------------------------------
+  -- Latch the bsn of the aligned streams and feed it to the output packetizer
+  -----------------------------------------------------------------------------
+  p_latch_bsn : PROCESS(dp_rst, dp_clk) IS
+  BEGIN
+    FOR i IN 0 TO g_nof_cbsets-1 LOOP
+      IF dp_rst = '1' THEN
+        general_bsn_arr(i) <= (OTHERS => '0');
+      ELSE
+        IF rising_edge(dp_clk) THEN
+          IF dp_bsn_align_src_out_2arr_3(i)(0).sync = '1' THEN
+            general_bsn_arr(i) <= dp_bsn_align_src_out_2arr_3(i)(0).bsn;
+          END IF;
+        END IF;
+      END IF;
+    END LOOP;
+  END PROCESS;
 
-  
 END str;
diff --git a/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_mm_master.vhd b/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_mm_master.vhd
index 18888734dd..2137f21e15 100644
--- a/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_mm_master.vhd
+++ b/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_mm_master.vhd
@@ -130,7 +130,10 @@ ENTITY arts_unb2b_sc3_mm_master IS
 
 
     reg_eth10g_qsfp_ring_mosi      : OUT t_mem_mosi;
-    reg_eth10g_qsfp_ring_miso      : IN  t_mem_miso
+    reg_eth10g_qsfp_ring_miso      : IN  t_mem_miso;
+
+    reg_dp_bsn_align_mosi : OUT t_mem_mosi;
+    reg_dp_bsn_align_miso :  IN t_mem_miso
 
   );
 END arts_unb2b_sc3_mm_master;
diff --git a/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_output.vhd b/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_output.vhd
index 19c04c5e3a..d9d46c27c4 100644
--- a/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_output.vhd
+++ b/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_output.vhd
@@ -25,15 +25,18 @@
 -- Purpose:
 -- . Transpose and packetize the input streams to 40 (CB) IQUV and I output streams
 -- Input : src_out_2arr
---   . [8 CB sets * 9 TABs] * [[5 CB][24 sb][12500 samples][4 channels][4*8 bits] / 1.024s]
---     (<-- 72 streams -->) * (<---------- 11.718750 Msps * 4*8b = 187.5 Mbps ----------->)
---     (<--------------------- 72 streams * 187.5 Mbps = 13.5 Gbps ---------------------->)
--- Output: iquv_src_out_arr
+--  . [8 CB sets * 9 TABs] * [[5 CB][24 sb][12500 samples][4 channels][4*8 bits] / 1.024s]
+--    (<-- 72 streams -->) * (<---------- 11.718750 Msps * 4*8b = 187.5 Mbps ----------->)
+--    (<--------------------- 72 streams * 187.5 Mbps = 13.5 Gbps ---------------------->)
+-- Output: src_out_arr
+-- . TODO
+-- Description:
+-- . The CB set outputs 0.. 7 connect to QSFP_0_TX..QSFP_1_TX.
+-- . FIXME arts_unb1_sc4_output_tab is using way too much MM address space
+--         . too many header fields are MM controllable
+--         . Why is MM control of IP, MAC duplicated? 
 
--- Output: i_src_out_arr
-
-
-LIBRARY IEEE, common_lib, unb2b_board_lib, unb2b_board_10gbe_lib, dp_lib, tr_10GbE_lib, technology_lib;
+LIBRARY IEEE, common_lib, unb2b_board_lib, unb2b_board_10gbe_lib, dp_lib, tr_10GbE_lib, technology_lib, arts_unb1_sc4_lib;
 USE IEEE.STD_LOGIC_1164.ALL;
 USE IEEE.NUMERIC_STD.ALL;
 USE common_lib.common_pkg.ALL;
@@ -43,26 +46,188 @@ USE dp_lib.dp_stream_pkg.ALL;
 
 ENTITY arts_unb2b_sc3_output IS
   GENERIC (
-    g_technology      : NATURAL := c_tech_arria10_e1sg;
-    g_sim             : BOOLEAN := FALSE;
-    g_nof_cbsets      : NATURAL,
-    g_nof_tabs        : NATURAL;
-    g_iquv_data_w_out : NATURAL
+    g_technology          : NATURAL := c_tech_arria10_e1sg;
+    g_sim                 : BOOLEAN := FALSE;
+    g_nof_cbsets          : NATURAL;
+    g_nof_cb_per_set      : NATURAL;
+    g_nof_subbands_per_cb : NATURAL;
+    g_nof_channels        : NATURAL;
+    g_nof_timesamples     : NATURAL;
+    g_nof_tabs            : NATURAL;
+    g_iquv_data_w_out     : NATURAL
    );
   PORT (
-    src_out_2arr     :  IN t_dp_sosi_2arr_9(g_nof_cbsets-1 DOWNTO 0); -- 8 CB sets * 9 TABs 
-    iquv_src_out_arr : OUT t_dp_sosi_arr(g_nof_cb-1 DOWNTO 0);        -- 40 CB
-    i_src_out_arr    : OUT t_dp_sosi_arr(g_nof_cb-1 DOWNTO 0)         -- 40 CB
+    dp_clk                                  : IN  STD_LOGIC;
+    dp_rst                                  : IN  STD_LOGIC;
+
+    mm_clk                                  : IN  STD_LOGIC;
+    mm_rst                                  : IN  STD_LOGIC;
+
+    snk_in_2arr_9                           : IN  t_dp_sosi_2arr_9(g_nof_cbsets-1 DOWNTO 0); -- 8 CB sets * 9 TABs 
+    general_bsn_arr                         : IN  t_slv_64_arr(g_nof_cbsets-1 DOWNTO 0);
+ 
+    src_out_arr                             : OUT t_dp_sosi_arr(g_nof_cbsets-1 DOWNTO 0); -- 8 CB sets * I and IQUV interleaved
+    src_in_arr                              : IN  t_dp_siso_arr(g_nof_cbsets-1 DOWNTO 0);
+
+    reg_dp_offload_tx_tab_iquv_hdr_dat_mosi : IN  t_mem_mosi;
+    reg_dp_offload_tx_tab_iquv_hdr_dat_miso : OUT t_mem_miso;
+    reg_dp_xonoff_tab_iquv_mosi             : IN  t_mem_mosi;
+    reg_dp_xonoff_tab_iquv_miso             : OUT t_mem_miso;
+    reg_dp_offload_tx_tab_i_hdr_dat_mosi    : IN  t_mem_mosi;
+    reg_dp_offload_tx_tab_i_hdr_dat_miso    : OUT t_mem_miso;
+    reg_tab_dest_ip_mosi                    : IN  t_mem_mosi;
+    reg_tab_dest_ip_miso                    : OUT t_mem_miso;
+    reg_tab_dest_mac_mosi                   : IN  t_mem_mosi;
+    reg_tab_dest_mac_miso                   : OUT t_mem_miso;
+    reg_dp_xonoff_tab_i_mosi                : IN  t_mem_mosi; 
+    reg_dp_xonoff_tab_i_miso                : OUT t_mem_miso;
+
+    ID                                      : IN  STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0)
   );
 END arts_unb2b_sc3_output;
 
 
 ARCHITECTURE str OF arts_unb2b_sc3_output IS
 
+  SIGNAL reg_dp_offload_tx_tab_iquv_hdr_dat_mosi_arr : t_mem_mosi_arr(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL reg_dp_offload_tx_tab_iquv_hdr_dat_miso_arr : t_mem_miso_arr(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL reg_dp_xonoff_tab_iquv_mosi_arr             : t_mem_mosi_arr(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL reg_dp_xonoff_tab_iquv_miso_arr             : t_mem_miso_arr(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL reg_dp_offload_tx_tab_i_hdr_dat_mosi_arr    : t_mem_mosi_arr(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL reg_dp_offload_tx_tab_i_hdr_dat_miso_arr    : t_mem_miso_arr(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL reg_tab_dest_ip_mosi_arr                    : t_mem_mosi_arr(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL reg_tab_dest_ip_miso_arr                    : t_mem_miso_arr(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL reg_tab_dest_mac_mosi_arr                   : t_mem_mosi_arr(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL reg_tab_dest_mac_miso_arr                   : t_mem_miso_arr(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL reg_dp_xonoff_tab_i_mosi_arr                : t_mem_mosi_arr(g_nof_cbsets-1 DOWNTO 0); 
+  SIGNAL reg_dp_xonoff_tab_i_miso_arr                : t_mem_miso_arr(g_nof_cbsets-1 DOWNTO 0);
 
-
+  SIGNAL unb1_id : STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0);
 
 BEGIN
+
+  gen_arts_unb1_sc4_output_tab : FOR i IN 0 TO g_nof_cbsets-1 GENERATE
+--    u_arts_unb1_sc4_output_tab : ENTITY arts_unb1_sc4_lib.arts_unb1_sc4_output_tab --workaround, can't include unb1 libs in unb2b QuestaSim
+    u_arts_unb1_sc4_output_tab : ENTITY work.arts_unb1_sc4_output_tab
+    GENERIC MAP (
+      g_sim                            => g_sim,
+      g_override_payload_data          => FALSE,
+      g_nof_tabs                       => g_nof_tabs,
+      g_nof_compound_beams             => g_nof_cb_per_set,
+      g_nof_subbands_per_compound_beam => g_nof_subbands_per_cb,
+      g_nof_stokes                     => 4,
+      g_nof_channels                   => g_nof_channels,
+      g_nof_timesamples                => g_nof_timesamples,
+      g_nof_bytes_per_iquv_packet      => 8000,
+      g_nof_bytes_per_i_packet         => 6250
+    )
+    PORT MAP (
+      dp_clk                              => dp_clk,
+      dp_rst                              => dp_rst,
+  
+      mm_clk                              => mm_clk, 
+      mm_rst                              => mm_rst,
+  
+      general_bsn                         => general_bsn_arr(i),
   
+      tab_snk_in_arr                      => snk_in_2arr_9(i),
+      tab_src_out                         => src_out_arr(i),
+      tab_src_in                          => src_in_arr(i),
+  
+      reg_dp_offload_tx_iquv_hdr_dat_mosi => reg_dp_offload_tx_tab_iquv_hdr_dat_mosi_arr(i),
+      reg_dp_offload_tx_iquv_hdr_dat_miso => reg_dp_offload_tx_tab_iquv_hdr_dat_miso_arr(i),
+      reg_dp_xonoff_iquv_mosi             => reg_dp_xonoff_tab_iquv_mosi_arr(i),
+      reg_dp_xonoff_iquv_miso             => reg_dp_xonoff_tab_iquv_miso_arr(i), 
+      reg_dp_offload_tx_i_hdr_dat_mosi    => reg_dp_offload_tx_tab_i_hdr_dat_mosi_arr(i),
+      reg_dp_offload_tx_i_hdr_dat_miso    => reg_dp_offload_tx_tab_i_hdr_dat_miso_arr(i),
+      reg_tab_dest_ip_mosi                => reg_tab_dest_ip_mosi_arr(i),
+      reg_tab_dest_ip_miso                => reg_tab_dest_ip_miso_arr(i),
+      reg_tab_dest_mac_mosi               => reg_tab_dest_mac_mosi_arr(i),
+      reg_tab_dest_mac_miso               => reg_tab_dest_mac_miso_arr(i),
+      reg_dp_xonoff_i_mosi                => reg_dp_xonoff_tab_i_mosi_arr(i),
+      reg_dp_xonoff_i_miso                => reg_dp_xonoff_tab_i_miso_arr(i), 
+  
+      ID                                  => unb1_id
+    );
+
+    -- Convert unb2 ID + CB set index to unb1 ID
+    -- . CB set index                         = unb1 chip ID
+    -- . unb2 backplane index && unb2 chip ID = unb1 backplane ID (band 0..15)
+    unb1_id <= ID(4 DOWNTO 0) & TO_UVEC(i, 3);
+  END GENERATE;
+
+  -- MM bus multiplexers
+  u_common_mem_mux_reg_dp_offload_tx_tab_iquv_hdr_dat : ENTITY common_lib.common_mem_mux
+  GENERIC MAP (    
+    g_nof_mosi    => g_nof_cbsets,
+    g_mult_addr_w => 6
+  )
+  PORT MAP (
+    mosi     => reg_dp_offload_tx_tab_iquv_hdr_dat_mosi,
+    miso     => reg_dp_offload_tx_tab_iquv_hdr_dat_miso,
+    mosi_arr => reg_dp_offload_tx_tab_iquv_hdr_dat_mosi_arr,
+    miso_arr => reg_dp_offload_tx_tab_iquv_hdr_dat_miso_arr
+  );
+
+  u_common_mem_mux_reg_dp_xonoff_tab_iquv : ENTITY common_lib.common_mem_mux
+  GENERIC MAP (    
+    g_nof_mosi    => g_nof_cbsets,
+    g_mult_addr_w => 1
+  )
+  PORT MAP (
+    mosi     => reg_dp_xonoff_tab_iquv_mosi,
+    miso     => reg_dp_xonoff_tab_iquv_miso,
+    mosi_arr => reg_dp_xonoff_tab_iquv_mosi_arr,
+    miso_arr => reg_dp_xonoff_tab_iquv_miso_arr
+  );
+
+  u_common_mem_mux_reg_dp_offload_tx_tab_i_hdr_dat : ENTITY common_lib.common_mem_mux
+  GENERIC MAP (    
+    g_nof_mosi    => g_nof_cbsets,
+    g_mult_addr_w => 9
+  )
+  PORT MAP (
+    mosi     => reg_dp_offload_tx_tab_i_hdr_dat_mosi,
+    miso     => reg_dp_offload_tx_tab_i_hdr_dat_miso,
+    mosi_arr => reg_dp_offload_tx_tab_i_hdr_dat_mosi_arr,
+    miso_arr => reg_dp_offload_tx_tab_i_hdr_dat_miso_arr
+  );
+
+  u_common_mem_mux_reg_tab_dest_ip : ENTITY common_lib.common_mem_mux
+  GENERIC MAP (    
+    g_nof_mosi    => g_nof_cbsets,
+    g_mult_addr_w => 3
+  )
+  PORT MAP (
+    mosi     => reg_tab_dest_ip_mosi,
+    miso     => reg_tab_dest_ip_miso,
+    mosi_arr => reg_tab_dest_ip_mosi_arr,
+    miso_arr => reg_tab_dest_ip_miso_arr
+  );
+
+  u_common_mem_mux_reg_tab_dest_mac : ENTITY common_lib.common_mem_mux
+  GENERIC MAP (    
+    g_nof_mosi    => g_nof_cbsets,
+    g_mult_addr_w => 4
+  )
+  PORT MAP (
+    mosi     => reg_tab_dest_mac_mosi,
+    miso     => reg_tab_dest_mac_miso,
+    mosi_arr => reg_tab_dest_mac_mosi_arr,
+    miso_arr => reg_tab_dest_mac_miso_arr
+  );
+
+  u_common_mem_mux_reg_dp_xonoff_tab_i : ENTITY common_lib.common_mem_mux
+  GENERIC MAP (    
+    g_nof_mosi    => g_nof_cbsets,
+    g_mult_addr_w => 1
+  )
+  PORT MAP (
+    mosi     => reg_dp_xonoff_tab_i_mosi,
+    miso     => reg_dp_xonoff_tab_i_miso,
+    mosi_arr => reg_dp_xonoff_tab_i_mosi_arr,
+    miso_arr => reg_dp_xonoff_tab_i_miso_arr
+  );
+
 
 END str;
diff --git a/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_processing.vhd b/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_processing.vhd
index bef97902ea..6fd0b9ef11 100644
--- a/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_processing.vhd
+++ b/applications/arts/designs/arts_unb2b_sc3/src/vhdl/arts_unb2b_sc3_processing.vhd
@@ -23,16 +23,16 @@
 -- Authors:
 -- . Daniel van der Schuur
 -- Purpose: Create 9 TABs + integrated Stokes params for 40 Compound Beams
--- . Input: snk_in_2arr
+-- . Input: snk_in_2arr_8
 --   . [8 CB sets * 8 dishes] * [[5 CB][24 sb][12500 samples][64 channels][2 pols][18 bits] / 1.024s]
 --     (<--- 64 streams --->) * (<---------------- 187.5 Msps * 18b = 3.375 Gbps ------------------>)
 --     (<-------------------------- 64 streams * 3.375 Gbps = 216 Gbps ---------------------------->)
--- . Output: src_out_2arr
+-- . Output: src_out_2arr_9
 --   . [8 CB sets * 9 TABs] * [[5 CB][24 sb][12500 samples][4 channels][4*8 bits] / 1.024s]
 --     (<-- 72 streams -->) * (<---------- 11.718750 Msps * 4*8b = 187.5 Mbps ----------->)
 --     (<--------------------- 72 streams * 187.5 Mbps = 13.5 Gbps ---------------------->)
 
-LIBRARY IEEE, common_lib, unb2b_board_lib, unb2b_board_10gbe_lib, dp_lib, tr_10GbE_lib, technology_lib, arts_unb1_sc4_lib;
+LIBRARY IEEE, common_lib, unb2b_board_lib, unb2b_board_10gbe_lib, dp_lib, tr_10GbE_lib, technology_lib, arts_unb1_sc4_lib, arts_tab_beamformer_lib, iquv_lib;
 USE IEEE.STD_LOGIC_1164.ALL;
 USE IEEE.NUMERIC_STD.ALL;
 USE common_lib.common_pkg.ALL;
@@ -51,18 +51,46 @@ ENTITY arts_unb2b_sc3_processing IS
     g_nof_beamlets    : NATURAL;
     g_nof_tabs        : NATURAL;
     g_iquv_nof_int    : NATURAL;
-    g_iquv_data_w_out : NATURAL;
+    g_iquv_data_w_out : NATURAL
    );
   PORT (
-    snk_in_2arr  :  IN t_dp_sosi_2arr_8(g_nof_cbsets-1 DOWNTO 0), -- 8 CB sets * 8 dishes
-    src_out_2arr : OUT t_dp_sosi_2arr_9(g_nof_cbsets-1 DOWNTO 0)  -- 8 CB sets * 9 TABs
+    dp_clk                       : IN    STD_LOGIC;
+    dp_rst                       : IN    STD_LOGIC;
+
+    mm_clk                       : IN    STD_LOGIC;
+    mm_rst                       : IN    STD_LOGIC;
+
+    snk_in_2arr_8                : IN  t_dp_sosi_2arr_8(g_nof_cbsets-1 DOWNTO 0); -- 8 CB sets * 8 dishes
+    src_out_2arr_9               : OUT t_dp_sosi_2arr_9(g_nof_cbsets-1 DOWNTO 0); -- 8 CB sets * 9 TABs
+
+    ram_arts_tab_beamformer_mosi : IN  t_mem_mosi;
+    ram_arts_tab_beamformer_miso : OUT t_mem_miso := c_mem_miso_rst    
   );
 END arts_unb2b_sc3_processing;
 
 
 ARCHITECTURE str OF arts_unb2b_sc3_processing IS
 
+  -------------------------------------------------------------------------------
+  -- arts_tab_beamformer
+  -------------------------------------------------------------------------------
+  SIGNAL arts_tab_beamformer_src_out_2arr_9  : t_dp_sosi_2arr_9(g_nof_cbsets-1 DOWNTO 0);
+
+  SIGNAL ram_arts_tab_beamformer_mosi_arr    : t_mem_mosi_arr(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL ram_arts_tab_beamformer_miso_arr    : t_mem_miso_arr(g_nof_cbsets-1 DOWNTO 0); 
+
+
+
+  -------------------------------------------------------------------------------
+  -- IQUV
+  -------------------------------------------------------------------------------
   CONSTANT c_iquv_data_w_in  : NATURAL := 2*g_data_w; --TAB BF output width --FIXME Do we really need 18b complex on 72 streams?
+  CONSTANT c_out_data_w_iquv : NATURAL := 8;
+ 
+  SIGNAL iquv_i_out_2arr_9      : t_dp_sosi_2arr_9(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL iquv_q_out_2arr_9      : t_dp_sosi_2arr_9(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL iquv_u_out_2arr_9      : t_dp_sosi_2arr_9(g_nof_cbsets-1 DOWNTO 0);
+  SIGNAL iquv_v_out_2arr_9      : t_dp_sosi_2arr_9(g_nof_cbsets-1 DOWNTO 0);
 
 BEGIN
 
@@ -70,11 +98,11 @@ BEGIN
   -- arts_tab_beamformer (8x):
   -- . Purpose:
   --   . Create 9 TABs per CB
-  -- . Input: snk_in_2arr
+  -- . Input: snk_in_2arr_8
   --   . [8 CB sets * 8 dishes] * [[5 CB][24 sb][12500 samples][64 channels][2 pols][18 bits] / 1.024s]
   --     (<--- 64 streams --->) * (<---------------- 187.5 Msps * 18b = 3.375 Gbps ------------------>)
   --     (<-------------------------- 64 streams * 3.375 Gbps = 216 Gbps ---------------------------->)
-  -- . Output: arts_tab_beamformer_src_out_2arr
+  -- . Output: arts_tab_beamformer_src_out_2arr_9
   --   . [8 CB sets * 9 TABs] * [[5 CB][24 sb][12500 samples][64 channels][2 pols][18 bits] / 1.024s]
   --     (<-- 72 streams -->) * (<---------------- 187.5 Msps * 18b = 3.375 Gbps ------------------>)
   --     (<-------------------------- 72 streams * 3.375 Gbps = 243 Gbps -------------------------->)
@@ -99,23 +127,36 @@ BEGIN
       ram_mosi    => ram_arts_tab_beamformer_mosi_arr(i),
       ram_miso    => ram_arts_tab_beamformer_miso_arr(i),
   
-      snk_in_arr  => snk_in_2arr(i),
-      src_out_arr => arts_tab_beamformer_src_out_2arr(i)
+      snk_in_arr  => snk_in_2arr_8(i),
+      src_out_arr => arts_tab_beamformer_src_out_2arr_9(i)
     );
   END GENERATE;
 
+  -- MM bus multiplexer
+  u_common_mem_mux : ENTITY common_lib.common_mem_mux
+  GENERIC MAP (    
+    g_nof_mosi    => g_nof_cbsets,
+    g_mult_addr_w => ceil_log2(2*g_nof_beamlets)
+  )
+  PORT MAP (
+    mosi     => ram_arts_tab_beamformer_mosi,
+    miso     => ram_arts_tab_beamformer_miso,
+    mosi_arr => ram_arts_tab_beamformer_mosi_arr,
+    miso_arr => ram_arts_tab_beamformer_miso_arr
+  );
+
   -------------------------------------------------------------------------------
   -- IQUV 
   -- . Purpose:
   --   . For each TAB, calculate IQUV + integrate 1/16
-  -- . Input: arts_tab_beamformer_src_out_2arr
-  -- . Output: src_out_2arr
+  -- . Input: arts_tab_beamformer_src_out_2arr_9
+  -- . Output: src_out_2arr_9
   --   . [8 CB sets * 9 TABs] * [[5 CB][24 sb][12500 samples][4 channels][4*8 bits] / 1.024s]
   --     (<-- 72 streams -->) * (<---------- 11.718750 Msps * 4*8b = 187.5 Mbps ----------->)
   --     (<--------------------- 72 streams * 187.5 Mbps = 13.5 Gbps ---------------------->)
   -------------------------------------------------------------------------------
-  gen_arts_tab_beamformer : FOR i IN 0 TO g_nof_cbsets-1 GENERATE
-    gen_iquv : FOR j IN 0 TO g_nof_tabs-1 GENERATE
+  gen_iquv : FOR i IN 0 TO g_nof_cbsets-1 GENERATE 
+    gen_j : FOR j IN 0 TO g_nof_tabs-1 GENERATE
       u_iquv : ENTITY iquv_lib.iquv
       GENERIC MAP (
         g_sim        => g_sim,
@@ -128,19 +169,19 @@ BEGIN
         dp_rst     => dp_rst,
         dp_clk     => dp_clk,
   
-        in_complex => arts_tab_beamformer_src_out_2arr(i)(j),
+        in_complex => arts_tab_beamformer_src_out_2arr_9(i)(j),
   
-        i_out      => src_out_2arr(i)(j),
-        q_out      => src_out_2arr(i)(j),
-        u_out      => src_out_2arr(i)(j),
-        v_out      => src_out_2arr(i)(j)
+        i_out      => iquv_i_out_2arr_9(i)(j),
+        q_out      => iquv_q_out_2arr_9(i)(j),
+        u_out      => iquv_u_out_2arr_9(i)(j),
+        v_out      => iquv_v_out_2arr_9(i)(j)
       );
   
-      src_out_2arr(i)(j).valid <= iquv_iab_i_out.valid;
-      src_out_2arr(i)(j).data(4*c_out_data_w_iquv-1 downto 0) <= iquv_v_out_arr(i)(j).data(c_out_data_w_iquv-1 downto 0)
-                                                               & iquv_u_out_arr(i)(j).data(c_out_data_w_iquv-1 downto 0)
-                                                               & iquv_q_out_arr(i)(j).data(c_out_data_w_iquv-1 downto 0)
-                                                               & iquv_i_out_arr(i)(j).data(c_out_data_w_iquv-1 downto 0);
+      src_out_2arr_9(i)(j).valid <= iquv_i_out_2arr_9(i)(0).valid;
+      src_out_2arr_9(i)(j).data(4*c_out_data_w_iquv-1 downto 0) <= iquv_v_out_2arr_9(i)(j).data(c_out_data_w_iquv-1 downto 0)
+                                                                 & iquv_u_out_2arr_9(i)(j).data(c_out_data_w_iquv-1 downto 0)
+                                                                 & iquv_q_out_2arr_9(i)(j).data(c_out_data_w_iquv-1 downto 0)
+                                                                 & iquv_i_out_2arr_9(i)(j).data(c_out_data_w_iquv-1 downto 0);
     END GENERATE;
   END GENERATE; 
 
diff --git a/boards/uniboard2b/libraries/unb2b_board_10gbe/src/vhdl/unb2_board_10gbe.vhd b/boards/uniboard2b/libraries/unb2b_board_10gbe/src/vhdl/unb2_board_10gbe.vhd
index 2697eca675..9d2f4bbb05 100644
--- a/boards/uniboard2b/libraries/unb2b_board_10gbe/src/vhdl/unb2_board_10gbe.vhd
+++ b/boards/uniboard2b/libraries/unb2b_board_10gbe/src/vhdl/unb2_board_10gbe.vhd
@@ -34,6 +34,7 @@ ENTITY unb2_board_10gbe IS
     g_sim_level              : NATURAL := 1; -- 0 = use IP; 1 = use fast serdes model
     g_technology             : NATURAL := c_tech_arria10;
     g_nof_macs               : NATURAL;
+    g_direction              : STRING := "TX_RX";  -- "TX_RX", "TX_ONLY", "RX_ONLY"
     g_tx_fifo_fill           : NATURAL := 10;    -- Release tx packet only when sufficiently data is available, 
     g_tx_fifo_size           : NATURAL := 256;   -- 2 * 32b * 256 = 2 M9K (DP interface has 64b data, so at least 2 M9K needed)
     g_rx_fifo_size           : NATURAL := 256;   -- 2 * 32b * 256 = 2 M9K (DP interface has 64b data, so at least 2 M9K needed)
@@ -99,6 +100,7 @@ BEGIN
       g_sim           => g_sim,
       g_sim_level     => 1,
       g_nof_macs      => g_nof_macs,
+      g_direction     => g_direction,
       g_tx_fifo_fill  => g_tx_fifo_fill,
       g_tx_fifo_size  => g_tx_fifo_size
     )
diff --git a/libraries/technology/10gbase_r/hdllib.cfg b/libraries/technology/10gbase_r/hdllib.cfg
index be50155fb5..7b331603b5 100644
--- a/libraries/technology/10gbase_r/hdllib.cfg
+++ b/libraries/technology/10gbase_r/hdllib.cfg
@@ -12,6 +12,9 @@ hdl_lib_uses_ip = ip_arria10_phy_10gbase_r                    ip_arria10_e3sge3_
                   ip_arria10_transceiver_reset_controller_12  ip_arria10_e3sge3_transceiver_reset_controller_12  ip_arria10_e1sg_transceiver_reset_controller_12
                   ip_arria10_transceiver_reset_controller_24  ip_arria10_e3sge3_transceiver_reset_controller_24  ip_arria10_e1sg_transceiver_reset_controller_24
                   ip_arria10_transceiver_reset_controller_48  ip_arria10_e3sge3_transceiver_reset_controller_48  ip_arria10_e1sg_transceiver_reset_controller_48
+                                                                                                                 ip_arria10_e1sg_phy_10gbase_r_3
+                                                                                                                 ip_arria10_e1sg_transceiver_reset_controller_3
+
 hdl_lib_uses_sim = 
 hdl_lib_technology = 
 hdl_lib_disclose_library_clause_names =            
@@ -38,12 +41,14 @@ hdl_lib_disclose_library_clause_names =
     ip_arria10_e3sge3_transceiver_reset_controller_24  ip_arria10_e3sge3_transceiver_reset_controller_24_altera_xcvr_reset_control_151
     ip_arria10_e3sge3_transceiver_reset_controller_48  ip_arria10_e3sge3_transceiver_reset_controller_48_altera_xcvr_reset_control_151
     ip_arria10_e1sg_phy_10gbase_r                      ip_arria10_e1sg_phy_10gbase_r_altera_xcvr_native_a10_151
+    ip_arria10_e1sg_phy_10gbase_r_3                    ip_arria10_e1sg_phy_10gbase_r_3_altera_xcvr_native_a10_170
     ip_arria10_e1sg_phy_10gbase_r_4                    ip_arria10_e1sg_phy_10gbase_r_4_altera_xcvr_native_a10_170
     ip_arria10_e1sg_phy_10gbase_r_12                   ip_arria10_e1sg_phy_10gbase_r_12_altera_xcvr_native_a10_170
     ip_arria10_e1sg_phy_10gbase_r_24                   ip_arria10_e1sg_phy_10gbase_r_24_altera_xcvr_native_a10_170
     ip_arria10_e1sg_phy_10gbase_r_48                   ip_arria10_e1sg_phy_10gbase_r_48_altera_xcvr_native_a10_170
     ip_arria10_e1sg_transceiver_pll_10g                ip_arria10_e1sg_transceiver_pll_10g_altera_xcvr_atx_pll_a10_170
     ip_arria10_e1sg_transceiver_reset_controller_1     ip_arria10_e1sg_transceiver_reset_controller_1_altera_xcvr_reset_control_170
+    ip_arria10_e1sg_transceiver_reset_controller_3     ip_arria10_e1sg_transceiver_reset_controller_3_altera_xcvr_reset_control_170
     ip_arria10_e1sg_transceiver_reset_controller_4     ip_arria10_e1sg_transceiver_reset_controller_4_altera_xcvr_reset_control_170
     ip_arria10_e1sg_transceiver_reset_controller_12    ip_arria10_e1sg_transceiver_reset_controller_12_altera_xcvr_reset_control_170
     ip_arria10_e1sg_transceiver_reset_controller_24    ip_arria10_e1sg_transceiver_reset_controller_24_altera_xcvr_reset_control_170
diff --git a/libraries/technology/10gbase_r/tech_10gbase_r_arria10_e1sg.vhd b/libraries/technology/10gbase_r/tech_10gbase_r_arria10_e1sg.vhd
index cb53d02d2b..a4bfba0a13 100644
--- a/libraries/technology/10gbase_r/tech_10gbase_r_arria10_e1sg.vhd
+++ b/libraries/technology/10gbase_r/tech_10gbase_r_arria10_e1sg.vhd
@@ -22,6 +22,7 @@
 
 -- Declare IP libraries to ensure default binding in simulation. The IP library clause is ignored by synthesis.
 LIBRARY ip_arria10_e1sg_phy_10gbase_r_altera_xcvr_native_a10_170;
+LIBRARY ip_arria10_e1sg_phy_10gbase_r_3_altera_xcvr_native_a10_170;
 LIBRARY ip_arria10_e1sg_phy_10gbase_r_4_altera_xcvr_native_a10_170;
 LIBRARY ip_arria10_e1sg_phy_10gbase_r_12_altera_xcvr_native_a10_170;
 LIBRARY ip_arria10_e1sg_phy_10gbase_r_24_altera_xcvr_native_a10_170;
@@ -214,7 +215,86 @@ BEGIN
     END GENERATE;
   END GENERATE;
 
+  gen_phy_3 : IF c_nof_channels_per_ip=3 GENERATE
+    tx_serial_clk_slv <= (OTHERS=>tx_serial_clk(0));
+    tr_coreclkin_slv  <= (OTHERS=>tr_coreclkin(0));
+    
+    gen_channels : FOR I IN 0 TO g_nof_channels-1 GENERATE
+      tx_parallel_data_arr_slv((I+1)*c_xgmii_data_w-1 DOWNTO I*c_xgmii_data_w) <= tx_parallel_data_arr(I);
+      tx_control_arr_slv((I+1)*c_xgmii_nof_lanes-1 DOWNTO I*c_xgmii_nof_lanes) <= tx_control_arr(I);
+      
+      rx_parallel_data_arr(I) <= rx_parallel_data_arr_slv((I+1)*c_xgmii_data_w-1 DOWNTO I*c_xgmii_data_w);
+      rx_control_arr(I) <= rx_control_arr_slv((I+1)*c_xgmii_nof_lanes-1 DOWNTO I*c_xgmii_nof_lanes);
+    END GENERATE; 
+
+    u_ip_arria10_e1sg_phy_10gbase_r_3 : ip_arria10_e1sg_phy_10gbase_r_3
+    PORT MAP (
+      tx_analogreset          => tx_analogreset_arr(IP_SIZE-1 DOWNTO 0),          -- in  std_logic_vector(11 downto 0)   := (others => '0'); --          tx_analogreset.tx_analogreset
+      tx_digitalreset         => tx_digitalreset_arr(IP_SIZE-1 DOWNTO 0),         -- in  std_logic_vector(11 downto 0)   := (others => '0'); --         tx_digitalreset.tx_digitalreset
+      rx_analogreset          => rx_analogreset_arr(IP_SIZE-1 DOWNTO 0),          -- in  std_logic_vector(11 downto 0)   := (others => '0'); --          rx_analogreset.rx_analogreset
+      rx_digitalreset         => rx_digitalreset_arr(IP_SIZE-1 DOWNTO 0),         -- in  std_logic_vector(11 downto 0)   := (others => '0'); --         rx_digitalreset.rx_digitalreset
+      tx_cal_busy             => tx_cal_busy_arr(IP_SIZE-1 DOWNTO 0),             -- out std_logic_vector(11 downto 0);                      --             tx_cal_busy.tx_cal_busy
+      rx_cal_busy             => rx_cal_busy_arr(IP_SIZE-1 DOWNTO 0),             -- out std_logic_vector(11 downto 0);                      --             rx_cal_busy.rx_cal_busy
+      
+      tx_serial_clk0          => tx_serial_clk_slv(IP_SIZE-1 DOWNTO 0),           -- in  std_logic_vector(11 downto 0)   := (others => '0'); --          tx_serial_clk0.clk
+      rx_cdr_refclk0          => tr_ref_clk_644,                                                -- in  std_logic                       := '0';             --          rx_cdr_refclk0.clk
+      tx_serial_data          => tx_serial_arr(IP_SIZE-1 DOWNTO 0),               -- out std_logic_vector(11 downto 0);                      --          tx_serial_data.tx_serial_data
+      rx_serial_data          => rx_serial_arr(IP_SIZE-1 DOWNTO 0),               -- in  std_logic_vector(11 downto 0)   := (others => '0'); --          rx_serial_data.rx_serial_data
+      
+      --rx_is_lockedtoref       : out std_logic_vector(11 downto 0);                      --       rx_is_lockedtoref.rx_is_lockedtoref
+      rx_is_lockedtodata      => rx_is_lockedtodata_arr(IP_SIZE-1 DOWNTO 0),      -- out std_logic_vector(11 downto 0);                      --      rx_is_lockedtodata.rx_is_lockedtodata
+      
+      tx_coreclkin            => tr_coreclkin_slv(IP_SIZE-1 DOWNTO 0),            -- in  std_logic_vector(11 downto 0)   := (others => '0'); --            tx_coreclkin.clk
+      rx_coreclkin            => tr_coreclkin_slv(IP_SIZE-1 DOWNTO 0),            -- in  std_logic_vector(11 downto 0)   := (others => '0'); --            rx_coreclkin.clk
+      
+      tx_parallel_data        => tx_parallel_data_arr_slv(IP_SIZE_DATA-1 DOWNTO 0),        -- in  std_logic_vector(1535 downto 0) := (others => '0'); --        tx_parallel_data.tx_parallel_data
+      rx_parallel_data        => rx_parallel_data_arr_slv(IP_SIZE_DATA-1 DOWNTO 0),        -- out std_logic_vector(1535 downto 0);                    --        rx_parallel_data.rx_parallel_data
+      tx_control              => tx_control_arr_slv(IP_SIZE_CONTROL-1 DOWNTO 0),        -- in  std_logic_vector(191 downto 0)  := (others => '0'); --              tx_control.tx_control
+      rx_control              => rx_control_arr_slv(IP_SIZE_CONTROL-1 DOWNTO 0)         -- out std_logic_vector(191 downto 0);                     --              rx_control.rx_control
+      
+      --tx_clkout               : out std_logic_vector(11 downto 0);                      --               tx_clkout.clk
+      --rx_clkout               : out std_logic_vector(11 downto 0);                      --               rx_clkout.clk
+      
+      --tx_err_ins              : in  std_logic_vector(11 downto 0)   := (others => '0'); --              tx_err_ins.tx_err_ins
+      --tx_enh_data_valid       : in  std_logic_vector(11 downto 0)   := (others => '0'); --       tx_enh_data_valid.tx_enh_data_valid
+      --tx_enh_fifo_empty       : out std_logic_vector(11 downto 0);                      --       tx_enh_fifo_empty.tx_enh_fifo_empty
+      --tx_enh_fifo_full        : out std_logic_vector(11 downto 0);                      --        tx_enh_fifo_full.tx_enh_fifo_full
+      --tx_enh_fifo_pempty      : out std_logic_vector(11 downto 0);                      --      tx_enh_fifo_pempty.tx_enh_fifo_pempty
+      --tx_enh_fifo_pfull       : out std_logic_vector(11 downto 0);                      --       tx_enh_fifo_pfull.tx_enh_fifo_pfull
+      --tx_pma_div_clkout       : out std_logic_vector(11 downto 0);                      --       tx_pma_div_clkout.clk
+      
+      --rx_enh_blk_lock         : out std_logic_vector(11 downto 0);                      --         rx_enh_blk_lock.rx_enh_blk_lock
+      --rx_enh_data_valid       : out std_logic_vector(11 downto 0);                      --       rx_enh_data_valid.rx_enh_data_valid
+      --rx_enh_fifo_del         : out std_logic_vector(11 downto 0);                      --         rx_enh_fifo_del.rx_enh_fifo_del
+      --rx_enh_fifo_empty       : out std_logic_vector(11 downto 0);                      --       rx_enh_fifo_empty.rx_enh_fifo_empty
+      --rx_enh_fifo_full        : out std_logic_vector(11 downto 0);                      --        rx_enh_fifo_full.rx_enh_fifo_full
+      --rx_enh_fifo_insert      : out std_logic_vector(11 downto 0);                      --      rx_enh_fifo_insert.rx_enh_fifo_insert
+      --rx_enh_highber          : out std_logic_vector(11 downto 0);                      --          rx_enh_highber.rx_enh_highber
+      
+      --unused_rx_control       : out std_logic_vector(287 downto 0);                     --       unused_rx_control.unused_rx_control
+      --unused_rx_parallel_data : out std_logic_vector(1535 downto 0);                    -- unused_rx_parallel_data.unused_rx_parallel_data
+      --unused_tx_control       : in  std_logic_vector(215 downto 0)  := (others => '0'); --       unused_tx_control.unused_tx_control
+      --unused_tx_parallel_data : in  std_logic_vector(1535 downto 0) := (others => '0')  -- unused_tx_parallel_data.unused_tx_parallel_data
+    );
 
+    u_ip_arria10_e1sg_transceiver_reset_controller_3 : ip_arria10_e1sg_transceiver_reset_controller_3
+    PORT MAP (
+      clock              => clk_156,                                                  -- : in  std_logic                     := '0';             --              clock.clk
+      pll_locked         => atx_pll_locked_arr(0 DOWNTO 0),                           -- : in  std_logic_vector(0 downto 0)  := (others => '0'); --         pll_locked.pll_locked
+      pll_powerdown      => atx_pll_powerdown_arr(0 DOWNTO 0),                        -- : out std_logic_vector(0 downto 0);                     --      pll_powerdown.pll_powerdown
+      pll_select         => "0",                                                      -- : in  std_logic_vector(0 downto 0)  := (others => '0'); --         pll_select.pll_select
+      reset              => rst_156,                                                  -- : in  std_logic                     := '0';             --              reset.reset
+      rx_analogreset     => rx_analogreset_arr(IP_SIZE-1 DOWNTO 0),     -- : out std_logic_vector(11 downto 0);                    --     rx_analogreset.rx_analogreset
+      rx_cal_busy        => rx_cal_busy_arr(IP_SIZE-1 DOWNTO 0),        -- : in  std_logic_vector(11 downto 0) := (others => '0'); --        rx_cal_busy.rx_cal_busy
+      rx_digitalreset    => rx_digitalreset_arr(IP_SIZE-1 DOWNTO 0),    -- : out std_logic_vector(11 downto 0);                    --    rx_digitalreset.rx_digitalreset
+      rx_is_lockedtodata => rx_is_lockedtodata_arr(IP_SIZE-1 DOWNTO 0), -- : in  std_logic_vector(11 downto 0) := (others => '0'); -- rx_is_lockedtodata.rx_is_lockedtodata
+      rx_ready           => xgmii_rx_ready_arr(IP_SIZE-1 DOWNTO 0),     -- : out std_logic_vector(11 downto 0);                    --           rx_ready.rx_ready
+      tx_analogreset     => tx_analogreset_arr(IP_SIZE-1 DOWNTO 0),     -- : out std_logic_vector(11 downto 0);                    --     tx_analogreset.tx_analogreset
+      tx_cal_busy        => cal_busy_arr(IP_SIZE-1 DOWNTO 0),           -- : in  std_logic_vector(11 downto 0) := (others => '0'); --        tx_cal_busy.tx_cal_busy
+      tx_digitalreset    => tx_digitalreset_arr(IP_SIZE-1 DOWNTO 0),    -- : out std_logic_vector(11 downto 0);                    --    tx_digitalreset.tx_digitalreset
+      tx_ready           => xgmii_tx_ready_arr(IP_SIZE-1 DOWNTO 0)      -- : out std_logic_vector(11 downto 0)                     --           tx_ready.tx_ready
+    );    
+  END GENERATE;
 
   gen_phy_4 : IF c_nof_channels_per_ip=4 GENERATE
     tx_serial_clk_slv <= (OTHERS=>tx_serial_clk(0));
@@ -227,7 +307,7 @@ BEGIN
       rx_parallel_data_arr(I) <= rx_parallel_data_arr_slv((I+1)*c_xgmii_data_w-1 DOWNTO I*c_xgmii_data_w);
       rx_control_arr(I) <= rx_control_arr_slv((I+1)*c_xgmii_nof_lanes-1 DOWNTO I*c_xgmii_nof_lanes);
     END GENERATE;
-    
+   
     u_ip_arria10_e1sg_phy_10gbase_r_4 : ip_arria10_e1sg_phy_10gbase_r_4
     PORT MAP (
       tx_analogreset          => tx_analogreset_arr(IP_SIZE-1 DOWNTO 0),          -- in  std_logic_vector(11 downto 0)   := (others => '0'); --          tx_analogreset.tx_analogreset
diff --git a/libraries/technology/10gbase_r/tech_10gbase_r_component_pkg.vhd b/libraries/technology/10gbase_r/tech_10gbase_r_component_pkg.vhd
index 498e0f9798..e53273e5bb 100644
--- a/libraries/technology/10gbase_r/tech_10gbase_r_component_pkg.vhd
+++ b/libraries/technology/10gbase_r/tech_10gbase_r_component_pkg.vhd
@@ -843,6 +843,61 @@ PACKAGE tech_10gbase_r_component_pkg IS
 		unused_tx_parallel_data : in  std_logic_vector(63 downto 0) := (others => '0')  -- unused_tx_parallel_data.unused_tx_parallel_data
 	);
   END COMPONENT;
+
+  component ip_arria10_e1sg_phy_10gbase_r_3 is
+  port (
+    reconfig_write          : in  std_logic_vector(0 downto 0)   := (others => 'X'); -- write
+    reconfig_read           : in  std_logic_vector(0 downto 0)   := (others => 'X'); -- read
+    reconfig_address        : in  std_logic_vector(11 downto 0)  := (others => 'X'); -- address
+    reconfig_writedata      : in  std_logic_vector(31 downto 0)  := (others => 'X'); -- writedata
+    reconfig_readdata       : out std_logic_vector(31 downto 0);                     -- readdata
+    reconfig_waitrequest    : out std_logic_vector(0 downto 0);                      -- waitrequest
+    reconfig_clk            : in  std_logic_vector(0 downto 0)   := (others => 'X'); -- clk
+    reconfig_reset          : in  std_logic_vector(0 downto 0)   := (others => 'X'); -- reset
+    rx_analogreset          : in  std_logic_vector(2 downto 0)   := (others => 'X'); -- rx_analogreset
+    rx_cal_busy             : out std_logic_vector(2 downto 0);                      -- rx_cal_busy
+    rx_cdr_refclk0          : in  std_logic                      := 'X';             -- clk
+    rx_clkout               : out std_logic_vector(2 downto 0);                      -- clk
+    rx_control              : out std_logic_vector(23 downto 0);                     -- rx_control
+    rx_coreclkin            : in  std_logic_vector(2 downto 0)   := (others => 'X'); -- clk
+    rx_digitalreset         : in  std_logic_vector(2 downto 0)   := (others => 'X'); -- rx_digitalreset
+    rx_enh_blk_lock         : out std_logic_vector(2 downto 0);                      -- rx_enh_blk_lock
+    rx_enh_data_valid       : out std_logic_vector(2 downto 0);                      -- rx_enh_data_valid
+    rx_enh_fifo_del         : out std_logic_vector(2 downto 0);                      -- rx_enh_fifo_del
+    rx_enh_fifo_empty       : out std_logic_vector(2 downto 0);                      -- rx_enh_fifo_empty
+    rx_enh_fifo_full        : out std_logic_vector(2 downto 0);                      -- rx_enh_fifo_full
+    rx_enh_fifo_insert      : out std_logic_vector(2 downto 0);                      -- rx_enh_fifo_insert
+    rx_enh_highber          : out std_logic_vector(2 downto 0);                      -- rx_enh_highber
+    rx_is_lockedtodata      : out std_logic_vector(2 downto 0);                      -- rx_is_lockedtodata
+    rx_is_lockedtoref       : out std_logic_vector(2 downto 0);                      -- rx_is_lockedtoref
+    rx_parallel_data        : out std_logic_vector(191 downto 0);                    -- rx_parallel_data
+    rx_prbs_done            : out std_logic_vector(2 downto 0);                      -- rx_prbs_done
+    rx_prbs_err             : out std_logic_vector(2 downto 0);                      -- rx_prbs_err
+    rx_prbs_err_clr         : in  std_logic_vector(2 downto 0)   := (others => 'X'); -- rx_prbs_err_clr
+    rx_serial_data          : in  std_logic_vector(2 downto 0)   := (others => 'X'); -- rx_serial_data
+    rx_seriallpbken         : in  std_logic_vector(2 downto 0)   := (others => 'X'); -- rx_seriallpbken
+    tx_analogreset          : in  std_logic_vector(2 downto 0)   := (others => 'X'); -- tx_analogreset
+    tx_cal_busy             : out std_logic_vector(2 downto 0);                      -- tx_cal_busy
+    tx_clkout               : out std_logic_vector(2 downto 0);                      -- clk
+    tx_control              : in  std_logic_vector(23 downto 0)  := (others => 'X'); -- tx_control
+    tx_coreclkin            : in  std_logic_vector(2 downto 0)   := (others => 'X'); -- clk
+    tx_digitalreset         : in  std_logic_vector(2 downto 0)   := (others => 'X'); -- tx_digitalreset
+    tx_enh_data_valid       : in  std_logic_vector(2 downto 0)   := (others => 'X'); -- tx_enh_data_valid
+    tx_enh_fifo_empty       : out std_logic_vector(2 downto 0);                      -- tx_enh_fifo_empty
+    tx_enh_fifo_full        : out std_logic_vector(2 downto 0);                      -- tx_enh_fifo_full
+    tx_enh_fifo_pempty      : out std_logic_vector(2 downto 0);                      -- tx_enh_fifo_pempty
+    tx_enh_fifo_pfull       : out std_logic_vector(2 downto 0);                      -- tx_enh_fifo_pfull
+    tx_err_ins              : in  std_logic_vector(2 downto 0)   := (others => 'X'); -- tx_err_ins
+    tx_parallel_data        : in  std_logic_vector(191 downto 0) := (others => 'X'); -- tx_parallel_data
+    tx_serial_clk0          : in  std_logic_vector(2 downto 0)   := (others => 'X'); -- clk
+    tx_serial_data          : out std_logic_vector(2 downto 0);                      -- tx_serial_data
+    unused_rx_control       : out std_logic_vector(35 downto 0);                     -- unused_rx_control
+    unused_rx_parallel_data : out std_logic_vector(191 downto 0);                    -- unused_rx_parallel_data
+    unused_tx_control       : in  std_logic_vector(26 downto 0)  := (others => 'X'); -- unused_tx_control
+    unused_tx_parallel_data : in  std_logic_vector(191 downto 0) := (others => 'X')  -- unused_tx_parallel_data
+  );
+ end component ip_arria10_e1sg_phy_10gbase_r_3;
+
   
   COMPONENT ip_arria10_e1sg_phy_10gbase_r_4
   port (
@@ -1105,6 +1160,25 @@ PACKAGE tech_10gbase_r_component_pkg IS
   );
   END COMPONENT;
 
+  component ip_arria10_e1sg_transceiver_reset_controller_3 is
+    port (
+      clock              : in  std_logic                    := 'X';             -- clk
+      pll_locked         : in  std_logic_vector(0 downto 0) := (others => 'X'); -- pll_locked
+      pll_powerdown      : out std_logic_vector(0 downto 0);                    -- pll_powerdown
+      pll_select         : in  std_logic_vector(0 downto 0) := (others => 'X'); -- pll_select
+      reset              : in  std_logic                    := 'X';             -- reset
+      rx_analogreset     : out std_logic_vector(2 downto 0);                    -- rx_analogreset
+      rx_cal_busy        : in  std_logic_vector(2 downto 0) := (others => 'X'); -- rx_cal_busy
+      rx_digitalreset    : out std_logic_vector(2 downto 0);                    -- rx_digitalreset
+      rx_is_lockedtodata : in  std_logic_vector(2 downto 0) := (others => 'X'); -- rx_is_lockedtodata
+      rx_ready           : out std_logic_vector(2 downto 0);                    -- rx_ready
+      tx_analogreset     : out std_logic_vector(2 downto 0);                    -- tx_analogreset
+      tx_cal_busy        : in  std_logic_vector(2 downto 0) := (others => 'X'); -- tx_cal_busy
+      tx_digitalreset    : out std_logic_vector(2 downto 0);                    -- tx_digitalreset
+      tx_ready           : out std_logic_vector(2 downto 0)                     -- tx_ready
+    );
+  end component ip_arria10_e1sg_transceiver_reset_controller_3;
+
   COMPONENT ip_arria10_e1sg_transceiver_reset_controller_4
   port (
     clock              : in  std_logic                    := '0';             --              clock.clk
diff --git a/libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/compile_ip.tcl b/libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/compile_ip.tcl
new file mode 100644
index 0000000000..ee72e73fa0
--- /dev/null
+++ b/libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/compile_ip.tcl
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (C) 2017
+# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+# JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/>
+# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+#------------------------------------------------------------------------------
+
+# This file is based on generated file mentor/msim_setup.tcl.
+# - the values for modelsim_search_libraries key in the hdllib.cfg follow from altera libraries vmap section in the msim_setup.tcl
+# - vmap for the IP specific libraries and compile all IP source files into those libraries similar as in the msim_setup.tcl
+# - replace QSYS_SIMDIR by IP_DIR
+# - if the testbench is also generated with QSYS then only the IP_TBDIR files are needed, because these also contain the source files.
+
+#vlib ./work/         ;# Assume library work already exist                                                                                        
+
+
+set IP_DIR   "$env(RADIOHDL)/libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/generated/sim"
+
+   
+  vcom         "$IP_DIR/ip_arria10_e1sg_phy_10gbase_r_3.vhd"                                                                                               
diff --git a/libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/generate_ip.sh b/libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/generate_ip.sh
new file mode 100755
index 0000000000..3240ee8311
--- /dev/null
+++ b/libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/generate_ip.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+# -------------------------------------------------------------------------- #
+#
+# Copyright (C) 2014                                                        
+# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+# JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/>           
+# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands                             
+#                                                                           
+# This program is free software: you can redistribute it and/or modify      
+# it under the terms of the GNU General Public License as published by      
+# the Free Software Foundation, either version 3 of the License, or         
+# (at your option) any later version.                                       
+#                                                                           
+# This program is distributed in the hope that it will be useful,           
+# but WITHOUT ANY WARRANTY; without even the implied warranty of            
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             
+# GNU General Public License for more details.                              
+#                                                                           
+# You should have received a copy of the GNU General Public License         
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#
+# -------------------------------------------------------------------------- #
+#
+# Purpose: Generate IP with Qsys
+# Description:
+#   Generate the IP in a separate generated/ subdirectory.
+#
+# Usage:
+#
+#   ./generate_ip.sh
+#
+
+# Tool settings for selected target "unb2" with arria10
+. ${RADIOHDL}/tools/quartus/set_quartus unb2b
+
+#qsys-generate --help
+
+# Only generate the source IP
+# - use --synthesis=VHDL to have top level in VHDL similar as with MegaWizard
+qsys-generate ip_arria10_e1sg_phy_10gbase_r_3.qsys \
+              --synthesis=VHDL \
+              --simulation=VHDL \
+              --output-directory=generated \
+              --allow-mixed-language-simulation
diff --git a/libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/hdllib.cfg b/libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/hdllib.cfg
new file mode 100644
index 0000000000..54dc096906
--- /dev/null
+++ b/libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/hdllib.cfg
@@ -0,0 +1,19 @@
+hdl_lib_name = ip_arria10_e1sg_phy_10gbase_r_3
+hdl_library_clause_name = ip_arria10_e1sg_phy_10gbase_r_3_altera_xcvr_native_a10_170
+hdl_lib_uses_synth = 
+hdl_lib_uses_sim = ip_arria10_e1sg_altera_xcvr_native_a10_170
+hdl_lib_technology = ip_arria10_e1sg
+
+synth_files =
+    
+test_bench_files = 
+
+
+[modelsim_project_file]
+modelsim_compile_ip_files =
+    $RADIOHDL/libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/compile_ip.tcl
+
+
+[quartus_project_file]
+quartus_qip_files =
+    generated/ip_arria10_e1sg_phy_10gbase_r_3.qip
diff --git a/libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/ip_arria10_e1sg_phy_10gbase_r_3.qsys b/libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/ip_arria10_e1sg_phy_10gbase_r_3.qsys
new file mode 100644
index 0000000000..8eebf9a668
--- /dev/null
+++ b/libraries/technology/ip_arria10_e1sg/phy_10gbase_r_3/ip_arria10_e1sg_phy_10gbase_r_3.qsys
@@ -0,0 +1,628 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<system name="ip_arria10_e1sg_phy_10gbase_r_3">
+ <component
+   name="$${FILENAME}"
+   displayName="$${FILENAME}"
+   version="1.0"
+   description=""
+   tags="INTERNAL_COMPONENT=true"
+   categories="System"
+   tool="QsysStandard" />
+ <parameter name="bonusData"><![CDATA[bonusData 
+{
+   element xcvr_native_a10_0
+   {
+      datum _sortIndex
+      {
+         value = "0";
+         type = "int";
+      }
+   }
+}
+]]></parameter>
+ <parameter name="clockCrossingAdapter" value="HANDSHAKE" />
+ <parameter name="device" value="10AX115U2F45E1SG" />
+ <parameter name="deviceFamily" value="Arria 10" />
+ <parameter name="deviceSpeedGrade" value="1" />
+ <parameter name="fabricMode" value="QSYS" />
+ <parameter name="generateLegacySim" value="false" />
+ <parameter name="generationId" value="0" />
+ <parameter name="globalResetBus" value="false" />
+ <parameter name="hdlLanguage" value="VERILOG" />
+ <parameter name="hideFromIPCatalog" value="true" />
+ <parameter name="lockedInterfaceDefinition" value="" />
+ <parameter name="maxAdditionalLatency" value="1" />
+ <parameter name="sopcBorderPoints" value="false" />
+ <parameter name="systemHash" value="0" />
+ <parameter name="systemInfos"><![CDATA[<systemInfosDefinition>
+    <connPtSystemInfos/>
+</systemInfosDefinition>]]></parameter>
+ <parameter name="systemScripts" value="" />
+ <parameter name="testBenchDutName" value="" />
+ <parameter name="timeStamp" value="0" />
+ <parameter name="useTestBenchNamingPattern" value="false" />
+ <instanceScript></instanceScript>
+ <interface
+   name="reconfig_avmm"
+   internal="xcvr_native_a10_0.reconfig_avmm"
+   type="conduit"
+   dir="end">
+  <port name="reconfig_address" internal="reconfig_address" />
+  <port name="reconfig_read" internal="reconfig_read" />
+  <port name="reconfig_readdata" internal="reconfig_readdata" />
+  <port name="reconfig_waitrequest" internal="reconfig_waitrequest" />
+  <port name="reconfig_write" internal="reconfig_write" />
+  <port name="reconfig_writedata" internal="reconfig_writedata" />
+ </interface>
+ <interface
+   name="reconfig_clk"
+   internal="xcvr_native_a10_0.reconfig_clk"
+   type="conduit"
+   dir="end">
+  <port name="reconfig_clk" internal="reconfig_clk" />
+ </interface>
+ <interface
+   name="reconfig_reset"
+   internal="xcvr_native_a10_0.reconfig_reset"
+   type="conduit"
+   dir="end">
+  <port name="reconfig_reset" internal="reconfig_reset" />
+ </interface>
+ <interface
+   name="rx_analogreset"
+   internal="xcvr_native_a10_0.rx_analogreset"
+   type="conduit"
+   dir="end">
+  <port name="rx_analogreset" internal="rx_analogreset" />
+ </interface>
+ <interface
+   name="rx_cal_busy"
+   internal="xcvr_native_a10_0.rx_cal_busy"
+   type="conduit"
+   dir="end">
+  <port name="rx_cal_busy" internal="rx_cal_busy" />
+ </interface>
+ <interface
+   name="rx_cdr_refclk0"
+   internal="xcvr_native_a10_0.rx_cdr_refclk0"
+   type="conduit"
+   dir="end">
+  <port name="rx_cdr_refclk0" internal="rx_cdr_refclk0" />
+ </interface>
+ <interface
+   name="rx_clkout"
+   internal="xcvr_native_a10_0.rx_clkout"
+   type="conduit"
+   dir="end">
+  <port name="rx_clkout" internal="rx_clkout" />
+ </interface>
+ <interface
+   name="rx_control"
+   internal="xcvr_native_a10_0.rx_control"
+   type="conduit"
+   dir="end">
+  <port name="rx_control" internal="rx_control" />
+ </interface>
+ <interface
+   name="rx_coreclkin"
+   internal="xcvr_native_a10_0.rx_coreclkin"
+   type="conduit"
+   dir="end">
+  <port name="rx_coreclkin" internal="rx_coreclkin" />
+ </interface>
+ <interface
+   name="rx_digitalreset"
+   internal="xcvr_native_a10_0.rx_digitalreset"
+   type="conduit"
+   dir="end">
+  <port name="rx_digitalreset" internal="rx_digitalreset" />
+ </interface>
+ <interface
+   name="rx_enh_blk_lock"
+   internal="xcvr_native_a10_0.rx_enh_blk_lock"
+   type="conduit"
+   dir="end">
+  <port name="rx_enh_blk_lock" internal="rx_enh_blk_lock" />
+ </interface>
+ <interface
+   name="rx_enh_data_valid"
+   internal="xcvr_native_a10_0.rx_enh_data_valid"
+   type="conduit"
+   dir="end">
+  <port name="rx_enh_data_valid" internal="rx_enh_data_valid" />
+ </interface>
+ <interface
+   name="rx_enh_fifo_del"
+   internal="xcvr_native_a10_0.rx_enh_fifo_del"
+   type="conduit"
+   dir="end">
+  <port name="rx_enh_fifo_del" internal="rx_enh_fifo_del" />
+ </interface>
+ <interface
+   name="rx_enh_fifo_empty"
+   internal="xcvr_native_a10_0.rx_enh_fifo_empty"
+   type="conduit"
+   dir="end">
+  <port name="rx_enh_fifo_empty" internal="rx_enh_fifo_empty" />
+ </interface>
+ <interface
+   name="rx_enh_fifo_full"
+   internal="xcvr_native_a10_0.rx_enh_fifo_full"
+   type="conduit"
+   dir="end">
+  <port name="rx_enh_fifo_full" internal="rx_enh_fifo_full" />
+ </interface>
+ <interface
+   name="rx_enh_fifo_insert"
+   internal="xcvr_native_a10_0.rx_enh_fifo_insert"
+   type="conduit"
+   dir="end">
+  <port name="rx_enh_fifo_insert" internal="rx_enh_fifo_insert" />
+ </interface>
+ <interface
+   name="rx_enh_highber"
+   internal="xcvr_native_a10_0.rx_enh_highber"
+   type="conduit"
+   dir="end">
+  <port name="rx_enh_highber" internal="rx_enh_highber" />
+ </interface>
+ <interface
+   name="rx_is_lockedtodata"
+   internal="xcvr_native_a10_0.rx_is_lockedtodata"
+   type="conduit"
+   dir="end">
+  <port name="rx_is_lockedtodata" internal="rx_is_lockedtodata" />
+ </interface>
+ <interface
+   name="rx_is_lockedtoref"
+   internal="xcvr_native_a10_0.rx_is_lockedtoref"
+   type="conduit"
+   dir="end">
+  <port name="rx_is_lockedtoref" internal="rx_is_lockedtoref" />
+ </interface>
+ <interface
+   name="rx_parallel_data"
+   internal="xcvr_native_a10_0.rx_parallel_data"
+   type="conduit"
+   dir="end">
+  <port name="rx_parallel_data" internal="rx_parallel_data" />
+ </interface>
+ <interface
+   name="rx_prbs_done"
+   internal="xcvr_native_a10_0.rx_prbs_done"
+   type="conduit"
+   dir="end">
+  <port name="rx_prbs_done" internal="rx_prbs_done" />
+ </interface>
+ <interface
+   name="rx_prbs_err"
+   internal="xcvr_native_a10_0.rx_prbs_err"
+   type="conduit"
+   dir="end">
+  <port name="rx_prbs_err" internal="rx_prbs_err" />
+ </interface>
+ <interface
+   name="rx_prbs_err_clr"
+   internal="xcvr_native_a10_0.rx_prbs_err_clr"
+   type="conduit"
+   dir="end">
+  <port name="rx_prbs_err_clr" internal="rx_prbs_err_clr" />
+ </interface>
+ <interface
+   name="rx_serial_data"
+   internal="xcvr_native_a10_0.rx_serial_data"
+   type="conduit"
+   dir="end">
+  <port name="rx_serial_data" internal="rx_serial_data" />
+ </interface>
+ <interface
+   name="rx_seriallpbken"
+   internal="xcvr_native_a10_0.rx_seriallpbken"
+   type="conduit"
+   dir="end">
+  <port name="rx_seriallpbken" internal="rx_seriallpbken" />
+ </interface>
+ <interface
+   name="tx_analogreset"
+   internal="xcvr_native_a10_0.tx_analogreset"
+   type="conduit"
+   dir="end">
+  <port name="tx_analogreset" internal="tx_analogreset" />
+ </interface>
+ <interface
+   name="tx_cal_busy"
+   internal="xcvr_native_a10_0.tx_cal_busy"
+   type="conduit"
+   dir="end">
+  <port name="tx_cal_busy" internal="tx_cal_busy" />
+ </interface>
+ <interface
+   name="tx_clkout"
+   internal="xcvr_native_a10_0.tx_clkout"
+   type="conduit"
+   dir="end">
+  <port name="tx_clkout" internal="tx_clkout" />
+ </interface>
+ <interface
+   name="tx_control"
+   internal="xcvr_native_a10_0.tx_control"
+   type="conduit"
+   dir="end">
+  <port name="tx_control" internal="tx_control" />
+ </interface>
+ <interface
+   name="tx_coreclkin"
+   internal="xcvr_native_a10_0.tx_coreclkin"
+   type="conduit"
+   dir="end">
+  <port name="tx_coreclkin" internal="tx_coreclkin" />
+ </interface>
+ <interface
+   name="tx_digitalreset"
+   internal="xcvr_native_a10_0.tx_digitalreset"
+   type="conduit"
+   dir="end">
+  <port name="tx_digitalreset" internal="tx_digitalreset" />
+ </interface>
+ <interface
+   name="tx_enh_data_valid"
+   internal="xcvr_native_a10_0.tx_enh_data_valid"
+   type="conduit"
+   dir="end">
+  <port name="tx_enh_data_valid" internal="tx_enh_data_valid" />
+ </interface>
+ <interface
+   name="tx_enh_fifo_empty"
+   internal="xcvr_native_a10_0.tx_enh_fifo_empty"
+   type="conduit"
+   dir="end">
+  <port name="tx_enh_fifo_empty" internal="tx_enh_fifo_empty" />
+ </interface>
+ <interface
+   name="tx_enh_fifo_full"
+   internal="xcvr_native_a10_0.tx_enh_fifo_full"
+   type="conduit"
+   dir="end">
+  <port name="tx_enh_fifo_full" internal="tx_enh_fifo_full" />
+ </interface>
+ <interface
+   name="tx_enh_fifo_pempty"
+   internal="xcvr_native_a10_0.tx_enh_fifo_pempty"
+   type="conduit"
+   dir="end">
+  <port name="tx_enh_fifo_pempty" internal="tx_enh_fifo_pempty" />
+ </interface>
+ <interface
+   name="tx_enh_fifo_pfull"
+   internal="xcvr_native_a10_0.tx_enh_fifo_pfull"
+   type="conduit"
+   dir="end">
+  <port name="tx_enh_fifo_pfull" internal="tx_enh_fifo_pfull" />
+ </interface>
+ <interface
+   name="tx_err_ins"
+   internal="xcvr_native_a10_0.tx_err_ins"
+   type="conduit"
+   dir="end">
+  <port name="tx_err_ins" internal="tx_err_ins" />
+ </interface>
+ <interface
+   name="tx_parallel_data"
+   internal="xcvr_native_a10_0.tx_parallel_data"
+   type="conduit"
+   dir="end">
+  <port name="tx_parallel_data" internal="tx_parallel_data" />
+ </interface>
+ <interface name="tx_pma_clkout" internal="xcvr_native_a10_0.tx_pma_clkout" />
+ <interface
+   name="tx_pma_div_clkout"
+   internal="xcvr_native_a10_0.tx_pma_div_clkout" />
+ <interface
+   name="tx_serial_clk0"
+   internal="xcvr_native_a10_0.tx_serial_clk0"
+   type="conduit"
+   dir="end">
+  <port name="tx_serial_clk0" internal="tx_serial_clk0" />
+ </interface>
+ <interface
+   name="tx_serial_data"
+   internal="xcvr_native_a10_0.tx_serial_data"
+   type="conduit"
+   dir="end">
+  <port name="tx_serial_data" internal="tx_serial_data" />
+ </interface>
+ <interface
+   name="unused_rx_control"
+   internal="xcvr_native_a10_0.unused_rx_control"
+   type="conduit"
+   dir="end">
+  <port name="unused_rx_control" internal="unused_rx_control" />
+ </interface>
+ <interface
+   name="unused_rx_parallel_data"
+   internal="xcvr_native_a10_0.unused_rx_parallel_data"
+   type="conduit"
+   dir="end">
+  <port name="unused_rx_parallel_data" internal="unused_rx_parallel_data" />
+ </interface>
+ <interface
+   name="unused_tx_control"
+   internal="xcvr_native_a10_0.unused_tx_control"
+   type="conduit"
+   dir="end">
+  <port name="unused_tx_control" internal="unused_tx_control" />
+ </interface>
+ <interface
+   name="unused_tx_parallel_data"
+   internal="xcvr_native_a10_0.unused_tx_parallel_data"
+   type="conduit"
+   dir="end">
+  <port name="unused_tx_parallel_data" internal="unused_tx_parallel_data" />
+ </interface>
+ <module
+   name="xcvr_native_a10_0"
+   kind="altera_xcvr_native_a10"
+   version="17.0"
+   enabled="1"
+   autoexport="1">
+  <parameter name="anlg_enable_rx_default_ovr" value="0" />
+  <parameter name="anlg_enable_tx_default_ovr" value="0" />
+  <parameter name="anlg_link" value="sr" />
+  <parameter name="anlg_rx_adp_ctle_acgain_4s">radp_ctle_acgain_4s_1</parameter>
+  <parameter name="anlg_rx_adp_ctle_eqz_1s_sel">radp_ctle_eqz_1s_sel_3</parameter>
+  <parameter name="anlg_rx_adp_dfe_fxtap1" value="radp_dfe_fxtap1_0" />
+  <parameter name="anlg_rx_adp_dfe_fxtap10" value="radp_dfe_fxtap10_0" />
+  <parameter name="anlg_rx_adp_dfe_fxtap11" value="radp_dfe_fxtap11_0" />
+  <parameter name="anlg_rx_adp_dfe_fxtap2" value="radp_dfe_fxtap2_0" />
+  <parameter name="anlg_rx_adp_dfe_fxtap3" value="radp_dfe_fxtap3_0" />
+  <parameter name="anlg_rx_adp_dfe_fxtap4" value="radp_dfe_fxtap4_0" />
+  <parameter name="anlg_rx_adp_dfe_fxtap5" value="radp_dfe_fxtap5_0" />
+  <parameter name="anlg_rx_adp_dfe_fxtap6" value="radp_dfe_fxtap6_0" />
+  <parameter name="anlg_rx_adp_dfe_fxtap7" value="radp_dfe_fxtap7_0" />
+  <parameter name="anlg_rx_adp_dfe_fxtap8" value="radp_dfe_fxtap8_0" />
+  <parameter name="anlg_rx_adp_dfe_fxtap9" value="radp_dfe_fxtap9_0" />
+  <parameter name="anlg_rx_adp_vga_sel" value="radp_vga_sel_2" />
+  <parameter name="anlg_rx_eq_dc_gain_trim" value="stg2_gain7" />
+  <parameter name="anlg_rx_one_stage_enable" value="s1_mode" />
+  <parameter name="anlg_rx_term_sel" value="r_r1" />
+  <parameter name="anlg_tx_analog_mode" value="user_custom" />
+  <parameter name="anlg_tx_compensation_en" value="enable" />
+  <parameter name="anlg_tx_pre_emp_sign_1st_post_tap" value="fir_post_1t_neg" />
+  <parameter name="anlg_tx_pre_emp_sign_2nd_post_tap" value="fir_post_2t_neg" />
+  <parameter name="anlg_tx_pre_emp_sign_pre_tap_1t" value="fir_pre_1t_neg" />
+  <parameter name="anlg_tx_pre_emp_sign_pre_tap_2t" value="fir_pre_2t_neg" />
+  <parameter name="anlg_tx_pre_emp_switching_ctrl_1st_post_tap" value="0" />
+  <parameter name="anlg_tx_pre_emp_switching_ctrl_2nd_post_tap" value="0" />
+  <parameter name="anlg_tx_pre_emp_switching_ctrl_pre_tap_1t" value="0" />
+  <parameter name="anlg_tx_pre_emp_switching_ctrl_pre_tap_2t" value="0" />
+  <parameter name="anlg_tx_slew_rate_ctrl" value="slew_r7" />
+  <parameter name="anlg_tx_term_sel" value="r_r1" />
+  <parameter name="anlg_tx_vod_output_swing_ctrl" value="0" />
+  <parameter name="anlg_voltage" value="1_1V" />
+  <parameter name="base_device" value="NIGHTFURY5" />
+  <parameter name="bonded_mode" value="not_bonded" />
+  <parameter name="cdr_refclk_cnt" value="1" />
+  <parameter name="cdr_refclk_select" value="0" />
+  <parameter name="channels" value="3" />
+  <parameter name="design_environment" value="NATIVE" />
+  <parameter name="device" value="10AX115U2F45E1SG" />
+  <parameter name="device_family" value="Arria 10" />
+  <parameter name="disable_continuous_dfe" value="false" />
+  <parameter name="duplex_mode" value="duplex" />
+  <parameter name="enable_analog_settings" value="0" />
+  <parameter name="enable_hard_reset" value="0" />
+  <parameter name="enable_hip" value="0" />
+  <parameter name="enable_parallel_loopback" value="0" />
+  <parameter name="enable_pcie_data_mask_option" value="0" />
+  <parameter name="enable_pcie_dfe_ip" value="false" />
+  <parameter name="enable_port_krfec_rx_enh_frame" value="0" />
+  <parameter name="enable_port_krfec_rx_enh_frame_diag_status" value="0" />
+  <parameter name="enable_port_krfec_tx_enh_frame" value="0" />
+  <parameter name="enable_port_pipe_rx_polarity" value="0" />
+  <parameter name="enable_port_rx_analog_reset_ack" value="0" />
+  <parameter name="enable_port_rx_enh_bitslip" value="0" />
+  <parameter name="enable_port_rx_enh_blk_lock" value="1" />
+  <parameter name="enable_port_rx_enh_clr_errblk_count" value="0" />
+  <parameter name="enable_port_rx_enh_crc32_err" value="0" />
+  <parameter name="enable_port_rx_enh_data_valid" value="1" />
+  <parameter name="enable_port_rx_enh_fifo_align_clr" value="0" />
+  <parameter name="enable_port_rx_enh_fifo_align_val" value="0" />
+  <parameter name="enable_port_rx_enh_fifo_cnt" value="0" />
+  <parameter name="enable_port_rx_enh_fifo_del" value="1" />
+  <parameter name="enable_port_rx_enh_fifo_empty" value="1" />
+  <parameter name="enable_port_rx_enh_fifo_full" value="1" />
+  <parameter name="enable_port_rx_enh_fifo_insert" value="1" />
+  <parameter name="enable_port_rx_enh_fifo_pempty" value="0" />
+  <parameter name="enable_port_rx_enh_fifo_pfull" value="0" />
+  <parameter name="enable_port_rx_enh_fifo_rd_en" value="0" />
+  <parameter name="enable_port_rx_enh_frame" value="0" />
+  <parameter name="enable_port_rx_enh_frame_diag_status" value="0" />
+  <parameter name="enable_port_rx_enh_frame_lock" value="0" />
+  <parameter name="enable_port_rx_enh_highber" value="1" />
+  <parameter name="enable_port_rx_enh_highber_clr_cnt" value="0" />
+  <parameter name="enable_port_rx_is_lockedtodata" value="1" />
+  <parameter name="enable_port_rx_is_lockedtoref" value="1" />
+  <parameter name="enable_port_rx_pma_clkout" value="0" />
+  <parameter name="enable_port_rx_pma_clkslip" value="0" />
+  <parameter name="enable_port_rx_pma_div_clkout" value="0" />
+  <parameter name="enable_port_rx_pma_iqtxrx_clkout" value="0" />
+  <parameter name="enable_port_rx_pma_qpipulldn" value="0" />
+  <parameter name="enable_port_rx_polinv" value="0" />
+  <parameter name="enable_port_rx_seriallpbken" value="1" />
+  <parameter name="enable_port_rx_seriallpbken_tx" value="1" />
+  <parameter name="enable_port_rx_signaldetect" value="0" />
+  <parameter name="enable_port_rx_std_bitrev_ena" value="0" />
+  <parameter name="enable_port_rx_std_bitslip" value="0" />
+  <parameter name="enable_port_rx_std_bitslipboundarysel" value="0" />
+  <parameter name="enable_port_rx_std_byterev_ena" value="0" />
+  <parameter name="enable_port_rx_std_pcfifo_empty" value="0" />
+  <parameter name="enable_port_rx_std_pcfifo_full" value="0" />
+  <parameter name="enable_port_rx_std_rmfifo_empty" value="0" />
+  <parameter name="enable_port_rx_std_rmfifo_full" value="0" />
+  <parameter name="enable_port_rx_std_signaldetect" value="0" />
+  <parameter name="enable_port_rx_std_wa_a1a2size" value="0" />
+  <parameter name="enable_port_rx_std_wa_patternalign" value="0" />
+  <parameter name="enable_port_tx_analog_reset_ack" value="0" />
+  <parameter name="enable_port_tx_enh_bitslip" value="0" />
+  <parameter name="enable_port_tx_enh_fifo_cnt" value="0" />
+  <parameter name="enable_port_tx_enh_fifo_empty" value="1" />
+  <parameter name="enable_port_tx_enh_fifo_full" value="1" />
+  <parameter name="enable_port_tx_enh_fifo_pempty" value="1" />
+  <parameter name="enable_port_tx_enh_fifo_pfull" value="1" />
+  <parameter name="enable_port_tx_enh_frame" value="0" />
+  <parameter name="enable_port_tx_enh_frame_burst_en" value="0" />
+  <parameter name="enable_port_tx_enh_frame_diag_status" value="0" />
+  <parameter name="enable_port_tx_pma_clkout" value="0" />
+  <parameter name="enable_port_tx_pma_div_clkout" value="0" />
+  <parameter name="enable_port_tx_pma_elecidle" value="0" />
+  <parameter name="enable_port_tx_pma_iqtxrx_clkout" value="0" />
+  <parameter name="enable_port_tx_pma_qpipulldn" value="0" />
+  <parameter name="enable_port_tx_pma_qpipullup" value="0" />
+  <parameter name="enable_port_tx_pma_rxfound" value="0" />
+  <parameter name="enable_port_tx_pma_txdetectrx" value="0" />
+  <parameter name="enable_port_tx_polinv" value="0" />
+  <parameter name="enable_port_tx_std_bitslipboundarysel" value="0" />
+  <parameter name="enable_port_tx_std_pcfifo_empty" value="0" />
+  <parameter name="enable_port_tx_std_pcfifo_full" value="0" />
+  <parameter name="enable_ports_adaptation" value="0" />
+  <parameter name="enable_ports_pipe_g3_analog" value="0" />
+  <parameter name="enable_ports_pipe_hclk" value="0" />
+  <parameter name="enable_ports_pipe_rx_elecidle" value="0" />
+  <parameter name="enable_ports_pipe_sw" value="0" />
+  <parameter name="enable_ports_rx_manual_cdr_mode" value="0" />
+  <parameter name="enable_ports_rx_manual_ppm" value="0" />
+  <parameter name="enable_ports_rx_prbs" value="1" />
+  <parameter name="enable_simple_interface" value="1" />
+  <parameter name="enable_skp_ports" value="0" />
+  <parameter name="enable_split_interface" value="0" />
+  <parameter name="enable_transparent_pcs" value="0" />
+  <parameter name="enable_upi_pipeline_options" value="0" />
+  <parameter name="enh_low_latency_enable" value="0" />
+  <parameter name="enh_pcs_pma_width" value="32" />
+  <parameter name="enh_pld_pcs_width" value="66" />
+  <parameter name="enh_rx_64b66b_enable" value="1" />
+  <parameter name="enh_rx_bitslip_enable" value="0" />
+  <parameter name="enh_rx_blksync_enable" value="1" />
+  <parameter name="enh_rx_crcchk_enable" value="0" />
+  <parameter name="enh_rx_descram_enable" value="1" />
+  <parameter name="enh_rx_dispchk_enable" value="0" />
+  <parameter name="enh_rx_frmsync_enable" value="0" />
+  <parameter name="enh_rx_frmsync_mfrm_length" value="2048" />
+  <parameter name="enh_rx_krfec_err_mark_enable" value="0" />
+  <parameter name="enh_rx_krfec_err_mark_type" value="10G" />
+  <parameter name="enh_rx_polinv_enable" value="0" />
+  <parameter name="enh_rxfifo_align_del" value="0" />
+  <parameter name="enh_rxfifo_control_del" value="0" />
+  <parameter name="enh_rxfifo_mode" value="10GBase-R" />
+  <parameter name="enh_rxfifo_pempty" value="2" />
+  <parameter name="enh_rxfifo_pfull" value="23" />
+  <parameter name="enh_rxtxfifo_double_width" value="0" />
+  <parameter name="enh_tx_64b66b_enable" value="1" />
+  <parameter name="enh_tx_bitslip_enable" value="0" />
+  <parameter name="enh_tx_crcerr_enable" value="0" />
+  <parameter name="enh_tx_crcgen_enable" value="0" />
+  <parameter name="enh_tx_dispgen_enable" value="0" />
+  <parameter name="enh_tx_frmgen_burst_enable" value="0" />
+  <parameter name="enh_tx_frmgen_enable" value="0" />
+  <parameter name="enh_tx_frmgen_mfrm_length" value="2048" />
+  <parameter name="enh_tx_krfec_burst_err_enable" value="0" />
+  <parameter name="enh_tx_krfec_burst_err_len" value="1" />
+  <parameter name="enh_tx_polinv_enable" value="0" />
+  <parameter name="enh_tx_randomdispbit_enable" value="0" />
+  <parameter name="enh_tx_scram_enable" value="1" />
+  <parameter name="enh_tx_scram_seed" value="288230376151711743" />
+  <parameter name="enh_tx_sh_err" value="0" />
+  <parameter name="enh_txfifo_mode" value="Phase compensation" />
+  <parameter name="enh_txfifo_pempty" value="2" />
+  <parameter name="enh_txfifo_pfull" value="11" />
+  <parameter name="generate_add_hdl_instance_example" value="0" />
+  <parameter name="generate_docs" value="1" />
+  <parameter name="message_level" value="error" />
+  <parameter name="number_physical_bonding_clocks" value="1" />
+  <parameter name="pcie_rate_match" value="Bypass" />
+  <parameter name="pcs_direct_width" value="8" />
+  <parameter name="pcs_tx_delay1_ctrl" value="delay1_path0" />
+  <parameter name="pcs_tx_delay1_data_sel" value="one_ff_delay" />
+  <parameter name="pcs_tx_delay2_ctrl" value="delay2_path0" />
+  <parameter name="pll_select" value="0" />
+  <parameter name="plls" value="1" />
+  <parameter name="pma_mode" value="basic" />
+  <parameter name="protocol_mode" value="teng_baser_mode" />
+  <parameter name="rcfg_enable" value="1" />
+  <parameter name="rcfg_enable_avmm_busy_port" value="0" />
+  <parameter name="rcfg_file_prefix">altera_xcvr_native_a10</parameter>
+  <parameter name="rcfg_h_file_enable" value="1" />
+  <parameter name="rcfg_iface_enable" value="0" />
+  <parameter name="rcfg_jtag_enable" value="1" />
+  <parameter name="rcfg_mif_file_enable" value="1" />
+  <parameter name="rcfg_multi_enable" value="0" />
+  <parameter name="rcfg_profile_cnt" value="2" />
+  <parameter name="rcfg_profile_data0" value="" />
+  <parameter name="rcfg_profile_data1" value="" />
+  <parameter name="rcfg_profile_data2" value="" />
+  <parameter name="rcfg_profile_data3" value="" />
+  <parameter name="rcfg_profile_data4" value="" />
+  <parameter name="rcfg_profile_data5" value="" />
+  <parameter name="rcfg_profile_data6" value="" />
+  <parameter name="rcfg_profile_data7" value="" />
+  <parameter name="rcfg_profile_select" value="1" />
+  <parameter name="rcfg_reduced_files_enable" value="0" />
+  <parameter name="rcfg_separate_avmm_busy" value="0" />
+  <parameter name="rcfg_shared" value="1" />
+  <parameter name="rcfg_sv_file_enable" value="1" />
+  <parameter name="rx_pma_ctle_adaptation_mode" value="manual" />
+  <parameter name="rx_pma_dfe_adaptation_mode" value="disabled" />
+  <parameter name="rx_pma_dfe_fixed_taps" value="3" />
+  <parameter name="rx_pma_div_clkout_divider" value="0" />
+  <parameter name="rx_ppm_detect_threshold" value="1000" />
+  <parameter name="set_capability_reg_enable" value="1" />
+  <parameter name="set_cdr_refclk_freq" value="644.531250" />
+  <parameter name="set_csr_soft_logic_enable" value="1" />
+  <parameter name="set_data_rate" value="10312.5" />
+  <parameter name="set_disconnect_analog_resets" value="0" />
+  <parameter name="set_embedded_debug_enable" value="0" />
+  <parameter name="set_enable_calibration" value="0" />
+  <parameter name="set_hip_cal_en" value="0" />
+  <parameter name="set_odi_soft_logic_enable" value="0" />
+  <parameter name="set_pcs_bonding_master" value="Auto" />
+  <parameter name="set_prbs_soft_logic_enable" value="1" />
+  <parameter name="set_rcfg_emb_strm_enable" value="0" />
+  <parameter name="set_user_identifier" value="0" />
+  <parameter name="sim_reduced_counters" value="false" />
+  <parameter name="std_data_mask_count_multi" value="0" />
+  <parameter name="std_low_latency_bypass_enable" value="0" />
+  <parameter name="std_pcs_pma_width" value="10" />
+  <parameter name="std_rx_8b10b_enable" value="0" />
+  <parameter name="std_rx_bitrev_enable" value="0" />
+  <parameter name="std_rx_byte_deser_mode" value="Disabled" />
+  <parameter name="std_rx_byterev_enable" value="0" />
+  <parameter name="std_rx_pcfifo_mode" value="low_latency" />
+  <parameter name="std_rx_polinv_enable" value="0" />
+  <parameter name="std_rx_rmfifo_mode" value="disabled" />
+  <parameter name="std_rx_rmfifo_pattern_n" value="0" />
+  <parameter name="std_rx_rmfifo_pattern_p" value="0" />
+  <parameter name="std_rx_word_aligner_fast_sync_status_enable" value="0" />
+  <parameter name="std_rx_word_aligner_mode" value="bitslip" />
+  <parameter name="std_rx_word_aligner_pattern" value="0" />
+  <parameter name="std_rx_word_aligner_pattern_len" value="7" />
+  <parameter name="std_rx_word_aligner_renumber" value="3" />
+  <parameter name="std_rx_word_aligner_rgnumber" value="3" />
+  <parameter name="std_rx_word_aligner_rknumber" value="3" />
+  <parameter name="std_rx_word_aligner_rvnumber" value="0" />
+  <parameter name="std_tx_8b10b_disp_ctrl_enable" value="0" />
+  <parameter name="std_tx_8b10b_enable" value="0" />
+  <parameter name="std_tx_bitrev_enable" value="0" />
+  <parameter name="std_tx_bitslip_enable" value="0" />
+  <parameter name="std_tx_byte_ser_mode" value="Disabled" />
+  <parameter name="std_tx_byterev_enable" value="0" />
+  <parameter name="std_tx_pcfifo_mode" value="low_latency" />
+  <parameter name="std_tx_polinv_enable" value="0" />
+  <parameter name="support_mode" value="user_mode" />
+  <parameter name="tx_pma_clk_div" value="1" />
+  <parameter name="tx_pma_div_clkout_divider" value="33" />
+  <parameter name="validation_rule_select" value="" />
+ </module>
+ <interconnectRequirement for="$system" name="qsys_mm.clockCrossingAdapter" value="HANDSHAKE" />
+ <interconnectRequirement for="$system" name="qsys_mm.insertDefaultSlave" value="FALSE" />
+ <interconnectRequirement for="$system" name="qsys_mm.maxAdditionalLatency" value="1" />
+</system>
diff --git a/libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/compile_ip.tcl b/libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/compile_ip.tcl
new file mode 100644
index 0000000000..af3b3937c3
--- /dev/null
+++ b/libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/compile_ip.tcl
@@ -0,0 +1,34 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (C) 2017
+# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+# JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/>
+# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+#------------------------------------------------------------------------------
+
+# This file is based on generated file mentor/msim_setup.tcl.
+# - the values for modelsim_search_libraries key in the hdllib.cfg follow from altera libraries vmap section in the msim_setup.tcl
+# - vmap for the IP specific libraries and compile all IP source files into those libraries similar as in the msim_setup.tcl
+# - replace QSYS_SIMDIR by IP_DIR
+# - if the testbench is also generated with QSYS then only the IP_TBDIR files are needed, because these also contain the source files.
+
+#vlib ./work/         ;# Assume library work already exist                                                                                        
+
+
+set IP_DIR   "$env(RADIOHDL)/libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/generated/sim"
+                
+  vcom         "$IP_DIR/ip_arria10_e1sg_transceiver_reset_controller_3.vhd"                     
diff --git a/libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/generate_ip.sh b/libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/generate_ip.sh
new file mode 100755
index 0000000000..ed92ce368e
--- /dev/null
+++ b/libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/generate_ip.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+# -------------------------------------------------------------------------- #
+#
+# Copyright (C) 2015                                                        
+# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+# JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/>           
+# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands                             
+#                                                                           
+# This program is free software: you can redistribute it and/or modify      
+# it under the terms of the GNU General Public License as published by      
+# the Free Software Foundation, either version 3 of the License, or         
+# (at your option) any later version.                                       
+#                                                                           
+# This program is distributed in the hope that it will be useful,           
+# but WITHOUT ANY WARRANTY; without even the implied warranty of            
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             
+# GNU General Public License for more details.                              
+#                                                                           
+# You should have received a copy of the GNU General Public License         
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.     
+#
+# -------------------------------------------------------------------------- #
+#
+# Purpose: Generate IP with Qsys
+# Description:
+#   Generate the IP in a separate generated/ subdirectory.
+#
+# Usage:
+#
+#   ./generate_ip.sh
+#
+
+# Tool settings for selected target "unb2" with arria10
+. ${RADIOHDL}/tools/quartus/set_quartus unb2b
+
+#qsys-generate --help
+
+# Only generate the source IP
+# - use --synthesis=VHDL to have top level in VHDL similar as with MegaWizard
+qsys-generate ip_arria10_e1sg_transceiver_reset_controller_3.qsys \
+              --synthesis=VHDL \
+              --simulation=VHDL \
+              --output-directory=generated \
+              --allow-mixed-language-simulation
diff --git a/libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/hdllib.cfg b/libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/hdllib.cfg
new file mode 100644
index 0000000000..591a426a5d
--- /dev/null
+++ b/libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/hdllib.cfg
@@ -0,0 +1,19 @@
+hdl_lib_name = ip_arria10_e1sg_transceiver_reset_controller_3
+hdl_library_clause_name = ip_arria10_e1sg_transceiver_reset_controller_3_altera_xcvr_reset_control_170
+hdl_lib_uses_synth = 
+hdl_lib_uses_sim = ip_arria10_e1sg_altera_xcvr_reset_control_170
+hdl_lib_technology = ip_arria10_e1sg
+
+synth_files =
+    
+test_bench_files = 
+
+
+[modelsim_project_file]
+modelsim_compile_ip_files =
+    $RADIOHDL/libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/compile_ip.tcl
+
+
+[quartus_project_file]
+quartus_qip_files =
+    generated/ip_arria10_e1sg_transceiver_reset_controller_3.qip
diff --git a/libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/ip_arria10_e1sg_transceiver_reset_controller_3.qsys b/libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/ip_arria10_e1sg_transceiver_reset_controller_3.qsys
new file mode 100644
index 0000000000..fad8e19b9a
--- /dev/null
+++ b/libraries/technology/ip_arria10_e1sg/transceiver_reset_controller_3/ip_arria10_e1sg_transceiver_reset_controller_3.qsys
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<system name="ip_arria10_e1sg_transceiver_reset_controller_3">
+ <component
+   name="$${FILENAME}"
+   displayName="$${FILENAME}"
+   version="1.0"
+   description=""
+   tags="INTERNAL_COMPONENT=true"
+   categories="System"
+   tool="QsysStandard" />
+ <parameter name="bonusData"><![CDATA[bonusData 
+{
+   element transceiver_reset_controller_inst
+   {
+      datum _sortIndex
+      {
+         value = "0";
+         type = "int";
+      }
+   }
+}
+]]></parameter>
+ <parameter name="clockCrossingAdapter" value="HANDSHAKE" />
+ <parameter name="device" value="10AX115U2F45E1SG" />
+ <parameter name="deviceFamily" value="Arria 10" />
+ <parameter name="deviceSpeedGrade" value="1" />
+ <parameter name="fabricMode" value="QSYS" />
+ <parameter name="generateLegacySim" value="false" />
+ <parameter name="generationId" value="0" />
+ <parameter name="globalResetBus" value="false" />
+ <parameter name="hdlLanguage" value="VERILOG" />
+ <parameter name="hideFromIPCatalog" value="true" />
+ <parameter name="lockedInterfaceDefinition" value="" />
+ <parameter name="maxAdditionalLatency" value="1" />
+ <parameter name="sopcBorderPoints" value="false" />
+ <parameter name="systemHash" value="0" />
+ <parameter name="systemInfos"><![CDATA[<systemInfosDefinition>
+    <connPtSystemInfos/>
+</systemInfosDefinition>]]></parameter>
+ <parameter name="systemScripts" value="" />
+ <parameter name="testBenchDutName" value="" />
+ <parameter name="timeStamp" value="0" />
+ <parameter name="useTestBenchNamingPattern" value="false" />
+ <instanceScript></instanceScript>
+ <interface
+   name="clock"
+   internal="transceiver_reset_controller_inst.clock"
+   type="clock"
+   dir="end">
+  <port name="clock" internal="clock" />
+ </interface>
+ <interface
+   name="pll_locked"
+   internal="transceiver_reset_controller_inst.pll_locked"
+   type="conduit"
+   dir="end">
+  <port name="pll_locked" internal="pll_locked" />
+ </interface>
+ <interface
+   name="pll_powerdown"
+   internal="transceiver_reset_controller_inst.pll_powerdown"
+   type="conduit"
+   dir="end">
+  <port name="pll_powerdown" internal="pll_powerdown" />
+ </interface>
+ <interface
+   name="pll_select"
+   internal="transceiver_reset_controller_inst.pll_select"
+   type="conduit"
+   dir="end">
+  <port name="pll_select" internal="pll_select" />
+ </interface>
+ <interface
+   name="reset"
+   internal="transceiver_reset_controller_inst.reset"
+   type="reset"
+   dir="end">
+  <port name="reset" internal="reset" />
+ </interface>
+ <interface
+   name="rx_analogreset"
+   internal="transceiver_reset_controller_inst.rx_analogreset"
+   type="conduit"
+   dir="end">
+  <port name="rx_analogreset" internal="rx_analogreset" />
+ </interface>
+ <interface
+   name="rx_cal_busy"
+   internal="transceiver_reset_controller_inst.rx_cal_busy"
+   type="conduit"
+   dir="end">
+  <port name="rx_cal_busy" internal="rx_cal_busy" />
+ </interface>
+ <interface
+   name="rx_digitalreset"
+   internal="transceiver_reset_controller_inst.rx_digitalreset"
+   type="conduit"
+   dir="end">
+  <port name="rx_digitalreset" internal="rx_digitalreset" />
+ </interface>
+ <interface
+   name="rx_is_lockedtodata"
+   internal="transceiver_reset_controller_inst.rx_is_lockedtodata"
+   type="conduit"
+   dir="end">
+  <port name="rx_is_lockedtodata" internal="rx_is_lockedtodata" />
+ </interface>
+ <interface
+   name="rx_ready"
+   internal="transceiver_reset_controller_inst.rx_ready"
+   type="conduit"
+   dir="end">
+  <port name="rx_ready" internal="rx_ready" />
+ </interface>
+ <interface
+   name="tx_analogreset"
+   internal="transceiver_reset_controller_inst.tx_analogreset"
+   type="conduit"
+   dir="end">
+  <port name="tx_analogreset" internal="tx_analogreset" />
+ </interface>
+ <interface
+   name="tx_cal_busy"
+   internal="transceiver_reset_controller_inst.tx_cal_busy"
+   type="conduit"
+   dir="end">
+  <port name="tx_cal_busy" internal="tx_cal_busy" />
+ </interface>
+ <interface
+   name="tx_digitalreset"
+   internal="transceiver_reset_controller_inst.tx_digitalreset"
+   type="conduit"
+   dir="end">
+  <port name="tx_digitalreset" internal="tx_digitalreset" />
+ </interface>
+ <interface
+   name="tx_ready"
+   internal="transceiver_reset_controller_inst.tx_ready"
+   type="conduit"
+   dir="end">
+  <port name="tx_ready" internal="tx_ready" />
+ </interface>
+ <module
+   name="transceiver_reset_controller_inst"
+   kind="altera_xcvr_reset_control"
+   version="17.0"
+   enabled="1"
+   autoexport="1">
+  <parameter name="CHANNELS" value="3" />
+  <parameter name="PLLS" value="1" />
+  <parameter name="REDUCED_SIM_TIME" value="1" />
+  <parameter name="RX_ENABLE" value="1" />
+  <parameter name="RX_PER_CHANNEL" value="1" />
+  <parameter name="SYNCHRONIZE_PLL_RESET" value="0" />
+  <parameter name="SYNCHRONIZE_RESET" value="1" />
+  <parameter name="SYS_CLK_IN_MHZ" value="156" />
+  <parameter name="TX_ENABLE" value="1" />
+  <parameter name="TX_PER_CHANNEL" value="0" />
+  <parameter name="TX_PLL_ENABLE" value="1" />
+  <parameter name="T_PLL_LOCK_HYST" value="60" />
+  <parameter name="T_PLL_POWERDOWN" value="1000" />
+  <parameter name="T_RX_ANALOGRESET" value="70000" />
+  <parameter name="T_RX_DIGITALRESET" value="4000" />
+  <parameter name="T_TX_ANALOGRESET" value="70000" />
+  <parameter name="T_TX_DIGITALRESET" value="70000" />
+  <parameter name="device_family" value="Arria 10" />
+  <parameter name="gui_pll_cal_busy" value="0" />
+  <parameter name="gui_rx_auto_reset" value="0" />
+  <parameter name="gui_split_interfaces" value="0" />
+  <parameter name="gui_tx_auto_reset" value="0" />
+ </module>
+ <interconnectRequirement for="$system" name="qsys_mm.clockCrossingAdapter" value="HANDSHAKE" />
+ <interconnectRequirement for="$system" name="qsys_mm.insertDefaultSlave" value="FALSE" />
+ <interconnectRequirement for="$system" name="qsys_mm.maxAdditionalLatency" value="1" />
+</system>
-- 
GitLab