def wait(self, t, q): """Apply wait for time t to q.""" if isinstance(q, QuantumRegister): gs = InstructionSet() for j in range(q.size): gs.add(self.wait(t, (q, j))) return gs self._check_qubit(q) return self._attach(WaitGate(t, q, self))
def u0(self, m, q): """Apply u0 with length m to q.""" if isinstance(q, QuantumRegister): instructions = InstructionSet() for j in range(q.size): instructions.add(self.u0(m, (q, j))) return instructions self._check_qubit(q) return self._attach(U0Gate(m, q, self))
def cx_base(self, ctl, tgt): """Apply CX ctl, tgt.""" if isinstance(ctl, QuantumRegister) and \ isinstance(tgt, QuantumRegister) and len(ctl) == len(tgt): # apply CX to qubits between two registers instructions = InstructionSet() for i in range(ctl.size): instructions.add(self.cx_base((ctl, i), (tgt, i))) return instructions if isinstance(ctl, QuantumRegister): instructions = InstructionSet() for j in range(ctl.size): instructions.add(self.cx_base((ctl, j), tgt)) return instructions if isinstance(tgt, QuantumRegister): instructions = InstructionSet() for j in range(tgt.size): instructions.add(self.cx_base(ctl, (tgt, j))) return instructions self._check_qubit(ctl) self._check_qubit(tgt) self._check_dups([ctl, tgt]) return self._attach(CXBase(ctl, tgt, self))
def cu3(self, theta, phi, lam, ctl, tgt): """Apply cu3 from ctl to tgt with angle theta, phi, lam.""" if isinstance(ctl, QuantumRegister) and \ isinstance(tgt, QuantumRegister) and len(ctl) == len(tgt): instructions = InstructionSet() for i in range(ctl.size): instructions.add(self.cu3(theta, phi, lam, (ctl, i), (tgt, i))) return instructions if isinstance(ctl, QuantumRegister): instructions = InstructionSet() for j in range(ctl.size): instructions.add(self.cu3(theta, phi, lam, (ctl, j), tgt)) return instructions if isinstance(tgt, QuantumRegister): instructions = InstructionSet() for j in range(tgt.size): instructions.add(self.cu3(theta, phi, lam, ctl, (tgt, j))) return instructions self._check_qubit(ctl) self._check_qubit(tgt) self._check_dups([ctl, tgt]) return self._attach(Cu3Gate(theta, phi, lam, ctl, tgt, self))
def cx(self, ctl, tgt): """Apply CX from ctl to tgt.""" if isinstance(ctl, QuantumRegister) and \ isinstance(tgt, QuantumRegister) and len(ctl) == len(tgt): instructions = InstructionSet() for i in range(ctl.size): instructions.add(self.cx((ctl, i), (tgt, i))) return instructions if isinstance(ctl, QuantumRegister): gs = InstructionSet() for j in range(ctl.size): gs.add(self.cx((ctl, j), tgt)) return gs if isinstance(tgt, QuantumRegister): gs = InstructionSet() for j in range(tgt.size): gs.add(self.cx(ctl, (tgt, j))) return gs self._check_qubit(ctl) self._check_qubit(tgt) self._check_dups([ctl, tgt]) return self._attach(CnotGate(ctl, tgt, self))
def swap(self, ctl, tgt): """Apply SWAP from ctl to tgt.""" if isinstance(ctl, QuantumRegister) and \ isinstance(tgt, QuantumRegister) and len(ctl) == len(tgt): instructions = InstructionSet() for j in range(ctl.size): instructions.add(self.swap((ctl, j), (tgt, j))) return instructions self._check_qubit(ctl) self._check_qubit(tgt) self._check_dups([ctl, tgt]) return self._attach(SwapGate(ctl, tgt, self))
def cu3(self, theta, phi, lam, ctl, tgt): """Apply cu3 from ctl to tgt with angle theta, phi, lam.""" if isinstance(ctl, QuantumRegister) and \ isinstance(tgt, QuantumRegister) and len(ctl) == len(tgt): instructions = InstructionSet() for i in range(ctl.size): instructions.add(self.cu3(theta, phi, lam, (ctl, i), (tgt, i))) return instructions self._check_qubit(ctl) self._check_qubit(tgt) self._check_dups([ctl, tgt]) return self._attach(Cu3Gate(theta, phi, lam, ctl, tgt, self))
def rzz(self, theta, ctl, tgt): """Apply RZZ to circuit.""" if isinstance(ctl, QuantumRegister) and \ isinstance(tgt, QuantumRegister) and len(ctl) == len(tgt): instructions = InstructionSet() for i in range(ctl.size): instructions.add(self.rzz(theta, (ctl, i), (tgt, i))) return instructions self._check_qubit(ctl) self._check_qubit(tgt) self._check_dups([ctl, tgt]) return self._attach(RZZGate(theta, ctl, tgt, self))
def cz(self, ctl, tgt): """Apply CZ to circuit.""" if isinstance(ctl, QuantumRegister) and \ isinstance(tgt, QuantumRegister) and len(ctl) == len(tgt): instructions = InstructionSet() for i in range(ctl.size): instructions.add(self.cz((ctl, i), (tgt, i))) return instructions self._check_qubit(ctl) self._check_qubit(tgt) self._check_dups([ctl, tgt]) return self._attach(CzGate(ctl, tgt, self))
def uzz(self, theta, ctl, tgt): """Apply CZ to circuit.""" if isinstance(ctl, QuantumRegister) and \ isinstance(tgt, QuantumRegister) and len(ctl) == len(tgt): # apply cx to qubits between two registers instructions = InstructionSet() for i in range(ctl.size): instructions.add(self.uzz(theta, (ctl, i), (tgt, i))) return instructions self._check_qubit(ctl) self._check_qubit(tgt) self._check_dups([ctl, tgt]) return self._attach(UZZGate(theta, ctl, tgt, self))
def ch(self, ctl, tgt): """Apply CH from ctl to tgt.""" if isinstance(ctl, QuantumRegister) and \ isinstance(tgt, QuantumRegister) and len(ctl) == len(tgt): # apply cx to qubits between two registers instructions = InstructionSet() for i in range(ctl.size): instructions.add(self.ch((ctl, i), (tgt, i))) return instructions self._check_qubit(ctl) self._check_qubit(tgt) self._check_dups([ctl, tgt]) return self._attach(CHGate(ctl, tgt, self))
def cz(self, ctl, tgt): """Apply CZ to circuit.""" if isinstance(ctl, QuantumRegister) and \ isinstance(tgt, QuantumRegister) and len(ctl) == len(tgt): # apply cx to qubits between two registers instructions = InstructionSet() for i in range(ctl.size): instructions.add(self.cz((ctl, i), (tgt, i))) return instructions else: self._check_qubit(ctl) self._check_qubit(tgt) self._check_dups([ctl, tgt]) return self._attach(CzGate(ctl, tgt, self))
def crz(self, theta, ctl, tgt): """Apply crz from ctl to tgt with angle theta.""" if isinstance(ctl, QuantumRegister) and \ isinstance(tgt, QuantumRegister) and len(ctl) == len(tgt): # apply cx to qubits between two registers instructions = InstructionSet() for i in range(ctl.size): instructions.add(self.crz(theta, (ctl, i), (tgt, i))) return instructions else: self._check_qubit(ctl) self._check_qubit(tgt) self._check_dups([ctl, tgt]) return self._attach(CrzGate(theta, ctl, tgt, self))
def ccx(self, ctl1, ctl2, tgt): """Apply Toffoli to from ctl1 and ctl2 to tgt.""" if isinstance(ctl1, QuantumRegister) and \ isinstance(ctl2, QuantumRegister) and \ isinstance(tgt, QuantumRegister) and \ len(ctl1) == len(tgt) and len(ctl2) == len(tgt): instructions = InstructionSet() for i in range(ctl1.size): instructions.add(self.ccx((ctl1, i), (ctl2, i), (tgt, i))) return instructions self._check_qubit(ctl1) self._check_qubit(ctl2) self._check_qubit(tgt) self._check_dups([ctl1, ctl2, tgt]) return self._attach(ToffoliGate(ctl1, ctl2, tgt, self))
def cswap(self, ctl, tgt1, tgt2): """Apply Fredkin to circuit.""" if isinstance(ctl, QuantumRegister) and \ isinstance(tgt1, QuantumRegister) and \ isinstance(tgt2, QuantumRegister) and \ len(ctl) == len(tgt1) and len(ctl) == len(tgt2): instructions = InstructionSet() for i in range(ctl.size): instructions.add(self.cswap((ctl, i), (tgt1, i), (tgt2, i))) return instructions self._check_qubit(ctl) self._check_qubit(tgt1) self._check_qubit(tgt2) self._check_dups([ctl, tgt1, tgt2]) return self._attach(FredkinGate(ctl, tgt1, tgt2, self))
def cccry(self, theta, ctl1, ctl2, ctl3, tgt): """Apply Controlled^3 R_y from ctl1, ctl2, ctl3 to tgt with angle theta.""" if isinstance(ctl1, QuantumRegister) and \ isinstance(ctl2, QuantumRegister) and \ isinstance(ctl3, QuantumRegister) and \ len(ctl1) == len(tgt) and len(ctl2) == len(tgt) and len(ctl3) == len(tgt): instructions = InstructionSet() for i in range(ctl.size): instructions.add( self.cry(theta, (ctl1, i), (ctl2, i), (ctl3, i), (tgt, i))) return instructions self._check_qubit(ctl1) self._check_qubit(ctl2) self._check_qubit(ctl3) self._check_qubit(tgt) self._check_dups([ctl1, ctl2, ctl3, tgt]) return self._attach(CccryGate(theta, ctl1, ctl2, ctl3, tgt, self))