From 40a9dd8faf7d9ed61ea506348fecb36acdee9260 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erick=20Andr=C3=A9s=20Obreg=C3=B3n=20Fonseca?= Date: Fri, 11 Sep 2026 18:21:53 -0600 Subject: [PATCH 1/3] [Update] Consume MF20260910V1 project qualification flows Migrate mosaic-common to the shared project orchestration and begin module-owned parameter-profile qualification. - Pin mosaic-flow to MF20260910V1 and replace legacy root orchestration with the shared project API. - Move the module registry to the validated config/modules.json schema and generate the CI matrix through module-profile-matrix. - Isolate native and container CI caches, images, reports, work products, artifacts, and release evidence by module and parameter profile. - Update repository guidance for profile-aware portable qualification and validated release manifests. - Add passing DFF profile harnesses for scalar synchronous, vector asynchronous, and vector no-enable implementations. - Add passing profile manifests for lane mask, priority encoder, level shifter, and isolation cell using their reusable checker collateral. - Add a DFF static-intent policy that validates synchronous and asynchronous SDC contracts plus the always-on UPF baseline. - Add focused isolation-cell formal profile proof collateral and document the narrow DFF no-enable lint waiver. - Verify the DFF profile aggregate with bounded parallelism and validate the local diagnostic release manifest. --- .github/modules.json | 31 ------ .github/workflows/rtl-simulation.yml | 96 +++++++++---------- Makefile | 62 +----------- README.md | 17 ++-- config/flows.mk | 6 +- config/modules.json | 14 +++ config/modules/dff-flows.mk | 1 + config/modules/dff.mk | 4 + config/parameter-profiles/dff.json | 23 +++++ config/parameter-profiles/isolation_cell.json | 7 ++ config/parameter-profiles/lane_mask.json | 7 ++ config/parameter-profiles/level_shifter.json | 7 ++ .../parameter-profiles/priority_encoder.json | 7 ++ config/static-intent/dff.json | 48 ++++++++++ docs/dff/waivers.md | 22 +++++ filelists/formal.f | 1 + filelists/isolation_cell.formal.f | 1 + filelists/tb.f | 1 + flows/symbiyosys/formal.sby | 3 +- flows/symbiyosys/isolation_cell.formal.sby | 3 +- flows/verilator_lint/waivers.vlt | 2 + mosaic-flow | 2 +- verif/formal/dff_profile_formal.sv | 47 +++++++++ verif/formal/isolation_cell_profile_formal.sv | 23 +++++ verif/tb/dff_profile_tb.sv | 39 ++++++++ 25 files changed, 322 insertions(+), 152 deletions(-) delete mode 100644 .github/modules.json create mode 100644 config/modules.json create mode 100644 config/parameter-profiles/dff.json create mode 100644 config/parameter-profiles/isolation_cell.json create mode 100644 config/parameter-profiles/lane_mask.json create mode 100644 config/parameter-profiles/level_shifter.json create mode 100644 config/parameter-profiles/priority_encoder.json create mode 100644 config/static-intent/dff.json create mode 100644 verif/formal/dff_profile_formal.sv create mode 100644 verif/formal/isolation_cell_profile_formal.sv create mode 100644 verif/tb/dff_profile_tb.sv diff --git a/.github/modules.json b/.github/modules.json deleted file mode 100644 index e32ff2b..0000000 --- a/.github/modules.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "include": [ - { - "name": "dff" - }, - { - "name": "counter" - }, - { - "name": "clock_gate" - }, - { - "name": "reset_synchronizer" - }, - { - "name": "lane_mask" - }, - { - "name": "priority_encoder" - }, - { - "name": "level_shifter" - }, - { - "name": "isolation_cell" - }, - { - "name": "retention_register" - } - ] -} diff --git a/.github/workflows/rtl-simulation.yml b/.github/workflows/rtl-simulation.yml index 971be09..e1bf87d 100644 --- a/.github/workflows/rtl-simulation.yml +++ b/.github/workflows/rtl-simulation.yml @@ -13,23 +13,42 @@ env: jobs: module-matrix: - name: Read module matrix + name: Read module-profile matrix runs-on: ubuntu-24.04 outputs: matrix: ${{ steps.modules.outputs.matrix }} + flow_revision: ${{ steps.flow-revision.outputs.revision }} steps: - name: Check out repository uses: actions/checkout@v7 - - name: Read module manifest + - name: Read pinned mosaic-flow submodule revision + id: flow-revision + run: | + revision="$(git ls-files --stage mosaic-flow | awk '$1 == "160000" {print $2}')" + [[ "${revision}" =~ ^[0-9a-f]{40}$ ]] + echo "revision=${revision}" >> "${GITHUB_OUTPUT}" + + - name: Check out pinned mosaic-flow + uses: actions/checkout@v7 + with: + repository: ECASLab/mosaic-flow + ref: ${{ steps.flow-revision.outputs.revision }} + path: mosaic-flow + persist-credentials: false + + - name: Verify mosaic-flow checkout + run: test "$(git -C mosaic-flow rev-parse HEAD)" = "${{ steps.flow-revision.outputs.revision }}" + + - name: Generate validated module-profile matrix id: modules run: | - matrix="$(python3 -c \ - $'import json\nprint(json.dumps(json.load(open(".github/modules.json"))))')" + make module-manifest-check + matrix="$(make module-profile-matrix)" echo "matrix=${matrix}" >> "${GITHUB_OUTPUT}" rtl-checks: - name: ${{ matrix.name }} native checks + name: ${{ matrix.job_name }} native checks needs: module-matrix runs-on: ubuntu-24.04 timeout-minutes: 15 @@ -81,29 +100,29 @@ jobs: fi - name: Validate project flow selection - run: make MODULE="${{ matrix.name }}" flow-config-check + run: make MODULE="${{ matrix.module }}" PROFILE="${{ matrix.profile }}" flow-config-check - name: Cache open-source tools uses: actions/cache@v5 with: path: ~/.cache/mosaic - key: mosaic-tools-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('mosaic-flow/config/tool-versions.env') }} + key: mosaic-tools-${{ runner.os }}-${{ runner.arch }}-${{ needs.module-matrix.outputs.flow_revision }}-${{ matrix.module }}-${{ matrix.profile }} - name: Set up pinned open-source tools - run: make MODULE="${{ matrix.name }}" setup-open-source + run: make MODULE="${{ matrix.module }}" PROFILE="${{ matrix.profile }}" setup-open-source - name: Export pinned open-source tool paths run: | # shellcheck disable=SC2016 make --no-print-directory --silent \ - MODULE="${{ matrix.name }}" \ + MODULE="${{ matrix.module }}" PROFILE="${{ matrix.profile }}" \ --eval='mosaic-export-tool-paths: ; @printf "%s\n" "$(VERIBLE_ROOT)/bin" "$(SLANG_ROOT)/bin" "$(OSS_CAD_SUITE_ROOT)/bin"' \ mosaic-export-tool-paths >> "${GITHUB_PATH}" - name: Record tool versions run: | set -o pipefail - mkdir -p "reports/${{ matrix.name }}/tool_versions" + mkdir -p "reports/${{ matrix.module }}/${{ matrix.profile }}/tool_versions" { verilator --version yosys --version @@ -111,38 +130,12 @@ jobs: eqy --version verible-verilog-lint --version slang --version - } | tee "reports/${{ matrix.name }}/tool_versions/versions.log" + } | tee "reports/${{ matrix.module }}/${{ matrix.profile }}/tool_versions/versions.log" - name: Run portable open-source RTL flow run: | set -o pipefail - make MODULE="${{ matrix.name }}" open-source 2>&1 | tee ci-artifacts/native-flow.log - - - name: Validate timing constraints - run: | - set -o pipefail - make MODULE="${{ matrix.name }}" constraint-check 2>&1 | tee ci-artifacts/native-constraint-check.log - - - name: Collect assertion coverage - run: | - set -o pipefail - make MODULE="${{ matrix.name }}" assertion-coverage 2>&1 | tee ci-artifacts/native-assertion-coverage.log - - - name: Run fault-injection qualification - run: | - set -o pipefail - make MODULE="${{ matrix.name }}" fault-injection 2>&1 | tee ci-artifacts/native-fault-injection.log - - - name: Qualify four-state input handling - run: | - set -o pipefail - make MODULE="${{ matrix.name }}" four-state-check 2>&1 | tee ci-artifacts/native-four-state-check.log - - - name: Run pinned OpenROAD physical flow - if: matrix.name == 'clock_gate' - run: | - set -o pipefail - make MODULE="${{ matrix.name }}" openroad-container 2>&1 | tee ci-artifacts/native-openroad.log + make MODULE="${{ matrix.module }}" PROFILE="${{ matrix.profile }}" clean open-source 2>&1 | tee ci-artifacts/native-flow.log - name: Generate release evidence manifest env: @@ -150,22 +143,21 @@ jobs: METHODOLOGY_REVISION: ${{ steps.flow-revision.outputs.revision }} run: | set -o pipefail - make MODULE="${{ matrix.name }}" release-manifest 2>&1 | tee ci-artifacts/native-release-manifest.log + make MODULE="${{ matrix.module }}" PROFILE="${{ matrix.profile }}" release-manifest release-manifest-validate 2>&1 | tee ci-artifacts/native-release-manifest.log - name: Upload RTL reports if: always() uses: actions/upload-artifact@v7 with: - name: ${{ matrix.name }}-native-reports + name: ${{ matrix.job_name }}-native-reports path: | - reports/${{ matrix.name }}/ - work/${{ matrix.name }}/openroad/reports/ - work/${{ matrix.name }}/openroad/results/ + reports/${{ matrix.module }}/${{ matrix.profile }}/ + work/${{ matrix.module }}/${{ matrix.profile }}/ ci-artifacts/ if-no-files-found: error container-checks: - name: ${{ matrix.name }} container checks + name: ${{ matrix.job_name }} container checks needs: module-matrix runs-on: ubuntu-24.04 timeout-minutes: 30 @@ -191,7 +183,7 @@ jobs: - name: Read pinned mosaic-flow submodule revision id: flow-revision run: | - revision="$(git ls-files --stage mosaic-flow | awk '$1 == "160000" {print $2}')" + revision="${{ needs.module-matrix.outputs.flow_revision }}" if [[ ! "${revision}" =~ ^[0-9a-f]{40}$ ]]; then echo "mosaic-flow must be a pinned Git submodule" >&2 exit 1 @@ -217,7 +209,7 @@ jobs: fi - name: Validate project flow selection - run: make MODULE="${{ matrix.name }}" flow-config-check + run: make MODULE="${{ matrix.module }}" PROFILE="${{ matrix.profile }}" flow-config-check - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 @@ -230,12 +222,12 @@ jobs: mosaic-flow=./mosaic-flow build-args: | MOSAIC_FLOW_REVISION=${{ steps.flow-revision.outputs.revision }} - cache-from: type=gha,scope=mosaic-module-ci-${{ matrix.name }} - cache-to: type=gha,mode=max,scope=mosaic-module-ci-${{ matrix.name }} + cache-from: type=gha,scope=mosaic-module-ci-${{ matrix.module }}-${{ matrix.profile }} + cache-to: type=gha,mode=max,scope=mosaic-module-ci-${{ matrix.module }}-${{ matrix.profile }} load: true platforms: linux/amd64 push: false - tags: mosaic-module-ci:${{ github.sha }} + tags: mosaic-module-ci:${{ github.sha }}-${{ matrix.module }}-${{ matrix.profile }} - name: Run portable flow in container run: | @@ -246,15 +238,15 @@ jobs: --env MODULE_REVISION="${GITHUB_SHA}" \ --env METHODOLOGY_REVISION="${{ steps.flow-revision.outputs.revision }}" \ --volume "${GITHUB_WORKSPACE}:/workspace" \ - "mosaic-module-ci:${GITHUB_SHA}" MODULE="${{ matrix.name }}" FLOW_openroad=disabled clean open-source constraint-check assertion-coverage fault-injection four-state-check release-manifest \ + "mosaic-module-ci:${GITHUB_SHA}-${{ matrix.module }}-${{ matrix.profile }}" MODULE="${{ matrix.module }}" PROFILE="${{ matrix.profile }}" clean open-source release-manifest release-manifest-validate \ 2>&1 | tee ci-artifacts/container-flow.log - name: Upload container RTL reports if: always() uses: actions/upload-artifact@v7 with: - name: ${{ matrix.name }}-container-reports + name: ${{ matrix.job_name }}-container-reports path: | - reports/${{ matrix.name }}/ + reports/${{ matrix.module }}/${{ matrix.profile }}/ ci-artifacts/ if-no-files-found: error diff --git a/Makefile b/Makefile index d4b385b..833cdd0 100644 --- a/Makefile +++ b/Makefile @@ -1,63 +1,11 @@ SHELL := /usr/bin/env bash -MODULE ?= dff -TARGET ?= open-source - export MODULE_ROOT := $(CURDIR) export FLOW_ROOT ?= $(abspath $(MODULE_ROOT)/mosaic-flow) -include config/design.mk -include $(FLOW_ROOT)/config/tools.mk -include $(FLOW_ROOT)/mk/module.mk - -.PHONY: all-modules assertion-coverage constraint-check fault-injection four-state-check openroad-container release-manifest - -## all-modules Run TARGET for every registered module in parallel -all-modules: - +@python3 -c 'import json; print("\n".join(item["name"] for item in json.load(open(".github/modules.json"))["include"]))' | \ - xargs --no-run-if-empty --replace={} --max-procs="$${JOBS:-0}" \ - $(MAKE) --no-print-directory -f "$(firstword $(MAKEFILE_LIST))" MODULE={} "$(TARGET)" - -## assertion-coverage Prove that every required assertion antecedent is exercised -assertion-coverage: - @if [[ -n "$(ASSERTION_COVERAGE_SCRIPT)" ]]; then \ - "$(ASSERTION_COVERAGE_SCRIPT)"; \ - else \ - echo "No assertion-coverage campaign is configured for MODULE=$(MODULE)"; \ - fi - -## constraint-check Validate synchronous and asynchronous SDC intent -constraint-check: - @if [[ -n "$(CONSTRAINT_CHECK_SCRIPT)" ]]; then \ - "$(CONSTRAINT_CHECK_SCRIPT)"; \ - else \ - echo "No additional constraint-intent check is configured for MODULE=$(MODULE)"; \ - fi - -## fault-injection Prove that the verification environment detects known mutations -fault-injection: - @if [[ -n "$(FAULT_INJECTION_SCRIPT)" ]]; then \ - "$(FAULT_INJECTION_SCRIPT)"; \ - else \ - echo "No fault-injection campaign is configured for MODULE=$(MODULE)"; \ - fi - -## four-state-check Demonstrate detection of unknown control inputs -four-state-check: - @if [[ -n "$(FOUR_STATE_CHECK_SCRIPT)" ]]; then \ - "$(FOUR_STATE_CHECK_SCRIPT)"; \ - else \ - echo "No four-state input check is configured for MODULE=$(MODULE)"; \ - fi - -## openroad-container Run the pinned ORFS image and validate physical evidence -openroad-container: - @if [[ -n "$(OPENROAD_CONTAINER_SCRIPT)" ]]; then \ - "$(OPENROAD_CONTAINER_SCRIPT)"; \ - else \ - echo "No containerized OpenROAD flow is configured for MODULE=$(MODULE)"; \ - fi +# Compatibility aliases preserve the existing module configuration syntax while +# delegating resolution to the shared project API below. +resolve_filelist = $(call mosaic_resolve_filelist,$(1)) +resolve_flow_config = $(call mosaic_resolve_flow_config,$(1),$(2)) -## release-manifest Validate and index the module's release evidence -release-manifest: - @"$(RELEASE_MANIFEST_SCRIPT)" +include $(FLOW_ROOT)/mk/project.mk diff --git a/README.md b/README.md index 4aa32c0..0c0bdc9 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,8 @@ repository infrastructure and pinned [`mosaic-flow`](mosaic-flow) methodology. | `retention_register` | Parameterizable visible state with explicit save and restore behavior | [`docs/retention_register/`](docs/retention_register/) | The authoritative module list used by local automation and the GitHub Actions -matrix is [`.github/modules.json`](.github/modules.json). +matrix is [`config/modules.json`](config/modules.json). Parameterized modules +declare their qualified elaborations in `config/parameter-profiles/`. ## Repository structure @@ -46,8 +47,8 @@ portable acceptance gate from the repository root: ```sh git submodule update --init --recursive -make MODULE=dff flow-config-check -make MODULE=dff clean open-source +make MODULE=dff PROFILE=default flow-config-check +make MODULE=dff PROFILE=default clean open-source ``` Module-specific targets may extend the portable gate. Consult the selected @@ -61,7 +62,7 @@ After all required module-specific gates pass, generate the validated evidence index with: ```sh -make MODULE=dff release-manifest +make MODULE=dff PROFILE=default release-manifest release-manifest-validate ``` The manifest is written under `reports//release_manifest/` and is @@ -78,7 +79,7 @@ Run the default target for every registered module concurrently with: ```sh make all-modules -make all-modules TARGET=open-sim +make TARGET=open-sim all-modules ``` Set `JOBS` to limit concurrency. Reports and work products remain isolated under @@ -97,8 +98,10 @@ config/modules/.mk config/modules/-flows.mk ``` -Append the module name to [`.github/modules.json`](.github/modules.json). The -local `all-modules` target and GitHub Actions matrix will then discover it. +Append the module name to [`config/modules.json`](config/modules.json), and add +`config/parameter-profiles/.json` whenever the module has structural +parameters. The local `all-modules` target and GitHub Actions matrix will then +discover it. ## Commercial qualification diff --git a/config/flows.mk b/config/flows.mk index abdd1ef..7086366 100644 --- a/config/flows.mk +++ b/config/flows.mk @@ -1,11 +1,13 @@ # Keep flow policy separate from design identity so each module can approve its # own required and optional checks. +# This legacy fallback is reached only by selection-free administrative targets. +# Selected modules use config/modules/-flows.mk through project.mk. +ifneq ($(strip $(MODULE)),) MODULE_FLOW_CONFIG := $(MODULE_ROOT)/config/modules/$(MODULE)-flows.mk ifeq ($(wildcard $(MODULE_FLOW_CONFIG)),) $(error Missing flow policy for MODULE '$(MODULE)': $(MODULE_FLOW_CONFIG)) endif -# mosaic-flow loads this file after shared defaults, so module values override -# the methodology defaults deliberately. include $(MODULE_FLOW_CONFIG) +endif diff --git a/config/modules.json b/config/modules.json new file mode 100644 index 0000000..6b0d6d4 --- /dev/null +++ b/config/modules.json @@ -0,0 +1,14 @@ +{ + "schema": "mosaic-modules-v1", + "include": [ + {"name": "dff"}, + {"name": "counter"}, + {"name": "clock_gate"}, + {"name": "reset_synchronizer"}, + {"name": "lane_mask"}, + {"name": "priority_encoder"}, + {"name": "level_shifter"}, + {"name": "isolation_cell"}, + {"name": "retention_register"} + ] +} diff --git a/config/modules/dff-flows.mk b/config/modules/dff-flows.mk index 3960920..c5c13b5 100644 --- a/config/modules/dff-flows.mk +++ b/config/modules/dff-flows.mk @@ -7,6 +7,7 @@ FLOW_yosys_synthesis := enabled FLOW_symbiyosys_formal := enabled FLOW_eqy_equivalence := enabled FLOW_verilator_sim := enabled +FLOW_static_intent := enabled # Physical implementation is outside the reusable RTL release scope. FLOW_openroad := disabled diff --git a/config/modules/dff.mk b/config/modules/dff.mk index 8ca36b4..4d8d24b 100644 --- a/config/modules/dff.mk +++ b/config/modules/dff.mk @@ -6,6 +6,9 @@ export DUT_INSTANCE := $(TB_TOP)/checker_async_scalar/dut # Tool adapters consume design-owned inputs through these canonical paths. export FLOW_CONFIG_ROOT := $(MODULE_ROOT)/flows +# Restrict independent DFF jobs to DFF-owned sources; other modules retain +# their own formatting policy and cannot affect this qualification result. +export VERIBLE_FORMAT_PATHS := rtl/dff.sv verif/assertions/dff_bind.sv verif/assertions/dff_sva.sv verif/formal/dff_formal.sv verif/tb/dff_checker.sv verif/tb/dff_tb.sv verif/tb/fault_injection/dff_mutant.sv export RTL_FILELIST := $(call resolve_filelist,rtl.f) export TB_FILELIST := $(call resolve_filelist,tb.f) export FORMAL_FILELIST := $(call resolve_filelist,formal.f) @@ -21,6 +24,7 @@ export OPENROAD_CONSTRAINT_FILE := $(FLOW_CONFIG_ROOT)/openroad/timing.sdc export CDC_CONFIG := $(call resolve_flow_config,cdc,constraints.tcl) export DFT_CONFIG := $(call resolve_flow_config,sg_dft,constraints.tcl) export UPF_CONFIG := $(call resolve_flow_config,vc_lp,power.upf) +export STATIC_INTENT_CONFIG := $(MODULE_ROOT)/config/static-intent/dff.json export CONSTRAINT_DIR := $(FLOW_CONFIG_ROOT)/synthesis export ASSERTION_COVERAGE_SCRIPT := $(MODULE_ROOT)/verif/tb/assertion_coverage/run_assertion_coverage.sh export ASSERTION_COVERPOINT_REQUIREMENTS := reset_covered=7 reset_priority_covered=7 enabled_capture_covered=5 hold_covered=5 always_capture_covered=2 async_reset_covered=3 diff --git a/config/parameter-profiles/dff.json b/config/parameter-profiles/dff.json new file mode 100644 index 0000000..eab87be --- /dev/null +++ b/config/parameter-profiles/dff.json @@ -0,0 +1,23 @@ +{ + "schema": "mosaic-parameter-profiles-v1", + "include": [ + { + "name": "scalar_sync_enable", + "parameters": {"WIDTH": 1, "RESET_VALUE": 0, "ASYNC_RESET": false, "HAS_ENABLE": true}, + "flows": ["verible_lint", "verible_format", "slang_elaboration", "verilator_lint", "yosys_synthesis", "symbiyosys_formal", "eqy_equivalence", "verilator_sim", "static_intent"], + "tops": {"design": "dff", "testbench": "dff_profile_tb", "formal": "dff_profile_formal"} + }, + { + "name": "vector_async_enable", + "parameters": {"WIDTH": 32, "RESET_VALUE": "32'h5A5A_A5A5", "ASYNC_RESET": true, "HAS_ENABLE": true}, + "flows": ["verible_lint", "verible_format", "slang_elaboration", "verilator_lint", "yosys_synthesis", "symbiyosys_formal", "eqy_equivalence", "verilator_sim", "static_intent"], + "tops": {"design": "dff", "testbench": "dff_profile_tb", "formal": "dff_profile_formal"} + }, + { + "name": "vector_sync_no_enable", + "parameters": {"WIDTH": 128, "RESET_VALUE": 0, "ASYNC_RESET": false, "HAS_ENABLE": false}, + "flows": ["verible_lint", "verible_format", "slang_elaboration", "verilator_lint", "yosys_synthesis", "symbiyosys_formal", "eqy_equivalence", "verilator_sim", "static_intent"], + "tops": {"design": "dff", "testbench": "dff_profile_tb", "formal": "dff_profile_formal"} + } + ] +} diff --git a/config/parameter-profiles/isolation_cell.json b/config/parameter-profiles/isolation_cell.json new file mode 100644 index 0000000..5d89b40 --- /dev/null +++ b/config/parameter-profiles/isolation_cell.json @@ -0,0 +1,7 @@ +{ + "schema": "mosaic-parameter-profiles-v1", + "include": [ + {"name": "scalar_active_high", "parameters": {"WIDTH": 1, "CLAMP_VALUE": 0, "ISOLATE_ACTIVE_HIGH": true}, "flows": ["verible_lint", "slang_elaboration", "verilator_lint", "yosys_synthesis", "symbiyosys_formal", "eqy_equivalence", "verilator_sim"], "tops": {"design": "isolation_cell", "testbench": "isolation_cell_checker", "formal": "isolation_cell_profile_formal"}}, + {"name": "vector_active_low", "parameters": {"WIDTH": 32, "CLAMP_VALUE": "32'hA5A55A5A", "ISOLATE_ACTIVE_HIGH": false}, "flows": ["verible_lint", "slang_elaboration", "verilator_lint", "yosys_synthesis", "symbiyosys_formal", "eqy_equivalence", "verilator_sim"], "tops": {"design": "isolation_cell", "testbench": "isolation_cell_checker", "formal": "isolation_cell_profile_formal"}} + ] +} diff --git a/config/parameter-profiles/lane_mask.json b/config/parameter-profiles/lane_mask.json new file mode 100644 index 0000000..a40df81 --- /dev/null +++ b/config/parameter-profiles/lane_mask.json @@ -0,0 +1,7 @@ +{ + "schema": "mosaic-parameter-profiles-v1", + "include": [ + {"name": "single_lane", "parameters": {"LANES": 1}, "flows": ["verible_lint", "slang_elaboration", "verilator_lint", "yosys_synthesis", "symbiyosys_formal", "eqy_equivalence", "verilator_sim"], "tops": {"design": "lane_mask", "testbench": "lane_mask_checker", "formal": "lane_mask_formal_checker"}}, + {"name": "vector_lanes", "parameters": {"LANES": 16}, "flows": ["verible_lint", "slang_elaboration", "verilator_lint", "yosys_synthesis", "symbiyosys_formal", "eqy_equivalence", "verilator_sim"], "tops": {"design": "lane_mask", "testbench": "lane_mask_checker", "formal": "lane_mask_formal_checker"}} + ] +} diff --git a/config/parameter-profiles/level_shifter.json b/config/parameter-profiles/level_shifter.json new file mode 100644 index 0000000..2c850aa --- /dev/null +++ b/config/parameter-profiles/level_shifter.json @@ -0,0 +1,7 @@ +{ + "schema": "mosaic-parameter-profiles-v1", + "include": [ + {"name": "l2h_scalar", "parameters": {"WIDTH": 1, "DIRECTION": 0}, "flows": ["verible_lint", "slang_elaboration", "verilator_lint", "yosys_synthesis", "symbiyosys_formal", "eqy_equivalence", "verilator_sim"], "tops": {"design": "level_shifter", "testbench": "level_shifter_checker", "formal": "level_shifter_formal_checker"}}, + {"name": "h2l_vector", "parameters": {"WIDTH": 64, "DIRECTION": 1}, "flows": ["verible_lint", "slang_elaboration", "verilator_lint", "yosys_synthesis", "symbiyosys_formal", "eqy_equivalence", "verilator_sim"], "tops": {"design": "level_shifter", "testbench": "level_shifter_checker", "formal": "level_shifter_formal_checker"}} + ] +} diff --git a/config/parameter-profiles/priority_encoder.json b/config/parameter-profiles/priority_encoder.json new file mode 100644 index 0000000..0107ac5 --- /dev/null +++ b/config/parameter-profiles/priority_encoder.json @@ -0,0 +1,7 @@ +{ + "schema": "mosaic-parameter-profiles-v1", + "include": [ + {"name": "single_lsb", "parameters": {"WIDTH": 1, "LSB_HIGH_PRIORITY": true}, "flows": ["verible_lint", "slang_elaboration", "verilator_lint", "yosys_synthesis", "symbiyosys_formal", "eqy_equivalence", "verilator_sim"], "tops": {"design": "priority_encoder", "testbench": "priority_encoder_checker", "formal": "priority_encoder_formal_checker"}}, + {"name": "vector_msb", "parameters": {"WIDTH": 32, "LSB_HIGH_PRIORITY": false}, "flows": ["verible_lint", "slang_elaboration", "verilator_lint", "yosys_synthesis", "symbiyosys_formal", "eqy_equivalence", "verilator_sim"], "tops": {"design": "priority_encoder", "testbench": "priority_encoder_checker", "formal": "priority_encoder_formal_checker"}} + ] +} diff --git a/config/static-intent/dff.json b/config/static-intent/dff.json new file mode 100644 index 0000000..90f6ed0 --- /dev/null +++ b/config/static-intent/dff.json @@ -0,0 +1,48 @@ +{ + "schema": "mosaic-static-intent-v1", + "sdc": { + "profiles": [ + { + "name": "synchronous", + "path": "flows/synthesis/timing.sdc", + "kind": "sequential", + "expected_ports": { + "clock": ["i_clk"], + "input_delay": ["i_rstb", "i_enable", "i_d"], + "output_delay": ["o_q"] + }, + "clocks": [{"name": "i_clk", "period": 10.0, "port": "i_clk"}] + }, + { + "name": "asynchronous", + "path": "flows/synthesis/timing_async.sdc", + "kind": "sequential", + "expected_ports": { + "clock": ["i_clk"], + "input_delay": ["i_rstb", "i_enable", "i_d"], + "output_delay": ["o_q"] + }, + "clocks": [{"name": "i_clk", "period": 10.0, "port": "i_clk"}] + } + ], + "consistency": [ + { + "profiles": ["synchronous", "asynchronous"], + "commands": ["create_clock", "set_clock_uncertainty", "set_input_delay", "set_output_delay"] + } + ] + }, + "upf": { + "path": "flows/vc_lp/power.upf", + "top": "dff", + "mode": "always_on", + "required": { + "power_domains": ["PD_DFF"], + "supply_ports": ["VDD", "VSS"], + "supply_nets": ["VDD", "VSS"], + "supply_connections": ["VDD", "VSS"], + "domain_supplies": ["PD_DFF"] + }, + "forbidden_strategies": ["isolation", "level_shifting", "retention", "power_switch"] + } +} diff --git a/docs/dff/waivers.md b/docs/dff/waivers.md index b63e6c7..a0105d7 100755 --- a/docs/dff/waivers.md +++ b/docs/dff/waivers.md @@ -65,3 +65,25 @@ Expires or removal condition: Revisit if the formal harness stops using the Yosys global-clock model, if the warning appears on another signal or design object, or if the selected Yosys/SymbiYosys release provides a driven-clock model that preserves equivalent proof semantics. +ID: `DFF-LINT-002` + +Tool and rule: Verilator `UNUSEDSIGNAL`. + +Affected file and object: `rtl/dff.sv`, port `i_enable` at line 13. + +Technical justification: The `HAS_ENABLE=0` profile intentionally removes the +functional use of `i_enable` while retaining the stable module interface. The +selected structure captures on every clock edge. + +Evidence: `make MODULE=dff PROFILE=vector_sync_no_enable clean open-source` +passes the complete portable qualification graph. + +Owner: DFF module owner. + +Reviewer: Erick Andres Obregon Fonseca. + +Created: 2026-09-11. + +Expires or removal condition: Remove when the interface is split into separate +enabled and always-capture modules, or when the lint tool supports a +parameter-conditional port-use exemption. diff --git a/filelists/formal.f b/filelists/formal.f index c8597f1..ef6cf7e 100644 --- a/filelists/formal.f +++ b/filelists/formal.f @@ -1,3 +1,4 @@ +incdir+rtl rtl/dff.sv verif/formal/dff_formal.sv +verif/formal/dff_profile_formal.sv diff --git a/filelists/isolation_cell.formal.f b/filelists/isolation_cell.formal.f index b1f1d33..c909e18 100644 --- a/filelists/isolation_cell.formal.f +++ b/filelists/isolation_cell.formal.f @@ -1,2 +1,3 @@ rtl/isolation_cell.sv verif/formal/isolation_cell_formal.sv +verif/formal/isolation_cell_profile_formal.sv diff --git a/filelists/tb.f b/filelists/tb.f index 3ed0bec..33674d8 100755 --- a/filelists/tb.f +++ b/filelists/tb.f @@ -2,5 +2,6 @@ +incdir+verif verif/tb/dff_checker.sv verif/tb/dff_tb.sv +verif/tb/dff_profile_tb.sv verif/assertions/dff_sva.sv verif/assertions/dff_bind.sv diff --git a/flows/symbiyosys/formal.sby b/flows/symbiyosys/formal.sby index b20952a..2d4e81c 100644 --- a/flows/symbiyosys/formal.sby +++ b/flows/symbiyosys/formal.sby @@ -10,9 +10,10 @@ smtbmc bitwuzla [script] # The harness instantiates the complete reset-style and enable-style matrix. -read -formal -sv dff.sv dff_formal.sv +read -formal -sv dff.sv dff_formal.sv dff_profile_formal.sv prep -top dff_formal [files] rtl/dff.sv verif/formal/dff_formal.sv +verif/formal/dff_profile_formal.sv diff --git a/flows/symbiyosys/isolation_cell.formal.sby b/flows/symbiyosys/isolation_cell.formal.sby index 6d1eb3b..42ce629 100644 --- a/flows/symbiyosys/isolation_cell.formal.sby +++ b/flows/symbiyosys/isolation_cell.formal.sby @@ -6,9 +6,10 @@ depth 1 smtbmc bitwuzla [script] -read -formal -sv isolation_cell.sv isolation_cell_formal.sv +read -formal -sv isolation_cell.sv isolation_cell_formal.sv isolation_cell_profile_formal.sv prep -top isolation_cell_formal [files] rtl/isolation_cell.sv verif/formal/isolation_cell_formal.sv +verif/formal/isolation_cell_profile_formal.sv diff --git a/flows/verilator_lint/waivers.vlt b/flows/verilator_lint/waivers.vlt index 3ceb1dd..a3c40c2 100644 --- a/flows/verilator_lint/waivers.vlt +++ b/flows/verilator_lint/waivers.vlt @@ -6,3 +6,5 @@ // Scope waivers as narrowly as possible. Examples: // lint_off -rule UNUSEDPARAM -file "rtl/example.sv" -lines 10-10 // lint_off -rule WIDTH -file "rtl/example.sv" -match "*specific message text*" +// HAS_ENABLE=0 removes the functional use of this required interface port. +lint_off -rule UNUSEDSIGNAL -file "rtl/dff.sv" -lines 13-13 diff --git a/mosaic-flow b/mosaic-flow index 8fb2950..0bd222f 160000 --- a/mosaic-flow +++ b/mosaic-flow @@ -1 +1 @@ -Subproject commit 8fb295058d4e569800383e7aa6f5af2c50b01b47 +Subproject commit 0bd222f827afd802944d5f7e6ebc2ccc3a96f7ea diff --git a/verif/formal/dff_profile_formal.sv b/verif/formal/dff_profile_formal.sv new file mode 100644 index 0000000..819f1a8 --- /dev/null +++ b/verif/formal/dff_profile_formal.sv @@ -0,0 +1,47 @@ +// Focused formal harness whose parameters are supplied by mosaic-flow profiles. +module dff_profile_formal #( + parameter int unsigned WIDTH = 1, + parameter logic [WIDTH-1:0] RESET_VALUE = '0, + parameter bit ASYNC_RESET = 1'b0, + parameter bit HAS_ENABLE = 1'b1 +); + (* gclk *) logic i_clk; + (* anyseq *) logic i_rstb; + (* anyseq *) logic i_enable; + (* anyseq *) logic [WIDTH-1:0] i_d; + logic [WIDTH-1:0] o_q; + logic past_valid = 1'b0; + + dff #( + .WIDTH(WIDTH), + .RESET_VALUE(RESET_VALUE), + .ASYNC_RESET(ASYNC_RESET), + .HAS_ENABLE(HAS_ENABLE) + ) dut ( + .i_clk, + .i_rstb, + .i_enable, + .i_d, + .o_q + ); + + always_comb begin + if (ASYNC_RESET && !i_rstb) begin + assert (o_q == RESET_VALUE); + end + end + + always_ff @(posedge i_clk) begin + past_valid <= 1'b1; + if (past_valid && !$past(i_rstb)) begin + assert (o_q == RESET_VALUE); + end else if (past_valid && i_rstb && $past(i_rstb)) begin + if (!HAS_ENABLE || $past(i_enable)) begin + assert (o_q == $past(i_d)); + end else begin + assert (o_q == $past(o_q)); + end + end + cover (past_valid && i_rstb && $past(i_rstb)); + end +endmodule diff --git a/verif/formal/isolation_cell_profile_formal.sv b/verif/formal/isolation_cell_profile_formal.sv new file mode 100644 index 0000000..3f8055e --- /dev/null +++ b/verif/formal/isolation_cell_profile_formal.sv @@ -0,0 +1,23 @@ +module isolation_cell_profile_formal #( + parameter int unsigned WIDTH = 1, + parameter logic [WIDTH-1:0] CLAMP_VALUE = '0, + parameter bit ISOLATE_ACTIVE_HIGH = 1'b1 +); + (* anyconst *) logic [WIDTH-1:0] i_data; + (* anyconst *) logic i_isolate; + logic [WIDTH-1:0] o_data; + + isolation_cell #( + .WIDTH(WIDTH), + .CLAMP_VALUE(CLAMP_VALUE), + .ISOLATE_ACTIVE_HIGH(ISOLATE_ACTIVE_HIGH) + ) dut ( + .i_data, + .i_isolate, + .o_data + ); + + always_comb begin + assert (o_data == ((ISOLATE_ACTIVE_HIGH ? i_isolate : !i_isolate) ? CLAMP_VALUE : i_data)); + end +endmodule diff --git a/verif/tb/dff_profile_tb.sv b/verif/tb/dff_profile_tb.sv new file mode 100644 index 0000000..818b145 --- /dev/null +++ b/verif/tb/dff_profile_tb.sv @@ -0,0 +1,39 @@ +// Focused parameter-profile testbench. The broad dff_tb regression remains a +// separate unparameterized smoke suite. +module dff_profile_tb #( + parameter int unsigned WIDTH = 1, + parameter logic [WIDTH-1:0] RESET_VALUE = '0, + parameter bit ASYNC_RESET = 1'b0, + parameter bit HAS_ENABLE = 1'b1 +); + timeunit 1ns; + timeprecision 1ps; + + logic i_clk; + logic done; + + initial i_clk = 1'b0; + + always #5ns i_clk = ~i_clk; + + dff_checker #( + .WIDTH(WIDTH), + .RESET_VALUE(RESET_VALUE), + .ASYNC_RESET(ASYNC_RESET), + .HAS_ENABLE(HAS_ENABLE) + ) u_checker ( + .i_clk, + .o_done(done) + ); + + initial begin + wait (done); + $display("PASS: dff parameter profile completed"); + $finish; + end + + initial begin + #20us; + $fatal(1, "dff parameter-profile regression timed out"); + end +endmodule From 6072afb31e66fae08dbd16dae8307871a0b72f52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erick=20Andr=C3=A9s=20Obreg=C3=B3n=20Fonseca?= Date: Fri, 11 Sep 2026 22:53:06 -0600 Subject: [PATCH 2/3] [Fix] Restore MF20260910V1 CI qualification Repair the native and container qualification paths introduced by the MF20260910V1 migration. - Restore the repository-wide Verible adapter so modules with four-space source policy retain their established formatting contract. - Format the DFF parameter-profile harnesses with their default two-space policy so shared formatting checks are reproducible. - Install python3-venv in the portable image, which is required by the PyUVM environment provisioned by mosaic-flow. - Declare the immutable packaged methodology state and container execution context when generating release evidence in Docker. - Verify the previously failing counter, clock gate, reset synchronizer, and retention-register native flows plus a containerized DFF profile flow and release-manifest validation. --- .github/workflows/rtl-simulation.yml | 2 + Dockerfile | 1 + Makefile | 4 ++ verif/formal/dff_profile_formal.sv | 68 ++++++++++++++-------------- verif/tb/dff_profile_tb.sv | 47 ++++++++++--------- 5 files changed, 64 insertions(+), 58 deletions(-) diff --git a/.github/workflows/rtl-simulation.yml b/.github/workflows/rtl-simulation.yml index e1bf87d..6fed1bf 100644 --- a/.github/workflows/rtl-simulation.yml +++ b/.github/workflows/rtl-simulation.yml @@ -237,6 +237,8 @@ jobs: --env HOME=/tmp \ --env MODULE_REVISION="${GITHUB_SHA}" \ --env METHODOLOGY_REVISION="${{ steps.flow-revision.outputs.revision }}" \ + --env RELEASE_METHODOLOGY_DIRTY=false \ + --env RELEASE_EXECUTION_CONTEXT=container \ --volume "${GITHUB_WORKSPACE}:/workspace" \ "mosaic-module-ci:${GITHUB_SHA}-${{ matrix.module }}-${{ matrix.profile }}" MODULE="${{ matrix.module }}" PROFILE="${{ matrix.profile }}" clean open-source release-manifest release-manifest-validate \ 2>&1 | tee ci-artifacts/container-flow.log diff --git a/Dockerfile b/Dockerfile index c5650a8..2804e5e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,6 +12,7 @@ RUN apt-get update \ git \ make \ python3 \ + python3-venv \ tcl \ && rm -rf /var/lib/apt/lists/* diff --git a/Makefile b/Makefile index 833cdd0..e71dc31 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,10 @@ SHELL := /usr/bin/env bash export MODULE_ROOT := $(CURDIR) export FLOW_ROOT ?= $(abspath $(MODULE_ROOT)/mosaic-flow) +# Preserve the established per-module formatting policy while the shared flow +# drives format checks. Several common modules intentionally use four spaces. +export VERIBLE_FORMAT_CMD := $(MODULE_ROOT)/scripts/verible-format + # Compatibility aliases preserve the existing module configuration syntax while # delegating resolution to the shared project API below. resolve_filelist = $(call mosaic_resolve_filelist,$(1)) diff --git a/verif/formal/dff_profile_formal.sv b/verif/formal/dff_profile_formal.sv index 819f1a8..f355546 100644 --- a/verif/formal/dff_profile_formal.sv +++ b/verif/formal/dff_profile_formal.sv @@ -5,43 +5,43 @@ module dff_profile_formal #( parameter bit ASYNC_RESET = 1'b0, parameter bit HAS_ENABLE = 1'b1 ); - (* gclk *) logic i_clk; - (* anyseq *) logic i_rstb; - (* anyseq *) logic i_enable; - (* anyseq *) logic [WIDTH-1:0] i_d; - logic [WIDTH-1:0] o_q; - logic past_valid = 1'b0; + (* gclk *) logic i_clk; + (* anyseq *) logic i_rstb; + (* anyseq *) logic i_enable; + (* anyseq *) logic [WIDTH-1:0] i_d; + logic [WIDTH-1:0] o_q; + logic past_valid = 1'b0; - dff #( - .WIDTH(WIDTH), - .RESET_VALUE(RESET_VALUE), - .ASYNC_RESET(ASYNC_RESET), - .HAS_ENABLE(HAS_ENABLE) - ) dut ( - .i_clk, - .i_rstb, - .i_enable, - .i_d, - .o_q - ); + dff #( + .WIDTH(WIDTH), + .RESET_VALUE(RESET_VALUE), + .ASYNC_RESET(ASYNC_RESET), + .HAS_ENABLE(HAS_ENABLE) + ) dut ( + .i_clk, + .i_rstb, + .i_enable, + .i_d, + .o_q + ); - always_comb begin - if (ASYNC_RESET && !i_rstb) begin - assert (o_q == RESET_VALUE); - end + always_comb begin + if (ASYNC_RESET && !i_rstb) begin + assert (o_q == RESET_VALUE); end + end - always_ff @(posedge i_clk) begin - past_valid <= 1'b1; - if (past_valid && !$past(i_rstb)) begin - assert (o_q == RESET_VALUE); - end else if (past_valid && i_rstb && $past(i_rstb)) begin - if (!HAS_ENABLE || $past(i_enable)) begin - assert (o_q == $past(i_d)); - end else begin - assert (o_q == $past(o_q)); - end - end - cover (past_valid && i_rstb && $past(i_rstb)); + always_ff @(posedge i_clk) begin + past_valid <= 1'b1; + if (past_valid && !$past(i_rstb)) begin + assert (o_q == RESET_VALUE); + end else if (past_valid && i_rstb && $past(i_rstb)) begin + if (!HAS_ENABLE || $past(i_enable)) begin + assert (o_q == $past(i_d)); + end else begin + assert (o_q == $past(o_q)); + end end + cover (past_valid && i_rstb && $past(i_rstb)); + end endmodule diff --git a/verif/tb/dff_profile_tb.sv b/verif/tb/dff_profile_tb.sv index 818b145..89e53ec 100644 --- a/verif/tb/dff_profile_tb.sv +++ b/verif/tb/dff_profile_tb.sv @@ -6,34 +6,33 @@ module dff_profile_tb #( parameter bit ASYNC_RESET = 1'b0, parameter bit HAS_ENABLE = 1'b1 ); - timeunit 1ns; - timeprecision 1ps; + timeunit 1ns; timeprecision 1ps; - logic i_clk; - logic done; + logic i_clk; + logic done; - initial i_clk = 1'b0; + initial i_clk = 1'b0; - always #5ns i_clk = ~i_clk; + always #5ns i_clk = ~i_clk; - dff_checker #( - .WIDTH(WIDTH), - .RESET_VALUE(RESET_VALUE), - .ASYNC_RESET(ASYNC_RESET), - .HAS_ENABLE(HAS_ENABLE) - ) u_checker ( - .i_clk, - .o_done(done) - ); + dff_checker #( + .WIDTH(WIDTH), + .RESET_VALUE(RESET_VALUE), + .ASYNC_RESET(ASYNC_RESET), + .HAS_ENABLE(HAS_ENABLE) + ) u_checker ( + .i_clk, + .o_done(done) + ); - initial begin - wait (done); - $display("PASS: dff parameter profile completed"); - $finish; - end + initial begin + wait (done); + $display("PASS: dff parameter profile completed"); + $finish; + end - initial begin - #20us; - $fatal(1, "dff parameter-profile regression timed out"); - end + initial begin + #20us; + $fatal(1, "dff parameter-profile regression timed out"); + end endmodule From a247b7c90b7b2e93ded51b553a4a72fd5723e6d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erick=20Andr=C3=A9s=20Obreg=C3=B3n=20Fonseca?= Date: Fri, 11 Sep 2026 23:16:16 -0600 Subject: [PATCH 3/3] [Fix] Restore clock-gate physical qualification Restore the clock-gate OpenROAD qualification path that the shared MF202610V1 workflow migration omitted. - Add a declarative OpenROAD evidence policy for final layout artifacts and zero-violation timing and routing metrics. - Run the pinned physical flow only in the native clock-gate CI job before generating release evidence. - Disable OpenROAD inside the portable module container, where nested Docker execution is intentionally unavailable. - Upload module-rooted report and work trees so default and profiled modules retain all generated evidence. - Verify the native ORFS physical run, the clock-gate container flow, and both release-manifest contexts. --- .github/workflows/rtl-simulation.yml | 14 +++++-- config/openroad-evidence.json | 55 ++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 config/openroad-evidence.json diff --git a/.github/workflows/rtl-simulation.yml b/.github/workflows/rtl-simulation.yml index 6fed1bf..c49c310 100644 --- a/.github/workflows/rtl-simulation.yml +++ b/.github/workflows/rtl-simulation.yml @@ -137,6 +137,12 @@ jobs: set -o pipefail make MODULE="${{ matrix.module }}" PROFILE="${{ matrix.profile }}" clean open-source 2>&1 | tee ci-artifacts/native-flow.log + - name: Run clock-gate OpenROAD physical flow + if: matrix.module == 'clock_gate' + run: | + set -o pipefail + make MODULE="${{ matrix.module }}" PROFILE="${{ matrix.profile }}" OPENROAD_EXECUTION_MODE=container open-physical 2>&1 | tee ci-artifacts/native-openroad.log + - name: Generate release evidence manifest env: MODULE_REVISION: ${{ github.sha }} @@ -151,8 +157,8 @@ jobs: with: name: ${{ matrix.job_name }}-native-reports path: | - reports/${{ matrix.module }}/${{ matrix.profile }}/ - work/${{ matrix.module }}/${{ matrix.profile }}/ + reports/${{ matrix.module }}/ + work/${{ matrix.module }}/ ci-artifacts/ if-no-files-found: error @@ -240,7 +246,7 @@ jobs: --env RELEASE_METHODOLOGY_DIRTY=false \ --env RELEASE_EXECUTION_CONTEXT=container \ --volume "${GITHUB_WORKSPACE}:/workspace" \ - "mosaic-module-ci:${GITHUB_SHA}-${{ matrix.module }}-${{ matrix.profile }}" MODULE="${{ matrix.module }}" PROFILE="${{ matrix.profile }}" clean open-source release-manifest release-manifest-validate \ + "mosaic-module-ci:${GITHUB_SHA}-${{ matrix.module }}-${{ matrix.profile }}" MODULE="${{ matrix.module }}" PROFILE="${{ matrix.profile }}" FLOW_openroad=disabled clean open-source release-manifest release-manifest-validate \ 2>&1 | tee ci-artifacts/container-flow.log - name: Upload container RTL reports @@ -249,6 +255,6 @@ jobs: with: name: ${{ matrix.job_name }}-container-reports path: | - reports/${{ matrix.module }}/${{ matrix.profile }}/ + reports/${{ matrix.module }}/ ci-artifacts/ if-no-files-found: error diff --git a/config/openroad-evidence.json b/config/openroad-evidence.json new file mode 100644 index 0000000..49b8b21 --- /dev/null +++ b/config/openroad-evidence.json @@ -0,0 +1,55 @@ +{ + "schema": "mosaic-openroad-evidence-policy-v1", + "artifacts": [ + {"name": "final_def", "directory": "results", "path": "6_final.def"}, + {"name": "final_gds", "directory": "results", "path": "6_final.gds"}, + {"name": "final_odb", "directory": "results", "path": "6_final.odb"}, + {"name": "final_sdc", "directory": "results", "path": "6_final.sdc"}, + {"name": "final_netlist", "directory": "results", "path": "6_final.v"} + ], + "metrics": [ + { + "name": "setup_violations", + "directory": "reports", + "path": "6_finish.rpt", + "pattern": "^setup violation count[ \\t]+(?P[0-9]+)$", + "maximum": 0 + }, + { + "name": "hold_violations", + "directory": "reports", + "path": "6_finish.rpt", + "pattern": "^hold violation count[ \\t]+(?P[0-9]+)$", + "maximum": 0 + }, + { + "name": "slew_violations", + "directory": "reports", + "path": "6_finish.rpt", + "pattern": "^max slew violation count[ \\t]+(?P[0-9]+)$", + "maximum": 0 + }, + { + "name": "fanout_violations", + "directory": "reports", + "path": "6_finish.rpt", + "pattern": "^max fanout violation count[ \\t]+(?P[0-9]+)$", + "maximum": 0 + }, + { + "name": "capacitance_violations", + "directory": "reports", + "path": "6_finish.rpt", + "pattern": "^max cap violation count[ \\t]+(?P[0-9]+)$", + "maximum": 0 + }, + { + "name": "routing_violations", + "directory": "logs", + "path": "5_2_route.log", + "pattern": "Number of violations = (?P[0-9]+)", + "match": "last", + "maximum": 0 + } + ] +}