3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-10-09 17:31:59 +00:00

misc: WITH_PYTHON -> YOSYS_ENABLE_PYTHON

For consistency.

Also trying a new thing: only rebuilding objects that use the pybind11 library. The idea is these are the only objects that include the Python/pybind headers and thus the only ones that depend on the Python ABI in any capacity, so other objects can be reused across wheel builds. This has the potential to cut down build times.
This commit is contained in:
Mohamed Gaber 2025-09-23 15:29:01 +03:00
parent dc88906c91
commit 447a6cb3f0
No known key found for this signature in database
12 changed files with 82 additions and 60 deletions

View file

@ -1,8 +1,8 @@
set -e set -e
set -x set -x
# Don't use objects from previous compiles on Windows/macOS # Don't use Python objects from previous compiles
make clean make clean-py
# DEBUG: show python3 and python3-config outputs # DEBUG: show python3 and python3-config outputs
if [ "$(uname)" != "Linux" ]; then if [ "$(uname)" != "Linux" ]; then

View file

@ -346,14 +346,18 @@ endif
PY_WRAPPER_FILE = pyosys/wrappers PY_WRAPPER_FILE = pyosys/wrappers
# running make clean on just those and then recompiling saves a lot of
# time when running cibuildwheel
PYTHON_OBJECTS = pyosys/wrappers.o kernel/drivers.o kernel/yosys.o passes/cmds/plugin.o
ifeq ($(ENABLE_PYOSYS),1) ifeq ($(ENABLE_PYOSYS),1)
# python-config --ldflags includes -l and -L, but LINKFLAGS is only -L # python-config --ldflags includes -l and -L, but LINKFLAGS is only -L
LINKFLAGS += $(filter-out -l%,$(shell $(PYTHON_CONFIG) --ldflags)) LINKFLAGS += $(filter-out -l%,$(shell $(PYTHON_CONFIG) --ldflags))
LIBS += $(shell $(PYTHON_CONFIG) --libs) LIBS += $(shell $(PYTHON_CONFIG) --libs)
EXE_LIBS += $(filter-out $(LIBS),$(shell $(PYTHON_CONFIG_FOR_EXE) --libs)) EXE_LIBS += $(filter-out $(LIBS),$(shell $(PYTHON_CONFIG_FOR_EXE) --libs))
PYBIND11_INCLUDE ?= $(shell $(PYTHON_EXECUTABLE) -m pybind11 --includes) PYBIND11_INCLUDE ?= $(shell $(PYTHON_EXECUTABLE) -m pybind11 --includes)
CXXFLAGS += -I$(PYBIND11_INCLUDE) -DWITH_PYTHON CXXFLAGS += -I$(PYBIND11_INCLUDE) -DYOSYS_ENABLE_PYTHON
CXXFLAGS += $(shell $(PYTHON_CONFIG) --includes) -DWITH_PYTHON CXXFLAGS += $(shell $(PYTHON_CONFIG) --includes) -DYOSYS_ENABLE_PYTHON
OBJS += $(PY_WRAPPER_FILE).o OBJS += $(PY_WRAPPER_FILE).o
PY_GEN_SCRIPT = pyosys/generator.py PY_GEN_SCRIPT = pyosys/generator.py
@ -1108,12 +1112,10 @@ DOC_TARGET ?= html
docs: docs/prep docs: docs/prep
$(Q) $(MAKE) -C docs $(DOC_TARGET) $(Q) $(MAKE) -C docs $(DOC_TARGET)
clean: clean: clean-py
rm -rf share rm -rf share
rm -rf kernel/*.pyh rm -f $(OBJS) $(GENFILES) $(TARGETS) $(EXTRA_TARGETS) $(EXTRA_OBJS) $(PY_WRAP_INCLUDES)
rm -f $(OBJS) $(GENFILES) $(TARGETS) $(EXTRA_TARGETS) $(EXTRA_OBJS) $(PY_WRAP_INCLUDES) $(PY_WRAPPER_FILE).inc.cc $(PY_WRAPPER_FILE).cc
rm -f kernel/version_*.o kernel/version_*.cc rm -f kernel/version_*.o kernel/version_*.cc
rm -f $(PY_WRAPPER_FILE).o
rm -f libs/*/*.d frontends/*/*.d passes/*/*.d backends/*/*.d kernel/*.d techlibs/*/*.d 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/asicworld/*.out tests/asicworld/*.log
rm -rf tests/hana/*.out tests/hana/*.log rm -rf tests/hana/*.out tests/hana/*.log
@ -1127,8 +1129,14 @@ clean:
rm -f $(addsuffix /run-test.mk,$(MK_TEST_DIRS)) rm -f $(addsuffix /run-test.mk,$(MK_TEST_DIRS))
-$(MAKE) -C docs clean -$(MAKE) -C docs clean
rm -rf docs/util/__pycache__ rm -rf docs/util/__pycache__
rm -f libyosys.so
clean-py:
rm -f $(PY_WRAPPER_FILE).inc.cc $(PY_WRAPPER_FILE).cc
rm -f $(PYTHON_OBJECTS)
rm -f *.whl rm -f *.whl
rm -f libyosys.so rm -f libyosys.so
rm -rf kernel/*.pyh
clean-abc: clean-abc:
$(MAKE) -C abc DEP= clean $(MAKE) -C abc DEP= clean

View file

@ -37,6 +37,12 @@
# include <tcl.h> # include <tcl.h>
#endif #endif
#ifdef YOSYS_ENABLE_PYTHON
# include <Python.h>
# include <pybind11/pybind11.h>
namespace py = pybind11;
#endif
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <limits.h> #include <limits.h>
@ -91,7 +97,7 @@ int main(int argc, char **argv)
log_error_stderr = true; log_error_stderr = true;
yosys_banner(); yosys_banner();
yosys_setup(); yosys_setup();
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
py::object sys = py::module_::import("sys"); py::object sys = py::module_::import("sys");
sys.attr("path").attr("append")(proc_self_dirname()); sys.attr("path").attr("append")(proc_self_dirname());
sys.attr("path").attr("append")(proc_share_dirname()); sys.attr("path").attr("append")(proc_share_dirname());
@ -227,10 +233,10 @@ int main(int argc, char **argv)
cxxopts::value<std::string>(),"<tcl_scriptfile>") cxxopts::value<std::string>(),"<tcl_scriptfile>")
("C,tcl-interactive", "enters TCL interactive shell mode") ("C,tcl-interactive", "enters TCL interactive shell mode")
#endif // YOSYS_ENABLE_TCL #endif // YOSYS_ENABLE_TCL
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
("y,py-scriptfile", "execute the Python <script>", ("y,py-scriptfile", "execute the Python <script>",
cxxopts::value<std::string>(), "<script>") cxxopts::value<std::string>(), "<script>")
#endif // WITH_PYTHON #endif // YOSYS_ENABLE_PYTHON
("p,commands", "execute <commands> (to chain commands, separate them with semicolon + whitespace: 'cmd1; cmd2')", ("p,commands", "execute <commands> (to chain commands, separate them with semicolon + whitespace: 'cmd1; cmd2')",
cxxopts::value<std::vector<std::string>>(), "<commands>") cxxopts::value<std::vector<std::string>>(), "<commands>")
("r,top", "elaborate the specified HDL <top> module", ("r,top", "elaborate the specified HDL <top> module",
@ -516,7 +522,7 @@ int main(int argc, char **argv)
#endif #endif
yosys_setup(); yosys_setup();
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
py::object sys = py::module_::import("sys"); py::object sys = py::module_::import("sys");
sys.attr("path").attr("append")(proc_self_dirname()); sys.attr("path").attr("append")(proc_self_dirname());
sys.attr("path").attr("append")(proc_share_dirname()); sys.attr("path").attr("append")(proc_share_dirname());
@ -568,7 +574,7 @@ int main(int argc, char **argv)
log_error("Can't execute TCL script: this version of yosys is not built with TCL support enabled.\n"); log_error("Can't execute TCL script: this version of yosys is not built with TCL support enabled.\n");
#endif #endif
} else if (scriptfile_python) { } else if (scriptfile_python) {
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
py::list new_argv; py::list new_argv;
int py_argc = special_args.size() + 1; int py_argc = special_args.size() + 1;
new_argv.append(scriptfile); new_argv.append(scriptfile);

View file

@ -1083,7 +1083,7 @@ RTLIL::Design::Design()
refcount_modules_ = 0; refcount_modules_ = 0;
push_full_selection(); push_full_selection();
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
RTLIL::Design::get_all_designs()->insert(std::pair<unsigned int, RTLIL::Design*>(hashidx_, this)); RTLIL::Design::get_all_designs()->insert(std::pair<unsigned int, RTLIL::Design*>(hashidx_, this));
#endif #endif
} }
@ -1094,12 +1094,12 @@ RTLIL::Design::~Design()
delete pr.second; delete pr.second;
for (auto n : bindings_) for (auto n : bindings_)
delete n; delete n;
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
RTLIL::Design::get_all_designs()->erase(hashidx_); RTLIL::Design::get_all_designs()->erase(hashidx_);
#endif #endif
} }
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
static std::map<unsigned int, RTLIL::Design*> all_designs; static std::map<unsigned int, RTLIL::Design*> all_designs;
std::map<unsigned int, RTLIL::Design*> *RTLIL::Design::get_all_designs(void) std::map<unsigned int, RTLIL::Design*> *RTLIL::Design::get_all_designs(void)
{ {
@ -1430,7 +1430,7 @@ RTLIL::Module::Module()
refcount_wires_ = 0; refcount_wires_ = 0;
refcount_cells_ = 0; refcount_cells_ = 0;
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
RTLIL::Module::get_all_modules()->insert(std::pair<unsigned int, RTLIL::Module*>(hashidx_, this)); RTLIL::Module::get_all_modules()->insert(std::pair<unsigned int, RTLIL::Module*>(hashidx_, this));
#endif #endif
} }
@ -1447,12 +1447,12 @@ RTLIL::Module::~Module()
delete pr.second; delete pr.second;
for (auto binding : bindings_) for (auto binding : bindings_)
delete binding; delete binding;
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
RTLIL::Module::get_all_modules()->erase(hashidx_); RTLIL::Module::get_all_modules()->erase(hashidx_);
#endif #endif
} }
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
static std::map<unsigned int, RTLIL::Module*> all_modules; static std::map<unsigned int, RTLIL::Module*> all_modules;
std::map<unsigned int, RTLIL::Module*> *RTLIL::Module::get_all_modules(void) std::map<unsigned int, RTLIL::Module*> *RTLIL::Module::get_all_modules(void)
{ {
@ -4109,19 +4109,19 @@ RTLIL::Wire::Wire()
upto = false; upto = false;
is_signed = false; is_signed = false;
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
RTLIL::Wire::get_all_wires()->insert(std::pair<unsigned int, RTLIL::Wire*>(hashidx_, this)); RTLIL::Wire::get_all_wires()->insert(std::pair<unsigned int, RTLIL::Wire*>(hashidx_, this));
#endif #endif
} }
RTLIL::Wire::~Wire() RTLIL::Wire::~Wire()
{ {
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
RTLIL::Wire::get_all_wires()->erase(hashidx_); RTLIL::Wire::get_all_wires()->erase(hashidx_);
#endif #endif
} }
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
static std::map<unsigned int, RTLIL::Wire*> all_wires; static std::map<unsigned int, RTLIL::Wire*> all_wires;
std::map<unsigned int, RTLIL::Wire*> *RTLIL::Wire::get_all_wires(void) std::map<unsigned int, RTLIL::Wire*> *RTLIL::Wire::get_all_wires(void)
{ {
@ -4138,7 +4138,7 @@ RTLIL::Memory::Memory()
width = 1; width = 1;
start_offset = 0; start_offset = 0;
size = 0; size = 0;
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
RTLIL::Memory::get_all_memorys()->insert(std::pair<unsigned int, RTLIL::Memory*>(hashidx_, this)); RTLIL::Memory::get_all_memorys()->insert(std::pair<unsigned int, RTLIL::Memory*>(hashidx_, this));
#endif #endif
} }
@ -4159,19 +4159,19 @@ RTLIL::Cell::Cell() : module(nullptr)
// log("#memtrace# %p\n", this); // log("#memtrace# %p\n", this);
memhasher(); memhasher();
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
RTLIL::Cell::get_all_cells()->insert(std::pair<unsigned int, RTLIL::Cell*>(hashidx_, this)); RTLIL::Cell::get_all_cells()->insert(std::pair<unsigned int, RTLIL::Cell*>(hashidx_, this));
#endif #endif
} }
RTLIL::Cell::~Cell() RTLIL::Cell::~Cell()
{ {
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
RTLIL::Cell::get_all_cells()->erase(hashidx_); RTLIL::Cell::get_all_cells()->erase(hashidx_);
#endif #endif
} }
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
static std::map<unsigned int, RTLIL::Cell*> all_cells; static std::map<unsigned int, RTLIL::Cell*> all_cells;
std::map<unsigned int, RTLIL::Cell*> *RTLIL::Cell::get_all_cells(void) std::map<unsigned int, RTLIL::Cell*> *RTLIL::Cell::get_all_cells(void)
{ {
@ -5957,7 +5957,7 @@ RTLIL::Process *RTLIL::Process::clone() const
return new_proc; return new_proc;
} }
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
RTLIL::Memory::~Memory() RTLIL::Memory::~Memory()
{ {
RTLIL::Memory::get_all_memorys()->erase(hashidx_); RTLIL::Memory::get_all_memorys()->erase(hashidx_);

View file

@ -1680,7 +1680,7 @@ struct RTLIL::Design
// returns all selected unboxed whole modules, warning the user if any // returns all selected unboxed whole modules, warning the user if any
// partially selected or boxed modules have been ignored // partially selected or boxed modules have been ignored
std::vector<RTLIL::Module*> selected_unboxed_whole_modules_warn() const { return selected_modules(SELECT_WHOLE_WARN, SB_UNBOXED_WARN); } std::vector<RTLIL::Module*> selected_unboxed_whole_modules_warn() const { return selected_modules(SELECT_WHOLE_WARN, SB_UNBOXED_WARN); }
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
static std::map<unsigned int, RTLIL::Design*> *get_all_designs(void); static std::map<unsigned int, RTLIL::Design*> *get_all_designs(void);
#endif #endif
}; };
@ -2040,7 +2040,7 @@ public:
RTLIL::SigSpec OriginalTag (RTLIL::IdString name, const std::string &tag, const RTLIL::SigSpec &sig_a, const std::string &src = ""); RTLIL::SigSpec OriginalTag (RTLIL::IdString name, const std::string &tag, const RTLIL::SigSpec &sig_a, const std::string &src = "");
RTLIL::SigSpec FutureFF (RTLIL::IdString name, const RTLIL::SigSpec &sig_e, const std::string &src = ""); RTLIL::SigSpec FutureFF (RTLIL::IdString name, const RTLIL::SigSpec &sig_e, const std::string &src = "");
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
static std::map<unsigned int, RTLIL::Module*> *get_all_modules(void); static std::map<unsigned int, RTLIL::Module*> *get_all_modules(void);
#endif #endif
}; };
@ -2093,7 +2093,7 @@ public:
return zero_index + start_offset; return zero_index + start_offset;
} }
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
static std::map<unsigned int, RTLIL::Wire*> *get_all_wires(void); static std::map<unsigned int, RTLIL::Wire*> *get_all_wires(void);
#endif #endif
}; };
@ -2110,7 +2110,7 @@ struct RTLIL::Memory : public RTLIL::NamedObject
Memory(); Memory();
int width, start_offset, size; int width, start_offset, size;
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
~Memory(); ~Memory();
static std::map<unsigned int, RTLIL::Memory*> *get_all_memorys(void); static std::map<unsigned int, RTLIL::Memory*> *get_all_memorys(void);
#endif #endif
@ -2168,7 +2168,7 @@ public:
template<typename T> void rewrite_sigspecs(T &functor); template<typename T> void rewrite_sigspecs(T &functor);
template<typename T> void rewrite_sigspecs2(T &functor); template<typename T> void rewrite_sigspecs2(T &functor);
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
static std::map<unsigned int, RTLIL::Cell*> *get_all_cells(void); static std::map<unsigned int, RTLIL::Cell*> *get_all_cells(void);
#endif #endif

View file

@ -37,6 +37,12 @@
# include <dlfcn.h> # include <dlfcn.h>
#endif #endif
#ifdef YOSYS_ENABLE_PYTHON
# include <Python.h>
# include <pybind11/pybind11.h>
namespace py = pybind11;
#endif
#if defined(_WIN32) #if defined(_WIN32)
# include <windows.h> # include <windows.h>
# include <io.h> # include <io.h>
@ -63,7 +69,7 @@
# include <sys/sysctl.h> # include <sys/sysctl.h>
#endif #endif
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
extern "C" PyObject* PyInit_libyosys(); extern "C" PyObject* PyInit_libyosys();
extern "C" PyObject* PyInit_pyosys(); extern "C" PyObject* PyInit_pyosys();
#include <signal.h> #include <signal.h>
@ -184,7 +190,7 @@ int run_command(const std::string &command, std::function<void(const std::string
bool already_setup = false; bool already_setup = false;
bool already_shutdown = false; bool already_shutdown = false;
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
// Include pyosys as a package for some compatibility with wheels. // Include pyosys as a package for some compatibility with wheels.
// //
// This should not affect using wheels as the dylib has to actually be called // This should not affect using wheels as the dylib has to actually be called
@ -203,7 +209,7 @@ void yosys_setup()
IdString::ensure_prepopulated(); IdString::ensure_prepopulated();
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
// Starting Python 3.12, calling PyImport_AppendInittab on an already // Starting Python 3.12, calling PyImport_AppendInittab on an already
// initialized platform fails (such as when libyosys is imported // initialized platform fails (such as when libyosys is imported
// from a Python interpreter) // from a Python interpreter)
@ -267,13 +273,13 @@ void yosys_shutdown()
dlclose(it.second); dlclose(it.second);
loaded_plugins.clear(); loaded_plugins.clear();
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
loaded_python_plugins.clear(); loaded_python_plugins.clear();
#endif #endif
loaded_plugin_aliases.clear(); loaded_plugin_aliases.clear();
#endif #endif
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
Py_Finalize(); Py_Finalize();
#endif #endif
} }
@ -549,7 +555,7 @@ void init_share_dirname()
#else #else
void init_share_dirname() void init_share_dirname()
{ {
# ifdef WITH_PYTHON # ifdef YOSYS_ENABLE_PYTHON
PyObject *sys_obj = PyImport_ImportModule("sys"); PyObject *sys_obj = PyImport_ImportModule("sys");
if (PyObject_HasAttrString(sys_obj, "_pyosys_share_dirname")) { if (PyObject_HasAttrString(sys_obj, "_pyosys_share_dirname")) {
@ -609,7 +615,7 @@ void init_abc_executable_name()
yosys_abc_executable = proc_self_dirname() + "..\\" + proc_program_prefix() + "yosys-abc"; yosys_abc_executable = proc_self_dirname() + "..\\" + proc_program_prefix() + "yosys-abc";
# endif # endif
# ifdef WITH_PYTHON # ifdef YOSYS_ENABLE_PYTHON
PyObject *sys_obj = PyImport_ImportModule("sys"); PyObject *sys_obj = PyImport_ImportModule("sys");
if (PyObject_HasAttrString(sys_obj, "_pyosys_abc")) { if (PyObject_HasAttrString(sys_obj, "_pyosys_abc")) {

View file

@ -51,7 +51,7 @@ YOSYS_NAMESPACE_BEGIN
void yosys_setup(); void yosys_setup();
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
bool yosys_already_setup(); bool yosys_already_setup();
#endif #endif
@ -89,7 +89,7 @@ extern std::vector<RTLIL::Design*> pushed_designs;
// from passes/cmds/pluginc.cc // from passes/cmds/pluginc.cc
extern std::map<std::string, void*> loaded_plugins; extern std::map<std::string, void*> loaded_plugins;
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
extern std::map<std::string, void*> loaded_python_plugins; extern std::map<std::string, void*> loaded_python_plugins;
#endif #endif
extern std::map<std::string, std::string> loaded_plugin_aliases; extern std::map<std::string, std::string> loaded_plugin_aliases;

View file

@ -53,13 +53,6 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <errno.h> #include <errno.h>
#ifdef WITH_PYTHON
#include <Python.h>
#include <pybind11/pybind11.h>
namespace py = pybind11;
#endif
#ifndef _YOSYS_ #ifndef _YOSYS_
# error It looks like you are trying to build Yosys without the config defines set. \ # error It looks like you are trying to build Yosys without the config defines set. \
When building Yosys with a custom make system, make sure you set all the \ When building Yosys with a custom make system, make sure you set all the \

View file

@ -24,10 +24,16 @@
# include <dlfcn.h> # include <dlfcn.h>
#endif #endif
#ifdef YOSYS_ENABLE_PYTHON
# include <Python.h>
# include <pybind11/pybind11.h>
namespace py = pybind11;
#endif
YOSYS_NAMESPACE_BEGIN YOSYS_NAMESPACE_BEGIN
std::map<std::string, void*> loaded_plugins; std::map<std::string, void*> loaded_plugins;
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
std::map<std::string, void*> loaded_python_plugins; std::map<std::string, void*> loaded_python_plugins;
#endif #endif
std::map<std::string, std::string> loaded_plugin_aliases; std::map<std::string, std::string> loaded_plugin_aliases;
@ -43,7 +49,7 @@ void load_plugin(std::string filename, std::vector<std::string> aliases)
filename = "./" + filename; filename = "./" + filename;
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
const bool is_loaded = loaded_plugins.count(orig_filename) && loaded_python_plugins.count(orig_filename); const bool is_loaded = loaded_plugins.count(orig_filename) && loaded_python_plugins.count(orig_filename);
#else #else
const bool is_loaded = loaded_plugins.count(orig_filename); const bool is_loaded = loaded_plugins.count(orig_filename);
@ -52,7 +58,7 @@ void load_plugin(std::string filename, std::vector<std::string> aliases)
if (!is_loaded) { if (!is_loaded) {
// Check if we're loading a python script // Check if we're loading a python script
if (filename.rfind(".py") != std::string::npos) { if (filename.rfind(".py") != std::string::npos) {
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
py::object Path = py::module_::import("pathlib").attr("Path"); py::object Path = py::module_::import("pathlib").attr("Path");
py::object full_path = Path(py::cast(filename)); py::object full_path = Path(py::cast(filename));
py::object plugin_python_path = full_path.attr("parent"); py::object plugin_python_path = full_path.attr("parent");
@ -171,7 +177,7 @@ struct PluginPass : public Pass {
if (list_mode) if (list_mode)
{ {
log("\n"); log("\n");
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
if (loaded_plugins.empty() and loaded_python_plugins.empty()) if (loaded_plugins.empty() and loaded_python_plugins.empty())
#else #else
if (loaded_plugins.empty()) if (loaded_plugins.empty())
@ -183,7 +189,7 @@ struct PluginPass : public Pass {
for (auto &it : loaded_plugins) for (auto &it : loaded_plugins)
log(" %s\n", it.first); log(" %s\n", it.first);
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
for (auto &it : loaded_python_plugins) for (auto &it : loaded_python_plugins)
log(" %s\n", it.first); log(" %s\n", it.first);
#endif #endif

View file

@ -349,7 +349,7 @@ class PyosysWrapperGenerator(object):
cxx_std = os.getenv("CXX_STD", "c++17") cxx_std = os.getenv("CXX_STD", "c++17")
return ParserOptions( return ParserOptions(
preprocessor=make_gcc_preprocessor( preprocessor=make_gcc_preprocessor(
defines=["_YOSYS_", "WITH_PYTHON"], defines=["_YOSYS_", "YOSYS_ENABLE_PYTHON"],
gcc_args=[preprocessor_bin, "-fsyntax-only", f"-std={cxx_std}"], gcc_args=[preprocessor_bin, "-fsyntax-only", f"-std={cxx_std}"],
include_paths=[str(__yosys_root__), py_include, pybind11.get_include()], include_paths=[str(__yosys_root__), py_include, pybind11.get_include()],
), ),

View file

@ -41,9 +41,10 @@
// //
#include <optional> // optional maps cleanest to methods that accept None in Python #include <optional> // optional maps cleanest to methods that accept None in Python
#include <pybind11/pybind11.h> // base
#include <pybind11/stl.h> // std::optional #include <pybind11/stl.h> // std::optional
#include <pybind11/pybind11.h> // base
#include <pybind11/operators.h> // easier operator binding #include <pybind11/operators.h> // easier operator binding
#include <pybind11/stl_bind.h> // vector
#include "kernel/hashlib.h" #include "kernel/hashlib.h"
@ -269,7 +270,7 @@ void bind_set(module &m, const char *name_cstr) {
.def("__iter__", [](const C &s){ .def("__iter__", [](const C &s){
return make_iterator(s.begin(), s.end()); return make_iterator(s.begin(), s.end());
}, keep_alive<0,1>()) }, keep_alive<0,1>())
.def("__repr__", [name_cstr](const py::iterable &s){ .def("__repr__", [name_cstr](const iterable &s){
// repr(set(s)) where s is iterable would be more terse/robust // repr(set(s)) where s is iterable would be more terse/robust
// but are there concerns with copying? // but are there concerns with copying?
str representation = str(name_cstr) + str("({"); str representation = str(name_cstr) + str("({");

View file

@ -16,14 +16,16 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
#ifdef WITH_PYTHON #ifdef YOSYS_ENABLE_PYTHON
// <!-- generated includes --> // <!-- generated includes -->
#include <pybind11/pybind11.h>
#include <pybind11/stl_bind.h>
#include <pybind11/native_enum.h> #include <pybind11/native_enum.h>
#include "pyosys/hashlib.h" #include "pyosys/hashlib.h"
namespace py = pybind11;
USING_YOSYS_NAMESPACE USING_YOSYS_NAMESPACE
using std::set; using std::set;
@ -256,4 +258,4 @@ namespace YOSYS_PYTHON {
}; };
}; };
#endif // WITH_PYTHON #endif // YOSYS_ENABLE_PYTHON