aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shah <dave@ds0.me>2018-11-22 13:42:20 +0000
committerDavid Shah <dave@ds0.me>2018-11-22 13:42:20 +0000
commit65a5d0595218e6f26d995abf5133d9ea381f40ea (patch)
tree4ef42482b7cba0a289b2f32a95490a9ecdb88f2e
parente48c9e73e7bd30ef49fe3386330337b8a8c02054 (diff)
downloadnextpnr-65a5d0595218e6f26d995abf5133d9ea381f40ea.tar.gz
nextpnr-65a5d0595218e6f26d995abf5133d9ea381f40ea.tar.bz2
nextpnr-65a5d0595218e6f26d995abf5133d9ea381f40ea.zip
python: Fixes to get net wires map working
Signed-off-by: David Shah <dave@ds0.me>
-rw-r--r--common/pybindings.cc7
-rw-r--r--ecp5/arch_pybindings.h26
-rw-r--r--ice40/arch_pybindings.h26
3 files changed, 55 insertions, 4 deletions
diff --git a/common/pybindings.cc b/common/pybindings.cc
index 02928e36..6cae889d 100644
--- a/common/pybindings.cc
+++ b/common/pybindings.cc
@@ -154,12 +154,19 @@ BOOST_PYTHON_MODULE(MODULE_NAME)
readwrite_wrapper<PortRef &, decltype(&PortRef::budget), &PortRef::budget, pass_through<delay_t>,
pass_through<delay_t>>::def_wrap(pr_cls, "budget");
+ auto pm_cls = class_<ContextualWrapper<PipMap &>>("PipMap", no_init);
+ readwrite_wrapper<PipMap &, decltype(&PipMap::pip), &PipMap::pip, conv_to_str<PipId>,
+ conv_from_str<PipId>>::def_wrap(pm_cls, "pip");
+ readwrite_wrapper<PipMap &, decltype(&PipMap::strength), &PipMap::strength, pass_through<PlaceStrength>,
+ pass_through<PlaceStrength>>::def_wrap(pm_cls, "strength");
+
def("parse_json", parse_json_shim);
def("load_design", load_design_shim, return_value_policy<manage_new_object>());
WRAP_MAP(AttrMap, pass_through<std::string>, "AttrMap");
WRAP_MAP(PortMap, wrap_context<PortInfo &>, "PortMap");
WRAP_MAP(PinMap, conv_to_str<IdString>, "PinMap");
+ WRAP_MAP(WireMap, wrap_context<PipMap &>, "WireMap");
WRAP_VECTOR(PortRefVector, wrap_context<PortRef &>);
diff --git a/ecp5/arch_pybindings.h b/ecp5/arch_pybindings.h
index f18b5ff1..9bd7bcdf 100644
--- a/ecp5/arch_pybindings.h
+++ b/ecp5/arch_pybindings.h
@@ -44,14 +44,36 @@ 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); }
+ std::string to_str(Context *ctx, WireId id)
+ {
+ if (id == WireId())
+ throw bad_wrap();
+ return ctx->getWireName(id).str(ctx);
+ }
+};
+
+template <> struct string_converter<const WireId>
+{
+ WireId from_str(Context *ctx, std::string name) { return ctx->getWireByName(ctx->id(name)); }
+
+ std::string to_str(Context *ctx, WireId id)
+ {
+ if (id == WireId())
+ throw bad_wrap();
+ 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); }
+ std::string to_str(Context *ctx, PipId id)
+ {
+ if (id == PipId())
+ throw bad_wrap();
+ return ctx->getPipName(id).str(ctx);
+ }
};
} // namespace PythonConversion
diff --git a/ice40/arch_pybindings.h b/ice40/arch_pybindings.h
index 070c2396..eaf3ac97 100644
--- a/ice40/arch_pybindings.h
+++ b/ice40/arch_pybindings.h
@@ -45,14 +45,36 @@ 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); }
+ std::string to_str(Context *ctx, WireId id)
+ {
+ if (id == WireId())
+ throw bad_wrap();
+ return ctx->getWireName(id).str(ctx);
+ }
+};
+
+template <> struct string_converter<const WireId>
+{
+ WireId from_str(Context *ctx, std::string name) { return ctx->getWireByName(ctx->id(name)); }
+
+ std::string to_str(Context *ctx, WireId id)
+ {
+ if (id == WireId())
+ throw bad_wrap();
+ 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); }
+ std::string to_str(Context *ctx, PipId id)
+ {
+ if (id == PipId())
+ throw bad_wrap();
+ return ctx->getPipName(id).str(ctx);
+ }
};
} // namespace PythonConversion