wire4/
lib.rs

1#![no_std]
2use hash32::{Hasher, Murmur3Hasher};
3use heapless::{self, consts, LinearMap, Vec};
4
5mod compiler;
6pub mod spool;
7mod vm;
8
9pub use compiler::*;
10pub use vm::*;
11
12pub type Prog = Vec<Word, consts::U512>;
13pub type Stack = Vec<Value, consts::U32>;
14pub type ScopeStack = Vec<Scope, consts::U16>;
15pub type VTable = LinearMap<u32, (usize, usize), consts::U16>;
16pub type Vars = LinearMap<u32, Value, consts::U16>;
17pub type SpoolData = LinearMap<u32, String, consts::U32>;
18pub type String = heapless::String<consts::U12>;
19
20#[derive(Debug, PartialEq)]
21pub enum VMError {
22    CompileError(CompileError),
23    InvalidArguments(Word),
24    ProgramHalted,
25    DivisionByZero,
26    StackOverflow,
27    StackUnderflow,
28    UnknownVar,
29    InvalidScope,
30    InvalidPtr,
31    TooManyVars,
32}
33
34#[derive(Debug, PartialEq, Clone)]
35pub enum Value {
36    Num(i32),
37    Str(u32),
38    Var(u32),
39    Net(u32),
40    Port(u32),
41}
42
43#[derive(Debug, PartialEq)]
44pub enum VMRequest {
45    Idle,
46    CallProc(u32),
47    IO(IO),
48}
49
50#[derive(Debug, PartialEq, Clone)]
51pub enum IO {
52    Clear,
53    PrintChar,
54    PrintStack,
55    PrintTop,
56    PrintVar,
57    ReadChar,
58    ReadVal,
59    Space,
60    Spaces,
61    Cr,
62    Nl,
63}
64
65#[derive(Debug, PartialEq, Clone)]
66pub enum Word {
67    NumImm(i32),
68    StrImm(u32),
69    VarImm(u32),
70    NetImm(u32),
71    PortImm(u32),
72    Proc(u32),
73    Call(u32),
74    IO(IO),
75    Ret,
76    Drop,
77    Dup,
78    Swap,
79    Over,
80    Nip,
81    Tuck,
82    Rot,
83    RRot,
84    Inc,
85    Dec,
86    Plus,
87    Minus,
88    Mul,
89    Div,
90    Mod,
91    And,
92    Or,
93    Xor,
94    Invert,
95    Lt,
96    Gt,
97    Lte,
98    Gte,
99    Eq,
100    NotEq,
101    EqZero,
102    NotEqZero,
103    LtZero,
104    GtZero,
105    SetVar,
106    GetVar,
107    If,
108    Then,
109    Else,
110    Begin,
111    Until,
112    Do,
113    I,
114    Loop,
115}
116
117pub fn hash_str(string: &str) -> u32 {
118    let mut hasher = Murmur3Hasher::default();
119    hasher.write(&string.as_bytes());
120    hasher.finish()
121}
122
123pub fn bool_enc(val: bool) -> i32 {
124    if val {
125        -1
126    } else {
127        0
128    }
129}