From bdd93135823ae1ef293d4be3eb50d0ca6bdeee9e Mon Sep 17 00:00:00 2001 From: David Shah Date: Thu, 7 Jun 2018 08:56:54 +0200 Subject: Allow loading and running Python files before GUI starts Signed-off-by: David Shah --- common/pybindings.cc | 74 +++++++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 32 deletions(-) (limited to 'common/pybindings.cc') diff --git a/common/pybindings.cc b/common/pybindings.cc index 556e838e..7a542dc1 100644 --- a/common/pybindings.cc +++ b/common/pybindings.cc @@ -22,6 +22,7 @@ #include "design.h" #include "chip.h" #include "pybindings.h" +#include "emb.h" // Required to determine concatenated module name (which differs for different archs) #define PASTER(x, y) x ## _ ## y @@ -36,43 +37,52 @@ void arch_wrap_python(); BOOST_PYTHON_MODULE (MODULE_NAME) { - arch_wrap_python(); + arch_wrap_python(); } -void arch_appendinittab() -{ - PyImport_AppendInittab(TOSTRING(MODULE_NAME), PYINIT_MODULE_NAME); +void arch_appendinittab() { + PyImport_AppendInittab(TOSTRING(MODULE_NAME), PYINIT_MODULE_NAME); } -void execute_python_file(const char *executable, const char* python_file) -{ - wchar_t *program = Py_DecodeLocale(executable, NULL); - if (program == NULL) { - fprintf(stderr, "Fatal error: cannot decode executable filename\n"); - exit(1); - } - try - { - PyImport_AppendInittab(TOSTRING(MODULE_NAME), PYINIT_MODULE_NAME); - Py_SetProgramName(program); - Py_Initialize(); +static wchar_t *program; - FILE* fp = fopen(python_file, "r"); - if (fp == NULL) { - fprintf(stderr, "Fatal error: file not found %s\n",python_file); - exit(1); - } - PyRun_SimpleFile(fp , python_file); - fclose(fp); +void init_python(const char *executable) { + program = Py_DecodeLocale(executable, NULL); + if (program == NULL) { + fprintf(stderr, "Fatal error: cannot decode executable filename\n"); + exit(1); + } + try { + PyImport_AppendInittab(TOSTRING(MODULE_NAME), PYINIT_MODULE_NAME); + emb::append_inittab(); + Py_SetProgramName(program); + Py_Initialize(); + } 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; + } +} + +void deinit_python() { + Py_Finalize(); + PyMem_RawFree(program); +} - Py_Finalize(); - PyMem_RawFree(program); - } - 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; - } +void execute_python_file(const char *python_file) { + try { + FILE *fp = fopen(python_file, "r"); + if (fp == NULL) { + fprintf(stderr, "Fatal error: file not found %s\n", python_file); + exit(1); + } + PyRun_SimpleFile(fp, python_file); + fclose(fp); + } + 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; + } } -- cgit v1.2.3 From e576f71838290ff12b98145fb02af84563fc03c1 Mon Sep 17 00:00:00 2001 From: David Shah Date: Thu, 7 Jun 2018 11:41:54 +0200 Subject: Developing Python bindings for Design and related types --- common/pybindings.cc | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'common/pybindings.cc') diff --git a/common/pybindings.cc b/common/pybindings.cc index 7a542dc1..04b2fa27 100644 --- a/common/pybindings.cc +++ b/common/pybindings.cc @@ -36,7 +36,54 @@ // architectures void arch_wrap_python(); +bool operator==(const PortRef &a, const PortRef &b) { + return (a.cell == b.cell) && (a.port == b.port); +} + BOOST_PYTHON_MODULE (MODULE_NAME) { + class_("GraphicElement") + .def_readwrite("style", &GraphicElement::style) + .def_readwrite("type", &GraphicElement::type) + .def_readwrite("x1", &GraphicElement::x1) + .def_readwrite("y1", &GraphicElement::y1) + .def_readwrite("x2", &GraphicElement::x2) + .def_readwrite("y2", &GraphicElement::y2) + .def_readwrite("text", &GraphicElement::text); + + class_("PortRef") + .def_readwrite("cell", &PortRef::cell) + .def_readwrite("port", &PortRef::port); + + class_("NetInfo") + .def_readwrite("name", &NetInfo::name) + .def_readwrite("driver", &NetInfo::driver) + .def_readwrite("users", &NetInfo::users) + .def_readwrite("attrs", &NetInfo::attrs) + .def_readwrite("wires", &NetInfo::wires); + + WRAP_MAP(decltype(NetInfo::attrs), "IdStrMap"); + + class_>("PortRefVector") + .def(vector_indexing_suite>()); + + class_("PortInfo") + .def_readwrite("name", &PortInfo::name) + .def_readwrite("net", &PortInfo::net) + .def_readwrite("type", &PortInfo::type); + + class_("CellInfo") + .def_readwrite("name", &CellInfo::name) + .def_readwrite("type", &CellInfo::type) + .def_readwrite("ports", &CellInfo::ports) + .def_readwrite("attrs", &CellInfo::attrs) + .def_readwrite("params", &CellInfo::params) + .def_readwrite("bel", &CellInfo::bel) + .def_readwrite("pins", &CellInfo::pins); + + class_("Design", no_init) + .def_readwrite("chip", &Design::chip) + .def_readwrite("nets", &Design::nets) + .def_readwrite("cells", &Design::cells); arch_wrap_python(); } -- cgit v1.2.3 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 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'common/pybindings.cc') 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(); -- cgit v1.2.3 From 2edde06c07cc3cd58ab156d9598d75e1cff1e7de Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Thu, 7 Jun 2018 12:48:53 +0200 Subject: Fix clang-format include order issues Signed-off-by: Clifford Wolf --- common/pybindings.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'common/pybindings.cc') diff --git a/common/pybindings.cc b/common/pybindings.cc index 7a542dc1..10c8fd44 100644 --- a/common/pybindings.cc +++ b/common/pybindings.cc @@ -21,9 +21,11 @@ #include "design.h" #include "chip.h" -#include "pybindings.h" #include "emb.h" +// include after design.h/chip.h +#include "pybindings.h" + // Required to determine concatenated module name (which differs for different archs) #define PASTER(x, y) x ## _ ## y #define EVALUATOR(x, y) PASTER(x,y) -- cgit v1.2.3 From b0e66d441cf584e7e48049d4f07afcc8e743309a Mon Sep 17 00:00:00 2001 From: David Shah Date: Thu, 7 Jun 2018 12:57:52 +0200 Subject: Global design object working Signed-off-by: David Shah --- common/pybindings.cc | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'common/pybindings.cc') diff --git a/common/pybindings.cc b/common/pybindings.cc index 4ae83cb0..a051eea6 100644 --- a/common/pybindings.cc +++ b/common/pybindings.cc @@ -66,6 +66,12 @@ BOOST_PYTHON_MODULE (MODULE_NAME) { class_>("PortRefVector") .def(vector_indexing_suite>()); + enum_("PortType") + .value("PORT_IN", PORT_IN) + .value("PORT_OUT", PORT_OUT) + .value("PORT_INOUT", PORT_INOUT) + .export_values(); + class_("PortInfo") .def_readwrite("name", &PortInfo::name) .def_readwrite("net", &PortInfo::net) -- cgit v1.2.3 From c3e02527030c11f0177e3bf8d8c5d9a5c9925dc4 Mon Sep 17 00:00:00 2001 From: David Shah Date: Thu, 7 Jun 2018 13:10:53 +0200 Subject: Reformat Python bindings and ice40 main Signed-off-by: David Shah --- common/pybindings.cc | 214 ++++++++++++++++++++++++++------------------------- 1 file changed, 109 insertions(+), 105 deletions(-) (limited to 'common/pybindings.cc') diff --git a/common/pybindings.cc b/common/pybindings.cc index c3818cad..5c86720e 100644 --- a/common/pybindings.cc +++ b/common/pybindings.cc @@ -18,134 +18,138 @@ * */ - -#include "design.h" #include "chip.h" +#include "design.h" #include "emb.h" // include after design.h/chip.h #include "pybindings.h" -// Required to determine concatenated module name (which differs for different archs) -#define PASTER(x, y) x ## _ ## y -#define EVALUATOR(x, y) PASTER(x,y) +// Required to determine concatenated module name (which differs for different +// archs) +#define PASTER(x, y) x##_##y +#define EVALUATOR(x, y) PASTER(x, y) #define MODULE_NAME EVALUATOR(nextpnrpy, ARCHNAME) #define PYINIT_MODULE_NAME EVALUATOR(&PyInit_nextpnrpy, ARCHNAME) #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) -// Architecture-specific bindings should be created in the below function, which must be implemented in all -// architectures +// Architecture-specific bindings should be created in the below function, which +// must be implemented in all architectures void arch_wrap_python(); -bool operator==(const PortRef &a, const PortRef &b) { - return (a.cell == b.cell) && (a.port == b.port); +bool operator==(const PortRef &a, const PortRef &b) +{ + return (a.cell == b.cell) && (a.port == b.port); } -BOOST_PYTHON_MODULE (MODULE_NAME) { - class_("GraphicElement") - .def_readwrite("style", &GraphicElement::style) - .def_readwrite("type", &GraphicElement::type) - .def_readwrite("x1", &GraphicElement::x1) - .def_readwrite("y1", &GraphicElement::y1) - .def_readwrite("x2", &GraphicElement::x2) - .def_readwrite("y2", &GraphicElement::y2) - .def_readwrite("text", &GraphicElement::text); - - class_("PortRef") - .def_readwrite("cell", &PortRef::cell) - .def_readwrite("port", &PortRef::port); - - class_("NetInfo") - .def_readwrite("name", &NetInfo::name) - .def_readwrite("driver", &NetInfo::driver) - .def_readwrite("users", &NetInfo::users) - .def_readwrite("attrs", &NetInfo::attrs) - .def_readwrite("wires", &NetInfo::wires); - - WRAP_MAP(decltype(NetInfo::attrs), "IdStrMap"); - - class_>("PortRefVector") - .def(vector_indexing_suite>()); - - enum_("PortType") - .value("PORT_IN", PORT_IN) - .value("PORT_OUT", PORT_OUT) - .value("PORT_INOUT", PORT_INOUT) - .export_values(); - - class_("PortInfo") - .def_readwrite("name", &PortInfo::name) - .def_readwrite("net", &PortInfo::net) - .def_readwrite("type", &PortInfo::type); - - class_("CellInfo") - .def_readwrite("name", &CellInfo::name) - .def_readwrite("type", &CellInfo::type) - .def_readwrite("ports", &CellInfo::ports) - .def_readwrite("attrs", &CellInfo::attrs) - .def_readwrite("params", &CellInfo::params) - .def_readwrite("bel", &CellInfo::bel) - .def_readwrite("pins", &CellInfo::pins); - - 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(); +BOOST_PYTHON_MODULE(MODULE_NAME) +{ + class_("GraphicElement") + .def_readwrite("style", &GraphicElement::style) + .def_readwrite("type", &GraphicElement::type) + .def_readwrite("x1", &GraphicElement::x1) + .def_readwrite("y1", &GraphicElement::y1) + .def_readwrite("x2", &GraphicElement::x2) + .def_readwrite("y2", &GraphicElement::y2) + .def_readwrite("text", &GraphicElement::text); + + class_("PortRef") + .def_readwrite("cell", &PortRef::cell) + .def_readwrite("port", &PortRef::port); + + class_("NetInfo") + .def_readwrite("name", &NetInfo::name) + .def_readwrite("driver", &NetInfo::driver) + .def_readwrite("users", &NetInfo::users) + .def_readwrite("attrs", &NetInfo::attrs) + .def_readwrite("wires", &NetInfo::wires); + + WRAP_MAP(decltype(NetInfo::attrs), "IdStrMap"); + + class_>("PortRefVector") + .def(vector_indexing_suite>()); + + enum_("PortType") + .value("PORT_IN", PORT_IN) + .value("PORT_OUT", PORT_OUT) + .value("PORT_INOUT", PORT_INOUT) + .export_values(); + + class_("PortInfo") + .def_readwrite("name", &PortInfo::name) + .def_readwrite("net", &PortInfo::net) + .def_readwrite("type", &PortInfo::type); + + class_("CellInfo") + .def_readwrite("name", &CellInfo::name) + .def_readwrite("type", &CellInfo::type) + .def_readwrite("ports", &CellInfo::ports) + .def_readwrite("attrs", &CellInfo::attrs) + .def_readwrite("params", &CellInfo::params) + .def_readwrite("bel", &CellInfo::bel) + .def_readwrite("pins", &CellInfo::pins); + + 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(); } -void arch_appendinittab() { - PyImport_AppendInittab(TOSTRING(MODULE_NAME), PYINIT_MODULE_NAME); +void arch_appendinittab() +{ + PyImport_AppendInittab(TOSTRING(MODULE_NAME), PYINIT_MODULE_NAME); } static wchar_t *program; -void init_python(const char *executable) { - program = Py_DecodeLocale(executable, NULL); - if (program == NULL) { - fprintf(stderr, "Fatal error: cannot decode executable filename\n"); - exit(1); - } - try { - PyImport_AppendInittab(TOSTRING(MODULE_NAME), PYINIT_MODULE_NAME); - 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(); - std::cout << "Error in Python: " << perror_str << std::endl; - } +void init_python(const char *executable) +{ + program = Py_DecodeLocale(executable, NULL); + if (program == NULL) { + fprintf(stderr, "Fatal error: cannot decode executable filename\n"); + exit(1); + } + try { + PyImport_AppendInittab(TOSTRING(MODULE_NAME), PYINIT_MODULE_NAME); + 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(); + std::cout << "Error in Python: " << perror_str << std::endl; + } } -void deinit_python() { - Py_Finalize(); - PyMem_RawFree(program); +void deinit_python() +{ + Py_Finalize(); + PyMem_RawFree(program); } -void execute_python_file(const char *python_file) { - try { - FILE *fp = fopen(python_file, "r"); - if (fp == NULL) { - fprintf(stderr, "Fatal error: file not found %s\n", python_file); - exit(1); - } - PyRun_SimpleFile(fp, python_file); - fclose(fp); - } - 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; - } +void execute_python_file(const char *python_file) +{ + try { + FILE *fp = fopen(python_file, "r"); + if (fp == NULL) { + fprintf(stderr, "Fatal error: file not found %s\n", python_file); + exit(1); + } + PyRun_SimpleFile(fp, python_file); + fclose(fp); + } 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; + } } - -- cgit v1.2.3