Add higherordercpu and matrix multiplication examples
[matthijs/master-project/cλash.git] / HigherOrderCPU.hs
1 {-# LANGUAGE TemplateHaskell #-}
2
3 module HigherOrderCPU where
4
5 -- hide default prelude functions
6 import qualified Prelude as P
7
8 -- import CλaSH specific types
9 import CLasH.HardwareTypes
10 import CLasH.Translator.Annotations
11
12 type CpuState = State (Vector D4 (Signed D16))
13
14 fu op inputs (a1, a2) = 
15   op (inputs!a1) (inputs!a2)
16
17 fu1 = fu (+)
18 fu2 = fu (-)
19 fu3 = fu (*)
20
21 data Opcode = Shift | Xor | Equal
22
23 multiop Shift   = shift
24 multiop Xor     = xor
25 multiop Equal   = \a b -> if a == b then 1 else 0
26
27 fu0 c = fu (multiop c)
28
29 {-# ANN cpu TopEntity #-}
30 {-# ANN cpu (InitState 'cpuState) #-}
31 cpu :: CpuState 
32   -> (Signed D16, Opcode, Vector D4 (Index D7, Index D7))
33   -> (CpuState, Signed D16)
34 cpu (State s) (x,opc,addrs) = (State s', out)
35   where
36     inputs  = x +> (0 +> (1 +> s))
37     s'      = (fu0 opc inputs (addrs!0)) +> (
38               (fu1     inputs (addrs!1)) +> (
39               (fu2     inputs (addrs!2)) +> (
40               (fu3     inputs (addrs!3)) +> empty)))
41     out     = last s
42
43
44
45
46
47
48
49 -- Some minor details
50 cpuState :: Vector D4 (Signed D16)
51 cpuState = copy 0
52
53 const a b = a
54 xor = const
55 shift = const