2 #ifndef QCOR_QRT_MAPPER_HPP_
3 #define QCOR_QRT_MAPPER_HPP_
5 #include <Instruction.hpp>
7 #include "AllGateVisitor.hpp"
12 using namespace xacc::quantum;
15 public xacc::InstructionVisitor<Circuit> {
20 std::string kernelName;
21 void addOneQubitGate(
const std::string name, xacc::Instruction &inst) {
22 if (!inst.getBitExpression(-1).empty()) {
24 auto expr = inst.getBitExpression(-1);
25 ss <<
"quantum::" + name +
"(" << expr;
27 if (inst.isParameterized() && inst.name() !=
"Measure") {
28 ss <<
", " << inst.getParameter(0).toString();
29 for (
int i = 1; i < inst.nParameters(); i++) {
30 ss <<
", " << inst.getParameter(i).toString() <<
"\n";
39 auto expr = inst.getBitExpression(0);
40 ss <<
"quantum::" + name +
"(" << inst.getBufferNames()[0] <<
"["
41 << (expr.empty() ? std::to_string(inst.bits()[0]) : expr) <<
"]";
42 if (inst.isParameterized() && inst.name() !=
"Measure") {
43 ss <<
", " << inst.getParameter(0).toString();
44 for (
int i = 1; i < inst.nParameters(); i++) {
45 ss <<
", " << inst.getParameter(i).toString() <<
"\n";
51 void addTwoQubitGate(
const std::string name, xacc::Instruction &inst) {
52 std::string expr_src, expr_tgt;
53 if (!inst.getBitExpression(-1).empty()) {
54 expr_src = inst.getBitExpression(-1) +
", ";
56 expr_src = inst.getBitExpression(0);
57 expr_src = inst.getBufferNames()[0] +
"["
58 + (expr_src.empty() ? std::to_string(inst.bits()[0]) : expr_src)
61 if (!inst.getBitExpression(-2).empty()) {
62 expr_tgt = inst.getBitExpression(-2);
64 expr_tgt = inst.getBitExpression(1);
65 expr_tgt = inst.getBufferNames()[1] +
"["
66 + (expr_tgt.empty() ? std::to_string(inst.bits()[1]) : expr_tgt)
70 ss <<
"quantum::" + name +
"(" << expr_src << expr_tgt;
72 if (inst.isParameterized()) {
73 ss <<
", " << inst.getParameter(0).toString();
74 for (
int i = 1; i < inst.nParameters(); i++) {
75 ss <<
", " << inst.getParameter(i).toString();
83 qrt_mapper(
const std::string &top_level_kernel_name)
84 : kernelName(top_level_kernel_name) {}
89 virtual std::unordered_map<std::string, ptrdiff_t> getVisitorRttiMap()
93 static const std::unordered_map<std::string, ptrdiff_t> result{
94 {
typeid(Circuit).name(),
96 xacc::InstructionVisitor<Circuit>>()}};
100 auto get_new_src() {
return ss.str(); }
102 void visit(Hadamard &h)
override { addOneQubitGate(
"h", h); }
103 void visit(Rz &rz)
override { addOneQubitGate(
"rz", rz); }
104 void visit(Ry &ry)
override { addOneQubitGate(
"ry", ry); }
105 void visit(Rx &rx)
override { addOneQubitGate(
"rx", rx); }
106 void visit(X &x)
override { addOneQubitGate(
"x", x); }
107 void visit(Y &y)
override { addOneQubitGate(
"y", y); }
108 void visit(Z &z)
override { addOneQubitGate(
"z", z); }
109 void visit(S &s)
override { addOneQubitGate(
"s", s); }
110 void visit(Sdg &sdg)
override { addOneQubitGate(
"sdg", sdg); }
111 void visit(T &t)
override { addOneQubitGate(
"t", t); }
112 void visit(Tdg &tdg)
override { addOneQubitGate(
"tdg", tdg); }
115 void visit(CNOT &cnot)
override { addTwoQubitGate(
"cnot", cnot); }
116 void visit(CY &cy)
override { addTwoQubitGate(
"cy", cy); }
117 void visit(CZ &cz)
override { addTwoQubitGate(
"cz", cz); }
118 void visit(Swap &s)
override { addTwoQubitGate(
"swap", s); }
119 void visit(CRZ &crz)
override { addTwoQubitGate(
"crz", crz); }
120 void visit(CH &ch)
override { addTwoQubitGate(
"ch", ch); }
121 void visit(CPhase &cphase)
override { addTwoQubitGate(
"cphase", cphase); }
123 void visit(Measure &measure)
override { addOneQubitGate(
"mz", measure); }
124 void visit(Identity &i)
override { addOneQubitGate(
"i", i); }
125 void visit(U &u)
override { addOneQubitGate(
"u3", u); }
126 void visit(U1 &u1)
override { addOneQubitGate(
"u1", u1); }
127 void visit(Reset &r)
override { addOneQubitGate(
"reset", r); }
128 void visit(Circuit &circ)
override {
129 if (circ.name() == kernelName) {
132 if (circ.name() ==
"exp_i_theta") {
133 ss <<
"quantum::exp(" << circ.getBufferNames()[0] <<
", "
134 << circ.getArguments()[0]->name <<
", " << circ.getArguments()[1]->name
144 ss <<
"const auto __cached_execute_flag = __execute;\n";
146 ss <<
"__execute = false;\n";
147 for (
const auto &arg : circ.getArguments()) {
148 if (arg->name ==
"__xacc__literal_") {
150 ss << arg->type <<
" " << arg->name << arg <<
" = ";
152 if (arg->runtimeValue.keyExists<
int>(
153 xacc::INTERNAL_ARGUMENT_VALUE_KEY)) {
154 ss << arg->runtimeValue.get<
int>(xacc::INTERNAL_ARGUMENT_VALUE_KEY)
157 ss << arg->runtimeValue.get<
double>(
158 xacc::INTERNAL_ARGUMENT_VALUE_KEY)
164 ss << circ.name() <<
"(" << circ.getBufferNames()[0];
165 for (
const auto &arg : circ.getArguments()) {
166 if (arg->name.find(
"__xacc__literal_") != std::string::npos) {
167 ss <<
", " << arg->name << arg;
169 ss <<
", " << arg->name;
175 ss <<
"__execute = __cached_execute_flag;\n";
179 void visit(IfStmt &ifStmt)
override {}