Merge remote-tracking branch 'origin/development' into development
[Mograsim.git] / net.mograsim.logic.model / src / net / mograsim / logic / model / snippets / highlevelstatehandlers / standard / atomic / BitVectorSplittingAtomicHighLevelStateHandler.java
1 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import net.mograsim.logic.core.types.BitVector;
7 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
8 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.HighLevelStateHandlerContext;
9
10 public class BitVectorSplittingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler
11 {
12         private SubmodelComponent component;
13         private final List<String> vectorPartTargets;
14         private final List<Integer> vectorPartLengthes;
15
16         public BitVectorSplittingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context)
17         {
18                 this(context, null);
19         }
20
21         public BitVectorSplittingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context,
22                         BitVectorSplittingAtomicHighLevelStateHandlerParams params)
23         {
24                 this.component = context.component;
25                 this.vectorPartTargets = new ArrayList<>();
26                 this.vectorPartLengthes = new ArrayList<>();
27                 if (params != null)
28                         setVectorParts(params.vectorPartTargets, params.vectorPartLengthes);
29         }
30
31         public void set(List<String> targets, List<Integer> lengthes)
32         {
33                 setVectorParts(targets, lengthes);
34         }
35
36         public void addVectorPart(String target, int length)
37         {
38                 vectorPartTargets.add(target);
39                 vectorPartLengthes.add(length);
40         }
41
42         public void clearVectorParts()
43         {
44                 vectorPartTargets.clear();
45                 vectorPartLengthes.clear();
46         }
47
48         private void setVectorParts(List<String> targets, List<Integer> lengthes)
49         {
50                 clearVectorParts();
51                 if (targets.size() != lengthes.size())
52                         throw new IllegalArgumentException("Targets list and lenghtes list have different sizes");
53                 vectorPartTargets.addAll(targets);
54                 vectorPartLengthes.addAll(lengthes);
55         }
56
57         @Override
58         public Object getHighLevelState()
59         {
60                 BitVector result = BitVector.of();
61                 for (int partIndex = 0; partIndex < vectorPartTargets.size(); partIndex++)
62                 {
63                         BitVector vectorPart = (BitVector) component.getHighLevelState(vectorPartTargets.get(partIndex));
64                         if (vectorPart.length() != vectorPartLengthes.get(partIndex))
65                                 throw new IllegalArgumentException(
66                                                 "Illegal vector part length: " + vectorPart.length() + "; expected " + vectorPartLengthes.get(partIndex));
67                         result = result.concat(vectorPart);// TODO is the bit order correct?
68                 }
69                 return result;
70         }
71
72         @Override
73         public void setHighLevelState(Object newState)
74         {
75                 BitVector newStateCasted = (BitVector) newState;
76                 for (int partIndex = 0, bitIndex = 0; partIndex < vectorPartTargets.size(); partIndex++)
77                 {
78                         int vectorPartLength = vectorPartLengthes.get(partIndex);
79                         BitVector vectorPart = newStateCasted.subVector(bitIndex, vectorPartLength);// TODO is the bit order correct?
80                         component.setHighLevelState(vectorPartTargets.get(partIndex), vectorPart);
81                         bitIndex += vectorPartLength;
82                 }
83         }
84
85         public static class BitVectorSplittingAtomicHighLevelStateHandlerParams
86         {
87                 public List<String> vectorPartTargets;
88                 public List<Integer> vectorPartLengthes;
89         }
90 }