#!/bin/bash set -e read _ ip dev grade _ < <( echo $* | tr '_/' ' '; ) # rm -rf tab_${ip}_${dev}_${grade} mkdir -p tab_${ip}_${dev}_${grade} cd tab_${ip}_${dev}_${grade} max_speed=99 min_speed=01 best_speed=99 synth_case() { if [ -f test_${1}.txt ]; then echo "Reusing cached tab_${ip}_${dev}_${grade}/test_${1}." return fi case "${dev}" in ep4ce) al_device="ep4ce30f23${grade}" ;; ep4cgx) al_device="ep4cgx50df27${grade}" ;; 5cgx) al_device="5cgxbc9c6f23${grade}" ;; esac cat > test_${1}.qsf <<- EOT set_global_assignment -name DEVICE ${al_device} set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files set_global_assignment -name TOP_LEVEL_ENTITY top set_global_assignment -name VERILOG_FILE ../tabtest.v set_global_assignment -name VERILOG_FILE ../../../picorv32.v set_global_assignment -name SDC_FILE test_${1}.sdc EOT cat > test_${1}.sdc <<- EOT create_clock -period ${speed%?}.${speed#?} [get_ports clk] EOT echo "Running tab_${ip}_${dev}_${grade}/test_${1}.." if ! $QUARTUS_BIN/quartus_map test_${1}; then exit 1 fi if ! $QUARTUS_BIN/quartus_fit --read_settings_files=off --write_settings_files=off test_${1} -c test_${1}; then exit 1 fi if ! $QUARTUS_BIN/quartus_sta test_${1} -c test_${1}; then exit 1 fi cp output_files/test_${1}.sta.summary test_${1}.txt } countdown=7 while [ $countdown -gt 0 ]; do speed=$(((max_speed+min_speed)/2)) synth_case $speed if grep -q '^Slack : -' test_${speed}.txt; then echo " tab_${ip}_${dev}_${grade}/test_${speed} VIOLATED" min_speed=$((speed)) elif grep -q '^Slack : [^-]' test_${speed}.txt; then echo " tab_${ip}_${dev}_${grade}/test_${speed} MET" [ $speed -lt $best_speed ] && best_speed=$speed max_speed=$((speed)) else echo "ERROR: No slack line found in $PWD/test_${speed}.txt!" exit 1 fi countdown=$((countdown-1)) done echo "-----------------------" echo "Best speed for tab_${ip}_${dev}_${grade}: $best_speed" echo "-----------------------" echo $best_speed > results.txt