Merge branch 'main' of github.com:AmoghLonkar/openram_testchip into main
diff --git a/openlane/openram_testchip/config.tcl b/openlane/openram_testchip/config.tcl
index 8195c4f..4533576 100644
--- a/openlane/openram_testchip/config.tcl
+++ b/openlane/openram_testchip/config.tcl
@@ -7,11 +7,14 @@
 set ::env(GLB_RT_MAXLAYER) 5
 
 set ::env(VERILOG_FILES) "$script_dir/../../verilog/rtl/openram_defines.v \
-			 $script_dir/../../verilog/rtl/openram_testchip.v"
-#set ::env(BASE_SDC_FILE) "$script_dir/openram_testchip.sdc"
+    			  $script_dir/../../verilog/rtl/clock_mux.v \
+			  $script_dir/../../verilog/rtl/openram_testchip.v"
+set ::env(BASE_SDC_FILE) "$script_dir/openram_testchip.sdc"
 
-set ::env(CLOCK_PORT) "la_clk"
-set ::env(CLOCK_NET) "clk"
+set ::env(CLOCK_PORT) "clkmux.clk"
+set ::env(CLOCK_NET) "clkmux.clk"
+set ::env(RESET_PORT) "resetn"
+
 #set ::env(CLOCK_NET) ""
 set ::env(CLOCK_PERIOD) "20"
 set ::env(IO_PCT) 0.1
diff --git a/openlane/openram_testchip/openram_testchip.sdc b/openlane/openram_testchip/openram_testchip.sdc
index 5f91463..c96b83b 100644
--- a/openlane/openram_testchip/openram_testchip.sdc
+++ b/openlane/openram_testchip/openram_testchip.sdc
@@ -1,4 +1,4 @@
-create_clock [get_port $::env(CLOCK_PORT)]  -name $::env(CLOCK_PORT)  -period $::env(CLOCK_PERIOD)
+create_clock [get_ports $::env(CLOCK_PORT)]  -name $::env(CLOCK_PORT)  -period $::env(CLOCK_PERIOD)
 set input_delay_value [expr $::env(CLOCK_PERIOD) * $::env(IO_PCT)]
 set output_delay_value [expr $::env(CLOCK_PERIOD) * $::env(IO_PCT)]
 puts "\[INFO\]: Setting output delay to: $output_delay_value"
@@ -7,17 +7,15 @@
 set_max_fanout $::env(SYNTH_MAX_FANOUT) [current_design]
 
 set clk_indx [lsearch [all_inputs] [get_port $::env(CLOCK_PORT)]]
-#set rst_indx [lsearch [all_inputs] [get_port resetn]]
+set rst_indx [lsearch [all_inputs] [get_port $::env(RESET_PORT)]]
 set all_inputs_wo_clk [lreplace [all_inputs] $clk_indx $clk_indx]
-#set all_inputs_wo_clk_rst [lreplace $all_inputs_wo_clk $rst_indx $rst_indx]
-set all_inputs_wo_clk_rst $all_inputs_wo_clk
+set all_inputs_wo_clk_rst [lreplace $all_inputs_wo_clk $rst_indx $rst_indx]
+#set all_inputs_wo_clk_rst $all_inputs_wo_clk
+
 
 # correct resetn
 set_input_delay $input_delay_value  -clock [get_clocks $::env(CLOCK_PORT)] $all_inputs_wo_clk_rst
-#set_input_delay 0.0 -clock [get_clocks $::env(CLOCK_PORT)] {resetn}
-#set clk_indx [lsearch [all_outputs] [get_port sram*_clk]]
-#set all_outputs_wo_clk [lreplace [all_outputs] $clk_indx $clk_indx]
-#set_output_delay $output_delay_value  -clock [get_clocks $::env(CLOCK_PORT)] $all_outputs_wo_clk
+set_input_delay 0.0 -clock [get_clocks $::env(CLOCK_PORT)] [get_port $::env(RESET_PORT)]
 set_output_delay $output_delay_value  -clock [get_clocks $::env(CLOCK_PORT)] [all_outputs]
 
 # TODO set this as parameter
diff --git a/openlane/user_project_wrapper/config.tcl b/openlane/user_project_wrapper/config.tcl
index 6748289..2b7b886 100755
--- a/openlane/user_project_wrapper/config.tcl
+++ b/openlane/user_project_wrapper/config.tcl
@@ -27,13 +27,15 @@
 ## Source Verilog Files
 set ::env(VERILOG_FILES) "\
 	$script_dir/../../caravel/verilog/rtl/defines.v \
+	$script_dir/../../verilog/rtl/clock_mux.v \
 	$script_dir/../../verilog/rtl/user_project_wrapper.v "
 
 ## Clock configurations
-set ::env(CLOCK_PORT) "la_sram_clk"
-set ::env(CLOCK_NET) "sram_clk"
+set ::env(CLOCK_PORT) "clkmux.clk"
+set ::env(CLOCK_NET) "clkmux.clk"
 
 set ::env(CLOCK_PERIOD) "20"
