diff --git a/.github/verible.waiver b/.github/verible.waiver new file mode 100644 index 00000000..04db6b03 --- /dev/null +++ b/.github/verible.waiver @@ -0,0 +1,11 @@ +# Copyright 2022 ETH Zurich and University of Bologna. +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 + +# Auto-generated configuration registers are waived +waive --rule=typedef-structs-unions --location="hw/regs/*" +waive --rule=line-length --location="hw/regs/*" +waive --rule=no-trailing-spaces --location="hw/regs/*" +waive --rule=parameter-name-style --location="hw/regs/*" +# Package contains long lines +waive --rule=line-length --location="hw/cheshire_pkg.sv" diff --git a/.github/workflows/gitlab-ci.yml b/.github/workflows/gitlab-ci.yml new file mode 100644 index 00000000..45b3e4a1 --- /dev/null +++ b/.github/workflows/gitlab-ci.yml @@ -0,0 +1,27 @@ +# Copyright 2022 ETH Zurich and University of Bologna. +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 + +# Author: Paul Scheffler + +name: gitlab-ci + +on: [ push, pull_request, workflow_dispatch ] + +jobs: + + check: + runs-on: ubuntu-latest + steps: + - + name: Mirror and check + uses: pulp-platform/pulp-actions/gitlab-ci@v2 + # Skip on forks or pull requests from forks due to missing secrets. + if: > + github.repository == 'pulp-platform/pulp_cluster' && + (github.event_name != 'pull_request' || + github.event.pull_request.head.repo.full_name == github.repository) + with: + domain: iis-git.ee.ethz.ch + repo: github-mirror/pulp_cluster + token: ${{ secrets.GITLAB_TOKEN }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..749c589f --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,45 @@ +# Copyright 2022 ETH Zurich and University of Bologna. +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 + +# Author: Paul Scheffler + +name: lint + +on: [ push, pull_request, workflow_dispatch ] + +jobs: + +# lint-license: +# runs-on: ubuntu-latest +# steps: +# - +# name: Checkout +# uses: actions/checkout@v3 +# - +# name: Check license +# uses: pulp-platform/pulp-actions/lint-license@v2 +# with: +# license: | +# Copyright (\d{4}(-\d{4})?\s)?(ETH Zurich and University of Bologna|lowRISC contributors). +# (Solderpad Hardware License, Version 0.51|Licensed under the Apache License, Version 2.0), see LICENSE for details. +# SPDX-License-Identifier: (SHL-0.51|Apache-2.0) +# # Exclude generated headers (no license checker support for optional lines) +# exclude_paths: | +# sw/include/regs/*.h + + lint-sv: + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v3 + - + name: Run Verible + uses: chipsalliance/verible-linter-action@main + with: + paths: hw + extra_args: "--waiver_files .github/verible.waiver" + github_token: ${{ secrets.GITHUB_TOKEN }} + fail_on_error: true + reviewdog_reporter: github-check diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000..32c1cb3c --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,25 @@ +# Copyright 2022 ETH Zurich and University of Bologna. +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 +# +# Paul Scheffler + +# We initialize the nonfree repo, then spawn a sub-pipeline from it + +stages: + - nonfree + +init: + stage: nonfree + script: make nonfree-init + artifacts: + paths: [ nonfree/ci.yml ] + +subpipe: + stage: nonfree + needs: [ init ] + trigger: + include: + - artifact: nonfree/ci.yml + job: init + strategy: depend diff --git a/Bender.lock b/Bender.lock new file mode 100644 index 00000000..e57c13b1 --- /dev/null +++ b/Bender.lock @@ -0,0 +1,194 @@ +packages: + axi: + revision: fd60be8b51a4fa7476856be162ce3334474592ba + version: 0.39.0-beta.4 + source: + Git: https://github.com/pulp-platform/axi.git + dependencies: + - common_cells + - common_verification + - tech_cells_generic + axi2mem: + revision: 6973e0434d26ba578cdb4aa69c26c1facd1a3f15 + version: null + source: + Git: https://github.com/pulp-platform/axi2mem.git + dependencies: + - axi_slice + - common_cells + axi2per: + revision: a99ef2fac9f3b087671109a27c766f25e8e0f115 + version: 1.0.1 + source: + Git: https://github.com/pulp-platform/axi2per.git + dependencies: + - axi_slice + axi_slice: + revision: a4f72bc21ac4d7da631e8309d9f8d0c34b735c23 + version: 1.1.4 + source: + Git: https://github.com/pulp-platform/axi_slice.git + dependencies: + - common_cells + cluster_interconnect: + revision: 7d0a4f8acae71a583a6713cab5554e60b9bb8d27 + version: 1.2.1 + source: + Git: https://github.com/pulp-platform/cluster_interconnect.git + dependencies: + - common_cells + cluster_peripherals: + revision: d388a790d9e1129e3ec57b2e0075ee21e454c3b1 + version: 2.1.0 + source: + Git: https://github.com/pulp-platform/cluster_peripherals.git + dependencies: + - hci + common_cells: + revision: 4ac82b420e46fd0005513ca2283cb3c905e7599a + version: 1.29.0 + source: + Git: https://github.com/pulp-platform/common_cells.git + dependencies: + - common_verification + - tech_cells_generic + common_verification: + revision: 9c07fa860593b2caabd9b5681740c25fac04b878 + version: 0.2.3 + source: + Git: https://github.com/pulp-platform/common_verification.git + dependencies: [] + cv32e40p: + revision: 8d58109ab61e1fb6c9dcbafefb8f3a56ee596427 + version: null + source: + Git: https://github.com/pulp-platform/cv32e40p.git + dependencies: + - fpnew + - tech_cells_generic + event_unit_flex: + revision: 53fb3a1093aaaedfe883739fd8a3155d601210bc + version: null + source: + Git: https://github.com/pulp-platform/event_unit_flex.git + dependencies: + - common_cells + fpnew: + revision: 8dc44406b1ccbc4487121710c1883e805f893965 + version: 0.6.6 + source: + Git: https://github.com/pulp-platform/fpnew.git + dependencies: + - common_cells + - fpu_div_sqrt_mvp + fpu_div_sqrt_mvp: + revision: 86e1f558b3c95e91577c41b2fc452c86b04e85ac + version: 1.0.4 + source: + Git: https://github.com/pulp-platform/fpu_div_sqrt_mvp.git + dependencies: + - common_cells + fpu_interco: + revision: 66b4084117546d5b748c30b5500769805f489d2f + version: null + source: + Git: https://github.com/pulp-platform/fpu_interco.git + dependencies: + - cv32e40p + - fpnew + hci: + revision: 8fb848e8f6722c1c21b44533535f430960c31b0b + version: 1.0.8 + source: + Git: https://github.com/pulp-platform/hci.git + dependencies: + - cluster_interconnect + - hwpe-stream + - l2_tcdm_hybrid_interco + hier-icache: + revision: fc231dfc9559c6715c3577049eae3d1887282cb0 + version: null + source: + Git: https://github.com/pulp-platform/hier-icache.git + dependencies: + - axi + - axi_slice + - common_cells + - icache-intc + - scm + - tech_cells_generic + hwpe-ctrl: + revision: 4bf1487a463c262bf7d8ffee79d1cf392937daa2 + version: 1.7.1 + source: + Git: https://github.com/pulp-platform/hwpe-ctrl.git + dependencies: + - tech_cells_generic + hwpe-datamover-example: + revision: 47e7fe8a38331b123d763ecab11be4058d425021 + version: 1.0.1 + source: + Git: https://github.com/pulp-platform/hwpe-datamover-example.git + dependencies: + - hci + - hwpe-ctrl + - hwpe-stream + hwpe-stream: + revision: ddc154424187dff42a8fcec946c768ceb13f13de + version: 1.6.4 + source: + Git: https://github.com/pulp-platform/hwpe-stream.git + dependencies: + - tech_cells_generic + ibex: + revision: 95b85ddd1c995ace9f89ee42530f9e24820c1051 + version: null + source: + Git: https://github.com/lowRISC/ibex.git + dependencies: + - tech_cells_generic + icache-intc: + revision: 663c3b6d3c2bf63ff25cda46f33c799c647b3985 + version: 1.0.1 + source: + Git: https://github.com/pulp-platform/icache-intc.git + dependencies: [] + l2_tcdm_hybrid_interco: + revision: fa55e72859dcfb117a2788a77352193bef94ff2b + version: 1.0.0 + source: + Git: https://github.com/pulp-platform/L2_tcdm_hybrid_interco.git + dependencies: [] + mchan: + revision: a9c71f2d9845a4ca05cf2c6ad089b4753f76fc2e + version: 1.2.3 + source: + Git: https://github.com/pulp-platform/mchan.git + dependencies: + - common_cells + per2axi: + revision: 892fcad60b6374fe558cbde76f4a529d473ba5ca + version: 1.0.4 + source: + Git: https://github.com/pulp-platform/per2axi.git + dependencies: + - axi_slice + scm: + revision: 998466d2a3c2d7d572e43d2666d93c4f767d8d60 + version: 1.1.1 + source: + Git: https://github.com/pulp-platform/scm.git + dependencies: [] + tech_cells_generic: + revision: a9cae21902e75b1434328ecf36f85327ba5717de + version: 0.2.11 + source: + Git: https://github.com/pulp-platform/tech_cells_generic.git + dependencies: + - common_verification + timer_unit: + revision: 3f4ee3e5b3875a473242de5d0c3ebb5a0fe4b8db + version: 1.0.2 + source: + Git: https://github.com/pulp-platform/timer_unit.git + dependencies: [] diff --git a/Bender.yml b/Bender.yml index 09d7c7c0..03df5197 100644 --- a/Bender.yml +++ b/Bender.yml @@ -1,3 +1,7 @@ +# Copyright 2023 ETH Zurich and University of Bologna +# Solderpad Hardware License, Version 0.51, see LICENSE for details. +# SPDX-License-Identifier: SHL-0.51 + package: name: pulp_cluster authors: diff --git a/Makefile b/Makefile index bed64782..e74ca6e9 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,9 @@ +# Copyright 2023 ETH Zurich and University of Bologna +# Solderpad Hardware License, Version 0.51, see LICENSE for details. +# SPDX-License-Identifier: SHL-0.51 + +ROOT_DIR = $(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))) + GIT ?= git BENDER ?= bender VSIM ?= vsim @@ -5,14 +11,7 @@ top_level ?= pulp_cluster_tb dpi-library ?= work-dpi library ?= work elf-bin ?= stimuli.riscv - -ifndef QUESTASIM_HOME -$(error QUESTASIM_HOME not set - set the path to the QUESTASIM home folder) -endif - -ifndef RISCV -$(error RISCV not set - please point RISC-V to your RISC-V installation, containing riscv-fesvr, needed by the testbench) -endif +bwruntest = $(ROOT_DIR)/pulp-runtime/scripts/bwruntests.py CFLAGS ?= -I$(QUESTASIM_HOME)/include \ -I$(RISCV)/include/ \ @@ -29,17 +28,58 @@ define generate_vsim echo >> $1 endef +###################### +# Nonfree components # +###################### + +NONFREE_REMOTE ?= git@iis-git.ee.ethz.ch:pulp-restricted/pulp-cluster-nonfree.git +NONFREE_COMMIT ?= e327fb9f8cb4a583d219862e81245405f22283bb + +nonfree-init: + git clone $(NONFREE_REMOTE) nonfree + cd nonfree && git checkout $(NONFREE_COMMIT) + +################ +# Dependencies # +################ + +.PHONY: checkout +## Checkout/update dependencies using Bender +checkout: + bender checkout + touch Bender.lock + make scripts/compile.tcl + +Bender.lock: + bender checkout + touch Bender.lock + +###### +# SW # +###### + +## Clone pulp-runtime as SW stack +pulp-runtime: + git clone https://github.com/pulp-platform/pulp-runtime.git -b lv/pulp_cluster $@ + +## Clone regression tests for bare-metal verification +regression-tests: + git clone https://github.com/pulp-platform/regression_tests $@ + +######################## +# Build and simulation # +######################## + sim_clean: rm -rf scripts/compile.tcl rm -rf work -scripts/compile.tcl: Bender.yml +scripts/compile.tcl: | Bender.lock $(call generate_vsim, $@, -t rtl -t test -t cluster_standalone,..) # compile the elfloader.cpp $(dpi-library)/%.o: tb/dpi/%.cc $(dpi_hdr) mkdir -p $(dpi-library) - #echo hello $(CXX) -shared -fPIC -std=c++0x -Bsymbolic $(CFLAGS) -c $< -o $@ $(dpi-library)/cl_dpi.so: $(dpi) @@ -48,7 +88,9 @@ $(dpi-library)/cl_dpi.so: $(dpi) $(library): vlib${questa_version} $(library) -compile: $(library) $(dpi) +compile: $(library) $(dpi) $(dpi-library)/cl_dpi.so + @test -f Bender.lock || { echo "ERROR: Bender.lock file does not exist. Did you run make checkout in bender mode?"; exit 1; } + @test -f scripts/compile.tcl || { echo "ERROR: scripts/compile.tcl file does not exist. Did you run make scripts in bender mode?"; exit 1; } vsim -c -do 'source scripts/compile.tcl; quit' build: compile $(dpi) @@ -59,3 +101,20 @@ run: vsim +permissive $(questa-flags) $(questa-cmd) -suppress 3053 -suppress 8885 -lib $(library) +MAX_CYCLES=$(max_cycles) +UVM_TESTNAME=$(test_case) +APP=$(elf-bin) +notimingchecks +nospecify -t 1ps \ $(uvm-flags) $(QUESTASIM_FLAGS) -sv_lib $(dpi-library)/cl_dpi \ ${top_level}_optimized +permissive-off ++$(elf-bin) ++$(target-options) ++$(cl-bin) | tee sim.log + +.PHONY: test-rt-par-bare +## Run only parallel tests on pulp-runtime +test-rt-par-bare: pulp-runtime regression-tests + source env/env.sh; \ + cd regression-tests && $(bwruntest) --proc-verbose -v \ + -t 3600 --yaml --max-procs 2 \ + -o runtime-parallel.xml parallel-bare-tests.yaml + + +.PHONY: test-rt-mchan +## Run mchan tests on pulp-runtime +test-rt-mchan: pulp-runtime regression-tests + source env/env.sh; \ + cd regression-tests && $(bwruntest) --proc-verbose -v \ + -t 3600 --yaml --max-procs 2 \ + -o runtime-mchan.xml pulp_cluster-mchan-tests.yaml diff --git a/README.md b/README.md index 47a7ef6a..e124128e 100644 --- a/README.md +++ b/README.md @@ -2,30 +2,58 @@ ![pulp_cluster schematic](doc/PULP_CLUSTER.png) -The `pulp_cluster` repository contains the structure of the cluster subsystem used in PULP chips. -For more details on the internal architecture, see the README.md in the -[`pulp` repository](https://github.com/pulp-platform/pulp). +The `pulp_cluster` repository contains the structure of the cluster subsystem +used in PULP chips. For more details on the internal architecture, see the +README.md in the [`pulp` repository](https://github.com/pulp-platform/pulp). -The [`doc`](doc/) folder contains the draw.io schematic shown above, as well as the raw source to allow for updates, outlining the most important components in pulp_cluster, as well as the communication interfaces connecting these. While not a complete overview of all signals, this is meant as a slightly more detailed overview that can assist in development. Please be aware that the schematic may not be 100% accurate. +The [`doc`](doc/) folder contains the draw.io schematic shown above, as well as +the raw source to allow for updates, outlining the most important components in +pulp_cluster, as well as the communication interfaces connecting these. While +not a complete overview of all signals, this is meant as a slightly more +detailed overview that can assist in development. Please be aware that the +schematic may not be 100% accurate. ## Simulation -It is possible to run benchmarks on the cluster, either within [PULP](https://github.com/pulp-platform/pulp) or as a separate IP. For simulation within PULP, you can directly go to the PULP repo and follow the README. +It is possible to run benchmarks on the cluster, either within +[PULP](https://github.com/pulp-platform/pulp) or as a separate IP. For +simulation within PULP, you can directly go to the PULP repo and follow the +README. To simulate the cluster on its own, you can perform the following steps: -1. Compile the hw: - ``` - bender update - make scripts/compile.tcl - make build - ``` - -2. Compile the sw: - a. clone the `pulp-runtime` with `git clone https://github.com/pulp-platform/pulp-runtime -b lv/pulp_cluster` - b. export the path to Questasim's work directory with `source scripts/vsim.sh` - c. choose `pulp_cluster` as target for the `pulp-runtime` with `source configs/pulp_cluster.sh` - -3. Run the tests: - a. clone the `regression_tests` with `git clone https://github.com/pulp-platform/regression_tests` - b. choose any test among the `parallel_bare_tests` and the `mchan_tests`, move into the related folder and do `make clena all run` +1. Make sure the PULP RV32 toolchain is in your `PATH`. Please refer to [PULP + RISCV GCC toolchain](https://github.com/pulp-platform/pulp-riscv-gcc) to use + a pre-built release. + +2. We need RV64 toolchain to compile DPI libraries. Export it to a `RISCV` env + variable. Please refer to [RISC-V GNU + toolchain](https://github.com/riscv-collab/riscv-gnu-toolchain/) to use a + pre-built release. + +3. Compile the hw: + ``` + make checkout + make scripts/compile.tcl + make build + ``` + +4. Source the environment: + ``` + source env/env.sh + ``` + +5. Download the sw stack and bare-metal tests: + ``` + make pulp-runtime + make regression-tests + ``` + +6. Run the tests. Choose any test among the `parallel_bare_tests` and the + `mchan_tests`, move into the related folder and do: + + ``` + make clean all run + ``` + + To use the GUI, add `gui=1` to the previous command. diff --git a/env/env.sh b/env/env.sh new file mode 100644 index 00000000..c53e25b0 --- /dev/null +++ b/env/env.sh @@ -0,0 +1,8 @@ +# Copyright 2023 ETH Zurich and University of Bologna +# Solderpad Hardware License, Version 0.51, see LICENSE for details. +# SPDX-License-Identifier: SHL-0.51 + +# set up environment variables for rtl simulation, pulp-runtime and freertos +ROOTD=$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")/.." && pwd) +source "$ROOTD/pulp-runtime/configs/pulp_cluster.sh" +source "$ROOTD/scripts/vsim.sh" diff --git a/include/cluster_bus_defines.sv b/include/cluster_bus_defines.sv index ee91d162..9306c090 100644 --- a/include/cluster_bus_defines.sv +++ b/include/cluster_bus_defines.sv @@ -1,22 +1,16 @@ -/* - * pulp_cluster_defines.sv - * - * Copyright (C) 2013-2018 ETH Zurich, University of Bologna. - * - * Copyright and related rights are licensed under the Solderpad Hardware - * License, Version 0.51 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law - * or agreed to in writing, software, hardware and materials distributed under - * this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - */ +// Copyright 2013-2023 ETH Zurich and University of Bologna. +// Copyright and related rights are licensed under the Solderpad Hardware +// License, Version 0.51 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law +// or agreed to in writing, software, hardware and materials distributed under +// this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. /* * Collection of legacy pulp cluster defines. - * + * */ `define NB_SLAVE 4 diff --git a/include/periph_bus_defines.sv b/include/periph_bus_defines.sv index 329d4031..3742f8c1 100644 --- a/include/periph_bus_defines.sv +++ b/include/periph_bus_defines.sv @@ -1,18 +1,12 @@ -/* - * periph_bus_defines.sv - * - * Copyright (C) 2013-2018 ETH Zurich, University of Bologna. - * - * Copyright and related rights are licensed under the Solderpad Hardware - * License, Version 0.51 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law - * or agreed to in writing, software, hardware and materials distributed under - * this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - */ +// Copyright 2013-2023 ETH Zurich and University of Bologna. +// Copyright and related rights are licensed under the Solderpad Hardware +// License, Version 0.51 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law +// or agreed to in writing, software, hardware and materials distributed under +// this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. // SOC PERIPHERALS APB BUS PARAMETRES `define NB_MASTER 11 diff --git a/include/pulp_interfaces.sv b/include/pulp_interfaces.sv index f7aa45e8..1501c274 100644 --- a/include/pulp_interfaces.sv +++ b/include/pulp_interfaces.sv @@ -1,4 +1,4 @@ -// Copyright 2018 ETH Zurich and University of Bologna. +// Copyright 2013-2023 ETH Zurich and University of Bologna. // Copyright and related rights are licensed under the Solderpad Hardware // License, Version 0.51 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at diff --git a/include/pulp_soc_defines.sv b/include/pulp_soc_defines.sv index 81e2538a..49d9ad3d 100644 --- a/include/pulp_soc_defines.sv +++ b/include/pulp_soc_defines.sv @@ -1,18 +1,12 @@ -/* - * pulp_soc_defines.sv - * - * Copyright (C) 2013-2018 ETH Zurich, University of Bologna. - * - * Copyright and related rights are licensed under the Solderpad Hardware - * License, Version 0.51 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law - * or agreed to in writing, software, hardware and materials distributed under - * this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - */ +// Copyright 2013-2023 ETH Zurich and University of Bologna. +// Copyright and related rights are licensed under the Solderpad Hardware +// License, Version 0.51 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law +// or agreed to in writing, software, hardware and materials distributed under +// this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. /* * Activate this define to exclude the cluster and speed up the FPGA deployement diff --git a/ips_list.yml b/ips_list.yml index f0dcaafc..7c474ea9 100644 --- a/ips_list.yml +++ b/ips_list.yml @@ -1,3 +1,7 @@ +# Copyright 2023 ETH Zurich and University of Bologna +# Solderpad Hardware License, Version 0.51, see LICENSE for details. +# SPDX-License-Identifier: SHL-0.51 + # # List of IPs and relative branch/commit-hash/tag. # Uses the YAML syntax.