Working on global Python design object
Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
parent
e576f71838
commit
a5249da02d
@ -80,10 +80,17 @@ BOOST_PYTHON_MODULE (MODULE_NAME) {
|
||||
.def_readwrite("bel", &CellInfo::bel)
|
||||
.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("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();
|
||||
|
@ -29,12 +29,14 @@
|
||||
#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 <Python.h>
|
||||
using namespace boost::python;
|
||||
|
||||
/*
|
||||
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>
|
||||
struct from_pystring_converter {
|
||||
from_pystring_converter() {
|
||||
@ -44,34 +46,37 @@ template <typename T> struct string_wrapper {
|
||||
boost::python::type_id<T>());
|
||||
};
|
||||
|
||||
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<T>*)
|
||||
void *storage = (
|
||||
(boost::python::converter::rvalue_from_python_storage<T> *)
|
||||
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;
|
||||
};
|
||||
|
||||
template<typename F> struct to_str_wrapper {
|
||||
template<typename F>
|
||||
struct to_str_wrapper {
|
||||
static F fn;
|
||||
std::string str(T& x) {
|
||||
|
||||
std::string str(T &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>();
|
||||
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 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 */
|
||||
|
@ -123,6 +123,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
Design design(chipArgs);
|
||||
init_python(argv[0]);
|
||||
python_export_global("design", design);
|
||||
|
||||
if (vm.count("test"))
|
||||
{
|
||||
|
2
python/dump_design.py
Normal file
2
python/dump_design.py
Normal file
@ -0,0 +1,2 @@
|
||||
for cell in design.cells:
|
||||
print(cell.first)
|
Loading…
Reference in New Issue
Block a user