prjunnamed_generic/rewrite/
normalize.rs

1use prjunnamed_netlist::{Cell, MetaItemRef, RewriteResult, RewriteRuleset, Rewriter, Value};
2
3pub struct Normalize;
4
5impl RewriteRuleset for Normalize {
6    fn rewrite<'a>(
7        &self,
8        cell: &Cell,
9        _meta: MetaItemRef<'a>,
10        _output: Option<&Value>,
11        _rewriter: &Rewriter<'a>,
12    ) -> RewriteResult<'a> {
13        let _ = _output;
14        match cell {
15            Cell::Buf(val) => val.clone().into(),
16            Cell::And(val1, val2) if val1 > val2 => RewriteResult::Cell(Cell::And(val2.clone(), val1.clone())),
17            Cell::Or(val1, val2) if val1 > val2 => RewriteResult::Cell(Cell::Or(val2.clone(), val1.clone())),
18            Cell::Xor(val1, val2) if val1 > val2 => RewriteResult::Cell(Cell::Xor(val2.clone(), val1.clone())),
19            Cell::Adc(val1, val2, net) if val1 > val2 => {
20                RewriteResult::Cell(Cell::Adc(val2.clone(), val1.clone(), *net))
21            }
22            Cell::Aig(net1, net2) if net1 > net2 => RewriteResult::Cell(Cell::Aig(*net2, *net1)),
23            Cell::Eq(val1, val2) if val1 > val2 => RewriteResult::Cell(Cell::Eq(val2.clone(), val1.clone())),
24            Cell::Mul(val1, val2) if val1 > val2 => RewriteResult::Cell(Cell::Mul(val2.clone(), val1.clone())),
25            _ => RewriteResult::None,
26        }
27    }
28}