Removed unneccessary clock input for memory components
[Mograsim.git] / net.mograsim.machine / src / net / mograsim / machine / mi / components / CoreMicroInstructionMemory.java
1 package net.mograsim.machine.mi.components;
2
3 import java.util.List;
4
5 import net.mograsim.logic.core.components.BasicCoreComponent;
6 import net.mograsim.logic.core.timeline.Timeline;
7 import net.mograsim.logic.core.timeline.TimelineEventHandler;
8 import net.mograsim.logic.core.types.Bit;
9 import net.mograsim.logic.core.types.BitVector;
10 import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
11 import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
12 import net.mograsim.machine.mi.MicroInstructionMemory;
13
14 public class CoreMicroInstructionMemory extends BasicCoreComponent
15 {
16         private final ReadWriteEnd                              data;
17         private final ReadEnd                                   address;
18         private final MicroInstructionMemory    memory;
19
20
21         public CoreMicroInstructionMemory(Timeline timeline, int processTime, MicroInstructionMemory memory, ReadWriteEnd data, ReadEnd address)
22         {
23                 super(timeline, processTime);
24                 this.memory = memory;
25                 this.data = data;
26                 this.address = address;
27         }
28
29         public MicroInstructionMemory getMemory()
30         {
31                 return memory;
32         }
33
34         @Override
35         public List<ReadEnd> getAllInputs()
36         {
37                 return List.of(address);
38         }
39
40         @Override
41         public List<ReadWriteEnd> getAllOutputs()
42         {
43                 return List.of(data);
44         }
45
46         @Override
47         protected TimelineEventHandler compute()
48         {
49                 if(!address.hasNumericValue())
50                 {
51                         return e -> data.feedSignals(Bit.U.toVector(data.width()));//TODO don't always feed U, but decide to feed X or U.
52                 }
53                 long addressed = address.getUnsignedValue();
54                 BitVector storedData = memory.getCell(addressed).toBitVector();
55                 return e -> data.feedSignals(storedData);
56         }
57 }