Commit ebe9366b authored by Nguyen, Thien Minh's avatar Nguyen, Thien Minh
Browse files

Work on adding printing native code for qcor csp kernels



Signed-off-by: default avatarThien Nguyen <nguyentm@ornl.gov>
parent e92692b2
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -45,6 +45,10 @@ void print_kernel(KernelSignature<Args...> &kernelCallable, std::ostream &os,
template <typename... Args>
std::size_t n_instructions(KernelSignature<Args...> &kernelCallable,
                           Args... args);
template <typename... Args>
void print_native_code(KernelSignature<Args...> &kernelCallable,
                       std::ostream &os, HeterogeneousMap options,
                       Args... args);
}  // namespace internal

// The QuantumKernel represents the super-class of all qcor
@@ -111,6 +115,7 @@ class QuantumKernel {
  }

  // Static method for printing this kernel as a flat qasm string
  // (logical gate-level XACC IR)
  static void print_kernel(std::ostream &os, Args... args) {
    Derived derived(args...);
    KernelSignature<Args...> callable(derived);
@@ -119,6 +124,27 @@ class QuantumKernel {

  static void print_kernel(Args... args) { print_kernel(std::cout, args...); }

  // Print the native code (backend qpu execution code)
  // i.e., in the native gateset of the Accelerator
  static void print_native_code(std::ostream &os, Args... args) {
    Derived derived(args...);
    KernelSignature<Args...> callable(derived);
    return internal::print_kernel<Args...>(callable, os, {}, args...);
  }
  static void print_native_code(Args... args) {
    return print_native_code(std::cout, args...);
  }
  // Provide extra options as a HetMap
  static void print_native_code(std::ostream &os, HeterogeneousMap options,
                                Args... args) {
    Derived derived(args...);
    KernelSignature<Args...> callable(derived);
    return internal::print_kernel<Args...>(callable, os, options, args...);
  }
  static void print_native_code(HeterogeneousMap options, Args... args) {
    return print_native_code(std::cout, options, args...);
  }

  // Static method to query how many instructions are in this kernel
  static std::size_t n_instructions(Args... args) {
    Derived derived(args...);
@@ -1094,5 +1120,16 @@ std::size_t n_instructions(KernelSignature<Args...> &kernelCallable,
  kernelCallable(tempKernel, args...);
  return tempKernel->nInstructions();
}

template <typename... Args>
void print_native_code(KernelSignature<Args...> &kernelCallable,
                       std::ostream &os, HeterogeneousMap options,
                       Args... args) {
  auto tempKernel = qcor::__internal__::create_composite("temp_print");
  kernelCallable(tempKernel, args...);
  // Apply optimization + QPU placement
  xacc::internal_compiler::execute_pass_manager(tempKernel);
  os << xacc::internal_compiler::get_native_code(tempKernel, options) << "\n";
}
}  // namespace internal
}  // namespace qcor
+5 −0
Original line number Diff line number Diff line
@@ -84,6 +84,11 @@ void apply_decorators(const std::string &decorator_cmdline_string) {
      xacc::getAcceleratorDecorator(decorator_cmdline_string, get_qpu());
  xacc::internal_compiler::qpu = decorator;
}

std::string get_native_code(std::shared_ptr<qcor::CompositeInstruction> program,
                            xacc::HeterogeneousMap options) {
  return get_qpu()->getNativeCode(program->as_xacc(), options);
}
}  // namespace internal_compiler
}  // namespace xacc
namespace quantum {
+2 −1
Original line number Diff line number Diff line
@@ -245,7 +245,8 @@ extern std::string __print_final_submission_filename;
// If none provided, execute the pass manager on the current QRT kernel.
void execute_pass_manager(
    std::shared_ptr<qcor::CompositeInstruction> optional_composite = nullptr);

std::string get_native_code(std::shared_ptr<qcor::CompositeInstruction> program,
                            xacc::HeterogeneousMap options);
} // namespace internal_compiler
} // namespace xacc
namespace qcor {