Added Am2900 MainMemory and MicroInstructionMemory Core/Model 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, clock;
18         private final MicroInstructionMemory memory;
19         
20         
21         public CoreMicroInstructionMemory(Timeline timeline, int processTime, MicroInstructionMemory memory, ReadWriteEnd data, ReadEnd address, ReadEnd clock)
22         {
23                 super(timeline, processTime);
24                 this.memory = memory;
25                 this.data = data;
26                 this.address = address;
27                 this.clock = clock;
28         }
29
30         public MicroInstructionMemory getMemory()
31         {
32                 return memory;
33         }
34         
35         @Override
36         public List<ReadEnd> getAllInputs()
37         {
38                 return List.of(address, clock);
39         }
40
41         @Override
42         public List<ReadWriteEnd> getAllOutputs()
43         {
44                 return List.of(data);
45         }
46
47         @Override
48         protected TimelineEventHandler compute()
49         {
50                 if(clock.getValue() != Bit.ONE)
51                         return null;
52                 
53                 if (!address.hasNumericValue())
54                 {
55                         return e -> data.feedSignals(Bit.U.toVector(data.width()));
56                 }
57                 long addressed = address.getUnsignedValue();
58                 BitVector storedData = memory.getCell(addressed).toBitVector();
59                 return e -> data.feedSignals(storedData);
60         }
61 }