Enum midenc_hir::Type

source ·
pub enum Type {
Show 22 variants Unknown, Unit, Never, I1, I8, U8, I16, U16, I32, U32, I64, U64, I128, U128, U256, F64, Felt, Ptr(Box<Type>), NativePtr(Box<Type>, AddressSpace), Struct(StructType), Array(Box<Type>, usize), List(Box<Type>),
}
Expand description

Represents the type of a value

Variants§

§

Unknown

This indicates a failure to type a value, or a value which is untypable

§

Unit

This type is used to indicate the absence of a value, such as a function which returns nothing

§

Never

This type is the bottom type, and represents divergence, akin to Rust’s Never/! type

§

I1

§

I8

§

U8

§

I16

§

U16

§

I32

§

U32

§

I64

§

U64

§

I128

§

U128

§

U256

§

F64

§

Felt

Field element

§

Ptr(Box<Type>)

A pointer to a value in the default byte-addressable address space used by the IR.

Pointers of this type will be translated to an appropriate address space during code generation.

§

NativePtr(Box<Type>, AddressSpace)

A pointer to a valude in Miden’s native word-addressable address space.

In the type system, we represent the type of the pointee, as well as an address space identifier.

This pointer type is represented on Miden’s operand stack as a u64 value, consisting of two 32-bit elements, the most-significant bits being on top of the stack:

  1. Metadata for the pointer (in the upper 32-bit limb):
  • The least-significant 2 bits represent a zero-based element index (range is 0-3)
  • The next most significant 4 bits represent a zero-based byte index (range is 0-31)
  • The remaining 26 bits represent an address space identifier
  1. The lower 32-bit limb contains the word-aligned address, which forms the base address of the pointer.

Dereferencing a pointer of this type involves popping the pointer metadata, and determining what type of load to issue based on the size of the value being loaded, and where the start of the data is according to the metadata. Then the word-aligned address is popped and the value is loaded.

If the load is naturally aligned, i.e. the element index and byte offset are zero, and the size is exactly one element or word; then a mem_load or mem_loadw are issued and no further action is required. If the load is not naturally aligned, then either one or two words will be loaded, depending on the type being loaded, unused elements will be dropped, and if the byte offset is non-zero, the data will be shifted bitwise into alignment on an element boundary.

§

Struct(StructType)

A compound type of fixed shape and size

§

Array(Box<Type>, usize)

A vector of fixed size

§

List(Box<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.

Implementations§

source§

impl Type

source

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.

source

pub fn split(self, n: usize) -> (Type, Option<Type>)

Split this type into two parts:

  • The first part is no more than n bytes 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.
source

pub fn min_alignment(&self) -> usize

Returns the minimum alignment, in bytes, of this type

source

pub fn size_in_bits(&self) -> usize

Returns the size in bits of this type, without alignment padding.

source

pub fn size_in_bytes(&self) -> usize

Returns the minimum number of bytes required to store a value of this type

source

pub fn aligned_size_in_bytes(&self) -> usize

Same as size_in_bytes, but with sufficient padding to guarantee alignment of the value.

source

pub fn size_in_felts(&self) -> usize

Returns the size in field elements of this type

source

pub fn size_in_words(&self) -> usize

Returns the size in words of this type

source

pub fn layout(&self) -> Layout

Returns the layout of this type in memory

source

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

source

pub fn is_zst(&self) -> bool

Returns true if this type is a zero-sized type, which includes:

  • Types with no size, e.g. Type::Unit
  • Zero-sized arrays
  • Arrays with a zero-sized element type
  • Structs composed of nothing but zero-sized fields
source

pub fn is_numeric(&self) -> bool

source

pub fn is_integer(&self) -> bool

source

pub fn is_signed_integer(&self) -> bool

source

pub fn is_unsigned_integer(&self) -> bool

source

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

source

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

source

pub fn is_float(&self) -> bool

source

pub fn is_felt(&self) -> bool

source

pub fn is_pointer(&self) -> bool

source

pub fn is_struct(&self) -> bool

source

pub fn is_array(&self) -> bool

source

pub fn is_compatible_operand(&self, other: &Type) -> bool

Returns true if self and other are compatible operand types for a binary operator, e.g. add

In short, the rules are as follows:

  • The operand order is assumed to be self <op> other, i.e. op is being applied to self using other. The left-hand operand is used as the “controlling” type for the operator, i.e. it determines what instruction will be used to perform the operation.
  • The operand types must be numeric, or support being manipulated numerically
  • If the controlling type is unsigned, it is never compatible with signed types, because Miden instructions for unsigned types use a simple unsigned binary encoding, thus they will not handle signed operands using two’s complement correctly.
  • If the controlling type is signed, it is compatible with both signed and unsigned types, as long as the values fit in the range of the controlling type, e.g. adding a u16 to an i32 is fine, but adding a u32 to an i32 is not.
  • Pointer types are permitted to be the controlling type, and since they are represented using u32, they have the same compatibility set as u32 does. In all other cases, pointer types are treated the same as any other non-numeric type.
  • Non-numeric types are always incompatible, since no operators support these types
source

pub fn pointee(&self) -> Option<&Type>

Trait Implementations§

source§

impl Clone for Type

source§

fn clone(&self) -> Type

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Type

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Display for Type

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Print this type for display using the provided module context

source§

impl From<&Immediate> for Type

source§

fn from(imm: &Immediate) -> Self

Converts to this type from the input type.
source§

impl From<Immediate> for Type

source§

fn from(imm: Immediate) -> Self

Converts to this type from the input type.
source§

impl From<StructType> for Type

source§

fn from(ty: StructType) -> Type

Converts to this type from the input type.
source§

impl Hash for Type

source§

fn hash<__H>(&self, state: &mut __H)
where __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for Type

source§

fn eq(&self, other: &Type) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl StackElement for Type

§

type Debug = Type

source§

const DEFAULT: Self = Type::Felt

A value of this type which represents the “zero” value for the type
source§

fn debug(&self) -> Self::Debug

Format this stack element for display
source§

impl TryFrom<Type> for StructType

§

type Error = Type

The type returned in the event of a conversion error.
source§

fn try_from( ty: Type, ) -> Result<StructType, <StructType as TryFrom<Type>>::Error>

Performs the conversion.
source§

impl Eq for Type

source§

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> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CallHasher for T
where T: Hash + ?Sized,

source§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64
where H: Hash + ?Sized, B: BuildHasher,

source§

impl<T> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

impl<D> OwoColorize for D

source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text italicized
Make the text blink
Make the text blink (but fast!)
source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more