Fixed a bug in Am2900; created dlatch8/80; relayouted some components
[Mograsim.git] / net.mograsim.logic.core / src / net / mograsim / logic / core / components / CoreUnidirectionalSplitter.java
1 package net.mograsim.logic.core.components;
2
3 import java.util.List;
4
5 import net.mograsim.logic.core.LogicObservable;
6 import net.mograsim.logic.core.LogicObserver;
7 import net.mograsim.logic.core.timeline.Timeline;
8 import net.mograsim.logic.core.types.BitVector;
9 import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
10 import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
11
12 public class CoreUnidirectionalSplitter extends CoreComponent implements LogicObserver
13 {
14         private ReadEnd input;
15         private ReadWriteEnd[] outputs;
16
17         public CoreUnidirectionalSplitter(Timeline timeline, ReadEnd input, ReadWriteEnd... outputs)
18         {
19                 super(timeline);
20                 this.input = input;
21                 this.outputs = outputs;
22                 input.registerObserver(this);
23                 int width = 0;
24                 for (ReadEnd out : outputs)
25                         width += out.width();
26
27                 if (input.width() != width)
28                         throw new IllegalArgumentException(
29                                         "The input of splitting one into n WireArrays must have width = a1.width() + a2.width() + ... + an.width().");
30         }
31
32         protected void compute()
33         {
34                 BitVector inputBits = input.getValues();
35                 int startIndex = 0;
36                 for (int i = 0; i < outputs.length; i++)
37                 {
38                         outputs[i].feedSignals(inputBits.subVector(startIndex, startIndex + outputs[i].width()));
39                         startIndex += outputs[i].width();
40                 }
41         }
42
43         @Override
44         public void update(LogicObservable initiator)
45         {
46                 compute();
47         }
48
49         @Override
50         public List<ReadEnd> getAllInputs()
51         {
52                 return List.of(input);
53         }
54
55         @Override
56         public List<ReadWriteEnd> getAllOutputs()
57         {
58                 return List.of(outputs);
59         }
60 }