blob: 40e04f2d9470c18637a39c1979a283c023a54d04 [file] [log] [blame] [edit]
include(install.cmake)
function(ADD_XC_ARCH_DEFINE)
# ~~~
# ADD_XC_ARCH_DEFINE(
# FAMILY <family>
# PRJRAY_DIR <documentation project dir>
# PRJRAY_DB_DIR <documentation project database dir>
# ARCH <arch>
# PRJRAY_ARCH <prjray_arch>
# PROTOTYPE_PART <prototype_part>
# YOSYS_SYNTH_SCRIPT <yosys_script>
# YOSYS_UTILS_SCRIPT <yosys_script>
# )
#
# FAMILY: The family the architecture is belonging to (e.g. xc7).
#
# ARCH: The architecture to add (e.g. artix7).
#
# PRJRAY_ARCH: The architecture in PRJRAY that holds all the part data that need to be imported.
#
# PROTOTYPE_PART: The PART that is valid for all the different PARTs having the same ARCH.
set(options)
set(oneValueArgs
FAMILY
ARCH
PRJRAY_ARCH
PRJRAY_DIR
PRJRAY_DB_DIR
PRJRAY_NAME
PROTOTYPE_PART
YOSYS_SYNTH_SCRIPT
YOSYS_UTILS_SCRIPT)
set(multiValueArgs)
cmake_parse_arguments(
ADD_XC_ARCH_DEFINE
"${options}"
"${oneValueArgs}"
"${multiValueArgs}"
${ARGN}
)
# The default IOSTANDARD and DRIVE to use in fasm2bels
set(DEFAULT_IOSTANDARD "LVCMOS33")
set(DEFAULT_DRIVE 12)
set(FAMILY ${ADD_XC_ARCH_DEFINE_FAMILY})
set(ARCH ${ADD_XC_ARCH_DEFINE_ARCH})
if("${ADD_XC_ARCH_DEFINE_PRJRAY_ARCH}" STREQUAL "")
set(PRJRAY_ARCH "${ARCH}")
else()
set(PRJRAY_ARCH "${ADD_XC_ARCH_DEFINE_PRJRAY_ARCH}")
endif()
set(PRJRAY_DIR ${ADD_XC_ARCH_DEFINE_PRJRAY_DIR})
set(PRJRAY_DB_DIR ${ADD_XC_ARCH_DEFINE_PRJRAY_DB_DIR})
set(PRJRAY_NAME ${ADD_XC_ARCH_DEFINE_PRJRAY_NAME})
set(PROTOTYPE_PART ${ADD_XC_ARCH_DEFINE_PROTOTYPE_PART})
set(YOSYS_SYNTH_SCRIPT ${ADD_XC_ARCH_DEFINE_YOSYS_SYNTH_SCRIPT})
set(YOSYS_UTILS_SCRIPT ${ADD_XC_ARCH_DEFINE_YOSYS_UTILS_SCRIPT})
set(YOSYS_TECHMAP ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/techmap)
# Notes on optimized flag settings:
# These flags have been optimized for the ibex and baselitex designs.
# - place_delay_model: delta is ~5% faster than delta_override (default: delta)
# - acc_fac: Lowering this to 0.7 slightly improves runtime 1-4% (default: 1)
# - astar_fac: Increasing this to 1.8 reduces runtime 2-15% (default: 1.2)
# - initial_pres_fac: Setting this to 2.828 reduces runtime 10-20% from the default,
# and about 3% faster than the previous value of 4 (default: 0.5)
# - pres_fac_mult: A lower value of 1.2 performs better given the other parameters (default: 1.3)
# Based on analysis performed on hydra.vtr.tools for the ibex, baselitex, and bram-n3 designs.
# These changes did not have a measurable effect on QoR for these designs.
# More details can be found in the report: https://colab.research.google.com/drive/1X91RGZnvlC7dBjJJUbS7JfqCbPCzJ3Xb
# Also checked in at: utils/ipynb/Parameter_Sweep_using_fpga_tool_perf.ipynb
set(VPR_ARCH_ARGS "\
--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"
)
set(YOSYS_CELLS_SIM ${YOSYS_DATADIR}/xilinx/cells_sim.v)
set(VPR_CELLS_SIM ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/techmap/cells_sim.v)
get_file_target(YOSYS_CELLS_SIM_TARGET ${YOSYS_CELLS_SIM})
if (NOT TARGET ${YOSYS_CELLS_SIM_TARGET})
add_file_target(FILE ${YOSYS_CELLS_SIM} ABSOLUTE)
endif ()
get_file_target(VPR_CELLS_SIM_TARGET ${VPR_CELLS_SIM})
if (NOT TARGET ${VPR_CELLS_SIM_TARGET})
add_file_target(FILE ${VPR_CELLS_SIM} ABSOLUTE)
endif ()
get_target_property_required(XCFASM env XCFASM)
get_target_property_required(XC7FRAMES2BIT env XC7FRAMES2BIT)
get_target_property_required(BITREAD env BITREAD)
get_target_property_required(RAPIDWRIGHT_INSTALLED rapidwright RAPIDWRIGHT_INSTALLED)
if(${RAPIDWRIGHT_INSTALLED})
get_target_property_required(RAPIDWRIGHT_PATH rapidwright RAPIDWRIGHT_PATH)
set(INTERCHANGE_FASM2BELS "--interchange_capnp_schema_dir ${RAPIDWRIGHT_PATH}/interchange/fpga-interchange-schema/interchange
--logical_netlist \${OUT_BIT_VERILOG}.netlist
--physical_netlist \${OUT_BIT_VERILOG}.phys
--interchange_xdc \${OUT_BIT_VERILOG}.inter.xdc")
else()
set(INTERCHANGE_FASM2BELS)
endif()
define_arch(
ARCH ${ARCH}
FAMILY ${FAMILY}
DOC_PRJ ${PRJRAY_DIR}
DOC_PRJ_DB ${PRJRAY_DB_DIR}
DOC_PRJ_NAME ${PRJRAY_NAME}
PROTOTYPE_PART ${PROTOTYPE_PART}
YOSYS_SYNTH_SCRIPT ${YOSYS_SYNTH_SCRIPT}
YOSYS_TECHMAP ${YOSYS_TECHMAP}
DEVICE_FULL_TEMPLATE \${DEVICE}-\${PACKAGE}
CELLS_SIM ${YOSYS_CELLS_SIM} ${VPR_CELLS_SIM}
VPR_ARCH_ARGS ${VPR_ARCH_ARGS}
RR_PATCH_CMD "${CMAKE_COMMAND} -E env \
PYTHONPATH=${PRJRAY_DIR}:${f4pga-arch-defs_SOURCE_DIR}/utils:${f4pga-arch-defs_BINARY_DIR}/utils \
\${PYTHON3} ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/utils/prjxray_routing_import.py \
--db_root ${PRJRAY_DB_DIR}/${PRJRAY_ARCH} \
--part \${PART} \
--read_rr_graph \${OUT_RRXML_VIRT} \
--write_rr_graph \${OUT_RRXML_REAL} \
--write_rr_node_map \${OUT_RRXML_REAL}.node_map.pickle \
--vpr_capnp_schema_dir ${VPR_CAPNP_SCHEMA_DIR}
"
PLACE_TOOL_CMD "${CMAKE_COMMAND} -E env \
PYTHONPATH=${f4pga-arch-defs_SOURCE_DIR}/utils \
\${PYTHON3} -m f4pga.utils.xc7.create_ioplace \
--map \${PINMAP} \
--blif \${OUT_EBLIF} \
\${PCF_INPUT_IO_FILE} \
--net \${OUT_NET}"
PLACE_CONSTR_TOOL_CMD "${CMAKE_COMMAND} -E env \
PYTHONPATH=${f4pga-arch-defs_SOURCE_DIR}/utils \
\${PYTHON3} -m f4pga.utils.xc7.create_place_constraints \
--net \${OUT_NET} \
--arch \${DEVICE_MERGED_FILE_LOCATION} \
--blif \${OUT_EBLIF} \
--input /dev/stdin \
--output /dev/stdout \
\${PLACE_CONSTR_TOOL_EXTRA_ARGS}"
BITSTREAM_EXTENSION bit
FASM_TO_BIT ${XCFASM}
FASM_TO_BIT_CMD "${CMAKE_COMMAND} -E env \
PYTHONPATH=${f4pga-arch-defs_BINARY_DIR}/env/conda/lib/python3.7/site-packages:${PRJRAY_DIR}:${PRJRAY_DIR}/third_party/fasm \
\${FASM_TO_BIT} \
--db-root ${PRJRAY_DB_DIR}/${PRJRAY_ARCH} \
--sparse \
--emit_pudc_b_pullup \
--fn_in \${OUT_FASM} \
--bit_out \${OUT_BITSTREAM} \
--frm2bit ${XC7FRAMES2BIT} \
\${FASM_TO_BIT_EXTRA_ARGS}"
BIT_TO_V_CMD "${CMAKE_COMMAND} -E env \
PYTHONPATH=${f4pga-arch-defs_BINARY_DIR}/env/conda/lib/python3.7/site-packages:${PRJRAY_DIR}:${PRJRAY_DIR}/third_party/fasm:${f4pga-arch-defs_SOURCE_DIR}/utils \
\${PYTHON3} -mfasm2bels \
\${BIT_TO_V_EXTRA_ARGS} \
--db_root ${PRJRAY_DB_DIR}/${PRJRAY_ARCH} \
--rr_graph \${OUT_RRBIN_REAL_LOCATION} \
--vpr_capnp_schema_dir ${VPR_CAPNP_SCHEMA_DIR} \
--route \${OUT_ROUTE} \
--bitread ${BITREAD} \
--bit_file \${OUT_BITSTREAM} \
--fasm_file \${OUT_BITSTREAM}.fasm \
--iostandard ${DEFAULT_IOSTANDARD} \
--drive ${DEFAULT_DRIVE} \
\${PCF_INPUT_IO_FILE} \
--eblif \${OUT_EBLIF} \
--top \${TOP} \
--verilog_file \${OUT_BIT_VERILOG}
--xdc_file \${OUT_BIT_VERILOG}.xdc ${INTERCHANGE_FASM2BELS}"
NO_BIT_TO_BIN
NO_BIT_TIME
USE_FASM
RR_GRAPH_EXT ".bin"
ROUTE_CHAN_WIDTH 500
)
set_target_properties(${ARCH} PROPERTIES PRJRAY_ARCH ${PRJRAY_ARCH})
add_custom_target(all_${ARCH}_diff_fasm)
endfunction()