#!/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