blob: 20b3d5a7077fa94d5f80849e978ea1640bf6e7a5 [file] [log] [blame]
Ahmed Ghazy31c34652020-12-01 19:59:44 +02001# cannot commit files larger than 100 MB to GitHub
2FILE_SIZE_LIMIT_MB = 100
3LARGE_FILES := $(shell find ./gds -type f -name "*.gds")
Ahmed Ghazy0011f612020-12-02 22:53:33 +02004LARGE_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 +02005
6LARGE_FILES_GZ := $(addsuffix .gz, $(LARGE_FILES))
7
8ARCHIVES := $(shell find . -type f -name "*.gz")
9ARCHIVE_SOURCES := $(basename $(ARCHIVES))
10
Ahmed Ghazyfdda2cb2020-12-04 02:00:38 +020011
agorararmard212cd822020-11-26 22:40:17 +020012# PDK setup configs
13THREADS ?= $(shell nproc)
14STD_CELL_LIBRARY ?= sky130_fd_sc_hd
15SPECIAL_VOLTAGE_LIBRARY ?= sky130_fd_sc_hvl
16IO_LIBRARY ?= sky130_fd_io
agorararmardfed74ec2020-12-01 18:03:46 +020017SKYWATER_COMMIT ?= 3d7617a1acb92ea883539bcf22a632d6361a5de4
agorararmardc8043332020-12-04 23:53:38 +020018OPEN_PDKS_COMMIT ?= b184e85de7629b8c87087a46b79eb45e7f7cd383
Ahmed Ghazyefdc5292020-11-19 16:05:48 +020019
20.DEFAULT_GOAL := ship
Ahmed Ghazyefdc5292020-11-19 16:05:48 +020021# We need portable GDS_FILE pointers...
22.PHONY: ship
agorararmard212cd822020-11-26 22:40:17 +020023ship: check-env uncompress
Ahmed Ghazyefdc5292020-11-19 16:05:48 +020024 @echo "###############################################"
25 @echo "Generating Caravel GDS (sources are in the 'gds' directory)"
26 @sleep 1
agorararmardf8e91c32020-11-30 23:59:58 +020027 @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 +020028 @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 +020029
30
Ahmed Ghazye4c7ec52020-11-20 13:10:15 +020031
Ahmed Ghazy5898e4a2020-11-13 22:28:55 +020032.PHONY: clean
33clean:
34 echo "clean"
35
36
37
38.PHONY: verify
39verify:
40 echo "verify"
41
42
43
44$(LARGE_FILES_GZ): %.gz: %
Ahmed Ghazy0252f542020-11-25 14:45:38 +020045 @if ! [ $(suffix $<) == ".gz" ]; then\
Ahmed Ghazye4c7ec52020-11-20 13:10:15 +020046 gzip -n --best $< > /dev/null &&\
Ahmed Ghazy5898e4a2020-11-13 22:28:55 +020047 echo "$< -> $@";\
48 fi
49
Ahmed Ghazye4c7ec52020-11-20 13:10:15 +020050# This target compresses all files larger than $(FILE_SIZE_LIMIT_MB) MB
Ahmed Ghazy5898e4a2020-11-13 22:28:55 +020051.PHONY: compress
52compress: $(LARGE_FILES_GZ)
53 @echo "Files larger than $(FILE_SIZE_LIMIT_MB) MBytes are compressed!"
54
55
56
57$(ARCHIVE_SOURCES): %: %.gz
Ahmed Ghazye4c7ec52020-11-20 13:10:15 +020058 @gzip -d $< &&\
59 echo "$< -> $@";\
Ahmed Ghazy5898e4a2020-11-13 22:28:55 +020060
61.PHONY: uncompress
62uncompress: $(ARCHIVE_SOURCES)
63 @echo "All files are uncompressed!"
agorararmard212cd822020-11-26 22:40:17 +020064
Ahmed Ghazyfdda2cb2020-12-04 02:00:38 +020065
66# LVS
67NETGEN_SETUP=$(PDK_ROOT)/sky130A/libs.tech/netgen/sky130A_setup.tcl
68
69BLOCKS = $(shell cd openlane && find * -maxdepth 0 -type d)
70LVS_BLOCKS = $(foreach block, $(BLOCKS), lvs-$(block))
71$(LVS_BLOCKS): lvs-% : ./mag/%.mag ./verilog/gl/%.v ./spi/lvs/%.spice
72 echo "Extracting $*"
73 mkdir -p ./mag/tmp
74 echo "load $* -dereference;\
75 extract no all;\
76 extract do local;\
77 extract;\
78 ext2spice lvs;\
79 ext2spice;\
80 feedback save extract_$*.log;\
81 exit;" > ./mag/extract_$*.tcl
82 cd mag && MAGTYPE=maglef magic -rcfile ${PDK_ROOT}/sky130A/libs.tech/magic/current/sky130A.magicrc -noc -dnull extract_$*.tcl
83 mv ./mag/$*.spice ./spi/lvs
84 mv -f ./mag/extract_$*.{tcl,log} ./mag/*.ext ./mag/tmp
85 ####
86 mkdir -p ./spi/lvs/tmp
87 sh ./spi/lvs/run_lvs.sh ./verilog/gl/$*.v ./spi/lvs/$*.spice $*
88 mv -f ./spi/lvs/*{.out,.json,.log} ./spi/lvs/tmp
89
90
91.PHONY: help
92help:
93 @$(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 '^$@$$'
94
95
96###########################################################################
agorararmard212cd822020-11-26 22:40:17 +020097.PHONY: pdk
98pdk: skywater-pdk skywater-library open_pdks build-pdk
99
100$(PDK_ROOT)/skywater-pdk:
101 git clone https://github.com/google/skywater-pdk.git $(PDK_ROOT)/skywater-pdk
102
103.PHONY: skywater-pdk
104skywater-pdk: check-env $(PDK_ROOT)/skywater-pdk
105 cd $(PDK_ROOT)/skywater-pdk && \
106 git checkout -qf $(SKYWATER_COMMIT)
107
108.PHONY: skywater-library
109skywater-library: check-env $(PDK_ROOT)/skywater-pdk
110 cd $(PDK_ROOT)/skywater-pdk && \
111 git submodule update --init libraries/$(STD_CELL_LIBRARY)/latest && \
112 git submodule update --init libraries/$(IO_LIBRARY)/latest && \
113 git submodule update --init libraries/$(SPECIAL_VOLTAGE_LIBRARY)/latest && \
114 $(MAKE) -j$(THREADS) timing
115
116### OPEN_PDKS
117$(PDK_ROOT)/open_pdks:
agorararmard065a9422020-12-05 00:24:07 +0200118 git clone https://github.com/RTimothyEdwards/open_pdks.git $(PDK_ROOT)/open_pdks
agorararmard212cd822020-11-26 22:40:17 +0200119
120.PHONY: open_pdks
121open_pdks: check-env $(PDK_ROOT)/open_pdks
122 cd $(PDK_ROOT)/open_pdks && \
123 git checkout -qf $(OPEN_PDKS_COMMIT)
124
125.PHONY: build-pdk
126build-pdk: check-env $(PDK_ROOT)/open_pdks $(PDK_ROOT)/skywater-pdk
127 [ -d $(PDK_ROOT)/sky130A ] && \
128 (echo "Warning: A sky130A build already exists under $(PDK_ROOT). It will be deleted first!" && \
129 sleep 5 && \
130 rm -rf $(PDK_ROOT)/sky130A) || \
131 true
132 cd $(PDK_ROOT)/open_pdks && \
133 ./configure --with-sky130-source=$(PDK_ROOT)/skywater-pdk/libraries --with-sky130-local-path=$(PDK_ROOT) && \
134 cd sky130 && \
135 $(MAKE) veryclean && \
136 $(MAKE) && \
137 $(MAKE) install-local
138
139check-env:
140ifndef PDK_ROOT
141 $(error PDK_ROOT is undefined, please export it before running make)
Ahmed Ghazy31c34652020-12-01 19:59:44 +0200142endif