mirror of
https://github.com/bmartini/zynq-axis.git
synced 2024-09-05 19:19:27 +08:00
65a3a448fd
This involves parsing the topfile of the package (as determined by the name of the package) and copying only the 'included' files. The code to do this was taken from my 'cpvdep' script found at my github account.
165 lines
3.7 KiB
Bash
Executable File
165 lines
3.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -o errexit
|
|
|
|
|
|
function print_usage() {
|
|
echo "
|
|
Usage: $0 [OPTION]
|
|
|
|
Description: Prepare project build directories for use in scratch.
|
|
|
|
Options:
|
|
-c Copy Verilog source code and 3rd party IP to an already existing
|
|
syn/scratch/ directory. Perform no other functions.
|
|
|
|
-h Print this help info.
|
|
|
|
-l Symbolically link project files into the scratch dir instead of copying
|
|
them. Any changes to these file during building will thus be propagated
|
|
back into the repo.
|
|
|
|
-L Symbolically link project directory into the scratch instead of copying
|
|
it. This takes precedents over the '-l'.
|
|
"
|
|
}
|
|
|
|
|
|
function included_files {
|
|
# limitations in regex, only one file name per include
|
|
# limitations in regex, file name cannot have double quote char
|
|
|
|
grep -o '^\s*`include\s*\".*\"' ${1} | awk -F\" '{print $(NF-1)}'
|
|
}
|
|
|
|
|
|
# argument assumed to be full path name
|
|
function copy_with_dependencies {
|
|
# put file into set
|
|
fileset[$(basename ${1})]=${1}
|
|
|
|
# copy file to destination
|
|
cp -n "${1}" "${2}" || { echo "ERROR unable to copy file ${1}" ; exit 1; }
|
|
|
|
for file in $(included_files ${1})
|
|
do
|
|
# does the file exist in working dir
|
|
if [ ! -f ${file} ]
|
|
then
|
|
# find the first file that matches the name
|
|
file=$(find . -name ${file} -type f -print | head -n 1)
|
|
|
|
# zero length if file not found
|
|
test -z "${file}" && continue
|
|
fi
|
|
|
|
# checkout if file is in set that thus has been copied already
|
|
if [ ! ${fileset[$(basename ${file})]} ]
|
|
then :
|
|
# since has not been copied, call copy_with_dependencies on it
|
|
copy_with_dependencies ${file} ${2}
|
|
fi
|
|
done
|
|
}
|
|
|
|
|
|
function copy_for_synth() {
|
|
test -d syn/scratch/src || { echo "ERROR: directory 'syn/scratch/src' not found" ; exit 1; }
|
|
|
|
# copy verilog code files from hdl directory into syn work dir
|
|
for FILE in $(find ./hdl/ -name "*.v" -type f -print)
|
|
do
|
|
cp -n $FILE ./syn/scratch/src/ || { echo "ERROR duplicate filename ${FILE}" ; exit 1; }
|
|
done
|
|
|
|
# copy verilog header files from hdl directory into syn work dir
|
|
for FILE in $(find ./hdl/ -name "*.vh" -type f -print)
|
|
do
|
|
cp -n $FILE ./syn/scratch/src/ || { echo "ERROR duplicate filename ${FILE}" ; exit 1; }
|
|
done
|
|
|
|
# copy SystemVerilog code files from hdl directory into syn work dir
|
|
for FILE in $(find ./hdl/ -name "*.sv" -type f -print)
|
|
do
|
|
cp -n $FILE ./syn/scratch/src/ || { echo "ERROR duplicate filename ${FILE}" ; exit 1; }
|
|
done
|
|
|
|
|
|
# copy 3rd party IP into syn work dir
|
|
test -d ip && { cp -r ip/* syn/scratch/; }
|
|
|
|
# populate IP Package hdl directories
|
|
if [ -d "syn/scratch/ip_repo" ]; then
|
|
cd syn/scratch
|
|
|
|
for PKG in ip_repo/*
|
|
do
|
|
declare -A fileset
|
|
|
|
mkdir -p "${PKG}"/hdl
|
|
TOPFILE=$(basename "${PKG%_1.0}").v
|
|
copy_with_dependencies "src/${TOPFILE}" "${PKG}/hdl/";
|
|
|
|
unset fileset
|
|
done
|
|
|
|
cd ../..
|
|
fi
|
|
|
|
|
|
echo "Source files copied to scratch directory"
|
|
}
|
|
|
|
|
|
flag_l=
|
|
flag_L=
|
|
|
|
# command line options
|
|
while getopts "chlL" flag
|
|
do
|
|
case "$flag" in
|
|
c) copy_for_synth; exit 0;;
|
|
L) flag_L=1;;
|
|
l) flag_l=1;;
|
|
h) print_usage; exit 2;;
|
|
?) print_usage; exit 2;;
|
|
esac
|
|
done
|
|
|
|
|
|
# create syn scratch work directory
|
|
test -d syn/scratch && rm -rf syn/scratch
|
|
mkdir -p syn/scratch/src
|
|
|
|
# copy verilog code and IP into syn work dir
|
|
copy_for_synth
|
|
|
|
# create syn project for use in syn work dir
|
|
cd syn
|
|
|
|
# create build directories
|
|
if [ ! -z "$flag_L" ]; then
|
|
# link directories
|
|
for DIR in $(find project-* -maxdepth 0 -type d)
|
|
do
|
|
ln -s "${PWD}/$DIR" "scratch/$DIR"
|
|
done
|
|
elif [ ! -z "$flag_l" ]; then
|
|
# create directories but link files
|
|
for DIR in $(find project-*/ -type d)
|
|
do
|
|
mkdir -p "scratch/$DIR"
|
|
done
|
|
|
|
# populate with links to files
|
|
for FILE in $(find project-*/ -type f)
|
|
do
|
|
ln -s "${PWD}/$FILE" "scratch/$FILE"
|
|
done
|
|
else
|
|
# copy directories
|
|
for DIR in $(find project-* -maxdepth 0 -type d)
|
|
do
|
|
cp -r "$DIR" "scratch/$DIR"
|
|
done
|
|
fi
|