From 7fb9b8a6637343efde961ee9f3d0400c3d61a8ab Mon Sep 17 00:00:00 2001 From: Tim 'mithro' Ansell Date: Wed, 2 Jun 2021 11:51:44 -0700 Subject: [PATCH 1/6] run-drc-for-cell-gds-using-magic: Add action.yml By adding an `action.yml` the fact that the action is using docker is hidden and allows us to convert to a javascript action in the future if we want. It also makes handing over the inputs nicer and makes it easier to move between container registries if needed. Signed-off-by: Tim 'mithro' Ansell --- run-drc-for-cell-gds-using-magic/README.rst | 4 +- .../README.src.rst | 4 +- run-drc-for-cell-gds-using-magic/action.yml | 46 +++++++++++++++++++ 3 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 run-drc-for-cell-gds-using-magic/action.yml diff --git a/run-drc-for-cell-gds-using-magic/README.rst b/run-drc-for-cell-gds-using-magic/README.rst index e0ad9d5..7c20f65 100644 --- a/run-drc-for-cell-gds-using-magic/README.rst +++ b/run-drc-for-cell-gds-using-magic/README.rst @@ -19,9 +19,7 @@ Add this to any push, PR or manual dispatch workflow: - uses: actions/checkout@v2 - name: Run DRC for cell GDS (using Magic) - uses: docker://gcr.io/skywater-pdk/actions/run-drc-for-cell-gds-using-magic:latest - with: - args: --acceptable-errors-file /dev/null --match-directories . --known-bad '' + uses: google/skywater-pdk-actions/run-drc-for-cell-gds-using-magic@main Check the Python file for more documentation on arguments. diff --git a/run-drc-for-cell-gds-using-magic/README.src.rst b/run-drc-for-cell-gds-using-magic/README.src.rst index 75734ef..52ee987 100644 --- a/run-drc-for-cell-gds-using-magic/README.src.rst +++ b/run-drc-for-cell-gds-using-magic/README.src.rst @@ -19,9 +19,7 @@ Add this to any push, PR or manual dispatch workflow: - uses: actions/checkout@v2 - name: Run DRC for cell GDS (using Magic) - uses: docker://gcr.io/skywater-pdk/actions/run-drc-for-cell-gds-using-magic:latest - with: - args: --acceptable-errors-file /dev/null --match-directories . --known-bad '' + uses: google/skywater-pdk-actions/run-drc-for-cell-gds-using-magic@main Check the Python file for more documentation on arguments. diff --git a/run-drc-for-cell-gds-using-magic/action.yml b/run-drc-for-cell-gds-using-magic/action.yml new file mode 100644 index 0000000..dd5e06e --- /dev/null +++ b/run-drc-for-cell-gds-using-magic/action.yml @@ -0,0 +1,46 @@ +# Copyright 2020 SkyWater PDK Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the 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. +# +# SPDX-License-Identifier: Apache-2.0 + +name: run-drc-for-cell-gds-using-magic +description: >- + This GitHub action runs Design Rule Checks on all GDS files inside the /cells + directory. + +inputs: + acceptable-errors-file: + description: >- + A file containing a list of newline-delimited acceptable DRC errors. + default: /dev/null + match-directories: + description: >- + A regex that will match subdirectories under cells to be checked. + default: .* + known-bad: + description: >- + List of known bad cells that should be ignored. + default: + + +runs: + using: 'docker' + image: docker://gcr.io/skywater-pdk/actions/run-drc-for-cell-gds-using-magic:main + args: + - --acceptable-errors-file + - ${{ inputs.acceptable-errors-file }} + - --match-directories + - ${{ inputs.match-directories }} + - --known-bad + - ${{ join(inputs.known-bad, ',') }} From 50d3d4c72599a1d3f4396b4488658d5ba1c1c550 Mon Sep 17 00:00:00 2001 From: Tim 'mithro' Ansell Date: Wed, 2 Jun 2021 15:12:52 -0700 Subject: [PATCH 2/6] run-drc-for-cell-gds-using-magic: Enable running in a directory. Add a command line argument to allow the check to look for the `./cells` in a directory other than the current working directory. Signed-off-by: Tim 'mithro' Ansell --- run-drc-for-cell-gds-using-magic/action.yml | 6 ++++++ run-drc-for-cell-gds-using-magic/run_all_drc.py | 13 +++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/run-drc-for-cell-gds-using-magic/action.yml b/run-drc-for-cell-gds-using-magic/action.yml index dd5e06e..d7b39d6 100644 --- a/run-drc-for-cell-gds-using-magic/action.yml +++ b/run-drc-for-cell-gds-using-magic/action.yml @@ -20,6 +20,10 @@ description: >- directory. inputs: + top: + description: >- + What directory to run the check inside. + default: . acceptable-errors-file: description: >- A file containing a list of newline-delimited acceptable DRC errors. @@ -38,6 +42,8 @@ runs: using: 'docker' image: docker://gcr.io/skywater-pdk/actions/run-drc-for-cell-gds-using-magic:main args: + - --top + - ${{ inputs.top }} - --acceptable-errors-file - ${{ inputs.acceptable-errors-file }} - --match-directories diff --git a/run-drc-for-cell-gds-using-magic/run_all_drc.py b/run-drc-for-cell-gds-using-magic/run_all_drc.py index 5adcbcd..9ba9605 100644 --- a/run-drc-for-cell-gds-using-magic/run_all_drc.py +++ b/run-drc-for-cell-gds-using-magic/run_all_drc.py @@ -134,6 +134,13 @@ def drc_gds(path: str) -> Tuple[str, List[DRCError]]: @click.command() +@click.option( + "-t", + "--top", + default=".", + help="Directory to run the process inside." + " Default: Current working directory" +) @click.option( "-a", "--acceptable-errors-file", @@ -156,8 +163,10 @@ def drc_gds(path: str) -> Tuple[str, List[DRCError]]: " thus do not cause a non-zero exit upon failure." " Default: empty string (None of them.)" ) -def run_all_drc(acceptable_errors_file, match_directories, known_bad): - print("Testing cells in directories matching /%s/…" % match_directories) +def run_all_drc(top, acceptable_errors_file, match_directories, known_bad): + os.chdir(top) + print("Testing cells in %s directories matching /%s/…" % ( + os.getcwd(), match_directories)) global acceptable_errors acceptable_errors_str = open(acceptable_errors_file).read() From c9a499e255cc33639e6f33a4e35571a675aaa24a Mon Sep 17 00:00:00 2001 From: Tim 'mithro' Ansell Date: Wed, 2 Jun 2021 15:17:23 -0700 Subject: [PATCH 3/6] run-drc-for-cell-gds-using-magic: Improve regex matching. Fixes #25. Signed-off-by: Tim 'mithro' Ansell --- run-drc-for-cell-gds-using-magic/action.yml | 2 +- run-drc-for-cell-gds-using-magic/run_all_drc.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/run-drc-for-cell-gds-using-magic/action.yml b/run-drc-for-cell-gds-using-magic/action.yml index d7b39d6..1a842d2 100644 --- a/run-drc-for-cell-gds-using-magic/action.yml +++ b/run-drc-for-cell-gds-using-magic/action.yml @@ -31,7 +31,7 @@ inputs: match-directories: description: >- A regex that will match subdirectories under cells to be checked. - default: .* + default: ^.*$ known-bad: description: >- List of known bad cells that should be ignored. diff --git a/run-drc-for-cell-gds-using-magic/run_all_drc.py b/run-drc-for-cell-gds-using-magic/run_all_drc.py index 9ba9605..7ca18bb 100644 --- a/run-drc-for-cell-gds-using-magic/run_all_drc.py +++ b/run-drc-for-cell-gds-using-magic/run_all_drc.py @@ -151,7 +151,7 @@ def drc_gds(path: str) -> Tuple[str, List[DRCError]]: @click.option( "-m", "--match-directories", - default=".", + default="^.*$", help="A regex that will match subdirectories under cells/." " Default: . (matches everything.)" ) @@ -182,7 +182,7 @@ def run_all_drc(top, acceptable_errors_file, match_directories, known_bad): cells = os.listdir(cells_dir) for cell in cells: - if not re.match(match_directories, cell): + if not re.fullmatch(match_directories, cell): print("Skipping directory %s…" % cell) continue From 44ba27e79f69c4dae96c0f111594f1c29522a560 Mon Sep 17 00:00:00 2001 From: Tim 'mithro' Ansell Date: Wed, 2 Jun 2021 17:19:26 -0700 Subject: [PATCH 4/6] run-drc-for-cell-gds-using-magic: Better ignored output. Make an ignored error clear by using a black tick and adding message. Signed-off-by: Tim 'mithro' Ansell --- run-drc-for-cell-gds-using-magic/run_all_drc.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/run-drc-for-cell-gds-using-magic/run_all_drc.py b/run-drc-for-cell-gds-using-magic/run_all_drc.py index 7ca18bb..8af9bc2 100644 --- a/run-drc-for-cell-gds-using-magic/run_all_drc.py +++ b/run-drc-for-cell-gds-using-magic/run_all_drc.py @@ -204,8 +204,13 @@ def run_all_drc(top, acceptable_errors_file, match_directories, known_bad): total += 1 cell_name, errors = future.result() - symbol = "❌" - message = "ERROR" + if cell_name in known_bad_list: + symbol = "✘\ufe0f" + message = "ERROR (ignored as known bad)" + else: + symbol = "❌" + message = "ERROR" + if len(errors) == 0: successes += 1 # This tick is rendered black on all major platforms except for From fa2b71e53d72662a90d355b741edbf9269043159 Mon Sep 17 00:00:00 2001 From: Tim 'mithro' Ansell Date: Wed, 2 Jun 2021 15:21:46 -0700 Subject: [PATCH 5/6] run-drc-for-cell-gds-using-magic: Rename match argument. Rename `match-directories` argument to `match-cells-directories` to better describe what it actually does. Signed-off-by: Tim 'mithro' Ansell --- run-drc-for-cell-gds-using-magic/action.yml | 8 ++--- .../run_all_drc.py | 36 +++++++++++-------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/run-drc-for-cell-gds-using-magic/action.yml b/run-drc-for-cell-gds-using-magic/action.yml index 1a842d2..d1ddf17 100644 --- a/run-drc-for-cell-gds-using-magic/action.yml +++ b/run-drc-for-cell-gds-using-magic/action.yml @@ -28,9 +28,9 @@ inputs: description: >- A file containing a list of newline-delimited acceptable DRC errors. default: /dev/null - match-directories: + match-cell-directories: description: >- - A regex that will match subdirectories under cells to be checked. + A regex that will match cell names to be checked. default: ^.*$ known-bad: description: >- @@ -46,7 +46,7 @@ runs: - ${{ inputs.top }} - --acceptable-errors-file - ${{ inputs.acceptable-errors-file }} - - --match-directories - - ${{ inputs.match-directories }} + - --match-cell-directories + - ${{ inputs.match-cell-directories }} - --known-bad - ${{ join(inputs.known-bad, ',') }} diff --git a/run-drc-for-cell-gds-using-magic/run_all_drc.py b/run-drc-for-cell-gds-using-magic/run_all_drc.py index 8af9bc2..a091cb7 100644 --- a/run-drc-for-cell-gds-using-magic/run_all_drc.py +++ b/run-drc-for-cell-gds-using-magic/run_all_drc.py @@ -150,10 +150,11 @@ def drc_gds(path: str) -> Tuple[str, List[DRCError]]: ) @click.option( "-m", - "--match-directories", + "--match-cell-directories", default="^.*$", - help="A regex that will match subdirectories under cells/." - " Default: . (matches everything.)" + help="A regex that that will match cell names to be checked (which will" + " match subdirectories under cells/)." + " Default: ^.*$ (matches everything)" ) @click.option( "-b", @@ -163,10 +164,16 @@ def drc_gds(path: str) -> Tuple[str, List[DRCError]]: " thus do not cause a non-zero exit upon failure." " Default: empty string (None of them.)" ) -def run_all_drc(top, acceptable_errors_file, match_directories, known_bad): +def run_all_drc( + top, + acceptable_errors_file, + match_cell_directories, + known_bad, + ): + os.chdir(top) print("Testing cells in %s directories matching /%s/…" % ( - os.getcwd(), match_directories)) + os.getcwd(), match_cell_directories)) global acceptable_errors acceptable_errors_str = open(acceptable_errors_file).read() @@ -182,7 +189,7 @@ def run_all_drc(top, acceptable_errors_file, match_directories, known_bad): cells = os.listdir(cells_dir) for cell in cells: - if not re.fullmatch(match_directories, cell): + if not re.fullmatch(match_cell_directories, cell): print("Skipping directory %s…" % cell) continue @@ -204,24 +211,23 @@ def run_all_drc(top, acceptable_errors_file, match_directories, known_bad): total += 1 cell_name, errors = future.result() - if cell_name in known_bad_list: - symbol = "✘\ufe0f" - message = "ERROR (ignored as known bad)" - else: - symbol = "❌" - message = "ERROR" - if len(errors) == 0: successes += 1 # This tick is rendered black on all major platforms except for # Microsoft. symbol = "✔\ufe0f" message = "CLEAN" + elif cell_name in known_bad_list: + symbol = "✘\ufe0f" + message = "ERROR (ignored as known bad)" + else: + symbol = "❌" + message = "ERROR" + exit_code = 65 + print("%-64s %s %s" % (cell_name, symbol, message)) if len(errors) != 0: - if cell_name not in known_bad_list: - exit_code = 65 for error in errors: print("* %s" % error[0]) for line in error[1]: From e89d4b7decb1b6e66361e5d6230df5e7131eb289 Mon Sep 17 00:00:00 2001 From: Tim 'mithro' Ansell Date: Wed, 2 Jun 2021 12:37:38 -0700 Subject: [PATCH 6/6] run-drc-for-cell-gds-using-magic: Testing container locally. Signed-off-by: Tim 'mithro' Ansell --- ...image-run-drc-for-cell-gds-using-magic.yml | 73 ++++++++++++++++++ .../.update-test-action-local.py | 48 ++++++++++++ run-drc-for-cell-gds-using-magic/Makefile | 9 ++- run-drc-for-cell-gds-using-magic/action.yml | 4 +- .../run_all_drc.py | 14 +++- .../tests/action-local/action.yml | 55 +++++++++++++ .../tests/broken/cells/allowed_drc_errors | 1 + .../sky130_fd_sc_hd__clkdlybuf4s15_1.gds | Bin 0 -> 6278 bytes .../sky130_fd_sc_hd__clkdlybuf4s15_2.gds | Bin 0 -> 6724 bytes .../clean_cell/sky130_fd_sc_hd__a211o_1.gds | Bin 0 -> 6488 bytes .../clean_cell/sky130_fd_sc_hd__a211o_2.gds | Bin 0 -> 6706 bytes .../clean_cell/sky130_fd_sc_hd__a211o_4.gds | Bin 0 -> 9202 bytes .../a2111o/sky130_fd_sc_hd__a2111o_1.gds | Bin 0 -> 8838 bytes .../a2111o/sky130_fd_sc_hd__a2111o_2.gds | Bin 0 -> 9206 bytes .../a2111o/sky130_fd_sc_hd__a2111o_4.gds | Bin 0 -> 12500 bytes .../tests/clean/cells/allowed_drc_errors | 3 + 16 files changed, 201 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/test-docker-image-run-drc-for-cell-gds-using-magic.yml create mode 100755 run-drc-for-cell-gds-using-magic/.update-test-action-local.py create mode 100644 run-drc-for-cell-gds-using-magic/tests/action-local/action.yml create mode 120000 run-drc-for-cell-gds-using-magic/tests/broken/cells/allowed_drc_errors create mode 100644 run-drc-for-cell-gds-using-magic/tests/broken/cells/broken_cell/sky130_fd_sc_hd__clkdlybuf4s15_1.gds create mode 100644 run-drc-for-cell-gds-using-magic/tests/broken/cells/broken_cell/sky130_fd_sc_hd__clkdlybuf4s15_2.gds create mode 100644 run-drc-for-cell-gds-using-magic/tests/broken/cells/clean_cell/sky130_fd_sc_hd__a211o_1.gds create mode 100644 run-drc-for-cell-gds-using-magic/tests/broken/cells/clean_cell/sky130_fd_sc_hd__a211o_2.gds create mode 100644 run-drc-for-cell-gds-using-magic/tests/broken/cells/clean_cell/sky130_fd_sc_hd__a211o_4.gds create mode 100644 run-drc-for-cell-gds-using-magic/tests/clean/cells/a2111o/sky130_fd_sc_hd__a2111o_1.gds create mode 100644 run-drc-for-cell-gds-using-magic/tests/clean/cells/a2111o/sky130_fd_sc_hd__a2111o_2.gds create mode 100644 run-drc-for-cell-gds-using-magic/tests/clean/cells/a2111o/sky130_fd_sc_hd__a2111o_4.gds create mode 100644 run-drc-for-cell-gds-using-magic/tests/clean/cells/allowed_drc_errors diff --git a/.github/workflows/test-docker-image-run-drc-for-cell-gds-using-magic.yml b/.github/workflows/test-docker-image-run-drc-for-cell-gds-using-magic.yml new file mode 100644 index 0000000..6f72005 --- /dev/null +++ b/.github/workflows/test-docker-image-run-drc-for-cell-gds-using-magic.yml @@ -0,0 +1,73 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the 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. +# +# SPDX-License-Identifier: Apache-2.0 +name: Test Docker Image for Run DRC for cell GDS (using Magic) Action + +on: + workflow_dispatch: + push: + pull_request: + + +permissions: + contents: read + + +jobs: + + test: + name: Basic Test + + runs-on: ubuntu-latest + + steps: + + - uses: actions/checkout@v2 + + - name: Check tests/action-local/action.yml is up to date + run: | + cd run-drc-for-cell-gds-using-magic + make ./tests/action-local/action.yml + git diff --exit-code --color=always ./tests/action-local/action.yml + + - uses: ./run-drc-for-cell-gds-using-magic/tests/action-local + name: Clean cells should pass. + with: + top: ./run-drc-for-cell-gds-using-magic/tests/clean + + - uses: ./run-drc-for-cell-gds-using-magic/tests/action-local + name: Broken cells is filtered (--known-bad). + with: + top: ./run-drc-for-cell-gds-using-magic/tests/broken + known-bad: sky130_fd_sc_hd__clkdlybuf4s15_1 + + - uses: ./run-drc-for-cell-gds-using-magic/tests/action-local + name: Broken cells is filtered (--match-cells). + with: + top: ./run-drc-for-cell-gds-using-magic/tests/broken + match-cell-directories: clean_cell + + - uses: ./run-drc-for-cell-gds-using-magic/tests/action-local + name: Broken cells should fail. + id: broken-should-fail + continue-on-error: true + with: + top: ./run-drc-for-cell-gds-using-magic/tests/broken + + - name: Error on success + if: steps.broken-should-fail.outcome != 'failure' + run: + echo "The action should have failed!" + exit 1 diff --git a/run-drc-for-cell-gds-using-magic/.update-test-action-local.py b/run-drc-for-cell-gds-using-magic/.update-test-action-local.py new file mode 100755 index 0000000..0a2455e --- /dev/null +++ b/run-drc-for-cell-gds-using-magic/.update-test-action-local.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Copyright 2020 SkyWater PDK Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the 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. +# +# SPDX-License-Identifier: Apache-2.0 + +import pathlib + +__dir__ = pathlib.Path(__file__).parent.resolve() + +src_action_yml = __dir__ / 'action.yml' +dst_action_yml = (__dir__ / 'tests' / 'action-local' / 'action.yml').resolve() + +print('Base action.yml file at:', src_action_yml) +print('Test action.yml file at:', dst_action_yml) + +with open(src_action_yml) as f: + action_data = f.read() + +name = 'run-drc-for-cell-gds-using-magic' +action_data = action_data.replace( + f'image: docker://gcr.io/skywater-pdk/actions/{name}:main', + 'image: ../../Dockerfile', +) + +action_data = action_data.replace( + '\nname:', + """ +# WARNING! Don't modify this file, modify the base `action.yml` file and then +# run `make tests/action-local/action.yml`. + +name:""") + +with open(dst_action_yml, 'w') as f: + f.write(action_data) diff --git a/run-drc-for-cell-gds-using-magic/Makefile b/run-drc-for-cell-gds-using-magic/Makefile index fb408e8..ef26bc8 100644 --- a/run-drc-for-cell-gds-using-magic/Makefile +++ b/run-drc-for-cell-gds-using-magic/Makefile @@ -16,8 +16,15 @@ TOP_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST)))/..) +NAME := run-drc-for-cell-gds-using-magic + +tests/action-local/action.yml: action.yml .update-test-action-local.py + $(TOP_DIR)/$(NAME)/.update-test-action-local.py + +.PHONY: tests/action-local/action.yml + README.rst: README.src.rst $(TOP_DIR)/docs/*.rst $(TOP_DIR)/Makefile - make -C $(TOP_DIR) run-drc-for-cell-gds-using-magic/README.rst + make -C $(TOP_DIR) $(NAME)/README.rst # Redirect everything to the top directory by default. %: diff --git a/run-drc-for-cell-gds-using-magic/action.yml b/run-drc-for-cell-gds-using-magic/action.yml index d1ddf17..46465bd 100644 --- a/run-drc-for-cell-gds-using-magic/action.yml +++ b/run-drc-for-cell-gds-using-magic/action.yml @@ -34,7 +34,7 @@ inputs: default: ^.*$ known-bad: description: >- - List of known bad cells that should be ignored. + Common separated list of known bad cells that should be ignored. default: @@ -49,4 +49,4 @@ runs: - --match-cell-directories - ${{ inputs.match-cell-directories }} - --known-bad - - ${{ join(inputs.known-bad, ',') }} + - ${{ inputs.known-bad }} diff --git a/run-drc-for-cell-gds-using-magic/run_all_drc.py b/run-drc-for-cell-gds-using-magic/run_all_drc.py index a091cb7..6811e66 100644 --- a/run-drc-for-cell-gds-using-magic/run_all_drc.py +++ b/run-drc-for-cell-gds-using-magic/run_all_drc.py @@ -176,8 +176,15 @@ def run_all_drc( os.getcwd(), match_cell_directories)) global acceptable_errors - acceptable_errors_str = open(acceptable_errors_file).read() - acceptable_errors = acceptable_errors_str.split("\n") + acceptable_errors = [] + with open(acceptable_errors_file) as f: + acceptable_errors += f.read().split("\n") + + cells_dir = "./cells" + lib_acceptable_errors_file = os.path.join(cells_dir, 'allowed_drc_errors') + if os.path.exists(lib_acceptable_errors_file): + with open(lib_acceptable_errors_file) as f: + acceptable_errors += f.read().split("\n") known_bad_list = known_bad.split(",") @@ -185,7 +192,6 @@ def run_all_drc( with futures.ThreadPoolExecutor(max_workers=nproc) as executor: future_list = [] - cells_dir = "./cells" cells = os.listdir(cells_dir) for cell in cells: @@ -194,6 +200,8 @@ def run_all_drc( continue cell_dir = os.path.join(cells_dir, cell) + if not os.path.isdir(cell_dir): + continue gds_list = list( filter(lambda x: x.endswith(".gds"), os.listdir(cell_dir)) diff --git a/run-drc-for-cell-gds-using-magic/tests/action-local/action.yml b/run-drc-for-cell-gds-using-magic/tests/action-local/action.yml new file mode 100644 index 0000000..17f369f --- /dev/null +++ b/run-drc-for-cell-gds-using-magic/tests/action-local/action.yml @@ -0,0 +1,55 @@ +# Copyright 2020 SkyWater PDK Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the 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. +# +# SPDX-License-Identifier: Apache-2.0 + +# WARNING! Don't modify this file, modify the base `action.yml` file and then +# run `make tests/action-local/action.yml`. + +name: run-drc-for-cell-gds-using-magic +description: >- + This GitHub action runs Design Rule Checks on all GDS files inside the /cells + directory. + +inputs: + top: + description: >- + What directory to run the check inside. + default: . + acceptable-errors-file: + description: >- + A file containing a list of newline-delimited acceptable DRC errors. + default: /dev/null + match-cell-directories: + description: >- + A regex that will match cell names to be checked. + default: ^.*$ + known-bad: + description: >- + Common separated list of known bad cells that should be ignored. + default: + + +runs: + using: 'docker' + image: ../../Dockerfile + args: + - --top + - ${{ inputs.top }} + - --acceptable-errors-file + - ${{ inputs.acceptable-errors-file }} + - --match-cell-directories + - ${{ inputs.match-cell-directories }} + - --known-bad + - ${{ inputs.known-bad }} diff --git a/run-drc-for-cell-gds-using-magic/tests/broken/cells/allowed_drc_errors b/run-drc-for-cell-gds-using-magic/tests/broken/cells/allowed_drc_errors new file mode 120000 index 0000000..2cfcf43 --- /dev/null +++ b/run-drc-for-cell-gds-using-magic/tests/broken/cells/allowed_drc_errors @@ -0,0 +1 @@ +../../clean/cells/allowed_drc_errors \ No newline at end of file diff --git a/run-drc-for-cell-gds-using-magic/tests/broken/cells/broken_cell/sky130_fd_sc_hd__clkdlybuf4s15_1.gds b/run-drc-for-cell-gds-using-magic/tests/broken/cells/broken_cell/sky130_fd_sc_hd__clkdlybuf4s15_1.gds new file mode 100644 index 0000000000000000000000000000000000000000..b7e4c16d8321c6099a5f24e704cfeb72ac723146 GIT binary patch literal 6278 zcmbuEU5Hgx6vy{HU-#UPQG-h|WkpblWT;sUVu&+I1(W7zS_(RnBGvd3;)6yHR?w%F z5J5#aB_(1J1Vzz9_|i*+gh3QUQV~HuR3P?2P5=K|d);&H%$)70BQw7{Yw!R5uf6s@ z=j=JU%tbDC^Jt`c=OD@5;*RK-&9Irn(F)?urQ(SID?+y4qXq0$B55HmROFX0crg6B( ze`T+KNoV7j&e*Hp*Q>X@jh45u$iJ=i!~8FeT( zI+yon8}C@NO7lNoJ?c;W+I!da%zusKzpz-pzN<+(RuEVNqSpXBUWVt zzN`0Vk3QO>y0~sseYC|W@yh(!kNL;-60t8OZtUHkJ^sl8^-WG1)i+sS4EwVm{gaa= z!dK$PfPZ>MeX~PG^-ZB=9esP{{MnEG*`X2&J}}uk>d>`sZUM z!dK$PfPdqF`ZfoQ>f1PA4Ey(8tG<0FN`$Y(jRF6@Yt^^!gi(E|XZ?M9<@{Tl)VGam zm30upSK`Kie`}Nawt25Orh58PuatPDKkG!_=0J(?mAKLS`}-sI|IF^M$=fdL&jzuX z`E)uTb>BV+M19`{s%!tz`$E<6x{Fb#e_xEcj_1dPXP&=VR{Ily-m(0NfIG8x6gv|; z-WaXd9dAT@>W(StqkmOzjE|_^h$#(DEZ)g|UFapQFJ@3_18B%js7)%gal^k)iYr_|pV zU9IiL+7+rZLO*qW9k+|)Hy=e_II(anBmL3`)sL)SkM>&%#>=$b=q6NeOs?|d8hcMX zx<9?YoH%gj;g_5+N!+2hH;wdw$5Ns9k0KlTYEhU$0Fg{dqSxre9;MZ{hDrU$z_R z%WK<6Uyf_UxRw5_lRP<2734l@z6`ymcs;M}F~~UA$H;d166%v_);6Q)rt`;%SK1u+ zOSBj{d!{#N+=zHtKU6-EHXes=De{G;%kNM-#*Is>_0eIhCDtllT`I`%c^oj*~K^Jd%_ntyz!<{kf0BJ!5FF_1rfxc>Ava@`~^&(Qj@ zALmVdmzcN2je+^+i!|^2n-Y&1es zJLASs{n?Loqu$8+$+(`O`mrDDMtzs4o5YQQ`nAx9`Sm$8w2%|>m2jv_0Kwx zoHygf(EM3v=FR$diJT;E4CLSbNqzfpU!^}uU&f6g|L7(4jaQTiUx^z7{>-zEgER9t z=6oN8xDoNn{lh%D?#$cB^_O{hhSs0`SU2jsMBWlNPM5zwAGP1bUKv3Dxdqc3vHtsU z5AuwE(RQQ5nT9$e^i$_&=OfgC<1|JJ(l7r+{YbXgzb{B1#*Or$-pF_p;~Jr#&R@=d z(RJ!m!}UR5Ql5*rZj4Dy<3{>WXRMf?jGsQH<0hvIrn8~{6XScvKjPX#yOHBkXPh+t zpgf;D?p8kEvuB~hc_n(dVDtjCPa@{&e${?P^e@+=XS}`-QOgfd@AnJx+|>9TV|b=t zU_YUs5&bL2V}2Zu`5387o>D!@aoNup8jrr5SLjuW3%y;9oC z`q9b$@d>Zo1-DZ1R5@XhwBpmbm``ImZ4n literal 0 HcmV?d00001 diff --git a/run-drc-for-cell-gds-using-magic/tests/broken/cells/broken_cell/sky130_fd_sc_hd__clkdlybuf4s15_2.gds b/run-drc-for-cell-gds-using-magic/tests/broken/cells/broken_cell/sky130_fd_sc_hd__clkdlybuf4s15_2.gds new file mode 100644 index 0000000000000000000000000000000000000000..bb1a0d8e5789756078ca047af27ff6f79b5bba0b GIT binary patch literal 6724 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 PSFC^Lkt1QT3`6rDlv4*! literal 0 HcmV?d00001 diff --git a/run-drc-for-cell-gds-using-magic/tests/broken/cells/clean_cell/sky130_fd_sc_hd__a211o_4.gds b/run-drc-for-cell-gds-using-magic/tests/broken/cells/clean_cell/sky130_fd_sc_hd__a211o_4.gds new file mode 100644 index 0000000000000000000000000000000000000000..879002f10875fca268d75625e9241a05e0d66f3a GIT binary patch literal 9202 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 literal 0 HcmV?d00001 diff --git a/run-drc-for-cell-gds-using-magic/tests/clean/cells/a2111o/sky130_fd_sc_hd__a2111o_1.gds b/run-drc-for-cell-gds-using-magic/tests/clean/cells/a2111o/sky130_fd_sc_hd__a2111o_1.gds new file mode 100644 index 0000000000000000000000000000000000000000..b4d1193d85ab55533299b55bd28bdbb5d39e1f1e GIT binary patch literal 8838 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 VPvPMARxio^M+A2!EX-;(`af(9!K(lO literal 0 HcmV?d00001 diff --git a/run-drc-for-cell-gds-using-magic/tests/clean/cells/allowed_drc_errors b/run-drc-for-cell-gds-using-magic/tests/clean/cells/allowed_drc_errors new file mode 100644 index 0000000..e1e13a9 --- /dev/null +++ b/run-drc-for-cell-gds-using-magic/tests/clean/cells/allowed_drc_errors @@ -0,0 +1,3 @@ +All nwells must contain metal-connected N+ taps (nwell.4) +P-diff distance to N-tap must be < 15.0um (LU.3) +N-diff distance to P-tap must be < 15.0um (LU.2) \ No newline at end of file