66 #pragma GCC diagnostic push
67 #pragma GCC diagnostic ignored "-Wshadow"
69 #pragma clang diagnostic ignored "-Wnested-anon-types"
70 #pragma clang diagnostic ignored "-Wshadow-field-in-constructor-modified"
71 #pragma clang diagnostic ignored "-Wself-assign-overloaded"
74 #include "pybind11/functional.h"
75 #include "pybind11/operators.h"
76 #include "pybind11/pybind11.h"
77 #include "pybind11/stl.h"
78 #include "pybind11/stl/filesystem.h"
79 #include "pybind11/stl_bind.h"
81 #pragma GCC diagnostic pop
97 using RawPtrWrapper = std::unique_ptr<T, py::nodelete>;
137 namespace python_bindings_detail
145 py::handle existing_wrapper(
const T*
object)
147 if (
object ==
nullptr)
152 const auto*
type = py::detail::get_type_info(
typeid(T));
159 return py::detail::get_object_handle(
object,
type);
167 inline py::handle owner_of(py::handle
object)
169 if (py::isinstance<Gate>(
object))
171 return existing_wrapper(py::cast<const Gate*>(
object)->get_netlist());
173 if (py::isinstance<Net>(
object))
175 return existing_wrapper(py::cast<const Net*>(
object)->get_netlist());
177 if (py::isinstance<Module>(
object))
179 return existing_wrapper(py::cast<const Module*>(
object)->get_netlist());
181 if (py::isinstance<Grouping>(
object))
183 return existing_wrapper(py::cast<const Grouping*>(
object)->get_netlist());
185 if (py::isinstance<Endpoint>(
object))
187 const auto* gate = py::cast<const Endpoint*>(
object)->get_gate();
188 return gate ==
nullptr ? py::handle() : existing_wrapper(gate->get_netlist());
190 if (py::isinstance<GateType>(
object))
192 return existing_wrapper(py::cast<const GateType*>(
object)->
get_gate_library());
207 inline void keep_owner_alive(py::detail::function_call& call, py::handle value, py::handle receiver)
209 if (!value || value.is_none())
214 if (py::isinstance<py::list>(value) || py::isinstance<py::tuple>(value) || py::isinstance<py::set>(value))
216 for (py::handle element : py::reinterpret_borrow<py::object>(value))
218 keep_owner_alive(call, element, receiver);
223 if (py::isinstance<py::dict>(value))
226 for (
auto item : py::reinterpret_borrow<py::dict>(value))
228 keep_owner_alive(call, item.first, receiver);
229 keep_owner_alive(call, item.second, receiver);
237 if (py::detail::all_type_info(Py_TYPE(value.ptr())).empty())
242 const py::handle owner = owner_of(value);
243 const py::handle patient = owner ? owner : receiver;
245 if (!patient || patient.is_none() || patient.ptr() == value.ptr())
250 py::detail::keep_alive_impl(value, patient);
261 struct process_attribute<
hal::borrowed> :
public process_attribute_default<hal::borrowed>
263 static void init(
const hal::borrowed&, function_record* record)
266 record->policy = return_value_policy::reference;
269 static void postcall(function_call& call, handle ret)
273 if (!ret || ret.ptr() == PYBIND11_TRY_NEXT_OVERLOAD)
281 const handle receiver = (call.func.is_method && call.args.size() > 0) ? call.args[0] : handle();
282 hal::python_bindings_detail::keep_owner_alive(call, ret, receiver);
std::map< std::pair< u32, const GatePin * >, BooleanFunction > SubgraphFunctionCache
void grouping_init(py::module &m)
void gate_type_sequential_init(py::module &m)
void module_pin_init(py::module &m)
void program_options_init(py::module &m)
void netlist_writer_manager_init(py::module &m)
void gate_library_init(py::module &m)
void netlist_serializer_init(py::module &m)
void net_init(py::module &m)
void gate_type_components_init(py::module &m)
void gate_pin_group_init(py::module &m)
void gate_pin_init(py::module &m)
void netlist_utils_init(py::module &m)
void endpoint_init(py::module &m)
void smt_init(py::module &m)
void base_pin_init(py::module &m)
PYBIND11_MAKE_OPAQUE(hal::SubgraphFunctionCache) namespace hal
void module_pin_group_init(py::module &m)
void plugin_manager_init(py::module &m)
void netlist_init(py::module &m)
void gate_init(py::module &m)
void module_init(py::module &m)
void gate_type_lut_init(py::module &m)
void boolean_function_net_decorator_init(py::module &m)
void project_manager_init(py::module &m)
void subgraph_netlist_decorator_init(py::module &m)
void log_init(py::module &m)
void gate_library_manager_init(py::module &m)
void gate_type_init(py::module &m)
void netlist_modification_decorator_init(py::module &m)
void netlist_traversal_decorator_init(py::module &m)
void data_container_init(py::module &m)
void boolean_function_decorator_init(py::module &m)
void plugin_interfaces_init(py::module &m)
void boolean_function_init(py::module &m)
void core_utils_init(py::module &m)
void netlist_factory_init(py::module &m)
const Module * module(const Gate *g, const NodeBoxes &boxes)
GateLibrary * get_gate_library(const std::string &file_path)
This file contains various functions to create and load netlists.
static void init(const hal::borrowed &, function_record *record)
static void postcall(function_call &call, handle ret)