b9d0da8fc0dba054fad394a4e32e548c42f9154d
[matthijs/master-project/haskell-symposium-talk.git] / PolyAlu.hs
1 {-# LINE 4 "PolyAlu.lhs" #-}
2 {-#  LANGUAGE  TypeOperators, TypeFamilies, FlexibleContexts  #-}
3 module Main where
4
5 import CLasH.HardwareTypes
6 import CLasH.Translator.Annotations
7 import qualified Prelude as P
8 {-# LINE 52 "PolyAlu.lhs" #-}
9 type Op a         =   a -> a -> a
10 type Opcode       =   Bit
11 {-# LINE 60 "PolyAlu.lhs" #-}
12 type RegBank s a    =   
13   Vector (s :+: D1) a
14 type RegState s a   =   
15   State (RegBank s a)
16 {-# LINE 68 "PolyAlu.lhs" #-}
17 type Word = SizedInt D12
18 {-# LINE 88 "PolyAlu.lhs" #-}
19 alu :: 
20   Op a -> Op a -> 
21   Opcode -> a -> a -> a
22 alu op1 op2 Low    a b = op1 a b
23 alu op1 op2 High   a b = op2 a b
24 {-# LINE 110 "PolyAlu.lhs" #-}
25 registers :: 
26   ((NaturalT s ,PositiveT (s :+: D1),((s :+: D1) :>: s) ~ True )) => a -> RangedWord s ->
27   RangedWord s -> (RegState s a) -> (RegState s a, a )
28 {-# LINE 118 "PolyAlu.lhs" #-}
29 registers data_in rdaddr wraddr (State mem) = 
30   ((State mem'), data_out)
31   where
32     data_out  = mem!rdaddr
33     mem'      = replace mem wraddr data_in
34 {-# LINE 138 "PolyAlu.lhs" #-}
35 type Instruction = (Opcode, Word, RangedWord D9, RangedWord D9)
36 {-# LINE 142 "PolyAlu.lhs" #-}
37 {-# ANN cpu TopEntity#-}
38 cpu :: 
39   Instruction -> RegState D9 Word -> (RegState D9 Word, Word)
40
41 cpu (opc, d, rdaddr, wraddr) ram = (ram', alu_out)
42   where
43     alu_out         = alu (+) (-) opc d ram_out
44     (ram',ram_out)  = registers alu_out rdaddr wraddr ram
45 {-# LINE 165 "PolyAlu.lhs" #-}
46 {-# ANN initstate InitState#-}
47 initstate :: RegState D9 Word
48 initstate = State (copy (0 :: Word))  
49   
50 {-# ANN program TestInput#-}
51 program :: [Instruction]
52 program =
53   [ (Low, 4, 0, 0) --  Write 4   to Reg0
54   , (Low, 3, 0, 1) --  Write 3+4 to Reg1
55   , (High,8, 1, 2) --  Write 8-7 to Reg2
56   ]
57
58 run func state [] = []
59 run func state (i:input) = o:out
60   where
61     (state', o) = func i state
62     out         = run func state' input
63     
64 main :: IO ()
65 main = do
66   let input = program
67   let istate = initstate
68   let output = run cpu istate input
69   mapM_ (\x -> putStr $ ("(" P.++ (show x) P.++ ")\n")) output
70   return ()