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
133 namespace python_bindings_detail
143 if (
object ==
nullptr)
148 const auto*
type = py::detail::get_type_info(
typeid(
T));
155 return py::detail::get_object_handle(
object,
type);
165 if (py::isinstance<Gate>(
object))
169 if (py::isinstance<Net>(
object))
173 if (py::isinstance<Module>(
object))
177 if (py::isinstance<Grouping>(
object))
181 if (py::isinstance<Endpoint>(
object))
183 const auto* gate = py::cast<const Endpoint*>(
object)->get_gate();
184 return gate ==
nullptr ? py::handle() :
existing_wrapper(gate->get_netlist());
186 if (py::isinstance<GateType>(
object))
203 inline void keep_owner_alive(py::detail::function_call& call, py::handle value, py::handle receiver)
205 if (!value || value.is_none())
210 if (py::isinstance<py::list>(value) || py::isinstance<py::tuple>(value) || py::isinstance<py::set>(value))
212 for (py::handle element : py::reinterpret_borrow<py::object>(value))
219 if (py::isinstance<py::dict>(value))
221 for (
auto item : py::reinterpret_borrow<py::dict>(value))
231 if (py::detail::all_type_info(Py_TYPE(value.ptr())).empty())
236 const py::handle owner =
owner_of(value);
237 const py::handle patient = owner ? owner : receiver;
239 if (!patient || patient.is_none() || patient.ptr() == value.ptr())
244 py::detail::keep_alive_impl(value, patient);
255 struct process_attribute<
hal::borrowed> :
public process_attribute_default<hal::borrowed>
260 record->policy = return_value_policy::reference;
263 static void postcall(function_call& call, handle ret)
268 const handle receiver = (call.func.is_method && call.args.size() > 0) ? call.args[0] : handle();
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)
std::unique_ptr< T, py::nodelete > RawPtrWrapper
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)
py::handle existing_wrapper(const T *object)
void keep_owner_alive(py::detail::function_call &call, py::handle value, py::handle receiver)
py::handle owner_of(py::handle object)
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)