use crate::circuit::Qubit;
use std::collections::BTreeSet;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum QubitOrigin {
Input,
CompilerAllocated,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum AncillaRequirement {
CleanZero,
Dirty,
}
impl AncillaRequirement {
pub(super) const fn diagnostic_name(self) -> &'static str {
match self {
Self::CleanZero => "clean-zero",
Self::Dirty => "dirty",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ResourceRequest {
pub requirement: AncillaRequirement,
pub count: usize,
pub excluded: BTreeSet<Qubit>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ResourcePlan {
manager_id: u64,
requirement: AncillaRequirement,
qubits: Vec<Qubit>,
new_qubits: Vec<Qubit>,
revision: u64,
}
impl ResourcePlan {
pub(super) const fn new(
manager_id: u64,
requirement: AncillaRequirement,
qubits: Vec<Qubit>,
new_qubits: Vec<Qubit>,
revision: u64,
) -> Self {
Self {
manager_id,
requirement,
qubits,
new_qubits,
revision,
}
}
pub fn qubits(&self) -> &[Qubit] {
&self.qubits
}
pub const fn requirement(&self) -> AncillaRequirement {
self.requirement
}
pub fn num_new_qubits(&self) -> usize {
self.new_qubits.len()
}
pub(super) const fn revision(&self) -> u64 {
self.revision
}
pub(super) const fn manager_id(&self) -> u64 {
self.manager_id
}
pub(super) fn new_qubits(&self) -> &[Qubit] {
&self.new_qubits
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ResourceLease {
manager_id: u64,
id: u64,
requirement: AncillaRequirement,
qubits: Vec<Qubit>,
}
impl ResourceLease {
pub(super) const fn new(
manager_id: u64,
id: u64,
requirement: AncillaRequirement,
qubits: Vec<Qubit>,
) -> Self {
Self {
manager_id,
id,
requirement,
qubits,
}
}
pub const fn id(&self) -> u64 {
self.id
}
pub(super) const fn manager_id(&self) -> u64 {
self.manager_id
}
pub fn qubits(&self) -> &[Qubit] {
&self.qubits
}
pub const fn requirement(&self) -> AncillaRequirement {
self.requirement
}
}