# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

proc print_lr_synth_banner {} {
puts { _                  ______  _____  _____  _____  }
puts {| |                 | ___ \|_   _|/  ___|/  __ \ }
puts {| |  ___  __      __| |_/ /  | |  \ `--. | /  \/ }
puts {| | / _ \ \ \ /\ / /|    /   | |   `--. \| |     }
puts {| || (_) | \ V  V / | |\ \  _| |_ /\__/ /| \__/\ }
puts {|_| \___/   \_/\_/  \_| \_| \___/ \____/  \____/ }
puts {                                                 }
puts {                                                 }
puts {                            _    _               }
puts {                           | |  | |              }
puts {         ___  _   _  _ __  | |_ | |__            }
puts {        / __|| | | || '_ \ | __|| '_ \           }
puts {        \__ \| |_| || | | || |_ | | | |          }
puts {        |___/ \__, ||_| |_| \__||_| |_|          }
puts {               __/ |                             }
puts {              |___/                              }
puts {}
puts {******  o p e n   t o   t h e   c o r e  ******* }
puts {}
}

proc print_yosys_banner {} {
puts {       +---------------------------------+}
puts {       |  _   _   ___   ___  _   _  ___  |}
puts {       | | | | | / _ \ / __|| | | |/ __| |}
puts {       | | |_| || (_) |\__ \| |_| |\__ \ |}
puts {       |  \__, | \___/ |___/ \__, ||___/ |}
puts {       |   __/ |              __/ |      |}
puts {       |  |___/              |___/       |}
puts {       +---------------------------------+}
puts {}
}

proc print_opensta_banner {} {
puts {+--------------------------------------------------+}
puts {|  _____                      _____  _____   ___   |}
puts {| |  _  |                    /  ___||_   _| / _ \  |}
puts {| | | | | _ __    ___  _ __  \ `--.   | |  / /_\ \ |}
puts {| | | | || '_ \  / _ \| '_ \  `--. \  | |  |  _  | |}
puts {| \ \_/ /| |_) ||  __/| | | |/\__/ /  | |  | | | | |}
puts {|  \___/ | .__/  \___||_| |_|\____/   \_/  \_| |_/ |}
puts {|        | |                                       |}
puts {|        |_|                                       |}
puts {+--------------------------------------------------+}
puts {}
}

proc set_flow_var {var_name var_default var_friendly_name} {
  global lr_synth_flow_var_quiet

  set var_name "lr_synth_${var_name}"
  global $var_name
  set env_var_name [string toupper $var_name]

  if { [info exists ::env($env_var_name)] } {
    set $var_name $::env($env_var_name)
    puts "$var_friendly_name: $::env($env_var_name)"
  } else {
    set $var_name $var_default
    puts "$var_friendly_name: $var_default (default)"
  }
}

proc set_flow_bool_var {var_name var_default var_friendly_name} {
  global lr_synth_flow_var_quiet

  set var_name "lr_synth_${var_name}"
  global $var_name
  set env_var_name [string toupper $var_name]

  if { [info exists ::env($env_var_name)] } {
    if { $::env($env_var_name) } {
      set $var_name 1
    } else {
      set $var_name 0
    }
  } else {
    set $var_name $var_default
  }

  if { [set $var_name] } {
    puts "$var_friendly_name: Enabled"
  } else {
    puts "$var_friendly_name: Disabled"
  }
}

proc write_sdc_out {sdc_file_in sdc_file_out} {
  global lr_synth_clk_period
  global lr_synth_clk_input
  
  global lr_synth_clk_fast_period
  global lr_synth_clk_fast_input
  
  global lr_synth_outputs
  global lr_synth_inputs

  set sdc_out [open $sdc_file_out "w"]
  set sdc_in  [open $sdc_file_in "r"]

  set sdc_in_contents [read $sdc_in]
  puts $sdc_out $sdc_in_contents

  puts $sdc_out "#============ Auto-generated from config ============"

  set clk_period_ns [expr $lr_synth_clk_period / 1000.0]
  set clk_fast_period_ns [expr $lr_synth_clk_fast_period / 1000.0]
  puts $sdc_out "create_clock -name $lr_synth_clk_input -period $clk_period_ns {$lr_synth_clk_input}"
  puts $sdc_out "create_clock -name $lr_synth_clk_fast_input -period $clk_fast_period_ns {$lr_synth_clk_fast_input}"

  foreach output $lr_synth_outputs {
    set output_constraint [lindex $output 1]
    set output_constraint [expr (1.0 - ($output_constraint / 100.0)) * $clk_period_ns]
    puts $sdc_out "set_output_delay -clock $lr_synth_clk_input $output_constraint [lindex $output 0]"
    puts $sdc_out "set_output_delay -clock $lr_synth_clk_fast_input $output_constraint [lindex $output 0]"
  }

  foreach input $lr_synth_inputs {
    set input_constraint [lindex $input 1]
    set input_constraint [expr ($input_constraint / 100.0) * $clk_period_ns]
    puts $sdc_out "set_input_delay -clock $lr_synth_clk_input $input_constraint [lindex $input 0]"
    puts $sdc_out "set_input_delay -clock $lr_synth_clk_fast_input $input_constraint [lindex $input 0]"
  }

  close $sdc_out
  close $sdc_in
}
