fusesoc 2.3__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.
- {fusesoc-2.3 → fusesoc-2.4.2}/.github/workflows/ci.yml +11 -4
- fusesoc-2.4.2/.github/workflows/lint.yml +11 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/NEWS +42 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/PKG-INFO +19 -11
- {fusesoc-2.3 → fusesoc-2.4.2}/README.md +2 -3
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/conf.py +6 -5
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/index.rst +1 -1
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/ref/capi1.rst +1 -1
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/ref/migrations.rst +1 -1
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/user/build_system/core_files.rst +3 -3
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/user/build_system/dependencies.rst +4 -4
- fusesoc-2.4.2/doc/source/user/build_system/filters.rst +99 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/user/build_system/flow_options.rst +1 -1
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/user/build_system/generators.rst +2 -2
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/user/build_system/index.rst +1 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/user/build_system/tool_options.rst +1 -1
- fusesoc-2.4.2/doc/source/user/cli.rst +56 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/user/introduction.rst +1 -1
- fusesoc-2.4.2/doc/source/user/knowledgebase.rst +119 -0
- fusesoc-2.4.2/doc/source/user/optional_deps.png +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/user/package_manager/index.rst +1 -1
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/capi2/core.py +10 -2
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/capi2/json_schema.py +67 -8
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/config.py +11 -1
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/coremanager.py +57 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/edalizer.py +53 -47
- fusesoc-2.4.2/fusesoc/filters/autotype.py +28 -0
- fusesoc-2.4.2/fusesoc/filters/custom.py +31 -0
- fusesoc-2.4.2/fusesoc/filters/dot.py +24 -0
- fusesoc-2.4.2/fusesoc/filters/splitlib.py +23 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/fusesoc.py +7 -4
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/librarymanager.py +1 -1
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/main.py +38 -10
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/provider/provider.py +6 -0
- fusesoc-2.4.2/fusesoc/provider/svn.py +31 -0
- fusesoc-2.4.2/fusesoc/version.py +16 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc.egg-info/PKG-INFO +19 -11
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc.egg-info/SOURCES.txt +15 -5
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc.egg-info/requires.txt +1 -1
- fusesoc-2.4.2/pyproject.toml +61 -0
- fusesoc-2.4.2/tests/capi2_cores/misc/fileattrs.core +12 -0
- fusesoc-2.4.2/tests/capi2_cores/misc/filters.core +15 -0
- fusesoc-2.4.2/tests/capi2_cores/virtual/top_conflict.core +22 -0
- fusesoc-2.4.2/tests/capi2_cores/virtual/top_impl1.core +21 -0
- fusesoc-2.4.2/tests/capi2_cores/virtual/top_impl2.core +21 -0
- fusesoc-2.4.2/tests/capi2_cores/virtual/top_non_deterministic.core +19 -0
- fusesoc-2.4.2/tests/cores/misc/svn.core +15 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_capi2.py +27 -1
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_config.py +30 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_coremanager.py +99 -4
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_edalizer.py +88 -4
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_provider.py +13 -0
- fusesoc-2.3/.github/workflows/lint.yml +0 -14
- fusesoc-2.3/doc/source/user/cli.rst +0 -36
- fusesoc-2.3/doc/source/user/knowledgebase.rst +0 -28
- fusesoc-2.3/fusesoc/__init__.py +0 -8
- fusesoc-2.3/fusesoc/capi2/__init__.py +0 -3
- fusesoc-2.3/fusesoc/parser/__init__.py +0 -3
- fusesoc-2.3/fusesoc/provider/__init__.py +0 -9
- fusesoc-2.3/fusesoc/version.py +0 -4
- fusesoc-2.3/setup.py +0 -63
- {fusesoc-2.3 → fusesoc-2.4.2}/.editorconfig +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/.flake8 +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/.git-blame-ignore-revs +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/.gitignore +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/.pre-commit-config.yaml +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/.readthedocs.yml +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/LICENSE +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/dev-requirements.txt +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/requirements.txt +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/_static/theme_overrides.css +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/dev/devsetup.rst +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/dev/index.rst +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/ref/glossary.rst +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/ref/index.rst +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/user/build_system/eda_flows.rst +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/user/build_system/flags.rst +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/user/build_system/hooks.rst +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/user/build_system/vpi.rst +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/user/index.rst +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/user/installation.rst +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/doc/source/user/overview.rst +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/extras/bash-completion +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/capi2/coredata.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/capi2/coreparser.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/capi2/exprs.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/capi2/generator.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/capi2/inheritance.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/core.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/parser/coreparser.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/provider/git.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/provider/github.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/provider/local.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/provider/opencores.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/provider/url.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/utils.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc/vlnv.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc.egg-info/dependency_links.txt +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc.egg-info/entry_points.txt +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/fusesoc.egg-info/top_level.txt +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/setup.cfg +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/deptree/child1.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/deptree/child2.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/deptree/child3.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/deptree/child4.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/deptree/generated_child_a.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/deptree/generated_child_a.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/deptree/root.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/files_out_of_hierarchy/bad.sv +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/files_out_of_hierarchy/subdir/files_out_of_hierarchy.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/files_out_of_hierarchy/subdir/good.sv +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/append.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/depends.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/dontpickthisfile +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/dummy.tcl +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/empty.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/f1 +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/f2 +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/f3 +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/f4 +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/files.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/flags.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/flow.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/generate/file_cachetest +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/generate/generate.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/generate/generators.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/generate/testgen.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/hooks.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/parameters.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/scriptfile +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/subdir/dummy.extra +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/syntax_error.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/targets.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/toplevel.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/typecheck.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/uncachable.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/vhdlfile +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/vlogfile +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/vpi.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/misc/vpifile +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/override/1/basic.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/override/2/basic.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/parser/inheritance.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/parser/no_additional_properties.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/parser/with_additional_properties.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/providers/url_simple.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/providers/url_simple_with_user_agent.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/providers/url_tar.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/providers/url_zip.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/virtual/impl1.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/virtual/impl2.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/capi2_cores/virtual/user.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/adv_debug_sys/adv_debug_sys.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/atlys/atlys.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/atlys/data/atlys.ucf +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/atlys/data/dummy_backend_tcl_file.tcl +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/elf-loader/check_libelf.sh +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/elf-loader/elf-loader.c +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/elf-loader/elf-loader.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/elf-loader/vpi_wrapper.c +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/gpio/gpio.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/jtag_tap/jtag_tap-1.13.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/libstorage/libstorage-1.0.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/c3demo.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/c3demo.pcf +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/copytocore/copytocore.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/copytocore/dummy.tcl +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/copytocore/subdir/dummy.extra +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/dummy.tcl +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/dummy.xci +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/filetypes.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/ghdltest.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/gitcore.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/no_exe_script.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/nomain.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/opencorescore.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/paramtest.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/scripts/no_exe_script +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/scripts/post_build_script +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/scripts/post_run_script +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/scripts/pre_build_script +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/scripts/pre_run_script +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/scriptscore.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/misc/subdir/dummy.extra +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/mor1kx/mor1kx-3.1.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/mor1kx-arty/mor1kx-arty.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/mor1kx-arty/mor1kx-arty.system +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/mor1kx-generic/mor1kx-generic.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/mor1kx-generic/scripts/post_run_script +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/mor1kx-generic/scripts/pre_build_script +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/mor1kx-generic/scripts/pre_run_script +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/sockit/sockit.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/uart16550/uart16550-1.5.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/verilator_tb_utils/verilator_tb_utils.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/verilog-arbiter/verilog-arbiter-r1.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/verilog_utils/verilog_utils.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/verilog_utils/verilog_utils.vh +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/vga_lcd/vga_lcd.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/vlog_tb_utils/files/0001-testpatch.patch +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/vlog_tb_utils/vlog_tb_utils-1.1.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/wb_common/wb_common.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/wb_common/wb_common.v +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/wb_common/wb_common_params.v +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/wb_intercon/dummy_icarus.v +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/cores/wb_intercon/wb_intercon-1.0.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_capi2/generators.info +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_capi2/targets.info +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_common.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_exprs.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_ignored_dirs.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_libraries.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_provider/file.tar.gz +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_provider/file.v +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_provider/file.zip +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_provider/vlog_functions.v +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/test_vlnv.py +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/userguide/blinky/blinky.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/userguide/blinky/data/nexys_video.xdc +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/userguide/blinky/rtl/blinky.sv +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/userguide/blinky/rtl/macros.svh +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/userguide/blinky/tb/blinky_tb.sv +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/userguide/dualblinky/data/nexys_video.xdc +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/userguide/dualblinky/dualblinky.core +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tests/userguide/dualblinky/rtl/dualblinky.sv +0 -0
- {fusesoc-2.3 → fusesoc-2.4.2}/tox.ini +0 -0
|
@@ -23,21 +23,28 @@ jobs:
|
|
|
23
23
|
# https://github.com/olofk/fusesoc/issues/528
|
|
24
24
|
#- { icon: 🧊, name: windows-latest }
|
|
25
25
|
pyver:
|
|
26
|
-
- '3.6'
|
|
27
26
|
- '3.7'
|
|
28
27
|
- '3.8'
|
|
29
28
|
- '3.9'
|
|
30
29
|
- '3.10'
|
|
31
|
-
- '3.11
|
|
30
|
+
- '3.11'
|
|
31
|
+
- '3.12'
|
|
32
|
+
exclude:
|
|
33
|
+
#Fails because github can't find an arm64 image for Python 3.7???
|
|
34
|
+
- os: {name: macos-latest}
|
|
35
|
+
pyver: '3.7'
|
|
36
|
+
#Fails because one test expects a different output during an exception
|
|
37
|
+
- os: {name: macos-latest}
|
|
38
|
+
pyver: '3.8'
|
|
32
39
|
runs-on: ${{ matrix.os.name }}
|
|
33
40
|
name: ${{ matrix.os.icon }} ${{ matrix.os.name }} | ${{ matrix.pyver }}
|
|
34
41
|
steps:
|
|
35
42
|
|
|
36
43
|
- name: 🧰 Repository Checkout
|
|
37
|
-
uses: actions/checkout@
|
|
44
|
+
uses: actions/checkout@v4
|
|
38
45
|
|
|
39
46
|
- name: 🐍 Set up Python ${{ matrix.pyver }}
|
|
40
|
-
uses: actions/setup-python@
|
|
47
|
+
uses: actions/setup-python@v5
|
|
41
48
|
with:
|
|
42
49
|
python-version: ${{ matrix.pyver }}
|
|
43
50
|
|
|
@@ -1,3 +1,45 @@
|
|
|
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
|
+
|
|
27
|
+
2.4 2024-10-02 Olof Kindgren <olof.kindgren@gmail.com>
|
|
28
|
+
======================================================
|
|
29
|
+
* Add conflict handling for virtual cores
|
|
30
|
+
* Connect generated cores in EDAM dependency graph
|
|
31
|
+
* Support implicit name in library add command
|
|
32
|
+
* Migrate from setup.py to pyproject.toml
|
|
33
|
+
* Add support for EDAM filter plugins
|
|
34
|
+
|
|
35
|
+
Contributors:
|
|
36
|
+
Alexander Williams <awill@opentitan.org>
|
|
37
|
+
Alfred E Neuman <quinky@gmx.ch>
|
|
38
|
+
Daniel Copley <djcopley@users.noreply.github.com>
|
|
39
|
+
Jelle van der Waa <jelle@vdwaa.nl>
|
|
40
|
+
Olof Kindgren <olof.kindgren@gmail.com>
|
|
41
|
+
Phillipe Jean-Jumeau <pljeanjumeau@gmail.com>
|
|
42
|
+
|
|
1
43
|
2.3 2023-11-17 Olof Kindgren <olof.kindgren@gmail.com>
|
|
2
44
|
======================================================
|
|
3
45
|
* Add CLI to read/write config settings
|
|
@@ -1,25 +1,33 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fusesoc
|
|
3
|
-
Version: 2.
|
|
4
|
-
Summary:
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
Version: 2.4.2
|
|
4
|
+
Summary: Award-winnning package manager and build abstraction tool for HDL code
|
|
5
|
+
Author-email: Olof Kindgren <olof@award-winning.me>
|
|
6
|
+
Maintainer-email: Olof Kindgren <olof@award-winning.me>
|
|
7
|
+
Project-URL: Homepage, https://fusesoc.net
|
|
8
|
+
Project-URL: Documentation, https://fusesoc.readthedocs.io
|
|
9
|
+
Project-URL: Repository, https://github.com/olofk/fusesoc
|
|
10
|
+
Project-URL: Issues, https://github.com/olofk/fusesoc/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/olofk/fusesoc/blob/main/NEWS
|
|
12
|
+
Keywords: VHDL,verilog,hdl,rtl,synthesis,FPGA,simulation,ASIC
|
|
10
13
|
Classifier: Development Status :: 5 - Production/Stable
|
|
11
14
|
Classifier: Topic :: Utilities
|
|
12
15
|
Classifier: Topic :: Software Development :: Build Tools
|
|
13
16
|
Classifier: License :: OSI Approved :: BSD License
|
|
14
|
-
Requires-Python:
|
|
17
|
+
Requires-Python: <4,>=3.6
|
|
15
18
|
Description-Content-Type: text/markdown
|
|
16
19
|
License-File: LICENSE
|
|
20
|
+
Requires-Dist: edalize>=0.4.1
|
|
21
|
+
Requires-Dist: pyparsing>=2.3.1
|
|
22
|
+
Requires-Dist: pyyaml>=6.0
|
|
23
|
+
Requires-Dist: simplesat>=0.9.1
|
|
24
|
+
Requires-Dist: fastjsonschema
|
|
25
|
+
Requires-Dist: jsonschema2md
|
|
17
26
|
|
|
18
27
|
# FuseSoC
|
|
19
28
|
|
|
20
29
|
[](https://github.com/olofk/fusesoc/actions?query=workflow%3ACI)
|
|
21
30
|
[](https://pypi.org/project/fusesoc/)
|
|
22
|
-
[](https://www.librecores.org/olofk/FuseSoC)
|
|
23
31
|
|
|
24
32
|
## Introduction
|
|
25
33
|
|
|
@@ -53,7 +61,7 @@ full list of system requirements and installation instructions in the
|
|
|
53
61
|
### Quick start
|
|
54
62
|
|
|
55
63
|
To check if FuseSoC is working, and to get an initial feeling for how FuseSoC
|
|
56
|
-
works, you can try to simulate a simple hardware design from our core
|
|
64
|
+
works, you can try to simulate a simple hardware design from our core library.
|
|
57
65
|
|
|
58
66
|
First, create and enter an empty workspace
|
|
59
67
|
|
|
@@ -79,7 +87,7 @@ add e.g. `--tool=modelsim` or `--tool=xcelium` between `run` and `i2c`.
|
|
|
79
87
|
Did it work? Great! FuseSoC can be used to create FPGA images, perform
|
|
80
88
|
linting, manage your IP libraries or do formal verification as well.
|
|
81
89
|
Check out the [online documentation](https://fusesoc.readthedocs.io/en/stable/)
|
|
82
|
-
|
|
90
|
+
to learn more about creating your own core files and using
|
|
83
91
|
existing ones. If it didn't work, please get in touch (see below).
|
|
84
92
|
|
|
85
93
|
## Next steps
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/olofk/fusesoc/actions?query=workflow%3ACI)
|
|
4
4
|
[](https://pypi.org/project/fusesoc/)
|
|
5
|
-
[](https://www.librecores.org/olofk/FuseSoC)
|
|
6
5
|
|
|
7
6
|
## Introduction
|
|
8
7
|
|
|
@@ -36,7 +35,7 @@ full list of system requirements and installation instructions in the
|
|
|
36
35
|
### Quick start
|
|
37
36
|
|
|
38
37
|
To check if FuseSoC is working, and to get an initial feeling for how FuseSoC
|
|
39
|
-
works, you can try to simulate a simple hardware design from our core
|
|
38
|
+
works, you can try to simulate a simple hardware design from our core library.
|
|
40
39
|
|
|
41
40
|
First, create and enter an empty workspace
|
|
42
41
|
|
|
@@ -62,7 +61,7 @@ add e.g. `--tool=modelsim` or `--tool=xcelium` between `run` and `i2c`.
|
|
|
62
61
|
Did it work? Great! FuseSoC can be used to create FPGA images, perform
|
|
63
62
|
linting, manage your IP libraries or do formal verification as well.
|
|
64
63
|
Check out the [online documentation](https://fusesoc.readthedocs.io/en/stable/)
|
|
65
|
-
|
|
64
|
+
to learn more about creating your own core files and using
|
|
66
65
|
existing ones. If it didn't work, please get in touch (see below).
|
|
67
66
|
|
|
68
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,11 +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
|
-
release = fusesoc
|
|
40
|
+
release: str = get_version("fusesoc")
|
|
41
|
+
|
|
40
42
|
# The short X.Y version.
|
|
41
|
-
|
|
42
|
-
version = f"{v_major}.{v_minor}"
|
|
43
|
+
version: str = ".".join(release.split(".")[:2])
|
|
43
44
|
|
|
44
45
|
# -- General configuration ---------------------------------------------------
|
|
45
46
|
|
|
@@ -62,7 +63,7 @@ extensions = [
|
|
|
62
63
|
"myst_parser",
|
|
63
64
|
]
|
|
64
65
|
|
|
65
|
-
intersphinx_mapping = {"https://docs.python.org/3"
|
|
66
|
+
intersphinx_mapping = {"python": ("https://docs.python.org/3", None)}
|
|
66
67
|
|
|
67
68
|
|
|
68
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
|
|
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.
|
|
@@ -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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
.. _ug_build_system_filters:
|
|
2
|
+
|
|
3
|
+
Filters: Make system-wide modifications to the EDAM structure
|
|
4
|
+
=============================================================
|
|
5
|
+
|
|
6
|
+
The last thing FuseSoC does before handing over to Edalize, is to prepare an EDAM file containing a description of the complete system and everything that the EDA tools need to know. It is sometimes useful to make system-wide changes after the system is assembled, and this is where filters come in. Filters are additional tasks that can be run to analyze and modify the EDAM structure, and through that structure the filters have access to the complete dependency tree and all source files.
|
|
7
|
+
|
|
8
|
+
FuseSoC ships with a few built-in filters for generally useful tasks:
|
|
9
|
+
|
|
10
|
+
* autotype: Sets file types according to the file name prefix for files that don't have an explicit file type set.
|
|
11
|
+
* custom: Runs the command specified with the environment variable `FUSESOC_CUSTOM_FILTER`. Two arguments are passed to the command. The first specifies the EDAM (yaml) file the custom command is supposed to read. The second specifies the name of the file that the filter should use to return the modified EDAM struct.
|
|
12
|
+
* dot: Creates a GraphViz dot file of the dependency tree
|
|
13
|
+
|
|
14
|
+
All filters are run from the work root directory.
|
|
15
|
+
|
|
16
|
+
.. note::
|
|
17
|
+
Technically, an Edalize frontend can perform the exact same task as a FuseSoC EDAM filter. The difference is more philosophical in that a filter can be seen as something that fixes up the system before it is ready to be consumed by an EDA tool, while an Edalize frontend typically *is* an EDA tool. The filters will also possibly have access to more FuseSoC internals in the future.
|
|
18
|
+
|
|
19
|
+
Using filters
|
|
20
|
+
-------------
|
|
21
|
+
|
|
22
|
+
There are three way to enable which filters to be applied. These three options have various use-cases.
|
|
23
|
+
|
|
24
|
+
Filters in targets
|
|
25
|
+
~~~~~~~~~~~~~~~~~~
|
|
26
|
+
|
|
27
|
+
Filters specified in a target section of a core are typically required for the the build to work. In order to enable a filter for a target, add a list of filters using the `filters` key.
|
|
28
|
+
|
|
29
|
+
.. code-block:: yaml
|
|
30
|
+
|
|
31
|
+
# An excerpt from a core file.
|
|
32
|
+
targets:
|
|
33
|
+
sim:
|
|
34
|
+
# ...
|
|
35
|
+
filters: [autotype, dot] # Apply the autotype and dot filters in that order
|
|
36
|
+
|
|
37
|
+
Filters in the configuration file
|
|
38
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
39
|
+
|
|
40
|
+
Filters can be set in the configuration file as a list of space-separated strings in the `main` section. These can be set with the fusesoc config cli, e.g. `fusesoc config filters "filter1 filter2"`. Filters set in the config file are typically used when all targets of the cores in the workspace need some filter to be applied, or just as a convenienence for users who like to have som particular filter always enabled. These filters are applied after the ones from the core file targets.
|
|
41
|
+
|
|
42
|
+
Filters on the command-line
|
|
43
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
44
|
+
|
|
45
|
+
It is also possible to set filters on the command-line. This is typically used for one-off filters, e.g. to generate some debug info. They are enabled with the `--filter` parameters, e.g. `fusesoc run --filter=dot --target=sim ...`. The `--filter` parameter can be specified multiple times to add more filters. Filters on the command-line are applied after the ones from the configuration file.
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
Creating additional filters
|
|
49
|
+
---------------------------
|
|
50
|
+
|
|
51
|
+
A filter is a Python module that contains a class with the same name as the module, but capitalized. The class needs to implement a function called `run` which takes the EDAM struct as the first argumen and the work root as the second argument. The function needs to return the new EDAM struct even if it is unmodified.
|
|
52
|
+
|
|
53
|
+
Filter template::
|
|
54
|
+
|
|
55
|
+
import logging
|
|
56
|
+
import os
|
|
57
|
+
|
|
58
|
+
logger = logging.getLogger(__name__)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class Customfilter:
|
|
62
|
+
def run(self, edam, work_root):
|
|
63
|
+
# Print file sizes of all verilog files in the system
|
|
64
|
+
for f in edam["files"]:
|
|
65
|
+
if f["file_type"].startswith("verilogSource"):
|
|
66
|
+
size = os.path.getsize(os.path.join(work_root, f["name"]))
|
|
67
|
+
print(f"{f['name']} is {size} bytes")
|
|
68
|
+
|
|
69
|
+
# Add an additional parameter
|
|
70
|
+
edam["parameters"]["my_number"] = {"datatype" : "int",
|
|
71
|
+
"paramtype": "vlogdefine",
|
|
72
|
+
"default" : 5446}
|
|
73
|
+
|
|
74
|
+
# Change the system name
|
|
75
|
+
edam["name"] = "bestsystemever"
|
|
76
|
+
|
|
77
|
+
# Return modified EDAM struct
|
|
78
|
+
return edam
|
|
79
|
+
|
|
80
|
+
FuseSoC implements support for implicit namespace packages (https://peps.python.org/pep-0420/) This means that subclasses that logically belong to FuseSoC can be distributed over several physical locations and is something we can take advantage of to add new filters outside of the FuseSoC code base.
|
|
81
|
+
|
|
82
|
+
In order to do that we will create a directory structure that mirrors the structure of FuseSoC like the example below::
|
|
83
|
+
|
|
84
|
+
externalplugin/
|
|
85
|
+
fusesoc/
|
|
86
|
+
filters/
|
|
87
|
+
customfilter.py
|
|
88
|
+
anothercustomfilter.py
|
|
89
|
+
|
|
90
|
+
There are two common options for making the above `customfilter.py` and `anothercustomfilter.py` available to FuseSoC.
|
|
91
|
+
|
|
92
|
+
The first way is to add the `externalplugin` path to ``PYTHONPATH``. The other is to add a `setup.py` in the `externalplugin` directory and install the filter plugin with pip as with other Python packages.
|
|
93
|
+
|
|
94
|
+
A `setup.py` in its absolutely most minimal form is listed below and is enough to install the plugin as a package in development mode using ``pip install --user -e .`` from the `externalplugin` directory.::
|
|
95
|
+
|
|
96
|
+
from setuptools import setup
|
|
97
|
+
setup()
|
|
98
|
+
|
|
99
|
+
A real `setup.py` like the one used by FuseSoC normally contains a lot more information.
|
|
@@ -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
|
|
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
|
|
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 `
|
|
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
|
-
*
|
|
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
|
|
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
|
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
*****************************
|
|
2
|
+
Common Problems and Solutions
|
|
3
|
+
*****************************
|
|
4
|
+
|
|
5
|
+
Making changes to cores in a library
|
|
6
|
+
====================================
|
|
7
|
+
|
|
8
|
+
A common situation is that a user wants to use their own copy of a core,
|
|
9
|
+
instead of the one provided by a library, for example to fix a bug or
|
|
10
|
+
add new functionality. The following steps can be used to achieve this:
|
|
11
|
+
|
|
12
|
+
**Example.** Replace a core in a library with a user-specified version
|
|
13
|
+
|
|
14
|
+
#. Create a new directory to keep the user-copies of the cores (this
|
|
15
|
+
directory will be referred to as ``$corelib`` from now on)
|
|
16
|
+
#. Download the core source (the repository or URL can be found in the
|
|
17
|
+
``[provider]`` section of the original core)
|
|
18
|
+
#. *If the downloaded core already contains a .core file, this step is
|
|
19
|
+
ignored* Copy the original .core file to the root of the downloaded
|
|
20
|
+
core. Edit the file and remove the ``[provider]`` section. (This will
|
|
21
|
+
stop FuseSoC from downloading the core and use files from the
|
|
22
|
+
directory containing the .core file instead)
|
|
23
|
+
#. Add ``$corelib`` to the end of your library search path, either by
|
|
24
|
+
editing ``fusesoc.conf`` or by adding ``--cores-root=$corelib`` to
|
|
25
|
+
the command-line arguments
|
|
26
|
+
#. Verify that the new core is found by running fusesoc core-info $core. Check
|
|
27
|
+
the output to see that “Core root:” is set to the directory where the core
|
|
28
|
+
was downloaded
|
|
29
|
+
|
|
30
|
+
Dependency tree for a core with optional components
|
|
31
|
+
===================================================
|
|
32
|
+
|
|
33
|
+
Many cores have a part that is only used in some flows. This could for example be a BFM, VIP or some kind of behavioral model that is only used in simulation flows. Or it could be timing constraints for synthesis. As long as these are only by the core itself, it's easiest to put them into different filesets and let each simulation or synthesis target pick the right subset of filesets.
|
|
34
|
+
|
|
35
|
+
A more complicated situation arises when a user uses this core as a dependency and wants to have different filesets for different flows in the toplevel core. In this case, it is typically better to split out the optional part into its own cores and have the toplevel filesets depend on the different cores.
|
|
36
|
+
|
|
37
|
+
**Example** Let's assume a core (comp) comes with a BFM. We want to use the BFM when doing block-level simulations of the core and when doing full system simulations which uses this core. We don't want to have the BFM present when doing full system synthesis. The most general solution is to split out the BFM to a separate core file. The following example shows a setup with a component (comp.core) that has a BFM (comp_bfm.core) which is used inside a larger system (top.core). The component has a testbench target (sim) and the larger system has two testbenches (tb1 and tb2) which both uses the BFM and the component. The larger system can also be synthesized without the BFM.
|
|
38
|
+
|
|
39
|
+
.. image:: optional_deps.png
|
|
40
|
+
:alt: Alternative text
|
|
41
|
+
|
|
42
|
+
.. code-block:: yaml
|
|
43
|
+
:caption: comp_bfm.core
|
|
44
|
+
|
|
45
|
+
CAPI=2:
|
|
46
|
+
|
|
47
|
+
name : ::comp_bfm:0
|
|
48
|
+
|
|
49
|
+
filesets:
|
|
50
|
+
bfm:
|
|
51
|
+
files: {comp_bfm.sv : {file_type : systemVerilogSource}}
|
|
52
|
+
|
|
53
|
+
targets:
|
|
54
|
+
default:
|
|
55
|
+
filesets : [bfm]
|
|
56
|
+
|
|
57
|
+
.. code-block:: yaml
|
|
58
|
+
:caption: comp.core
|
|
59
|
+
|
|
60
|
+
CAPI=2:
|
|
61
|
+
|
|
62
|
+
name : ::comp:0
|
|
63
|
+
|
|
64
|
+
filesets:
|
|
65
|
+
rtl:
|
|
66
|
+
files: {comp.sv : {file_type : systemVerilogSource}}
|
|
67
|
+
|
|
68
|
+
tb_files:
|
|
69
|
+
files: {comp_tb.sv : {file_type : systemVerilogSource}}
|
|
70
|
+
depend: [comp_bfm]
|
|
71
|
+
|
|
72
|
+
targets:
|
|
73
|
+
default:
|
|
74
|
+
filesets : [rtl]
|
|
75
|
+
|
|
76
|
+
sim:
|
|
77
|
+
filesets : [rtl, tb_files]
|
|
78
|
+
|
|
79
|
+
.. code-block:: yaml
|
|
80
|
+
:caption: top.core
|
|
81
|
+
|
|
82
|
+
CAPI=2:
|
|
83
|
+
|
|
84
|
+
name : ::top:0
|
|
85
|
+
|
|
86
|
+
filesets:
|
|
87
|
+
rtl:
|
|
88
|
+
files: {top.sv : {file_type : systemVerilogSource}}
|
|
89
|
+
depend: [comp]
|
|
90
|
+
|
|
91
|
+
tb_common:
|
|
92
|
+
files: {tb_common.sv : {file_type : systemVerilogSource}}
|
|
93
|
+
depend: [comp_bfm]
|
|
94
|
+
|
|
95
|
+
tb1_files:
|
|
96
|
+
files: {tb1.sv : {file_type : systemVerilogSource}}
|
|
97
|
+
|
|
98
|
+
tb2_files:
|
|
99
|
+
files: {tb1.sv : {file_type : systemVerilogSource}}
|
|
100
|
+
|
|
101
|
+
synth_files:
|
|
102
|
+
files: {constraints.sdc : {file_type : SDC}}
|
|
103
|
+
|
|
104
|
+
targets:
|
|
105
|
+
sim: &sim
|
|
106
|
+
filesets : [rtl, tb_files]
|
|
107
|
+
|
|
108
|
+
tb1:
|
|
109
|
+
<<: *sim
|
|
110
|
+
filesets_append : [tb1_files]
|
|
111
|
+
|
|
112
|
+
tb2:
|
|
113
|
+
<<: *sim
|
|
114
|
+
filesets_append : [tb2_files]
|
|
115
|
+
|
|
116
|
+
synth:
|
|
117
|
+
filesets : [rtl, synth_files]
|
|
118
|
+
|
|
119
|
+
An alternative solution to the above, is to use flags, as described in :ref:`ug_build_system_flags`, where the inclusion of the optional files are controlled by flags. These flags can be assigned default values in the top level targets for convenience.
|
|
Binary file
|
|
@@ -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
|
|
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.
|