diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..1bb46147d7feb65673794f3a0c412fb42fdff549
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+*.code-workspace
\ No newline at end of file
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d8cc2f13f84cd9f5972ccb5978882eb4f65fc8d3..8fe1eba72dc0d40bd1487ec04e8051687700043a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,7 +3,7 @@ include:
     file: "/ci/templates/vivado-jobs.yml"
 
 variables:
-  VIVADO_VER: "2020.2"
+  VIVADO_VER: "2022.2"
   PROJECT_DEPFILE: top.dep
   PROJECT_ALGORITHM: top
   PROJECT_NAME: mprocessor
diff --git a/top/addr_table/link_aggregator.xml b/common/addr_table/link_aggregator.xml
similarity index 79%
rename from top/addr_table/link_aggregator.xml
rename to common/addr_table/link_aggregator.xml
index a6ab3964ed27d2a1a7dfae821b7f8819e3b06e2a..ce2c72808222577139aaf0aeca6cfb7895965644 100644
--- a/top/addr_table/link_aggregator.xml
+++ b/common/addr_table/link_aggregator.xml
@@ -3,6 +3,10 @@
     <node id="control" address="0x001" fwinfo="endpoint;width=0">
         <node id="input_link_mask" mask="0x03f"/>
         <node id="reset" mask="0x40"/>
+        <node id="trigger_threshold" mask="0x780"/>
+    </node>
+    <node id="rate_monitoring" address="0x004" fwinfo="endpoint;width=2">
+        <node id="bx_valid_count" address="0x0"/>
     </node>
     <node id="monitoring" address="0x008" fwinfo="endpoint;width=3">
         <node id="non_empty_count_0" address="0x0"/>
diff --git a/top/addr_table/mprocessor.xml b/common/addr_table/mprocessor.xml
similarity index 77%
rename from top/addr_table/mprocessor.xml
rename to common/addr_table/mprocessor.xml
index 57de74f4a685f1dfc83ce13ac3df042663237bb8..3075dce5e54dad2556a4ab30b501be3f7c8afb67 100644
--- a/top/addr_table/mprocessor.xml
+++ b/common/addr_table/mprocessor.xml
@@ -10,8 +10,9 @@
         <node id="header_user_bits" address="0x1"/>
     </node>
     
-    <node id="csr" address="0x22" description="MProcessor control and status" fwinfo="endpoint;width=1">
+    <node id="csr" address="0x24" description="MProcessor control and status" fwinfo="endpoint;width=2">
         <node id="header_start_select" address="0x0" mask="0x7"/>
-        <node id="lff" address="0x1" mask="0x0001"/>
+        <node id="lff" address="0x2" mask="0x0001"/>
+        <node id="super_id" address="0x3"/>
     </node>
 </node>
diff --git a/common/firmware/cfg/module.dep b/common/firmware/cfg/module.dep
new file mode 100644
index 0000000000000000000000000000000000000000..f8a06571bcd54844ef87fc64bc6df49d81c00ff4
--- /dev/null
+++ b/common/firmware/cfg/module.dep
@@ -0,0 +1,31 @@
+setup -f --cd ../cfg settings.tcl
+
+src fixed_pkg_2008.vhd
+
+src mprocessor_constants.vhd
+
+src MProcessor.vhd
+src LinkAggregatorCore.vhd
+src LinkAggregatorIPBus.vhd
+src LinkCombinerCore.vhd
+src LinkCombinerIPBus.vhd
+src --vhdl2008 TrackReconstructor.vhd
+
+src ipbus_decode_link_aggregator.vhd
+src ipbus_decode_mprocessor.vhd
+
+addrtab -t mprocessor.xml
+addrtab -t link_aggregator.xml
+
+# IP Cores
+src --cd ../cgn link_agg_single_link_fifo.xci
+setup -f --cd ../cgn link_agg_single_link_fifo.tcl
+
+src --cd ../cgn link_agg_single_link_fifo_fwft.xci
+setup -f --cd ../cgn link_agg_single_link_fifo_fwft.tcl
+
+src --cd ../cgn link_agg_all_links_fifo.xci
+setup -f --cd ../cgn link_agg_all_links_fifo.tcl
+
+src --cd ../cgn link_combin_buffer.xci
+setup -f --cd ../cgn link_combin_buffer.tcl
\ No newline at end of file
diff --git a/top/firmware/cfg/settings.tcl b/common/firmware/cfg/settings.tcl
similarity index 100%
rename from top/firmware/cfg/settings.tcl
rename to common/firmware/cfg/settings.tcl
diff --git a/top/firmware/cgn/link_agg_all_links_fifo.tcl b/common/firmware/cgn/link_agg_all_links_fifo.tcl
similarity index 100%
rename from top/firmware/cgn/link_agg_all_links_fifo.tcl
rename to common/firmware/cgn/link_agg_all_links_fifo.tcl
diff --git a/top/firmware/cgn/link_agg_all_links_fifo.xci b/common/firmware/cgn/link_agg_all_links_fifo.xci
similarity index 100%
rename from top/firmware/cgn/link_agg_all_links_fifo.xci
rename to common/firmware/cgn/link_agg_all_links_fifo.xci
diff --git a/top/firmware/cgn/link_agg_single_link_fifo.tcl b/common/firmware/cgn/link_agg_single_link_fifo.tcl
similarity index 100%
rename from top/firmware/cgn/link_agg_single_link_fifo.tcl
rename to common/firmware/cgn/link_agg_single_link_fifo.tcl
diff --git a/top/firmware/cgn/link_agg_single_link_fifo.xci b/common/firmware/cgn/link_agg_single_link_fifo.xci
similarity index 100%
rename from top/firmware/cgn/link_agg_single_link_fifo.xci
rename to common/firmware/cgn/link_agg_single_link_fifo.xci
diff --git a/top/firmware/cgn/link_agg_single_link_fifo_fwft.tcl b/common/firmware/cgn/link_agg_single_link_fifo_fwft.tcl
similarity index 100%
rename from top/firmware/cgn/link_agg_single_link_fifo_fwft.tcl
rename to common/firmware/cgn/link_agg_single_link_fifo_fwft.tcl
diff --git a/top/firmware/cgn/link_agg_single_link_fifo_fwft.xci b/common/firmware/cgn/link_agg_single_link_fifo_fwft.xci
similarity index 100%
rename from top/firmware/cgn/link_agg_single_link_fifo_fwft.xci
rename to common/firmware/cgn/link_agg_single_link_fifo_fwft.xci
diff --git a/top/firmware/cgn/link_combin_buffer.tcl b/common/firmware/cgn/link_combin_buffer.tcl
similarity index 100%
rename from top/firmware/cgn/link_combin_buffer.tcl
rename to common/firmware/cgn/link_combin_buffer.tcl
diff --git a/top/firmware/cgn/link_combin_buffer.xci b/common/firmware/cgn/link_combin_buffer.xci
similarity index 100%
rename from top/firmware/cgn/link_combin_buffer.xci
rename to common/firmware/cgn/link_combin_buffer.xci
diff --git a/top/firmware/hdl/LinkAggregatorCore.vhd b/common/firmware/hdl/LinkAggregatorCore.vhd
similarity index 82%
rename from top/firmware/hdl/LinkAggregatorCore.vhd
rename to common/firmware/hdl/LinkAggregatorCore.vhd
index fbf08994a306c4f3ebf078689b7f0ad809e9583a..de44256fa46d86a904347903b91f5215562ac75e 100644
--- a/top/firmware/hdl/LinkAggregatorCore.vhd
+++ b/common/firmware/hdl/LinkAggregatorCore.vhd
@@ -17,6 +17,7 @@ entity LinkAggregatorCore is
         reset              : in std_logic;
         packet_start       : in std_logic;
         links_in           : in ldata(N_LINKS - 1 downto 0);
+        trigger_threshold  : in integer := 0;
         --- Output Ports ---
         links_out          : out ldata(7 downto 0) := (others => LWORD_NULL);
         uncompressed_stubs : out ldata(N_LINKS * 8 - 1 downto 0) := (others => LWORD_NULL);
@@ -24,7 +25,8 @@ entity LinkAggregatorCore is
         --- Debug Ports ---
         status_bits        : out std_logic_vector(15 downto 0);
         --- IPBus Ports ---
-        non_empty_counts   : out ipb_reg_v(8*N_LINKS - 1 downto 0)
+        non_empty_counts   : out ipb_reg_v(8*N_LINKS - 1 downto 0);
+        bx_valid_count_out : out ipb_reg_v(0 downto 0)
     );
 end LinkAggregatorCore;
 
@@ -127,9 +129,12 @@ architecture compressed of LinkAggregatorCore is
     signal output_overflow_array : std_logic_vector(cBoxcarBx - 1 downto 0) := (others => '0');
     signal route_overflow_array  : tEnableArray                             := cNullEnableArray;
     signal cache_overflow_array  : tEnableArray                             := cNullEnableArray;
-
+    
+    signal bx_valid_array        : std_logic_vector(N_LINKS * cBoxcarBx - 1 downto 0) := (others => '0');
     
     signal non_empty_fifo_count  : ipb_reg_v(8*N_LINKS - 1 downto 0)        := (others => (others => '0'));
+    signal bx_valid_count        : ipb_reg_v(0 downto 0)                    := (others => (others => '0'));
+    signal pBx_counter           : integer                                  := 0;
 
 begin
 
@@ -168,6 +173,7 @@ begin
             signal din_route, dout_route                                                              : std_logic_vector(cFIFOWidth - 1 downto 0) := (others => '0');
             signal count_route                                                                        : std_logic_vector(4 downto 0);
             signal route_reset                                                                        : std_logic                                 := '0';
+            signal countdown_iterator                                                                 : unsigned(3 downto 0)                      := (others => '0');
 
         begin
             
@@ -181,23 +187,45 @@ begin
                     if packet_start = '1' then
                         if empty_cache = '0' then
                             rd_en_cache <= '1';
+                            countdown_iterator <= unsigned(count_cache) - 1;
                         end if;
-                    end if;
-                    if rd_en_cache = '1' then
-                        -- Use almost empty flag to avoid underflow
-                        if almost_empty_cache = '1' then
+                    else
+                        if countdown_iterator > 0 then
+                            countdown_iterator <= countdown_iterator - 1;
+                        else
+                            countdown_iterator <= countdown_iterator;
                             rd_en_cache <= '0';
                         end if;
                     end if;
                     -- Check for non-empty FIFOs at reset
-                    if route_reset = '1' then
-                        if empty_route = '0' then
-                            non_empty_fifo_count(N_LINKS*j + i) <= std_logic_vector(unsigned(non_empty_fifo_count(N_LINKS*j + i)) + 1);
+                    if reset = '1' then 
+                        non_empty_fifo_count(N_LINKS*j + i) <= (others => '0');
+                    else
+                        if route_reset = '1' then
+                            if empty_route = '0' then
+                                non_empty_fifo_count(N_LINKS*j + i) <= std_logic_vector(unsigned(non_empty_fifo_count(N_LINKS*j + i)) + 1);
+                            end if;
                         end if;
                     end if;
                 end if;
             end process pTransferToRoutingFIFO;
             
+            --==============================--
+            pCheckBxValidConditionPerLink : process(clk_p)
+            --==============================--
+            begin
+                if rising_edge(clk_p) then
+                    if packet_start = '1' then
+                        if unsigned(count_cache) >= trigger_threshold then
+                            bx_valid_array(N_LINKS*j + i) <= '1';
+                        else
+                            bx_valid_array(N_LINKS*j + i) <= '0';
+                        end if;
+                    end if;
+                end if;
+            end process pCheckBxValidConditionPerLink;
+            
+            
             -- Enable writing of routing FIFO using the valid flag of the cache FIFO
             wr_en_route <= valid_cache;
             din_route <= dout_cache;
@@ -266,6 +294,8 @@ begin
         signal compressed_stub_pointer                        : integer range 0 to 1                      := 0;
         signal previous_valid_row                             : std_logic_vector(N_LINKS - 1 downto 0)    := (others => '0');
         signal all_links_reset                                : std_logic                                 := '0';
+        
+        signal bx_valid                                       : std_logic                                 := '0';
 
     begin
         --==============================--
@@ -273,6 +303,8 @@ begin
         -- Process to iterate of the link FIFOs and route the data to the output FIFO, if data is present on a given link.
         -- The process uses a rotating pointer to repeatedly iterate over all links, taking one stub per iteration, until all link FIFOs are empty.
         --==============================--
+            variable bx_valid_variable : std_logic := '0';
+        
         begin
 
             if rising_edge(clk_p) then
@@ -312,10 +344,18 @@ begin
                     wr_en <= '0';
                 end if;
                 
+                -- Check if Bx is valid
+                bx_valid_variable := '1';
+                for j in 0 to N_LINKS - 1 loop
+                    bx_valid_variable := bx_valid_variable and bx_valid_array(N_LINKS*i + j);
+                end loop;
+                bx_valid <= bx_valid_variable;               
                 
                 -- If counter is at the end of a packet, then start to readout the contents of the aggregated FIFOs
-                if counter = 47 and empty = '0' then
-                    rd_en <= '1';
+                if counter = 47 then
+                    if empty = '0' and bx_valid = '1' then
+                        rd_en <= '1';
+                    end if;
                 end if;
                 if rd_en = '1' then
                     if almost_empty = '1' then
@@ -331,6 +371,7 @@ begin
                     links_out(i).data  <= (others => '0');
                 end if;               
                 links_out(i).strobe <= '1';
+
             end if;
             
         end process pIteratePointer;
@@ -385,6 +426,40 @@ begin
         end if;
     end process pReadoutReset;
 
+    --==============================--
+    pCountValidBits : process(clk_p)
+    --==============================--
+        variable bx_valid_variable : std_logic := '0';
+    begin
+        if rising_edge(clk_p) then
+            if counter = 47 then 
+                pBx_counter <= 0;
+            else
+                if pBx_counter = 8 then
+                    pBx_counter <= pBx_counter;
+                else
+                    pBx_counter <= pBx_counter + 1;
+                end if;
+            end if;
+
+            if pBx_counter < 8 then
+                bx_valid_variable := '1';
+                for j in 0 to N_LINKS - 1 loop
+                    bx_valid_variable := bx_valid_variable and bx_valid_array(N_LINKS*pBx_counter + j);
+                end loop;
+            end if;
+
+            -- Increment counter if bx_valid is set high when readout is started
+            if reset = '1' then 
+                bx_valid_count(0) <= (others => '0');
+            else
+                if bx_valid_variable = '1' and pBx_counter < 8 then
+                    bx_valid_count(0) <= std_logic_vector(unsigned(bx_valid_count(0)) + 1);
+                end if;
+            end if;
+        end if;
+    end process pCountValidBits;
+
     --==============================--
     -- Debug
     --==============================--
@@ -399,5 +474,6 @@ begin
     status_bits(8) <= cache_overflow_array(0)(0); -- link_aggregator_cache_0_0_overflow;
     status_bits(9) <= route_overflow_array(0)(0); -- link_aggregator_route_0_0_overflow;
     non_empty_counts <= non_empty_fifo_count;
+    bx_valid_count_out <= bx_valid_count;
 
 end compressed;
diff --git a/top/firmware/hdl/LinkAggregatorIPBus.vhd b/common/firmware/hdl/LinkAggregatorIPBus.vhd
similarity index 80%
rename from top/firmware/hdl/LinkAggregatorIPBus.vhd
rename to common/firmware/hdl/LinkAggregatorIPBus.vhd
index 25bad0443646df2d35d9865bc63acb5d12653f76..43b94dd07529d7d179376fdc4eae9e5cd1505d03 100644
--- a/top/firmware/hdl/LinkAggregatorIPBus.vhd
+++ b/common/firmware/hdl/LinkAggregatorIPBus.vhd
@@ -38,11 +38,13 @@ architecture Behavorial of LinkAggregatorIPBus is
     signal channel_sel             : ipb_reg_v(0 downto 0);
     signal ipb_chain               : ipbdc_bus_array(8 downto 0);
 
-    -- signal link_aggregator_status_registers        : ipb_reg_v(4 - 1 downto 0) := (others => (others => '0'));
-    signal control_registers : ipb_reg_v(1 - 1 downto 0)  := (others => (others => '0'));
-    signal mprocessor_monitoring_registers : ipb_reg_v(8*N_LINKS - 1 downto 0) := (others => (others => '0'));
+    -- signal link_aggregator_status_registers : ipb_reg_v(4 - 1 downto 0) := (others => (others => '0'));
+    signal control_registers                : ipb_reg_v(1 - 1 downto 0)         := (others => (others => '0'));
+    signal mprocessor_monitoring_registers  : ipb_reg_v(8*N_LINKS - 1 downto 0) := (others => (others => '0'));
+    signal rate_monitoring_registers        : ipb_reg_v(1 - 1 downto 0)         := (others => (others => '0'));
+    signal bx_valid_count                   : ipb_reg_v(1 - 1 downto 0)         := (others => (others => '0'));
 
-    signal masked_links : ldata(N_LINKS - 1 downto 0) := (others => LWORD_NULL);
+    signal masked_links                     : ldata(N_LINKS - 1 downto 0)       := (others => LWORD_NULL);
 
 begin
 
@@ -96,6 +98,21 @@ begin
         q            => control_registers
     );
 
+    --==============================--
+    RateMonitoringInstance: entity work.ipbus_ctrlreg_v
+    --==============================--
+    generic map(
+        N_CTRL       => 0,
+        N_STAT       => 1
+    )
+    port map(
+        clk          => ipb_clk,
+        reset        => ipb_rst,
+        ipbus_in     => ipb_to_slaves(N_SLV_RATE_MONITORING),
+        ipbus_out    => ipb_from_slaves(N_SLV_RATE_MONITORING),
+        d            => rate_monitoring_registers
+    );
+
     --==============================--
     channel_select: entity work.ipbus_dc_fabric_sel
     --==============================--
