first yosys synthesisizable rtl
diff --git a/verilog/rtl/syntacore_scr1/src/axi_tb.files b/verilog/rtl/syntacore_scr1/src/axi_tb.files
deleted file mode 100644
index 383dc9b..0000000
--- a/verilog/rtl/syntacore_scr1/src/axi_tb.files
+++ /dev/null
@@ -1,3 +0,0 @@
-core/pipeline/scr1_tracelog.sv
-tb/scr1_memory_tb_axi.sv
-tb/scr1_top_tb_axi.sv
\ No newline at end of file
diff --git a/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_ipic.sv b/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_ipic.sv
index 312dc4c..f5f82df 100644
--- a/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_ipic.sv
+++ b/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_ipic.sv
@@ -58,12 +58,12 @@
 //-------------------------------------------------------------------------------
 // Local types declaration
 //-------------------------------------------------------------------------------
-typedef struct {
+typedef struct packed { // cp.6
     logic                                   vd;
     logic                                   idx;
 } type_scr1_search_one_2_s;
 
-typedef struct {
+typedef struct packed { // cp.6
     logic                                   vd;
     logic   [SCR1_IRQ_VECT_WIDTH-1:0]       idx;
 } type_scr1_search_one_16_s;
@@ -93,9 +93,9 @@
 begin
     tmp.vd  = |din;
     tmp.idx = ~din[0];
-    return  tmp;
+    scr1_search_one_2 =  tmp;
 end
-endfunction : scr1_search_one_2
+endfunction
 
 function automatic type_scr1_search_one_16_s scr1_search_one_16(
     input   logic [15:0]    din
@@ -109,26 +109,23 @@
     logic [1:0]         stage2_idx [3:0];
     logic [2:0]         stage3_idx [1:0];
     type_scr1_search_one_16_s result;
-
+    integer i; // cp.17
     // Stage 1
-    for (int unsigned i=0; i<8; ++i) begin
-        type_scr1_search_one_2_s tmp;
+    for (i=0; i<8; i=i+1) begin
         tmp = scr1_search_one_2(din[(i+1)*2-1-:2]);
         stage1_vd[i]  = tmp.vd;
         stage1_idx[i] = tmp.idx;
     end
 
     // Stage 2
-    for (int unsigned i=0; i<4; ++i) begin
-        type_scr1_search_one_2_s tmp;
+    for (i=0; i<4; i=i+1) begin
         tmp = scr1_search_one_2(stage1_vd[(i+1)*2-1-:2]);
         stage2_vd[i]  = tmp.vd;
         stage2_idx[i] = (~tmp.idx) ? {tmp.idx, stage1_idx[2*i]} : {tmp.idx, stage1_idx[2*i+1]};
     end
 
     // Stage 3
-    for (int unsigned i=0; i<2; ++i) begin
-        type_scr1_search_one_2_s tmp;
+    for (i=0; i<2; i=i+1) begin
         tmp = scr1_search_one_2(stage2_vd[(i+1)*2-1-:2]);
         stage3_vd[i]  = tmp.vd;
         stage3_idx[i] = (~tmp.idx) ? {tmp.idx, stage2_idx[2*i]} : {tmp.idx, stage2_idx[2*i+1]};
@@ -138,9 +135,9 @@
     result.vd = |stage3_vd;
     result.idx = (stage3_vd[0]) ? {1'b0, stage3_idx[0]} : {1'b1, stage3_idx[1]};
 
-    return result;
+    scr1_search_one_16 = result;
 end
-endfunction : scr1_search_one_16
+endfunction
 
 //------------------------------------------------------------------------------
 // Local signals declaration
@@ -466,10 +463,10 @@
 
 assign ipic_ipr_clr_cond = ~irq_lvl | ipic_imr_next;
 assign ipic_ipr_clr      = ipic_ipr_clr_req & ipic_ipr_clr_cond;
-
+integer i;
 always_comb begin
     ipic_ipr_next = '0;
-    for (int unsigned i=0; i<SCR1_IRQ_VECT_NUM; ++i) begin
+    for (i=0; i<SCR1_IRQ_VECT_NUM; i=i+1) begin
         ipic_ipr_next[i] = ipic_ipr_clr[i] ? 1'b0
                          : ~ipic_imr_ff[i] ? irq_lvl[i]
                                            : ipic_ipr_ff[i] | irq_edge_detected[i];
@@ -586,13 +583,67 @@
 
 assign irq_req_v = ipic_ipr_ff & ipic_ier_ff;
 
+/*** Modified for Yosys handing typedef in function - dinesha
 assign irr_priority        = scr1_search_one_16(irq_req_v);
 assign irq_req_vd          = irr_priority.vd;
 assign irq_req_idx         = irr_priority.idx;
+****/
 
+always_comb 
+begin
+    casex(irq_req_v)
+	    16'bxxxx_xxxx_xxxx_xxx1 : irq_req_idx = 0;
+	    16'bxxxx_xxxx_xxxx_xx10 : irq_req_idx = 1;
+	    16'bxxxx_xxxx_xxxx_x100 : irq_req_idx = 2;
+	    16'bxxxx_xxxx_xxxx_1000 : irq_req_idx = 3;
+	    16'bxxxx_xxxx_xxx1_0000 : irq_req_idx = 4;
+	    16'bxxxx_xxxx_xx10_0000 : irq_req_idx = 5;
+	    16'bxxxx_xxxx_x100_0000 : irq_req_idx = 6;
+	    16'bxxxx_xxxx_1000_0000 : irq_req_idx = 7;
+	    16'bxxxx_xxx1_0000_0000 : irq_req_idx = 8;
+	    16'bxxxx_xx10_0000_0000 : irq_req_idx = 9;
+	    16'bxxxx_x100_0000_0000 : irq_req_idx = 10;
+	    16'bxxxx_1000_0000_0000 : irq_req_idx = 11;
+	    16'bxxx1_0000_0000_0000 : irq_req_idx = 12;
+	    16'bxx10_0000_0000_0000 : irq_req_idx = 13;
+	    16'bx100_0000_0000_0000 : irq_req_idx = 14;
+	    16'b1000_0000_0000_0000 : irq_req_idx = 15;
+	    16'b0000_0000_0000_0000 : irq_req_idx = 16;
+	    default : irq_req_idx = 16;
+    endcase
+    irq_req_vd = |irq_req_v;
+end
+
+/*** Modified for Yosys handing typedef in function - dinesha
 assign isvr_priority_eoi   = scr1_search_one_16(ipic_isvr_eoi);
 assign irq_eoi_req_vd      = isvr_priority_eoi.vd;
 assign irq_eoi_req_idx     = isvr_priority_eoi.idx;
+*************************************************/
+
+always_comb 
+begin
+    casex(ipic_isvr_eoi)
+	    16'bxxxx_xxxx_xxxx_xxx1 : irq_eoi_req_idx = 0;
+	    16'bxxxx_xxxx_xxxx_xx10 : irq_eoi_req_idx = 1;
+	    16'bxxxx_xxxx_xxxx_x100 : irq_eoi_req_idx = 2;
+	    16'bxxxx_xxxx_xxxx_1000 : irq_eoi_req_idx = 3;
+	    16'bxxxx_xxxx_xxx1_0000 : irq_eoi_req_idx = 4;
+	    16'bxxxx_xxxx_xx10_0000 : irq_eoi_req_idx = 5;
+	    16'bxxxx_xxxx_x100_0000 : irq_eoi_req_idx = 6;
+	    16'bxxxx_xxxx_1000_0000 : irq_eoi_req_idx = 7;
+	    16'bxxxx_xxx1_0000_0000 : irq_eoi_req_idx = 8;
+	    16'bxxxx_xx10_0000_0000 : irq_eoi_req_idx = 9;
+	    16'bxxxx_x100_0000_0000 : irq_eoi_req_idx = 10;
+	    16'bxxxx_1000_0000_0000 : irq_eoi_req_idx = 11;
+	    16'bxxx1_0000_0000_0000 : irq_eoi_req_idx = 12;
+	    16'bxx10_0000_0000_0000 : irq_eoi_req_idx = 13;
+	    16'bx100_0000_0000_0000 : irq_eoi_req_idx = 14;
+	    16'b1000_0000_0000_0000 : irq_eoi_req_idx = 15;
+	    16'b0000_0000_0000_0000 : irq_eoi_req_idx = 16;
+	    default : irq_eoi_req_idx = 16;
+    endcase
+    irq_eoi_req_vd = |ipic_isvr_eoi;
+end
 
 assign irq_hi_prior_pnd     = irq_req_idx < irq_serv_idx;
 
@@ -602,4 +653,4 @@
 
 endmodule : scr1_ipic
 
-`endif // SCR1_IPIC_EN
\ No newline at end of file
+`endif // SCR1_IPIC_EN
diff --git a/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_csr.sv b/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_csr.sv
index 183887d..f638a1a 100644
--- a/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_csr.sv
+++ b/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_csr.sv
@@ -302,10 +302,10 @@
 // IRQ exception codes priority
 always_comb begin
     case (1'b1)
-        csr_eirq_pnd_en: csr_mcause_ec_new = type_scr1_exc_code_e'(SCR1_EXC_CODE_IRQ_M_EXTERNAL);
-        csr_sirq_pnd_en: csr_mcause_ec_new = type_scr1_exc_code_e'(SCR1_EXC_CODE_IRQ_M_SOFTWARE);
-        csr_tirq_pnd_en: csr_mcause_ec_new = type_scr1_exc_code_e'(SCR1_EXC_CODE_IRQ_M_TIMER);
-        default        : csr_mcause_ec_new = type_scr1_exc_code_e'(SCR1_EXC_CODE_IRQ_M_EXTERNAL);
+        csr_eirq_pnd_en: csr_mcause_ec_new = SCR1_EXC_CODE_IRQ_M_EXTERNAL; // cp.7
+        csr_sirq_pnd_en: csr_mcause_ec_new = SCR1_EXC_CODE_IRQ_M_SOFTWARE; // cp.7
+        csr_tirq_pnd_en: csr_mcause_ec_new = SCR1_EXC_CODE_IRQ_M_TIMER; // cp.7
+        default        : csr_mcause_ec_new = SCR1_EXC_CODE_IRQ_M_EXTERNAL; // cp.7
     endcase
 end
 
@@ -348,7 +348,7 @@
         // Machine Trap Handling (read-write)
         SCR1_CSR_ADDR_MSCRATCH  : csr_r_data    = csr_mscratch_ff;
         SCR1_CSR_ADDR_MEPC      : csr_r_data    = csr_mepc;
-        SCR1_CSR_ADDR_MCAUSE    : csr_r_data    = {csr_mcause_i_ff, type_scr1_csr_mcause_ec_v'(csr_mcause_ec_ff)};
+        SCR1_CSR_ADDR_MCAUSE    : csr_r_data    = {csr_mcause_i_ff, (`SCR1_XLEN-1)'(csr_mcause_ec_ff)};
         SCR1_CSR_ADDR_MTVAL     : csr_r_data    = csr_mtval_ff;
         SCR1_CSR_ADDR_MIP       : csr_r_data    = csr_mip;
 
@@ -794,7 +794,7 @@
 always_ff @(negedge rst_n, posedge clk) begin
     if (~rst_n) begin
         csr_mcause_i_ff  <= 1'b0;
-        csr_mcause_ec_ff <= type_scr1_exc_code_e'(SCR1_EXC_CODE_RESET);
+        csr_mcause_ec_ff <= SCR1_EXC_CODE_RESET; // cp.7
     end else begin
         csr_mcause_i_ff  <= csr_mcause_i_next;
         csr_mcause_ec_ff <= csr_mcause_ec_next;
@@ -813,7 +813,7 @@
         end
         csr_mcause_upd: begin
             csr_mcause_i_next  = csr_w_data[`SCR1_XLEN-1];
-            csr_mcause_ec_next = type_scr1_exc_code_e'(csr_w_data[SCR1_EXC_CODE_WIDTH_E-1:0]);
+            csr_mcause_ec_next = csr_w_data[SCR1_EXC_CODE_WIDTH_E-1:0]; // cp.7
         end
         default       : begin
             csr_mcause_i_next  = csr_mcause_i_ff;
@@ -1089,6 +1089,7 @@
 
 // Behavior checks
 
+`ifndef VERILATOR
 SCR1_SVA_CSR_MRET : assert property (
     @(negedge clk) disable iff (~rst_n)
     e_mret |=> ($stable(csr_mepc_ff) & $stable(csr_mtval_ff))
@@ -1110,7 +1111,7 @@
     (~csr_mstatus_mie_ff & (~csr_mcause_i_ff)
     & (exu2csr_pc_curr_i=={csr_mtvec_base, SCR1_CSR_MTVEC_BASE_ZERO_BITS'(0)}))
     ) else $error("CSR Error: wrong EXC+IRQ");
-
+`endif // VERILATOR
 SCR1_SVA_CSR_EVENTS : assert property (
     @(negedge clk) disable iff (~rst_n)
     $onehot0({e_irq, e_exc, e_mret})
@@ -1121,14 +1122,16 @@
     csr2exu_rw_exc_o |-> (exu2csr_w_req_i | exu2csr_r_req_i)
     ) else $error("CSR Error: impossible exception");
 
+`ifndef VERILATOR
 SCR1_SVA_CSR_MSTATUS_MIE_UP : assert property (
     @(negedge clk) disable iff (~rst_n)
     csr2exu_mstatus_mie_up_o |=> ~csr2exu_mstatus_mie_up_o
     ) else $error("CSR Error: csr2exu_mstatus_mie_up_o can only be high for one mcycle");
-
+`endif // VERILATOR
 
 `ifndef SCR1_CSR_REDUCED_CNT
 
+`ifndef VERILATOR
 SCR1_SVA_CSR_CYCLE_INC : assert property (
     @(
 `ifndef SCR1_CLKCTRL_EN
@@ -1154,7 +1157,7 @@
     (csr_minstret == $past(csr_minstret + 1'b1))
 `endif // SCR1_MCOUNTEN_EN
     ) else $error("CSR Error: INSTRET increment wrong behavior");
-
+`endif
 SCR1_SVA_CSR_CYCLE_INSTRET_UP : assert property (
     @(negedge clk) disable iff (~rst_n)
     ~(&csr_minstret_upd | &csr_mcycle_upd)
diff --git a/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_ialu.sv b/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_ialu.sv
index eec1c20..393541d 100644
--- a/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_ialu.sv
+++ b/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_ialu.sv
@@ -487,16 +487,17 @@
 //-------------------------------------------------------------------------------
 // MDU adder
 //-------------------------------------------------------------------------------
+logic           sgn;
+logic           inv;
 
 always_comb begin
     mdu_sum_sub    = 1'b0;
     mdu_sum_op1    = '0;
     mdu_sum_op2    = '0;
+    sgn            = '0; // yosys - latch fix
+    inv            = '0; // yosys - latch fix
     case (mdu_cmd)
         SCR1_IALU_MDU_DIV : begin
-            logic           sgn;
-            logic           inv;
-
             sgn         = mdu_fsm_corr ? div_op1_is_neg ^ mdu_res_c_ff
                         : mdu_fsm_idle ? 1'b0
                                        : ~mdu_res_lo_ff[0];
@@ -683,6 +684,7 @@
     $onehot0({~exu2ialu_rvm_cmd_vd_i, mdu_fsm_iter, mdu_fsm_corr})
     ) else $error("IALU Error: illegal state");
 
+`ifndef VERILATOR    
 SCR1_SVA_IALU_JUMP_FROM_IDLE : assert property (
     @(negedge clk) disable iff (~rst_n)
     (mdu_fsm_idle & (~exu2ialu_rvm_cmd_vd_i | ~mdu_iter_req)) |=> mdu_fsm_idle
@@ -712,6 +714,7 @@
     @(negedge clk) disable iff (~rst_n)
     mdu_fsm_corr |=> mdu_fsm_idle
     ) else $error("EXU Error: illegal state stay in CORR");
+`endif // VERILATOR
 
 `endif // SCR1_RVM_EXT
 
diff --git a/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_idu.sv b/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_idu.sv
index f51dacf..d18629c 100644
--- a/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_idu.sv
+++ b/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_idu.sv
@@ -80,10 +80,10 @@
 assign instr          = ifu2idu_instr_i;
 
 // RVI / RVC
-assign instr_type   = type_scr1_instr_type_e'(instr[1:0]);
+assign instr_type   = instr[1:0];
 
 // RVI / RVC fields
-assign rvi_opcode   = type_scr1_rvi_opcode_e'(instr[6:2]);                          // RVI
+assign rvi_opcode   = instr[6:2];                          // RVI
 assign funct3       = (instr_type == SCR1_INSTR_RVI) ? instr[14:12] : instr[15:13]; // RVI / RVC
 assign funct7       = instr[31:25];                                                 // RVI
 assign funct12      = instr[31:20];                                                 // RVI (SYSTEM)
diff --git a/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_ifu.sv b/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_ifu.sv
index 740c4f6..c8f562b 100644
--- a/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_ifu.sv
+++ b/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_ifu.sv
@@ -420,8 +420,10 @@
 
 always_ff @(posedge clk, negedge rst_n) begin
     if (~rst_n) begin
+     `ifdef SCR1_MPRF_RST_EN // Two dimensional array init not allowed in YOSYS - cp.13
         q_data  <= '{SCR1_IFU_Q_SIZE_HALF{'0}};
         q_err   <= '{SCR1_IFU_Q_SIZE_HALF{1'b0}};
+     `endif
     end else if (q_wr_en) begin
         case (q_wr_size)
             SCR1_IFU_QUEUE_WR_HI    : begin
@@ -777,12 +779,12 @@
     ) else $error("IFU Error: unknown {ifu2imem_addr_o, ifu2imem_cmd_o}");
 
 // Behavior checks
-
+`ifndef VERILATOR
 SCR1_SVA_IFU_DRC_UNDERFLOW : assert property (
     @(negedge clk) disable iff (~rst_n)
     ~imem_resp_discard_req |=> ~(imem_resp_discard_cnt == SCR1_TXN_CNT_W'('1))
     ) else $error("IFU Error: imem_resp_discard_cnt underflow");
-
+`endif // VERILATOR
 SCR1_SVA_IFU_DRC_RANGE : assert property (
     @(negedge clk) disable iff (~rst_n)
     (imem_resp_discard_cnt >= 0) & (imem_resp_discard_cnt <= imem_pnd_txns_cnt)
@@ -795,6 +797,7 @@
                                                                 : (q_wr_size == SCR1_IFU_QUEUE_WR_NONE))
     ) else $error("IFU Error: queue overflow");
 
+`ifndef VERILATOR
 SCR1_SVA_IFU_IMEM_ERR_BEH : assert property (
     @(negedge clk) disable iff (~rst_n)
     (imem_resp_er & ~imem_resp_discard_req & ~exu2ifu_pc_new_req_i) |=>
@@ -805,17 +808,18 @@
     @(negedge clk) disable iff (~rst_n)
     exu2ifu_pc_new_req_i |=> q_is_empty
     ) else $error("IFU Error: incorrect behavior after exu2ifu_pc_new_req_i");
-
+`endif // VERILATOR
 SCR1_SVA_IFU_IMEM_ADDR_ALIGNED : assert property (
     @(negedge clk) disable iff (~rst_n)
     ifu2imem_req_o |-> ~|ifu2imem_addr_o[1:0]
     ) else $error("IFU Error: unaligned IMEM access");
 
+`ifndef VERILATOR
 SCR1_SVA_IFU_STOP_FETCH : assert property (
     @(negedge clk) disable iff (~rst_n)
     pipe2ifu_stop_fetch_i |=> (ifu_fsm_curr == SCR1_IFU_FSM_IDLE)
     ) else $error("IFU Error: fetch not stopped");
-
+`endif // VERILATOR
 SCR1_SVA_IFU_IMEM_FAULT_RVI_HI : assert property (
     @(negedge clk) disable iff (~rst_n)
     ifu2idu_err_rvi_hi_o |-> ifu2idu_imem_err_o
diff --git a/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_tdu.sv b/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_tdu.sv
index 441f6a4..ad4ff42 100644
--- a/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_tdu.sv
+++ b/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_tdu.sv
@@ -154,7 +154,7 @@
 
 // TDATA2 register
 logic [MTRIG_NUM-1:0]                           csr_tdata2_upd;
-logic [MTRIG_NUM-1:0] [SCR1_TDU_DATA_W-1:0]     csr_tdata2_ff;
+logic [MTRIG_NUM-1:0]                           csr_tdata2_ff [SCR1_TDU_DATA_W-1:0];
 
 //------------------------------------------------------------------------------
 // CSR read/write interface
@@ -164,8 +164,9 @@
 //------------------------------------------------------------------------------
 
 assign tdu2csr_resp_o = csr2tdu_req_i ? SCR1_CSR_RESP_OK : SCR1_CSR_RESP_ER;
-
+integer i;
 always_comb begin
+    i = 0; // yosys latch warning fix
     tdu2csr_rdata_o = '0;
     if (csr2tdu_req_i) begin
         case (csr2tdu_addr_i)
@@ -173,14 +174,14 @@
                 tdu2csr_rdata_o = {'0, csr_tselect_ff};
             end
             SCR1_CSR_ADDR_TDU_OFFS_TDATA2 : begin
-                for(int unsigned i = 0; i < MTRIG_NUM; ++i) begin
+                for(i = 0; i < MTRIG_NUM; i=i+1) begin // cp.4
                     if(csr_tselect_ff == ALLTRIG_W'(i)) begin
                         tdu2csr_rdata_o = csr_tdata2_ff[i];
                     end
                 end
             end
             SCR1_CSR_ADDR_TDU_OFFS_TDATA1 : begin
-                for(int unsigned i = 0; i < MTRIG_NUM; ++i) begin
+                for(i = 0; i < MTRIG_NUM; i=i+1) begin // cp.4
                     if(csr_tselect_ff == ALLTRIG_W'(i)) begin
                         tdu2csr_rdata_o[SCR1_TDU_TDATA1_TYPE_HI:
                                        SCR1_TDU_TDATA1_TYPE_LO]      = SCR1_TDU_MCONTROL_TYPE_VAL;
@@ -221,7 +222,7 @@
 `endif // SCR1_TDU_ICOUNT_EN
             end
             SCR1_CSR_ADDR_TDU_OFFS_TINFO : begin
-                for(int unsigned i = 0; i < MTRIG_NUM; ++i) begin
+                for(i = 0; i < MTRIG_NUM; i=i+1) begin // cp.4
                     if(csr_tselect_ff == ALLTRIG_W'(i)) begin
                         tdu2csr_rdata_o[SCR1_TDU_MCONTROL_TYPE_VAL] = 1'b1;
                     end
@@ -265,8 +266,9 @@
 
 // Register selection
 //------------------------------------------------------------------------------
-
+integer k;
 always_comb begin
+    k = 0; // yosys latch warning fix
     csr_addr_tselect  = 1'b0;
     csr_addr_tdata2   = '0;
     csr_addr_mcontrol = '0;
@@ -280,9 +282,9 @@
                 csr_addr_tselect = 1'b1;
             end
             SCR1_CSR_ADDR_TDU_OFFS_TDATA1 : begin
-                for(int unsigned i = 0; i < MTRIG_NUM; ++i) begin
-                    if(csr_tselect_ff == ALLTRIG_W'(i)) begin
-                        csr_addr_mcontrol[i] = 1'b1;
+                for(k = 0; k < MTRIG_NUM; k=k+1) begin
+                    if(csr_tselect_ff == ALLTRIG_W'(k)) begin
+                        csr_addr_mcontrol[k] = 1'b1;
                     end
                 end
 `ifdef SCR1_TDU_ICOUNT_EN
@@ -292,9 +294,9 @@
 `endif // SCR1_TDU_ICOUNT_EN
             end
             SCR1_CSR_ADDR_TDU_OFFS_TDATA2 : begin
-                for(int unsigned i = 0; i < MTRIG_NUM; ++i) begin
-                    if(csr_tselect_ff == ALLTRIG_W'(i) ) begin
-                        csr_addr_tdata2[i] = 1'b1;
+                for(k = 0; k < MTRIG_NUM; k=k+1) begin // cp.4
+                    if(csr_tselect_ff == ALLTRIG_W'(k) ) begin
+                        csr_addr_tdata2[k] = 1'b1;
                     end
                 end
             end
@@ -398,7 +400,7 @@
 
 genvar trig;
 generate
-for (trig = 0; $unsigned(trig) < MTRIG_NUM; ++trig) begin : gblock_mtrig
+for (trig = 0; $unsigned(trig) < MTRIG_NUM; trig=trig+1) begin : gblock_mtrig
 
 assign csr_mcontrol_wr_req[trig] = csr_addr_mcontrol[trig] & csr_wr_req;
 assign csr_mcontrol_clk_en[trig] = clk_en
@@ -490,7 +492,7 @@
 //------------------------------------------------------------------------------
 
 generate
-for (trig = 0; $unsigned(trig) < MTRIG_NUM; ++trig) begin : gblock_break_trig
+for (trig = 0; $unsigned(trig) < MTRIG_NUM; trig=trig+1) begin : gblock_break_trig
 assign csr_mcontrol_exec_hit[trig] = ~tdu_dsbl_i
                                    & csr_mcontrol_m_ff[trig]
                                    & csr_mcontrol_exec_ff[trig]
@@ -509,7 +511,7 @@
 //------------------------------------------------------------------------------
 
 generate
-for( trig = 0; $unsigned(trig) < MTRIG_NUM; ++trig ) begin : gblock_watch_trig
+for( trig = 0; $unsigned(trig) < MTRIG_NUM; trig=trig+1 ) begin : gblock_watch_trig
 assign csr_mcontrol_ldst_hit[trig] = ~tdu_dsbl_i
                                    & csr_mcontrol_m_ff[trig]
                                    & lsu2tdu_dmon_i.vd
@@ -529,12 +531,12 @@
 //------------------------------------------------------------------------------
 // TDU <-> HDU interface
 //------------------------------------------------------------------------------
-
+integer j;
 always_comb begin
     tdu2hdu_dmode_req_o = 1'b0;
 
-    for(int unsigned i = 0; i < MTRIG_NUM; ++i) begin
-        tdu2hdu_dmode_req_o |= (csr_mcontrol_action_ff[i] & exu2tdu_bp_retire_i[i]);
+    for(j = 0; j < MTRIG_NUM; j=j+1) begin
+        tdu2hdu_dmode_req_o |= (csr_mcontrol_action_ff[j] & exu2tdu_bp_retire_i[j]);
     end
 `ifdef SCR1_TDU_ICOUNT_EN
     tdu2hdu_dmode_req_o |= (csr_icount_action_ff & exu2tdu_bp_retire_i[ALLTRIG_NUM-1]);
diff --git a/verilog/rtl/syntacore_scr1/src/core/scr1_dm.sv b/verilog/rtl/syntacore_scr1/src/core/scr1_dm.sv
index 3dfd254..642dd53 100644
--- a/verilog/rtl/syntacore_scr1/src/core/scr1_dm.sv
+++ b/verilog/rtl/syntacore_scr1/src/core/scr1_dm.sv
@@ -1131,9 +1131,9 @@
 
         ABS_STATE_ERR: begin
             if (dmi_req_abstractcs & dmi2dm_wr_i) begin
-                abstractcs_cmderr_next = type_scr1_abs_err_e'(logic'(abstractcs_cmderr_ff)
+                abstractcs_cmderr_next = abstractcs_cmderr_ff  // cp.7
                                        & (~dmi2dm_wdata_i[SCR1_DBG_ABSTRACTCS_CMDERR_HI:
-                                                          SCR1_DBG_ABSTRACTCS_CMDERR_LO]));
+                                                          SCR1_DBG_ABSTRACTCS_CMDERR_LO]);
             end
         end
 
diff --git a/verilog/rtl/syntacore_scr1/src/core/scr1_scu.sv b/verilog/rtl/syntacore_scr1/src/core/scr1_scu.sv
index 7f44ee6..a370f40 100644
--- a/verilog/rtl/syntacore_scr1/src/core/scr1_scu.sv
+++ b/verilog/rtl/syntacore_scr1/src/core/scr1_scu.sv
@@ -187,7 +187,7 @@
 end
 
 assign tapc_shift_next = tapc_dr_cap_req  ? tapc_shadow_ff
-                       : tapc_dr_shft_req ? {tapcsync2scu_ch_tdi_i, tapc_shift_ff[$bits(type_scr1_scu_sysctrl_dr_s)-1:1]}
+                       : tapc_dr_shft_req ? {tapcsync2scu_ch_tdi_i, tapc_shift_ff[SCR1_SCU_DR_SYSCTRL_WIDTH-1:1]}// cp.5
                                           : tapc_shift_ff;
 
 // TAPC shadow register
@@ -319,12 +319,12 @@
 // STICKY_STATUS register
 //------------------------------------------------------------------------------
 // For every output reset signal shows if it was asserted since the last bit clearing
-
+integer i;
 always_ff @(posedge clk, negedge pwrup_rst_n_sync) begin
     if (~pwrup_rst_n_sync) begin
         scu_sticky_sts_ff <= '0;
     end else begin
-        for (int unsigned i = 0; i < $bits(type_scr1_scu_sysctrl_status_reg_s); ++i) begin
+        for (i = 0; i < SCR1_SCU_SYSCTRL_STATUS_REG_WIDTH ; i=i+1) begin // cp.4
             if (scu_status_ff_posedge[i]) begin
                 scu_sticky_sts_ff[i] <= 1'b1;
             end else if (scu_sticky_sts_wr_req) begin
@@ -483,6 +483,7 @@
     !$isunknown({pwrup_rst_n, rst_n, cpu_rst_n, ndm_rst_n_i, hart_rst_n_i})
 ) else $error("SCU resets error: unknown values of input resets");
 
+`ifndef VERILATOR
 // Qualifiers checks
 SCR1_SVA_SCU_SYS2SOC_QLFY_CHECK : assert property (
     @(negedge clk) disable iff (~pwrup_rst_n)
@@ -508,7 +509,7 @@
     @(negedge clk) disable iff (~pwrup_rst_n)
     $fell(hdu_rst_n_o) |-> $fell($past(hdu2dm_rdc_qlfy_o))
 ) else $error("SCU hdu2dm qlfy error: qlfy wasn't raised prior to reset");
-
+`endif // VERILATOR
 `endif // SCR1_TRGT_SIMULATION
 
 endmodule : scr1_scu
diff --git a/verilog/rtl/syntacore_scr1/src/includes/scr1_arch_description.svh b/verilog/rtl/syntacore_scr1/src/includes/scr1_arch_description.svh
index 7c8b532..7b89dc6 100644
--- a/verilog/rtl/syntacore_scr1/src/includes/scr1_arch_description.svh
+++ b/verilog/rtl/syntacore_scr1/src/includes/scr1_arch_description.svh
@@ -59,7 +59,7 @@
 
 // Uncomment one of these defines to set the recommended configuration:
 
-//`define SCR1_CFG_RV32IMC_MAX
+`define SCR1_CFG_RV32IMC_MAX
 //`define SCR1_CFG_RV32IC_BASE
 //`define SCR1_CFG_RV32EC_MIN
 
@@ -74,15 +74,15 @@
   parameter int unsigned SCR1_MTVEC_BASE_WR_BITS = 26;
   `define SCR1_MTVEC_MODE_EN
   `define SCR1_FAST_MUL
-  `define SCR1_MPRF_RST_EN
+//`define SCR1_MPRF_RST_EN - yosys fix, two dimensional array init not allowed
   `define SCR1_MCOUNTEN_EN
-  `define SCR1_DBG_EN
+//  `define SCR1_DBG_EN
   `define SCR1_TDU_EN
   parameter int unsigned SCR1_TDU_TRIG_NUM = 4;
   `define SCR1_TDU_ICOUNT_EN
   `define SCR1_IPIC_EN
   `define SCR1_IPIC_SYNC_EN
-  `define SCR1_TCM_EN
+//  `define SCR1_TCM_EN
 `elsif  SCR1_CFG_RV32IC_BASE
   `define SCR1_RVI_EXT
   `define SCR1_RVC_EXT
diff --git a/verilog/rtl/syntacore_scr1/src/includes/scr1_hdu.svh b/verilog/rtl/syntacore_scr1/src/includes/scr1_hdu.svh
index c3a503f..1d73fe4 100644
--- a/verilog/rtl/syntacore_scr1/src/includes/scr1_hdu.svh
+++ b/verilog/rtl/syntacore_scr1/src/includes/scr1_hdu.svh
@@ -17,7 +17,7 @@
 // Parameters
 //==============================================================================
 //localparam int unsigned SCR1_HDU_DEBUGCSR_BASE_ADDR      = 12'h7B0;
-localparam int unsigned SCR1_HDU_DEBUGCSR_ADDR_SPAN      = SCR1_CSR_ADDR_HDU_MSPAN;
+localparam int unsigned SCR1_HDU_DEBUGCSR_ADDR_SPAN      = 4; // YOSYS FIX
 localparam int unsigned SCR1_HDU_DEBUGCSR_ADDR_WIDTH     = $clog2(SCR1_HDU_DEBUGCSR_ADDR_SPAN);
 localparam bit [3:0]    SCR1_HDU_DEBUGCSR_DCSR_XDEBUGVER = 4'h4;
 localparam int unsigned SCR1_HDU_PBUF_ADDR_SPAN          = 8;
diff --git a/verilog/rtl/syntacore_scr1/src/includes/scr1_search_ms1.svh b/verilog/rtl/syntacore_scr1/src/includes/scr1_search_ms1.svh
index fc516ba..0fd8ac5 100644
--- a/verilog/rtl/syntacore_scr1/src/includes/scr1_search_ms1.svh
+++ b/verilog/rtl/syntacore_scr1/src/includes/scr1_search_ms1.svh
@@ -9,12 +9,12 @@
 //-------------------------------------------------------------------------------
 // Local types declaration
 //-------------------------------------------------------------------------------
-typedef struct {
+typedef struct packed {
     logic       vd;
     logic       idx;
 } type_scr1_search_one_2_s;
 
-typedef struct {
+typedef struct packed {
     logic           vd;
     logic [4:0]     idx;
 } type_scr1_search_one_32_s;
@@ -29,9 +29,9 @@
 begin
     tmp.vd  = |din;
     tmp.idx = ~din[1];
-    return  tmp;
+    scr1_lead_zeros_cnt_2 =  tmp;
 end
-endfunction : scr1_lead_zeros_cnt_2
+endfunction
 
 function automatic logic [4:0] scr1_lead_zeros_cnt_32(
     input   logic [31:0]    din
@@ -48,9 +48,10 @@
     logic [3:0]     stage4_idx [1:0];
     type_scr1_search_one_32_s tmp;
     logic [4:0]     res;
+    integer         i;
 
     // Stage 1
-    for (int unsigned i=0; i<16; ++i) begin
+    for (i=0; i<16; i=i+1) begin // cp.4
         type_scr1_search_one_2_s tmp;
         tmp = scr1_lead_zeros_cnt_2(din[(i+1)*2-1-:2]);
         stage1_vd[i]  = tmp.vd;
@@ -58,7 +59,7 @@
     end
 
     // Stage 2
-    for (int unsigned i=0; i<8; ++i) begin
+    for (i=0; i<8;i=i+1) begin // cp.4
         type_scr1_search_one_2_s tmp;
         tmp = scr1_lead_zeros_cnt_2(stage1_vd[(i+1)*2-1-:2]);
         stage2_vd[i]  = tmp.vd;
@@ -66,7 +67,7 @@
     end
 
     // Stage 3
-    for (int unsigned i=0; i<4; ++i) begin
+    for (i=0; i<4; i=i+1) begin // cp.4
         type_scr1_search_one_2_s tmp;
         tmp = scr1_lead_zeros_cnt_2(stage2_vd[(i+1)*2-1-:2]);
         stage3_vd[i]  = tmp.vd;
@@ -74,7 +75,7 @@
     end
 
     // Stage 4
-    for (int unsigned i=0; i<2; ++i) begin
+    for (i=0; i<2; i=i+1) begin // cp.4
         type_scr1_search_one_2_s tmp;
         tmp = scr1_lead_zeros_cnt_2(stage3_vd[(i+1)*2-1-:2]);
         stage4_vd[i]  = tmp.vd;
@@ -87,8 +88,8 @@
 
     res = tmp.idx;
 
-    return res;
+    scr1_lead_zeros_cnt_32 = res;
 end
-endfunction : scr1_lead_zeros_cnt_32
+endfunction 
 
 `endif // SCR1_SEARCH_MS1_SVH
diff --git a/verilog/rtl/syntacore_scr1/src/top/scr1_dmem_ahb.sv b/verilog/rtl/syntacore_scr1/src/top/scr1_dmem_ahb.sv
index 1a413d5..5b06660 100644
--- a/verilog/rtl/syntacore_scr1/src/top/scr1_dmem_ahb.sv
+++ b/verilog/rtl/syntacore_scr1/src/top/scr1_dmem_ahb.sv
@@ -96,9 +96,9 @@
             tmp = SCR1_HSIZE_ERR;
         end
     endcase
-    return tmp;
+    scr1_conv_mem2ahb_width =  tmp; // cp.11
 end
-endfunction : scr1_conv_mem2ahb_width
+endfunction
 
 function automatic logic[SCR1_AHB_WIDTH-1:0] scr1_conv_mem2ahb_wdata (
     input   logic   [1:0]                   dmem_addr,
@@ -145,9 +145,9 @@
         default : begin
         end
     endcase
-    return tmp;
+    scr1_conv_mem2ahb_wdata = tmp;
 end
-endfunction : scr1_conv_mem2ahb_wdata
+endfunction
 
 function automatic logic[SCR1_AHB_WIDTH-1:0] scr1_conv_ahb2mem_rdata (
     input   logic [2:0]                 hwidth,
@@ -182,9 +182,9 @@
         default : begin
         end
     endcase
-    return tmp;
+    scr1_conv_ahb2mem_rdata = tmp;
 end
-endfunction : scr1_conv_ahb2mem_rdata
+endfunction
 
 //-------------------------------------------------------------------------------
 // Local signal declaration
diff --git a/verilog/rtl/syntacore_scr1/src/top/scr1_mem_axi.sv b/verilog/rtl/syntacore_scr1/src/top/scr1_mem_axi.sv
index 406494d..f6bb7ea 100644
--- a/verilog/rtl/syntacore_scr1/src/top/scr1_mem_axi.sv
+++ b/verilog/rtl/syntacore_scr1/src/top/scr1_mem_axi.sv
@@ -90,9 +90,9 @@
                      default:  axsize = 'x;
     endcase
 
-    return axsize;
+    width2axsize = axsize; // cp.11
 end
-endfunction: width2axsize
+endfunction
 
 typedef struct packed {
     type_scr1_mem_width_e                               axi_width;
@@ -108,9 +108,21 @@
 } type_scr1_req_status_s;
 
 
-type_scr1_request_s         [SCR1_REQ_BUF_SIZE-1:0]     req_fifo;
-type_scr1_req_status_s      [SCR1_REQ_BUF_SIZE-1:0]     req_status;
-type_scr1_req_status_s      [SCR1_REQ_BUF_SIZE-1:0]     req_status_new;
+//type_scr1_request_s         [SCR1_REQ_BUF_SIZE-1:0]   req_fifo;
+logic [1:0]                                             req_fifo_axi_width[SCR1_REQ_BUF_SIZE-1:0];
+logic [SCR1_ADDR_WIDTH-1:0]                             req_fifo_axi_addr [SCR1_REQ_BUF_SIZE-1:0];
+logic [31:0]                                            req_fifo_axi_wdata [SCR1_REQ_BUF_SIZE-1:0];
+//type_scr1_req_status_s      [SCR1_REQ_BUF_SIZE-1:0]   req_status;
+logic   [SCR1_REQ_BUF_SIZE-1:0]                         req_status_req_write ;
+logic   [SCR1_REQ_BUF_SIZE-1:0]                         req_status_req_addr ;
+logic   [SCR1_REQ_BUF_SIZE-1:0]                         req_status_req_data ;
+logic   [SCR1_REQ_BUF_SIZE-1:0]                         req_status_req_resp ;
+//type_scr1_req_status_s      [SCR1_REQ_BUF_SIZE-1:0]   req_status_new;
+logic   [SCR1_REQ_BUF_SIZE-1:0]                         req_status_new_req_write ;
+logic   [SCR1_REQ_BUF_SIZE-1:0]                         req_status_new_req_addr ;
+logic   [SCR1_REQ_BUF_SIZE-1:0]                         req_status_new_req_data ;
+logic   [SCR1_REQ_BUF_SIZE-1:0]                         req_status_new_req_resp ;
+
 logic                       [SCR1_REQ_BUF_SIZE-1:0]     req_status_en;
 logic               [$clog2(SCR1_REQ_BUF_SIZE)-1:0]     req_aval_ptr;
 logic               [$clog2(SCR1_REQ_BUF_SIZE)-1:0]     req_proc_ptr;
@@ -124,30 +136,30 @@
 
 
 assign core_req_ack =   ~axi_reinit                        &
-                        ~req_status[req_aval_ptr].req_resp &
+                        ~req_status_req_resp[req_aval_ptr] &
                          core_resp!=SCR1_MEM_RESP_RDY_ER;
 
 
-assign rready      = ~req_status[req_done_ptr].req_write;
-assign bready      =  req_status[req_done_ptr].req_write;
+assign rready      = ~req_status_req_write[req_done_ptr];
+assign bready      =  req_status_req_write[req_done_ptr];
 
 
-assign force_read  = bit'(SCR1_AXI_REQ_BP) & core_req & core_req_ack & req_aval_ptr==req_proc_ptr & core_cmd==SCR1_MEM_CMD_RD;
-assign force_write = bit'(SCR1_AXI_REQ_BP) & core_req & core_req_ack & req_aval_ptr==req_proc_ptr & core_cmd==SCR1_MEM_CMD_WR;
+assign force_read  = SCR1_AXI_REQ_BP & core_req & core_req_ack & req_aval_ptr==req_proc_ptr & core_cmd==SCR1_MEM_CMD_RD;
+assign force_write = SCR1_AXI_REQ_BP & core_req & core_req_ack & req_aval_ptr==req_proc_ptr & core_cmd==SCR1_MEM_CMD_WR;
 
-
+integer i;
 always_comb begin: idle_status
     core_idle = 1'b1;
-    for (int unsigned i=0; i<SCR1_REQ_BUF_SIZE; ++i) begin
-        core_idle &= req_status[i].req_resp==1'b0;
+    for (i=0; i<SCR1_REQ_BUF_SIZE; i=i+1) begin
+        core_idle &= req_status_req_resp[i]==1'b0;
     end
 end
 
 always_ff @(posedge clk) begin
     if (core_req & core_req_ack) begin
-        req_fifo[req_aval_ptr].axi_width <= core_width;
-        req_fifo[req_aval_ptr].axi_addr  <= core_addr;
-        req_fifo[req_aval_ptr].axi_wdata <= core_wdata;
+        req_fifo_axi_width[req_aval_ptr] <= core_width;
+        req_fifo_axi_addr[req_aval_ptr]  <= core_addr;
+        req_fifo_axi_wdata[req_aval_ptr] <= core_wdata;
     end
 end
 
@@ -158,49 +170,59 @@
 always_comb begin
     // Default
     req_status_en  = '0; // No update
-    req_status_new = req_status; // Hold request info
+    req_status_new_req_write = req_status_req_write; // Hold request info
+    req_status_new_req_addr  = req_status_req_addr; // Hold request info
+    req_status_new_req_data  = req_status_req_data; // Hold request info
+    req_status_new_req_resp  = req_status_req_resp; // Hold request info
 
     // Update status on new core request
     if( core_req & core_req_ack ) begin
         req_status_en[req_aval_ptr]            = 1'd1;
 
-        req_status_new[req_aval_ptr].req_resp  = 1'd1;
-        req_status_new[req_aval_ptr].req_write = core_cmd == SCR1_MEM_CMD_WR;
+        req_status_new_req_resp[req_aval_ptr]  = 1'd1;
+        req_status_new_req_write[req_aval_ptr] = core_cmd == SCR1_MEM_CMD_WR;
 
-        req_status_new[req_aval_ptr].req_addr  = ~( (force_read & arready) |
+        req_status_new_req_addr[req_aval_ptr]  = ~( (force_read & arready) |
                                                     (force_write & awready) );
 
-        req_status_new[req_aval_ptr].req_data  = ~( (force_write & wready & awlen == 8'd0) |
+        req_status_new_req_data[req_aval_ptr]  = ~( (force_write & wready & awlen == 8'd0) |
                                                     (~force_write & core_cmd == SCR1_MEM_CMD_RD) );
     end
 
     // Update status on AXI address phase
     if ( (awvalid & awready) | (arvalid & arready) ) begin
         req_status_en[req_proc_ptr]           = 1'd1;
-        req_status_new[req_proc_ptr].req_addr = 1'd0;
+        req_status_new_req_addr[req_proc_ptr] = 1'd0;
     end
 
     // Update status on AXI data phase
     if ( wvalid & wready & wlast ) begin
         req_status_en[req_proc_ptr]           = 1'd1;
-        req_status_new[req_proc_ptr].req_data = 1'd0;
+        req_status_new_req_data[req_proc_ptr] = 1'd0;
     end
 
     // Update status when AXI finish transaction
     if ( (bvalid & bready) | (rvalid & rready & rlast) ) begin
         req_status_en[req_done_ptr]           = 1'd1;
-        req_status_new[req_done_ptr].req_resp = 1'd0;
+        req_status_new_req_resp[req_done_ptr] = 1'd0;
     end
 end
 
 // Request Status Queue register
+integer j;
 always_ff @(negedge rst_n, posedge clk) begin
     if (~rst_n) begin
-        req_status <= '0;
+        req_status_req_write <= '0;
+        req_status_req_addr <= '0;
+        req_status_req_data <= '0;
+        req_status_req_resp <= '0;
     end else begin
-        for (int unsigned i = 0; i < SCR1_REQ_BUF_SIZE; ++i) begin
-            if ( req_status_en[i] ) begin
-                req_status[i] <= req_status_new[i];
+        for (j = 0; j < SCR1_REQ_BUF_SIZE; j = j+1) begin // cp.4
+            if ( req_status_en[j] ) begin
+                req_status_req_write[j] <= req_status_new_req_write[j];
+                req_status_req_addr[j]  <= req_status_new_req_addr[j];
+                req_status_req_data[j]  <= req_status_new_req_data[j];
+                req_status_req_resp[j]  <= req_status_new_req_resp[j];
             end
         end
     end
@@ -216,9 +238,9 @@
         req_proc_ptr <= '0;
     end else begin
         if ((                                                    awvalid & awready & wvalid & wready & wlast) |
-            (~force_write & ~req_status[req_proc_ptr].req_data & awvalid & awready                          ) |
-            (~force_write & ~req_status[req_proc_ptr].req_addr &                     wvalid & wready & wlast) |
-            (               ~req_status[req_proc_ptr].req_data & arvalid & arready                          )  ) begin
+            (~force_write & ~req_status_req_data[req_proc_ptr] & awvalid & awready                          ) |
+            (~force_write & ~req_status_req_addr[req_proc_ptr] &                     wvalid & wready & wlast) |
+            (               ~req_status_req_data[req_proc_ptr] & arvalid & arready                          )  ) begin
 
             req_proc_ptr <= req_proc_ptr + 1'b1;
         end
@@ -229,7 +251,7 @@
     if (~rst_n) begin
         req_done_ptr <= '0;
     end else begin
-        if ((bvalid & bready | rvalid & rready & rlast) & req_status[req_done_ptr].req_resp) begin
+        if ((bvalid & bready | rvalid & rready & rlast) & req_status_req_resp[req_done_ptr]) begin
 
             req_done_ptr <= req_done_ptr + 1'b1;
         end
@@ -238,19 +260,19 @@
 
 
 
-assign arvalid = req_status[req_proc_ptr].req_addr & ~req_status[req_proc_ptr].req_write | force_read;
-assign awvalid = req_status[req_proc_ptr].req_addr &  req_status[req_proc_ptr].req_write | force_write;
-assign  wvalid = req_status[req_proc_ptr].req_data &  req_status[req_proc_ptr].req_write | force_write;
+assign arvalid = req_status_req_addr[req_proc_ptr] & ~req_status_req_write[req_proc_ptr] | force_read;
+assign awvalid = req_status_req_addr[req_proc_ptr] &  req_status_req_write[req_proc_ptr] | force_write;
+assign  wvalid = req_status_req_data[req_proc_ptr] &  req_status_req_write[req_proc_ptr] | force_write;
 
-assign araddr  = (~force_read )? req_fifo[req_proc_ptr].axi_addr : core_addr;
-assign awaddr  = (~force_write)? req_fifo[req_proc_ptr].axi_addr : core_addr;
+assign araddr  = (~force_read )? req_fifo_axi_addr[req_proc_ptr] : core_addr;
+assign awaddr  = (~force_write)? req_fifo_axi_addr[req_proc_ptr] : core_addr;
 
 always_comb begin
-    if (bvalid & bready & req_status[req_done_ptr].req_resp) begin
+    if (bvalid & bready & req_status_req_resp[req_done_ptr]) begin
         rcvd_resp = (bresp==2'b00)? SCR1_MEM_RESP_RDY_OK :
                                     SCR1_MEM_RESP_RDY_ER;
     end else begin
-        if (rvalid & rready & rlast & req_status[req_done_ptr].req_resp) begin
+        if (rvalid & rready & rlast & req_status_req_resp[req_done_ptr]) begin
             rcvd_resp = (rresp==2'b00)? SCR1_MEM_RESP_RDY_OK :
                                         SCR1_MEM_RESP_RDY_ER;
         end else begin
@@ -260,7 +282,8 @@
 end
 
 
-
+wire [SCR1_ADDR_WIDTH-1:0] CurAddr1 = req_fifo_axi_addr[req_proc_ptr];
+wire [1:0]  bShift1 = CurAddr1[1:0];
 
 // Write data signals adaptation
 always_comb begin
@@ -272,10 +295,10 @@
                          default:  wstrb = 'x;
         endcase
     else
-        case (req_fifo[req_proc_ptr].axi_width)
-            SCR1_MEM_WIDTH_BYTE :  wstrb = 4'h1 << req_fifo[req_proc_ptr].axi_addr[1:0];
-            SCR1_MEM_WIDTH_HWORD:  wstrb = 4'h3 << req_fifo[req_proc_ptr].axi_addr[1:0];
-            SCR1_MEM_WIDTH_WORD :  wstrb = 4'hf << req_fifo[req_proc_ptr].axi_addr[1:0];
+        case (req_fifo_axi_width[req_proc_ptr])
+            SCR1_MEM_WIDTH_BYTE :  wstrb = 4'h1 << bShift1;
+            SCR1_MEM_WIDTH_HWORD:  wstrb = 4'h3 << bShift1;
+            SCR1_MEM_WIDTH_WORD :  wstrb = 4'hf << bShift1;
                          default:  wstrb = 'x;
         endcase
 end
@@ -283,17 +306,17 @@
 
 
 assign wdata = (force_write)?                       core_wdata << (8*                       core_addr[1:0]) :
-                              req_fifo[req_proc_ptr].axi_wdata << (8* req_fifo[req_proc_ptr].axi_addr[1:0]);
+                              req_fifo_axi_wdata[req_proc_ptr] << (8* bShift1);
 
 
 // Read data adaptation
 always_comb begin
-    case (req_fifo[req_done_ptr].axi_width)
-        SCR1_MEM_WIDTH_BYTE :  rcvd_rdata = rdata >> (8*req_fifo[req_done_ptr].axi_addr[1:0]);
-        SCR1_MEM_WIDTH_HWORD:  rcvd_rdata = rdata >> (8*req_fifo[req_done_ptr].axi_addr[1:0]);
-        SCR1_MEM_WIDTH_WORD :  rcvd_rdata = rdata >> (8*req_fifo[req_done_ptr].axi_addr[1:0]);
-                     default:  rcvd_rdata = 'x;
-    endcase
+   case (req_fifo_axi_width[req_done_ptr])
+        SCR1_MEM_WIDTH_BYTE :  rcvd_rdata = rdata >> (8*bShift2);
+        SCR1_MEM_WIDTH_HWORD:  rcvd_rdata = rdata >> (8*bShift2);
+        SCR1_MEM_WIDTH_WORD :  rcvd_rdata = rdata >> (8*bShift2);
+        default:  rcvd_rdata = 'x;
+    endcase 
 end
 
 
@@ -317,7 +340,7 @@
 // AXI interface assignments
 assign awid     = SCR1_AXI_IDWIDTH'(1);
 assign awlen    = 8'd0;
-assign awsize   = (force_write) ? width2axsize(core_width) : width2axsize(req_fifo[req_proc_ptr].axi_width);
+assign awsize   = (force_write) ? width2axsize(core_width) : width2axsize(req_fifo_axi_width[req_proc_ptr]);
 assign awburst  = 2'd1;
 assign awcache  = 4'd2;
 assign awlock   = '0;
@@ -328,7 +351,7 @@
 
 assign arid     = SCR1_AXI_IDWIDTH'(0);
 assign arlen    = 8'd0;
-assign arsize   = (force_read) ? width2axsize(core_width) : width2axsize(req_fifo[req_proc_ptr].axi_width);
+assign arsize   = (force_read) ? width2axsize(core_width) : width2axsize(req_fifo_axi_width[req_proc_ptr]);
 assign arburst  = 2'd1;
 assign arcache  = 4'd2;
 assign arprot   = '0;
diff --git a/verilog/rtl/syntacore_scr1/synth/Makefile b/verilog/rtl/syntacore_scr1/synth/Makefile
new file mode 100644
index 0000000..81bc69f
--- /dev/null
+++ b/verilog/rtl/syntacore_scr1/synth/Makefile
@@ -0,0 +1,71 @@
+#------------------------------------------------------------------------------
+# Makefile for Synthesis
+#------------------------------------------------------------------------------
+
+# Paths
+export ROOT_DIR := $(shell pwd)
+export DESIGN_FILE  := $(ROOT_DIR)/pyfive.sv
+export SYNTH_LOG    := $(ROOT_DIR)/synth.log
+export REPORT_DIR  := $(ROOT_DIR)/reports
+export NETLIST_DIR  := $(ROOT_DIR)/netlist
+export TMP_DIR  := $(ROOT_DIR)/tmp
+
+
+# Targets
+.PHONY: clean create merge synth
+
+default: clean create merge synth
+
+synth: clean create merge 
+	yosys -g -c synth.tcl -l synth.log
+
+create:
+	mkdir -p ./tmp/synthesis; 
+	mkdir -p ./reports; 
+	mkdir -p ./netlist;
+	$(OPENLANE_ROOT)/scripts/libtrim.pl $(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib $(PDK_ROOT)/sky130A/libs.tech/openlane/sky130_fd_sc_hd/no_synth.cells > ./tmp/trimmed.lib
+
+merge: 
+	################################################ 
+	# yosys has issue in propgating the golbal parameter from one file to other file 
+	# to fix this issue, we have concatinated all the rtl file into single file before starting synthesis 
+	# only memory are exclded from this list 
+	# ################################################
+	cat ../src/core/pipeline/scr1_pipe_top.sv > pyfive.sv; 
+	cat ../src/core/scr1_core_top.sv >> pyfive.sv; 
+	cat ../src/core/scr1_dm.sv >> pyfive.sv; 
+	cat ../src/core/scr1_tapc_synchronizer.sv >> pyfive.sv; 
+	cat ../src/core/scr1_clk_ctrl.sv >> pyfive.sv; 
+	cat ../src/core/scr1_scu.sv >> pyfive.sv; 
+	cat ../src/core/scr1_tapc.sv >> pyfive.sv; 
+	cat ../src/core/scr1_tapc_shift_reg.sv >> pyfive.sv; 
+	cat ../src/core/scr1_dmi.sv >> pyfive.sv; 
+	cat ../src/core/primitives/scr1_reset_cells.sv >> pyfive.sv; 
+	cat ../src/core/pipeline/scr1_pipe_ifu.sv >> pyfive.sv; 
+	cat ../src/core/pipeline/scr1_pipe_idu.sv >> pyfive.sv; 
+	cat ../src/core/pipeline/scr1_pipe_exu.sv >> pyfive.sv; 
+	cat ../src/core/pipeline/scr1_pipe_mprf.sv >> pyfive.sv; 
+	cat ../src/core/pipeline/scr1_pipe_csr.sv >> pyfive.sv; 
+	cat ../src/core/pipeline/scr1_pipe_ialu.sv >> pyfive.sv; 
+	cat ../src/core/pipeline/scr1_pipe_lsu.sv >> pyfive.sv; 
+	cat ../src/core/pipeline/scr1_pipe_hdu.sv >> pyfive.sv; 
+	cat ../src/core/pipeline/scr1_pipe_tdu.sv >> pyfive.sv; 
+	cat ../src/core/pipeline/scr1_ipic.sv >> pyfive.sv; 
+	cat ../src/top/scr1_dmem_router.sv >> pyfive.sv; 
+	cat ../src/top/scr1_imem_router.sv >> pyfive.sv; 
+	#cat ../src/top/scr1_dp_memory.sv >> pyfive.sv; 
+	cat ../src/top/scr1_tcm.sv >> pyfive.sv; 
+	cat ../src/top/scr1_timer.sv >> pyfive.sv; 
+	#cat ../src/top/scr1_dmem_ahb.sv >> pyfive.sv; 
+	#cat ../src/top/scr1_imem_ahb.sv >> pyfive.sv; 
+	cat ../src/top/scr1_top_axi.sv >> pyfive.sv; 
+	cat ../src/top/scr1_mem_axi.sv>> pyfive.sv;
+
+
+
+clean:
+	$(RM) $(DESIGN_FILE)
+	$(RM) $(SYNTH_LOG)
+	$(RM) -R $(REPORT_DIR)
+	$(RM) -R $(NETLIST_DIR)
+	$(RM) -R $(TMP_DIR)
diff --git a/verilog/rtl/syntacore_scr1/synth/run_synth b/verilog/rtl/syntacore_scr1/synth/run_synth
new file mode 100755
index 0000000..e537107
--- /dev/null
+++ b/verilog/rtl/syntacore_scr1/synth/run_synth
@@ -0,0 +1,49 @@
+#####################################################
+# Clean up old file and freshly create the directory
+####################################################
+\rm -rf pyfive.sv
+\rm -rf ./tmp
+\rm -rf ./reports
+\rm -rf ./netlist
+mkdir -p ./tmp/synthesis
+mkdir -p ./reports
+mkdir -p ./netlist
+
+################################################
+# yosys has issue in propgating the golbal parameter from one file to other file
+# to fix this issue, we have concatinated all the rtl file into single file before starting synthesis
+# only memory are exclded from this list
+################################################
+
+cat ../src/core/pipeline/scr1_pipe_top.sv > pyfive.sv
+cat ../src/core/scr1_core_top.sv >> pyfive.sv
+cat ../src/core/scr1_dm.sv >> pyfive.sv
+cat ../src/core/scr1_tapc_synchronizer.sv >> pyfive.sv
+cat ../src/core/scr1_clk_ctrl.sv >> pyfive.sv
+cat ../src/core/scr1_scu.sv >> pyfive.sv
+cat ../src/core/scr1_tapc.sv >> pyfive.sv
+cat ../src/core/scr1_tapc_shift_reg.sv >> pyfive.sv
+cat ../src/core/scr1_dmi.sv >> pyfive.sv
+cat ../src/core/primitives/scr1_reset_cells.sv >> pyfive.sv
+cat ../src/core/pipeline/scr1_pipe_ifu.sv >> pyfive.sv
+cat ../src/core/pipeline/scr1_pipe_idu.sv >> pyfive.sv
+cat ../src/core/pipeline/scr1_pipe_exu.sv >> pyfive.sv
+cat ../src/core/pipeline/scr1_pipe_mprf.sv >> pyfive.sv
+cat ../src/core/pipeline/scr1_pipe_csr.sv >> pyfive.sv
+cat ../src/core/pipeline/scr1_pipe_ialu.sv >> pyfive.sv
+cat ../src/core/pipeline/scr1_pipe_lsu.sv >> pyfive.sv
+cat ../src/core/pipeline/scr1_pipe_hdu.sv >> pyfive.sv
+cat ../src/core/pipeline/scr1_pipe_tdu.sv >> pyfive.sv
+cat ../src/core/pipeline/scr1_ipic.sv >> pyfive.sv
+cat ../src/top/scr1_dmem_router.sv >> pyfive.sv
+cat ../src/top/scr1_imem_router.sv >> pyfive.sv
+#cat ../src/top/scr1_dp_memory.sv >> pyfive.sv
+cat ../src/top/scr1_tcm.sv >> pyfive.sv
+cat ../src/top/scr1_timer.sv >> pyfive.sv
+cat ../src/top/scr1_dmem_ahb.sv >> pyfive.sv
+cat ../src/top/scr1_imem_ahb.sv >> pyfive.sv
+cat ../src/top/scr1_top_axi.sv >> pyfive.sv
+cat ../src/top/scr1_mem_axi.sv>> pyfive.sv
+
+yosys -g -c synth.tcl -l synth.log
+
diff --git a/verilog/rtl/syntacore_scr1/synth/synth.tcl b/verilog/rtl/syntacore_scr1/synth/synth.tcl
new file mode 100755
index 0000000..e81ac9a
--- /dev/null
+++ b/verilog/rtl/syntacore_scr1/synth/synth.tcl
@@ -0,0 +1,388 @@
+# Copyright 2020 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# inputs expected as env vars
+#set opt $::env(SYNTH_OPT)
+########### config.tcl ##################
+# User config
+
+# User config
+set ::env(DESIGN_DIR) ../
+
+set ::env(PROJ_DIR) ../../../../
+
+# User config
+set ::env(DESIGN_NAME) scr1_top_axi
+
+# Change if needed
+set ::env(VERILOG_FILES) [glob  \
+            $::env(DESIGN_DIR)/synth/pyfive.sv ]
+
+#set ::env(VERILOG_FILES_BLACKBOX) [glob  \
+#            $::env(DESIGN_DIR)/src/top/scr1_dp_memory.sv ]
+
+set ::env(VERILOG_INCLUDE_DIRS) [glob $::env(DESIGN_DIR)/src/includes]
+
+#set ::env(SYNTH_DEFINES) [list SCR1_DBG_EN SCR1_MPRF_RAM ]
+
+
+set ::env(LIB_SYNTH)  ./tmp/trimmed.lib
+
+
+#set ::env(SDC_FILE) "./designs/aes128/src/aes128.sdc"
+
+# Fill this
+set ::env(CLOCK_PERIOD) "10"
+set ::env(CLOCK_PORT) "clk"
+set ::env(CLOCK_TREE_SYNTH) 0
+
+set ::env(RUN_SIMPLE_CTS) 0
+set ::env(SYNTH_BUFFERING) 0
+set ::env(SYNTH_SIZING) 0
+
+set ::env(SYNTH_DRIVING_CELL) "sky130_fd_sc_hd__inv_8"
+set ::env(SYNTH_CAP_LOAD) "17.65"
+set ::env(SYNTH_MAX_TRAN) "[expr {0.1*10.0}]"
+
+set ::env(SYNTH_MAX_FANOUT) 6
+set ::env(FP_CORE_UTIL) 50
+set ::env(PL_TARGET_DENSITY) [ expr ($::env(FP_CORE_UTIL)+5) / 100.0 ]
+set ::env(CELL_PAD) 4
+
+set ::env(SYNTH_NO_FLAT) "0"
+
+
+set ::env(SYNTH_STRATEGY) "AREA 0"
+set ::env(SYNTH_TIELO_PORT) "sky130_fd_sc_hd__conb_1 LO"
+set ::env(SYNTH_TIEHI_PORT) "sky130_fd_sc_hd__conb_1 HI"
+set ::env(SYNTH_MIN_BUF_PORT) "sky130_fd_sc_hd__buf_2 A X"
+
+
+set ::env(CLOCK_NET) $::env(CLOCK_PORT)
+
+
+
+set ::env(yosys_tmp_file_tag) "./tmp/"
+set ::env(TMP_DIR) "./tmp/"
+set ::env(yosys_netlist_dir) "./netlist"
+set ::env(yosys_report_file_tag) "./reports/yosys"
+set ::env(yosys_result_file_tag) "./reports/yosys.synthesis"
+
+set ::env(SAVE_NETLIST) $::env(yosys_netlist_dir)/$::env(DESIGN_NAME).gv
+
+
+
+########### End of config.tcl
+set buffering $::env(SYNTH_BUFFERING)
+set sizing $::env(SYNTH_SIZING)
+
+yosys -import
+
+set vtop $::env(DESIGN_NAME)
+#set sdc_file $::env(SDC_FILE)
+set sclib $::env(LIB_SYNTH)
+
+if { [info exists ::env(SYNTH_DEFINES) ] } {
+	foreach define $::env(SYNTH_DEFINES) {
+		log "Defining $define"
+		verilog_defines -D$define
+	}
+}
+
+set vIdirsArgs ""
+if {[info exist ::env(VERILOG_INCLUDE_DIRS)]} {
+	foreach dir $::env(VERILOG_INCLUDE_DIRS) {
+		log "Adding include file -I$dir "
+		lappend vIdirsArgs "-I$dir"
+	}
+	set vIdirsArgs [join $vIdirsArgs]
+}
+
+
+
+if { [info exists ::env(EXTRA_LIBS) ] } {
+	foreach lib $::env(EXTRA_LIBS) {
+		read_liberty {*}$vIdirsArgs -lib -ignore_miss_dir -setattr blackbox $lib
+	}
+}
+
+
+
+# ns expected (in sdc as well)
+set clock_period [expr {$::env(CLOCK_PERIOD)*1000}]
+
+set driver  $::env(SYNTH_DRIVING_CELL)
+set cload   $::env(SYNTH_CAP_LOAD)
+# input pin cap of IN_3VX8
+set max_FO $::env(SYNTH_MAX_FANOUT)
+if {![info exist ::env(SYNTH_MAX_TRAN)]} {
+	set ::env(SYNTH_MAX_TRAN) [expr {0.1*$clock_period}]
+} else {
+	set ::env(SYNTH_MAX_TRAN) [expr {$::env(SYNTH_MAX_TRAN) * 1000}]
+}
+set max_Tran $::env(SYNTH_MAX_TRAN)
+
+
+# Mapping parameters
+set A_factor  0.00
+set B_factor  0.88
+set F_factor  0.00
+
+# Don't change these unless you know what you are doing
+set stat_ext    ".stat.rpt"
+set chk_ext    ".chk.rpt"
+set gl_ext      ".gl.v"
+set constr_ext  ".$clock_period.constr"
+set timing_ext  ".timing.txt"
+set abc_ext     ".abc"
+
+
+# get old sdc, add library specific stuff for abc scripts
+set sdc_file $::env(yosys_tmp_file_tag).sdc
+set outfile [open ${sdc_file} w]
+#puts $outfile $sdc_data
+puts $outfile "set_driving_cell ${driver}"
+puts $outfile "set_load ${cload}"
+close $outfile
+
+
+# ABC Scrips
+set abc_rs_K    "resub,-K,"
+set abc_rs      "resub"
+set abc_rsz     "resub,-z"
+set abc_rw_K    "rewrite,-K,"
+set abc_rw      "rewrite"
+set abc_rwz     "rewrite,-z"
+set abc_rf      "refactor"
+set abc_rfz     "refactor,-z"
+set abc_b       "balance"
+
+set abc_resyn2        "${abc_b}; ${abc_rw}; ${abc_rf}; ${abc_b}; ${abc_rw}; ${abc_rwz}; ${abc_b}; ${abc_rfz}; ${abc_rwz}; ${abc_b}"
+set abc_share         "strash; multi,-m; ${abc_resyn2}"
+set abc_resyn2a       "${abc_b};${abc_rw};${abc_b};${abc_rw};${abc_rwz};${abc_b};${abc_rwz};${abc_b}"
+set abc_resyn3        "balance;resub;resub,-K,6;balance;resub,-z;resub,-z,-K,6;balance;resub,-z,-K,5;balance"
+set abc_resyn2rs      "${abc_b};${abc_rs_K},6;${abc_rw};${abc_rs_K},6,-N,2;${abc_rf};${abc_rs_K},8;${abc_rw};${abc_rs_K},10;${abc_rwz};${abc_rs_K},10,-N,2;${abc_b},${abc_rs_K},12;${abc_rfz};${abc_rs_K},12,-N,2;${abc_rwz};${abc_b}"
+
+set abc_choice        "fraig_store; ${abc_resyn2}; fraig_store; ${abc_resyn2}; fraig_store; fraig_restore"
+set abc_choice2      "fraig_store; balance; fraig_store; ${abc_resyn2}; fraig_store; ${abc_resyn2}; fraig_store; ${abc_resyn2}; fraig_store; fraig_restore"
+
+set abc_map_old_cnt			"map,-p,-a,-B,0.2,-A,0.9,-M,0"
+set abc_map_old_dly         "map,-p,-B,0.2,-A,0.9,-M,0"
+set abc_retime_area         "retime,-D,{D},-M,5"
+set abc_retime_dly          "retime,-D,{D},-M,6"
+set abc_map_new_area        "amap,-m,-Q,0.1,-F,20,-A,20,-C,5000"
+
+set abc_area_recovery_1       "${abc_choice}; map;"
+set abc_area_recovery_2       "${abc_choice2}; map;"
+
+set map_old_cnt			    "map,-p,-a,-B,0.2,-A,0.9,-M,0"
+set map_old_dly			    "map,-p,-B,0.2,-A,0.9,-M,0"
+set abc_retime_area   	"retime,-D,{D},-M,5"
+set abc_retime_dly    	"retime,-D,{D},-M,6"
+set abc_map_new_area  	"amap,-m,-Q,0.1,-F,20,-A,20,-C,5000"
+
+if {$buffering==1} {
+	set abc_fine_tune		"buffer,-N,${max_FO},-S,${max_Tran};upsize,{D};dnsize,{D}"
+} elseif {$sizing} {
+	set abc_fine_tune       "upsize,{D};dnsize,{D}"
+} else {
+	set abc_fine_tune       ""
+}
+
+
+set delay_scripts [list \
+	"+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_dly}; scleanup;${abc_map_old_dly};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+	\
+	"+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_dly}; scleanup;${abc_choice2};${abc_map_old_dly};${abc_area_recovery_2}; retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+	\
+	"+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_dly}; scleanup;${abc_choice};${abc_map_old_dly};${abc_area_recovery_1}; retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+	\
+	"+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};${abc_choice2};${abc_map_old_dly};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+	]
+
+set area_scripts [list \
+	"+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+	\
+	"+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};${abc_choice2};${abc_map_new_area};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+	\
+	"+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_choice2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};${abc_choice2};${abc_map_new_area};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+	]
+
+set all_scripts [list {*}$delay_scripts {*}$area_scripts]
+
+set strategy_parts [split $::env(SYNTH_STRATEGY)]
+
+proc synth_strategy_format_err { } {
+	upvar area_scripts area_scripts
+	upvar delay_scripts delay_scripts
+	log -stderr "\[ERROR] Misformatted SYNTH_STRATEGY (\"$::env(SYNTH_STRATEGY)\")."
+	log -stderr "\[ERROR] Correct format is \"DELAY|AREA 0-[expr [llength $delay_scripts]-1]|0-[expr [llength $area_scripts]-1]\"."
+	exit 1
+}
+
+if { [llength $strategy_parts] != 2 } {
+	synth_strategy_format_err
+}
+
+set strategy_type [lindex $strategy_parts 0]
+set strategy_type_idx [lindex $strategy_parts 1]
+
+if { $strategy_type != "AREA" && $strategy_type != "DELAY" } {
+	log -stderr "\[ERROR] AREA|DELAY tokens not found. ($strategy_type)"
+	synth_strategy_format_err
+}
+
+if { $strategy_type == "DELAY" && $strategy_type_idx >= [llength $delay_scripts] } {
+	log -stderr "\[ERROR] strategy index ($strategy_type_idx) is too high."
+	synth_strategy_format_err
+}
+
+if { $strategy_type == "AREA" && $strategy_type_idx >= [llength $area_scripts] } {
+	log -stderr "\[ERROR] strategy index ($strategy_type_idx) is too high."
+	synth_strategy_format_err
+}
+
+if { $strategy_type == "DELAY" } {
+	set strategy $strategy_type_idx
+} else {
+	set strategy [expr {[llength $delay_scripts]+$strategy_type_idx}]
+}
+
+
+for { set i 0 } { $i < [llength $::env(VERILOG_FILES)] } { incr i } {
+	read_verilog -sv {*}$vIdirsArgs [lindex $::env(VERILOG_FILES) $i]
+}
+
+if { [info exists ::env(VERILOG_FILES_BLACKBOX)] } {
+	foreach verilog_file $::env(VERILOG_FILES_BLACKBOX) {
+		read_verilog -sv {*}$vIdirsArgs -lib $verilog_file
+	}
+}
+select -module $vtop
+show -format dot -prefix $::env(TMP_DIR)/synthesis/hierarchy
+select -clear
+
+hierarchy -check -top $vtop
+
+# Infer tri-state buffers.
+set tbuf_map false
+if { [info exists ::env(TRISTATE_BUFFER_MAP)] } {
+        if { [file exists $::env(TRISTATE_BUFFER_MAP)] } {
+                set tbuf_map true
+                tribuf
+        } else {
+          log "WARNING: TRISTATE_BUFFER_MAP is defined but could not be found: $::env(TRISTATE_BUFFER_MAP)"
+        }
+}
+
+if { $::env(SYNTH_NO_FLAT) } {
+	synth -top $vtop
+} else {
+	synth -top $vtop -flatten
+}
+
+share -aggressive
+opt
+opt_clean -purge
+
+tee -o "$::env(yosys_report_file_tag)_pre.stat" stat
+
+# Map tri-state buffers.
+if { $tbuf_map } {
+        log {mapping tbuf}
+        techmap -map $::env(TRISTATE_BUFFER_MAP)
+        simplemap
+}
+
+# handle technology mapping of 4-MUX, and tell Yosys to infer 4-muxes
+if { [info exists ::env(SYNTH_MUX4_MAP)] && [file exists $::env(SYNTH_MUX4_MAP)] } {
+  muxcover -mux4 
+  techmap -map $::env(SYNTH_MUX4_MAP)
+  simplemap
+}
+
+# handle technology mapping of 2-MUX
+if { [info exists ::env(SYNTH_MUX_MAP)] && [file exists $::env(SYNTH_MUX_MAP)] } {
+  techmap -map $::env(SYNTH_MUX_MAP)
+  simplemap
+}
+
+# handle technology mapping of latches
+if { [info exists ::env(SYNTH_LATCH_MAP)] && [file exists $::env(SYNTH_LATCH_MAP)] } {
+	techmap -map $::env(SYNTH_LATCH_MAP)
+	simplemap
+}
+
+dfflibmap -liberty $sclib
+tee -o "$::env(yosys_report_file_tag)_dff.stat" stat
+
+if { [info exists ::env(SYNTH_EXPLORE)] && $::env(SYNTH_EXPLORE) } {
+	design -save myDesign
+
+	for { set index 0 }  { $index < [llength $all_scripts] }  { incr index } {
+		log "\[INFO\]: ABC: WireLoad : S_$index"
+		design -load myDesign
+
+		abc -D $clock_period \
+			-constr "$sdc_file" \
+			-liberty $sclib  \
+			-script [lindex $all_scripts $index]
+
+		setundef -zero
+
+		hilomap -hicell {*}$::env(SYNTH_TIEHI_PORT) -locell {*}$::env(SYNTH_TIELO_PORT)
+
+		# get rid of the assignments that make verilog2def fail
+		splitnets
+		opt_clean -purge
+		insbuf -buf {*}$::env(SYNTH_MIN_BUF_PORT)
+
+		tee -o "$::env(yosys_report_file_tag)_$index$chk_ext" check
+		write_verilog -noattr -noexpr -nohex -nodec -defparam "$::env(yosys_result_file_tag)_$index.v"
+		design -reset
+	}
+} else {
+
+	log "\[INFO\]: ABC: WireLoad : S_$strategy"
+
+	abc -D $clock_period \
+		-constr "$sdc_file" \
+		-liberty $sclib  \
+		-script [lindex $all_scripts $strategy] \
+		-showtmp;
+
+	setundef -zero
+
+	hilomap -hicell {*}$::env(SYNTH_TIEHI_PORT) -locell {*}$::env(SYNTH_TIELO_PORT)
+
+	# get rid of the assignments that make verilog2def fail
+	splitnets
+	opt_clean -purge
+	insbuf -buf {*}$::env(SYNTH_MIN_BUF_PORT)
+
+	tee -o "$::env(yosys_report_file_tag)_$strategy$chk_ext" check
+	write_verilog -noattr -noexpr -nohex -nodec -defparam "$::env(SAVE_NETLIST)"
+}
+
+if { $::env(SYNTH_NO_FLAT) } {
+	design -reset
+	file copy -force $::env(SAVE_NETLIST) $::env(yosys_tmp_file_tag)_unflat.v
+	read_verilog -sv $::env(SAVE_NETLIST)
+	synth -top $vtop -flatten
+	splitnets
+	opt_clean -purge
+	insbuf -buf {*}$::env(SYNTH_MIN_BUF_PORT)
+	write_verilog -noattr -noexpr -nohex -nodec -defparam "$::env(SAVE_NETLIST)"
+	tee -o "$::env(yosys_report_file_tag)_$strategy$chk_ext" check
+}