use core::fmt::Debug;
use strict_encoding::stl::AlphaCapsNum;
use strict_encoding::{RString, StrictDumb};
use super::CtrlInstr;
use crate::core::SiteId;
use crate::LIB_NAME_ALUVM;
pub const ISA_ID_MAX_LEN: usize = 16;
#[macro_export]
macro_rules! isa {
($id:literal) => {
$crate::IsaId::from($id)
};
($id:ident) => {
$crate::IsaId::from($id)
};
}
#[derive(Wrapper, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)]
#[wrapper(Deref, Display, FromStr)]
#[derive(StrictType, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_ALUVM)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(transparent))]
pub struct IsaId(RString<AlphaCapsNum, AlphaCapsNum, 1, ISA_ID_MAX_LEN>);
impl StrictDumb for IsaId {
fn strict_dumb() -> Self { Self::from("DUMB") }
}
impl From<&'static str> for IsaId {
fn from(id: &'static str) -> Self { Self(RString::from(id)) }
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display)]
#[display("halt {0:#02X}.h")]
pub struct ReservedInstr( pub(super) u8);
impl Default for ReservedInstr {
fn default() -> Self { Self(0xFF) }
}
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Display, From)]
#[display(inner)]
pub enum Instr<Id: SiteId> {
#[from]
Ctrl(CtrlInstr<Id>),
#[from]
Reserved(ReservedInstr),
}