diff options
Diffstat (limited to 'fpga/usrp3/tools/scripts/viv_ip_utils.tcl')
-rw-r--r-- | fpga/usrp3/tools/scripts/viv_ip_utils.tcl | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/fpga/usrp3/tools/scripts/viv_ip_utils.tcl b/fpga/usrp3/tools/scripts/viv_ip_utils.tcl new file mode 100644 index 000000000..ba0e87899 --- /dev/null +++ b/fpga/usrp3/tools/scripts/viv_ip_utils.tcl @@ -0,0 +1,142 @@ +# +# 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"] + # Rewrite TCL BD file + write_bd_tcl -make_local -include_layout -force "$src_dir/$src_rootname.tcl" + puts "INFO: BD TCL source updated: $src_dir/$src_rootname.tcl" + # 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" +}
\ No newline at end of file |