1 #ifndef RUNTIME_QCOR_QRT_HPP_
2 #define RUNTIME_QCOR_QRT_HPP_
4 #include "Identifiable.hpp"
7 #include <unordered_map>
13 using namespace xacc::internal_compiler;
16 class AcceleratorBuffer;
28 virtual void initialize(
const std::string kernel_name) = 0;
29 virtual void __begin_mark_segment_as_compute() = 0;
30 virtual void __end_mark_segment_as_compute() = 0;
31 virtual bool isComputeSection() = 0;
33 virtual void h(
const qubit &qidx) = 0;
34 virtual void x(
const qubit &qidx) = 0;
35 virtual void y(
const qubit &qidx) = 0;
36 virtual void z(
const qubit &qidx) = 0;
37 virtual void t(
const qubit &qidx) = 0;
38 virtual void tdg(
const qubit &qidx) = 0;
39 virtual void s(
const qubit &qidx) = 0;
40 virtual void sdg(
const qubit &qidx) = 0;
43 virtual void rx(
const qubit &qidx,
const double theta) = 0;
44 virtual void ry(
const qubit &qidx,
const double theta) = 0;
45 virtual void rz(
const qubit &qidx,
const double theta) = 0;
47 virtual void u1(
const qubit &qidx,
const double theta) = 0;
48 virtual void u3(
const qubit &qidx,
const double theta,
const double phi,
49 const double lambda) = 0;
51 virtual void reset(
const qubit &qidx) = 0;
53 virtual bool mz(
const qubit &qidx) = 0;
56 virtual void cnot(
const qubit &src_idx,
const qubit &tgt_idx) = 0;
57 virtual void cy(
const qubit &src_idx,
const qubit &tgt_idx) = 0;
58 virtual void cz(
const qubit &src_idx,
const qubit &tgt_idx) = 0;
59 virtual void ch(
const qubit &src_idx,
const qubit &tgt_idx) = 0;
60 virtual void swap(
const qubit &src_idx,
const qubit &tgt_idx) = 0;
63 virtual void cphase(
const qubit &src_idx,
const qubit &tgt_idx,
64 const double theta) = 0;
65 virtual void crz(
const qubit &src_idx,
const qubit &tgt_idx,
66 const double theta) = 0;
71 virtual void exp(
qreg q,
const double theta,
74 virtual void general_instruction(std::shared_ptr<xacc::Instruction> inst) = 0;
78 virtual void submit(xacc::AcceleratorBuffer *buffer) = 0;
79 virtual void submit(xacc::AcceleratorBuffer **buffers,
80 const int nBuffers) = 0;
84 set_current_program(std::shared_ptr<qcor::CompositeInstruction> p) = 0;
85 virtual std::shared_ptr<qcor::CompositeInstruction> get_current_program() = 0;
86 virtual void set_current_buffer(xacc::AcceleratorBuffer *buffer) = 0;
110 extern int current_shots;
111 extern std::shared_ptr<QuantumRuntime> qrt_impl;
112 extern std::vector<std::string> kernels_in_translation_unit;
113 extern std::unordered_map<
114 std::string, std::pair<std::vector<std::string>, std::vector<std::string>>>
115 kernel_signatures_in_translation_unit;
117 void initialize(
const std::string qpu_name,
const std::string kernel_name);
118 void set_shots(
int shots);
120 void set_backend(std::string accelerator_name);
121 void set_backend(std::string accelerator_name,
const int shots);
122 void set_qrt(
const std::string &qrt_name);
125 void h(
const qubit &qidx);
126 void x(
const qubit &qidx);
127 void y(
const qubit &qidx);
128 void z(
const qubit &qidx);
129 void t(
const qubit &qidx);
130 void tdg(
const qubit &qidx);
131 void s(
const qubit &qidx);
132 void sdg(
const qubit &qidx);
134 void reset(
const qubit &qidx);
145 void reset(
qreg qidx);
148 void rx(
const qubit &qidx,
const double theta);
149 void ry(
const qubit &qidx,
const double theta);
150 void rz(
const qubit &qidx,
const double theta);
152 void u1(
const qubit &qidx,
const double theta);
153 void u3(
const qubit &qidx,
const double theta,
const double phi,
154 const double lambda);
157 void rx(
qreg qidx,
const double theta);
158 void ry(
qreg qidx,
const double theta);
159 void rz(
qreg qidx,
const double theta);
161 void u1(
qreg qidx,
const double theta);
162 void u3(
qreg qidx,
const double theta,
const double phi,
163 const double lambda);
166 bool mz(
const qubit &qidx);
170 void cnot(
const qubit &src_idx,
const qubit &tgt_idx);
171 void cy(
const qubit &src_idx,
const qubit &tgt_idx);
172 void cz(
const qubit &src_idx,
const qubit &tgt_idx);
173 void ch(
const qubit &src_idx,
const qubit &tgt_idx);
174 void swap(
const qubit &src_idx,
const qubit &tgt_idx);
177 void cphase(
const qubit &src_idx,
const qubit &tgt_idx,
const double theta);
178 void crz(
const qubit &src_idx,
const qubit &tgt_idx,
const double theta);
193 void submit(xacc::AcceleratorBuffer *buffer);
194 void submit(xacc::AcceleratorBuffer **buffers,
const int nBuffers);
197 void set_current_program(std::shared_ptr<qcor::CompositeInstruction> p);
200 void set_current_buffer(xacc::AcceleratorBuffer *buffer);
208 void persistBitstring(xacc::AcceleratorBuffer *buffer);
216 namespace internal_compiler {
223 extern int __opt_level;
226 extern bool __print_opt_stats;
229 extern std::string __user_opt_passes;
232 extern std::string __placement_name;
236 extern std::vector<int> __qubit_map;
237 extern std::vector<int> parse_qubit_map(
const char *qubit_map_str);
238 extern void apply_decorators(
const std::string &decorator_cmdline_string);
239 extern std::string __qrt_env;
241 extern bool __print_final_submission;
242 extern std::string __print_final_submission_filename;
246 void execute_pass_manager(
247 std::shared_ptr<qcor::CompositeInstruction> optional_composite =
nullptr);
255 static inline const std::string ANC_BUFFER_NAME =
"aux_temp_buffer";
264 std::shared_ptr<xacc::AcceleratorBuffer> get_buffer() {
return m_buffer; }
267 std::vector<xacc::internal_compiler::qubit> m_qubitPool;
270 std::vector<xacc::internal_compiler::qubit *> m_allocatedQubits;
271 std::shared_ptr<xacc::AcceleratorBuffer> m_buffer;