1
2CONFIG := gcc
3# CONFIG := gcc
4# CONFIG := gcc-4.8
5# CONFIG := afl-gcc
6# CONFIG := emcc
7# CONFIG := wasi
8# CONFIG := mxe
9# CONFIG := msys2-32
10# CONFIG := msys2-64
11
12# features (the more the better)
13ENABLE_TCL := 1
14ENABLE_ABC := 1
15ENABLE_GLOB := 1
16ENABLE_PLUGINS := 1
17ENABLE_READLINE := 1
18ENABLE_EDITLINE := 0
19ENABLE_GHDL := 0
20ENABLE_VERIFIC := 0
21DISABLE_VERIFIC_EXTENSIONS := 0
22DISABLE_VERIFIC_VHDL := 0
23ENABLE_COVER := 1
24ENABLE_LIBYOSYS := 0
25ENABLE_PROTOBUF := 0
26ENABLE_ZLIB := 1
27
28# python wrappers
29ENABLE_PYOSYS := 0
30
31# other configuration flags
32ENABLE_GCOV := 0
33ENABLE_GPROF := 0
34ENABLE_DEBUG := 0
35ENABLE_NDEBUG := 0
36ENABLE_CCACHE := 0
37# sccache is not always a drop-in replacement for ccache in practice
38ENABLE_SCCACHE := 0
39LINK_CURSES := 0
40LINK_TERMCAP := 0
41LINK_ABC := 0
42# Needed for environments that can't run executables (i.e. emscripten, wasm)
43DISABLE_SPAWN := 0
44# Needed for environments that don't have proper thread support (i.e. emscripten, wasm--for now)
45DISABLE_ABC_THREADS := 0
46
47# clang sanitizers
48SANITIZER =
49# SANITIZER = address
50# SANITIZER = memory
51# SANITIZER = undefined
52# SANITIZER = cfi
53
54PROGRAM_PREFIX :=
55
56OS := $(shell uname -s)
57PREFIX ?= /usr/local
58INSTALL_SUDO :=
59
60ifneq ($(wildcard Makefile.conf),)
61include Makefile.conf
62endif
63
64ifeq ($(ENABLE_PYOSYS),1)
65ENABLE_LIBYOSYS := 1
66endif
67
68BINDIR := $(PREFIX)/bin
69LIBDIR := $(PREFIX)/lib/$(PROGRAM_PREFIX)yosys
70DATDIR := $(PREFIX)/share/$(PROGRAM_PREFIX)yosys
71
72EXE =
73OBJS =
74GENFILES =
75EXTRA_OBJS =
76EXTRA_TARGETS =
77TARGETS = $(PROGRAM_PREFIX)yosys$(EXE) $(PROGRAM_PREFIX)yosys-config
78
79PRETTY = 1
80SMALL = 0
81
82# Unit test
83UNITESTPATH := tests/unit
84
85all: top-all
86
87YOSYS_SRC := $(dir $(firstword $(MAKEFILE_LIST)))
88VPATH := $(YOSYS_SRC)
89
90CXXSTD ?= c++11
91CXXFLAGS := $(CXXFLAGS) -Wall -Wextra -ggdb -I. -I"$(YOSYS_SRC)" -MD -MP -D_YOSYS_ -fPIC -I$(PREFIX)/include
92LDLIBS := $(LDLIBS) -lstdc++ -lm
93PLUGIN_LDFLAGS :=
94
95PKG_CONFIG ?= pkg-config
96SED ?= sed
97BISON ?= bison
98STRIP ?= strip
99AWK ?= awk
100
101ifeq ($(OS), Darwin)
102PLUGIN_LDFLAGS += -undefined dynamic_lookup
103
104# homebrew search paths
105ifneq ($(shell :; command -v brew),)
106BREW_PREFIX := $(shell brew --prefix)/opt
107$(info $$BREW_PREFIX is [${BREW_PREFIX}])
108ifeq ($(ENABLE_PYOSYS),1)
109CXXFLAGS += -I$(BREW_PREFIX)/boost/include/boost
110LDFLAGS += -L$(BREW_PREFIX)/boost/lib
111endif
112CXXFLAGS += -I$(BREW_PREFIX)/readline/include
113LDFLAGS += -L$(BREW_PREFIX)/readline/lib
114PKG_CONFIG_PATH := $(BREW_PREFIX)/libffi/lib/pkgconfig:$(PKG_CONFIG_PATH)
115PKG_CONFIG_PATH := $(BREW_PREFIX)/tcl-tk/lib/pkgconfig:$(PKG_CONFIG_PATH)
116export PATH := $(BREW_PREFIX)/bison/bin:$(BREW_PREFIX)/gettext/bin:$(BREW_PREFIX)/flex/bin:$(PATH)
117
118# macports search paths
119else ifneq ($(shell :; command -v port),)
120PORT_PREFIX := $(patsubst %/bin/port,%,$(shell :; command -v port))
121CXXFLAGS += -I$(PORT_PREFIX)/include
122LDFLAGS += -L$(PORT_PREFIX)/lib
123PKG_CONFIG_PATH := $(PORT_PREFIX)/lib/pkgconfig:$(PKG_CONFIG_PATH)
124export PATH := $(PORT_PREFIX)/bin:$(PATH)
125endif
126
127else
128LDFLAGS += -rdynamic
129LDLIBS += -lrt
130endif
131
132YOSYS_VER := 0.12
133GIT_REV := $(shell git -C $(YOSYS_SRC) rev-parse --short HEAD 2> /dev/null || echo UNKNOWN)
134OBJS = kernel/version_$(GIT_REV).o
135
136bumpversion:
137	# sed -i "/^YOSYS_VER := / s/+[0-9][0-9]*$$/+`git log --oneline 360fed8.. | wc -l`/;" Makefile
138
139# set 'ABCREV = default' to use abc/ as it is
140#
141# Note: If you do ABC development, make sure that 'abc' in this directory
142# is just a symlink to your actual ABC working directory, as 'make mrproper'
143# will remove the 'abc' directory and you do not want to accidentally
144# delete your work on ABC..
145ABCREV = f6fa2dd
146ABCPULL = 1
147ABCURL ?= https://github.com/YosysHQ/abc
148ABCMKARGS = CC="$(CXX)" CXX="$(CXX)" ABC_USE_LIBSTDCXX=1 VERBOSE=$(Q)
149
150# set ABCEXTERNAL = <abc-command> to use an external ABC instance
151# Note: The in-tree ABC (yosys-abc) will not be installed when ABCEXTERNAL is set.
152ABCEXTERNAL ?=
153
154define newline
155
156
157endef
158
159ifneq ($(wildcard Makefile.conf),)
160# don't echo Makefile.conf contents when invoked to print source versions
161ifeq ($(findstring echo-,$(MAKECMDGOALS)),)
162$(info $(subst $$--$$,$(newline),$(shell sed 's,^,[Makefile.conf] ,; s,$$,$$--$$,;' < Makefile.conf | tr -d '\n' | sed 's,\$$--\$$$$,,')))
163endif
164include Makefile.conf
165endif
166
167PYTHON_EXECUTABLE := $(shell if python3 -c ""; then echo "python3"; else echo "python"; fi)
168ifeq ($(ENABLE_PYOSYS),1)
169PYTHON_VERSION_TESTCODE := "import sys;t='{v[0]}.{v[1]}'.format(v=list(sys.version_info[:2]));print(t)"
170PYTHON_VERSION := $(shell $(PYTHON_EXECUTABLE) -c ""$(PYTHON_VERSION_TESTCODE)"")
171PYTHON_MAJOR_VERSION := $(shell echo $(PYTHON_VERSION) | cut -f1 -d.)
172
173ENABLE_PYTHON_CONFIG_EMBED ?= $(shell $(PYTHON_EXECUTABLE)-config --embed --libs > /dev/null && echo 1)
174ifeq ($(ENABLE_PYTHON_CONFIG_EMBED),1)
175PYTHON_CONFIG := $(PYTHON_EXECUTABLE)-config --embed
176else
177PYTHON_CONFIG := $(PYTHON_EXECUTABLE)-config
178endif
179
180PYTHON_DESTDIR := $(shell $(PYTHON_EXECUTABLE) -c "import site; print(site.getsitepackages()[-1]);")
181
182# Reload Makefile.conf to override python specific variables if defined
183ifneq ($(wildcard Makefile.conf),)
184include Makefile.conf
185endif
186
187endif
188
189ifeq ($(CONFIG),clang)
190LD = $(CXX)
191CXXFLAGS += -std=$(CXXSTD) -Os
192ABCMKARGS += ARCHFLAGS="-DABC_USE_STDINT_H"
193
194ifneq ($(SANITIZER),)
195$(info [Clang Sanitizer] $(SANITIZER))
196CXXFLAGS += -g -O1 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=$(SANITIZER)
197LDFLAGS += -g -fsanitize=$(SANITIZER)
198ifneq ($(findstring address,$(SANITIZER)),)
199ENABLE_COVER := 0
200endif
201ifneq ($(findstring memory,$(SANITIZER)),)
202CXXFLAGS += -fPIE -fsanitize-memory-track-origins
203LDFLAGS += -fPIE -fsanitize-memory-track-origins
204endif
205ifneq ($(findstring cfi,$(SANITIZER)),)
206CXXFLAGS += -flto
207LDFLAGS += -flto
208endif
209endif
210
211else ifeq ($(CONFIG),gcc)
212LD = $(CXX)
213CXXFLAGS += -std=$(CXXSTD) -Os
214ABCMKARGS += ARCHFLAGS="-DABC_USE_STDINT_H"
215
216else ifeq ($(CONFIG),gcc-static)
217LD = $(CXX)
218LDFLAGS := $(filter-out -rdynamic,$(LDFLAGS)) -static
219LDLIBS := $(filter-out -lrt,$(LDLIBS))
220CXXFLAGS := $(filter-out -fPIC,$(CXXFLAGS))
221CXXFLAGS += -std=$(CXXSTD) -Os
222ABCMKARGS = CC="$(CC)" CXX="$(CXX)" LD="$(LD)" ABC_USE_LIBSTDCXX=1 LIBS="-lm -lpthread -static" OPTFLAGS="-O" \
223                       ARCHFLAGS="-DABC_USE_STDINT_H -DABC_NO_DYNAMIC_LINKING=1 -Wno-unused-but-set-variable $(ARCHFLAGS)" ABC_USE_NO_READLINE=1
224ifeq ($(DISABLE_ABC_THREADS),1)
225ABCMKARGS += "ABC_USE_NO_PTHREADS=1"
226endif
227
228else ifeq ($(CONFIG),gcc-4.8)
229LD = $(CXX)
230CXXFLAGS += -std=$(CXXSTD) -Os
231ABCMKARGS += ARCHFLAGS="-DABC_USE_STDINT_H"
232
233else ifeq ($(CONFIG),afl-gcc)
234LD = $(CXX)
235CXXFLAGS += -std=$(CXXSTD) -Os
236ABCMKARGS += ARCHFLAGS="-DABC_USE_STDINT_H"
237
238else ifeq ($(CONFIG),cygwin)
239LD = $(CXX)
240CXXFLAGS += -std=gnu++11 -Os
241ABCMKARGS += ARCHFLAGS="-DABC_USE_STDINT_H"
242
243else ifeq ($(CONFIG),emcc)
244LD = $(CXX)
245CXXFLAGS := -std=$(CXXSTD) $(filter-out -fPIC -ggdb,$(CXXFLAGS))
246ABCMKARGS += ARCHFLAGS="-DABC_USE_STDINT_H -DABC_MEMALIGN=8"
247EMCCFLAGS := -Os -Wno-warn-absolute-paths
248EMCCFLAGS += --memory-init-file 0 --embed-file share -s NO_EXIT_RUNTIME=1
249EMCCFLAGS += -s EXPORTED_FUNCTIONS="['_main','_run','_prompt','_errmsg','_memset']"
250EMCCFLAGS += -s TOTAL_MEMORY=134217728
251EMCCFLAGS += -s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'
252# https://github.com/kripken/emscripten/blob/master/src/settings.js
253CXXFLAGS += $(EMCCFLAGS)
254LDFLAGS += $(EMCCFLAGS)
255LDLIBS =
256EXE = .js
257
258DISABLE_SPAWN := 1
259
260TARGETS := $(filter-out $(PROGRAM_PREFIX)yosys-config,$(TARGETS))
261EXTRA_TARGETS += yosysjs-$(YOSYS_VER).zip
262
263ifeq ($(ENABLE_ABC),1)
264LINK_ABC := 1
265DISABLE_ABC_THREADS := 1
266endif
267
268viz.js:
269	wget -O viz.js.part https://github.com/mdaines/viz.js/releases/download/0.0.3/viz.js
270	mv viz.js.part viz.js
271
272yosysjs-$(YOSYS_VER).zip: yosys.js yosys.wasm viz.js misc/yosysjs/*
273	rm -rf yosysjs-$(YOSYS_VER) yosysjs-$(YOSYS_VER).zip
274	mkdir -p yosysjs-$(YOSYS_VER)
275	cp viz.js misc/yosysjs/* yosys.js yosys.wasm yosysjs-$(YOSYS_VER)/
276	zip -r yosysjs-$(YOSYS_VER).zip yosysjs-$(YOSYS_VER)
277
278yosys.html: misc/yosys.html
279	$(P) cp misc/yosys.html yosys.html
280
281else ifeq ($(CONFIG),wasi)
282ifeq ($(WASI_SDK),)
283LD = $(CXX)
284AR = llvm-ar
285RANLIB = llvm-ranlib
286WASIFLAGS := -target wasm32-wasi --sysroot $(WASI_SYSROOT) $(WASIFLAGS)
287else
288LD = $(CXX)
289AR = $(WASI_SDK)/bin/ar
290RANLIB = $(WASI_SDK)/bin/ranlib
291WASIFLAGS := --sysroot $(WASI_SDK)/share/wasi-sysroot $(WASIFLAGS)
292endif
293CXXFLAGS := $(WASIFLAGS) -std=$(CXXSTD) -Os $(filter-out -fPIC,$(CXXFLAGS))
294LDFLAGS := $(WASIFLAGS) -Wl,-z,stack-size=1048576 $(filter-out -rdynamic,$(LDFLAGS))
295LDLIBS := $(filter-out -lrt,$(LDLIBS))
296ABCMKARGS += AR="$(AR)" RANLIB="$(RANLIB)"
297ABCMKARGS += ARCHFLAGS="$(WASIFLAGS) -DABC_USE_STDINT_H -DABC_NO_DYNAMIC_LINKING"
298ABCMKARGS += OPTFLAGS="-Os"
299EXE = .wasm
300
301DISABLE_SPAWN := 1
302
303ifeq ($(ENABLE_ABC),1)
304LINK_ABC := 1
305DISABLE_ABC_THREADS := 1
306endif
307
308else ifeq ($(CONFIG),mxe)
309PKG_CONFIG = /usr/local/src/mxe/usr/bin/i686-w64-mingw32.static-pkg-config
310LD = $(CXX)
311CXXFLAGS += -std=$(CXXSTD) -Os -D_POSIX_SOURCE -DYOSYS_MXE_HACKS -Wno-attributes
312CXXFLAGS := $(filter-out -fPIC,$(CXXFLAGS))
313LDFLAGS := $(filter-out -rdynamic,$(LDFLAGS)) -s
314LDLIBS := $(filter-out -lrt,$(LDLIBS))
315ABCMKARGS += ARCHFLAGS="-DWIN32_NO_DLL -DHAVE_STRUCT_TIMESPEC -fpermissive -w"
316# TODO: Try to solve pthread linking issue in more appropriate way
317ABCMKARGS += LIBS="lib/x86/pthreadVC2.lib -s" LDFLAGS="-Wl,--allow-multiple-definition" ABC_USE_NO_READLINE=1 CC="/usr/local/src/mxe/usr/bin/i686-w64-mingw32.static-gcc"
318EXE = .exe
319
320else ifeq ($(CONFIG),msys2-32)
321LD = $(CXX)
322CXXFLAGS += -std=$(CXXSTD) -Os -D_POSIX_SOURCE -DYOSYS_WIN32_UNIX_DIR
323CXXFLAGS := $(filter-out -fPIC,$(CXXFLAGS))
324LDFLAGS := $(filter-out -rdynamic,$(LDFLAGS)) -s
325LDLIBS := $(filter-out -lrt,$(LDLIBS))
326ABCMKARGS += ARCHFLAGS="-DABC_USE_STDINT_H -DWIN32_NO_DLL -DHAVE_STRUCT_TIMESPEC -fpermissive -w"
327ABCMKARGS += LIBS="-lpthread -s" ABC_USE_NO_READLINE=0 CC="i686-w64-mingw32-gcc" CXX="$(CXX)"
328EXE = .exe
329
330else ifeq ($(CONFIG),msys2-64)
331LD = $(CXX)
332CXXFLAGS += -std=$(CXXSTD) -Os -D_POSIX_SOURCE -DYOSYS_WIN32_UNIX_DIR
333CXXFLAGS := $(filter-out -fPIC,$(CXXFLAGS))
334LDFLAGS := $(filter-out -rdynamic,$(LDFLAGS)) -s
335LDLIBS := $(filter-out -lrt,$(LDLIBS))
336ABCMKARGS += ARCHFLAGS="-DABC_USE_STDINT_H -DWIN32_NO_DLL -DHAVE_STRUCT_TIMESPEC -fpermissive -w"
337ABCMKARGS += LIBS="-lpthread -s" ABC_USE_NO_READLINE=0 CC="x86_64-w64-mingw32-gcc" CXX="$(CXX)"
338EXE = .exe
339
340else ifneq ($(CONFIG),none)
341$(error Invalid CONFIG setting '$(CONFIG)'. Valid values: clang, gcc, gcc-4.8, emcc, mxe, msys2-32, msys2-64)
342endif
343
344ifeq ($(ENABLE_LIBYOSYS),1)
345TARGETS += libyosys.so
346endif
347
348ifeq ($(ENABLE_PYOSYS),1)
349# Detect name of boost_python library. Some distros use boost_python-py<version>, other boost_python<version>, some only use the major version number, some a concatenation of major and minor version numbers
350CHECK_BOOST_PYTHON = (echo "int main(int argc, char ** argv) {return 0;}" | $(CXX) -xc -o /dev/null $(shell $(PYTHON_CONFIG) --ldflags) -l$(1) - > /dev/null 2>&1 && echo "-l$(1)")
351BOOST_PYTHON_LIB ?= $(shell \
352	$(call CHECK_BOOST_PYTHON,boost_python-py$(subst .,,$(PYTHON_VERSION))) || \
353	$(call CHECK_BOOST_PYTHON,boost_python-py$(PYTHON_MAJOR_VERSION)) || \
354	$(call CHECK_BOOST_PYTHON,boost_python$(subst .,,$(PYTHON_VERSION))) || \
355	$(call CHECK_BOOST_PYTHON,boost_python$(PYTHON_MAJOR_VERSION)) \
356)
357
358ifeq ($(BOOST_PYTHON_LIB),)
359$(error BOOST_PYTHON_LIB could not be detected. Please define manually)
360endif
361
362LDLIBS += $(shell $(PYTHON_CONFIG) --libs) $(BOOST_PYTHON_LIB) -lboost_system -lboost_filesystem
363# python-config --ldflags includes LDLIBS for some reason
364LDFLAGS += $(filter-out -l%,$(shell $(PYTHON_CONFIG) --ldflags))
365CXXFLAGS += $(shell $(PYTHON_CONFIG) --includes) -DWITH_PYTHON
366
367PY_WRAPPER_FILE = kernel/python_wrappers
368OBJS += $(PY_WRAPPER_FILE).o
369PY_GEN_SCRIPT= py_wrap_generator
370PY_WRAP_INCLUDES := $(shell python$(PYTHON_VERSION) -c "from misc import $(PY_GEN_SCRIPT); $(PY_GEN_SCRIPT).print_includes()")
371endif # ENABLE_PYOSYS
372
373ifeq ($(ENABLE_READLINE),1)
374CXXFLAGS += -DYOSYS_ENABLE_READLINE
375ifeq ($(OS), DragonFly)
376CXXFLAGS += -I/usr/local/include
377endif
378LDLIBS += -lreadline
379ifeq ($(LINK_CURSES),1)
380LDLIBS += -lcurses
381ABCMKARGS += "ABC_READLINE_LIBRARIES=-lcurses -lreadline"
382endif
383ifeq ($(LINK_TERMCAP),1)
384LDLIBS += -ltermcap
385ABCMKARGS += "ABC_READLINE_LIBRARIES=-lreadline -ltermcap"
386endif
387ifeq ($(CONFIG),mxe)
388LDLIBS += -ltermcap
389endif
390else
391ifeq ($(ENABLE_EDITLINE),1)
392CXXFLAGS += -DYOSYS_ENABLE_EDITLINE
393LDLIBS += -ledit -ltinfo -lbsd
394else
395ABCMKARGS += "ABC_USE_NO_READLINE=1"
396endif
397endif
398
399ifeq ($(DISABLE_ABC_THREADS),1)
400ABCMKARGS += "ABC_USE_NO_PTHREADS=1"
401endif
402
403ifeq ($(DISABLE_SPAWN),1)
404CXXFLAGS += -DYOSYS_DISABLE_SPAWN
405endif
406
407ifeq ($(ENABLE_PLUGINS),1)
408CXXFLAGS += $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) $(PKG_CONFIG) --silence-errors --cflags libffi) -DYOSYS_ENABLE_PLUGINS
409LDLIBS += $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) $(PKG_CONFIG) --silence-errors --libs libffi || echo -lffi)
410ifneq ($(OS), DragonFly)
411LDLIBS += -ldl
412endif
413endif
414
415ifeq ($(ENABLE_GLOB),1)
416CXXFLAGS += -DYOSYS_ENABLE_GLOB
417endif
418
419ifeq ($(ENABLE_ZLIB),1)
420CXXFLAGS += -DYOSYS_ENABLE_ZLIB
421LDLIBS += -lz
422endif
423
424
425ifeq ($(ENABLE_TCL),1)
426TCL_VERSION ?= tcl$(shell bash -c "tclsh <(echo 'puts [info tclversion]')")
427ifeq ($(OS), DragonFly)
428TCL_INCLUDE ?= /usr/local/include/$(TCL_VERSION)
429else
430TCL_INCLUDE ?= /usr/include/$(TCL_VERSION)
431endif
432
433ifeq ($(CONFIG),mxe)
434CXXFLAGS += -DYOSYS_ENABLE_TCL
435LDLIBS += -ltcl86 -lwsock32 -lws2_32 -lnetapi32 -lz -luserenv
436else
437CXXFLAGS += $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) $(PKG_CONFIG) --silence-errors --cflags tcl || echo -I$(TCL_INCLUDE)) -DYOSYS_ENABLE_TCL
438ifeq ($(OS), DragonFly)
439# DragonFly uses tcl8.6, but lib is named "libtcl86"
440LDLIBS += $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) $(PKG_CONFIG) --silence-errors --libs tcl || echo -l$(TCL_VERSION) | tr -d '.')
441else
442LDLIBS += $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) $(PKG_CONFIG) --silence-errors --libs tcl || echo -l$(TCL_VERSION))
443endif
444endif
445endif
446
447ifeq ($(ENABLE_GCOV),1)
448CXXFLAGS += --coverage
449LDFLAGS += --coverage
450endif
451
452ifeq ($(ENABLE_GPROF),1)
453CXXFLAGS += -pg
454LDFLAGS += -pg
455endif
456
457ifeq ($(ENABLE_NDEBUG),1)
458CXXFLAGS := -O3 -DNDEBUG $(filter-out -Os -ggdb,$(CXXFLAGS))
459endif
460
461ifeq ($(ENABLE_DEBUG),1)
462ifeq ($(CONFIG),clang)
463CXXFLAGS := -O0 -DDEBUG $(filter-out -Os,$(CXXFLAGS))
464else
465CXXFLAGS := -Og -DDEBUG $(filter-out -Os,$(CXXFLAGS))
466endif
467endif
468
469ifeq ($(ENABLE_ABC),1)
470CXXFLAGS += -DYOSYS_ENABLE_ABC
471ifeq ($(LINK_ABC),1)
472CXXFLAGS += -DYOSYS_LINK_ABC
473ifeq ($(DISABLE_ABC_THREADS),0)
474LDLIBS += -lpthread
475endif
476else
477ifeq ($(ABCEXTERNAL),)
478TARGETS += $(PROGRAM_PREFIX)yosys-abc$(EXE)
479endif
480endif
481endif
482
483ifeq ($(ENABLE_GHDL),1)
484GHDL_PREFIX ?= $(PREFIX)
485GHDL_INCLUDE_DIR ?= $(GHDL_PREFIX)/include
486GHDL_LIB_DIR ?= $(GHDL_PREFIX)/lib
487CXXFLAGS += -I$(GHDL_INCLUDE_DIR) -DYOSYS_ENABLE_GHDL
488LDLIBS += $(GHDL_LIB_DIR)/libghdl.a $(file <$(GHDL_LIB_DIR)/libghdl.link)
489endif
490
491ifeq ($(ENABLE_VERIFIC),1)
492VERIFIC_DIR ?= /usr/local/src/verific_lib
493VERIFIC_COMPONENTS ?= verilog database util containers hier_tree
494ifneq ($(DISABLE_VERIFIC_VHDL),1)
495VERIFIC_COMPONENTS += vhdl
496CXXFLAGS += -DVERIFIC_VHDL_SUPPORT
497else
498ifneq ($(wildcard $(VERIFIC_DIR)/vhdl),)
499VERIFIC_COMPONENTS += vhdl
500endif
501endif
502ifneq ($(DISABLE_VERIFIC_EXTENSIONS),1)
503VERIFIC_COMPONENTS += extensions
504CXXFLAGS += -DYOSYSHQ_VERIFIC_EXTENSIONS
505endif
506CXXFLAGS += $(patsubst %,-I$(VERIFIC_DIR)/%,$(VERIFIC_COMPONENTS)) -DYOSYS_ENABLE_VERIFIC
507ifeq ($(OS), Darwin)
508LDLIBS += $(patsubst %,$(VERIFIC_DIR)/%/*-mac.a,$(VERIFIC_COMPONENTS)) -lz
509else
510LDLIBS += $(patsubst %,$(VERIFIC_DIR)/%/*-linux.a,$(VERIFIC_COMPONENTS)) -lz
511endif
512endif
513
514ifeq ($(ENABLE_PROTOBUF),1)
515LDLIBS += $(shell pkg-config --cflags --libs protobuf)
516endif
517
518ifeq ($(ENABLE_COVER),1)
519CXXFLAGS += -DYOSYS_ENABLE_COVER
520endif
521
522ifeq ($(ENABLE_CCACHE),1)
523CXX := ccache $(CXX)
524else
525ifeq ($(ENABLE_SCCACHE),1)
526CXX := sccache $(CXX)
527endif
528endif
529
530define add_share_file
531EXTRA_TARGETS += $(subst //,/,$(1)/$(notdir $(2)))
532$(subst //,/,$(1)/$(notdir $(2))): $(2)
533	$$(P) mkdir -p $(1)
534	$$(Q) cp "$(YOSYS_SRC)"/$(2) $(subst //,/,$(1)/$(notdir $(2)))
535endef
536
537define add_gen_share_file
538EXTRA_TARGETS += $(subst //,/,$(1)/$(notdir $(2)))
539$(subst //,/,$(1)/$(notdir $(2))): $(2)
540	$$(P) mkdir -p $(1)
541	$$(Q) cp $(2) $(subst //,/,$(1)/$(notdir $(2)))
542endef
543
544define add_include_file
545$(eval $(call add_share_file,$(dir share/include/$(1)),$(1)))
546endef
547
548define add_extra_objs
549EXTRA_OBJS += $(1)
550.SECONDARY: $(1)
551endef
552
553ifeq ($(PRETTY), 1)
554P_STATUS = 0
555P_OFFSET = 0
556P_UPDATE = $(eval P_STATUS=$(shell echo $(OBJS) $(PROGRAM_PREFIX)yosys$(EXE) | $(AWK) 'BEGIN { RS = " "; I = $(P_STATUS)+0; } $$1 == "$@" && NR > I { I = NR; } END { print I; }'))
557P_SHOW = [$(shell $(AWK) "BEGIN { N=$(words $(OBJS) $(PROGRAM_PREFIX)yosys$(EXE)); printf \"%3d\", $(P_OFFSET)+90*$(P_STATUS)/N; exit; }")%]
558P = @echo "$(if $(findstring $@,$(TARGETS) $(EXTRA_TARGETS)),$(eval P_OFFSET = 10))$(call P_UPDATE)$(call P_SHOW) Building $@";
559Q = @
560S = -s
561else
562P_SHOW = ->
563P =
564Q =
565S =
566endif
567
568$(eval $(call add_include_file,kernel/yosys.h))
569$(eval $(call add_include_file,kernel/hashlib.h))
570$(eval $(call add_include_file,kernel/log.h))
571$(eval $(call add_include_file,kernel/rtlil.h))
572$(eval $(call add_include_file,kernel/binding.h))
573$(eval $(call add_include_file,kernel/register.h))
574$(eval $(call add_include_file,kernel/celltypes.h))
575$(eval $(call add_include_file,kernel/celledges.h))
576$(eval $(call add_include_file,kernel/consteval.h))
577$(eval $(call add_include_file,kernel/constids.inc))
578$(eval $(call add_include_file,kernel/sigtools.h))
579$(eval $(call add_include_file,kernel/modtools.h))
580$(eval $(call add_include_file,kernel/macc.h))
581$(eval $(call add_include_file,kernel/utils.h))
582$(eval $(call add_include_file,kernel/satgen.h))
583$(eval $(call add_include_file,kernel/qcsat.h))
584$(eval $(call add_include_file,kernel/ff.h))
585$(eval $(call add_include_file,kernel/ffinit.h))
586$(eval $(call add_include_file,kernel/mem.h))
587$(eval $(call add_include_file,libs/ezsat/ezsat.h))
588$(eval $(call add_include_file,libs/ezsat/ezminisat.h))
589$(eval $(call add_include_file,libs/sha1/sha1.h))
590$(eval $(call add_include_file,libs/json11/json11.hpp))
591$(eval $(call add_include_file,passes/fsm/fsmdata.h))
592$(eval $(call add_include_file,frontends/ast/ast.h))
593$(eval $(call add_include_file,frontends/ast/ast_binding.h))
594$(eval $(call add_include_file,frontends/blif/blifparse.h))
595$(eval $(call add_include_file,backends/rtlil/rtlil_backend.h))
596$(eval $(call add_include_file,backends/cxxrtl/cxxrtl.h))
597$(eval $(call add_include_file,backends/cxxrtl/cxxrtl_vcd.h))
598$(eval $(call add_include_file,backends/cxxrtl/cxxrtl_capi.cc))
599$(eval $(call add_include_file,backends/cxxrtl/cxxrtl_capi.h))
600$(eval $(call add_include_file,backends/cxxrtl/cxxrtl_vcd_capi.cc))
601$(eval $(call add_include_file,backends/cxxrtl/cxxrtl_vcd_capi.h))
602
603OBJS += kernel/driver.o kernel/register.o kernel/rtlil.o kernel/log.o kernel/calc.o kernel/yosys.o
604OBJS += kernel/binding.o
605ifeq ($(ENABLE_ABC),1)
606ifneq ($(ABCEXTERNAL),)
607kernel/yosys.o: CXXFLAGS += -DABCEXTERNAL='"$(ABCEXTERNAL)"'
608endif
609endif
610OBJS += kernel/cellaigs.o kernel/celledges.o kernel/satgen.o kernel/qcsat.o kernel/mem.o kernel/ffmerge.o kernel/ff.o
611
612kernel/log.o: CXXFLAGS += -DYOSYS_SRC='"$(YOSYS_SRC)"'
613kernel/yosys.o: CXXFLAGS += -DYOSYS_DATDIR='"$(DATDIR)"' -DYOSYS_PROGRAM_PREFIX='"$(PROGRAM_PREFIX)"'
614
615OBJS += libs/bigint/BigIntegerAlgorithms.o libs/bigint/BigInteger.o libs/bigint/BigIntegerUtils.o
616OBJS += libs/bigint/BigUnsigned.o libs/bigint/BigUnsignedInABase.o
617
618OBJS += libs/sha1/sha1.o
619
620ifneq ($(SMALL),1)
621
622OBJS += libs/json11/json11.o
623
624OBJS += libs/subcircuit/subcircuit.o
625
626OBJS += libs/ezsat/ezsat.o
627OBJS += libs/ezsat/ezminisat.o
628
629OBJS += libs/minisat/Options.o
630OBJS += libs/minisat/SimpSolver.o
631OBJS += libs/minisat/Solver.o
632OBJS += libs/minisat/System.o
633
634include $(YOSYS_SRC)/frontends/*/Makefile.inc
635include $(YOSYS_SRC)/passes/*/Makefile.inc
636include $(YOSYS_SRC)/backends/*/Makefile.inc
637include $(YOSYS_SRC)/techlibs/*/Makefile.inc
638
639else
640
641include $(YOSYS_SRC)/frontends/verilog/Makefile.inc
642include $(YOSYS_SRC)/frontends/rtlil/Makefile.inc
643include $(YOSYS_SRC)/frontends/ast/Makefile.inc
644include $(YOSYS_SRC)/frontends/blif/Makefile.inc
645
646OBJS += passes/hierarchy/hierarchy.o
647OBJS += passes/cmds/select.o
648OBJS += passes/cmds/show.o
649OBJS += passes/cmds/stat.o
650OBJS += passes/cmds/cover.o
651OBJS += passes/cmds/design.o
652OBJS += passes/cmds/plugin.o
653
654include $(YOSYS_SRC)/passes/proc/Makefile.inc
655include $(YOSYS_SRC)/passes/opt/Makefile.inc
656include $(YOSYS_SRC)/passes/techmap/Makefile.inc
657
658include $(YOSYS_SRC)/backends/verilog/Makefile.inc
659include $(YOSYS_SRC)/backends/rtlil/Makefile.inc
660
661include $(YOSYS_SRC)/techlibs/common/Makefile.inc
662
663endif
664
665ifeq ($(LINK_ABC),1)
666OBJS += $(PROGRAM_PREFIX)yosys-libabc.a
667endif
668
669# prevent the CXXFLAGS set by this Makefile from reaching abc/Makefile,
670# especially the -MD flag which will break the build when CXX is clang
671unexport CXXFLAGS
672
673top-all: $(TARGETS) $(EXTRA_TARGETS)
674	@echo ""
675	@echo "  Build successful."
676	@echo ""
677
678ifeq ($(CONFIG),emcc)
679yosys.js: $(filter-out yosysjs-$(YOSYS_VER).zip,$(EXTRA_TARGETS))
680endif
681
682$(PROGRAM_PREFIX)yosys$(EXE): $(OBJS)
683	$(P) $(LD) -o $(PROGRAM_PREFIX)yosys$(EXE) $(LDFLAGS) $(OBJS) $(LDLIBS)
684
685libyosys.so: $(filter-out kernel/driver.o,$(OBJS))
686ifeq ($(OS), Darwin)
687	$(P) $(LD) -o libyosys.so -shared -Wl,-install_name,$(LIBDIR)/libyosys.so $(LDFLAGS) $^ $(LDLIBS)
688else
689	$(P) $(LD) -o libyosys.so -shared -Wl,-soname,$(LIBDIR)/libyosys.so $(LDFLAGS) $^ $(LDLIBS)
690endif
691
692%.o: %.cc
693	$(Q) mkdir -p $(dir $@)
694	$(P) $(CXX) -o $@ -c $(CPPFLAGS) $(CXXFLAGS) $<
695
696%.pyh: %.h
697	$(Q) mkdir -p $(dir $@)
698	$(P) cat $< | grep -E -v "#[ ]*(include|error)" | $(LD) $(CXXFLAGS) -x c++ -o $@ -E -P -
699
700ifeq ($(ENABLE_PYOSYS),1)
701$(PY_WRAPPER_FILE).cc: misc/$(PY_GEN_SCRIPT).py $(PY_WRAP_INCLUDES)
702	$(Q) mkdir -p $(dir $@)
703	$(P) python$(PYTHON_VERSION) -c "from misc import $(PY_GEN_SCRIPT); $(PY_GEN_SCRIPT).gen_wrappers(\"$(PY_WRAPPER_FILE).cc\")"
704endif
705
706%.o: %.cpp
707	$(Q) mkdir -p $(dir $@)
708	$(P) $(CXX) -o $@ -c $(CPPFLAGS) $(CXXFLAGS) $<
709
710YOSYS_VER_STR := Yosys $(YOSYS_VER) (git sha1 $(GIT_REV), $(notdir $(CXX)) $(shell \
711		$(CXX) --version | tr ' ()' '\n' | grep '^[0-9]' | head -n1) $(filter -f% -m% -O% -DNDEBUG,$(CXXFLAGS)))
712
713kernel/version_$(GIT_REV).cc: $(YOSYS_SRC)/Makefile
714	$(P) rm -f kernel/version_*.o kernel/version_*.d kernel/version_*.cc
715	$(Q) mkdir -p kernel && echo "namespace Yosys { extern const char *yosys_version_str; const char *yosys_version_str=\"$(YOSYS_VER_STR)\"; }" > kernel/version_$(GIT_REV).cc
716
717ifeq ($(ENABLE_VERIFIC),1)
718CXXFLAGS_NOVERIFIC = $(foreach v,$(CXXFLAGS),$(if $(findstring $(VERIFIC_DIR),$(v)),,$(v)))
719LDLIBS_NOVERIFIC = $(foreach v,$(LDLIBS),$(if $(findstring $(VERIFIC_DIR),$(v)),,$(v)))
720else
721CXXFLAGS_NOVERIFIC = $(CXXFLAGS)
722LDLIBS_NOVERIFIC = $(LDLIBS)
723endif
724
725$(PROGRAM_PREFIX)yosys-config: misc/yosys-config.in
726	$(P) $(SED) -e 's#@CXXFLAGS@#$(subst -I. -I"$(YOSYS_SRC)",-I"$(DATDIR)/include",$(strip $(CXXFLAGS_NOVERIFIC)))#;' \
727			-e 's#@CXX@#$(strip $(CXX))#;' -e 's#@LDFLAGS@#$(strip $(LDFLAGS) $(PLUGIN_LDFLAGS))#;' -e 's#@LDLIBS@#$(strip $(LDLIBS_NOVERIFIC))#;' \
728			-e 's#@BINDIR@#$(strip $(BINDIR))#;' -e 's#@DATDIR@#$(strip $(DATDIR))#;' < $< > $(PROGRAM_PREFIX)yosys-config
729	$(Q) chmod +x $(PROGRAM_PREFIX)yosys-config
730
731abc/abc-$(ABCREV)$(EXE) abc/libabc-$(ABCREV).a:
732	$(P)
733ifneq ($(ABCREV),default)
734	$(Q) if test -d abc/.hg; then \
735		echo 'REEBE: NOP qverpgbel vf n ut jbexvat pbcl! Erzbir nop/ naq er-eha "znxr".' | tr 'A-Za-z' 'N-ZA-Mn-za-m'; false; \
736	fi
737	$(Q) if test -d abc && ! git -C abc diff-index --quiet HEAD; then \
738		echo 'REEBE: NOP pbagnvaf ybpny zbqvsvpngvbaf! Frg NOPERI=qrsnhyg va Lbflf Znxrsvyr!' | tr 'A-Za-z' 'N-ZA-Mn-za-m'; false; \
739	fi
740# set a variable so the test fails if git fails to run - when comparing outputs directly, empty string would match empty string
741	$(Q) if ! (cd abc 2> /dev/null && rev="`git rev-parse $(ABCREV)`" && test "`git rev-parse HEAD`" == "$$rev"); then \
742		test $(ABCPULL) -ne 0 || { echo 'REEBE: NOP abg hc gb qngr naq NOPCHYY frg gb 0 va Znxrsvyr!' | tr 'A-Za-z' 'N-ZA-Mn-za-m'; exit 1; }; \
743		echo "Pulling ABC from $(ABCURL):"; set -x; \
744		test -d abc || git clone $(ABCURL) abc; \
745		cd abc && $(MAKE) DEP= clean && git fetch $(ABCURL) && git checkout $(ABCREV); \
746	fi
747endif
748	$(Q) rm -f abc/abc-[0-9a-f]*
749	$(Q) $(MAKE) -C abc $(S) $(ABCMKARGS) $(if $(filter %.a,$@),PROG="abc-$(ABCREV)",PROG="abc-$(ABCREV)$(EXE)") MSG_PREFIX="$(eval P_OFFSET = 5)$(call P_SHOW)$(eval P_OFFSET = 10) ABC: " $(if $(filter %.a,$@),libabc-$(ABCREV).a)
750
751ifeq ($(ABCREV),default)
752.PHONY: abc/abc-$(ABCREV)$(EXE)
753.PHONY: abc/libabc-$(ABCREV).a
754endif
755
756$(PROGRAM_PREFIX)yosys-abc$(EXE): abc/abc-$(ABCREV)$(EXE)
757	$(P) cp abc/abc-$(ABCREV)$(EXE) $(PROGRAM_PREFIX)yosys-abc$(EXE)
758
759$(PROGRAM_PREFIX)yosys-libabc.a: abc/libabc-$(ABCREV).a
760	$(P) cp abc/libabc-$(ABCREV).a $(PROGRAM_PREFIX)yosys-libabc.a
761
762ifneq ($(SEED),)
763SEEDOPT="-S $(SEED)"
764else
765SEEDOPT=""
766endif
767
768ifneq ($(ABCEXTERNAL),)
769ABCOPT="-A $(ABCEXTERNAL)"
770else
771ABCOPT=""
772endif
773
774test: $(TARGETS) $(EXTRA_TARGETS)
775	+cd tests/simple && bash run-test.sh $(SEEDOPT)
776	+cd tests/simple_abc9 && bash run-test.sh $(SEEDOPT)
777	+cd tests/hana && bash run-test.sh $(SEEDOPT)
778	+cd tests/asicworld && bash run-test.sh $(SEEDOPT)
779	# +cd tests/realmath && bash run-test.sh $(SEEDOPT)
780	+cd tests/share && bash run-test.sh $(SEEDOPT)
781	+cd tests/opt_share && bash run-test.sh $(SEEDOPT)
782	+cd tests/fsm && bash run-test.sh $(SEEDOPT)
783	+cd tests/techmap && bash run-test.sh
784	+cd tests/memories && bash run-test.sh $(ABCOPT) $(SEEDOPT)
785	+cd tests/bram && bash run-test.sh $(SEEDOPT)
786	+cd tests/various && bash run-test.sh
787	+cd tests/select && bash run-test.sh
788	+cd tests/sat && bash run-test.sh
789	+cd tests/svinterfaces && bash run-test.sh $(SEEDOPT)
790	+cd tests/svtypes && bash run-test.sh $(SEEDOPT)
791	+cd tests/proc && bash run-test.sh
792	+cd tests/blif && bash run-test.sh
793	+cd tests/opt && bash run-test.sh
794	+cd tests/aiger && bash run-test.sh $(ABCOPT)
795	+cd tests/arch && bash run-test.sh
796	+cd tests/arch/ice40 && bash run-test.sh $(SEEDOPT)
797	+cd tests/arch/xilinx && bash run-test.sh $(SEEDOPT)
798	+cd tests/arch/ecp5 && bash run-test.sh $(SEEDOPT)
799	+cd tests/arch/machxo2 && bash run-test.sh $(SEEDOPT)
800	+cd tests/arch/efinix && bash run-test.sh $(SEEDOPT)
801	+cd tests/arch/anlogic && bash run-test.sh $(SEEDOPT)
802	+cd tests/arch/gowin && bash run-test.sh $(SEEDOPT)
803	+cd tests/arch/intel_alm && bash run-test.sh $(SEEDOPT)
804	+cd tests/arch/nexus && bash run-test.sh $(SEEDOPT)
805	+cd tests/arch/quicklogic && bash run-test.sh $(SEEDOPT)
806	+cd tests/arch/gatemate && bash run-test.sh $(SEEDOPT)
807	+cd tests/rpc && bash run-test.sh
808	+cd tests/memfile && bash run-test.sh
809	+cd tests/verilog && bash run-test.sh
810	@echo ""
811	@echo "  Passed \"make test\"."
812	@echo ""
813
814VALGRIND ?= valgrind --error-exitcode=1 --leak-check=full --show-reachable=yes --errors-for-leak-kinds=all
815
816vgtest: $(TARGETS) $(EXTRA_TARGETS)
817	$(VALGRIND) ./yosys -p 'setattr -mod -unset top; synth' $$( ls tests/simple/*.v | grep -v repwhile.v )
818	@echo ""
819	@echo "  Passed \"make vgtest\"."
820	@echo ""
821
822vloghtb: $(TARGETS) $(EXTRA_TARGETS)
823	+cd tests/vloghtb && bash run-test.sh
824	@echo ""
825	@echo "  Passed \"make vloghtb\"."
826	@echo ""
827
828ystests: $(TARGETS) $(EXTRA_TARGETS)
829	rm -rf tests/ystests
830	git clone https://github.com/YosysHQ/yosys-tests.git tests/ystests
831	+$(MAKE) PATH="$$PWD:$$PATH" -C tests/ystests
832	@echo ""
833	@echo "  Finished \"make ystests\"."
834	@echo ""
835
836# Unit test
837unit-test: libyosys.so
838	@$(MAKE) -C $(UNITESTPATH) CXX="$(CXX)" CPPFLAGS="$(CPPFLAGS)" \
839		CXXFLAGS="$(CXXFLAGS)" LDLIBS="$(LDLIBS)" ROOTPATH="$(CURDIR)"
840
841clean-unit-test:
842	@$(MAKE) -C $(UNITESTPATH) clean
843
844install: $(TARGETS) $(EXTRA_TARGETS)
845	$(INSTALL_SUDO) mkdir -p $(DESTDIR)$(BINDIR)
846	$(INSTALL_SUDO) cp $(filter-out libyosys.so,$(TARGETS)) $(DESTDIR)$(BINDIR)
847ifneq ($(filter $(PROGRAM_PREFIX)yosys,$(TARGETS)),)
848	$(INSTALL_SUDO) $(STRIP) -S $(DESTDIR)$(BINDIR)/$(PROGRAM_PREFIX)yosys
849endif
850ifneq ($(filter $(PROGRAM_PREFIX)yosys-abc,$(TARGETS)),)
851	$(INSTALL_SUDO) $(STRIP) $(DESTDIR)$(BINDIR)/$(PROGRAM_PREFIX)yosys-abc
852endif
853ifneq ($(filter $(PROGRAM_PREFIX)yosys-filterlib,$(TARGETS)),)
854	$(INSTALL_SUDO) $(STRIP) $(DESTDIR)$(BINDIR)/$(PROGRAM_PREFIX)yosys-filterlib
855endif
856	$(INSTALL_SUDO) mkdir -p $(DESTDIR)$(DATDIR)
857	$(INSTALL_SUDO) cp -r share/. $(DESTDIR)$(DATDIR)/.
858ifeq ($(ENABLE_LIBYOSYS),1)
859	$(INSTALL_SUDO) mkdir -p $(DESTDIR)$(LIBDIR)
860	$(INSTALL_SUDO) cp libyosys.so $(DESTDIR)$(LIBDIR)/
861	$(INSTALL_SUDO) $(STRIP) -S $(DESTDIR)$(LIBDIR)/libyosys.so
862ifeq ($(ENABLE_PYOSYS),1)
863	$(INSTALL_SUDO) mkdir -p $(DESTDIR)$(PYTHON_DESTDIR)/$(subst -,_,$(PROGRAM_PREFIX))pyosys
864	$(INSTALL_SUDO) cp libyosys.so $(DESTDIR)$(PYTHON_DESTDIR)/$(subst -,_,$(PROGRAM_PREFIX))pyosys/libyosys.so
865	$(INSTALL_SUDO) cp misc/__init__.py $(DESTDIR)$(PYTHON_DESTDIR)/$(subst -,_,$(PROGRAM_PREFIX))pyosys/
866endif
867endif
868
869uninstall:
870	$(INSTALL_SUDO) rm -vf $(addprefix $(DESTDIR)$(BINDIR)/,$(notdir $(TARGETS)))
871	$(INSTALL_SUDO) rm -rvf $(DESTDIR)$(DATDIR)
872ifeq ($(ENABLE_LIBYOSYS),1)
873	$(INSTALL_SUDO) rm -vf $(DESTDIR)$(LIBDIR)/libyosys.so
874ifeq ($(ENABLE_PYOSYS),1)
875	$(INSTALL_SUDO) rm -vf $(DESTDIR)$(PYTHON_DESTDIR)/$(subst -,_,$(PROGRAM_PREFIX))pyosys/libyosys.so
876	$(INSTALL_SUDO) rm -vf $(DESTDIR)$(PYTHON_DESTDIR)/$(subst -,_,$(PROGRAM_PREFIX))pyosys/__init__.py
877	$(INSTALL_SUDO) rmdir $(DESTDIR)$(PYTHON_DESTDIR)/$(subst -,_,$(PROGRAM_PREFIX))pyosys
878endif
879endif
880
881update-manual: $(TARGETS) $(EXTRA_TARGETS)
882	cd manual && ../$(PROGRAM_PREFIX)yosys -p 'help -write-tex-command-reference-manual'
883
884manual: $(TARGETS) $(EXTRA_TARGETS)
885	cd manual && bash appnotes.sh
886	cd manual && bash presentation.sh
887	cd manual && bash manual.sh
888
889clean:
890	rm -rf share
891	rm -rf kernel/*.pyh
892	if test -d manual; then cd manual && sh clean.sh; fi
893	rm -f $(OBJS) $(GENFILES) $(TARGETS) $(EXTRA_TARGETS) $(EXTRA_OBJS) $(PY_WRAP_INCLUDES) $(PY_WRAPPER_FILE).cc
894	rm -f kernel/version_*.o kernel/version_*.cc
895	rm -f libs/*/*.d frontends/*/*.d passes/*/*.d backends/*/*.d kernel/*.d techlibs/*/*.d
896	rm -rf tests/asicworld/*.out tests/asicworld/*.log
897	rm -rf tests/hana/*.out tests/hana/*.log
898	rm -rf tests/simple/*.out tests/simple/*.log
899	rm -rf tests/memories/*.out tests/memories/*.log tests/memories/*.dmp
900	rm -rf tests/sat/*.log tests/techmap/*.log tests/various/*.log
901	rm -rf tests/bram/temp tests/fsm/temp tests/realmath/temp tests/share/temp tests/smv/temp
902	rm -rf vloghtb/Makefile vloghtb/refdat vloghtb/rtl vloghtb/scripts vloghtb/spec vloghtb/check_yosys vloghtb/vloghammer_tb.tar.bz2 vloghtb/temp vloghtb/log_test_*
903	rm -f tests/svinterfaces/*.log_stdout tests/svinterfaces/*.log_stderr tests/svinterfaces/dut_result.txt tests/svinterfaces/reference_result.txt tests/svinterfaces/a.out tests/svinterfaces/*_syn.v tests/svinterfaces/*.diff
904	rm -f  tests/tools/cmp_tbdata
905
906clean-abc:
907	$(MAKE) -C abc DEP= clean
908	rm -f $(PROGRAM_PREFIX)yosys-abc$(EXE) $(PROGRAM_PREFIX)yosys-libabc.a abc/abc-[0-9a-f]* abc/libabc-[0-9a-f]*.a
909
910mrproper: clean
911	git clean -xdf
912
913coverage:
914	./$(PROGRAM_PREFIX)yosys -qp 'help; help -all'
915	rm -rf coverage.info coverage_html
916	lcov --capture -d . --no-external -o coverage.info
917	genhtml coverage.info --output-directory coverage_html
918
919qtcreator:
920	{ for file in $(basename $(OBJS)); do \
921		for prefix in cc y l; do if [ -f $${file}.$${prefix} ]; then echo $$file.$${prefix}; fi; done \
922	done; find backends frontends kernel libs passes -type f \( -name '*.h' -o -name '*.hh' \); } > qtcreator.files
923	{ echo .; find backends frontends kernel libs passes -type f \( -name '*.h' -o -name '*.hh' \) -printf '%h\n' | sort -u; } > qtcreator.includes
924	touch qtcreator.config qtcreator.creator
925
926vcxsrc: $(GENFILES) $(EXTRA_TARGETS)
927	rm -rf yosys-win32-vcxsrc-$(YOSYS_VER){,.zip}
928	set -e; for f in `ls $(filter %.cc %.cpp,$(GENFILES)) $(addsuffix .cc,$(basename $(OBJS))) $(addsuffix .cpp,$(basename $(OBJS))) 2> /dev/null`; do \
929		echo "Analyse: $$f" >&2; cpp -std=c++11 -MM -I. -D_YOSYS_ $$f; done | sed 's,.*:,,; s,//*,/,g; s,/[^/]*/\.\./,/,g; y, \\,\n\n,;' | grep '^[^/]' | sort -u | grep -v kernel/version_ > srcfiles.txt
930	bash misc/create_vcxsrc.sh yosys-win32-vcxsrc $(YOSYS_VER) $(GIT_REV)
931	echo "namespace Yosys { extern const char *yosys_version_str; const char *yosys_version_str=\"Yosys (Version Information Unavailable)\"; }" > kernel/version.cc
932	zip yosys-win32-vcxsrc-$(YOSYS_VER)/genfiles.zip $(GENFILES) kernel/version.cc
933	zip -r yosys-win32-vcxsrc-$(YOSYS_VER).zip yosys-win32-vcxsrc-$(YOSYS_VER)/
934	rm -f srcfiles.txt kernel/version.cc
935
936ifeq ($(CONFIG),mxe)
937mxebin: $(TARGETS) $(EXTRA_TARGETS)
938	rm -rf yosys-win32-mxebin-$(YOSYS_VER){,.zip}
939	mkdir -p yosys-win32-mxebin-$(YOSYS_VER)
940	cp -r $(PROGRAM_PREFIX)yosys.exe share/ yosys-win32-mxebin-$(YOSYS_VER)/
941ifeq ($(ENABLE_ABC),1)
942	cp -r $(PROGRAM_PREFIX)yosys-abc.exe abc/lib/x86/pthreadVC2.dll yosys-win32-mxebin-$(YOSYS_VER)/
943endif
944	echo -en 'This is Yosys $(YOSYS_VER) for Win32.\r\n' > yosys-win32-mxebin-$(YOSYS_VER)/readme.txt
945	echo -en 'Documentation at https://yosyshq.net/yosys/.\r\n' >> yosys-win32-mxebin-$(YOSYS_VER)/readme.txt
946	zip -r yosys-win32-mxebin-$(YOSYS_VER).zip yosys-win32-mxebin-$(YOSYS_VER)/
947endif
948
949config-clean: clean
950	rm -f Makefile.conf
951
952config-clang: clean
953	echo 'CONFIG := clang' > Makefile.conf
954
955config-gcc: clean
956	echo 'CONFIG := gcc' > Makefile.conf
957
958config-gcc-static: clean
959	echo 'CONFIG := gcc-static' > Makefile.conf
960	echo 'ENABLE_PLUGINS := 0' >> Makefile.conf
961	echo 'ENABLE_READLINE := 0' >> Makefile.conf
962	echo 'ENABLE_TCL := 0' >> Makefile.conf
963
964config-gcc-4.8: clean
965	echo 'CONFIG := gcc-4.8' > Makefile.conf
966
967config-afl-gcc: clean
968	echo 'CONFIG := afl-gcc' > Makefile.conf
969
970config-emcc: clean
971	echo 'CONFIG := emcc' > Makefile.conf
972	echo 'ENABLE_TCL := 0' >> Makefile.conf
973	echo 'ENABLE_ABC := 0' >> Makefile.conf
974	echo 'ENABLE_PLUGINS := 0' >> Makefile.conf
975	echo 'ENABLE_READLINE := 0' >> Makefile.conf
976	echo 'ENABLE_ZLIB := 0' >> Makefile.conf
977
978config-wasi: clean
979	echo 'CONFIG := wasi' > Makefile.conf
980	echo 'ENABLE_TCL := 0' >> Makefile.conf
981	echo 'ENABLE_ABC := 0' >> Makefile.conf
982	echo 'ENABLE_PLUGINS := 0' >> Makefile.conf
983	echo 'ENABLE_READLINE := 0' >> Makefile.conf
984	echo 'ENABLE_ZLIB := 0' >> Makefile.conf
985
986config-mxe: clean
987	echo 'CONFIG := mxe' > Makefile.conf
988	echo 'ENABLE_PLUGINS := 0' >> Makefile.conf
989
990config-msys2-32: clean
991	echo 'CONFIG := msys2-32' > Makefile.conf
992	echo 'ENABLE_PLUGINS := 0' >> Makefile.conf
993	echo "PREFIX := $(MINGW_PREFIX)" >> Makefile.conf
994
995config-msys2-64: clean
996	echo 'CONFIG := msys2-64' > Makefile.conf
997	echo 'ENABLE_PLUGINS := 0' >> Makefile.conf
998	echo "PREFIX := $(MINGW_PREFIX)" >> Makefile.conf
999
1000config-cygwin: clean
1001	echo 'CONFIG := cygwin' > Makefile.conf
1002
1003config-gcov: clean
1004	echo 'CONFIG := gcc' > Makefile.conf
1005	echo 'ENABLE_GCOV := 1' >> Makefile.conf
1006	echo 'ENABLE_DEBUG := 1' >> Makefile.conf
1007
1008config-gprof: clean
1009	echo 'CONFIG := gcc' > Makefile.conf
1010	echo 'ENABLE_GPROF := 1' >> Makefile.conf
1011
1012config-sudo:
1013	echo "INSTALL_SUDO := sudo" >> Makefile.conf
1014
1015echo-yosys-ver:
1016	@echo "$(YOSYS_VER)"
1017
1018echo-git-rev:
1019	@echo "$(GIT_REV)"
1020
1021echo-abc-rev:
1022	@echo "$(ABCREV)"
1023
1024-include libs/*/*.d
1025-include frontends/*/*.d
1026-include passes/*/*.d
1027-include backends/*/*.d
1028-include kernel/*.d
1029-include techlibs/*/*.d
1030
1031.PHONY: all top-all abc test install install-abc manual clean mrproper qtcreator coverage vcxsrc mxebin
1032.PHONY: config-clean config-clang config-gcc config-gcc-static config-gcc-4.8 config-afl-gcc config-gprof config-sudo
1033