first version of riscduino with sdram removed, pinmux and sar_adc added
diff --git a/.gitmodules b/.gitmodules
index 3e46499..6b99e94 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -8,3 +8,6 @@
 [submodule "verilog/rtl/syntacore/scr1/dependencies/coremark"]
 	path = verilog/rtl/syntacore/scr1/dependencies/coremark
 	url = https://github.com/eembc/coremark
+[submodule "caravel"]
+	path = caravel
+	url = https://github.com/efabless/caravel-lite
diff --git a/caravel b/caravel
new file mode 160000
index 0000000..13f2590
--- /dev/null
+++ b/caravel
@@ -0,0 +1 @@
+Subproject commit 13f2590e4b3a74b910dac56a6b757f5a66fd5212
diff --git a/openlane/pinmux/base.sdc b/openlane/pinmux/base.sdc
new file mode 100644
index 0000000..8def5de
--- /dev/null
+++ b/openlane/pinmux/base.sdc
@@ -0,0 +1,57 @@
+# SPDX-FileCopyrightText:  2021 , Dinesh Annayya
+#
+# 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
+# SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+
+
+set_units -time ns
+set ::env(WBM_CLOCK_PERIOD) "10"
+set ::env(WBM_CLOCK_PORT)   "mclk"
+set ::env(WBM_CLOCK_NAME)   "mclk"
+
+
+######################################
+# WB Clock domain input output
+######################################
+create_clock [get_ports $::env(WBM_CLOCK_PORT)]  -name $::env(WBM_CLOCK_PORT)  -period $::env(WBM_CLOCK_PERIOD)
+
+
+set wb_input_delay_value [expr $::env(WBM_CLOCK_PERIOD) * 0.6]
+set wb_output_delay_value [expr $::env(WBM_CLOCK_PERIOD) * 0.6]
+puts "\[INFO\]: Setting wb output delay to:$wb_output_delay_value"
+puts "\[INFO\]: Setting wb input delay to: $wb_input_delay_value"
+
+
+set_input_delay 2.0 -clock [get_clocks $::env(WBM_CLOCK_PORT)] {h_reset_n}
+
+set_input_delay  $wb_input_delay_value   -clock [get_clocks $::env(WBM_CLOCK_PORT)] [get_port reg_cs]
+set_input_delay  $wb_input_delay_value   -clock [get_clocks $::env(WBM_CLOCK_PORT)] [get_port reg_wr]
+set_input_delay  $wb_input_delay_value   -clock [get_clocks $::env(WBM_CLOCK_PORT)] [get_port reg_addr*]
+set_input_delay  $wb_input_delay_value   -clock [get_clocks $::env(WBM_CLOCK_PORT)] [get_port reg_wdata*]
+set_input_delay  $wb_input_delay_value   -clock [get_clocks $::env(WBM_CLOCK_PORT)] [get_port reg_be*]
+set_output_delay $wb_output_delay_value  -clock [get_clocks $::env(WBM_CLOCK_PORT)] [get_port wbm_err_o*]
+
+set_output_delay 4.5   -clock [get_clocks $::env(WBM_CLOCK_PORT)] [get_port reg_rdata*]
+set_output_delay 4.5   -clock [get_clocks $::env(WBM_CLOCK_PORT)] [get_port reg_ack]
+
+
+set_clock_uncertainty -from $::env(WBM_CLOCK_NAME)          -to $::env(WBM_CLOCK_NAME)    -setup 0.400
+
+
+# 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/openlane/pinmux/config.tcl b/openlane/pinmux/config.tcl
new file mode 100755
index 0000000..a98636c
--- /dev/null
+++ b/openlane/pinmux/config.tcl
@@ -0,0 +1,94 @@
+# SPDX-FileCopyrightText:  2021 , Dinesh Annayya
+#
+# 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
+# SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+
+# Global
+# ------
+
+set script_dir [file dirname [file normalize [info script]]]
+# Name
+
+set ::env(DESIGN_NAME) pinmux
+
+set ::env(DESIGN_IS_CORE) "0"
+set ::env(FP_PDN_CORE_RING) "0"
+
+# Timing configuration
+set ::env(CLOCK_PERIOD) "10"
+set ::env(CLOCK_PORT) "mclk"
+
+set ::env(SYNTH_MAX_FANOUT) 4
+
+# Sources
+# -------
+
+# Local sources + no2usb sources
+set ::env(VERILOG_FILES) "\
+     $script_dir/../../verilog/rtl/pinmux/src/pinmux.sv \
+     $script_dir/../../verilog/rtl/pinmux/src/pinmux_reg.sv \
+     $script_dir/../../verilog/rtl/pinmux/src/gpio_intr.sv \
+     $script_dir/../../verilog/rtl/pinmux/src/pwm.sv \
+     $script_dir/../../verilog/rtl/lib/pulse_gen_type1.sv      \
+     $script_dir/../../verilog/rtl/lib/pulse_gen_type2.sv        \
+     $script_dir/../../verilog/rtl/lib/registers.v"
+
+
+set ::env(SYNTH_READ_BLACKBOX_LIB) 1
+set ::env(SDC_FILE) "$script_dir/base.sdc"
+set ::env(BASE_SDC_FILE) "$script_dir/base.sdc"
+
+set ::env(LEC_ENABLE) 0
+
+set ::env(VDD_PIN) [list {vccd1}]
+set ::env(GND_PIN) [list {vssd1}]
+
+
+# Floorplanning
+# -------------
+
+set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
+
+set ::env(FP_SIZING) absolute
+set ::env(DIE_AREA) "0 0 500 400"
+
+
+# If you're going to use multiple power domains, then keep this disabled.
+set ::env(RUN_CVC) 0
+
+#set ::env(PDN_CFG) $script_dir/pdn.tcl
+
+
+set ::env(PL_ROUTABILITY_DRIVEN) 1
+set ::env(PL_TARGET_DENSITY) "0.35"
+set ::env(CELL_PAD) "4"
+
+
+# helps in anteena fix
+set ::env(USE_ARC_ANTENNA_CHECK) "0"
+
+set ::env(FP_IO_VEXTEND) 4
+set ::env(FP_IO_HEXTEND) 4
+
+set ::env(FP_PDN_VPITCH) 100
+set ::env(FP_PDN_HPITCH) 100
+set ::env(FP_PDN_VWIDTH) 5
+set ::env(FP_PDN_HWIDTH) 5
+
+set ::env(GLB_RT_MAXLAYER) 4
+set ::env(GLB_RT_MAX_DIODE_INS_ITERS) 10
+
+set ::env(DIODE_INSERTION_STRATEGY) 5
+
+
diff --git a/openlane/pinmux/pin_order.cfg b/openlane/pinmux/pin_order.cfg
new file mode 100644
index 0000000..3c03978
--- /dev/null
+++ b/openlane/pinmux/pin_order.cfg
@@ -0,0 +1,339 @@
+#BUS_SORT
+#MANUAL_PLACE
+
+#N
+mclk            
+h_reset_n             
+irq_lines\[15\]     
+irq_lines\[14\]     
+irq_lines\[13\]     
+irq_lines\[12\]     
+irq_lines\[11\]     
+irq_lines\[10\]     
+irq_lines\[9\]     
+irq_lines\[8\]     
+irq_lines\[7\]     
+irq_lines\[6\]     
+irq_lines\[5\]     
+irq_lines\[4\]     
+irq_lines\[3\]     
+irq_lines\[2\]     
+irq_lines\[1\]     
+irq_lines\[0\]     
+user_irq\[2\]
+user_irq\[1\]
+user_irq\[0\]
+soft_irq           
+fuse_mhartid\[31\] 
+fuse_mhartid\[30\] 
+fuse_mhartid\[29\] 
+fuse_mhartid\[28\] 
+fuse_mhartid\[27\] 
+fuse_mhartid\[26\] 
+fuse_mhartid\[25\] 
+fuse_mhartid\[24\] 
+fuse_mhartid\[23\] 
+fuse_mhartid\[22\] 
+fuse_mhartid\[21\] 
+fuse_mhartid\[20\] 
+fuse_mhartid\[19\] 
+fuse_mhartid\[18\] 
+fuse_mhartid\[17\] 
+fuse_mhartid\[16\] 
+fuse_mhartid\[15\] 
+fuse_mhartid\[14\] 
+fuse_mhartid\[13\] 
+fuse_mhartid\[12\] 
+fuse_mhartid\[11\] 
+fuse_mhartid\[10\] 
+fuse_mhartid\[9\] 
+fuse_mhartid\[8\] 
+fuse_mhartid\[7\] 
+fuse_mhartid\[6\] 
+fuse_mhartid\[5\] 
+fuse_mhartid\[4\] 
+fuse_mhartid\[3\] 
+fuse_mhartid\[2\] 
+fuse_mhartid\[1\] 
+fuse_mhartid\[0\] 
+
+ssram_sck
+ssram_ss
+ssram_oen
+ssram_do\[3\]
+ssram_do\[2\]
+ssram_do\[1\]
+ssram_do\[0\]
+ssram_di\[3\] 
+ssram_di\[2\] 
+ssram_di\[1\] 
+ssram_di\[0\] 
+
+usb_dp_o 
+usb_dn_o 
+usb_oen 
+usb_dp_i 
+usb_dn_i 
+uart_txd 
+uart_rxd
+i2cm_clk_o 
+i2cm_clk_i 
+i2cm_clk_oen 
+i2cm_data_oen 
+i2cm_data_o 
+i2cm_data_i 
+spim_sck 
+spim_ss 
+spim_miso
+spim_mosi
+pulse1m_mclk
+
+
+reg_cs            200 0
+reg_wr           
+reg_addr\[7\]    
+reg_addr\[6\]    
+reg_addr\[5\]    
+reg_addr\[4\]    
+reg_addr\[3\]    
+reg_addr\[2\]    
+reg_addr\[1\]    
+reg_addr\[0\]    
+reg_be\[3\]    
+reg_be\[2\]    
+reg_be\[1\]    
+reg_be\[0\]    
+reg_wdata\[31\]   
+reg_wdata\[30\]   
+reg_wdata\[29\]   
+reg_wdata\[28\]   
+reg_wdata\[27\]   
+reg_wdata\[26\]   
+reg_wdata\[25\]   
+reg_wdata\[24\]   
+reg_wdata\[23\]   
+reg_wdata\[22\]   
+reg_wdata\[21\]   
+reg_wdata\[20\]   
+reg_wdata\[19\]   
+reg_wdata\[18\]   
+reg_wdata\[17\]   
+reg_wdata\[16\]   
+reg_wdata\[15\]   
+reg_wdata\[14\]   
+reg_wdata\[13\]   
+reg_wdata\[12\]  
+reg_wdata\[11\]  
+reg_wdata\[10\]  
+reg_wdata\[9\]   
+reg_wdata\[8\]   
+reg_wdata\[7\]   
+reg_wdata\[6\]   
+reg_wdata\[5\]   
+reg_wdata\[4\]   
+reg_wdata\[3\]   
+reg_wdata\[2\]   
+reg_wdata\[1\]   
+reg_wdata\[0\]   
+reg_rdata\[31\]  
+reg_rdata\[30\]  
+reg_rdata\[29\]  
+reg_rdata\[28\]  
+reg_rdata\[27\]  
+reg_rdata\[26\]  
+reg_rdata\[25\]  
+reg_rdata\[24\]  
+reg_rdata\[23\]  
+reg_rdata\[22\]  
+reg_rdata\[21\]  
+reg_rdata\[20\]  
+reg_rdata\[19\]  
+reg_rdata\[18\]  
+reg_rdata\[17\]  
+reg_rdata\[16\]  
+reg_rdata\[15\]  
+reg_rdata\[14\]  
+reg_rdata\[13\]  
+reg_rdata\[12\]  
+reg_rdata\[11\]  
+reg_rdata\[10\]  
+reg_rdata\[9\]  
+reg_rdata\[8\]  
+reg_rdata\[7\]  
+reg_rdata\[6\]  
+reg_rdata\[5\]  
+reg_rdata\[4\]  
+reg_rdata\[3\]  
+reg_rdata\[2\]  
+reg_rdata\[1\]  
+reg_rdata\[0\]  
+reg_ack       
+
+digital_io_in\[15\]     300  0
+digital_io_out\[15\]
+digital_io_oen\[15\]
+digital_io_in\[16\]
+digital_io_out\[16\]
+digital_io_oen\[16\]
+digital_io_in\[17\]
+digital_io_out\[17\]
+digital_io_oen\[17\]
+digital_io_in\[18\]
+digital_io_out\[18\]
+digital_io_oen\[18\]
+digital_io_in\[19\]
+digital_io_out\[19\]
+digital_io_oen\[19\]
+digital_io_in\[20\]
+digital_io_out\[20\]
+digital_io_oen\[20\]
+digital_io_in\[21\]
+digital_io_out\[21\]
+digital_io_oen\[21\]
+digital_io_in\[22\]
+digital_io_out\[22\]
+digital_io_oen\[22\]
+digital_io_in\[23\]
+digital_io_out\[23\]
+digital_io_oen\[23\]
+
+#S
+pinmux_debug\[31\] 0000 0
+pinmux_debug\[30\]
+pinmux_debug\[29\]
+pinmux_debug\[28\]
+pinmux_debug\[27\]
+pinmux_debug\[26\]
+pinmux_debug\[25\]
+pinmux_debug\[24\]
+pinmux_debug\[23\]
+pinmux_debug\[22\]
+pinmux_debug\[21\]
+pinmux_debug\[20\]
+pinmux_debug\[19\]
+pinmux_debug\[18\]
+pinmux_debug\[17\]
+pinmux_debug\[16\]
+pinmux_debug\[15\]
+pinmux_debug\[14\]
+pinmux_debug\[13\]
+pinmux_debug\[12\]
+pinmux_debug\[11\]
+pinmux_debug\[10\]
+pinmux_debug\[9\]
+pinmux_debug\[8\]
+pinmux_debug\[7\]
+pinmux_debug\[6\]
+pinmux_debug\[5\]
+pinmux_debug\[4\]
+pinmux_debug\[3\]
+pinmux_debug\[2\]
+pinmux_debug\[1\]
+pinmux_debug\[0\]
+
+
+
+#E
+digital_io_in\[0\]
+digital_io_out\[0\]
+digital_io_oen\[0\]
+digital_io_in\[1\]
+digital_io_out\[1\]
+digital_io_oen\[1\]
+digital_io_in\[2\]
+digital_io_out\[2\]
+digital_io_oen\[2\]
+digital_io_in\[3\]
+digital_io_out\[3\]
+digital_io_oen\[3\]
+digital_io_in\[4\]
+digital_io_out\[4\]
+digital_io_oen\[4\]
+digital_io_in\[5\]
+digital_io_out\[5\]
+digital_io_oen\[5\]
+digital_io_in\[6\]
+digital_io_out\[6\]
+digital_io_oen\[6\]
+digital_io_in\[7\]
+digital_io_out\[7\]
+digital_io_oen\[7\]
+digital_io_in\[8\]
+digital_io_out\[8\]
+digital_io_oen\[8\]
+digital_io_in\[9\]
+digital_io_out\[9\]
+digital_io_oen\[9\]
+digital_io_in\[10\]
+digital_io_out\[10\]
+digital_io_oen\[10\]
+digital_io_in\[11\]
+digital_io_out\[11\]
+digital_io_oen\[11\]
+digital_io_in\[12\]
+digital_io_out\[12\]
+digital_io_oen\[12\]
+digital_io_in\[13\]
+digital_io_out\[13\]
+digital_io_oen\[13\]
+digital_io_in\[14\]
+digital_io_out\[14\]
+digital_io_oen\[14\]
+
+#WR
+digital_io_in\[24\]
+digital_io_out\[24\]
+digital_io_oen\[24\]
+digital_io_in\[25\]
+digital_io_out\[25\]
+digital_io_oen\[25\]
+digital_io_in\[26\]
+digital_io_out\[26\]
+digital_io_oen\[26\]
+digital_io_in\[27\]
+digital_io_out\[27\]
+digital_io_oen\[27\]
+digital_io_in\[28\]
+digital_io_out\[28\]
+digital_io_oen\[28\]
+digital_io_in\[29\]
+digital_io_out\[29\]
+digital_io_oen\[29\]
+digital_io_in\[30\]
+digital_io_out\[30\]
+digital_io_oen\[30\]
+digital_io_in\[31\]
+digital_io_out\[31\]
+digital_io_oen\[31\]
+digital_io_in\[32\]
+digital_io_out\[32\]
+digital_io_oen\[32\]
+digital_io_in\[33\]
+digital_io_out\[33\]
+digital_io_oen\[33\]
+digital_io_in\[34\]
+digital_io_out\[34\]
+digital_io_oen\[34\]
+digital_io_in\[35\]
+digital_io_out\[35\]
+digital_io_oen\[35\]
+digital_io_in\[36\]
+digital_io_out\[36\]
+digital_io_oen\[36\]
+digital_io_in\[37\]
+digital_io_out\[37\]
+digital_io_oen\[37\]
+
+#W
+sflash_di\[3\] 0200 0
+sflash_di\[2\]
+sflash_di\[1\]
+sflash_di\[0\]
+sflash_do\[3\]
+sflash_do\[2\]
+sflash_do\[1\]
+sflash_do\[0\]
+sflash_sck   
+sflash_ss
+sflash_oen
+
diff --git a/openlane/sar_adc/config.tcl b/openlane/sar_adc/config.tcl
new file mode 100644
index 0000000..ac93cf0
--- /dev/null
+++ b/openlane/sar_adc/config.tcl
@@ -0,0 +1,86 @@
+# 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
+
+# section begin
+set script_dir [file dirname [file normalize [info script]]]
+
+set ::env(DESIGN_NAME) sar_adc
+#section end
+set ::env(RUN_KLAYOUT) 0
+set ::env(DESIGN_IS_CORE) 0
+set ::env(FP_PDN_CORE_RING) 0 
+
+# User Configurations
+set ::env(SYNTH_READ_BLACKBOX_LIB) 1
+
+## Source Verilog Files
+set ::env(VERILOG_FILES) "\
+	$script_dir/../../caravel/verilog/rtl/defines.v \
+	$script_dir/../../verilog/rtl/sar_adc/SAR.sv \
+	$script_dir/../../verilog/rtl/sar_adc/ACMP.sv \
+	$script_dir/../../verilog/rtl/sar_adc/sar_adc.sv \
+	$script_dir/../../verilog/rtl/sar_adc/adc_reg.sv \
+        $script_dir/../../verilog/rtl/lib/registers.v"
+
+## Clock configurations
+set ::env(CLOCK_PORT) "clk"
+set ::env(CLOCK_NET)  "clk"
+
+set ::env(CLOCK_PERIOD) "100"
+
+set ::env(FP_PIN_ORDER_CFG) $script_dir/pin_order.cfg
+#set ::env(PDN_CFG) $script_dir/pdn.tcl
+
+set ::env(FP_SIZING) "absolute"
+set ::env(DIE_AREA) "0 0 500 300"
+
+set ::env(FP_HORIZONTAL_HALO) 15
+set ::env(FP_VERTICAL_HALO)   15
+
+#set ::env(GLB_RT_OBS) "met2 109.85000 19.89500 171.54500 69.22000"
+set ::env(CLOCK_TREE_SYNTH) 0
+
+set ::env(PL_TARGET_DENSITY) "0.01"
+set ::env(GLB_RT_MAXLAYER) 5
+set ::env(GLB_RT_ADJUSTMENT) 0.15
+
+set ::env(FP_PDN_CHECK_NODES) 0
+set ::env(FP_PDN_VPITCH) "45"
+set ::env(FP_PDN_VWIDTH) "3.5"
+
+set ::env(FP_PDN_HPITCH) "40"
+set ::env(FP_PDN_HWIDTH) "6.5"
+
+set ::env(PL_RESIZER_DESIGN_OPTIMIZATIONS) 1
+set ::env(PL_RESIZER_TIMING_OPTIMIZATIONS) 1
+
+set ::env(DIODE_INSERTION_STRATEGY) 4
+
+set ::env(FP_VERTICAL_HALO) "35"
+set ::env(FP_HERTICAL_HALO) "35"
+
+
+## Internal Macros
+### Macro Placement
+#set ::env(MACRO_PLACEMENT_CFG) $script_dir/macro.cfg
+
+### Black-box verilog and views
+
+set ::env(VDD_NETS) [list {vccd1} {vccd2}]
+set ::env(GND_NETS) [list {vssd1} {vssd2}]
+set ::env(SYNTH_USE_PG_PINS_DEFINES) "USE_POWER_PINS"
+
+## LVS mismatch is to be solved manually by shorting VDD and VSS pins to the core ring 
+set ::env(QUIT_ON_LVS_ERROR) "0"
diff --git a/openlane/sar_adc/pdn.tcl b/openlane/sar_adc/pdn.tcl
new file mode 100644
index 0000000..de972f1
--- /dev/null
+++ b/openlane/sar_adc/pdn.tcl
@@ -0,0 +1,130 @@
+# Power nets
+
+if { ! [info exists ::env(VDD_NET)] } {
+	set ::env(VDD_NET) $::env(VDD_PIN)
+}
+
+if { ! [info exists ::env(GND_NET)] } {
+	set ::env(GND_NET) $::env(GND_PIN)
+}
+
+set ::power_nets $::env(VDD_NET)
+set ::ground_nets $::env(GND_NET)
+
+if { [info exists ::env(FP_PDN_ENABLE_GLOBAL_CONNECTIONS)] } {
+    if { $::env(FP_PDN_ENABLE_GLOBAL_CONNECTIONS) == 1 } {
+        # to parameterize -- needs a PDNGEN fix
+        set pdngen::global_connections {
+            VPWR {
+                {inst_name .* pin_name VPWR}
+                {inst_name .* pin_name VPB}
+            }
+            VGND {
+                {inst_name .* pin_name VGND}
+                {inst_name .* pin_name VNB}
+            }
+        }
+    }
+}
+
+# Used if the design is the core of the chip
+set stdcell_core {
+    name grid
+    straps {
+	    $::env(FP_PDN_LOWER_LAYER) {width $::env(FP_PDN_VWIDTH) pitch $::env(FP_PDN_VPITCH) offset $::env(FP_PDN_VOFFSET)}
+	    $::env(FP_PDN_UPPER_LAYER) {width $::env(FP_PDN_HWIDTH) pitch $::env(FP_PDN_HPITCH) offset $::env(FP_PDN_HOFFSET)}
+    }
+    connect {{$::env(FP_PDN_LOWER_LAYER) $::env(FP_PDN_UPPER_LAYER)}}
+    pins { $::env(FP_PDN_UPPER_LAYER) }
+}
+
+# Used if the design is a macro in the core
+set stdcell_macro {
+    name grid
+    straps {
+        $::env(FP_PDN_LOWER_LAYER) {width $::env(FP_PDN_VWIDTH) pitch $::env(FP_PDN_VPITCH) offset $::env(FP_PDN_VOFFSET)}
+	    $::env(FP_PDN_UPPER_LAYER) {width $::env(FP_PDN_HWIDTH) pitch $::env(FP_PDN_HPITCH) offset $::env(FP_PDN_HOFFSET)}
+    }
+    connect {{$::env(FP_PDN_LOWER_LAYER) $::env(FP_PDN_UPPER_LAYER)}}
+}
+
+# Assesses whether the deisgn is the core of the chip or not based on the value of $::env(DESIGN_IS_CORE) and uses the appropriate stdcell section
+if { [info exists ::env(DESIGN_IS_CORE)] } {
+    if { $::env(DESIGN_IS_CORE) == 1 } {
+        set stdcell $stdcell_core
+    } else {
+        set stdcell $stdcell_macro
+    }
+} else {
+    set stdcell $stdcell_core
+}
+
+# Adds the core ring if enabled.
+if { [info exists ::env(FP_PDN_CORE_RING)] } {
+    if { $::env(FP_PDN_CORE_RING) == 1 } {
+        dict append stdcell core_ring {
+                $::env(FP_PDN_LOWER_LAYER) {width $::env(FP_PDN_CORE_RING_VWIDTH) spacing $::env(FP_PDN_CORE_RING_VSPACING) core_offset $::env(FP_PDN_CORE_RING_VOFFSET)}
+            }
+    }
+}
+
+# Adds the core ring if enabled.
+if { [info exists ::env(FP_PDN_ENABLE_RAILS)] } {
+    if { $::env(FP_PDN_ENABLE_RAILS) == 1 } {
+		dict append stdcell rails {
+			$::env(FP_PDN_RAILS_LAYER) {width $::env(FP_PDN_RAIL_WIDTH) pitch $::env(PLACE_SITE_HEIGHT) offset $::env(FP_PDN_RAIL_OFFSET)}
+		}
+		dict update stdcell connect current_connect {
+			append current_connect { {$::env(FP_PDN_RAILS_LAYER) $::env(FP_PDN_LOWER_LAYER)}}
+		}
+    } else {
+		dict append stdcell rails {}
+	}
+}
+
+pdngen::specify_grid stdcell [subst $stdcell]
+
+# A general macro that follows the premise of the set heirarchy. You may want to modify this or add other macro configs
+# TODO: generate automatically per instance:
+
+if { $::env(VDD_NET) == "vccd1" } {
+    set macro {
+        orient {R0 R180 MX MY R90 R270 MXR90 MYR90}
+        power_pins "$::env(VDD_NET)"
+        ground_pins "$::env(GND_NET)"
+        blockages "li1 met1 met2 met3 met4"
+        straps {
+        }
+        connect {{met4_PIN_ver met5}}
+    }
+} elseif { $::env(VDD_NET) == "vdda1" } {
+    set macro {
+        orient {R0 R180 MX MY R90 R270 MXR90 MYR90}
+        power_pins "vdda1"
+        ground_pins "vssa1"
+        blockages "li1 met1 met2 met3 met4"
+        straps {
+        }
+        connect {{met4_PIN_ver met5}}
+    }
+} else {
+    set macro {
+        orient {R0 R180 MX MY R90 R270 MXR90 MYR90}
+        power_pins "$::env(VDD_NET) vdd"
+        ground_pins "$::env(GND_NET) gnd"
+        blockages "li1 met1 met2 met3 met4"
+        straps {
+        }
+        connect {{met4_PIN_ver met5}}
+    }
+}
+
+pdngen::specify_grid macro [subst $macro]
+
+set ::halo [expr min($::env(FP_HORIZONTAL_HALO), $::env(FP_VERTICAL_HALO))]
+
+# POWER or GROUND #Std. cell rails starting with power or ground rails at the bottom of the core area
+set ::rails_start_with "POWER" ;
+
+# POWER or GROUND #Upper metal stripes starting with power or ground rails at the left/bottom of the core area
+set ::stripes_start_with "POWER" ;
\ No newline at end of file
diff --git a/openlane/sar_adc/pin_order.cfg b/openlane/sar_adc/pin_order.cfg
new file mode 100644
index 0000000..392a553
--- /dev/null
+++ b/openlane/sar_adc/pin_order.cfg
@@ -0,0 +1,99 @@
+#BUS_SORT
+#MANUAL_PLACE
+
+#S
+clk  
+reset_n          
+pulse1m_mclk             
+reg_cs            
+reg_wr           
+reg_addr\[7\]    
+reg_addr\[6\]    
+reg_addr\[5\]    
+reg_addr\[4\]    
+reg_addr\[3\]    
+reg_addr\[2\]    
+reg_addr\[1\]    
+reg_addr\[0\]    
+reg_be\[3\]    
+reg_be\[2\]    
+reg_be\[1\]    
+reg_be\[0\]    
+reg_wdata\[31\]   
+reg_wdata\[30\]   
+reg_wdata\[29\]   
+reg_wdata\[28\]   
+reg_wdata\[27\]   
+reg_wdata\[26\]   
+reg_wdata\[25\]   
+reg_wdata\[24\]   
+reg_wdata\[23\]   
+reg_wdata\[22\]   
+reg_wdata\[21\]   
+reg_wdata\[20\]   
+reg_wdata\[19\]   
+reg_wdata\[18\]   
+reg_wdata\[17\]   
+reg_wdata\[16\]   
+reg_wdata\[15\]   
+reg_wdata\[14\]   
+reg_wdata\[13\]   
+reg_wdata\[12\]  
+reg_wdata\[11\]  
+reg_wdata\[10\]  
+reg_wdata\[9\]   
+reg_wdata\[8\]   
+reg_wdata\[7\]   
+reg_wdata\[6\]   
+reg_wdata\[5\]   
+reg_wdata\[4\]   
+reg_wdata\[3\]   
+reg_wdata\[2\]   
+reg_wdata\[1\]   
+reg_wdata\[0\]   
+reg_rdata\[31\]  
+reg_rdata\[30\]  
+reg_rdata\[29\]  
+reg_rdata\[28\]  
+reg_rdata\[27\]  
+reg_rdata\[26\]  
+reg_rdata\[25\]  
+reg_rdata\[24\]  
+reg_rdata\[23\]  
+reg_rdata\[22\]  
+reg_rdata\[21\]  
+reg_rdata\[20\]  
+reg_rdata\[19\]  
+reg_rdata\[18\]  
+reg_rdata\[17\]  
+reg_rdata\[16\]  
+reg_rdata\[15\]  
+reg_rdata\[14\]  
+reg_rdata\[13\]  
+reg_rdata\[12\]  
+reg_rdata\[11\]  
+reg_rdata\[10\]  
+reg_rdata\[9\]  
+reg_rdata\[8\]  
+reg_rdata\[7\]  
+reg_rdata\[6\]  
+reg_rdata\[5\]  
+reg_rdata\[4\]  
+reg_rdata\[3\]  
+reg_rdata\[2\]  
+reg_rdata\[1\]  
+reg_rdata\[0\]  
+reg_ack       
+
+
+#N
+sar2dac\[7\]
+sar2dac\[6\]
+sar2dac\[5\]
+sar2dac\[4\]
+sar2dac\[3\]
+sar2dac\[2\]
+sar2dac\[1\]
+sar2dac\[0\]
+analog_din
+analog_dac_out
diff --git a/openlane/spi_master/base.sdc b/openlane/spi_master/base.sdc
index a531c30..e151002 100644
--- a/openlane/spi_master/base.sdc
+++ b/openlane/spi_master/base.sdc
@@ -27,7 +27,7 @@
 ######################################
 create_clock [get_ports $::env(WB_CLOCK_PORT)]  -name $::env(WB_CLOCK_PORT)  -period $::env(WB_CLOCK_PERIOD)
 
