RegdefFunctions.cmake 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #
  2. # This file contains the function to use when converting Regdef file to headers
  3. #
  4. # Generate_MemIO, Generate_RegIO2, Generate_RegFields, Generate_RegConv take the same arguments:
  5. # - IN_DEF_FILE as the path to the register definition file (e.g. core.def)
  6. # - OUT_H_FILE the path to the header it is going to generate (including its name)
  7. #
  8. # These functions add a custom command invoking GENERATE_GENERATE_TOOL_DEF2CODE.
  9. # If you are not building def2code as part of your project you can run:
  10. # find_package(SivBinTools REQUIRED)
  11. # find_program(GENERATE_TOOL_DEF2CODE def2code HINTS ${SivBinTools_DIR})
  12. #
  13. # They populate the parent scope variable GENERATE_HEADERS_LIST that is used for dependencies.
  14. #
  15. # Then you can call Generate_target.
  16. #
  17. #
  18. # example:
  19. #
  20. # # this is done in previous scope
  21. # include(path/RegdefFunctions.cmake)
  22. #
  23. # set(GENERATE_HEADERS_LIST)
  24. # set(REGDEF_NAME RegisterDefinitions)
  25. #
  26. # function(Mantis_headers IN_DEF_FILE OUT_DIR OUT_FILE)
  27. #
  28. # if (NOT EXISTS ${REGDEF_BINARY_INCLUDE}/${OUT_DIR})
  29. # file(MAKE_DIRECTORY ${REGDEF_BINARY_INCLUDE}/${OUT_DIR})
  30. # endif()
  31. # set(OUT_DIR ${REGDEF_BINARY_INCLUDE}/${OUT_DIR})
  32. #
  33. # Generate_RegIO2(${CMAKE_CURRENT_SOURCE_DIR}/${IN_DEF_FILE} ${OUT_DIR}/${OUT_FILE})
  34. # Generate_RegFields(${CMAKE_CURRENT_SOURCE_DIR}/${IN_DEF_FILE} ${OUT_DIR}/fields_${OUT_FILE})
  35. #
  36. # set(GENERATE_HEADERS_LIST ${GENERATE_HEADERS_LIST} PARENT_SCOPE)
  37. #
  38. # endfunction()
  39. #
  40. # Mantis_headers(mantis_core_regs.def registers core.h)
  41. # Mantis_headers(mantis_load_structure.def hw_struct ctx_config.h)
  42. #
  43. # Generate_target(${REGDEF_NAME})
  44. #
  45. #
  46. # searches for def2code in CMAKE_PROGRAM_PATH if it is not defined already
  47. #
  48. # if you are building def2code you may want to define it before calling this function
  49. #
  50. macro(FIND_DEF2CODE)
  51. if (NOT DEFINED GENERATE_TOOL_DEF2CODE)
  52. find_program(GENERATE_TOOL_DEF2CODE NAMES def2code)
  53. if(${GENERATE_TOOL_DEF2CODE} MATCHES "GENERATE_TOOL_DEF2CODE-NOTFOUND")
  54. message(FATAL_ERROR "def2code was not found")
  55. endif()
  56. endif()
  57. endmacro()
  58. macro(FIND_REGCONV)
  59. if (NOT DEFINED GENERATE_TOOL_REGCONV)
  60. find_program(GENERATE_TOOL_REGCONV NAMES regconv)
  61. if(${GENERATE_TOOL_REGCONV} MATCHES "GENERATE_TOOL_REGCONV-NOTFOUND")
  62. message(FATAL_ERROR "regconv was not found")
  63. endif()
  64. endif()
  65. if (NOT DEFINED GENERATE_TOOL_REGCONV_PRJ)
  66. set(GENERATE_TOOL_REGCONV_PRJ regconv)
  67. endif()
  68. endmacro()
  69. # ----------------------------------------------------------------------
  70. # Generate MemIO function
  71. # ----------------------------------------------------------------------
  72. function(Generate_MemIO IN_DEF_FILE OUT_H_FILE)
  73. FIND_DEF2CODE()
  74. # Custom command to do the processing
  75. add_custom_command(OUTPUT ${OUT_H_FILE}
  76. COMMAND ${GENERATE_TOOL_DEF2CODE} ARGS ${IN_DEF_FILE} -memio ${OUT_H_FILE}
  77. DEPENDS ${IN_DEF_FILE}) # ${GENERATE_TOOL_DEF2CODE_PRJ})
  78. # Finally remember the output file for dependencies
  79. set(GENERATE_HEADERS_LIST ${GENERATE_HEADERS_LIST} ${OUT_H_FILE} PARENT_SCOPE)
  80. endfunction()
  81. # ----------------------------------------------------------------------
  82. # Generate RegIO2 function
  83. # ----------------------------------------------------------------------
  84. function(Generate_RegIO2 IN_DEF_FILE OUT_H_FILE)
  85. FIND_DEF2CODE()
  86. # Custom command to do the processing
  87. add_custom_command(OUTPUT ${OUT_H_FILE}
  88. COMMAND ${GENERATE_TOOL_DEF2CODE} ARGS ${IN_DEF_FILE} -regio2 ${OUT_H_FILE}
  89. DEPENDS ${IN_DEF_FILE}) # ${GENERATE_TOOL_DEF2CODE_PRJ})
  90. # Finally remember the output file for dependencies
  91. set(GENERATE_HEADERS_LIST ${GENERATE_HEADERS_LIST} ${OUT_H_FILE} PARENT_SCOPE)
  92. endfunction()
  93. # ----------------------------------------------------------------------
  94. # Generate RegFields function
  95. # ----------------------------------------------------------------------
  96. function(Generate_RegFields IN_DEF_FILE OUT_H_FILE)
  97. FIND_DEF2CODE()
  98. # Custom command to do the processing
  99. add_custom_command(OUTPUT ${OUT_H_FILE}
  100. COMMAND ${GENERATE_TOOL_DEF2CODE} ARGS ${IN_DEF_FILE} -regfields ${OUT_H_FILE}
  101. DEPENDS ${IN_DEF_FILE}) # ${GENERATE_TOOL_DEF2CODE_PRJ})
  102. # Finally remember the output file for dependencies
  103. set(GENERATE_HEADERS_LIST ${GENERATE_HEADERS_LIST} ${OUT_H_FILE} PARENT_SCOPE)
  104. endfunction()
  105. # ----------------------------------------------------------------------
  106. # Generate RegConv function
  107. # ----------------------------------------------------------------------
  108. function(Generate_RegConv IN_DEF_FILE CHIP_NAME OUT_H_FILE)
  109. FIND_REGCONV()
  110. # Custom command to do the processing
  111. add_custom_command(OUTPUT ${REGDEG_BINARY_INCLUDE}/${OUT_H_FILE}
  112. COMMAND ${GENERATE_TOOL_REGCONV} ARGS -chipname ${CHIP_NAME} ${IN_DEF_FILE} -simout ${OUT_H_FILE}
  113. DEPENDS ${IN_DEF_FILE})
  114. # Finally remember the output file for dependencies
  115. set(GENERATE_HEADERS_LIST ${GENERATE_HEADERS_LIST} ${OUT_H_FILE} PARENT_SCOPE)
  116. endfunction()
  117. function(Generate_target REGDEF_NAME)
  118. if (NOT GENERATE_HEADERS_LIST)
  119. message (FATAL_ERROR "GENERATE_HEADERS_LIST is empty - call some of the generate functions before generating the target")
  120. endif()
  121. # ----------------------------------------------------------------------
  122. # Top level target for all register definitions generation
  123. # ----------------------------------------------------------------------
  124. add_custom_target(${REGDEF_NAME} ALL DEPENDS ${GENERATE_HEADERS_LIST})
  125. set_source_files_properties(${GENERATE_HEADERS_LIST} PROPERTIES GENERATED 1)
  126. endfunction()