9593e5eee6
vivado.tcl is now the entrypoint for the Vivado Tcl scripts and will automatically source all the other required scripts. A command line argument parser was written and replaces the previous system of using environment variables to pass values into the scripts. The VSRCSVIVADOTCL environment variable has been replaced with a -F command line option, and the file format has changed from a Tcl script to a simple newline-delimited list of files.
119 lines
3.1 KiB
Tcl
119 lines
3.1 KiB
Tcl
# See LICENSE for license details.
|
|
|
|
# Process command line arguments
|
|
# http://wiki.tcl.tk/1730
|
|
set ip_vivado_tcls {}
|
|
|
|
while {[llength $argv]} {
|
|
set argv [lassign $argv[set argv {}] flag]
|
|
switch -glob $flag {
|
|
-top-module {
|
|
set argv [lassign $argv[set argv {}] top]
|
|
}
|
|
-F {
|
|
# This should be a simple file format with one filepath per line
|
|
set argv [lassign $argv[set argv {}] vsrc_manifest]
|
|
}
|
|
-board {
|
|
set argv [lassign $argv[set argv {}] board]
|
|
}
|
|
-ip-vivado-tcls {
|
|
set argv [lassign $argv[set argv {}] ip_vivado_tcls]
|
|
}
|
|
-pre-impl-debug-tcl {
|
|
set argv [lassign $argv[set argv {}] pre_impl_debug_tcl]
|
|
}
|
|
-post-impl-debug-tcl {
|
|
set argv [lassign $argv[set argv {}] post_impl_debug_tcl]
|
|
}
|
|
default {
|
|
return -code error [list {unknown option} $flag]
|
|
}
|
|
}
|
|
}
|
|
|
|
if {![info exists top]} {
|
|
return -code error [list {--top-module option is required}]
|
|
}
|
|
|
|
if {![info exists vsrc_manifest]} {
|
|
return -code error [list {-F option is required}]
|
|
}
|
|
|
|
if {![info exists board]} {
|
|
return -code error [list {--board option is required}]
|
|
}
|
|
|
|
# Set the variable for all the common files
|
|
set commondir [file dirname $scriptdir]
|
|
|
|
# Set the variable that points to board specific files
|
|
set boarddir [file join [file dirname $commondir] $board]
|
|
source [file join $boarddir tcl board.tcl]
|
|
|
|
# Set the variable that points to board constraint files
|
|
set constraintsdir [file join $boarddir constraints]
|
|
|
|
# Set the variable that points to common verilog sources
|
|
set srcdir [file join $commondir vsrc]
|
|
|
|
# Creates a work directory
|
|
set wrkdir [file join [pwd] obj]
|
|
|
|
# Create the directory for IPs
|
|
set ipdir [file join $wrkdir ip]
|
|
|
|
# Create an in-memory project
|
|
create_project -part $part_fpga -in_memory
|
|
|
|
# Set the board part, target language, default library, and IP directory
|
|
# paths for the current project
|
|
set_property -dict [list \
|
|
BOARD_PART $part_board \
|
|
TARGET_LANGUAGE {Verilog} \
|
|
DEFAULT_LIB {xil_defaultlib} \
|
|
IP_REPO_PATHS $ipdir \
|
|
] [current_project]
|
|
|
|
if {[get_filesets -quiet sources_1] eq ""} {
|
|
create_fileset -srcset sources_1
|
|
}
|
|
set obj [current_fileset]
|
|
|
|
# Add verilog files from manifest
|
|
proc load_vsrc_manifest {obj vsrc_manifest} {
|
|
set fp [open $vsrc_manifest r]
|
|
set files [lsearch -not -exact -all -inline [split [read $fp] "\n"] {}]
|
|
set relative_files {}
|
|
foreach path $files {
|
|
if {[string match {/*} $path]} {
|
|
lappend relative_files $path
|
|
} elseif {![string match {#*} $path]} {
|
|
lappend relative_files [file join [file dirname $vsrc_manifest] $path]
|
|
}
|
|
}
|
|
add_files -norecurse -fileset $obj {*}$relative_files
|
|
close $fp
|
|
}
|
|
|
|
load_vsrc_manifest $obj $vsrc_manifest
|
|
|
|
# Add IP Vivado TCL
|
|
if {$ip_vivado_tcls ne {}} {
|
|
# Split string into words even with multiple consecutive spaces
|
|
# http://wiki.tcl.tk/989
|
|
set ip_vivado_tcls [regexp -inline -all -- {\S+} $ip_vivado_tcls]
|
|
}
|
|
|
|
if {[get_filesets -quiet sim_1] eq ""} {
|
|
create_fileset -simset sim_1
|
|
}
|
|
set obj [current_fileset -simset]
|
|
|
|
if {[get_filesets -quiet constrs_1] eq ""} {
|
|
create_fileset -constrset constrs_1
|
|
}
|
|
|
|
set obj [current_fileset -constrset]
|
|
add_files -norecurse -fileset $obj [glob -directory $constraintsdir {*.xdc}]
|