File: viv_ip_utils.tcl

package info (click to toggle)
uhd 4.8.0.0%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 183,172 kB
  • sloc: cpp: 279,415; python: 109,850; ansic: 103,348; vhdl: 57,230; tcl: 20,007; xml: 8,581; makefile: 2,863; sh: 2,797; pascal: 230; javascript: 120; csh: 94; asm: 20; perl: 11
file content (186 lines) | stat: -rw-r--r-- 7,409 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#
# 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..."
            # The VHDL part captures the 2008 standard as well.
            # The Verilog part comprises SystemVerilog and Verilog files along with header files.
            set hdlSources [get_files -quiet -filter {FILE_TYPE =~ "*VHDL*" || FILE_TYPE =~ "*Verilog*"}]
            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]
                    # check whether file_type contains the word VHDL
                    if { [ string first "VHDL" $file_type ] != -1 } {
                        if { $file_type == "VHDL" } {
                            puts $fh "read_vhdl           -library work \$script_dir/$rel_file_path"
                        } else {
                            puts $fh "read_vhdl ‑vhdl2008 -library work \$script_dir/$rel_file_path"
                        }
                    # must be one of the verilog types
                    } else {
                        if { $file_type != "SystemVerilog" } {
                            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"
}