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}