2016-02-27 15:52:14 -05:00
|
|
|
#!/usr/bin/env bash
|
2014-12-31 14:42:13 -05:00
|
|
|
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'.
|
|
|
|
"
|
|
|
|
}
|
|
|
|
|
2016-07-19 14:55:12 -07:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-12-31 14:42:13 -05:00
|
|
|
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
|
2016-02-27 15:52:14 -05:00
|
|
|
test -d ip && { cp -r ip/* syn/scratch/; }
|
|
|
|
|
|
|
|
# populate IP Package hdl directories
|
2016-07-19 14:55:12 -07:00
|
|
|
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
|
2016-02-27 15:52:14 -05:00
|
|
|
|
2014-12-31 14:42:13 -05:00
|
|
|
|
|
|
|
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
|