diff --git a/src/interface/python/py_ircx/CMakeLists.txt b/src/interface/python/py_ircx/CMakeLists.txt index 31e9833cf..429b41e50 100644 --- a/src/interface/python/py_ircx/CMakeLists.txt +++ b/src/interface/python/py_ircx/CMakeLists.txt @@ -5,6 +5,7 @@ add_library(py_ircx ${PY_IRCX_SRC}) target_link_libraries(py_ircx PUBLIC ircx_api + ircx_ics55 pybind11::pybind11 ) target_include_directories(py_ircx diff --git a/src/interface/python/py_ircx/py_ircx.cpp b/src/interface/python/py_ircx/py_ircx.cpp index 910f811fc..812e99f99 100644 --- a/src/interface/python/py_ircx/py_ircx.cpp +++ b/src/interface/python/py_ircx/py_ircx.cpp @@ -17,21 +17,86 @@ #include "py_ircx.h" #include "RCXAPI.hh" +#include "ircx_ics55.h" namespace python_interface { -bool init_rcx(const std::string& config) +namespace { + +enum class RcxBackend +{ + kUninitialized, + kNative, + kIcs55, +}; + +RcxBackend active_backend = RcxBackend::kUninitialized; + +bool is_native_pdk(const std::optional& pdk) +{ + return !pdk.has_value() || pdk->empty(); +} + +bool is_ics55_pdk(const std::optional& pdk) +{ + return pdk.has_value() && *pdk == "ics55"; +} + +bool validate_pdk(const std::optional& pdk) { - return RCX_API_INST.init(config); + return is_native_pdk(pdk) || is_ics55_pdk(pdk); +} + +} // namespace + +bool init_rcx(const std::string& config, const std::optional& pdk) +{ + active_backend = RcxBackend::kUninitialized; + + if (!validate_pdk(pdk)) { + return false; + } + + if (is_ics55_pdk(pdk)) { + if (ircx_ics55_init(config.c_str()) != 0) { + active_backend = RcxBackend::kIcs55; + return true; + } + + return false; + } + + if (RCX_API_INST.init(config)) { + active_backend = RcxBackend::kNative; + return true; + } + + return false; } bool run_rcx() { + if (active_backend == RcxBackend::kIcs55) { + return ircx_ics55_run() != 0; + } + + if (active_backend != RcxBackend::kNative) { + return false; + } + return RCX_API_INST.run(); } bool report_rcx() { + if (active_backend == RcxBackend::kIcs55) { + return ircx_ics55_report() != 0; + } + + if (active_backend != RcxBackend::kNative) { + return false; + } + return RCX_API_INST.report(); } diff --git a/src/interface/python/py_ircx/py_ircx.h b/src/interface/python/py_ircx/py_ircx.h index f2ca51276..bd4802371 100644 --- a/src/interface/python/py_ircx/py_ircx.h +++ b/src/interface/python/py_ircx/py_ircx.h @@ -16,13 +16,14 @@ // *************************************************************************************** #pragma once +#include #include #include "RCXAPI.hh" namespace python_interface { -bool init_rcx(const std::string& config); +bool init_rcx(const std::string& config, const std::optional& pdk = std::nullopt); bool run_rcx(); bool report_rcx(); diff --git a/src/interface/python/py_ircx/py_register_ircx.h b/src/interface/python/py_ircx/py_register_ircx.h index 5a7bb070c..8cec8b253 100644 --- a/src/interface/python/py_ircx/py_register_ircx.h +++ b/src/interface/python/py_ircx/py_register_ircx.h @@ -25,7 +25,7 @@ namespace py = pybind11; void register_ircx(py::module& m) { - m.def("init_rcx", init_rcx, py::arg("config")); + m.def("init_rcx", init_rcx, py::arg("config"), py::arg("pdk") = py::none()); m.def("run_rcx", run_rcx); m.def("report_rcx", report_rcx); } diff --git a/src/operation/iRCX/ics55/lib/libgcc_s.so.1 b/src/operation/iRCX/ics55/lib/libgcc_s.so.1 index c60710858..3f84508c6 100644 Binary files a/src/operation/iRCX/ics55/lib/libgcc_s.so.1 and b/src/operation/iRCX/ics55/lib/libgcc_s.so.1 differ diff --git a/src/operation/iRCX/ics55/lib/libgflags.so.2.2 b/src/operation/iRCX/ics55/lib/libgflags.so.2.2 index 78eee2612..496fadb9f 100644 Binary files a/src/operation/iRCX/ics55/lib/libgflags.so.2.2 and b/src/operation/iRCX/ics55/lib/libgflags.so.2.2 differ diff --git a/src/operation/iRCX/ics55/lib/libglog.so.1 b/src/operation/iRCX/ics55/lib/libglog.so.1 index 16a91dcc4..3e9940018 100644 Binary files a/src/operation/iRCX/ics55/lib/libglog.so.1 and b/src/operation/iRCX/ics55/lib/libglog.so.1 differ diff --git a/src/operation/iRCX/ics55/lib/libgomp.so.1 b/src/operation/iRCX/ics55/lib/libgomp.so.1 index 34fb4fc07..5a3dc9d92 100644 Binary files a/src/operation/iRCX/ics55/lib/libgomp.so.1 and b/src/operation/iRCX/ics55/lib/libgomp.so.1 differ diff --git a/src/operation/iRCX/ics55/lib/libircx_ics55.so b/src/operation/iRCX/ics55/lib/libircx_ics55.so index afaa3f8c2..12119d1cf 100755 Binary files a/src/operation/iRCX/ics55/lib/libircx_ics55.so and b/src/operation/iRCX/ics55/lib/libircx_ics55.so differ diff --git a/src/operation/iRCX/ics55/lib/liblzma.so.5 b/src/operation/iRCX/ics55/lib/liblzma.so.5 index 904207aa8..2dfb23888 100644 Binary files a/src/operation/iRCX/ics55/lib/liblzma.so.5 and b/src/operation/iRCX/ics55/lib/liblzma.so.5 differ diff --git a/src/operation/iRCX/ics55/lib/libstdc++.so.6 b/src/operation/iRCX/ics55/lib/libstdc++.so.6 index ed9ba6dc9..0cdd1e9e2 100644 Binary files a/src/operation/iRCX/ics55/lib/libstdc++.so.6 and b/src/operation/iRCX/ics55/lib/libstdc++.so.6 differ diff --git a/src/operation/iRCX/ics55/lib/libunwind.so.8 b/src/operation/iRCX/ics55/lib/libunwind.so.8 index a868ae8bd..4f87f3402 100644 Binary files a/src/operation/iRCX/ics55/lib/libunwind.so.8 and b/src/operation/iRCX/ics55/lib/libunwind.so.8 differ