# 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
