Added builtin foldl function
[matthijs/master-project/cλash.git] / HighOrdAlu.hs
1 module HighOrdAlu where
2
3 import Prelude hiding (
4   null, length, head, tail, last, init, take, drop, (++), map, foldl, foldr,
5   zipWith, zip, unzip, concat, reverse, iterate )
6 import Bits
7 import Types
8 import Data.Param.TFVec
9 import Data.RangedWord
10
11 constant :: e -> Op D4 e
12 constant e a b =
13   e +> (e +> (e +> (e +> empty)))
14
15 inv = hwnot
16
17 invop :: Op n Bit
18 invop a b = map inv a
19
20 type Op n e = (TFVec n e -> TFVec n e -> TFVec n e)
21 type Opcode = Bit
22
23 alu :: Op n e -> Op n e -> Opcode -> TFVec n e -> TFVec n e -> TFVec n e
24 alu op1 op2 opc a b =
25   case opc of
26     Low -> op1 a b
27     High -> op2 a b
28
29 zero_inv_alu :: Opcode -> TFVec D4 Bit -> TFVec D4 Bit -> TFVec D4 Bit
30 zero_inv_alu = alu (constant Low) invop