use crate::channel::Channel;
pub struct Circuit<const W: usize> {
pub(crate) num_qubits: usize,
pub(crate) channels: Vec<Box<dyn Channel<W>>>,
}
impl<const W: usize> Circuit<W> {
pub fn new(num_qubits: usize) -> Self {
Self { num_qubits, channels: Vec::new() }
}
pub fn push<C: Channel<W> + 'static>(&mut self, channel: C) {
self.push_boxed(Box::new(channel));
}
pub fn push_boxed(&mut self, channel: Box<dyn Channel<W>>) {
let support = channel.support();
if let Some(word) = (0..W).rev().find(|&w| support[w] != 0) {
let highest = 64 * word + 63 - support[word].leading_zeros() as usize;
assert!(
highest < self.num_qubits,
"Circuit::push: {} acts on qubit {highest}, outside this {}-qubit circuit",
channel.debug_name(),
self.num_qubits,
);
}
self.channels.push(channel);
}
pub fn num_qubits(&self) -> usize {
self.num_qubits
}
pub fn channels(&self) -> &[Box<dyn Channel<W>>] {
&self.channels
}
pub fn len(&self) -> usize {
self.channels.len()
}
pub fn is_empty(&self) -> bool {
self.channels.is_empty()
}
}
#[cfg(test)]
mod tests;