fusesoc 2.4__tar.gz → 2.4.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. {fusesoc-2.4 → fusesoc-2.4.2}/.github/workflows/lint.yml +1 -4
  2. {fusesoc-2.4 → fusesoc-2.4.2}/NEWS +26 -0
  3. {fusesoc-2.4 → fusesoc-2.4.2}/PKG-INFO +4 -4
  4. {fusesoc-2.4 → fusesoc-2.4.2}/README.md +2 -2
  5. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/conf.py +5 -9
  6. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/index.rst +1 -1
  7. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/ref/capi1.rst +1 -1
  8. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/ref/migrations.rst +1 -1
  9. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/build_system/core_files.rst +3 -3
  10. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/build_system/dependencies.rst +4 -4
  11. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/build_system/flow_options.rst +1 -1
  12. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/build_system/generators.rst +2 -2
  13. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/build_system/tool_options.rst +1 -1
  14. fusesoc-2.4.2/doc/source/user/cli.rst +56 -0
  15. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/introduction.rst +1 -1
  16. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/package_manager/index.rst +1 -1
  17. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/capi2/core.py +3 -1
  18. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/capi2/json_schema.py +53 -1
  19. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/coremanager.py +22 -0
  20. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/edalizer.py +18 -33
  21. fusesoc-2.4.2/fusesoc/filters/splitlib.py +23 -0
  22. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/fusesoc.py +2 -0
  23. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/main.py +4 -1
  24. fusesoc-2.4.2/fusesoc/provider/svn.py +31 -0
  25. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/version.py +2 -2
  26. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc.egg-info/PKG-INFO +4 -4
  27. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc.egg-info/SOURCES.txt +6 -0
  28. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc.egg-info/requires.txt +1 -1
  29. {fusesoc-2.4 → fusesoc-2.4.2}/pyproject.toml +3 -3
  30. fusesoc-2.4.2/tests/capi2_cores/misc/fileattrs.core +12 -0
  31. fusesoc-2.4.2/tests/capi2_cores/virtual/top_conflict.core +22 -0
  32. fusesoc-2.4.2/tests/capi2_cores/virtual/top_non_deterministic.core +19 -0
  33. fusesoc-2.4.2/tests/cores/misc/svn.core +15 -0
  34. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_capi2.py +12 -0
  35. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_coremanager.py +87 -0
  36. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_edalizer.py +0 -3
  37. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_provider.py +13 -0
  38. fusesoc-2.4/doc/source/user/cli.rst +0 -36
  39. {fusesoc-2.4 → fusesoc-2.4.2}/.editorconfig +0 -0
  40. {fusesoc-2.4 → fusesoc-2.4.2}/.flake8 +0 -0
  41. {fusesoc-2.4 → fusesoc-2.4.2}/.git-blame-ignore-revs +0 -0
  42. {fusesoc-2.4 → fusesoc-2.4.2}/.github/workflows/ci.yml +0 -0
  43. {fusesoc-2.4 → fusesoc-2.4.2}/.gitignore +0 -0
  44. {fusesoc-2.4 → fusesoc-2.4.2}/.pre-commit-config.yaml +0 -0
  45. {fusesoc-2.4 → fusesoc-2.4.2}/.readthedocs.yml +0 -0
  46. {fusesoc-2.4 → fusesoc-2.4.2}/LICENSE +0 -0
  47. {fusesoc-2.4 → fusesoc-2.4.2}/dev-requirements.txt +0 -0
  48. {fusesoc-2.4 → fusesoc-2.4.2}/doc/requirements.txt +0 -0
  49. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/_static/theme_overrides.css +0 -0
  50. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/dev/devsetup.rst +0 -0
  51. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/dev/index.rst +0 -0
  52. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/ref/glossary.rst +0 -0
  53. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/ref/index.rst +0 -0
  54. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/build_system/eda_flows.rst +0 -0
  55. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/build_system/filters.rst +0 -0
  56. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/build_system/flags.rst +0 -0
  57. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/build_system/hooks.rst +0 -0
  58. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/build_system/index.rst +0 -0
  59. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/build_system/vpi.rst +0 -0
  60. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/index.rst +0 -0
  61. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/installation.rst +0 -0
  62. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/knowledgebase.rst +0 -0
  63. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/optional_deps.png +0 -0
  64. {fusesoc-2.4 → fusesoc-2.4.2}/doc/source/user/overview.rst +0 -0
  65. {fusesoc-2.4 → fusesoc-2.4.2}/extras/bash-completion +0 -0
  66. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/capi2/coredata.py +0 -0
  67. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/capi2/coreparser.py +0 -0
  68. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/capi2/exprs.py +0 -0
  69. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/capi2/generator.py +0 -0
  70. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/capi2/inheritance.py +0 -0
  71. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/config.py +0 -0
  72. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/core.py +0 -0
  73. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/filters/autotype.py +0 -0
  74. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/filters/custom.py +0 -0
  75. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/filters/dot.py +0 -0
  76. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/librarymanager.py +0 -0
  77. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/parser/coreparser.py +0 -0
  78. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/provider/git.py +0 -0
  79. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/provider/github.py +0 -0
  80. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/provider/local.py +0 -0
  81. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/provider/opencores.py +0 -0
  82. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/provider/provider.py +0 -0
  83. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/provider/url.py +0 -0
  84. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/utils.py +0 -0
  85. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc/vlnv.py +0 -0
  86. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc.egg-info/dependency_links.txt +0 -0
  87. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc.egg-info/entry_points.txt +0 -0
  88. {fusesoc-2.4 → fusesoc-2.4.2}/fusesoc.egg-info/top_level.txt +0 -0
  89. {fusesoc-2.4 → fusesoc-2.4.2}/setup.cfg +0 -0
  90. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/deptree/child1.core +0 -0
  91. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/deptree/child2.core +0 -0
  92. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/deptree/child3.core +0 -0
  93. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/deptree/child4.core +0 -0
  94. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/deptree/generated_child_a.core +0 -0
  95. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/deptree/generated_child_a.py +0 -0
  96. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/deptree/root.core +0 -0
  97. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/files_out_of_hierarchy/bad.sv +0 -0
  98. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/files_out_of_hierarchy/subdir/files_out_of_hierarchy.core +0 -0
  99. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/files_out_of_hierarchy/subdir/good.sv +0 -0
  100. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/append.core +0 -0
  101. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/depends.core +0 -0
  102. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/dontpickthisfile +0 -0
  103. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/dummy.tcl +0 -0
  104. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/empty.core +0 -0
  105. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/f1 +0 -0
  106. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/f2 +0 -0
  107. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/f3 +0 -0
  108. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/f4 +0 -0
  109. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/files.core +0 -0
  110. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/filters.core +0 -0
  111. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/flags.core +0 -0
  112. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/flow.core +0 -0
  113. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/generate/file_cachetest +0 -0
  114. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/generate/generate.core +0 -0
  115. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/generate/generators.core +0 -0
  116. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/generate/testgen.py +0 -0
  117. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/hooks.core +0 -0
  118. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/parameters.core +0 -0
  119. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/scriptfile +0 -0
  120. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/subdir/dummy.extra +0 -0
  121. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/syntax_error.core +0 -0
  122. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/targets.core +0 -0
  123. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/toplevel.core +0 -0
  124. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/typecheck.core +0 -0
  125. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/uncachable.core +0 -0
  126. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/vhdlfile +0 -0
  127. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/vlogfile +0 -0
  128. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/vpi.core +0 -0
  129. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/misc/vpifile +0 -0
  130. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/override/1/basic.core +0 -0
  131. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/override/2/basic.core +0 -0
  132. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/parser/inheritance.core +0 -0
  133. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/parser/no_additional_properties.core +0 -0
  134. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/parser/with_additional_properties.core +0 -0
  135. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/providers/url_simple.core +0 -0
  136. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/providers/url_simple_with_user_agent.core +0 -0
  137. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/providers/url_tar.core +0 -0
  138. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/providers/url_zip.core +0 -0
  139. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/virtual/impl1.core +0 -0
  140. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/virtual/impl2.core +0 -0
  141. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/virtual/top_impl1.core +0 -0
  142. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/virtual/top_impl2.core +0 -0
  143. {fusesoc-2.4 → fusesoc-2.4.2}/tests/capi2_cores/virtual/user.core +0 -0
  144. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/adv_debug_sys/adv_debug_sys.core +0 -0
  145. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/atlys/atlys.core +0 -0
  146. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/atlys/data/atlys.ucf +0 -0
  147. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/atlys/data/dummy_backend_tcl_file.tcl +0 -0
  148. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/elf-loader/check_libelf.sh +0 -0
  149. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/elf-loader/elf-loader.c +0 -0
  150. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/elf-loader/elf-loader.core +0 -0
  151. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/elf-loader/vpi_wrapper.c +0 -0
  152. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/gpio/gpio.core +0 -0
  153. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/jtag_tap/jtag_tap-1.13.core +0 -0
  154. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/libstorage/libstorage-1.0.core +0 -0
  155. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/c3demo.core +0 -0
  156. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/c3demo.pcf +0 -0
  157. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/copytocore/copytocore.core +0 -0
  158. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/copytocore/dummy.tcl +0 -0
  159. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/copytocore/subdir/dummy.extra +0 -0
  160. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/dummy.tcl +0 -0
  161. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/dummy.xci +0 -0
  162. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/filetypes.core +0 -0
  163. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/ghdltest.core +0 -0
  164. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/gitcore.core +0 -0
  165. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/no_exe_script.core +0 -0
  166. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/nomain.core +0 -0
  167. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/opencorescore.core +0 -0
  168. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/paramtest.core +0 -0
  169. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/scripts/no_exe_script +0 -0
  170. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/scripts/post_build_script +0 -0
  171. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/scripts/post_run_script +0 -0
  172. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/scripts/pre_build_script +0 -0
  173. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/scripts/pre_run_script +0 -0
  174. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/scriptscore.core +0 -0
  175. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/misc/subdir/dummy.extra +0 -0
  176. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/mor1kx/mor1kx-3.1.core +0 -0
  177. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/mor1kx-arty/mor1kx-arty.core +0 -0
  178. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/mor1kx-arty/mor1kx-arty.system +0 -0
  179. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/mor1kx-generic/mor1kx-generic.core +0 -0
  180. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/mor1kx-generic/scripts/post_run_script +0 -0
  181. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/mor1kx-generic/scripts/pre_build_script +0 -0
  182. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/mor1kx-generic/scripts/pre_run_script +0 -0
  183. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/sockit/sockit.core +0 -0
  184. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/uart16550/uart16550-1.5.core +0 -0
  185. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/verilator_tb_utils/verilator_tb_utils.core +0 -0
  186. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/verilog-arbiter/verilog-arbiter-r1.core +0 -0
  187. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/verilog_utils/verilog_utils.core +0 -0
  188. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/verilog_utils/verilog_utils.vh +0 -0
  189. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/vga_lcd/vga_lcd.core +0 -0
  190. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/vlog_tb_utils/files/0001-testpatch.patch +0 -0
  191. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/vlog_tb_utils/vlog_tb_utils-1.1.core +0 -0
  192. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/wb_common/wb_common.core +0 -0
  193. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/wb_common/wb_common.v +0 -0
  194. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/wb_common/wb_common_params.v +0 -0
  195. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/wb_intercon/dummy_icarus.v +0 -0
  196. {fusesoc-2.4 → fusesoc-2.4.2}/tests/cores/wb_intercon/wb_intercon-1.0.core +0 -0
  197. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_capi2/generators.info +0 -0
  198. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_capi2/targets.info +0 -0
  199. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_common.py +0 -0
  200. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_config.py +0 -0
  201. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_exprs.py +0 -0
  202. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_ignored_dirs.py +0 -0
  203. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_libraries.py +0 -0
  204. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_provider/file.tar.gz +0 -0
  205. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_provider/file.v +0 -0
  206. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_provider/file.zip +0 -0
  207. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_provider/vlog_functions.v +0 -0
  208. {fusesoc-2.4 → fusesoc-2.4.2}/tests/test_vlnv.py +0 -0
  209. {fusesoc-2.4 → fusesoc-2.4.2}/tests/userguide/blinky/blinky.core +0 -0
  210. {fusesoc-2.4 → fusesoc-2.4.2}/tests/userguide/blinky/data/nexys_video.xdc +0 -0
  211. {fusesoc-2.4 → fusesoc-2.4.2}/tests/userguide/blinky/rtl/blinky.sv +0 -0
  212. {fusesoc-2.4 → fusesoc-2.4.2}/tests/userguide/blinky/rtl/macros.svh +0 -0
  213. {fusesoc-2.4 → fusesoc-2.4.2}/tests/userguide/blinky/tb/blinky_tb.sv +0 -0
  214. {fusesoc-2.4 → fusesoc-2.4.2}/tests/userguide/dualblinky/data/nexys_video.xdc +0 -0
  215. {fusesoc-2.4 → fusesoc-2.4.2}/tests/userguide/dualblinky/dualblinky.core +0 -0
  216. {fusesoc-2.4 → fusesoc-2.4.2}/tests/userguide/dualblinky/rtl/dualblinky.sv +0 -0
  217. {fusesoc-2.4 → fusesoc-2.4.2}/tox.ini +0 -0
