| #!/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 |