blob: 381c7123ef3a3634447e0b9249e6a2a1ca45031b [file] [log] [blame]
# Copyright 2022 Mabrains
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#=========================================================================
# ---------------------------------- LVS ---------------------------------
#=========================================================================
SHELL := /bin/bash
Testing_DIR ?= $(shell realpath .)
PDK_ROOT := $(shell realpath ../..)
TESTCASES_DIR := $(shell realpath ./testcases)
SC_TESTCASES_DIR := $(shell realpath ./testcases/sc_testcases)
PDK := $(shell basename `realpath ..`)
run_folder := $(shell realpath $$(date +'run_%Y_%m_%d_%H_%M'))
MAIN := $(wildcard testcases/pass_cases/*.cdl)
CASES := $(MAIN:testcases/pass_cases/%.cdl=test_lvs_main_local_%)
MAIN_CONN := $(wildcard testcases/connectivity_test/*.gds)
CONN_CASES := $(MAIN_CONN:testcases/connectivity_test/%.gds=test_conn_%)
SC_HD := $(wildcard testcases/sc_testcases/hd/*.cdl)
SC_HD_GHA := $(SC_HD:testcases/sc_testcases/hd/%.cdl=test_lvs_sc_gha_%)
SC_HD_LOCAL := $(SC_HD:testcases/sc_testcases/hd/%.cdl=test_lvs_sc_local_%)
SC_HDLL := $(wildcard testcases/sc_testcases/hdll/*.cdl)
SC_HDLL_GHA := $(SC_HDLL:testcases/sc_testcases/hdll/%.cdl=test_lvs_sc_gha_%)
SC_HDLL_LOCAL := $(SC_HDLL:testcases/sc_testcases/hdll/%.cdl=test_lvs_sc_local_%)
SC_HS := $(wildcard testcases/sc_testcases/hs/*.cdl)
SC_HS_GHA := $(SC_HS:testcases/sc_testcases/hs/%.cdl=test_lvs_sc_gha_%)
SC_HS_LOCAL := $(SC_HS:testcases/sc_testcases/hs/%.cdl=test_lvs_sc_local_%)
SC_HVL := $(wildcard testcases/sc_testcases/hvl/*.cdl)
SC_HVL_GHA := $(SC_HVL:testcases/sc_testcases/hvl/%.cdl=test_lvs_sc_gha_%)
SC_HVL_LOCAL := $(SC_HVL:testcases/sc_testcases/hvl/%.cdl=test_lvs_sc_local_%)
SC_LP := $(wildcard testcases/sc_testcases/lp/*.cdl)
SC_LP_GHA := $(SC_LP:testcases/sc_testcases/lp/%.cdl=test_lvs_sc_gha_%)
SC_LP_LOCAL := $(SC_LP:testcases/sc_testcases/lp/%.cdl=test_lvs_sc_local_%)
SC_LS := $(wildcard testcases/sc_testcases/ls/*.cdl)
SC_LS_GHA := $(SC_LS:testcases/sc_testcases/ls/%.cdl=test_lvs_sc_gha_%)
SC_LS_LOCAL := $(SC_LS:testcases/sc_testcases/ls/%.cdl=test_lvs_sc_local_%)
SC_MS := $(wildcard testcases/sc_testcases/ms/*.cdl)
SC_MS_GHA := $(SC_MS:testcases/sc_testcases/ms/%.cdl=test_lvs_sc_gha_%)
SC_MS_LOCAL := $(SC_MS:testcases/sc_testcases/ms/%.cdl=test_lvs_sc_local_%)
.DEFAULT_GOAL := all
all: test_lvs_main test_lvs_collective test_lvs_connectivity
#=================================
# -------- TEST MAIN LVS ---------
#=================================
.ONESHELL:
$(run_folder):
@echo "## Our current Run folder: $(run_folder)"
@mkdir -p $(run_folder)
.phony:
test_lvs_main_gha_%: $(run_folder)
@$(Testing_DIR)/run_test_case.sh $* $(PDK_ROOT) $(PDK) $(TESTCASES_DIR) $(run_folder) GHA
.ONESHELL:
test_lvs_main_local_%: $(run_folder)
@$(Testing_DIR)/run_test_case.sh $* $(PDK_ROOT) $(PDK) $(TESTCASES_DIR) $(run_folder) LOCAL
nfet:
@$(eval SUB_MAIN := $(wildcard testcases/pass_cases/*nfet*.cdl))
@$(eval SUB_CASES := $(SUB_MAIN:testcases/pass_cases/%.cdl=test_lvs_main_local_%))
@$(MAKE) $(SUB_CASES)
pfet:
@$(eval SUB_MAIN := $(wildcard testcases/pass_cases/*pfet*.cdl))
@$(eval SUB_CASES := $(SUB_MAIN:testcases/pass_cases/%.cdl=test_lvs_main_local_%))
@$(MAKE) $(SUB_CASES)
BJT:
@$(eval SUB_MAIN := $(wildcard testcases/pass_cases/*__npn*.cdl))
@$(eval SUB_MAIN += $(wildcard testcases/pass_cases/*__pnp*.cdl))
@$(eval SUB_CASES := $(SUB_MAIN:testcases/pass_cases/%.cdl=test_lvs_main_local_%))
@$(MAKE) $(SUB_CASES)
# RF_BJT:
# @$(eval SUB_MAIN := $(wildcard testcases/pass_cases/*rf_npn*.cdl))
# @$(eval SUB_CASES := $(SUB_MAIN:testcases/pass_cases/%.cdl=test_lvs_main_local_%))
# @$(MAKE) $(SUB_CASES)
diode:
@$(eval SUB_MAIN := $(wildcard testcases/pass_cases/*diode*.cdl))
@$(eval SUB_CASES := $(SUB_MAIN:testcases/pass_cases/%.cdl=test_lvs_main_local_%))
@$(MAKE) $(SUB_CASES)
resistor:
@$(eval SUB_MAIN := $(wildcard testcases/pass_cases/*res*.cdl))
@$(eval SUB_CASES := $(SUB_MAIN:testcases/pass_cases/%.cdl=test_lvs_main_local_%))
@$(MAKE) $(SUB_CASES)
cap_var:
@$(eval SUB_MAIN := $(wildcard testcases/pass_cases/*cap_var*.cdl))
@$(eval SUB_CASES := $(SUB_MAIN:testcases/pass_cases/%.cdl=test_lvs_main_local_%))
@$(MAKE) $(SUB_CASES)
cap_mim:
@$(eval SUB_MAIN := $(wildcard testcases/pass_cases/*cap_mim*.cdl))
@$(eval SUB_CASES := $(SUB_MAIN:testcases/pass_cases/%.cdl=test_lvs_main_local_%))
@$(MAKE) $(SUB_CASES)
inductor:
@$(eval SUB_MAIN := $(wildcard testcases/pass_cases/*coil*.cdl))
@$(eval SUB_CASES := $(SUB_MAIN:testcases/pass_cases/%.cdl=test_lvs_main_local_%))
@$(MAKE) $(SUB_CASES)
cap_vpp:
@$(eval SUB_MAIN := $(wildcard testcases/pass_cases/*cap_vpp*.cdl))
@$(eval SUB_CASES := $(SUB_MAIN:testcases/pass_cases/%.cdl=test_lvs_main_local_%))
@$(MAKE) $(SUB_CASES)
sonos:
@$(eval SUB_MAIN := $(wildcard testcases/pass_cases/*sonos*.cdl))
@$(eval SUB_CASES := $(SUB_MAIN:testcases/pass_cases/%.cdl=test_lvs_main_gha_%))
@$(MAKE) $(SUB_CASES)
.ONESHELL:
test_lvs_main: $(run_folder) $(CASES)
@echo "Congratulations! Testing main LVS has finished successfully"
#=================================
# ------ TEST COLLISION LVS ------
#=================================
.ONESHELL:
test_lvs_collision: $(run_folder)
@echo "## Running collision testing"
@cd $(Testing_DIR)
@if python3 $(PDK_ROOT)/$(PDK)/run_lvs.py --design=testcases/collision_test/collision.gds --net=collision.cdl --report=$(run_folder)/collision --lvs_sub=SUBSTRATE > $(run_folder)/collision_results.log 2>&1 ; \
then echo "Congratulations! Testing collision LVS has finished successfully"; else echo "Testing collision LVS has failed."; exit 1 ; fi
#=================================
# ---- TEST CONNECTIVITY LVS -----
#=================================
.ONESHELL:
test_conn_%:
@echo "## Running connectivity testing for $*"
@cd $(Testing_DIR)
@mkdir -p $(run_folder)/connectivity_test
@file=`readlink -f testcases/connectivity_test/$*.gds`
@cdl=`readlink -f testcases/connectivity_test/$*.cdl`
@if python3 $(PDK_ROOT)/$(PDK)/run_lvs.py --design=$$file --net=$*.cdl --report=$(run_folder)/connectivity_test/$* --lvs_sub=SUB_SRC_D1 > $(run_folder)/connectivity_test/$*_run.log 2>&1 ;
then echo "Congratulations! Connectivity test has finished successfully" ; else echo "Connectivity test has failed"; exit 1; fi
.ONESHELL:
test_lvs_connectivity: $(CONN_CASES)
@echo "Congratulations! Testing connectivity LVS is finished successfully"
#=================================
# -------- TEST SC LVS ---------
#=================================
.phony:
test_lvs_sc_gha_%: $(run_folder)
@$(Testing_DIR)/run_test_case.sh $* $(PDK_ROOT) $(PDK) $(SC_TESTCASES_DIR) $(run_folder) GHA VNB $(word 4,$(subst _, ,$*)) SC
.phony:
test_lvs_sc_local_%: $(run_folder)
@$(Testing_DIR)/run_test_case.sh $* $(PDK_ROOT) $(PDK) $(SC_TESTCASES_DIR) $(run_folder) LOCAL VNB $(word 4,$(subst _, ,$*)) SC
.ONESHELL:
test_lvs_sc: test_lvs_hd_sc test_lvs_hdll_sc test_lvs_hs_sc test_lvs_hvl_sc test_lvs_lp_sc test_lvs_ls_sc test_lvs_ms_sc
@echo "Congratulations! Testing All SC LVS has finished successfully"
.ONESHELL:
test_lvs_sc_local: test_lvs_hd_sc_local test_lvs_hdll_sc_local test_lvs_hs_sc_local test_lvs_hvl_sc_local test_lvs_lp_sc_local test_lvs_ls_sc_local test_lvs_ms_sc_local
@echo "Congratulations! Testing All SC LVS has finished successfully"
.ONESHELL:
test_lvs_hd_sc: $(run_folder) $(SC_HD_GHA)
@echo "Congratulations! Testing HD SC LVS has finished successfully"
.ONESHELL:
test_lvs_hd_sc_local: $(run_folder) $(SC_HD_LOCAL)
@echo "Congratulations! Testing HD SC LVS has finished successfully"
.ONESHELL:
test_lvs_hdll_sc: $(run_folder) $(SC_HDLL_GHA)
@echo "Congratulations! Testing HDLL SC LVS has finished successfully"
.ONESHELL:
test_lvs_hdll_sc_local: $(run_folder) $(SC_HDLL_LOCAL)
@echo "Congratulations! Testing HDLL SC LVS has finished successfully"
.ONESHELL:
test_lvs_hs_sc: $(run_folder) $(SC_HS_GHA)
@echo "Congratulations! Testing HS SC LVS has finished successfully"
.ONESHELL:
test_lvs_hs_sc_local: $(run_folder) $(SC_HS_LOCAL)
@echo "Congratulations! Testing HS SC LVS has finished successfully"
.ONESHELL:
test_lvs_hvl_sc: $(run_folder) $(SC_HVL_GHA)
@echo "Congratulations! Testing HVL SC LVS has finished successfully"
.ONESHELL:
test_lvs_hvl_sc_local: $(run_folder) $(SC_HVL_LOCAL)
@echo "Congratulations! Testing HVL SC LVS has finished successfully"
.ONESHELL:
test_lvs_lp_sc: $(run_folder) $(SC_LP_GHA)
@echo "Congratulations! Testing LP SC LVS has finished successfully"
.ONESHELL:
test_lvs_lp_sc_local: $(run_folder) $(SC_LP_LOCAL)
@echo "Congratulations! Testing LP SC LVS has finished successfully"
.ONESHELL:
test_lvs_ls_sc: $(run_folder) $(SC_LS_GHA)
@echo "Congratulations! Testing LS SC LVS has finished successfully"
.ONESHELL:
test_lvs_ls_sc_local: $(run_folder) $(SC_LS_LOCAL)
@echo "Congratulations! Testing LS SC LVS has finished successfully"
.ONESHELL:
test_lvs_ms_sc: $(run_folder) $(SC_MS_GHA)
@echo "Congratulations! Testing MS SC LVS has finished successfully"
.ONESHELL:
test_lvs_ms_sc_local: $(run_folder) $(SC_MS_LOCAL)
@echo "Congratulations! Testing MS SC LVS has finished successfully"
#==========================
# --------- HELP ----------
#==========================
# Help Target
help:
@echo "\n ==== The following are some of the valid targets for this Makefile ====\n"
@echo "... all (the default if no target is provided )"
@echo "... test_lvs_main (To run main lvs regression for all devices )"
@echo "... test_lvs_collective (To run collective lvs regression for all devices )"
@echo "... test_lvs_connectivity (To run connectivity lvs regression for all devices )"
@echo "... test_lvs_sc (To run standard cells lvs regression for all devices )"