|  | find_program(EOG eog) | 
|  | find_program(INKSCAPE inkscape) | 
|  | set(IMAGE_GEN_DPI 300 CACHE STRING "DPI to use when generating images from Verilog SVGs") | 
|  |  | 
|  | set(NETLISTSVG ${f4pga-arch-defs_SOURCE_DIR}/third_party/netlistsvg | 
|  | CACHE STRING "Directory to netlistsvg.") | 
|  | set(NETLISTSVG_BIN ${NETLISTSVG}/bin/netlistsvg.js) | 
|  | set(NETLISTSVG_SKIN ${NETLISTSVG}/lib/default.svg) | 
|  | set(NETLISTSVG_LOCK ${NETLISTSVG}/package-lock.json) | 
|  |  | 
|  | function(setup_netlistsvg) | 
|  | # Creates target netlistsvg that installs netlistsvg to the local node | 
|  | # environment. | 
|  | get_target_property_required(NODE env NODE) | 
|  | get_target_property_required(NPM env NPM) | 
|  | add_custom_command( | 
|  | OUTPUT ${NETLISTSVG_LOCK} | 
|  | COMMAND ${NODE} ${NPM} install | 
|  | WORKING_DIRECTORY ${NETLISTSVG} | 
|  | DEPENDS | 
|  | ${NODE} | 
|  | ${NPM} | 
|  | ${NETLISTSVG}/package.json | 
|  | ) | 
|  |  | 
|  | add_custom_target( | 
|  | netlistsvg DEPENDS ${NETLISTSVG_LOCK} | 
|  | ) | 
|  | endfunction() | 
|  |  | 
|  | setup_netlistsvg() | 
|  |  | 
|  | function(add_svg_image) | 
|  | # ~~~ | 
|  | # ADD_SVG_IMAGE( | 
|  | #   NAME <name> | 
|  | #   FILE <svg filename> | 
|  | #   ) | 
|  | # ~~~ | 
|  | # | 
|  | # ADD_SVG_IMAGE adds two targets, render_<name> and view_<name>. | 
|  | # | 
|  | # render_<name> will convert <svg filename> to a png with the name | 
|  | # <svg filename>.png. SVG will be rendered at IMAGE_GEN_DPI, a CMake cache | 
|  | # veriable, defaulting to 300. | 
|  | # | 
|  | # view_<name> will generated the render PNG and view it using eog. | 
|  | set(options) | 
|  | set(oneValueArgs NAME FILE) | 
|  | set(multiValueArgs) | 
|  | cmake_parse_arguments( | 
|  | ADD_SVG_IMAGE | 
|  | "${options}" | 
|  | "${oneValueArgs}" | 
|  | "${multiValueArgs}" | 
|  | ${ARGN} | 
|  | ) | 
|  |  | 
|  | set(SRC_SVG ${ADD_SVG_IMAGE_FILE}) | 
|  | get_filename_component(SRC_BASE ${SRC_SVG} NAME) | 
|  | set(SRC_PNG ${SRC_BASE}.png) | 
|  | set(DEPS "") | 
|  | append_file_dependency(DEPS ${SRC_SVG}) | 
|  |  | 
|  | add_custom_command( | 
|  | OUTPUT ${SRC_PNG} | 
|  | COMMAND ${INKSCAPE} --export-png ${SRC_PNG} --export-dpi ${IMAGE_GEN_DPI} ${SRC_SVG} | 
|  | DEPENDS ${DEPS} ${INKSCAPE} | 
|  | ) | 
|  |  | 
|  | add_custom_target( | 
|  | render_${ADD_SVG_IMAGE_NAME} | 
|  | DEPENDS ${SRC_PNG} ${EOG} | 
|  | ) | 
|  |  | 
|  | add_custom_target( | 
|  | view_${ADD_SVG_IMAGE_NAME} | 
|  | COMMAND ${EOG} ${SRC_PNG} | 
|  | DEPENDS ${SRC_PNG} ${EOG} | 
|  | ) | 
|  | endfunction() | 
|  |  | 
|  | function(add_verilog_image_gen) | 
|  | # ~~~ | 
|  | # ADD_VERILOG_IMAGE_GEN( | 
|  | #   FILE <verilog filename> | 
|  | #   ) | 
|  | # ~~~ | 
|  | # | 
|  | # ADD_VERILOG_IMAGE_GEN converts a verilog file into several image outputs. | 
|  | # | 
|  | # ADD_VERILOG_IMAGE_GEN always generates output file names by first stripping | 
|  | # all extensions from the input filename.  So ff.sim.v has a basename of ff. | 
|  | # | 
|  | # ADD_VERILOG_IMAGE_GEN first generates an SVG, and then uses ADD_SVG_IMAGE | 
|  | # to render the SVG and view it. | 
|  | # | 
|  | # Output SVGs: | 
|  | # | 
|  | #  * <basename>.bb.yosys.svg - Netlist rendered by yosys, not flattened. | 
|  | #  * <basename>.flat.yosys.svg - Netlist rendered by yosys, flattened. | 
|  | #  * <basename>.bb.svg - Netlist rendered by netlistsvg, not flattened. | 
|  | #  * <basename>.flat.svg - Netlist rendered by yosys, flattened. | 
|  | #  * <basename>.aig.svg - Netlist rendered by yosys, flattened and run | 
|  | #    through yosys's aigmap. | 
|  | # | 
|  | # ADD_VERILOG_IMAGE_GEN generates viewing targets with the following | 
|  | # convention: | 
|  | # | 
|  | # view_<relative directory from root, slashes replaced with underscores>_<basename>.<bb|flat|aig>[.yosys] | 
|  | # | 
|  | # Example: | 
|  | # | 
|  | # view_testarch_primitives_ff_ff.aig | 
|  | # view_testarch_primitives_ff_ff.bb.yosys | 
|  | # | 
|  | set(options) | 
|  | set(oneValueArgs FILE) | 
|  | set(multiValueArgs) | 
|  | cmake_parse_arguments( | 
|  | ADD_VERILOG_IMAGE_GEN | 
|  | "${options}" | 
|  | "${oneValueArgs}" | 
|  | "${multiValueArgs}" | 
|  | ${ARGN} | 
|  | ) | 
|  |  | 
|  | set(SRC ${ADD_VERILOG_IMAGE_GEN_FILE}) | 
|  | set(DEPS "") | 
|  | append_file_dependency(DEPS ${SRC}) | 
|  | get_file_location(SRC_LOCATION ${SRC}) | 
|  |  | 
|  | get_filename_component(SRC_BASE ${SRC} NAME_WE) | 
|  | string(TOUPPER ${SRC_BASE} SIM_TOP) | 
|  | get_filename_component(SRC_DIR ${SRC} DIRECTORY) | 
|  |  | 
|  |  | 
|  | set(SRC_BB_JSON ${SRC_BASE}.bb.json) | 
|  | set(SRC_AIG_JSON ${SRC_BASE}.aig.json) | 
|  | set(SRC_FLAT_JSON ${SRC_BASE}.flat.json) | 
|  | set(SRC_BB_YOSYS_SVG ${SRC_BASE}.bb.yosys.svg) | 
|  | set(SRC_FLAT_YOSYS_SVG ${SRC_BASE}.flat.yosys.svg) | 
|  | set(SVGS ${SRC_BB_YOSYS_SVG} ${SRC_FLAT_YOSYS_SVG}) | 
|  |  | 
|  | get_target_property_required(YOSYS env YOSYS) | 
|  | get_target_property_required(NODE env NODE) | 
|  | add_custom_command( | 
|  | OUTPUT ${SRC_BB_JSON} | 
|  | COMMAND ${YOSYS} -p "prep -top ${SIM_TOP} $<SEMICOLON> write_json ${SRC_BB_JSON}" ${SRC_LOCATION} | 
|  | DEPENDS ${DEPS} ${YOSYS} | 
|  | WORKING_DIRECTORY ${SRC_DIR} | 
|  | VERBATIM | 
|  | ) | 
|  |  | 
|  | add_custom_command( | 
|  | OUTPUT ${SRC_BB_YOSYS_SVG} | 
|  | COMMAND ${YOSYS} -p "prep -top ${SIM_TOP} $<SEMICOLON> show -format svg -prefix ${SRC_BASE}.bb.yosys ${SIM_TOP}" ${SRC} | 
|  | DEPENDS ${DEPS} ${YOSYS} | 
|  | WORKING_DIRECTORY ${SRC_DIR} | 
|  | VERBATIM | 
|  | ) | 
|  |  | 
|  | add_custom_command( | 
|  | OUTPUT ${SRC_AIG_JSON} | 
|  | COMMAND ${YOSYS} -p "prep -top ${SIM_TOP} -flatten $<SEMICOLON> aigmap $<SEMICOLON> write_json ${SRC_AIG_JSON}" ${SRC} | 
|  | DEPENDS ${DEPS} ${YOSYS} | 
|  | WORKING_DIRECTORY ${SRC_DIR} | 
|  | VERBATIM | 
|  | ) | 
|  |  | 
|  | add_custom_command( | 
|  | OUTPUT ${SRC_FLAT_JSON} | 
|  | COMMAND ${YOSYS} -p "prep -top ${SIM_TOP} -flatten $<SEMICOLON> write_json ${SRC_FLAT_JSON}" ${SRC} | 
|  | DEPENDS ${DEPS} ${YOSYS} | 
|  | WORKING_DIRECTORY ${SRC_DIR} | 
|  | VERBATIM | 
|  | ) | 
|  |  | 
|  | add_custom_command( | 
|  | OUTPUT ${SRC_FLAT_YOSYS_SVG} | 
|  | COMMAND ${YOSYS} -p "prep -top ${SIM_TOP} -flatten $<SEMICOLON> show -format svg -prefix ${SRC_BASE}.flat.yosys ${SIM_TOP}" ${SRC} | 
|  | DEPENDS ${DEPS} ${YOSYS} | 
|  | WORKING_DIRECTORY ${SRC_DIR} | 
|  | VERBATIM | 
|  | ) | 
|  |  | 
|  | foreach(SRC_JSON ${SRC_BB_JSON} ${SRC_AIG_JSON} ${SRC_FLAT_JSON}) | 
|  | string(REGEX REPLACE "json$" "svg" | 
|  | SRC_SVG ${SRC_JSON}) | 
|  | list(APPEND SVGS ${SRC_SVG}) | 
|  |  | 
|  | add_custom_command( | 
|  | OUTPUT ${SRC_SVG} | 
|  | COMMAND ${NODE} ${NETLISTSVG_BIN} ${SRC_JSON} -o ${SRC_SVG} --skin ${NETLISTSVG_SKIN} | 
|  | DEPENDS ${NODE} ${NETLISTSVG_BIN} ${NETLISTSVG_SKIN} netlistsvg ${SRC_JSON} | 
|  | ) | 
|  | endforeach() | 
|  |  | 
|  | foreach(SRC_SVG ${SVGS}) | 
|  | add_file_target(FILE ${SRC_SVG} GENERATED) | 
|  | string(REGEX REPLACE "\.svg$" "" | 
|  | BASENAME ${SRC_SVG}) | 
|  | set(DIR ${CMAKE_CURRENT_SOURCE_DIR}) | 
|  | string(REPLACE ${f4pga-arch-defs_SOURCE_DIR}/ "" BASE_FOLDER ${DIR}) | 
|  | string(REPLACE "/" "_" BASE_FOLDER_UNDERSCORE ${BASE_FOLDER}) | 
|  | add_svg_image( | 
|  | NAME ${BASE_FOLDER_UNDERSCORE}_${BASENAME} | 
|  | FILE ${SRC_SVG} | 
|  | ) | 
|  | endforeach() | 
|  | endfunction() |