blob: a5249e9f75256f1e7798fc0a5bad4c06b08e66c6 [file] [log] [blame]
# RCX Extraction
# ./rcx.sh --input_def spm.def --input_sdc spm.sdc --input_gl spm.v --top_module spm
while [ "$1" != "" ]; do
case $1 in
-d | --input_def )
shift
input_def=$1
;;
-d | --input_sdc )
shift
input_sdc=$1
;;
-v | --input_gl )
shift
input_gl=$1
;;
-t | --top_module )
shift
top_module=$1
;;
-l | --input_lefs )
shift
input_lefs=$1
;;
* )
exit 1
esac
shift
done
output_directory=$PWD/$top_module
OPENLANE_IMAGE_NAME=efabless/openlane:2021.09.16_03.28.21
echo "Running RC Extraction on $input_def"
mkdir -p $output_directory
# merge techlef and standard cell lef files
python3 $OPENLANE_ROOT/scripts/mergeLef.py -i $PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/techlef/sky130_fd_sc_hd.tlef $PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/lef/*.lef -o $output_directory/merged.lef
echo "\
read_liberty $PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib;\
set std_cell_lef $output_directory/merged.lef;\
if {[catch {read_lef \$std_cell_lef} errmsg]} {\
puts stderr \$errmsg;\
exit 1;\
};\
if { \"$input_lefs\" eq \"\"} {\
} else {\
foreach lef_file [list $input_lefs] {\
if {[catch {read_lef \$lef_file} errmsg]} {\
puts stderr \$errmsg;\
exit 1;\
}\
};\
};\
if {[catch {read_def -order_wires $input_def} errmsg]} {\
puts stderr \$errmsg;\
exit 1;\
};\
read_sdc $input_sdc;\
set_propagated_clock [all_clocks];\
set rc_values \"mcon 9.249146E-3,via 4.5E-3,via2 3.368786E-3,via3 0.376635E-3,via4 0.00580E-3\";\
set vias_rc [split \$rc_values ","];\
foreach via_rc \$vias_rc {\
set layer_name [lindex \$via_rc 0];\
set resistance [lindex \$via_rc 1];\
set_layer_rc -via \$layer_name -resistance \$resistance;\
};\
set_wire_rc -signal -layer met2;\
set_wire_rc -clock -layer met5;\
define_process_corner -ext_model_index 0 X;\
extract_parasitics -ext_model_file $PDK_ROOT/sky130A/libs.tech/openlane/rcx_rules.info -corner_cnt 1 -max_res 50 -coupling_threshold 0.1 -cc_model 10 -context_depth 5;\
write_spef $output_directory/$top_module.spef" > $output_directory/or_rcx_$top_module.tcl
## Generate Spef file
docker run -it -v $OPENLANE_ROOT:/openLANE_flow -v $PDK_ROOT:$PDK_ROOT -v $PWD:/project -v $output_directory:$output_directory -e PDK_ROOT=$PDK_ROOT $OPENLANE_IMAGE_NAME \
sh -c " cd /project ; openroad -exit $output_directory/or_rcx_$top_module.tcl |& tee $output_directory/or_rcx_$top_module.log"
## Run OpenSTA
echo "\
set std_cell_lef $output_directory/merged.lef;\
if {[catch {read_lef \$std_cell_lef} errmsg]} {\
puts stderr \$errmsg;\
exit 1;\
};\
if { \"$input_lefs\" eq \"\"} {\
} else {\
foreach lef_file [list $input_lefs] {\
if {[catch {read_lef \$lef_file} errmsg]} {\
puts stderr \$errmsg;\
exit 1;\
}\
};\
};\
set_cmd_units -time ns -capacitance pF -current mA -voltage V -resistance kOhm -distance um;\
read_liberty $PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib;\
read_verilog $input_gl;\
link_design $top_module;\
read_spef $output_directory/$top_module.spef;\
read_sdc -echo $input_sdc;\
write_sdf $top_module.sdf;\
report_checks -fields {capacitance slew input_pins nets fanout} -path_delay min_max -group_count 1000;\
report_check_types -max_slew -max_capacitance -max_fanout -violators;\
" > $output_directory/or_sta_$top_module.tcl
docker run -it -v $OPENLANE_ROOT:/openLANE_flow -v $PDK_ROOT:$PDK_ROOT -v $PWD:/project -v $output_directory:$output_directory -e PDK_ROOT=$PDK_ROOT $OPENLANE_IMAGE_NAME \
sh -c "cd /project; openroad -exit $output_directory/or_sta_$top_module.tcl |& tee $output_directory/or_sta_$top_module.log"