| function(MUX_GEN) |
| # ~~~ |
| # MUX_GEN( |
| # NAME <name> |
| # TYPE "routing"|"logic" |
| # MUX_NAME <name of mux> |
| # WIDTH <mux width> |
| # [SPLIT_INPUTS] |
| # [INPUTS <comma seperate list of inputs>] |
| # [SPLIT_SELECTS] |
| # [SELECTS <comma seperate list of selects>] |
| # [SUBCKT <subckt>] |
| # [COMMENT <comment>] |
| # [OUTPUT <mux output name>] |
| # [DATA_WIDTH <data width>] |
| # [NTEMPLATE_PREFIXES <list of prefixes>] |
| # ) |
| # ~~~ |
| # |
| # Generate <name>.sim.v, <name>.pb_type.xml, and <name>.model.xml for mux with |
| # given parameters using <root>/utils/mux_gen.py. A target <name> will be |
| # created that will generate all outputs. |
| # |
| # If <name> starts with "ntemplate.", NTEMPLATE_PREFIXES can be used to call |
| # N_TEMPLATE function on each output with the specified prefixes. |
| # |
| # For other mux arguments, see <root>/utils/mux_gen.py for details. |
| set(options SPLIT_INPUTS SPLIT_SELECTS) |
| set( |
| oneValueArgs |
| MUX_NAME |
| TYPE |
| WIDTH |
| INPUTS |
| SELECTS |
| SUBCKT |
| COMMENT |
| OUTPUT |
| DATA_WIDTH |
| ) |
| set(multiValueArgs NTEMPLATE_PREFIXES) |
| cmake_parse_arguments( |
| MUX_GEN |
| "${options}" |
| "${oneValueArgs}" |
| "${multiValueArgs}" |
| ${ARGN} |
| ) |
| |
| if(NOT "${MUX_GEN_NTEMPLATE_PREFIXES}" STREQUAL "") |
| string( |
| REPLACE |
| "{N}" |
| "" |
| MUX_GEN_TEMP0 |
| ${MUX_GEN_MUX_NAME} |
| ) |
| |
| string( |
| TOLOWER |
| ${MUX_GEN_TEMP0} |
| MUX_GEN_TEMP1 |
| ) |
| |
| set(MUX_GEN_NAME "ntemplate.N${MUX_GEN_TEMP1}") |
| else() |
| string( |
| TOLOWER |
| ${MUX_GEN_MUX_NAME} |
| MUX_GEN_NAME |
| ) |
| endif() |
| |
| if("${MUX_GEN_TYPE}" STREQUAL "routing") |
| if(NOT "${MUX_GEN_SUBCKT}" STREQUAL "") |
| message( |
| FATAL_ERROR "Can not use SUBCKT=${MUX_GEN_SUBCKT} with routing mux." |
| ) |
| endif() |
| elseif("${MUX_GEN_TYPE}" STREQUAL "logic") |
| |
| else() |
| message(FATAL_ERROR "MUX_GEN type must be \"routing\" or \"logic\".") |
| endif() |
| |
| set(MUX_GEN_ARGS "") |
| list(APPEND MUX_GEN_ARGS "--outdir=${CMAKE_CURRENT_BINARY_DIR}") |
| list(APPEND MUX_GEN_ARGS "--outfilename=${MUX_GEN_NAME}") |
| list(APPEND MUX_GEN_ARGS "--type=${MUX_GEN_TYPE}") |
| list(APPEND MUX_GEN_ARGS "--width=${MUX_GEN_WIDTH}") |
| list(APPEND MUX_GEN_ARGS "--name-mux=${MUX_GEN_MUX_NAME}") |
| |
| if(NOT "${MUX_GEN_COMMENT}" STREQUAL "") |
| list(APPEND MUX_GEN_ARGS "--comment=\"${MUX_GEN_COMMENT}\"") |
| endif() |
| |
| if(NOT "${MUX_GEN_OUTPUT}" STREQUAL "") |
| list(APPEND MUX_GEN_ARGS "--name-out=${MUX_GEN_OUTPUT}") |
| endif() |
| |
| if(${MUX_GEN_SPLIT_INPUTS}) |
| list(APPEND MUX_GEN_ARGS "--split-inputs=1") |
| endif() |
| |
| if(NOT "${MUX_GEN_INPUTS}" STREQUAL "") |
| list(APPEND MUX_GEN_ARGS "--name-inputs=${MUX_GEN_INPUTS}") |
| endif() |
| |
| if(${MUX_GEN_SPLIT_SELECTS}) |
| list(APPEND MUX_GEN_ARGS "--split-selects=1") |
| endif() |
| |
| if(NOT "${MUX_GEN_SELECTS}" STREQUAL "") |
| list(APPEND MUX_GEN_ARGS "--name-selects=${MUX_GEN_SELECTS}") |
| endif() |
| |
| if(NOT "${MUX_GEN_SUBCKT}" STREQUAL "") |
| list(APPEND MUX_GEN_ARGS "--subckt=${MUX_GEN_SUBCKT}") |
| endif() |
| |
| if(NOT "${MUX_GEN_DATA_WIDTH}" STREQUAL "") |
| list(APPEND MUX_GEN_ARGS "--data-width=${MUX_GEN_DATA_WIDTH}") |
| endif() |
| |
| set(OUTPUTS "") |
| list( |
| APPEND |
| OUTPUTS |
| "${MUX_GEN_NAME}.sim.v" |
| "${MUX_GEN_NAME}.pb_type.xml" |
| "${MUX_GEN_NAME}.model.xml" |
| ) |
| |
| if("${MUX_GEN_TYPE}" STREQUAL "routing") |
| list( |
| APPEND |
| OUTPUTS |
| "${MUX_GEN_NAME}.techmap.v" |
| ) |
| endif() |
| |
| get_target_property_required(PYTHON3 env PYTHON3) |
| |
| add_custom_command( |
| OUTPUT ${OUTPUTS} |
| DEPENDS |
| ${PYTHON3} |
| ${f4pga-arch-defs_SOURCE_DIR}/utils/mux_gen.py |
| #${f4pga-arch-defs_SOURCE_DIR}/vpr/muxes/logic/mux${MUX_GEN_WIDTH}/mux${MUX_GEN_WIDTH}.sim.v |
| COMMAND ${PYTHON3} ${f4pga-arch-defs_SOURCE_DIR}/utils/mux_gen.py ${MUX_GEN_ARGS} |
| ) |
| |
| add_file_target(FILE "${MUX_GEN_NAME}.sim.v" GENERATED) |
| if("${MUX_GEN_TYPE}" STREQUAL "routing") |
| add_file_target(FILE "${MUX_GEN_NAME}.techmap.v" GENERATED) |
| endif() |
| add_file_target(FILE "${MUX_GEN_NAME}.pb_type.xml" GENERATED) |
| add_file_target(FILE "${MUX_GEN_NAME}.model.xml" GENERATED) |
| |
| get_rel_target(REL_MUX_GEN_NAME muxgen ${MUX_GEN_NAME}) |
| add_custom_target(${REL_MUX_GEN_NAME} DEPENDS ${OUTPUTS}) |
| |
| if(NOT "${MUX_GEN_NTEMPLATE_PREFIXES}" STREQUAL "") |
| foreach(OUTPUT ${OUTPUTS}) |
| string( |
| REPLACE |
| "ntemplate." |
| "" |
| N_TEMPLATE_NAME |
| ${OUTPUT} |
| ) |
| n_template( |
| NAME ${N_TEMPLATE_NAME} |
| PREFIXES ${MUX_GEN_NTEMPLATE_PREFIXES} |
| SRCS ${OUTPUT} |
| ) |
| endforeach() |
| endif() |
| endfunction(MUX_GEN) |
| |
| function(GET_TEMPLATED_FILENAME var SRC PREFIX) |
| # ~~~ |
| # GET_TEMPLATED_FILENAME( |
| # NAME <name> |
| # var <calculated templated filename> |
| # SRC <template file> |
| # PREFIX <template prefixes> |
| # ) |
| # ~~~ |
| # |
| # GET_TEMPLATED_FILENAME calculates file name that from given template and prefix. |
| # The template file should have a form of ntemplate.<rest>. |
| # The function removes the "ntemplate" prefix and converting all N's in file name |
| # to <prefix>. |
| # |
| string( |
| REPLACE |
| "ntemplate." |
| "" |
| SRC_NO_NTEMPLATE |
| ${SRC} |
| ) |
| string( |
| REPLACE |
| "N" |
| ${PREFIX} |
| SRC_WITH_PREFIX |
| ${SRC_NO_NTEMPLATE} |
| ) |
| set(${var} ${SRC_WITH_PREFIX} PARENT_SCOPE) |
| endfunction() |
| |
| function(N_TEMPLATE) |
| # ~~~ |
| # N_TEMPLATE( |
| # NAME <name> |
| # SRCS <list of sources> |
| # PREFIXES <list of prefixes> |
| # [APPLY_V2X] |
| # [APPLY_VERILOG_IMAGE_GEN] |
| # ) |
| # ~~~ |
| # |
| # N_TEMPLATE converts files with prefix ntemplate.<rest> to <rest> and applies |
| # the template prefix, converting all N's to <prefix>. |
| # |
| # If APPLY_V2X is set, V2X will be invoked with NAME = <prefix><name> and the |
| # output of the templating process. |
| # |
| # If APPLY_VERILOG_IMAGE_GEN, ADD_VERILOG_IMAGE_GEN will be invoked with each |
| # output file. |
| set(options APPLY_V2X APPLY_VERILOG_IMAGE_GEN) |
| set(oneValueArgs NAME) |
| set(multiValueArgs SRCS PREFIXES) |
| cmake_parse_arguments( |
| N_TEMPLATE |
| "${options}" |
| "${oneValueArgs}" |
| "${multiValueArgs}" |
| ${ARGN} |
| ) |
| |
| set(OUTPUTS "") |
| get_target_property_required(PYTHON3 env PYTHON3) |
| |
| foreach(PREFIX ${N_TEMPLATE_PREFIXES}) |
| foreach(SRC ${N_TEMPLATE_SRCS}) |
| set(REAL_INCLUDE_FILES "") |
| get_filename_component(SRC_FILE ${SRC} NAME) |
| get_filename_component(SRC_DIR ${SRC} DIRECTORY) |
| get_templated_filename(SRC_WITH_PREFIX ${SRC_FILE} ${PREFIX}) |
| if (NOT "${SRC_DIR}" STREQUAL "") |
| set(SRC_WITH_PREFIX ${SRC_DIR}/${SRC_WITH_PREFIX}) |
| endif() |
| get_file_target(SRC_TARGET_NAME ${SRC}) |
| get_target_property(SRC_INCLUDE_FILES ${SRC_TARGET_NAME} INCLUDE_FILES) |
| foreach(INC ${SRC_INCLUDE_FILES}) |
| get_filename_component(INC_FILE ${INC} NAME) |
| get_filename_component(INC_DIR ${INC} DIRECTORY) |
| # template all the include files |
| get_templated_filename(INC_WITH_PREFIX ${INC_FILE} ${PREFIX}) |
| list(APPEND REAL_INCLUDE_FILES ${INC_DIR}/${INC_WITH_PREFIX}) |
| endforeach() |
| get_file_location(SRC_LOCATION ${SRC}) |
| set(DEPS "") |
| append_file_dependency(DEPS ${SRC}) |
| add_custom_command( |
| OUTPUT ${SRC_WITH_PREFIX} |
| DEPENDS |
| ${PYTHON3} |
| ${f4pga-arch-defs_SOURCE_DIR}/utils/n.py ${SRC_LOCATION} |
| ${DEPS} |
| COMMAND |
| ${PYTHON3} ${f4pga-arch-defs_SOURCE_DIR}/utils/n.py ${PREFIX} ${SRC_LOCATION} |
| ${CMAKE_CURRENT_BINARY_DIR}/${SRC_WITH_PREFIX} |
| WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} |
| ) |
| |
| add_file_target(FILE ${SRC_WITH_PREFIX} GENERATED) |
| get_file_target(SRC_TARGET_NAME ${SRC_WITH_PREFIX}) |
| set_target_properties(${SRC_TARGET_NAME} PROPERTIES INCLUDE_FILES "${REAL_INCLUDE_FILES}") |
| |
| list(APPEND OUTPUTS ${SRC_WITH_PREFIX}) |
| |
| if(${N_TEMPLATE_APPLY_V2X}) |
| get_filename_component(V2X_NAME ${SRC_WITH_PREFIX} NAME_WE) |
| v2x(NAME ${V2X_NAME} SRCS ${SRC_WITH_PREFIX}) |
| endif() |
| if(${N_TEMPLATE_APPLY_VERILOG_IMAGE_GEN}) |
| endif() |
| endforeach(SRC) |
| endforeach(PREFIX) |
| |
| add_custom_target(${N_TEMPLATE_NAME} ALL DEPENDS ${OUTPUTS}) |
| endfunction(N_TEMPLATE) |