@@ -1,9 +1,6 @@
1
1
  name: lint
2
2
 
3
- on:
4
- pull_request:
5
- push:
6
- branches: [master]
3
+ on: [pull_request, push]
7
4
 
8
5
  jobs:
9
6
  pre-commit:
@@ -1,3 +1,29 @@
1
+ 2.4.2 2024-01-07 Olof Kindgren <olof.kindgren@gmail.com>
2
+ ======================================================
3
+
4
+ * Support lists in file_input_parameters
5
+ * Add SVN provider
6
+ * Support file-specific defines
7
+ * Always build non-cached generators in work_root
8
+ * Add splitlib filter
9
+ * Warn about non-deterministic virtual cores
10
+
11
+ Contributors:
12
+ Erik Bånvik <erik.public@gmail.com>
13
+ James Wainwright <james.wainwright@lowrisc.org>
14
+ Mario Werner <nioshd@gmail.com>
15
+ Nazar Kazakov <nazar.kazakov@codethink.co.uk>
16
+ Nico Rumpeltin <nico@rumpeltin.de>
17
+ Olof Kindgren <olof.kindgren@gmail.com>
18
+
19
+ 2.4.1 2024-10-07 Olof Kindgren <olof.kindgren@gmail.com>
20
+ ======================================================
21
+
22
+ * Fix broken documentation builds
23
+
24
+ Contributors:
25
+ Olof Kindgren <olof.kindgren@gmail.com>
26
+
1
27
  2.4 2024-10-02 Olof Kindgren <olof.kindgren@gmail.com>
