Something went wrong. Try again.
A cross-platform simulator for the GreenArrays GA144 multi-computer chip.
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165pub const DataStack = struct { t: Word, s: Word, stack: [8]Word, index: u3 = 0,
pub fn push(self: *@This(), value: Word) void { self.stack[self.index] = self.s; self.s = self.t;
self.t = value; self.index +%= 1; }
pub fn pop(self: *@This()) Word { self.index -%= 1; const old_t = self.t; self.t = self.s; self.s = self.stack[self.index];
return old_t; }
pub const empty: DataStack = .{ .stack = @splat(0), .index = 0, .t = 0, .s = 0, };};
pub const ReturnStack = struct { t: Word, stack: [8]Word, index: u3 = 0,
pub fn push(self: *@This(), value: Word) void { self.stack[self.index] = self.t;
self.t = value; self.index +%= 1; }
pub fn pop(self: *@This()) Word { self.index -%= 1; const old_t = self.t; self.t = self.stack[self.index];
return old_t; }
pub const empty: ReturnStack = .{ .stack = @splat(0), .index = 0, .t = 0, };};
test "DataStack works" { var stack: DataStack = .empty;
// initalized to zeroes try expectEqual(stack.index, 0); try expectEqual(0, stack.t); try expectEqual(0, stack.s);
// push stack.push(55); try expectEqual(55, stack.t); try expectEqual(0, stack.s); try expectEqual(1, stack.index); try expectEqual(0, stack.stack[0]);
stack.push(123); try expectEqual(123, stack.t); try expectEqual(55, stack.s); try expectEqual(2, stack.index); try expectEqual(0, stack.stack[0]);
stack.push(999); try expectEqual(999, stack.t); try expectEqual(123, stack.s); try expectEqual(3, stack.index); try expectEqual(55, stack.stack[stack.index - 1]);
// pop _ = stack.pop();
try expectEqual(123, stack.pop()); try expectEqual(55, stack.t); try expectEqual(0, stack.s);
try expectEqual(55, stack.pop()); try expectEqual(0, stack.index); try expectEqual(0, stack.t); try expectEqual(0, stack.s);
inline for (0..10) |i| { stack.push(i); } try expectEqual(2, stack.index);
try expectEqual(9, stack.pop()); try expectEqual(1, stack.index);
stack.push(123); try expectEqual(2, stack.index); try expectEqual(123, stack.pop()); try expectEqual(1, stack.index);
try expectEqual(8, stack.pop());
for (0..7) |_| { _ = stack.pop(); }
try expectEqual(1, stack.index); try expectEqual(0, stack.pop());}
test ReturnStack { var stack: ReturnStack = .empty;
// initalized to zeroes try expectEqual(stack.index, 0); try expectEqual(0, stack.t);
// push stack.push(55); try expectEqual(55, stack.t); try expectEqual(1, stack.index); try expectEqual(0, stack.stack[0]);
stack.push(123); try expectEqual(123, stack.t); try expectEqual(2, stack.index); try expectEqual(55, stack.stack[stack.index - 1]);
// pop try expectEqual(123, stack.pop()); try expectEqual(0, stack.stack[stack.index - 1]);
try expectEqual(55, stack.pop()); try expectEqual(0, stack.index); try expectEqual(0, stack.t);
// circular stack stack.push(123); stack.push(123); for (0..31) |_| { stack.push(0x15555); }
for (0..31) |_| { _ = stack.pop(); } try expectEqual(0x15555, stack.pop());}
const f18 = @import("f18.zig");const Word = f18.Word;
const std = @import("std");const expectEqual = std.testing.expectEqual;