From fa7fb71aafc5f9197b0d074cc0056c2c325a606f Mon Sep 17 00:00:00 2001 From: Marquess Valdez Date: Tue, 27 Jun 2023 10:22:18 -0700 Subject: [PATCH] fix: `copy_everything_but_instructions` now correctly copies `DECLARE` statements (#1600) * fix: `copy_everything_but_instructions` now correctly copies `DECLARE` statements. * fix rewrite_arithmetic * simplify declaration iteration Co-authored-by: Michael Bryant * add clarifying comment --------- Co-authored-by: Michael Bryant --- pyquil/api/_rewrite_arithmetic.py | 3 ++- pyquil/quil.py | 2 ++ test/unit/test_quantum_computer.py | 20 ++++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/pyquil/api/_rewrite_arithmetic.py b/pyquil/api/_rewrite_arithmetic.py index fc674dc1f..fe2cea3b8 100644 --- a/pyquil/api/_rewrite_arithmetic.py +++ b/pyquil/api/_rewrite_arithmetic.py @@ -138,7 +138,8 @@ def expr_mref(expr: object) -> MemoryReference: # so we divide by 8... expr = str(Div(inst.scale, 8)) updated.inst(SetScale(inst.frame, expr_mref(expr))) - else: + # Program.copy_everything_except_instructions persists DECLARE statements + elif not isinstance(inst, Declare): updated.inst(inst) if mref_idx > 0: diff --git a/pyquil/quil.py b/pyquil/quil.py index d22eb68c0..ab3df733d 100644 --- a/pyquil/quil.py +++ b/pyquil/quil.py @@ -183,6 +183,8 @@ def copy_everything_except_instructions(self) -> "Program": """ new_prog = Program() new_prog._calibrations = self.calibrations.copy() + for declaration in self.declarations.values(): + new_prog.inst(declaration) new_prog._declarations = self._declarations.copy() new_prog._waveforms = self.waveforms.copy() new_prog._defined_gates = self._defined_gates.copy() diff --git a/test/unit/test_quantum_computer.py b/test/unit/test_quantum_computer.py index 8b12418c5..dfb09275e 100644 --- a/test/unit/test_quantum_computer.py +++ b/test/unit/test_quantum_computer.py @@ -832,6 +832,26 @@ def test_qc_expectation_on_qvm(client_configuration: QCSClient, dummy_compiler: assert results[2][0].total_counts == 20000 +def test_undeclared_memory_region(client_configuration: QCSClient, dummy_compiler: DummyCompiler): + """ + Fix for https://github.com/rigetti/pyquil/issues/1596 + """ + program = Program( + """ +DECLARE beta REAL[1] +RZ(0.5) 0 +CPHASE(pi) 0 1 +DECLARE ro BIT[2] +MEASURE 0 ro[0] +MEASURE 1 ro[1] +""" + ) + program = program.copy_everything_except_instructions() + qc = QuantumComputer(name="testy!", qam=QVM(client_configuration=client_configuration), compiler=dummy_compiler) + executable = qc.compiler.native_quil_to_executable(program) + qc.run(executable) + + @pytest.mark.skip # qcs_sdk client profiles do not support group accounts @respx.mock def test_get_qc_with_group_account(client_configuration: QCSClient, qcs_aspen8_isa: InstructionSetArchitecture):