def setUp(self): super().setUp() with pulse.build(name="sx_q0") as custom_sx_q0: pulse.play(pulse.Constant(100, 0.1), pulse.DriveChannel(0)) self.custom_sx_q0 = custom_sx_q0 with pulse.build(name="sx_q1") as custom_sx_q1: pulse.play(pulse.Constant(100, 0.2), pulse.DriveChannel(1)) self.custom_sx_q1 = custom_sx_q1 self.sched_param = circuit.Parameter("P0") with pulse.build(name="my_gate_q0") as my_gate_q0: pulse.shift_phase(self.sched_param, pulse.DriveChannel(0)) pulse.play(pulse.Constant(120, 0.1), pulse.DriveChannel(0)) self.my_gate_q0 = my_gate_q0 with pulse.build(name="my_gate_q1") as my_gate_q1: pulse.shift_phase(self.sched_param, pulse.DriveChannel(1)) pulse.play(pulse.Constant(120, 0.2), pulse.DriveChannel(1)) self.my_gate_q1 = my_gate_q1
def test_disassemble_single_schedule(self): """Test disassembling a single schedule. """ d0 = pulse.DriveChannel(0) d1 = pulse.DriveChannel(1) with pulse.build(self.backend) as sched: with pulse.align_right(): pulse.play(pulse.library.Constant(10, 1.0), d0) pulse.set_phase(1.0, d0) pulse.shift_phase(3.11, d0) pulse.set_frequency(1e9, d0) pulse.shift_frequency(1e7, d0) pulse.delay(20, d0) pulse.delay(10, d1) pulse.play(pulse.library.Constant(8, 0.1), d1) pulse.measure_all() qobj = assemble(sched, backend=self.backend, shots=2000) scheds, run_config_out, _ = disassemble(qobj) run_config_out = RunConfig(**run_config_out) self.assertEqual(run_config_out.memory_slots, 2) self.assertEqual(run_config_out.shots, 2000) self.assertEqual(run_config_out.memory, False) self.assertEqual(run_config_out.meas_level, 2) self.assertEqual(run_config_out.meas_lo_freq, self.backend.defaults().meas_freq_est) self.assertEqual(run_config_out.qubit_lo_freq, self.backend.defaults().qubit_freq_est) self.assertEqual(run_config_out.rep_time, 99) self.assertEqual(len(scheds), 1) self.assertEqual(scheds[0], sched)
def test_shift_phase(self): """Test shift phase instruction.""" d0 = pulse.DriveChannel(0) with pulse.build() as schedule: pulse.shift_phase(3.14, d0) reference = pulse.Schedule() reference += instructions.ShiftPhase(3.14, d0) self.assertEqual(schedule, reference)
def test_disassemble_multiple_schedules(self): """Test disassembling multiple schedules, all should have the same config. """ d0 = pulse.DriveChannel(0) d1 = pulse.DriveChannel(1) with pulse.build(self.backend) as sched0: with pulse.align_right(): pulse.play(pulse.library.Constant(10, 1.0), d0) pulse.set_phase(1.0, d0) pulse.shift_phase(3.11, d0) pulse.set_frequency(1e9, d0) pulse.shift_frequency(1e7, d0) pulse.delay(20, d0) pulse.delay(10, d1) pulse.play(pulse.library.Constant(8, 0.1), d1) pulse.measure_all() with pulse.build(self.backend) as sched1: with pulse.align_right(): pulse.play(pulse.library.Constant(8, 0.1), d0) pulse.play(pulse.library.Waveform([0., 1.]), d1) pulse.set_phase(1.1, d0) pulse.shift_phase(3.5, d0) pulse.set_frequency(2e9, d0) pulse.shift_frequency(3e7, d1) pulse.delay(20, d1) pulse.delay(10, d0) pulse.play(pulse.library.Constant(8, 0.4), d1) pulse.measure_all() qobj = assemble([sched0, sched1], backend=self.backend, shots=2000) scheds, run_config_out, _ = disassemble(qobj) run_config_out = RunConfig(**run_config_out) self.assertEqual(run_config_out.memory_slots, 2) self.assertEqual(run_config_out.shots, 2000) self.assertEqual(run_config_out.memory, False) self.assertEqual(len(scheds), 2) self.assertEqual(scheds[0], sched0) self.assertEqual(scheds[1], sched1)
def update_u_gates(drag_params, pi2_pulse_schedules=None, qubits=None, inst_map=None, drives=None): """Update the cmd_def with new single qubit gate values Will update U2, U3 Args: drag_params (list): list of drag params pi2_pulse_schedules (list): list of new pi/2 gate as a pulse schedule will use the drag_params if this is None. qubits (list): list of qubits to update inst_map (InstructionScheduleMap): InstructionScheduleMap providing circuit instruction to schedule definitions. drives (list): List of drive chs """ # pylint: disable = invalid-name # U2 is -P1.Y90p.-P0 # U3 is -P2.X90p.-P0.X90m.-P1 for qubit in qubits: drive_ch = drives[qubit] if pi2_pulse_schedules is None: x90_pulse = pulse_lib.drag(**drag_params[qubit]) x90_sched = Schedule() x90_sched += Play(x90_pulse, drive_ch).shift(0) else: x90_sched = pi2_pulse_schedules[qubit] # find channel dependency for u2 for _u2_group in _find_channel_groups('u2', qubits=qubit, inst_map=inst_map): if drive_ch in _u2_group: break else: _u2_group = (drive_ch, ) # find channel dependency for u3 for _u3_group in _find_channel_groups('u3', qubits=qubit, inst_map=inst_map): if drive_ch in _u3_group: break else: _u3_group = (drive_ch, ) # add commands to schedule # u2 with pulse.build(name=f"u2_{qubit}", default_alignment="sequential") as u2_sched: P0 = Parameter("P0") P1 = Parameter("P1") for ch in _u2_group: pulse.shift_phase(-P1 + np.pi / 2, ch) pulse.call(x90_sched) for ch in _u2_group: pulse.shift_phase(-P0 - np.pi / 2, ch) # u3 with pulse.build(name=f"u3_{qubit}", default_alignment="sequential") as u3_sched: P0 = Parameter("P0") P1 = Parameter("P1") P2 = Parameter("P2") for ch in _u3_group: pulse.shift_phase(-P2, ch) pulse.call(x90_sched) for ch in _u3_group: pulse.shift_phase(-P0 - np.pi, ch) pulse.call(x90_sched) for ch in _u3_group: pulse.shift_phase(-P1 + np.pi, ch) inst_map.add('u2', qubits=qubit, schedule=u2_sched) inst_map.add('u3', qubits=qubit, schedule=u3_sched)