1 {-# LANGUAGE TypeOperators, TemplateHaskell, TypeFamilies, ScopedTypeVariables #-}
3 module HigherOrderCPU where
5 -- hide default prelude functions
6 import qualified Prelude as P
8 -- import CλaSH specific types
9 import CLasH.HardwareTypes hiding (min,foldl1,const)
10 import CLasH.Translator.Annotations
12 type Word = SizedInt D16
13 type Index = RangedWord
17 fu op inputs (addr1, addr2) = regIn
23 type CpuState = State (Vector D4 Word)
25 {-# ANN cpu TopEntity #-}
26 {-# ANN cpu (InitState 'cpuState) #-}
27 cpu :: CpuState -> Word -> Vector D4 (Index D6, Index D6) -> Opcode
29 cpu (State fuss) input addrs opc = (State fuss', out)
31 fuss' = (fu (multiop opc) inputs (addrs!(0 :: Index D3))) +> (
32 (fu (+) inputs (addrs!(1 :: Index D3))) +> (
33 (fu (-) inputs (addrs!(2 :: Index D3))) +> (
34 (fu (*) inputs (addrs!(3 :: Index D3))) +> empty)))
35 inputs = 0 +> (1 +> (input +> fuss))
38 cpuState :: Vector D4 Word
41 data Opcode = Shift | Xor | Equal
43 multiop :: Opcode -> Word -> Word -> Word
44 multiop opc a b = case opc of
50 -- Placeholders, since we don't have these operations