2
28
  ======================================================
3
29
  * Add conflict handling for virtual cores
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fusesoc
3
- Version: 2.4
3
+ Version: 2.4.2
4
4
  Summary: Award-winnning package manager and build abstraction tool for HDL code
5
5
  Author-email: Olof Kindgren <olof@award-winning.me>
6
6
  Maintainer-email: Olof Kindgren <olof@award-winning.me>
@@ -20,7 +20,7 @@ License-File: LICENSE
20
20
  Requires-Dist: edalize>=0.4.1
21
21
  Requires-Dist: pyparsing>=2.3.1
22
22
  Requires-Dist: pyyaml>=6.0
23
- Requires-Dist: simplesat>=0.8.0
23
+ Requires-Dist: simplesat>=0.9.1
24
24
  Requires-Dist: fastjsonschema
25
25
  Requires-Dist: jsonschema2md
26
26
 
@@ -61,7 +61,7 @@ full list of system requirements and installation instructions in the
61
61
  ### Quick start
62
62
 
63
63
  To check if FuseSoC is working, and to get an initial feeling for how FuseSoC
64
- works, you can try to simulate a simple hardware design from our core libray.
64
+ works, you can try to simulate a simple hardware design from our core library.
65
65
 
66
66
  First, create and enter an empty workspace
67
67
 
@@ -87,7 +87,7 @@ add e.g. `--tool=modelsim` or `--tool=xcelium` between `run` and `i2c`.
87
87
  Did it work? Great! FuseSoC can be used to create FPGA images, perform
88
88
  linting, manage your IP libraries or do formal verification as well.