+set ::env(BASE_SDC_FILE) "$script_dir/user_project_wrapper.sdc"
 
 ## Internal Macros
 ### Macro Placement
@@ -89,8 +91,8 @@
 set ::env(PL_DIAMOND_SEARCH_HEIGHT) 500
 set ::env(PL_RANDOM_GLB_PLACEMENT) 1
 
-set ::env(GLB_RT_ADJUSTMENT) 0.10
-set ::env(PL_TARGET_DENSITY) 0.7
+set ::env(GLB_RT_ADJUSTMENT) 0.25
+set ::env(PL_TARGET_DENSITY) 0.5
 
 #set ::env(MAGIC_DRC_USE_GDS) 0
 
diff --git a/openlane/user_project_wrapper/user_project_wrapper.sdc b/openlane/user_project_wrapper/user_project_wrapper.sdc
new file mode 100644
index 0000000..c96b83b
--- /dev/null
+++ b/openlane/user_project_wrapper/user_project_wrapper.sdc
@@ -0,0 +1,25 @@
+create_clock [get_ports $::env(CLOCK_PORT)]  -name $::env(CLOCK_PORT)  -period $::env(CLOCK_PERIOD)
+set input_delay_value [expr $::env(CLOCK_PERIOD) * $::env(IO_PCT)]
+set output_delay_value [expr $::env(CLOCK_PERIOD) * $::env(IO_PCT)]
+puts "\[INFO\]: Setting output delay to: $output_delay_value"
+puts "\[INFO\]: Setting input delay to: $input_delay_value"
+
+set_max_fanout $::env(SYNTH_MAX_FANOUT) [current_design]
+
+set clk_indx [lsearch [all_inputs] [get_port $::env(CLOCK_PORT)]]
+set rst_indx [lsearch [all_inputs] [get_port $::env(RESET_PORT)]]
+set all_inputs_wo_clk [lreplace [all_inputs] $clk_indx $clk_indx]
+set all_inputs_wo_clk_rst [lreplace $all_inputs_wo_clk $rst_indx $rst_indx]
+#set all_inputs_wo_clk_rst $all_inputs_wo_clk
+
+
+# correct resetn
+set_input_delay $input_delay_value  -clock [get_clocks $::env(CLOCK_PORT)] $all_inputs_wo_clk_rst
+set_input_delay 0.0 -clock [get_clocks $::env(CLOCK_PORT)] [get_port $::env(RESET_PORT)]
+set_output_delay $output_delay_value  -clock [get_clocks $::env(CLOCK_PORT)] [all_outputs]
+
+# TODO set this as parameter
+set_driving_cell -lib_cell $::env(SYNTH_DRIVING_CELL) -pin $::env(SYNTH_DRIVING_CELL_PIN) [all_inputs]
+set cap_load [expr $::env(SYNTH_CAP_LOAD) / 1000.0]
+puts "\[INFO\]: Setting load to: $cap_load"
+set_load  $cap_load [all_outputs]
diff --git a/verilog/rtl/clock_mux.v b/verilog/rtl/clock_mux.v
new file mode 100644
index 0000000..c1a92b1
--- /dev/null
+++ b/verilog/rtl/clock_mux.v
@@ -0,0 +1,11 @@
+module clock_mux(
+		 input 	clk0,
+		 input 	clk1,
+		 input 	sel,
+		 output reg clk);
+
+always @(*) begin
+   clk = sel ? clk1 : clk0;
+end
+
+endmodule // clock_mux
diff --git a/verilog/rtl/openram_testchip.v b/verilog/rtl/openram_testchip.v
index 69b63e5..0bff047 100644
--- a/verilog/rtl/openram_testchip.v
+++ b/verilog/rtl/openram_testchip.v
@@ -11,12 +11,12 @@
 			inout vssd1,        // User area 1 digital ground
 			inout vssd2,        // User area 2 digital ground
 `endif
-			input         reset,
+			input         resetn,
 			// Select either GPIO or LA mode
 			input         in_select,
-			
+
 			input         la_clk,
-			input         la_in_load, 
+			input         la_in_load,
 			input         la_sram_load,
 			input  [`TOTAL_SIZE-1:0] la_data_in,
 			// GPIO bit to clock control register
@@ -58,7 +58,7 @@
 			input  [`DATA_SIZE-1:0] sram14_data1,
 			input  [`DATA_SIZE-1:0] sram15_data0,
 			input  [`DATA_SIZE-1:0] sram15_data1,
-			
+
 			// Shared control/data to the SRAMs
 			output reg [`ADDR_SIZE-1:0] left_addr0,
 			output reg [`DATA_SIZE-1:0] left_din0,
@@ -80,13 +80,11 @@
 			output [`WMASK_SIZE-1:0]  right_wmask0,
 			// One CSB for each SRAM
 			output [`MAX_CHIPS-1:0] right_csb0,
-			
+
 			output reg [`TOTAL_SIZE-1:0] la_data_out,
 			output reg gpio_out
 );
 
