python: Adding more bindings
Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
parent
1e96d65ded
commit
45ec502ded
@ -117,10 +117,6 @@ BOOST_PYTHON_MODULE(MODULE_NAME)
|
|||||||
def("parse_json", parse_json_shim);
|
def("parse_json", parse_json_shim);
|
||||||
def("load_design", load_design_shim, return_value_policy<manage_new_object>());
|
def("load_design", load_design_shim, return_value_policy<manage_new_object>());
|
||||||
|
|
||||||
class_<IdString>("IdString")
|
|
||||||
.def("__str__", &IdString::global_str, return_value_policy<copy_const_reference>())
|
|
||||||
.def(self < self)
|
|
||||||
.def(self == self);
|
|
||||||
arch_wrap_python();
|
arch_wrap_python();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <boost/python.hpp>
|
#include <boost/python.hpp>
|
||||||
#include <boost/python/suite/indexing/map_indexing_suite.hpp>
|
#include <boost/python/suite/indexing/map_indexing_suite.hpp>
|
||||||
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
|
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
|
||||||
|
#include <sstream>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
@ -81,6 +82,7 @@ template <typename T, typename P = return_value_policy<return_by_value>,
|
|||||||
struct range_wrapper
|
struct range_wrapper
|
||||||
{
|
{
|
||||||
typedef decltype(std::declval<T>().begin()) iterator_t;
|
typedef decltype(std::declval<T>().begin()) iterator_t;
|
||||||
|
typedef decltype(*(std::declval<iterator_t>())) value_t;
|
||||||
typedef typename PythonConversion::ContextualWrapper<T> wrapped_range;
|
typedef typename PythonConversion::ContextualWrapper<T> wrapped_range;
|
||||||
typedef typename PythonConversion::ContextualWrapper<std::pair<iterator_t, iterator_t>> wrapped_pair;
|
typedef typename PythonConversion::ContextualWrapper<std::pair<iterator_t, iterator_t>> wrapped_pair;
|
||||||
static wrapped_pair iter(wrapped_range &range)
|
static wrapped_pair iter(wrapped_range &range)
|
||||||
@ -88,9 +90,25 @@ struct range_wrapper
|
|||||||
return wrapped_pair(range.ctx, std::make_pair(range.base.begin(), range.base.end()));
|
return wrapped_pair(range.ctx, std::make_pair(range.base.begin(), range.base.end()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string repr(wrapped_range &range)
|
||||||
|
{
|
||||||
|
PythonConversion::string_converter<value_t> conv;
|
||||||
|
bool first = true;
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "[";
|
||||||
|
for (const auto &item : range.base) {
|
||||||
|
if (!first)
|
||||||
|
ss << ", ";
|
||||||
|
ss << "'" << conv.to_str(range.ctx, item) << "'";
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
ss << "]";
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
static void wrap(const char *range_name, const char *iter_name)
|
static void wrap(const char *range_name, const char *iter_name)
|
||||||
{
|
{
|
||||||
class_<wrapped_range>(range_name, no_init).def("__iter__", iter);
|
class_<wrapped_range>(range_name, no_init).def("__iter__", iter).def("__repr__", repr);
|
||||||
iterator_wrapper<iterator_t, P, value_conv>().wrap(iter_name);
|
iterator_wrapper<iterator_t, P, value_conv>().wrap(iter_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,6 +41,20 @@ template <> struct string_converter<BelType>
|
|||||||
std::string to_str(Context *ctx, BelType typ) { return ctx->belTypeToId(typ).str(ctx); }
|
std::string to_str(Context *ctx, BelType typ) { return ctx->belTypeToId(typ).str(ctx); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <> struct string_converter<WireId>
|
||||||
|
{
|
||||||
|
WireId from_str(Context *ctx, std::string name) { return ctx->getWireByName(ctx->id(name)); }
|
||||||
|
|
||||||
|
std::string to_str(Context *ctx, WireId id) { return ctx->getWireName(id).str(ctx); }
|
||||||
|
};
|
||||||
|
|
||||||
|
template <> struct string_converter<PipId>
|
||||||
|
{
|
||||||
|
PipId from_str(Context *ctx, std::string name) { return ctx->getPipByName(ctx->id(name)); }
|
||||||
|
|
||||||
|
std::string to_str(Context *ctx, PipId id) { return ctx->getPipName(id).str(ctx); }
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace PythonConversion
|
} // namespace PythonConversion
|
||||||
|
|
||||||
void arch_wrap_python()
|
void arch_wrap_python()
|
||||||
@ -81,8 +95,13 @@ void arch_wrap_python()
|
|||||||
conv_from_str<BelId>>::def_wrap(ctx_cls, "getBelType");
|
conv_from_str<BelId>>::def_wrap(ctx_cls, "getBelType");
|
||||||
fn_wrapper_1a<Context, typeof(&Context::checkBelAvail), &Context::checkBelAvail, pass_through<bool>,
|
fn_wrapper_1a<Context, typeof(&Context::checkBelAvail), &Context::checkBelAvail, pass_through<bool>,
|
||||||
conv_from_str<BelId>>::def_wrap(ctx_cls, "checkBelAvail");
|
conv_from_str<BelId>>::def_wrap(ctx_cls, "checkBelAvail");
|
||||||
fn_wrapper_0a<Context, typeof(&Context::getBels), &Context::getBels, wrap_context<BelRange>>::def_wrap(
|
fn_wrapper_0a<Context, typeof(&Context::getBels), &Context::getBels, wrap_context<BelRange>>::def_wrap(ctx_cls,
|
||||||
ctx_cls, "getBels");
|
"getBels");
|
||||||
|
fn_wrapper_0a<Context, typeof(&Context::getWires), &Context::getWires, wrap_context<WireRange>>::def_wrap(
|
||||||
|
ctx_cls, "getWires");
|
||||||
|
fn_wrapper_1a<Context, typeof(&Context::getPipsDownhill), &Context::getPipsDownhill, wrap_context<PipRange>,
|
||||||
|
conv_from_str<WireId>>::def_wrap(ctx_cls, "getPipsDownhill");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
.def("getBelByName", &Arch::getBelByName)
|
.def("getBelByName", &Arch::getBelByName)
|
||||||
.def("getWireByName", &Arch::getWireByName)
|
.def("getWireByName", &Arch::getWireByName)
|
||||||
@ -107,6 +126,10 @@ void arch_wrap_python()
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
WRAP_RANGE(Bel, conv_to_str<BelId>);
|
WRAP_RANGE(Bel, conv_to_str<BelId>);
|
||||||
|
WRAP_RANGE(Wire, conv_to_str<WireId>);
|
||||||
|
WRAP_RANGE(AllPip, conv_to_str<PipId>);
|
||||||
|
WRAP_RANGE(Pip, conv_to_str<PipId>);
|
||||||
|
|
||||||
// WRAP_RANGE(BelPin);
|
// WRAP_RANGE(BelPin);
|
||||||
// WRAP_RANGE(Wire);
|
// WRAP_RANGE(Wire);
|
||||||
// WRAP_RANGE(AllPip);
|
// WRAP_RANGE(AllPip);
|
||||||
|
Loading…
Reference in New Issue
Block a user