From dc0b3db1b4f1895a07e5fe280ee3790e87f97b9f Mon Sep 17 00:00:00 2001 From: Ataberk Date: Sun, 25 Sep 2022 17:22:03 +0200 Subject: Initial commit --- sources/scripts/generate.tcl | 111 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 sources/scripts/generate.tcl (limited to 'sources/scripts/generate.tcl') diff --git a/sources/scripts/generate.tcl b/sources/scripts/generate.tcl new file mode 100644 index 0000000..375890b --- /dev/null +++ b/sources/scripts/generate.tcl @@ -0,0 +1,111 @@ +# Returns all directory names in a given directory (non-recursive) +proc get_dir_names {path} { + set dirs [glob -directory "$path" -type d *] + set dir_names {} + foreach project $dirs { + lappend dir_names [string map "$path/ \"\"" $project] + } + return $dir_names +} + +# Version safe wait procedure for a single run. wait_on_run changed to wait_on_runs after Vivado 2021.2 +proc safe_wait { run } { + if { [catch wait_on_runs $run] } { + wait_on_run $run + } +} + +# Version safe wait procedure for multiple runs. wait_on_run changed to wait_on_runs after Vivado 2021.2 +proc safe_wait_multiple { run_list } { + if { [catch wait_on_runs $run_list] } { + foreach run $run_list { wait_on_run $run } + } +} + +# Check required args +if { $argc != 1 } { + puts "Please provide to script." + puts "For example, vivado -mode batch generate.tcl -tclargs 12" + exit 0 +} + +# Set path variables +set PROJECT_PATH [pwd] +set PROJECT_NAME [string map ".xpr \"\" $PROJECT_PATH/ \"\"" [glob -directory $PROJECT_PATH *.xpr]] +set PROJECT_IP_PATH "$PROJECT_PATH/$PROJECT_NAME.srcs/sources_1/ip" +set NUM_JOBS [lindex $argv 0] + +# Check if project exists +if { ![file exist $PROJECT_PATH] } { + puts "Project not found on $PROJECT_PATH." + exit 0 +} + +# Open the project +open_project "$PROJECT_PATH/$PROJECT_NAME.xpr" + +update_compile_order -fileset sources_1 + +# Reset previous runs +reset_project + +# IP run variables +set ip_list [get_ips] +set ip_runs {} +set phy_list {} +foreach ip $ip_list { + if {[string first "phy_" $ip] != -1} { + lappend phy_list "$ip" + } + lappend ip_runs "${ip}_synth_1" +} + + +# Reset ourput products of all IPs +reset_target all $ip_list + +# Set fileset to main sources +update_compile_order -fileset sources_1 + +# Re-generate all output products +generate_target all $ip_list + +foreach ip $ip_list { + create_ip_run [get_ips $ip] +} + +launch_runs $ip_runs -verbose -jobs $NUM_JOBS +safe_wait_multiple $ip_runs + +# Lock PHY and Apply patches +foreach phy_ip $phy_list { + set_property IS_LOCKED true [get_files "${phy_ip}.xci"] +} + +if { [catch {exec "${PROJECT_PATH}/apply_patches.sh"} result] != 0 } { + puts "Script 'apply_patches.sh' has no return value, assumed exit value 0 (TCL_OK). Check first incase any errors." +} + +# Reset and relaunch PHY runs +foreach phy_ip $phy_list { + reset_run [get_runs "${phy_ip}_synth_1"] +} + +foreach phy_ip $phy_list { + launch_run [get_runs "${phy_ip}_synth_1"] +} + +foreach phy_ip $phy_list { + safe_wait "${phy_ip}_synth_1" +} + +# Synthesis +launch_runs synth_1 -verbose -jobs $NUM_JOBS +safe_wait "synth_1" + +# Implementation and Bitstream generation +launch_runs impl_1 -to_step write_bitstream -verbose -jobs $NUM_JOBS +safe_wait "impl_1" + +# Done +puts "Bitstream generated successfully. Exitting." -- cgit v1.2.3