Add an option to statically link abc into yosys
authorRobert Ou <rqou@robertou.com>
Tue, 14 Nov 2017 10:19:21 +0000 (02:19 -0800)
committerRobert Ou <rqou@robertou.com>
Sat, 19 May 2018 05:35:28 +0000 (22:35 -0700)
This is currently incomplete because the output filter no longer works.

Makefile
passes/techmap/abc.cc

index 13caaab8be51181107ca262ff9836e86f4bf4ed2..cc42f82d66b2adcf8c0f212abe87a11bcdabe844 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -22,6 +22,7 @@ ENABLE_DEBUG := 0
 ENABLE_NDEBUG := 0
 LINK_CURSES := 0
 LINK_TERMCAP := 0
+LINK_ABC := 0
 
 # clang sanitizers
 SANITIZER =
@@ -292,10 +293,15 @@ endif
 
 ifeq ($(ENABLE_ABC),1)
 CXXFLAGS += -DYOSYS_ENABLE_ABC
+ifeq ($(LINK_ABC),1)
+CXXFLAGS += -DYOSYS_LINK_ABC
+LDLIBS += -lpthread
+else
 ifeq ($(ABCEXTERNAL),)
 TARGETS += yosys-abc$(EXE)
 endif
 endif
+endif
 
 ifeq ($(ENABLE_VERIFIC),1)
 VERIFIC_DIR ?= /usr/local/src/verific_lib_eval
@@ -415,6 +421,10 @@ include techlibs/common/Makefile.inc
 
 endif
 
+ifeq ($(LINK_ABC),1)
+OBJS += yosys-libabc.a
+endif
+
 top-all: $(TARGETS) $(EXTRA_TARGETS)
        @echo ""
        @echo "  Build successful."
@@ -459,7 +469,7 @@ yosys-config: misc/yosys-config.in
                        -e 's#@BINDIR@#$(strip $(BINDIR))#;' -e 's#@DATDIR@#$(strip $(DATDIR))#;' < $< > yosys-config
        $(Q) chmod +x yosys-config
 
-abc/abc-$(ABCREV)$(EXE):
+abc/abc-$(ABCREV)$(EXE) abc/libabc-$(ABCREV).a:
        $(P)
 ifneq ($(ABCREV),default)
        $(Q) if test -d abc/.hg; then \
@@ -476,15 +486,19 @@ ifneq ($(ABCREV),default)
        fi
 endif
        $(Q) rm -f abc/abc-[0-9a-f]*
-       $(Q) cd abc && $(MAKE) $(S) $(ABCMKARGS) PROG="abc-$(ABCREV)$(EXE)" MSG_PREFIX="$(eval P_OFFSET = 5)$(call P_SHOW)$(eval P_OFFSET = 10) ABC: "
+       $(Q) cd abc && $(MAKE) $(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)
 
 ifeq ($(ABCREV),default)
 .PHONY: abc/abc-$(ABCREV)$(EXE)
+.PHONY: abc/libabc-$(ABCREV).a
 endif
 
 yosys-abc$(EXE): abc/abc-$(ABCREV)$(EXE)
        $(P) cp abc/abc-$(ABCREV)$(EXE) yosys-abc$(EXE)
 
+yosys-libabc.a: abc/libabc-$(ABCREV).a
+       $(P) cp abc/libabc-$(ABCREV).a yosys-libabc.a
+
 ifneq ($(SEED),)
 SEEDOPT="-S $(SEED)"
 else
@@ -568,7 +582,7 @@ clean:
        rm -rf share
        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 kernel/version_*.o kernel/version_*.cc abc/abc-[0-9a-f]* abc/libabc-[0-9a-f]*.a
        rm -f libs/*/*.d frontends/*/*.d passes/*/*.d backends/*/*.d kernel/*.d techlibs/*/*.d
        rm -rf tests/asicworld/*.out tests/asicworld/*.log
        rm -rf tests/hana/*.out tests/hana/*.log
@@ -581,7 +595,7 @@ clean:
 
 clean-abc:
        $(MAKE) -C abc DEP= clean
-       rm -f yosys-abc$(EXE) abc/abc-[0-9a-f]*
+       rm -f yosys-abc$(EXE) yosys-libabc.a abc/abc-[0-9a-f]* abc/libabc-[0-9a-f]*.a
 
 mrproper: clean
        git clean -xdf
index 009ba6b9771a86c131cf13832d087358e5bc2fe5..8e148430188b510eb3e0cffc1d90a9e125fd540e 100644 (file)
 
 #include "frontends/blif/blifparse.h"
 
+#ifdef YOSYS_LINK_ABC
+extern "C" int Abc_RealMain(int argc, char *argv[]);
+#endif
+
 USING_YOSYS_NAMESPACE
 PRIVATE_NAMESPACE_BEGIN
 
@@ -943,8 +947,24 @@ void abc_module(RTLIL::Design *design, RTLIL::Module *current_module, std::strin
                buffer = stringf("%s -s -f %s/abc.script 2>&1", exe_file.c_str(), tempdir_name.c_str());
                log("Running ABC command: %s\n", replace_tempdir(buffer, tempdir_name, show_tempdir).c_str());
 
+#ifndef YOSYS_LINK_ABC
                abc_output_filter filt(tempdir_name, show_tempdir);
                int ret = run_command(buffer, std::bind(&abc_output_filter::next_line, filt, std::placeholders::_1));
+#else
+               // These needs to be mutable, supposedly due to getopt
+               char *abc_argv[5];
+               string tmp_script_name = stringf("%s/abc.script", tempdir_name.c_str());
+               abc_argv[0] = strdup(exe_file.c_str());
+               abc_argv[1] = strdup("-s");
+               abc_argv[2] = strdup("-f");
+               abc_argv[3] = strdup(tmp_script_name.c_str());
+               abc_argv[4] = 0;
+               int ret = Abc_RealMain(4, abc_argv);
+               free(abc_argv[0]);
+               free(abc_argv[1]);
+               free(abc_argv[2]);
+               free(abc_argv[3]);
+#endif
                if (ret != 0)
                        log_error("ABC: execution of command \"%s\" failed: return code %d.\n", buffer.c_str(), ret);