aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt11
-rw-r--r--common/timing.cc2
-rw-r--r--ecp5/arch.cc52
-rw-r--r--ecp5/arch.h2
-rw-r--r--ecp5/family.cmake137
-rw-r--r--ice40/arch.cc31
-rw-r--r--ice40/arch.h2
-rw-r--r--ice40/family.cmake162
8 files changed, 244 insertions, 155 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 33a703d5..4f29d132 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,6 +7,7 @@ option(BUILD_PYTHON "Build Python Integration" ON)
option(BUILD_TESTS "Build GUI" OFF)
option(COVERAGE "Add code coverage info" OFF)
option(STATIC_BUILD "Create static build" OFF)
+option(EXTERNAL_CHIPDB "Create build with pre-built chipdb binaries" OFF)
set(link_param "")
if (STATIC_BUILD)
@@ -16,6 +17,14 @@ if (STATIC_BUILD)
endif()
endif()
+if (EXTERNAL_CHIPDB)
+ if (NOT DEFINED EXTERNAL_CHIPDB_ROOT)
+ message(STATUS "EXTERNAL_CHIPDB_ROOT not defined using -DEXTERNAL_CHIPDB_ROOT=/path/to/nextpnr. Default to /usr/share/nextpnr")
+ set(EXTERNAL_CHIPDB_ROOT "/usr/share/nextpnr")
+ endif()
+ add_definitions("-DEXTERNAL_CHIPDB_ROOT=\"${EXTERNAL_CHIPDB_ROOT}\"")
+endif()
+
# List of families to build
set(FAMILIES generic ice40 ecp5)
@@ -66,7 +75,7 @@ endif()
find_package(Sanitizers)
# List of Boost libraries to include
-set(boost_libs filesystem thread program_options)
+set(boost_libs filesystem thread program_options iostreams)
if (BUILD_GUI AND NOT BUILD_PYTHON)
message(FATAL_ERROR "GUI requires Python to build")
diff --git a/common/timing.cc b/common/timing.cc
index 8a48b761..64dcdf71 100644
--- a/common/timing.cc
+++ b/common/timing.cc
@@ -930,7 +930,7 @@ void timing_analysis(Context *ctx, bool print_histogram, bool print_fmax, bool p
unsigned bar_width = 60;
auto min_slack = slack_histogram.begin()->first;
auto max_slack = slack_histogram.rbegin()->first;
- auto bin_size = std::max<unsigned>(1, ceil((max_slack - min_slack) / float(num_bins)));
+ auto bin_size = std::max<unsigned>(1, ceil((max_slack - min_slack + 1) / float(num_bins)));
std::vector<unsigned> bins(num_bins);
unsigned max_freq = 0;
for (const auto &i : slack_histogram) {
diff --git a/ecp5/arch.cc b/ecp5/arch.cc
index a2036033..23cdea3b 100644
--- a/ecp5/arch.cc
+++ b/ecp5/arch.cc
@@ -19,6 +19,7 @@
*/
#include <algorithm>
+#include <boost/iostreams/device/mapped_file.hpp>
#include <boost/range/adaptor/reversed.hpp>
#include <cmath>
#include <cstring>
@@ -63,11 +64,37 @@ static const ChipInfoPOD *get_chip_info(const RelPtr<ChipInfoPOD> *ptr) { return
void load_chipdb();
#endif
+#if defined(EXTERNAL_CHIPDB_ROOT)
+const char *chipdb_blob_25k = nullptr;
+const char *chipdb_blob_45k = nullptr;
+const char *chipdb_blob_85k = nullptr;
+
+boost::iostreams::mapped_file_source blob_files[3];
+
+const char *mmap_file(int index, const char *filename)
+{
+ try {
+ blob_files[index].open(filename);
+ if (!blob_files[index].is_open())
+ log_error("Unable to read chipdb %s\n", filename);
+ return (const char *)blob_files[index].data();
+ } catch (...) {
+ log_error("Unable to read chipdb %s\n", filename);
+ }
+}
+
+void load_chipdb()
+{
+ chipdb_blob_25k = mmap_file(0, EXTERNAL_CHIPDB_ROOT "/ecp5/chipdb-25k.bin");
+ chipdb_blob_45k = mmap_file(1, EXTERNAL_CHIPDB_ROOT "/ecp5/chipdb-45k.bin");
+ chipdb_blob_85k = mmap_file(2, EXTERNAL_CHIPDB_ROOT "/ecp5/chipdb-85k.bin");
+}
+#endif
//#define LFE5U_45F_ONLY
Arch::Arch(ArchArgs args) : args(args)
{
-#if defined(_MSC_VER)
+#if defined(_MSC_VER) || defined(EXTERNAL_CHIPDB_ROOT)
load_chipdb();
#endif
#ifdef LFE5U_45F_ONLY
@@ -400,7 +427,28 @@ BelId Arch::getBelByLocation(Loc loc) const
delay_t Arch::estimateDelay(WireId src, WireId dst) const
{
- return (240 - 20 * args.speed) * (abs(src.location.x - dst.location.x) + abs(src.location.y - dst.location.y));
+ auto est_location = [&](WireId w) -> std::pair<int16_t, int16_t> {
+ if (w.location.x == 0 && w.location.y == 0) {
+ // Global wires
+ const auto &wire = locInfo(w)->wire_data[w.index];
+ // Use location of first downhill bel or pip, if available
+ if (wire.num_bel_pins > 0) {
+ return std::make_pair(wire.bel_pins[0].rel_bel_loc.x, wire.bel_pins[0].rel_bel_loc.y);
+ } else if (wire.num_downhill > 0) {
+ return std::make_pair(wire.pips_downhill[0].rel_loc.x, wire.pips_downhill[0].rel_loc.y);
+ } else if (wire.num_uphill > 0) {
+ return std::make_pair(wire.pips_uphill[0].rel_loc.x, wire.pips_uphill[0].rel_loc.y);
+ } else {
+ return std::make_pair<int16_t, int16_t>(0, 0);
+ }
+ } else {
+ return std::make_pair(w.location.x, w.location.y);
+ }
+ };
+
+ auto src_loc = est_location(src), dst_loc = est_location(dst);
+
+ return (240 - 20 * args.speed) * (abs(src_loc.first - dst_loc.first) + abs(src_loc.second - dst_loc.second));
}
delay_t Arch::predictDelay(const NetInfo *net_info, const PortRef &sink) const
diff --git a/ecp5/arch.h b/ecp5/arch.h
index 4f2aaaa9..713c320e 100644
--- a/ecp5/arch.h
+++ b/ecp5/arch.h
@@ -204,7 +204,7 @@ NPNR_PACKED_STRUCT(struct ChipInfoPOD {
RelPtr<SpeedGradePOD> speed_grades;
});
-#if defined(_MSC_VER)
+#if defined(_MSC_VER) || defined(EXTERNAL_CHIPDB_ROOT)
extern const char *chipdb_blob_25k;
extern const char *chipdb_blob_45k;
extern const char *chipdb_blob_85k;
diff --git a/ecp5/family.cmake b/ecp5/family.cmake
index 1d9b4532..799851b2 100644
--- a/ecp5/family.cmake
+++ b/ecp5/family.cmake
@@ -1,77 +1,78 @@
+if (NOT EXTERNAL_CHIPDB)
+ set(devices 25k 45k 85k)
-set(devices 25k 45k 85k)
+ if (NOT DEFINED TRELLIS_ROOT)
+ message(STATUS "TRELLIS_ROOT not defined using -DTRELLIS_ROOT=/path/to/prjtrellis. Default to /usr/local/share/trellis")
+ set(TRELLIS_ROOT "/usr/local/share/trellis")
+ endif()
-if (NOT DEFINED TRELLIS_ROOT)
- message(STATUS "TRELLIS_ROOT not defined using -DTRELLIS_ROOT=/path/to/prjtrellis. Default to /usr/local/share/trellis")
- set(TRELLIS_ROOT "/usr/local/share/trellis")
-endif()
-
-file(GLOB found_pytrellis ${TRELLIS_ROOT}/libtrellis/pytrellis.*
- /usr/lib/pytrellis.*
- /usr/lib64/pytrellis.*
- /usr/lib/trellis/pytrellis.*
- /usr/lib64/trellis/pytrellis.*)
+ file(GLOB found_pytrellis ${TRELLIS_ROOT}/libtrellis/pytrellis.*
+ /usr/lib/pytrellis.*
+ /usr/lib64/pytrellis.*
+ /usr/lib/trellis/pytrellis.*
+ /usr/lib64/trellis/pytrellis.*)
-if ("${found_pytrellis}" STREQUAL "")
- message(FATAL_ERROR "failed to locate pytrellis library!")
-endif()
+ if ("${found_pytrellis}" STREQUAL "")
+ message(FATAL_ERROR "failed to locate pytrellis library!")
+ endif()
-list(GET found_pytrellis 0 PYTRELLIS_LIB)
-get_filename_component(PYTRELLIS_LIBDIR ${PYTRELLIS_LIB} DIRECTORY)
+ list(GET found_pytrellis 0 PYTRELLIS_LIB)
+ get_filename_component(PYTRELLIS_LIBDIR ${PYTRELLIS_LIB} DIRECTORY)
-set(DB_PY ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/trellis_import.py)
+ set(DB_PY ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/trellis_import.py)
-file(MAKE_DIRECTORY ecp5/chipdbs/)
-add_library(ecp5_chipdb OBJECT ecp5/chipdbs/)
-target_compile_definitions(ecp5_chipdb PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family})
-target_include_directories(ecp5_chipdb PRIVATE ${family}/)
+ file(MAKE_DIRECTORY ecp5/chipdbs/)
+ add_library(ecp5_chipdb OBJECT ecp5/chipdbs/)
+ target_compile_definitions(ecp5_chipdb PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family})
+ target_include_directories(ecp5_chipdb PRIVATE ${family}/)
-if (CMAKE_HOST_WIN32)
-set(ENV_CMD ${CMAKE_COMMAND} -E env "PYTHONPATH=\"${PYTRELLIS_LIBDIR}\;${TRELLIS_ROOT}/util/common\;${TRELLIS_ROOT}/timing/util\"")
-else()
-set(ENV_CMD ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTRELLIS_LIBDIR}\:${TRELLIS_ROOT}/util/common:${TRELLIS_ROOT}/timing/util")
-endif()
+ if (CMAKE_HOST_WIN32)
+ set(ENV_CMD ${CMAKE_COMMAND} -E env "PYTHONPATH=\"${PYTRELLIS_LIBDIR}\;${TRELLIS_ROOT}/util/common\;${TRELLIS_ROOT}/timing/util\"")
+ else()
+ set(ENV_CMD ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTRELLIS_LIBDIR}\:${TRELLIS_ROOT}/util/common:${TRELLIS_ROOT}/timing/util")
+ endif()
-if (MSVC)
- target_sources(ecp5_chipdb PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/resource/embed.cc)
- set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/ecp5/resources/chipdb.rc PROPERTIES LANGUAGE RC)
- foreach (dev ${devices})
- set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.bin)
- set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.bba)
- set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/constids.inc)
- add_custom_command(OUTPUT ${DEV_CC_BBA_DB}
- COMMAND ${ENV_CMD} python3 ${DB_PY} -p ${DEV_CONSTIDS_INC} ${dev} > ${DEV_CC_BBA_DB}
- DEPENDS ${DB_PY}
- )
- add_custom_command(OUTPUT ${DEV_CC_DB}
- COMMAND bbasm ${DEV_CC_BBA_DB} ${DEV_CC_DB}
- DEPENDS bbasm ${DEV_CC_BBA_DB}
- )
- target_sources(ecp5_chipdb PRIVATE ${DEV_CC_DB})
- set_source_files_properties(${DEV_CC_DB} PROPERTIES HEADER_FILE_ONLY TRUE)
- foreach (target ${family_targets})
- target_sources(${target} PRIVATE $<TARGET_OBJECTS:ecp5_chipdb> ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/resource/chipdb.rc)
- endforeach (target)
- endforeach (dev)
-else()
- target_compile_options(ecp5_chipdb PRIVATE -g0 -O0 -w)
- foreach (dev ${devices})
- set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.cc)
- set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.bba)
- set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/constids.inc)
- add_custom_command(OUTPUT ${DEV_CC_BBA_DB}
- COMMAND ${ENV_CMD} python3 ${DB_PY} -p ${DEV_CONSTIDS_INC} ${dev} > ${DEV_CC_BBA_DB}.new
- COMMAND mv ${DEV_CC_BBA_DB}.new ${DEV_CC_BBA_DB}
- DEPENDS ${DB_PY}
- )
- add_custom_command(OUTPUT ${DEV_CC_DB}
- COMMAND bbasm --c ${DEV_CC_BBA_DB} ${DEV_CC_DB}.new
- COMMAND mv ${DEV_CC_DB}.new ${DEV_CC_DB}
- DEPENDS bbasm ${DEV_CC_BBA_DB}
- )
- target_sources(ecp5_chipdb PRIVATE ${DEV_CC_DB})
- foreach (target ${family_targets})
- target_sources(${target} PRIVATE $<TARGET_OBJECTS:ecp5_chipdb>)
- endforeach (target)
- endforeach (dev)
+ if (MSVC)
+ target_sources(ecp5_chipdb PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/resource/embed.cc)
+ set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/ecp5/resources/chipdb.rc PROPERTIES LANGUAGE RC)
+ foreach (dev ${devices})
+ set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.bin)
+ set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.bba)
+ set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/constids.inc)
+ add_custom_command(OUTPUT ${DEV_CC_BBA_DB}
+ COMMAND ${ENV_CMD} python3 ${DB_PY} -p ${DEV_CONSTIDS_INC} ${dev} > ${DEV_CC_BBA_DB}
+ DEPENDS ${DB_PY}
+ )
+ add_custom_command(OUTPUT ${DEV_CC_DB}
+ COMMAND bbasm ${DEV_CC_BBA_DB} ${DEV_CC_DB}
+ DEPENDS bbasm ${DEV_CC_BBA_DB}
+ )
+ target_sources(ecp5_chipdb PRIVATE ${DEV_CC_DB})
+ set_source_files_properties(${DEV_CC_DB} PROPERTIES HEADER_FILE_ONLY TRUE)
+ foreach (target ${family_targets})
+ target_sources(${target} PRIVATE $<TARGET_OBJECTS:ecp5_chipdb> ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/resource/chipdb.rc)
+ endforeach (target)
+ endforeach (dev)
+ else()
+ target_compile_options(ecp5_chipdb PRIVATE -g0 -O0 -w)
+ foreach (dev ${devices})
+ set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.cc)
+ set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.bba)
+ set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/constids.inc)
+ add_custom_command(OUTPUT ${DEV_CC_BBA_DB}
+ COMMAND ${ENV_CMD} python3 ${DB_PY} -p ${DEV_CONSTIDS_INC} ${dev} > ${DEV_CC_BBA_DB}.new
+ COMMAND mv ${DEV_CC_BBA_DB}.new ${DEV_CC_BBA_DB}
+ DEPENDS ${DB_PY}
+ )
+ add_custom_command(OUTPUT ${DEV_CC_DB}
+ COMMAND bbasm --c ${DEV_CC_BBA_DB} ${DEV_CC_DB}.new
+ COMMAND mv ${DEV_CC_DB}.new ${DEV_CC_DB}
+ DEPENDS bbasm ${DEV_CC_BBA_DB}
+ )
+ target_sources(ecp5_chipdb PRIVATE ${DEV_CC_DB})
+ foreach (target ${family_targets})
+ target_sources(${target} PRIVATE $<TARGET_OBJECTS:ecp5_chipdb>)
+ endforeach (target)
+ endforeach (dev)
+ endif()
endif()
diff --git a/ice40/arch.cc b/ice40/arch.cc
index f6084e72..23a2130c 100644
--- a/ice40/arch.cc
+++ b/ice40/arch.cc
@@ -19,6 +19,7 @@
*/
#include <algorithm>
+#include <boost/iostreams/device/mapped_file.hpp>
#include <cmath>
#include "cells.h"
#include "gfx.h"
@@ -48,9 +49,37 @@ static const ChipInfoPOD *get_chip_info(const RelPtr<ChipInfoPOD> *ptr) { return
void load_chipdb();
#endif
+#if defined(EXTERNAL_CHIPDB_ROOT)
+const char *chipdb_blob_384 = nullptr;
+const char *chipdb_blob_1k = nullptr;
+const char *chipdb_blob_5k = nullptr;
+const char *chipdb_blob_8k = nullptr;
+
+boost::iostreams::mapped_file_source blob_files[4];
+
+const char *mmap_file(int index, const char *filename)
+{
+ try {
+ blob_files[index].open(filename);
+ if (!blob_files[index].is_open())
+ log_error("Unable to read chipdb %s\n", filename);
+ return (const char *)blob_files[index].data();
+ } catch (...) {
+ log_error("Unable to read chipdb %s\n", filename);
+ }
+}
+
+void load_chipdb()
+{
+ chipdb_blob_384 = mmap_file(0, EXTERNAL_CHIPDB_ROOT "/ice40/chipdb-384.bin");
+ chipdb_blob_1k = mmap_file(1, EXTERNAL_CHIPDB_ROOT "/ice40/chipdb-1k.bin");
+ chipdb_blob_5k = mmap_file(2, EXTERNAL_CHIPDB_ROOT "/ice40/chipdb-5k.bin");
+ chipdb_blob_8k = mmap_file(3, EXTERNAL_CHIPDB_ROOT "/ice40/chipdb-8k.bin");
+}
+#endif
Arch::Arch(ArchArgs args) : args(args)
{
-#if defined(_MSC_VER)
+#if defined(_MSC_VER) || defined(EXTERNAL_CHIPDB_ROOT)
load_chipdb();
#endif
diff --git a/ice40/arch.h b/ice40/arch.h
index 2dd6b06c..b25e3aee 100644
--- a/ice40/arch.h
+++ b/ice40/arch.h
@@ -244,7 +244,7 @@ NPNR_PACKED_STRUCT(struct ChipInfoPOD {
RelPtr<RelPtr<char>> tile_wire_names;
});
-#if defined(_MSC_VER)
+#if defined(_MSC_VER) || defined(EXTERNAL_CHIPDB_ROOT)
extern const char *chipdb_blob_384;
extern const char *chipdb_blob_1k;
extern const char *chipdb_blob_5k;
diff --git a/ice40/family.cmake b/ice40/family.cmake
index 0e1d36e6..877b27ee 100644
--- a/ice40/family.cmake
+++ b/ice40/family.cmake
@@ -1,84 +1,86 @@
-if(ICE40_HX1K_ONLY)
- set(devices 1k)
- foreach (target ${family_targets})
- target_compile_definitions(${target} PRIVATE ICE40_HX1K_ONLY=1)
- endforeach (target)
-else()
- set(devices 384 1k 5k 8k)
-endif()
+if (NOT EXTERNAL_CHIPDB)
+ if(ICE40_HX1K_ONLY)
+ set(devices 1k)
+ foreach (target ${family_targets})
+ target_compile_definitions(${target} PRIVATE ICE40_HX1K_ONLY=1)
+ endforeach (target)
+ else()
+ set(devices 384 1k 5k 8k)
+ endif()
-set(DB_PY ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdb.py)
+ set(DB_PY ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdb.py)
-set(ICEBOX_ROOT "/usr/local/share/icebox" CACHE STRING "icebox location root")
-file(MAKE_DIRECTORY ice40/chipdbs/)
-add_library(ice40_chipdb OBJECT ice40/chipdbs/)
-target_compile_definitions(ice40_chipdb PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family})
-target_include_directories(ice40_chipdb PRIVATE ${family}/)
+ set(ICEBOX_ROOT "/usr/local/share/icebox" CACHE STRING "icebox location root")
+ file(MAKE_DIRECTORY ice40/chipdbs/)
+ add_library(ice40_chipdb OBJECT ice40/chipdbs/)
+ target_compile_definitions(ice40_chipdb PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family})
+ target_include_directories(ice40_chipdb PRIVATE ${family}/)
-if (MSVC)
- target_sources(ice40_chipdb PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ice40/resource/embed.cc)
- set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/ice40/resources/chipdb.rc PROPERTIES LANGUAGE RC)
- foreach (dev ${devices})
- if (dev EQUAL "5k")
- set(OPT_FAST "")
- set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_up5k.txt)
- elseif(dev EQUAL "384")
- set(OPT_FAST "")
- set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp384.txt)
- else()
- set(OPT_FAST --fast ${ICEBOX_ROOT}/timings_hx${dev}.txt)
- set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp${dev}.txt)
- endif()
- set(DEV_TXT_DB ${ICEBOX_ROOT}/chipdb-${dev}.txt)
- set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.bba)
- set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.bin)
- set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ice40/constids.inc)
- set(DEV_GFXH ${CMAKE_CURRENT_SOURCE_DIR}/ice40/gfx.h)
- add_custom_command(OUTPUT ${DEV_CC_BBA_DB}
- COMMAND ${PYTHON_EXECUTABLE} ${DB_PY} -p ${DEV_CONSTIDS_INC} -g ${DEV_GFXH} ${OPT_FAST} ${OPT_SLOW} ${DEV_TXT_DB} > ${DEV_CC_BBA_DB}
- DEPENDS ${DEV_CONSTIDS_INC} ${DEV_GFXH} ${DEV_TXT_DB} ${DB_PY}
- )
- add_custom_command(OUTPUT ${DEV_CC_DB}
- COMMAND bbasm ${DEV_CC_BBA_DB} ${DEV_CC_DB}
- DEPENDS bbasm ${DEV_CC_BBA_DB}
- )
- target_sources(ice40_chipdb PRIVATE ${DEV_CC_DB})
- set_source_files_properties(${DEV_CC_DB} PROPERTIES HEADER_FILE_ONLY TRUE)
- foreach (target ${family_targets})
- target_sources(${target} PRIVATE $<TARGET_OBJECTS:ice40_chipdb> ${CMAKE_CURRENT_SOURCE_DIR}/ice40/resource/chipdb.rc)
- endforeach (target)
- endforeach (dev)
-else()
- target_compile_options(ice40_chipdb PRIVATE -g0 -O0 -w)
- foreach (dev ${devices})
- if (dev EQUAL "5k")
- set(OPT_FAST "")
- set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_up5k.txt)
- elseif(dev EQUAL "384")
- set(OPT_FAST "")
- set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp384.txt)
- else()
- set(OPT_FAST --fast ${ICEBOX_ROOT}/timings_hx${dev}.txt)
- set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp${dev}.txt)
- endif()
- set(DEV_TXT_DB ${ICEBOX_ROOT}/chipdb-${dev}.txt)
- set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.bba)
- set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.cc)
- set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ice40/constids.inc)
- set(DEV_GFXH ${CMAKE_CURRENT_SOURCE_DIR}/ice40/gfx.h)
- add_custom_command(OUTPUT ${DEV_CC_BBA_DB}
- COMMAND ${PYTHON_EXECUTABLE} ${DB_PY} -p ${DEV_CONSTIDS_INC} -g ${DEV_GFXH} ${OPT_FAST} ${OPT_SLOW} ${DEV_TXT_DB} > ${DEV_CC_BBA_DB}.new
- COMMAND mv ${DEV_CC_BBA_DB}.new ${DEV_CC_BBA_DB}
- DEPENDS ${DEV_CONSTIDS_INC} ${DEV_GFXH} ${DEV_TXT_DB} ${DB_PY}
- )
- add_custom_command(OUTPUT ${DEV_CC_DB}
- COMMAND bbasm --c ${DEV_CC_BBA_DB} ${DEV_CC_DB}.new
- COMMAND mv ${DEV_CC_DB}.new ${DEV_CC_DB}
- DEPENDS bbasm ${DEV_CC_BBA_DB}
- )
- target_sources(ice40_chipdb PRIVATE ${DEV_CC_DB})
- foreach (target ${family_targets})
- target_sources(${target} PRIVATE $<TARGET_OBJECTS:ice40_chipdb>)
- endforeach (target)
- endforeach (dev)
+ if (MSVC)
+ target_sources(ice40_chipdb PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ice40/resource/embed.cc)
+ set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/ice40/resources/chipdb.rc PROPERTIES LANGUAGE RC)
+ foreach (dev ${devices})
+ if (dev EQUAL "5k")
+ set(OPT_FAST "")
+ set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_up5k.txt)
+ elseif(dev EQUAL "384")
+ set(OPT_FAST "")
+ set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp384.txt)
+ else()
+ set(OPT_FAST --fast ${ICEBOX_ROOT}/timings_hx${dev}.txt)
+ set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp${dev}.txt)
+ endif()
+ set(DEV_TXT_DB ${ICEBOX_ROOT}/chipdb-${dev}.txt)
+ set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.bba)
+ set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.bin)
+ set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ice40/constids.inc)
+ set(DEV_GFXH ${CMAKE_CURRENT_SOURCE_DIR}/ice40/gfx.h)
+ add_custom_command(OUTPUT ${DEV_CC_BBA_DB}
+ COMMAND ${PYTHON_EXECUTABLE} ${DB_PY} -p ${DEV_CONSTIDS_INC} -g ${DEV_GFXH} ${OPT_FAST} ${OPT_SLOW} ${DEV_TXT_DB} > ${DEV_CC_BBA_DB}
+ DEPENDS ${DEV_CONSTIDS_INC} ${DEV_GFXH} ${DEV_TXT_DB} ${DB_PY}
+ )
+ add_custom_command(OUTPUT ${DEV_CC_DB}
+ COMMAND bbasm ${DEV_CC_BBA_DB} ${DEV_CC_DB}
+ DEPENDS bbasm ${DEV_CC_BBA_DB}
+ )
+ target_sources(ice40_chipdb PRIVATE ${DEV_CC_DB})
+ set_source_files_properties(${DEV_CC_DB} PROPERTIES HEADER_FILE_ONLY TRUE)
+ foreach (target ${family_targets})
+ target_sources(${target} PRIVATE $<TARGET_OBJECTS:ice40_chipdb> ${CMAKE_CURRENT_SOURCE_DIR}/ice40/resource/chipdb.rc)
+ endforeach (target)
+ endforeach (dev)
+ else()
+ target_compile_options(ice40_chipdb PRIVATE -g0 -O0 -w)
+ foreach (dev ${devices})
+ if (dev EQUAL "5k")
+ set(OPT_FAST "")
+ set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_up5k.txt)
+ elseif(dev EQUAL "384")
+ set(OPT_FAST "")
+ set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp384.txt)
+ else()
+ set(OPT_FAST --fast ${ICEBOX_ROOT}/timings_hx${dev}.txt)
+ set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp${dev}.txt)
+ endif()
+ set(DEV_TXT_DB ${ICEBOX_ROOT}/chipdb-${dev}.txt)
+ set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.bba)
+ set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.cc)
+ set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ice40/constids.inc)
+ set(DEV_GFXH ${CMAKE_CURRENT_SOURCE_DIR}/ice40/gfx.h)
+ add_custom_command(OUTPUT ${DEV_CC_BBA_DB}
+ COMMAND ${PYTHON_EXECUTABLE} ${DB_PY} -p ${DEV_CONSTIDS_INC} -g ${DEV_GFXH} ${OPT_FAST} ${OPT_SLOW} ${DEV_TXT_DB} > ${DEV_CC_BBA_DB}.new
+ COMMAND mv ${DEV_CC_BBA_DB}.new ${DEV_CC_BBA_DB}
+ DEPENDS ${DEV_CONSTIDS_INC} ${DEV_GFXH} ${DEV_TXT_DB} ${DB_PY}
+ )
+ add_custom_command(OUTPUT ${DEV_CC_DB}
+ COMMAND bbasm --c ${DEV_CC_BBA_DB} ${DEV_CC_DB}.new
+ COMMAND mv ${DEV_CC_DB}.new ${DEV_CC_DB}
+ DEPENDS bbasm ${DEV_CC_BBA_DB}
+ )
+ target_sources(ice40_chipdb PRIVATE ${DEV_CC_DB})
+ foreach (target ${family_targets})
+ target_sources(${target} PRIVATE $<TARGET_OBJECTS:ice40_chipdb>)
+ endforeach (target)
+ endforeach (dev)
+ endif()
endif()
s="n">offsetof(xen_host_record, api_version_minor) }, { .key = "API_version_vendor", .type = &abstract_type_string, .offset = offsetof(xen_host_record, api_version_vendor) }, { .key = "API_version_vendor_implementation", .type = &abstract_type_string_string_map, .offset = offsetof(xen_host_record, api_version_vendor_implementation) }, { .key = "enabled", .type = &abstract_type_bool, .offset = offsetof(xen_host_record, enabled) }, { .key = "software_version", .type = &abstract_type_string_string_map, .offset = offsetof(xen_host_record, software_version) }, { .key = "other_config", .type = &abstract_type_string_string_map, .offset = offsetof(xen_host_record, other_config) }, { .key = "capabilities", .type = &abstract_type_string_set, .offset = offsetof(xen_host_record, capabilities) }, { .key = "cpu_configuration", .type = &abstract_type_string_string_map, .offset = offsetof(xen_host_record, cpu_configuration) }, { .key = "sched_policy", .type = &abstract_type_string, .offset = offsetof(xen_host_record, sched_policy) }, { .key = "supported_bootloaders", .type = &abstract_type_string_set, .offset = offsetof(xen_host_record, supported_bootloaders) }, { .key = "resident_VMs", .type = &abstract_type_ref_set, .offset = offsetof(xen_host_record, resident_vms) }, { .key = "logging", .type = &abstract_type_string_string_map, .offset = offsetof(xen_host_record, logging) }, { .key = "PIFs", .type = &abstract_type_ref_set, .offset = offsetof(xen_host_record, pifs) }, { .key = "suspend_image_sr", .type = &abstract_type_ref, .offset = offsetof(xen_host_record, suspend_image_sr) }, { .key = "crash_dump_sr", .type = &abstract_type_ref, .offset = offsetof(xen_host_record, crash_dump_sr) }, { .key = "PBDs", .type = &abstract_type_ref_set, .offset = offsetof(xen_host_record, pbds) }, { .key = "host_CPUs", .type = &abstract_type_ref_set, .offset = offsetof(xen_host_record, host_cpus) }, { .key = "metrics", .type = &abstract_type_ref, .offset = offsetof(xen_host_record, metrics) } }; const abstract_type xen_host_record_abstract_type_ = { .typename = STRUCT, .struct_size = sizeof(xen_host_record), .member_count = sizeof(xen_host_record_struct_members) / sizeof(struct_member), .members = xen_host_record_struct_members }; void xen_host_record_free(xen_host_record *record) { if (record == NULL) { return; } free(record->handle); free(record->uuid); free(record->name_label); free(record->name_description); free(record->api_version_vendor); xen_string_string_map_free(record->api_version_vendor_implementation); xen_string_string_map_free(record->software_version); xen_string_string_map_free(record->other_config); xen_string_set_free(record->capabilities); xen_string_string_map_free(record->cpu_configuration); free(record->sched_policy); xen_string_set_free(record->supported_bootloaders); xen_vm_record_opt_set_free(record->resident_vms); xen_string_string_map_free(record->logging); xen_pif_record_opt_set_free(record->pifs); xen_sr_record_opt_free(record->suspend_image_sr); xen_sr_record_opt_free(record->crash_dump_sr); xen_pbd_record_opt_set_free(record->pbds); xen_host_cpu_record_opt_set_free(record->host_cpus); xen_host_metrics_record_opt_free(record->metrics); free(record); } bool xen_host_get_record(xen_session *session, xen_host_record **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = xen_host_record_abstract_type_; *result = NULL; XEN_CALL_("host.get_record"); if (session->ok) { (*result)->handle = xen_strdup_((*result)->uuid); } return session->ok; } bool xen_host_get_by_uuid(xen_session *session, xen_host *result, char *uuid) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = uuid } }; abstract_type result_type = abstract_type_string; *result = NULL; XEN_CALL_("host.get_by_uuid"); return session->ok; } bool xen_host_get_by_name_label(xen_session *session, struct xen_host_set **result, char *label) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = label } }; abstract_type result_type = abstract_type_string_set; *result = NULL; XEN_CALL_("host.get_by_name_label"); return session->ok; } bool xen_host_get_name_label(xen_session *session, char **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string; *result = NULL; XEN_CALL_("host.get_name_label"); return session->ok; } bool xen_host_get_name_description(xen_session *session, char **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string; *result = NULL; XEN_CALL_("host.get_name_description"); return session->ok; } bool xen_host_get_api_version_major(xen_session *session, int64_t *result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_int; XEN_CALL_("host.get_API_version_major"); return session->ok; } bool xen_host_get_api_version_minor(xen_session *session, int64_t *result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_int; XEN_CALL_("host.get_API_version_minor"); return session->ok; } bool xen_host_get_api_version_vendor(xen_session *session, char **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string; *result = NULL; XEN_CALL_("host.get_API_version_vendor"); return session->ok; } bool xen_host_get_api_version_vendor_implementation(xen_session *session, xen_string_string_map **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string_string_map; *result = NULL; XEN_CALL_("host.get_API_version_vendor_implementation"); return session->ok; } bool xen_host_get_enabled(xen_session *session, bool *result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_bool; XEN_CALL_("host.get_enabled"); return session->ok; } bool xen_host_get_software_version(xen_session *session, xen_string_string_map **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string_string_map; *result = NULL; XEN_CALL_("host.get_software_version"); return session->ok; } bool xen_host_get_other_config(xen_session *session, xen_string_string_map **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string_string_map; *result = NULL; XEN_CALL_("host.get_other_config"); return session->ok; } bool xen_host_get_capabilities(xen_session *session, struct xen_string_set **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string_set; *result = NULL; XEN_CALL_("host.get_capabilities"); return session->ok; } bool xen_host_get_cpu_configuration(xen_session *session, xen_string_string_map **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string_string_map; *result = NULL; XEN_CALL_("host.get_cpu_configuration"); return session->ok; } bool xen_host_get_sched_policy(xen_session *session, char **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string; *result = NULL; XEN_CALL_("host.get_sched_policy"); return session->ok; } bool xen_host_get_supported_bootloaders(xen_session *session, struct xen_string_set **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string_set; *result = NULL; XEN_CALL_("host.get_supported_bootloaders"); return session->ok; } bool xen_host_get_resident_vms(xen_session *session, struct xen_vm_set **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string_set; *result = NULL; XEN_CALL_("host.get_resident_VMs"); return session->ok; } bool xen_host_get_logging(xen_session *session, xen_string_string_map **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string_string_map; *result = NULL; XEN_CALL_("host.get_logging"); return session->ok; } bool xen_host_get_pifs(xen_session *session, struct xen_pif_set **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string_set; *result = NULL; XEN_CALL_("host.get_PIFs"); return session->ok; } bool xen_host_get_suspend_image_sr(xen_session *session, xen_sr *result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string; *result = NULL; XEN_CALL_("host.get_suspend_image_sr"); return session->ok; } bool xen_host_get_crash_dump_sr(xen_session *session, xen_sr *result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string; *result = NULL; XEN_CALL_("host.get_crash_dump_sr"); return session->ok; } bool xen_host_get_pbds(xen_session *session, struct xen_pbd_set **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string_set; *result = NULL; XEN_CALL_("host.get_PBDs"); return session->ok; } bool xen_host_get_host_cpus(xen_session *session, struct xen_host_cpu_set **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string_set; *result = NULL; XEN_CALL_("host.get_host_CPUs"); return session->ok; } bool xen_host_get_metrics(xen_session *session, xen_host_metrics *result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string; *result = NULL; XEN_CALL_("host.get_metrics"); return session->ok; } bool xen_host_set_name_label(xen_session *session, xen_host host, char *label) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host }, { .type = &abstract_type_string, .u.string_val = label } }; xen_call_(session, "host.set_name_label", param_values, 2, NULL, NULL); return session->ok; } bool xen_host_set_name_description(xen_session *session, xen_host host, char *description) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host }, { .type = &abstract_type_string, .u.string_val = description } }; xen_call_(session, "host.set_name_description", param_values, 2, NULL, NULL); return session->ok; } bool xen_host_set_other_config(xen_session *session, xen_host host, xen_string_string_map *other_config) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host }, { .type = &abstract_type_string_string_map, .u.set_val = (arbitrary_set *)other_config } }; xen_call_(session, "host.set_other_config", param_values, 2, NULL, NULL); return session->ok; } bool xen_host_add_to_other_config(xen_session *session, xen_host host, char *key, char *value) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host }, { .type = &abstract_type_string, .u.string_val = key }, { .type = &abstract_type_string, .u.string_val = value } }; xen_call_(session, "host.add_to_other_config", param_values, 3, NULL, NULL); return session->ok; } bool xen_host_remove_from_other_config(xen_session *session, xen_host host, char *key) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host }, { .type = &abstract_type_string, .u.string_val = key } }; xen_call_(session, "host.remove_from_other_config", param_values, 2, NULL, NULL); return session->ok; } bool xen_host_set_logging(xen_session *session, xen_host host, xen_string_string_map *logging) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host }, { .type = &abstract_type_string_string_map, .u.set_val = (arbitrary_set *)logging } }; xen_call_(session, "host.set_logging", param_values, 2, NULL, NULL); return session->ok; } bool xen_host_add_to_logging(xen_session *session, xen_host host, char *key, char *value) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host }, { .type = &abstract_type_string, .u.string_val = key }, { .type = &abstract_type_string, .u.string_val = value } }; xen_call_(session, "host.add_to_logging", param_values, 3, NULL, NULL); return session->ok; } bool xen_host_remove_from_logging(xen_session *session, xen_host host, char *key) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host }, { .type = &abstract_type_string, .u.string_val = key } }; xen_call_(session, "host.remove_from_logging", param_values, 2, NULL, NULL); return session->ok; } bool xen_host_set_suspend_image_sr(xen_session *session, xen_host host, xen_sr suspend_image_sr) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host }, { .type = &abstract_type_string, .u.string_val = suspend_image_sr } }; xen_call_(session, "host.set_suspend_image_sr", param_values, 2, NULL, NULL); return session->ok; } bool xen_host_set_crash_dump_sr(xen_session *session, xen_host host, xen_sr crash_dump_sr) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host }, { .type = &abstract_type_string, .u.string_val = crash_dump_sr } }; xen_call_(session, "host.set_crash_dump_sr", param_values, 2, NULL, NULL); return session->ok; } bool xen_host_disable(xen_session *session, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; xen_call_(session, "host.disable", param_values, 1, NULL, NULL); return session->ok; } bool xen_host_enable(xen_session *session, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; xen_call_(session, "host.enable", param_values, 1, NULL, NULL); return session->ok; } bool xen_host_shutdown(xen_session *session, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; xen_call_(session, "host.shutdown", param_values, 1, NULL, NULL); return session->ok; } bool xen_host_reboot(xen_session *session, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; xen_call_(session, "host.reboot", param_values, 1, NULL, NULL); return session->ok; } bool xen_host_dmesg(xen_session *session, char **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string; *result = NULL; XEN_CALL_("host.dmesg"); return session->ok; } bool xen_host_dmesg_clear(xen_session *session, char **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string; *result = NULL; XEN_CALL_("host.dmesg_clear"); return session->ok; } bool xen_host_get_log(xen_session *session, char **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string; *result = NULL; XEN_CALL_("host.get_log"); return session->ok; } bool xen_host_send_debug_keys(xen_session *session, xen_host host, char *keys) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host }, { .type = &abstract_type_string, .u.string_val = keys } }; xen_call_(session, "host.send_debug_keys", param_values, 2, NULL, NULL); return session->ok; } bool xen_host_list_methods(xen_session *session, struct xen_string_set **result) { abstract_type result_type = abstract_type_string_set; *result = NULL; xen_call_(session, "host.list_methods", NULL, 0, &result_type, result); return session->ok; } bool xen_host_get_all(xen_session *session, struct xen_host_set **result) { abstract_type result_type = abstract_type_string_set; *result = NULL; xen_call_(session, "host.get_all", NULL, 0, &result_type, result); return session->ok; } bool xen_host_get_uuid(xen_session *session, char **result, xen_host host) { abstract_value param_values[] = { { .type = &abstract_type_string, .u.string_val = host } }; abstract_type result_type = abstract_type_string; *result = NULL; XEN_CALL_("host.get_uuid"); return session->ok; }