spade_typeinference/
fixed_types.rs

1use spade_common::{
2    location_info::{Loc, WithLocation},
3    name::Path,
4};
5use spade_hir::symbol_table::SymbolTable;
6use spade_types::KnownType;
7
8use crate::{
9    equation::{TypeVar, TypeVarID},
10    TypeState,
11};
12
13fn lookup(symtab: &SymbolTable, name: &[&str]) -> KnownType {
14    let path = Path::from_strs(name);
15    KnownType::Named(
16        symtab
17            .lookup_type_symbol(&path.clone().nowhere())
18            .unwrap_or_else(|_| {
19                panic!(
20                    "{} not found. Was the symtab not populated with externs?",
21                    path
22                )
23            })
24            .0,
25    )
26}
27
28impl TypeState {
29    pub fn t_int(&mut self, loc: Loc<()>, symtab: &SymbolTable) -> TypeVarID {
30        self.add_type_var(TypeVar::Known(loc, t_int(symtab), vec![]))
31    }
32    pub fn t_uint(&mut self, loc: Loc<()>, symtab: &SymbolTable) -> TypeVarID {
33        self.add_type_var(TypeVar::Known(loc, t_uint(symtab), vec![]))
34    }
35    pub fn t_tri(&mut self, loc: Loc<()>, symtab: &SymbolTable) -> TypeVarID {
36        self.add_type_var(TypeVar::Known(loc, t_tri(symtab), vec![]))
37    }
38    pub fn t_bool(&mut self, loc: Loc<()>, symtab: &SymbolTable) -> TypeVarID {
39        self.add_type_var(TypeVar::Known(loc, t_bool(symtab), vec![]))
40    }
41    pub fn t_clock(&mut self, loc: Loc<()>, symtab: &SymbolTable) -> TypeVarID {
42        self.add_type_var(TypeVar::Known(loc, t_clock(symtab), vec![]))
43    }
44
45    pub fn t_err(&mut self, loc: Loc<()>) -> TypeVarID {
46        self.add_type_var(TypeVar::Known(loc, KnownType::Error, vec![]))
47    }
48}
49
50pub fn t_int(symtab: &SymbolTable) -> KnownType {
51    lookup(symtab, &["int"])
52}
53pub fn t_uint(symtab: &SymbolTable) -> KnownType {
54    lookup(symtab, &["uint"])
55}
56pub fn t_tri(symtab: &SymbolTable) -> KnownType {
57    lookup(symtab, &["tri"])
58}
59pub fn t_bool(symtab: &SymbolTable) -> KnownType {
60    lookup(symtab, &["bool"])
61}
62pub fn t_clock(symtab: &SymbolTable) -> KnownType {
63    lookup(symtab, &["clock"])
64}