From 9a82a2b584c9b10258937569acb0a718d21b6300 Mon Sep 17 00:00:00 2001
From: Graham Enos <genos@rigetti.com>
Date: Tue, 3 Oct 2023 14:57:26 -0400
Subject: [PATCH] fix: no percent symbol in variable qubit outputs

In [this pyQuil issue](https://github.com/rigetti/pyquil/issues/1673),
we saw that the v3 version of pyQuil can't parse `DEFCALS` with a
variable qubit; e.g.

```
DEFCAL I %q:
	DELAY q 4e-8
```

would cause pyQuil to crash, complaining about the `%` symbol. While the
[spec claims](https://quil-lang.github.io/#12-6Defining-Calibrations)
this is a valid way of writing variable qubits for calibrations, the
percent symbol prefix is only otherwise used for parameters (e.g. angles
for rotational gates), not for qubits themselves. This PR changes how
variable qubits are printed, removing the `%` prefix.

If this change is merged into `quil-rs`, chances are we probably want
to update the spec accordingly as well.
---
 quil-rs/src/instruction/mod.rs                      | 13 +++----------
 ...sts__expansion@Calibration-Param-Precedence.snap |  4 ++--
 ...tests__expansion@Calibration-Variable-Qubit.snap |  4 ++--
 ...m__calibration__tests__expansion@ShiftPhase.snap |  4 ++--
 4 files changed, 9 insertions(+), 16 deletions(-)

diff --git a/quil-rs/src/instruction/mod.rs b/quil-rs/src/instruction/mod.rs
index b9fdc2a3..3defb723 100644
--- a/quil-rs/src/instruction/mod.rs
+++ b/quil-rs/src/instruction/mod.rs
@@ -219,23 +219,16 @@ fn write_qubits(
     Ok(())
 }
 
-/// Write qubits as a Quil parameter list, where each variable qubit must be prefixed with a `%`
-/// and all are prefixed with ` `. Return an error if any is a qubit placeholder.
+/// Write qubits as a Quil parameter list, where all are prefixed with ` `.
 fn write_qubit_parameters(
     f: &mut impl std::fmt::Write,
     fall_back_to_debug: bool,
     qubits: &[Qubit],
 ) -> ToQuilResult<()> {
     for qubit in qubits.iter() {
-        match qubit {
-            Qubit::Variable(var) => write!(f, " %{var}")?,
-            other => {
-                write!(f, " ")?;
-                other.write(f, fall_back_to_debug)?;
-            }
-        }
+        write!(f, " ")?;
+        qubit.write(f, fall_back_to_debug)?;
     }
-
     Ok(())
 }
 
diff --git a/quil-rs/src/program/snapshots/quil_rs__program__calibration__tests__expansion@Calibration-Param-Precedence.snap b/quil-rs/src/program/snapshots/quil_rs__program__calibration__tests__expansion@Calibration-Param-Precedence.snap
index 5d0494fb..368eaac7 100644
--- a/quil-rs/src/program/snapshots/quil_rs__program__calibration__tests__expansion@Calibration-Param-Precedence.snap
+++ b/quil-rs/src/program/snapshots/quil_rs__program__calibration__tests__expansion@Calibration-Param-Precedence.snap
@@ -1,8 +1,8 @@
 ---
 source: quil-rs/src/program/calibration.rs
-expression: calibrated_program.to_string()
+expression: calibrated_program.to_quil_or_debug()
 ---
-DEFCAL RX(%theta) %qubit:
+DEFCAL RX(%theta) qubit:
 	PULSE 1 "xy" gaussian(duration: 1, fwhm: 2, t0: 3)
 DEFCAL RX(%theta) 0:
 	PULSE 2 "xy" gaussian(duration: 1, fwhm: 2, t0: 3)
diff --git a/quil-rs/src/program/snapshots/quil_rs__program__calibration__tests__expansion@Calibration-Variable-Qubit.snap b/quil-rs/src/program/snapshots/quil_rs__program__calibration__tests__expansion@Calibration-Variable-Qubit.snap
index b215a5fe..c1b1443b 100644
--- a/quil-rs/src/program/snapshots/quil_rs__program__calibration__tests__expansion@Calibration-Variable-Qubit.snap
+++ b/quil-rs/src/program/snapshots/quil_rs__program__calibration__tests__expansion@Calibration-Variable-Qubit.snap
@@ -1,8 +1,8 @@
 ---
 source: quil-rs/src/program/calibration.rs
-expression: calibrated_program.to_string()
+expression: calibrated_program.to_quil_or_debug()
 ---
-DEFCAL I %q:
+DEFCAL I q:
 	DELAY q 4e-8
 DELAY 0 4e-8
 
diff --git a/quil-rs/src/program/snapshots/quil_rs__program__calibration__tests__expansion@ShiftPhase.snap b/quil-rs/src/program/snapshots/quil_rs__program__calibration__tests__expansion@ShiftPhase.snap
index 392faba4..b62a573e 100644
--- a/quil-rs/src/program/snapshots/quil_rs__program__calibration__tests__expansion@ShiftPhase.snap
+++ b/quil-rs/src/program/snapshots/quil_rs__program__calibration__tests__expansion@ShiftPhase.snap
@@ -1,8 +1,8 @@
 ---
 source: quil-rs/src/program/calibration.rs
-expression: calibrated_program.to_string()
+expression: calibrated_program.to_quil_or_debug()
 ---
-DEFCAL RZ(%theta) %q:
+DEFCAL RZ(%theta) q:
 	SHIFT-PHASE q "rf" -%theta
 SHIFT-PHASE 0 "rf" -pi