-   reg clk;
-
 // Store input instruction
    reg [`TOTAL_SIZE-1:0] sram_register;
    reg 		       csb0_temp;
@@ -106,16 +104,19 @@
    wire 		   right_web0 = left_web0;
    wire [`WMASK_SIZE-1:0] right_wmask0 = left_wmask0;
    wire [`MAX_CHIPS-1:0]  right_csb0 = left_csb0;
-   
-   
 
-//Selecting clock pin
-always @(*) begin
-    clk = in_select ? gpio_clk : la_clk;
-end
+
+
+   // Selecting clock pin
+   wire 		  clk;
+   clock_mux clkmux(.clk0(la_clk),
+		    .clk1(gpio_clk),
+		    .sel(in_select),
+		    .clk(clk));
+
 
 always @ (posedge clk) begin
-   if(reset) begin
+   if(!resetn) begin
       sram_register <= {`TOTAL_SIZE{1'b0}};
    end
    // GPIO scanning for transfer
@@ -128,11 +129,11 @@
    end
    // Store results for read out
    else if(gpio_sram_load || la_sram_load) begin
-      
-      sram_register <= {sram_register[`TOTAL_SIZE-1:`TOTAL_SIZE-`SELECT_SIZE-`ADDR_SIZE], 
-			read_data0, 
-			sram_register[`ADDR_SIZE+`DATA_SIZE+2*`WMASK_SIZE+3:`DATA_SIZE+`WMASK_SIZE+2], 
-			read_data1, 
+
+      sram_register <= {sram_register[`TOTAL_SIZE-1:`TOTAL_SIZE-`SELECT_SIZE-`ADDR_SIZE],
+			read_data0,
+			sram_register[`ADDR_SIZE+`DATA_SIZE+2*`WMASK_SIZE+3:`DATA_SIZE+`WMASK_SIZE+2],
+			read_data1,
 			sram_register[`WMASK_SIZE+1:0]};
    end
 end
@@ -146,22 +147,22 @@
    csb0_temp = sram_register[`PORT_SIZE+`WMASK_SIZE+1];
    left_web0 = sram_register[`PORT_SIZE+`WMASK_SIZE];
    left_wmask0 = sram_register[`PORT_SIZE+`WMASK_SIZE-1:`PORT_SIZE];
-   
+
    left_addr1 = sram_register[`PORT_SIZE-1:`DATA_SIZE+`WMASK_SIZE+2];
    left_din1 = sram_register[`DATA_SIZE+`WMASK_SIZE+1:`WMASK_SIZE+2];
    csb1_temp = sram_register[`WMASK_SIZE+1];
    left_web1 = sram_register[`WMASK_SIZE];
    left_wmask1 = sram_register[`WMASK_SIZE-1:0];
-end 
-   
+end
+
 // Apply the correct CSB
 always @(*) begin
    left_csb0 = ~( (~{15'b111111111111111, csb0_temp}) << chip_select);
    left_csb1 = ~(  (~{15'b111111111111111, csb1_temp}) << chip_select);
 end
-   
-// Mux value of correct SRAM data input to feed into 
-// DFF clocked by la/gpio clk 
+
+// Mux value of correct SRAM data input to feed into
+// DFF clocked by la/gpio clk
 always @ (*) begin
     case(chip_select)
     4'd0: begin
@@ -238,5 +239,3 @@
 end
 
 endmodule
-
-
diff --git a/verilog/rtl/user_proj_example.v b/verilog/rtl/user_proj_example.v
deleted file mode 100644
index b33e032..0000000
--- a/verilog/rtl/user_proj_example.v
+++ /dev/null
@@ -1,171 +0,0 @@
-// SPDX-FileCopyrightText: 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.
-// SPDX-License-Identifier: Apache-2.0
-
-`default_nettype none
-/*
- *-------------------------------------------------------------
- *
- * user_proj_example
- *
- * This is an example of a (trivially simple) user project,
- * showing how the user project can connect to the logic
- * analyzer, the wishbone bus, and the I/O pads.
- *
- * This project generates an integer count, which is output
- * on the user area GPIO pads (digital output only).  The
- * wishbone connection allows the project to be controlled
- * (start and stop) from the management SoC program.
- *
- * See the testbenches in directory "mprj_counter" for the
- * example programs that drive this user project.  The three
- * testbenches are "io_ports", "la_test1", and "la_test2".
- *
- *-------------------------------------------------------------
- */
-
-module user_proj_example #(
-    parameter BITS = 32
-)(
-`ifdef USE_POWER_PINS
-    inout vdda1,	// User area 1 3.3V supply
-    inout vdda2,	// User area 2 3.3V supply
-    inout vssa1,	// User area 1 analog ground
-    inout vssa2,	// User area 2 analog ground
-    inout vccd1,	// User area 1 1.8V supply
-    inout vccd2,	// User area 2 1.8v supply
-    inout vssd1,	// User area 1 digital ground
-    inout vssd2,	// User area 2 digital ground
-`endif
-
-    // Wishbone Slave ports (WB MI A)
-    input wb_clk_i,
-    input wb_rst_i,
-    input wbs_stb_i,
-    input wbs_cyc_i,
-    input wbs_we_i,
-    input [3:0] wbs_sel_i,
-    input [31:0] wbs_dat_i,
-    input [31:0] wbs_adr_i,
-    output wbs_ack_o,
-    output [31:0] wbs_dat_o,
-
-    // Logic Analyzer Signals
-    input  [127:0] la_data_in,
-    output [127:0] la_data_out,
-    input  [127:0] la_oenb,
-
-    // IOs
-    input  [`MPRJ_IO_PADS-1:0] io_in,
-    output [`MPRJ_IO_PADS-1:0] io_out,
-    output [`MPRJ_IO_PADS-1:0] io_oeb,
-
-    // IRQ
-    output [2:0] irq
-);
-    wire clk;
-    wire rst;
-
-    wire [`MPRJ_IO_PADS-1:0] io_in;
-    wire [`MPRJ_IO_PADS-1:0] io_out;
-    wire [`MPRJ_IO_PADS-1:0] io_oeb;
-
-    wire [31:0] rdata; 
-    wire [31:0] wdata;
-    wire [BITS-1:0] count;
-
-    wire valid;
-    wire [3:0] wstrb;
-    wire [31:0] la_write;
-
-    // WB MI A
-    assign valid = wbs_cyc_i && wbs_stb_i; 
-    assign wstrb = wbs_sel_i & {4{wbs_we_i}};
-    assign wbs_dat_o = rdata;
-    assign wdata = wbs_dat_i;
-
-    // IO
-    assign io_out = count;
-    assign io_oeb = {(`MPRJ_IO_PADS-1){rst}};
-
-    // IRQ
-    assign irq = 3'b000;	// Unused
-
-    // LA
-    assign la_data_out = {{(127-BITS){1'b0}}, count};
-    // Assuming LA probes [63:32] are for controlling the count register  
-    assign la_write = ~la_oenb[63:32] & ~{BITS{valid}};
-    // Assuming LA probes [65:64] are for controlling the count clk & reset  
-    assign clk = (~la_oenb[64]) ? la_data_in[64]: wb_clk_i;
-    assign rst = (~la_oenb[65]) ? la_data_in[65]: wb_rst_i;
-
-    counter #(
-        .BITS(BITS)
-    ) counter(
-        .clk(clk),
-        .reset(rst),
-        .ready(wbs_ack_o),
-        .valid(valid),
-        .rdata(rdata),
-        .wdata(wbs_dat_i),
-        .wstrb(wstrb),
-        .la_write(la_write),
-        .la_input(la_data_in[63:32]),
-        .count(count)
-    );
-
-endmodule
-
-module counter #(
-    parameter BITS = 32
-)(
-    input clk,
-    input reset,
-    input valid,
-    input [3:0] wstrb,
-    input [BITS-1:0] wdata,
-    input [BITS-1:0] la_write,
-    input [BITS-1:0] la_input,
-    output ready,
-    output [BITS-1:0] rdata,
-    output [BITS-1:0] count
-);
-    reg ready;
-    reg [BITS-1:0] count;
-    reg [BITS-1:0] rdata;
-
-    always @(posedge clk) begin
-        if (reset) begin
-            count <= 0;
-            ready <= 0;
-        end else begin
-            ready <= 1'b0;
-            if (~|la_write) begin
-                count <= count + 1;
-            end
-            if (valid && !ready) begin
-                ready <= 1'b1;
-                rdata <= count;
-                if (wstrb[0]) count[7:0]   <= wdata[7:0];
-                if (wstrb[1]) count[15:8]  <= wdata[15:8];
-                if (wstrb[2]) count[23:16] <= wdata[23:16];
-                if (wstrb[3]) count[31:24] <= wdata[31:24];
-            end else if (|la_write) begin
-                count <= la_write & la_input;
-            end
-        end
-    end
-
-endmodule
-`default_nettype wire
diff --git a/verilog/rtl/user_project_wrapper.v b/verilog/rtl/user_project_wrapper.v
index b0c25a6..34628c5 100644
--- a/verilog/rtl/user_project_wrapper.v
+++ b/verilog/rtl/user_project_wrapper.v
@@ -90,10 +90,43 @@
    wire [`WMASK_SIZE-1:0] wmask1;
    // One CSB for each SRAM
    wire [`MAX_CHIPS-1:0]  csb0;
-   wire [`MAX_CHIPS-1:0]  csb1;	
+   wire [`MAX_CHIPS-1:0]  csb1;
+
+
+
+   wire [31:0] 		  sram0_dout0;
+   wire [31:0] 		  sram0_dout1;
+   wire [31:0] 		  sram1_dout0;
+   wire [31:0] 		  sram1_dout1;
+   wire [31:0] 		  sram2_dout0;
+   wire [31:0] 		  sram2_dout1;
+   wire [31:0] 		  sram3_dout0;
+   wire [31:0] 		  sram3_dout1;
+   wire [31:0] 		  sram4_dout0;
+   wire [31:0] 		  sram4_dout1;
+   wire [31:0] 		  sram5_dout0;
+   wire [31:0] 		  sram5_dout1;
+   wire [31:0] 		  sram6_dout0;
+   wire [31:0] 		  sram6_dout1;
+   wire [31:0] 		  sram7_dout0;
+   wire [31:0] 		  sram7_dout1;
+   wire [31:0] 		  sram8_dout0;
+   wire [31:0] 		  sram8_dout1;
+   wire [31:0] 		  sram9_dout0;
+   wire [31:0] 		  sram9_dout1;
+   wire [31:0] 		  sram10_dout0;
+   wire [31:0] 		  sram10_dout1;
+   wire [31:0] 		  sram11_dout0;
+   wire [31:0] 		  sram11_dout1;
+   wire [31:0] 		  sram12_dout0;
+   wire [31:0] 		  sram12_dout1;
+   wire [31:0] 		  sram13_dout0;
+   wire [31:0] 		  sram13_dout1;
+   wire [31:0] 		  sram14_dout0;
+   wire [31:0] 		  sram14_dout1;
 
    wire     in_select = io_in[16];
-   wire     in_reset = io_in[15];
+   wire     resetn = io_in[15];
    wire     gpio_clk = io_in[17];
    wire     gpio_sram_clk = io_in[18];
    wire     gpio_scan = io_in[19];
@@ -106,86 +139,85 @@
    wire     gpio_out;
    assign io_out[21] = gpio_out;
    assign io_out[20:0] = 0;
-   
-   wire la_sram_clk = la_data_in[126];
 
-   reg 	sram_clk;
-   
-always @(*) begin
-    sram_clk = in_select ? gpio_sram_clk : la_sram_clk;
-end
-   
-openram_testchip CONTROL_LOGIC(
-			       .reset(in_reset|~wb_rst_i),
-			       .in_select(in_select),
-			       .gpio_clk(gpio_clk),
-			       .gpio_scan(gpio_scan),
-			       .gpio_sram_load(gpio_sram_load),
-			       
-			       .la_clk(la_data_in[127]),
-			       .la_in_load(la_data_in[125]),
-			       .la_sram_load(la_data_in[124]),
-			       .la_data_in(la_data_in[111:0]),
-			       .la_data_out(la_data_out[111:0]),
-			       .gpio_out(gpio_out),
+   wire sram_clk;
+   clock_mux clkmux(.clk0(la_data_in[126]),
+		    .clk1(gpio_sram_clk),
+		    .sel(in_select),
+		    .clk(sram_clk));
 
-			       // Shared control/data to the SRAMs
-			       .left_addr0(left_addr0),
-			       .left_din0(left_din0),
-			       .left_web0(left_web0),
-			       .left_wmask0(left_wmask0),
-			       .left_addr1(left_addr1),
-			       .left_web1(left_web1),
-			       .left_wmask1(left_wmask1),
-			       // One CSB for each SRAM
-			       .left_csb0(left_csb0),
-			       .left_csb1(left_csb1),
-			       
-			       // Shared control/data to the SRAMs
-			       .right_addr0(right_addr0),
-			       .right_din0(right_din0),
-			       .right_web0(right_web0),
-			       .right_wmask0(right_wmask0),
-			       // One CSB for each SRAM
-			       .right_csb0(right_csb0),
-			       
-			       // SRAM data outputs to be captured
-			       .sram0_data0(sram0_data0),
-			       .sram0_data1(sram0_data1),
-			       .sram1_data0(sram1_data0),
-			       .sram1_data1(sram1_data1),
-			       .sram2_data0(sram2_data0),
-			       .sram2_data1(sram2_data1),
-			       .sram3_data0(sram3_data0),
-			       .sram3_data1(sram3_data1),
-			       .sram4_data0(sram4_data0),
-			       .sram4_data1(sram4_data1),
-			       .sram5_data0(sram5_data0),
-			       .sram5_data1(sram5_data1),
-			       .sram6_data0(sram6_data0),
-			       .sram6_data1(sram6_data1),
-			       .sram7_data0(sram7_data0),
-			       .sram7_data1(sram7_data1),
-			       .sram8_data0(sram8_data0),
-			       .sram8_data1(sram8_data1),
-			       .sram9_data0(sram9_data0),
-			       .sram9_data1(sram9_data1),
-			       .sram10_data0(sram10_data0),
-			       .sram10_data1(sram10_data1),
-			       .sram11_data0(sram11_data0),
-			       .sram11_data1(sram11_data1),
-			       .sram12_data0(sram12_data0),
-			       .sram12_data1(sram12_data1),
-			       .sram13_data0(sram13_data0),
-			       .sram13_data1(sram13_data1),
-			       .sram14_data0(sram14_data0),
-			       .sram14_data1(sram14_data1),
-			       .sram15_data0(sram15_data0),
-			       .sram15_data1(sram15_data1)
-			       
-);
 
-   wire [`ADDR_SIZE-1:0]  left_addr0;
+   openram_testchip CONTROL_LOGIC(
+				  .resetn(resetn & wb_rst_i),
+				  .in_select(in_select),
+				  .gpio_clk(gpio_clk),
+				  .gpio_scan(gpio_scan),
+				  .gpio_sram_load(gpio_sram_load),
+
+				  .la_clk(la_data_in[127]),
+				  .la_in_load(la_data_in[125]),
+				  .la_sram_load(la_data_in[124]),
+				  .la_data_in(la_data_in[111:0]),
+				  .la_data_out(la_data_out[111:0]),
+				  .gpio_out(gpio_out),
+
+				  // Shared control/data to the SRAMs
+				  .left_addr0(left_addr0),
+				  .left_din0(left_din0),
+				  .left_web0(left_web0),
+				  .left_wmask0(left_wmask0),
+				  .left_addr1(left_addr1),
+				  .left_web1(left_web1),
+				  .left_wmask1(left_wmask1),
+				  // One CSB for each SRAM
+				  .left_csb0(left_csb0),
+				  .left_csb1(left_csb1),
+
+				  // Shared control/data to the SRAMs
+				  .right_addr0(right_addr0),
+				  .right_din0(right_din0),
+				  .right_web0(right_web0),
+				  .right_wmask0(right_wmask0),
+				  // One CSB for each SRAM
+				  .right_csb0(right_csb0),
+
+				  // SRAM data outputs to be captured
+				  .sram0_data0(sram0_data0),
+				  .sram0_data1(sram0_data1),
+				  .sram1_data0(sram1_data0),
+				  .sram1_data1(sram1_data1),
+				  .sram2_data0(sram2_data0),
+				  .sram2_data1(sram2_data1),
+				  .sram3_data0(sram3_data0),
+				  .sram3_data1(sram3_data1),
+				  .sram4_data0(sram4_data0),
+				  .sram4_data1(sram4_data1),
+				  .sram5_data0(sram5_data0),
+				  .sram5_data1(sram5_data1),
+				  .sram6_data0(sram6_data0),
+				  .sram6_data1(sram6_data1),
+				  .sram7_data0(sram7_data0),
+				  .sram7_data1(sram7_data1),
+				  .sram8_data0(sram8_data0),
+				  .sram8_data1(sram8_data1),
+				  .sram9_data0(sram9_data0),
+				  .sram9_data1(sram9_data1),
+				  .sram10_data0(sram10_data0),
+				  .sram10_data1(sram10_data1),
+				  .sram11_data0(sram11_data0),
+				  .sram11_data1(sram11_data1),
+				  .sram12_data0(sram12_data0),
+				  .sram12_data1(sram12_data1),
+				  .sram13_data0(sram13_data0),
+				  .sram13_data1(sram13_data1),
+				  .sram14_data0(sram14_data0),
+				  .sram14_data1(sram14_data1),
+				  .sram15_data0(sram15_data0),
+				  .sram15_data1(sram15_data1)
+
+				  );
+
+   wire [`ADDR_SIZE-1:0] left_addr0;
    wire [`DATA_SIZE-1:0] left_din0;
    wire 		 left_web0;
    wire [`WMASK_SIZE-1:0] left_wmask0;
@@ -197,49 +229,49 @@
    wire [`MAX_CHIPS-1:0]  left_csb1;
 
    wire [`ADDR_SIZE-1:0]  right_addr0;
-   wire [`DATA_SIZE-1:0] right_din0;
-   wire 		 right_web0;
+   wire [`DATA_SIZE-1:0]  right_din0;
+   wire 		  right_web0;
    wire [`WMASK_SIZE-1:0] right_wmask0;
    wire [`MAX_CHIPS-1:0]  right_csb0;
-   
-   wire [`DATA_SIZE-1:0] sram0_dout0;
-   wire [`DATA_SIZE-1:0] sram0_dout1;
-   wire [`DATA_SIZE-1:0] sram1_dout0;
-   wire [`DATA_SIZE-1:0] sram1_dout1;
-   wire [`DATA_SIZE-1:0] sram2_dout0;
-   wire [`DATA_SIZE-1:0] sram2_dout1;
-   wire [`DATA_SIZE-1:0] sram3_dout0;
-   wire [`DATA_SIZE-1:0] sram3_dout1;
-   wire [`DATA_SIZE-1:0] sram4_dout0;
-   wire [`DATA_SIZE-1:0] sram4_dout1;
-   wire [`DATA_SIZE-1:0] sram5_dout0;
-   wire [`DATA_SIZE-1:0] sram5_dout1;
-   wire [`DATA_SIZE-1:0] sram6_dout0;
-   wire [`DATA_SIZE-1:0] sram6_dout1;
-   wire [`DATA_SIZE-1:0] sram7_dout0;
-   wire [`DATA_SIZE-1:0] sram7_dout1;
-   wire [`DATA_SIZE-1:0] sram8_dout0;
-   wire [`DATA_SIZE-1:0] sram8_dout1;
-   wire [`DATA_SIZE-1:0] sram9_dout0;
-   wire [`DATA_SIZE-1:0] sram9_dout1;
-   wire [`DATA_SIZE-1:0] sram10_dout0;
-   wire [`DATA_SIZE-1:0] sram10_dout1;
-   wire [`DATA_SIZE-1:0] sram11_dout0;
-   wire [`DATA_SIZE-1:0] sram11_dout1;
-   wire [`DATA_SIZE-1:0] sram12_dout0;
-   wire [`DATA_SIZE-1:0] sram12_dout1;
-   wire [`DATA_SIZE-1:0] sram13_dout0;
-   wire [`DATA_SIZE-1:0] sram13_dout1;
-   wire [`DATA_SIZE-1:0] sram14_dout0;
-   wire [`DATA_SIZE-1:0] sram14_dout1;
-   wire [`DATA_SIZE-1:0] sram15_dout0;
-   wire [`DATA_SIZE-1:0] sram15_dout1;
+
+   wire [`DATA_SIZE-1:0]  sram0_dout0;
+   wire [`DATA_SIZE-1:0]  sram0_dout1;
+   wire [`DATA_SIZE-1:0]  sram1_dout0;
+   wire [`DATA_SIZE-1:0]  sram1_dout1;
+   wire [`DATA_SIZE-1:0]  sram2_dout0;
+   wire [`DATA_SIZE-1:0]  sram2_dout1;
+   wire [`DATA_SIZE-1:0]  sram3_dout0;
+   wire [`DATA_SIZE-1:0]  sram3_dout1;
+   wire [`DATA_SIZE-1:0]  sram4_dout0;
+   wire [`DATA_SIZE-1:0]  sram4_dout1;
+   wire [`DATA_SIZE-1:0]  sram5_dout0;
+   wire [`DATA_SIZE-1:0]  sram5_dout1;
+   wire [`DATA_SIZE-1:0]  sram6_dout0;
+   wire [`DATA_SIZE-1:0]  sram6_dout1;
+   wire [`DATA_SIZE-1:0]  sram7_dout0;
+   wire [`DATA_SIZE-1:0]  sram7_dout1;
+   wire [`DATA_SIZE-1:0]  sram8_dout0;
+   wire [`DATA_SIZE-1:0]  sram8_dout1;
+   wire [`DATA_SIZE-1:0]  sram9_dout0;
+   wire [`DATA_SIZE-1:0]  sram9_dout1;
+   wire [`DATA_SIZE-1:0]  sram10_dout0;
+   wire [`DATA_SIZE-1:0]  sram10_dout1;
+   wire [`DATA_SIZE-1:0]  sram11_dout0;
+   wire [`DATA_SIZE-1:0]  sram11_dout1;
+   wire [`DATA_SIZE-1:0]  sram12_dout0;
+   wire [`DATA_SIZE-1:0]  sram12_dout1;
+   wire [`DATA_SIZE-1:0]  sram13_dout0;
+   wire [`DATA_SIZE-1:0]  sram13_dout1;
+   wire [`DATA_SIZE-1:0]  sram14_dout0;
+   wire [`DATA_SIZE-1:0]  sram14_dout1;
+   wire [`DATA_SIZE-1:0]  sram15_dout0;
+   wire [`DATA_SIZE-1:0]  sram15_dout1;
 
 sky130_sram_1kbyte_1rw1r_8x1024_8 SRAM0
      (
      `ifdef USE_POWER_PINS
       .vccd1(vccd1),
-      .vssd1(vssd1), 
+      .vssd1(vssd1),
       `endif
       .clk0   (sram_clk),
       .csb0   (left_csb0[0]),
@@ -255,12 +287,12 @@
       );
    assign sram0_dout0[`DATA_SIZE-1:8] = 0;
    assign sram0_dout1[`DATA_SIZE-1:8] = 0;
-   
+
 sky130_sram_1kbyte_1rw1r_32x256_8 SRAM1
      (
      `ifdef USE_POWER_PINS
       .vccd1(vccd1),
-      .vssd1(vssd1), 
+      .vssd1(vssd1),
       `endif
       .clk0   (sram_clk),
       .csb0   (left_csb0[1]),
@@ -274,12 +306,12 @@
       .addr1  (left_addr1),
       .dout1  (sram1_dout1)
       );
-   
+
 sky130_sram_2kbyte_1rw1r_32x512_8 SRAM2
      (
      `ifdef USE_POWER_PINS
       .vccd1(vccd1),
-      .vssd1(vssd1), 
+      .vssd1(vssd1),
       `endif
       .clk0   (sram_clk),
       .csb0   (left_csb0[2]),
@@ -298,7 +330,7 @@
      (
      `ifdef USE_POWER_PINS
       .vccd1(vccd1),
-      .vssd1(vssd1), 
+      .vssd1(vssd1),
       `endif
       .clk0   (sram_clk),
       .csb0   (left_csb0[3]),
@@ -312,12 +344,12 @@
       .addr1  (left_addr1),
       .dout1  (sram3_dout1)
       );
-   
+
 sky130_sram_8kbyte_1rw1r_32x2048_8 SRAM4
      (
      `ifdef USE_POWER_PINS
       .vccd1(vccd1),
-      .vssd1(vssd1), 
+      .vssd1(vssd1),
       `endif
       .clk0   (sram_clk),
       .csb0   (left_csb0[4]),
@@ -337,7 +369,7 @@
 //      (
 //      `ifdef USE_POWER_PINS
 //       .vccd1(vccd1),
-//       .vssd1(vssd1), 
+//       .vssd1(vssd1),
 //       `endif
 //       .clk0   (sram_clk),
 //       .csb0   (csb0[6]),
@@ -351,15 +383,15 @@
 //       .addr1  (addr1),
 //       .dout1  (sram6_dout1)
 //       );
-   
-   
+
+
 
 // Single port memories
 sram_1rw0r0w_32_256_sky130 SRAM8
     (
       `ifdef USE_POWER_PINS
       .vccd1(vccd1),
-      .vssd1(vssd1), 
+      .vssd1(vssd1),
       `endif
       .clk0   (sram_clk),
       .csb0   (right_csb0[8]),
@@ -375,7 +407,7 @@
     (
       `ifdef USE_POWER_PINS
       .vccd1(vccd1),
-      .vssd1(vssd1), 
+      .vssd1(vssd1),
       `endif
       .clk0   (sram_clk),
       .csb0   (right_csb0[9]),
@@ -391,7 +423,7 @@
     (
       `ifdef USE_POWER_PINS
       .vccd1(vccd1),
-      .vssd1(vssd1), 
+      .vssd1(vssd1),
       `endif
       .clk0   (sram_clk),
       .csb0   (right_csb0[10]),
@@ -408,7 +440,7 @@
     (
       `ifdef USE_POWER_PINS
       .vccd1(vccd1),
-      .vssd1(vssd1), 
+      .vssd1(vssd1),
       `endif
       .clk0   (sram_clk),
       .csb0   (right_csb0[11]),
@@ -421,43 +453,9 @@
    assign sram11_dout1 = 0;
    assign sram11_dout0 = {temp_sram11_dout0[64:49], temp_sram11_dout0[15:0]};
 
-// Hold dout from SRAM
-// clocked by SRAM clk
-   reg [`DATA_SIZE-1:0] sram0_data0;
-   reg [`DATA_SIZE-1:0] sram0_data1;
-   reg [`DATA_SIZE-1:0] sram1_data0;
-   reg [`DATA_SIZE-1:0] sram1_data1;
-   reg [`DATA_SIZE-1:0] sram2_data0;
-   reg [`DATA_SIZE-1:0] sram2_data1;
-   reg [`DATA_SIZE-1:0] sram3_data0;
-   reg [`DATA_SIZE-1:0] sram3_data1;
-   reg [`DATA_SIZE-1:0] sram4_data0;
-   reg [`DATA_SIZE-1:0] sram4_data1;
-   //reg [`DATA_SIZE-1:0] sram5_data0;
-   //reg [`DATA_SIZE-1:0] sram5_data1;
-   //reg [`DATA_SIZE-1:0] sram6_data0;
-   //reg [`DATA_SIZE-1:0] sram6_data1;
-   //reg [`DATA_SIZE-1:0] sram7_data0;
-   //reg [`DATA_SIZE-1:0] sram7_data1;
-   reg [`DATA_SIZE-1:0] sram8_data0;
-   reg [`DATA_SIZE-1:0] sram8_data1;
-   reg [`DATA_SIZE-1:0] sram9_data0;
-   reg [`DATA_SIZE-1:0] sram9_data1;
-   reg [`DATA_SIZE-1:0] sram10_data0;
-   reg [`DATA_SIZE-1:0] sram10_data1;
-   reg [`DATA_SIZE-1:0] sram11_data0;
-   reg [`DATA_SIZE-1:0] sram11_data1;
-   //reg [`DATA_SIZE-1:0] sram12_data0;
-   //reg [`DATA_SIZE-1:0] sram12_data1;
-   //reg [`DATA_SIZE-1:0] sram13_data0;
-   //reg [`DATA_SIZE-1:0] sram13_data1;
-   //reg [`DATA_SIZE-1:0] sram14_data0;
-   //reg [`DATA_SIZE-1:0] sram14_data1;
-   //reg [`DATA_SIZE-1:0] sram15_data0;
-   //reg [`DATA_SIZE-1:0] sram15_data1;
-   
+
 always @(posedge sram_clk) begin
-   if (in_reset) begin
+   if (!resetn) begin
       sram0_data0 <= 0;
       sram0_data1 <= 0;
       sram1_data0 <= 0;
@@ -526,7 +524,7 @@
        // sram15_data1 <= sram15_dout1;
    end // else: !if(in_reset)
 end
-   
+
    wire [`DATA_SIZE-1:0] sram5_data0 = 0;
    wire [`DATA_SIZE-1:0] sram5_data1 = 0;
    wire [`DATA_SIZE-1:0] sram6_data0 = 0;