Convert code to use pybind11
diff --git a/libtrellis/CMakeLists.txt b/libtrellis/CMakeLists.txt
index 17fa0c8..d838d44 100644
--- a/libtrellis/CMakeLists.txt
+++ b/libtrellis/CMakeLists.txt
@@ -57,54 +57,7 @@
find_package(Boost REQUIRED COMPONENTS ${boost_libs})
-if (BUILD_PYTHON)
- # Find Boost::Python of a suitable version in a cross-platform way
- # Some distributions (Arch) call it libboost_python3, others such as Ubuntu
- # call it libboost_python35. In the latter case we must consider all minor versions
- # Original source: https://github.com/BVLC/caffe/blob/master/cmake/Dependencies.cmake#L148
- set(version ${PYTHONLIBS_VERSION_STRING})
-
- STRING(REGEX REPLACE "[^0-9]" "" boost_py_version "${version}")
- find_package(Boost QUIET COMPONENTS "python-py${boost_py_version}" ${boost_libs})
- set(Boost_PYTHON_FOUND ${Boost_PYTHON-PY${boost_py_version}_FOUND})
-
- while (NOT "${version}" STREQUAL "" AND NOT Boost_PYTHON_FOUND)
- STRING(REGEX REPLACE "([0-9.]+).[0-9]+" "\\1" version "${version}")
-
- STRING(REGEX REPLACE "[^0-9]" "" boost_py_version "${version}")
- find_package(Boost QUIET COMPONENTS "python-py${boost_py_version}" ${boost_libs})
- set(Boost_PYTHON_FOUND ${Boost_PYTHON-PY${boost_py_version}_FOUND})
-
- STRING(REGEX MATCHALL "([0-9.]+).[0-9]+" has_more_version "${version}")
- if ("${has_more_version}" STREQUAL "")
- break()
- endif ()
- endwhile ()
-
- if (NOT Boost_PYTHON_FOUND)
- foreach (PyVer 3 36 37 38 39 310)
- find_package(Boost QUIET COMPONENTS python${PyVer} ${boost_libs})
- if ("${Boost_LIBRARIES}" MATCHES ".*(python|PYTHON).*" )
- set(Boost_PYTHON_FOUND TRUE)
- break()
- endif ()
- endforeach ()
- endif ()
-
- if (NOT Boost_PYTHON_FOUND)
- STRING(REGEX REPLACE "([0-9]+\\.[0-9]+).*" "\\1" gentoo_version "${PYTHONLIBS_VERSION_STRING}")
- find_package(Boost QUIET COMPONENTS python-${gentoo_version} ${boost_libs})
- if ("${Boost_LIBRARIES}" MATCHES ".*(python|PYTHON).*" )
- set(Boost_PYTHON_FOUND TRUE)
- endif ()
- endif ()
-
- if (NOT Boost_PYTHON_FOUND )
- message( FATAL_ERROR "No version of Boost::Python 3.x could be found.")
- endif ()
-endif()
-
-include_directories(include/ ${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})
+include_directories(include/ ${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS} 3rdparty/pybind11/include)
aux_source_directory(include/ INCLUDE_FILES)
aux_source_directory(src/ SOURCE_FILES)
diff --git a/libtrellis/src/PyTrellis.cpp b/libtrellis/src/PyTrellis.cpp
index 3ea2f7d..fa003fd 100644
--- a/libtrellis/src/PyTrellis.cpp
+++ b/libtrellis/src/PyTrellis.cpp
@@ -14,70 +14,81 @@
#ifdef INCLUDE_PYTHON
-#include <boost/python.hpp>
+#include <pybind11/pybind11.h>
+#include <pybind11/operators.h>
+#include <pybind11/stl_bind.h>
-#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
-#include <boost/python/suite/indexing/map_indexing_suite.hpp>
-#include <boost/python/exception_translator.hpp>
-#include "set_indexing_suite.h"
-
-using namespace boost::python;
+using namespace pybind11;
using namespace Trellis;
+using namespace DDChipDb;
-void translate_bspe(const BitstreamParseError &e)
-{
- // Use the Python 'C' API to set up an exception object
- PyErr_SetString(PyExc_ValueError, e.what());
-}
+namespace py = pybind11;
-void translate_dbce(const DatabaseConflictError &e)
-{
- // Use the Python 'C' API to set up an exception object
- PyErr_SetString(PyExc_ValueError, e.what());
-}
+ typedef pair<int, int> IntPair;
+ typedef pair<string, bool> StringBoolPair;
+ typedef pair<RoutingId, ident_t> BelPin;
+ typedef pair<RoutingId, PortDirection> BelWireDir;
+ // Common Types
+ PYBIND11_MAKE_OPAQUE(IntPair)
+ PYBIND11_MAKE_OPAQUE(LocationData)
+ PYBIND11_MAKE_OPAQUE(checksum_t)
+ PYBIND11_MAKE_OPAQUE(map<checksum_t, LocationData>)
+ PYBIND11_MAKE_OPAQUE(Location)
+ PYBIND11_MAKE_OPAQUE(std::set<RelId>)
-BOOST_PYTHON_MODULE (pytrellis)
+PYBIND11_MODULE (pytrellis, m)
{
// Common Types
- class_<vector<string>>("StringVector")
- .def(vector_indexing_suite<vector<string>>());
+ py::bind_vector<vector<string>>(m, "StringVector");
- class_<vector<uint8_t>>("ByteVector")
- .def(vector_indexing_suite<vector<uint8_t>>());
+ py::bind_vector<vector<uint8_t>>(m, "ByteVector");
- class_<vector<bool>>("BoolVector")
- .def(vector_indexing_suite<vector<bool>>());
+ py::bind_vector<vector<bool>>(m, "BoolVector");
- class_<std::pair<int, int> >("IntPair")
- .def_readwrite("first", &std::pair<int, int>::first)
- .def_readwrite("second", &std::pair<int, int>::second);
+ class_<IntPair>(m, "IntPair")
+ .def(init<IntPair>())
+ .def_readonly("first", &std::pair<int, int>::first)
+ .def_readonly("second", &std::pair<int, int>::second);
+
+
+ m.def("make_IntPair", [](int first, int second) {
+ return std::make_pair(first, second);
+ });
// From Bitstream.cpp
- register_exception_translator<BitstreamParseError>(&translate_bspe);
- class_<Bitstream>("Bitstream", no_init)
- .def("read_bit", &Bitstream::read_bit_py)
- .staticmethod("read_bit")
- .def("serialise_chip", &Bitstream::serialise_chip_py)
- .staticmethod("serialise_chip")
- .def("serialise_chip_delta", &Bitstream::serialise_chip_delta_py)
- .staticmethod("serialise_chip_delta")
+ py::register_exception_translator([](std::exception_ptr p) {
+ try {
+ if (p)
+ std::rethrow_exception(p);
+ } catch (const BitstreamParseError &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ } catch (const DatabaseConflictError &e) {
+ PyErr_SetString(PyExc_ValueError, e.what());
+ }
+ });
+
+ class_<Bitstream>(m, "Bitstream")
+ .def_static("read_bit", &Bitstream::read_bit_py)
+ .def_static("serialise_chip", &Bitstream::serialise_chip_py)
+ .def_static("serialise_chip_delta", &Bitstream::serialise_chip_delta_py)
.def("write_bit", &Bitstream::write_bit_py)
.def_readwrite("metadata", &Bitstream::metadata)
.def_readwrite("data", &Bitstream::data)
.def("deserialise_chip", static_cast<Chip (Bitstream::*)()>(&Bitstream::deserialise_chip));
- class_<DeviceLocator>("DeviceLocator")
+ class_<DeviceLocator>(m, "DeviceLocator")
.def_readwrite("family", &DeviceLocator::family)
.def_readwrite("device", &DeviceLocator::device);
- class_<TileLocator>("TileLocator", init<string, string, string>())
+ class_<TileLocator>(m, "TileLocator")
+ .def(init<string, string, string>())
.def_readwrite("family", &TileLocator::family)
.def_readwrite("device", &TileLocator::device)
.def_readwrite("tiletype", &TileLocator::tiletype);
// From Chip.cpp
- class_<ChipInfo>("ChipInfo")
+ class_<ChipInfo>(m, "ChipInfo")
.def_readwrite("name", &ChipInfo::name)
.def_readwrite("family", &ChipInfo::family)
.def_readwrite("idcode", &ChipInfo::idcode)
@@ -89,13 +100,11 @@
.def_readonly("max_col", &ChipInfo::max_col)
.def_readonly("col_bias", &ChipInfo::col_bias);
- class_<map<string, shared_ptr<Tile>>>("TileMap")
- .def(map_indexing_suite<map<string, shared_ptr<Tile>>, true>());
+ py::bind_map<map<string, shared_ptr<Tile>>>(m, "TileMap");
- class_<vector<shared_ptr<Tile>>>("TileVector")
- .def(vector_indexing_suite<vector<shared_ptr<Tile>>, true>());
+ py::bind_vector<vector<shared_ptr<Tile>>>(m, "TileVector");
- class_<GlobalRegion>("GlobalRegion")
+ class_<GlobalRegion>(m, "GlobalRegion")
.def_readwrite("name", &GlobalRegion::name)
.def_readwrite("x0", &GlobalRegion::x0)
.def_readwrite("y0", &GlobalRegion::y0)
@@ -103,10 +112,9 @@
.def_readwrite("y1", &GlobalRegion::y1)
.def("matches", &GlobalRegion::matches);
- class_<vector<GlobalRegion>>("GlobalRegionVector")
- .def(vector_indexing_suite<vector<GlobalRegion>>());
+ py::bind_vector<vector<GlobalRegion>>(m, "GlobalRegionVector");
- class_<TapSegment>("TapSegment")
+ class_<TapSegment>(m, "TapSegment")
.def_readwrite("tap_col", &TapSegment::tap_col)
.def_readwrite("lx0", &TapSegment::lx0)
.def_readwrite("lx1", &TapSegment::lx1)
@@ -115,58 +123,52 @@
.def("matches_left", &TapSegment::matches_left)
.def("matches_right", &TapSegment::matches_right);
- enum_<TapDriver::TapDir>("TapDir")
+ enum_<TapDriver::TapDir>(m, "TapDir")
.value("LEFT", TapDriver::LEFT)
.value("RIGHT", TapDriver::RIGHT);
- class_<TapDriver>("TapDriver")
+ class_<TapDriver>(m, "TapDriver")
.def_readwrite("col", &TapDriver::col)
.def_readwrite("dir", &TapDriver::dir);
- class_<vector<TapSegment>>("TapSegmentVector")
- .def(vector_indexing_suite<vector<TapSegment>>());
+ py::bind_vector<vector<TapSegment>>(m, "TapSegmentVector");
- class_<Ecp5GlobalsInfo>("Ecp5GlobalsInfo")
+ class_<Ecp5GlobalsInfo>(m, "Ecp5GlobalsInfo")
.def_readwrite("quadrants", &Ecp5GlobalsInfo::quadrants)
.def_readwrite("tapsegs", &Ecp5GlobalsInfo::tapsegs)
.def("get_quadrant", &Ecp5GlobalsInfo::get_quadrant)
.def("get_tap_driver", &Ecp5GlobalsInfo::get_tap_driver)
.def("get_spine_driver", &Ecp5GlobalsInfo::get_spine_driver);
- class_<LeftRightConn>("LeftRightConn")
+ class_<LeftRightConn>(m, "LeftRightConn")
.def_readwrite("name", &LeftRightConn::name)
.def_readwrite("row", &LeftRightConn::row)
.def_readwrite("row_span", &LeftRightConn::row_span);
- class_<MissingDccs>("MissingDccs")
+ class_<MissingDccs>(m, "MissingDccs")
.def_readwrite("row", &MissingDccs::row)
.def_readwrite("missing", &MissingDccs::missing);
- class_<vector<LeftRightConn>>("LeftRightConnVector")
- .def(vector_indexing_suite<vector<LeftRightConn>>());
+ py::bind_vector<vector<LeftRightConn>>(m, "LeftRightConnVector");
- class_<vector<vector<int>>>("UpDownConnVector")
- .def(vector_indexing_suite<vector<vector<int>>>());
+ py::bind_vector<vector<vector<int>>>(m, "UpDownConnVector");
- class_<vector<vector<std::pair<int, int>>>>("BranchSpanVector")
- .def(vector_indexing_suite<vector<vector<std::pair<int, int>>>>());
+ py::bind_vector<vector<vector<std::pair<int, int>>>>(m, "BranchSpanVector");
- class_<vector<MissingDccs>>("MissingDccsVector")
- .def(vector_indexing_suite<vector<MissingDccs>>());
+ py::bind_vector<vector<MissingDccs>>(m, "MissingDccsVector");
- class_<vector<int>>("IntVector")
- .def(vector_indexing_suite<vector<int>>());
+ py::bind_vector<vector<int>>(m, "IntVector");
- class_<vector<std::pair<int, int>>>("IntPairVector")
- .def(vector_indexing_suite<vector<std::pair<int, int>>>());
+ py::bind_vector<vector<std::pair<int, int>>>(m, "IntPairVector");
- class_<MachXO2GlobalsInfo>("MachXO2GlobalsInfo")
+ class_<MachXO2GlobalsInfo>(m, "MachXO2GlobalsInfo")
.def_readwrite("lr_conns", &MachXO2GlobalsInfo::lr_conns)
.def_readwrite("ud_conns", &MachXO2GlobalsInfo::ud_conns)
.def_readwrite("branch_spans", &MachXO2GlobalsInfo::branch_spans)
.def_readwrite("missing_dccs", &MachXO2GlobalsInfo::missing_dccs);
- class_<Chip>("Chip", init<string>())
+ class_<Chip>(m, "Chip")
+ .def(init<string>())
.def(init<uint32_t>())
.def(init<const ChipInfo &>())
.def("get_tile_by_name", &Chip::get_tile_by_name)
@@ -187,16 +189,15 @@
.def_readwrite("global_data_machxo2", &Chip::global_data_machxo2)
.def(self - self);
- class_<ChipDelta>("ChipDelta")
- .def(map_indexing_suite<ChipDelta>());
+ py::bind_map<ChipDelta>(m, "ChipDelta");
// From CRAM.cpp
- class_<ChangedBit>("ChangedBit")
+ class_<ChangedBit>(m, "ChangedBit")
.def_readonly("frame", &ChangedBit::frame)
.def_readonly("bit", &ChangedBit::bit)
.def_readonly("delta", &ChangedBit::delta);
- class_<CRAMView>("CRAMView", no_init)
+ class_<CRAMView>(m, "CRAMView")
.def("bit", &CRAMView::get_bit)
.def("set_bit", &CRAMView::set_bit)
.def("bits", &CRAMView::bits)
@@ -204,28 +205,27 @@
.def("clear", &CRAMView::clear)
.def(self - self);
- class_<CRAM>("CRAM", init<int, int>())
+ class_<CRAM>(m, "CRAM")
+ .def(init<int, int>())
.def("bit", &CRAM::get_bit)
.def("set_bit", &CRAM::set_bit)
.def("bits", &CRAM::bits)
.def("frames", &CRAM::frames)
.def("make_view", &CRAM::make_view);
- class_<CRAMDelta>("CRAMDelta")
- .def(vector_indexing_suite<CRAMDelta>());
+ py::bind_vector<CRAMDelta>(m, "CRAMDelta");
// From Tile.cpp
- def("get_row_col_pair_from_chipsize", get_row_col_pair_from_chipsize);
+ m.def("get_row_col_pair_from_chipsize", get_row_col_pair_from_chipsize);
- class_<vector<SiteInfo>>("SiteInfoVector")
- .def(vector_indexing_suite<vector<SiteInfo>>());
+ py::bind_vector<vector<SiteInfo>>(m, "SiteInfoVector");
- class_<SiteInfo>("SiteInfo")
+ class_<SiteInfo>(m, "SiteInfo")
.def_readonly("type", &SiteInfo::type)
.def_readonly("row", &SiteInfo::row)
.def_readonly("col", &SiteInfo::col);
- class_<TileInfo>("TileInfo")
+ class_<TileInfo>(m, "TileInfo")
.def_readonly("name", &TileInfo::name)
.def_readonly("type", &TileInfo::type)
.def_readonly("num_frames", &TileInfo::num_frames)
@@ -235,7 +235,7 @@
.def_readonly("sites", &TileInfo::sites)
.def("get_row_col", &TileInfo::get_row_col);
- class_<Tile, shared_ptr<Tile>>("Tile", no_init)
+ class_<Tile, shared_ptr<Tile>>(m, "Tile")
.def_readonly("info", &Tile::info)
.def_readwrite("cram", &Tile::cram)
.def_readwrite("known_bits", &Tile::known_bits)
@@ -244,27 +244,24 @@
.def("read_config", &Tile::read_config);
// From Database.cpp
- def("load_database", load_database);
- def("find_device_by_name", find_device_by_name);
- def("find_device_by_idcode", find_device_by_idcode);
- def("get_chip_info", get_chip_info);
- def("get_device_tilegrid", get_device_tilegrid);
- def("get_tile_bitdata", get_tile_bitdata);
+ m.def("load_database", load_database);
+ m.def("find_device_by_name", find_device_by_name);
+ m.def("find_device_by_idcode", find_device_by_idcode);
+ m.def("get_chip_info", get_chip_info);
+ m.def("get_device_tilegrid", get_device_tilegrid);
+ m.def("get_tile_bitdata", get_tile_bitdata);
// From BitDatabase.cpp
- register_exception_translator<DatabaseConflictError>(&translate_dbce);
- class_<ConfigBit>("ConfigBit")
+ class_<ConfigBit>(m, "ConfigBit")
.def_readwrite("frame", &ConfigBit::frame)
.def_readwrite("bit", &ConfigBit::bit)
.def_readwrite("inv", &ConfigBit::inv);
- def("cbit_from_str", cbit_from_str);
- class_<vector<ConfigBit>>("ConfigBitVector")
- .def(vector_indexing_suite<vector<ConfigBit>>());
- class_<set<ConfigBit>>("ConfigBitSet")
- .def(bond::python::set_indexing_suite<set<ConfigBit>, true>());
-
- class_<BitGroup>("BitGroup")
+ m.def("cbit_from_str", cbit_from_str);
+ py::bind_vector<vector<ConfigBit>>(m, "ConfigBitVector");
+ class_<std::set<ConfigBit>>(m, "ConfigBitSet");
+
+ class_<BitGroup>(m, "BitGroup")
.def(init<const CRAMDelta &>())
.def_readwrite("bits", &BitGroup::bits)
.def("match", &BitGroup::match)
@@ -272,50 +269,46 @@
.def("set_group", &BitGroup::set_group)
.def("clear_group", &BitGroup::clear_group);
- class_<vector<BitGroup>>("BitGroupVector")
- .def(vector_indexing_suite<vector<BitGroup>>());
+ py::bind_vector<vector<BitGroup>>(m, "BitGroupVector");
- class_<ArcData>("ArcData")
+ class_<ArcData>(m, "ArcData")
.def_readwrite("source", &ArcData::source)
.def_readwrite("sink", &ArcData::sink)
.def_readwrite("bits", &ArcData::bits);
- class_<map<string, ArcData>>("ArcDataMap")
- .def(map_indexing_suite<map<string, ArcData>>());
+ py::bind_map<map<string, ArcData>>(m, "ArcDataMap");
- class_<MuxBits>("MuxBits")
+ class_<MuxBits>(m, "MuxBits")
.def_readwrite("sink", &MuxBits::sink)
.def_readwrite("arcs", &MuxBits::arcs)
.def("get_sources", &MuxBits::get_sources)
.def("get_driver", &MuxBits::get_driver)
.def("set_driver", &MuxBits::set_driver);
- class_<WordSettingBits>("WordSettingBits")
+ class_<WordSettingBits>(m, "WordSettingBits")
.def_readwrite("name", &WordSettingBits::name)
.def_readwrite("bits", &WordSettingBits::bits)
.def_readwrite("defval", &WordSettingBits::defval)
.def("get_value", &WordSettingBits::get_value)
.def("set_value", &WordSettingBits::set_value);
- class_<map<string, BitGroup>>("BitGroupMap")
- .def(map_indexing_suite<map<string, BitGroup>>());
+ py::bind_map<map<string, BitGroup>>(m, "BitGroupMap");
- class_<EnumSettingBits>("EnumSettingBits")
+ class_<EnumSettingBits>(m, "EnumSettingBits")
.def_readwrite("name", &EnumSettingBits::name)
.def_readwrite("options", &EnumSettingBits::options)
.def("get_options", &EnumSettingBits::get_options)
- .add_property("defval", &EnumSettingBits::get_defval, &EnumSettingBits::set_defval)
+ .def_property("defval", &EnumSettingBits::get_defval, &EnumSettingBits::set_defval)
.def("get_value", &EnumSettingBits::get_value)
.def("set_value", &EnumSettingBits::set_value);
- class_<FixedConnection>("FixedConnection")
+ class_<FixedConnection>(m, "FixedConnection")
.def_readwrite("source", &FixedConnection::source)
.def_readwrite("sink", &FixedConnection::sink);
- class_<vector<FixedConnection>>("FixedConnectionVector")
- .def(vector_indexing_suite<vector<FixedConnection>>());
+ py::bind_vector<vector<FixedConnection>>(m, "FixedConnectionVector");
- class_<TileBitDatabase, shared_ptr<TileBitDatabase>>("TileBitDatabase", no_init)
+ class_<TileBitDatabase, shared_ptr<TileBitDatabase>>(m, "TileBitDatabase")
.def("config_to_tile_cram", &TileBitDatabase::config_to_tile_cram)
.def("tile_cram_to_config", &TileBitDatabase::tile_cram_to_config)
.def("get_sinks", &TileBitDatabase::get_sinks)
@@ -335,39 +328,32 @@
.def("remove_setting_enum", &TileBitDatabase::remove_setting_enum)
.def("save", &TileBitDatabase::save);
- typedef pair<string, bool> StringBoolPair;
- typedef pair<string, bool> StringBoolPair;
- class_<StringBoolPair>("StringBoolPair")
- .def_readwrite("first", &StringBoolPair::first)
- .def_readwrite("second", &StringBoolPair::second);
+ class_<StringBoolPair>(m, "StringBoolPair")
+ .def_readonly("first", &StringBoolPair::first)
+ .def_readonly("second", &StringBoolPair::second);
- class_<vector<StringBoolPair>>("StringBoolPairVector")
- .def(vector_indexing_suite<vector<StringBoolPair>>());
+ py::bind_vector<vector<StringBoolPair>>(m, "StringBoolPairVector");
// From TileConfig.hpp
- class_<ConfigArc>("ConfigArc")
+ class_<ConfigArc>(m, "ConfigArc")
.def_readwrite("source", &ConfigArc::source)
.def_readwrite("sink", &ConfigArc::sink);
- class_<ConfigWord>("ConfigWord")
+ class_<ConfigWord>(m, "ConfigWord")
.def_readwrite("name", &ConfigWord::name)
.def_readwrite("value", &ConfigWord::value);
- class_<ConfigEnum>("ConfigEnum")
+ class_<ConfigEnum>(m, "ConfigEnum")
.def_readwrite("name", &ConfigEnum::name)
.def_readwrite("value", &ConfigEnum::value);
- class_<ConfigUnknown>("ConfigUnknown")
+ class_<ConfigUnknown>(m, "ConfigUnknown")
.def_readwrite("frame", &ConfigUnknown::frame)
.def_readwrite("bit", &ConfigUnknown::bit);
- class_<vector<ConfigArc>>("ConfigArcVector")
- .def(vector_indexing_suite<vector<ConfigArc>>());
- class_<vector<ConfigWord>>("ConfigWordVector")
- .def(vector_indexing_suite<vector<ConfigWord>>());
- class_<vector<ConfigEnum>>("ConfigEnumVector")
- .def(vector_indexing_suite<vector<ConfigEnum>>());
- class_<vector<ConfigUnknown>>("ConfigUnknownVector")
- .def(vector_indexing_suite<vector<ConfigUnknown>>());
+ py::bind_vector<vector<ConfigArc>>(m, "ConfigArcVector");
+ py::bind_vector<vector<ConfigWord>>(m, "ConfigWordVector");
+ py::bind_vector<vector<ConfigEnum>>(m, "ConfigEnumVector");
+ py::bind_vector<vector<ConfigUnknown>>(m, "ConfigUnknownVector");
- class_<TileConfig>("TileConfig")
+ class_<TileConfig>(m, "TileConfig")
.def_readwrite("carcs", &TileConfig::carcs)
.def_readwrite("cwords", &TileConfig::cwords)
.def_readwrite("cenums", &TileConfig::cenums)
@@ -377,107 +363,93 @@
.def("add_word", &TileConfig::add_word)
.def("add_unknown", &TileConfig::add_unknown)
.def("to_string", &TileConfig::to_string)
- .def("from_string", &TileConfig::from_string)
- .staticmethod("from_string");
+ .def_static("from_string", &TileConfig::from_string);
// From ChipConfig.hpp
- class_<map<string, TileConfig>>("TileConfigMap")
- .def(map_indexing_suite<map<string, TileConfig>>());
- class_<vector<uint16_t>>("Uint16Vector")
- .def(vector_indexing_suite<vector<uint16_t>>());
- class_<map<uint16_t, vector<uint16_t>>>("Uint16VMap")
- .def(map_indexing_suite<map<uint16_t, vector<uint16_t>>>());
+ py::bind_map<map<string, TileConfig>>(m, "TileConfigMap");
+ py::bind_vector<vector<uint16_t>>(m, "Uint16Vector");
+ py::bind_map<map<uint16_t, vector<uint16_t>>>(m, "Uint16VMap");
- class_<ChipConfig>("ChipConfig")
+ class_<ChipConfig>(m, "ChipConfig")
.def_readwrite("chip_name", &ChipConfig::chip_name)
.def_readwrite("metadata", &ChipConfig::metadata)
.def_readwrite("tiles", &ChipConfig::tiles)
.def_readwrite("tilegroups", &ChipConfig::tilegroups)
.def_readwrite("bram_data", &ChipConfig::bram_data)
.def("to_string", &ChipConfig::to_string)
- .def("from_string", &ChipConfig::from_string)
- .staticmethod("from_string")
+ .def_static("from_string", &ChipConfig::from_string)
.def("to_chip", &ChipConfig::to_chip)
- .def("from_chip", &ChipConfig::from_chip)
- .staticmethod("from_chip");
+ .def_static("from_chip", &ChipConfig::from_chip);
// From RoutingGraph.hpp
- class_<Location>("Location", init<int, int>())
+ class_<Location>(m, "Location")
+ .def(init<int, int>())
.def_readwrite("x", &Location::x)
.def_readwrite("y", &Location::y)
.def(self + self)
.def(self == self)
.def(self != self);
- class_<RoutingId>("RoutingId")
+ class_<RoutingId>(m, "RoutingId")
.def_readwrite("loc", &RoutingId::loc)
.def_readwrite("id", &RoutingId::id)
.def(self == self)
.def(self != self);
- class_<vector<RoutingId>>("RoutingIdVector")
- .def(vector_indexing_suite<vector<RoutingId>>());
+ py::bind_vector<vector<RoutingId>>(m, "RoutingIdVector");
- typedef pair<RoutingId, ident_t> BelPin;
- class_<BelPin>("BelPin")
- .def_readwrite("bel", &BelPin::first)
- .def_readwrite("pin", &BelPin::second);
+ class_<BelPin>(m, "BelPin")
+ .def_readonly("bel", &BelPin::first)
+ .def_readonly("pin", &BelPin::second);
- typedef pair<RoutingId, PortDirection> BelWireDir;
- class_<BelWireDir>("BelWireDir")
- .def_readwrite("wire", &BelWireDir::first)
- .def_readwrite("dir", &BelWireDir::second);
+ class_<BelWireDir>(m, "BelWireDir")
+ .def_readonly("wire", &BelWireDir::first)
+ .def_readonly("dir", &BelWireDir::second);
- enum_<PortDirection>("PortDirection")
+ enum_<PortDirection>(m, "PortDirection")
.value("PORT_IN", PORT_IN)
.value("PORT_OUT", PORT_OUT)
.value("PORT_INOUT", PORT_INOUT);
- class_<vector<BelPin>>("BelPinVector")
- .def(vector_indexing_suite<vector<BelPin>>());
+ py::bind_vector<vector<BelPin>>(m, "BelPinVector");
- class_<RoutingWire>("RoutingWire")
+ class_<RoutingWire>(m, "RoutingWire")
.def_readwrite("id", &RoutingWire::id)
.def_readwrite("uphill", &RoutingWire::uphill)
.def_readwrite("downhill", &RoutingWire::downhill)
.def_readwrite("belsUphill", &RoutingWire::belsUphill)
.def_readwrite("belsDownhill", &RoutingWire::belsDownhill);
- class_<RoutingArc>("RoutingArc")
+ class_<RoutingArc>(m, "RoutingArc")
.def_readwrite("id", &RoutingArc::id)
.def_readwrite("tiletype", &RoutingArc::tiletype)
.def_readwrite("source", &RoutingArc::source)
.def_readwrite("sink", &RoutingArc::sink)
.def_readwrite("configurable", &RoutingArc::configurable);
- class_<map<ident_t, BelWireDir>>("RoutingPinMap")
- .def(map_indexing_suite<map<ident_t, BelWireDir>>());
+ py::bind_map<map<ident_t, BelWireDir>>(m, "RoutingPinMap");
- class_<RoutingBel>("RoutingBel")
+ class_<RoutingBel>(m, "RoutingBel")
.def_readwrite("name", &RoutingBel::name)
.def_readwrite("type", &RoutingBel::type)
.def_readwrite("pins", &RoutingBel::pins)
.def_readwrite("z", &RoutingBel::z);
- class_<map<ident_t, RoutingWire>>("RoutingWireMap")
- .def(map_indexing_suite<map<ident_t, RoutingWire>>());
+ py::bind_map<map<ident_t, RoutingWire>>(m, "RoutingWireMap");
- class_<map<ident_t, RoutingArc>>("RoutingArcMap")
- .def(map_indexing_suite<map<ident_t, RoutingArc>>());
+ py::bind_map<map<ident_t, RoutingArc>>(m, "RoutingArcMap");
- class_<map<ident_t, RoutingBel>>("RoutingBelMap")
- .def(map_indexing_suite<map<ident_t, RoutingBel>>());
+ py::bind_map<map<ident_t, RoutingBel>>(m, "RoutingBelMap");
- class_<RoutingTileLoc>("RoutingTileLoc")
+ class_<RoutingTileLoc>(m, "RoutingTileLoc")
.def_readwrite("loc", &RoutingTileLoc::loc)
.def_readwrite("wires", &RoutingTileLoc::wires)
.def_readwrite("arcs", &RoutingTileLoc::arcs)
.def_readwrite("bels", &RoutingTileLoc::bels);
- class_<map<Location, RoutingTileLoc>>("RoutingTileMap")
- .def(map_indexing_suite<map<Location, RoutingTileLoc>>());
+ py::bind_map<map<Location, RoutingTileLoc>>(m, "RoutingTileMap");
- class_<RoutingGraph, shared_ptr<RoutingGraph>>("RoutingGraph", no_init)
+ class_<RoutingGraph, shared_ptr<RoutingGraph>>(m, "RoutingGraph")
.def_readonly("chip_name", &RoutingGraph::chip_name)
.def_readonly("chip_family", &RoutingGraph::chip_family)
.def_readonly("max_row", &RoutingGraph::max_row)
@@ -491,94 +463,88 @@
.def("add_wire", &RoutingGraph::add_wire);
// DedupChipdb
- using namespace DDChipDb;
- class_<RelId>("RelId")
+ class_<RelId>(m, "RelId")
.def_readwrite("rel", &RelId::rel)
.def_readwrite("id", &RelId::id)
.def(self == self)
.def(self != self);
- class_<BelPort>("BelPort")
+ class_<BelPort>(m, "BelPort")
.def_readwrite("bel", &BelPort::bel)
.def_readwrite("pin", &BelPort::pin);
- class_<BelWire>("BelWire")
+ class_<BelWire>(m, "BelWire")
.def_readwrite("wire", &BelWire::wire)
.def_readwrite("pin", &BelWire::pin)
.def_readwrite("dir", &BelWire::dir);
- class_<vector<BelPort>>("BelPortVector")
- .def(vector_indexing_suite<vector<BelPort>>());
- class_<vector<BelWire>>("BelWireVector")
- .def(vector_indexing_suite<vector<BelWire>>());
- class_<vector<RelId>>("RelIdVector")
- .def(vector_indexing_suite<vector<RelId>>());
- class_<set<RelId>>("RelIdSet")
- .def(bond::python::set_indexing_suite<set<RelId>,true>());
+ py::bind_vector<vector<BelPort>>(m, "BelPortVector");
+ py::bind_vector<vector<BelWire>>(m, "BelWireVector");
+ py::bind_vector<vector<RelId>>(m, "RelIdVector");
+ class_<std::set<RelId>>(m, "RelIdSet")
+ .def("__len__", [](const std::set<RelId> &v) { return v.size(); })
+ .def("__iter__", [](std::set<RelId> &v) {
+ return py::make_iterator(v.begin(), v.end());
+ }, py::keep_alive<0, 1>()); /* Keep vector alive while iterator is used */
- enum_<ArcClass>("ArcClass")
+ enum_<ArcClass>(m, "ArcClass")
.value("ARC_STANDARD", ARC_STANDARD)
.value("ARC_FIXED", ARC_FIXED);
- class_<DdArcData>("DdArcData")
+ class_<DdArcData>(m, "DdArcData")
.def_readwrite("srcWire", &DdArcData::srcWire)
.def_readwrite("sinkWire", &DdArcData::sinkWire)
.def_readwrite("cls", &DdArcData::cls)
.def_readwrite("delay", &DdArcData::delay)
.def_readwrite("tiletype", &DdArcData::tiletype);
- class_<WireData>("WireData")
+ class_<WireData>(m, "WireData")
.def_readwrite("name", &WireData::name)
.def_readwrite("arcsDownhill", &WireData::arcsDownhill)
.def_readwrite("arcsUphill", &WireData::arcsUphill)
.def_readwrite("belPins", &WireData::belPins);
- class_<BelData>("BelData")
+ class_<BelData>(m, "BelData")
.def_readwrite("name", &BelData::name)
.def_readwrite("type", &BelData::type)
.def_readwrite("z", &BelData::z)
.def_readwrite("wires", &BelData::wires);
- class_<vector<BelData>>("BelDataVector")
- .def(vector_indexing_suite<vector<BelData>>());
- class_<vector<WireData>>("WireDataVector")
- .def(vector_indexing_suite<vector<WireData>>());
- class_<vector<DdArcData>>("DdArcDataVector")
- .def(vector_indexing_suite<vector<DdArcData>>());
+ py::bind_vector<vector<BelData>>(m, "BelDataVector");
+ py::bind_vector<vector<WireData>>(m, "WireDataVector");
+ py::bind_vector<vector<DdArcData>>(m, "DdArcDataVector");
- class_<LocationData>("LocationData")
+ class_<LocationData>(m, "LocationData")
.def_readwrite("wires", &LocationData::wires)
.def_readwrite("arcs", &LocationData::arcs)
.def_readwrite("bels", &LocationData::bels)
.def("checksum", &LocationData::checksum);
- class_<map<Location, checksum_t>>("LocationMap")
- .def(map_indexing_suite<map<Location, checksum_t>>());
+ py::bind_map<map<Location, checksum_t>>(m, "LocationMap");
- class_<map<checksum_t, LocationData>>("LocationTypesMap")
- .def(map_indexing_suite<map<checksum_t, LocationData>>());
+ py::bind_map<map<checksum_t, LocationData>>(m, "LocationTypesMap");
- class_<map<Location, LocationData>>("LocationMapDirect")
- .def(map_indexing_suite<map<Location, LocationData>>());
+ py::bind_map<map<Location, LocationData>>(m, "LocationMapDirect");
- class_<checksum_t>("checksum_t")
- .def_readwrite("first", &checksum_t::first)
- .def_readwrite("second", &checksum_t::second)
+ class_<checksum_t>(m, "checksum_t")
+ .def_readonly("first", &checksum_t::first)
+ .def_readonly("second", &checksum_t::second)
+ .def("key", [](const checksum_t &v) { return v; })
.def(self == self);
- class_<DedupChipdb, shared_ptr<DedupChipdb>>("DedupChipdb")
+ class_<DedupChipdb, shared_ptr<DedupChipdb>>(m, "DedupChipdb")
.def_readwrite("locationTypes", &DedupChipdb::locationTypes)
.def_readwrite("typeAtLocation", &DedupChipdb::typeAtLocation)
.def("get_cs_data", &DedupChipdb::get_cs_data)
.def("ident", &DedupChipdb::ident)
.def("to_str", &DedupChipdb::to_str);
- def("make_dedup_chipdb", make_dedup_chipdb);
+ m.def("make_dedup_chipdb", make_dedup_chipdb);
- class_<OptimizedChipdb, shared_ptr<OptimizedChipdb>>("OptimizedChipdb")
+ class_<OptimizedChipdb, shared_ptr<OptimizedChipdb>>(m, "OptimizedChipdb")
.def_readwrite("tiles", &OptimizedChipdb::tiles)
.def("ident", &OptimizedChipdb::ident)
.def("to_str", &OptimizedChipdb::to_str);
- def("make_optimized_chipdb", make_optimized_chipdb);
+ m.def("make_optimized_chipdb", make_optimized_chipdb);
}
diff --git a/util/common/tiles.py b/util/common/tiles.py
index d4c2043..e64c9a1 100644
--- a/util/common/tiles.py
+++ b/util/common/tiles.py
@@ -6,10 +6,8 @@
"""
Extract the tile position as a (row, column) tuple from its name
"""
- size = pytrellis.IntPair()
- size.first = chip_size[0]
- size.second = chip_size[1]
-
+ pair = pytrellis.make_IntPair(chip_size[0],chip_size[1])
+ size = pytrellis.IntPair(pair)
pos = pytrellis.get_row_col_pair_from_chipsize(tile, size, bias)
return int(pos.first), int(pos.second)