spade_typeinference/
fixed_types.rs

1use spade_common::{
2    location_info::{Loc, WithLocation},
3    name::{Identifier, 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(
15        name.iter()
16            .map(|s| Identifier(s.to_string()).nowhere())
17            .collect(),
18    );
19    KnownType::Named(
20        symtab
21            .lookup_type_symbol(&path.clone().nowhere())
22            .unwrap_or_else(|_| {
23                panic!(
24                    "{} not found. Was the symtab not populated with externs?",
25                    path
26                )
27            })
28            .0,
29    )
30}
31
32impl TypeState {
33    pub fn t_int(&mut self, loc: Loc<()>, symtab: &SymbolTable) -> TypeVarID {
34        self.add_type_var(TypeVar::Known(loc, t_int(symtab), vec![]))
35    }
36    pub fn t_uint(&mut self, loc: Loc<()>, symtab: &SymbolTable) -> TypeVarID {
37        self.add_type_var(TypeVar::Known(loc, t_uint(symtab), vec![]))
38    }
39    pub fn t_tri(&mut self, loc: Loc<()>, symtab: &SymbolTable) -> TypeVarID {
40        self.add_type_var(TypeVar::Known(loc, t_tri(symtab), vec![]))
41    }
42    pub fn t_bool(&mut self, loc: Loc<()>, symtab: &SymbolTable) -> TypeVarID {
43        self.add_type_var(TypeVar::Known(loc, t_bool(symtab), vec![]))
44    }
45    pub fn t_clock(&mut self, loc: Loc<()>, symtab: &SymbolTable) -> TypeVarID {
46        self.add_type_var(TypeVar::Known(loc, t_clock(symtab), vec![]))
47    }
48
49    pub fn t_err(&mut self, loc: Loc<()>) -> TypeVarID {
50        self.add_type_var(TypeVar::Known(loc, KnownType::Error, vec![]))
51    }
52}
53
54pub fn t_int(symtab: &SymbolTable) -> KnownType {
55    lookup(symtab, &["int"])
56}
57pub fn t_uint(symtab: &SymbolTable) -> KnownType {
58    lookup(symtab, &["uint"])
59}
60pub fn t_tri(symtab: &SymbolTable) -> KnownType {
61    lookup(symtab, &["tri"])
62}
63pub fn t_bool(symtab: &SymbolTable) -> KnownType {
64    lookup(symtab, &["bool"])
65}
66pub fn t_clock(symtab: &SymbolTable) -> KnownType {
67    lookup(symtab, &["clock"])
68}