mod bool;
mod core;
mod float;
mod prelude;
mod rotation;
mod tk1;
mod tket;
pub use bool::BoolEmitter;
pub use core::CoreDecoder;
pub use float::FloatEmitter;
pub use prelude::PreludeEmitter;
pub use rotation::RotationEmitter;
pub use tk1::Tk1Emitter;
pub use tket::TketOpEmitter;
pub(crate) use bool::set_bits_op;
pub(crate) use tk1::{OpaqueTk1Op, build_opaque_tket_op};
use super::encoder::TrackedValues;
use crate::serialize::pytket::config::TypeTranslatorSet;
use crate::serialize::pytket::decoder::{
DecodeStatus, LoadedParameter, PytketDecoderContext, TrackedBit, TrackedQubit,
};
use crate::serialize::pytket::encoder::{EncodeStatus, PytketEncoderContext};
use crate::serialize::pytket::{PytketDecodeError, PytketEncodeError};
use hugr::HugrView;
use hugr::extension::ExtensionId;
use hugr::ops::ExtensionOp;
use hugr::ops::constant::OpaqueValue;
use hugr::types::CustomType;
pub trait PytketEmitter<H: HugrView> {
fn extensions(&self) -> Option<Vec<ExtensionId>>;
fn op_to_pytket(
&self,
node: H::Node,
op: &ExtensionOp,
hugr: &H,
encoder: &mut PytketEncoderContext<H>,
) -> Result<EncodeStatus, PytketEncodeError<H::Node>> {
let _ = (node, op, hugr, encoder);
Ok(EncodeStatus::Unsupported)
}
fn const_to_pytket(
&self,
value: &OpaqueValue,
encoder: &mut PytketEncoderContext<H>,
) -> Result<Option<TrackedValues>, PytketEncodeError<H::Node>> {
let _ = (value, encoder);
Ok(None)
}
}
pub trait PytketDecoder {
fn op_types(&self) -> Vec<tket_json_rs::OpType>;
fn op_to_hugr<'h>(
&self,
op: &tket_json_rs::circuit_json::Operation,
qubits: &[TrackedQubit],
bits: &[TrackedBit],
params: &[LoadedParameter],
opgroup: Option<&str>,
decoder: &mut PytketDecoderContext<'h>,
) -> Result<DecodeStatus, PytketDecodeError> {
let _ = (op, qubits, bits, params, opgroup, decoder);
Ok(DecodeStatus::Unsupported)
}
}
pub trait PytketTypeTranslator {
fn extensions(&self) -> Vec<ExtensionId>;
fn type_to_pytket(
&self,
typ: &CustomType,
type_translators: &TypeTranslatorSet,
) -> Option<RegisterCount> {
let _ = (typ, type_translators);
None
}
}
#[derive(
Clone,
Copy,
PartialEq,
Eq,
Hash,
Debug,
Default,
derive_more::Display,
derive_more::Add,
derive_more::AddAssign,
derive_more::Sub,
derive_more::SubAssign,
derive_more::Sum,
)]
#[display("{qubits} qubits, {bits} bits, {params} parameters")]
#[non_exhaustive]
pub struct RegisterCount {
pub qubits: usize,
pub bits: usize,
pub params: usize,
}
impl RegisterCount {
pub const fn new(qubits: usize, bits: usize, params: usize) -> Self {
RegisterCount {
qubits,
bits,
params,
}
}
pub const fn only_qubits(qubits: usize) -> Self {
RegisterCount {
qubits,
bits: 0,
params: 0,
}
}
pub const fn only_bits(bits: usize) -> Self {
RegisterCount {
qubits: 0,
bits,
params: 0,
}
}
pub const fn only_params(params: usize) -> Self {
RegisterCount {
qubits: 0,
bits: 0,
params,
}
}
pub const fn total(&self) -> usize {
self.qubits + self.bits + self.params
}
pub const fn is_empty(&self) -> bool {
self.qubits == 0 && self.bits == 0 && self.params == 0
}
}