| # Copyright 2020-2022 Efabless Corporation |
| # |
| # 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. |
| |
| proc remove_empty_nets {args} { |
| set options {{-input required}} |
| set flags {} |
| parse_key_args "remove_empty_nets" args arg_values $options flags_map $flags |
| try_catch $::env(OPENROAD_BIN) -python $::env(SCRIPTS_DIR)/defutil.py remove_nets\ |
| --empty-only\ |
| --input-lef $::env(MERGED_LEF)\ |
| --output $arg_values(-input)\ |
| $arg_values(-input) |
| } |
| |
| proc resize_die {args} { |
| set options {\ |
| {-def required} \ |
| {-area required} |
| } |
| set flags {} |
| parse_key_args "resize_die" args arg_values $options flags_map $flags |
| |
| set llx [expr {[lindex $arg_values(-area) 0] * $::env(DEF_UNITS_PER_MICRON)}] |
| set lly [expr {[lindex $arg_values(-area) 1] * $::env(DEF_UNITS_PER_MICRON)}] |
| set urx [expr {[lindex $arg_values(-area) 2] * $::env(DEF_UNITS_PER_MICRON)}] |
| set ury [expr {[lindex $arg_values(-area) 3] * $::env(DEF_UNITS_PER_MICRON)}] |
| puts_info "Resizing Die to $arg_values(-area)" |
| try_catch sed -i -E "0,/^DIEAREA.*$/{s/^DIEAREA.*$/DIEAREA ( $llx $lly ) ( $urx $ury ) ;/}" $arg_values(-def) |
| } |
| |
| proc get_instance_position {args} { |
| set options {\ |
| {-instance required}\ |
| {-def optional} |
| } |
| set flags {} |
| parse_key_args "get_instance_position" args arg_values $options flags_map $flags |
| |
| set instance $arg_values(-instance) |
| if { [info exists arg_values(-def)] } { |
| set def $arg_values(-def) |
| } elseif { [info exists ::env(CURRENT_DEF)] } { |
| set def $::env(CURRENT_DEF) |
| } else { |
| puts_err "No DEF specified" |
| return -code error |
| } |
| |
| puts $instance |
| set pos [exec sed -E -n "s/^\s*-\s+$instance.*\( (\[\[:digit:\]\]+) (\[\[:digit:\]\]+) \).*;$/\1 \2/p" $arg_values(-def)] |
| |
| return $pos |
| } |
| |
| |
| |
| proc add_lefs {args} { |
| set options {{-src required} \ |
| \ |
| } |
| set flags {} |
| parse_key_args "add_lefs" args arg_values $options flags_map $flags |
| puts_info "Merging $arg_values(-src)" |
| |
| |
| if { $::env(WIDEN_SITE) == 1 && $::env(WIDEN_SITE_IS_FACTOR) == 1 } { |
| |
| try_catch $::env(SCRIPTS_DIR)/mergeLef.py -i $::env(MERGED_LEF) {*}$arg_values(-src) -o $::env(MERGED_LEF).new |
| try_catch $::env(SCRIPTS_DIR)/mergeLef.py -i $::env(MERGED_LEF_UNPADDED) {*}$arg_values(-src) -o $::env(MERGED_LEF_UNPADDED).new |
| |
| try_catch mv $::env(MERGED_LEF).new $::env(MERGED_LEF) |
| try_catch mv $::env(MERGED_LEF_UNPADDED).new $::env(MERGED_LEF_UNPADDED) |
| |
| } else { |
| # The original lef |
| try_catch $::env(SCRIPTS_DIR)/mergeLef.py -i $::env(MERGED_LEF_ORIGINAL) {*}$arg_values(-src) -o $::env(MERGED_LEF_ORIGINAL).new |
| try_catch $::env(SCRIPTS_DIR)/mergeLef.py -i $::env(MERGED_LEF_UNPADDED_ORIGINAL) {*}$arg_values(-src) -o $::env(MERGED_LEF_UNPADDED_ORIGINAL).new |
| |
| try_catch mv $::env(MERGED_LEF_ORIGINAL).new $::env(MERGED_LEF_ORIGINAL) |
| try_catch mv $::env(MERGED_LEF_UNPADDED_ORIGINAL).new $::env(MERGED_LEF_UNPADDED_ORIGINAL) |
| |
| # The modified lef |
| try_catch $::env(SCRIPTS_DIR)/mergeLef.py -i $::env(MERGED_LEF_WIDENED) {*}$arg_values(-src) -o $::env(MERGED_LEF_WIDENED).new |
| try_catch $::env(SCRIPTS_DIR)/mergeLef.py -i $::env(MERGED_LEF_UNPADDED_WIDENED) {*}$arg_values(-src) -o $::env(MERGED_LEF_UNPADDED_WIDENED).new |
| |
| try_catch mv $::env(MERGED_LEF_WIDENED).new $::env(MERGED_LEF_WIDENED) |
| try_catch mv $::env(MERGED_LEF_UNPADDED_WIDENED).new $::env(MERGED_LEF_UNPADDED_WIDENED) |
| } |
| } |
| |
| proc merge_components {args} { |
| set options {{-input1 required} \ |
| {-input2 required} \ |
| {-output required} \ |
| } |
| set flags {} |
| parse_key_args "merge_components" args arg_values $options flags_map $flags |
| try_catch $::env(OPENROAD_BIN) -python $::env(SCRIPTS_DIR)/defutils.py\ |
| merge_components\ |
| --input-lef $::env(MERGED_LEF)\ |
| --output $arg_values(-output)\ |
| $arg_values(-input1) $arg_values(-input2) |
| } |
| |
| |
| proc move_pins {args} { |
| # To be precise, this REPLACES pins in to with the ones in from. |
| set options {{-from required} \ |
| {-to required} \ |
| } |
| set flags {} |
| parse_key_args "move_pins" args arg_values $options flags_map $flags |
| try_catch $::env(OPENROAD_BIN) -python $::env(SCRIPTS_DIR)/defutil.py replace_pins\ |
| --output $arg_values(-to)\ |
| --input-lef $::env(MERGED_LEF)\ |
| $arg_values(-from) $arg_values(-to) |
| } |
| |
| proc zeroize_origin_lef {args} { |
| set options {{-file required} \ |
| } |
| set flags {} |
| parse_key_args "zeroize_origin_lef" args arg_values $options flags_map $flags |
| exec cp $arg_values(-file) $arg_values(-file).original |
| try_catch python3 $::env(SCRIPTS_DIR)/zeroize_origin_lef.py < $arg_values(-file) > $arg_values(-file).zeroized |
| exec mv $arg_values(-file).zeroized $arg_values(-file) |
| } |
| |
| |
| proc remove_pins {args} { |
| set options {{-input required}} |
| set flags {} |
| parse_key_args "remove_pins" args arg_values $options flags_map $flags |
| try_catch $::env(OPENROAD_BIN) -python $::env(SCRIPTS_DIR)/defutil.py remove_pins\ |
| --input-lef $::env(MERGED_LEF)\ |
| --output $arg_values(-input)\ |
| $arg_values(-input) |
| } |
| |
| |
| proc remove_nets {args} { |
| set options {{-input required}} |
| set flags {} |
| parse_key_args "remove_nets" args arg_values $options flags_map $flags |
| try_catch $::env(OPENROAD_BIN) -python $::env(SCRIPTS_DIR)/defutil.py remove_nets\ |
| --input-lef $::env(MERGED_LEF)\ |
| --output $arg_values(-input)\ |
| $arg_values(-input) |
| } |
| |
| proc remove_components {args} { |
| set options {{-input required}} |
| set flags {} |
| parse_key_args "remove_components" args arg_values $options flags_map $flags |
| try_catch $::env(OPENROAD_BIN) -python $::env(SCRIPTS_DIR)/defutil.py remove_components\ |
| --input-lef $::env(MERGED_LEF)\ |
| --output $arg_values(-input)\ |
| $arg_values(-input) |
| } |
| |
| proc remove_component {args} { |
| set options { |
| {-input required} |
| {-instance_name required} |
| } |
| set flags {} |
| parse_key_args "remove_component" args arg_values $options flags_map $flags |
| try_catch $::env(OPENROAD_BIN) -python $::env(SCRIPTS_DIR)/defutil.py remove_components\ |
| --input-lef $::env(MERGED_LEF)\ |
| --instance-name $arg_values(-instance_name) --not-rx\ |
| --output $arg_values(-input)\ |
| $arg_values(-input) |
| } |
| |
| package provide openlane_utils 0.9 |