From 6e00f61f43a675a2919c918d16df74494f00906c Mon Sep 17 00:00:00 2001
From: Daniel Newbrook <dwn1c21@soton.ac.uk>
Date: Mon, 21 Aug 2023 16:50:12 +0100
Subject: [PATCH] PnR flow added plus ROM implementation

---
 flist/corstone101_ip_ASIC.flist               |  6 +-
 flows/makefile.asic                           | 41 +++++++++-
 .../verilog/nanosoc_region_expram_h.v         |  6 --
 .../verilog/nanosoc_region_expram_l.v         |  8 ++
 synthesis/clock_tree_synthesis.tcl            | 23 ++++++
 synthesis/constraints.sdc                     | 15 +++-
 synthesis/design_import.tcl                   | 32 ++++++++
 synthesis/genus.tcl                           | 25 +++---
 synthesis/icc_shell.tcl                       | 18 +++++
 synthesis/io_plan.tcl                         | 16 ++++
 synthesis/nanosoc.mmmc                        | 81 +++++++++++++++++++
 synthesis/nanosoc_chip_pads_power.upf         | 17 ++++
 synthesis/place.tcl                           | 21 +++++
 synthesis/pnr_flow.tcl                        | 40 +++++++++
 synthesis/power_plan.tcl                      | 24 ++++++
 synthesis/power_route.tcl                     |  8 ++
 synthesis/rf_sp_hdf.spec                      | 33 ++++++++
 synthesis/rom_via.spec                        | 30 +++++++
 synthesis/route.tcl                           | 18 +++++
 synthesis/synopsys.tcl                        | 21 +++--
 20 files changed, 452 insertions(+), 31 deletions(-)
 create mode 100644 synthesis/clock_tree_synthesis.tcl
 create mode 100644 synthesis/design_import.tcl
 create mode 100644 synthesis/icc_shell.tcl
 create mode 100644 synthesis/io_plan.tcl
 create mode 100644 synthesis/nanosoc.mmmc
 create mode 100644 synthesis/nanosoc_chip_pads_power.upf
 create mode 100644 synthesis/place.tcl
 create mode 100644 synthesis/pnr_flow.tcl
 create mode 100644 synthesis/power_plan.tcl
 create mode 100644 synthesis/power_route.tcl
 create mode 100644 synthesis/rf_sp_hdf.spec
 create mode 100644 synthesis/rom_via.spec
 create mode 100644 synthesis/route.tcl

diff --git a/flist/corstone101_ip_ASIC.flist b/flist/corstone101_ip_ASIC.flist
index 6e7fa9c..2f2a60e 100644
--- a/flist/corstone101_ip_ASIC.flist
+++ b/flist/corstone101_ip_ASIC.flist
@@ -28,7 +28,7 @@ $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_timer/verilog/cmsdk
 //-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_dualtimers/verilog
 $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_frc.v
 $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers.v
-$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_defs.v
+//$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_defs.v
 
 
 // CMSDK APB UART IP
@@ -39,7 +39,7 @@ $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_uart/verilog/cmsdk_
 //-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_watchdog/verilog
 $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_frc.v
 $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog.v
-$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_defs.v
+//$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_defs.v
 
 // CMSDK APB Slave Mux IP
 //-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_slave_mux/verilog
@@ -80,7 +80,7 @@ $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/clkgate/cmsdk_clock_ga
 //-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/memories/
 $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/memories/cmsdk_ahb_ram_beh.v
 $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/memories/cmsdk_ahb_ram.v
-$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/memories/cmsdk_ahb_memory_models_defs.v
+//$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/memories/cmsdk_ahb_memory_models_defs.v
 
 $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/memories/cmsdk_ahb_rom.v
 $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/memories/cmsdk_fpga_rom.v
diff --git a/flows/makefile.asic b/flows/makefile.asic
index c663c72..f53dced 100644
--- a/flows/makefile.asic
+++ b/flows/makefile.asic
@@ -32,6 +32,18 @@ TCL_OUTPUT_FILELIST  := $(TCL_FLIST_DIR)/gen_flist.tcl
 GENUS_OUTPUT_FILELIST := $(TCL_FLIST_DIR)/genus_flist.tcl
 SYNTHESIS_OUTPUT_FILELIST := $(TCL_FLIST_DIR)/synth_flist_copy.sh
 
+# Location of outputs from synthesis
+MEMORIES_DIR		:= $(SOCLABS_PROJECT_DIR)/memories
+RF_SPEC_FILE		:= $(SOCLABS_NANOSOC_TECH_DIR)/synthesis/rf_sp_hdf.spec
+ROM_SPEC_FILE		:= $(SOCLABS_NANOSOC_TECH_DIR)/synthesis/rom_via.spec
+BOOTROM_BIN_FILE	:= $(SOCLABS_PROJECT_DIR)/system/src/bootrom/bintxt/bootrom.bintxt
+RF_DIR				:= $(MEMORIES_DIR)/rf
+ROM_DIR 			:= $(MEMORIES_DIR)/bootrom
+REPORTS_FOLDER		:= $(IMP_NANOSOC_ASIC_DIR)/reports
+SYN_LOGS			:= $(IMP_NANOSOC_ASIC_DIR)/logs
+NETLIST_FOLDER		:= $(IMP_NANOSOC_ASIC_DIR)/netlist/
+NANOSOC_SYNTH_DIR	:= $(SOCLABS_NANOSOC_TECH_DIR)/synthesis/
+
 # NanoSoC Tech Flow Dependencies
 NANOSOC_FPGA_FLOW_DIR := $(SOCLABS_NANOSOC_TECH_DIR)/fpga
 
