| # Copyright 2020-2022 Efabless Corporation |
| # |
| # 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 |
| # |
| # http://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. |
| PYTHON_BIN ?= python3 |
| |
| OPENLANE_DIR ?= $(shell pwd) |
| |
| DOCKER_OPTIONS = $(shell $(PYTHON_BIN) ./env.py docker-config) |
| |
| # Allow Configuring Memory Limits |
| ifneq (,$(DOCKER_SWAP)) # Set to -1 for unlimited |
| DOCKER_OPTIONS += --memory-swap=$(DOCKER_SWAP) |
| endif |
| ifneq (,$(DOCKER_MEMORY)) |
| DOCKER_OPTIONS += --memory=$(DOCKER_MEMORY) |
| # To verify: cat /sys/fs/cgroup/memory/memory.limit_in_bytes inside the container |
| endif |
| |
| # Allow using GUIs |
| UNAME_S = $(shell uname -s) |
| ifeq ($(UNAME_S),Linux) |
| DOCKER_OPTIONS += -e DISPLAY=$(DISPLAY) -v /tmp/.X11-unix:/tmp/.X11-unix -v $(HOME)/.Xauthority:/.Xauthority --network host |
| ifneq ("$(wildcard $(HOME)/.openroad)","") |
| DOCKER_OPTIONS += -v $(HOME)/.openroad:/.openroad |
| endif |
| endif |
| |
| THREADS ?= 1 |
| |
| ifneq (,$(ROUTING_CORES)) |
| DOCKER_OPTIONS += -e ROUTING_CORES=$(ROUTING_CORES) |
| endif |
| |
| ifeq ($(OPENLANE_IMAGE_NAME),) |
| OPENLANE_DOCKER_TAG ?= $(shell $(PYTHON_BIN) ./dependencies/get_tag.py) |
| ifneq ($(OPENLANE_DOCKER_TAG),) |
| export OPENLANE_IMAGE_NAME ?= efabless/openlane:$(OPENLANE_DOCKER_TAG) |
| endif |
| endif |
| |
| TEST_DESIGN ?= spm |
| DESIGN_LIST ?= spm |
| QUICK_RUN_DESIGN ?= spm |
| BENCHMARK ?= regression_results/benchmark_results/SW_HD.csv |
| REGRESSION_TAG ?= TEST_SW_HD |
| FASTEST_TEST_SET_TAG ?= FASTEST_TEST_SET |
| EXTENDED_TEST_SET_TAG ?= EXTENDED_TEST_SET |
| PRINT_REM_DESIGNS_TIME ?= 0 |
| |
| SKYWATER_COMMIT ?= $(shell $(PYTHON_BIN) ./dependencies/tool.py sky130 -f commit) |
| OPEN_PDKS_COMMIT ?= $(shell $(PYTHON_BIN) ./dependencies/tool.py open_pdks -f commit) |
| |
| PDK_OPTS = |
| EXTERNAL_PDK_INSTALLATION ?= 1 |
| ifeq ($(EXTERNAL_PDK_INSTALLATION), 1) |
| export PDK_ROOT ?= ./pdks |
| export PDK_ROOT := $(shell $(PYTHON_BIN) -c "import os; print(os.path.realpath('$(PDK_ROOT)'), end='')") |
| PDK_OPTS = -v $(PDK_ROOT):$(PDK_ROOT) -e PDK_ROOT=$(PDK_ROOT) |
| endif |
| |
| export STD_CELL_LIBRARY ?= sky130_fd_sc_hd |
| STD_CELL_OPTS := -e STD_CELL_LIBRARY=$(STD_CELL_LIBRARY) |
| |
| # ./designs is mounted over ./install so env.tcl is not found inside the Docker |
| # container if the user had previously installed it. |
| ENV_START = docker run --rm\ |
| -v $(OPENLANE_DIR):/openlane\ |
| -v $(OPENLANE_DIR)/designs:/openlane/install\ |
| $(PDK_OPTS)\ |
| $(STD_CELL_OPTS)\ |
| $(DOCKER_OPTIONS) |
| |
| ENV_COMMAND = $(ENV_START) $(OPENLANE_IMAGE_NAME) |
| |
| .DEFAULT_GOAL := all |
| |
| .PHONY: all |
| all: get-openlane pdk |
| |
| .PHONY: openlane |
| openlane: venv/created |
| @PYTHON_BIN=$(PWD)/venv/bin/$(PYTHON_BIN) $(MAKE) -C docker openlane |
| |
| pull-openlane: |
| @docker pull $(OPENLANE_IMAGE_NAME) |
| |
| get-openlane: |
| @$(MAKE) pull-openlane || $(MAKE) openlane |
| |
| .PHONY: mount |
| mount: |
| cd $(OPENLANE_DIR) && \ |
| $(ENV_START) -ti $(OPENLANE_IMAGE_NAME) |
| |
| .PHONY: pdk |
| pdk: venv/created |
| ./venv/bin/$(PYTHON_BIN) -m pip install --upgrade --no-cache-dir volare |
| ./venv/bin/volare enable |
| |
| .PHONY: survey |
| survey: |
| $(PYTHON_BIN) ./env.py issue-survey |
| |
| venv/created: ./requirements.txt ./dependencies/python/precompile_time.txt ./dependencies/python/run_time.txt |
| rm -rf ./venv |
| $(PYTHON_BIN) -m venv ./venv |
| ./venv/bin/$(PYTHON_BIN) -m pip install --upgrade --no-cache-dir pip |
| ./venv/bin/$(PYTHON_BIN) -m pip install --upgrade --no-cache-dir -r ./requirements.txt |
| touch $@ |
| |
| DLTAG=custom_design_List |
| .PHONY: test_design_list fastest_test_set extended_test_set |
| fastest_test_set: DESIGN_LIST=$(shell cat ./.github/test_sets/fastest_test_set) |
| fastest_test_set: DLTAG=$(FASTEST_TEST_SET_TAG) |
| fastest_test_set: test_design_list |
| extended_test_set: DESIGN_LIST=$(shell cat ./.github/test_sets/extended_test_set) |
| extended_test_set: DLTAG=$(EXTENDED_TEST_SET_TAG) |
| extended_test_set: test_design_list |
| test_design_list: |
| cd $(OPENLANE_DIR) && \ |
| $(ENV_COMMAND) sh -c "\ |
| python3 run_designs.py\ |
| --tag $(DLTAG)\ |
| --threads $(THREADS)\ |
| --print_rem $(PRINT_REM_DESIGNS_TIME)\ |
| --benchmark $(BENCHMARK)\ |
| $(DESIGN_LIST)\ |
| " |
| # -u is needed, as the python buffers the stdout, so no output is generated |
| run_issue_regression: |
| cd $(OPENLANE_DIR) && \ |
| $(ENV_COMMAND) sh -c "\ |
| python3 -u run_issue_regressions.py run $(ISSUE_REGRESSION_DESIGN)" |
| |
| issue_regression_all: |
| cd $(OPENLANE_DIR) && \ |
| $(ENV_COMMAND) sh -c "\ |
| python3 -u run_issue_regressions.py run_all" |
| |
| .PHONY: test |
| test: |
| cd $(OPENLANE_DIR) && \ |
| $(ENV_COMMAND) sh -c "./flow.tcl -design $(TEST_DESIGN) -tag openlane_test -overwrite" |
| @[ -f $(OPENLANE_DIR)/designs/$(TEST_DESIGN)/runs/openlane_test/results/signoff/$(TEST_DESIGN).gds ] && \ |
| echo "Basic test passed" || \ |
| echo "Basic test failed" |
| |
| .PHONY: quick_run |
| quick_run: |
| cd $(OPENLANE_DIR) && \ |
| $(ENV_COMMAND) sh -c "./flow.tcl -design $(QUICK_RUN_DESIGN)" |
| |
| .PHONY: veryclean clean_runs clean_results |
| veryclean: |
| @git clean -fdX |
| |
| clean_runs: |
| @rm -rf ./designs/*/runs && rm -rf ./_build/it_tc_logs && echo "Runs cleaned successfully." || echo "Failed to delete runs." |
| @rm -rf ./tests/*/runs && echo "Test runs cleaned successfully." || echo "Failed to delete test runs." |
| |
| clean_results: |
| @{ find regression_results -mindepth 1 -maxdepth 1 -type d | grep -v benchmark | xargs rm -rf ; } && echo "Results cleaned successfully." || echo "Failed to delete results." |