aboutsummaryrefslogtreecommitdiffstats
path: root/high-level-lang-idea.perl
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2023-04-08 17:20:32 +0300
committerJan Tuomi <jans.tuomi@gmail.com>2023-04-08 17:20:32 +0300
commit5ab9865fa6ed343ae0cffefb81b20af2e533e36f (patch)
tree57949a3b8335cdf58234e366e50701a19bd6c21d /high-level-lang-idea.perl
parent10e0c53890701abe53c80f1da4a0b64bbd05914c (diff)
Move from logisim to digital
Diffstat (limited to 'high-level-lang-idea.perl')
-rw-r--r--high-level-lang-idea.perl36
1 files changed, 36 insertions, 0 deletions
diff --git a/high-level-lang-idea.perl b/high-level-lang-idea.perl
new file mode 100644
index 0000000..426cae8
--- /dev/null
+++ b/high-level-lang-idea.perl
@@ -0,0 +1,36 @@
+# Builtin types:
+# u8, u16, i8, i16, block[T], void
+
+# allocate 16 words, returning block
+# a block is similar to a C pointer but contains the allocated size as well
+decl v :: block[u16] = alloc-words 16
+
+# define a fn that zeroes a block of memory
+decl zero-block :: block[u16] -> void
+func zero-block block
+ # for each address in block
+ for-addr addr block
+ # store the value 0 in memory at address addr
+ store addr 0
+
+# call fn zero-block in inlined mode
+zero-block% v
+
+# compute first 16 fibonacci numbers
+decl a :: u16 = 0
+decl b :: u16 = 1
+for-index idx block
+ # declarations in loop constructs are hoisted
+ decl addr :: u16 = addr-at idx block
+ decl v :: u16
+
+ if idx == 0
+ v = a
+ else if idx == 1
+ v = b
+ else
+ v = a + b
+
+ store addr v
+ a = b
+ b = v