# 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_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] puts $sdc_out "create_clock -name $lr_synth_clk_input -period $clk_period_ns {$lr_synth_clk_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]" } 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]" } close $sdc_out close $sdc_in }