From 7877739197f9e0216b796fbd4cc869e65653a9ac Mon Sep 17 00:00:00 2001
From: Daniel Newbrook <dwn1c21@soton.ac.uk>
Date: Fri, 4 Apr 2025 15:19:57 +0100
Subject: [PATCH] Add TSMC 16nm initial flow

---
 .gitignore                                    |   4 +
 .../28pin/Synopsys_FC/floorplan/floorplan.def |  13 +
 .../28pin/Synopsys_FC/floorplan/floorplan.tcl |  51 +++
 .../floorplan/floorplan_compare_data.txt      |  32 ++
 .../28pin/Synopsys_FC/floorplan/fp.tcl        | 103 ++++++
 .../28pin/Synopsys_FC/floorplan/mapfile       |   1 +
 .../28pin/Synopsys_FC/inputs/constraints.sdc  |  74 +++++
 .../28pin/Synopsys_FC/inputs/nanosoc.upf      |   0
 ASIC/TSMC16nm/28pin/Synopsys_FC/makefile      |  17 +
 .../Synopsys_FC/scripts/1_design_setup.tcl    |  35 ++
 .../28pin/Synopsys_FC/scripts/2_floorplan.tcl |  49 +++
 .../28pin/Synopsys_FC/scripts/3_synthesis.tcl |  26 ++
 .../28pin/Synopsys_FC/scripts/4_cts.tcl       |  23 ++
 .../28pin/Synopsys_FC/scripts/5_route.tcl     |   9 +
 .../scripts/synopsys_library_setup.tcl        |  96 ++++++
 ASIC/TSMC16nm/rom_via.spec                    |  37 +++
 ASIC/TSMC16nm/sram_32k.spec                   |  50 +++
 .../tsmc16fcll/nanosoc_chip_pads_28pin.v      | 307 ++++++++++++++++++
 flows/makefile.asic                           |   6 +
 makefile                                      |  12 +
 .../nanosoc_control/verilog/nanosoc_pin_mux.v |  74 ++---
 .../verilog/nanosoc_ss_systemctrl.v           |   6 +-
 nanosoc/synopsys_28nm_slm_integration         |   2 +-
 23 files changed, 986 insertions(+), 41 deletions(-)
 create mode 100644 ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/floorplan.def
 create mode 100644 ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/floorplan.tcl
 create mode 100644 ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/floorplan_compare_data.txt
 create mode 100644 ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/fp.tcl
 create mode 100644 ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/mapfile
 create mode 100644 ASIC/TSMC16nm/28pin/Synopsys_FC/inputs/constraints.sdc
 create mode 100644 ASIC/TSMC16nm/28pin/Synopsys_FC/inputs/nanosoc.upf
 create mode 100644 ASIC/TSMC16nm/28pin/Synopsys_FC/makefile
 create mode 100644 ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/1_design_setup.tcl
 create mode 100644 ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/2_floorplan.tcl
 create mode 100644 ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/3_synthesis.tcl
 create mode 100644 ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/4_cts.tcl
 create mode 100644 ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/5_route.tcl
 create mode 100644 ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/synopsys_library_setup.tcl
 create mode 100644 ASIC/TSMC16nm/rom_via.spec
 create mode 100644 ASIC/TSMC16nm/sram_32k.spec
 create mode 100644 ASIC/nanosoc_chip_pads/tsmc16fcll/nanosoc_chip_pads_28pin.v

diff --git a/.gitignore b/.gitignore
index 2675ddb..e023287 100644
--- a/.gitignore
+++ b/.gitignore
@@ -47,6 +47,10 @@ ASIC/*/*/Synopsys_FC/cln28ht_pmk
 ASIC/*/*/Synopsys_FC/cln28ht_ret
 ASIC/*/*/Synopsys_FC/io_lib
 ASIC/*/*/Synopsys_FC/legalizer_debug_plots
