aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/tools/scripts/viv_generate_bd.tcl
blob: 546a190b163ba6ddb73d1ca209ad27aed0b85f44 (plain)
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
#
# Copyright 2016 Ettus Research
#

# ---------------------------------------
# Gather all external parameters
# ---------------------------------------
set bd_file         $::env(BD_FILE)               ;# Absolute path to BD/Tcl file from src dir
set src_ext [file extension $bd_file]             ;# BD or Tcl file?
set part_name       $::env(PART_NAME)              ;# Full Xilinx part name
set bd_name [file rootname [file tail $bd_file]]   ;# Extract IP name
if {[info exists env(BD_IP_REPOS)]} {
    set ip_repos $::env(BD_IP_REPOS);# Any supporting IP repos
} else {
    set ip_repos {}
}
if {[info exists env(BD_HDL_SRCS)]} {
    set hdl_sources $::env(BD_HDL_SRCS);# Any supporting HDL files
} else {
    set hdl_sources {}
}

# Delete any previous output cookie file
file delete -force "$bd_file.out"
# ---------------------------------------
# Vivado Commands
# ---------------------------------------
create_project -part $part_name -in_memory
# In non-project mode, the hierarchy must be updated for the HDL source files to be
# correctly applied to the BD. See AR:
# https://www.xilinx.com/support/answers/63488.html
set_property source_mgmt_mode All [current_project]
set_property ip_repo_paths "{$ip_repos}" [current_project]
update_ip_catalog
# Add supplementary HDL sources, if they exist.
foreach src_file $hdl_sources {
    set hdl_ext [file extension $src_file ]
    if [expr [lsearch {.vhd .vhdl} $hdl_ext] >= 0] {
        puts "BUILDER: Adding VHDL    : $src_file"
        read_vhdl -library work $src_file
    } elseif [expr [lsearch {.v .sv .vh .svh} $hdl_ext] >= 0] {
        puts "BUILDER: Adding Verilog : $src_file"
        read_verilog $src_file
    } else {
        puts "BUILDER: \[WARNING\] File ignored!!!: $src_file"
    }
}
# Open .tcl or .bd design directly.
if [expr [lsearch {.tcl} $src_ext] >= 0] {
    puts "BUILDER: Generating Block Diagram from script: $bd_file"
    create_bd_design -dir . $bd_name
    source $bd_file
    report_ip_status
    puts "BUILDER: Report_ip_status done"
    set bd_file $bd_name.bd
} else {
    puts "BUILDER: Adding Block Diagram: $bd_file"
    add_files -norecurse $bd_file
    puts "BUILDER: Generating BD Target first pass..."
    generate_target all [get_files $bd_file] -force
    report_ip_status
    puts "BUILDER: Report_ip_status done"
    open_bd_design $bd_file
}
# Generate outputs.
puts "BUILDER: Generating BD Target..."
generate_target all [get_files $bd_file]
puts "BUILDER: Generate all done"

if { [get_msg_config -count -severity ERROR] == 0 } {
    # Write output cookie file
    set outfile [open "$bd_file.out" w]
    puts $outfile "This file was auto-generated by viv_generate_bd.tcl and signifies that BD generation is done."
    close $outfile
} else {
    exit 1
}