diff --git a/common/pywrappers.h b/common/pywrappers.h index 725caca8..4e463afd 100644 --- a/common/pywrappers.h +++ b/common/pywrappers.h @@ -140,6 +140,14 @@ template struct deref_and_wrap using ret_type = ContextualWrapper; }; +template struct addr_and_unwrap +{ + inline T *operator()(Context *ctx, ContextualWrapper x) { return &(x.base); } + + using arg_type = ContextualWrapper; + using ret_type = T *; +}; + // Function wrapper // Zero parameters, one return template struct fn_wrapper_0a diff --git a/ecp5/arch_pybindings.cc b/ecp5/arch_pybindings.cc index c261c3ec..1dc9945b 100644 --- a/ecp5/arch_pybindings.cc +++ b/ecp5/arch_pybindings.cc @@ -60,13 +60,13 @@ void arch_wrap_python() fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getBelChecksum"); fn_wrapper_3a_v, - conv_from_str, pass_through>::def_wrap(ctx_cls, "bindBel"); + addr_and_unwrap, pass_through>::def_wrap(ctx_cls, "bindBel"); fn_wrapper_1a_v>::def_wrap( ctx_cls, "unbindBel"); - fn_wrapper_1a, + fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getBoundBelCell"); fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getConflictingBelCell"); + deref_and_wrap, conv_from_str>::def_wrap(ctx_cls, "getConflictingBelCell"); fn_wrapper_0a>::def_wrap(ctx_cls, "getBels"); @@ -78,15 +78,15 @@ void arch_wrap_python() fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getWireChecksum"); fn_wrapper_3a_v, - conv_from_str, pass_through>::def_wrap(ctx_cls, "bindWire"); + addr_and_unwrap, pass_through>::def_wrap(ctx_cls, "bindWire"); fn_wrapper_1a_v>::def_wrap( ctx_cls, "unbindWire"); fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "checkWireAvail"); - fn_wrapper_1a, + fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getBoundWireNet"); fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getConflictingWireNet"); + deref_and_wrap, conv_from_str>::def_wrap(ctx_cls, "getConflictingWireNet"); fn_wrapper_0a>::def_wrap( ctx_cls, "getWires"); @@ -96,15 +96,15 @@ void arch_wrap_python() fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getPipChecksum"); fn_wrapper_3a_v, - conv_from_str, pass_through>::def_wrap(ctx_cls, "bindPip"); + addr_and_unwrap, pass_through>::def_wrap(ctx_cls, "bindPip"); fn_wrapper_1a_v>::def_wrap( ctx_cls, "unbindPip"); fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "checkPipAvail"); - fn_wrapper_1a, + fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getBoundPipNet"); fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getConflictingPipNet"); + deref_and_wrap, conv_from_str>::def_wrap(ctx_cls, "getConflictingPipNet"); fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getPipsDownhill"); diff --git a/ice40/arch_pybindings.cc b/ice40/arch_pybindings.cc index 98164e87..1d16ade0 100644 --- a/ice40/arch_pybindings.cc +++ b/ice40/arch_pybindings.cc @@ -70,13 +70,13 @@ void arch_wrap_python() fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getBelChecksum"); fn_wrapper_3a_v, - conv_from_str, pass_through>::def_wrap(ctx_cls, "bindBel"); + addr_and_unwrap, pass_through>::def_wrap(ctx_cls, "bindBel"); fn_wrapper_1a_v>::def_wrap( ctx_cls, "unbindBel"); - fn_wrapper_1a, + fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getBoundBelCell"); fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getConflictingBelCell"); + deref_and_wrap, conv_from_str>::def_wrap(ctx_cls, "getConflictingBelCell"); fn_wrapper_0a>::def_wrap(ctx_cls, "getBels"); @@ -88,15 +88,15 @@ void arch_wrap_python() fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getWireChecksum"); fn_wrapper_3a_v, - conv_from_str, pass_through>::def_wrap(ctx_cls, "bindWire"); + addr_and_unwrap, pass_through>::def_wrap(ctx_cls, "bindWire"); fn_wrapper_1a_v>::def_wrap( ctx_cls, "unbindWire"); fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "checkWireAvail"); - fn_wrapper_1a, + fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getBoundWireNet"); fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getConflictingWireNet"); + deref_and_wrap, conv_from_str>::def_wrap(ctx_cls, "getConflictingWireNet"); fn_wrapper_0a>::def_wrap( ctx_cls, "getWires"); @@ -106,15 +106,15 @@ void arch_wrap_python() fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getPipChecksum"); fn_wrapper_3a_v, - conv_from_str, pass_through>::def_wrap(ctx_cls, "bindPip"); + addr_and_unwrap, pass_through>::def_wrap(ctx_cls, "bindPip"); fn_wrapper_1a_v>::def_wrap( ctx_cls, "unbindPip"); fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "checkPipAvail"); - fn_wrapper_1a, + fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getBoundPipNet"); fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getConflictingPipNet"); + deref_and_wrap, conv_from_str>::def_wrap(ctx_cls, "getConflictingPipNet"); fn_wrapper_1a, conv_from_str>::def_wrap(ctx_cls, "getPipsDownhill");