@@ -182,13 +199,16 @@ begin
         reset            => control_registers(0)(N_LINKS + 1 - 1),
         packet_start     => packet_start,
         links_in         => masked_links,
+        trigger_threshold => to_integer(unsigned(control_registers(0)(N_LINKS + 5 - 1 downto N_LINKS + 1))),
         --- Output Ports ---
         links_out        => links_out,
         readout_reset    => readout_reset,
         --- Debug Ports ---
         -- status_bits      => link_aggregator_status_registers(3)(15 downto 0),
-        non_empty_counts => mprocessor_monitoring_registers
+        non_empty_counts => mprocessor_monitoring_registers,
+        bx_valid_count_out => bx_valid_count
     );
     
+    rate_monitoring_registers(0) <= bx_valid_count(0);
 
 end Behavorial;
diff --git a/top/firmware/hdl/LinkAggregatorUncompressed.vhd b/common/firmware/hdl/LinkAggregatorUncompressed.vhd
similarity index 100%
rename from top/firmware/hdl/LinkAggregatorUncompressed.vhd
rename to common/firmware/hdl/LinkAggregatorUncompressed.vhd
diff --git a/top/firmware/hdl/LinkCombinerCore.vhd b/common/firmware/hdl/LinkCombinerCore.vhd
similarity index 100%
rename from top/firmware/hdl/LinkCombinerCore.vhd
rename to common/firmware/hdl/LinkCombinerCore.vhd
diff --git a/top/firmware/hdl/LinkCombinerIPBus.vhd b/common/firmware/hdl/LinkCombinerIPBus.vhd
similarity index 89%
rename from top/firmware/hdl/LinkCombinerIPBus.vhd
rename to common/firmware/hdl/LinkCombinerIPBus.vhd
index e551dd4996b14aa11800c93a01927d4b307ef2ef..18a08325379e68a329f95f0f85b175af2318052c 100644
--- a/top/firmware/hdl/LinkCombinerIPBus.vhd
+++ b/common/firmware/hdl/LinkCombinerIPBus.vhd
@@ -25,13 +25,16 @@ entity LinkCombinerIPBus is
         packet_start     : in std_logic;
         header_in        : in tCICHeaderArray(cNumberOfFEModules * cNumberOfCICs - 1 downto 0) := (others => ('0', (others => '0'), (others => '0'), (others => '0')));
         lff              : in std_logic;
+        output_srst      : in std_logic := '0';
         --- Ouput Ports ---
         link_out         : out lword := LWORD_NULL;
         --- IPBus Ports ---
         ipb_clk          : in  std_logic;
         ipb_rst          : in  std_logic;
         ipb_in           : in  ipb_wbus;
-        ipb_out          : out ipb_rbus
+        ipb_out          : out ipb_rbus;
+        --- Debug Ports ---
+        super_id         : out std_logic_vector(31 downto 0)
     );
 end LinkCombinerIPBus;
 
@@ -44,6 +47,7 @@ architecture Behavioral of LinkCombinerIPBus is
     signal masked_input          : ldata(8 - 1 downto 0)                  := (others => LWORD_NULL);
 
     signal control_registers : ipb_reg_v(2 - 1 downto 0)  := (others => (others => '0'));
+    signal output_reset      : std_logic := '0';
 
 begin
 
@@ -88,6 +92,7 @@ begin
     begin
         if rising_edge(clk_p) then
             link_combiner_rd_en <= not lff and control_registers(0)(N_INPUT_LINKS + 2 - 1);
+            output_reset        <= control_registers(0)(N_INPUT_LINKS + 1 - 1) or output_srst;
         end if;
     end process pReadEnable;
 
@@ -101,17 +106,17 @@ begin
         --- Input Ports ---
         clk_p            => clk_p,
         reset            => reset,
-        output_reset     => control_registers(0)(N_INPUT_LINKS + 1 - 1),
+        output_reset     => output_reset,
         output_enable    => link_combiner_rd_en,
         links_in         => masked_input,
         packet_start     => packet_start,
         header_in        => header_in,
         header_user_bits => control_registers(1),
         --- Output Ports ---
-        link_out         => link_out
+        link_out         => link_out,
         --- Debug Ports ---
         -- debug            => link_combiner_debug,
-        -- debug_super_id   => link_combiner_debug_super_id,
+        debug_super_id   => super_id
         -- debug_fifo       => link_aggregator_status_registers(2)
     );
 
diff --git a/top/firmware/hdl/MProcessor.vhd b/common/firmware/hdl/MProcessor.vhd
similarity index 91%
rename from top/firmware/hdl/MProcessor.vhd
rename to common/firmware/hdl/MProcessor.vhd
index f9b3a4d1c3973bb0648bf5e25f3512a039cbbbbd..27f7176539dd8bfff702ee0dea536fafdc2f0dd0 100644
--- a/top/firmware/hdl/MProcessor.vhd
+++ b/common/firmware/hdl/MProcessor.vhd
@@ -27,6 +27,7 @@ entity MProcessor is
         header_in          : in  tCICHeaderArray(cNumberOfFEModules * cNumberOfCICs - 1 downto 0) := (others => ('0', (others => '0'), (others => '0'), (others => '0')));
         header_start_array : in  tHeaderStartArray                                                := (others => (others => '0'));
         gbe_backpressure   : in  std_logic                                                        := '0';
+        srst               : in  std_logic                                                        := '0';
         --- Output Ports ---
         link_out           : out lword                                                            := LWORD_NULL;
         --- IPBus Ports ---
@@ -48,9 +49,11 @@ architecture Behavorial of MProcessor is
     signal aggregated_stubs        : ldata(7 downto 0)           := (others => LWORD_NULL);
     signal link_aggregator_input   : ldata(N_LINKS - 1 downto 0) := (others => LWORD_NULL);
 
-    signal status_registers        : ipb_reg_v(1 - 1 downto 0)   := (others => (others => '0'));
+    signal status_registers        : ipb_reg_v(2 - 1 downto 0)   := (others => (others => '0'));
     signal control_registers       : ipb_reg_v(1 - 1 downto 0)   := (others => (others => '0'));
 
+    signal super_id                : std_logic_vector(31 downto 0) := (others => '0');
+
 begin
 
     --==============================--
@@ -78,7 +81,7 @@ begin
     --==============================--
     generic map(
         N_CTRL    => 1,
-        N_STAT    => 1
+        N_STAT    => 2
     )
     port map(
         clk       => ipb_clk,
@@ -124,13 +127,16 @@ begin
         packet_start  => packet_start,
         header_in     => header_in,
         lff           => gbe_backpressure,
+        output_srst   => srst,
         --- Output Ports ---
         link_out      => link_out,
         --- IPBus Ports ---
         ipb_clk       => ipb_clk,
         ipb_rst       => ipb_rst,
         ipb_in        => ipb_to_slaves(N_SLV_LINK_COMBINER),
-        ipb_out       => ipb_from_slaves(N_SLV_LINK_COMBINER)
+        ipb_out       => ipb_from_slaves(N_SLV_LINK_COMBINER),
+        --- Debug Ports ---
+        super_id      => super_id
     );
 
     -- --==============================--
@@ -145,6 +151,7 @@ begin
     link_aggregator_input(N_LINKS - 1 downto 0) <= links_in;
 
     status_registers(0)(0) <= gbe_backpressure;
+    status_registers(1)    <= super_id;
     packet_start           <= header_start_array(to_integer(unsigned(control_registers(0)(2 downto 0))))(0);
 
 end Behavorial;
diff --git a/top/firmware/hdl/TrackReconstructor.vhd b/common/firmware/hdl/TrackReconstructor.vhd
similarity index 100%
rename from top/firmware/hdl/TrackReconstructor.vhd
rename to common/firmware/hdl/TrackReconstructor.vhd
diff --git a/top/firmware/hdl/fixed_pkg_2008.vhd b/common/firmware/hdl/fixed_pkg_2008.vhd
similarity index 100%
rename from top/firmware/hdl/fixed_pkg_2008.vhd
rename to common/firmware/hdl/fixed_pkg_2008.vhd
diff --git a/common/firmware/hdl/mprocessor_constants.vhd b/common/firmware/hdl/mprocessor_constants.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..367eb0996372120aec21e2d4da72d9240ed3ce45
--- /dev/null
+++ b/common/firmware/hdl/mprocessor_constants.vhd
@@ -0,0 +1,32 @@
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+use work.dtc_link_maps.all;
+
+package mprocessor_constants is
+
+    type tHeaderStartArray is array(cNumberOfFEModules - 1 downto 0) of std_logic_vector(1 downto 0);
+
+    function convertSLVtoHeaderStartArray (input_vector : in std_logic_vector(2*cNumberOfFEModules - 1 downto 0)) return tHeaderStartArray;
+    
+end package mprocessor_constants;
+
+package body mprocessor_constants is
+
+    function convertSLVtoHeaderStartArray (input_vector : in std_logic_vector(2*cNumberOfFEModules - 1 downto 0)) return tHeaderStartArray is
+    
+        variable output : tHeaderStartArray;
+
+    begin
+
+        for i in 0 to cNumberOfFEModules - 1 loop
+            output(i)(0) := input_vector(2*i);
+            output(i)(1) := input_vector(2*i + 1);
+        end loop;
+
+        return output;
+
+    end;
+
+end package body mprocessor_constants;
\ No newline at end of file
diff --git a/dependencies.yml b/dependencies.yml
index ce05070077fe7a8f2eb206a6deb74ae7877692f4..0cbe131cbe6e15a919fa141564d1e7e6163a8e5b 100644
--- a/dependencies.yml
+++ b/dependencies.yml
@@ -1,7 +1,7 @@
 ---
 sources:
     emp-fwk:
-        tag: feature/daqpath_v2
+        branch: feature/lpgbtv1_merge_rebase
         url: https://gitlab.cern.ch/p2-xware/firmware/emp-fwk.git
 
     ttc_legacy:
@@ -31,9 +31,17 @@ sources:
     tclink:
         commit: fda0bcf
         url: https://gitlab.cern.ch/HPTD/tclink.git
-    
+
+    slink-ip:
+        tag: v03.12
+        url: https://gitlab.cern.ch/dth_p1-v2/slinkrocket_ips.git
+
+    slink:
+        tag: v03.12
+        url: https://gitlab.cern.ch/dth_p1-v2/slinkrocket.git   
+
     gbt-sc:
-        tag: gbt_sc_4_1
+        tag: gbt_sc_4_3
         url: https://gitlab.cern.ch/gbtsc-fpga-support/gbt-sc.git
 
     dtc:
@@ -43,11 +51,15 @@ sources:
     dtc-stub-processing:
         branch: master
         url: https://gitlab.cern.ch/cms-tracker-phase2-data-processing/BE_firmware/dtc-stub-processing.git
+
+    dtc-monitoring:
+        branch: master
+        url: https://gitlab.cern.ch/cms-tracker-phase2-data-processing/BE_firmware/dtc-monitoring.git
     
     verilog-ethernet:
-        tag: v1.0.0
+        branch: master
         url: https://github.com/KristianHahn/verilog-ethernet.git
 
     10gb-ethernet:
-        tag: v2.0.0
+        branch: master
         url: https://gitlab.cern.ch/cms-tracker-phase2-data-processing/BE_firmware/10gb-ethernet.git
