blob: d8888ae4d30e5b326784588e83ef7a5ac54b4fb1 [file] [log] [blame]
#!/usr/bin/tclsh
# Copyright 2020 Efabless Corporation
# Copyright 2020 Sylvain Munaut
#
# 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.
package require openlane;
proc insert_diode {args} {
puts_info "Insert diodes..."
# Custom insertion script
set ::env(SAVE_DEF) $::env(TMP_DIR)/placement/$::env(DESIGN_NAME).diodes.def
try_catch python3 $::env(DESIGN_DIR)/scripts/place_diodes.py -l $::env(MERGED_LEF) -id $::env(CURRENT_DEF) -o $::env(SAVE_DEF) |& tee $::env(TERMINAL_OUTPUT) $::env(LOG_DIR)/diodes.log
set_def $::env(SAVE_DEF)
# Legalize
detailed_placement
}
proc run_flow {args} {
puts_info "Starting custom interactive flow..."
set script_dir [file dirname [file normalize [info script]]]
set options {
{-save_path optional}
{-tag optional}
}
set flags {-save}
parse_key_args "run_flow" args arg_values $options flags_map $flags -no_consume
prep -design $script_dir {*}$args
run_synthesis
run_floorplan
run_placement
run_cts
insert_diode
#gen_pdn
run_routing
if { $::env(DIODE_INSERTION_STRATEGY) == 2 } {
run_antenna_check
heal_antenna_violators; # modifies the routed DEF
}
if { $::env(LVS_INSERT_POWER_PINS) } {
write_powered_verilog
set_netlist $::env(lvs_result_file_tag).powered.v
}
run_magic
run_magic_spice_export
if { [info exists flags_map(-save) ] } {
if { [info exists arg_values(-save_path)] } {
save_views -lef_path $::env(magic_result_file_tag).lef \
-def_path $::env(tritonRoute_result_file_tag).def \
-gds_path $::env(magic_result_file_tag).gds \
-mag_path $::env(magic_result_file_tag).mag \
-spice_path $::env(magic_result_file_tag).spice \
-verilog_path $::env(CURRENT_NETLIST) \
-save_path $arg_values(-save_path) \
-tag $::env(RUN_TAG)
} else {
save_views -lef_path $::env(magic_result_file_tag).lef \
-def_path $::env(tritonRoute_result_file_tag).def \
-mag_path $::env(magic_result_file_tag).mag \
-gds_path $::env(magic_result_file_tag).gds \
-spice_path $::env(magic_result_file_tag).spice \
-verilog_path $::env(CURRENT_NETLIST) \
-tag $::env(RUN_TAG)
}
}
# Physical verification
run_magic_drc
run_lvs; # requires run_magic_spice_export
run_antenna_check
generate_final_summary_report
# Also run magic antenna check to compare (default uses OR antenna check).
run_magic_antenna_check
puts_success "Flow Completed Without Fatal Errors."
}
run_flow {*}$argv