blob: d45aeab1e01bc779a3eb21cc204935fc725e7b78 [file] [log] [blame]
agorararmard3f797352020-12-10 18:24:42 +02001# SPDX-FileCopyrightText: 2020 Efabless Corporation
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14#
15# SPDX-License-Identifier: Apache-2.0
16
Zain Rizwan Khana2b8f022020-12-14 16:05:46 +000017# cannot commit files larger than 100 MB to GitHub
Ahmed Ghazy31c34652020-12-01 19:59:44 +020018FILE_SIZE_LIMIT_MB = 100
19LARGE_FILES := $(shell find ./gds -type f -name "*.gds")
Ahmed Ghazy0011f612020-12-02 22:53:33 +020020LARGE_FILES += $(shell find . -type f -size +$(FILE_SIZE_LIMIT_MB)M -not -path "./.git/*" -not -path "./gds/*" -not -path "./openlane/*")
Ahmed Ghazy5898e4a2020-11-13 22:28:55 +020021
Zain Rizwan Khana2b8f022020-12-14 16:05:46 +000022LARGE_FILES_XZ := $(addsuffix .xz, $(LARGE_FILES))
Ahmed Ghazy5898e4a2020-11-13 22:28:55 +020023
Zain Rizwan Khana2b8f022020-12-14 16:05:46 +000024ARCHIVES := $(shell find . -type f -name "*.xz")
Ahmed Ghazy5898e4a2020-11-13 22:28:55 +020025ARCHIVE_SOURCES := $(basename $(ARCHIVES))
26
agorararmard212cd822020-11-26 22:40:17 +020027# PDK setup configs
28THREADS ?= $(shell nproc)
29STD_CELL_LIBRARY ?= sky130_fd_sc_hd
30SPECIAL_VOLTAGE_LIBRARY ?= sky130_fd_sc_hvl
31IO_LIBRARY ?= sky130_fd_io
agorararmardfed74ec2020-12-01 18:03:46 +020032SKYWATER_COMMIT ?= 3d7617a1acb92ea883539bcf22a632d6361a5de4
agorararmard011940a2020-12-11 23:10:04 +020033OPEN_PDKS_COMMIT ?= 32cdb2097fd9a629c91e8ea33e1f6de08ab25946
Ahmed Ghazyefdc5292020-11-19 16:05:48 +020034
35.DEFAULT_GOAL := ship
Ahmed Ghazyefdc5292020-11-19 16:05:48 +020036# We need portable GDS_FILE pointers...
37.PHONY: ship
agorararmard212cd822020-11-26 22:40:17 +020038ship: check-env uncompress
Ahmed Ghazyefdc5292020-11-19 16:05:48 +020039 @echo "###############################################"
40 @echo "Generating Caravel GDS (sources are in the 'gds' directory)"
41 @sleep 1
agorararmardf8e91c32020-11-30 23:59:58 +020042 @cp gds/caravel.gds gds/caravel.old.gds && echo "Copying old Caravel to gds/caravel.old.gds" || true
Ahmed Ghazy0252f542020-11-25 14:45:38 +020043 @cd gds && MAGTYPE=mag magic -rcfile ${PDK_ROOT}/sky130A/libs.tech/magic/current/sky130A.magicrc -noc -dnull gen_caravel.tcl < /dev/null
Ahmed Ghazyefdc5292020-11-19 16:05:48 +020044
45
Ahmed Ghazye4c7ec52020-11-20 13:10:15 +020046
Ahmed Ghazy5898e4a2020-11-13 22:28:55 +020047.PHONY: clean
48clean:
49 echo "clean"
50
51
52
53.PHONY: verify
54verify:
55 echo "verify"
56
57
58
Zain Rizwan Khana2b8f022020-12-14 16:05:46 +000059$(LARGE_FILES_XZ): %.xz: %
60 @if ! [ $(suffix $<) == ".xz" ]; then\
61 xz -6 --threads=$(shell nproc) $< > /dev/null &&\
Ahmed Ghazy5898e4a2020-11-13 22:28:55 +020062 echo "$< -> $@";\
63 fi
64
Ahmed Ghazye4c7ec52020-11-20 13:10:15 +020065# This target compresses all files larger than $(FILE_SIZE_LIMIT_MB) MB
Ahmed Ghazy5898e4a2020-11-13 22:28:55 +020066.PHONY: compress
Zain Rizwan Khana2b8f022020-12-14 16:05:46 +000067compress: $(LARGE_FILES_XZ)
Ahmed Ghazy5898e4a2020-11-13 22:28:55 +020068 @echo "Files larger than $(FILE_SIZE_LIMIT_MB) MBytes are compressed!"
69
70
71
Zain Rizwan Khana2b8f022020-12-14 16:05:46 +000072$(ARCHIVE_SOURCES): %: %.xz
73 @xz --decompress $< &&\
Ahmed Ghazye4c7ec52020-11-20 13:10:15 +020074 echo "$< -> $@";\
Ahmed Ghazy5898e4a2020-11-13 22:28:55 +020075
76.PHONY: uncompress
77uncompress: $(ARCHIVE_SOURCES)
78 @echo "All files are uncompressed!"
agorararmard212cd822020-11-26 22:40:17 +020079
Ahmed Ghazyfdda2cb2020-12-04 02:00:38 +020080
81# LVS
Ahmed Ghazyfdda2cb2020-12-04 02:00:38 +020082BLOCKS = $(shell cd openlane && find * -maxdepth 0 -type d)
83LVS_BLOCKS = $(foreach block, $(BLOCKS), lvs-$(block))
Ahmed Ghazy7f70d6f2020-12-05 23:05:31 +020084$(LVS_BLOCKS): lvs-% : ./mag/%.mag ./verilog/gl/%.v
Ahmed Ghazyfdda2cb2020-12-04 02:00:38 +020085 echo "Extracting $*"
86 mkdir -p ./mag/tmp
87 echo "load $* -dereference;\
88 extract no all;\
89 extract do local;\
90 extract;\
91 ext2spice lvs;\
92 ext2spice;\
93 feedback save extract_$*.log;\
94 exit;" > ./mag/extract_$*.tcl
95 cd mag && MAGTYPE=maglef magic -rcfile ${PDK_ROOT}/sky130A/libs.tech/magic/current/sky130A.magicrc -noc -dnull extract_$*.tcl
96 mv ./mag/$*.spice ./spi/lvs
97 mv -f ./mag/extract_$*.{tcl,log} ./mag/*.ext ./mag/tmp
98 ####
99 mkdir -p ./spi/lvs/tmp
100 sh ./spi/lvs/run_lvs.sh ./verilog/gl/$*.v ./spi/lvs/$*.spice $*
Ahmed Ghazy7f70d6f2020-12-05 23:05:31 +0200101 mv -f ./spi/lvs/*{.out,.json,.log} ./spi/lvs/tmp 2> /dev/null || true
Zain Rizwan Khana2b8f022020-12-14 16:05:46 +0000102
Ahmed Ghazyfdda2cb2020-12-04 02:00:38 +0200103
104.PHONY: help
105help:
106 @$(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
107
Zain Rizwan Khana2b8f022020-12-14 16:05:46 +0000108
Ahmed Ghazyfdda2cb2020-12-04 02:00:38 +0200109###########################################################################
agorararmard212cd822020-11-26 22:40:17 +0200110.PHONY: pdk
111pdk: skywater-pdk skywater-library open_pdks build-pdk
112
113$(PDK_ROOT)/skywater-pdk:
114 git clone https://github.com/google/skywater-pdk.git $(PDK_ROOT)/skywater-pdk
115
116.PHONY: skywater-pdk
117skywater-pdk: check-env $(PDK_ROOT)/skywater-pdk
118 cd $(PDK_ROOT)/skywater-pdk && \
agorararmard63e56722020-12-09 19:57:30 +0200119 git checkout master && git pull && \
agorararmard212cd822020-11-26 22:40:17 +0200120 git checkout -qf $(SKYWATER_COMMIT)
121
122.PHONY: skywater-library
123skywater-library: check-env $(PDK_ROOT)/skywater-pdk
124 cd $(PDK_ROOT)/skywater-pdk && \
125 git submodule update --init libraries/$(STD_CELL_LIBRARY)/latest && \
126 git submodule update --init libraries/$(IO_LIBRARY)/latest && \
127 git submodule update --init libraries/$(SPECIAL_VOLTAGE_LIBRARY)/latest && \
128 $(MAKE) -j$(THREADS) timing
129
130### OPEN_PDKS
131$(PDK_ROOT)/open_pdks:
agorararmard065a9422020-12-05 00:24:07 +0200132 git clone https://github.com/RTimothyEdwards/open_pdks.git $(PDK_ROOT)/open_pdks
agorararmard212cd822020-11-26 22:40:17 +0200133
134.PHONY: open_pdks
135open_pdks: check-env $(PDK_ROOT)/open_pdks
136 cd $(PDK_ROOT)/open_pdks && \
agorararmard63e56722020-12-09 19:57:30 +0200137 git checkout master && git pull && \
agorararmard212cd822020-11-26 22:40:17 +0200138 git checkout -qf $(OPEN_PDKS_COMMIT)
139
140.PHONY: build-pdk
141build-pdk: check-env $(PDK_ROOT)/open_pdks $(PDK_ROOT)/skywater-pdk
142 [ -d $(PDK_ROOT)/sky130A ] && \
143 (echo "Warning: A sky130A build already exists under $(PDK_ROOT). It will be deleted first!" && \
144 sleep 5 && \
145 rm -rf $(PDK_ROOT)/sky130A) || \
146 true
147 cd $(PDK_ROOT)/open_pdks && \
148 ./configure --with-sky130-source=$(PDK_ROOT)/skywater-pdk/libraries --with-sky130-local-path=$(PDK_ROOT) && \
149 cd sky130 && \
150 $(MAKE) veryclean && \
151 $(MAKE) && \
152 $(MAKE) install-local
153
agorararmard7eebfe42020-12-07 22:08:29 +0200154.RECIPE: manifest
155manifest:
156 cd verilog/rtl/ && \
agorararmardbd781832020-12-08 21:09:44 +0200157 find * -type f ! -name "user_*.v" ! -name "manifest" ! -name "README" ! -name "defines.v" -exec shasum {} \; > manifest && \
158 cd ../../maglef/ && \
159 shasum *.mag > manifest && \
160 cd ../mag/ && \
161 shasum caravel.mag .magicrc > manifest
162
agorararmard7eebfe42020-12-07 22:08:29 +0200163
agorararmard212cd822020-11-26 22:40:17 +0200164check-env:
165ifndef PDK_ROOT
166 $(error PDK_ROOT is undefined, please export it before running make)
Ahmed Ghazy31c34652020-12-01 19:59:44 +0200167endif