lift-core 0.4.3

LIFT compiler framework core: unified SSA intermediate representation (IR) for AI and quantum — types, values, operations, blocks, regions, verifier
Documentation
use std::collections::HashMap;
pub trait Dialect: std::fmt::Debug {
    fn name(&self) -> &str;
    fn verify_op(&self, op_name: &str, num_inputs: usize, num_results: usize)
        -> Result<(), String>;
}

#[derive(Debug, Default)]
pub struct DialectRegistry {
    dialects: HashMap<String, Box<dyn Dialect>>,
}

impl DialectRegistry {
    pub fn new() -> Self {
        Self::default()
    }

    pub fn register(&mut self, dialect: Box<dyn Dialect>) {
        self.dialects.insert(dialect.name().to_string(), dialect);
    }

    pub fn get(&self, name: &str) -> Option<&dyn Dialect> {
        self.dialects.get(name).map(|d| d.as_ref())
    }

    pub fn has(&self, name: &str) -> bool {
        self.dialects.contains_key(name)
    }

    pub fn names(&self) -> Vec<&str> {
        self.dialects.keys().map(|s| s.as_str()).collect()
    }
}

#[derive(Debug)]
pub struct CoreDialect;

impl Dialect for CoreDialect {
    fn name(&self) -> &str {
        "core"
    }

    fn verify_op(
        &self,
        op_name: &str,
        _num_inputs: usize,
        _num_results: usize,
    ) -> Result<(), String> {
        match op_name {
            "core.constant" | "core.return" | "core.call" | "core.br" | "core.cond_br" => Ok(()),
            _ => Err(format!("Unknown core operation: {}", op_name)),
        }
    }
}

pub fn register_builtin_dialects(registry: &mut DialectRegistry) {
    registry.register(Box::new(CoreDialect));
}