diff --git a/replacements/emp-fwk/boards/serenity/common/firmware/ucf/clock_constraints.tcl b/replacements/emp-fwk/boards/serenity/common/firmware/ucf/clock_constraints.tcl
new file mode 100644
index 0000000000000000000000000000000000000000..fa7a6a672b8b3297213d026dba8022401f3a6e98
--- /dev/null
+++ b/replacements/emp-fwk/boards/serenity/common/firmware/ucf/clock_constraints.tcl
@@ -0,0 +1,53 @@
+# 40 MHz external oscillator from Artix
+set lLegacyTtcClockPort [get_ports -quiet ttc_clk_p]
+if {[llength $lLegacyTtcClockPort] != 0} {
+    create_clock -name clk_40_extern_i0 -period 25.000 $lLegacyTtcClockPort
+}
+
+# 320 MHz TCDS2 clock
+set lTcdsClockPort [get_ports -quiet tcds_clk_p]
+if {[llength $lTcdsClockPort] != 0} {
+    create_clock -name tcds_clk -period 3.125 $lTcdsClockPort
+}
+
+# KH for slink
+if { [llength [get_cells slink_check.slink]] > 0 } { 
+    set index [get_property ref_clock_index [get_cells slink_check.slink]]
+    puts "slink ==> refclk index : $index"
+    set reffreq [get_property ref_clock_freq [get_cells slink_check.slink]]
+    puts "slink ==> refclk freq : $reffreq"
+    set refprd [expr 1000/$reffreq]
+    puts "slink ==> refclk period : $refprd"
+}
+
+# DGM for eth10g
+if { [llength [get_cells eth10g_interface]] > 0 } { 
+    set eth10g_index [get_property ref_clock_index [get_cells eth10g_interface]]
+    puts "eth10g ==> refclk index : $eth10g_index"
+    set  eth10g_reffreq [get_property ref_clock_freq [get_cells eth10g_interface]]
+    puts "eth10g ==> refclk freq : $eth10g_reffreq"
+    set  eth10g_refprd [expr 1000/$eth10g_reffreq]
+    puts "eth10g ==> refclk period : $eth10g_refprd"
+}
+
+# MGT refclks
+set lRefClkSize [llength [get_ports {refclkn[*]}]]
+for {set i 0} {$i < $lRefClkSize} {incr i} {
+    # KH modify for slink
+    if { [llength [get_cells slink_check.slink]] > 0 } { 
+        if { $i == $index } { 
+            create_clock -name refclk_$i -period $refprd [get_ports refclkn[$i]]
+        } else { 
+            create_clock -name refclk_$i -period 3.125 [get_ports refclkn[$i]]
+        }
+    } elseif {[llength [get_cells eth10g_interface]] > 0} {
+        if { $i == $eth10g_index } {
+            # DGM commented out as hack - reason for timing issues when uncommented unclear
+            # create_clock -name refclk_$i -period $eth10g_refprd [get_ports refclkn[$i]]
+        } else { 
+            create_clock -name refclk_$i -period 3.125 [get_ports refclkn[$i]]
+        }
+    } else {
+        create_clock -name refclk_$i -period 3.125 [get_ports refclkn[$i]]
+    }
+}
diff --git a/replacements/emp-fwk/boards/serenity/dc_ku15p/firmware/hdl/emp_device_decl_sm1_v1.vhd b/replacements/emp-fwk/boards/serenity/dc_ku15p/firmware/hdl/emp_device_decl_sm1_v1.vhd
deleted file mode 100644
index 9a9ce1692dc406628ef1f398fc710d00bfa831c0..0000000000000000000000000000000000000000
--- a/replacements/emp-fwk/boards/serenity/dc_ku15p/firmware/hdl/emp_device_decl_sm1_v1.vhd
+++ /dev/null
@@ -1,48 +0,0 @@
--- emp_device_decl
---
--- Defines constants for the whole device
---
--- Tom Williams, June 2018
-
-library IEEE;
-use IEEE.STD_LOGIC_1164.all;
-
-use work.emp_framework_decl.all;
-
-
-package emp_device_decl is
-
-  constant BOARD_DESIGN_ID : std_logic_vector(7 downto 0) := X"41";
-
-  constant TCDS2_MGT_TYPE : io_gt_kind_t     := io_gty;
-  constant TCDS2_SPEED    : io_tcds2_speed_t := io_tcds2_10g;
-
-
-  constant N_REGION     : integer := 18;
-  constant N_REFCLK     : integer := 14;
-  constant CROSS_REGION : integer := 9;
-
-  constant IO_REGION_SPEC : io_region_spec_array_t(0 to N_REGION - 1) := (
-    0      => (io_gth, 0, 7),           -- Bank 225 -- Right column
-    1      => (io_gth, 0, 8),           -- Bank 226
-    2      => (io_gth, 1, 8),           -- Bank 227
-    3      => (io_gth, 1, 8),           -- Bank 228
-    4      => (io_gth, 2, 9),           -- Bank 229
-    5      => (io_gth, 2, 9),           -- Bank 230
-    6      => (io_gth, 2, 9),           -- Bank 231
-    7      => (io_gth, 3, 10),          -- Bank 232
-    8      => (io_gth, 3, 10),          -- Bank 233
-    9      => (io_gth, 3, 10),          -- Bank 234
-    -- Cross-chip
-    -- 10     => (io_gty, 4, 11),          -- Bank 134 -- Left column
-    -- 11     => (io_gty, 4, 11),          -- Bank 133
-    -- 12     => (io_gty, 4, 11),          -- Bank 132
-    13     => (io_gty, 5, 12),          -- Bank 131
-    14     => (io_gty, 5, 12),          -- Bank 130
-    15     => (io_gty, 5, 12),          -- Bank 129
-    16     => kIONoGTRegion,            -- Bank 128 (TCDS2 via QSFP)
-    17     => (io_gty, 6, 13),          -- Bank 127
-    others => kIONoGTRegion
-    );
-
-end emp_device_decl;
diff --git a/replacements/emp-fwk/boards/serenity/dc_ku15p/firmware/ucf/area_constraints.tcl b/replacements/emp-fwk/boards/serenity/dc_ku15p/firmware/ucf/area_constraints.tcl
new file mode 100644
index 0000000000000000000000000000000000000000..f389dfcdad41391a8979b1ba1001726c694c1c91
--- /dev/null
+++ b/replacements/emp-fwk/boards/serenity/dc_ku15p/firmware/ucf/area_constraints.tcl
@@ -0,0 +1,105 @@
+delete_pblocks -quiet infra ttc clocks payload quad_*
+#-------------------------------------
+
+#KH comment for slink w/o datapath
+#-------------------------------------
+#Infra, ttc, ctrl blocks creation skipped due to the peculiar shape of the DIE.
+#To be revisited later in view of specific ku15p applications.
+#-------------------------------------
+#
+# Constrain infra to the lowest row of clock regions, plus X5Y1 that contains the PCIe MGTs
+# create_pblock infra
+# resize_pblock [get_pblocks infra] -add {CLOCKREGION_X0Y0:CLOCKREGION_X3Y1}
+# add_cells_to_pblock [get_pblocks infra] [get_cells -quiet [list infra info ctrl]] 
+
+# # Constrain TTC to a sub-area of infra
+# create_pblock ttc -parent [get_pblocks infra]
+# resize_pblock [get_pblocks ttc] -add {CLOCKREGION_X0Y0:CLOCKREGION_X3Y0}
+# add_cells_to_pblock [get_pblocks ttc] [get_cells -quiet ttc] 
+
+
+# Except for the clocks, that require a 3 row vertical slice to accommodate 3 MMCMs and the corresponding BUFGs.
+# create_pblock clocks
+# resize_pblock [get_pblocks clocks] -add {CLOCKREGION_X4Y0:CLOCKREGION_X4Y3}
+# add_cells_to_pblock [get_pblocks clocks] [get_cells infra/usp_clocks/*]
+# add_cells_to_pblock [get_pblocks clocks] [get_cells ttc/osc_clock/*]
+# add_cells_to_pblock [get_pblocks clocks] [get_cells ttc/clocks/*]
+
+
+# # TTC MMC assignment
+# # TODO - check the code below
+# create_pblock mmcm_ttc
+# resize_pblock [get_pblocks mmcm_ttc] -add CLOCKREGION_X5Y9
+
+# add_cells_to_pblock [get_pblocks mmcm_ttc] [get_cells ttc/clocks/mmcm]
+# set bufgs { bufg_40 bufg_p bufr_40s cgen\[0\].bufg_aux cgen\[1\].bufg_aux cgen\[2\].bufg_aux }
+# foreach lRegId $bufgs {
+#     add_cells_to_pblock [get_pblocks mmcm_ttc] [get_cells -quiet ttc/clocks/${i} ]
+# }
+# # -------------------
+#-------------------------------------
+
+# Parameters
+set lLeftQuadWidth 1330
+set lRightQuadWidth 520
+
+set lClkBounds [get_XY_bounds [get_clock_regions]]
+puts "Clock region boundaries ${lClkBounds}"
+set lRPMBounds [get_fpga_rpm_bounds]
+puts "FPGA boundaries (RPM coords) $lRPMBounds"
+
+lassign [create_quad_pblocks $lLeftQuadWidth $lRightQuadWidth] lNumQuads lLeftBoundary lRightBoundary
+
+# Create the quad p-blocks and store the number of blocks created
+puts "Created $lNumQuads quads"
+
+# Right MGT column, right quads 1 to 10
+for {set lRegId 0} {$lRegId < 10} {incr lRegId} {
+    set q [expr 1 + $lRegId]
+    set lQuadBlock [get_pblocks quad_R$q]
+    puts "Populating $lQuadBlock with region $lRegId" 
+    
+    add_cells_to_pblock $lQuadBlock datapath/rgen\[$lRegId\].region
+    remove_cells_from_pblock -quiet $lQuadBlock datapath/rgen\[$lRegId\].region/mgt_gen.fe_mgt_gen.fe_mgt_inst
+    constrain_mgts $lRegId $lQuadBlock 1
+}
+
+# Left MGT column, left quads 10 to 3
+for {set lRegId 10} {$lRegId < 18} {incr lRegId} {
+    set q [expr 20 - $lRegId]
+    set lQuadBlock [get_pblocks quad_L$q]
+    puts "Populating $lQuadBlock with region $lRegId"
+    
+    add_cells_to_pblock $lQuadBlock datapath/rgen\[$lRegId\].region
+    remove_cells_from_pblock -quiet $lQuadBlock datapath/rgen\[$lRegId\].region/mgt_gen.fe_mgt_gen.fe_mgt_inst
+    constrain_mgts $lRegId $lQuadBlock 0
+}
+
+
+# now the slinks
+set lQuadNumberingOffset 1
+constrain_slinks $lQuadNumberingOffset
+# now the eth10g
+constrain_eth10g $lQuadNumberingOffset
+
+# Payload Area assignment
+set lPayload [create_pblock payload]
+set lPayloadRect [find_rects [get_sites -of [get_clock_regions -f {ROW_INDEX>2}] -f "RPM_X >= $lLeftBoundary && RPM_X <= $lRightBoundary"]]
+add_rects_to_pblock $lPayload $lPayloadRect
+
+
+add_cells_to_pblock [get_pblocks payload] [get_cells -quiet datapath/rgen[*].pgen.*]
+
+
+
+# Add more sites to quad_L10 to alleviate bus skew problems
+#   (temporary workaround - permananent solution to follow with Hermes v2)
+resize_pblock -remove SLICE_X25Y180:SLICE_X26Y659 [get_pblocks payload]
+resize_pblock -add SLICE_X25Y600:SLICE_X26Y659 [get_pblocks quad_L10]
+resize_pblock -add SLICE_X25Y540:SLICE_X26Y599 [get_pblocks quad_L9]
+resize_pblock -add SLICE_X25Y480:SLICE_X26Y539 [get_pblocks quad_L8]
+resize_pblock -add SLICE_X25Y420:SLICE_X26Y479 [get_pblocks quad_L7]
+resize_pblock -add SLICE_X25Y360:SLICE_X26Y419 [get_pblocks quad_L6]
+resize_pblock -add SLICE_X25Y300:SLICE_X26Y359 [get_pblocks quad_L5]
+resize_pblock -add SLICE_X25Y240:SLICE_X26Y299 [get_pblocks quad_L4]
+resize_pblock -add SLICE_X25Y180:SLICE_X26Y239 [get_pblocks quad_L3]
diff --git a/replacements/emp-fwk/boards/serenity/dc_ku15p/firmware/ucf/pins_sm1_common.tcl b/replacements/emp-fwk/boards/serenity/dc_ku15p/firmware/ucf/pins_sm1_common.tcl
deleted file mode 100644
index 1d3596e953e910fe7674392b01fd111e71881467..0000000000000000000000000000000000000000
--- a/replacements/emp-fwk/boards/serenity/dc_ku15p/firmware/ucf/pins_sm1_common.tcl
+++ /dev/null
@@ -1,65 +0,0 @@
-
-# EXTERNAL OSCILLATOR
-set_property IOSTANDARD LVCMOS18 [get_ports clk125]
-set_property PACKAGE_PIN AP29    [get_ports clk125]
-
-# KH comment for tcds only version ...
-# LEGACY TTC - DATA
-set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports ttc_rx_n]
-set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports ttc_rx_p]
-set_property PACKAGE_PIN AY10          [get_ports ttc_rx_n]
-set_property PACKAGE_PIN AY11          [get_ports ttc_rx_p]
-
-
-# TCDS2 INTERFACE
-# Bank 128, channel 2, refclk0
-set_property PACKAGE_PIN AD32 [get_ports tcds_clk_p]
-# set_property PACKAGE_PIN AK41 [get_ports tcds_rx_p]
-set_property PACKAGE_PIN AG34 [get_ports tcds_tx_p]
-
-set_property LOC GTYE4_COMMON_X0Y1 [get_cells ttc/gen_master_tcds2.tcds2/mgt/if_usp_gty.if_10g.mgt/inst/gen_gtwizard_gtye4_top.gtye4_slave_timing_gtwizard_gtye4_inst/gen_gtwizard_gtye4.gen_common.gen_common_container[1].gen_enabled_common.gtye4_common_wrapper_inst/common_inst/gtye4_common_gen.GTYE4_COMMON_PRIM_INST]
-set_property LOC GTYE4_CHANNEL_X0Y6 [get_cells ttc/gen_master_tcds2.tcds2/mgt/if_usp_gty.if_10g.mgt/inst/gen_gtwizard_gtye4_top.gtye4_slave_timing_gtwizard_gtye4_inst/gen_gtwizard_gtye4.gen_channel_container[1].gen_enabled_channel.gtye4_channel_wrapper_inst/channel_inst/gtye4_channel_gen.gen_gtye4_channel_inst[0].GTYE4_CHANNEL_PRIM_INST]
-
-
-# HEARTBEAT LED
-set_property IOSTANDARD  LVCMOS18 [get_ports heartbeat_led]
-set_property PACKAGE_PIN AM23     [get_ports heartbeat_led]
-
-
-# MGT REF CLOCKS - ASYNC
-# Bank 225 refclk0 (interposer: MGT_CLK_09)
-set_property PACKAGE_PIN AJ12 [get_ports {refclkp[0]}]
-# Bank 227 refclk1 (interposer: MGT_CLK_11)
-set_property PACKAGE_PIN AD10 [get_ports {refclkp[1]}]
-# Bank 230 refclk1 (interposer: MGT_CLK_13)
-set_property PACKAGE_PIN V10  [get_ports {refclkp[2]}]
-# Bank 233 refclk1 (interposer: MGT_CLK_15)
-set_property PACKAGE_PIN M10  [get_ports {refclkp[3]}]
-# KH using for 10g eth ...
-# Bank 133 refclk1 (interposer: MGT_CLK_01)
-#set_property PACKAGE_PIN N30  [get_ports {refclkp[4]}]
-# Bank 130 refclk1 (interposer: MGT_CLK_03)
-set_property PACKAGE_PIN W30  [get_ports {refclkp[5]}]
-# # Bank 128 refclk1 (interposer: MGT_CLK_05)  -- Now used for TCDS2 (via QSFP)
-# set_property PACKAGE_PIN AC30 [get_ports {refclkp[6]}]
-# BAnk 127 refclk1 (interposer: MGT_CLK_07)
-set_property PACKAGE_PIN AE30 [get_ports {refclkp[6]}]
-
-
-# MGT REF CLOCKS - SYNC
-# Bank 224 refclk1 (interposer: MGT_CLK_08)
-set_property PACKAGE_PIN AK10 [get_ports {refclkp[7]}]
-# Bank 227 refclk0 (interposer: MGT_CLK_10)
-set_property PACKAGE_PIN AE12 [get_ports {refclkp[8]}]
-# Bank 230 refclk0 (interposer: MGT_CLK_12)
-set_property PACKAGE_PIN W12  [get_ports {refclkp[9]}]
-# Bank 233 refclk0 (interposer: MGT_CLK_14)
-set_property PACKAGE_PIN N12  [get_ports {refclkp[10]}]
-# Bank 133 refclk0 (interposer: MGT_CLK_00)
-set_property PACKAGE_PIN P32  [get_ports {refclkp[11]}]
-# Bank 130 refclk0 (interposer: MGT_CLK_02)
-set_property PACKAGE_PIN Y32  [get_ports {refclkp[12]}]
-# # Bank 128 refclk0 (interposer: MGT_CLK_04)  -- Quad now used for TCDS2 (via QSFP)
-# set_property PACKAGE_PIN AD32 [get_ports {refclkp[13]}]
-# Bank 127 refclk0 (interposer: MGT_CLK_06)
-set_property PACKAGE_PIN AG30 [get_ports {refclkp[13]}]
diff --git a/replacements/emp-fwk/components/payload/firmware/ucf/emp_simple_payload.tcl b/replacements/emp-fwk/components/payload/firmware/ucf/emp_simple_payload.tcl
deleted file mode 100644
index d2bb3a4f4f797d7c4d498c46840f93d2511a5239..0000000000000000000000000000000000000000
--- a/replacements/emp-fwk/components/payload/firmware/ucf/emp_simple_payload.tcl
+++ /dev/null
@@ -1,3 +0,0 @@
-# Area constraints for MP7 null algo
-#KH cms sep24
-#add_cells_to_pblock [get_pblock payload] payload
diff --git a/replacements/emp-fwk/components/top/addr_table/top_emp.xml b/replacements/emp-fwk/components/top/addr_table/top_emp.xml
index 1dbfd363469346dc91c8246cdb91dd03529efd01..901c6ddd02c71b9f3c1ec717e64fa18a47e05684 100644
--- a/replacements/emp-fwk/components/top/addr_table/top_emp.xml
+++ b/replacements/emp-fwk/components/top/addr_table/top_emp.xml
@@ -4,6 +4,6 @@
     <node id="ttc" module="file://emp_ttc.xml" address="0x400"/>
     <node id="datapath" module="file://emp_datapath.xml" address="0x2000"/>
     <node id="eth10g" module="file://emp_eth10g_interface.xml" address="0x4000"/>
-    <node id="freq" module="file://ipbus_freq_ctr.xml" address="0x40000000"/>
+    <node id="slink" module="file://emp_slink.xml" address="0x1000000" />
     <node id="payload" module="file://emp_payload.xml" address="0x80000000" fwinfo="endpoint;width=31"/>
 </node>
diff --git a/replacements/emp-fwk/components/top/firmware/hdl/emp_top_pcie_both_ttc.vhd b/replacements/emp-fwk/components/top/firmware/hdl/emp_top_pcie_both_ttc.vhd
index 092073ff1e78995b1e4b4baf347c743a645b25ef..2ac77db506624757e959ec1c66b214630cca78cd 100644
--- a/replacements/emp-fwk/components/top/firmware/hdl/emp_top_pcie_both_ttc.vhd
+++ b/replacements/emp-fwk/components/top/firmware/hdl/emp_top_pcie_both_ttc.vhd
@@ -17,6 +17,11 @@ use work.ipbus_decode_top_emp.all;
 use work.emp_device_decl.all;
 use work.emp_slim_top_decl;
 
+use work.emp_slink_types.all;
+use work.emp_slink_core_config_decl.all;
+use work.emp_project_decl.all; -- for SLINK_CONF
+use work.emp_eth10g_types.all;
+
 library UNISIM;
 use UNISIM.VComponents.all;
 
@@ -56,13 +61,6 @@ entity top is
     tcds_rx_n      : in  std_logic;
     tcds_tx_p      : out std_logic;
     tcds_tx_n      : out std_logic;
-    -- 10g eth signals
-    gbe_rx_p          : in std_logic_vector(1 downto 0);
-    gbe_rx_n          : in std_logic_vector(1 downto 0);
-    gbe_tx_p          : out std_logic_vector(1 downto 0);
-    gbe_tx_n          : out std_logic_vector(1 downto 0);
-    gbe_mgt_refclk_p  : in std_logic;
-    gbe_mgt_refclk_n  : in std_logic;
     -- Transceiver ref-clocks
     refclkp        : in  std_logic_vector(N_REFCLK - 1 downto 0);
     refclkn        : in  std_logic_vector(N_REFCLK - 1 downto 0);
@@ -97,10 +95,10 @@ architecture rtl of top is
   signal rsts_aux : std_logic_vector(2 downto 0);
 
   -- TTC signals  
-  signal ttc_l1a, ttc_l1a_dist, dist_lock, oc_flag, ec_flag, ttc_l1a_throttle              : std_logic;
-  signal ttc_cmd, ttc_cmd_dist                                                             : ttc_cmd_t;
-  signal bunch_ctr                                                                         : bctr_t;
-  signal orb_ctr                                                                           : eoctr_t;
+  signal ttc_l1a, ttc_l1a_dist, dist_lock, oc_flag, ec_flag, ttc_l1a_throttle : std_logic;
+  signal ttc_cmd, ttc_cmd_dist                                                : ttc_cmd_t;
+  signal bunch_ctr                                                            : bctr_t;
+  signal orb_ctr                                                              : eoctr_t;
 
   -- Others
   signal nuke, soft_rst : std_logic;
@@ -113,27 +111,26 @@ architecture rtl of top is
   signal ctrs                 : ttc_stuff_array(N_REGION - 1 downto 0);
   signal rst_loc, clken_loc   : std_logic_vector(N_REGION - 1 downto 0);
 
-  signal clk125_s             : std_logic;
+  signal clk125_s : std_logic;
+
+  -- Slink
+  signal slink_payload_data   : slink_input_data_quad_array(SLINK_MAX_QUADS-1 downto  0);
+  signal slink_backpressure   : std_logic_vector(SLINK_MAX_QUADS-1 downto 0) := (others => '0');
 
-  -- 10g
-  signal gbe_ldata : ldata(1 downto 0);
-  signal gbe_lff : std_logic_vector(1 downto 0);
-  
-  -- KH tmp
-  signal clk_40_div, clk_p_div : std_logic;
 
+  --10g
+  signal gbe_ldata        :            ldata(ETH10G_MAX_QUADS*ETH10G_MAX_CHANNELS - 1 downto 0) := (others => LWORD_NULL);
+  signal gbe_backpressure : std_logic_vector(ETH10G_MAX_QUADS*ETH10G_MAX_CHANNELS - 1 downto 0) := (others => '0');
 
 begin
 
 -- Infrastructure
 
