Working on global Python design object

Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
David Shah 2018-06-07 12:40:31 +02:00
parent e576f71838
commit a5249da02d
4 changed files with 52 additions and 14 deletions

View File

@ -80,10 +80,17 @@ BOOST_PYTHON_MODULE (MODULE_NAME) {
.def_readwrite("bel", &CellInfo::bel) .def_readwrite("bel", &CellInfo::bel)
.def_readwrite("pins", &CellInfo::pins); .def_readwrite("pins", &CellInfo::pins);
class_<Design>("Design", no_init) WRAP_MAP(decltype(CellInfo::ports), "IdPortMap");
//WRAP_MAP(decltype(CellInfo::pins), "IdIdMap");
class_<Design, Design*>("Design", no_init)
.def_readwrite("chip", &Design::chip) .def_readwrite("chip", &Design::chip)
.def_readwrite("nets", &Design::nets) .def_readwrite("nets", &Design::nets)
.def_readwrite("cells", &Design::cells); .def_readwrite("cells", &Design::cells);
WRAP_MAP(decltype(Design::nets), "IdNetMap");
WRAP_MAP(decltype(Design::cells), "IdCellMap");
arch_wrap_python(); arch_wrap_python();
} }
@ -104,6 +111,7 @@ void init_python(const char *executable) {
emb::append_inittab(); emb::append_inittab();
Py_SetProgramName(program); Py_SetProgramName(program);
Py_Initialize(); Py_Initialize();
PyImport_ImportModule(TOSTRING(MODULE_NAME));
} catch (boost::python::error_already_set const &) { } catch (boost::python::error_already_set const &) {
// Parse and output the exception // Parse and output the exception
std::string perror_str = parse_python_exception(); std::string perror_str = parse_python_exception();

View File

@ -29,12 +29,14 @@
#include <boost/python/suite/indexing/vector_indexing_suite.hpp> #include <boost/python/suite/indexing/vector_indexing_suite.hpp>
#include <boost/python/suite/indexing/map_indexing_suite.hpp> #include <boost/python/suite/indexing/map_indexing_suite.hpp>
#include <boost/python/suite/indexing/map_indexing_suite.hpp> #include <boost/python/suite/indexing/map_indexing_suite.hpp>
#include <Python.h>
using namespace boost::python; using namespace boost::python;
/* /*
A wrapper to enable custom type/ID to/from string conversions A wrapper to enable custom type/ID to/from string conversions
*/ */
template <typename T> struct string_wrapper { template<typename T>
struct string_wrapper {
template<typename F> template<typename F>
struct from_pystring_converter { struct from_pystring_converter {
from_pystring_converter() { from_pystring_converter() {
@ -64,14 +66,17 @@ template <typename T> struct string_wrapper {
static F fn; static F fn;
}; };
template<typename F> struct to_str_wrapper { template<typename F>
struct to_str_wrapper {
static F fn; static F fn;
std::string str(T &x) { std::string str(T &x) {
return fn(x); return fn(x);
} }
}; };
template<typename F1, typename F2> static void wrap(const char *type_name, F1 to_str_fn, F2 from_str_fn) { template<typename F1, typename F2>
static void wrap(const char *type_name, F1 to_str_fn, F2 from_str_fn) {
from_pystring_converter<F2>::fn = from_str_fn; from_pystring_converter<F2>::fn = from_str_fn;
from_pystring_converter<F2>(); from_pystring_converter<F2>();
to_str_wrapper<F1>::fn = to_str_fn; to_str_wrapper<F1>::fn = to_str_fn;
@ -79,12 +84,34 @@ template <typename T> struct string_wrapper {
}; };
}; };
std::string parse_python_exception();
template<typename Tn>
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 init_python(const char *executable);
void deinit_python(); void deinit_python();
void execute_python_file(const char *python_file); void execute_python_file(const char *python_file);
std::string parse_python_exception(); std::string parse_python_exception();
void arch_appendinittab(); void arch_appendinittab();
#endif /* end of include guard: COMMON_PYBINDINGS_HH */ #endif /* end of include guard: COMMON_PYBINDINGS_HH */

View File

@ -123,6 +123,7 @@ int main(int argc, char *argv[])
Design design(chipArgs); Design design(chipArgs);
init_python(argv[0]); init_python(argv[0]);
python_export_global("design", design);
if (vm.count("test")) if (vm.count("test"))
{ {

2
python/dump_design.py Normal file
View File

@ -0,0 +1,2 @@
for cell in design.cells:
print(cell.first)