Make top level inlining handle non-representable results gracefully.
[matthijs/master-project/cλash.git] / HighOrdAlu.hs
1 {-# LANGUAGE TemplateHaskell, ScopedTypeVariables, NoImplicitPrelude #-}
2
3 module HighOrdAlu where
4
5 import qualified Prelude as P
6 import CLasH.HardwareTypes
7 import CLasH.Translator.Annotations
8
9 import HighOrdAluOps
10
11 {-# ANN sim_input TestInput#-}
12 sim_input :: [(Opcode, Vector D4 (SizedInt D8), Vector D4 (SizedInt D8))]
13 sim_input = [ (High,  $(vectorTH ([4,3,2,1]::[SizedInt D8])), $(vectorTH ([1,2,3,4]::[SizedInt D8])))
14             , (High,  $(vectorTH ([4,3,2,1]::[SizedInt D8])), $(vectorTH ([1,2,3,4]::[SizedInt D8])))
15             , (Low,   $(vectorTH ([4,3,2,1]::[SizedInt D8])), $(vectorTH ([1,2,3,4]::[SizedInt D8]))) ]
16
17 {-# ANN actual_alu InitState #-}
18 initstate = High
19
20 alu :: Op n e -> Op n e -> Opcode -> Vector n e -> Vector n e -> Vector n e
21 alu op1 op2 opc a b =
22   case opc of
23     Low -> op1 a b
24     High -> op2 a b
25
26 {-# ANN actual_alu TopEntity #-}
27 actual_alu :: (Opcode, Vector D4 (SizedInt D8), Vector D4 (SizedInt D8)) -> Vector D4 (SizedInt D8)
28 --actual_alu = alu (constant Low) andop
29 actual_alu (opc, a, b) = alu (anyset (+) (0 :: SizedInt D8)) (andop (-)) opc a b
30
31 runalu = P.map actual_alu sim_input