Add higherordercpu and matrix multiplication examples
[matthijs/master-project/cλash.git] / HigherOrderCPU.hs
diff --git a/HigherOrderCPU.hs b/HigherOrderCPU.hs
new file mode 100644 (file)
index 0000000..8e3f0da
--- /dev/null
@@ -0,0 +1,55 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module HigherOrderCPU where
+
+-- hide default prelude functions
+import qualified Prelude as P
+
+-- import CλaSH specific types
+import CLasH.HardwareTypes
+import CLasH.Translator.Annotations
+
+type CpuState = State (Vector D4 (Signed D16))
+
+fu op inputs (a1, a2) = 
+  op (inputs!a1) (inputs!a2)
+
+fu1 = fu (+)
+fu2 = fu (-)
+fu3 = fu (*)
+
+data Opcode = Shift | Xor | Equal
+
+multiop Shift   = shift
+multiop Xor     = xor
+multiop Equal   = \a b -> if a == b then 1 else 0
+
+fu0 c = fu (multiop c)
+
+{-# ANN cpu TopEntity #-}
+{-# ANN cpu (InitState 'cpuState) #-}
+cpu :: CpuState 
+  -> (Signed D16, Opcode, Vector D4 (Index D7, Index D7))
+  -> (CpuState, Signed D16)
+cpu (State s) (x,opc,addrs) = (State s', out)
+  where
+    inputs  = x +> (0 +> (1 +> s))
+    s'      = (fu0 opc inputs (addrs!0)) +> (
+              (fu1     inputs (addrs!1)) +> (
+              (fu2     inputs (addrs!2)) +> (
+              (fu3     inputs (addrs!3)) +> empty)))
+    out     = last s
+
+
+
+
+
+
+
+-- Some minor details
+cpuState :: Vector D4 (Signed D16)
+cpuState = copy 0
+
+const a b = a
+xor = const
+shift = const