qiboteam / qibo

A framework for quantum computing
https://qibo.science
Apache License 2.0
287 stars 58 forks source link

QASM command not recognized #524

Closed AdrianPerezSalinas closed 2 years ago

AdrianPerezSalinas commented 2 years ago

When translating a circuit from the cirq library to Qibo via a QASM module, I find this error

[Qibo 0.1.7rc2.dev0|ERROR|2021-12-09 10:46:28]: QASM command sdg is not recognized.

and the full message is

Traceback (most recent call last):
  File "examples/qibo_evolution.py", line 50, in <module>
    main(**args)
  File "examples/qibo_evolution.py", line 37, in main
    energies, fidelities, adiabatic_circuit, psi = S.adiabatic_evolution_qibo('Cade', period, steps)
  File "/home/adrianps/fieldtheory/modules/fh_hexagonal_mod.py", line 661, in adiabatic_evolution_qibo
    adiabatic_circuit = qibo_Circuit.from_qasm(qasm_circuit)
  File "/home/adrianps/venvs/field_theory/lib/python3.8/site-packages/qibo/models/circuit.py", line 22, in from_qasm
    return circuit_cls.from_qasm(qasm_code)
  File "/home/adrianps/venvs/field_theory/lib/python3.8/site-packages/qibo/abstractions/circuit.py", line 787, in from_qasm
    kwargs["nqubits"], gate_list = cls._parse_qasm(qasm_code)
  File "/home/adrianps/venvs/field_theory/lib/python3.8/site-packages/qibo/abstractions/circuit.py", line 891, in _parse_qasm
    raise_error(ValueError, "QASM command {} is not recognized."
  File "/home/adrianps/venvs/field_theory/lib/python3.8/site-packages/qibo/config.py", line 45, in raise_error
    raise exception(message)
ValueError: QASM command sdg is not recognized.

The error appears when the code is run on python3.8, but not on python3.6, which surprises me since 3.6 was already deprecated from qibo

Is this a big problem?

mlazzarin commented 2 years ago

Could you provide the cirq circuit? I want to reproduce the error.

AdrianPerezSalinas commented 2 years ago

HI, please find the code below. It is self contained, only the openfermion and cirq libraries are needed

import cirq
import openfermion
from openfermion import FermionOperator
import numpy as np
from qibo.models import Circuit as qibo_Circuit

def hopping_hor_hex(n_hex_x, n_hex_y):

  hopping_h = FermionOperator()
  num_sites = (n_hex_y+1)*(4*n_hex_x+4)-4
  jmax = (n_hex_y+1)*(2*n_hex_x+2)-2-1
  for j in range(jmax):
    # skips vertical links
    if np.mod(j+2, 2*n_hex_x+2) != 0:
        i_up = 2*j
        i_down = 2*j+1
        hopping_h += (
                FermionOperator( ((i_up, 1), (i_up+2, 0)) )
              + FermionOperator( ((i_up+2, 1), (i_up, 0)) )
              + FermionOperator( ((i_down, 1), (i_down+2, 0)) )
              + FermionOperator( ((i_down+2, 1), (i_down, 0)) ) )
  return hopping_h

def hopping_ver_hex(n_hex_x, n_hex_y):

  hopping_v = FermionOperator()
  i_up_1 = 0
  i_up_2 = 2*(4*n_hex_x+2)-1
  i_down_1 = i_up_1 + 1
  i_down_2 = i_up_2 - 1
  for j in range(n_hex_y*(n_hex_x+1)):
    hopping_v += (
          FermionOperator( ((i_up_1, 1), (i_up_2, 0)) )
        + FermionOperator( ((i_up_2, 1), (i_up_1, 0)) )
        + FermionOperator( ((i_down_1, 1), (i_down_2, 0)) )
        + FermionOperator( ((i_down_2, 1), (i_down_1, 0)) ) )
    if i_up_2-i_up_1 == 3:
      i_up_1 += 4
      i_up_2 += 2*(4*n_hex_x+2)
    else:
      i_up_1 += 4
      i_up_2 -= 4
    i_down_1 = i_up_1 + 1
    i_down_2 = i_up_2 - 1

  return hopping_v

def hopping_hex(n_hex_x, n_hex_y, t):
    H_tb = t * (hopping_hor_hex(n_hex_x, n_hex_y) + hopping_ver_hex(n_hex_x, n_hex_y))
    return H_tb

H_tb = hopping_hex(1, 1, 1)
ham = openfermion.get_quadratic_hamiltonian(H_tb)
circuit_ground = cirq.Circuit(
            openfermion.prepare_gaussian_state(cirq.LineQubit.range(openfermion.count_qubits(ham)), ham))

qasm_circuit = circuit_ground.to_qasm()
adiabatic_circuit = qibo_Circuit.from_qasm(qasm_circuit)
mlazzarin commented 2 years ago

I can reproduce the error with Cirq v0.13.1 and OpenFermion v1.3.0. The problem disappears with Cirq v0.11.1 and OpeFermion v1.1.0. Let's inspect the openQASM circuits generated by your code snippet:

Cirq v0.13.1, OpenFermion v1.3.0 // Generated from Cirq v0.13.1 OPENQASM 2.0; include "qelib1.inc"; // Qubits: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] qreg q[12]; x q[0]; x q[1]; x q[2]; x q[3]; x q[4]; x q[5]; // Gate: PhasedISWAP**-0.6256659163780022 rz(pi*0.25) q[5]; rz(pi*-0.25) q[6]; cx q[5],q[6]; h q[5]; cx q[6],q[5]; rz(pi*-0.3128329582) q[5]; cx q[6],q[5]; rz(pi*0.3128329582) q[5]; h q[5]; cx q[5],q[6]; rz(pi*-0.25) q[5]; rz(pi*0.25) q[6]; rz(0) q[6]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[4]; rz(pi*-0.25) q[5]; cx q[4],q[5]; h q[4]; cx q[5],q[4]; sdg q[4]; cx q[5],q[4]; s q[4]; h q[4]; cx q[4],q[5]; rz(pi*-0.25) q[4]; rz(pi*0.25) q[5]; rz(0) q[5]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[6]; rz(pi*-0.25) q[7]; cx q[6],q[7]; h q[6]; cx q[7],q[6]; sdg q[6]; cx q[7],q[6]; s q[6]; h q[6]; cx q[6],q[7]; rz(pi*-0.25) q[6]; rz(pi*0.25) q[7]; // Gate: PhasedISWAP**0.7068022226528557 rz(pi*0.25) q[3]; rz(pi*-0.25) q[4]; cx q[3],q[4]; h q[3]; cx q[4],q[3]; rz(pi*0.3534011113) q[3]; cx q[4],q[3]; rz(pi*-0.3534011113) q[3]; h q[3]; cx q[3],q[4]; rz(pi*-0.25) q[3]; rz(pi*0.25) q[4]; rz(0) q[7]; rz(0) q[4]; // Gate: PhasedISWAP**0.6256659163780026 rz(pi*0.25) q[5]; rz(pi*-0.25) q[6]; cx q[5],q[6]; h q[5]; cx q[6],q[5]; rz(pi*0.3128329582) q[5]; cx q[6],q[5]; rz(pi*-0.3128329582) q[5]; h q[5]; cx q[5],q[6]; rz(pi*-0.25) q[5]; rz(pi*0.25) q[6]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[2]; rz(pi*-0.25) q[3]; cx q[2],q[3]; h q[2]; cx q[3],q[2]; sdg q[2]; cx q[3],q[2]; s q[2]; h q[2]; cx q[2],q[3]; rz(pi*-0.25) q[2]; rz(pi*0.25) q[3]; rz(0) q[6]; // Gate: PhasedISWAP**-0.7068022226528554 rz(pi*0.25) q[7]; rz(pi*-0.25) q[8]; cx q[7],q[8]; h q[7]; cx q[8],q[7]; rz(pi*-0.3534011113) q[7]; cx q[8],q[7]; rz(pi*0.3534011113) q[7]; h q[7]; cx q[7],q[8]; rz(pi*-0.25) q[7]; rz(pi*0.25) q[8]; rz(0) q[3]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[4]; rz(pi*-0.25) q[5]; cx q[4],q[5]; h q[4]; cx q[5],q[4]; sdg q[4]; cx q[5],q[4]; s q[4]; h q[4]; cx q[4],q[5]; rz(pi*-0.25) q[4]; rz(pi*0.25) q[5]; // Gate: PhasedISWAP**0.7951672353008667 rz(pi*0.25) q[1]; rz(pi*-0.25) q[2]; cx q[1],q[2]; h q[1]; cx q[2],q[1]; rz(pi*0.3975836177) q[1]; cx q[2],q[1]; rz(pi*-0.3975836177) q[1]; h q[1]; cx q[1],q[2]; rz(pi*-0.25) q[1]; rz(pi*0.25) q[2]; rz(0) q[8]; rz(0) q[5]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[6]; rz(pi*-0.25) q[7]; cx q[6],q[7]; h q[6]; cx q[7],q[6]; sdg q[6]; cx q[7],q[6]; s q[6]; h q[6]; cx q[6],q[7]; rz(pi*-0.25) q[6]; rz(pi*0.25) q[7]; rz(0) q[2]; // Gate: PhasedISWAP**0.7068022226528555 rz(pi*0.25) q[3]; rz(pi*-0.25) q[4]; cx q[3],q[4]; h q[3]; cx q[4],q[3]; rz(pi*0.3534011113) q[3]; cx q[4],q[3]; rz(pi*-0.3534011113) q[3]; h q[3]; cx q[3],q[4]; rz(pi*-0.25) q[3]; rz(pi*0.25) q[4]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[0]; rz(pi*-0.25) q[1]; cx q[0],q[1]; h q[0]; cx q[1],q[0]; sdg q[0]; cx q[1],q[0]; s q[0]; h q[0]; cx q[0],q[1]; rz(pi*-0.25) q[0]; rz(pi*0.25) q[1]; rz(0) q[7]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[8]; rz(pi*-0.25) q[9]; cx q[8],q[9]; h q[8]; cx q[9],q[8]; sdg q[8]; cx q[9],q[8]; s q[8]; h q[8]; cx q[8],q[9]; rz(pi*-0.25) q[8]; rz(pi*0.25) q[9]; rz(0) q[4]; // Gate: PhasedISWAP**-0.5791668483211313 rz(pi*0.25) q[5]; rz(pi*-0.25) q[6]; cx q[5],q[6]; h q[5]; cx q[6],q[5]; rz(pi*-0.2895834242) q[5]; cx q[6],q[5]; rz(pi*0.2895834242) q[5]; h q[5]; cx q[5],q[6]; rz(pi*-0.25) q[5]; rz(pi*0.25) q[6]; rz(0) q[1]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[2]; rz(pi*-0.25) q[3]; cx q[2],q[3]; h q[2]; cx q[3],q[2]; sdg q[2]; cx q[3],q[2]; s q[2]; h q[2]; cx q[2],q[3]; rz(pi*-0.25) q[2]; rz(pi*0.25) q[3]; rz(0) q[9]; rz(0) q[6]; // Gate: PhasedISWAP**-0.7068022226528555 rz(pi*0.25) q[7]; rz(pi*-0.25) q[8]; cx q[7],q[8]; h q[7]; cx q[8],q[7]; rz(pi*-0.3534011113) q[7]; cx q[8],q[7]; rz(pi*0.3534011113) q[7]; h q[7]; cx q[7],q[8]; rz(pi*-0.25) q[7]; rz(pi*0.25) q[8]; rz(0) q[3]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[4]; rz(pi*-0.25) q[5]; cx q[4],q[5]; h q[4]; cx q[5],q[4]; sdg q[4]; cx q[5],q[4]; s q[4]; h q[4]; cx q[4],q[5]; rz(pi*-0.25) q[4]; rz(pi*0.25) q[5]; // Gate: PhasedISWAP**0.7951672353008667 rz(pi*0.25) q[1]; rz(pi*-0.25) q[2]; cx q[1],q[2]; h q[1]; cx q[2],q[1]; rz(pi*0.3975836177) q[1]; cx q[2],q[1]; rz(pi*-0.3975836177) q[1]; h q[1]; cx q[1],q[2]; rz(pi*-0.25) q[1]; rz(pi*0.25) q[2]; rz(0) q[8]; // Gate: PhasedISWAP**-0.7951672353008663 rz(pi*0.25) q[9]; rz(pi*-0.25) q[10]; cx q[9],q[10]; h q[9]; cx q[10],q[9]; rz(pi*-0.3975836177) q[9]; cx q[10],q[9]; rz(pi*0.3975836177) q[9]; h q[9]; cx q[9],q[10]; rz(pi*-0.25) q[9]; rz(pi*0.25) q[10]; rz(0) q[5]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[6]; rz(pi*-0.25) q[7]; cx q[6],q[7]; h q[6]; cx q[7],q[6]; sdg q[6]; cx q[7],q[6]; s q[6]; h q[6]; cx q[6],q[7]; rz(pi*-0.25) q[6]; rz(pi*0.25) q[7]; rz(0) q[2]; // Gate: PhasedISWAP**0.5354409456024599 rz(pi*0.25) q[3]; rz(pi*-0.25) q[4]; cx q[3],q[4]; h q[3]; cx q[4],q[3]; rz(pi*0.2677204728) q[3]; cx q[4],q[3]; rz(pi*-0.2677204728) q[3]; h q[3]; cx q[3],q[4]; rz(pi*-0.25) q[3]; rz(pi*0.25) q[4]; rz(0) q[10]; rz(0) q[7]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[8]; rz(pi*-0.25) q[9]; cx q[8],q[9]; h q[8]; cx q[9],q[8]; sdg q[8]; cx q[9],q[8]; s q[8]; h q[8]; cx q[8],q[9]; rz(pi*-0.25) q[8]; rz(pi*0.25) q[9]; rz(0) q[4]; // Gate: PhasedISWAP**0.5791668483211309 rz(pi*0.25) q[5]; rz(pi*-0.25) q[6]; cx q[5],q[6]; h q[5]; cx q[6],q[5]; rz(pi*0.2895834242) q[5]; cx q[6],q[5]; rz(pi*-0.2895834242) q[5]; h q[5]; cx q[5],q[6]; rz(pi*-0.25) q[5]; rz(pi*0.25) q[6]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[2]; rz(pi*-0.25) q[3]; cx q[2],q[3]; h q[2]; cx q[3],q[2]; sdg q[2]; cx q[3],q[2]; s q[2]; h q[2]; cx q[2],q[3]; rz(pi*-0.25) q[2]; rz(pi*0.25) q[3]; rz(0) q[9]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[10]; rz(pi*-0.25) q[11]; cx q[10],q[11]; h q[10]; cx q[11],q[10]; sdg q[10]; cx q[11],q[10]; s q[10]; h q[10]; cx q[10],q[11]; rz(pi*-0.25) q[10]; rz(pi*0.25) q[11]; rz(0) q[6]; // Gate: PhasedISWAP**-0.5354409456024602 rz(pi*0.25) q[7]; rz(pi*-0.25) q[8]; cx q[7],q[8]; h q[7]; cx q[8],q[7]; rz(pi*-0.2677204728) q[7]; cx q[8],q[7]; rz(pi*0.2677204728) q[7]; h q[7]; cx q[7],q[8]; rz(pi*-0.25) q[7]; rz(pi*0.25) q[8]; rz(0) q[3]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[4]; rz(pi*-0.25) q[5]; cx q[4],q[5]; h q[4]; cx q[5],q[4]; sdg q[4]; cx q[5],q[4]; s q[4]; h q[4]; cx q[4],q[5]; rz(pi*-0.25) q[4]; rz(pi*0.25) q[5]; rz(0) q[11]; rz(0) q[8]; // Gate: PhasedISWAP**-0.7951672353008665 rz(pi*0.25) q[9]; rz(pi*-0.25) q[10]; cx q[9],q[10]; h q[9]; cx q[10],q[9]; rz(pi*-0.3975836177) q[9]; cx q[10],q[9]; rz(pi*0.3975836177) q[9]; h q[9]; cx q[9],q[10]; rz(pi*-0.25) q[9]; rz(pi*0.25) q[10]; rz(0) q[5]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[6]; rz(pi*-0.25) q[7]; cx q[6],q[7]; h q[6]; cx q[7],q[6]; sdg q[6]; cx q[7],q[6]; s q[6]; h q[6]; cx q[6],q[7]; rz(pi*-0.25) q[6]; rz(pi*0.25) q[7]; // Gate: PhasedISWAP**0.53544094560246 rz(pi*0.25) q[3]; rz(pi*-0.25) q[4]; cx q[3],q[4]; h q[3]; cx q[4],q[3]; rz(pi*0.2677204728) q[3]; cx q[4],q[3]; rz(pi*-0.2677204728) q[3]; h q[3]; cx q[3],q[4]; rz(pi*-0.25) q[3]; rz(pi*0.25) q[4]; rz(0) q[10]; rz(0) q[7]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[8]; rz(pi*-0.25) q[9]; cx q[8],q[9]; h q[8]; cx q[9],q[8]; sdg q[8]; cx q[9],q[8]; s q[8]; h q[8]; cx q[8],q[9]; rz(pi*-0.25) q[8]; rz(pi*0.25) q[9]; rz(0) q[4]; // Gate: PhasedISWAP**-0.2951672353008664 rz(pi*0.25) q[5]; rz(pi*-0.25) q[6]; cx q[5],q[6]; h q[5]; cx q[6],q[5]; rz(pi*-0.1475836177) q[5]; cx q[6],q[5]; rz(pi*0.1475836177) q[5]; h q[5]; cx q[5],q[6]; rz(pi*-0.25) q[5]; rz(pi*0.25) q[6]; rz(0) q[9]; rz(0) q[6]; // Gate: PhasedISWAP**-0.5354409456024596 rz(pi*0.25) q[7]; rz(pi*-0.25) q[8]; cx q[7],q[8]; h q[7]; cx q[8],q[7]; rz(pi*-0.2677204728) q[7]; cx q[8],q[7]; rz(pi*0.2677204728) q[7]; h q[7]; cx q[7],q[8]; rz(pi*-0.25) q[7]; rz(pi*0.25) q[8]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[4]; rz(pi*-0.25) q[5]; cx q[4],q[5]; h q[4]; cx q[5],q[4]; sdg q[4]; cx q[5],q[4]; s q[4]; h q[4]; cx q[4],q[5]; rz(pi*-0.25) q[4]; rz(pi*0.25) q[5]; rz(0) q[8]; rz(0) q[5]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[6]; rz(pi*-0.25) q[7]; cx q[6],q[7]; h q[6]; cx q[7],q[6]; sdg q[6]; cx q[7],q[6]; s q[6]; h q[6]; cx q[6],q[7]; rz(pi*-0.25) q[6]; rz(pi*0.25) q[7]; rz(0) q[7]; // Gate: PhasedISWAP**0.2951672353008665 rz(pi*0.25) q[5]; rz(pi*-0.25) q[6]; cx q[5],q[6]; h q[5]; cx q[6],q[5]; rz(pi*0.1475836177) q[5]; cx q[6],q[5]; rz(pi*-0.1475836177) q[5]; h q[5]; cx q[5],q[6]; rz(pi*-0.25) q[5]; rz(pi*0.25) q[6]; rz(0) q[6];
Cirq v0.11.1, OpenFermion v1.1.0 // Generated from Cirq v0.11.1 OPENQASM 2.0; include "qelib1.inc"; // Qubits: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] qreg q[12]; x q[0]; x q[1]; x q[2]; x q[3]; x q[4]; x q[5]; // Gate: PhasedISWAP**-0.6256659163780022 rz(pi*0.25) q[5]; rz(pi*-0.25) q[6]; cx q[5],q[6]; h q[5]; cx q[6],q[5]; rz(pi*-0.3128329582) q[5]; cx q[6],q[5]; rz(pi*0.3128329582) q[5]; h q[5]; cx q[5],q[6]; rz(pi*-0.25) q[5]; rz(pi*0.25) q[6]; rz(0) q[6]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[4]; rz(pi*-0.25) q[5]; cx q[4],q[5]; h q[4]; cx q[5],q[4]; rz(pi*-0.5) q[4]; cx q[5],q[4]; rz(pi*0.5) q[4]; h q[4]; cx q[4],q[5]; rz(pi*-0.25) q[4]; rz(pi*0.25) q[5]; rz(0) q[5]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[6]; rz(pi*-0.25) q[7]; cx q[6],q[7]; h q[6]; cx q[7],q[6]; rz(pi*-0.5) q[6]; cx q[7],q[6]; rz(pi*0.5) q[6]; h q[6]; cx q[6],q[7]; rz(pi*-0.25) q[6]; rz(pi*0.25) q[7]; // Gate: PhasedISWAP**0.7068022226528557 rz(pi*0.25) q[3]; rz(pi*-0.25) q[4]; cx q[3],q[4]; h q[3]; cx q[4],q[3]; rz(pi*0.3534011113) q[3]; cx q[4],q[3]; rz(pi*-0.3534011113) q[3]; h q[3]; cx q[3],q[4]; rz(pi*-0.25) q[3]; rz(pi*0.25) q[4]; rz(0) q[7]; rz(0) q[4]; // Gate: PhasedISWAP**0.6256659163780026 rz(pi*0.25) q[5]; rz(pi*-0.25) q[6]; cx q[5],q[6]; h q[5]; cx q[6],q[5]; rz(pi*0.3128329582) q[5]; cx q[6],q[5]; rz(pi*-0.3128329582) q[5]; h q[5]; cx q[5],q[6]; rz(pi*-0.25) q[5]; rz(pi*0.25) q[6]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[2]; rz(pi*-0.25) q[3]; cx q[2],q[3]; h q[2]; cx q[3],q[2]; rz(pi*-0.5) q[2]; cx q[3],q[2]; rz(pi*0.5) q[2]; h q[2]; cx q[2],q[3]; rz(pi*-0.25) q[2]; rz(pi*0.25) q[3]; rz(0) q[6]; // Gate: PhasedISWAP**-0.7068022226528554 rz(pi*0.25) q[7]; rz(pi*-0.25) q[8]; cx q[7],q[8]; h q[7]; cx q[8],q[7]; rz(pi*-0.3534011113) q[7]; cx q[8],q[7]; rz(pi*0.3534011113) q[7]; h q[7]; cx q[7],q[8]; rz(pi*-0.25) q[7]; rz(pi*0.25) q[8]; rz(0) q[3]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[4]; rz(pi*-0.25) q[5]; cx q[4],q[5]; h q[4]; cx q[5],q[4]; rz(pi*-0.5) q[4]; cx q[5],q[4]; rz(pi*0.5) q[4]; h q[4]; cx q[4],q[5]; rz(pi*-0.25) q[4]; rz(pi*0.25) q[5]; // Gate: PhasedISWAP**0.7951672353008667 rz(pi*0.25) q[1]; rz(pi*-0.25) q[2]; cx q[1],q[2]; h q[1]; cx q[2],q[1]; rz(pi*0.3975836177) q[1]; cx q[2],q[1]; rz(pi*-0.3975836177) q[1]; h q[1]; cx q[1],q[2]; rz(pi*-0.25) q[1]; rz(pi*0.25) q[2]; rz(0) q[8]; rz(0) q[5]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[6]; rz(pi*-0.25) q[7]; cx q[6],q[7]; h q[6]; cx q[7],q[6]; rz(pi*-0.5) q[6]; cx q[7],q[6]; rz(pi*0.5) q[6]; h q[6]; cx q[6],q[7]; rz(pi*-0.25) q[6]; rz(pi*0.25) q[7]; rz(0) q[2]; // Gate: PhasedISWAP**0.7068022226528555 rz(pi*0.25) q[3]; rz(pi*-0.25) q[4]; cx q[3],q[4]; h q[3]; cx q[4],q[3]; rz(pi*0.3534011113) q[3]; cx q[4],q[3]; rz(pi*-0.3534011113) q[3]; h q[3]; cx q[3],q[4]; rz(pi*-0.25) q[3]; rz(pi*0.25) q[4]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[0]; rz(pi*-0.25) q[1]; cx q[0],q[1]; h q[0]; cx q[1],q[0]; rz(pi*-0.5) q[0]; cx q[1],q[0]; rz(pi*0.5) q[0]; h q[0]; cx q[0],q[1]; rz(pi*-0.25) q[0]; rz(pi*0.25) q[1]; rz(0) q[7]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[8]; rz(pi*-0.25) q[9]; cx q[8],q[9]; h q[8]; cx q[9],q[8]; rz(pi*-0.5) q[8]; cx q[9],q[8]; rz(pi*0.5) q[8]; h q[8]; cx q[8],q[9]; rz(pi*-0.25) q[8]; rz(pi*0.25) q[9]; rz(0) q[4]; // Gate: PhasedISWAP**-0.5791668483211313 rz(pi*0.25) q[5]; rz(pi*-0.25) q[6]; cx q[5],q[6]; h q[5]; cx q[6],q[5]; rz(pi*-0.2895834242) q[5]; cx q[6],q[5]; rz(pi*0.2895834242) q[5]; h q[5]; cx q[5],q[6]; rz(pi*-0.25) q[5]; rz(pi*0.25) q[6]; rz(0) q[1]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[2]; rz(pi*-0.25) q[3]; cx q[2],q[3]; h q[2]; cx q[3],q[2]; rz(pi*-0.5) q[2]; cx q[3],q[2]; rz(pi*0.5) q[2]; h q[2]; cx q[2],q[3]; rz(pi*-0.25) q[2]; rz(pi*0.25) q[3]; rz(0) q[9]; rz(0) q[6]; // Gate: PhasedISWAP**-0.7068022226528555 rz(pi*0.25) q[7]; rz(pi*-0.25) q[8]; cx q[7],q[8]; h q[7]; cx q[8],q[7]; rz(pi*-0.3534011113) q[7]; cx q[8],q[7]; rz(pi*0.3534011113) q[7]; h q[7]; cx q[7],q[8]; rz(pi*-0.25) q[7]; rz(pi*0.25) q[8]; rz(0) q[3]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[4]; rz(pi*-0.25) q[5]; cx q[4],q[5]; h q[4]; cx q[5],q[4]; rz(pi*-0.5) q[4]; cx q[5],q[4]; rz(pi*0.5) q[4]; h q[4]; cx q[4],q[5]; rz(pi*-0.25) q[4]; rz(pi*0.25) q[5]; // Gate: PhasedISWAP**0.7951672353008667 rz(pi*0.25) q[1]; rz(pi*-0.25) q[2]; cx q[1],q[2]; h q[1]; cx q[2],q[1]; rz(pi*0.3975836177) q[1]; cx q[2],q[1]; rz(pi*-0.3975836177) q[1]; h q[1]; cx q[1],q[2]; rz(pi*-0.25) q[1]; rz(pi*0.25) q[2]; rz(0) q[8]; // Gate: PhasedISWAP**-0.7951672353008663 rz(pi*0.25) q[9]; rz(pi*-0.25) q[10]; cx q[9],q[10]; h q[9]; cx q[10],q[9]; rz(pi*-0.3975836177) q[9]; cx q[10],q[9]; rz(pi*0.3975836177) q[9]; h q[9]; cx q[9],q[10]; rz(pi*-0.25) q[9]; rz(pi*0.25) q[10]; rz(0) q[5]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[6]; rz(pi*-0.25) q[7]; cx q[6],q[7]; h q[6]; cx q[7],q[6]; rz(pi*-0.5) q[6]; cx q[7],q[6]; rz(pi*0.5) q[6]; h q[6]; cx q[6],q[7]; rz(pi*-0.25) q[6]; rz(pi*0.25) q[7]; rz(0) q[2]; // Gate: PhasedISWAP**0.5354409456024599 rz(pi*0.25) q[3]; rz(pi*-0.25) q[4]; cx q[3],q[4]; h q[3]; cx q[4],q[3]; rz(pi*0.2677204728) q[3]; cx q[4],q[3]; rz(pi*-0.2677204728) q[3]; h q[3]; cx q[3],q[4]; rz(pi*-0.25) q[3]; rz(pi*0.25) q[4]; rz(0) q[10]; rz(0) q[7]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[8]; rz(pi*-0.25) q[9]; cx q[8],q[9]; h q[8]; cx q[9],q[8]; rz(pi*-0.5) q[8]; cx q[9],q[8]; rz(pi*0.5) q[8]; h q[8]; cx q[8],q[9]; rz(pi*-0.25) q[8]; rz(pi*0.25) q[9]; rz(0) q[4]; // Gate: PhasedISWAP**0.5791668483211309 rz(pi*0.25) q[5]; rz(pi*-0.25) q[6]; cx q[5],q[6]; h q[5]; cx q[6],q[5]; rz(pi*0.2895834242) q[5]; cx q[6],q[5]; rz(pi*-0.2895834242) q[5]; h q[5]; cx q[5],q[6]; rz(pi*-0.25) q[5]; rz(pi*0.25) q[6]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[2]; rz(pi*-0.25) q[3]; cx q[2],q[3]; h q[2]; cx q[3],q[2]; rz(pi*-0.5) q[2]; cx q[3],q[2]; rz(pi*0.5) q[2]; h q[2]; cx q[2],q[3]; rz(pi*-0.25) q[2]; rz(pi*0.25) q[3]; rz(0) q[9]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[10]; rz(pi*-0.25) q[11]; cx q[10],q[11]; h q[10]; cx q[11],q[10]; rz(pi*-0.5) q[10]; cx q[11],q[10]; rz(pi*0.5) q[10]; h q[10]; cx q[10],q[11]; rz(pi*-0.25) q[10]; rz(pi*0.25) q[11]; rz(0) q[6]; // Gate: PhasedISWAP**-0.5354409456024602 rz(pi*0.25) q[7]; rz(pi*-0.25) q[8]; cx q[7],q[8]; h q[7]; cx q[8],q[7]; rz(pi*-0.2677204728) q[7]; cx q[8],q[7]; rz(pi*0.2677204728) q[7]; h q[7]; cx q[7],q[8]; rz(pi*-0.25) q[7]; rz(pi*0.25) q[8]; rz(0) q[3]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[4]; rz(pi*-0.25) q[5]; cx q[4],q[5]; h q[4]; cx q[5],q[4]; rz(pi*-0.5) q[4]; cx q[5],q[4]; rz(pi*0.5) q[4]; h q[4]; cx q[4],q[5]; rz(pi*-0.25) q[4]; rz(pi*0.25) q[5]; rz(0) q[11]; rz(0) q[8]; // Gate: PhasedISWAP**-0.7951672353008665 rz(pi*0.25) q[9]; rz(pi*-0.25) q[10]; cx q[9],q[10]; h q[9]; cx q[10],q[9]; rz(pi*-0.3975836177) q[9]; cx q[10],q[9]; rz(pi*0.3975836177) q[9]; h q[9]; cx q[9],q[10]; rz(pi*-0.25) q[9]; rz(pi*0.25) q[10]; rz(0) q[5]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[6]; rz(pi*-0.25) q[7]; cx q[6],q[7]; h q[6]; cx q[7],q[6]; rz(pi*-0.5) q[6]; cx q[7],q[6]; rz(pi*0.5) q[6]; h q[6]; cx q[6],q[7]; rz(pi*-0.25) q[6]; rz(pi*0.25) q[7]; // Gate: PhasedISWAP**0.53544094560246 rz(pi*0.25) q[3]; rz(pi*-0.25) q[4]; cx q[3],q[4]; h q[3]; cx q[4],q[3]; rz(pi*0.2677204728) q[3]; cx q[4],q[3]; rz(pi*-0.2677204728) q[3]; h q[3]; cx q[3],q[4]; rz(pi*-0.25) q[3]; rz(pi*0.25) q[4]; rz(0) q[10]; rz(0) q[7]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[8]; rz(pi*-0.25) q[9]; cx q[8],q[9]; h q[8]; cx q[9],q[8]; rz(pi*-0.5) q[8]; cx q[9],q[8]; rz(pi*0.5) q[8]; h q[8]; cx q[8],q[9]; rz(pi*-0.25) q[8]; rz(pi*0.25) q[9]; rz(0) q[4]; // Gate: PhasedISWAP**-0.2951672353008664 rz(pi*0.25) q[5]; rz(pi*-0.25) q[6]; cx q[5],q[6]; h q[5]; cx q[6],q[5]; rz(pi*-0.1475836177) q[5]; cx q[6],q[5]; rz(pi*0.1475836177) q[5]; h q[5]; cx q[5],q[6]; rz(pi*-0.25) q[5]; rz(pi*0.25) q[6]; rz(0) q[9]; rz(0) q[6]; // Gate: PhasedISWAP**-0.5354409456024596 rz(pi*0.25) q[7]; rz(pi*-0.25) q[8]; cx q[7],q[8]; h q[7]; cx q[8],q[7]; rz(pi*-0.2677204728) q[7]; cx q[8],q[7]; rz(pi*0.2677204728) q[7]; h q[7]; cx q[7],q[8]; rz(pi*-0.25) q[7]; rz(pi*0.25) q[8]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[4]; rz(pi*-0.25) q[5]; cx q[4],q[5]; h q[4]; cx q[5],q[4]; rz(pi*-0.5) q[4]; cx q[5],q[4]; rz(pi*0.5) q[4]; h q[4]; cx q[4],q[5]; rz(pi*-0.25) q[4]; rz(pi*0.25) q[5]; rz(0) q[8]; rz(0) q[5]; // Gate: PhasedISWAP**-1.0 rz(pi*0.25) q[6]; rz(pi*-0.25) q[7]; cx q[6],q[7]; h q[6]; cx q[7],q[6]; rz(pi*-0.5) q[6]; cx q[7],q[6]; rz(pi*0.5) q[6]; h q[6]; cx q[6],q[7]; rz(pi*-0.25) q[6]; rz(pi*0.25) q[7]; rz(0) q[7]; // Gate: PhasedISWAP**0.2951672353008665 rz(pi*0.25) q[5]; rz(pi*-0.25) q[6]; cx q[5],q[6]; h q[5]; cx q[6],q[5]; rz(pi*0.1475836177) q[5]; cx q[6],q[5]; rz(pi*-0.1475836177) q[5]; h q[5]; cx q[5],q[6]; rz(pi*-0.25) q[5]; rz(pi*0.25) q[6]; rz(0) q[6];

If you take a look at the diff between the two circuits:

Diff ``` 1c1 < // Generated from Cirq v0.13.1 --- > // Generated from Cirq v0.11.1 40c40 < sdg q[4]; --- > rz(pi*-0.5) q[4]; 42c42 < s q[4]; --- > rz(pi*0.5) q[4]; 56c56 < sdg q[6]; --- > rz(pi*-0.5) q[6]; 58c58 < s q[6]; --- > rz(pi*0.5) q[6]; 101c101 < sdg q[2]; --- > rz(pi*-0.5) q[2]; 103c103 < s q[2]; --- > rz(pi*0.5) q[2]; 133c133 < sdg q[4]; --- > rz(pi*-0.5) q[4]; 135c135 < s q[4]; --- > rz(pi*0.5) q[4]; 164c164 < sdg q[6]; --- > rz(pi*-0.5) q[6]; 166c166 < s q[6]; --- > rz(pi*0.5) q[6]; 194c194 < sdg q[0]; --- > rz(pi*-0.5) q[0]; 196c196 < s q[0]; --- > rz(pi*0.5) q[0]; 210c210 < sdg q[8]; --- > rz(pi*-0.5) q[8]; 212c212 < s q[8]; --- > rz(pi*0.5) q[8]; 242c242 < sdg q[2]; --- > rz(pi*-0.5) q[2]; 244c244 < s q[2]; --- > rz(pi*0.5) q[2]; 275c275 < sdg q[4]; --- > rz(pi*-0.5) q[4]; 277c277 < s q[4]; --- > rz(pi*0.5) q[4]; 321c321 < sdg q[6]; --- > rz(pi*-0.5) q[6]; 323c323 < s q[6]; --- > rz(pi*0.5) q[6]; 354c354 < sdg q[8]; --- > rz(pi*-0.5) q[8]; 356c356 < s q[8]; --- > rz(pi*0.5) q[8]; 384c384 < sdg q[2]; --- > rz(pi*-0.5) q[2]; 386c386 < s q[2]; --- > rz(pi*0.5) q[2]; 400c400 < sdg q[10]; --- > rz(pi*-0.5) q[10]; 402c402 < s q[10]; --- > rz(pi*0.5) q[10]; 432c432 < sdg q[4]; --- > rz(pi*-0.5) q[4]; 434c434 < s q[4]; --- > rz(pi*0.5) q[4]; 465c465 < sdg q[6]; --- > rz(pi*-0.5) q[6]; 467c467 < s q[6]; --- > rz(pi*0.5) q[6]; 496c496 < sdg q[8]; --- > rz(pi*-0.5) q[8]; 498c498 < s q[8]; --- > rz(pi*0.5) q[8]; 543c543 < sdg q[4]; --- > rz(pi*-0.5) q[4]; 545c545 < s q[4]; --- > rz(pi*0.5) q[4]; 560c560 < sdg q[6]; --- > rz(pi*-0.5) q[6]; 562c562 < s q[6]; --- > rz(pi*0.5) q[6]; ```

You can see that there are different gates, in particular rz(pi*-0.5) becomes sdg, which I guess is S^dagger. Such gate is not supported by Qibo. Do you know if sdg is a standard openQASM gate (then we should add it to Qibo, I guess)?

mlazzarin commented 2 years ago

Actually, it seems like sdg is indeed a standard oepnQASM gate https://github.com/Qiskit/openqasm/blob/2.0/examples/qelib1.inc

@stavros11 shall we add it to Qibo?