Files
b210-k7-fpga/tools/scripts/viv_ip_utils.tcl
T
Max Köhler 275373c06b fpga: tools: viv_ip_utils to update hdl_sources.tcl
Original-commit: 1e8521f52ee9ba778d4240f1a0a197642f3cee8d
2024-03-08 08:23:49 -06:00

176 lines
6.7 KiB
Tcl

#
# Copyright 2015 Ettus Research
#
if [expr $argc < 2] {
error "ERROR: Invalid number of arguments"
exit
}
set cmd [lindex $argv 0]
set part_name [lindex $argv 1]
# Only create an in-memory roject when not using bdtcl commands.
if [expr [string first "_bdtcl" $cmd] == -1] {
create_project -in_memory -ip -name inmem_ip_proj -part $part_name
# Otherwise, set the system's TMP directory.
} else {
set sys_tmpdir [pwd]
if {[file exists "/tmp"]} {set sys_tmpdir "/tmp"}
catch {set sys_tmpdir $::env(TRASH_FOLDER)} ;# very old Macintosh. Mac OS X doesn't have this.
catch {set sys_tmpdir $::env(TMP)}
catch {set sys_tmpdir $::env(TEMP)}
}
if { [string compare $cmd "create"] == 0 } {
if [expr $argc < 5] {
error "ERROR: Invalid number of arguments for the create operation"
exit
}
set ip_name [lindex $argv 2]
set ip_dir [lindex $argv 3]
set ip_vlnv [lindex $argv 4]
create_ip -vlnv $ip_vlnv -module_name $ip_name -dir $ip_dir
} elseif { [string compare $cmd "modify"] == 0 } {
if [expr $argc < 3] {
error "ERROR: Invalid number of arguments for the modify operation"
exit
}
set src_file [lindex $argv 2]
set src_ext [file extension $src_file ]
if [expr [lsearch {.xci} $src_ext] >= 0] {
read_ip $src_file
} elseif [expr [lsearch {.bd} $src_ext] >= 0] {
add_files -norecurse $src_file
export_ip_user_files -of_objects [get_files $src_file] -force -quiet
open_bd_design $src_file
} else {
puts "ERROR: Invalid file extension: $src_ext"
}
} elseif { [string compare $cmd "list"] == 0 } {
puts "Supported IP for device ${part_name}:"
foreach ip [lsort [get_ipdefs]] {
puts "- $ip"
}
} elseif { [string compare $cmd "upgrade"] == 0 } {
if [expr $argc < 3] {
error "ERROR: Invalid number of arguments for the upgrade operation"
exit
}
set src_file [lindex $argv 2]
read_ip $src_file
upgrade_ip [get_ips *]
} elseif { [string compare $cmd "modify_bdtcl"] == 0 } {
if [expr $argc < 4] {
error "ERROR: Invalid number of arguments for the modify operation"
exit
}
set src_file [lindex $argv 2]
set src_rootname [file rootname [file tail $src_file]]
set src_ext [file extension $src_file ]
set ip_repos [lindex $argv 3]
set hdl_sources "[file dirname $src_file]/hdl_sources.tcl"
if [expr [lsearch {.tcl} $src_ext] >= 0] {
# Create a temporary project to work on.
set tmp_bddir "${sys_tmpdir}/.viv_${src_rootname}"
file mkdir $tmp_bddir
cd $tmp_bddir
# Create temporary project to store user changes.
create_project tmp_bd $tmp_bddir -part $part_name -force
set_property ip_repo_paths "{$ip_repos}" [current_project]
update_ip_catalog
# Add any supporting HDL first
if {[file exists $hdl_sources] == 1} {
source $hdl_sources
} else {
puts "hdl_sources.tcl not found in IP directory. Skipping HDL import for BD design"
}
# Recreate BD design from source file (.tcl)
source $src_file
regenerate_bd_layout
validate_bd_design
save_bd_design
} else {
puts "ERROR: Invalid file extension: $src_ext"
}
} elseif { [string compare $cmd "write_bdtcl"] == 0 } {
if [expr $argc < 3] {
error "ERROR: Invalid number of arguments for the create operation"
exit
}
# When regenerating a TCL file from a BD design, there should be a tmp project
# created by this tool ($cmd = modify_bdtcl).
set src_file [lindex $argv 2]
set src_rootname [file rootname [file tail $src_file]]
set src_ext [file extension $src_file ]
set src_dir [file dirname $src_file]
# Make sure a BD or TCL files is passed
if [expr [lsearch {.tcl} $src_ext] >= 0] {
# Validate that a previously created BD project exists.
set tmp_bddir "${sys_tmpdir}/.viv_${src_rootname}"
if {[file exists "$tmp_bddir/tmp_bd.xpr"] == 1} {
puts "INFO: Generating TCL file from BD design..."
# Open project and BD design
open_project "$tmp_bddir/tmp_bd.xpr"
open_bd_design [get_files "$src_rootname.bd"]
if [expr $argc > 3 && [string equal [lindex $argv 3] "upgrade"]] {
puts "INFO: Upgrading IP"
upgrade_ip [get_ips *]
validate_bd_design
}
# Rewrite TCL BD file
write_bd_tcl -make_local -force "$src_dir/$src_rootname.tcl"
puts "INFO: BD TCL source updated: $src_dir/$src_rootname.tcl"
# Export HDL source files into a seperate TCL file
puts "INFO: Generating hdl_sources.tcl file from project..."
set hdlSources -quiet [get_files -filter {FILE_TYPE == VHDL || FILE_TYPE == Verilog || FILE_TYPE == SystemVerilog}]
if {[llength $hdlSources] == 0} {
puts "INFO: No HDL sources found in project"
} else {
set hdlFileName "$src_dir/hdl_sources.tcl"
set fh [open $hdlFileName w]
# write file header
puts $fh "set script_loc \[file normalize \[info script\]\]"
puts $fh "set script_dir \[file dirname \$script_loc\]"
puts $fh ""
# sort the file list to make the output deterministic
set hdlSources [lsort $hdlSources]
# print file relative to the script location
foreach file $hdlSources {
set file_type [get_property FILE_TYPE $file]
set rel_file_path [exec realpath -s --relative-to=$src_dir $file]
if { $file_type == "VHDL"} {
puts $fh "read_vhdl -library work \$script_dir/$rel_file_path"
} elseif { $file_type == "Verilog"} {
puts $fh "read_verilog -library work \$script_dir/$rel_file_path"
} else {
puts $fh "read_verilog -sv -library work \$script_dir/$rel_file_path"
}
}
puts "INFO: $src_dir/hdl_sources.tcl file created or updated"
close $fh
}
# Close and delete tmp_bd project, not needed anymore.
close_project
puts "INFO: Deleting temp Vivado BD project..."
file delete -force -- $tmp_bddir
exit
} else {
puts "ERROR: No BD temp project found in: $tmp_bddir"
exit
}
} else {
puts "ERROR: Invalid file extension: $src_ext"
exit
}
} else {
error "ERROR: Invalid command: $cmd"
}