blob: 232f67f07d53fe8f864fe21062a50b2b4b14835c [file] [log] [blame]
#!/usr/bin/env bash
#
# Copyright (C) 2020-2022 F4PGA Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
set -e
print_usage () {
echo "Usage: symbiflow_synth -v|--verilog <Verilog file list>"
echo " [-t|--top <top module name>]"
echo " [-F|--family <device family>]"
echo " [-d|--device <device type (e.g. qlf_k4n8)>]"
echo " [-P|--part <part name>]"
echo " [-p|--pcf <PCF IO constraints>]"
echo " [-y <Verilog library search path>"
echo " [+libext+<Verilog library file extension>]"
echo " [+incdir+<Verilog include path>]"
echo " [+define+<macro name>[=<macro value>]]"
echo " [-f <additional compile command file>]"
echo ""
exit 1
}
VERILOG_FILES=()
TOP="top"
DEVICE=""
FAMILY=""
PART=""
PCF=""
EXTRA_ARGS=()
OPT=""
for arg in $@; do
case $arg in
-t|--top) OPT="top" ;;
-v|--verilog) OPT="vlog" ;;
-d|--device) OPT="dev" ;;
-F|--family) OPT="family" ;;
-P|--part) OPT="part" ;;
-p|--pcf) OPT="pcf" ;;
-y|-f|+incdir+*|+libext+*|+define+*) OPT="xtra" ;;
*)
case $OPT in
"top") TOP=$arg; OPT="" ;;
"dev") DEVICE=$arg; OPT="" ;;
"family") FAMILY=$arg; OPT="" ;;
"part") PART=$arg; OPT="" ;;
"pcf") PCF=$arg; OPT="" ;;
"vlog") VERILOG_FILES+=($arg) ;;
"xtra") ;;
*) print_usage ;;
esac
;;
esac
if [ "$OPT" == "xtra" ]; then EXTRA_ARGS+=($arg); fi
done
if [ -z ${FAMILY} ]; then echo "Please specify device family"; exit 1; fi
if [ ${#VERILOG_FILES[@]} -eq 0 ]; then echo "Please provide at least one Verilog file"; exit 1; fi
PINMAPCSV="pinmap_${PART}.csv"
export USE_ROI="FALSE"
export OUT_JSON=$TOP.json
export SYNTH_JSON=${TOP}_io.json
export OUT_SYNTH_V=${TOP}_synth.v
export OUT_EBLIF=${TOP}.eblif
export OUT_FASM_EXTRA=${TOP}_fasm_extra.fasm
export PYTHON3=$(which python3)
if [ -s $PCF ]; then
export PCF_FILE=$PCF
else
export PCF_FILE=""
fi
DEVICE_PATH="${F4PGA_SHARE_DIR}/arch/${DEVICE}_${DEVICE}"
export PINMAP_FILE=${DEVICE_PATH}/${PINMAPCSV}
if [ -d "${DEVICE_PATH}/cells" ]; then
export DEVICE_CELLS_SIM=`find ${DEVICE_PATH}/cells -name "*_sim.v"`
export DEVICE_CELLS_MAP=`find ${DEVICE_PATH}/cells -name "*_map.v"`
else
# pp3 family has different directory naming scheme
# the are named as ${DEVICE}_${PACKAGE}
# ${PACKAGE} is not known because it is not passed down in add_binary_toolchain_test
DEVICE_PATH=$(find "${F4PGA_SHARE_DIR}"/arch/ -type d -name "${DEVICE}*")
export PINMAP_FILE=${DEVICE_PATH}/${PINMAPCSV}
if [ -d "${DEVICE_PATH}/cells" ]; then
export DEVICE_CELLS_SIM=`find ${DEVICE_PATH}/cells -name "*_sim.v"`
export DEVICE_CELLS_MAP=`find ${DEVICE_PATH}/cells -name "*_map.v"`
else
export DEVICE_CELLS_SIM=
export DEVICE_CELLS_MAP=
fi
fi
yosys_cmds=`echo ${EXTRA_ARGS[*]} | python3 -m f4pga.utils.quicklogic.convert_compile_opts`
if [ ! -z "${yosys_cmds}" ]; then yosys_cmds="${yosys_cmds//$'\n'/'; '}; "; fi
yosys_read_cmds=''
for f in ${VERILOG_FILES[*]}; do
yosys_read_cmds="read_verilog ${f}; $yosys_read_cmds"
done
`which yosys` \
-p "$yosys_cmds $yosys_read_cmds tcl $(python3 -m f4pga.wrappers.tcl "${FAMILY}")" \
-l "${TOP}_synth.log"