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}
19
20impl crate::prettier::PrettyPrint for DebugOptions {
21    fn render(&self) -> crate::prettier::Document {
22        crate::prettier::display(self)
23    }
24}
25
26impl TryFrom<DebugOptions> for vm_core::DebugOptions {
27    type Error = ();
28
29    fn try_from(options: DebugOptions) -> Result<Self, Self::Error> {
30        match options {
31            DebugOptions::StackAll => Ok(Self::StackAll),
32            DebugOptions::StackTop(ImmU8::Value(n)) => Ok(Self::StackTop(n.into_inner())),
33            DebugOptions::MemAll => Ok(Self::MemAll),
34            DebugOptions::MemInterval(ImmU32::Value(start), ImmU32::Value(end)) => {
35                Ok(Self::MemInterval(start.into_inner(), end.into_inner()))
36            },
37            DebugOptions::LocalInterval(ImmU16::Value(start), ImmU16::Value(end)) => {
38                let start = start.into_inner();
39                let end = end.into_inner();
40                Ok(Self::LocalInterval(start, end, end - start))
41            },
42            _ => Err(()),
43        }
44    }
45}
46
47impl fmt::Display for DebugOptions {
48    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
49        match self {
50            Self::StackAll => write!(f, "stack"),
51            Self::StackTop(n) => write!(f, "stack.{n}"),
52            Self::MemAll => write!(f, "mem"),
53            Self::MemInterval(n, m) => write!(f, "mem.{n}.{m}"),
54            Self::LocalAll => write!(f, "local"),
55            Self::LocalRangeFrom(start) => write!(f, "local.{start}"),
56            Self::LocalInterval(start, end) => {
57                write!(f, "local.{start}.{end}")
58            },
59        }
60    }
61}