@@ -56,12 +68,39 @@ flist_genus_nanosoc: gen_defs
 
 
 #copy_asic_nanosoc: SHELL:=/bin/bash
-copy_asic_nanosoc: flist_asic_nanosoc 
+copy_asic_nanosoc: gen_defs flist_asic_nanosoc
 	@mkdir -p $(IMP_NANOSOC_ASIC_DIR)/src
 	@(cd $(IMP_NANOSOC_ASIC_DIR)/src)
 	@(chmod +x $(SYNTHESIS_OUTPUT_FILELIST))
 	@(source $(SYNTHESIS_OUTPUT_FILELIST))
 
+
+gen_memories: bootrom
+	@mkdir -p $(MEMORIES_DIR)
+	@mkdir -p $(RF_DIR)
+	@mkdir -p $(ROM_DIR)
+	echo "Generating register file memory libraries"
+	cd $(RF_DIR); $(PHYS_IP)/arm/tsmc/cln65lp/rf_sp_hdf_hvt_rvt/r0p0/bin/rf_sp_hdf_hvt_rvt ascii -spec $(RF_SPEC_FILE);
+	cd $(RF_DIR); $(PHYS_IP)/arm/tsmc/cln65lp/rf_sp_hdf_hvt_rvt/r0p0/bin/rf_sp_hdf_hvt_rvt liberty -spec $(RF_SPEC_FILE);
+	cd $(RF_DIR); $(PHYS_IP)/arm/tsmc/cln65lp/rf_sp_hdf_hvt_rvt/r0p0/bin/rf_sp_hdf_hvt_rvt postscript -spec $(RF_SPEC_FILE);
+	cd $(RF_DIR); $(PHYS_IP)/arm/tsmc/cln65lp/rf_sp_hdf_hvt_rvt/r0p0/bin/rf_sp_hdf_hvt_rvt lef-fp -spec $(RF_SPEC_FILE);
+	cd $(RF_DIR); $(PHYS_IP)/arm/tsmc/cln65lp/rf_sp_hdf_hvt_rvt/r0p0/bin/rf_sp_hdf_hvt_rvt verilog -spec $(RF_SPEC_FILE);
+	cd $(ROM_DIR)
+	echo "Generating ROM Libraries"
+	cd $(ROM_DIR); $(PHYS_IP)/arm/tsmc/cln65lp/rom_via_hdd_rvt_rvt/r0p0/bin/rom_via_hdd_rvt_rvt ascii -spec $(ROM_SPEC_FILE) -code_file $(BOOTROM_BIN_FILE);
+	cd $(ROM_DIR); $(PHYS_IP)/arm/tsmc/cln65lp/rom_via_hdd_rvt_rvt/r0p0/bin/rom_via_hdd_rvt_rvt liberty -spec $(ROM_SPEC_FILE) -code_file $(BOOTROM_BIN_FILE);
+	cd $(ROM_DIR); $(PHYS_IP)/arm/tsmc/cln65lp/rom_via_hdd_rvt_rvt/r0p0/bin/rom_via_hdd_rvt_rvt postscript -spec $(ROM_SPEC_FILE) -code_file $(BOOTROM_BIN_FILE);
+	cd $(ROM_DIR); $(PHYS_IP)/arm/tsmc/cln65lp/rom_via_hdd_rvt_rvt/r0p0/bin/rom_via_hdd_rvt_rvt lef-fp -spec $(ROM_SPEC_FILE) -code_file $(BOOTROM_BIN_FILE);
+	cd $(ROM_DIR); $(PHYS_IP)/arm/tsmc/cln65lp/rom_via_hdd_rvt_rvt/r0p0/bin/rom_via_hdd_rvt_rvt verilog -spec $(ROM_SPEC_FILE) -code_file $(BOOTROM_BIN_FILE);
+	echo "Finished generating memory libraries"
+
+syn_genus: 
+	@mkdir -p $(REPORTS_FOLDER)
+	@mkdir -p $(NETLIST_FOLDER)
+	@mkdir -p $(SYN_LOGS)
+	cd $(NANOSOC_SYNTH_DIR)
+	@(genus -f $(NANOSOC_SYNTH_DIR)/genus.tcl -log $(SYN_LOGS)/nanosoc_synth)
+
 # Clean FPGA Run
 clean_synthesis:
 	@echo Cleaning Previous Runs of $(BOARD_NAME)
