Merge branch 'cλash' of http://git.stderr.nl/matthijs/projects/master-project
[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   copy (lengthT a) e
14
15 invop :: Op n Bit
16 invop a b = map hwnot a
17
18 andop :: Op n Bit
19 andop a b = zipWith hwand a b
20
21 -- Is any bit set?
22 --anyset :: (PositiveT n) => Op n Bit
23 anyset :: Op D4 Bit
24 --anyset a b = copy undefined (a' `hwor` b')
25 anyset a b = constant (a' `hwor` b') a b
26   where 
27     a' = foldl hwor Low a
28     b' = foldl hwor Low b
29
30 type Op n e = (TFVec n e -> TFVec n e -> TFVec n e)
31 type Opcode = Bit
32
33 alu :: Op n e -> Op n e -> Opcode -> TFVec n e -> TFVec n e -> TFVec n e
34 alu op1 op2 opc a b =
35   case opc of
36     Low -> op1 a b
37     High -> op2 a b
38
39 actual_alu :: Opcode -> TFVec D4 Bit -> TFVec D4 Bit -> TFVec D4 Bit
40 --actual_alu = alu (constant Low) andop
41 actual_alu = alu anyset andop