diff options
Diffstat (limited to 'common/pybindings.cc')
-rw-r--r-- | common/pybindings.cc | 121 |
1 files changed, 99 insertions, 22 deletions
diff --git a/common/pybindings.cc b/common/pybindings.cc index 556e838e..5c86720e 100644 --- a/common/pybindings.cc +++ b/common/pybindings.cc @@ -18,24 +18,89 @@ * */ - -#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(); -BOOST_PYTHON_MODULE (MODULE_NAME) { +bool operator==(const PortRef &a, const PortRef &b) +{ + return (a.cell == b.cell) && (a.port == b.port); +} + +BOOST_PYTHON_MODULE(MODULE_NAME) +{ + class_<GraphicElement>("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>("PortRef") + .def_readwrite("cell", &PortRef::cell) + .def_readwrite("port", &PortRef::port); + + class_<NetInfo, NetInfo *>("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_<vector<PortRef>>("PortRefVector") + .def(vector_indexing_suite<vector<PortRef>>()); + + enum_<PortType>("PortType") + .value("PORT_IN", PORT_IN) + .value("PORT_OUT", PORT_OUT) + .value("PORT_INOUT", PORT_INOUT) + .export_values(); + + class_<PortInfo>("PortInfo") + .def_readwrite("name", &PortInfo::name) + .def_readwrite("net", &PortInfo::net) + .def_readwrite("type", &PortInfo::type); + + class_<CellInfo, CellInfo *>("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, 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(); } @@ -44,35 +109,47 @@ void arch_appendinittab() PyImport_AppendInittab(TOSTRING(MODULE_NAME), PYINIT_MODULE_NAME); } -void execute_python_file(const char *executable, const char* python_file) +static wchar_t *program; + +void init_python(const char *executable) { - wchar_t *program = Py_DecodeLocale(executable, NULL); + program = Py_DecodeLocale(executable, NULL); if (program == NULL) { fprintf(stderr, "Fatal error: cannot decode executable filename\n"); exit(1); } - try - { + 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); +} - FILE* fp = fopen(python_file, "r"); +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); + fprintf(stderr, "Fatal error: file not found %s\n", python_file); exit(1); } - PyRun_SimpleFile(fp , python_file); + PyRun_SimpleFile(fp, python_file); fclose(fp); - - Py_Finalize(); - PyMem_RawFree(program); - } - catch(boost::python::error_already_set const &) - { + } 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; } } - |