pub enum Type {
Show 21 variants
Unknown,
Never,
I1,
I8,
U8,
I16,
U16,
I32,
U32,
I64,
U64,
I128,
U128,
U256,
F64,
Felt,
Ptr(Arc<PointerType>),
Struct(Arc<StructType>),
Array(Arc<ArrayType>),
List(Arc<Type>),
Function(Arc<FunctionType>),
}Expand description
Represents the type of a value in the HIR type system
Variants§
Unknown
This indicates a failure to type a value, or a value which is untypable
Never
This type is the bottom type, and represents divergence, akin to Rust’s Never/! type
I1
A 1-bit integer, i.e. a boolean value.
When the bit is 1, the value is true; 0 is false.
I8
An 8-bit signed integer.
U8
An 8-bit unsigned integer.
I16
A 16-bit signed integer.
U16
A 16-bit unsigned integer.
I32
A 32-bit signed integer.
U32
A 32-bit unsigned integer.
I64
A 64-bit signed integer.
U64
A 64-bit unsigned integer.
I128
A 128-bit signed integer.
U128
A 128-bit unsigned integer.
U256
A 256-bit unsigned integer.
F64
A 64-bit IEEE-754 floating-point value.
NOTE: These are currently unsupported in practice, but is reserved here for future use.
Felt
A field element corresponding to the native Miden field (currently the Goldilocks field)
Ptr(Arc<PointerType>)
A pointer to a value in a byte-addressable address space.
Pointers of this type are not equivalent to element addresses as referred to in the Miden Assembly documentation, but do have a straightforward conversion.
Struct(Arc<StructType>)
A compound type of fixed shape and size
Array(Arc<ArrayType>)
A vector of fixed size
List(Arc<Type>)
A dynamically sized list of values of the given type
NOTE: Currently this only exists to support the Wasm Canonical ABI, but it has no defined represenation yet, so in practice cannot be used in most places except during initial translation in the Wasm frontend.
Function(Arc<FunctionType>)
A reference to a function with the given type signature
Implementations§
Source§impl Type
impl Type
Sourcepub fn to_raw_parts(self) -> Option<SmallVec<[Type; 4]>>
pub fn to_raw_parts(self) -> Option<SmallVec<[Type; 4]>>
Convert this type into a vector of types corresponding to how this type will be represented in memory.
The largest “part” size is 32 bits, so types that fit in 32 bits remain unchanged. For types larger than 32 bits, they will be broken up into parts that do fit in 32 bits, preserving accurate types to the extent possible. For types smaller than 32 bits, they will be merged into packed structs no larger than 32 bits, to preserve the type information, and make it possible to reason about how to extract parts of the original type.
For an example, a struct of type { *ptr, u8, u8 } will be encoded on the
operand stack as [*ptr, {u8, u8}], where the first value is the 32-bit pointer
field, and the remaining fields are encoded as a 16-bit struct in the second value.
Sourcepub fn split(self, n: usize) -> (Type, Option<Type>)
pub fn split(self, n: usize) -> (Type, Option<Type>)
Split this type into two parts:
- The first part is no more than
nbytes in size, and may contain the type itself if it fits - The second part is None if the first part is smaller than or equal in size to the requested split size
- The second part is Some if there is data left in the original type after the split. This part will be a type that attempts to preserve, to the extent possible, the original type structure, but will fall back to an array of bytes if a larger type must be split down the middle somewhere.
Sourcepub fn min_alignment(&self) -> usize
pub fn min_alignment(&self) -> usize
Returns the minimum alignment, in bytes, of this type
Sourcepub fn size_in_bits(&self) -> usize
pub fn size_in_bits(&self) -> usize
Returns the size in bits of this type, without alignment padding.
Sourcepub fn size_in_bytes(&self) -> usize
pub fn size_in_bytes(&self) -> usize
Returns the minimum number of bytes required to store a value of this type
Sourcepub fn aligned_size_in_bytes(&self) -> usize
pub fn aligned_size_in_bytes(&self) -> usize
Same as size_in_bytes, but with sufficient padding to guarantee alignment of the value.
Sourcepub fn size_in_felts(&self) -> usize
pub fn size_in_felts(&self) -> usize
Returns the size in field elements of this type
Sourcepub fn size_in_words(&self) -> usize
pub fn size_in_words(&self) -> usize
Returns the size in words of this type
Sourcepub fn is_loadable(&self) -> bool
pub fn is_loadable(&self) -> bool
Returns true if this type can be loaded on to the operand stack
The rule for “loadability” is a bit arbitrary, but the purpose is to force users of the IR to either pass large values by reference, or calculate the addresses of the individual fields needed from a large structure or array, and issue loads/stores against those instead.
In effect, we reject loads of values that are larger than a single word, as that is the largest value which can be worked with on the operand stack of the Miden VM.
Source§impl Type
impl Type
Sourcepub fn is_zst(&self) -> bool
pub fn is_zst(&self) -> bool
Returns true if this type is a zero-sized type, which includes:
- Types with no size, e.g.
Never - Zero-sized arrays
- Arrays with a zero-sized element type
- Structs composed of nothing but zero-sized fields
Sourcepub fn is_numeric(&self) -> bool
pub fn is_numeric(&self) -> bool
Returns true if this type is any numeric type
Sourcepub fn is_integer(&self) -> bool
pub fn is_integer(&self) -> bool
Returns true if this type is any integral type
Sourcepub fn is_signed_integer(&self) -> bool
pub fn is_signed_integer(&self) -> bool
Returns true if this type is any signed integral type
Sourcepub fn is_unsigned_integer(&self) -> bool
pub fn is_unsigned_integer(&self) -> bool
Returns true if this type is any unsigned integral type
Sourcepub fn as_unsigned(&self) -> Type
pub fn as_unsigned(&self) -> Type
Get this type as its unsigned integral twin, e.g. i32 becomes u32.
This function will panic if the type is not an integer type, or has no unsigned representation
Sourcepub fn as_signed(&self) -> Type
pub fn as_signed(&self) -> Type
Get this type as its signed integral twin, e.g. u32 becomes i32.
This function will panic if the type is not an integer type, or has no signed representation
Sourcepub fn is_pointer(&self) -> bool
pub fn is_pointer(&self) -> bool
Returns true if this type is a pointer type
Sourcepub fn pointee(&self) -> Option<&Type>
pub fn pointee(&self) -> Option<&Type>
Returns the type of the pointee, if this type is a pointer type
Sourcepub fn is_list(&self) -> bool
pub fn is_list(&self) -> bool
Returns true if this type is a dynamically-sized vector/list type
Sourcepub fn is_function(&self) -> bool
pub fn is_function(&self) -> bool
Returns true if this type is a function reference type
Trait Implementations§
Source§impl From<FunctionType> for Type
impl From<FunctionType> for Type
Source§fn from(ty: FunctionType) -> Type
fn from(ty: FunctionType) -> Type
Source§impl From<PointerType> for Type
impl From<PointerType> for Type
Source§fn from(ty: PointerType) -> Type
fn from(ty: PointerType) -> Type
Source§impl From<StructType> for Type
impl From<StructType> for Type
Source§fn from(ty: StructType) -> Type
fn from(ty: StructType) -> Type
Source§impl PrettyPrint for Type
impl PrettyPrint for Type
Source§fn to_pretty_string(&self) -> String
fn to_pretty_string(&self) -> String
Source§fn pretty_print(&self, f: &mut Formatter<'_>) -> Result<(), Error>
fn pretty_print(&self, f: &mut Formatter<'_>) -> Result<(), Error>
Source§impl TryFrom<Type> for StructType
impl TryFrom<Type> for StructType
impl Eq for Type
impl StructuralPartialEq for Type
Auto Trait Implementations§
impl Freeze for Type
impl RefUnwindSafe for Type
impl Send for Type
impl Sync for Type
impl Unpin for Type
impl UnwindSafe for Type
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more