never executed always true always false
1 module HelVM.HelMA.Automaton.Combiner where
2
3 import HelVM.HelMA.Automaton.Eff.AutomatonEff
4
5 import HelVM.HelMA.Automaton.Instruction
6
7 import HelVM.HelMA.Automaton.Trampoline as Trampoline
8
9 import HelVM.HelMA.Automaton.Symbol
10
11 import HelVM.HelMA.Automaton.Combiner.ALU as ALU
12 import HelVM.HelMA.Automaton.Combiner.CPU as CPU
13 import HelVM.HelMA.Automaton.Combiner.LSU as LSU
14
15 import Control.Type.Operator
16
17 import Prelude hiding ( swap )
18
19 -- | Core of Combiner
20
21 runInstruction ∷ (SRAutomatonEff Symbol s r m) ⇒ Instruction → SF s r m
22 runInstruction (ISM i) a = Trampoline.continue . updateStack a <$> runALI i (memoryStack a)
23 runInstruction (ILS i) a = Trampoline.continue . updateFromLSM a <$> runSLI i (toLSM a)
24 runInstruction (ICF i) a = Trampoline.continue . updateFromCPM a <$> runCFI i (toCPM a)
25 runInstruction End a = end a
26
27 pop2ForStack ∷ (SRAutomatonEff Symbol s r m) ⇒ Memory s r → m (Symbol , Symbol , Memory s r)
28 pop2ForStack a = build <$> pop2 (memoryStack a) where
29 build (s1 , s2 , s') = (s1 , s2 , updateStack a s')
30
31 push1ForStack ∷ Stack s Symbol ⇒ Symbol → Memory s r → Memory s r
32 push1ForStack e a = a { memoryStack = push1 e (memoryStack a) }
33
34 end ∷ (SRAutomatonEff Symbol s r m) ⇒ SF s r m
35 end = pure . Trampoline.break
36
37 -- | Constructors
38
39 flippedNewMemory ∷ (s , r) → InstructionList → Memory s r
40 flippedNewMemory = flip (uncurry . newMemory)
41
42 newMemory ∷ InstructionList → s → r → Memory s r
43 newMemory il = Memory (newCM il)
44
45 -- | Updaters
46
47 incrementIC ∷ Memory s r → Memory s r
48 incrementIC m = m { memoryCM = incrementPC $ memoryCM m}
49
50 updateStack ∷ Memory s r → s → Memory s r
51 updateStack m s = m {memoryStack = s}
52
53 updateFromCPM ∷ Memory s r → CentralProcessingMemory s → Memory s r
54 updateFromCPM m cpm = m { memoryCM = controlMemory cpm, memoryStack = alm cpm}
55
56 updateFromLSM ∷ Memory s r → LoadStoreMemory s r → Memory s r
57 updateFromLSM m lsu = m {memoryStack = stack lsu , memoryRAM = ram lsu}
58
59 -- | Accessors
60
61 memoryProgram ∷ Memory s r → InstructionVector
62 memoryProgram = program . memoryCM
63
64 memoryProgramCounter ∷ Memory s r → InstructionCounter
65 memoryProgramCounter = programCounter . memoryCM
66
67 toCPM ∷ Memory s r → CentralProcessingMemory s
68 toCPM a = CPM { controlMemory = memoryCM a , alm = memoryStack a }
69
70 toLSM ∷ Memory s r → LoadStoreMemory s r
71 toLSM a = LSM { stack = memoryStack a, ram = memoryRAM a }
72
73 -- | Types
74
75 type SF s r m = Memory s r → m $ MemorySame s r
76
77 type F s r m = Memory s r → m $ Memory s r
78
79 type MemorySame s r = Same (Memory s r)
80
81 -- | Data types
82 data Memory s r
83 = Memory
84 { memoryCM :: ControlMemory
85 , memoryStack :: s
86 , memoryRAM :: r
87 }
88 deriving stock (Show)