+
+ASIC/*/*/Synopsys_FC/libs
+ASIC/*/*/Synopsys_FC/work
+
 ASIC/Synopsys/Formality/FM_INFO/*
 ASIC/Synopsys/ICC2/CLIBs
 ASIC/Synopsys/ICC2/PreFrameCheck
diff --git a/ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/floorplan.def b/ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/floorplan.def
new file mode 100644
index 0000000..e60e8ea
--- /dev/null
+++ b/ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/floorplan.def
@@ -0,0 +1,13 @@
+# 
+# Fusion Compiler write_def
+# Release      : U-2022.12
+# User Name    : dwn1c21
+# Date         : Fri Apr  4 11:36:26 2025
+# 
+VERSION 5.8 ;
+DIVIDERCHAR "/" ;
+BUSBITCHARS "[]" ;
+DESIGN nanosoc_chip_pads ;
+UNITS DISTANCE MICRONS 1000 ;
+DIEAREA ( 0 0 ) ( 0 1020192 ) ( 1020384 1020192 ) ( 1020384 0 ) ;
+END DESIGN
diff --git a/ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/floorplan.tcl b/ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/floorplan.tcl
new file mode 100644
index 0000000..627ff42
--- /dev/null
+++ b/ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/floorplan.tcl
@@ -0,0 +1,51 @@
+################################################################################
+#
+# Created by fc write_floorplan on Fri Apr  4 11:36:26 2025
+#
+################################################################################
+
+set _dirName__0 [file dirname [file normalize [info script]]]
+
+source ${_dirName__0}/fp.tcl
+
+if { [get_attribute -name view_name [current_block]] == "design" } {
+  set __fp_crnt_design_name__ [get_attribute -name design_name [current_block]]
+  set __fp_crnt_label_name__ [get_attribute -name label_name [current_block]]
+  set __fp_crnt_lib_name__ [get_attribute -name lib_name [current_block]]
+  set __fp_crnt_lib_path__ [get_attribute -name source_file_name [current_lib]]
+  set __fp_crnt_abs_name__ ${__fp_crnt_lib_name__}:${__fp_crnt_design_name__}
+  set __fp_crnt_abs_path__ ${__fp_crnt_lib_path__}/${__fp_crnt_design_name__}
+  if { [string length ${__fp_crnt_label_name__} ] != 0 } {
+    set __fp_crnt_abs_name__ ${__fp_crnt_abs_name__}/${__fp_crnt_label_name__}.abstract
+    set __fp_crnt_abs_path__ ${__fp_crnt_abs_path__}/design_label.${__fp_crnt_label_name__}/abs
+  } else {
+    set __fp_crnt_abs_name__ ${__fp_crnt_abs_name__}.abstract
+    set __fp_crnt_abs_path__ ${__fp_crnt_abs_path__}/abs
+  }
+  if { [sizeof_collection [get_blocks -quiet ${__fp_crnt_abs_name__}]] != 0} {
+      if { [get_attribute -name has_editable_abstract [current_block]] } {
+          echo "Design [get_attribute -name full_name [current_block]] has editable abstract view. Re-creating the abstract view after floorplan loading..."
+          set __fp_crnt_abs_type__ [get_attribute -quiet -name abstract_view_type [current_block]]
+          if { [string length ${__fp_crnt_abs_type__} ] == 0 } {
+              if { [file exists "${__fp_crnt_abs_path__}/abs.mc"] } {
+                  echo "re-create timing abstract view for design [get_attribute -name full_name [current_block]]"
+                  create_abstract
+                  save_lib -all
+              } else {
+                  echo "re-create placement abstract view for design [get_attribute -name full_name [current_block]]"
+                  create_abstract -placement
+                  save_lib -all
+              }
+          } elseif { ${__fp_crnt_abs_type__} == "placement" } {
+              echo "re-create placement abstract view for design [get_attribute -name full_name [current_block]]"
+              create_abstract -placement
+              save_lib -all
+          } else {
+              echo "re-create timing abstract view for design [get_attribute -name full_name [current_block]]"
+              create_abstract
+              save_lib -all
+          }
+      }
+  }
+}
+
diff --git a/ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/floorplan_compare_data.txt b/ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/floorplan_compare_data.txt
new file mode 100644
index 0000000..711bb4e
--- /dev/null
+++ b/ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/floorplan_compare_data.txt
@@ -0,0 +1,32 @@
+################################################################################
+#
+# Created by fc compare_floorplans on Fri Apr  4 11:36:26 2025
+#
+# DO NOT EDIT - automatically generated file
+#
+################################################################################
+
+START nanosoc_chip_pads
+ MACROS
+  u_nanosoc_chip/u_system/u_ss_cpu/u_region_bootrom_0/u_bootrom_cpu_0/u_bootrom/u_sl_rom { {99.9840 849.3600} {117.7140 920.2080} }
+  u_nanosoc_chip/u_system/u_ss_cpu/u_region_imem_0/u_imem_0/u_sram/genblk1.u_sram { {703.0950 472.8000} {920.4000 621.9360} }
+  u_nanosoc_chip/u_system/u_ss_cpu/u_region_dmem_0/u_dmem_0/u_sram/genblk1.u_sram { {703.0950 323.6640} {920.4000 472.8000} }
+  u_nanosoc_chip/u_system/u_ss_expansion/u_region_expram_l/u_expram_l/u_sram/genblk1.u_sram { {703.0950 771.0720} {920.4000 920.2080} }
+  u_nanosoc_chip/u_system/u_ss_expansion/u_region_expram_h/u_expram_h/u_sram/genblk1.u_sram { {703.0950 621.9360} {920.4000 771.0720} }
+ PINS
+  VDDIO { {510.1920 510.0960} {510.1921 510.0961} }
+  VDDACC { {510.1920 510.0960} {510.1921 510.0961} }
+  CLK { {-16.5300 17.1090} {-8.4300 26.1090} }
+  TEST { {-16.5300 17.1090} {-8.4300 26.1090} }
+  NRST { {-16.5300 17.1090} {-8.4300 26.1090} }
+  P0[3] { {-16.5300 17.1090} {-8.4300 26.1090} }
+  P0[2] { {-16.5300 17.1090} {-8.4300 26.1090} }
+  P0[1] { {-16.5300 17.1090} {-8.4300 26.1090} }
+  P0[0] { {-16.5300 17.1090} {-8.4300 26.1090} }
+  P1[3] { {-16.5300 17.1090} {-8.4300 26.1090} }
+  P1[2] { {-16.5300 17.1090} {-8.4300 26.1090} }
+  P1[1] { {-16.5300 17.1090} {-8.4300 26.1090} }
+  P1[0] { {-16.5300 17.1090} {-8.4300 26.1090} }
+  SWDIO { {-16.5300 17.1090} {-8.4300 26.1090} }
+  SWDCK { {-16.5300 17.1090} {-8.4300 26.1090} }
+END nanosoc_chip_pads
diff --git a/ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/fp.tcl b/ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/fp.tcl
new file mode 100644
index 0000000..e383664
--- /dev/null
+++ b/ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/fp.tcl
@@ -0,0 +1,103 @@
+################################################################################
+#
+# Created by fc write_floorplan on Fri Apr  4 11:36:26 2025
+#
+################################################################################
+
+
+set _dirName__0 [file dirname [file normalize [info script]]]
+
+################################################################################
+# Read DEF
+################################################################################
+
+read_def  ${_dirName__0}/floorplan.def
+
+################################################################################
+# Macros
+################################################################################
+
+set cellInst [get_cells { \
+    u_nanosoc_chip/u_system/u_ss_cpu/u_region_bootrom_0/u_bootrom_cpu_0/u_bootrom/u_sl_rom \
+    }]
+set_attribute -quiet -objects $cellInst -name orientation -value R180
+set_attribute -quiet -objects $cellInst -name origin -value { 117.7140 920.2080 \
+    }
+set_attribute -quiet -objects $cellInst -name status -value placed
+
+set cellInst [get_cells { \
+    u_nanosoc_chip/u_system/u_ss_cpu/u_region_imem_0/u_imem_0/u_sram/genblk1.u_sram \
+    }]
+set_attribute -quiet -objects $cellInst -name orientation -value R0
+set_attribute -quiet -objects $cellInst -name origin -value { 703.0950 472.8000 \
+    }
+set_attribute -quiet -objects $cellInst -name status -value placed
+
+set cellInst [get_cells { \
+    u_nanosoc_chip/u_system/u_ss_cpu/u_region_dmem_0/u_dmem_0/u_sram/genblk1.u_sram \
+    }]
+set_attribute -quiet -objects $cellInst -name orientation -value R0
+set_attribute -quiet -objects $cellInst -name origin -value { 703.0950 323.6640 \
+    }
+set_attribute -quiet -objects $cellInst -name status -value placed
+
+set cellInst [get_cells { \
+    u_nanosoc_chip/u_system/u_ss_expansion/u_region_expram_l/u_expram_l/u_sram/genblk1.u_sram \
+    }]
+set_attribute -quiet -objects $cellInst -name orientation -value R0
+set_attribute -quiet -objects $cellInst -name origin -value { 703.0950 771.0720 \
+    }
+set_attribute -quiet -objects $cellInst -name status -value placed
+
+set cellInst [get_cells { \
+    u_nanosoc_chip/u_system/u_ss_expansion/u_region_expram_h/u_expram_h/u_sram/genblk1.u_sram \
+    }]
+set_attribute -quiet -objects $cellInst -name orientation -value R0
+set_attribute -quiet -objects $cellInst -name origin -value { 703.0950 621.9360 \
+    }
+set_attribute -quiet -objects $cellInst -name status -value placed
+
+
+################################################################################
+# User attributes of macros
+################################################################################
+
+
+################################################################################
+# Module Boundaries
+################################################################################
+
+set hbCells [get_cells -quiet -filter hierarchy_type==boundary -hierarchical]
+if [sizeof_collection $hbCells] {
+   set_cell_hierarchy_type -type normal $hbCells
+}
+
+
+################################################################################
+# I/O guides
+################################################################################
+
+remove_io_guides -all
+
+create_io_guide -name _default_io_ring1.left -side left -line { {0.0000 \
+    74.4960} 871.2000 } -offset {0.0000 0.0000}
+create_io_guide -name _default_io_ring1.bottom -side bottom -line { {945.8880 \
+    0.0000} 871.3920 } -offset {0.0000 0.0000}
+create_io_guide -name _default_io_ring1.right -side right -line { {1020.3840 \
+    945.6960} 871.2000 } -offset {0.0000 0.0000}
+create_io_guide -name _default_io_ring1.top -side top -line { {74.4960 \
+    1020.1920} 871.3920 } -offset {0.0000 0.0000}
+
+################################################################################
+# User attributes of I/O guides
+################################################################################
+
+
+################################################################################
+# User attributes of current block
+################################################################################
+
+define_user_attribute -classes design -type string LEF58_EDGETYPE
+define_user_attribute -classes design -type double ioCellOffsetX
+define_user_attribute -classes design -type double ioCellOffsetY
+
diff --git a/ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/mapfile b/ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/mapfile
new file mode 100644
index 0000000..1af7533
--- /dev/null
+++ b/ASIC/TSMC16nm/28pin/Synopsys_FC/floorplan/mapfile
@@ -0,0 +1 @@
+nanosoc_chip_pads FLOORPLAN fp.tcl
diff --git a/ASIC/TSMC16nm/28pin/Synopsys_FC/inputs/constraints.sdc b/ASIC/TSMC16nm/28pin/Synopsys_FC/inputs/constraints.sdc
new file mode 100644
index 0000000..d3d9823
--- /dev/null
+++ b/ASIC/TSMC16nm/28pin/Synopsys_FC/inputs/constraints.sdc
@@ -0,0 +1,74 @@
+#-----------------------------------------------------------------------------
+# NanoSoC Constraints for Synthesis 
+# A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+#
+# Contributors
+#
+# Daniel Newbrook (d.newbrook@soton.ac.uk)
+#
+# Copyright (C) 2021-3, SoC Labs (www.soclabs.org)
+#-----------------------------------------------------------------------------
+
+#### CLOCK DEFINITION
+
+set EXTCLK "clk";
+set SWDCLK "swdclk";
+set_units -capacitance pF;
+set_units -power mW;
+set EXTCLK_PERIOD 4166.67;
+set SWDCLK_PERIOD [expr 4*$EXTCLK_PERIOD];
+set CLK_ERROR 350; #Error calculated from worst case characteristics of CDCM61001 low-jitter oscillator chip at 250MHz
+set INTER_CLOCK_UNCERTAINTY 100
+
+### Power constraints
+set_max_dynamic_power 20
+set_max_leakage_power 0.1
+
+create_clock -name "$EXTCLK" -period "$EXTCLK_PERIOD" -waveform "0 [expr $EXTCLK_PERIOD/2]" [get_ports CLK]
+create_clock -name "$SWDCLK" -period "$SWDCLK_PERIOD" -waveform "0 [expr $SWDCLK_PERIOD/2]" [get_ports SWDCK]
+
+set_clock_uncertainty $CLK_ERROR [get_clocks $EXTCLK]
+set_clock_uncertainty $CLK_ERROR [get_clocks $SWDCLK]
+
+set_clock_uncertainty -setup $INTER_CLOCK_UNCERTAINTY -rise_from [get_clocks $SWDCLK] -rise_to [get_clocks $EXTCLK]
+set_clock_uncertainty -setup $INTER_CLOCK_UNCERTAINTY -rise_from [get_clocks $EXTCLK] -rise_to [get_clocks $SWDCLK]
+
+### Multicycle path through asynchronous clock domains
+set_multicycle_path 2 -setup -end -from SWDCK -to CLK
+set_multicycle_path 1 -hold -end -from SWDCK -to CLK
+set_multicycle_path 2 -setup -end -from CLK -to SWDCK
+set_multicycle_path 1 -hold -end -from CLK -to SWDCK
+
+set_false_path -hold -from CLK -to SWDCK
+
+### Multicycle path through pads
+set_false_path -through uPAD_SWDIO_IO
+set_multicycle_path 2 -through uPAD_SWDIO_IO
+#set_false_path -through uPAD_P0_*
+#set_false_path -through uPAD_P1_*
+
+set_multicycle_path 2 -from uPAD_SWDIO_IO/I -to uPAD_SWDIO_IO/C 
+set_multicycle_path 2 -from uPAD_SWDIO_IO/IE -to uPAD_SWDIO_IO/C 
+set_multicycle_path 2 -from uPAD_SWDIO_IO/DS -to uPAD_SWDIO_IO/C
+set_multicycle_path 2 -from uPAD_SWDIO_IO/OEN -to uPAD_SWDIO_IO/C 
+
+set_multicycle_path 2 -from uPAD_P0_*/I -to uPAD_P0_*/C
+set_multicycle_path 2 -from uPAD_P0_*/IE -to uPAD_P0_*/C
+set_multicycle_path 2 -from uPAD_P0_*/DS -to uPAD_P0_*/C
+set_multicycle_path 2 -from uPAD_P0_*/OEN -to uPAD_P0_*/C
+
+set_multicycle_path 2 -from uPAD_P1_*/I -to uPAD_P1_*/C
+set_multicycle_path 2 -from uPAD_P1_*/IE -to uPAD_P1_*/C
+set_multicycle_path 2 -from uPAD_P1_*/DS -to uPAD_P1_*/C
+set_multicycle_path 2 -from uPAD_P1_*/OEN -to uPAD_P1_*/C
+
+#### DELAY DEFINITION
+
+set_input_delay -clock [get_clocks $EXTCLK] -add_delay 100 [get_ports NRST]
+set_input_delay -clock [get_clocks $EXTCLK] -add_delay 100 [get_ports TEST]
+set_input_delay -clock [get_clocks $EXTCLK] -add_delay 100 [get_ports P0]
+set_input_delay -clock [get_clocks $EXTCLK] -add_delay 100 [get_ports P1]
+set_input_delay -clock [get_clocks $SWDCLK] -add_delay 200 [get_ports SWDIO]
+
+set_max_capacitance 3 [all_outputs]
+set_max_fanout 10 [all_inputs]
diff --git a/ASIC/TSMC16nm/28pin/Synopsys_FC/inputs/nanosoc.upf b/ASIC/TSMC16nm/28pin/Synopsys_FC/inputs/nanosoc.upf
new file mode 100644
index 0000000..e69de29
diff --git a/ASIC/TSMC16nm/28pin/Synopsys_FC/makefile b/ASIC/TSMC16nm/28pin/Synopsys_FC/makefile
new file mode 100644
index 0000000..64941d5
--- /dev/null
+++ b/ASIC/TSMC16nm/28pin/Synopsys_FC/makefile
@@ -0,0 +1,17 @@
+LIB_DIR	:= ./libs
+WORK_DIR := ./work
+REPORTS_DIR :=  $(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/reports
+LOG_DIR := $(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/logs
+
+
+gen_fusion_libs:
+	@mkdir -p $(LIB_DIR)
+	@(cd $(LIB_DIR); \
+	lc_shell;)
+
+fusion_design_setup:
+	@mkdir -p $(REPORTS_DIR)
+	@mkdir -p $(LOG_DIR)
+	@mkdir -p $(WORK_DIR)
+	@(cd $(WORK_DIR); \
+	fc_shell -f ../scripts/1_design_setup.tcl;)
diff --git a/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/1_design_setup.tcl b/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/1_design_setup.tcl
new file mode 100644
index 0000000..4aa2ce2
--- /dev/null
+++ b/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/1_design_setup.tcl
@@ -0,0 +1,35 @@
+# Import verilog and setup libraries
+
+set_host_options -max_cores 8 -num_processes 8
+
+# Set paths !!! Please edit for your system !!!
+set cln16fcll_tech_path /research/AAA/phys_ip_library/arm/tsmc/cln16fcll001/arm_tech/r3p0
+
+set cln16fcll_tech_file $cln16fcll_tech_path/ndm/9m_2xa1xd3xe2z_utrdl/sc9mcpp96c_tech.tf
+set TLU_dir             $cln16fcll_tech_path/synopsys_tluplus/9m_2xa1xd3xe2z_utrdl
+
+set TLU_cbest $TLU_dir/cbest.tluplus
+set TLU_cworst $TLU_dir/cworst.tluplus
+set TLU_rcbest $TLU_dir/rcbest.tluplus
+set TLU_rcworst $TLU_dir/rcworst.tluplus
+set TLU_map $TLU_dir/tluplus.map
+
+#Create the design library 
+create_lib nanosoc_chip_pads.dlib \
+    -technology $cln16fcll_tech_file \
+    -ref_libs {../libs/cln16fcll ../libs/arm_io_lib ../libs/SRAM_32K ../libs/ROM_VIA}
+
+
+# Read in the verilog for
+source $env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/flist/dc_flist.tcl
+analyze -format verilog $env(SOCLABS_PROJECT_DIR)/nanosoc_tech/ASIC/nanosoc_chip_pads/tsmc16fcll/nanosoc_chip_pads_28pin.v
+
+elaborate nanosoc_chip_pads
+set_top_module nanosoc_chip_pads
+
+read_parasitic_tech -name cbest   -tlup $TLU_cbest -layermap $TLU_map 
+read_parasitic_tech -name cworst  -tlup $TLU_cworst -layermap $TLU_map 
+read_parasitic_tech -name rcbest  -tlup $TLU_rcbest -layermap $TLU_map 
+read_parasitic_tech -name rcworst -tlup $TLU_rcworst -layermap $TLU_map 
+
+save_lib nanosoc_chip_pads.dlib
diff --git a/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/2_floorplan.tcl b/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/2_floorplan.tcl
new file mode 100644
index 0000000..30265a3
--- /dev/null
+++ b/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/2_floorplan.tcl
@@ -0,0 +1,49 @@
+set_host_options -max_cores 8 -num_processes 8
+
+open_lib nanosoc_chip_pads.dlib
+open_block nanosoc_chip_pads
+
+initialize_floorplan -control_type die -use_site_row -side_length {1020.384 1020.384} -core_offset 99.984
+source ../floorplan/floorplan.tcl
+
+create_io_ring -corner_height 74.496
+
+#source ./io_plan.tcl
+
+read_sdc ../inputs/constraints.sdc
+
+load_upf ../inputs/nanosoc.upf
+
+#source ./power_plan.tcl 
+connect_pg_net -create_nets_only
+connect_pg_net -automatic
+
+create_pg_ring_pattern ring_pattern -nets {VDD VSS} -horizontal_layer M8 -vertical_layer M9 -horizontal_width {5} -vertical_width {5} -horizontal_spacing {2} -vertical_spacing {2}
+set_pg_strategy core_ring -pattern {{name: ring_pattern} {nets: {VDD VSS}} {offset: {3 3}}} -core 
+compile_pg -strategies core_ring -ignore_drc
+
+create_pg_mesh_pattern mesh_pattern -layers {{{vertical_layer: M5} {width: 4} {pitch: 30.566} {offset: 21.5}} {{horizontal_layer: M6} {width: 4} {pitch: 30} {offset: 20}}} -via_rule {{intersection : all}}                                                
+set_pg_strategy M5M6_mesh -core -pattern {{name: mesh_pattern} {nets: {VDD VSS}}} \
+        -extension {{stop : first_target}}
+compile_pg -strategies M5M6_mesh -ignore_drc
+
+create_pg_std_cell_conn_pattern std_pattern -layers {M2} -check_std_cell_drc false -mark_as_follow_pin false -rail_width {0.14 0.14}
+set_pg_strategy std_cell_strat -pattern {{name: std_pattern} {nets: {VDD VSS}}} -core
+compile_pg -strategies std_cell_strat -ignore_drc
+
+place_io 
+create_cell {CORNER1 CORNER2 CORNER3 CORNER4} /home/dwn1c21/SoC-Labs/TAPEOUT/nov2025/accelerator-project/nanosoc_tech/ASIC/TSMC16nm/28pin/Synopsys_FC/libs/arm_io_lib:PCORNER_18_18_NT_DR.timing
+
+# source ./init_placement.tcl
+source /research/AAA/phys_ip_library/arm/tsmc/cln16fcll001/arm_tech/r3p0/ndm/9m_2xa1xd3xe2z_utrdl/antenna_rules.tcl
+source /research/AAA/phys_ip_library/arm/tsmc/cln16fcll001/arm_tech/r3p0/ndm/9m_2xa1xd3xe2z_utrdl/icc2_route_options.tcl
+source /research/AAA/phys_ip_library/arm/tsmc/cln16fcll001/arm_tech/r3p0/ndm/9m_2xa1xd3xe2z_utrdl/icc2_rvi_mapping.tcl
+source /research/AAA/phys_ip_library/arm/tsmc/cln16fcll001/arm_tech/r3p0/ndm/9m_2xa1xd3xe2z_utrdl/sc9mcpp96c_icc2_route_options.tcl
+source /research/AAA/phys_ip_library/arm/tsmc/cln16fcll001/arm_tech/r3p0/ndm/9m_2xa1xd3xe2z_utrdl/sc9mcpp96c_icc2_routing_tracks.tcl
+
+set_voltage -min 0.88 -corners default -object_list [get_supply_nets {VDD}] 0.72
+set_voltage -min 0.0 -corners default -object_list [get_supply_nets {VSS}] 0.0
+
+save_block
+save_lib nanosoc_chip_pads.dlib
+close_lib nanosoc_chip_pads.dlib
diff --git a/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/3_synthesis.tcl b/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/3_synthesis.tcl
new file mode 100644
index 0000000..c271da1
--- /dev/null
+++ b/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/3_synthesis.tcl
@@ -0,0 +1,26 @@
+set_host_options -max_cores 16 -num_processes 16
+set REPORT_DIR $env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/reports
+set LOG_DIR $env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/logs
+
+current_corner default
+set_parasitic_parameters -early_spec rcbest -early_temperature -40 -late_spec rcworst -late_temperature 125 -library nanosoc_chip_pads.dlib
+set_operating_conditions -max_library cln16fcll -max ffgnp_cbestccbestt_min_0p88v_m40c -min_library cln16fcll -min ssgnp_cworstccworstt_max_0p72v_125c
+set_process_number -early 1 -late 1 -corners default
+set_temperature -min -40 -corners default 125
+set_voltage 0.72 -min 0.88 -corners default
+
+
+# Compile fusion takes about 6.5 hrs to run
+compile_fusion 
+save_lib nanosoc_chip_pads.dlib
+
+redirect -tee -file $REPORT_DIR/timing_03a_compile_fusion_max.rep {report_timing -delay_type max}
+redirect -tee -file $REPORT_DIR/timing_03a_compile_fusion_min.rep {report_timing -delay_type min}
+
+place_opt 
+
+redirect -tee -file $REPORT_DIR/timing_03b_place_opt_max.rep {report_timing -delay_type max}
+redirect -tee -file $REPORT_DIR/timing_03b_place_opt_min.rep {report_timing -delay_type min}
+
+
+save_lib nanosoc_chip_pads.dlib
diff --git a/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/4_cts.tcl b/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/4_cts.tcl
new file mode 100644
index 0000000..68f1d35
--- /dev/null
+++ b/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/4_cts.tcl
@@ -0,0 +1,23 @@
+set_host_options -max_cores 16 -num_processes 16
+set REPORT_DIR $env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/reports
+set LOG_DIR $env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/logs
+
+
+synthesize_clock_trees 
+check_clock_trees
+
+report_timing
+
+redirect -tee -file $REPORT_DIR/timing_04a_CTS_max.rep {report_timing -delay_type max}
+redirect -tee -file $REPORT_DIR/timing_04a_CTS_min.rep {report_timing -delay_type min}
+
+save_lib nanosoc_chip_pads.dlib
+
+clock_opt
+
+report_timing
+
+redirect -tee -file $REPORT_DIR/timing_04b_Clockopt_max.rep {report_timing -delay_type max}
+redirect -tee -file $REPORT_DIR/timing_04b_Clockopt_min.rep {report_timing -delay_type min}
+
+save_lib nanosoc_chip_pads.dlib
diff --git a/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/5_route.tcl b/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/5_route.tcl
new file mode 100644
index 0000000..54c32e0
--- /dev/null
+++ b/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/5_route.tcl
@@ -0,0 +1,9 @@
+set_host_options -max_cores 16 -num_processes 16
+set REPORT_DIR $env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/reports
+set LOG_DIR $env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/logs
+
+
+route_auto
+
+redirect -tee -file $REPORT_DIR/timing_05_route_auto_max.rep {report_timing -delay_type max}
+redirect -tee -file $REPORT_DIR/timing_05_route_auto_min.rep {report_timing -delay_type min}
diff --git a/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/synopsys_library_setup.tcl b/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/synopsys_library_setup.tcl
new file mode 100644
index 0000000..cd06c28
--- /dev/null
+++ b/ASIC/TSMC16nm/28pin/Synopsys_FC/scripts/synopsys_library_setup.tcl
@@ -0,0 +1,96 @@
+## Paths Please Edit for your system
+set cln16fcll_tech_path         /research/AAA/phys_ip_library/arm/tsmc/cln16fcll001/arm_tech/r3p0
+set standard_cell_base_path     /research/AAA/phys_ip_library/arm/tsmc/cln16fcll001/sc9mcpp96c_base_svt_c24/r2p0
+set arm_io_base_path            /research/AAA/phys_ip_library/arm/tsmc/cln16fcll001/io_gppr_t18_mv08_fs18_rvt_dr/r1p3
+set pmk_base_path               /research/AAA/phys_ip_library/arm/tsmc/cln16fcll001/sc9mcpp96c_pmk_svt_c24/r2p0
+set ret_base_path               /research/AAA/phys_ip_library/arm/tsmc/cln16fcll001/sc9mcpp96c_rklo_lvt_svt_c20_c24/r1p0
+
+# Technology files
+set cln16fcll_tech_file                       $cln16fcll_tech_path/ndm/9m_2xa1xd3xe2z_utrdl/sc9mcpp96c_tech.tf
+set cln16fcll_lef_file                        $cln16fcll_tech_path/lef/9m_2xa1xd3xe2z_utrdl/sc9mcpp96c_tech.lef
+
+# Standard Cell libraries
+set standard_cell_lef_file                  $standard_cell_base_path/lef/sc9mcpp96c_cln16fcll001_base_svt_c24.lef
+set standard_cell_gds_file                  $standard_cell_base_path/gds2/sc9mcpp96c_cln16fcll001_base_svt_c24.gds2
+set standard_cell_db_file_ss_0p72v_125C     $standard_cell_base_path/db/sc9mcpp96c_cln16fcll001_base_svt_c24_ssgnp_cworstccworstt_max_0p72v_125c.db
+set standard_cell_db_file_tt_0p80v_25C      $standard_cell_base_path/db/sc9mcpp96c_cln16fcll001_base_svt_c24_tt_typical_max_0p80v_25c.db
+set standard_cell_db_file_ff_0p88v_m40C     $standard_cell_base_path/db/sc9mcpp96c_cln16fcll001_base_svt_c24_ffgnp_cbestccbestt_min_0p88v_m40c.db
+set standard_cell_antenna_file              $standard_cell_base_path/milkyway/9m_2xa1xd3xe2z_utrdl/sc9mcpp96c_cln16fcll001_base_svt_c24_antenna.clf
+
+# Arm IO Library
+set arm_io_lef_file                         $arm_io_base_path/lef/io_gppr_cln16fcll001_t18_mv08_fs18_rvt_dr_9m_2xa1xd3xe2z_fc.lef
+set arm_io_gds_file                         $arm_io_base_path/gds2/io_gppr_cln16fcll001_t18_mv08_fs18_rvt_dr_9m_2xa1xd3xe2z_fc.gds2
+set arm_io_db_file_ss_0p72v_125C            $arm_io_base_path/db/io_gppr_cln16fcll001_t18_mv08_fs18_rvt_dr_ssgnp_cworstccworstt_0p72v_1p62v_125c.db
+set arm_io_db_file_tt_0p80v_25C             $arm_io_base_path/db/io_gppr_cln16fcll001_t18_mv08_fs18_rvt_dr_tt_typical_0p80v_1p80v_25c.db
+set arm_io_db_file_ff_0p88v_m40C            $arm_io_base_path/db/io_gppr_cln16fcll001_t18_mv08_fs18_rvt_dr_ffgnp_cbestccbestt_0p88v_1p98v_m40c.db
+set arm_io_antenna_file                     $arm_io_base_path/milkyway/9m_2xa1xd3xe2z_fc/io_gppr_cln16fcll001_t18_mv08_fs18_rvt_dr_antenna.clf
+
+# 32K SRAM PATHS
+set SRAM_32K_PATH            $env(SOCLABS_PROJECT_DIR)/memories/sram_32k
+set SRAM_32K_lef_file        $SRAM_32K_PATH/sram_32k.lef
+set SRAM_32K_gds_file        $SRAM_32K_PATH/sram_32k.gds2
+set SRAM_32K_lib_file_ss     $SRAM_32K_PATH/sram_32k_ssgnp_0p72v_0p72v_125c.lib
+set SRAM_32K_lib_file_tt     $SRAM_32K_PATH/sram_32k_tt_0p80v_0p80v_25c.lib
+set SRAM_32K_lib_file_ff     $SRAM_32K_PATH/sram_32k_ffgnp_0p88v_0p88v_m40c.lib
+set SRAM_32K_db_file_ss      $SRAM_32K_PATH/sram_32k_ssgnp_0p72v_0p72v_125c.db
+set SRAM_32K_db_file_tt      $SRAM_32K_PATH/sram_32k_tt_0p80v_0p80v_25c.db
+set SRAM_32K_db_file_ff      $SRAM_32K_PATH/sram_32k_ffgnp_0p88v_0p88v_m40c.db
+
+# ROM PATHS
+set ROM_VIA_PATH            $env(SOCLABS_PROJECT_DIR)/memories/bootrom
+set ROM_VIA_lef_file        $ROM_VIA_PATH/rom_via.lef
+set ROM_VIA_gds_file        $ROM_VIA_PATH/rom_via.gds2
+set ROM_VIA_lib_file_ss     $ROM_VIA_PATH/rom_via_ssgnp_0p72v_0p72v_125c.lib
+set ROM_VIA_lib_file_tt     $ROM_VIA_PATH/rom_via_tt_0p80v_0p80v_25c.lib
+set ROM_VIA_lib_file_ff     $ROM_VIA_PATH/rom_via_ffgnp_0p88v_0p88v_m40c.lib
+set ROM_VIA_db_file_ss      $ROM_VIA_PATH/rom_via_ssgnp_0p72v_0p72v_125c.db
+set ROM_VIA_db_file_tt      $ROM_VIA_PATH/rom_via_tt_0p80v_0p80v_25c.db
+set ROM_VIA_db_file_ff      $ROM_VIA_PATH/rom_via_ffgnp_0p88v_0p88v_m40c.db
+
+# 32K SRAMs
+read_lib $SRAM_32K_lib_file_ss
+write_lib -output $SRAM_32K_db_file_ss -format db sram_32k_ssgnp_0p72v_0p72v_125c
+close_lib -all
+
+read_lib $SRAM_32K_lib_file_tt 
+write_lib -output $SRAM_32K_db_file_tt -format db sram_32k_tt_0p80v_0p80v_25c
+close_lib -all
+
+read_lib $SRAM_32K_lib_file_ff 
+write_lib -output $SRAM_32K_db_file_ff -format db sram_32k_ffgnp_0p88v_0p88v_m40c
+close_lib -all
+
+create_fusion_lib -dbs [list $SRAM_32K_db_file_ss $SRAM_32K_db_file_tt $SRAM_32K_db_file_ff] -lefs $SRAM_32K_lef_file -technology $cln16fcll_tech_file SRAM_32K
+save_fusion_lib SRAM_32K
+close_fusion_lib SRAM_32K
+
+# ROM VIA 
+read_lib $ROM_VIA_lib_file_ss
+write_lib -output $ROM_VIA_db_file_ss -format db rom_via_ssgnp_0p72v_0p72v_125c
+close_lib -all
+
+read_lib $ROM_VIA_lib_file_tt 
+write_lib -output $ROM_VIA_db_file_tt -format db rom_via_tt_0p80v_0p80v_25c
+close_lib -all
+
+read_lib $ROM_VIA_lib_file_ff 
+write_lib -output $ROM_VIA_db_file_ff -format db rom_via_ffgnp_0p88v_0p88v_m40c
+close_lib -all
+
+create_fusion_lib -dbs [list $ROM_VIA_db_file_ss $ROM_VIA_db_file_tt $ROM_VIA_db_file_ff] -lefs $ROM_VIA_lef_file -technology $cln16fcll_tech_file ROM_VIA
+save_fusion_lib ROM_VIA
+close_fusion_lib ROM_VIA
+
+
+
+# Create standard cell fusion library
+create_fusion_lib -dbs [list $standard_cell_db_file_ss_0p72v_125C $standard_cell_db_file_tt_0p80v_25C $standard_cell_db_file_ff_0p88v_m40C]  -lefs [list $cln16fcll_lef_file $standard_cell_lef_file] -technology $cln16fcll_tech_file cln16fcll
+save_fusion_lib cln16fcll
+close_fusion_lib cln16fcll
+
+# Create Arm IO Library 
+create_fusion_lib -dbs [list $arm_io_db_file_ss_0p72v_125C $arm_io_db_file_tt_0p80v_25C $arm_io_db_file_ff_0p88v_m40C]  -lefs [list $cln16fcll_lef_file $arm_io_lef_file] -technology $cln16fcll_tech_file arm_io_lib
+save_fusion_lib arm_io_lib
+close_fusion_lib arm_io_lib
+
+exit
\ No newline at end of file
diff --git a/ASIC/TSMC16nm/rom_via.spec b/ASIC/TSMC16nm/rom_via.spec
new file mode 100644
index 0000000..a7d1046
--- /dev/null
+++ b/ASIC/TSMC16nm/rom_via.spec
@@ -0,0 +1,37 @@
+# user spec file, compiler rom_via_hdd_lvt_mvt, version r1p1
+
+EOL_guardband = 0
+activity_factor = 10
+back_biasing = off
+bits = 32
+bmux = on
+bus_notation = on
+check_instname = on
+code_file = bootrom.rcf
+corners = ffgnp_0p88v_0p88v_125c,ffgnp_0p88v_0p88v_m40c,ssgnp_0p72v_0p72v_125c,ssgnp_0p72v_0p72v_m40c,tt_0p80v_0p80v_25c,tt_0p80v_0p80v_85c
+cust_comment = 
+diodes = on
+drive = 6
+ema = on
+fci_type = not_fci
+frequency = 500
+instname = rom_via
+irem_gds2_by_phyvtools = 0
+left_bus_delim = [
+libertyviewstyle = nldm
+libname = rom_via
+metal_stack = 2Xa1Xd
+mode = addr
+mux = 8
+mvt = LP
+name_case = upper
+pipeline = off
+power_gating = on
+power_type = otc
+prefix = 
+pwr_gnd_rename = vdde:VDDE,vsse:VSSE
+right_bus_delim = ]
+rows_p_bl = 128
+site_def = on
+top_layer = m5-m10
+words = 256
diff --git a/ASIC/TSMC16nm/sram_32k.spec b/ASIC/TSMC16nm/sram_32k.spec
new file mode 100644
index 0000000..7bb01b3
--- /dev/null
+++ b/ASIC/TSMC16nm/sram_32k.spec
@@ -0,0 +1,50 @@
+# user spec file, compiler sram_sp_hde_svt_mvt, version r4p1
+
+EOL_guardband = 0
+PG_PINS_domain = VDDPE
+activity_factor = 10
+atf = off
+back_biasing = off
+bits = 32
+bmux = off
+bus_notation = on
+check_instname = on
+compiler_type = sp
+corners = ffgnp_0p88v_0p88v_125c,ffgnp_0p88v_0p88v_m40c,ssgnp_0p72v_0p72v_125c,ssgnp_0p72v_0p72v_m40c,tt_0p80v_0p80v_25c,tt_0p80v_0p80v_85c
+cust_comment = 
+diodes = on
+drive = 6
+ema = on
+fci_type = not_fci
+flexible_banking = 4
+frequency = 500
+instname = sram_32k
+irem_gds2_by_phyvtools = 0
+left_bus_delim = [
+libertyviewstyle = nldm
+libname = sram_32k
+lren_bankmask = off
+metal_stack = 2Xa1Xd
+mux = 8
+mvt = LP
+name_case = upper
+pipeline = off
+power_gating = off
+power_type = otc
+prefix = 
+pwr_gnd_rename = vddpe:VDDPE,vddce:VDDCE,vsse:VSSE
+rcols = 2
+redundancy = off
+retention = on
+right_bus_delim = ]
+rows_p_bl = 256
+rrows = 0
+scan = off
+scan_type = pseudo
+ser = none
+site_def = off
+vmin_assist = off
+words = 8192
+wp_size = 1
+write_mask = on
+write_thru = off
diff --git a/ASIC/nanosoc_chip_pads/tsmc16fcll/nanosoc_chip_pads_28pin.v b/ASIC/nanosoc_chip_pads/tsmc16fcll/nanosoc_chip_pads_28pin.v
new file mode 100644
index 0000000..116eaa7
--- /dev/null
+++ b/ASIC/nanosoc_chip_pads/tsmc16fcll/nanosoc_chip_pads_28pin.v
@@ -0,0 +1,307 @@
+//-----------------------------------------------------------------------------
+// Top-Level Pad implementation for TSMC65nm
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Top level for example Cortex-M0/Cortex-M0+ microcontroller
+//-----------------------------------------------------------------------------
+//
+module nanosoc_chip_pads (
+  inout  wire          VDDIO,
+  inout  wire          VDD,
+  inout  wire          VSS,
+  inout  wire          VDDACC,
+
+  input  wire          CLK, // input
+  input  wire          TEST, // input
+  input  wire          NRST,  // active low reset
+  inout  wire  [3:0]    P0,
+  inout  wire  [3:0]    P1,
+  inout  wire          SWDIO,
+  input  wire          SWDCK
+);
+
+
+//------------------------------------
+// internal wires
+
+  wire          clk_i;
+  wire          test_i;
+  wire          nrst_i;
+  wire  [15:0]  p0_i; // level-shifted input from pad
+  wire  [15:0]  p0_o; // output port drive
+  wire  [15:0]  p0_e; // active high output drive enable (pad tech dependent)
+  wire  [15:0]  p0_z; // active low output drive enable (pad tech dependent)
+  wire  [15:0]  p1_i; // level-shifted input from pad
+  wire  [15:0]  p1_o; // output port drive
+  wire  [15:0]  p1_e; // active high output drive enable (pad tech dependent)
+  wire  [15:0]  p1_z; // active low output drive enable (pad tech dependent)
+
+  wire          swdio_i;
+  wire          swdio_o;
+  wire          swdio_e;
+  wire          swdio_z;
+  wire          swdclk_i;
+  wire          VSSIO;
+
+ // --------------------------------------------------------------------------------
+ // Cortex-M0 nanosoc Microcontroller
+ // --------------------------------------------------------------------------------
+
+  nanosoc_chip u_nanosoc_chip (
+`ifdef POWER_PINS
+  .VDD        (VDD),
+  .VSS        (VSS),
+  .VDDACC     (VDDACC),
+`endif
+  .clk_i(clk_i),
+  .test_i(test_i),
+  .nrst_i(nrst_i),
+  .p0_i(p0_i), // level-shifted input from pad
+  .p0_o(p0_o), // output port drive
+  .p0_e(p0_e), // active high output drive enable (pad tech dependent)
+  .p0_z(p0_z), // active low output drive enable (pad tech dependent)
+  .p1_i(p1_i), // level-shifted input from pad
+  .p1_o(p1_o), // output port drive
+  .p1_e(p1_e), // active high output drive enable (pad tech dependent)
+  .p1_z(p1_z), // active low output drive enable (pad tech dependent)
+  .swdio_i(swdio_i),
+  .swdio_o(swdio_o),
+  .swdio_e(swdio_e),
+  .swdio_z(swdio_z),
+  .swdclk_i(swdclk_i)
+  );
+
+
+//TIE_HI uTIEHI (.tiehi(tiehi));
+ wire tiehi = 1'b1;
+//TIE_LO uTIELO (.tielo(tielo));
+ wire tielo = 1'b0;
+
+ // --------------------------------------------------------------------------------
+ // IO pad (TSMC 65nm mapping)
+ // --------------------------------------------------------------------------------
+
+// Pad IO power supplies
+
+PDVDD_18_18_NT_DR_H uPAD_VDDIO_0(
+   );
+PDVDD_18_18_NT_DR_H uPAD_VDDIO_1(
+   );
+PDVDD_18_18_NT_DR_H uPAD_VDDIO_2(
+   );
+PDVDD_18_18_NT_DR_H uPAD_VDDIO_3(
+   );
+
+
+
+// Core power supplies
+
+PVDD_08_08_NT_DR_H uPAD_VDD_0(
+   .VDD(VDD)
+   );
+PVDD_08_08_NT_DR_H uPAD_VDD_1(
+   .VDD(VDD)
+   );
+PVDD_08_08_NT_DR_H uPAD_VDD_2(
+   .VDD(VDD)
+   );
+PVDD_08_08_NT_DR_H uPAD_VDD_3(
+   .VDD(VDD)
+   );
+
+PVSS_08_08_NT_DR_H uPAD_VSS_0(
+   .VSS(VSS)
+   );
+PVSS_08_08_NT_DR_H uPAD_VSS_1(
+   .VSS(VSS)
+   );
+PVSS_08_08_NT_DR_H uPAD_VSS_2(
+   .VSS(VSS)
+   );
+PVSS_08_08_NT_DR_H uPAD_VSS_3(
+   .VSS(VSS)
+   );
+// Accelerator Power supplies
+PVDD_08_08_NT_DR_H uPAD_VDDACC_0(
+   .VDD(VDDACC)
+   );
+PVDD_08_08_NT_DR_H uPAD_VDDACC_1(
+   .VDD(VDDACC)
+   );
+PVDD_08_08_NT_DR_H uPAD_VDDACC_2(
+   .VDD(VDDACC)
+   );
+
+// Clock, Reset and Serial Wire Debug ports
+
+PBIDIRN_18_18_FS_DR_H uPAD_CLK_I (
+    .IE(tiehi),
+    .Y(clk_i),
+    .PE(tielo),
+    .A(tielo),
+    .PAD(CLK)
+   );
+
+PBIDIRN_18_18_FS_DR_H uPAD_TEST_I (
+    .IE(tiehi),
+    .Y(test_i),
+    .PE(tielo),
+    .A(tielo),
+    .PAD(TEST)
+   );
+
+PBIDIRN_18_18_FS_DR_H uPAD_NRST_I (
+    .IE(tiehi),
+    .Y(nrst_i),
+    .PE(tielo),
+    .A(tielo),
+    .PAD(NRST)
+   );
+
+PBIDIRN_18_18_FS_DR_H uPAD_SWDIO_IO (
+    .IE(swdio_z),
+    .Y(swdio_i),
+    .PE(tielo),
+    .A(swdio_o),
+    .PAD(SWDIO)
+   );
+
+PBIDIRN_18_18_FS_DR_H uPAD_SWDCK_I (
+    .IE(tiehi),
+    .Y(swdclk_i),
+    .PE(tielo),
+    .A(tielo),
+    .PAD(SWDCK)
+   );
+
+// GPI.I Port 0 x 16
+
+PBIDIRN_18_18_FS_DR_H uPAD_P0_00 (
+    .IE(p0_z[00]),
+    .Y(p0_i[00]),
+    .PE(p0_z[00]&p0_o[00]),
+    .A(p0_o[00]),
+    .PAD(P0[00])
+   );
+
+PBIDIRN_18_18_FS_DR_H uPAD_P0_01 (
+    .IE(p0_z[01]),
+    .Y(p0_i[01]),
+    .PE(p0_z[01]&p0_o[01]),
+    .A(p0_o[01]),
+    .PAD(P0[01])
+   );
+  
+PBIDIRN_18_18_FS_DR_H uPAD_P0_02 (
+    .IE(p0_z[02]),
+    .Y(p0_i[02]),
+    .PE(p0_z[02]&p0_o[02]),
+    .A(p0_o[02]),
+    .PAD(P0[02])
+   );
+
+PBIDIRN_18_18_FS_DR_H uPAD_P0_03 (
+    .IE(p0_z[03]),
+    .Y(p0_i[03]),
+    .PE(p0_z[03]&p0_o[03]),
+    .A(p0_o[03]),
+    .PAD(P0[03])
+   );
+// GPI.I Port 1 x 16
+
+PBIDIRN_18_18_FS_DR_H uPAD_P1_00 (
+    .IE(p1_z[00]),
+    .Y(p1_i[00]),
+    .PE(p1_z[00]&p1_o[00]),
+    .A(p1_o[00]),
+    .PAD(P1[00])
+   );
+
+PBIDIRN_18_18_FS_DR_H uPAD_P1_01 (
+    .IE(p1_z[01]),
+    .Y(p1_i[01]),
+    .PE(p1_z[01]&p1_o[01]),
+    .A(p1_o[01]),
+    .PAD(P1[01])
+   );
+  
+PBIDIRN_18_18_FS_DR_H uPAD_P1_02 (
+    .IE(p1_z[02]),
+    .Y(p1_i[02]),
+    .PE(p1_z[02]&p1_o[02]),
+    .A(p1_o[02]),
+    .PAD(P1[02])
+   );
+
+PBIDIRN_18_18_FS_DR_H uPAD_P1_03 (
+    .IE(p1_z[03]),
+    .Y(p1_i[03]),
+    .PE(p1_z[03]&p1_o[03]),
+    .A(p1_o[03]),
+    .PAD(P1[03])
+   );
+
+
+// GPIO unused pin tie offs
+
+assign p0_i[4] = p0_o[4] & p0_e[4];
+assign p0_i[5] = p0_o[5] & p0_e[5];
+assign p0_i[6] = p0_o[6] & p0_e[6];
+assign p0_i[7] = p0_o[7] & p0_e[7];
+assign p0_i[8] = p0_o[8] & p0_e[8];
+assign p0_i[9] = p0_o[9] & p0_e[9];
+assign p0_i[10] = p0_o[10] & p0_e[10];
+assign p0_i[11] = p0_o[11] & p0_e[11];
+assign p0_i[12] = p0_o[12] & p0_e[12];
+assign p0_i[13] = p0_o[13] & p0_e[13];
+assign p0_i[14] = p0_o[14] & p0_e[14];
+assign p0_i[15] = p0_o[15] & p0_e[15];
+
+assign p1_i[4] = p1_o[4] & p1_e[4];
+assign p1_i[5] = p1_o[5] & p1_e[5];
+assign p1_i[6] = p1_o[6] & p1_e[6];
+assign p1_i[7] = p1_o[7] & p1_e[7];
+assign p1_i[8] = p1_o[8] & p1_e[8];
+assign p1_i[9] = p1_o[9] & p1_e[9];
+assign p1_i[10] = p1_o[10] & p1_e[10];
+assign p1_i[11] = p1_o[11] & p1_e[11];
+assign p1_i[12] = p1_o[12] & p1_e[12];
+assign p1_i[13] = p1_o[13] & p1_e[13];
+assign p1_i[14] = p1_o[14] & p1_e[14];
+assign p1_i[15] = p1_o[15] & p1_e[15];
+
+
+endmodule
+
+
+
diff --git a/flows/makefile.asic b/flows/makefile.asic
index 0218064..ba4bd93 100644
--- a/flows/makefile.asic
+++ b/flows/makefile.asic
@@ -46,6 +46,7 @@ RF_16K_DIR				:= $(MEMORIES_DIR)/rf_16k
 RF_08K_DIR				:= $(MEMORIES_DIR)/rf_08k
 ROM_DIR 				:= $(MEMORIES_DIR)/bootrom
 SRAM_16K_DIR			:= $(MEMORIES_DIR)/sram_16k 
+SRAM_32K_DIR 			:= $(MEMORIES_DIR)/sram_32k
 
 REPORTS_FOLDER			:= $(IMP_NANOSOC_ASIC_DIR)/reports
 SYN_LOGS				:= $(IMP_NANOSOC_ASIC_DIR)/logs
@@ -133,6 +134,11 @@ gen_memories_backend_28nm: bootrom
 
 gen_memories_28nm: gen_memories_frontend_28nm gen_memories_backend_28nm
 
+gen_memories_16nm:
+	@mkdir -p $(MEMORIES_DIR)
+	@mkdir -p $(SRAM_32K_DIR)
+	@mkdir -p $(ROM_DIR)
+
 
 convert_mem_to_db: 
 	lc_shell -no_log -f  $(NANOSOC_SYNTH_DIR)/synopsys_lib_conversion.tcl
diff --git a/makefile b/makefile
index e4eb5e5..1fb3308 100644
--- a/makefile
+++ b/makefile
@@ -165,6 +165,18 @@ ifdef SNPS_PVT_VM_0_INCLUDE
 endif
 
 
+# ASIC MEMORY INCLUSION
+ifeq ($(ASIC),yes)
+	ifeq ($(NODE),16)
+		FLIST_INCLUDES += $(SOCLABS_ASIC_LIB_TECH_DIR)/flist/asic_lib_ip_TSMC16nm.flist 
+	else ifeq ($(NODE),28)
+		FLIST_INCLUDES += $(SOCLABS_ASIC_LIB_TECH_DIR)/flist/asic_lib_ip_TSMC28nm.flist
+	else 
+		FLIST_INCLUDES += $(SOCLABS_ASIC_LIB_TECH_DIR)/flist/asic_lib_ip.flist
+	endif
+endif
+	
+
 # System Design Filelist
 ifeq ($(QUICKSTART),yes)
 	DESIGN_VC            ?= $(SOCLABS_PROJECT_DIR)/flist/project/top_qs.flist
diff --git a/nanosoc/nanosoc_control/verilog/nanosoc_pin_mux.v b/nanosoc/nanosoc_control/verilog/nanosoc_pin_mux.v
index 96049ac..1de2acd 100644
--- a/nanosoc/nanosoc_control/verilog/nanosoc_pin_mux.v
+++ b/nanosoc/nanosoc_control/verilog/nanosoc_pin_mux.v
@@ -86,8 +86,8 @@ module nanosoc_pin_mux (
     // input  wire             i_swdoen,
 
     // IO pads
-    inout  wire  [15:0]     P0, // legacy
-    inout  wire  [15:0]     P1, // legacy
+    //inout  wire  [15:0]     P0, // legacy
+    //inout  wire  [15:0]     P1, // legacy
 
     output wire  [15:0]     p1_out_mux,    //alt-function mux
     output wire  [15:0]     p1_out_en_mux  //alt-function mux
@@ -117,8 +117,8 @@ module nanosoc_pin_mux (
   assign    timer0_extin = p1_in[8];
   assign    timer1_extin = p1_in[9];
 
-  assign    p0_in        = P0;
-  assign    p1_in        = P1;
+  //assign    p0_in        = P0;
+  //assign    p1_in        = P1;
 
   // Output function mux
   assign    p0_out_mux    = p0_out; // No function muxing for Port 0
@@ -155,39 +155,39 @@ module nanosoc_pin_mux (
 
 
   // Output tristate
-  assign    P0[ 0] = p0_out_en_mux[ 0] ? p0_out_mux[ 0] : 1'bz;
-  assign    P0[ 1] = p0_out_en_mux[ 1] ? p0_out_mux[ 1] : 1'bz;
-  assign    P0[ 2] = p0_out_en_mux[ 2] ? p0_out_mux[ 2] : 1'bz;
-  assign    P0[ 3] = p0_out_en_mux[ 3] ? p0_out_mux[ 3] : 1'bz;
-  assign    P0[ 4] = p0_out_en_mux[ 4] ? p0_out_mux[ 4] : 1'bz;
-  assign    P0[ 5] = p0_out_en_mux[ 5] ? p0_out_mux[ 5] : 1'bz;
-  assign    P0[ 6] = p0_out_en_mux[ 6] ? p0_out_mux[ 6] : 1'bz;
-  assign    P0[ 7] = p0_out_en_mux[ 7] ? p0_out_mux[ 7] : 1'bz;
-  assign    P0[ 8] = p0_out_en_mux[ 8] ? p0_out_mux[ 8] : 1'bz;
-  assign    P0[ 9] = p0_out_en_mux[ 9] ? p0_out_mux[ 9] : 1'bz;
-  assign    P0[10] = p0_out_en_mux[10] ? p0_out_mux[10] : 1'bz;
-  assign    P0[11] = p0_out_en_mux[11] ? p0_out_mux[11] : 1'bz;
-  assign    P0[12] = p0_out_en_mux[12] ? p0_out_mux[12] : 1'bz;
-  assign    P0[13] = p0_out_en_mux[13] ? p0_out_mux[13] : 1'bz;
-  assign    P0[14] = p0_out_en_mux[14] ? p0_out_mux[14] : 1'bz;
-  assign    P0[15] = p0_out_en_mux[15] ? p0_out_mux[15] : 1'bz;
-
-  assign    P1[ 0] = p1_out_en_mux[ 0] ? p1_out_mux[ 0] : 1'bz;
-  assign    P1[ 1] = p1_out_en_mux[ 1] ? p1_out_mux[ 1] : 1'bz;
-  assign    P1[ 2] = p1_out_en_mux[ 2] ? p1_out_mux[ 2] : 1'bz;
-  assign    P1[ 3] = p1_out_en_mux[ 3] ? p1_out_mux[ 3] : 1'bz;
-  assign    P1[ 4] = p1_out_en_mux[ 4] ? p1_out_mux[ 4] : 1'bz;
-  assign    P1[ 5] = p1_out_en_mux[ 5] ? p1_out_mux[ 5] : 1'bz;
-  assign    P1[ 6] = p1_out_en_mux[ 6] ? p1_out_mux[ 6] : 1'bz;
-  assign    P1[ 7] = p1_out_en_mux[ 7] ? p1_out_mux[ 7] : 1'bz;
-  assign    P1[ 8] = p1_out_en_mux[ 8] ? p1_out_mux[ 8] : 1'bz;
-  assign    P1[ 9] = p1_out_en_mux[ 9] ? p1_out_mux[ 9] : 1'bz;
-  assign    P1[10] = p1_out_en_mux[10] ? p1_out_mux[10] : 1'bz;
-  assign    P1[11] = p1_out_en_mux[11] ? p1_out_mux[11] : 1'bz;
-  assign    P1[12] = p1_out_en_mux[12] ? p1_out_mux[12] : 1'bz;
-  assign    P1[13] = p1_out_en_mux[13] ? p1_out_mux[13] : 1'bz;
-  assign    P1[14] = p1_out_en_mux[14] ? p1_out_mux[14] : 1'bz;
-  assign    P1[15] = p1_out_en_mux[15] ? p1_out_mux[15] : 1'bz;
+  //assign    P0[ 0] = p0_out_en_mux[ 0] ? p0_out_mux[ 0] : 1'bz;
+  //assign    P0[ 1] = p0_out_en_mux[ 1] ? p0_out_mux[ 1] : 1'bz;
+  //assign    P0[ 2] = p0_out_en_mux[ 2] ? p0_out_mux[ 2] : 1'bz;
+  //assign    P0[ 3] = p0_out_en_mux[ 3] ? p0_out_mux[ 3] : 1'bz;
+  //assign    P0[ 4] = p0_out_en_mux[ 4] ? p0_out_mux[ 4] : 1'bz;
+  //assign    P0[ 5] = p0_out_en_mux[ 5] ? p0_out_mux[ 5] : 1'bz;
+  //assign    P0[ 6] = p0_out_en_mux[ 6] ? p0_out_mux[ 6] : 1'bz;
+  //assign    P0[ 7] = p0_out_en_mux[ 7] ? p0_out_mux[ 7] : 1'bz;
+  //assign    P0[ 8] = p0_out_en_mux[ 8] ? p0_out_mux[ 8] : 1'bz;
+  //assign    P0[ 9] = p0_out_en_mux[ 9] ? p0_out_mux[ 9] : 1'bz;
+  //assign    P0[10] = p0_out_en_mux[10] ? p0_out_mux[10] : 1'bz;
+  //assign    P0[11] = p0_out_en_mux[11] ? p0_out_mux[11] : 1'bz;
+  //assign    P0[12] = p0_out_en_mux[12] ? p0_out_mux[12] : 1'bz;
+  //assign    P0[13] = p0_out_en_mux[13] ? p0_out_mux[13] : 1'bz;
+  //assign    P0[14] = p0_out_en_mux[14] ? p0_out_mux[14] : 1'bz;
+  //assign    P0[15] = p0_out_en_mux[15] ? p0_out_mux[15] : 1'bz;
+//
+  //assign    P1[ 0] = p1_out_en_mux[ 0] ? p1_out_mux[ 0] : 1'bz;
+  //assign    P1[ 1] = p1_out_en_mux[ 1] ? p1_out_mux[ 1] : 1'bz;
+  //assign    P1[ 2] = p1_out_en_mux[ 2] ? p1_out_mux[ 2] : 1'bz;
+  //assign    P1[ 3] = p1_out_en_mux[ 3] ? p1_out_mux[ 3] : 1'bz;
+  //assign    P1[ 4] = p1_out_en_mux[ 4] ? p1_out_mux[ 4] : 1'bz;
+  //assign    P1[ 5] = p1_out_en_mux[ 5] ? p1_out_mux[ 5] : 1'bz;
+  //assign    P1[ 6] = p1_out_en_mux[ 6] ? p1_out_mux[ 6] : 1'bz;
+  //assign    P1[ 7] = p1_out_en_mux[ 7] ? p1_out_mux[ 7] : 1'bz;
+  //assign    P1[ 8] = p1_out_en_mux[ 8] ? p1_out_mux[ 8] : 1'bz;
+  //assign    P1[ 9] = p1_out_en_mux[ 9] ? p1_out_mux[ 9] : 1'bz;
+  //assign    P1[10] = p1_out_en_mux[10] ? p1_out_mux[10] : 1'bz;
+  //assign    P1[11] = p1_out_en_mux[11] ? p1_out_mux[11] : 1'bz;
+  //assign    P1[12] = p1_out_en_mux[12] ? p1_out_mux[12] : 1'bz;
+  //assign    P1[13] = p1_out_en_mux[13] ? p1_out_mux[13] : 1'bz;
+  //assign    P1[14] = p1_out_en_mux[14] ? p1_out_mux[14] : 1'bz;
+  //assign    P1[15] = p1_out_en_mux[15] ? p1_out_mux[15] : 1'bz;
 
 /*
 // synopsys translate_off
diff --git a/nanosoc/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v b/nanosoc/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v
index 18ca5fe..2780844 100644
--- a/nanosoc/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v
+++ b/nanosoc/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v
@@ -239,9 +239,9 @@ module nanosoc_ss_systemctrl #(
 
         // IO pads
         .p1_out_mux       (P1_OUT_MUX),
-        .p1_out_en_mux    (P1_OUT_EN_MUX),
-        .P0               ( ), //P0),
-        .P1               ( ) //P1),
+        .p1_out_en_mux    (P1_OUT_EN_MUX)
+        // .P0               ( ), //P0),
+        // .P1               ( ) //P1),
 
         // .nTRST            (1'b1),  // Not needed if serial-wire debug is used
         // .TDI              (1'b0),  // Not needed if serial-wire debug is used
diff --git a/nanosoc/synopsys_28nm_slm_integration b/nanosoc/synopsys_28nm_slm_integration
index e88b3d4..4c4e598 160000
--- a/nanosoc/synopsys_28nm_slm_integration
+++ b/nanosoc/synopsys_28nm_slm_integration
@@ -1 +1 @@
-Subproject commit e88b3d4335b8416b5d78322f45e099ac9a12a1d0
+Subproject commit 4c4e598a2982a099f5871df1df2515068a288eab
-- 
GitLab