add adts to type system
This commit is contained in:
parent
c0be718bbc
commit
86e3bf4d32
|
@ -25,10 +25,8 @@ enum TypeKind {
|
||||||
ElabType(ElabKind),
|
ElabType(ElabKind),
|
||||||
/// Signal/Wire of generic width
|
/// Signal/Wire of generic width
|
||||||
Logic(ElabData),
|
Logic(ElabData),
|
||||||
/// UInt of generic width
|
/// User-defined ADT
|
||||||
UInt(ElabData),
|
Adt(Adt),
|
||||||
/// Callable
|
|
||||||
Callable(FnSig),
|
|
||||||
/// A type that was not given and needs to be inferred
|
/// A type that was not given and needs to be inferred
|
||||||
Infer,
|
Infer,
|
||||||
/// A reference to a type variable as DeBruijn index
|
/// A reference to a type variable as DeBruijn index
|
||||||
|
@ -37,9 +35,13 @@ enum TypeKind {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct FnSig {
|
pub enum Adt {
|
||||||
params: Vec<Type>,
|
Struct(Struct),
|
||||||
ret: Type,
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Struct {
|
||||||
|
members: Vec<Type>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
@ -182,8 +184,7 @@ impl TypingContext {
|
||||||
ElabValueData::Bytes(_) => None,
|
ElabValueData::Bytes(_) => None,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
TypeKind::UInt(_) => todo!(),
|
TypeKind::Adt(_) => todo!("calculate struct width"),
|
||||||
TypeKind::Callable(_) => None,
|
|
||||||
TypeKind::Infer => None,
|
TypeKind::Infer => None,
|
||||||
TypeKind::TypeVar(_, _) => None,
|
TypeKind::TypeVar(_, _) => None,
|
||||||
}
|
}
|
||||||
|
@ -214,8 +215,7 @@ impl TypingContext {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TypeKind::UInt(_) => todo!(),
|
TypeKind::Adt(_) => todo!("can not parameterize struct"),
|
||||||
TypeKind::Callable(_sig) => todo!("callable generic params"),
|
|
||||||
// need to know what the type is to parameterize it
|
// need to know what the type is to parameterize it
|
||||||
TypeKind::Infer | &TypeKind::TypeVar(_, _) => None,
|
TypeKind::Infer | &TypeKind::TypeVar(_, _) => None,
|
||||||
}
|
}
|
||||||
|
@ -248,8 +248,7 @@ impl TypingContext {
|
||||||
TypeKind::Logic(data) => {
|
TypeKind::Logic(data) => {
|
||||||
matches!(data.value, ElabValue::Concrete(_))
|
matches!(data.value, ElabValue::Concrete(_))
|
||||||
}
|
}
|
||||||
TypeKind::UInt(_) => todo!(),
|
TypeKind::Adt(_) => todo!("adt fully typed"),
|
||||||
TypeKind::Callable(_) => todo!(),
|
|
||||||
TypeKind::Infer => false,
|
TypeKind::Infer => false,
|
||||||
TypeKind::TypeVar(dbi, _tvar) => {
|
TypeKind::TypeVar(dbi, _tvar) => {
|
||||||
// if the DeBruijn index is 0, there is no further information to gain
|
// if the DeBruijn index is 0, there is no further information to gain
|
||||||
|
@ -283,9 +282,8 @@ impl TypingContext {
|
||||||
self.pretty_value(&mut width, val)?;
|
self.pretty_value(&mut width, val)?;
|
||||||
write!(w, "Logic<{}>", width)
|
write!(w, "Logic<{}>", width)
|
||||||
}
|
}
|
||||||
|
TypeKind::Adt(_) => write!(w, "Struct{{...}}"),
|
||||||
TypeKind::Infer => write!(w, "?"),
|
TypeKind::Infer => write!(w, "?"),
|
||||||
TypeKind::UInt(_) => todo!("print uint"),
|
|
||||||
TypeKind::Callable(_sig) => todo!("print callable"),
|
|
||||||
TypeKind::TypeVar(_, tvar) => write!(w, "T{}", tvar),
|
TypeKind::TypeVar(_, tvar) => write!(w, "T{}", tvar),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue