#include "Bitstream.hpp"
#include "Chip.hpp"
#include "ChipConfig.hpp"
#include "Database.hpp"
#include "Tile.hpp"
#include "BitDatabase.hpp"
#include "TileConfig.hpp"
#include "RoutingGraph.hpp"
#include "DedupChipdb.hpp"

#include <vector>
#include <string>
#include <iostream>

#ifdef INCLUDE_PYTHON

#include <pybind11/pybind11.h>
#include <pybind11/operators.h>
#include <pybind11/stl_bind.h>

using namespace pybind11;
using namespace Trellis;
using namespace DDChipDb;

namespace py = pybind11;

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_MODULE (pytrellis, m)
{
    // Common Types
    py::bind_vector<vector<string>>(m, "StringVector");

    py::bind_vector<vector<uint8_t>>(m, "ByteVector");

    py::bind_vector<vector<bool>>(m, "BoolVector");

    class_<IntPair>(m, "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
    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>(m, "DeviceLocator")
            .def_readwrite("family", &DeviceLocator::family)
            .def_readwrite("device", &DeviceLocator::device);

    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>(m, "ChipInfo")
            .def_readwrite("name", &ChipInfo::name)
            .def_readwrite("family", &ChipInfo::family)
            .def_readwrite("idcode", &ChipInfo::idcode)
            .def_readonly("num_frames", &ChipInfo::num_frames)
            .def_readonly("bits_per_frame", &ChipInfo::bits_per_frame)
            .def_readonly("pad_bits_before_frame", &ChipInfo::pad_bits_before_frame)
            .def_readonly("pad_bits_after_frame", &ChipInfo::pad_bits_after_frame)
            .def_readonly("max_row", &ChipInfo::max_row)
            .def_readonly("max_col", &ChipInfo::max_col)
            .def_readonly("col_bias", &ChipInfo::col_bias);

    py::bind_map<map<string, shared_ptr<Tile>>>(m, "TileMap");

    py::bind_vector<vector<shared_ptr<Tile>>>(m, "TileVector");

    class_<GlobalRegion>(m, "GlobalRegion")
            .def_readwrite("name", &GlobalRegion::name)
            .def_readwrite("x0", &GlobalRegion::x0)
            .def_readwrite("y0", &GlobalRegion::y0)
            .def_readwrite("x1", &GlobalRegion::x1)
            .def_readwrite("y1", &GlobalRegion::y1)
            .def("matches", &GlobalRegion::matches);

    py::bind_vector<vector<GlobalRegion>>(m, "GlobalRegionVector");

    class_<TapSegment>(m, "TapSegment")
            .def_readwrite("tap_col", &TapSegment::tap_col)
            .def_readwrite("lx0", &TapSegment::lx0)
            .def_readwrite("lx1", &TapSegment::lx1)
            .def_readwrite("rx0", &TapSegment::rx0)
            .def_readwrite("rx1", &TapSegment::rx1)
            .def("matches_left", &TapSegment::matches_left)
            .def("matches_right", &TapSegment::matches_right);

    enum_<TapDriver::TapDir>(m, "TapDir")
            .value("LEFT", TapDriver::LEFT)
            .value("RIGHT", TapDriver::RIGHT);

    class_<TapDriver>(m, "TapDriver")
            .def_readwrite("col", &TapDriver::col)
            .def_readwrite("dir", &TapDriver::dir);

    py::bind_vector<vector<TapSegment>>(m, "TapSegmentVector");

    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>(m, "LeftRightConn")
            .def_readwrite("name", &LeftRightConn::name)
            .def_readwrite("row", &LeftRightConn::row)
            .def_readwrite("row_span", &LeftRightConn::row_span);

    class_<MissingDccs>(m, "MissingDccs")
            .def_readwrite("row", &MissingDccs::row)
            .def_readwrite("missing", &MissingDccs::missing);

    py::bind_vector<vector<LeftRightConn>>(m, "LeftRightConnVector");

    py::bind_vector<vector<vector<int>>>(m, "UpDownConnVector");

    py::bind_vector<vector<vector<std::pair<int, int>>>>(m, "BranchSpanVector");

    py::bind_vector<vector<MissingDccs>>(m, "MissingDccsVector");

    py::bind_vector<vector<int>>(m, "IntVector");

    py::bind_vector<vector<std::pair<int, int>>>(m, "IntPairVector");

    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>(m, "Chip")
            .def(init<string>())
            .def(init<uint32_t>())
            .def(init<const ChipInfo &>())
            .def("get_tile_by_name", &Chip::get_tile_by_name)
            .def("get_tiles_by_position", &Chip::get_tiles_by_position)
            .def("get_tiles_by_type", &Chip::get_tiles_by_type)
            .def("get_all_tiles", &Chip::get_all_tiles)
            .def("get_max_row", &Chip::get_max_row)
            .def("get_max_col", &Chip::get_max_col)
            .def("get_routing_graph", &Chip::get_routing_graph)
            .def_readonly("info", &Chip::info)
            .def_readwrite("cram", &Chip::cram)
            .def_readwrite("tiles", &Chip::tiles)
            .def_readwrite("usercode", &Chip::usercode)
            .def_readwrite("metadata", &Chip::metadata)
            // Alias for backwards compatibility.
            .def_readwrite("global_data", &Chip::global_data_ecp5)
            .def_readwrite("global_data_ecp5", &Chip::global_data_ecp5)
            .def_readwrite("global_data_machxo2", &Chip::global_data_machxo2)
            .def(self - self);

    py::bind_map<ChipDelta>(m, "ChipDelta");

    // From CRAM.cpp
    class_<ChangedBit>(m, "ChangedBit")
            .def_readonly("frame", &ChangedBit::frame)
            .def_readonly("bit", &ChangedBit::bit)
            .def_readonly("delta", &ChangedBit::delta);

    class_<CRAMView>(m, "CRAMView")
            .def("bit", &CRAMView::get_bit)
            .def("set_bit", &CRAMView::set_bit)
            .def("bits", &CRAMView::bits)
            .def("frames", &CRAMView::frames)
            .def("clear", &CRAMView::clear)
            .def(self - self);

    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);

    py::bind_vector<CRAMDelta>(m, "CRAMDelta");

    // From Tile.cpp
    m.def("get_row_col_pair_from_chipsize", get_row_col_pair_from_chipsize);

    py::bind_vector<vector<SiteInfo>>(m, "SiteInfoVector");

    class_<SiteInfo>(m, "SiteInfo")
            .def_readonly("type", &SiteInfo::type)
            .def_readonly("row", &SiteInfo::row)
            .def_readonly("col", &SiteInfo::col);

    class_<TileInfo>(m, "TileInfo")
            .def_readonly("name", &TileInfo::name)
            .def_readonly("type", &TileInfo::type)
            .def_readonly("num_frames", &TileInfo::num_frames)
            .def_readonly("bits_per_frame", &TileInfo::bits_per_frame)
            .def_readonly("frame_offset", &TileInfo::frame_offset)
            .def_readonly("bit_offset", &TileInfo::bit_offset)
            .def_readonly("sites", &TileInfo::sites)
            .def("get_row_col", &TileInfo::get_row_col);

    class_<Tile, shared_ptr<Tile>>(m, "Tile")
            .def_readonly("info", &Tile::info)
            .def_readwrite("cram", &Tile::cram)
            .def_readwrite("known_bits", &Tile::known_bits)
            .def_readwrite("unknown_bits", &Tile::unknown_bits)
            .def("dump_config", &Tile::dump_config)
            .def("read_config", &Tile::read_config);

    // From Database.cpp
    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
    class_<ConfigBit>(m, "ConfigBit")
            .def_readwrite("frame", &ConfigBit::frame)
            .def_readwrite("bit", &ConfigBit::bit)
            .def_readwrite("inv", &ConfigBit::inv);

    m.def("cbit_from_str", cbit_from_str);
    py::bind_vector<vector<ConfigBit>>(m, "ConfigBitVector");
    class_<std::set<ConfigBit>>(m, "ConfigBitSet")
        .def("__len__", [](const std::set<ConfigBit> &v) { return v.size(); })
        .def("__iter__", [](std::set<ConfigBit> &v) {
            return py::make_iterator(v.begin(), v.end());
        }, py::keep_alive<0, 1>()); /* Keep vector alive while iterator is used */

    class_<BitGroup>(m, "BitGroup")
            .def(init<const CRAMDelta &>())
            .def_readwrite("bits", &BitGroup::bits)
            .def("match", &BitGroup::match)
            .def("add_coverage", &BitGroup::add_coverage)
            .def("set_group", &BitGroup::set_group)
            .def("clear_group", &BitGroup::clear_group);

    py::bind_vector<vector<BitGroup>>(m, "BitGroupVector");

    class_<ArcData>(m, "ArcData")
            .def_readwrite("source", &ArcData::source)
            .def_readwrite("sink", &ArcData::sink)
            .def_readwrite("bits", &ArcData::bits);

    py::bind_map<map<string, ArcData>>(m, "ArcDataMap");

    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>(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);

    py::bind_map<map<string, BitGroup>>(m, "BitGroupMap");

    class_<EnumSettingBits>(m, "EnumSettingBits")
            .def_readwrite("name", &EnumSettingBits::name)
            .def_readwrite("options", &EnumSettingBits::options)
            .def("get_options", &EnumSettingBits::get_options)
            .def_property("defval", &EnumSettingBits::get_defval, &EnumSettingBits::set_defval)
            .def("get_value", &EnumSettingBits::get_value)
            .def("set_value", &EnumSettingBits::set_value);

    class_<FixedConnection>(m, "FixedConnection")
            .def(init<>())
            .def_readwrite("source", &FixedConnection::source)
            .def_readwrite("sink", &FixedConnection::sink);

    py::bind_vector<vector<FixedConnection>>(m, "FixedConnectionVector");

    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)
            .def("get_mux_data_for_sink", &TileBitDatabase::get_mux_data_for_sink)
            .def("get_settings_words", &TileBitDatabase::get_settings_words)
            .def("get_data_for_setword", &TileBitDatabase::get_data_for_setword)
            .def("get_settings_enums", &TileBitDatabase::get_settings_enums)
            .def("get_data_for_enum", &TileBitDatabase::get_data_for_enum)
            .def("get_fixed_conns", &TileBitDatabase::get_fixed_conns)
            .def("get_downhill_wires", &TileBitDatabase::get_downhill_wires)
            .def("add_mux_arc", &TileBitDatabase::add_mux_arc)
            .def("add_setting_word", &TileBitDatabase::add_setting_word)
            .def("add_setting_enum", &TileBitDatabase::add_setting_enum)
            .def("add_fixed_conn", &TileBitDatabase::add_fixed_conn)
            .def("remove_fixed_sink", &TileBitDatabase::remove_fixed_sink)
            .def("remove_setting_word", &TileBitDatabase::remove_setting_word)
            .def("remove_setting_enum", &TileBitDatabase::remove_setting_enum)
            .def("save", &TileBitDatabase::save);

    class_<StringBoolPair>(m, "StringBoolPair")
            .def_readonly("first", &StringBoolPair::first)
            .def_readonly("second", &StringBoolPair::second);

    py::bind_vector<vector<StringBoolPair>>(m, "StringBoolPairVector");

    // From TileConfig.hpp
    class_<ConfigArc>(m, "ConfigArc")
            .def_readwrite("source", &ConfigArc::source)
            .def_readwrite("sink", &ConfigArc::sink);
    class_<ConfigWord>(m, "ConfigWord")
            .def_readwrite("name", &ConfigWord::name)
            .def_readwrite("value", &ConfigWord::value);
    class_<ConfigEnum>(m, "ConfigEnum")
            .def_readwrite("name", &ConfigEnum::name)
            .def_readwrite("value", &ConfigEnum::value);
    class_<ConfigUnknown>(m, "ConfigUnknown")
            .def_readwrite("frame", &ConfigUnknown::frame)
            .def_readwrite("bit", &ConfigUnknown::bit);

    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>(m, "TileConfig")
            .def_readwrite("carcs", &TileConfig::carcs)
            .def_readwrite("cwords", &TileConfig::cwords)
            .def_readwrite("cenums", &TileConfig::cenums)
            .def_readwrite("cunknowns", &TileConfig::cunknowns)
            .def("add_arc", &TileConfig::add_arc)
            .def("add_enum", &TileConfig::add_enum)
            .def("add_word", &TileConfig::add_word)
            .def("add_unknown", &TileConfig::add_unknown)
            .def("to_string", &TileConfig::to_string)
            .def_static("from_string", &TileConfig::from_string);

    // From ChipConfig.hpp
    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>(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_static("from_string", &ChipConfig::from_string)
            .def("to_chip", &ChipConfig::to_chip)
            .def_static("from_chip", &ChipConfig::from_chip);

    // From RoutingGraph.hpp
    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>(m, "RoutingId")
            .def_readwrite("loc", &RoutingId::loc)
            .def_readwrite("id", &RoutingId::id)
            .def(self == self)
            .def(self != self);

    py::bind_vector<vector<RoutingId>>(m, "RoutingIdVector");

    class_<BelPin>(m, "BelPin")
            .def_readonly("bel", &BelPin::first)
            .def_readonly("pin", &BelPin::second);

    class_<BelWireDir>(m, "BelWireDir")
            .def_readonly("wire", &BelWireDir::first)
            .def_readonly("dir", &BelWireDir::second);

    enum_<PortDirection>(m, "PortDirection")
            .value("PORT_IN", PORT_IN)
            .value("PORT_OUT", PORT_OUT)
            .value("PORT_INOUT", PORT_INOUT);

    py::bind_vector<vector<BelPin>>(m, "BelPinVector");

    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>(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);

    py::bind_map<map<ident_t, BelWireDir>>(m, "RoutingPinMap");

    class_<RoutingBel>(m, "RoutingBel")
            .def_readwrite("name", &RoutingBel::name)
            .def_readwrite("type", &RoutingBel::type)
            .def_readwrite("pins", &RoutingBel::pins)
            .def_readwrite("z", &RoutingBel::z);

    py::bind_map<map<ident_t, RoutingWire>>(m, "RoutingWireMap");

    py::bind_map<map<ident_t, RoutingArc>>(m, "RoutingArcMap");

    py::bind_map<map<ident_t, RoutingBel>>(m, "RoutingBelMap");

    class_<RoutingTileLoc>(m, "RoutingTileLoc")
            .def_readwrite("loc", &RoutingTileLoc::loc)
            .def_readwrite("wires", &RoutingTileLoc::wires)
            .def_readwrite("arcs", &RoutingTileLoc::arcs)
            .def_readwrite("bels", &RoutingTileLoc::bels);

    py::bind_map<map<Location, RoutingTileLoc>>(m, "RoutingTileMap");

    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)
            .def_readonly("max_col", &RoutingGraph::max_col)
            .def("ident", &RoutingGraph::ident)
            .def("to_str", &RoutingGraph::to_str)
            .def("id_at_loc", &RoutingGraph::id_at_loc)
            .def_readwrite("tiles", &RoutingGraph::tiles)
            .def("globalise_net", &RoutingGraph::globalise_net)
            .def("add_arc", &RoutingGraph::add_arc)
            .def("add_wire", &RoutingGraph::add_wire);

    // DedupChipdb
    class_<RelId>(m, "RelId")
            .def_readwrite("rel", &RelId::rel)
            .def_readwrite("id", &RelId::id)
            .def(self == self)
            .def(self != self);

    class_<BelPort>(m, "BelPort")
            .def_readwrite("bel", &BelPort::bel)
            .def_readwrite("pin", &BelPort::pin);
    class_<BelWire>(m, "BelWire")
            .def_readwrite("wire", &BelWire::wire)
            .def_readwrite("pin", &BelWire::pin)
            .def_readwrite("dir", &BelWire::dir);

    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>(m, "ArcClass")
            .value("ARC_STANDARD", ARC_STANDARD)
            .value("ARC_FIXED", ARC_FIXED);
    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>(m, "WireData")
            .def_readwrite("name", &WireData::name)
            .def_readwrite("arcsDownhill", &WireData::arcsDownhill)
            .def_readwrite("arcsUphill", &WireData::arcsUphill)
            .def_readwrite("belPins", &WireData::belPins);

    class_<BelData>(m, "BelData")
            .def_readwrite("name", &BelData::name)
            .def_readwrite("type", &BelData::type)
            .def_readwrite("z", &BelData::z)
            .def_readwrite("wires", &BelData::wires);

    py::bind_vector<vector<BelData>>(m, "BelDataVector");
    py::bind_vector<vector<WireData>>(m, "WireDataVector");
    py::bind_vector<vector<DdArcData>>(m, "DdArcDataVector");

    class_<LocationData>(m, "LocationData")
            .def_readwrite("wires", &LocationData::wires)
            .def_readwrite("arcs", &LocationData::arcs)
            .def_readwrite("bels", &LocationData::bels)
            .def("checksum", &LocationData::checksum);

    py::bind_map<map<Location, checksum_t>>(m, "LocationMap");

    py::bind_map<map<checksum_t, LocationData>>(m, "LocationTypesMap");

    py::bind_map<map<Location, LocationData>>(m, "LocationMapDirect");

    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>>(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);

    m.def("make_dedup_chipdb", make_dedup_chipdb);

    class_<OptimizedChipdb, shared_ptr<OptimizedChipdb>>(m, "OptimizedChipdb")
            .def_readwrite("tiles", &OptimizedChipdb::tiles)
            .def("ident", &OptimizedChipdb::ident)
            .def("to_str", &OptimizedChipdb::to_str);

    m.def("make_optimized_chipdb", make_optimized_chipdb);

}

#endif
