use crate::{Circuit, metadata};
use hugr::hugr::hugrmut::HugrMut;
use serde::{Deserialize, Serialize};
use super::CircuitRewrite;
pub const REWRITE_TRACING_ENABLED: bool = cfg!(feature = "rewrite-tracing");
#[derive(Deserialize, Serialize, Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(transparent)]
pub struct RewriteTrace {
individual_matches: u16,
}
impl From<&CircuitRewrite> for RewriteTrace {
#[inline]
fn from(_rewrite: &CircuitRewrite) -> Self {
Self {
individual_matches: 1,
}
}
}
impl RewriteTrace {
#[inline]
pub fn new(individual_matches: u16) -> Self {
Self { individual_matches }
}
}
impl<T: HugrMut> Circuit<T> {
#[inline]
pub fn enable_rewrite_tracing(&mut self) {
if !REWRITE_TRACING_ENABLED {
return;
}
let root = self.parent();
let hugr = self.hugr_mut();
if hugr
.get_metadata::<metadata::CircuitRewriteTraces>(root)
.is_none()
{
hugr.set_metadata::<metadata::CircuitRewriteTraces>(root, vec![]);
}
}
#[inline]
pub fn add_rewrite_trace(&mut self, rewrite: impl Into<RewriteTrace>) -> bool {
if !REWRITE_TRACING_ENABLED {
return false;
}
let root = self.parent();
match self
.hugr()
.get_metadata::<metadata::CircuitRewriteTraces>(root)
{
Some(mut meta) => {
meta.push(rewrite.into());
self.hugr_mut()
.set_metadata::<metadata::CircuitRewriteTraces>(root, meta);
true
}
None => false,
}
}
#[inline]
pub fn rewrite_trace(&self) -> Option<impl Iterator<Item = RewriteTrace> + '_> {
if !REWRITE_TRACING_ENABLED {
return None;
}
let ve = self
.hugr()
.get_metadata::<metadata::CircuitRewriteTraces>(self.parent());
ve.map(Vec::into_iter)
}
}