diff options
Diffstat (limited to 'Makefile')
-rw-r--r-- | Makefile | 201 |
1 files changed, 149 insertions, 52 deletions
@@ -1,7 +1,7 @@ CONFIG := icc # CONFIG := gcc -# CONFIG := gcc-4.6 +# CONFIG := gcc-4.8 # CONFIG := emcc # CONFIG := mxe @@ -12,16 +12,26 @@ ENABLE_PLUGINS := 1 ENABLE_READLINE := 1 ENABLE_VERIFIC := 0 ENABLE_COVER := 1 +ENABLE_LIBYOSYS := 0 # other configuration flags ENABLE_GPROF := 0 ENABLE_NDEBUG := 0 -DESTDIR := /usr/local +# clang sanitizers +SANITIZER = +# SANITIZER = address +# SANITIZER = memory +# SANITIZER = undefined +# SANITIZER = cfi + + +PREFIX ?= /usr/local INSTALL_SUDO := -TARGET_BINDIR := $(DESTDIR)/bin -TARGET_DATDIR := $(DESTDIR)/share/yosys +BINDIR := $(PREFIX)/bin +LIBDIR := $(PREFIX)/lib +DATDIR := $(PREFIX)/share/yosys EXE = OBJS = @@ -35,10 +45,14 @@ SMALL = 0 all: top-all -YOSYS_SRC := $(shell pwd) -CXXFLAGS = -Wall -Wextra -ggdb -I"$(YOSYS_SRC)" -MD -D_YOSYS_ -fPIC -I$(DESTDIR)/include -LDFLAGS = -L$(DESTDIR)/lib +YOSYS_SRC := $(dir $(firstword $(MAKEFILE_LIST))) +VPATH := $(YOSYS_SRC) + +CXXFLAGS += -Wall -Wextra -ggdb -I. -I"$(YOSYS_SRC)" -MD -D_YOSYS_ -fPIC -I$(PREFIX)/include +LDFLAGS += -L$(LIBDIR) LDLIBS = -lstdc++ -lm + +PKG_CONFIG = pkg-config SED = sed BISON = bison @@ -51,14 +65,14 @@ ifeq (Darwin,$(findstring Darwin,$(shell uname))) LDFLAGS += $(shell PKG_CONFIG_PATH=$$(brew list libffi | grep pkgconfig | xargs dirname) pkg-config --silence-errors --libs libffi) # use bison installed by homebrew if available BISON = $(shell (brew list bison | grep -m1 "bin/bison") || echo bison) - SED = gsed + SED = sed else LDFLAGS += -rdynamic LDLIBS += -lrt endif -YOSYS_VER := 0.5 -GIT_REV := $(shell git rev-parse --short HEAD 2> /dev/null || echo UNKNOWN) +YOSYS_VER := 0.6+$(shell test -d .git && { git log --author=clifford@clifford.at --oneline 5869d26da021.. | wc -l; }) +GIT_REV := $(shell cd $(YOSYS_SRC) && git rev-parse --short HEAD 2> /dev/null || echo UNKNOWN) OBJS = kernel/version_$(GIT_REV).o # set 'ABCREV = default' to use abc/ as it is @@ -67,9 +81,13 @@ OBJS = kernel/version_$(GIT_REV).o # is just a symlink to your actual ABC working directory, as 'make mrproper' # will remove the 'abc' directory and you do not want to accidentally # delete your work on ABC.. -ABCREV = 61ad5f908c03 +ABCREV = b5df6e2b76f0 ABCPULL = 1 -ABCMKARGS = # CC="$(CXX)" CXX="$(CXX)" +ABCMKARGS = CC="$(CXX)" CXX="$(CXX)" + +# set ABCEXTERNAL = <abc-command> to use an external ABC instance +# Note: The in-tree ABC (yosys-abc) will not be installed when ABCEXTERNAL is set. +ABCEXTERNAL = define newline @@ -83,30 +101,75 @@ endif ifeq ($(CONFIG),clang) CXX = clang +LD = clang++ CXXFLAGS += -std=c++11 -Os +ifneq ($(SANITIZER),) +$(info [Clang Sanitizer] $(SANITIZER)) +CXXFLAGS += -g -O1 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=$(SANITIZER) +LDFLAGS += -g -fsanitize=$(SANITIZER) +ifeq ($(SANITIZER),address) +ENABLE_COVER := 0 +endif +ifeq ($(SANITIZER),memory) +CXXFLAGS += -fPIE -fsanitize-memory-track-origins +LDFLAGS += -fPIE -fsanitize-memory-track-origins +endif +ifeq ($(SANITIZER),cfi) +CXXFLAGS += -flto +LDFLAGS += -flto +endif +endif + else ifeq ($(CONFIG),gcc) CXX = gcc -CXXFLAGS += -std=gnu++0x -Os +LD = gcc +CXXFLAGS += -std=c++11 -Os -else ifeq ($(CONFIG),gcc-4.6) -CXX = gcc-4.6 -CXXFLAGS += -std=gnu++0x -Os +else ifeq ($(CONFIG),gcc-4.8) +CXX = gcc-4.8 +LD = gcc-4.8 +CXXFLAGS += -std=c++11 -Os else ifeq ($(CONFIG),emcc) CXX = emcc -CXXFLAGS += -std=c++11 -Os -Wno-warn-absolute-paths -CXXFLAGS := $(filter-out -ggdb,$(CXXFLAGS)) -EXE = .html +LD = emcc +CXXFLAGS := -std=c++11 $(filter-out -fPIC -ggdb,$(CXXFLAGS)) +EMCCFLAGS := -Os -Wno-warn-absolute-paths +EMCCFLAGS += --memory-init-file 0 --embed-file share -s NO_EXIT_RUNTIME=1 +EMCCFLAGS += -s EXPORTED_FUNCTIONS="['_main','_run','_prompt','_errmsg']" +EMCCFLAGS += -s TOTAL_MEMORY=128*1024*1024 +# https://github.com/kripken/emscripten/blob/master/src/settings.js +CXXFLAGS += $(EMCCFLAGS) +LDFLAGS += $(EMCCFLAGS) +LDLIBS = +EXE = .js + +TARGETS := $(filter-out yosys-config,$(TARGETS)) +EXTRA_TARGETS += yosysjs-$(YOSYS_VER).zip + +viz.js: + wget -O viz.js.part https://github.com/mdaines/viz.js/releases/download/0.0.3/viz.js + mv viz.js.part viz.js + +yosysjs-$(YOSYS_VER).zip: yosys.js viz.js misc/yosysjs/* + rm -rf yosysjs-$(YOSYS_VER) yosysjs-$(YOSYS_VER).zip + mkdir -p yosysjs-$(YOSYS_VER) + cp viz.js misc/yosysjs/* yosys.js yosysjs-$(YOSYS_VER)/ + zip -r yosysjs-$(YOSYS_VER).zip yosysjs-$(YOSYS_VER) + +yosys.html: misc/yosys.html + $(P) cp misc/yosys.html yosys.html else ifeq ($(CONFIG),mxe) -CXX = /usr/local/src/mxe/usr/bin/i686-pc-mingw32-gcc -CXXFLAGS += -std=gnu++0x -Os -D_POSIX_SOURCE +CXX = /usr/local/src/mxe/usr/bin/i686-w64-mingw32.static-gcc +LD = /usr/local/src/mxe/usr/bin/i686-w64-mingw32.static-gcc +CXXFLAGS += -std=c++11 -Os -D_POSIX_SOURCE CXXFLAGS := $(filter-out -fPIC,$(CXXFLAGS)) LDFLAGS := $(filter-out -rdynamic,$(LDFLAGS)) -s LDLIBS := $(filter-out -lrt,$(LDLIBS)) ABCMKARGS += ARCHFLAGS="-DSIZEOF_VOID_P=4 -DSIZEOF_LONG=4 -DSIZEOF_INT=4 -DWIN32_NO_DLL -x c++ -fpermissive -w" -ABCMKARGS += LIBS="lib/x86/pthreadVC2.lib -s" READLINE=0 CC="$(CXX)" CXX="$(CXX)" +ABCMKARGS += LIBS="lib/x86/pthreadVC2.lib -s" ABC_USE_NO_READLINE=1 CC="$(CXX)" CXX="$(CXX)" EXE = .exe else ifeq ($(CONFIG),icc) @@ -114,7 +177,11 @@ CXX = icpc CXXFLAGS += -std=gnu++0x -Os else ifneq ($(CONFIG),none) -$(error Invalid CONFIG setting '$(CONFIG)'. Valid values: clang, gcc, gcc-4.6, emcc, none) +$(error Invalid CONFIG setting '$(CONFIG)'. Valid values: clang, gcc, gcc-4.8, emcc, none) +endif + +ifeq ($(ENABLE_LIBYOSYS),1) +TARGETS += libyosys.so endif ifeq ($(ENABLE_READLINE),1) @@ -126,12 +193,12 @@ endif endif ifeq ($(ENABLE_PLUGINS),1) -CXXFLAGS += -DYOSYS_ENABLE_PLUGINS $(shell pkg-config --silence-errors --cflags libffi) -LDLIBS += $(shell pkg-config --silence-errors --libs libffi || echo -lffi) -ldl +CXXFLAGS += -DYOSYS_ENABLE_PLUGINS $(shell $(PKG_CONFIG) --silence-errors --cflags libffi) +LDLIBS += $(shell $(PKG_CONFIG) --silence-errors --libs libffi || echo -lffi) -ldl endif ifeq ($(ENABLE_TCL),1) -TCL_VERSION ?= tcl$(shell echo 'puts [info tclversion]' | tclsh) +TCL_VERSION ?= tcl$(shell bash -c "tclsh <(echo 'puts [info tclversion]')") TCL_INCLUDE ?= /usr/include/$(TCL_VERSION) CXXFLAGS += -I$(TCL_INCLUDE) -DYOSYS_ENABLE_TCL LDLIBS += -l$(TCL_VERSION) @@ -148,12 +215,14 @@ endif ifeq ($(ENABLE_ABC),1) CXXFLAGS += -DYOSYS_ENABLE_ABC +ifeq ($(ABCEXTERNAL),) TARGETS += yosys-abc$(EXE) endif +endif ifeq ($(ENABLE_VERIFIC),1) VERIFIC_DIR ?= /usr/local/src/verific_lib_eval -VERIFIC_COMPONENTS ?= verilog vhdl database util containers +VERIFIC_COMPONENTS ?= verilog vhdl database util containers sdf CXXFLAGS += $(patsubst %,-I$(VERIFIC_DIR)/%,$(VERIFIC_COMPONENTS)) -DYOSYS_ENABLE_VERIFIC LDLIBS += $(patsubst %,$(VERIFIC_DIR)/%/*-linux.a,$(VERIFIC_COMPONENTS)) endif @@ -166,6 +235,13 @@ define add_share_file EXTRA_TARGETS += $(subst //,/,$(1)/$(notdir $(2))) $(subst //,/,$(1)/$(notdir $(2))): $(2) $$(P) mkdir -p $(1) + $$(Q) cp "$(YOSYS_SRC)"/$(2) $(subst //,/,$(1)/$(notdir $(2))) +endef + +define add_gen_share_file +EXTRA_TARGETS += $(subst //,/,$(1)/$(notdir $(2))) +$(subst //,/,$(1)/$(notdir $(2))): $(2) + $$(P) mkdir -p $(1) $$(Q) cp $(2) $(subst //,/,$(1)/$(notdir $(2))) endef @@ -204,10 +280,12 @@ $(eval $(call add_include_file,libs/ezsat/ezsat.h)) $(eval $(call add_include_file,libs/ezsat/ezminisat.h)) $(eval $(call add_include_file,libs/sha1/sha1.h)) $(eval $(call add_include_file,passes/fsm/fsmdata.h)) +$(eval $(call add_include_file,frontends/ast/ast.h)) $(eval $(call add_include_file,backends/ilang/ilang_backend.h)) -OBJS += kernel/driver.o kernel/register.o kernel/rtlil.o kernel/log.o kernel/calc.o kernel/yosys.o +OBJS += kernel/driver.o kernel/register.o kernel/rtlil.o kernel/log.o kernel/calc.o kernel/yosys.o kernel/cellaigs.o kernel/log.o: CXXFLAGS += -DYOSYS_SRC='"$(YOSYS_SRC)"' +kernel/yosys.o: CXXFLAGS += -DYOSYS_DATDIR='"$(DATDIR)"' OBJS += libs/bigint/BigIntegerAlgorithms.o libs/bigint/BigInteger.o libs/bigint/BigIntegerUtils.o OBJS += libs/bigint/BigUnsigned.o libs/bigint/BigUnsignedInABase.o @@ -226,16 +304,17 @@ OBJS += libs/minisat/SimpSolver.o OBJS += libs/minisat/Solver.o OBJS += libs/minisat/System.o -include frontends/*/Makefile.inc -include passes/*/Makefile.inc -include backends/*/Makefile.inc -include techlibs/*/Makefile.inc +include $(YOSYS_SRC)/frontends/*/Makefile.inc +include $(YOSYS_SRC)/passes/*/Makefile.inc +include $(YOSYS_SRC)/backends/*/Makefile.inc +include $(YOSYS_SRC)/techlibs/*/Makefile.inc else include frontends/verilog/Makefile.inc include frontends/ilang/Makefile.inc include frontends/ast/Makefile.inc +include frontends/blif/Makefile.inc OBJS += passes/hierarchy/hierarchy.o OBJS += passes/cmds/select.o @@ -248,7 +327,6 @@ OBJS += passes/cmds/plugin.o include passes/proc/Makefile.inc include passes/opt/Makefile.inc include passes/techmap/Makefile.inc -include passes/abc/Makefile.inc include backends/verilog/Makefile.inc include backends/ilang/Makefile.inc @@ -262,24 +340,33 @@ top-all: $(TARGETS) $(EXTRA_TARGETS) @echo " Build successful." @echo "" +ifeq ($(CONFIG),emcc) +yosys.js: $(filter-out yosysjs-$(YOSYS_VER).zip,$(EXTRA_TARGETS)) +endif + yosys$(EXE): $(OBJS) - $(P) $(CXX) -o yosys$(EXE) $(LDFLAGS) $(OBJS) $(LDLIBS) + $(P) $(LD) -o yosys$(EXE) $(LDFLAGS) $(OBJS) $(LDLIBS) + +libyosys.so: $(filter-out kernel/driver.o,$(OBJS)) + $(P) $(LD) -o libyosys.so -shared -Wl,-soname,libyosys.so $(LDFLAGS) $^ $(LDLIBS) %.o: %.cc - $(P) $(CXX) -o $@ -c $(CXXFLAGS) $< + $(Q) mkdir -p $(dir $@) + $(P) $(CXX) -o $@ -c $(CPPFLAGS) $(CXXFLAGS) $< %.o: %.cpp - $(P) $(CXX) -o $@ -c $(CXXFLAGS) $< + $(Q) mkdir -p $(dir $@) + $(P) $(CXX) -o $@ -c $(CPPFLAGS) $(CXXFLAGS) $< -kernel/version_$(GIT_REV).cc: Makefile +kernel/version_$(GIT_REV).cc: $(YOSYS_SRC)/Makefile $(P) rm -f kernel/version_*.o kernel/version_*.d kernel/version_*.cc - $(Q) echo "namespace Yosys { extern const char *yosys_version_str; const char *yosys_version_str=\"Yosys $(YOSYS_VER) (git sha1 $(GIT_REV), $(notdir $(CXX)) ` \ + $(Q) mkdir -p kernel && echo "namespace Yosys { extern const char *yosys_version_str; const char *yosys_version_str=\"Yosys $(YOSYS_VER) (git sha1 $(GIT_REV), $(notdir $(CXX)) ` \ $(CXX) --version | tr ' ()' '\n' | grep '^[0-9]' | head -n1` $(filter -f% -m% -O% -DNDEBUG,$(CXXFLAGS)))\"; }" > kernel/version_$(GIT_REV).cc yosys-config: misc/yosys-config.in - $(P) $(SED) -e 's,@CXXFLAGS@,$(subst -I"$(YOSYS_SRC)",-I"$(TARGET_DATDIR)/include",$(CXXFLAGS)),;' \ - -e 's,@CXX@,$(CXX),;' -e 's,@LDFLAGS@,$(LDFLAGS),;' -e 's,@LDLIBS@,$(LDLIBS),;' \ - -e 's,@BINDIR@,$(TARGET_BINDIR),;' -e 's,@DATDIR@,$(TARGET_DATDIR),;' < misc/yosys-config.in > yosys-config + $(P) $(SED) -e 's#@CXXFLAGS@#$(subst -I. -I"$(YOSYS_SRC)",-I"$(DATDIR)/include",$(CXXFLAGS))#;' \ + -e 's#@CXX@#$(CXX)#;' -e 's#@LDFLAGS@#$(LDFLAGS)#;' -e 's#@LDLIBS@#$(LDLIBS)#;' \ + -e 's#@BINDIR@#$(BINDIR)#;' -e 's#@DATDIR@#$(DATDIR)#;' < $< > yosys-config $(Q) chmod +x yosys-config abc/abc-$(ABCREV)$(EXE): @@ -336,14 +423,24 @@ vloghtb: $(TARGETS) $(EXTRA_TARGETS) @echo "" install: $(TARGETS) $(EXTRA_TARGETS) - $(INSTALL_SUDO) mkdir -p $(DESTDIR)/bin - $(INSTALL_SUDO) install $(TARGETS) $(DESTDIR)/bin/ - $(INSTALL_SUDO) mkdir -p $(DESTDIR)/share/yosys - $(INSTALL_SUDO) cp -r share/. $(DESTDIR)/share/yosys/. + $(INSTALL_SUDO) mkdir -p $(DESTDIR)$(BINDIR) + $(INSTALL_SUDO) install $(TARGETS) $(DESTDIR)$(BINDIR) + $(INSTALL_SUDO) mkdir -p $(DESTDIR)$(DATDIR) + $(INSTALL_SUDO) cp -r share/. $(DESTDIR)$(DATDIR)/. +ifeq ($(ENABLE_LIBYOSYS),1) + $(INSTALL_SUDO) cp libyosys.so $(DESTDIR)$(LIBDIR) + $(INSTALL_SUDO) ldconfig +endif uninstall: - $(INSTALL_SUDO) rm -vf $(addprefix $(DESTDIR)/bin/,$(notdir $(TARGETS))) - $(INSTALL_SUDO) rm -rvf $(DESTDIR)/share/yosys/ + $(INSTALL_SUDO) rm -vf $(addprefix $(DESTDIR)$(BINDIR),$(notdir $(TARGETS))) + $(INSTALL_SUDO) rm -rvf $(DESTDIR)$(DATDIR) +ifeq ($(ENABLE_LIBYOSYS),1) + $(INSTALL_SUDO) rm -vf $(DESTDIR)$(LIBDIR)/libyosys.so +endif + +update-manual: $(TARGETS) $(EXTRA_TARGETS) + cd manual && ../yosys -p 'help -write-tex-command-reference-manual' manual: $(TARGETS) $(EXTRA_TARGETS) cd manual && bash appnotes.sh @@ -352,7 +449,7 @@ manual: $(TARGETS) $(EXTRA_TARGETS) clean: rm -rf share - cd manual && bash clean.sh + if test -d manual; then cd manual && sh clean.sh; fi rm -f $(OBJS) $(GENFILES) $(TARGETS) $(EXTRA_TARGETS) $(EXTRA_OBJS) rm -f kernel/version_*.o kernel/version_*.cc abc/abc-[0-9a-f]* rm -f libs/*/*.d frontends/*/*.d passes/*/*.d backends/*/*.d kernel/*.d techlibs/*/*.d @@ -374,7 +471,7 @@ qtcreator: vcxsrc: $(GENFILES) $(EXTRA_TARGETS) rm -rf yosys-win32-vcxsrc-$(YOSYS_VER){,.zip} set -e; for f in `ls $(filter %.cc %.cpp,$(GENFILES)) $(addsuffix .cc,$(basename $(OBJS))) $(addsuffix .cpp,$(basename $(OBJS))) 2> /dev/null`; do \ - echo "Analyse: $$f" >&2; cpp -std=gnu++0x -MM -I. -D_YOSYS_ $$f; done | sed 's,.*:,,; s,//*,/,g; s,/[^/]*/\.\./,/,g; y, \\,\n\n,;' | grep '^[^/]' | sort -u | grep -v kernel/version_ > srcfiles.txt + 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 bash misc/create_vcxsrc.sh yosys-win32-vcxsrc $(YOSYS_VER) $(GIT_REV) echo "namespace Yosys { extern const char *yosys_version_str; const char *yosys_version_str=\"Yosys (Version Information Unavailable)\"; }" > kernel/version.cc zip yosys-win32-vcxsrc-$(YOSYS_VER)/genfiles.zip $(GENFILES) kernel/version.cc @@ -403,8 +500,8 @@ config-clang: clean config-gcc: clean echo 'CONFIG := gcc' > Makefile.conf -config-gcc-4.6: clean - echo 'CONFIG := gcc-4.6' > Makefile.conf +config-gcc-4.8: clean + echo 'CONFIG := gcc-4.8' > Makefile.conf config-emcc: clean echo 'CONFIG := emcc' > Makefile.conf @@ -440,5 +537,5 @@ echo-git-rev: -include techlibs/*/*.d .PHONY: all top-all abc test install install-abc manual clean mrproper qtcreator -.PHONY: config-clean config-clang config-gcc config-gcc-4.6 config-gprof config-sudo +.PHONY: config-clean config-clang config-gcc config-gcc-4.8 config-gprof config-sudo |