XACC
ionq_program_visitor.hpp
1 /*******************************************************************************
2  * Copyright (c) 2019 UT-Battelle, LLC.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * and Eclipse Distribution License v1.0 which accompanies this
6  * distribution. The Eclipse Public License is available at
7  * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
8  *License is available at https://eclipse.org/org/documents/edl-v10.php
9  *
10  * Contributors:
11  * Alexander J. McCaskey - initial API and implementation
12  *******************************************************************************/
13 #ifndef QUANTUM_GATE_ACCELERATORS_IONQPROGRAMVISITOR_HPP_
14 #define QUANTUM_GATE_ACCELERATORS_IONQPROGRAMVISITOR_HPP_
15 
16 #include <memory>
17 #include "AllGateVisitor.hpp"
18 #include "ionq_program.hpp"
19 #include "xacc.hpp"
20 
21 using namespace xacc::ionq;
22 
23 namespace xacc {
24 namespace quantum {
26 protected:
27  constexpr static double pi = xacc::constants::pi;
28 
29  std::vector<xacc::ionq::CircuitInstruction> instructions;
30  // Experiment experiment;
31  // std::string experimentName;
32  // int nTotalQubits = 0;
33  // std::vector<int> usedMemorySlots;
34 
35 public:
36  // int maxMemorySlots = 0;
37  // std::map<int, int> qubit2MemorySlot;
38 
39  const std::string name() const override { return "ionq-visitor"; }
40 
41  const std::string description() const override {
42  return "Map XACC IR to IonQ Program.";
43  }
44 
46 
47  const std::vector<xacc::ionq::CircuitInstruction> getCircuitInstructions() {
48  return instructions;
49  }
50 
51  void visit(Hadamard &h) override {
53  inst.set_gate("h");
54  inst.set_target(h.bits()[0]);
55 
56  instructions.push_back(inst);
57  }
58 
59  void visit(Identity &i) override {
60  // std::stringstream js;
61  // native += "id q[" + std::to_string(i.bits()[0]) + "];\n";
62  // js << "{\"name\":\"id\",\"params\": [],\"qubits\":[" <<
63  // i.bits()[0]<<"]},"; operationsJsonStr += js.str();
64  }
65 
66  void visit(CRZ &crz) override {
67  auto lambda = crz.getParameter(0).as<double>();
68  U u1_1(crz.bits()[1], 0.0, 0.0, lambda / 2.0);
69  CNOT cx1(crz.bits());
70  U u1_2(crz.bits()[1], 0.0, 0.0, lambda / -2.0);
71  CNOT cx2(crz.bits());
72  visit(u1_1);
73  visit(cx1);
74  visit(u1_2);
75  visit(cx2);
76  }
77 
78  void visit(CH &ch) override {
79  Hadamard h1(ch.bits()[1]);
80  Sdg sdg(ch.bits()[1]);
81  CNOT cn1(ch.bits());
82  Hadamard h2(ch.bits()[1]);
83  T t1(ch.bits()[1]);
84  CNOT cn2(ch.bits());
85  T t2(ch.bits()[1]);
86  Hadamard h3(ch.bits()[1]);
87  S s1(ch.bits()[1]);
88  X x(ch.bits()[1]);
89  S s2(ch.bits()[0]);
90  visit(h1);
91  visit(sdg);
92  visit(cn1);
93  visit(h2);
94  visit(t1);
95  visit(cn2);
96  visit(t2);
97  visit(h3);
98  visit(s1);
99  visit(x);
100  visit(s2);
101  }
102 
103  void visit(S &s) override {
104  U u(s.bits()[0], 0.0, 0.0, 3.1415926 / 2.0);
105  visit(u);
106  }
107  void visit(Sdg &sdg) override {
108  U u(sdg.bits()[0], 0.0, 0.0, 3.1415926 / -2.0);
109  visit(u);
110  }
111  void visit(T &t) override {
112  U u(t.bits()[0], 0.0, 0.0, 3.1415926 / 4.0);
113  visit(u);
114  }
115  void visit(Tdg &tdg) override {
116  U u(tdg.bits()[0], 0.0, 0.0, 3.1415926 / -4.0);
117  visit(u);
118  }
119 
120  void visit(CNOT &cn) override {
122  inst.set_gate("cnot");
123  inst.set_target(cn.bits()[1]);
124  inst.set_control(cn.bits()[0]);
125 
126  instructions.push_back(inst);
127  }
128 
129  void visit(X &x) override {
131  inst.set_gate("x");
132  inst.set_target(x.bits()[0]);
133 
134  instructions.push_back(inst);
135  }
136 
137  void visit(Y &y) override {
139  inst.set_gate("y");
140  inst.set_target(y.bits()[0]);
141 
142  instructions.push_back(inst);
143  }
144 
145  void visit(Z &z) override {
147  inst.set_gate("z");
148  inst.set_target(z.bits()[0]);
149 
150  instructions.push_back(inst);
151  }
152 
153  void visit(U &u) override {
154  auto t = u.getParameter(0).toString();
155  auto p = u.getParameter(1).toString();
156  auto l = u.getParameter(2).toString();
157 
158  Rz rz(u.bits()[0], t);
159  Ry ry(u.bits()[0], p);
160  Rz rz2(u.bits()[0], l);
161  visit(rz);
162  visit(ry);
163  visit(rz2);
164  }
165 
166  void visit(Rx &rx) override {
168  inst.set_gate("rx");
169  inst.set_target(rx.bits()[0]);
170  inst.set_rotation(rx.getParameter(0).as<double>());
171  instructions.push_back(inst);
172  }
173 
174  void visit(Ry &ry) override {
176  inst.set_gate("ry");
177  inst.set_target(ry.bits()[0]);
178  inst.set_rotation(ry.getParameter(0).as<double>());
179  instructions.push_back(inst);
180  }
181 
182  void visit(Rz &rz) override {
184  inst.set_gate("rz");
185  inst.set_target(rz.bits()[0]);
186  inst.set_rotation(rz.getParameter(0).as<double>());
187  instructions.push_back(inst);
188  }
189 
190  void visit(CPhase &cp) override {
191  auto lambda = cp.getParameter(0).as<double>();
192  U u1_1(cp.bits()[0], 0.0, 0.0, lambda / 2.0);
193  CNOT cx1(cp.bits());
194  U u1_2(cp.bits()[1], 0.0, 0.0, -1.0 * lambda / 2.0);
195  CNOT cx2(cp.bits());
196  U u1_3(cp.bits()[1], 0.0, 0.0, lambda / 2.0);
197 
198  visit(u1_1);
199  visit(cx1);
200  visit(u1_2);
201  visit(cx2);
202  visit(u1_3);
203  }
204 
205  void visit(Measure &m) override {}
209  virtual ~IonQProgramVisitor() {}
210 };
211 
212 } // namespace quantum
213 } // namespace xacc
214 
215 #endif
Definition: CommonGates.hpp:306
Definition: CommonGates.hpp:199
Definition: CommonGates.hpp:328
Definition: Accelerator.hpp:25
Definition: CommonGates.hpp:425
virtual ~IonQProgramVisitor()
Definition: ionq_program_visitor.hpp:209
Definition: CommonGates.hpp:412
Definition: CommonGates.hpp:438
Definition: CommonGates.hpp:124
Definition: CommonGates.hpp:112
Definition: CommonGates.hpp:465
Definition: ionq_program.hpp:10
const std::string description() const override
Definition: ionq_program_visitor.hpp:41
Definition: CommonGates.hpp:295
Definition: AllGateVisitor.hpp:24
Definition: CommonGates.hpp:399
Definition: CommonGates.hpp:216
Definition: ionq_program.hpp:26
Definition: CommonGates.hpp:235
Definition: CommonGates.hpp:317
Definition: CommonGates.hpp:381
const std::string name() const override
Definition: ionq_program_visitor.hpp:39
Definition: CommonGates.hpp:479
Definition: CommonGates.hpp:270
Definition: CommonGates.hpp:100
Definition: ionq_program_visitor.hpp:25