-create_generated_clock -name $::env(SPI_CLOCK_PORT) -source [get_ports $::env(WB_CLOCK_PORT)] -master_clock $::env(WB_CLOCK_PORT) -divide_by 2  -add -comment "SPI Clock Out"  [get_port io_out[0]]
+create_generated_clock -name $::env(SPI_CLOCK_PORT) -source [get_ports $::env(WB_CLOCK_PORT)] -master_clock $::env(WB_CLOCK_PORT) -divide_by 2  -add -comment "SPI Clock Out"  [get_port spi_clk]
 
 set wb_input_delay_value [expr $::env(WB_CLOCK_PERIOD) * 0.6]
 set wb_output_delay_value [expr $::env(WB_CLOCK_PERIOD) * 0.6]
@@ -53,49 +53,38 @@
 set spi_input_delay_value  [expr $::env(SPI_CLOCK_PERIOD) * 0.6]
 set spi_output_delay_value [expr $::env(SPI_CLOCK_PERIOD) * 0.6]
 
-set_input_delay  6   -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_in[3]]
-set_input_delay  6   -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_in[2]]
-set_input_delay  6   -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_in[1]]
-set_input_delay  6   -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_in[0]]
+set_input_delay  6   -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_sdi[3]]
+set_input_delay  6   -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_sdi[2]]
+set_input_delay  6   -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_sdi[1]]
+set_input_delay  6   -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_sdi[0]]
 
-set_input_delay  0   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_in[3]]
-set_input_delay  0   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_in[2]]
-set_input_delay  0   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_in[1]]
-set_input_delay  0   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_in[0]]
+set_input_delay  0   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_sdi[3]]
+set_input_delay  0   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_sdi[2]]
+set_input_delay  0   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_sdi[1]]
+set_input_delay  0   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_sdi[0]]
 
 #io_out[0] is spiclcok
 #set_output_delay $wb_output_delay_value  -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_out[0]]
-set_output_delay 6  -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_out[5]]
-set_output_delay 6  -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_out[4]]
-set_output_delay 6  -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_out[3]]
-set_output_delay 6  -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_out[2]]
-set_output_delay 6  -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_out[1]]
+set_output_delay 6  -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_csn0]
+set_output_delay 6  -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_sdo[3]]
+set_output_delay 6  -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_sdo[2]]
+set_output_delay 6  -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_sdo[1]]
 
-set_output_delay 6  -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_oeb[5]]
-set_output_delay 6  -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_oeb[4]]
-set_output_delay 6  -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_oeb[3]]
-set_output_delay 6  -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_oeb[2]]
-set_output_delay 6  -max -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_oeb[1]]
 
-set_output_delay -0.5   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_out[5]]
-set_output_delay -0.5   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_out[4]]
-set_output_delay -0.5   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_out[3]]
-set_output_delay -0.5   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_out[2]]
-set_output_delay 0.0    -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_out[1]]
+set_output_delay -0.5   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_csn0]
+set_output_delay -0.5   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_sdo[3]]
+set_output_delay -0.5   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_sdo[2]]
+set_output_delay -0.5   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_sdo[1]]
+set_output_delay -0.5   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_sdo[0]]
 
 # Chip select asserted multiple cycle eariler than spi clock
-set_output_delay 0   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_out[1]]
+set_output_delay 0   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port spi_csn0]
 
-set_output_delay 0   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_oeb[5]]
-set_output_delay 0   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_oeb[4]]
-set_output_delay 0   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_oeb[3]]
-set_output_delay 0   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_oeb[2]]
-set_output_delay 0   -min -clock [get_clocks $::env(SPI_CLOCK_PORT)] [get_port io_oeb[1]]
 
-set_clock_uncertainty -from $::env(SPI_CLOCK_PORT)   -to $::env(SPI_CLOCK_PORT)   -setup 0.800
-set_clock_uncertainty -from $::env(WB_CLOCK_PERIOD)  -to $::env(WB_CLOCK_PERIOD)  -setup 0.800
-set_clock_uncertainty -from $::env(SPI_CLOCK_PORT)   -to $::env(SPI_CLOCK_PORT)   -hold 0.050
-set_clock_uncertainty -from $::env(WB_CLOCK_PERIOD)  -to $::env(WB_CLOCK_PERIOD)  -hold 0.050
+set_clock_uncertainty -from $::env(SPI_CLOCK_PORT) -to $::env(SPI_CLOCK_PORT) -setup 0.800
+set_clock_uncertainty -from $::env(WB_CLOCK_PORT)  -to $::env(WB_CLOCK_PORT)  -setup 0.800
+set_clock_uncertainty -from $::env(SPI_CLOCK_PORT) -to $::env(SPI_CLOCK_PORT) -hold  0.050
+set_clock_uncertainty -from $::env(WB_CLOCK_PORT)  -to $::env(WB_CLOCK_PORT)  -hold  0.050
 
 # TODO set this as parameter
 set_driving_cell -lib_cell $::env(SYNTH_DRIVING_CELL) -pin $::env(SYNTH_DRIVING_CELL_PIN) [all_inputs]
diff --git a/openlane/spi_master/pin_order.cfg b/openlane/spi_master/pin_order.cfg
index 63d486b..bfe29dc 100644
--- a/openlane/spi_master/pin_order.cfg
+++ b/openlane/spi_master/pin_order.cfg
@@ -4,22 +4,6 @@
 #W
 mclk                   0000 0
 rst_n                  
-io_in\[3\]             0200 0
-io_out\[5\]        
-io_oeb\[5\]  
-io_in\[2\]         
-io_out\[4\]        
-io_oeb\[4\]  
-io_in\[1\]         
-io_out\[3\]        
-io_oeb\[3\]  
-io_in\[0\]         
-io_out\[2\]        
-io_oeb\[2\]  
-io_out\[1\]        
-io_oeb\[1\]  
-io_out\[0\]        
-io_oeb\[0\]  
 
 #E
 spi_debug\[0\]        0000 0 
@@ -55,6 +39,18 @@
 spi_debug\[30\]        
 spi_debug\[31\]        
 
+spi_sdi\[3\]             0200 0
+spi_sdi\[2\]        
+spi_sdi\[1\]        
+spi_sdi\[0\]        
+spi_sdo\[3\]        
+spi_sdo\[2\]        
+spi_sdo\[1\]        
+spi_sdo\[0\]  
+spi_clk 
+spi_csn0
+spi_oen     
+
 #S
 wbd_stb_i              0000 0
 wbd_we_i               0000 1
diff --git a/openlane/uart_i2cm_usb/pin_order.cfg b/openlane/uart_i2cm_usb/pin_order.cfg
index 394ddc6..36b397b 100644
--- a/openlane/uart_i2cm_usb/pin_order.cfg
+++ b/openlane/uart_i2cm_usb/pin_order.cfg
@@ -4,20 +4,8 @@
 #S
 app_clk                0000 0
 usb_clk
-uart_rstn    
-i2c_rstn 
-usb_rstn 
-uart_i2c_usb_sel\[1\]            
-uart_i2c_usb_sel\[0\]            
-io_in\[1\]             
-io_out\[1\]             
-io_oeb\[1\]             
-io_in\[0\]             
-io_out\[0\]             
-io_oeb\[0\]             
 
-#N
-reg_cs                 0000 0
+reg_cs                 
 reg_wr                 
 reg_addr\[3\]          
 reg_addr\[2\]          
@@ -90,3 +78,26 @@
 reg_rdata\[1\]         
 reg_rdata\[0\]         
 reg_ack                
+
+
+uart_rstn    
+i2c_rstn 
+usb_rstn 
+uart_i2c_usb_sel\[1\]            
+uart_i2c_usb_sel\[0\]  
+scl_pad_i 
+scl_pad_o
+scl_pad_oen_o
+sda_pad_i
+sda_pad_o
+sda_padoen_o
+uart_rxd
+uart_txd
+usb_in_dp
+usb_in_dn
+usb_out_dp
+usb_out_dn
+usb_out_tx_oen
+
+         
+
diff --git a/openlane/user_project_wrapper/config.tcl b/openlane/user_project_wrapper/config.tcl
index 908108a..05749d4 100644
--- a/openlane/user_project_wrapper/config.tcl
+++ b/openlane/user_project_wrapper/config.tcl
@@ -49,8 +49,8 @@
 
 set ::env(PDN_CFG) $script_dir/pdn.tcl
 
-set ::env(SDC_FILE) "$script_dir/base.sdc"
-set ::env(BASE_SDC_FILE) "$script_dir/base.sdc"
+#set ::env(SDC_FILE) "$script_dir/base.sdc"
+#set ::env(BASE_SDC_FILE) "$script_dir/base.sdc"
 
 set ::env(SYNTH_READ_BLACKBOX_LIB) 1
 
@@ -58,33 +58,33 @@
 set ::env(VERILOG_FILES_BLACKBOX) "\
         $script_dir/../../verilog/gl/spi_master.v \
         $script_dir/../../verilog/gl/wb_interconnect.v \
-        $script_dir/../../verilog/gl/glbl_cfg.v     \
+        $script_dir/../../verilog/gl/pinmux.v     \
+        $script_dir/../../verilog/gl/sar_adc.v     \
         $script_dir/../../verilog/gl/uart_i2cm_usb.v     \
-	$script_dir/../../verilog/gl/sdram.v \
+	$script_dir/../../verilog/rtl/sar_adc/DAC_8BIT.v \
 	$script_dir/../../verilog/gl/wb_host.v \
-	$script_dir/../../verilog/gl/clk_skew_adjust.v \
 	$script_dir/../../verilog/gl/syntacore.v \
 	"
 
 set ::env(EXTRA_LEFS) "\
 	$lef_root/spi_master.lef \
-	$lef_root/glbl_cfg.lef \
+	$lef_root/pinmux.lef \
 	$lef_root/wb_interconnect.lef \
-	$lef_root/sdram.lef \
 	$lef_root/uart_i2cm_usb.lef \
 	$lef_root/wb_host.lef \
-	$lef_root/clk_skew_adjust.lef \
+	$lef_root/sar_adc.lef \
+	$lef_root/DAC_8BIT.lef \
 	$lef_root/syntacore.lef \
 	"
 
 set ::env(EXTRA_GDS_FILES) "\
 	$gds_root/spi_master.gds \
-	$gds_root/glbl_cfg.gds \
+	$gds_root/pinmux.gds \
 	$gds_root/wb_interconnect.gds \
 	$gds_root/uart_i2cm_usb.gds \
-	$gds_root/sdram.gds \
 	$gds_root/wb_host.gds \
-	$gds_root/clk_skew_adjust.gds \
+	$gds_root/sar_adc.gds \
+	$gds_root/DAC_8BIT.gds \
 	$gds_root/syntacore.gds \
 	"
 
@@ -101,8 +101,8 @@
 set ::env(VDD_PIN) [list {vdda1 vdda2 vccd1 vccd2}]
 set ::env(GND_PIN) [list {vssa1 vssa2 vssd1 vssd2}]
 
-set ::env(VDD_NETS) [list {vccd1}]
-set ::env(GND_NETS) [list {vssd1}]
+set ::env(VDD_NETS) [list {vdda1 vdda2 vccd1 vccd2}]
+set ::env(GND_NETS) [list {vssa1 vssa2 vssd1 vssd2}]
 
 
 
@@ -127,7 +127,7 @@
 
 
 set ::env(FP_PDN_HOFFSET) "5"
-set ::env(FP_PDN_HPITCH) "80"
+set ::env(FP_PDN_HPITCH) "120"
 set ::env(FP_PDN_HSPACING) "15"
 set ::env(FP_PDN_HWIDTH) "3"
 set ::env(FP_PDN_LOWER_LAYER) "met4"
@@ -136,6 +136,6 @@
 set ::env(FP_PDN_RAIL_WIDTH) "0.48"
 set ::env(FP_PDN_UPPER_LAYER) "met5"
 set ::env(FP_PDN_VOFFSET) "5"
-set ::env(FP_PDN_VPITCH) "80"
+set ::env(FP_PDN_VPITCH) "120"
 set ::env(FP_PDN_VSPACING) "15"
 set ::env(FP_PDN_VWIDTH) "3"
diff --git a/openlane/user_project_wrapper/macro.cfg b/openlane/user_project_wrapper/macro.cfg
index 890ad90..051c72b 100644
--- a/openlane/user_project_wrapper/macro.cfg
+++ b/openlane/user_project_wrapper/macro.cfg
@@ -1,17 +1,8 @@
 u_spi_master            300             2700            N
-u_sdram_ctrl            1000            2700            N
-u_glbl_cfg              2000            2700            N
+u_uart_i2c_usb          1000            2700            N
+u_adc                   2000            2700            N
+u_dac                   2000            3100            N
 u_riscv_top	        500	        800	        N
-u_uart_i2c_usb          2200            1000            N
+u_pinmux                2200            1000            N
 u_intercon              300             2300            N
 u_wb_host               300             300             N
-u_skew_wi               2600            2300            N
-u_skew_riscv            500             600             N
-u_skew_uart             2200            800            N
-u_skew_spi              150             2700            N
-u_skew_sdram            800             2700            N
-u_skew_glbl             1850            2850            N
-u_skew_wh               800             600             N
-u_skew_sd_co            950             3300            N
-u_skew_sd_ci            1100            3300            N
-u_skew_sp_co            100             1800            N
diff --git a/openlane/wb_interconnect/pin_order.cfg b/openlane/wb_interconnect/pin_order.cfg
index 6c64bb6..fe8cc0a 100644
--- a/openlane/wb_interconnect/pin_order.cfg
+++ b/openlane/wb_interconnect/pin_order.cfg
@@ -338,7 +338,10 @@
 s3_wbd_adr_o\[2\]   
 s3_wbd_adr_o\[1\]   
 s3_wbd_adr_o\[0\]   
-s3_wbd_sel_o        
+s3_wbd_sel_o\[3\]        
+s3_wbd_sel_o\[2\]        
+s3_wbd_sel_o\[1\]        
+s3_wbd_sel_o\[0\]        
 s3_wbd_dat_o\[31\]   
 s3_wbd_dat_o\[30\]   
 s3_wbd_dat_o\[29\]   