-  pcie_rst_passthrough : if emp_slim_top_decl.PCIE_RST_ACTIVE_LEVEL = '0' generate
-    pcie_sys_rst_n <= pcie_sys_rst;
-  end generate;
-
-  pcie_rst_invert : if emp_slim_top_decl.PCIE_RST_ACTIVE_LEVEL = '1' generate
-    pcie_sys_rst_n <= not pcie_sys_rst;
-  end generate;
+pcie_rst_invert : if emp_slim_top_decl.PCIE_RST_ACTIVE_LEVEL = '1' generate
+pcie_sys_rst_n <= not pcie_sys_rst;
+else generate -- pcie_rst_invert
+pcie_sys_rst_n <= pcie_sys_rst;  
+end generate pcie_rst_invert;
 
   infra : entity work.emp_infra_pcie
     port map(
@@ -250,7 +247,6 @@ begin
       rst         => ipb_rst,
       ipb_in      => ipb_w_array(N_SLV_DATAPATH),
       ipb_out     => ipb_r_array(N_SLV_DATAPATH),
-      board_id    => (others => '0'),
       clk125      => clk125_s,
       clk40       => clk40,
       clk_p       => clk_p,
@@ -269,91 +265,84 @@ begin
       );
 
   -- And finally, the payload
-  -- KH ILA_DEBUG for payload defaults to false ...
-  -- if desired set generic here and enable include the xci
-  -- in the eth dep
   payload : entity work.emp_payload
     port map(
-      clk         => ipb_clk,
-      rst         => ipb_rst,
-      ipb_in      => ipb_w_array(N_SLV_PAYLOAD),
-      ipb_out     => ipb_r_array(N_SLV_PAYLOAD),
-      clk40       => clk40,	        
-      clk_payload => clks_aux,
-      rst_payload => rsts_aux,
-      clk_p       => clk_p,
-      rst_loc     => rst_loc,
-      clken_loc   => clken_loc,
-      ctrs        => ctrs,
-      bc0         => open,
-      d           => payload_d,
-      q           => payload_q,
-      gpio        => open,
-      gpio_en     => open,
+      clk           => ipb_clk,
+      rst           => ipb_rst,
+      ipb_in        => ipb_w_array(N_SLV_PAYLOAD),
+      ipb_out       => ipb_r_array(N_SLV_PAYLOAD),
+      clk40         => clk40,	        
+      clk_payload   => clks_aux,
+      rst_payload   => rsts_aux,
+      clk_p         => clk_p,
+      rst_loc       => rst_loc,
+      clken_loc     => clken_loc,
+      ttc_cmd       => ttc_cmd_dist,
+      ctrs          => ctrs,
+      bc0           => open,
+      d             => payload_d,
+      q             => payload_q,
+      gpio          => open,
+      gpio_en       => open,
+      slink_q       => slink_payload_data,
+      backpressure  => slink_backpressure,
       -- 10g
       gbe_q             => gbe_ldata,
-      gbe_backpressure  => gbe_lff
-      );
+      gbe_backpressure  => gbe_backpressure
+
+    );
+
+    slink_check : if slink_quads_enabled(SLINK_CONF) > 0 generate
+      slink : entity work.emp_slink_interface
+        generic map (
+          throughput      => SLINK_THROUGHPUT,
+          technology      => SLINK_XCVR_TYPE,
+          ref_clock_freq  => SLINK_REFCLK_FREQ,
+          ref_clock_index => IO_REGION_SPEC(SLINK_CONF(0).region).io_async_refclk
+        )
+        port map (
+          ipb_clk      => ipb_clk,
+          ipb_rst      => ipb_rst,
+          ipb_in       => ipb_w_array(N_SLV_SLINK),
+          ipb_out      => ipb_r_array(N_SLV_SLINK),
+
+          clk_40       => clk40ish,
+          clk_p        => clk_p,
+
+          slink_d      => slink_payload_data,
+          backpressure => slink_backpressure,
+
+          refclkp      => refclkp,
+          refclkn      => refclkn
+        );
+  end generate;
 
 
   --
   -- 10g
   --
-  eth10g : entity work.emp_eth10g_interface
-    generic map ( ETH10G_CHANNELS => 2 )
+  eth10g_interface : entity work.emp_eth10g_interface
+    generic map (
+      ref_clock_index => 4
+    )
     port map (
-      clk_ipb         => ipb_clk,
-      rst_ipb         => ipb_rst,
-      ipb_in          => ipb_w_array(N_SLV_ETH10G),
-      ipb_out         => ipb_r_array(N_SLV_ETH10G),
-      --
+      --- Input Ports ---
       clk_p           => clk_p,
       rst_p           => rst_p,
-      clk125          => clk125,
-      -- Input from payload
+      clk125 	        => clk125,
+      refclkp         => refclkp,
+      refclkn         => refclkn,
       ldata_in        => gbe_ldata,
-      -- backpressure to payload
-      lff             => gbe_lff,
-      --10g
-      gbe_rx_p          => gbe_rx_p,
-      gbe_rx_n          => gbe_rx_n,
-      gbe_tx_p          => gbe_tx_p,
-      gbe_tx_n          => gbe_tx_n,
-      gbe_mgt_refclk_p  => gbe_mgt_refclk_p,
-      gbe_mgt_refclk_n  => gbe_mgt_refclk_n
-      );
-  
-  
-
-
--- KH tmp to check clk_p
-  div : entity work.freq_ctr_div
-    generic map(
-      N_CLK => 2
-      )
-    port map(
-      clk(0)    => clk_p,
-      clk(1)    => clk40,
-      clkdiv(0) => clk_p_div,
-      clkdiv(1) => clk_40_div
-      );
-
--- Clock frequency monitor
-
-  ctr : entity work.ipbus_freq_ctr
-    generic map(
-      N_CLK => 2
-      )
-    port map(
-      clk                => ipb_clk,
-      rst                => ipb_rst,
-      ipb_in             => ipb_w_array(N_SLV_FREQ),
-      ipb_out            => ipb_r_array(N_SLV_FREQ),
-      clkdiv(0)          => clk_p_div,
-      clkdiv(1)          => clk_40_div
-      );
-
-
+      --- Output Ports ---
+      backpressure    => gbe_backpressure,
+      --- IPBus Ports ---
+      ipb_clk         => ipb_clk,
+      ipb_rst         => ipb_rst,
+      ipb_in          => ipb_w_array(N_SLV_ETH10G),
+      ipb_out         => ipb_r_array(N_SLV_ETH10G)
+      --- Pin Ports ---
+      -- gbe_mgt_refclk_p  => gbe_mgt_refclk_p,
+      -- gbe_mgt_refclk_n  => gbe_mgt_refclk_n  
+    );
 
 end rtl;
