|  | #!/bin/bash | 
|  |  | 
|  | # Copyright lowRISC contributors. | 
|  | # Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | # SPDX-License-Identifier: Apache-2.0 | 
|  |  | 
|  | # This script drives the experimental Ibex synthesis flow. More details can be | 
|  | # found in README.md | 
|  |  | 
|  | set -e | 
|  | set -o pipefail | 
|  |  | 
|  | error () { | 
|  | echo >&2 "$@" | 
|  | exit 1 | 
|  | } | 
|  |  | 
|  | teelog () { | 
|  | tee "$LR_SYNTH_OUT_DIR/log/$1.log" | 
|  | } | 
|  |  | 
|  | if [ ! -f syn_setup.sh ]; then | 
|  | error "No syn_setup.sh file: see README.md for instructions" | 
|  | fi | 
|  |  | 
|  | #------------------------------------------------------------------------- | 
|  | # setup flow variables | 
|  | #------------------------------------------------------------------------- | 
|  | source syn_setup.sh | 
|  |  | 
|  | #------------------------------------------------------------------------- | 
|  | # use sv2v to convert all SystemVerilog files to Verilog | 
|  | #------------------------------------------------------------------------- | 
|  |  | 
|  | LR_DEP_SOURCES=( | 
|  | "../vendor/lowrisc_ip/ip/prim_generic/rtl/prim_generic_buf.sv" | 
|  | "../vendor/lowrisc_ip/ip/prim_generic/rtl/prim_generic_flop.sv" | 
|  | ) | 
|  |  | 
|  | mkdir -p "$LR_SYNTH_OUT_DIR/generated" | 
|  | mkdir -p "$LR_SYNTH_OUT_DIR/log" | 
|  | mkdir -p "$LR_SYNTH_OUT_DIR/reports/timing" | 
|  |  | 
|  | # Convert dependency sources | 
|  | for file in "${LR_DEP_SOURCES[@]}"; do | 
|  | module=$(basename -s .sv "$file") | 
|  |  | 
|  | sv2v \ | 
|  | --define=SYNTHESIS --define=YOSYS \ | 
|  | -I../vendor/lowrisc_ip/ip/prim/rtl \ | 
|  | "$file" \ | 
|  | > "$LR_SYNTH_OUT_DIR"/generated/"${module}".v | 
|  | done | 
|  |  | 
|  | # Convert core sources | 
|  | for file in ../rtl/*.sv; do | 
|  | module=$(basename -s .sv "$file") | 
|  |  | 
|  | # Skip packages | 
|  | if echo "$module" | grep -q '_pkg$'; then | 
|  | continue | 
|  | fi | 
|  |  | 
|  | sv2v \ | 
|  | --define=SYNTHESIS --define=YOSYS \ | 
|  | ../rtl/*_pkg.sv \ | 
|  | ../vendor/lowrisc_ip/ip/prim/rtl/prim_ram_1p_pkg.sv \ | 
|  | ../vendor/lowrisc_ip/ip/prim/rtl/prim_secded_pkg.sv \ | 
|  | -I../vendor/lowrisc_ip/ip/prim/rtl \ | 
|  | -I../vendor/lowrisc_ip/dv/sv/dv_utils \ | 
|  | "$file" \ | 
|  | > "$LR_SYNTH_OUT_DIR"/generated/"${module}".v | 
|  |  | 
|  | # Make sure auto-generated primitives are resolved to generic primitives | 
|  | # where available. | 
|  | sed -i 's/prim_buf/prim_generic_buf/g'  "$LR_SYNTH_OUT_DIR"/generated/"${module}".v | 
|  | sed -i 's/prim_flop/prim_generic_flop/g' "$LR_SYNTH_OUT_DIR"/generated/"${module}".v | 
|  | done | 
|  |  | 
|  | # remove tracer (not needed for synthesis) | 
|  | rm -f "$LR_SYNTH_OUT_DIR"/generated/ibex_tracer.v | 
|  |  | 
|  | # remove the FPGA & register-based register file (because we will use the | 
|  | # latch-based one instead) | 
|  | rm -f "$LR_SYNTH_OUT_DIR"/generated/ibex_register_file_ff.v | 
|  | rm -f "$LR_SYNTH_OUT_DIR"/generated/ibex_register_file_fpga.v | 
|  |  | 
|  | yosys -c ./tcl/yosys_run_synth.tcl |& teelog syn || { | 
|  | error "Failed to synthesize RTL with Yosys" | 
|  | } | 
|  |  | 
|  | sta ./tcl/sta_run_reports.tcl |& teelog sta || { | 
|  | error "Failed to run static timing analysis" | 
|  | } | 
|  |  | 
|  | ./translate_timing_rpts.sh | 
|  |  | 
|  | python/get_kge.py "$LR_SYNTH_CELL_LIBRARY_PATH" "$LR_SYNTH_OUT_DIR"/reports/area.rpt |