89
89
  Check out the [online documentation](https://fusesoc.readthedocs.io/en/stable/)
90
- documentation to learn more about creating your own core files and using
90
+ to learn more about creating your own core files and using
91
91
  existing ones. If it didn't work, please get in touch (see below).
92
92
 
93
93
  ## Next steps
@@ -35,7 +35,7 @@ full list of system requirements and installation instructions in the
35
35
  ### Quick start
36
36
 
37
37
  To check if FuseSoC is working, and to get an initial feeling for how FuseSoC
38
- works, you can try to simulate a simple hardware design from our core libray.
38
+ works, you can try to simulate a simple hardware design from our core library.
39
39
 
40
40
  First, create and enter an empty workspace
41
41
 
@@ -61,7 +61,7 @@ add e.g. `--tool=modelsim` or `--tool=xcelium` between `run` and `i2c`.
61
61
  Did it work? Great! FuseSoC can be used to create FPGA images, perform
62
62
  linting, manage your IP libraries or do formal verification as well.
63
63
  Check out the [online documentation](https://fusesoc.readthedocs.io/en/stable/)
64
- documentation to learn more about creating your own core files and using
64
+ to learn more about creating your own core files and using
65
65
  existing ones. If it didn't work, please get in touch (see below).
66
66
 
67
67
  ## Next steps
@@ -12,7 +12,6 @@
12
12
  import os
13
13
  import sys
14
14
  from datetime import datetime
15
- from distutils.version import LooseVersion
16
15
 
17
16
  import jsonschema2md
18
17
 
@@ -35,16 +34,13 @@ project = "FuseSoC"
35
34
  copyright = f"2018-{datetime.now().year}, Olof Kindgren"
36
35
  author = "Olof Kindgren"
37
36
 
37
+ from importlib.metadata import version as get_version
38
+
38
39
  # The full version, including alpha/beta/rc tags.
39
- try:
40
- from fusesoc.version import version as __version__
41
- except ImportError:
42
- __version__ = "unknown"
40
+ release: str = get_version("fusesoc")
43
41
 
44
- release = __version__
45
42
  # The short X.Y version.
46
- v_major, v_minor = LooseVersion(release).version[:2]
47
- version = f"{v_major}.{v_minor}"
43
+ version: str = ".".join(release.split(".")[:2])
48
44
 
49
45
  # -- General configuration ---------------------------------------------------
50
46
 
@@ -67,7 +63,7 @@ extensions = [
67
63
  "myst_parser",
68
64
  ]
69
65
 
70
- intersphinx_mapping = {"https://docs.python.org/3": None}
66
+ intersphinx_mapping = {"python": ("https://docs.python.org/3", None)}
71
67
 
72
68
 
73
69
  # Add any paths that contain templates here, relative to this directory.
@@ -8,7 +8,7 @@ This documentation contains material for different audiences.
8
8
 
9
9
  The :doc:`User Guide <user/index>` explains how to get started with FuseSoC, starting from the installation.
10
10
 
11
- The :doc:`Reference Guide <ref/index>` provides a detailled description of all file formats and APIs.
11
+ The :doc:`Reference Guide <ref/index>` provides a detailed description of all file formats and APIs.
12
12
 
13
13
  The :doc:`Developer's Guide <dev/index>` is aimed at developers of FuseSoC itself.
14
14
  It explains how to set up a development environment, how the source code is structured, and how patches and bug reports can be submitted to the project.
@@ -361,7 +361,7 @@ main
361
361
  - Supported simulators. Valid values are
362
362
  icarus, modelsim, verilator, isim and
363
363
  xsim. Each simulator have a dedicated
364
- section desribed elsewhere in this
364
+ section described elsewhere in this
365
365
  document
366
366
 
367
367
 
@@ -278,7 +278,7 @@ Why
278
278
  ---
279
279
  As an aid for scripts executed during the build process, a number of environment variables were defined. Unfortunately this was done without too much thought and as time moved on, some of these turned out to be a maintenance burden without bringing much benefit, and in some cases without ever being used.
280
280
 
281
- At the same time, the introduction of VLNV and dependency ranges has introduced non-determinism in where the output of a build ends up. For these reasons, it was determined to redefine the rarely used `build_root` variable to point to the the directory containing the work root and exported files. A `--build-root` command-line switch is introduced to explictly set a build_root. Setting `build_root` in `fusesoc.conf` will keep working the same way as before, but the command-line switch takes precedence. CAPI1 cores will no longer export the `BUILD_ROOT` environment variable.
281
+ At the same time, the introduction of VLNV and dependency ranges has introduced non-determinism in where the output of a build ends up. For these reasons, it was determined to redefine the rarely used `build_root` variable to point to the the directory containing the work root and exported files. A `--build-root` command-line switch is introduced to explicitly set a build_root. Setting `build_root` in `fusesoc.conf` will keep working the same way as before, but the command-line switch takes precedence. CAPI1 cores will no longer export the `BUILD_ROOT` environment variable.
282
282
 
283
283
  These changes affects the following cases:
284
284
 
@@ -165,12 +165,12 @@ For each named file set, several keys are supported:
165
165
  Source files
166
166
  ~~~~~~~~~~~~
167
167
 
168
- Source files are resolved relative to the location of the core file and must be stored in the same directory as the core file, or in a subdirectory of it.
168
+ For local cores, source files are resolved relative to the location of the core file and must be stored in the same directory as the core file, or in a subdirectory of it. For remote cores, file names are typically relative to the repository or archive root.
169
169
  Source file names cannot be absolute paths, or start with ``../``.
170
170
 
171
- Optionally, source files can have attributes; the file ``macros.vh`` is an example of that.
171
+ Optionally, source files can have attributes; the file ``macros.svh`` is an example of that.
172
172
  When specifying attributes, end the file name with a colon (``:``), and specify attributes as key-value pairs below it.
173
- (Alternatively, the equivalent short form syntax can be used, e.g. ``macros.vh: {is_include_file: true}``.)
173
+ (Alternatively, the equivalent short form syntax can be used, e.g. ``macros.svh: {is_include_file: true}``.)
174
174
 
175
175
  The most common attributes are:
176
176
 
@@ -12,7 +12,7 @@ This section explains how dependencies are specified, how they are resolved by F
12
12
  A dependency example: DualBlinky
13
13
  --------------------------------
14
14
 
15
- We introduced the basic FuseSoC features by creating an reusable core called Blinky.
15
+ We introduced the basic FuseSoC features by creating a reusable core called Blinky.
16
16
  To illustrate the concept of dependencies in FuseSoC we employ another example: DualBlinky, the "dual-core" version of Blinky.
17
17
  Again, all source code is available in the `FuseSoC source tree <https://github.com/olofk/fusesoc>`_ in the ``tests/userguide/dualblinky`` directory.
18
18
 
@@ -71,14 +71,14 @@ The following rules apply.
71
71
 
72
72
  * Files from dependencies are inserted into the file list before the files in the file set where the dependency is declared.
73
73
  * The order in which dependencies are listed in the ``depend`` section does not imply any ordering.
74
- That is, specifiying ``depend: [A, B]`` does not guarantee that files from core ``A`` are included before the ones from core ``B``.
74
+ That is, specifying ``depend: [A, B]`` does not guarantee that files from core ``A`` are included before the ones from core ``B``.
75
75
  (If such an order is desired, make core ``B`` depend on ``A``.)
76
76
 
77
77
  What happens if a dependency is specified?
78
78
  ------------------------------------------
79
79
 
80
80
  Declaring a dependency includes the dependent core in the build.
81
- More specificially, the following sections specified in the ``default`` target of the dependent core are included:
81
+ More specifically, the following sections specified in the ``default`` target of the dependent core are included:
82
82
 
83
83
  * ``filesets``: File sets to include.
84
84
  * ``hooks``: A list of hooks to execute.
@@ -94,7 +94,7 @@ Version constraints
94
94
 
95
95
  Version constraints specify which version of a dependent core can be used, and which versions are incompatible.
96
96
 
97
- Within a :term:`core file`, version constraints are expressed by prefixing a core name with a version comparision operator.
97
+ Within a :term:`core file`, version constraints are expressed by prefixing a core name with a version comparison operator.
98
98
  The following version comparison operators are available.
99
99
 
100
100
  .. list-table:: Version comparison operators
@@ -11,7 +11,7 @@ At the same time, a certain level of tool-specific configurability is required t
11
11
 
12
12
  There are two categories of options available for the Edalize flows. *Flow options* that affect how the tools are chained together (the flow graph) and *tool options* for the individual tools to be run as part of the flow. This means that since the flow options influence which tools that will be run, some tool options only become available for certain combinations of flow options.
13
13
 
14
- Only one flow can be defined for a target, but the flow it self can be configured in different ways. The example below shows how the `test` target selects and configures a flow. The `flow` key selectes the flow itself. The selected `sim` flow has a *flow option* called `tool` that decides which simulator to use. `iverilog_options` and `vlog_options` are tool options for Icarus Verilog and Siemens QuestaSim/ModelSim and will be passed to the approriate tool if it is present in the flow graph.
14
+ Only one flow can be defined for a target, but the flow itself can be configured in different ways. The example below shows how the `test` target selects and configures a flow. The `flow` key selects the flow itself. The selected `sim` flow has a *flow option* called `tool` that decides which simulator to use. `iverilog_options` and `vlog_options` are tool options for Icarus Verilog and Siemens QuestaSim/ModelSim and will be passed to the appropriate tool if it is present in the flow graph.
15
15
 
16
16
  This setup selects icarus as the tool, which means the `vlog_options` will not be used. However, all *flow options* and *tool options* are also automatically available on the command-line, which means that passing `--tool=modelsim` as a backend parameter will override the tool setting from the target. The same can be done for the two tool options, with the difference that for flow or tool option that are lists, any additional values passed on the command-line will append rather than replace the values in the core description file.
17
17
 
@@ -135,7 +135,7 @@ The final piece of the generators machinery is to run a generator with some spec
135
135
  offset: 0xf0000000
136
136
  size: 1024
137
137
 
138
- The above core file snippet will register a parametrized generator instance with the name wb_intercon. It will use the generator called `wb_intercon_gen` which FuseSoC has previously found in the depedency tree. Everything listed under the `parameters` key is instance-specific configuration to be sent to the generator.
138
+ The above core file snippet will register a parametrized generator instance with the name wb_intercon. It will use the generator called `wb_intercon_gen` which FuseSoC has previously found in the dependency tree. Everything listed under the `parameters` key is instance-specific configuration to be sent to the generator.
139
139
 
140
140
  Just registering a generate section will not cause the generator to be invoked. It must also be listed in the target and the generator to be used must be in the dependency tree. The following snippet adds the parameterized generator to the `default` target and adds an explicit dependency on the core that contains the generator. As CAPI2 cores only allow filesets to have dependencies, an empty fileset for this purpose must be created
141
141
 
@@ -169,7 +169,7 @@ Generator Cache
169
169
  ---------------
170
170
  Instead of fusesoc rerunning a generator each time and producing the same result it is possible to configure fusesoc to cache generator output and try to detect if a new run would produce the same output. Since there is no generic way of doing this that will fit all generators a couple of different methods for caching and detecting changes are available.
171
171
 
172
- The `generators` option `cache_type` is used for configuring type of caching. If set to `none` (or if option is omitted) no caching will be used. If set to `input` fusesoc will calculate a SHA256 hash of the generator input yaml file data and use this hash for detecting if something has changed and a rerun would be needed. This would happen if some data in the core file `generate` section, for instance `paramaters`, has changed.
172
+ The `generators` option `cache_type` is used for configuring type of caching. If set to `none` (or if option is omitted) no caching will be used. If set to `input` fusesoc will calculate a SHA256 hash of the generator input yaml file data and use this hash for detecting if something has changed and a rerun would be needed. This would happen if some data in the core file `generate` section, for instance `parameters`, has changed.
173
173
 
174
174
  If `cache_type` is set to `generator` fusesoc will pass the responsibility for detecting if the previous run to the generator is still up to date. In this mode the generator will always be called and the output directory will be saved.
175
175
 
@@ -26,7 +26,7 @@ Typically, these keys are called ``BINARYNAME_options``, and they take a list of
26
26
  The example below shows how tool options for Icarus Verilog (``icarus``) and Mentor ModelSim (``modelsim``) are set.
27
27
 
28
28
  * The ``iverilog`` binary will be called with the ``-g2012`` command-line argument, indicating that SystemVerilog 2012 support should be enabled.
29
- * Similarily, for ModelSim the argument ``-timescale=1ns/1ns`` will be passed to the ``vlog`` binary, which elaborates the design.
29
+ * Similarly, for ModelSim the argument ``-timescale=1ns/1ns`` will be passed to the ``vlog`` binary, which elaborates the design.
30
30
 
31
31
  .. code-block:: yaml
32
32
 
@@ -0,0 +1,56 @@
1
+ .. _ug_cli:
2
+
3
+ ***************
4
+ Running FuseSoC
5
+ ***************
6
+
7
+ FuseSoC is a command-line tool; this section explains how to use it.
8
+ The following content is aimed at users who already have a hardware design which uses FuseSoC.
9
+
10
+ Build a design
11
+ ==============
12
+
13
+ The ``fusesoc run`` group of commands is used to setup, build, and (if possible) run a design.
14
+ The exact actions taken by the individual steps depend on the toolflow.
15
+
16
+ ::
17
+
18
+ usage: fusesoc run [-h] [--no-export] [--build-root BUILD_ROOT] [--setup] [--build] [--run] [--target TARGET] [--tool TOOL] [--flag FLAG] [--system-name SYSTEM_NAME] system ...
19
+
20
+ positional arguments:
21
+ system Select a system to operate on
22
+ backendargs arguments to be sent to backend
23
+
24
+ optional arguments:
25
+ -h, --help show this help message and exit
26
+ --no-export Reference source files from their current location instead of exporting to a build tree
27
+ --build-root BUILD_ROOT
28
+ Output directory for build. Defaults to build/$VLNV
29
+ --setup Execute setup stage
30
+ --build Execute build stage
31
+ --run Execute run stage
32
+ --target TARGET Override default target
33
+ --tool TOOL Override default tool for target
34
+ --flag FLAG Set custom use flags. Can be specified multiple times
35
+ --system-name SYSTEM_NAME
36
+ Override default VLNV name for system
37
+
38
+ When FuseSoC is invoked with the run command, it will create an empty working directory called `work_root` internally, where it by default will create all project files, copy all used source files, build and optionally run the project.
39
+
40
+ Setup, build and run
41
+ --------------------
42
+
43
+ The process of running EDA tools is divided into three steps called *setup*, *build* and *run*. The *setup* stage creates the working directory and all project files. The *build* stage runs one or more EDA tools to build an artifact, e.g. a GDS, simulation model or FPGA image. The *run* stage is only implemented for some tool flows, such as simulation flows where it runs the simulation. Some FPGA flows uses the *run* stage to program an FPGA device.
44
+
45
+ Normally FuseSoC runs all three stages, but if the `--setup` flag is added, it will stop after the setup stage and if the `--build` flag is set it will stop after the build stage. Many of the newer backends don't need these flags and will instead only run setup or build when input files or options have changed.
46
+
47
+ Work root
48
+ ---------
49
+ `work_root` is a private working directory and should not be shared between different builds. It is however perfectly fine to reuse the working directory for e.g. running several simulations using different runtime options as long as the build-time options and source files are not modified.
50
+
51
+ By default, FuseSoC will use `build/<sanitized VLNV>/<target>`, where `<sanitized VLNV>` is the top-level VLNV with underscore instead of colon as the separator. For the Flow API, `<target>` is just the name of the target in the core description file, e.g. `sim`. For the old Tool API, it is a combination of target name and the tool backend, e.g. `sim-verilator`. The work root directory can be changed with the `--work-root` option.
52
+
53
+ Exporting source files
54
+ ----------------------
55
+
56
+ The standard behavior for FuseSoC is to copy all used source files into a subdirectory of the work root. This has three advantages. The work root is self-contained with all the source files and can be copied elsewhere for archival purposes or to build on another machine. No stray files are picked up by mistake from the original source directories. It is always possible to know from exactly which files a build was created. Despite this, there are situations where it is preferable to reference the source files from their original location. This can be done by adding the `--no-export` flag.
@@ -20,7 +20,7 @@ Its main purpose is to increase reuse of IP (Intellectual Property) cores and be
20
20
 
21
21
  - set up continuous integration
22
22
 
23
- **FuseSoC is non-intrusive** Most existing designs doesn't need any changes to work with FuseSoC. Any FuseSoC-specific patches can be applied on the fly during implementation or simulation
23
+ **FuseSoC is non-intrusive** Most existing designs don't need any changes to work with FuseSoC. Any FuseSoC-specific patches can be applied on the fly during implementation or simulation
24
24
 
25
25
  **FuseSoC is modular** It can be used as an end-to-end flow, to create initial project files for an EDA tool or integrate with your custom workflow
26
26
 
@@ -54,7 +54,7 @@ FuseSoC is launched. The library locations specified from the
54
54
  command-line will be parsed after those in ``fusesoc.conf``
55
55
 
56
56
  For each library location, FuseSoC will recursively search for files
57
- with a *.core* suffix. Each of these files will be parsed and addded to
57
+ with a *.core* suffix. Each of these files will be parsed and added to
58
58
  the in-memory FuseSoC database if they are valid ``.core`` files.
59
59
 
60
60
  Several ``.core`` files can reside in the same directory and they will all be parsed.
@@ -93,7 +93,8 @@ class Core:
93
93
 
94
94
  dirs = list(set(map(os.path.dirname, src_files)))
95
95
  for d in dirs:
96
- os.makedirs(os.path.join(dst_dir, d), exist_ok=True)
96
+ if not os.path.isabs(d):
97
+ os.makedirs(os.path.join(dst_dir, d), exist_ok=True)
97
98
 
98
99
  for f in src_files:
99
100
  if f.startswith(".."):
@@ -274,6 +275,7 @@ class Core:
274
275
  if (type(v) == bool and v == True)
275
276
  or (type(v) == str and len(v)) > 0
276
277
  or (type(v) == list and len(v)) > 0
278
+ or (type(v) == dict and len(v)) > 0
277
279
  }
278
280
 
279
281
  _src_files.append(attributes)
@@ -148,6 +148,39 @@ capi2_schema = """
148
148
  "revision"
149
149
  ]
150
150
  },
151
+ {
152
+ "description": "svn Provider",
153
+ "type": "object",
154
+ "properties": {
155
+ "name": {
156
+ "type": "string",
157
+ "pattern": "^svn$"
158
+ },
159
+ "url": {
160
+ "type": "string"
161
+ },
162
+ "revision": {
163
+ "type": "string"
164
+ },
165
+ "ignore_externals": {
166
+ "type": "boolean"
167
+ },
168
+ "patches": {
169
+ "type": "array",
170
+ "items": {
171
+ "type": "string"
172
+ }
173
+ },
174
+ "cachable": {
175
+ "type": "boolean"
176
+ }
177
+ },
178
+ "additionalProperties": false,
179
+ "required": [
180
+ "name",
181
+ "url"
182
+ ]
183
+ },
151
184
  {
152
185
  "description": "url Provider",
153
186
  "type": "object",
@@ -228,6 +261,25 @@ capi2_schema = """
228
261
  "description": "Path to file",
229
262
  "type": "object",
230
263
  "properties": {
264
+ "define": {
265
+ "description": "Defines to be used for this file. These defines will be added to those specified in the target parameters section. If a define is specified both here and in the target parameter section, the value specified here will take precedence. The parameter default value can be set here with ``param=value``",
266
+ "type": "object",
267
+ "patternProperties": {
268
+ "^.+$": {
269
+ "anyOf": [
270
+ {
271
+ "type": "string"
272
+ },
273
+ {
274
+ "type": "number"
275
+ },
276
+ {
277
+ "type": "boolean"
278
+ },
279
+ ]
280
+ }
281
+ }
282
+ },
231
283
  "is_include_file": {
232
284
  "description": "Treats file as an include file when true",
233
285
  "type": "boolean"
@@ -346,7 +398,7 @@ capi2_schema = """
346
398
  }
347
399
  },
348
400
  "^scripts$": {
349
- "description": "A script specifies how to run an external command that is called by the hooks section together with the actual files needed to run the script. Scripts are alway executed from the work root",
401
+ "description": "A script specifies how to run an external command that is called by the hooks section together with the actual files needed to run the script. Scripts are always executed from the work root",
350
402
  "type": "object",
351
403
  "patternProperties": {
352
404
  "^.+$": {
@@ -225,14 +225,36 @@ class CoreDB:
225
225
  except NoPackageFound as e:
226
226
  raise DependencyError(top_core.name)
227
227
 
228
+ virtual_selection = {}
228
229
  objdict = {}
229
230
  if len(transaction.operations) > 1:
230
231
  for op in transaction.operations:
232
+ package_name = self._package_name(op.package.core.name)
233
+ virtuals = op.package.core.get_virtuals(_flags)
231
234
  for p in op.package.provides:
235
+ for virtual in virtuals:
236
+ if p[0] == self._package_name(virtual):
237
+ # Add virtual core selection to dictionary
238
+ virtual_selection[package_name] = (
239
+ op.package.core.name,
240
+ virtual,
241
+ )
232
242
  objdict[p[0]] = str(op.package.core.name)
243
+ for p in op.package.install_requires:
244
+ if p[0] in virtual_selection:
245
+ # If package that implements a virtual core is required, remove from the dictionary
246
+ del virtual_selection[p[0]]
233
247
  op.package.core.direct_deps = [
234
248
  objdict[n[0]] for n in op.package.install_requires
235
249
  ]
250
+ # Print a warning for all virtual selections that has no concrete requirement selection
251
+ for virtual in virtual_selection.values():
252
+ logger.warning(
253
+ "Non-deterministic selection of virtual core {} selected {}".format(
254
+ virtual[1], virtual[0]
255
+ )
256
+ )
257
+
236
258
  result = [op.package.core for op in transaction.operations]
237
259
 
238
260
  # Cache the solution for further lookups
@@ -74,16 +74,7 @@ class Edalizer:
74
74
  @property
75
75
  def resolved_cores(self):
76
76
  """Get a list of all "used" cores after the dependency resolution"""
77
- try:
78
- return self.core_manager.get_depends(self.toplevel, self.flags)
79
- except DependencyError as e:
80
- logger.error(
81
- e.msg + f"\nFailed to resolve dependencies for {self.toplevel}"
82
- )
83
- exit(1)
84
- except SyntaxError as e:
85
- logger.error(e.msg)
86
- exit(1)
77
+ return self.core_manager.get_depends(self.toplevel, self.flags)
87
78
 
88
79
  @property
89
80
  def discovered_cores(self):
@@ -150,7 +141,6 @@ class Edalizer:
150
141
  def run_generators(self):
151
142
  """Run all generators"""
152
143
  self._resolved_or_generated_cores = []
153
- self._generated_core_dirs_to_remove = []
154
144
  for core in self.cores:
155
145
  logger.debug("Running generators in " + str(core.name))
156
146
  core_flags = self._core_flags(core)
@@ -160,7 +150,7 @@ class Edalizer:
160
150
  ttptttg_data,
161
151
  core,
162
152
  self.generators,
163
- self.work_root if not self.export_root else None,
153
+ self.work_root,
164
154
  resolve_env_vars=self.resolve_env_vars,
165
155
  )
166
156
  try:
@@ -175,11 +165,6 @@ class Edalizer:
175
165
  core.direct_deps.append(str(gen_core.name))
176
166
  gen_core.pos = _ttptttg.pos
177
167
  self._resolved_or_generated_cores.append(gen_core)
178
- if self.export_root and not (
179
- _ttptttg.is_generator_cacheable()
180
- or _ttptttg.is_input_cacheable()
181
- ):
182
- self._generated_core_dirs_to_remove.append(gen_core.core_root)
183
168
 
184
169
  def export(self):
185
170
  for core in self.cores:
@@ -198,9 +183,6 @@ class Edalizer:
198
183
  src = os.path.join(files_root, file["name"])
199
184
  self._copyto(src, file.get("copyto"))
200
185
 
201
- # Clean up ttptttg temporary directories
202
- self.clean_temp_dirs()
203
-
204
186
  def _copyto(self, src, name):
205
187
  dst = os.path.join(self.work_root, name)
206
188
  os.makedirs(os.path.dirname(dst), exist_ok=True)
@@ -316,11 +298,6 @@ class Edalizer:
316
298
  for snippet in first_snippets + snippets + last_snippets:
317
299
  merge_dict(self.edam, snippet)
318
300
 
319
- def clean_temp_dirs(self):
320
- for coredir in self._generated_core_dirs_to_remove:
321
- logger.debug(f"Removing {coredir} ttptttg temporary directory")
322
- shutil.rmtree(coredir)
323
-
324
301
  def _build_parser(self, backend_class, edam):
325
302
  typedict = {
326
303
  "bool": {"type": str2bool, "nargs": "?", "const": True},
@@ -532,7 +509,7 @@ from fusesoc.utils import Launcher
532
509
 
533
510
 
534
511
  class Ttptttg:
535
- def __init__(self, ttptttg, core, generators, gen_root, resolve_env_vars=False):
512
+ def __init__(self, ttptttg, core, generators, work_root, resolve_env_vars=False):
536
513
  generator_name = ttptttg["generator"]
537
514
  if not generator_name in generators:
538
515
  raise RuntimeError(
@@ -545,7 +522,7 @@ class Ttptttg:
545
522
  self.name = ttptttg["name"]
546
523
  self.pos = ttptttg["pos"]
547
524
  self.gen_name = generator_name
548
- self.gen_root = gen_root
525
+ self.gen_root = self.core.cache_root if self.is_cacheable() else work_root
549
526
  self.resolve_env_vars = resolve_env_vars
550
527
  parameters = ttptttg["config"]
551
528
 
@@ -590,11 +567,16 @@ class Ttptttg:
590
567
  hash = hashlib.sha256()
591
568
 
592
569
  for f in input_files:
593
- abs_f = os.path.join(self.generator_input["files_root"], f)
594
- try:
595
- hash.update(pathlib.Path(abs_f).read_bytes())
596
- except Exception as e:
597
- raise RuntimeError("Unable to hash file: " + str(e))
570
+ if type(f) == list:
571
+ files = f
572
+ else:
573
+ files = [f]
574
+ for ff in files:
575
+ abs_f = os.path.join(self.generator_input["files_root"], ff)
576
+ try:
577
+ hash.update(pathlib.Path(abs_f).read_bytes())
578
+ except Exception as e:
579
+ raise RuntimeError("Unable to hash file: " + str(e))
598
580
 
599
581
  return hash.hexdigest()
600
582
 
@@ -647,6 +629,9 @@ class Ttptttg:
647
629
  and self.generator["cache_type"] == "generator"
648
630
  )
649
631
 
632
+ def is_cacheable(self):
633
+ return self.is_input_cacheable() or self.is_generator_cacheable()
634
+
650
635
  def generate(self):
651
636
  """Run a parametrized generator
652
637
 
@@ -659,7 +644,7 @@ class Ttptttg:
659
644
  logger.debug("Generator input yaml hash: " + hexdigest)
660
645
 
661
646
  generator_cwd = os.path.join(
662
- self.gen_root or self.core.cache_root,
647
+ self.gen_root,
663
648
  "generator_cache",
664
649
  self.vlnv.sanitized_name + "-" + hexdigest,
665
650
  )
@@ -0,0 +1,23 @@
1
+ import logging
2
+ import os
3
+
4
+ logger = logging.getLogger(__name__)
5
+
6
+
7
+ def flatten_vlnv(vlnv):
8
+ return str(vlnv).lstrip(":").replace(":", "_").replace(".", "_")
9
+
10
+
11
+ class Splitlib:
12
+ def run(self, edam, work_root):
13
+ libdeps = {}
14
+ for k, v in edam["dependencies"].items():
15
+ libdeps[flatten_vlnv(k)] = [flatten_vlnv(x) for x in v]
16
+
17
+ libdeps.update(edam["flow_options"].get("library_dependencies", {}))
18
+
19
+ edam["library_dependencies"] = libdeps
20
+ for f in edam["files"]:
21
+ if not "logical_name" in f:
22
+ f["logical_name"] = flatten_vlnv(f["core"])
23
+ return edam
@@ -159,6 +159,8 @@ class Fusesoc:
159
159
  raise RuntimeError(e.msg)
160
160
  except RuntimeError as e:
161
161
  raise RuntimeError("Setup failed : {}".format(str(e)))
162
+ except DependencyError as e:
163
+ raise RuntimeError("Failed to resolve dependencies. " + e.msg)
162
164
 
163
165
  if os.path.exists(edam_file):
164
166
  old_edam = yaml_fread(edam_file, self.config.resolve_env_vars_early)
@@ -649,7 +649,10 @@ def args_to_config(args, config):
649
649
  if hasattr(args, "resolve_env_vars_early") and args.resolve_env_vars_early:
650
650
  setattr(config, "args_resolve_env_vars_early", args.resolve_env_vars_early)
651
651
 
652
- if hasattr(args, "allow_additional_propertis") and args.allow_additional_properties:
652
+ if (
653
+ hasattr(args, "allow_additional_properties")
654
+ and args.allow_additional_properties
655
+ ):
653
656
  setattr(
654
657
  config, "args_allow_additional_properties", args.allow_additional_properties
655
658
  )