From a5249da02d2a55d4b838dd8c29e159513dd71418 Mon Sep 17 00:00:00 2001 From: David Shah Date: Thu, 7 Jun 2018 12:40:31 +0200 Subject: Working on global Python design object Signed-off-by: David Shah --- common/pybindings.cc | 10 +++++++++- common/pybindings.h | 53 +++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 49 insertions(+), 14 deletions(-) (limited to 'common') diff --git a/common/pybindings.cc b/common/pybindings.cc index 04b2fa27..4ae83cb0 100644 --- a/common/pybindings.cc +++ b/common/pybindings.cc @@ -80,10 +80,17 @@ BOOST_PYTHON_MODULE (MODULE_NAME) { .def_readwrite("bel", &CellInfo::bel) .def_readwrite("pins", &CellInfo::pins); - class_("Design", no_init) + WRAP_MAP(decltype(CellInfo::ports), "IdPortMap"); + //WRAP_MAP(decltype(CellInfo::pins), "IdIdMap"); + + class_("Design", no_init) .def_readwrite("chip", &Design::chip) .def_readwrite("nets", &Design::nets) .def_readwrite("cells", &Design::cells); + + WRAP_MAP(decltype(Design::nets), "IdNetMap"); + WRAP_MAP(decltype(Design::cells), "IdCellMap"); + arch_wrap_python(); } @@ -104,6 +111,7 @@ void init_python(const char *executable) { emb::append_inittab(); Py_SetProgramName(program); Py_Initialize(); + PyImport_ImportModule(TOSTRING(MODULE_NAME)); } catch (boost::python::error_already_set const &) { // Parse and output the exception std::string perror_str = parse_python_exception(); diff --git a/common/pybindings.h b/common/pybindings.h index 3dfadeee..44898198 100644 --- a/common/pybindings.h +++ b/common/pybindings.h @@ -29,12 +29,14 @@ #include #include #include +#include using namespace boost::python; /* A wrapper to enable custom type/ID to/from string conversions */ -template struct string_wrapper { +template +struct string_wrapper { template struct from_pystring_converter { from_pystring_converter() { @@ -44,34 +46,37 @@ template struct string_wrapper { boost::python::type_id()); }; - static void* convertible(PyObject* object) { + static void *convertible(PyObject *object) { return PyUnicode_Check(object) ? object : 0; } static void construct( - PyObject* object, - converter::rvalue_from_python_stage1_data* data) { - const wchar_t* value = PyUnicode_AsUnicode(object); + PyObject *object, + converter::rvalue_from_python_stage1_data *data) { + const wchar_t *value = PyUnicode_AsUnicode(object); const std::wstring value_ws(value); if (value == 0) throw_error_already_set(); - void* storage = ( - (boost::python::converter::rvalue_from_python_storage*) + void *storage = ( + (boost::python::converter::rvalue_from_python_storage *) data)->storage.bytes; - new (storage) T(fn(std::string(value_ws.begin(), value_ws.end()))); + new(storage) T(fn(std::string(value_ws.begin(), value_ws.end()))); data->convertible = storage; } - static F fn; + static F fn; }; - template struct to_str_wrapper { + template + struct to_str_wrapper { static F fn; - std::string str(T& x) { + + std::string str(T &x) { return fn(x); } }; - template static void wrap(const char *type_name, F1 to_str_fn, F2 from_str_fn) { + template + static void wrap(const char *type_name, F1 to_str_fn, F2 from_str_fn) { from_pystring_converter::fn = from_str_fn; from_pystring_converter(); to_str_wrapper::fn = to_str_fn; @@ -79,12 +84,34 @@ template struct string_wrapper { }; }; +std::string parse_python_exception(); + +template +void python_export_global(const char *name, Tn &x) { + PyObject * m, *d; + m = PyImport_AddModule("__main__"); + if (m == NULL) + return; + d = PyModule_GetDict(m); + try { + PyObject * p = object(boost::ref(x)).ptr(); + PyDict_SetItemString(d, name, p); + } catch (boost::python::error_already_set const &) { + // Parse and output the exception + std::string perror_str = parse_python_exception(); + std::cout << "Error in Python: " << perror_str << std::endl; + std::terminate(); + } +}; void init_python(const char *executable); + void deinit_python(); -void execute_python_file(const char* python_file); +void execute_python_file(const char *python_file); + std::string parse_python_exception(); + void arch_appendinittab(); #endif /* end of include guard: COMMON_PYBINDINGS_HH */ -- cgit v1.2.3