#[cfg(feature = "portmatching")]
pub mod ecc_rewriter;
pub mod strategy;
pub mod trace;
#[cfg(feature = "portmatching")]
pub use ecc_rewriter::ECCRewriter;
use derive_more::{From, Into};
use hugr::hugr::Patch;
use hugr::hugr::hugrmut::HugrMut;
use hugr::hugr::patch::simple_replace;
use hugr::hugr::views::sibling_subgraph::InvalidReplacement;
use hugr::{Hugr, HugrView, Node};
use hugr::{
SimpleReplacement,
hugr::{SimpleReplacementError, views::SiblingSubgraph},
};
use crate::circuit::Circuit;
#[derive(Debug, Clone, From, Into)]
pub struct CircuitRewrite<N = Node>(SimpleReplacement<N>);
impl CircuitRewrite {
pub fn try_new(
subgraph: &SiblingSubgraph,
hugr: &impl HugrView<Node = Node>,
replacement: Circuit<impl HugrView<Node = Node>>,
) -> Result<Self, InvalidReplacement> {
let replacement = replacement
.extract_dfg()
.unwrap_or_else(|e| panic!("{}", e))
.into_hugr();
Ok(Self(subgraph.create_simple_replacement(hugr, replacement)?))
}
pub fn node_count_delta(&self) -> isize {
let new_count = self.replacement().num_operations() as isize;
let old_count = self.subgraph().node_count() as isize;
new_count - old_count
}
pub fn subgraph(&self) -> &SiblingSubgraph {
self.0.subgraph()
}
pub fn replacement(&self) -> Circuit<&Hugr> {
self.0.replacement().into()
}
#[inline]
pub fn invalidation_set(&self) -> impl Iterator<Item = Node> + '_ {
self.0.invalidation_set()
}
#[inline]
pub fn apply(
self,
circ: &mut Circuit<impl HugrMut<Node = Node>>,
) -> Result<simple_replace::Outcome<Node>, SimpleReplacementError> {
circ.add_rewrite_trace(&self);
self.0.apply(circ.hugr_mut())
}
#[inline]
pub fn apply_notrace(
self,
circ: &mut Circuit<impl HugrMut<Node = Node>>,
) -> Result<simple_replace::Outcome<Node>, SimpleReplacementError> {
self.0.apply(circ.hugr_mut())
}
}
pub trait Rewriter {
fn get_rewrites(&self, circ: &Circuit<impl HugrView<Node = Node>>) -> Vec<CircuitRewrite>;
}