diff --git a/nanosoc/nanosoc_regions/expram_h/verilog/nanosoc_region_expram_h.v b/nanosoc/nanosoc_regions/expram_h/verilog/nanosoc_region_expram_h.v
index f41da67..6bc5f56 100644
--- a/nanosoc/nanosoc_regions/expram_h/verilog/nanosoc_region_expram_h.v
+++ b/nanosoc/nanosoc_regions/expram_h/verilog/nanosoc_region_expram_h.v
@@ -18,9 +18,6 @@ module nanosoc_region_expram_h #(
         parameter    EXPRAM_H_RAM_DATA_W = 32  // Width of RAM Data Bus - Default 32 bits
     )(
         `ifdef POWER_PINS
-        inout  wire          VDDCE,
-        inout  wire          VDDPE,
-        inout  wire          VSSE,
         inout  wire          VDD,
         inout  wire          VSS,
         `endif
@@ -49,9 +46,6 @@ module nanosoc_region_expram_h #(
         .RAM_DATA_W (EXPRAM_H_RAM_DATA_W)
     ) u_expram_h (
         `ifdef POWER_PINS
-        .VDDCE (VDDCE),
-        .VDDPE (VDDPE),
-        .VSSE  (VSSE),
         .VDD   (VDD),
         .VSS   (VSS),
         `endif
diff --git a/nanosoc/nanosoc_regions/expram_l/verilog/nanosoc_region_expram_l.v b/nanosoc/nanosoc_regions/expram_l/verilog/nanosoc_region_expram_l.v
index 76f078f..668744c 100644
--- a/nanosoc/nanosoc_regions/expram_l/verilog/nanosoc_region_expram_l.v
+++ b/nanosoc/nanosoc_regions/expram_l/verilog/nanosoc_region_expram_l.v
@@ -17,6 +17,10 @@ module nanosoc_region_expram_l #(
         parameter    EXPRAM_L_RAM_ADDR_W = 14, // Width of RAM Address  - Default 16KB
         parameter    EXPRAM_L_RAM_DATA_W = 32  // Width of RAM Data Bus - Default 32 bits
     )(
+        `ifdef POWER_PINS
+        inout  wire          VDD,
+        inout  wire          VSS,
+        `endif
         input  wire                   HCLK,    
         input  wire                   HRESETn, 
 
@@ -41,6 +45,10 @@ module nanosoc_region_expram_l #(
         .RAM_ADDR_W (EXPRAM_L_RAM_ADDR_W),
         .RAM_DATA_W (EXPRAM_L_RAM_DATA_W)
     ) u_expram_l (
+        `ifdef POWER_PINS
+        .VDD   (VDD),
+        .VSS   (VSS),
+        `endif
         // AHB Inputs
         .HCLK       (HCLK),
         .HRESETn    (HRESETn),
diff --git a/synthesis/clock_tree_synthesis.tcl b/synthesis/clock_tree_synthesis.tcl
new file mode 100644
index 0000000..5e8a3ed
--- /dev/null
+++ b/synthesis/clock_tree_synthesis.tcl
@@ -0,0 +1,23 @@
+############################################
+# Script : Clock Tree Implementation
+# Date : 24th May 2023 
+# Author : Srimanth Tenneti 
+# Description : Implements the Clock Tree
+############################################ 
+
+### Buffer Cells 
+set_db cts_buffer_cells {*BUFH*}
+### Inverter Cells 
+set_db cts_inverter_cells {*INV*} 
+
+### Clock Tree Sepc 
+create_clock_tree_spec -out_file design_clk.spec 
+
+### Creating a Clock Tree 
+ccopt_design 
+
+### Optimizing the design 
+opt_design -post_cts 
+opt_design -post_cts -hold 
+
+
diff --git a/synthesis/constraints.sdc b/synthesis/constraints.sdc
index 14f09d2..60124c4 100644
--- a/synthesis/constraints.sdc
+++ b/synthesis/constraints.sdc
@@ -12,15 +12,19 @@
 #### CLOCK DEFINITION
 
 set EXTCLK "clk";
+set SWDCLK "swdclk";
 set_units -time 1.0ns;
 
 set_units -capacitance 1.0pF;
-set EXTCLK_PERIOD 10.0;
+set EXTCLK_PERIOD 4;
+set SWDCLK_PERIOD 20;
 
 create_clock -name "$EXTCLK" -period "$EXTCLK_PERIOD" -waveform "0 [expr $EXTCLK_PERIOD/2]" [get_ports XTAL1]
+create_clock -name "$SWDCLK" -period "$SWDCLK_PERIOD" -waveform "0 [expr $SWDCLK_PERIOD/2]" [get_ports SWCLKTCK]
 
 set SKEW 0.200
 set_clock_uncertainty $SKEW [get_clocks $EXTCLK]
+set_clock_uncertainty $SKEW [get_clocks $SWDCLK]
 
 set MINRISE 0.20
 set MAXRISE 0.25
@@ -32,13 +36,18 @@ set_clock_transition -rise -max $MAXRISE [get_clocks $EXTCLK]
 set_clock_transition -fall -min $MINFALL [get_clocks $EXTCLK]
 set_clock_transition -fall -min $MINFALL [get_clocks $EXTCLK]
 
+set_clock_transition -rise -min $MINRISE [get_clocks $SWDCLK]
+set_clock_transition -rise -max $MAXRISE [get_clocks $SWDCLK]
+set_clock_transition -fall -min $MINFALL [get_clocks $SWDCLK]
+set_clock_transition -fall -min $MINFALL [get_clocks $SWDCLK]
+
 #### DELAY DEFINITION
 
 set_input_delay -clock [get_clocks $EXTCLK] -add_delay 0.3 [get_ports NRST]
 set_input_delay -clock [get_clocks $EXTCLK] -add_delay 0.3 [get_ports P0]
 set_input_delay -clock [get_clocks $EXTCLK] -add_delay 0.3 [get_ports P1]
-set_input_delay -clock [get_clocks $EXTCLK] -add_delay 0.3 [get_ports SWDIOTMS]
-set_input_delay -clock [get_clocks $EXTCLK] -add_delay 0.3 [get_ports SWCLKTCK]
+set_input_delay -clock [get_clocks $SWDCLK] -add_delay 0.3 [get_ports SWDIOTMS]
+set_input_delay -clock [get_clocks $SWDCLK] -add_delay 0.3 [get_ports SWCLKTCK]
 
 set_max_capacitance 0.5 [all_outputs]
 set_max_fanout 10 [all_inputs]
\ No newline at end of file
diff --git a/synthesis/design_import.tcl b/synthesis/design_import.tcl
new file mode 100644
index 0000000..f642800
--- /dev/null
+++ b/synthesis/design_import.tcl
@@ -0,0 +1,32 @@
+#########################################
+# File : Design Import Logic 
+# Date : 22nd May 2022 
+# Author : Srimanth Tenneti 
+# Description : MMMC + Design Import 
+######################################### 
+
+### Settting PG Nets 
+set_db init_power_nets {VDD VDDIO} 
+set_db init_ground_nets {VSS VSSIO} 
+
+### Processing MMMC 
+read_mmmc nanosoc.mmmc 
+set TECH_LEF $::env(PHYS_IP)/arm/tsmc/cln65lp/arm_tech/r2p0/lef/1p9m_6x2z/sc9_tech.lef
+set BASE_LEF $::env(PHYS_IP)/arm/tsmc/cln65lp/sc9_base_rvt/r0p0/lef/sc9_cln65lp_base_rvt.lef
+set RF_LEF $::env(SOCLABS_PROJECT_DIR)/memories/rf/rf_sp_hdf.lef
+set ROM_LEF $::env(SOCLABS_PROJECT_DIR)/memories/bootrom/rom_via.lef
+
+### Reading LEFs 
+read_physical -lef [list ${TECH_LEF} ${BASE_LEF} ${RF_LEF} ${ROM_LEF}]
+
+### Reading Netlist 
+read_netlist ./nanosoc_chip_pads.vm
+
+### Initializing the Design 
+init_design
+
+### Adjusting the GUI 
+gui_fit 
+
+create_floorplan -site sc9_cln65lp -core_size 900 900 50 50 50 50 
+
diff --git a/synthesis/genus.tcl b/synthesis/genus.tcl
index ea13d31..bc18590 100644
--- a/synthesis/genus.tcl
+++ b/synthesis/genus.tcl
@@ -1,26 +1,27 @@
 set_db init_lib_search_path ./
-set BASE_LIB $::env(PHYS_IP)/arm/tsmc/cln65lp/sc9_base_rvt/r0p0/lib/sc9_cln65lp_base_rvt_tt_typical_max_1p20v_25c.lib
-set RF_LIB ../../../cadence_flow/memory/rf/rf_sp_hdf_tt_1p20v_1p20v_25c.lib
-set_db / .library "$BASE_LIB $RF_LIB"
+set BASE_LIB $::env(PHYS_IP)/arm/tsmc/cln65lp/sc9_base_rvt/r0p0/lib/sc9_cln65lp_base_rvt_ss_typical_max_1p08v_125c.lib
+set RF_LIB $::env(SOCLABS_PROJECT_DIR)/memories/rf/rf_sp_hdf_ss_1p08v_1p08v_125c.lib
+set ROM_LIB $::env(SOCLABS_PROJECT_DIR)/memories/bootrom/rom_via_ss_1p08v_1p08v_125c.lib
+set_db / .library "$BASE_LIB $RF_LIB $ROM_LIB"
 
 source $::env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/flist/genus_flist.tcl
 elaborate nanosoc_chip_pads
-source constraints.sdc
+read_sdc $::env(SOCLABS_NANOSOC_TECH_DIR)/synthesis/constraints.sdc 
 
 set_db syn_generic_effort high
+set_db syn_map_effort high
 
 syn_generic
-
 syn_map
+syn_opt
+
+report_area > $::env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/reports/nanosoc_area.rep
+report_timing > $::env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/reports/nanosoc_timing.rep
+report_gates > $::env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/reports/nanosoc_gates.rep
+report_power > $::env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/reports/nanosoc_power.rep
 
-report_area
-report_timing
-report_gates
+write_hdl > $::env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/netlist/nanosoc_chip_pads.vm
 
-write_hdl > nanosoc_chip_pads.vm
-write_sdc > constraints.write_sdc
-write_script > constraints.g
 
-write_design -innovus nanosoc_chip_pads
 
 exit
diff --git a/synthesis/icc_shell.tcl b/synthesis/icc_shell.tcl
new file mode 100644
index 0000000..b6c4541
--- /dev/null
+++ b/synthesis/icc_shell.tcl
@@ -0,0 +1,18 @@
+set design_name nanosoc_chip_pads
+create_lib -technology /home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln65lp/arm_tech/r2p0/milkyway/1p9m_6x2z/sc9_tech.tf -ref_libs /home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln65lp/sc9_base_rvt/r0p0/lef/sc9_cln65lp_base_rvt.lef tsmc65lp
+
+read_parasitic_tech -name {typical} -tlup {/home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln65lp/arm_tech/r2p0/synopsys_tluplus/1p9m_6x2z/typical.tluplus} -layermap {/home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln65lp/arm_tech/r2p0/synopsys_tluplus/1p9m_6x2z/tluplus.map}
+read_parasitic_tech -name {rcbest} -tlup {/home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln65lp/arm_tech/r2p0/synopsys_tluplus/1p9m_6x2z/rcbest.tluplus} -layermap {/home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln65lp/arm_tech/r2p0/synopsys_tluplus/1p9m_6x2z/tluplus.map}
+read_parasitic_tech -name {rcworst} -tlup {/home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln65lp/arm_tech/r2p0/synopsys_tluplus/1p9m_6x2z/rcworst.tluplus} -layermap {/home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln65lp/arm_tech/r2p0/synopsys_tluplus/1p9m_6x2z/tluplus.map}
+
+
+read_verilog_outline -library tsmc65lp -design nanosoc_chip_pads -top nanosoc_chip_pads nanosoc_chip_pads.vm
+link_block
+initialize_floorplan -control_type die -keep_pg_route -side_ratio {1000 1000} -core_offset {100 100} -keep_placement {all}
+create_io_ring -name main_io
+explore_logic_hierarchy -organize
+
+load_upf nanosoc_chip_pads_power.upf
+commit_upf
+
+
diff --git a/synthesis/io_plan.tcl b/synthesis/io_plan.tcl
new file mode 100644
index 0000000..07c1152
--- /dev/null
+++ b/synthesis/io_plan.tcl
@@ -0,0 +1,16 @@
+################################
+# Script  : IO Place
+# Author : Srimanth Tenneti 
+# Date : 22nd May 2022 
+###############################
+
+### Pin Place 
+edit_pin -fixed_pin 1 -fix_overlap 1 -unit micron -spread_direction clockwise -side Top -layer 9 -spread_type center -spacing 30 -pin {XTAL1 XTAL2 NRST VDD VDDIO}
+
+edit_pin -fixed_pin 1 -fix_overlap 1 -unit micron -spread_direction clockwise -side Bottom -layer 9 -spread_type center -spacing 30 -pin {SWDIOTMS SWCLKTCK VSS VSSIO}
+
+edit_pin -fixed_pin 1 -fix_overlap 1 -unit micron -spread_direction clockwise -side Left -layer 9 -spread_type center -spacing 30 -pin {{P0[0]} {P0[1]} {P0[2]} {P0[3]} {P0[4]} {P0[5]} {P0[6]} {P0[7]} {P0[8]} {P0[9]} {P0[10]} {P0[11]} {P0[12]} {P0[13]} {P0[14]} {P0[15]}}
+
+edit_pin -pin_width 1.5 -pin_depth 1.5 -fixed_pin 1 -fix_overlap 1 -unit micron -spread_direction clockwise -side Right -layer 9 -spread_type center -spacing 30 -pin {{P1[0]} {P1[1]} {P1[2]} {P1[3]} {P1[4]} {P1[5]} {P1[6]} {P1[7]} {P1[8]} {P1[9]} {P1[10]} {P1[11]} {P1[12]} {P1[13]} {P1[14]} {P1[15]}}
+ 
+gui_fit
diff --git a/synthesis/nanosoc.mmmc b/synthesis/nanosoc.mmmc
new file mode 100644
index 0000000..467a029
--- /dev/null
+++ b/synthesis/nanosoc.mmmc
@@ -0,0 +1,81 @@
+set base_path /home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln65lp/sc9_base_rvt/r0p0
+set tech_path /home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln65lp/arm_tech/r2p0
+set ram_path /home/dwn1c21/SoC-Labs/nanosoc_clk/accelerator-project/memories/rf/
+set rom_path /home/dwn1c21/SoC-Labs/nanosoc_clk/accelerator-project/memories/bootrom/
+
+create_library_set -name default_libset_max\
+   -timing\
+    [list ${base_path}/lib/sc9_cln65lp_base_rvt_ss_typical_max_1p08v_125c.lib ${ram_path}/rf_sp_hdf_ss_1p08v_1p08v_125c.lib ${rom_path}/rom_via_ss_1p08v_1p08v_125c.lib] \
+   -si\
+    [list ${base_path}/celtic/sc9_cln65lp_base_rvt_ss_typical_max_1p08v_125c.cdB]
+
+create_library_set -name default_libset_min\
+   -timing\
+    [list ${base_path}/lib/sc9_cln65lp_base_rvt_ff_typical_min_1p32v_m40c.lib ${ram_path}/rf_sp_hdf_ff_1p32v_1p32v_m40c.lib ${rom_path}/rom_via_ff_1p32v_1p32v_m40c.lib] \
+   -si\
+    [list ${base_path}/celtic/sc9_cln65lp_base_rvt_ff_typical_min_1p32v_m40c.cdB]
+
+create_timing_condition -name default_mapping_tc_2\
+   -library_sets [list default_libset_min]
+create_timing_condition -name default_mapping_tc_1\
+   -library_sets [list default_libset_max]
+
+create_rc_corner -name default_rc_corner_worst\
+   -pre_route_res 1\
+   -post_route_res 1\
+   -pre_route_cap 1\
+   -post_route_cap 1\
+   -post_route_cross_cap 1\
+   -pre_route_clock_res 0\
+   -pre_route_clock_cap 0\
+   -cap_table ${tech_path}/cadence_captable/1p9m_6x2z/rcworst.captbl
+
+create_rc_corner -name default_rc_corner_best\
+   -pre_route_res 1\
+   -post_route_res 1\
+   -pre_route_cap 1\
+   -post_route_cap 1\
+   -post_route_cross_cap 1\
+   -pre_route_clock_res 0\
+   -pre_route_clock_cap 0\
+   -cap_table ${tech_path}/cadence_captable/1p9m_6x2z/rcbest.captbl
+
+create_rc_corner -name default_rc_corner_typical\
+   -pre_route_res 1\
+   -post_route_res 1\
+   -pre_route_cap 1\
+   -post_route_cap 1\
+   -post_route_cross_cap 1\
+   -pre_route_clock_res 0\
+   -pre_route_clock_cap 0\
+   -cap_table ${tech_path}/cadence_captable/1p9m_6x2z/typical.captbl
+
+
+
+create_delay_corner -name default_delay_corner_max\
+   -timing_condition {default_mapping_tc_1}\
+   -rc_corner default_rc_corner_worst
+
+create_delay_corner -name default_delay_corner_ocv\
+   -early_timing_condition {default_mapping_tc_2}\
+   -late_timing_condition {default_mapping_tc_1}\
+   -rc_corner default_rc_corner_typical
+
+create_delay_corner -name default_delay_corner_min\
+   -timing_condition default_mapping_tc_2\
+   -rc_corner default_rc_corner_best
+
+create_constraint_mode -name default_constraint_mode\
+   -sdc_files\
+    [list ./constraints.sdc]
+
+create_analysis_view -name default_analysis_view_setup -constraint_mode default_constraint_mode -delay_corner default_delay_corner_max
+
+create_analysis_view -name default_analysis_view_hold -constraint_mode default_constraint_mode -delay_corner default_delay_corner_min
+
+
+create_analysis_view -name typical_analysis_view_setup -constraint_mode default_constraint_mode -delay_corner default_delay_corner_ocv
+create_analysis_view -name typical_analysis_view_hold -constraint_mode default_constraint_mode -delay_corner default_delay_corner_ocv
+
+
+set_analysis_view -setup [list default_analysis_view_setup] -hold [list default_analysis_view_hold]
diff --git a/synthesis/nanosoc_chip_pads_power.upf b/synthesis/nanosoc_chip_pads_power.upf
new file mode 100644
index 0000000..72339c3
--- /dev/null
+++ b/synthesis/nanosoc_chip_pads_power.upf
@@ -0,0 +1,17 @@
+create_power_domain pd_top -include_scope
+create_supply_port VDD -domain pd_top
+create_supply_port VDDIO -domain pd_top
+create_supply_port VSS -domain pd_top
+create_supply_port VSSIO -domain pd_top
+
+create_supply_net VDD -domain pd_top
+create_supply_net VDDIO -domain pd_top
+create_supply_net VSS -domain pd_top
+create_supply_net VSSIO -domain pd_top
+
+connect_supply_net VDD -ports VDD
+connect_supply_net VDDIO -ports VDDIO
+connect_supply_net VSS -ports VSS
+connect_supply_net VSSIO -ports VSSIO
+
+set_domain_supply_net pd_top -primary_power_net VDD -primary_ground_net VSS
\ No newline at end of file
diff --git a/synthesis/place.tcl b/synthesis/place.tcl
new file mode 100644
index 0000000..cc6fcde
--- /dev/null
+++ b/synthesis/place.tcl
@@ -0,0 +1,21 @@
+############################################ 
+# Script : Placement 
+# Date : May 24 2024 
+# Author : Srimanth Tenneti 
+############################################ 
+
+### Congestion and Timing Setting 
+set_db design_process_node 65
+set_db place_global_cong_effort auto 
+set_db place_global_timing_effort high 
+
+### Uniform Cell Distribution 
+
+set_db place_global_uniform_density true
+
+### Placement Mode Config 
+set_db place_design_floorplan_mode false 
+place_design 
+
+### Delay Calculation 
+write_sdf design.sdf -ideal_clock_network 
diff --git a/synthesis/pnr_flow.tcl b/synthesis/pnr_flow.tcl
new file mode 100644
index 0000000..ea6c5dc
--- /dev/null
+++ b/synthesis/pnr_flow.tcl
@@ -0,0 +1,40 @@
+######################################
+# Script : Place and Route Flow 
+# Date : 25th May 2023 
+# Author : Srimanth Tenneti 
+# Description : Innovus PnR Flow 
+###################################### 
+
+puts "Starting PnR Flow ..."
+
+
+### Design Import 
+source design_import.tcl  
+
+### IO Planning 
+source io_plan.tcl
+
+### Power Plan 
+source power_plan.tcl 
+
+### Power Route 
+source power_route.tcl 
+
+### Placement 
+source place.tcl 
+
+### CTS 
+source clock_tree_synthesis.tcl 
+
+### Routing 
+source route.tcl 
+
+report_timing > $::env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/reports/nanosoc_imp_timing.rep
+report_area > $::env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/reports/nanosoc_imp_area.rep
+report_power > $::env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/reports/nanosoc_imp_power.rep
+
+gui_show 
+
+
+
+
diff --git a/synthesis/power_plan.tcl b/synthesis/power_plan.tcl
new file mode 100644
index 0000000..279c218
--- /dev/null
+++ b/synthesis/power_plan.tcl
@@ -0,0 +1,24 @@
+#########################################
+# Script : Power Planning 
+# Tool : Cadence Innovus 
+# Date : May 22, 2023
+# Author : Srimanth Tenneti
+######################################### 
+
+### Connecting Global Nets
+connect_global_net VDD -type pg_pin -pin_base_name VDD -inst_base_name * 
+connect_global_net VDDIO -type pg_pin -pin_base_name VDDIO -inst_base_name * 
+connect_global_net VSS -type pg_pin -pin_base_name VSS -inst_base_name * 
+connect_global_net VSSIO -type pg_pin -pin_base_name VSSIO -inst_base_name * 
+### Top and Bottom Metal Declartions
+set_db add_rings_stacked_via_top_layer M8
+set_db add_rings_stacked_via_bottom_layer M1 
+
+### Adding Rings 
+add_rings -nets {VDD VDDIO VSS VSSIO} -type core_rings -follow core -layer {top M7 bottom M7 left M8 right M8} -width {top 8 bottom 8 left 8 right 8} -spacing {top 2 bottom 2 left 2 right 2} -offset {top 1 bottom 1 left 1 right 1} -center 0 -threshold 0 -jog_distance 0 -snap_wire_center_to_grid none
+
+### Adding Stripes 
+add_stripes -nets {VDD VDDIO VSS VSSIO} -layer M8 -direction vertical -width 4 -spacing 1 \
+-number_of_sets 8 -start_from left -start_offset 100 -stop_offset 100 -switch_layer_over_obs false \
+-max_same_layer_jog_length 50 -pad_core_ring_top_layer_limit M8 -pad_core_ring_bottom_layer_limit M1 \
+-block_ring_top_layer_limit M8 -block_ring_bottom_layer_limit M1 -use_wire_group 0 -snap_wire_center_to_grid none
diff --git a/synthesis/power_route.tcl b/synthesis/power_route.tcl
new file mode 100644
index 0000000..f593a3f
--- /dev/null
+++ b/synthesis/power_route.tcl
@@ -0,0 +1,8 @@
+##################################
+# Script : Special Route Script 
+# Date : May 24, 2023 
+# Description : Power Routing 
+# Author : Srimanth Tenneti 
+##################################
+
+route_special  -nets {VDD VSS} -connect core_pin  -block_pin_target nearest_target -core_pin_target first_after_row_end  -allow_jogging 1 -allow_layer_change 1 -layer_change_range { M1(1) M8(8) } -crossover_via_layer_range { M1(1) M8(8) } -target_via_layer_range { M1(1) M8(8) }
diff --git a/synthesis/rf_sp_hdf.spec b/synthesis/rf_sp_hdf.spec
new file mode 100644
index 0000000..29213c9
--- /dev/null
+++ b/synthesis/rf_sp_hdf.spec
@@ -0,0 +1,33 @@
+# user spec file, compiler rf_sp_hdf_hvt_rvt, version r0p0
+
+activity_factor = 50
+back_biasing = off
+bits = 32
+bmux = off
+bus_notation = on
+check_instname = on
+corners = ff_1p32v_1p32v_125c,ff_1p32v_1p32v_m40c,ss_1p08v_1p08v_125c,ss_1p08v_1p08v_m40c,tt_1p20v_1p20v_25c
+cust_comment = 
+diodes = on
+drive = 6
+ema = on
+frequency = 150
+instname = rf_sp_hdf
+left_bus_delim = [
+libertyviewstyle = nldm
+libname = RF_LIB
+mux = 8
+mvt = 
+name_case = upper
+power_type = otc
+prefix = 
+pwr_gnd_rename = vddpe:VDDPE,vddce:VDDCE,vsse:VSSE
+retention = on
+right_bus_delim = ]
+ser = none
+site_def = off
+top_layer = m5-m10
+words = 256
+wp_size = 1
+write_mask = on
+write_thru = off
diff --git a/synthesis/rom_via.spec b/synthesis/rom_via.spec
new file mode 100644
index 0000000..983fb53
--- /dev/null
+++ b/synthesis/rom_via.spec
@@ -0,0 +1,30 @@
+# user spec file, compiler rom_via_hdd_rvt_rvt, version r0p0
+
+activity_factor = 10
+back_biasing = off
+bits = 32
+bmux = on
+bus_notation = on
+check_instname = on
+corners = ff_1p32v_1p32v_125c,ff_1p32v_1p32v_m40c,ss_1p08v_1p08v_125c,ss_1p08v_1p08v_m40c,tt_1p20v_1p20v_25c
+cust_comment = 
+diodes = on
+drive = 6
+ema = on
+frequency = 300
+instname = rom_via
+left_bus_delim = [
+libertyviewstyle = nldm
+libname = USERLIB
+mode = random
+mux = 8
+mvt = 
+name_case = upper
+power_gating = on
+power_type = otc
+prefix = 
+pwr_gnd_rename = vdde:VDDE,vsse:VSSE
+right_bus_delim = ]
+site_def = off
+top_layer = m5-m10
+words = 256
diff --git a/synthesis/route.tcl b/synthesis/route.tcl
new file mode 100644
index 0000000..b12b097
--- /dev/null
+++ b/synthesis/route.tcl
@@ -0,0 +1,18 @@
+
+### Clock Net Spacing
+set_route_attributes -nets clk -preferred_extra_space_tracks 2 
+
+### Multi Cut Via Effort 
+set_db route_design_detail_use_multi_cut_via_effort medium
+
+### Timing Driven Route
+set_db route_design_with_timing_driven 1 
+
+### SI Driven Route 
+set_db route_design_with_si_driven 1 
+
+### Route Design 
+route_design -global_detail
+
+### Timing Analysis Type 
+set_db timing_analysis_type ocv
diff --git a/synthesis/synopsys.tcl b/synthesis/synopsys.tcl
index 77d91ea..3c45896 100644
--- a/synthesis/synopsys.tcl
+++ b/synthesis/synopsys.tcl
@@ -1,3 +1,14 @@
+#-----------------------------------------------------------------------------
+# NanoSoC Synopsys synthesis tcl file to be run with dc_shell
+# 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)
+#-----------------------------------------------------------------------------
+
 set rtlPath $env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/src/
 set top_module nanosoc_chip_pads
 supress_message = {ELAB-405}
@@ -7,7 +18,7 @@ supress_message = {ELAB-405}
 # List locations where your standard cell libraries may be located
 #
 #####
-set search_path [list . $search_path /home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln65lp/sc9_base_rvt/r0p0/sdb/ /home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln65lp/sc9_base_rvt/r0p0/db/ /home/dwn1c21/SoC-Labs/accelerator-project/memories/rf]
+set search_path [list . $search_path $env(PHYS_IP)/arm/tsmc/cln65lp/sc9_base_rvt/r0p0/sdb/ $env(PHYS_IP)/arm/tsmc/cln65lp/sc9_base_rvt/r0p0/db/ $env(SOCLABS_PROJECT_DIR)/memories/rf]
 set search_path [concat $rtlPath $search_path]
 ######
 # Set Target Library
@@ -27,9 +38,9 @@ set link_library sc9_cln65lp_base_rvt_tt_typical_max_1p20v_25c.db
 
 #read_file {/home/dwn1c21/SoC-Labs/accelerator-project/imp/ASIC/nanosoc/src/} -autoread -recursive -format verilog -top $top_module
 
-analyze -format verilog -lib WORK -define POWER_PINS [glob /home/dwn1c21/SoC-Labs/accelerator-project/imp/ASIC/nanosoc/src/*.v]
-analyze -format sverilog -lib WORK -define POWER_PINS [glob /home/dwn1c21/SoC-Labs/accelerator-project/imp/ASIC/nanosoc/src/*.sv]
-elaborate $top_module -lib WORK -update
+analyze -format sverilog -lib WORK -define POWER_PINS [glob  $env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/src/*.sv]
+analyze -format verilog -lib WORK -define POWER_PINS [glob  $env(SOCLABS_PROJECT_DIR)/imp/ASIC/nanosoc/src/*.v]
+elaborate $top_module -lib WORK
 current_design $top_module
 
 # Link Design
@@ -43,8 +54,6 @@ set_load 0.1 [all_outputs]
 set_max_fanout 1 [all_inputs]
 set_fanout_load 8 [all_outputs]
 
-redirect [format "%s%s%s" ./ $top_module _ports.rep { report_ports }
-
 compile_ultra -exact_map
 
 write -hierarchy -format verilog -output ./nanosoc_chip_pads.vm
-- 
GitLab