-
diff --git a/replacements/emp-fwk/components/top/firmware/ucf/clock_constraints_common.tcl b/replacements/emp-fwk/components/top/firmware/ucf/clock_constraints_common.tcl
deleted file mode 100644
index fb9fdc0fe2a22ed881a0b2d5809858c7e6df4a02..0000000000000000000000000000000000000000
--- a/replacements/emp-fwk/components/top/firmware/ucf/clock_constraints_common.tcl
+++ /dev/null
@@ -1,52 +0,0 @@
-# 40MHz & payload I/O clocks derived from board-local source (for tests without external clock source)
-create_generated_clock -name clk_40_pseudo_i [get_pins ttc/bufgce_clk_40_rx/O]
-create_generated_clock -name clk_40_pseudo   -source [get_pins ttc/clocks/mmcm/CLKIN2] [get_pins ttc/clocks/mmcm/CLKOUT1]
-create_generated_clock -name clk_payload_pseudo -source [get_pins ttc/clocks/mmcm/CLKIN2] [get_pins ttc/clocks/mmcm/CLKOUT3]
-
-# Names of the LHC-synchronised derived clocks that are used by payload and infra (outside of TTC block)
-lappend lMainInternalClocks clk_40_pseudo clk_payload_pseudo
-
-
-if {[llength [get_pins -quiet ttc/gen_master_legacy.osc_clock/mmcm/CLKOUT1]] != 0} {
-    create_generated_clock -name clk_40_extern_i0 [get_pins ttc/gen_master_legacy.osc_clock/gen_mmcm/mmcm/CLKOUT1]
-}
-
-if {[llength [get_pins -quiet ttc/gen_master_tcds2.tcds2/tcds2_interface/bufgce_clk_40_rx/O]] != 0} {
-    create_generated_clock -name clk_40_extern_i1 [get_pins ttc/gen_master_tcds2.tcds2/tcds2_interface/bufgce_clk_40_rx/O]
-}
-
-foreach i [list 0 1] {
-    if {[llength [get_clocks -quiet clk_40_extern_i$i]] != 0 } {
-        create_generated_clock -name clk_40_extern$i -master_clock [get_clocks clk_40_extern_i$i] [get_pins ttc/clocks/mmcm/CLKOUT1]
-        # Payload I/O clock derived from external oscillator
-        create_generated_clock -name clk_payload_extern$i -master_clock [get_clocks clk_40_extern_i$i] [get_pins ttc/clocks/mmcm/CLKOUT3]
-
-        lappend lMainInternalClocks clk_40_extern_i$i clk_40_extern$i clk_payload_extern$i
-    }
-}
-
-
-# Clock groups: Asynchronous
-puts "lMainInternalClocks = $lMainInternalClocks"
-set_clock_groups -asynch -group [get_clocks axi_clk] -group [get_clocks -include_generated_clocks ipbus_clk]
-set_clock_groups -asynch -group [get_clocks -include_generated_clocks ipbus_clk] -group $lMainInternalClocks
-
-# Clock groups: Logically exclusive
-# The 40MHz, 160MHz and payload clocks used across the chip are generated by an MMCM with two clock sources:
-#  * an externally-provided LHC clock (typically from TCDS), which itself could come from one of two interfaces (clk_40_externN); and
-#  * an internally-generated 'pseudo-LHC' clock (clk_40_pseudo)
-# Must set the copies of the clocks generated from those sources as logically exclusive
-foreach lMasterA [list clk_40_pseudo_i clk_40_pseudo_i clk_40_extern_i0] lMasterB [list clk_40_extern_i0 clk_40_extern_i1 clk_40_extern_i1] {
-    if {[llength [get_clocks -quiet [list $lMasterA $lMasterB]]] == 2} {
-        puts "Declaring clocks derived from $lMasterA and $lMasterB as logically exclusive"
-        set_clock_groups -logically_exclusive -group [get_clocks -filter "MASTER_CLOCK == $lMasterA"] -group [get_clocks -filter "MASTER_CLOCK == $lMasterB"]
-    }
-}
-
-
-# Remove timing constraints for heartbeat LED output port
-set_false_path -to [get_ports -regexp "(.+_led|led_.+)"]
-
-# Print clock report for the record (in case build fails, or need to debug clock-related issues)
-report_clocks
-
diff --git a/replacements/emp-fwk/components/top/firmware/ucf/clock_constraints_tcds2.tcl b/replacements/emp-fwk/components/top/firmware/ucf/clock_constraints_tcds2.tcl
new file mode 100644
index 0000000000000000000000000000000000000000..606c6caf8b35ccc2b6da32e9c7fc317d2310a392
--- /dev/null
+++ b/replacements/emp-fwk/components/top/firmware/ucf/clock_constraints_tcds2.tcl
@@ -0,0 +1,12 @@
+
+# Define 125MHz clock, and declare as async to other clocks
+# Note: In some designs 125MHz clock is top-level port (e.g. Serenity DC),
+#       otherwise its a derived clock from the infra block (e.g. Apollo)
+if {[llength [get_ports -quiet clk125]] != 0} {
+    create_clock -period 8.000 -name sys_clk125 [get_ports clk125]
+}
+set_clock_groups -asynch -group [get_clocks -include_generated_clocks sys_clk125]
+
+# Paths from TCDS core to EMP TTC logic: Only perform timing analysis when clk40 in EMP logic comes from TCDS core
+# Commented out as it throws error in Vivado 2022
+# set_false_path -through [get_nets {ttc/*tcds2_interface_stat[channel0_ttc2]*}] -to [get_clocks {clk_40_extern0 clk_40_pseudo}]
diff --git a/replacements/emp-fwk/components/top/firmware/ucf/clock_declarations_pcie.tcl b/replacements/emp-fwk/components/top/firmware/ucf/clock_declarations_pcie.tcl
deleted file mode 100644
index e49c9d01bf70044ca92097b07f2b08af5d7cfb57..0000000000000000000000000000000000000000
--- a/replacements/emp-fwk/components/top/firmware/ucf/clock_declarations_pcie.tcl
+++ /dev/null
@@ -1,12 +0,0 @@
-
-# 100 Mhz PCIe system clock
-create_clock -period 10.000 -name pcie_sys_clk [get_ports pcie_sys_clk_p]
-
-# IPbus clock
-create_generated_clock -name ipbus_clk -source [get_pins infra/clocks/mmcm/CLKIN1] [get_pins infra/clocks/mmcm/CLKOUT1]
-
-# AXI clock
-create_generated_clock -name axi_clk [get_pins -hierarchical -filter {NAME =~infra/dma/xdma/*/phy_clk_i/bufg_gt_userclk/O}]
-
-# Approx 40MHz clock derived from AXI clock (for tests without external clock source)
-#create_generated_clock -name clk_40_pseudo_i [get_pins infra/clocks/mmcm/CLKOUT2]
diff --git a/replacements/emp-fwk/components/ttc/firmware/hdl/emp_ttc.vhd b/replacements/emp-fwk/components/ttc/firmware/hdl/emp_ttc.vhd
deleted file mode 100644
index bf1c409c13f1737afb61e6a7174fac6e8e9c0552..0000000000000000000000000000000000000000
--- a/replacements/emp-fwk/components/ttc/firmware/hdl/emp_ttc.vhd
+++ /dev/null
@@ -1,589 +0,0 @@
--- ttc
---
--- TTC decoder, counters, LHC clock distribution, etc
---
--- Dave Newbold, June 2013
-
-library IEEE;
-use IEEE.STD_LOGIC_1164.all;
-use ieee.numeric_std.all;
-
-library unisim;
-use unisim.VComponents.all;
-
-use work.ipbus.all;
-use work.ipbus_reg_types.all;
-use work.ipbus_decode_emp_ttc.all;
-use work.emp_ttc_decl.all;
-use work.emp_ttc_utils;
-
-use work.emp_device_decl;
-use work.emp_project_decl.all;
-
-use work.tcds2_interface_pkg;
-use work.tcds2_streams_pkg;
-
-
--------------------------------------------------------------------------------
-entity emp_ttc is
-  generic(
-    ENABLE_LEGACY_TTC : boolean;
-    ENABLE_TCDS2      : boolean;
-    EXT_CLK_FREQ      : real
-    );
-  port(
-    -- ipbus clock & rst
-    clk_ipb      : in  std_logic;
-    rst_ipb      : in  std_logic;
-    -- IPBus
-    ipb_in       : in  ipb_wbus;
-    ipb_out      : out ipb_rbus;
-    -- 125MHz clock
-    clk125       : in  std_logic;
-    -- internal pseudo-40MHz clock
-    clk40ish_in  : in  std_logic;
-    -- clock outputs
-    clk40        : out std_logic;
-    -- clock domain reset outputs
-    rst40        : out std_logic;
-    clk_p        : out std_logic;
-    rst_p        : out std_logic;
-    clks_aux     : out std_logic_vector(2 downto 0);
-    rsts_aux     : out std_logic_vector(2 downto 0);
-    -- Legacy TTC interface
-    ttc_clk_p    : in  std_logic;
-    ttc_clk_n    : in  std_logic;
-    ttc_rx_p     : in  std_logic;
-    ttc_rx_n     : in  std_logic;
-    -- TCDS2 interface
-    tcds_clk_p   : in  std_logic;
-    tcds_clk_n   : in  std_logic;
-    tcds_rx_p    : in  std_logic;
-    tcds_rx_n    : in  std_logic;
-    tcds_tx_p    : out std_logic;
-    tcds_tx_n    : out std_logic;
-    -- TTC b command output
-    ttc_cmd      : out ttc_cmd_t;
-    ttc_cmd_dist : out ttc_cmd_t;
-    -- L1A output
-    ttc_l1a      : out std_logic;
-    -- L1A qualifier output
-    ttc_l1a_dist : out std_logic;
-    dist_lock    : in  std_logic;
-    bunch_ctr    : out bctr_t;
-    evt_ctr      : in  eoctr_t;
-    orb_ctr      : out eoctr_t;
-    oc_flag      : out std_logic;
-    ec_flag      : out std_logic;
-    -- clock monitoring inputs from MGTs
-    monclk       : in  std_logic_vector(3 downto 0);
-    clk125_o     : out std_logic
-    );
-
-end emp_ttc;
--------------------------------------------------------------------------------
-
--------------------------------------------------------------------------------
-architecture rtl of emp_ttc is
-
-  signal clk40_ext, clk40_ext_legacy, clk40_ext_tcds2                                     : std_logic;
-  signal tcds_refclk_b, tcds_refclk_div                                                   : std_logic;
-  signal clk40_i, rst40_i, clk160s, clk40_div, rsti, rsti_40, clk40_a, rst40_a, clk_p_i, rst_p_i   : std_logic;
-  signal lock, stop                                                                       : std_logic;
-  signal clks_aux_i, rsts_aux_i                                                           : std_logic_vector(2 downto 0);
-  signal l1a_ext_legacy, l1a_ext_tcds2                                                    : std_logic;
-  signal l1a, l1a_ttc, l1a_del, l1a_ext, l1a_pend, cmd_bx, cmd_pend, l1a_issue, cmd_issue : std_logic;
-  signal cmd, cmd_ttc, cmd_del, cmd_ext_tcds2, cmd_ext_legacy                             : ttc_cmd_t;
-  signal psok, bc0_fr, ctr_clr                                                            : std_logic;
-  signal bunch_ctr_i                                                                      : bctr_t;
-  signal req_bx                                                                           : unsigned(bctr_t'range);
-  signal orb_ctr_i                                                                        : eoctr_t;
-  signal clk40_mmcm_sel                                                                   : std_logic;
-
-  signal stat_clk40 : ipb_reg_v(0 downto 0);
-  signal ctrl_clk40 : ipb_reg_v(0 downto 0);
-
-  signal stat_common : ipb_reg_v(2 downto 0);
-  signal ctrl_common : ipb_reg_v(0 downto 0);
-  signal stb_common  : std_logic_vector(0 downto 0);
-
-  signal bc0_lock : std_logic;
-  signal ipbw     : ipb_wbus_array(N_SLAVES - 1 downto 0);
-  signal ipbr     : ipb_rbus_array(N_SLAVES - 1 downto 0);
-  
-  signal clk_40_to_mmcm : std_logic;
-
-begin
-
-
-
--- ipbus address decode
-
-  fabric : entity work.ipbus_fabric_sel
-    generic map(
-      NSLV      => N_SLAVES,
-      SEL_WIDTH => IPBUS_SEL_WIDTH)
-    port map(
-      ipb_in          => ipb_in,
-      ipb_out         => ipb_out,
-      sel             => ipbus_sel_emp_ttc(ipb_in.ipb_addr),
-      ipb_to_slaves   => ipbw,
-      ipb_from_slaves => ipbr
-      );
-
--- TTC control registers
-
-  reg_clk40 : entity work.ipbus_ctrlreg_v
-    generic map (
-      N_CTRL => 1,
-      N_STAT => 1
-      )
-    port map (
-      clk       => clk_ipb,
-      reset     => rst_ipb,
-      ipbus_in  => ipbw(N_SLV_CLK40),
-      ipbus_out => ipbr(N_SLV_CLK40),
-      d         => stat_clk40,
-      q         => ctrl_clk40,
-      stb       => open
-      );
-
-  stat_clk40(0)(0) <= lock;
-  stat_clk40(0)(1) <= stop;
-
-  reg_common : entity work.ipbus_syncreg_v
-    generic map(
-      N_CTRL => 1,
-      N_STAT => 3
-      )
-    port map(
-      clk     => clk_ipb,
-      rst     => rst_ipb,
-      ipb_in  => ipbw(N_SLV_MASTER_COMMON),
-      ipb_out => ipbr(N_SLV_MASTER_COMMON),
-      slv_clk => clk40_a,
-      d       => stat_common,
-      q       => ctrl_common,
-      stb     => stb_common
-      );
-
-  stat_common(0)(0) <= '1' when ENABLE_LEGACY_TTC else '0';
-  stat_common(0)(1) <= '1' when ENABLE_TCDS2      else '0';
-
-
-  -- Mux for external clocks
-  gen_ext_mux : if ENABLE_TCDS2 and ENABLE_LEGACY_TTC generate
-
-    signal sel_pipeline : std_logic_vector(3 downto 0);
- 
-  begin
-
-    process (clk_ipb)
-    begin
-      if rising_edge(clk_ipb) then
-        sel_pipeline(0) <= ctrl_clk40(0)(2);
-        sel_pipeline(1) <= sel_pipeline(0);
-        sel_pipeline(2) <= sel_pipeline(1);
-        sel_pipeline(3) <= sel_pipeline(2);
-      end if;
-    end process;
-
-    clk40mux : BUFGMUX
-      port map (
-        S  => sel_pipeline(3),
-        I0 => clk40_ext_legacy,
-        I1 => clk40_ext_tcds2,
-        O  => clk40_ext
-        );
-
-  elsif ENABLE_TCDS2 generate
-
-    clk40_ext <= clk40_ext_tcds2;
-
-  else generate
-
-    clk40_ext <= clk40_ext_legacy;
-
-  end generate;
-
-
--- MMCM for clock multiplication / phase adjustment
-
-  rsti           <= rst_ipb or ctrl_common(0)(2);
-  clk40_mmcm_sel <= ctrl_clk40(0)(1) or ctrl_clk40(0)(2);
-  
-  bufgce_clk_40_rx : bufgce_div
-    generic map (
-      BUFGCE_DIVIDE => 8
-    )
-    port map (
-      i   => tcds_refclk_b,
-      o   => clk_40_to_mmcm,
-      ce  => '1',
-      clr => '0'
-    );  
-
-  clocks : entity work.emp_ttc_clocks
-    port map(
-      clk_40       => clk40_ext,
-      clk_40pseudo => clk_40_to_mmcm,
-      clko_40      => clk40_i,
-      clko_p       => clk_p_i,
-      clko_aux     => clks_aux_i,
-      rsto_40      => rst40_i,
-      rsto_p       => rst_p_i,
-      rsto_aux     => rsts_aux_i,
-      clko_160s    => clk160s,
-      stopped      => stop,
-      locked       => lock,
-      rst_mmcm     => ctrl_clk40(0)(0),
-      rsti         => rsti_40,
-      clksel       => clk40_mmcm_sel,
-      psval        => ctrl_common(0)(23 downto 12),
-      psok         => psok,
-      psen         => ctrl_common(0)(24)
-      );
-
-  clk40_a  <= clk40_i;  -- Needed to make sure delta delays line up in simulation!
-  rst40_a  <= rst40_i;
-  clk40    <= clk40_i;
-  rst40    <= rst40_i;
-  clk_p    <= clk_p_i;
-  rst_p    <= rst_p_i;
-  clks_aux <= clks_aux_i;
-  rsts_aux <= rsts_aux_i;
-
--- TTC protocol decoder
-
-  gen_master_tcds2 : if ENABLE_TCDS2 generate
-
-    signal clk125_i, clk125_b : std_logic;
-    signal tcds_refclk        : std_logic;
-    signal tcds_refclk_i      : std_logic;
-    signal tcds_orbit_pulse   : std_logic;
-
-    signal channel0_ttc2, channel1_ttc2 : tcds2_streams_pkg.tcds2_ttc2;
-    signal tcds2_interface_ctrl : tcds2_interface_pkg.tcds2_interface_ctrl_t;
-    signal tcds2_interface_stat : tcds2_interface_pkg.tcds2_interface_stat_t;
-
-  begin
-
-    clk125_o <= clk125_b;
-
-    ibufds_gt : IBUFDS_GTE4
-      port map (
-        i     => tcds_clk_p,
-        ib    => tcds_clk_n,
-        o     => tcds_refclk,
-        odiv2 => tcds_refclk_i,
-        ceb   => '0'
-        );
-
-    ibuf_osc : IBUF
-      port map (
-        O => clk125_i,
-        I => clk125
-        );
-
-    bufg_osc : BUFG
-      port map (
-        I => clk125_i,
-        O => clk125_b
-        );
-
-    bufg_ref : BUFG_GT
-      port map (
-        i       => tcds_refclk_i,
-        o       => tcds_refclk_b,
-        ce      => '1',
-        clr     => '0',
-        div     => "000",
-        cemask  => '1',
-        clrmask => '0'
-        );
-
-    tcds2 : entity work.tcds2_interface_with_mgt
-      generic map (
-        G_MGT_TYPE => emp_ttc_utils.get_tcds2_mgt_type(emp_device_decl.TCDS2_MGT_TYPE),
-        G_LINK_SPEED => emp_ttc_utils.get_tcds2_link_speed(emp_device_decl.TCDS2_SPEED),
-        G_INCLUDE_PRBS_LINK_TEST => true
-        )
-      port map (
-        ctrl_i => tcds2_interface_ctrl,
-        stat_o => tcds2_interface_stat,
-
-        clk_sys_125mhz => clk125_b,
-
-        mgt_tx_p_o => tcds_tx_p,
-        mgt_tx_n_o => tcds_tx_n,
-        mgt_rx_p_i => tcds_rx_n,
-        mgt_rx_n_i => tcds_rx_p,
-
-        clk_320_mgt_ref_i => tcds_refclk,
-
-        clk_40_o => clk40_ext_tcds2,
-
-        orbit_o => tcds_orbit_pulse,
-
-        channel0_ttc2_o    => channel0_ttc2,
-        channel0_tts2_i(0) => tcds2_streams_pkg.C_TCDS2_TTS2_VALUE_IGNORED,
-        channel1_ttc2_o    => channel1_ttc2,
-        channel1_tts2_i(0) => tcds2_streams_pkg.C_TCDS2_TTS2_VALUE_IGNORED
-        );
-
-    process (clk40_a)
-    begin
-      if rising_edge(clk40_a) then
-        -- Only consider a BC0 signal to be received if I see it on both of those channels in the same BX
-        -- Reason: Improve robustness against bitflips in TTC path for Serenity
-        -- TODO: Set this behvaviour using SW-settable register in v0.7.0, rather than hardcoding
-        if (channel0_ttc2.sync_flags_and_commands(0) = '1') and (channel1_ttc2.sync_flags_and_commands(0) = '1') then
-          cmd_ext_tcds2 <= TTC_BCMD_BC0;
-        else
-          cmd_ext_tcds2 <= TTC_BCMD_NULL;
-        end if;
-
-        rsti_40 <= rsti;
-
-      end if;
-    end process;
-
-    l1a_ext_tcds2 <= '0';
-
-    csr : entity work.ipbus_tcds2_interface_accessor
-      port map (
-        clk_ipb => clk_ipb,
-        rst_ipb => rst_ipb,
-        ipb_in  => ipbw(N_SLV_MASTER_TCDS2),
-        ipb_out => ipbr(N_SLV_MASTER_TCDS2),
-
-        ctrl_o => tcds2_interface_ctrl,
-        stat_i => tcds2_interface_stat
-        );
-
-  else generate
-
-    tcds_tx_p <= '0';
-    tcds_tx_n <= '0';
-
-    tcds_refclk_b   <= '0';
-    clk40_ext_tcds2 <= '0';
-    cmd_ext_tcds2   <= TTC_BCMD_NULL;
-    l1a_ext_tcds2   <= '0';
-
-    ipbr(N_SLV_MASTER_TCDS2).ipb_ack   <= '0';
-    ipbr(N_SLV_MASTER_TCDS2).ipb_err   <= ipbw(N_SLV_MASTER_TCDS2).ipb_strobe;
-    ipbr(N_SLV_MASTER_TCDS2).ipb_rdata <= (others => '0');
-
-  end generate;
-
-
-  gen_master_legacy : if ENABLE_LEGACY_TTC generate
-
-    signal err_rst                : std_logic;
-    signal sinerr_ctr, dblerr_ctr : std_logic_vector(15 downto 0);
-    signal stat_legacy            : ipb_reg_v(0 downto 0);
-    signal ctrl_legacy            : ipb_reg_v(0 downto 0);
-    signal stb_legacy             : std_logic_vector(0 downto 0);
-
-  begin
-
-    osc_clock : entity work.emp_oscclk
-      generic map (
-        OSC_FREQ => EXT_CLK_FREQ
-        )
-      port map (
-        clk_p => ttc_clk_p,
-        clk_n => ttc_clk_n,
-        clk40 => clk40_ext_legacy
-        );
-
-    reg : entity work.ipbus_syncreg_v
-      generic map(
-        N_CTRL => 1,
-        N_STAT => 1
-        )
-      port map(
-        clk     => clk_ipb,
-        rst     => rst_ipb,
-        ipb_in  => ipbw(N_SLV_MASTER_LEGACY),
-        ipb_out => ipbr(N_SLV_MASTER_LEGACY),
-        slv_clk => clk40_a,
-        d       => stat_legacy,
-        q       => ctrl_legacy,
-        stb     => stb_legacy
-        );
-
-    interface : entity work.emp_ttc_legacy
-      port map(
-        clk         => clk40_a,
-        rst         => rst40_a,
-        sclk        => clk160s,
-        sclk_locked => lock,
-        ttc_in_p    => ttc_rx_p,
-        ttc_in_n    => ttc_rx_n,
-        l1a         => l1a_ext_legacy,
-        cmd         => cmd_ext_legacy,
-        sinerr_ctr  => sinerr_ctr,
-        dblerr_ctr  => dblerr_ctr,
-        err_rst     => err_rst
-        );
-
-    err_rst        <= ctrl_legacy(0)(0) and stb_legacy(0);
-    stat_legacy(0) <= dblerr_ctr & sinerr_ctr;
-
-
-  else generate
-
-    clk40_ext_legacy <= '0';
-    cmd_ext_legacy   <= TTC_BCMD_NULL;
-    l1a_ext_legacy   <= '0';
-
-    ipbr(N_SLV_MASTER_LEGACY).ipb_ack   <= '0';
-    ipbr(N_SLV_MASTER_LEGACY).ipb_err   <= ipbw(N_SLV_MASTER_LEGACY).ipb_strobe;
-    ipbr(N_SLV_MASTER_LEGACY).ipb_rdata <= (others => '0');
-
-  end generate;
-
-
-  -- FIXME: Select between each of two external sources and internal
-  with ctrl_common(0)(1 downto 0) select cmd_ttc <=
-    cmd_ext_legacy when "01",
-    cmd_ext_tcds2  when "10",
-    TTC_BCMD_NULL  when others;
-
-  with ctrl_common(0)(1 downto 0) select l1a_ttc <=
-    l1a_ext_legacy when "01",
-    l1a_ext_tcds2  when "10",
-    '0'            when others;
-
-  -- L1A generation
-  l1a       <= l1a_ttc or l1a_pend;
-  l1a_issue <= l1a and not l1a_ttc;
-
-  -- TTC command generation
-  req_bx <= to_unsigned(LHC_BUNCH_COUNT, req_bx'length) - to_unsigned(TTC_DEL, req_bx'length) - 1;
-  cmd_bx <= '1' when std_logic_vector(req_bx) = bunch_ctr_i else '0';
-
-  process(cmd_ttc, bc0_fr, cmd_pend, cmd_bx)
-  begin
-    cmd_issue <= '0';
-    if cmd_ttc /= TTC_BCMD_NULL then
-      cmd <= cmd_ttc;
-    elsif bc0_fr = '1' then
-      cmd <= TTC_BCMD_BC0;
-    elsif cmd_pend = '1' then
-      cmd       <= ctrl_common(0)(15 downto 8);
-      cmd_issue <= '1';
-    else
-      cmd <= TTC_BCMD_NULL;
-    end if;
-  end process;
-
-  process(clk40_a)
-  begin
-    if rising_edge(clk40_a) then
-      cmd_pend     <= (cmd_pend or (ctrl_common(0)(5) and stb_common(0))) and not (rst40_a or cmd_issue);
-      l1a_pend     <= l1a_pend and not (rst40_a or l1a_issue);
-      ttc_cmd_dist <= cmd;
-    end if;
-  end process;
-
-  ttc_l1a_dist <= l1a;
-
--- Counters
-
-  ctr_clr <= ctrl_common(0)(4) and stb_common(0);
-
-  ttcctr : entity work.ttc_ctrs
-    port map(
-      clk         => clk40_a,
-      rst         => rst40_a,
-      ttc_cmd     => cmd,
-      l1a         => l1a,
-      clr         => '0',
-      en_int_bc0  => ctrl_common(0)(3),
-      bc0_lock    => bc0_lock,
-      bc0_fr      => bc0_fr,
-      ttc_cmd_out => cmd_del,
-      l1a_out     => l1a_del,
-      bunch_ctr   => bunch_ctr_i,
-      orb_ctr     => orb_ctr_i
-      );
-
-  ttc_cmd   <= cmd_del;
-  ttc_l1a   <= l1a_del;
-  bunch_ctr <= bunch_ctr_i;
-  orb_ctr   <= orb_ctr_i;
-  oc_flag   <= '1' when orb_ctr_i(13 downto 0) = (13 downto 0 => '0') and bc0_lock = '1' else '0';
-  ec_flag   <= '1' when evt_ctr(16 downto 0) = (16 downto 0   => '0')                    else '0';
-
--- Status reg
-
-  stat_common(0)(7 downto 2)   <= (l1a_pend or cmd_pend) & psok & dist_lock & bc0_lock & "00";
-  stat_common(0)(19 downto 8)  <= bunch_ctr_i;
-  stat_common(0)(31 downto 20) <= std_logic_vector(to_unsigned(LHC_BUNCH_COUNT, 12));
-  stat_common(1)               <= evt_ctr;
-  stat_common(2)               <= orb_ctr_i;
-
--- clk40 frequency monitoring   
-
-  div : entity work.freq_ctr_div
-    generic map(
-      N_CLK => 2
-      )
-    port map(
-      clk(0)    => clk40_a,
-      clk(1)    => tcds_refclk_b,
-      clkdiv(0) => clk40_div,
-      clkdiv(1) => tcds_refclk_div
-      );
-
--- Clock frequency monitor
-
-  ctr : entity work.ipbus_freq_ctr
-    generic map(
-      N_CLK => 6
-      )
-    port map(
-      clk                => clk_ipb,
-      rst                => rst_ipb,
-      ipb_in             => ipbw(N_SLV_FREQ),
-      ipb_out            => ipbr(N_SLV_FREQ),
-      clkdiv(0)          => clk40_div,
-      clkdiv(1)          => tcds_refclk_div,
-      clkdiv(5 downto 2) => monclk
-      );
-
--- TTC history buffer
-
-  hist : entity work.ttc_history_new
-    port map(
-      clk     => clk_ipb,
-      rst     => rst_ipb,
-      ipb_in  => ipbw(N_SLV_HIST),
-      ipb_out => ipbr(N_SLV_HIST),
-      ttc_clk => clk40_a,
-      ttc_rst => rst40_a,
-      ttc_l1a => l1a_del,
-      ttc_cmd => cmd_del,
-      ttc_bx  => bunch_ctr_i,
-      ttc_orb => orb_ctr_i,
-      ttc_evt => evt_ctr
-      );
-
--- Command counters
-
-  cmdctrs : entity work.ttc_cmd_ctrs
-    port map(
-      clk     => clk_ipb,
-      rst     => rst_ipb,
-      ipb_in  => ipbw(N_SLV_CMD_CTRS),
-      ipb_out => ipbr(N_SLV_CMD_CTRS),
-      ttc_clk => clk40_a,
-      clr     => ctr_clr,
-      ttc_cmd => cmd_del
-      );
-
-end rtl;
--------------------------------------------------------------------------------
diff --git a/top/addr_table/emp_payload.xml b/top/addr_table/emp_payload.xml
index 12acae9558aaac50caa6c976eeff9b581fec48ed..f37df61257a4f900107b812560a831791898e26a 100644
--- a/top/addr_table/emp_payload.xml
+++ b/top/addr_table/emp_payload.xml
@@ -4,24 +4,19 @@
         <node id="chan_sel" mask="0x7f"/>
     </node>
 
-    <node id="csr" address="0x00004" description="Histogram control and status" fwinfo="endpoint;width=2">
-        <node id="windowL" address="0x0"/>
-        <node id="windowH" address="0x1" mask="0x000f"/>
-        <node id="histogram_enable" address="0x1" mask="0x0010"/>
-        <node id="histogram_sel" address="0x1" mask="0xffe0"/>
-        <node id="histogram0" address="0x2"/>
-        <node id="histogram1" address="0x3"/>
-    </node>
-
-    <node id="fe_chan" address="0x040" description="FE channel control and status" module="file://dtc_link_interface.xml" fwinfo="endpoint;width=6"/>
+    <node id="fe_chan" address="0x200" module="file://dtc_link_interface.xml" fwinfo="endpoint;width=9"/>
 
-    <node id="mproc_ctrl" address="0x1ff" description="MProcessor channel control" fwinfo="endpoint;width=0">
+    
+    <node id="mprocessor" address="0x400" description="MProcessor control and status" module="file://mprocessor.xml" fwinfo="endpoint;width=7"/>
+    <node id="mproc_ctrl" address="0x4ff" description="MProcessor channel control" fwinfo="endpoint;width=0">
         <node id="chan_sel" mask="0x7f"/>
+        <node id="srst"     mask="0x80"/>
+        <node id="sync_fastreset"     mask="0x100"/>
     </node>
-    <node id="mprocessor" address="0x200" description="MProcessor control and status" module="file://mprocessor.xml" fwinfo="endpoint;width=7"/>
+
+    <node id="tcds_fast_cmd" address="0x600" module="file://dtc_tcds_fastcmd.xml"/>
+
+    <node id="link_monitor" address="0x10000" module="file://LinkMonitorInterface.xml"/>
     
     <node id="be_daq" address="0x40000000" module="file://dtc_data_aggregator.xml" fwinfo="endpoint;width=30"/>
-
-    <node id="mem1" address="0x1000" size="0x200" mode="incremental" fwinfo="endpoint;width=9"/>
-    <node id="mem2" address="0x2000" size="0x200" mode="incremental" fwinfo="endpoint;width=9"/>
 </node>
diff --git a/top/firmware/cfg/top.dep b/top/firmware/cfg/top.dep
index 1ab335d61fafefd901ee3a424e750657f8c8d334..2b37dc34fb52519cea4a6724b0c16a47e881702b 100644
--- a/top/firmware/cfg/top.dep
+++ b/top/firmware/cfg/top.dep
@@ -1,5 +1,3 @@
-setup -f --cd ../cfg settings.tcl
-
 include -c histogram:top histogram.dep
 include -c dtc:dtc-fe/2S/5G-FEC12 module.dep
 include -c dtc:dtc-fe/2S/5G-FEC12 framer.dep
@@ -21,35 +19,13 @@ include -c emp-fwk:components/links/fe_mgt/lpgbt/interface interface_lpgbt.dep
 ? toolset.lower() == "vivado" ? setup -c emp-fwk:components/payload emp_simple_payload_msg_suppressions.tcl
 
 include -c 10gb-ethernet:eth10g emp_eth10g.dep
+include -c dtc-monitoring:common module.dep
+include -c common module.dep
 
 src emp_project_decl.vhd
 src emp_payload.vhd
 src link_maps.vhd
-src ipbus_decode_emp_payload.vhd
-src mprocessor_constants.vhd
-src MProcessor.vhd
-src ipbus_decode_mprocessor.vhd
-src LinkAggregatorCore.vhd
-src LinkAggregatorIPBus.vhd
-src ipbus_decode_link_aggregator.vhd
-src fixed_pkg_2008.vhd
-src --vhdl2008 TrackReconstructor.vhd
-src LinkCombinerCore.vhd
-src LinkCombinerIPBus.vhd
-
-src --cd ../cgn link_agg_single_link_fifo.xci
-setup -f --cd ../cgn link_agg_single_link_fifo.tcl
-
-src --cd ../cgn link_agg_single_link_fifo_fwft.xci
-setup -f --cd ../cgn link_agg_single_link_fifo_fwft.tcl
-
-src --cd ../cgn link_agg_all_links_fifo.xci
-setup -f --cd ../cgn link_agg_all_links_fifo.tcl
-
-src --cd ../cgn link_combin_buffer.xci
-setup -f --cd ../cgn link_combin_buffer.tcl
 
+src ipbus_decode_emp_payload.vhd
 
-addrtab link_aggregator.xml
-addrtab emp_payload.xml
-addrtab mprocessor.xml
+addrtab -t emp_payload.xml
\ No newline at end of file
diff --git a/top/firmware/hdl/emp_payload.vhd b/top/firmware/hdl/emp_payload.vhd
index d156d95d35240bc95a0cf350e2f9c224bb39ca86..9830d5926666fcb0b548910cea39b8da7cc5b851 100644
--- a/top/firmware/hdl/emp_payload.vhd
+++ b/top/firmware/hdl/emp_payload.vhd
@@ -1,51 +1,55 @@
 library ieee;
 use ieee.std_logic_1164.all;
 use ieee.numeric_std.all;
-
+---
 use work.ipbus.all;
 use work.ipbus_reg_types.all;
-
+use work.ipbus_decode_emp_payload.all;
+---
 use work.emp_data_types.all;
 use work.emp_project_decl.all;
 use work.emp_device_decl.all;
 use work.emp_ttc_decl.all;
-
-use work.ipbus_decode_emp_payload.all;
-
+use work.emp_slink_types.all;
+---
 use work.dtc_link_maps.all;
 use work.front_end_data_types.all;
 use work.gbt_module_constants.all;
 use work.mprocessor_constants.all;
-use work.dtc_data_types.all;
 use work.dtc_constants.all;
+use work.dtc_data_types.all;
 
 
 entity emp_payload is
-port(
-    --- Input Ports ---
-    clk_p            : in  std_logic;
-    clk40            : in  std_logic := '0';
-    clk_payload      : in  std_logic_vector(2 downto 0);
-    rst_payload      : in  std_logic_vector(2 downto 0);
-    rst_loc          : in  std_logic_vector(N_REGION - 1 downto 0);
-    clken_loc        : in  std_logic_vector(N_REGION - 1 downto 0);
-    ctrs             : in  ttc_stuff_array;
-    d                : in  ldata(4 * N_REGION - 1 downto 0);
-    --- Output Ports ---
-    bc0              : out std_logic;
-    gpio             : out std_logic_vector(29 downto 0);
-    gpio_en          : out std_logic_vector(29 downto 0);
-    q                : out ldata(4 * N_REGION - 1 downto 0);
-    --- IPBus Ports ---
-    clk              : in  std_logic;
-    rst              : in  std_logic;
-    ipb_in           : in  ipb_wbus;
-    ipb_out          : out ipb_rbus;
-    -- KH
-    gbe_q            : out ldata := (others => LWORD_NULL);
-    gbe_backpressure : in  std_logic_vector(1 downto 0)
-);
-end emp_payload;
+    port (
+        --- Input Ports ---
+        clk_p            : in  std_logic;
+        clk40            : in  std_logic := '0';
+        clk_payload      : in  std_logic_vector(2 downto 0);
+        rst_payload      : in  std_logic_vector(2 downto 0);
+        rst_loc          : in  std_logic_vector(N_REGION - 1 downto 0);
+        clken_loc        : in  std_logic_vector(N_REGION - 1 downto 0);
+        ctrs             : in  ttc_stuff_array;
+        d                : in  ldata(4 * N_REGION - 1 downto 0);
+        backpressure     : in  std_logic_vector(SLINK_MAX_QUADS-1 downto 0);
+        ttc_cmd          : in  ttc_cmd_t;
+        --- Output Ports ---
+        bc0              : out std_logic;
+        gpio             : out std_logic_vector(29 downto 0);
+        gpio_en          : out std_logic_vector(29 downto 0);
+        q                : out ldata(4 * N_REGION - 1 downto 0);
+        slink_q          : out slink_input_data_quad_array(SLINK_MAX_QUADS-1 downto 0);
+        --- IPBus Ports ---
+        clk              : in  std_logic;
+        rst              : in  std_logic;
+        ipb_in           : in  ipb_wbus;
+        ipb_out          : out ipb_rbus;
+        -- KH
+        gbe_q            : out ldata := (others => LWORD_NULL);
+        gbe_backpressure : in  std_logic_vector(3 downto 0)
+    );
+end entity emp_payload;
+
 
 architecture rtl of emp_payload is
 
@@ -64,37 +68,23 @@ architecture rtl of emp_payload is
 
     signal ipb_chain                    : ipbdc_bus_array(cNumberOfFEModules downto 0);
     signal stubs                        : ldata(cNumberOfFEModules - 1 downto 0);
+    signal header_array                 : tCICHeaderArray(cNumberOfFEModules*cNumberOfCICs - 1 downto 0) := (others => ('0', (others => '0'), (others => '0'), (others => '0')));
+    signal header_start_array           : std_logic_vector(cNumberOfFEModules*cNumberOfCICs - 1 downto 0) := (others => '0');
+    
+    signal eth_link_out                 : ldata(3 downto 0)                        := (others => LWORD_NULL);
 
-    signal linksout                     : ldata(cNumberOfFEModules - 1 downto 0);
-    signal linkor                       : lword                                    := LWORD_NULL;
-
-    -- Histogrammer
-
-    constant N_CTRL_HIST                : integer := 2;
-    constant N_STAT_HIST                : integer := 2;
+    
 
-    constant bin_width                  : integer := 32;
-    constant input_width                : integer := 9;
-
-    signal status_registers             : ipb_reg_v(N_STAT_HIST - 1 downto 0) := (others => (others => '0'));
-    signal control_registers            : ipb_reg_v(N_CTRL_HIST - 1 downto 0) := (others => (others => '0'));
-
-    signal trigger_window_lower         : std_logic_vector(31 downto 0)            := (others => '0');
-    signal trigger_window_upper         : std_logic_vector(3 downto 0)             := (others => '0');
-    signal trigger_window               : std_logic_vector(36 - 1 downto 0)        := X"0ffffffff";
-    signal max_value0, max_value1       : std_logic_vector(bin_width - 1 downto 0) := (others => '0');
-    signal histogram_reset              : std_logic                                := '0';
-    signal hist0_stub, hist1_stub       : lword                                    := LWORD_NULL;
-    signal histogram_sel                : integer                                  := 0;
-    signal histogram_enable             : std_logic                                := '0';
-    signal header_start_array           : tHeaderStartArray                        := (others => (others => '0'));
-    signal eth_link_out                 : ldata(1 downto 0)                        := (others => LWORD_NULL);
+    -- MProcessor
+    constant cNumberOfMProcessors                  : integer                                  := 1;
+    signal mprocessor_ipb_chain                    : ipbdc_bus_array(cNumberOfMProcessors downto 0);
+    signal srst                                    : std_logic                                := '0';
+    signal ttc_resync_reset, ttc_resync_reset_prev : std_logic                                := '0';
+    signal ttc_bc0, ttc_oc0, ttc_resync            : std_logic                                := '0';
 
-    signal header_array                 : tCICHeaderArray(cNumberOfFEModules * cNumberOfCICs - 1 downto 0) := (others => ('0', (others => '0'), (others => '0'), (others => '0')));
+    signal orbit_counter                : unsigned(31 downto 0)                    := to_unsigned(0   , 32);
+    signal bunch_counter                : unsigned(11 downto 0)                    := to_unsigned(3564, 12);
 
-    -- MProcessor
-    constant cNumberOfMProcessors       : integer                                  := 1;
-    signal mprocessor_ipb_chain         : ipbdc_bus_array(cNumberOfMProcessors downto 0);
 
     -- Daqpath
 
@@ -102,359 +92,370 @@ architecture rtl of emp_payload is
     signal daq_data                   : tDaqDataLinkArray(cNumberOfFEModules - 1 downto 0);
     signal daq_empty                  : tDaqFlagLinkArray(cNumberOfFEModules - 1 downto 0);
 
+
+    -- TCDS & Fast commands
+    
+    signal global_fcmd                : tFastCommand;
+    signal tcds_fcmd                  : tFastCommand;
+
+
 begin
+
   
---==============================--
--- IPBus fabric
---==============================--
-
-
---==============================--
-fabric: entity work.ipbus_fabric_sel
---==============================--
-generic map(
-    NSLV            => N_SLAVES,
-    SEL_WIDTH       => IPBUS_SEL_WIDTH
-)
-port map(
-    ipb_in          => ipb_in,
-    ipb_out         => ipb_out,
-    sel             => ipbus_sel_emp_payload(ipb_in.ipb_addr),
-    ipb_to_slaves   => ipb_to_slaves,
-    ipb_from_slaves => ipb_from_slaves
-);
-
-
---==============================--
-fe_channel_ctrl: entity work.ipbus_reg_v
---==============================--
-generic map(
-    N_REG           => 1
-)
-port map(
-    clk             => clk,
-    reset           => rst,
-    ipbus_in        => ipb_to_slaves(N_SLV_FE_CTRL),
-    ipbus_out       => ipb_from_slaves(N_SLV_FE_CTRL),
-    q               => channel_sel,
-    qmask           => (0 => X"0000007f")
-);
-
---==============================--
-mproc_channel_ctrl: entity work.ipbus_reg_v
---==============================--
-generic map(
-    N_REG           => 1
-)
-port map(
-    clk             => clk,
-    reset           => rst,
-    ipbus_in        => ipb_to_slaves(N_SLV_MPROC_CTRL),
-    ipbus_out       => ipb_from_slaves(N_SLV_MPROC_CTRL),
-    q               => mproc_channel_sel,
-    qmask           => (0 => X"0000007f")
-);
-
-
---==============================--
-channel_select: entity work.ipbus_dc_fabric_sel
---==============================--
-generic map(
-    SEL_WIDTH       => 7
-)
-port map(
-    clk             => clk,
-    rst             => rst,
-    sel             => channel_sel(0)(6 downto 0),
-    ipb_in          => ipb_to_slaves(N_SLV_FE_CHAN),
-    ipb_out         => ipb_from_slaves(N_SLV_FE_CHAN),
-    ipbdc_out       => ipb_chain(0),
-    ipbdc_in        => ipb_chain(cNumberOfFEModules)
-);
-
-
-
---==============================--
--- FE data extraction and monitoring
---==============================--
-
-
---==============================--
-genLinkInterface: for i in 0 to cNumberOfFEModules - 1 generate
---==============================--
-
-    signal ipb_to_channel   : ipb_wbus;
-    signal ipb_from_channel : ipb_rbus;
+    --==============================--
+    -- IPBus fabric
+    --==============================--
 
-begin
+    --==============================--
+    fabric: entity work.ipbus_fabric_sel
+    --==============================--
+        generic map (
+            NSLV      => N_SLAVES,
+            SEL_WIDTH => IPBUS_SEL_WIDTH
+        )
+        port map (
+            ipb_in          => ipb_in,
+            ipb_out         => ipb_out,
+            sel             => ipbus_sel_emp_payload(ipb_in.ipb_addr),
+            ipb_to_slaves   => ipb_to_slaves,
+            ipb_from_slaves => ipb_from_slaves
+        );
 
     --==============================--
-    channel_node: entity work.ipbus_dc_node
+    fe_channel_ctrl: entity work.ipbus_reg_v
     --==============================--
-    generic map(
-        I_SLV       => i,
-        SEL_WIDTH   => 7,
-        PIPELINE    => false
+    generic map (
+        N_REG => 1
     )
-    port map(
-        clk         => clk,
-        rst         => rst,
-        ipb_out     => ipb_to_channel,
-        ipb_in      => ipb_from_channel,
-        ipbdc_in    => ipb_chain(i),
-        ipbdc_out   => ipb_chain(i + 1)
+    port map (
+        clk       => clk,
+        reset     => rst,
+        ipbus_in  => ipb_to_slaves(N_SLV_FE),
+        ipbus_out => ipb_from_slaves(N_SLV_FE),
+        q         => channel_sel,
+        qmask     => (0 => X"0000007f")
     );
 
     --==============================--
-	LinkInterfaceInstance: entity work.LinkInterface
+    channel_select : entity work.ipbus_dc_fabric_sel
     --==============================--
     generic map (
-        module_type => "2S"
+        SEL_WIDTH => 7
     )
+    port map (
+        clk       => clk,
+        rst       => rst,
+        sel       => channel_sel(0)(6 downto 0),
+        ipb_in    => ipb_to_slaves(N_SLV_FE_CHAN),
+        ipb_out   => ipb_from_slaves(N_SLV_FE_CHAN),
+        ipbdc_out => ipb_chain(0),
+        ipbdc_in  => ipb_chain(cNumberOfFEModules)
+    );
+
+    --==============================--
+    mproc_channel_ctrl: entity work.ipbus_reg_v
+    --==============================--
+    generic map(
+        N_REG           => 1
+    )
+    port map(
+        clk             => clk,
+        reset           => rst,
+        ipbus_in        => ipb_to_slaves(N_SLV_MPROC_CTRL),
+        ipbus_out       => ipb_from_slaves(N_SLV_MPROC_CTRL),
+        q               => mproc_channel_sel,
+        qmask           => (0 => X"00000fff")
+    );
+
+
+    
+
+
+    --==============================--
+    -- FE data extraction and monitoring
+    --==============================--
+
+    --==============================--
+    genLinkInterface: for i in 0 to cNumberOfFEModules - 1 generate
+    --==============================--
+
+        signal ipb_to_channel   : ipb_wbus;
+        signal ipb_from_channel : ipb_rbus;
+
+    begin
+
+        --==============================--
+        channel_node : entity work.ipbus_dc_node
+        --==============================--
+        generic map (
+            I_SLV     => i,
+            SEL_WIDTH => 7,
+            PIPELINE  => false
+        )
+        port map (
+            clk       => clk,
+            rst       => rst,
+            ipb_out   => ipb_to_channel,
+            ipb_in    => ipb_from_channel,
+            ipbdc_in  => ipb_chain(i),
+            ipbdc_out => ipb_chain(i + 1)
+        );
+
+        --==============================--
+        LinkInterfaceInstance : entity work.LinkInterface
+        --==============================--
+        generic map (
+            module_type => "2S"
+        )
+        port map (
+            --- Input Ports ---
+            clk_p               => clk_p,
+            clk40               => clk40,
+            link_in             => d(cDTCInputLinkMap(i)),
+            daq_read            => daq_read(i),
+            global_fcmd         => global_fcmd,
+            --- Output Ports ---
+            link_out            => q(cDTCInputLinkMap(i)),
+            stub_out            => stubs(i),
+            header_out          => header_array(cNumberOfCICs * i + cNumberOfCICs - 1 downto cNumberOfCICs * i),
+            daq_out             => daq_data(i),
+            daq_empty           => daq_empty(i),
+            --- IPBus Ports ---
+            clk                 => clk,
+            rst                 => rst,
+            ipb_in              => ipb_to_channel,
+            ipb_out             => ipb_from_channel,
+            --- Debug Ports ---
+            debug_header_start  => header_start_array(cNumberOfCICs*(i + 1) - 1 downto cNumberOfCICs*i)
+        );
+    end generate genLinkInterface;
+
+
+    --==============================--
+    -- Global TCDS
+    --==============================--
+
+    --==============================--
+    GlobalFastCommand: entity work.GlobalFastCommand
+    --==============================--
     port map (
         --- Input Ports ---
-        clk_p               => clk_p,
-        link_in             => d(cDTCInputLinkMap(i)),
-        daq_read            => daq_read(i),
+        clk_p       => clk_p,
+        clk40       => clk40,
+        ext_fcmd    => tcds_fcmd,
         --- Output Ports ---
-        link_out            => linksout(i),
-        stub_out            => stubs(i),
-        daq_out             => daq_data(i),
-        daq_empty           => daq_empty(i),
-        header_out  => header_array(cNumberOfCICs * i + cNumberOfCICs - 1 downto cNumberOfCICs * i),
+        global_fcmd => global_fcmd,
         --- IPBus Ports ---
-        clk                 => clk,
-        rst                 => rst,
-        ipb_in              => ipb_to_channel,
-        ipb_out             => ipb_from_channel,
-        --- Debug Ports ---
-        debug_header_start => header_start_array(i)
+        clk         => clk,                       
+        rst         => rst,                       
+        ipb_in      => ipb_to_slaves(N_SLV_TCDS_FAST_CMD),  
+        ipb_out     => ipb_from_slaves(N_SLV_TCDS_FAST_CMD)
     );
-end generate;
 
+    tcds_fcmd.fast_reset    <= ttc_resync;
+    tcds_fcmd.l1a_trig      <= '0';
+    tcds_fcmd.cal_pulse     <= '0';
+    tcds_fcmd.counter_reset <= ttc_bc0;
 
-linkor.data(63 downto 0) <= linksout(0).data(63 downto 0) or linksout(1).data(63 downto 0) or linksout(2).data(63 downto 0) or linksout(3).data(63 downto 0); --or linksout(4).data(63 downto 0) or linksout(5).data(63 downto 0);
 
---==============================--
-genHack: for i in 0 to cNumberOfFEModules - 1 generate
---==============================--
-begin
 
-	q(cDTCInputLinkMap(i)) <= linkor;
-
-end generate;
-
-
---==============================--
--- L1 Data Aggregator
---==============================--
-
---==============================--
-L1DataAggregator : entity work.L1DataAggregator
---==============================--
-port map (
-    --- Input Ports ---
-    clk_p   => clk_p,
-    daq_in  => daq_data,
-    empty   => daq_empty,
-    --- Output Ports ---
-    read    => daq_read,
-    --- IPBus Ports ---
-    clk     => clk,
-    rst     => rst,
-    ipb_in  => ipb_to_slaves(N_SLV_BE_DAQ),
-    ipb_out => ipb_from_slaves(N_SLV_BE_DAQ)
-);
-
-
---==============================--
--- Histogrammer
---==============================--
-
-
---==============================--
-histogram_ctrl: entity work.ipbus_ctrlreg_v
---==============================--
-generic map(
-    N_CTRL            => N_CTRL_HIST,
-    N_STAT            => N_STAT_HIST
-)
-port map(
-    clk               => clk,
-    reset             => rst,
-    ipbus_in          => ipb_to_slaves(N_SLV_CSR),
-    ipbus_out         => ipb_from_slaves(N_SLV_CSR),
-    d                 => status_registers,
-    q		          => control_registers
-);
-
-status_registers(0)(bin_width - 1 downto 0)   <= max_value0;
-status_registers(1)(bin_width - 1 downto 0)   <= max_value1;
-
-
-trigger_window_lower  <= control_registers(0);
-trigger_window_upper  <= control_registers(1)(3 downto 0);
-histogram_enable      <= control_registers(1)(4);
-histogram_sel         <= to_integer(unsigned(control_registers(1)(15 downto 5)));
-trigger_window        <= trigger_window_upper & trigger_window_lower;
-
-
---==============================--
-pHistogram: process(clk_p)
---==============================--
-begin
-    if rising_edge(clk_p) then
-        if stubs(histogram_sel).valid = '1' and histogram_enable = '1' then
-            if stubs(histogram_sel).data(46) = '0' then
-                hist0_stub <= stubs(histogram_sel);
-                hist1_stub <= LWORD_NULL;
-            else
-                hist0_stub <= LWORD_NULL;
-                hist1_stub <= stubs(histogram_sel);
-            end if;
-        else
-            hist0_stub <= LWORD_NULL;
-            hist1_stub <= LWORD_NULL;
+
+
+    --==============================--
+    -- L1 Data Aggregator
+    --==============================--
+
+    --==============================--
+    L1DataAggregator : entity work.L1DataAggregator
+    --==============================--
+    port map (
+        --- Input Ports ---
+        clk_p   => clk_p,
+        daq_in  => daq_data,
+        empty   => daq_empty,
+        --- Output Ports ---
+        read    => daq_read,
+        --- IPBus Ports ---
+        clk     => clk,
+        rst     => rst,
+        ipb_in  => ipb_to_slaves(N_SLV_BE_DAQ),
+        ipb_out => ipb_from_slaves(N_SLV_BE_DAQ)
+    );
+
+    --==============================--
+    pRouteStubsToOutput : process (clk_p) is
+    --==============================--
+    begin
+        if rising_edge(clk_p) then
+            for i in 0 to cNumberOfOutputLinks - 1 loop
+                q(cDTCOutputLinkMap(i)).valid  <= d(cDTCInputLinkMap(i)).valid;
+                q(cDTCOutputLinkMap(i)).data   <= d(cDTCInputLinkMap(i)).data;
+                q(cDTCOutputLinkMap(i)).strobe <= '1';
+            end loop;
         end if;
-    end if;
-end process;
-
-
---==============================--
-HistogramInstance0: entity work.IPBusHistogram
---==============================--
-generic map(
-    input_width       => input_width,
-    bin_width         => bin_width,
-    data_offset       => 10
-)
-port map(
-    --- Input Ports ---
-    clk_p             => clk_p,
-    data_in           => hist0_stub,
-    histogram_reset   => histogram_reset,
-    --- Output Ports ---
-    max_bin_value     => max_value0,
-    --- IPBus Ports ---
-    clk               => clk,
-    rst               => rst,
-    ipb_in            => ipb_to_slaves(N_SLV_MEM1),
-    ipb_out           => ipb_from_slaves(N_SLV_MEM1)
-);
-
-
---==============================--
-HistogramInstance1: entity work.IPBusHistogram
---==============================--
-generic map(
-    input_width       => input_width,
-    bin_width         => bin_width,
-    data_offset       => 6
-)
-port map(
-    --- Input Ports ---
-    clk_p             => clk_p,
-    data_in           => hist1_stub,
-    histogram_reset   => histogram_reset,
-    --- Output Ports ---
-    max_bin_value     => max_value1,
-    --- IPBus Ports ---
-    clk               => clk,
-    rst               => rst,
-    ipb_in            => ipb_to_slaves(N_SLV_MEM2),
-    ipb_out           => ipb_from_slaves(N_SLV_MEM2)
-);
-
-
---==============================--
-HistogramResetterInstance: entity work.HistogramResetter
---==============================--
-port map(
-    --- Input Ports ---
-    clk_p             => clk_p,
-    trigger_window    => trigger_window,
-    --- Output Ports ---
-    histogram_reset   => histogram_reset
-);
-
-
-
---==============================--
--- Link Aggregation and Combination
---==============================--
-
---==============================--
-mprocessor_channel_select: entity work.ipbus_dc_fabric_sel
---==============================--
-generic map(
-    SEL_WIDTH       => 7
-)
-port map(
-    clk             => clk,
-    rst             => rst,
-    sel             => mproc_channel_sel(0)(6 downto 0),
-    ipb_in          => ipb_to_slaves(N_SLV_MPROCESSOR),
-    ipb_out         => ipb_from_slaves(N_SLV_MPROCESSOR),
-    ipbdc_out       => mprocessor_ipb_chain(0),
-    ipbdc_in        => mprocessor_ipb_chain(cNumberOfMProcessors)
-);
-
-
---==============================-
-genMProcessors : for i in 0 to cNumberOfMProcessors - 1 generate
---==============================-
-
-    signal ipb_to_channel        : ipb_wbus;
-    signal ipb_from_channel      : ipb_rbus;
-    constant cNumberofInputLinks : integer := 4;
+    end process pRouteStubsToOutput;
 
-begin
 
+    
     --==============================--
-    channel_node: entity work.ipbus_dc_node
+    LinkMonitorInterfaceInstance : entity work.LinkMonitorInterface
     --==============================--
-    generic map(
-        I_SLV       => i,
-        SEL_WIDTH   => 7,
-        PIPELINE    => false
+    generic map (
+        N_LINKS => 4
     )
-    port map(
-        clk         => clk,
-        rst         => rst,
-        ipb_out     => ipb_to_channel,
-        ipb_in      => ipb_from_channel,
-        ipbdc_in    => mprocessor_ipb_chain(i),
-        ipbdc_out   => mprocessor_ipb_chain(i + 1)
+    port map (
+        --- Input Ports ---
+        clk_p => clk_p,
+        stubs => stubs(3 downto 0),
+        headers => header_array(7 downto 0),
+        header_start => header_start_array(7 downto 0),
+        --- IPBus Ports ---
+        clk     => clk,
+        rst     => rst,
+        ipb_in  => ipb_to_slaves(N_SLV_LINK_MONITOR),
+        ipb_out => ipb_from_slaves(N_SLV_LINK_MONITOR)
     );
 
+
+
+    --==============================--
+    -- Link Aggregation and Combination
+    --==============================--
+
     --==============================--
-    MProcessorInstance: entity work.MProcessor
+    mprocessor_channel_select: entity work.ipbus_dc_fabric_sel
     --==============================--
     generic map(
-        N_LINKS => cNumberofInputLinks
+        SEL_WIDTH       => 7
     )
     port map(
-        --- Input Ports ---
-        clk_p              => clk_p,
-        links_in           => stubs(cNumberofInputLinks*i + (cNumberofInputLinks - 1) downto cNumberofInputLinks*i),
-        header_in          => header_array,
-        header_start_array => header_start_array,
-        gbe_backpressure   => gbe_backpressure(i),
-        --- Output Ports ---
-        link_out           => eth_link_out(i),
-        --- IPBus Ports ---
-        ipb_clk            => clk,
-        ipb_rst            => rst,
-        ipb_in             => ipb_to_channel,
-        ipb_out            => ipb_from_channel
+        clk             => clk,
+        rst             => rst,
+        sel             => mproc_channel_sel(0)(6 downto 0),
+        ipb_in          => ipb_to_slaves(N_SLV_MPROCESSOR),
+        ipb_out         => ipb_from_slaves(N_SLV_MPROCESSOR),
+        ipbdc_out       => mprocessor_ipb_chain(0),
+        ipbdc_in        => mprocessor_ipb_chain(cNumberOfMProcessors)
     );
-end generate genMProcessors;
 
 
-gbe_q <= eth_link_out;
+    --==============================-
+    genMProcessors : for i in 0 to cNumberOfMProcessors - 1 generate
+    --==============================-
+
+        signal ipb_to_channel        : ipb_wbus;
+        signal ipb_from_channel      : ipb_rbus;
+        constant cNumberofInputLinks : integer := 4;
+
+    begin
+
+        --==============================--
+        channel_node: entity work.ipbus_dc_node
+        --==============================--
+        generic map(
+            I_SLV       => i,
+            SEL_WIDTH   => 7,
+            PIPELINE    => false
+        )
+        port map(
+            clk         => clk,
+            rst         => rst,
+            ipb_out     => ipb_to_channel,
+            ipb_in      => ipb_from_channel,
+            ipbdc_in    => mprocessor_ipb_chain(i),
+            ipbdc_out   => mprocessor_ipb_chain(i + 1)
+        );
+
+        --==============================--
+        MProcessorInstance: entity work.MProcessor
+        --==============================--
+        generic map(
+            N_LINKS => cNumberofInputLinks
+        )
+        port map(
+            --- Input Ports ---
+            clk_p              => clk_p,
+            links_in           => stubs(cNumberofInputLinks*i + (cNumberofInputLinks - 1) downto cNumberofInputLinks*i),
+            header_in          => header_array,
+            header_start_array => convertSLVtoHeaderStartArray(header_start_array),
+            gbe_backpressure   => gbe_backpressure(i),
+            srst               => srst,
+            --- Output Ports ---
+            link_out           => eth_link_out(i),
+            --- IPBus Ports ---
+            ipb_clk            => clk,
+            ipb_rst            => rst,
+            ipb_in             => ipb_to_channel,
+            ipb_out            => ipb_from_channel
+        );
+    end generate genMProcessors;
+
+
+    gbe_q <= eth_link_out;
+
+    
+    --==============================--
+    pTTC: process(clk40)
+    --==============================--
+    begin
+        if rising_edge(clk40) then
+
+            ttc_bc0    <= '0';
+            ttc_oc0    <= '0';
+            ttc_resync <= '0';
+
+            if ttc_cmd = TTC_BCMD_BC0 then
+                orbit_counter <= orbit_counter + 1;
+                bunch_counter <= (others => '0');
+                ttc_bc0 <= '1';
+
+                if ttc_resync_reset = '1' and ttc_resync_reset_prev = '0' then
+
+                    ttc_resync <= '1';
+
+                end if;
+
+                ttc_resync_reset_prev <= ttc_resync_reset;
+
+
+            elsif ttc_cmd = TTC_BCMD_OC0 then
+
+                orbit_counter <= (others => '0');
+                bunch_counter <= to_unsigned(3564, bunch_counter'length);
+                ttc_oc0 <= '1';
+
+            elsif bunch_counter < 3564 then
+
+                bunch_counter <= bunch_counter + 1;     
+                   
+            end if;
+
+        end if;
+    end process;
+
+    ttc_resync_reset <= mproc_channel_sel(0)(8);
+    srst <= mproc_channel_sel(0)(7) or ttc_oc0;
+
+    q(20).valid  <= '1';
+    q(20).data   <= "0000" & std_logic_vector(bunch_counter) & "0000000000000000" & std_logic_vector(orbit_counter);
+    q(20).start  <= '1';
+    q(20).strobe <= '1';
+
+
+
+
+    bc0     <= '0';
+    gpio    <= (others => '0');
+    gpio_en <= (others => '0');
+
+
+    --==============================--
+    slink_q_gen : for q in SLINK_MAX_QUADS-1 downto 0 generate
+    --==============================--
+    begin
+        slink_q(q) <= SLINK_INPUT_DATA_ARRAY_NULL;
+    end generate slink_q_gen;
+
 
-bc0     <= '0';
-gpio    <= (others => '0');
-gpio_en <= (others => '0');
 
-end rtl;
+end architecture rtl;
diff --git a/top/firmware/hdl/emp_project_decl.vhd b/top/firmware/hdl/emp_project_decl.vhd
index fdc5575eec30b6c0d471caf07825f2de0b2bb1be..c4e9c7c16c0407b76b60156fe5e9fa722d6c91da 100644
--- a/top/firmware/hdl/emp_project_decl.vhd
+++ b/top/firmware/hdl/emp_project_decl.vhd
@@ -13,6 +13,8 @@ use work.emp_device_decl.all;
 use work.emp_device_types.all;
 use work.emp_lpgbt_decl.all;
 use work.emp_data_framer_decl.all;
+use work.emp_slink_types.all;
+use work.emp_eth10g_types.all;
 
 -------------------------------------------------------------------------------
 package emp_project_decl is
@@ -20,11 +22,11 @@ package emp_project_decl is
   constant PAYLOAD_REV         : std_logic_vector(31 downto 0) := X"d451d001";
 
   -- Latency buffer size
-  constant LB_ADDR_WIDTH      : integer             := 10;
+  constant LB_ADDR_WIDTH      : integer               := 10;
 
   -- Clock setup
-  constant CLOCK_COMMON_RATIO : integer             := 32;
-  constant CLOCK_RATIO        : integer             := 8;
+  constant CLOCK_COMMON_RATIO : integer               := 32;
+  constant CLOCK_RATIO        : integer               := 8;
   constant CLOCK_AUX_DIV      : clock_divisor_array_t := (16, 8, 4); -- Dividers of CLOCK_COMMON_RATIO * 40 MHz
 
   -- Only used by nullalgo
@@ -58,8 +60,8 @@ package emp_project_decl is
 
   -- for data framer (ic_simple, no_ec, n_ec_spare, ec_broadcast)
   constant REGION_DATA_FRAMER_CONF : region_data_framer_conf_array_t := (
-    2 => ( 0=>(false, true, 0, false), 1=>(false, true, 0, false), 2=>(false, true, 0, false), 3=>(false, true, 0, false)),
-    3 => ( 0=>(false, true, 0, false), 1=>(false, true, 0, false), 2=>(false, true, 0, false), 3=>(false, true, 0, false)),
+    2 => ( 0=>(false, true, 0, false, lpgbtv0), 1=>(false, true, 0, false, lpgbtv0), 2=>(false, true, 0, false, lpgbtv1), 3=>(false, true, 0, false, lpgbtv0)),
+    3 => ( 0=>(false, true, 0, false, lpgbtv0), 1=>(false, true, 0, false, lpgbtv0), 2=>(false, true, 0, false, lpgbtv0), 3=>(false, true, 0, false, lpgbtv0)),
     others => kDummyRegionDataFramer
   );
 
@@ -70,7 +72,15 @@ package emp_project_decl is
     others => kDummyRegionLpgbt
   );
 
+  -- Specify the slink quad using the corresponding region conf ID
+  -- Specify slink channels to enable using the channel mask
+  constant SLINK_CONF : slink_conf_array_t := (
+    others => kNoSlink
+  );
 
+  constant ETH10G_CONF : eth10g_conf_array_t := (
+    0 => (10, "0011", (x"000000000000", x"000000000000", x"aabbccddef53", x"aabbccddef54"))
+  );
 
 
 
diff --git a/top/firmware/hdl/ipbus_decode_emp_payload.vhd b/top/firmware/hdl/ipbus_decode_emp_payload.vhd
deleted file mode 100644
index 65092e3b64596d93dcd94d8e93b647f11dbbffac..0000000000000000000000000000000000000000
--- a/top/firmware/hdl/ipbus_decode_emp_payload.vhd
+++ /dev/null
@@ -1,68 +0,0 @@
--- Address decode logic for ipbus fabric
---
--- This file has been AUTOGENERATED from the address table - do not hand edit
---
--- We assume the synthesis tool is clever enough to recognise exclusive conditions
--- in the if statement.
---
--- Dave Newbold, February 2011
-
-library IEEE;
-use IEEE.STD_LOGIC_1164.all;
-use ieee.numeric_std.all;
-
-package ipbus_decode_emp_payload is
-
-  constant IPBUS_SEL_WIDTH: positive := 4;
-  subtype ipbus_sel_t is std_logic_vector(IPBUS_SEL_WIDTH - 1 downto 0);
-  function ipbus_sel_emp_payload(addr : in std_logic_vector(31 downto 0)) return ipbus_sel_t;
-
--- START automatically generated VHDL (Wed Sep  7 13:15:33 2022)
-  constant N_SLV_FE_CTRL: integer := 0;
-  constant N_SLV_CSR: integer := 1;
-  constant N_SLV_FE_CHAN: integer := 2;
-  constant N_SLV_MPROC_CTRL: integer := 3;
-  constant N_SLV_MPROCESSOR: integer := 4;
-  constant N_SLV_MEM1: integer := 5;
-  constant N_SLV_MEM2: integer := 6;
-  constant N_SLV_BE_DAQ: integer := 7;
-  constant N_SLAVES: integer := 8;
--- END automatically generated VHDL
-
-
-end ipbus_decode_emp_payload;
-
-package body ipbus_decode_emp_payload is
-
-  function ipbus_sel_emp_payload(addr : in std_logic_vector(31 downto 0)) return ipbus_sel_t is
-    variable sel: ipbus_sel_t;
-  begin
-
--- START automatically generated VHDL (Wed Sep  7 13:15:33 2022)
-    if    std_match(addr, "-0----------------00--0000000000") then
-      sel := ipbus_sel_t(to_unsigned(N_SLV_FE_CTRL, IPBUS_SEL_WIDTH)); -- fe_ctrl / base 0x00000000 / mask 0x400033ff
-    elsif std_match(addr, "-0----------------00--00000001--") then
-      sel := ipbus_sel_t(to_unsigned(N_SLV_CSR, IPBUS_SEL_WIDTH)); -- csr / base 0x00000004 / mask 0x400033fc
-    elsif std_match(addr, "-0----------------00--0001------") then
-      sel := ipbus_sel_t(to_unsigned(N_SLV_FE_CHAN, IPBUS_SEL_WIDTH)); -- fe_chan / base 0x00000040 / mask 0x400033c0
-    elsif std_match(addr, "-0----------------00--0111111111") then
-      sel := ipbus_sel_t(to_unsigned(N_SLV_MPROC_CTRL, IPBUS_SEL_WIDTH)); -- mproc_ctrl / base 0x000001ff / mask 0x400033ff
-    elsif std_match(addr, "-0----------------00--100-------") then
-      sel := ipbus_sel_t(to_unsigned(N_SLV_MPROCESSOR, IPBUS_SEL_WIDTH)); -- mprocessor / base 0x00000200 / mask 0x40003380
-    elsif std_match(addr, "-0----------------01--0---------") then
-      sel := ipbus_sel_t(to_unsigned(N_SLV_MEM1, IPBUS_SEL_WIDTH)); -- mem1 / base 0x00001000 / mask 0x40003200
-    elsif std_match(addr, "-0----------------10--0---------") then
-      sel := ipbus_sel_t(to_unsigned(N_SLV_MEM2, IPBUS_SEL_WIDTH)); -- mem2 / base 0x00002000 / mask 0x40003200
-    elsif std_match(addr, "-1------------------------------") then
-      sel := ipbus_sel_t(to_unsigned(N_SLV_BE_DAQ, IPBUS_SEL_WIDTH)); -- be_daq / base 0x40000000 / mask 0x40000000
--- END automatically generated VHDL
-
-    else
-        sel := ipbus_sel_t(to_unsigned(N_SLAVES, IPBUS_SEL_WIDTH));
-    end if;
-
-    return sel;
-
-  end function ipbus_sel_emp_payload;
-
-end ipbus_decode_emp_payload;
diff --git a/top/firmware/hdl/ipbus_decode_link_aggregator.vhd b/top/firmware/hdl/ipbus_decode_link_aggregator.vhd
deleted file mode 100644
index f7f0f178ea0cd7089fdd2a2965ca4e618e03e1d5..0000000000000000000000000000000000000000
--- a/top/firmware/hdl/ipbus_decode_link_aggregator.vhd
+++ /dev/null
@@ -1,53 +0,0 @@
--- Address decode logic for ipbus fabric
---
--- This file has been AUTOGENERATED from the address table - do not hand edit
---
--- We assume the synthesis tool is clever enough to recognise exclusive conditions
--- in the if statement.
---
--- Dave Newbold, February 2011
-
-library IEEE;
-use IEEE.STD_LOGIC_1164.all;
-use ieee.numeric_std.all;
-
-package ipbus_decode_link_aggregator is
-
-  constant IPBUS_SEL_WIDTH: positive := 2;
-  subtype ipbus_sel_t is std_logic_vector(IPBUS_SEL_WIDTH - 1 downto 0);
-  function ipbus_sel_link_aggregator(addr : in std_logic_vector(31 downto 0)) return ipbus_sel_t;
-
--- START automatically generated VHDL (Fri Aug 26 18:31:19 2022)
-  constant N_SLV_CHAN_SEL: integer := 0;
-  constant N_SLV_CONTROL: integer := 1;
-  constant N_SLV_MONITORING: integer := 2;
-  constant N_SLAVES: integer := 3;
--- END automatically generated VHDL
-
-
-end ipbus_decode_link_aggregator;
-
-package body ipbus_decode_link_aggregator is
-
-  function ipbus_sel_link_aggregator(addr : in std_logic_vector(31 downto 0)) return ipbus_sel_t is
-    variable sel: ipbus_sel_t;
-  begin
-
--- START automatically generated VHDL (Fri Aug 26 18:31:19 2022)
-    if    std_match(addr, "----------------------------0--0") then
-      sel := ipbus_sel_t(to_unsigned(N_SLV_CHAN_SEL, IPBUS_SEL_WIDTH)); -- chan_sel / base 0x00000000 / mask 0x00000009
-    elsif std_match(addr, "----------------------------0--1") then
-      sel := ipbus_sel_t(to_unsigned(N_SLV_CONTROL, IPBUS_SEL_WIDTH)); -- control / base 0x00000001 / mask 0x00000009
-    elsif std_match(addr, "----------------------------1---") then
-      sel := ipbus_sel_t(to_unsigned(N_SLV_MONITORING, IPBUS_SEL_WIDTH)); -- monitoring / base 0x00000008 / mask 0x00000008
--- END automatically generated VHDL
-
-    else
-        sel := ipbus_sel_t(to_unsigned(N_SLAVES, IPBUS_SEL_WIDTH));
-    end if;
-
-    return sel;
-
-  end function ipbus_sel_link_aggregator;
-
-end ipbus_decode_link_aggregator;
diff --git a/top/firmware/hdl/ipbus_decode_mprocessor.vhd b/top/firmware/hdl/ipbus_decode_mprocessor.vhd
deleted file mode 100644
index 1f97d1fac6f828b144c74d8d1cd4f4f5da6ba904..0000000000000000000000000000000000000000
--- a/top/firmware/hdl/ipbus_decode_mprocessor.vhd
+++ /dev/null
@@ -1,53 +0,0 @@
--- Address decode logic for ipbus fabric
---
--- This file has been AUTOGENERATED from the address table - do not hand edit
---
--- We assume the synthesis tool is clever enough to recognise exclusive conditions
--- in the if statement.
---
--- Dave Newbold, February 2011
-
-library IEEE;
-use IEEE.STD_LOGIC_1164.all;
-use ieee.numeric_std.all;
-
-package ipbus_decode_mprocessor is
-
-  constant IPBUS_SEL_WIDTH: positive := 2;
-  subtype ipbus_sel_t is std_logic_vector(IPBUS_SEL_WIDTH - 1 downto 0);
-  function ipbus_sel_mprocessor(addr : in std_logic_vector(31 downto 0)) return ipbus_sel_t;
-
--- START automatically generated VHDL (Fri Aug 26 18:31:27 2022)
-  constant N_SLV_LINK_AGGREGATOR: integer := 0;
-  constant N_SLV_LINK_COMBINER: integer := 1;
-  constant N_SLV_CSR: integer := 2;
-  constant N_SLAVES: integer := 3;
--- END automatically generated VHDL
-
-
-end ipbus_decode_mprocessor;
-
-package body ipbus_decode_mprocessor is
-
-  function ipbus_sel_mprocessor(addr : in std_logic_vector(31 downto 0)) return ipbus_sel_t is
-    variable sel: ipbus_sel_t;
-  begin
-
--- START automatically generated VHDL (Fri Aug 26 18:31:27 2022)
-    if    std_match(addr, "--------------------------0-----") then
-      sel := ipbus_sel_t(to_unsigned(N_SLV_LINK_AGGREGATOR, IPBUS_SEL_WIDTH)); -- link_aggregator / base 0x00000000 / mask 0x00000020
-    elsif std_match(addr, "--------------------------1---0-") then
-      sel := ipbus_sel_t(to_unsigned(N_SLV_LINK_COMBINER, IPBUS_SEL_WIDTH)); -- link_combiner / base 0x00000020 / mask 0x00000022
-    elsif std_match(addr, "--------------------------1---1-") then
-      sel := ipbus_sel_t(to_unsigned(N_SLV_CSR, IPBUS_SEL_WIDTH)); -- csr / base 0x00000022 / mask 0x00000022
--- END automatically generated VHDL
-
-    else
-        sel := ipbus_sel_t(to_unsigned(N_SLAVES, IPBUS_SEL_WIDTH));
-    end if;
-
-    return sel;
-
-  end function ipbus_sel_mprocessor;
-
-end ipbus_decode_mprocessor;
diff --git a/top/firmware/hdl/mprocessor_constants.vhd b/top/firmware/hdl/mprocessor_constants.vhd
deleted file mode 100644
index 3a879818498d50190ee7db6eed84175a597ebae9..0000000000000000000000000000000000000000
--- a/top/firmware/hdl/mprocessor_constants.vhd
+++ /dev/null
@@ -1,11 +0,0 @@
-library IEEE;
-use IEEE.STD_LOGIC_1164.ALL;
-use IEEE.NUMERIC_STD.ALL;
-
-use work.dtc_link_maps.all;
-
-package mprocessor_constants is
-
-    type tHeaderStartArray is array(cNumberOfFEModules - 1 downto 0) of std_logic_vector(1 downto 0);
-    
-end package mprocessor_constants;
diff --git a/top/firmware/ucf/emp_project_constraints.tcl.old b/top/firmware/ucf/emp_project_constraints.tcl.old
deleted file mode 100644
index 3361fc7cdae4f04fd25bfb749912e17bc1f976b9..0000000000000000000000000000000000000000
--- a/top/firmware/ucf/emp_project_constraints.tcl.old
+++ /dev/null
@@ -1,321 +0,0 @@
-
-# Loop over all MGTs in GBT firmware, give their RX/TX clocks more useful names, and declare them as async to all other clocks
-foreach mgtCellPath [get_cells -hierarchical -filter NAME=~datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/gbt_gen.gbt_inst/*/*GTHE4_CHANNEL_PRIM_INST] {
-  set matches [regexp -inline {datapath/rgen\[(\d+)\].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/gbt_gen.gbt_inst/.+gtxLatOpt_gen\[(\d+)\].+GTHE4_CHANNEL_PRIM_INST} $mgtCellPath]
-
-  if { [llength $matches] != 3 } {
-    puts "ERROR : Could not extract region and channel number from GBT RX clock pin path ''"
-    exit 1
-  }
-
-  set regionIndex [lindex $matches 1]
-  set channelIndex [lindex $matches 2]
-
-  create_generated_clock -name clk_gbt_rxOut_r${regionIndex}_ch${channelIndex} $mgtCellPath/RXOUTCLK
-  create_generated_clock -name clk_gbt_txOut_r${regionIndex}_ch${channelIndex} $mgtCellPath/TXOUTCLK
-
-  set_clock_groups -asynchronous -group clk_gbt_rxOut_r${regionIndex}_ch${channelIndex}
-  set_clock_groups -asynchronous -group clk_gbt_txOut_r${regionIndex}_ch${channelIndex}
-}
-
-
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/D}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/D}]
-
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/reg_no_destuffing_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/D}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-
-
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/D}]
-
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_ec_data_s_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-
-
-
-#set_multicycle_path 8 -setup \
-#-from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_user_data_reg[*]/C}] \
-#-to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-#set_multicycle_path 7 -hold \
-#-from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_user_data_reg[*]/C}] \
-#-to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-
-#set_multicycle_path 8 -setup \
-#-from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_user_data_reg[*]/C}] \
-#-to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/D}]
-#set_multicycle_path 7 -hold \
-#-from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_user_data_reg[*]/C}] \
-#-to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/D}]
-
-
-#set_multicycle_path 8 -setup \
-#-from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_user_data_reg[*]/C}] \
-#-to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-#set_multicycle_path 7 -hold \
-#-from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_user_data_reg[*]/C}] \
-#-to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-
-#set_multicycle_path 8 -setup \
-#-from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_user_data_reg[*]/C}] \
-#-to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-#set_multicycle_path 7 -hold \
-#-from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_user_data_reg[*]/C}] \
-#-to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-
-#set_multicycle_path 8 -setup \
-#-from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_user_data_reg[*]/C}] \
-#-to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-#set_multicycle_path 7 -hold \
-#-from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].uplink_user_data_reg[*]/C}] \
-#-to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-
-
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/write_o_reg/D}]
-
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/cnter_reg[*]/R}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/D}]
-
-set_multicycle_path 8 -setup \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]
-set_multicycle_path 7 -hold \
--from [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/ongoing_reg/C}] \
--to   [get_pins {datapath/rgen[*].region/mgt_gen.fe_mgt_gen.fe_mgt_inst/*/data_framers_gen[*].data_framer_inst/slow_command_ctrl_inst/sc_inst/sca_inst/sca_gen[*].rx_inst/sca_deserializer_inst/data_o_reg[*]/CE}]