miden_assembly/ast/instruction/
debug.rs

1use core::fmt;
2
3use crate::ast::{ImmU8, ImmU16, ImmU32};
4
5// DEBUG OPTIONS
6// ================================================================================================
7
8/// A proxy for [vm_core::DebugOptions], but with [super::Immediate] values.
9#[derive(Clone, Debug, Eq, PartialEq)]
10pub enum DebugOptions {
11    StackAll,
12    StackTop(ImmU8),
13    MemAll,
14    MemInterval(ImmU32, ImmU32),
15    LocalInterval(ImmU16, ImmU16),
16    LocalRangeFrom(ImmU16),
17    LocalAll,
18    AdvStackTop(ImmU16),
19}
20
21impl crate::prettier::PrettyPrint for DebugOptions {
22    fn render(&self) -> crate::prettier::Document {
23        crate::prettier::display(self)
24    }
25}
26
27impl TryFrom<DebugOptions> for vm_core::DebugOptions {
28    type Error = ();
29
30    fn try_from(options: DebugOptions) -> Result<Self, Self::Error> {
31        match options {
32            DebugOptions::StackAll => Ok(Self::StackAll),
33            DebugOptions::StackTop(ImmU8::Value(n)) => Ok(Self::StackTop(n.into_inner())),
34            DebugOptions::MemAll => Ok(Self::MemAll),
35            DebugOptions::MemInterval(ImmU32::Value(start), ImmU32::Value(end)) => {
36                Ok(Self::MemInterval(start.into_inner(), end.into_inner()))
37            },
38            DebugOptions::LocalInterval(ImmU16::Value(start), ImmU16::Value(end)) => {
39                let start = start.into_inner();
40                let end = end.into_inner();
41                Ok(Self::LocalInterval(start, end, end - start))
42            },
43            DebugOptions::AdvStackTop(ImmU16::Value(n)) => Ok(Self::AdvStackTop(n.into_inner())),
44            _ => Err(()),
45        }
46    }
47}
48
49impl fmt::Display for DebugOptions {
50    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
51        match self {
52            Self::StackAll => write!(f, "stack"),
53            Self::StackTop(n) => write!(f, "stack.{n}"),
54            Self::MemAll => write!(f, "mem"),
55            Self::MemInterval(n, m) => write!(f, "mem.{n}.{m}"),
56            Self::LocalAll => write!(f, "local"),
57            Self::LocalRangeFrom(start) => write!(f, "local.{start}"),
58            Self::LocalInterval(start, end) => {
59                write!(f, "local.{start}.{end}")
60            },
61            Self::AdvStackTop(n) => write!(f, "adv_stack.{n}"),
62        }
63    }
64}