2021-08-18 20:21:52 +02:00
|
|
|
TOP_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
|
2021-11-02 19:10:59 +01:00
|
|
|
include $(TOP_DIR)/openram.mk
|
2021-08-18 20:21:52 +02:00
|
|
|
|
2021-11-02 19:10:59 +01:00
|
|
|
.DEFAULT_GOAL := install
|
2021-08-18 20:21:52 +02:00
|
|
|
|
2023-06-24 05:59:28 +02:00
|
|
|
# Set the shell here
|
|
|
|
|
SHELL := /bin/bash
|
|
|
|
|
|
2021-08-18 20:21:52 +02:00
|
|
|
# Skywater PDK SRAM library
|
2021-11-02 23:07:18 +01:00
|
|
|
SRAM_LIB_DIR ?= $(PDK_ROOT)/sky130_fd_bd_sram
|
2022-06-16 20:23:13 +02:00
|
|
|
# Use this for release
|
2022-02-23 19:19:46 +01:00
|
|
|
SRAM_LIB_GIT_REPO ?= https://github.com/vlsida/sky130_fd_bd_sram.git
|
2022-06-16 20:23:13 +02:00
|
|
|
# Use this for development
|
|
|
|
|
#SRAM_LIB_GIT_REPO ?= git@github.com:VLSIDA/sky130_fd_bd_sram.git
|
2022-02-23 19:19:46 +01:00
|
|
|
#SRAM_LIB_GIT_REPO ?= https://github.com/google/skywater-pdk-libs-sky130_fd_bd_sram.git
|
2023-11-01 02:07:35 +01:00
|
|
|
SRAM_LIB_GIT_COMMIT ?= dd64256961317205343a3fd446908b42bafba388
|
2021-10-28 17:43:28 +02:00
|
|
|
|
2021-11-08 18:31:56 +01:00
|
|
|
SKY130_PDK ?= $(PDK_ROOT)/sky130A
|
2023-12-23 15:32:09 +01:00
|
|
|
GF180_PDK ?= $(PDK_ROOT)/gf180mcuD
|
|
|
|
|
|
2025-06-26 21:21:06 +02:00
|
|
|
# Ciel SKY130 PDK
|
|
|
|
|
SKY130_CIEL = e8294524e5f67c533c5d0c3afa0bcc5b2a5fa066 # 2022.07.29
|
2023-12-23 15:32:09 +01:00
|
|
|
|
2025-06-26 21:21:06 +02:00
|
|
|
# Ciel GF180 PDK
|
|
|
|
|
GF180_CIEL = cd1748bb197f9b7af62a54507de6624e30363943 # 2023.12.04
|
2021-08-18 20:21:52 +02:00
|
|
|
|
2021-12-29 23:41:55 +01:00
|
|
|
# Skywater PDK
|
|
|
|
|
SKY130_PDKS_DIR ?= $(PDK_ROOT)/skywater-pdk
|
|
|
|
|
SKY130_PDKS_GIT_REPO ?= https://github.com/google/skywater-pdk.git
|
2022-05-23 19:34:12 +02:00
|
|
|
SKY130_PDKS_GIT_COMMIT ?= f70d8ca46961ff92719d8870a18a076370b85f6c
|
2021-08-18 20:21:52 +02:00
|
|
|
|
2023-01-10 01:02:25 +01:00
|
|
|
# GF180 PDK
|
|
|
|
|
GF180_PDKS_DIR ?= $(PDK_ROOT)/gf180mcu-pdk
|
|
|
|
|
GF180_PDKS_GIT_REPO ?= https://github.com/google/gf180mcu-pdk.git
|
|
|
|
|
GF180_PDKS_GIT_COMMIT ?= main
|
|
|
|
|
|
2021-08-18 20:21:52 +02:00
|
|
|
# Create lists of all the files to copy/link
|
2021-11-02 23:07:18 +01:00
|
|
|
GDS_FILES := $(sort $(wildcard $(SRAM_LIB_DIR)/cells/*/*.gds))
|
2022-06-22 18:53:10 +02:00
|
|
|
GDS_FILES := $(GDS_FILES) $(PDK_ROOT)/skywater-pdk/libraries/sky130_fd_sc_hd/latest/cells/dlxtn/sky130_fd_sc_hd__dlxtn_1.gds
|
2021-11-02 23:07:18 +01:00
|
|
|
MAG_FILES := $(sort $(wildcard $(SRAM_LIB_DIR)/cells/*/*.mag))
|
2021-08-18 20:21:52 +02:00
|
|
|
|
|
|
|
|
SPICE_SUFFIX := spice
|
|
|
|
|
SPICE_LVS_SUFFIX := lvs.$(SPICE_SUFFIX)
|
|
|
|
|
SPICE_CALIBRE_SUFFIX := lvs.calibre.$(SPICE_SUFFIX)
|
2022-02-11 22:48:52 +01:00
|
|
|
SPICE_KLAYOUT_SUFFIX := lvs.klayout.$(SPICE_SUFFIX)
|
2021-08-18 20:21:52 +02:00
|
|
|
SPICE_BASE_SUFFIX := base.$(SPICE_SUFFIX)
|
2021-11-02 23:07:18 +01:00
|
|
|
ALL_SPICE_FILES := $(sort $(wildcard $(SRAM_LIB_DIR)/cells/*/*.$(SPICE_SUFFIX)))
|
2022-06-22 18:53:10 +02:00
|
|
|
ALL_SPICE_FILES := $(ALL_SPICE_FILES) $(PDK_ROOT)/skywater-pdk/libraries/sky130_fd_sc_hd/latest/cells/dlxtn/sky130_fd_sc_hd__dlxtn_1.spice
|
2021-08-18 20:21:52 +02:00
|
|
|
|
|
|
|
|
MAGLEF_SUFFIX := maglef
|
2021-11-02 23:07:18 +01:00
|
|
|
MAGLEF_FILES := $(sort $(wildcard $(SRAM_LIB_DIR)/cells/*/*.$(MAGLEF_SUFFIX)))
|
2021-08-18 20:21:52 +02:00
|
|
|
|
2021-11-02 23:07:18 +01:00
|
|
|
MAGICRC_FILE := $(SKY130_PDK)/libs.tech/magic/sky130A.magicrc
|
2021-08-18 20:21:52 +02:00
|
|
|
|
|
|
|
|
ALL_FILES := $(ALL_SPICE_FILES) $(GDS_FILES) $(MAG_FILES) $(MAGLEF_FILES)
|
|
|
|
|
|
2022-02-03 19:19:28 +01:00
|
|
|
INSTALL_BASE_DIRS := gds_lib mag_lib sp_lib lvs_lib calibre_lvs_lib klayout_lvs_lib maglef_lib
|
2021-08-18 20:21:52 +02:00
|
|
|
INSTALL_BASE := $(OPENRAM_HOME)/../technology/sky130
|
|
|
|
|
INSTALL_DIRS := $(addprefix $(INSTALL_BASE)/,$(INSTALL_BASE_DIRS))
|
|
|
|
|
|
2025-06-26 21:21:06 +02:00
|
|
|
# If conda is installed, we will use ciel from there
|
2023-04-29 00:13:32 +02:00
|
|
|
CONDA_DIR := $(wildcard $(TOP_DIR)/miniconda)
|
2023-04-14 18:55:49 +02:00
|
|
|
|
2021-12-29 23:41:55 +01:00
|
|
|
check-pdk-root:
|
|
|
|
|
ifndef PDK_ROOT
|
|
|
|
|
$(error PDK_ROOT is undefined, please export it before running make)
|
|
|
|
|
endif
|
|
|
|
|
|
2022-02-23 19:19:46 +01:00
|
|
|
$(SKY130_PDKS_DIR): check-pdk-root
|
2022-06-21 21:10:15 +02:00
|
|
|
@echo "Cloning skywater PDK..."
|
|
|
|
|
@[ -d $(PDK_ROOT)/skywater-pdk ] || \
|
|
|
|
|
git clone https://github.com/google/skywater-pdk.git $(PDK_ROOT)/skywater-pdk
|
2022-11-28 20:47:35 +01:00
|
|
|
@git -C $(SKY130_PDKS_DIR) checkout $(SKY130_PDKS_GIT_COMMIT) && \
|
|
|
|
|
git -C $(SKY130_PDKS_DIR) submodule update --init libraries/sky130_fd_pr/latest libraries/sky130_fd_sc_hd/latest
|
2021-12-29 23:41:55 +01:00
|
|
|
|
2023-01-10 01:02:25 +01:00
|
|
|
$(GF180_PDKS_DIR): check-pdk-root
|
|
|
|
|
@echo "Cloning gf PDK..."
|
|
|
|
|
@[ -d $(PDK_ROOT)/gf180mcu-pdk ] || \
|
|
|
|
|
git clone https://github.com/google/gf180mcu-pdk.git $(PDK_ROOT)/gf180mcu-pdk
|
2023-02-26 21:36:19 +01:00
|
|
|
@cd $(GF180_PDKS_DIR) && \
|
2023-01-10 01:02:25 +01:00
|
|
|
git checkout main && git pull && \
|
|
|
|
|
git checkout -qf $(GF180_PDKS_GIT_COMMIT) && \
|
2023-02-26 21:36:19 +01:00
|
|
|
git submodule update --init libraries/gf180mcu_fd_pr/latest libraries/gf180mcu_fd_sc_mcu7t5v0/latest libraries/gf180mcu_fd_sc_mcu9t5v0/latest
|
|
|
|
|
|
2021-12-29 23:41:55 +01:00
|
|
|
$(SRAM_LIB_DIR): check-pdk-root
|
2022-06-21 21:10:15 +02:00
|
|
|
@echo "Cloning SRAM library..."
|
2022-11-28 20:47:35 +01:00
|
|
|
@[ -d $(SRAM_LIB_DIR) ] || \
|
|
|
|
|
git clone $(SRAM_LIB_GIT_REPO) $(SRAM_LIB_DIR)
|
2023-07-18 19:48:22 +02:00
|
|
|
@git -C $(SRAM_LIB_DIR) fetch
|
2022-11-28 20:47:35 +01:00
|
|
|
@git -C $(SRAM_LIB_DIR) checkout $(SRAM_LIB_GIT_COMMIT)
|
2021-12-29 23:41:55 +01:00
|
|
|
|
2023-12-23 15:32:09 +01:00
|
|
|
sky130-install: $(SRAM_LIB_DIR)
|
2021-12-29 23:41:55 +01:00
|
|
|
@[ -d $(PDK_ROOT)/sky130A ] || \
|
2023-12-23 15:32:09 +01:00
|
|
|
(echo "Warning: $(PDK_ROOT)/sky130A not found!! Run make sky130-pdk first." && false)
|
2021-12-29 23:41:55 +01:00
|
|
|
@[ -d $(PDK_ROOT)/skywater-pdk ] || \
|
2023-12-23 15:32:09 +01:00
|
|
|
(echo "Warning: $(PDK_ROOT)/skywater-pdk not found!! Run make sky130-pdk first." && false)
|
2021-08-18 20:21:52 +02:00
|
|
|
@echo "Installing sky130 SRAM PDK..."
|
|
|
|
|
@echo "PDK_ROOT='$(PDK_ROOT)'"
|
2021-11-02 23:07:18 +01:00
|
|
|
@echo "SRAM_LIB_DIR='$(SRAM_LIB_DIR)'"
|
|
|
|
|
@echo "SKY130_PDK='$(SKY130_PDK)'"
|
2021-12-29 23:41:55 +01:00
|
|
|
@make $(INSTALL_DIRS)
|
2023-12-23 15:32:09 +01:00
|
|
|
.PHONY: sky130-install
|
2021-08-18 20:21:52 +02:00
|
|
|
|
2023-12-23 15:32:09 +01:00
|
|
|
sky130-pdk: $(SKY130_PDKS_DIR)
|
2025-06-26 21:21:06 +02:00
|
|
|
@echo "Installing SKY130 via ciel..."
|
2023-12-23 15:32:09 +01:00
|
|
|
ifeq ($(CONDA_DIR),)
|
2025-06-26 21:21:06 +02:00
|
|
|
ciel enable --pdk sky130 $(SKY130_CIEL)
|
2023-12-23 15:32:09 +01:00
|
|
|
else
|
|
|
|
|
source $(TOP_DIR)/miniconda/bin/activate && \
|
2025-06-26 21:21:06 +02:00
|
|
|
ciel enable --pdk sky130 $(SKY130_CIEL) && \
|
2023-12-23 15:32:09 +01:00
|
|
|
conda deactivate
|
|
|
|
|
endif
|
|
|
|
|
.PHONY: sky130-pdk
|
2021-08-18 20:21:52 +02:00
|
|
|
|
2023-12-23 15:32:09 +01:00
|
|
|
gf180mcu-pdk:
|
2025-06-26 21:21:06 +02:00
|
|
|
@echo "Installing GF180 via ciel..."
|
2023-12-23 15:32:09 +01:00
|
|
|
ifeq ($(CONDA_DIR),)
|
2025-06-26 21:21:06 +02:00
|
|
|
ciel enable --pdk gf180mcu $(GF180_CIEL)
|
2023-12-23 15:32:09 +01:00
|
|
|
else
|
|
|
|
|
source $(TOP_DIR)/miniconda/bin/activate && \
|
2025-06-26 21:21:06 +02:00
|
|
|
ciel enable --pdk gf180mcu $(GF180_CIEL) && \
|
2023-12-23 15:32:09 +01:00
|
|
|
conda deactivate
|
|
|
|
|
endif
|
|
|
|
|
.PHONY: gf180mcu-pdk
|
2023-11-07 09:56:16 +01:00
|
|
|
|
2021-08-18 20:21:52 +02:00
|
|
|
$(INSTALL_BASE)/gds_lib: $(GDS_FILES)
|
|
|
|
|
@echo
|
|
|
|
|
@echo "Setting up GDS cell library for OpenRAM."
|
|
|
|
|
@echo "=================================================================="
|
|
|
|
|
mkdir -p $@
|
2021-11-02 23:07:18 +01:00
|
|
|
cp -va $? $@
|
2021-08-18 20:21:52 +02:00
|
|
|
@echo "=================================================================="
|
|
|
|
|
@echo
|
|
|
|
|
|
|
|
|
|
$(INSTALL_BASE)/mag_lib: $(MAG_FILES)
|
|
|
|
|
@echo
|
|
|
|
|
@echo "Setting up MAG files for OpenRAM."
|
|
|
|
|
@echo "=================================================================="
|
|
|
|
|
mkdir -p $@
|
|
|
|
|
@cp -va $? $@
|
|
|
|
|
@echo
|
|
|
|
|
cp -f $(MAGICRC_FILE) $(INSTALL_BASE)/tech/.magicrc
|
|
|
|
|
cp -f $(MAGICRC_FILE) $(INSTALL_BASE)/mag_lib/.magicrc
|
|
|
|
|
@echo "=================================================================="
|
|
|
|
|
@echo
|
|
|
|
|
|
|
|
|
|
$(INSTALL_BASE)/maglef_lib: $(MAGLEF_FILES)
|
|
|
|
|
@echo
|
|
|
|
|
@echo "Setting up MAGLEF cell library for OpenRAM."
|
|
|
|
|
@echo "=================================================================="
|
|
|
|
|
mkdir -p $@
|
|
|
|
|
@for SP in $?; do \
|
|
|
|
|
cp -va $$SP $@/$$(basename $$SP .$(MAGLEF_SUFFIX)).mag; \
|
|
|
|
|
done
|
|
|
|
|
@echo
|
|
|
|
|
cp -f $(MAGICRC_FILE) $(INSTALL_BASE)/maglef_lib/.magicrc
|
|
|
|
|
@echo "=================================================================="
|
|
|
|
|
@echo
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$(INSTALL_BASE)/lvs_lib: $(filter %.$(SPICE_LVS_SUFFIX),$(ALL_SPICE_FILES))
|
|
|
|
|
@echo
|
|
|
|
|
@echo "Setting up LVS cell library for OpenRAM."
|
|
|
|
|
@echo "=================================================================="
|
|
|
|
|
mkdir -p $@
|
|
|
|
|
@for SP in $?; do \
|
|
|
|
|
cp -va $$SP $@/$$(basename $$SP .$(SPICE_LVS_SUFFIX)).sp; \
|
|
|
|
|
done
|
|
|
|
|
@echo "=================================================================="
|
|
|
|
|
@echo
|
|
|
|
|
|
|
|
|
|
$(INSTALL_BASE)/calibre_lvs_lib: $(filter %.$(SPICE_CALIBRE_SUFFIX),$(ALL_SPICE_FILES))
|
|
|
|
|
@echo
|
|
|
|
|
@echo "Setting up Calibre LVS library for OpenRAM."
|
|
|
|
|
@echo "=================================================================="
|
|
|
|
|
mkdir -p $@
|
|
|
|
|
@for SP in $?; do \
|
|
|
|
|
cp -va $$SP $@/$$(basename $$SP .$(SPICE_CALIBRE_SUFFIX)).sp; \
|
|
|
|
|
done
|
|
|
|
|
@echo "=================================================================="
|
|
|
|
|
@echo
|
|
|
|
|
|
2022-02-11 22:48:52 +01:00
|
|
|
$(INSTALL_BASE)/klayout_lvs_lib: $(filter %.$(SPICE_KLAYOUT_SUFFIX),$(ALL_SPICE_FILES))
|
|
|
|
|
@echo
|
|
|
|
|
@echo "Setting up klayout LVS library for OpenRAM."
|
|
|
|
|
@echo "=================================================================="
|
|
|
|
|
mkdir -p $@
|
|
|
|
|
@for SP in $?; do \
|
|
|
|
|
cp -va $$SP $@/$$(basename $$SP .$(SPICE_KLAYOUT_SUFFIX)).sp; \
|
|
|
|
|
done
|
|
|
|
|
@echo "=================================================================="
|
|
|
|
|
@echo
|
|
|
|
|
|
|
|
|
|
|
2021-08-18 20:21:52 +02:00
|
|
|
$(INSTALL_BASE)/sp_lib: $(filter-out %.$(SPICE_LVS_SUFFIX) %.$(SPICE_CALIBRE_SUFFIX),$(ALL_SPICE_FILES))
|
|
|
|
|
@echo
|
|
|
|
|
@echo "Setting up spice simulation library for OpenRAM."
|
|
|
|
|
@echo "=================================================================="
|
|
|
|
|
mkdir -p $@
|
|
|
|
|
@for SP in $(filter-out %.$(SPICE_BASE_SUFFIX),$?); do \
|
|
|
|
|
cp -va $$SP $@/$$(basename $$SP .$(SPICE_SUFFIX)).sp; \
|
|
|
|
|
done
|
|
|
|
|
@echo
|
|
|
|
|
@echo "Overwriting some cells with base version."
|
|
|
|
|
@for SP in $(filter %.$(SPICE_BASE_SUFFIX),$?); do \
|
|
|
|
|
cp -va $$SP $@/$$(basename $$SP .$(SPICE_BASE_SUFFIX)).sp; \
|
|
|
|
|
done
|
|
|
|
|
@echo "=================================================================="
|
|
|
|
|
@echo
|
|
|
|
|
|
2021-11-02 19:10:59 +01:00
|
|
|
macros:
|
|
|
|
|
cd macros && make
|
|
|
|
|
|
|
|
|
|
.PHONY: macros
|
|
|
|
|
|
2021-08-18 20:21:52 +02:00
|
|
|
clean:
|
2021-11-03 16:36:10 +01:00
|
|
|
@rm -f *.zip
|
2021-11-03 16:34:49 +01:00
|
|
|
.PHONE: clean
|
2021-11-02 19:10:59 +01:00
|
|
|
|
2021-11-03 16:34:49 +01:00
|
|
|
uninstall: clean
|
2021-11-03 16:36:10 +01:00
|
|
|
@rm -f $(INSTALL_BASE)/tech/.magicrc
|
|
|
|
|
@rm -f $(INSTALL_BASE)/mag_lib/.magicrc
|
|
|
|
|
@rm -f $(INSTALL_BASE)/lef_lib/.magicrc
|
|
|
|
|
@rm -f $(INSTALL_BASE)/maglef_lib/.magicrc
|
|
|
|
|
@rm -rf $(INSTALL_DIRS)
|
2021-11-03 16:34:49 +01:00
|
|
|
.PHONY: uninstall
|
2021-11-02 23:07:18 +01:00
|
|
|
|
2021-11-03 16:34:49 +01:00
|
|
|
# wipe the entire repos
|
|
|
|
|
wipe: uninstall
|
2021-12-29 23:41:55 +01:00
|
|
|
@echo $(SKY130_PDK)
|
|
|
|
|
@echo $(SRAM_LIB_DIR)
|
|
|
|
|
@echo $(OPEN_PDKS_DIR)
|
|
|
|
|
@echo $(SKY130_PDKS_DIR)
|
|
|
|
|
@echo "Wiping above PDK repos in 5 sec... (ctrl-c to quit)"
|
2021-11-03 16:36:10 +01:00
|
|
|
@sleep 5
|
2021-12-29 23:41:55 +01:00
|
|
|
@rm -rf $(SKY130_PDK)
|
|
|
|
|
@rm -rf $(SRAM_LIB_DIR)
|
|
|
|
|
@rm -rf $(OPEN_PDKS_DIR)
|
|
|
|
|
@rm -rf $(SKY130_PDKS_DIR)
|
2021-11-03 16:34:49 +01:00
|
|
|
.PHONY: wipe
|
2022-11-03 04:20:41 +01:00
|
|
|
|
|
|
|
|
# Build the openram library
|
2023-02-07 19:31:46 +01:00
|
|
|
build_library:
|
2022-11-04 23:10:44 +01:00
|
|
|
@rm -rf dist
|
|
|
|
|
@rm -rf openram.egg-info
|
2022-11-06 22:43:48 +01:00
|
|
|
@python3 -m pip install --upgrade build
|
2022-11-03 04:20:41 +01:00
|
|
|
@python3 -m build
|
2023-02-07 19:31:46 +01:00
|
|
|
.PHONY: build_library
|
2022-11-03 04:20:41 +01:00
|
|
|
|
|
|
|
|
# Build and install the openram library
|
2023-02-07 19:31:46 +01:00
|
|
|
library: build_library
|
2023-02-14 21:33:00 +01:00
|
|
|
@python3 -m pip install --force dist/openram*.whl
|
2022-11-28 20:47:35 +01:00
|
|
|
.PHONY: library
|