#create circuit that generates source
qc = QubitCircuit(4)
qc.add_gate("X", targets=[1])
qc.add_gate("QASMU", targets=[0], arg_value=[F_to_theta(fidelity_val), pi, 0])
qc.add_gate("CNOT", controls=[0], targets=[1])
qc.add_gate("X", targets=[3])
qc.add_gate("QASMU", targets=[2], arg_value=[F_to_theta(fidelity_val), pi, 0])
qc.add_gate("CNOT", controls=[2], targets=[3])
# qc.draw("matplotlib", dpi=150)
#generate werner state from source using random bilateral rotations
rand_int = np.random.randint(12)
bilateral_rotation(qc, control_qubits, rand_int)
bilateral_rotation(qc, target_qubits, rand_int)
# qc.draw("matplotlib", dpi=150)
#bbpssw protocol steps
qc.add_gate("Y", targets=[0])
qc.add_gate("Y", targets=[2])
qc.add_gate("CNOT", controls=[0], targets=[2])
qc.add_gate("CNOT", controls=[1], targets=[3])
qc.add_measurement("M0", targets=[2], classical_store=[0])
qc.add_measurement("M0", targets=[3], classical_store=[1])
# qc.draw("matplotlib", dpi=150)