f4pga/wrappers/sh: convert vpr_common shell scripts to python (#626)

Signed-off-by: Unai Martinez-Corral <umartinezcorral@antmicro.com>
This commit is contained in:
Unai Martinez-Corral 2022-08-29 18:27:00 +01:00 committed by GitHub
parent 1f36d814ff
commit 182d7f32b7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 290 additions and 257 deletions

View File

@ -24,9 +24,11 @@ from os import environ
from pathlib import Path
from shutil import which
from subprocess import check_call
from argparse import ArgumentParser, RawDescriptionHelpFormatter
from f4pga.context import FPGA_FAM, F4PGA_SHARE_DIR
python3 = which("python3")
ROOT = Path(__file__).resolve().parent
@ -47,10 +49,10 @@ def p_run_sh_script(script):
check_call([str(script)] + sys_argv[1:], env=f4pga_environ)
def p_run_bash_cmds(cmds):
def p_run_bash_cmds(cmds, env=f4pga_environ):
stdout.flush()
stderr.flush()
check_call(cmds, env=f4pga_environ, shell=True, executable="/bin/bash")
check_call(cmds, env=env, shell=True, executable="/bin/bash")
def p_run_pym(module):
@ -59,17 +61,20 @@ def p_run_pym(module):
check_call([python3, "-m", module] + sys_argv[1:], env=f4pga_environ)
def p_vpr_common_cmds(log_suffix=None):
return f"""
set -e
source {ROOT / SH_SUBDIR}/vpr_common.f4pga.sh {' '.join([f"'{arg}'" for arg in sys_argv[1:]])}
""" + (
f"""
export OUT_NOISY_WARNINGS=noisy_warnings-${{DEVICE}}_{log_suffix}.log
"""
if log_suffix is not None
else ""
def p_vpr_env_from_args(log_suffix=None):
vpr_options = f4pga_environ.get("VPR_OPTIONS")
if vpr_options is not None:
vpr_options = p_args_str2list(vpr_options)
env = f4pga_environ.copy()
env.update(
p_parse_vpr_args(
vpr_options=vpr_options,
log_suffix=log_suffix,
isQuickLogic=isQuickLogic,
)
)
return env
def p_args_str2list(args):
@ -130,6 +135,256 @@ def p_vpr_run():
)
def p_parse_vpr_args(vpr_options=None, log_suffix=None, isQuickLogic=False):
if isQuickLogic:
return p_parse_vpr_args_quicklogic(vpr_options, log_suffix)
else:
return p_parse_vpr_args_xc7(vpr_options, log_suffix)
def p_parse_vpr_args_xc7(vpr_options=None, log_suffix=None):
parser = ArgumentParser(description=__doc__, formatter_class=RawDescriptionHelpFormatter)
parser.add_argument("--device", "-d", required=False, type=str, help="")
parser.add_argument("--eblif", "-e", required=True, type=str, help="")
parser.add_argument("--pcf", "-p", required=False, type=str, help="")
parser.add_argument("--net", "-n", required=False, type=str, help="")
parser.add_argument("--part", "-P", required=False, type=str, help="")
parser.add_argument("--sdc", "-s", required=False, type=str, help="")
parser.add_argument("additional_vpr_options", nargs="*", type=str, help="")
args = parser.parse_args()
device = args.device
if device is None and args.part is not None:
parts_dir = F4PGA_SHARE_DIR
# Try to find device name.
# Accept only when exactly one is found.
# PART_DIRS=(${F4PGA_SHARE_DIR}/arch/*/${PART})
# if [ ${#PART_DIRS[@]} -eq 1 ]; then DEVICE=$(basename $(dirname "${PART_DIRS[0]}")); fi
if device is None:
raise Exception("Please provide device name")
noisy_warnings = "" if log_suffix is None else f"noisy_warnings-{device}_{log_suffix}.log"
if vpr_options is None:
print("Using default VPR options")
vpr_options = [
"--max_router_iterations",
"500",
"--routing_failure_predictor",
"off",
"--router_high_fanout_threshold",
"-1",
"--constant_net_method",
"route",
"--route_chan_width",
"500",
"--router_heap",
"bucket",
"--clock_modeling",
"route",
"--place_delta_delay_matrix_calculation_method",
"dijkstra",
"--place_delay_model",
"delta",
"--router_lookahead",
"extended_map",
"--check_route",
"quick",
"--strict_checks",
"off",
"--allow_dangling_combinational_nodes",
"on",
"--disable_errors",
"check_unbuffered_edges:check_route",
"--congested_routing_iteration_threshold",
"0.8",
"--incremental_reroute_delay_ripup",
"off",
"--base_cost_type",
"delay_normalized_length_bounded",
"--bb_factor",
"10",
"--acc_fac",
"0.7",
"--astar_fac",
"1.8",
"--initial_pres_fac",
"2.828",
"--pres_fac_mult",
"1.2",
"--check_rr_graph",
"off",
"--suppress_warnings",
noisy_warnings
+ ",sum_pin_class:check_unbuffered_edges:load_rr_indexed_data_T_values:check_rr_node:trans_per_R:check_route:set_rr_graph_tool_comment:calculate_average_switch",
]
arch_dir = F4PGA_SHARE_DIR / "arch" / device
envvars = {
"DEVICE": device,
"DEVICE_NAME": device.replace("_", "-"),
"EBLIF": args.eblif,
"VPR_OPTIONS": " ".join(vpr_options + args.additional_vpr_options),
"ARCH_DIR": str(arch_dir),
"ARCH_DEF": str(arch_dir / "arch.timing.xml"),
"RR_GRAPH": str(arch_dir / f"rr_graph_{device}.rr_graph.real.bin"),
"RR_GRAPH_XML": str(arch_dir / f"rr_graph_{device}.rr_graph.real.xml"),
"PLACE_DELAY": str(arch_dir / f"rr_graph_{device}.place_delay.bin"),
"LOOKAHEAD": str(arch_dir / f"rr_graph_{device}.lookahead.bin"),
}
if args.pcf is not None:
envvars["PCF"] = args.pcf
if args.net is not None:
envvars["NET"] = args.net
if args.part is not None:
envvars["PART"] = args.part
if args.sdc is not None:
envvars["SDC"] = args.sdc
if log_suffix is not None:
envvars["OUT_NOISY_WARNINGS"] = noisy_warnings
return envvars
def p_parse_vpr_args_quicklogic(vpr_options=None, log_suffix=None):
parser = ArgumentParser(description=__doc__, formatter_class=RawDescriptionHelpFormatter)
parser.add_argument("--device", "-d", required=True, type=str, help="")
parser.add_argument("--family", "-f", required=True, type=str, help="")
parser.add_argument("--eblif", "-e", required=True, type=str, help="")
parser.add_argument("--pcf", "-p", required=False, type=str, help="")
parser.add_argument("--net", "-n", required=False, type=str, help="")
parser.add_argument("--part", "-P", required=False, type=str, help="")
parser.add_argument("--json", "-j", required=False, type=str, help="")
parser.add_argument("--sdc", "-s", required=False, type=str, help="")
parser.add_argument("--top", "-t", required=False, type=str, help="")
parser.add_argument("--corner", "-c", required=False, type=str, help="")
args = parser.parse_args()
if vpr_options is None:
print("Using default VPR options")
vpr_options = [
"--max_router_iterations",
"500",
"--routing_failure_predictor",
"off",
"--router_high_fanout_threshold",
"-1",
"--constant_net_method",
"route",
]
noisy_warnings = "" if log_suffix is None else f"noisy_warnings-{args.device}_{log_suffix}.log"
vpr_options.extend(
[
"--place_delay_model",
"delta_override",
"--router_lookahead",
"extended_map",
"--allow_dangling_combinational_nodes",
"on",
]
+ (
[
"--route_chan_width",
"10",
"--clock_modeling",
"ideal",
"--place_delta_delay_matrix_calculation_method",
"dijkstra",
"--absorb_buffer_luts",
"off",
]
if args.device == "qlf_k4n8_qlf_k4n8"
else [
"--route_chan_width",
"100",
"--clock_modeling",
"route",
"--check_route",
"quick",
"--strict_checks",
"off",
"--disable_errors",
"check_unbuffered_edges:check_route",
"--congested_routing_iteration_threshold",
"0.8",
"--incremental_reroute_delay_ripup",
"off",
"--base_cost_type",
"delay_normalized_length_bounded",
"--bb_factor",
"10",
"--initial_pres_fac",
"4.0",
"--check_rr_graph",
"off",
"--pack_high_fanout_threshold",
"PB-LOGIC:18",
"--suppress_warnings",
noisy_warnings
+ ",sum_pin_class:check_unbuffered_edges:load_rr_indexed_data_T_values:check_rr_node:trans_per_R:check_route:set_rr_graph_tool_comment",
]
)
)
device_2 = None
if args.device == "qlf_k4n8_qlf_k4n8":
device_1 = f"qlf_k4n8-qlf_k4n8_umc22_{args.corner}"
elif args.device == "qlf_k6n10_qlf_k6n10":
device_1 = "qlf_k6n10-qlf_k6n10_gf12"
else:
device_1 = args.device
device_2 = "wlcsp"
if device_2 is None:
device_2 = device_1
device_arch = f"{device_1}_{device_2}"
arch_dir = F4PGA_SHARE_DIR / "arch" / device_arch
rr_graph = arch_dir / f"{device_1}.rr_graph.bin"
# qlf* devices use different naming scheme than pp3* ones.
if not rr_graph.exists():
rr_graph = arch_dir / f"rr_graph_{device_arch}.rr_graph.real.bin"
envvars = {
"DEVICE": args.device,
"FAMILY": args.family,
"EBLIF": args.eblif,
"VPR_OPTIONS": " ".join(vpr_options),
"ARCH_DIR": str(arch_dir),
"ARCH_DEF": str(arch_dir / f"arch_{device_arch}.xml"),
"RR_GRAPH": str(rr_graph),
"PLACE_DELAY": str(arch_dir / f"rr_graph_{device_arch}.place_delay.bin"),
"LOOKAHEAD": str(arch_dir / f"rr_graph_{device_arch}.lookahead.bin"),
"DEVICE_NAME": device_1,
}
if args.pcf is not None:
envvars["PCF"] = args.pcf
if args.net is not None:
envvars["NET"] = args.net
if args.json is not None:
envvars["JSON"] = args.json
if args.sdc is not None:
envvars["SDC"] = args.sdc
if args.top is not None:
envvars["TOP"] = args.top
if args.sdc is not None:
envvars["CORNER"] = args.corner
if log_suffix is not None:
envvars["OUT_NOISY_WARNINGS"] = noisy_warnings
return envvars
# Entrypoints
@ -138,9 +393,8 @@ def generate_constraints():
if isQuickLogic:
(pcf, eblif, net, part, device, arch_def, corner) = sys_argv[1:8]
place_file_prefix = Path(eblif).stem
share_dir = Path(f4pga_environ["F4PGA_SHARE_DIR"])
scripts_dir = share_dir / "scripts"
archs_dir = share_dir / "arch"
scripts_dir = F4PGA_SHARE_DIR / "scripts"
archs_dir = F4PGA_SHARE_DIR / "arch"
p_run_bash_cmds(
f"""
set -e
@ -224,21 +478,20 @@ fi
(eblif, net, part, device, arch_def) = sys_argv[1:6]
pcf_opts = f"'--pcf' '{sys_argv[6]}'" if len(sys_argv) > 6 else ""
ioplace_file = f"{Path(eblif).stem}.ioplace"
share_dir = f4pga_environ["F4PGA_SHARE_DIR"]
p_run_bash_cmds(
f"""
set -e
python3 '{share_dir}/scripts/prjxray_create_ioplace.py' \
python3 '{F4PGA_SHARE_DIR}/scripts/prjxray_create_ioplace.py' \
--blif '{eblif}' \
--net '{net}' {pcf_opts} \
--map '{share_dir}/arch/{device}/{part}/pinmap.csv' \
--map '{F4PGA_SHARE_DIR}/arch/{device}/{part}/pinmap.csv' \
> '{ioplace_file}'
python3 '{share_dir}'/scripts/prjxray_create_place_constraints.py \
python3 '{F4PGA_SHARE_DIR}'/scripts/prjxray_create_place_constraints.py \
--blif '{eblif}' \
--net '{net}' \
--arch '{arch_def}' \
--part '{part}' \
--vpr_grid_map '{share_dir}/arch/{device}/vpr_grid_map.csv' \
--vpr_grid_map '{F4PGA_SHARE_DIR}/arch/{device}/vpr_grid_map.csv' \
--input '{ioplace_file}' \
--db_root "${{DATABASE_DIR:-$(prjxray-config)}}" \
> constraints.place
@ -249,7 +502,9 @@ python3 '{share_dir}'/scripts/prjxray_create_place_constraints.py \
def pack():
print("[F4PGA] Running (deprecated) pack")
extra_args = ["--write_block_usage", "block_usage.json"] if isQuickLogic else []
p_run_bash_cmds(p_vpr_common_cmds("pack") + f"python3 -m f4pga.wrappers.sh.vpr_run --pack {' '.join(extra_args)}")
p_run_bash_cmds(
f"python3 -m f4pga.wrappers.sh.vpr_run --pack {' '.join(extra_args)}", env=p_vpr_env_from_args("pack")
)
Path("vpr_stdout.log").rename("pack.log")
@ -280,14 +535,16 @@ python3 -m f4pga.wrappers.sh.generate_constraints $EBLIF $NET $PART $DEVICE $ARC
VPR_PLACE_FILE='constraints.place'
"""
place_cmds += 'python3 -m f4pga.wrappers.sh.vpr_run --fix_clusters "${VPR_PLACE_FILE}" --place'
p_run_bash_cmds(p_vpr_common_cmds("place") + place_cmds)
p_run_bash_cmds(place_cmds, env=p_vpr_env_from_args("place"))
Path("vpr_stdout.log").rename("place.log")
def route():
print("[F4PGA] Running (deprecated) route")
extra_args = ["--write_timing_summary", "timing_summary.json"] if isQuickLogic else []
p_run_bash_cmds(p_vpr_common_cmds("pack") + f"python3 -m f4pga.wrappers.sh.vpr_run --route {' '.join(extra_args)}")
p_run_bash_cmds(
f"python3 -m f4pga.wrappers.sh.vpr_run --route {' '.join(extra_args)}", env=p_vpr_env_from_args("pack")
)
Path("vpr_stdout.log").rename("route.log")
@ -299,8 +556,7 @@ def synth():
def write_fasm(genfasm_extra_args=None):
print("[F4PGA] Running (deprecated) write fasm")
p_run_bash_cmds(
p_vpr_common_cmds("fasm")
+ f"""
f"""
'{which('genfasm')}' \
${{ARCH_DEF}} ${{EBLIF}} --device ${{DEVICE_NAME}} \
${{VPR_OPTIONS}} \
@ -313,7 +569,8 @@ if [ -f $FASM_EXTRA ]; then
echo "writing final fasm (extra: $FASM_EXTRA)"
cat $FASM_EXTRA >> ${TOP}.fasm
fi
"""
""",
env=p_vpr_env_from_args("fasm"),
)
Path("vpr_stdout.log").rename("fasm.log")
@ -384,8 +641,7 @@ xcfasm \
def analysis():
print("[F4PGA] Running (deprecated) analysis")
p_run_bash_cmds(
p_vpr_common_cmds("analysis")
+ """
"""
python3 -m f4pga.wrappers.sh.vpr_run \
--analysis \
--gen_post_synthesis_netlist on \
@ -393,7 +649,8 @@ python3 -m f4pga.wrappers.sh.vpr_run \
--post_synth_netlist_unconn_inputs nets \
--post_synth_netlist_unconn_outputs nets \
--verify_file_digests off
"""
""",
env=p_vpr_env_from_args("analysis"),
)
Path("vpr_stdout.log").rename("analysis.log")
@ -401,8 +658,7 @@ python3 -m f4pga.wrappers.sh.vpr_run \
def repack():
print("[F4PGA] Running (deprecated) repack")
p_run_bash_cmds(
p_vpr_common_cmds()
+ """
"""
DESIGN=${EBLIF/.eblif/}
[ ! -z "${JSON}" ] && JSON_ARGS="--json-constraints ${JSON}" || JSON_ARGS=
[ ! -z "${PCF_PATH}" ] && PCF_ARGS="--pcf-constraints ${PCF_PATH}" || PCF_ARGS=
@ -411,7 +667,7 @@ DESIGN=${EBLIF/.eblif/}
PYTHONPATH=$F4PGA_SHARE_DIR/scripts:$PYTHONPATH \
'{python3}' "$F4PGA_SHARE_DIR"/scripts/repacker/repack.py \
--vpr-arch ${{ARCH_DEF}} \
--repacking-rules ${{ARCH_DIR}}/${{DEVICE_1}}.repacking_rules.json \
--repacking-rules ${{ARCH_DIR}}/${{DEVICE_NAME}}.repacking_rules.json \
$JSON_ARGS \
$PCF_ARGS \
--eblif-in ${{DESIGN}}.eblif \
@ -422,7 +678,8 @@ PYTHONPATH=$F4PGA_SHARE_DIR/scripts:$PYTHONPATH \
--place-out ${{DESIGN}}.repacked.place \
--absorb_buffer_luts on \
> repack.log 2>&1
"""
""",
env=p_vpr_env_from_args(),
)

View File

@ -1,126 +0,0 @@
#!/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
eval set -- $(
getopt \
--options=d:f:e:p:n:P:j:s:t:c: \
--longoptions=device:,eblif:,pcf:,net:,part:,json:,sdc:,top:,corner: \
--name $0 -- $@
)
DEVICE=""
FAMILY=""
EBLIF=""
PCF=""
NET=""
PART=""
JSON=""
SDC=""
TOP="top"
CORNER=""
while true; do
case "$1" in
-d|--device) DEVICE=$2; shift 2 ;;
-f|--family) FAMILY=$2; shift 2 ;;
-e|--eblif) EBLIF=$2; shift 2 ;;
-p|--pcf) PCF=$2; shift 2 ;;
-n|--net) NET=$2; shift 2 ;;
-P|--part) PART=$2; shift 2 ;;
-j|--json) JSON=$2; shift 2 ;;
-s|--sdc) SDC=$2; shift 2 ;;
-t|--top) TOP=$2; shift 2 ;;
-c|--corner) CORNER=$2; shift 2 ;;
--) break ;;
esac
done
if [ -z $DEVICE ]; then echo "Please provide device name"; exit 1; fi
if [ -z $FAMILY ]; then echo "Please provide device family name"; exit 1; fi
if [ -z $EBLIF ]; then echo "Please provide blif file name"; exit 1; fi
export DEVICE="$DEVICE"
export FAMILY="$FAMILY"
export EBLIF="$EBLIF"
export PCF="$PCF"
export NET="$NET"
export JSON="$JSON"
export SDC="$SDC"
export TOP="$TOP"
export CORNER="$CORNER"
if [ -z $VPR_OPTIONS ]; then
echo "Using default VPR options."
VPR_OPTIONS="
--max_router_iterations 500
--routing_failure_predictor off
--router_high_fanout_threshold -1
--constant_net_method route
"
fi
VPR_OPTIONS="$VPR_OPTIONS
--place_delay_model delta_override
--router_lookahead extended_map
--allow_dangling_combinational_nodes on"
if [[ "$DEVICE" == "qlf_k4n8_qlf_k4n8" ]]; then
VPR_OPTIONS="$VPR_OPTIONS
--route_chan_width 10
--clock_modeling ideal
--place_delta_delay_matrix_calculation_method dijkstra
--absorb_buffer_luts off"
else
VPR_OPTIONS="$VPR_OPTIONS
--route_chan_width 100
--clock_modeling route
--check_route quick
--strict_checks off
--disable_errors check_unbuffered_edges:check_route
--congested_routing_iteration_threshold 0.8
--incremental_reroute_delay_ripup off
--base_cost_type delay_normalized_length_bounded
--bb_factor 10
--initial_pres_fac 4.0
--check_rr_graph off
--pack_high_fanout_threshold PB-LOGIC:18
--suppress_warnings ${OUT_NOISY_WARNINGS},sum_pin_class:check_unbuffered_edges:load_rr_indexed_data_T_values:check_rr_node:trans_per_R:check_route:set_rr_graph_tool_comment"
fi
export VPR_OPTIONS="$VPR_OPTIONS"
if [[ "$DEVICE" == "qlf_k4n8_qlf_k4n8" ]]; then
DEVICE_1="qlf_k4n8-qlf_k4n8_umc22_${CORNER}"
DEVICE_2="$DEVICE_1"
elif [[ "$DEVICE" == "qlf_k6n10_qlf_k6n10" ]];then
DEVICE_1="qlf_k6n10-qlf_k6n10_gf12"
DEVICE_2="$DEVICE_1"
else
DEVICE_1="$DEVICE"
DEVICE_2="wlcsp"
fi
DEVICE_ARCH="${DEVICE_1}_${DEVICE_2}"
export ARCH_DIR="${F4PGA_SHARE_DIR}/arch/${DEVICE_ARCH}"
export ARCH_DEF="${ARCH_DIR}/arch_${DEVICE_ARCH}".xml
ARCH_RR_PREFIX="${ARCH_DIR}/rr_graph_${DEVICE_ARCH}"
# qlf* devices use different naming scheme than pp3* ones.
export RR_GRAPH="${ARCH_DIR}/${DEVICE_1}".rr_graph.bin
if [ ! -f "${RR_GRAPH}" ]; then
export RR_GRAPH="${ARCH_RR_PREFIX}".rr_graph.real.bin
fi
export PLACE_DELAY="${ARCH_RR_PREFIX}".place_delay.bin
export LOOKAHEAD="${ARCH_RR_PREFIX}".lookahead.bin
export DEVICE_NAME="$DEVICE_1"

View File

@ -1,98 +0,0 @@
#!/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
eval set -- "$(
getopt \
--options=d:e:p:n:P:s: \
--longoptions=device:,eblif:,pcf:,net:,part:,sdc: \
--name $0 -- "$@"
)"
DEVICE=''
DEVICE_NAME=''
PART=''
EBLIF=''
PCF=''
NET=''
SDC=''
ADDITIONAL_VPR_OPTIONS=''
while true; do
case "$1" in
-d|--device) DEVICE=$2; shift 2 ;;
-e|--eblif) EBLIF=$2; shift 2 ;;
-p|--pcf) PCF=$2; shift 2 ;;
-n|--net) NET=$2; shift 2 ;;
-P|--part) PART=$2; shift 2 ;;
-s|--sdc) SDC=$2; shift 2 ;;
--) shift; ADDITIONAL_VPR_OPTIONS="$@"; break ;;
esac
done
if [ -z "$DEVICE" ] && [ -n "$PART" ]; then
# Try to find device name. Accept only when exactly one is found
PART_DIRS=(${F4PGA_SHARE_DIR}/arch/*/${PART})
if [ ${#PART_DIRS[@]} -eq 1 ]; then DEVICE=$(basename $(dirname "${PART_DIRS[0]}")); fi
fi
if [ -z "$DEVICE" ]; then echo "Please provide device name"; exit 1; fi
if [ -z "$EBLIF" ]; then echo "Please provide blif file name"; exit 1; fi
export DEVICE="$DEVICE"
export EBLIF="$EBLIF"
export PCF="$PCF"
export NET="$NET"
export SDC="$SDC"
if [ -z "$VPR_OPTIONS" ]; then
echo "Using default VPR options."
VPR_OPTIONS="
--max_router_iterations 500
--routing_failure_predictor off
--router_high_fanout_threshold -1
--constant_net_method route
--route_chan_width 500
--router_heap bucket
--clock_modeling route
--place_delta_delay_matrix_calculation_method dijkstra
--place_delay_model delta
--router_lookahead extended_map
--check_route quick
--strict_checks off
--allow_dangling_combinational_nodes on
--disable_errors check_unbuffered_edges:check_route
--congested_routing_iteration_threshold 0.8
--incremental_reroute_delay_ripup off
--base_cost_type delay_normalized_length_bounded
--bb_factor 10
--acc_fac 0.7
--astar_fac 1.8
--initial_pres_fac 2.828
--pres_fac_mult 1.2
--check_rr_graph off
--suppress_warnings ${OUT_NOISY_WARNINGS},sum_pin_class:check_unbuffered_edges:load_rr_indexed_data_T_values:check_rr_node:trans_per_R:check_route:set_rr_graph_tool_comment:calculate_average_switch
"
fi
export VPR_OPTIONS="$VPR_OPTIONS $ADDITIONAL_VPR_OPTIONS"
export ARCH_DIR="${F4PGA_SHARE_DIR}/arch/$DEVICE"
export ARCH_DEF="${ARCH_DIR}"/arch.timing.xml
ARCH_RR_PREFIX="${ARCH_DIR}/rr_graph_${DEVICE}"
export RR_GRAPH="${ARCH_RR_PREFIX}".rr_graph.real.bin
export RR_GRAPH_XML="${ARCH_RR_PREFIX}".rr_graph.real.xml
export PLACE_DELAY="${ARCH_RR_PREFIX}".place_delay.bin
export LOOKAHEAD="${ARCH_RR_PREFIX}".lookahead.bin
export DEVICE_NAME=`echo "$DEVICE" | sed -n 's/_/-/p'`