diff --git a/verilog/rtl/lib/pulse_gen_type1.sv b/verilog/rtl/lib/pulse_gen_type1.sv
new file mode 100644
index 0000000..838fe03
--- /dev/null
+++ b/verilog/rtl/lib/pulse_gen_type1.sv
@@ -0,0 +1,37 @@
+
+//------------------------------------------------------------------------
+// This module is used to generate 1ms and 1sec pulse based on 1us trigger
+// pulse
+//------------------------------------------------------------------------
+
+module pulse_gen_type1(
+	output logic clk_pulse,
+
+	input logic clk,
+        input logic reset_n,
+	input logic trigger
+);
+
+parameter WD= 10;   // This will count from 0 to 1023
+parameter MAX_CNT = 999;
+
+logic [WD-1:0]  cnt;
+
+assign clk_pulse = (cnt == 0) && trigger;
+
+always @ (posedge clk or negedge reset_n)
+begin
+   if (reset_n == 1'b0) begin 
+      cnt <= 'b0;
+   end else begin 
+      if(trigger) begin
+          if(cnt >= MAX_CNT)
+              cnt <= 0;
+          else
+              cnt <= cnt +1;
+      end
+   end
+end
+
+endmodule
+
diff --git a/verilog/rtl/lib/pulse_gen_type2.sv b/verilog/rtl/lib/pulse_gen_type2.sv
new file mode 100644
index 0000000..9bc759e
--- /dev/null
+++ b/verilog/rtl/lib/pulse_gen_type2.sv
@@ -0,0 +1,36 @@
+
+//------------------------------------------------------------------------
+// This module is used to generate 1us based on config value
+//------------------------------------------------------------------------
+
+module pulse_gen_type2 #(parameter WD = 10)
+    (
+	output logic           clk_pulse,
+
+	input logic            clk,
+        input logic            reset_n,
+	input logic [WD-1:0]   cfg_max_cnt
+);
+
+
+logic [WD-1:0]  cnt;
+
+
+always @ (posedge clk or negedge reset_n)
+begin
+   if (reset_n == 1'b0) begin 
+      cnt <= 'b0;
+      clk_pulse <= 'b0;
+   end else begin 
+      if(cnt == cfg_max_cnt) begin
+          cnt       <= 0;
+          clk_pulse <= 1'b1;
+      end else begin
+          cnt       <= cnt +1;
+          clk_pulse <= 1'b0;
+      end
+   end
+end
+
+endmodule
+
diff --git a/verilog/rtl/lib/registers.v b/verilog/rtl/lib/registers.v
index 44b2b1d..e4a87a1 100755
--- a/verilog/rtl/lib/registers.v
+++ b/verilog/rtl/lib/registers.v
@@ -202,10 +202,7 @@
 
 
 /*********************************************************************
-** copyright message here.
-
-** module: generic register
-
+ module: generic register
 ***********************************************************************/
 module  generic_register	(
 	      //List of Inputs
@@ -245,10 +242,7 @@
 
 
 /*********************************************************************
-** copyright message here.
-
-** module: generic register
-
+ module: generic interrupt status
 ***********************************************************************/
 module  generic_intr_stat_reg	(
 		 //inputs
@@ -292,3 +286,44 @@
 
 
 endmodule
+
+/*********************************************************************
+ module: generic 32b register
+***********************************************************************/
+module  gen_32b_reg	(
+	      //List of Inputs
+	      cs,
+	      we,		 
+	      data_in,
+	      reset_n,
+	      clk,
+	      
+	      //List of Outs
+	      data_out
+	      );
+
+  parameter   RESET_DEFAULT    = 32'h0;  
+  input [3:0]      we;	
+  input            cs;
+  input [31:0]     data_in;	
+  input            reset_n;
+  input		   clk;
+  output [31:0]    data_out;
+
+
+  reg [31:0]    data_out;
+
+always @ (posedge clk or negedge reset_n) begin 
+  if (reset_n == 1'b0) begin
+    data_out  <= RESET_DEFAULT ;
+  end
+  else begin
+    if(cs && we[0]) data_out[7:0]   <= data_in[7:0];
+    if(cs && we[1]) data_out[15:8]  <= data_in[15:8];
+    if(cs && we[2]) data_out[23:16] <= data_in[23:16];
+    if(cs && we[3]) data_out[31:24] <= data_in[31:24];
+  end
+end
+
+
+endmodule
diff --git a/verilog/rtl/pinmux/src/gpio_control.sv b/verilog/rtl/pinmux/src/gpio_control.sv
new file mode 100644
index 0000000..4c917dc
--- /dev/null
+++ b/verilog/rtl/pinmux/src/gpio_control.sv
@@ -0,0 +1,44 @@
+
+// GPIO Interrupt Generation
+module gpio_intr (
+   input  logic         mclk                     ,// System clk
+   input  logic         h_reset_n                ,// system reset
+   input  logic [31:0]  gpio_prev_indata         ,// previously captured GPIO I/P pins data
+   input  logic [31:0]  cfg_gpio_data_in         ,// GPIO I/P pins data captured into this
+   input  logic [31:0]  cfg_gpio_out_data        ,// GPIO statuc O/P data from config reg
+   input  logic [31:0]  cfg_gpio_dir_sel         ,// decides on GPIO pin is I/P or O/P at pad level
+   input  logic [31:0]  cfg_gpio_posedge_int_sel ,// select posedge interrupt
+   input  logic [31:0]  cfg_gpio_negedge_int_sel ,// select negedge interrupt
+   
+   
+   output logic [31:0]  pad_gpio_out             ,// GPIO O/P to the gpio cfg reg
+   output logic [31:0]  gpio_int_event            // to the cfg interrupt status reg 
+ 
+);
+
+
+integer i;
+//-----------------------------------------------------------------------
+// Logic for interrupt detection 
+//-----------------------------------------------------------------------
+
+reg [31:0]  local_gpio_int_event;             // to the cfg interrupt status reg 
+always @(cfg_gpio_data_in or cfg_gpio_negedge_int_sel or cfg_gpio_posedge_int_sel
+            or gpio_prev_indata)
+begin
+   for (i=0; i<32; i=i+1)
+   begin 
+   // looking for rising edge int 
+      local_gpio_int_event[i] = ((cfg_gpio_posedge_int_sel[i] & ~gpio_prev_indata[i] 
+                                   &  cfg_gpio_data_in[i]) | 
+                                 (cfg_gpio_negedge_int_sel[i] & gpio_prev_indata[i] & 
+                                     ~cfg_gpio_data_in[i]));
+                                // looking for falling edge int 
+   end
+end
+
+assign gpio_int_event   = local_gpio_int_event[31:0]; // goes as O/P to the cfg reg 
+
+assign pad_gpio_out     = cfg_gpio_out_data[31:0]     ;// O/P on the GPIO bus
+
+endmodule
diff --git a/verilog/rtl/pinmux/src/gpio_intr.sv b/verilog/rtl/pinmux/src/gpio_intr.sv
new file mode 100644
index 0000000..331918d
--- /dev/null
+++ b/verilog/rtl/pinmux/src/gpio_intr.sv
@@ -0,0 +1,43 @@
+
+// GPIO Interrupt Generation
+module gpio_intr (
+   input  logic         mclk                     ,// System clk
+   input  logic         h_reset_n                ,// system reset
+   input  logic [31:0]  gpio_prev_indata         ,// previously captured GPIO I/P pins data
+   input  logic [31:0]  cfg_gpio_data_in         ,// GPIO I/P pins data captured into this
+   input  logic [31:0]  cfg_gpio_out_data        ,// GPIO statuc O/P data from config reg
+   input  logic [31:0]  cfg_gpio_dir_sel         ,// decides on GPIO pin is I/P or O/P at pad level
+   input  logic [31:0]  cfg_gpio_posedge_int_sel ,// select posedge interrupt
+   input  logic [31:0]  cfg_gpio_negedge_int_sel ,// select negedge interrupt
+   
+   
+   output logic [31:0]  pad_gpio_out             ,// GPIO O/P to the gpio cfg reg
+   output logic [31:0]  gpio_int_event            // to the cfg interrupt status reg 
+ 
+);
+
+
+integer i;
+//-----------------------------------------------------------------------
+// Logic for interrupt detection 
+//-----------------------------------------------------------------------
+
+reg [31:0]  local_gpio_int_event;             // to the cfg interrupt status reg 
+always_comb
+begin
+   for (i=0; i<32; i=i+1)
+   begin 
+   // looking for rising edge int 
+      local_gpio_int_event[i] = ((cfg_gpio_posedge_int_sel[i] & ~gpio_prev_indata[i] 
+                                   &  cfg_gpio_data_in[i]) | 
+                                 (cfg_gpio_negedge_int_sel[i] & gpio_prev_indata[i] & 
+                                     ~cfg_gpio_data_in[i]));
+                                // looking for falling edge int 
+   end
+end
+
+assign gpio_int_event   = local_gpio_int_event[31:0]; // goes as O/P to the cfg reg 
+
+assign pad_gpio_out     = cfg_gpio_out_data[31:0]     ;// O/P on the GPIO bus
+
+endmodule
diff --git a/verilog/rtl/pinmux/src/pinmux.sv b/verilog/rtl/pinmux/src/pinmux.sv
new file mode 100755
index 0000000..2b284be
--- /dev/null
+++ b/verilog/rtl/pinmux/src/pinmux.sv
@@ -0,0 +1,695 @@
+module pinmux (
+                       // System Signals
+                       // Inputs
+		       input logic             mclk,
+                       input logic             h_reset_n,
+
+		       // Reg Bus Interface Signal
+                       input logic             reg_cs,
+                       input logic             reg_wr,
+                       input logic [7:0]       reg_addr,
+                       input logic [31:0]      reg_wdata,
+                       input logic [3:0]       reg_be,
+
+                       // Outputs
+                       output logic [31:0]     reg_rdata,
+                       output logic            reg_ack,
+
+		      // Risc configuration
+                       output logic [31:0]     fuse_mhartid,
+                       output logic [15:0]     irq_lines,
+                       output logic            soft_irq,
+                       output logic [2:0]      user_irq,
+
+                       // Digital IO
+                       output logic [37:0]     digital_io_out,
+                       output logic [37:0]     digital_io_oen,
+                       input  logic [37:0]     digital_io_in,
+
+		       // SFLASH I/F
+		       input  logic            sflash_sck,
+		       input  logic            sflash_ss,
+		       input  logic            sflash_oen,
+		       input  logic [3:0]      sflash_do,
+		       output logic [3:0]      sflash_di,
+
+		       // SSRAM I/F
+		       input  logic            ssram_sck,
+		       input  logic            ssram_ss,
+		       input  logic            ssram_oen,
+		       input  logic [3:0]      ssram_do,
+		       output logic [3:0]      ssram_di,
+
+		       // USB I/F
+		       input   logic           usb_dp_o,
+		       input   logic           usb_dn_o,
+		       input   logic           usb_oen,
+		       output   logic          usb_dp_i,
+		       output   logic          usb_dn_i,
+
+		       // UART I/F
+		       input   logic           uart_txd,
+		       output  logic           uart_rxd,
+
+		       // I2CM I/F
+		       input   logic           i2cm_clk_o,
+		       output  logic           i2cm_clk_i,
+		       input   logic           i2cm_clk_oen,
+		       input   logic           i2cm_data_oen,
+		       input   logic           i2cm_data_o,
+		       output  logic           i2cm_data_i,
+
+		       // SPI MASTER
+		       input   logic           spim_sck,
+		       input   logic           spim_ss,
+		       input   logic           spim_miso,
+		       output  logic           spim_mosi,
+
+		       output  logic           pulse1m_mclk,
+	               output  logic [31:0]    pinmux_debug	       
+   ); 
+
+
+
+   
+/* clock pulse */
+//********************************************************
+logic           pulse1u_mclk            ;// 1 UsSecond Pulse for waveform Generator
+logic           pulse1m_mclk            ;// 1MilliSecond Pulse for waveform Generator
+logic           pulse1s_mclk            ;// 1Second Pulse for waveform Generator
+logic [9:0]     cfg_pulse_1us           ;// 1us pulse generation config
+                
+//---------------------------------------------------
+// 6 PWM variabled
+//---------------------------------------------------
+
+logic [5:0]     pwm_wfm                 ;
+logic [5:0]     cfg_pwm_enb             ;
+logic [15:0]    cfg_pwm0_high           ;
+logic [15:0]    cfg_pwm0_low            ;
+logic [15:0]    cfg_pwm1_high           ;
+logic [15:0]    cfg_pwm1_low            ;
+logic [15:0]    cfg_pwm2_high           ;
+logic [15:0]    cfg_pwm2_low            ;
+logic [15:0]    cfg_pwm3_high           ;
+logic [15:0]    cfg_pwm3_low            ;
+logic [15:0]    cfg_pwm4_high           ;
+logic [15:0]    cfg_pwm4_low            ;
+logic [15:0]    cfg_pwm5_high           ;
+logic [15:0]    cfg_pwm5_low            ;
+
+
+wire  [31:0]  gpio_prev_indata         ;// previously captured GPIO I/P pins data
+wire  [31:0]  cfg_gpio_out_data        ;// GPIO statuc O/P data from config reg
+wire  [31:0]  cfg_gpio_dir_sel         ;// decides on GPIO pin is I/P or O/P at pad level, 0 -> Input, 1 -> Output
+wire  [31:0]  cfg_gpio_out_type        ;// GPIO Type, Unused
+wire  [31:0]  cfg_multi_func_sel       ;// GPIO Multi function type
+wire  [31:0]  cfg_gpio_posedge_int_sel ;// select posedge interrupt
+wire  [31:0]  cfg_gpio_negedge_int_sel ;// select negedge interrupt
+wire  [31:00] cfg_gpio_data_in         ;
+
+
+reg [7:0]     port_a_in;      // PORT A Data In
+reg [7:0]     port_b_in;      // PORT B Data In
+reg [7:0]     port_c_in;      // PORT C Data In
+reg [7:0]     port_d_in;      // PORT D Data In
+
+wire [7:0]    port_a_out;     // PORT A Data Out
+wire [7:0]    port_b_out;     // PORT B Data Out
+wire [7:0]    port_c_out;     // PORT C Data Out
+wire [7:0]    port_d_out;     // PORT D Data Out
+wire [31:0]   pad_gpio_in;    // GPIO data input from PAD
+wire [31:0]   pad_gpio_out;   // GPIO Data out towards PAD
+wire [31:0]   gpio_int_event; // GPIO Interrupt indication
+reg [1:0]     ext_intr_in;    // External PAD level interrupt
+
+// GPIO to PORT Mapping
+assign      pad_gpio_in[7:0]     = port_a_in;
+assign      pad_gpio_in[15:8]    = port_b_in;
+assign      pad_gpio_in[23:16]   = port_c_in;
+assign      pad_gpio_in[31:24]   = port_d_in;
+
+assign      port_a_out           = pad_gpio_out[7:0];
+assign      port_b_out           = pad_gpio_out[15:8];
+assign      port_c_out           = pad_gpio_out[23:16];
+assign      port_d_out           = pad_gpio_out[31:24];
+
+assign      pinmux_debug = '0; // Todo: Need to fix
+
+gpio_intr u_gpio_intr (
+   // System Signals
+   // Inputs
+          .mclk                    (mclk                    ),
+          .h_reset_n               (h_reset_n               ),
+
+   // GPIO cfg input pins
+          .gpio_prev_indata        (gpio_prev_indata        ),
+          .cfg_gpio_data_in        (cfg_gpio_data_in        ),
+          .cfg_gpio_dir_sel        (cfg_gpio_dir_sel        ),
+          .cfg_gpio_out_data       (cfg_gpio_out_data       ),
+          .cfg_gpio_posedge_int_sel(cfg_gpio_posedge_int_sel),
+          .cfg_gpio_negedge_int_sel(cfg_gpio_negedge_int_sel),
+
+
+   // GPIO output pins
+          .pad_gpio_out            (pad_gpio_out            ),
+          .gpio_int_event          (gpio_int_event          )  
+  );
+
+
+// 1us pulse
+pulse_gen_type2  #(.WD(10)) u_pulse_1us (
+
+	.clk_pulse                 (pulse1u_mclk),
+	.clk                       (mclk        ),
+        .reset_n                   (h_reset_n   ),
+	.cfg_max_cnt               (cfg_pulse_1us)
+
+     );
+
+// 1millisecond pulse
+pulse_gen_type1 u_pulse_1ms (
+
+	.clk_pulse   (pulse1m_mclk),
+	.clk         (mclk        ),
+        .reset_n     (h_reset_n   ),
+	.trigger     (pulse1u_mclk)
+
+      );
+
+// 1 second pulse
+pulse_gen_type2 u_pulse_1s (
+
+	.clk_pulse   (pulse1s_mclk),
+	.clk         (mclk        ),
+        .reset_n     (h_reset_n   ),
+	.cfg_max_cnt (cfg_pulse_1us)
+
+       );
+
+pinmux_reg u_pinmux_reg(
+      // System Signals
+      // Inputs
+          .mclk                         (mclk                    ),
+          .h_reset_n                    (h_reset_n               ),
+
+
+      // Reg read/write Interface Inputs
+          .reg_cs                       (reg_cs                  ),
+          .reg_wr                       (reg_wr                  ),
+          .reg_addr                     (reg_addr                ),
+          .reg_wdata                    (reg_wdata               ),
+          .reg_be                       (reg_be                  ),
+
+          .reg_rdata                    (reg_rdata               ),
+          .reg_ack                      (reg_ack                 ),
+
+	  .ext_intr_in                  (ext_intr_in             ),
+
+	  .fuse_mhartid                 (fuse_mhartid            ),
+	  .irq_lines                    (irq_lines               ),
+	  .soft_irq                     (soft_irq                ),
+	  .user_irq                     (user_irq                ),
+
+	  .cfg_pulse_1us                (cfg_pulse_1us           ),
+
+
+          .cfg_pwm0_high                (cfg_pwm0_high           ),
+          .cfg_pwm0_low                 (cfg_pwm0_low            ),
+          .cfg_pwm1_high                (cfg_pwm1_high           ),
+          .cfg_pwm1_low                 (cfg_pwm1_low            ),
+          .cfg_pwm2_high                (cfg_pwm2_high           ),
+          .cfg_pwm2_low                 (cfg_pwm2_low            ),
+          .cfg_pwm3_high                (cfg_pwm3_high           ),
+          .cfg_pwm3_low                 (cfg_pwm3_low            ),
+          .cfg_pwm4_high                (cfg_pwm4_high           ),
+          .cfg_pwm4_low                 (cfg_pwm4_low            ),
+          .cfg_pwm5_high                (cfg_pwm5_high           ),
+          .cfg_pwm5_low                 (cfg_pwm5_low            ),
+
+      // GPIO input pins
+          .gpio_in_data                 (pad_gpio_in             ),
+          .gpio_int_event               (gpio_int_event          ),
+
+      // GPIO config pins
+          .cfg_gpio_out_data            (cfg_gpio_out_data       ),
+          .cfg_gpio_dir_sel             (cfg_gpio_dir_sel        ),
+          .cfg_gpio_out_type            (cfg_gpio_out_type       ),
+          .cfg_gpio_posedge_int_sel     (cfg_gpio_posedge_int_sel),
+          .cfg_gpio_negedge_int_sel     (cfg_gpio_negedge_int_sel),
+          .cfg_multi_func_sel           (cfg_multi_func_sel      ),
+	  .cfg_gpio_data_in             (cfg_gpio_data_in        ),
+
+
+       // Outputs
+          .gpio_prev_indata             (gpio_prev_indata        ) 
+   ); 
+
+
+// 6 PWM Waveform Generator
+pwm  u_pwm_0 (
+	  .waveform                    (pwm_wfm[0]         ), 
+	  .h_reset_n                   (h_reset_n          ),
+	  .mclk                        (mclk               ),
+	  .pulse1m_mclk                (pulse1m_mclk       ),
+	  .cfg_pwm_enb                 (cfg_pwm_enb[0]     ),
+	  .cfg_pwm_high                (cfg_pwm0_high      ),
+	  .cfg_pwm_low                 (cfg_pwm0_low       )
+     );
+
+pwm  u_pwm_1 (
+	  .waveform                    (pwm_wfm[1]         ), 
+	  .h_reset_n                   (h_reset_n          ),
+	  .mclk                        (mclk               ),
+	  .pulse1m_mclk                (pulse1m_mclk       ),
+	  .cfg_pwm_enb                 (cfg_pwm_enb[1]     ),
+	  .cfg_pwm_high                (cfg_pwm1_high      ),
+	  .cfg_pwm_low                 (cfg_pwm1_low       )
+     );
+   
+pwm  u_pwm_2 (
+	  .waveform                    (pwm_wfm[2]         ), 
+	  .h_reset_n                   (h_reset_n          ),
+	  .mclk                        (mclk               ),
+	  .pulse1m_mclk                (pulse1m_mclk       ),
+	  .cfg_pwm_enb                 (cfg_pwm_enb[2]     ),
+	  .cfg_pwm_high                (cfg_pwm2_high      ),
+	  .cfg_pwm_low                 (cfg_pwm2_low       )
+     );
+
+pwm  u_pwm_3 (
+	  .waveform                    (pwm_wfm[3]         ), 
+	  .h_reset_n                   (h_reset_n          ),
+	  .mclk                        (mclk               ),
+	  .pulse1m_mclk                (pulse1m_mclk       ),
+	  .cfg_pwm_enb                 (cfg_pwm_enb[3]     ),
+	  .cfg_pwm_high                (cfg_pwm3_high      ),
+	  .cfg_pwm_low                 (cfg_pwm3_low       )
+     );
+pwm  u_pwm_4 (
+	  .waveform                    (pwm_wfm[4]         ), 
+	  .h_reset_n                   (h_reset_n          ),
+	  .mclk                        (mclk               ),
+	  .pulse1m_mclk                (pulse1m_mclk       ),
+	  .cfg_pwm_enb                 (cfg_pwm_enb[4]     ),
+	  .cfg_pwm_high                (cfg_pwm4_high      ),
+	  .cfg_pwm_low                 (cfg_pwm4_low       )
+     );
+pwm  u_pwm_5 (
+	  .waveform                    (pwm_wfm[5]         ), 
+	  .h_reset_n                   (h_reset_n          ),
+	  .mclk                        (mclk               ),
+	  .pulse1m_mclk                (pulse1m_mclk       ),
+	  .cfg_pwm_enb                 (cfg_pwm_enb[5]     ),
+	  .cfg_pwm_high                (cfg_pwm5_high      ),
+	  .cfg_pwm_low                 (cfg_pwm5_low       )
+     );
+
+/************************************************
+* Pin Mapping    ATMGE CONFIG
+*   ATMEGA328                        caravel Pin Mapping
+*   Pin-1        PC6/RESET*          digital_io[0]
+*   Pin-2        PD0/RXD             digital_io[1]
+*   Pin-3        PD1/TXD             digital_io[2]
+*   Pin-4        PD2/INT0            digital_io[3]
+*   Pin-5        PD3/INT1/OC2B(PWM0) digital_io[4]
+*   Pin-6        PD4                 digital_io[5]
+*   Pin-7        VCC                  -
+*   Pin-8        GND                  -
+*   Pin-9        PB6/XTAL1/TOSC1     digital_io[6]
+*   Pin-10       PB7/XTAL2/TOSC2     digital_io[7]
+*   Pin-11       PD5/OC0B(PWM1)/T1   digital_io[8]
+*   Pin-12       PD6/OC0A(PWM2)/AIN0 digital_io[9] /analog_io[2]
+*   Pin-13       PD7/A1N1            digital_io[10]/analog_io[3]
+*   Pin-14       PB0/CLKO/ICP1       digital_io[11]
+*   Pin-15       PB1/OC1A(PWM3)      digital_io[12]
+*   Pin-16       PB2/SS/OC1B(PWM4)   digital_io[13]
+*   Pin-17       PB3/MOSI/OC2A(PWM5) digital_io[14]
+*   Pin-18       PB4/MISO            digital_io[15]
+*   Pin-19       PB5/SCK             digital_io[16]
+*   Pin-20       AVCC                -
+*   Pin-21       AREF                analog_io[10]
+*   Pin-22       GND                 -
+*   Pin-23       PC0/ADC0            digital_io[18]/analog_io[11]
+*   Pin-24       PC1/ADC1            digital_io[19]/analog_io[12]
+*   Pin-25       PC2/ADC2            digital_io[20]/analog_io[13]
+*   Pin-26       PC3/ADC3            digital_io[21]/analog_io[14]
+*   Pin-27       PC4/ADC4/SDA        digital_io[22]/analog_io[15]
+*   Pin-28       PC5/ADC5/SCL        digital_io[23]/analog_io[16]
+*
+*  Additional Pad used for Externam ROM/RAM
+*                sflash_sck          digital_io[24]
+*                sflash_ss           digital_io[25]
+*                sflash_io0          digital_io[26]
+*                sflash_io1          digital_io[27]
+*                sflash_io2          digital_io[28]
+*                sflash_io3          digital_io[29]
+*
+*                ssram_sck           digital_io[30]
+*                ssram_ss            digital_io[31]
+*                ssram_io0           digital_io[32]
+*                ssram_io1           digital_io[33]
+*                ssram_io2           digital_io[34]
+*                ssram_io3           digital_io[35]
+*
+*                usb_dp              digital_io[36]
+*                usb_dn              digital_io[37]
+****************************************************************
+* Pin-1 RESET is not supported as there is no suppport for fuse config
+**************/
+
+assign      cfg_pwm_enb          = cfg_multi_func_sel[5:0];
+wire [1:0]  cfg_int_enb          = cfg_multi_func_sel[7:6];
+wire        cfg_uart_enb         = cfg_multi_func_sel[8];
+wire        cfg_i2cm_enb         = cfg_multi_func_sel[9];
+wire        cfg_spim_enb         = cfg_multi_func_sel[10];
+
+wire [7:0]  cfg_port_a_dir_sel   = cfg_gpio_dir_sel[7:0];
+wire [7:0]  cfg_port_b_dir_sel   = cfg_gpio_dir_sel[15:8];
+wire [7:0]  cfg_port_c_dir_sel   = cfg_gpio_dir_sel[23:16];
+wire [7:0]  cfg_port_d_dir_sel   = cfg_gpio_dir_sel[31:24];
+
+
+// datain selection
+always_comb begin
+     port_a_in = 'h0;
+     port_b_in = 'h0;
+     port_c_in = 'h0;
+     port_d_in = 'h0;
+     uart_rxd   = 'h0;
+     ext_intr_in= 'h0;
+     spim_mosi  = 'h0;
+     i2cm_data_i= 'h0;
+     i2cm_clk_i = 'h0;
+
+     //Pin-1        PC6/RESET*          digital_io[0]
+     port_c_in[6] = digital_io_in[0];
+
+     //Pin-2        PD0/RXD             digital_io[1]
+     port_d_in[0] = digital_io_in[1];
+     if(cfg_uart_enb)  uart_rxd      = digital_io_in[1];
+  
+     //Pin-3        PD1/TXD             digital_io[2]
+     port_d_in[1] = digital_io_in[2];
+
+
+     //Pin-4        PD2/INT0            digital_io[3]
+     port_d_in[2] = digital_io_in[3];
+     if(cfg_int_enb[0]) ext_intr_in[0] = digital_io_in[3];
+
+     //Pin-5        PD3/INT1/OC2B(PWM0)  digital_io[4]
+     port_d_in[3] = digital_io_in[4];
+     if(cfg_int_enb[1]) ext_intr_in[1] = digital_io_in[4];
+
+     //Pin-6        PD4                 digital_io[5]
+     port_d_in[4] = digital_io_in[5];
+
+     //Pin-9        PB6/XTAL1/TOSC1     digital_io[6]
+     port_b_in[6] = digital_io_in[6];
+
+     // Pin-10       PB7/XTAL2/TOSC2     digital_io[7]
+     port_b_in[7] = digital_io_in[7];
+
+     //Pin-11       PD5/OC0B(PWM1)/T1   digital_io[8]
+     port_d_in[5] = digital_io_in[8];
+
+     //Pin-12       PD6/OC0A(PWM2)/AIN0 digital_io[9] /analog_io[2]
+     port_d_in[6] = digital_io_in[9];
+
+     //Pin-13       PD7/A1N1            digital_io[10]/analog_io[3]
+     port_d_in[7] = digital_io_in[10];
+     
+     //Pin-14       PB0/CLKO/ICP1       digital_io[11]
+     port_b_in[0] =  digital_io_in[11];
+
+     //Pin-15       PB1/OC1A(PWM3)      digital_io[12]
+     port_b_in[1] = digital_io_in[12];
+
+     //Pin-16       PB2/SS/OC1B(PWM4)   digital_io[13]
+     port_b_in[2] = digital_io_in[13];
+
+     //Pin-17       PB3/MOSI/OC2A(PWM5) digital_io[14]
+     port_b_in[3] = digital_io_in[14];
+     if(cfg_spim_enb) spim_mosi = digital_io_in[14];
+
+     //Pin-18       PB4/MISO            digital_io[15]
+     port_b_in[4] = digital_io_in[15];
+
+     //Pin-19       PB5/SCK             digital_io[16]
+     port_b_in[5]= digital_io_in[16];
+     
+     //Pin-23       PC0/ADC0            digital_io[18]/analog_io[11]
+     port_c_in[0] = digital_io_in[18];
+
+     //Pin-24       PC1/ADC1            digital_io[19]/analog_io[12]
+     port_c_in[1] = digital_io_in[19];
+
+     //Pin-25       PC2/ADC2            digital_io[20]/analog_io[13]
+     port_c_in[2] = digital_io_in[20];
+
+     //Pin-26       PC3/ADC3            digital_io[21]/analog_io[14]
+     port_c_in[3] = digital_io_in[21];
+
+     //Pin-27       PC4/ADC4/SDA        digital_io[22]/analog_io[15]
+     port_c_in[4] = digital_io_in[22];
+     if(cfg_i2cm_enb)  i2cm_data_i = digital_io_in[22];
+
+     //Pin-28       PC5/ADC5/SCL        digital_io[23]/analog_io[16]
+     port_c_in[5] = digital_io_in[23];
+     if(cfg_i2cm_enb)  i2cm_clk_i = digital_io_in[23];
+
+     sflash_di[0] = digital_io_in[26];
+     sflash_di[1] = digital_io_in[27];
+     sflash_di[2] = digital_io_in[28];
+     sflash_di[3] = digital_io_in[29];
+
+     ssram_di[0]  = digital_io_in[32];
+     ssram_di[1]  = digital_io_in[33];
+     ssram_di[2]  = digital_io_in[34];
+     ssram_di[3]  = digital_io_in[35];
+
+     usb_dp_i    = digital_io_in[36];
+     usb_dn_i    = digital_io_in[37];
+end
+
+// dataout selection
+always_comb begin
+     digital_io_out = 'h0;
+     //Pin-1        PC6/RESET*          digital_io[0]
+     if(cfg_port_c_dir_sel[6])       digital_io_out[0]   = port_c_out[6];
+
+     //Pin-2        PD0/RXD             digital_io[1]
+     if(cfg_port_d_dir_sel[0])       digital_io_out[1]   = port_d_out[0];
+  
+     //Pin-3        PD1/TXD             digital_io[2]
+     if     (cfg_uart_enb)           digital_io_out[2]   = uart_txd;
+     else if(cfg_port_d_dir_sel[1])  digital_io_out[2]   = port_d_out[1];
+
+
+     //Pin-4        PD2/INT0            digital_io[3]
+     if(cfg_port_d_dir_sel[2])       digital_io_out[3]   = port_d_out[2];
+
+     //Pin-5        PD3/INT1/OC2B(PWM0)  digital_io[4]
+     if(cfg_pwm_enb[0])              digital_io_out[4]   = pwm_wfm[0];
+     if(cfg_port_d_dir_sel[3])       digital_io_out[4]   = port_d_out[3];
+
+     //Pin-6        PD4                 digital_io[5]
+     if(cfg_port_d_dir_sel[4])       digital_io_out[5]   = port_d_out[4];
+
+     //Pin-9        PB6/XTAL1/TOSC1     digital_io[6]
+     if(cfg_port_b_dir_sel[6])       digital_io_out[6]   = port_b_out[6];
+
+
+     // Pin-10       PB7/XTAL2/TOSC2     digital_io[7]
+     if(cfg_port_b_dir_sel[7])       digital_io_out[7]   = port_b_out[7];
+
+     //Pin-11       PD5/OC0B(PWM1)/T1   digital_io[8]
+     if(cfg_pwm_enb[1])              digital_io_out[8]   = pwm_wfm[1];
+     else if(cfg_port_d_dir_sel[5])  digital_io_out[8]   = port_d_out[5];
+
+     //Pin-12       PD6/OC0A(PWM2)/AIN0 digital_io[9] /analog_io[2]
+     if(cfg_pwm_enb[2])              digital_io_out[9]   = pwm_wfm[2];
+     else if(cfg_port_d_dir_sel[6])  digital_io_out[9]   = port_d_out[6];
+
+
+     //Pin-13       PD7/A1N1            digital_io[10]/analog_io[3]
+     if(cfg_port_d_dir_sel[7])       digital_io_out[10]  = port_d_out[7];
+     
+     //Pin-14       PB0/CLKO/ICP1       digital_io[11]
+     if(cfg_port_b_dir_sel[0])       digital_io_out[11]  = port_b_out[0];
+
+     //Pin-15       PB1/OC1A(PWM3)      digital_io[12]
+     if(cfg_pwm_enb[3])              digital_io_out[12]  = pwm_wfm[3];
+     else if(cfg_port_b_dir_sel[1])  digital_io_out[12]  = port_b_out[1];
+
+     //Pin-16       PB2/SS/OC1B(PWM4)   digital_io[13]
+     if(cfg_pwm_enb[4])              digital_io_out[13]  = pwm_wfm[4];
+     else if(cfg_spim_enb)           digital_io_out[13]  = spim_ss;
+     else if(cfg_port_b_dir_sel[2])  digital_io_out[13]  = port_b_out[2];
+
+     //Pin-17       PB3/MOSI/OC2A(PWM5) digital_io[14]
+     if(cfg_pwm_enb[5])              digital_io_out[14]  = pwm_wfm[5];
+     else if(cfg_port_b_dir_sel[3])  digital_io_out[14]  = port_b_out[3];
+
+     //Pin-18       PB4/MISO            digital_io[15]
+     if(cfg_spim_enb)                digital_io_out[15]  = spim_miso;
+     else if(cfg_port_b_dir_sel[4])  digital_io_out[15]  = port_b_out[4];
+
+     //Pin-19       PB5/SCK             digital_io[16]
+     if(cfg_spim_enb)                digital_io_out[16]  = spim_sck;
+     else if(cfg_port_b_dir_sel[5])  digital_io_out[16]  = port_b_out[5];
+     
+     //Pin-23       PC0/ADC0            digital_io[18]/analog_io[11]
+     if(cfg_port_c_dir_sel[0])       digital_io_out[18]  = port_c_out[0];
+
+     //Pin-24       PC1/ADC1            digital_io[19]/analog_io[12]
+     if(cfg_port_c_dir_sel[1])       digital_io_out[19]  = port_c_out[1];
+
+     //Pin-25       PC2/ADC2            digital_io[20]/analog_io[13]
+     if(cfg_port_c_dir_sel[2])       digital_io_out[20]  = port_c_out[2];
+
+     //Pin-26       PC3/ADC3            digital_io[21]/analog_io[14]
+     if(cfg_port_c_dir_sel[3])       digital_io_out[21]  = port_c_out[3];
+
+     //Pin-27       PC4/ADC4/SDA        digital_io[22]/analog_io[15]
+     if(cfg_i2cm_enb)                digital_io_out[22]  = i2cm_data_o;
+     else if(cfg_port_c_dir_sel[4])  digital_io_out[22]  = port_c_out[4];
+
+     //Pin-28       PC5/ADC5/SCL        digital_io[23]/analog_io[16]
+     if(cfg_i2cm_enb)                digital_io_out[23]  = i2cm_clk_o;
+     else if(cfg_port_c_dir_sel[5])  digital_io_out[23]  = port_c_out[5];
+
+     // Serial Flash
+     digital_io_out[24] = sflash_sck   ;
+     digital_io_out[25] = sflash_ss    ;
+     digital_io_out[26] = sflash_do[0] ;
+     digital_io_out[27] = sflash_do[1] ;
+     digital_io_out[28] = sflash_do[2] ;
+     digital_io_out[29] = sflash_do[3] ;
+                       
+     // Serail SRAM 
+     digital_io_out[30] = ssram_sck   ;
+     digital_io_out[31] = ssram_ss    ;
+     digital_io_out[32] = ssram_do[0]  ;
+     digital_io_out[33] = ssram_do[1]  ;
+     digital_io_out[34] = ssram_do[2]  ;
+     digital_io_out[35] = ssram_do[3]  ;
+                  
+     // USB 1.1     
+     digital_io_out[36] = usb_dp_o     ;
+     digital_io_out[37] = usb_dn_o     ;
+end
+
+// dataoen selection
+always_comb begin
+     digital_io_oen = 38'h3F_FFFF_FFFF;
+     //Pin-1        PC6/RESET*          digital_io[0]
+     if(cfg_port_c_dir_sel[6])       digital_io_oen[0]   = 1'b0;
+
+     //Pin-2        PD0/RXD             digital_io[1]
+     if     (cfg_uart_enb)           digital_io_oen[1]   = 1'b1;
+     else if(cfg_port_d_dir_sel[0])  digital_io_oen[1]   = 1'b0;
+
+     //Pin-3        PD1/TXD             digital_io[2]
+     if     (cfg_uart_enb)           digital_io_oen[2]   = 1'b0;
+     else if(cfg_port_d_dir_sel[1])  digital_io_oen[2]   = 1'b0;
+
+    //Pin-4        PD2/INT0            digital_io[3]
+     if(cfg_int_enb[0])              digital_io_oen[3]   = 1'b1;
+     else if(cfg_port_d_dir_sel[2])  digital_io_oen[3]   = 1'b0;
+
+     //Pin-5        PD3/INT1/OC2B(PWM0)  digital_io[4]
+     if(cfg_pwm_enb[0])              digital_io_oen[4]   = 1'b0;
+     else if(cfg_int_enb[1])         digital_io_oen[4]   = 1'b1;
+     else if(cfg_port_d_dir_sel[3])  digital_io_oen[4]   = 1'b0;
+
+     //Pin-6        PD4                 digital_io[5]
+     if(cfg_port_d_dir_sel[4])       digital_io_oen[5]   = 1'b0;
+
+     //Pin-9        PB6/XTAL1/TOSC1     digital_io[6]
+     if(cfg_port_b_dir_sel[6])       digital_io_oen[6]   = 1'b0;
+
+     // Pin-10       PB7/XTAL2/TOSC2     digital_io[7]
+     if(cfg_port_b_dir_sel[7])       digital_io_oen[7]   = 1'b0;
+
+     //Pin-11       PD5/OC0B(PWM1)/T1   digital_io[8]
+     if(cfg_pwm_enb[1])              digital_io_oen[8]   = 1'b0;
+     else if(cfg_port_d_dir_sel[5])  digital_io_oen[8]   = 1'b0;
+
+     //Pin-12       PD6/OC0A(PWM2)/AIN0 digital_io[9] /analog_io[2]
+     if(cfg_pwm_enb[2])              digital_io_oen[9]   = 1'b0;
+     else if(cfg_port_d_dir_sel[6])  digital_io_oen[9]   = 1'b0;
+
+     //Pin-13       PD7/A1N1            digital_io[10]/analog_io[3]
+     if(cfg_port_d_dir_sel[7])       digital_io_oen[10]  = 1'b0;
+     
+     //Pin-14       PB0/CLKO/ICP1       digital_io[11]
+     if(cfg_port_b_dir_sel[0])       digital_io_oen[11]  = 1'b0;
+
+     //Pin-15       PB1/OC1A(PWM3)      digital_io[12]
+     if(cfg_pwm_enb[3])              digital_io_oen[12]  = 1'b0;
+     else if(cfg_port_b_dir_sel[1])  digital_io_oen[12]  = 1'b0;
+
+     //Pin-16       PB2/SS/OC1B(PWM4)   digital_io[13]
+     if(cfg_pwm_enb[4])              digital_io_oen[13]  = 1'b0;
+     else if(cfg_spim_enb)           digital_io_oen[13]  = 1'b0;
+     else if(cfg_port_b_dir_sel[2])  digital_io_oen[13]  = 1'b0;
+
+     //Pin-17       PB3/MOSI/OC2A(PWM5) digital_io[14]
+     if(cfg_spim_enb)                digital_io_oen[14]  = 1'b1;
+     else if(cfg_pwm_enb[5])         digital_io_oen[14]  = 1'b0;
+     else if(cfg_port_b_dir_sel[3])  digital_io_oen[14]  = 1'b0;
+
+     //Pin-18       PB4/MISO            digital_io[15]
+     if(cfg_spim_enb)                digital_io_oen[15]  = 1'b0;
+     else if(cfg_port_b_dir_sel[4])  digital_io_oen[15]  = 1'b0;
+
+     //Pin-19       PB5/SCK             digital_io[16]
+     if(cfg_spim_enb)                digital_io_oen[16]  = 1'b0;
+     else if(cfg_port_b_dir_sel[5])  digital_io_oen[16]  = 1'b0;
+     
+     //Pin-23       PC0/ADC0            digital_io[18]/analog_io[11]
+     if(cfg_port_c_dir_sel[0])       digital_io_oen[18]  = 1'b0;
+
+     //Pin-24       PC1/ADC1            digital_io[19]/analog_io[12]
+     if(cfg_port_c_dir_sel[1])       digital_io_oen[19]  = 1'b0;
+
+     //Pin-25       PC2/ADC2            digital_io[20]/analog_io[13]
+     if(cfg_port_c_dir_sel[2])       digital_io_oen[20]  = 1'b0;
+
+     //Pin-26       PC3/ADC3            digital_io[21]/analog_io[14]
+     if(cfg_port_c_dir_sel[3])       digital_io_oen[21]  = 1'b0;
+
+     //Pin-27       PC4/ADC4/SDA        digital_io[22]/analog_io[15]
+     if(cfg_i2cm_enb)                digital_io_oen[22]  = i2cm_data_oen;
+     else if(cfg_port_c_dir_sel[4])  digital_io_oen[22]  = 1'b0;
+
+     //Pin-28       PC5/ADC5/SCL        digital_io[23]/analog_io[16]
+     if(cfg_i2cm_enb)                digital_io_oen[23]  = i2cm_clk_oen;
+     else if(cfg_port_c_dir_sel[5])  digital_io_oen[23]  = 1'b0;
+
+     // Serial Flash
+     digital_io_oen[24] = 1'b0   ;
+     digital_io_oen[25] = 1'b0   ;
+     digital_io_oen[26] = sflash_oen;
+     digital_io_oen[27] = sflash_oen;
+     digital_io_oen[28] = sflash_oen;
+     digital_io_oen[29] = sflash_oen;
+                       
+     // Serail SRAM 
+     digital_io_oen[30] = 1'b0  ;
+     digital_io_oen[31] = 1'b0  ;
+     digital_io_oen[32] = ssram_oen;
+     digital_io_oen[33] = ssram_oen;
+     digital_io_oen[34] = ssram_oen;
+     digital_io_oen[35] = ssram_oen;
+                  
+     // USB 1.1     
+     digital_io_oen[36] = usb_oen;
+     digital_io_oen[37] = usb_oen;
+end
+
+
+endmodule 
+
+
diff --git a/verilog/rtl/pinmux/src/pinmux_reg.sv b/verilog/rtl/pinmux/src/pinmux_reg.sv
new file mode 100644
index 0000000..eba780d
--- /dev/null
+++ b/verilog/rtl/pinmux/src/pinmux_reg.sv
@@ -0,0 +1,666 @@
+
+module pinmux_reg (
+                       // System Signals
+                       // Inputs
+		       input logic             mclk,
+                       input logic             h_reset_n,
+
+		       // Reg Bus Interface Signal
+                       input logic             reg_cs,
+                       input logic             reg_wr,
+                       input logic [7:0]       reg_addr,
+                       input logic [31:0]      reg_wdata,
+                       input logic [3:0]       reg_be,
+
+                       // Outputs
+                       output logic [31:0]     reg_rdata,
+                       output logic            reg_ack,
+
+		       input  logic [1:0]      ext_intr_in,
+
+		      // Risc configuration
+                       output logic [31:0]     fuse_mhartid,
+                       output logic [15:0]     irq_lines,
+                       output logic            soft_irq,
+                       output logic [2:0]      user_irq,
+
+                       output logic [9:0]      cfg_pulse_1us,
+		       
+                       //---------------------------------------------------
+                       // 6 PWM Configuration
+                       //---------------------------------------------------
+                       
+                       output logic [15:0]    cfg_pwm0_high           ,
+                       output logic [15:0]    cfg_pwm0_low            ,
+                       output logic [15:0]    cfg_pwm1_high           ,
+                       output logic [15:0]    cfg_pwm1_low            ,
+                       output logic [15:0]    cfg_pwm2_high           ,
+                       output logic [15:0]    cfg_pwm2_low            ,
+                       output logic [15:0]    cfg_pwm3_high           ,
+                       output logic [15:0]    cfg_pwm3_low            ,
+                       output logic [15:0]    cfg_pwm4_high           ,
+                       output logic [15:0]    cfg_pwm4_low            ,
+                       output logic [15:0]    cfg_pwm5_high           ,
+                       output logic [15:0]    cfg_pwm5_low            ,
+
+                // GPIO input pins
+                       input  logic [31:0]     gpio_in_data   ,// GPIO I/P pins
+                       input  logic [31:0]     gpio_int_event ,// from gpio control blk
+
+
+
+                // GPIO config pins
+                       output  logic [31:0]     cfg_gpio_out_data        ,// to the GPIO control block 
+                       output  logic [31:0]     cfg_gpio_data_in         ,// GPIO I/P pins data captured into this
+                       output  logic [31:0]     cfg_gpio_dir_sel         ,// decides on GPIO pin is I/P or O/P at pad level
+                       output  logic [31:0]     cfg_gpio_out_type        ,// O/P is static , '1' : waveform
+                       output  logic [31:0]     cfg_gpio_posedge_int_sel ,// select posedge interrupt
+                       output  logic [31:0]     cfg_gpio_negedge_int_sel ,// select negedge interrupt
+                       output  logic [31:0]     cfg_multi_func_sel       ,// multifunction pins
+                        
+                       // Outputs
+                       output logic [31:0]      gpio_prev_indata       // prv data from GPIO I/P pins
+   ); 
+
+
+                       
+//-----------------------------------------------------------------------
+// Internal Wire Declarations
+//-----------------------------------------------------------------------
+
+reg           sw_rd_en               ;
+reg           sw_wr_en;
+reg  [4:0]    sw_addr; // addressing 16 registers
+reg  [31:0]   sw_reg_wdata;
+reg    [3:0]  wr_be  ;
+reg          reg_cs_l;
+reg          reg_cs_2l;
+
+reg [31:0]   reg_out;
+
+wire [31:0]   reg_0; // Chip ID
+wire [31:0]   reg_1; // Risc Fuse Id
+reg [31:0]    reg_2; // GPIO Read Data
+reg [31:0]    reg_3; // GPIO Output Data
+reg [31:0]    reg_4; // GPIO Dir Sel
+reg [31:0]    reg_5; // GPIO Type
+reg [31:0]    reg_6; // Interrupt
+reg [31:0]    reg_7; // 
+reg [31:0]    reg_8; // 
+reg [31:0]    reg_9; // GPIO Interrupt Status
+wire [31:0]   reg_10; // GPIO Interrupt Status
+reg [31:0]    reg_11; // GPIO Interrupt Mask
+reg [31:0]    reg_12; // GPIO Posedge Interrupt Select
+reg [31:0]    reg_13; // GPIO Negedge Interrupt Select
+reg [31:0]    reg_14; // Software-Reg_14
+reg [31:0]    reg_15; // Software-Reg_15
+reg [31:0]    reg_16; // PWN-0 Config
+reg [31:0]    reg_17; // PWN-1 Config
+reg [31:0]    reg_18; // PWN-2 Config
+reg [31:0]    reg_19; // PWN-3 Config
+reg [31:0]    reg_20; // PWN-4 Config
+reg [31:0]    reg_21; // PWN-5 Config
+
+
+reg          cs_int;
+wire         gpio_intr;
+
+
+
+//-----------------------------------------------------------------------
+// To avoid interface timing, all the content are registered
+//-----------------------------------------------------------------------
+always @ (posedge mclk or negedge h_reset_n)
+begin 
+   if (h_reset_n == 1'b0)
+   begin
+    sw_addr       <= '0;
+    sw_rd_en      <= '0;
+    sw_wr_en      <= '0;
+    sw_reg_wdata  <= '0;
+    wr_be         <= '0;
+    reg_cs_l      <= '0;
+    reg_cs_2l     <= '0;
+  end else begin
+    sw_addr       <= reg_addr [6:2];
+    sw_rd_en      <= reg_cs & !reg_wr;
+    sw_wr_en      <= reg_cs & reg_wr;
+    sw_reg_wdata  <= reg_wdata;
+    wr_be         <= reg_be;
+    reg_cs_l      <= reg_cs;
+    reg_cs_2l     <= reg_cs_l;
+  end
+end
+
+
+//-----------------------------------------------------------------------
+// Read path mux
+//-----------------------------------------------------------------------
+
+always @ (posedge mclk or negedge h_reset_n)
+begin : preg_out_Seq
+   if (h_reset_n == 1'b0) begin
+      reg_rdata [31:0]  <= 32'h0000_0000;
+      reg_ack           <= 1'b0;
+   end else if (sw_rd_en && !reg_ack && !reg_cs_2l) begin
+      reg_rdata [31:0]  <= reg_out [31:0];
+      reg_ack           <= 1'b1;
+   end else if (sw_wr_en && !reg_ack && !reg_cs_2l) begin 
+      reg_ack           <= 1'b1;
+   end else begin
+      reg_ack        <= 1'b0;
+   end
+end
+
+
+//-----------------------------------------------------------------------
+// register read enable and write enable decoding logic
+//-----------------------------------------------------------------------
+wire   sw_wr_en_0 = sw_wr_en  & (sw_addr == 5'h0);
+wire   sw_rd_en_0 = sw_rd_en  & (sw_addr == 5'h0);
+wire   sw_wr_en_1 = sw_wr_en  & (sw_addr == 5'h1);
+wire   sw_rd_en_1 = sw_rd_en  & (sw_addr == 5'h1);
+wire   sw_wr_en_2 = sw_wr_en  & (sw_addr == 5'h2);
+wire   sw_rd_en_2 = sw_rd_en  & (sw_addr == 5'h2);
+wire   sw_wr_en_3 = sw_wr_en  & (sw_addr == 5'h3);
+wire   sw_rd_en_3 = sw_rd_en  & (sw_addr == 5'h3);
+wire   sw_wr_en_4 = sw_wr_en  & (sw_addr == 5'h4);
+wire   sw_rd_en_4 = sw_rd_en  & (sw_addr == 5'h4);
+wire   sw_wr_en_5 = sw_wr_en  & (sw_addr == 5'h5);
+wire   sw_rd_en_5 = sw_rd_en  & (sw_addr == 5'h5);
+wire   sw_wr_en_6 = sw_wr_en  & (sw_addr == 5'h6);
+wire   sw_rd_en_6 = sw_rd_en  & (sw_addr == 5'h6);
+wire   sw_wr_en_7 = sw_wr_en  & (sw_addr == 5'h7);
+wire   sw_rd_en_7 = sw_rd_en  & (sw_addr == 5'h7);
+wire   sw_wr_en_8 = sw_wr_en  & (sw_addr == 5'h8);
+wire   sw_rd_en_8 = sw_rd_en  & (sw_addr == 5'h8);
+wire   sw_wr_en_9 = sw_wr_en  & (sw_addr == 5'h9);
+wire   sw_rd_en_9 = sw_rd_en  & (sw_addr == 5'h9);
+wire   sw_wr_en_10 = sw_wr_en & (sw_addr == 5'hA);
+wire   sw_rd_en_10 = sw_rd_en & (sw_addr == 5'hA);
+wire   sw_wr_en_11 = sw_wr_en & (sw_addr == 5'hB);
+wire   sw_rd_en_11 = sw_rd_en & (sw_addr == 5'hB);
+wire   sw_wr_en_12 = sw_wr_en & (sw_addr == 5'hC);
+wire   sw_rd_en_12 = sw_rd_en & (sw_addr == 5'hC);
+wire   sw_wr_en_13 = sw_wr_en & (sw_addr == 5'hD);
+wire   sw_rd_en_13 = sw_rd_en & (sw_addr == 5'hD);
+wire   sw_wr_en_14 = sw_wr_en & (sw_addr == 5'hE);
+wire   sw_rd_en_14 = sw_rd_en & (sw_addr == 5'hE);
+wire   sw_wr_en_15 = sw_wr_en & (sw_addr == 5'hF);
+wire   sw_rd_en_15 = sw_rd_en & (sw_addr == 5'hF);
+wire   sw_wr_en_16 = sw_wr_en & (sw_addr == 5'h10);
+wire   sw_rd_en_16 = sw_rd_en & (sw_addr == 5'h10);
+wire   sw_wr_en_17 = sw_wr_en & (sw_addr == 5'h11);
+wire   sw_rd_en_17 = sw_rd_en & (sw_addr == 5'h11);
+wire   sw_wr_en_18 = sw_wr_en & (sw_addr == 5'h12);
+wire   sw_rd_en_18 = sw_rd_en & (sw_addr == 5'h12);
+wire   sw_wr_en_19 = sw_wr_en & (sw_addr == 5'h13);
+wire   sw_rd_en_19 = sw_rd_en & (sw_addr == 5'h13);
+wire   sw_wr_en_20 = sw_wr_en & (sw_addr == 5'h14);
+wire   sw_rd_en_20 = sw_rd_en & (sw_addr == 5'h14);
+wire   sw_wr_en_21 = sw_wr_en & (sw_addr == 5'h15);
+wire   sw_rd_en_21 = sw_rd_en & (sw_addr == 5'h15);
+
+
+
+//-----------------------------------------------------------------------
+// Individual register assignments
+//-----------------------------------------------------------------------
+
+// Chip ID
+wire [15:0] manu_id  =  16'h8949; // Asci value of YI
+wire [7:0] chip_id   =  8'h02;
+wire [7:0] chip_rev  =  8'h01;
+
+assign reg_0 = {manu_id,chip_id,chip_rev};
+
+
+//-----------------------------------------------------------------------
+//   reg-1, reset value = 32'hA55A_A55A
+//   -----------------------------------------------------------------
+
+gen_32b_reg  #(32'hA55A_A55A) u_reg_1	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_1    ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_1         )
+	      );
+
+assign fuse_mhartid = reg_1;
+
+//-----------------------------------------------------------------------
+// Logic for gpio_data_in 
+//-----------------------------------------------------------------------
+logic [31:0] gpio_in_data_s;
+logic [31:0] gpio_in_data_ss;
+// Double Sync the gpio pin data for edge detection
+always @ (posedge mclk or negedge h_reset_n)
+begin 
+  if (h_reset_n == 1'b0) begin
+    reg_2  <= 'h0 ;
+    gpio_in_data_s  <= 32'd0;
+    gpio_in_data_ss <= 32'd0;
+  end
+  else begin
+    gpio_in_data_s   <= gpio_in_data;
+    gpio_in_data_ss <= gpio_in_data_s;
+    reg_2           <= gpio_in_data_ss;
+  end
+end
+
+
+assign cfg_gpio_data_in = reg_2[31:0]; // to be used for edge interrupt detect
+assign gpio_prev_indata = gpio_in_data_ss;
+
+//-----------------------------------------------------------------------
+// Logic for cfg_gpio_out_data 
+//-----------------------------------------------------------------------
+assign cfg_gpio_out_data = reg_3[31:0]; // data to the GPIO control blk 
+
+gen_32b_reg  #(32'h0) u_reg_3	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_3    ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_3         )
+	      );
+//-----------------------------------------------------------------------
+// Logic for cfg_gpio_dir_sel 
+//-----------------------------------------------------------------------
+assign cfg_gpio_dir_sel = reg_4[31:0]; // data to the GPIO O/P pins 
+
+gen_32b_reg  #(32'h0) u_reg_4	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_4    ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_4         )
+	      );
+//-----------------------------------------------------------------------
+// Logic for cfg_gpio_out_type 
+//-----------------------------------------------------------------------
+assign cfg_gpio_out_type = reg_5[31:0]; // to be used for read
+
+gen_32b_reg  #(32'h0) u_reg_5	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_5    ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_5         )
+	      );
+
+
+//-----------------------------------------------------------------------
+//   reg-6
+//-----------------------------------------------------------------
+assign  irq_lines     = reg_6[15:0]; 
+assign  soft_irq      = reg_6[16]; 
+assign  user_irq      = {gpio_intr,ext_intr_in}; 
+
+generic_register #(8,0  ) u_reg6_be0 (
+	      .we            ({8{sw_wr_en_6 & 
+                                 wr_be[0]   }}  ),		 
+	      .data_in       (sw_reg_wdata[7:0]    ),
+	      .reset_n       (h_reset_n           ),
+	      .clk           (mclk              ),
+	      
+	      //List of Outs
+	      .data_out      (reg_6[7:0]        )
+          );
+
+generic_register #(8,0  ) u_reg6_be1 (
+	      .we            ({8{sw_wr_en_6 & 
+                                 wr_be[1]   }}  ),		 
+	      .data_in       (sw_reg_wdata[15:8]),
+	      .reset_n       (h_reset_n           ),
+	      .clk           (mclk              ),
+	      
+	      //List of Outs
+	      .data_out      (reg_6[15:8]        )
+          );
+
+assign reg_6[31:16] = '0;
+
+//  Register-7
+gen_32b_reg  #(32'h0) u_reg_7	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_7   ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_7        )
+	      );
+
+assign cfg_pulse_1us = reg_7[9:0];
+
+//-----------------------------------------------------------------------
+// Logic for cfg_int_status 
+// Always update int_status, even if no register write is occuring.
+// Interrupt posting is higher priority than int clear by host 
+//-----------------------------------------------------------------------
+wire [31:0]  cfg_gpio_int_status = reg_9[31:0]; // to be used for read
+
+//--------------------------------------------------------
+// Interrupt Status Generation
+// Note: Reg_9 --> Interrupt Status Register, Writting '1' will clear the
+//                 corresponding interrupt status bit. Writting '0' has no
+//                 effect 
+//       Reg_10 --> Writting one to this register will set the interrupt in
+//                  interrupt status register (reg_9), Writting '0' does not has any
+//                  effect.
+/// Always update int_status, even if no register write is occuring.
+//	    Interrupt posting is higher priority than int clear by host 
+//--------------------------------------------------------
+wire [31:0] gpio_int_status = reg_9;				      
+always @(posedge mclk or negedge h_reset_n)
+begin
+   if(~h_reset_n)
+   begin
+      reg_9[31:0]   <= 32'h0;
+   end
+   else
+   begin
+      if(sw_wr_en_9 && wr_be[0])
+      begin
+         reg_9[7:0] <=  ((~sw_reg_wdata[7:0] & gpio_int_status[7:0]) | gpio_int_event[7:0]);
+      end
+      else if(sw_wr_en_10 && wr_be[0]) 
+      begin
+         reg_9[7:0] <= ((sw_reg_wdata[7:0] | gpio_int_status[7:0]) | gpio_int_event[7:0]);
+      end
+      else
+      begin
+         reg_9[7:0] <=   (gpio_int_status[7:0] | gpio_int_event[7:0]);
+      end
+
+      if(sw_wr_en_9 && wr_be[1])
+      begin
+         reg_9[15:8] <=  ((~sw_reg_wdata[15:8] & gpio_int_status[15:8]) | gpio_int_event[15:8]);
+      end
+      else if(sw_wr_en_10 && wr_be[1]) 
+      begin
+         reg_9[15:8] <= ((sw_reg_wdata[15:8] | gpio_int_status[15:8]) | gpio_int_event[15:8]);
+      end
+      else
+      begin
+         reg_9[15:8] <=   (gpio_int_status[15:8] | gpio_int_event[15:8]);
+      end
+
+      if(sw_wr_en_9 && wr_be[2])
+      begin
+         reg_9[23:16] <=  ((~sw_reg_wdata[23:16] & gpio_int_status[23:16]) | gpio_int_event[23:16]);
+      end
+      else if(sw_wr_en_10 && wr_be[2]) 
+      begin
+         reg_9[23:16] <= ((sw_reg_wdata[23:16] | gpio_int_status[23:16]) | gpio_int_event[23:16]);
+      end
+      else
+      begin
+         reg_9[23:16] <=   (gpio_int_status[23:16] | gpio_int_event[23:16]);
+      end
+
+      if(sw_wr_en_9 && wr_be[3])
+      begin
+         reg_9[31:24] <=  ((~sw_reg_wdata[31:24] & gpio_int_status[31:24]) | gpio_int_event[31:24]);
+      end
+      else if(sw_wr_en_10 && wr_be[3]) 
+      begin
+         reg_9[31:24] <= ((sw_reg_wdata[31:24] | gpio_int_status[31:24]) | gpio_int_event[31:24]);
+      end
+      else
+      begin
+         reg_9[31:24] <=   (gpio_int_status[31:24] | gpio_int_event[31:24]);
+      end
+   end
+end
+//-------------------------------------------------
+// Returns same value as interrupt status register
+//------------------------------------------------
+
+assign reg_10 = reg_9;
+//-----------------------------------------------------------------------
+// Logic for cfg_gpio_int_mask :  GPIO interrupt mask  
+//-----------------------------------------------------------------------
+wire [31:0]  cfg_gpio_int_mask = reg_11[31:0]; // to be used for read
+
+assign gpio_intr  = ( | (reg_9 & reg_11) ); // interrupt pin to the RISC
+
+
+//  Register-11
+gen_32b_reg  #(32'h0) u_reg_11	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_11   ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_11        )
+	      );
+//-----------------------------------------------------------------------
+// Logic for cfg_gpio_posedge_int_sel :  Enable posedge GPIO interrupt 
+//-----------------------------------------------------------------------
+assign  cfg_gpio_posedge_int_sel = reg_12[31:0]; // to be used for read
+gen_32b_reg  #(32'h0) u_reg_12	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_12   ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_12        )
+	      );
+//-----------------------------------------------------------------------
+// Logic for cfg_gpio_negedge_int_sel :  Enable negedge GPIO interrupt 
+//-----------------------------------------------------------------------
+assign cfg_gpio_negedge_int_sel = reg_13[31:0]; // to be used for read
+gen_32b_reg  #(32'h0) u_reg_13	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_13   ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_13        )
+	      );
+
+//-----------------------------------------------------------------------
+// Logic for cfg_multi_func_sel :Enable GPIO to act as multi function pins 
+//-----------------------------------------------------------------------
+assign  cfg_multi_func_sel = reg_14[31:0]; // to be used for read
+
+
+gen_32b_reg  #(32'h0) u_reg_14	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_14   ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_14        )
+	      );
+
+// Reg-15
+gen_32b_reg  #(32'h0) u_reg_15	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_15   ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_15        )
+	      );
+//-----------------------------------------------------------------------
+// Logic for PWM-0 Config
+//-----------------------------------------------------------------------
+assign  cfg_pwm0_low  = reg_16[15:0];  // low period of w/f 
+assign  cfg_pwm0_high = reg_16[31:16]; // high period of w/f 
+
+gen_32b_reg  #(32'h0) u_reg_16	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_16   ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_16        )
+	      );
+
+
+//-----------------------------------------------------------------------
+// Logic for PWM-1 Config
+//-----------------------------------------------------------------------
+assign  cfg_pwm1_low  = reg_17[15:0];  // low period of w/f 
+assign  cfg_pwm1_high = reg_17[31:16]; // high period of w/f 
+gen_32b_reg  #(32'h0) u_reg_17	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_17   ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_17         )
+	      );
+
+//-----------------------------------------------------------------------
+// Logic for PWM-2 Config
+//-----------------------------------------------------------------------
+assign  cfg_pwm2_low  = reg_18[15:0];  // low period of w/f 
+assign  cfg_pwm2_high = reg_18[31:16]; // high period of w/f 
+gen_32b_reg  #(32'h0) u_reg_18	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_18   ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_18        )
+	      );
+
+//-----------------------------------------------------------------------
+// Logic for PWM-3 Config
+//-----------------------------------------------------------------------
+assign  cfg_pwm3_low  = reg_19[15:0];  // low period of w/f 
+assign  cfg_pwm3_high = reg_19[31:16]; // high period of w/f 
+gen_32b_reg  #(32'h0) u_reg_19	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_19   ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_19        )
+	      );
+
+//-----------------------------------------------------------------------
+// Logic for PWM-4 Config
+//-----------------------------------------------------------------------
+assign  cfg_pwm4_low  = reg_20[15:0];  // low period of w/f 
+assign  cfg_pwm4_high = reg_20[31:16]; // high period of w/f 
+
+gen_32b_reg  #(32'h0) u_reg_20	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_20   ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_20        )
+	      );
+
+//-----------------------------------------------------------------------
+// Logic for PWM-5 Config
+//-----------------------------------------------------------------------
+assign  cfg_pwm5_low  = reg_21[15:0];  // low period of w/f 
+assign  cfg_pwm5_high = reg_21[31:16]; // high period of w/f 
+
+gen_32b_reg  #(32'h0) u_reg_21	(
+	      //List of Inputs
+	      .reset_n    (h_reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_21   ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_21       )
+	      );
+
+
+
+//-----------------------------------------------------------------------
+// Register Read Path Multiplexer instantiation
+//-----------------------------------------------------------------------
+
+always_comb
+begin 
+  reg_out [31:0] = 32'h0;
+
+  case (sw_addr [4:0])
+    5'b00000 : reg_out [31:0] = reg_0 [31:0];     
+    5'b00001 : reg_out [31:0] = reg_1 [31:0];    
+    5'b00010 : reg_out [31:0] = reg_2 [31:0];     
+    5'b00011 : reg_out [31:0] = reg_3 [31:0];    
+    5'b00100 : reg_out [31:0] = reg_4 [31:0];    
+    5'b00101 : reg_out [31:0] = reg_5 [31:0];    
+    5'b00110 : reg_out [31:0] = reg_6 [31:0];    
+    5'b00111 : reg_out [31:0] = reg_7 [31:0];    
+    5'b01000 : reg_out [31:0] = reg_8 [31:0];    
+    5'b01001 : reg_out [31:0] = reg_9 [31:0];    
+    5'b01010 : reg_out [31:0] = reg_10 [31:0];   
+    5'b01011 : reg_out [31:0] = reg_11 [31:0];   
+    5'b01100 : reg_out [31:0] = reg_12 [31:0];   
+    5'b01101 : reg_out [31:0] = reg_13 [31:0];
+    5'b01110 : reg_out [31:0] = reg_14 [31:0];
+    5'b01111 : reg_out [31:0] = reg_15 [31:0]; 
+    5'b10000 : reg_out [31:0] = reg_16 [31:0];
+    5'b10010 : reg_out [31:0] = reg_17 [31:0];
+    5'b10011 : reg_out [31:0] = reg_18 [31:0];
+    5'b10100 : reg_out [31:0] = reg_19 [31:0];
+    5'b10101 : reg_out [31:0] = reg_20 [31:0];
+    5'b10110 : reg_out [31:0] = reg_21 [31:0];
+    default  : reg_out [31:0] = 32'h0;
+  endcase
+end
+
+
+endmodule                       
diff --git a/verilog/rtl/pinmux/src/pwm.sv b/verilog/rtl/pinmux/src/pwm.sv
new file mode 100644
index 0000000..7a30772
--- /dev/null
+++ b/verilog/rtl/pinmux/src/pwm.sv
@@ -0,0 +1,44 @@
+
+//-------------------------------------------------------------------
+// PWM waveform period:  1000/((cfg_pwm_high+1) + (cfg_pwm_low+1))
+// For 1 Second with Duty cycle 50 =   1000/((499+1) + (499+1))
+// For 1 Second with 1ms On and 999ms Off =  1000/((0+1) + (998+1))
+// Timing Run's with 1 Milisecond pulse
+//-------------------------------------------------------------------
+
+module pwm(
+	output  logic         waveform,
+
+	input  logic         h_reset_n,
+	input  logic         mclk,
+	input  logic         pulse1m_mclk,
+	input  logic         cfg_pwm_enb,
+	input  logic [15:0]  cfg_pwm_high,
+	input  logic [15:0]  cfg_pwm_low
+);
+
+logic [15:0]  pwm_cnt  ; // PWM on/off counter
+
+
+always @(posedge mclk or negedge h_reset_n)
+begin 
+   if ( ~h_reset_n )
+   begin
+      pwm_cnt  <= 16'h0;
+      waveform <= 1'b0;
+   end
+   else if ( pulse1m_mclk  && cfg_pwm_enb)
+   begin 
+      if ( pwm_cnt == 16'h0 && waveform  == 1'b0) begin
+         pwm_cnt       <= cfg_pwm_high;
+         waveform      <= ~waveform;
+      end else if ( pwm_cnt == 16'h0 && waveform  == 1'b1) begin
+         pwm_cnt       <= cfg_pwm_low;
+         waveform      <= ~waveform;
+      end else begin
+     	   pwm_cnt <= pwm_cnt - 1;
+      end
+   end
+end 
+
+endmodule
diff --git a/verilog/rtl/sar_adc/ACMP.sv b/verilog/rtl/sar_adc/ACMP.sv
new file mode 100644
index 0000000..7f58f42
--- /dev/null
+++ b/verilog/rtl/sar_adc/ACMP.sv
@@ -0,0 +1,103 @@
+module ACMP(
+`ifdef USE_POWER_PINS
+    input wire vccd2,
+    input wire vssd2, 
+`endif 
+    input   wire clk,
+    input   wire INP,
+    input   wire INN,
+    input   wire VDD,
+    input   wire VSS,
+    output  wire Q    
+);
+
+`ifdef ACMP_FUNCTIONAL
+
+    assign Q = INP > INN ;
+`else 
+
+    wire    clkb;
+    wire    net1, 
+            net2,
+            net3,
+            net4,
+            net5,
+            net6,
+            net7;
+    
+    sky130_fd_sc_hd__inv_1 x15 (
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND), 
+        .VPB(VPWR),
+        .VNB(VGND),
+    `endif 
+        .A(clk), .Y(clkb));
+    sky130_fd_sc_hd__a221oi_1 x7 (
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND), 
+        .VPB(VPWR),
+        .VNB(VGND),
+    `endif 
+        .A1(INP), .A2(INP), .B1(clkb), .B2(VDD), .C1(net2), .Y(net1));     
+    sky130_fd_sc_hd__a221oi_1 x8 (
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND), 
+        .VPB(VPWR),
+        .VNB(VGND),
+    `endif 
+        .A1(INN), .A2(INN), .B1(clkb), .B2(VDD), .C1(net1), .Y(net2));  
+    sky130_fd_sc_hd__inv_1 x2 (
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND), 
+        .VPB(VPWR),
+        .VNB(VGND),
+    `endif 
+        .A(net3), .Y(net6));
+    sky130_fd_sc_hd__inv_1 x3 (
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND), 
+        .VPB(VPWR),
+        .VNB(VGND),
+    `endif 
+        .A(net4), .Y(net5));
+    sky130_fd_sc_hd__o221ai_1 x6 (
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND), 
+        .VPB(VPWR),
+        .VNB(VGND),
+    `endif 
+        .A1(INP), .A2(INP), .B1(clk), .B2(VSS), .C1(net4), .Y(net3));
+    sky130_fd_sc_hd__o221ai_1 x9 (
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND), 
+        .VPB(VPWR),
+        .VNB(VGND),
+    `endif 
+        .A1(INN), .A2(INN), .B1(clk), .B2(VSS), .C1(net3), .Y(net4));
+    sky130_fd_sc_hd__nor3_1 x10 (
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND), 
+        .VPB(VPWR),
+        .VNB(VGND),
+    `endif 
+        .A(net5), .B(net1), .C(net7), .Y(Q));
+    sky130_fd_sc_hd__nor3_1 x11 (
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND),
+        .VPB(VPWR),
+        .VNB(VGND), 
+    `endif 
+        .A(Q), .B(net6), .C(net2), .Y(net7));
+    
+`endif
+
+endmodule
\ No newline at end of file
diff --git a/verilog/rtl/sar_adc/ACMP_HVL.v b/verilog/rtl/sar_adc/ACMP_HVL.v
new file mode 100644
index 0000000..543cd6e
--- /dev/null
+++ b/verilog/rtl/sar_adc/ACMP_HVL.v
@@ -0,0 +1,112 @@
+/*
+    An analog comparator using HVL cells
+*/
+
+module ACMP_HVL(
+`ifdef USE_POWER_PINS
+    input wire vccd2,	
+    input wire vssd2,	
+`endif
+    input   wire clk,
+    input   wire INP,
+    input   wire INN,
+    output  wire Q    
+);
+    wire clkb;
+    wire Q1b, Q1;
+    wire Q2b, Q2;
+    wire Qb;
+
+    sky130_fd_sc_hvl__inv_1 x0 (
+        .Y(clkb),
+        .A(clk)
+    );    
+
+    sky130_fd_sc_hvl__nor3_1 x5(
+        .Y(Q),
+        .A(Q1b),
+        .B(Q2b),
+        .C(Qb)
+    );
+
+    sky130_fd_sc_hvl__nor3_1 x6(
+        .Y(Qb),
+        .A(Q1),
+        .B(Q2),
+        .C(Q)
+    );
+
+    latch_nand3 x1 (
+        .CLK(clk), 
+        .VP(INP), 
+        .VN(INN),
+        .Q(Q1),
+        .Qb(Q1b) 
+    );
+
+    latch_nor3 x2 (
+        .CLK(clkb), 
+        .VP(INP), 
+        .VN(INN),
+        .Q(Q2),
+        .Qb(Q2b) 
+    );
+
+endmodule
+
+module latch_nor3 (
+    input   wire CLK, 
+    input   wire VP, 
+    input   wire VN,
+    output  wire Q,
+    output  wire Qb 
+);
+
+    sky130_fd_sc_hvl__nor3_1 x1(
+        .Y(Qb),
+        .A(CLK),
+        .B(VP),
+        .C(Q)
+    );
+    sky130_fd_sc_hvl__nor3_1 x2(
+        .Y(Q),
+        .A(CLK),
+        .B(VN),
+        .C(Qb)
+    );
+    
+endmodule
+
+module latch_nand3 (
+    input   wire CLK, 
+    input   wire VP, 
+    input   wire VN,
+    output  wire Q,
+    output  wire Qb 
+);
+    wire Q0, Q0b;
+
+    sky130_fd_sc_hvl__nand3_1 x1(
+        .Y(Q0b),
+        .A(CLK),
+        .B(VP),
+        .C(Q0)
+    );
+    sky130_fd_sc_hvl__nand3_1 x2(
+        .Y(Q0),
+        .A(CLK),
+        .B(VN),
+        .C(Q0b)
+    );
+
+    sky130_fd_sc_hvl__inv_4 x3 (
+        .Y(Qb),
+        .A(Q0)
+    ); 
+
+    sky130_fd_sc_hvl__inv_4 x4 (
+        .Y(Q),
+        .A(Q0b)
+    ); 
+    
+endmodule
\ No newline at end of file
diff --git a/verilog/rtl/sar_adc/DAC_8BIT.v b/verilog/rtl/sar_adc/DAC_8BIT.v
new file mode 100644
index 0000000..8030e18
--- /dev/null
+++ b/verilog/rtl/sar_adc/DAC_8BIT.v
@@ -0,0 +1,24 @@
+module DAC_8BIT (
+`ifdef USE_POWER_PINS
+    input wire vdd,	// User area 1 1.8V supply
+    input wire gnd,	// User area 1 digital ground
+`endif
+    input wire d0,
+    input wire d1,
+    input wire d2,
+    input wire d3,
+    input wire d4,
+    input wire d5,
+    input wire d6,
+    input wire d7,
+    
+    input wire inp1,
+    input wire inp2, 
+
+    output wire out_v
+);
+
+// Dummy behavirol model to verify the DAC connection with the user_project_wrapper
+assign out_v = d0 | d1 | d2 | d3 | d4 | d5 | d6 | d7 ;
+
+endmodule
\ No newline at end of file
diff --git a/verilog/rtl/sar_adc/SAR.sv b/verilog/rtl/sar_adc/SAR.sv
new file mode 100644
index 0000000..9931483
--- /dev/null
+++ b/verilog/rtl/sar_adc/SAR.sv
@@ -0,0 +1,65 @@
+// file: SAR.v
+// A parametrized Successive Approximation Register (SAR)
+// The module is so compact; it is only 110 cells for 
+// 8-bit SAR using SKY130 HD library
+//
+// author: Mohamed Shalan (mshalan@aucegypt.edu)
+
+`timescale 1ns/1ns
+
+module SAR  #(parameter SIZE = 8) ( 
+    input   wire            clk,    // The clock
+    input   wire            reset_n, // Active low reset
+    input   wire            start,  // Conversion start 
+    input   wire            cmp,    // Analog comparator output
+    output  wire [SIZE-1:0] out,    // The output sample
+    output  wire [SIZE-1:0] outn,   // Inverted output for active low DAC
+    output  wire            done,   // Conversion is done
+    output  wire            clkn    // Inverted clock to be used by the clocked analog comparator
+);
+	
+	reg [SIZE-1:0] result;
+	reg [SIZE-1:0] shift;
+	
+    // FSM to handle the SAR operation
+    reg [1:0] state, nstate;
+	localparam IDLE=0, CONV=1, DONE=2;
+
+	always @*
+        case (state)
+            IDLE:       if(start) nstate = CONV;
+                            else nstate = IDLE;
+            CONV:       if(shift == 1'b1) nstate = DONE;
+                            else nstate = CONV;
+            DONE:       nstate = IDLE;
+            default:    nstate = IDLE;
+        endcase
+	  
+	always @(posedge clk or negedge reset_n)
+        if(!reset_n)
+            state <= IDLE;
+        else
+            state <= nstate;
+
+    // Shift Register
+    always @(posedge clk)
+        if(state == IDLE) 
+            shift <= 1'b1 << (SIZE-1);
+        else if(state == CONV)
+            shift<= shift >> 1; 
+
+    // The SAR
+    wire [SIZE-1:0] current = (cmp == 1'b0) ? ~shift : {SIZE{1'b1}} ;
+    wire [SIZE-1:0] next = shift >> 1;
+    always @(posedge clk)
+        if(state == IDLE) 
+            result <= 1'b1 << (SIZE-1);
+        else if(state == CONV)
+            result <= (result | next) & current; 
+	   
+	  assign out = result;
+      assign outn = ~result;
+      assign clkn = ~clk;
+	  assign done = (state==DONE);
+	
+endmodule
diff --git a/verilog/rtl/sar_adc/adc_reg.sv b/verilog/rtl/sar_adc/adc_reg.sv
new file mode 100644
index 0000000..24dcf0f
--- /dev/null
+++ b/verilog/rtl/sar_adc/adc_reg.sv
@@ -0,0 +1,262 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya                          
+// 
+// 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
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  ADC register                                                ////
+////                                                              ////
+////  This file is part of the YIFive cores project               ////
+////  https://github.com/dineshannayya/riscduino.git              ////
+////                                                              ////
+////  Description                                                 ////
+////      This block generate all the ADC config and status       ////
+////                                                              ////
+////  To Do:                                                      ////
+////    nothing                                                   ////
+////                                                              ////
+////  Author(s):                                                  ////
+////      - Dinesh Annayya, dinesha@opencores.org                 ////
+////                                                              ////
+////  Revision :                                                  ////
+////    0.1 - 26 Sept 2021  Dinesh A                              ////
+////          Initial version                                     ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
+////                                                              ////
+//// This source file may be used and distributed without         ////
+//// restriction provided that this copyright statement is not    ////
+//// removed from the file and that any derivative work contains  ////
+//// the original copyright notice and the associated disclaimer. ////
+////                                                              ////
+//// This source file is free software; you can redistribute it   ////
+//// and/or modify it under the terms of the GNU Lesser General   ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any   ////
+//// later version.                                               ////
+////                                                              ////
+//// This source is distributed in the hope that it will be       ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
+//// PURPOSE.  See the GNU Lesser General Public License for more ////
+//// details.                                                     ////
+////                                                              ////
+//// You should have received a copy of the GNU Lesser General    ////
+//// Public License along with this source; if not, download it   ////
+//// from http://www.opencores.org/lgpl.shtml                     ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+
+module adc_reg (
+
+        input logic             mclk,
+        input logic             reset_n,
+
+        // Reg Bus Interface Signal
+        input logic             reg_cs,
+        input logic             reg_wr,
+        input logic [7:0]       reg_addr,
+        input logic [31:0]      reg_wdata,
+        input logic [3:0]       reg_be,
+
+       // Outputs
+        output logic [31:0]     reg_rdata,
+        output logic            reg_ack,
+
+	input  logic            pulse1m_mclk,
+       // ADC I/F
+       output logic            start_conv,
+       output logic [2:0]      adc_ch_no,           
+       input  logic            conv_done,
+       input  logic [7:0]      adc_result
+
+
+        );
+
+
+
+//-----------------------------------------------------------------------
+// Internal Wire Declarations
+//-----------------------------------------------------------------------
+
+logic           sw_rd_en;
+logic           sw_wr_en;
+logic  [3:0]    sw_addr ; // addressing 16 registers
+logic  [3:0]    wr_be   ;
+logic  [31:0]   sw_reg_wdata;
+
+logic           reg_cs_l    ;
+logic           reg_cs_2l    ;
+
+
+logic [31:0]    reg_0;  // ADC Config
+logic [31:0]    reg_1;  // ADC Ch-1 Result
+logic [31:0]    reg_2;  // ADC Ch-2 Result 
+logic [31:0]    reg_3;  // ADC Ch-3 Result
+logic [31:0]    reg_4;  // ADC Ch-4 Result
+logic [31:0]    reg_5;  // ADC Ch-5 Result
+logic [31:0]    reg_6;  // ADC Ch-6 Result
+logic [31:0]    reg_7;  // Software-Reg_7
+logic [31:0]    reg_out;
+
+//-----------------------------------------------------------------------
+// Main code starts here
+//-----------------------------------------------------------------------
+
+//-----------------------------------------------------------------------
+// To avoid interface timing, all the content are registered
+//-----------------------------------------------------------------------
+always @ (posedge mclk or negedge reset_n)
+begin 
+   if (reset_n == 1'b0)
+   begin
+    sw_addr       <= '0;
+    sw_rd_en      <= '0;
+    sw_wr_en      <= '0;
+    sw_reg_wdata  <= '0;
+    wr_be         <= '0;
+    reg_cs_l      <= '0;
+    reg_cs_2l     <= '0;
+  end else begin
+    sw_addr       <= reg_addr [5:2];
+    sw_rd_en      <= reg_cs & !reg_wr;
+    sw_wr_en      <= reg_cs & reg_wr;
+    sw_reg_wdata  <= reg_wdata;
+    wr_be         <= reg_be;
+    reg_cs_l      <= reg_cs;
+    reg_cs_2l     <= reg_cs_l;
+  end
+end
+
+
+//-----------------------------------------------------------------------
+// Read path mux
+//-----------------------------------------------------------------------
+
+always @ (posedge mclk or negedge reset_n)
+begin : preg_out_Seq
+   if (reset_n == 1'b0) begin
+      reg_rdata [31:0]  <= 32'h0000_0000;
+      reg_ack           <= 1'b0;
+   end else if (sw_rd_en && !reg_ack && !reg_cs_2l) begin
+      reg_rdata [31:0]  <= reg_out [31:0];
+      reg_ack           <= 1'b1;
+   end else if (sw_wr_en && !reg_ack && !reg_cs_2l) begin 
+      reg_ack           <= 1'b1;
+   end else begin
+      reg_ack        <= 1'b0;
+   end
+end
+
+
+//-----------------------------------------------------------------------
+// register read enable and write enable decoding logic
+//-----------------------------------------------------------------------
+wire   sw_wr_en_0 = sw_wr_en & (sw_addr == 4'h0);
+wire   sw_rd_en_0 = sw_rd_en & (sw_addr == 4'h0);
+wire   sw_wr_en_1 = sw_wr_en & (sw_addr == 4'h1);
+wire   sw_rd_en_1 = sw_rd_en & (sw_addr == 4'h1);
+wire   sw_wr_en_2 = sw_wr_en & (sw_addr == 4'h2);
+wire   sw_rd_en_2 = sw_rd_en & (sw_addr == 4'h2);
+wire   sw_wr_en_3 = sw_wr_en & (sw_addr == 4'h3);
+wire   sw_rd_en_3 = sw_rd_en & (sw_addr == 4'h3);
+wire   sw_wr_en_4 = sw_wr_en & (sw_addr == 4'h4);
+wire   sw_rd_en_4 = sw_rd_en & (sw_addr == 4'h4);
+wire   sw_wr_en_5 = sw_wr_en & (sw_addr == 4'h5);
+wire   sw_rd_en_5 = sw_rd_en & (sw_addr == 4'h5);
+wire   sw_wr_en_6 = sw_wr_en & (sw_addr == 4'h6);
+wire   sw_rd_en_6 = sw_rd_en & (sw_addr == 4'h6);
+wire   sw_wr_en_7 = sw_wr_en & (sw_addr == 4'h7);
+wire   sw_rd_en_7 = sw_rd_en & (sw_addr == 4'h7);
+
+always @( *)
+begin : preg_sel_Com
+
+  reg_out [31:0] = 32'd0;
+
+  case (sw_addr [3:0])
+    4'b0000 : reg_out [31:0] = reg_0 [31:0];     
+    4'b0001 : reg_out [31:0] = {24'h0,reg_1 [7:0]};    
+    4'b0010 : reg_out [31:0] = {24'h0,reg_2 [7:0]};     
+    4'b0011 : reg_out [31:0] = {24'h0,reg_3 [7:0]};    
+    4'b0100 : reg_out [31:0] = {24'h0,reg_4 [7:0]};    
+    4'b0101 : reg_out [31:0] = {24'h0,reg_5 [7:0]};    
+    4'b0110 : reg_out [31:0] = {24'h0,reg_6 [7:0]};    
+    default : reg_out [31:0] = 'h0;
+  endcase
+end
+
+
+
+//-----------------------------------------------------------------------
+// Individual register assignments
+//-----------------------------------------------------------------------
+logic [5:0] cfg_adc_enb = reg_0[5:0];
+
+gen_32b_reg  #(32'h0) u_reg_0	(
+	      //List of Inputs
+	      .reset_n    (reset_n     ),
+	      .clk        (mclk          ),
+	      .cs         (sw_wr_en_0    ),
+	      .we         (wr_be         ),		 
+	      .data_in    (sw_reg_wdata  ),
+	      
+	      //List of Outs
+	      .data_out   (reg_0        )
+	      );
+
+
+always @(posedge mclk or negedge reset_n)
+begin
+   if(~reset_n) begin
+      reg_1[7:0]   <= 8'h0;
+      reg_2[7:0]   <= 8'h0;
+      reg_3[7:0]   <= 8'h0;
+      reg_4[7:0]   <= 8'h0;
+      reg_5[7:0]   <= 8'h0;
+      reg_6[7:0]   <= 8'h0;
+      start_conv   <= '0;
+      adc_ch_no    <= '0;
+   end else begin
+      if(cfg_adc_enb[0] && pulse1m_mclk) begin
+	 if(start_conv && conv_done) begin
+            start_conv <= 0;
+	    case(adc_ch_no)
+	    3'b000: reg_1[7:0] <= adc_result;
+	    3'b001: reg_2[7:0] <= adc_result;
+	    3'b010: reg_3[7:0] <= adc_result;
+	    3'b011: reg_4[7:0] <= adc_result;
+	    3'b100: reg_5[7:0] <= adc_result;
+	    3'b101: reg_6[7:0] <= adc_result;
+	    endcase
+         end
+      end else begin
+	 start_conv <= 1;
+	 if(adc_ch_no == 5) begin
+	    adc_ch_no <= 0;
+         end else begin
+	    adc_ch_no    <= adc_ch_no+1;
+	 end
+      end
+   end
+end
+
+
+
+
+endmodule
diff --git a/verilog/rtl/sar_adc/sar_adc.sv b/verilog/rtl/sar_adc/sar_adc.sv
new file mode 100644
index 0000000..6514e98
--- /dev/null
+++ b/verilog/rtl/sar_adc/sar_adc.sv
@@ -0,0 +1,170 @@
+module sar_adc(
+`ifdef USE_POWER_PINS
+    input logic             vccd1         ,// User area 1 1.8V supply
+    input logic             vssd1         ,// User area 1 digital ground
+    input logic             vccd2         ,// User area 2 1.8V supply (analog)
+    input logic             vssd2         ,// User area 2 ground      (analog)
+`endif
+
+    
+    input  logic            clk           ,// The clock (digital)
+    input  logic            reset_n       ,// Active low reset (digital)
+
+    // Reg Bus Interface Signal
+    input logic             reg_cs        ,
+    input logic             reg_wr        ,
+    input logic [7:0]       reg_addr      ,
+    input logic [31:0]      reg_wdata     ,
+    input logic [3:0]       reg_be        ,
+
+    // Outputs
+    output logic [31:0]     reg_rdata     ,
+    output logic            reg_ack       ,
+
+    input  logic            pulse1m_mclk  ,
+    output  logic [7:0]     sar2dac       ,// SAR O/P towards DAC
+
+    input   logic           analog_dac_out, // DAC analog o/p for compare
+
+    // ACMP (HD) Ports 
+    input   logic           analog_din        // (Analog)
+
+);
+
+    logic        clkn;
+    logic [5:0]  sar_cmp; // SAR compare signal
+    logic        sar_cmp_int;
+    logic [2:0]  adc_ch_no;
+    logic        start_conv    ;// Conversion start (digital)
+    logic        conv_done     ;// Conversion is done (digital)
+    logic [7:0]  adc_result    ;// SAR o/p (digital)
+  
+always_comb 
+begin
+   sar_cmp_int = 0;
+   case(adc_ch_no)
+   3'b000 :  sar_cmp_int = sar_cmp[0];
+   3'b001 :  sar_cmp_int = sar_cmp[1];
+   3'b010 :  sar_cmp_int = sar_cmp[2];
+   3'b011 :  sar_cmp_int = sar_cmp[3];
+   3'b100 :  sar_cmp_int = sar_cmp[4];
+   3'b101 :  sar_cmp_int = sar_cmp[5];
+   endcase
+
+
+end
+
+adc_reg u_adc_reg (
+        .mclk        (mclk),
+        .reset_n     (reset_n),
+
+        // Reg Bus Interface Signal
+        .reg_cs      (reg_cs),
+        .reg_wr      (reg_wr),
+        .reg_addr    (reg_addr),
+        .reg_wdata   (reg_wdata),
+        .reg_be      (reg_be),
+
+       // Outputs
+        .reg_rdata   (reg_rdata),
+        .reg_ack     (reg_ack),
+
+	.pulse1m_mclk  (pulse1m_mclk),
+       // ADC I/F
+       .start_conv   (start_conv),
+       .adc_ch_no    (adc_ch_no),           
+       .conv_done    (conv_done),
+       .adc_result   (adc_result)
+
+       );
+
+
+    ACMP COMP_0 (
+    `ifdef USE_POWER_PINS
+        .vccd2   (vccd2           ),
+        .vssd2   (vssd2           ),
+        .VDD     (vccd2           ),
+        .VSS     (vssd2           ),
+    `endif
+        .clk     (clk             ),
+        .INP     (analog_din[0]   ),
+        .INN     (analog_dac_out  ),
+        .Q       (sar_cmp[0]      )    
+    );
+
+    ACMP COMP_1 (
+    `ifdef USE_POWER_PINS
+        .vccd2   (vccd2           ),
+        .vssd2   (vssd2           ),
+        .VDD     (vccd2           ),
+        .VSS     (vssd2           ),
+    `endif
+        .clk     (clk             ),
+        .INP     (analog_din[1]   ),
+        .INN     (analog_dac_out  ),
+        .Q       (sar_cmp[1]      )    
+    );
+
+    ACMP COMP_2 (
+    `ifdef USE_POWER_PINS
+        .vccd2   (vccd2           ),
+        .vssd2   (vssd2           ),
+        .VDD     (vccd2           ),
+        .VSS     (vssd2           ),
+    `endif
+        .clk     (clk             ),
+        .INP     (analog_din[2]   ),
+        .INN     (analog_dac_out  ),
+        .Q       (sar_cmp[2]      )    
+    );
+
+    ACMP COMP_3 (
+    `ifdef USE_POWER_PINS
+        .vccd2   (vccd2           ),
+        .vssd2   (vssd2           ),
+        .VDD     (vccd2           ),
+        .VSS     (vssd2           ),
+    `endif
+        .clk     (clk             ),
+        .INP     (analog_din[3]   ),
+        .INN     (analog_dac_out  ),
+        .Q       (sar_cmp[3]      )    
+    );
+    ACMP COMP_4 (
+    `ifdef USE_POWER_PINS
+        .vccd2   (vccd2           ),
+        .vssd2   (vssd2           ),
+        .VDD     (vccd2           ),
+        .VSS     (vssd2           ),
+    `endif
+        .clk     (clk             ),
+        .INP     (analog_din[4]   ),
+        .INN     (analog_dac_out  ),
+        .Q       (sar_cmp[4]      )    
+    );
+    ACMP COMP_5 (
+    `ifdef USE_POWER_PINS
+        .vccd2   (vccd2           ),
+        .vssd2   (vssd2           ),
+        .VDD     (vccd2           ),
+        .VSS     (vssd2           ),
+    `endif
+        .clk     (clk             ),
+        .INP     (analog_din[5]   ),
+        .INN     (analog_dac_out  ),
+        .Q       (sar_cmp[5]      )    
+    );
+
+    SAR CTRL ( 
+        .clk     (clk             ),   
+        .reset_n (reset_n         ),  
+        .start   (start_conv      ),
+        .cmp     (sar_cmp_int     ),
+        .out     (adc_result      ),    
+        .done    (conv_done       ),
+        .outn    (sar2dac         ),
+        .clkn    (clkn            ) 
+    );
+
+
+endmodule
diff --git a/verilog/rtl/spi_master/src/spim_top.sv b/verilog/rtl/spi_master/src/spim_top.sv
index 042319c..02aacc7 100644
--- a/verilog/rtl/spi_master/src/spim_top.sv
+++ b/verilog/rtl/spi_master/src/spim_top.sv
@@ -117,10 +117,11 @@
     output logic                 [31:0]  spi_debug,
 
     // PAD I/f
-    input  logic  [3:0]                  io_in    ,
-    output logic  [5:0]                  io_out   ,
-    output logic  [5:0]                  io_oeb
-
+    input logic [3:0]                    spi_sdi,
+    output logic                         spi_clk,
+    output logic                         spi_csn0,// No hold fix for CS#, as it asserted much eariler than SPI clock
+    output logic [3:0]                   spi_sdo,
+    output logic                         spi_oen
 );
 
 
@@ -218,16 +219,9 @@
 logic                          spi_sdo1;
 logic                          spi_sdo2;
 logic                          spi_sdo3;
-logic                          spi_sdi0;
-logic                          spi_sdi1;
-logic                          spi_sdi2;
-logic                          spi_sdi3;
 logic                          spi_en_tx;
 logic                          spi_init_done;
-logic                          spi_sdo0_out;
-logic                          spi_sdo1_out;
-logic                          spi_sdo2_out;
-logic                          spi_sdo3_out;
+logic  [3:0]                   spi_sdo_int;
 
 logic                          spi_sdo0_dl;
 logic                          spi_sdo1_dl;
@@ -235,42 +229,26 @@
 logic                          spi_sdo3_dl;
 
 
-assign  spi_sdi0  =  io_in[0];
-assign  spi_sdi1  =  io_in[1];
-assign  spi_sdi2  =  io_in[2];
-assign  spi_sdi3  =  io_in[3];
-
-assign  io_out[0] =  spi_clk;
-assign  io_out[1] =  spi_csn0;// No hold fix for CS#, as it asserted much eariler than SPI clock
-assign  #1 io_out[2] =  spi_sdo0_out;
-assign  #1 io_out[3] =  spi_sdo1_out;
-assign  #1 io_out[4] =  spi_sdo2_out;
-assign  #1 io_out[5] =  spi_sdo3_out;
 
 // ADDing Delay cells for Interface hold fix
-sky130_fd_sc_hd__dlygate4sd3_1 u_delay1_sdio0 (.X(spi_sdo0_d1),.A(spi_sdo0));
+sky130_fd_sc_hd__dlygate4sd3_1 u_delay1_sdio0 (.X(spi_sdo0_d1),.A(spi_sdo_int[0]));
 sky130_fd_sc_hd__dlygate4sd3_1 u_delay2_sdio0 (.X(spi_sdo0_d2),.A(spi_sdo0_d1));
-sky130_fd_sc_hd__clkbuf_16 u_buf_sdio0    (.X(spi_sdo0_out),.A(spi_sdo0_d2));
+sky130_fd_sc_hd__clkbuf_16 u_buf_sdio0    (.X(spi_sdo0),.A(spi_sdo0_d2));
 
-sky130_fd_sc_hd__dlygate4sd3_1 u_delay1_sdio1 (.X(spi_sdo1_d1),.A(spi_sdo1));
+sky130_fd_sc_hd__dlygate4sd3_1 u_delay1_sdio1 (.X(spi_sdo1_d1),.A(spi_sdo_int[1]));
 sky130_fd_sc_hd__dlygate4sd3_1 u_delay2_sdio1 (.X(spi_sdo1_d2),.A(spi_sdo1_d1));
-sky130_fd_sc_hd__clkbuf_16 u_buf_sdio1    (.X(spi_sdo1_out),.A(spi_sdo1_d2));
+sky130_fd_sc_hd__clkbuf_16 u_buf_sdio1    (.X(spi_sdo1),.A(spi_sdo1_d2));
 
-sky130_fd_sc_hd__dlygate4sd3_1 u_delay1_sdio2 (.X(spi_sdo2_d1),.A(spi_sdo2));
+sky130_fd_sc_hd__dlygate4sd3_1 u_delay1_sdio2 (.X(spi_sdo2_d1),.A(spi_sdo_int[2]));
 sky130_fd_sc_hd__dlygate4sd3_1 u_delay2_sdio2 (.X(spi_sdo2_d2),.A(spi_sdo2_d1));
-sky130_fd_sc_hd__clkbuf_16 u_buf_sdio2    (.X(spi_sdo2_out),.A(spi_sdo2_d2));
+sky130_fd_sc_hd__clkbuf_16 u_buf_sdio2    (.X(spi_sdo2),.A(spi_sdo2_d2));
 
-sky130_fd_sc_hd__dlygate4sd3_1 u_delay1_sdio3 (.X(spi_sdo3_d1),.A(spi_sdo3));
+sky130_fd_sc_hd__dlygate4sd3_1 u_delay1_sdio3 (.X(spi_sdo3_d1),.A(spi_sdo_int[3]));
 sky130_fd_sc_hd__dlygate4sd3_1 u_delay2_sdio3 (.X(spi_sdo3_d2),.A(spi_sdo3_d1));
-sky130_fd_sc_hd__clkbuf_16 u_buf_sdio3    (.X(spi_sdo3_out),.A(spi_sdo3_d2));
+sky130_fd_sc_hd__clkbuf_16 u_buf_sdio3    (.X(spi_sdo3),.A(spi_sdo3_d2));
 
 
-assign  io_oeb[0] =  1'b0;         // spi_clk
-assign  io_oeb[1] =  1'b0;         // spi_csn
-assign  #1 io_oeb[2] =  !spi_en_tx;   // spi_dio0
-assign  #1 io_oeb[3] =  !spi_en_tx;   // spi_dio1
-assign  #1 io_oeb[4] =  (spi_mode == 0) ? 1 'b0 : !spi_en_tx;   // spi_dio2
-assign  #1 io_oeb[5] =  (spi_mode == 0) ? 1 'b0 : !spi_en_tx;   // spi_dio3
+assign   spi_oen = !spi_en_tx;
 
 spim_if #( .WB_WIDTH(WB_WIDTH)) u_wb_if(
         .mclk                           (mclk                         ),
@@ -485,15 +463,15 @@
         .spi_csn2                       (spi_csn2                     ),
         .spi_csn3                       (spi_csn3                     ),
         .spi_mode                       (spi_mode                     ),
-        .spi_sdo0                       (spi_sdo0                     ),
-        .spi_sdo1                       (spi_sdo1                     ),
-        .spi_sdo2                       (spi_sdo2                     ),
-        .spi_sdo3                       (spi_sdo3                     ),
-        .spi_sdi0                       (spi_sdi0                     ),
-        .spi_sdi1                       (spi_sdi1                     ),
-        .spi_sdi2                       (spi_sdi2                     ),
-        .spi_sdi3                       (spi_sdi3                     ),
-	.spi_en_tx_out                      (spi_en_tx                    )
+        .spi_sdo0                       (spi_sdo_int[0]               ),
+        .spi_sdo1                       (spi_sdo_int[1]               ),
+        .spi_sdo2                       (spi_sdo_int[2]               ),
+        .spi_sdo3                       (spi_sdo_int[3]               ),
+        .spi_sdi0                       (spi_sdi[0]                   ),
+        .spi_sdi1                       (spi_sdi[1]                   ),
+        .spi_sdi2                       (spi_sdi[2]                   ),
+        .spi_sdi3                       (spi_sdi[3]                   ),
+	.spi_en_tx_out                  (spi_en_tx                    )
     );
 
 endmodule
diff --git a/verilog/rtl/uart_i2c_usb/src/uart_i2c_usb.sv b/verilog/rtl/uart_i2c_usb/src/uart_i2c_usb.sv
index ad97a12..69b31d4 100644
--- a/verilog/rtl/uart_i2c_usb/src/uart_i2c_usb.sv
+++ b/verilog/rtl/uart_i2c_usb/src/uart_i2c_usb.sv
@@ -87,62 +87,37 @@
    input logic         reg_be,
 
         // Outputs
-   output logic [31:0]  reg_rdata,
+   output logic [31:0] reg_rdata,
    output logic        reg_ack,
+   /////////////////////////////////////////////////////////
+   // i2c interface
+   ///////////////////////////////////////////////////////
+   input logic         scl_pad_i              , // SCL-line input
+   output logic        scl_pad_o              , // SCL-line output (always 1'b0)
+   output logic        scl_pad_oen_o          , // SCL-line output enable (active low)
+   
+   input logic         sda_pad_i              , // SDA-line input
+   output logic        sda_pad_o              , // SDA-line output (always 1'b0)
+   output logic        sda_padoen_o           , // SDA-line output enable (active low)
 
-       // Pad Control
-   input  logic [1:0]  io_in,
-   output logic [1:0]  io_out,
-   output logic [1:0]  io_oeb
+   // UART I/F
+   input  logic        uart_rxd               , 
+   output logic        uart_txd               ,
+
+   input  logic        usb_in_dp              ,
+   input  logic        usb_in_dn              ,
+
+   output logic        usb_out_dp             ,
+   output logic        usb_out_dn             ,
+   output logic        usb_out_tx_oen       
 
      );
 
-/////////////////////////////////////////////////////////
-// uart interface
-///////////////////////////////////////////////////////
-
-logic             uart_rxd                  ; 
-logic             uart_txd                  ;
-/////////////////////////////////////////////////////////
-// i2c interface
-///////////////////////////////////////////////////////
-logic             scl_pad_i                 ; // SCL-line input
-logic             scl_pad_o                 ; // SCL-line output (always 1'b0)
-logic             scl_pad_oen_o             ; // SCL-line output enable (active low)
-
-logic             sda_pad_i                 ; // SDA-line input
-logic             sda_pad_o                 ; // SDA-line output (always 1'b0)
-logic             sda_padoen_o              ; // SDA-line output enable (active low)
-
-/////////////////////////////////////////////////////////
-// usb interface
-///////////////////////////////////////////////////////
-logic             usb_in_dp                ;
-logic             usb_in_dn                ;
-             
-logic             usb_out_dp               ;
-logic             usb_out_dn               ;
-logic             usb_out_tx_oen           ;
 
 `define SEL_UART 2'b00
 `define SEL_I2C  2'b01
 `define SEL_USB  2'b10
 
-assign  io_oeb[0]  =  (uart_i2c_usb_sel == `SEL_UART) ? 1'b1 : 
-	              (uart_i2c_usb_sel == `SEL_I2C) ? scl_pad_oen_o : usb_out_tx_oen ; 
-assign  uart_rxd   =  (uart_i2c_usb_sel == `SEL_UART) ? io_in[0]: 1'b0;
-assign  scl_pad_i  =  (uart_i2c_usb_sel == `SEL_I2C) ? io_in[0]: 1'b0;
-assign  usb_in_dn  =  (uart_i2c_usb_sel == `SEL_USB) ? io_in[0]: 1'b0;
-assign  io_out[0]  =  (uart_i2c_usb_sel == `SEL_UART) ? 1'b0 : 
-	              (uart_i2c_usb_sel == `SEL_I2C) ?  scl_pad_o :  usb_out_dn;
-
-
-assign  io_oeb[1] =  (uart_i2c_usb_sel == `SEL_UART) ? 1'b0 : 
-	             (uart_i2c_usb_sel == `SEL_I2C) ? sda_padoen_o : usb_out_tx_oen ; 
-assign  io_out[1]  = (uart_i2c_usb_sel == `SEL_UART) ? uart_txd: 
-	             (uart_i2c_usb_sel == `SEL_I2C) ? sda_pad_o : usb_out_dp;
-assign  sda_pad_i =  (uart_i2c_usb_sel == `SEL_I2C) ? io_in[1] : 1'b0;
-assign  usb_in_dp =  (uart_i2c_usb_sel == `SEL_USB) ? io_in[1] : 1'b0;
 
 
 //----------------------------------------
diff --git a/verilog/rtl/user_project_wrapper.v b/verilog/rtl/user_project_wrapper.v
index d32b2ef..d5afe73 100644
--- a/verilog/rtl/user_project_wrapper.v
+++ b/verilog/rtl/user_project_wrapper.v
@@ -19,9 +19,8 @@
 ////                                                              ////
 ////  Digital core                                                ////
 ////                                                              ////
-////  This file is part of the YIFive cores project               ////
-////  https://github.com/dineshannayya/yifive_r0.git              ////
-////  http://www.opencores.org/cores/yifive/                      ////
+////  This file is part of the riscduino cores project            ////
+////  https://github.com/dineshannayya/riscduino.git              ////
 ////                                                              ////
 ////  Description                                                 ////
 ////      This is digital core and integrate all the main block   ////
@@ -99,6 +98,12 @@
 ////          usb1.1 host integrated part of uart_i2cm_usb module,////
 ////          due to number of IO pin limitation,                 ////
 ////          Only UART/I2C/USB selected based on config mode     ////
+////    1.2 - 29th Sept 2021, Dinesh.A                            ////
+////          1. copied the repo from yifive and renames as       ////
+////             riscdunino                                       ////
+////          2. Removed the SDRAM controlled                     ////
+////          3. Added PinMux                                     ////
+////          4. Added SAR ADC for 6 channel                      ////
 ////                                                              ////
 //////////////////////////////////////////////////////////////////////
 ////                                                              ////
@@ -233,15 +238,15 @@
 //---------------------------------------------------------------------
 //    SPI Master Wishbone Interface
 //---------------------------------------------------------------------
-wire                           wbd_sdram_stb_o ;
-wire [WB_WIDTH-1:0]            wbd_sdram_adr_o ;
-wire                           wbd_sdram_we_o  ; // 1 - Write, 0 - Read
-wire [WB_WIDTH-1:0]            wbd_sdram_dat_o ;
-wire [WB_WIDTH/8-1:0]          wbd_sdram_sel_o ; // Byte enable
-wire                           wbd_sdram_cyc_o ;
-wire  [2:0]                    wbd_sdram_cti_o ;
-wire  [WB_WIDTH-1:0]           wbd_sdram_dat_i ;
-wire                           wbd_sdram_ack_i ;
+wire                           wbd_adc_stb_o ;
+wire [7:0]                     wbd_adc_adr_o ;
+wire                           wbd_adc_we_o  ; // 1 - Write, 0 - Read
+wire [WB_WIDTH-1:0]            wbd_adc_dat_o ;
+wire [WB_WIDTH/8-1:0]          wbd_adc_sel_o ; // Byte enable
+wire                           wbd_adc_cyc_o ;
+wire  [2:0]                    wbd_adc_cti_o ;
+wire  [WB_WIDTH-1:0]           wbd_adc_dat_i ;
+wire                           wbd_adc_ack_i ;
 
 //---------------------------------------------------------------------
 //    Global Register Wishbone Interface
@@ -260,7 +265,7 @@
 //    Global Register Wishbone Interface
 //---------------------------------------------------------------------
 wire                           wbd_uart_stb_o; // strobe/request
-wire   [7:0]                   wbd_uart_adr_o; // address
+wire   [31:0]                  wbd_uart_adr_o; // address
 wire                           wbd_uart_we_o;  // write
 wire   [31:0]                  wbd_uart_dat_o; // data output
 wire                           wbd_uart_sel_o; // byte enable
@@ -306,7 +311,6 @@
 wire [3:0]                        cfg_cska_wh   ; // clock skew adjust for web host
 
 
-wire                              wbd_clk_wi    ; // clock for wishbone interconnect
 wire                              wbd_clk_riscv ; // clock for riscv
 wire                              wbd_clk_uart  ; // clock for uart
 wire                              wbd_clk_spi   ; // clock for spi
@@ -314,38 +318,55 @@
 wire                              wbd_clk_glbl  ; // clock for global reg
 wire                              wbd_clk_wh    ; // clock for global reg
 
-wire [3:0]                        cfg_cska_sd_co; // clock skew adjust for sdram clock out
-wire [3:0]                        cfg_cska_sd_ci; // clock skew adjust for sdram clock input
-wire [3:0]                        cfg_cska_sp_co; // clock skew adjust for SPI clock out
 
-wire                              io_out_29_    ; // Internally tapped SDRAM clock
-wire                              io_in_29_     ; // Clock Skewed Pad SDRAM clock
-wire                              io_in_30_     ; // SPI clock out
-
-//------------------------------------------------
-// Configuration Parameter
-//------------------------------------------------
-wire [1:0]                        cfg_sdr_width       ; // 2'b00 - 32 Bit SDR, 2'b01 - 16 Bit SDR, 2'b1x - 8 Bit
-wire [1:0]                        cfg_colbits         ; // 2'b00 - 8 Bit column address, 
-wire                              sdr_init_done       ; // Indicate SDRAM Initialisation Done
-wire [3:0] 		          cfg_sdr_tras_d      ; // Active to precharge delay
-wire [3:0]                        cfg_sdr_trp_d       ; // Precharge to active delay
-wire [3:0]                        cfg_sdr_trcd_d      ; // Active to R/W delay
-wire 			          cfg_sdr_en          ; // Enable SDRAM controller
-wire [1:0] 		          cfg_req_depth       ; // Maximum Request accepted by SDRAM controller
-wire [12:0] 		          cfg_sdr_mode_reg    ;
-wire [2:0] 		          cfg_sdr_cas         ; // SDRAM CAS Latency
-wire [3:0] 		          cfg_sdr_trcar_d     ; // Auto-refresh period
-wire [3:0]                        cfg_sdr_twr_d       ; // Write recovery delay
-wire [11: 0]                      cfg_sdr_rfsh        ;
-wire [2 : 0]                      cfg_sdr_rfmax       ;
 
 wire [31:0]                       spi_debug           ;
-wire [31:0]                       sdram_debug         ;
+wire [31:0]                       pinmux_debug           ;
 wire [63:0]                       riscv_debug         ;
 
+// SFLASH I/F
+wire                             sflash_sck          ;
+wire                             sflash_ss           ;
+wire                             sflash_oen          ;
+wire [3:0]                       sflash_do           ;
+wire [3:0]                       sflash_di           ;
 
+// SSRAM I/F
+wire                             ssram_sck           ;
+wire                             ssram_ss            ;
+wire                             ssram_oen           ;
+wire [3:0]                       ssram_do            ;
+wire [3:0]                       ssram_di            ;
 
+// USB I/F
+wire                             usb_dp_o            ;
+wire                             usb_dn_o            ;
+wire                             usb_oen             ;
+wire                             usb_dp_i            ;
+wire                             usb_dn_i            ;
+
+// UART I/F
+wire                             uart_txd            ;
+wire                             uart_rxd            ;
+
+// I2CM I/F
+wire                             i2cm_clk_o          ;
+wire                             i2cm_clk_i          ;
+wire                             i2cm_clk_oen        ;
+wire                             i2cm_data_oen       ;
+wire                             i2cm_data_o         ;
+wire                             i2cm_data_i         ;
+
+// SPI MASTER
+wire                             spim_sck            ;
+wire                             spim_ss             ;
+wire                             spim_miso           ;
+wire                             spim_mosi           ;
+
+wire [7:0]                       sar2dac             ;
+wire                             analog_dac_out      ;
+wire                             pulse1m_mclk        ;
+wire                             h_reset_n           ;
 /////////////////////////////////////////////////////////
 // Clock Skew Ctrl
 ////////////////////////////////////////////////////////
@@ -363,7 +384,7 @@
 assign cfg_cska_sp_co = cfg_clk_ctrl2[11:8];// SPI clock out control
 
 //assign la_data_out    = {riscv_debug,spi_debug,sdram_debug};
-assign la_data_out[127:0]    = {sdram_debug,spi_debug,riscv_debug};
+assign la_data_out[127:0]    = {pinmux_debug,spi_debug,riscv_debug};
 
 //clk_buf u_buf1_wb_rstn  (.clk_i(wbd_int_rst_n),.clk_o(wbd_int1_rst_n));
 //clk_buf u_buf2_wb_rstn  (.clk_i(wbd_int1_rst_n),.clk_o(wbd_int2_rst_n));
@@ -404,7 +425,7 @@
 
     // Slave Port
        .wbs_clk_out      (wbd_clk_int          ),  
-       .wbs_clk_i        (wbd_clk_wh           ),  
+       .wbs_clk_i        (wbd_clk_int           ),  
        .wbs_cyc_o        (wbd_int_cyc_i        ),  
        .wbs_stb_o        (wbd_int_stb_i        ),  
        .wbs_adr_o        (wbd_int_adr_i        ),  
@@ -450,7 +471,7 @@
 
     
     .wb_rst_n               (wbd_int_rst_n             ),
-    .wb_clk                 (wbd_clk_riscv             ),
+    .wb_clk                 (wbd_clk_int               ),
     // Instruction memory interface
     .wbd_imem_stb_o         (wbd_riscv_imem_stb_i      ),
     .wbd_imem_adr_o         (wbd_riscv_imem_adr_i      ),
@@ -486,7 +507,7 @@
 `endif
 ) u_spi_master
 (
-    .mclk                   (wbd_clk_spi               ),
+    .mclk                   (wbd_clk_int               ),
     .rst_n                  (spi_rst_n                 ),
 
     .wbd_stb_i              (wbd_spim_stb_o            ),
@@ -501,67 +522,18 @@
     .spi_debug              (spi_debug                 ),
 
     // Pad Interface
-    .io_in                  (io_in[35:32]              ), // io_in[31:30] unused ports
-    .io_out                 ({io_out[35:31],io_in_30_} ),
-    .io_oeb                 (io_oeb[35:30]             )
+    .spi_sdi                (sflash_di                 ),
+    .spi_clk                (sflash_sck                ),
+    .spi_csn0               (sflash_ss                 ),
+    .spi_sdo                (sflash_do                 ),
+    .spi_oen                (sflash_oen                )
 
 );
 
 
-sdrc_top  
-    `ifndef SYNTHESIS
-    #(.APP_AW(WB_WIDTH), 
-	    .APP_DW(WB_WIDTH), 
-	    .APP_BW(4),
-	    .SDR_DW(8), 
-	    .SDR_BW(1))
-      `endif
-     u_sdram_ctrl (
-    .cfg_sdr_width          (cfg_sdr_width              ),
-    .cfg_colbits            (cfg_colbits                ),
-    .sdram_debug            (sdram_debug                ),
-                    
-    // WB bus
-    .wb_rst_n               (wbd_int_rst_n              ),
-    .wb_clk_i               (wbd_clk_sdram              ),
-    
-    .wb_stb_i               (wbd_sdram_stb_o            ),
-    .wb_addr_i              (wbd_sdram_adr_o            ),
-    .wb_we_i                (wbd_sdram_we_o             ),
-    .wb_dat_i               (wbd_sdram_dat_o            ),
-    .wb_sel_i               (wbd_sdram_sel_o            ),
-    .wb_cyc_i               (wbd_sdram_cyc_o            ),
-    .wb_ack_o               (wbd_sdram_ack_i            ),
-    .wb_dat_o               (wbd_sdram_dat_i            ),
-
-		
-    /* Interface to SDRAMs */
-    .sdram_clk              (sdram_clk                 ),
-    .sdram_resetn           (sdram_rst_n               ),
-
-    /** Pad Interface       **/
-    .io_in                  ({io_in_29_,io_in[28:0]}   ),
-    .io_oeb                 (io_oeb[29:0]              ),
-    .io_out                 ({io_out_29_,io_out[28:0]} ),
-                    
-    /* Parameters */
-    .sdr_init_done          (sdr_init_done             ),
-    .cfg_req_depth          (cfg_req_depth             ), //how many req. buffer should hold
-    .cfg_sdr_en             (cfg_sdr_en                ),
-    .cfg_sdr_mode_reg       (cfg_sdr_mode_reg          ),
-    .cfg_sdr_tras_d         (cfg_sdr_tras_d            ),
-    .cfg_sdr_trp_d          (cfg_sdr_trp_d             ),
-    .cfg_sdr_trcd_d         (cfg_sdr_trcd_d            ),
-    .cfg_sdr_cas            (cfg_sdr_cas               ),
-    .cfg_sdr_trcar_d        (cfg_sdr_trcar_d           ),
-    .cfg_sdr_twr_d          (cfg_sdr_twr_d             ),
-    .cfg_sdr_rfsh           (cfg_sdr_rfsh              ),
-    .cfg_sdr_rfmax          (cfg_sdr_rfmax             )
-   );
-
 
 wb_interconnect  u_intercon (
-         .clk_i         (wbd_clk_wi            ), 
+         .clk_i         (wbd_clk_int            ), 
          .rst_n         (wbd_int_rst_n         ),
 
          // Master 0 Interface
@@ -611,229 +583,207 @@
          
          // Slave 1 Interface
          // .s1_wbd_err_i  (1'b0           ), - Moved inside IP
-         .s1_wbd_dat_i  (wbd_sdram_dat_i ),
-         .s1_wbd_ack_i  (wbd_sdram_ack_i ),
-         .s1_wbd_dat_o  (wbd_sdram_dat_o ),
-         .s1_wbd_adr_o  (wbd_sdram_adr_o ),
-         .s1_wbd_sel_o  (wbd_sdram_sel_o ),
-         .s1_wbd_we_o   (wbd_sdram_we_o  ),  
-         .s1_wbd_cyc_o  (wbd_sdram_cyc_o ),
-         .s1_wbd_stb_o  (wbd_sdram_stb_o ),
+         .s1_wbd_dat_i  (wbd_uart_dat_i ),
+         .s1_wbd_ack_i  (wbd_uart_ack_i ),
+         .s1_wbd_dat_o  (wbd_uart_dat_o ),
+         .s1_wbd_adr_o  (wbd_uart_adr_o ),
+         .s1_wbd_sel_o  (wbd_uart_sel_o ),
+         .s1_wbd_we_o   (wbd_uart_we_o  ),  
+         .s1_wbd_cyc_o  (wbd_uart_cyc_o ),
+         .s1_wbd_stb_o  (wbd_uart_stb_o ),
          
          // Slave 2 Interface
          // .s2_wbd_err_i  (1'b0           ), - Moved inside IP
-         .s2_wbd_dat_i  (wbd_glbl_dat_i ),
-         .s2_wbd_ack_i  (wbd_glbl_ack_i ),
-         .s2_wbd_dat_o  (wbd_glbl_dat_o ),
-         .s2_wbd_adr_o  (wbd_glbl_adr_o ),
-         .s2_wbd_sel_o  (wbd_glbl_sel_o ),
-         .s2_wbd_we_o   (wbd_glbl_we_o  ),  
-         .s2_wbd_cyc_o  (wbd_glbl_cyc_o ),
-         .s2_wbd_stb_o  (wbd_glbl_stb_o ),
+         .s2_wbd_dat_i  (wbd_adc_dat_i ),
+         .s2_wbd_ack_i  (wbd_adc_ack_i ),
+         .s2_wbd_dat_o  (wbd_adc_dat_o ),
+         .s2_wbd_adr_o  (wbd_adc_adr_o ),
+         .s2_wbd_sel_o  (wbd_adc_sel_o ),
+         .s2_wbd_we_o   (wbd_adc_we_o  ),  
+         .s2_wbd_cyc_o  (wbd_adc_cyc_o ),
+         .s2_wbd_stb_o  (wbd_adc_stb_o ),
 
          // Slave 3 Interface
          // .s3_wbd_err_i  (1'b0           ), - Moved inside IP
-         .s3_wbd_dat_i  (wbd_uart_dat_i ),
-         .s3_wbd_ack_i  (wbd_uart_ack_i ),
-         .s3_wbd_dat_o  (wbd_uart_dat_o ),
-         .s3_wbd_adr_o  (wbd_uart_adr_o ),
-         .s3_wbd_sel_o  (wbd_uart_sel_o ),
-         .s3_wbd_we_o   (wbd_uart_we_o  ),  
-         .s3_wbd_cyc_o  (wbd_uart_cyc_o ),
-         .s3_wbd_stb_o  (wbd_uart_stb_o )
+         .s3_wbd_dat_i  (wbd_glbl_dat_i ),
+         .s3_wbd_ack_i  (wbd_glbl_ack_i ),
+         .s3_wbd_dat_o  (wbd_glbl_dat_o ),
+         .s3_wbd_adr_o  (wbd_glbl_adr_o ),
+         .s3_wbd_sel_o  (wbd_glbl_sel_o ),
+         .s3_wbd_we_o   (wbd_glbl_we_o  ),  
+         .s3_wbd_cyc_o  (wbd_glbl_cyc_o ),
+         .s3_wbd_stb_o  (wbd_glbl_stb_o )
 	);
 
-glbl_cfg   u_glbl_cfg (
-
-       .mclk                   (wbd_clk_glbl              ),
-       .reset_n                (wbd_int_rst_n             ),
-
-        // Reg Bus Interface Signal
-       .reg_cs                 (wbd_glbl_stb_o            ),
-       .reg_wr                 (wbd_glbl_we_o             ),
-       .reg_addr               (wbd_glbl_adr_o            ),
-       .reg_wdata              (wbd_glbl_dat_o            ),
-       .reg_be                 (wbd_glbl_sel_o            ),
-
-       // Outputs
-       .reg_rdata              (wbd_glbl_dat_i            ),
-       .reg_ack                (wbd_glbl_ack_i            ),
-
-       // Risc configuration
-       .fuse_mhartid           (fuse_mhartid              ),
-       .irq_lines              (irq_lines                 ), 
-       .soft_irq               (soft_irq                  ),
-       .user_irq               (user_irq                  ),
-
-       // SDRAM Config
-       .cfg_sdr_width          (cfg_sdr_width             ),
-       .cfg_colbits            (cfg_colbits               ),
-
-	/* Parameters */
-       .sdr_init_done          (sdr_init_done             ),
-       .cfg_req_depth          (cfg_req_depth             ), //how many req. buffer should hold
-       .cfg_sdr_en             (cfg_sdr_en                ),
-       .cfg_sdr_mode_reg       (cfg_sdr_mode_reg          ),
-       .cfg_sdr_tras_d         (cfg_sdr_tras_d            ),
-       .cfg_sdr_trp_d          (cfg_sdr_trp_d             ),
-       .cfg_sdr_trcd_d         (cfg_sdr_trcd_d            ),
-       .cfg_sdr_cas            (cfg_sdr_cas               ),
-       .cfg_sdr_trcar_d        (cfg_sdr_trcar_d           ),
-       .cfg_sdr_twr_d          (cfg_sdr_twr_d             ),
-       .cfg_sdr_rfsh           (cfg_sdr_rfsh              ),
-       .cfg_sdr_rfmax          (cfg_sdr_rfmax             )
-
-
-        );
 
 uart_i2c_usb_top   u_uart_i2c_usb (
         .uart_rstn              (uart_rst_n               ), // uart reset
         .i2c_rstn               (i2c_rst_n                ), // i2c reset
         .usb_rstn               (usb_rst_n                ), // i2c reset
 	.uart_i2c_usb_sel       (uart_i2c_usb_sel         ), // 0 - uart, 1 - I2C
-        .app_clk                (wbd_clk_uart             ),
+        .app_clk                (wbd_clk_int              ),
 	.usb_clk                (usb_clk                  ),
 
         // Reg Bus Interface Signal
-       .reg_cs                 (wbd_uart_stb_o            ),
-       .reg_wr                 (wbd_uart_we_o             ),
-       .reg_addr               (wbd_uart_adr_o[5:2]       ),
-       .reg_wdata              (wbd_uart_dat_o            ),
-       .reg_be                 (wbd_uart_sel_o            ),
+       .reg_cs                (wbd_uart_stb_o            ),
+       .reg_wr                (wbd_uart_we_o             ),
+       .reg_addr              (wbd_uart_adr_o[5:2]       ),
+       .reg_wdata             (wbd_uart_dat_o            ),
+       .reg_be                (wbd_uart_sel_o            ),
 
        // Outputs
-       .reg_rdata              (wbd_uart_dat_i            ),
-       .reg_ack                (wbd_uart_ack_i            ),
+       .reg_rdata             (wbd_uart_dat_i            ),
+       .reg_ack               (wbd_uart_ack_i            ),
 
        // Pad interface
-       .io_in                  (io_in [37:36]              ),
-       .io_oeb                 (io_oeb[37:36]              ),
-       .io_out                 (io_out[37:36]              )
+       .scl_pad_i             (i2cm_clk_i                ),
+       .scl_pad_o             (i2cm_clk_o                ),
+       .scl_pad_oen_o         (i2cm_clk_oen              ),
+
+       .sda_pad_i             (i2cm_data_i               ),
+       .sda_pad_o             (i2cm_data_o               ),
+       .sda_padoen_o          (i2cm_data_oen             ),
+
+       .uart_rxd              (uart_rxd                  ),
+       .uart_txd              (uart_txd                  ),
+
+       .usb_in_dp             (usb_dp_i                  ),
+       .usb_in_dn             (usb_dn_i                  ),
+
+       .usb_out_dp            (usb_dp_o                  ),
+       .usb_out_dn            (usb_dn_o                  ),
+       .usb_out_tx_oen        (usb_oen                   )
 
      );
 
-////////////////////////////////////////////////////////////////
-// Clock Skew adjust module
-// ///////////////////////////////////////////////////////////
 
-// Wishbone interconnect clock skew control
-clk_skew_adjust u_skew_wi
-       (
-`ifdef USE_POWER_PINS
-               .vccd1      (vccd1                      ),// User area 1 1.8V supply
-               .vssd1      (vssd1                      ),// User area 1 digital ground
-`endif
-	       .clk_in     (wbd_clk_int                 ), 
-	       .sel        (cfg_cska_wi                 ), 
-	       .clk_out    (wbd_clk_wi                  ) 
-       );
+pinmux u_pinmux(
+        // System Signals
+        // Inputs
+	.mclk                   (wbd_clk_int               ),
+        .h_reset_n              (wbd_int_rst_n             ),
 
-// riscv clock skew control
-clk_skew_adjust u_skew_riscv
-       (
-`ifdef USE_POWER_PINS
-               .vccd1      (vccd1                      ),// User area 1 1.8V supply
-               .vssd1      (vssd1                      ),// User area 1 digital ground
-`endif
-	       .clk_in     (wbd_clk_int                 ), 
-	       .sel        (cfg_cska_riscv              ), 
-	       .clk_out    (wbd_clk_riscv               ) 
-       );
+        // Reg Bus Interface Signal
+        .reg_cs                 (wbd_glbl_stb_o            ),
+        .reg_wr                 (wbd_glbl_we_o             ),
+        .reg_addr               (wbd_glbl_adr_o            ),
+        .reg_wdata              (wbd_glbl_dat_o            ),
+        .reg_be                 (wbd_glbl_sel_o            ),
 
-// uart clock skew control
-clk_skew_adjust u_skew_uart
-       (
-`ifdef USE_POWER_PINS
-               .vccd1      (vccd1                      ),// User area 1 1.8V supply
-               .vssd1      (vssd1                      ),// User area 1 digital ground
-`endif
-	       .clk_in     (wbd_clk_int                 ), 
-	       .sel        (cfg_cska_uart               ), 
-	       .clk_out    (wbd_clk_uart                ) 
-       );
+       // Outputs
+        .reg_rdata              (wbd_glbl_dat_i            ),
+        .reg_ack                (wbd_glbl_ack_i            ),
 
-// spi clock skew control
-clk_skew_adjust u_skew_spi
-       (
-`ifdef USE_POWER_PINS
-               .vccd1      (vccd1                      ),// User area 1 1.8V supply
-               .vssd1      (vssd1                      ),// User area 1 digital ground
-`endif
-	       .clk_in     (wbd_clk_int                ), 
-	       .sel        (cfg_cska_spi               ), 
-	       .clk_out    (wbd_clk_spi                ) 
-       );
 
-// sdram clock skew control
-clk_skew_adjust u_skew_sdram
-       (
-`ifdef USE_POWER_PINS
-               .vccd1      (vccd1                      ),// User area 1 1.8V supply
-               .vssd1      (vssd1                      ),// User area 1 digital ground
-`endif
-	       .clk_in     (wbd_clk_int                ), 
-	       .sel        (cfg_cska_sdram             ), 
-	       .clk_out    (wbd_clk_sdram              ) 
-       );
+       // Risc configuration
+        .fuse_mhartid           (fuse_mhartid              ),
+        .irq_lines              (irq_lines                 ),
+        .soft_irq               (soft_irq                  ),
+        .user_irq               (user_irq                  ),
 
-// global clock skew control
-clk_skew_adjust u_skew_glbl
-       (
-`ifdef USE_POWER_PINS
-               .vccd1      (vccd1                      ),// User area 1 1.8V supply
-               .vssd1      (vssd1                      ),// User area 1 digital ground
-`endif
-	       .clk_in     (wbd_clk_int               ), 
-	       .sel        (cfg_cska_glbl             ), 
-	       .clk_out    (wbd_clk_glbl              ) 
-       );
+       // Digital IO
+        .digital_io_out         (io_out                    ),
+        .digital_io_oen         (io_oeb                    ),
+        .digital_io_in          (io_in                     ),
 
-// wb_host clock skew control
-clk_skew_adjust u_skew_wh
-       (
-`ifdef USE_POWER_PINS
-               .vccd1      (vccd1                      ),// User area 1 1.8V supply
-               .vssd1      (vssd1                      ),// User area 1 digital ground
-`endif
-	       .clk_in     (wbd_clk_int               ), 
-	       .sel        (cfg_cska_wh               ), 
-	       .clk_out    (wbd_clk_wh                ) 
-       );
+       // SFLASH I/F
+        .sflash_sck             (sflash_sck                ),
+        .sflash_ss              (sflash_ss                 ),
+        .sflash_oen             (sflash_oen                ),
+        .sflash_do              (sflash_do                 ),
+        .sflash_di              (sflash_di                 ),
 
-// SDRAM clock out clock skew control
-clk_skew_adjust u_skew_sd_co
-       (
-`ifdef USE_POWER_PINS
-               .vccd1      (vccd1                      ),// User area 1 1.8V supply
-               .vssd1      (vssd1                      ),// User area 1 digital ground
-`endif
-	       .clk_in     (sdram_clk                 ), 
-	       .sel        (cfg_cska_sd_co            ), 
-	       .clk_out    (io_out[29]                ) 
-       );
+       // SSRAM I/F
+        .ssram_sck              (sflash_sck                ),
+        .ssram_ss               (sflash_ss                 ),
+        .ssram_oen              (sflash_oen                ),
+        .ssram_do               (                          ),
+        .ssram_di               (sflash_di                 ),
 
-// Clock Skey for PAD SDRAM clock
-clk_skew_adjust u_skew_sd_ci
-       (
-`ifdef USE_POWER_PINS
-               .vccd1      (vccd1                      ),// User area 1 1.8V supply
-               .vssd1      (vssd1                      ),// User area 1 digital ground
-`endif
-	       .clk_in     (io_in[29]                 ), 
-	       .sel        (cfg_cska_sd_ci            ), 
-	       .clk_out    (io_in_29_                 ) 
-       );
+       // USB I/F
+        .usb_dp_o               (usb_dp_o                  ),
+        .usb_dn_o               (usb_dn_o                  ),
+        .usb_oen                (usb_oen                   ),
+        .usb_dp_i               (usb_dp_i                  ),
+        .usb_dn_i               (usb_dn_i                  ),
 
-// Clock Skey for SPI clock out
-clk_skew_adjust u_skew_sp_co
-       (
+       // UART I/F
+        .uart_txd               (uart_txd                  ),
+        .uart_rxd               (uart_rxd                  ),
+
+       // I2CM I/F
+        .i2cm_clk_o             (i2cm_clk_o                ),
+        .i2cm_clk_i             (i2cm_clk_i                ),
+        .i2cm_clk_oen           (i2cm_clk_oen              ),
+        .i2cm_data_oen          (i2cm_data_oen             ),
+        .i2cm_data_o            (i2cm_data_o               ),
+        .i2cm_data_i            (i2cm_data_i               ),
+
+       // SPI MASTER
+        .spim_sck               (sflash_sck                ),
+        .spim_ss                (sflash_ss                 ),
+        .spim_miso              (                          ),
+        .spim_mosi              (sflash_di[0]              ),
+
+	.pulse1m_mclk           (pulse1m_mclk              ),
+
+	.pinmux_debug           (pinmux_debug              )
+   ); 
+
+sar_adc  u_adc (
 `ifdef USE_POWER_PINS
-               .vccd1      (vccd1                      ),// User area 1 1.8V supply
-               .vssd1      (vssd1                      ),// User area 1 digital ground
+        .vccd1 (vccd1),// User area 1 1.8V supply
+        .vssd1 (vssd1),// User area 1 digital ground
+        .vccd2 (vccd2),// User area 2 1.8V supply (analog)
+        .vssd2 (vssd2),// User area 2 ground      (analog)
 `endif
-	       .clk_in     (io_in_30_                 ), 
-	       .sel        (cfg_cska_sp_co            ), 
-	       .clk_out    (io_out[30]                ) 
-       );
+
+    
+        .clk           (wbd_clk_int),// The clock (digital)
+        .reset_n       (wbd_int_rst_n),// Active low reset (digital)
+
+    // Reg Bus Interface Signal
+        .reg_cs        (wbd_adc_stb_o   ),
+        .reg_wr        (wbd_adc_we_o    ),
+        .reg_addr      (wbd_adc_adr_o[7:0] ),
+        .reg_wdata     (wbd_adc_dat_o   ),
+        .reg_be        (wbd_adc_sel_o   ),
+
+    // Outputs
+        .reg_rdata     (wbd_adc_dat_i   ),
+        .reg_ack       (wbd_adc_ack_i   ),
+
+        .pulse1m_mclk  (pulse1m_mclk),
+
+
+	// DAC I/F
+        .sar2dac         (sar2dac       ), 
+        .analog_dac_out  (analog_dac_out) , 
+
+        // ADC Input 
+        .analog_din(analog_io[5:0])    // (Analog)
+
+);
+
+
+DAC_8BIT u_dac (
+     `ifdef USE_POWER_PINS
+        .vdd(vccd2),
+        .gnd(vssd2),
+    `endif 
+        .d0(sar2dac[0]),
+        .d1(sar2dac[1]),
+        .d2(sar2dac[2]),
+        .d3(sar2dac[3]),
+        .d4(sar2dac[4]),
+        .d5(sar2dac[5]),
+        .d6(sar2dac[6]),
+        .d7(sar2dac[7]),
+        .inp1(analog_io[6]),
+        .out_v(analog_dac_out)
+    );
+
+
+
 
 endmodule : user_project_wrapper
diff --git a/verilog/rtl/wb_interconnect/src/wb_interconnect.sv b/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
index 77a0163..05ed8f8 100644
--- a/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
+++ b/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
@@ -160,7 +160,7 @@
          // input	logic 	s3_wbd_err_i,
          output	logic [31:0]	s3_wbd_dat_o,
          output	logic [7:0]	s3_wbd_adr_o, 
-         output	logic    	s3_wbd_sel_o,
+         output	logic [3:0]   	s3_wbd_sel_o,
          output	logic 	        s3_wbd_we_o,
          output	logic 	        s3_wbd_cyc_o,
          output	logic 	        s3_wbd_stb_o
@@ -323,7 +323,7 @@
 
  assign  s3_wbd_dat_o =  s3_wb_wr.wbd_dat[31:0] ;
  assign  s3_wbd_adr_o =  s3_wb_wr.wbd_adr[7:0] ; // Global Reg Need 8 bit
- assign  s3_wbd_sel_o =  s3_wb_wr.wbd_sel[0] ;
+ assign  s3_wbd_sel_o =  s3_wb_wr.wbd_sel[3:0] ;
  assign  s3_wbd_we_o  =  s3_wb_wr.wbd_we  ;
  assign  s3_wbd_cyc_o =  s3_wb_wr.wbd_cyc ;
  assign  s3_wbd_stb_o =  s3_wb_wr.wbd_stb ;