aboutsummaryrefslogtreecommitdiff
path: root/tests/simple_grid3d/test.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2025-02-23 22:21:50 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2025-02-23 22:21:50 +0200
commit238116c1cf08b93335abd493df110a669786553e (patch)
tree24ca4af1140f9bb6d8d1e9836ed2bd8ec4668f68 /tests/simple_grid3d/test.c
parent00ea50354b38c6cd9ebb08c8141f48dd5392cd23 (diff)
downloadgran-238116c1cf08b93335abd493df110a669786553e.tar.gz
gran-238116c1cf08b93335abd493df110a669786553e.zip
3d mesh
Diffstat (limited to 'tests/simple_grid3d/test.c')
-rw-r--r--tests/simple_grid3d/test.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/simple_grid3d/test.c b/tests/simple_grid3d/test.c
new file mode 100644
index 0000000..2953d41
--- /dev/null
+++ b/tests/simple_grid3d/test.c
@@ -0,0 +1,61 @@
+__attribute__((always_inline))
+static inline void print_int8(volatile char *uart, unsigned x)
+{
+ *uart = ((x >> 4) & 0xf) + '0';
+ *uart = ((x >> 0) & 0xf) + '0';
+}
+
+__attribute__((always_inline))
+static inline void print_addr(volatile char *uart, unsigned x, unsigned y, unsigned z)
+{
+ *uart = '(';
+ print_int8(uart, x);
+ *uart = ',';
+ *uart = ' ';
+ print_int8(uart, y);
+ *uart = ',';
+ *uart = ' ';
+ print_int8(uart, z);
+ *uart = ')';
+ *uart = '\n';
+}
+
+__attribute__((always_inline))
+static inline unsigned wrap(unsigned x, unsigned X)
+{
+ return x + 1 >= X ? 0 : x + 1;
+}
+
+__attribute__((always_inline))
+static inline unsigned next_idx(unsigned x, unsigned y, unsigned z, unsigned X, unsigned Y, unsigned Z)
+{
+ unsigned zi = wrap(z, Z);
+ unsigned yi = zi < z ? wrap(y, Y) : y;
+ unsigned xi = yi < y ? wrap(x, X) : x;
+
+ return (xi << 16) | (yi << 8) | zi;
+}
+
+void _start(unsigned x, unsigned y, unsigned z, unsigned X, unsigned Y, unsigned Z)
+{
+ volatile char *uart = (char *)4096;
+ /* x = 1ULL << 32, y = 1ULL << 40, z = 1ULL << 48 I guess */
+ volatile unsigned *control = (unsigned *)(1ULL << 48);
+
+
+ if (x == 0 && y == 0 && z == 2) {
+ goto do_work;
+ } else {
+ while (*control != ((x << 16) | (y << 8) | z)) {}
+ }
+
+do_work:
+ print_addr(uart, x, y, z);
+ *control = next_idx(x, y, z, X, Y, Z);
+
+ if (x == X - 1 && y == Y - 1 && z == Z - 1)
+ asm("ebreak");
+
+ /* otherwise just loop */
+ while (1) {}
+}