13 class CompositeInstruction;
16 class HeterogeneousMap;
23 template <
typename... Args>
24 using kernel_functor_t = void (*)(Args...);
27 std::map<std::size_t, std::string> cached_kernel_codes;
28 std::string demangle(
const char *name) {
30 std::unique_ptr<char, void (*)(
void *)> res{
31 abi::__cxa_demangle(name, NULL, NULL, &status), std::free};
32 return (status == 0) ? res.get() : std::string(name);
35 std::string qjit_cache_path =
"";
38 std::map<std::string, std::uint64_t> kernel_name_to_f_ptr;
39 std::map<std::string, std::uint64_t> kernel_name_to_f_ptr_with_parent;
40 std::map<std::string, std::uint64_t> kernel_name_to_f_ptr_hetmap;
41 std::map<std::string, std::uint64_t> kernel_name_to_f_ptr_parent_hetmap;
43 std::unique_ptr<LLVMJIT> jit;
44 std::unique_ptr<llvm::Module> module;
49 const std::pair<std::string, std::string> run_syntax_handler(
50 const std::string &quantum_kernel_src,
51 const bool add_het_map_kernel_ctor =
false);
52 void jit_compile(
const std::string &quantum_kernel_src,
53 const bool add_het_map_kernel_ctor =
false,
54 const std::vector<std::string> &kernel_dependency = {},
55 const std::string &extra_functions_src =
"",
56 std::vector<std::string> extra_headers = {});
58 void jit_compile(std::unique_ptr<llvm::Module> m,
59 std::vector<std::string> extra_shared_lib_paths = {});
63 template <
typename... Args>
64 void invoke(
const std::string &kernel_name, Args... args) {
67 auto f_ptr = kernel_name_to_f_ptr[kernel_name];
68 void (*kernel_functor)(Args...) = (void (*)(Args...))f_ptr;
69 kernel_functor(std::forward<Args>(args)...);
72 template <
typename... Args>
73 void invoke_with_parent(
const std::string &kernel_name,
74 std::shared_ptr<qcor::CompositeInstruction> parent,
78 auto f_ptr = kernel_name_to_f_ptr_with_parent[kernel_name];
79 void (*kernel_functor)(std::shared_ptr<qcor::CompositeInstruction>,
81 (void (*)(std::shared_ptr<qcor::CompositeInstruction>, Args...))f_ptr;
82 kernel_functor(parent, std::forward<Args>(args)...);
86 template <
typename... Args>
87 void invoke_forwarding(
const std::string &kernel_name, Args &&... args) {
89 auto f_ptr = kernel_name_to_f_ptr[kernel_name];
90 void (*kernel_functor)(Args...) = (void (*)(Args...))f_ptr;
91 kernel_functor(std::forward<Args>(args)...);
95 template <
typename... Args>
96 void invoke_with_parent_forwarding(
97 const std::string &kernel_name,
98 std::shared_ptr<qcor::CompositeInstruction> parent, Args &&... args) {
100 auto f_ptr = kernel_name_to_f_ptr_with_parent[kernel_name];
101 void (*kernel_functor)(std::shared_ptr<qcor::CompositeInstruction>,
103 (void (*)(std::shared_ptr<qcor::CompositeInstruction>, Args...))f_ptr;
104 kernel_functor(parent, std::forward<Args>(args)...);
107 int invoke_main(
int argc,
char **argv) {
108 auto f_ptr = kernel_name_to_f_ptr[
"main"];
109 int (*kernel_functor)(int,
char **) = (
int (*)(int,
char **))f_ptr;
110 return kernel_functor(argc, argv);
113 void invoke_with_hetmap(
const std::string &kernel_name,
114 xacc::HeterogeneousMap &args);
115 std::shared_ptr<qcor::CompositeInstruction> extract_composite_with_hetmap(
116 const std::string name, xacc::HeterogeneousMap &m);
118 template <
typename... Args>
119 kernel_functor_t<Args...> get_kernel(
const std::string &kernel_name) {
120 auto f_ptr = kernel_name_to_f_ptr[kernel_name];
121 void (*kernel_functor)(Args...) = (void (*)(Args...))f_ptr;
122 return kernel_functor;
126 enum class KernelType { Regular, HetMapArg, HetMapArgWithParent };
129 std::uint64_t get_kernel_function_ptr(
130 const std::string &kernelName,
131 KernelType subType = KernelType::Regular)
const;