Skip to main content

lift_core/
dialect.rs

1use std::collections::HashMap;
2pub trait Dialect: std::fmt::Debug {
3    fn name(&self) -> &str;
4    fn verify_op(&self, op_name: &str, num_inputs: usize, num_results: usize)
5        -> Result<(), String>;
6}
7
8#[derive(Debug, Default)]
9pub struct DialectRegistry {
10    dialects: HashMap<String, Box<dyn Dialect>>,
11}
12
13impl DialectRegistry {
14    pub fn new() -> Self {
15        Self::default()
16    }
17
18    pub fn register(&mut self, dialect: Box<dyn Dialect>) {
19        self.dialects.insert(dialect.name().to_string(), dialect);
20    }
21
22    pub fn get(&self, name: &str) -> Option<&dyn Dialect> {
23        self.dialects.get(name).map(|d| d.as_ref())
24    }
25
26    pub fn has(&self, name: &str) -> bool {
27        self.dialects.contains_key(name)
28    }
29
30    pub fn names(&self) -> Vec<&str> {
31        self.dialects.keys().map(|s| s.as_str()).collect()
32    }
33}
34
35#[derive(Debug)]
36pub struct CoreDialect;
37
38impl Dialect for CoreDialect {
39    fn name(&self) -> &str {
40        "core"
41    }
42
43    fn verify_op(
44        &self,
45        op_name: &str,
46        _num_inputs: usize,
47        _num_results: usize,
48    ) -> Result<(), String> {
49        match op_name {
50            "core.constant" | "core.return" | "core.call" | "core.br" | "core.cond_br" => Ok(()),
51            _ => Err(format!("Unknown core operation: {}", op_name)),
52        }
53    }
54}
55
56pub fn register_builtin_dialects(registry: &mut DialectRegistry) {
57    registry.register(Box::new(CoreDialect));
58}