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() {
@ -44,34 +46,37 @@ template <typename T> struct string_wrapper {
boost::python::type_id<T>()); boost::python::type_id<T>());
}; };
static void* convertible(PyObject* object) { static void *convertible(PyObject *object) {
return PyUnicode_Check(object) ? object : 0; return PyUnicode_Check(object) ? object : 0;
} }
static void construct( static void construct(
PyObject* object, PyObject *object,
converter::rvalue_from_python_stage1_data* data) { converter::rvalue_from_python_stage1_data *data) {
const wchar_t* value = PyUnicode_AsUnicode(object); const wchar_t *value = PyUnicode_AsUnicode(object);
const std::wstring value_ws(value); const std::wstring value_ws(value);
if (value == 0) throw_error_already_set(); if (value == 0) throw_error_already_set();
void* storage = ( void *storage = (
(boost::python::converter::rvalue_from_python_storage<T>*) (boost::python::converter::rvalue_from_python_storage<T> *)
data)->storage.bytes; 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; data->convertible = storage;
} }
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)