haloumi-ir 0.5.11

Intermediate representation of the haloumi framework.
Documentation
use eqv::EqvRelation;
use haloumi_core::{eqv::SymbolicEqv, slot::Slot};
use haloumi_lowering::{Lowering, lowerable::LowerableStmt};

pub struct AssumeDeterministic(Slot);

impl AssumeDeterministic {
    pub fn new(f: Slot) -> Self {
        Self(f)
    }

    pub fn value(&self) -> Slot {
        self.0
    }

    pub fn value_mut(&mut self) -> &mut Slot {
        &mut self.0
    }
}

impl LowerableStmt for AssumeDeterministic {
    fn lower<L>(self, l: &L) -> haloumi_lowering::Result<()>
    where
        L: Lowering + ?Sized,
    {
        l.generate_assume_deterministic(self.0)
    }
}

impl Clone for AssumeDeterministic {
    fn clone(&self) -> Self {
        Self(self.0)
    }
}

impl PartialEq for AssumeDeterministic {
    fn eq(&self, other: &Self) -> bool {
        self.0 == other.0
    }
}

impl std::fmt::Debug for AssumeDeterministic {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "assume-deterministic {:?}", self.0)
    }
}

impl EqvRelation<AssumeDeterministic, AssumeDeterministic> for SymbolicEqv
where
    SymbolicEqv: EqvRelation<Slot, Slot>,
{
    fn equivalent(lhs: &AssumeDeterministic, rhs: &AssumeDeterministic) -> bool {
        SymbolicEqv::equivalent(&lhs.0, &rhs.0)
    }
}