use crate::circuit::gate::{ClassicalDataOp, Directive};
use crate::circuit::{Circuit, Instruction};
use crate::qis::QisError;
use std::collections::HashMap;
pub(crate) fn validate_terminal_measurements(circuit: &Circuit) -> Result<(), QisError> {
let mut measured = HashMap::new();
for (index, op) in circuit.operations().iter().enumerate() {
match &op.instruction {
Instruction::ClassicalData(
ClassicalDataOp::MeasureBit { .. } | ClassicalDataOp::MeasureBits { .. },
) => {
for qubit in &op.qubits {
measured.entry(*qubit).or_insert(index);
}
}
Instruction::ClassicalData(ClassicalDataOp::Store { .. })
| Instruction::Directive(Directive::Barrier)
| Instruction::Delay => {}
_ => {
for qubit in &op.qubits {
if let Some(measurement_index) = measured.get(qubit) {
return Err(QisError::UnsupportedOperation(format!(
"mid-circuit measurement on qubit {} at operation {}: later '{}' at \
operation {} uses the measured qubit (indices refer to the decomposed \
circuit, starting at 0); from_circuit/apply_circuit only support \
terminal measurement declarations",
qubit.id(),
measurement_index,
op.instruction.name(),
index,
)));
}
}
}
}
}
Ok(())
}