1 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic;
3 import java.util.ArrayList;
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;
10 public class BitVectorSplittingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler
12 private SubmodelComponent component;
13 private final List<String> vectorPartTargets;
14 private final List<Integer> vectorPartLengthes;
16 public BitVectorSplittingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context)
21 public BitVectorSplittingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context,
22 BitVectorSplittingAtomicHighLevelStateHandlerParams params)
24 this.component = context.component;
25 this.vectorPartTargets = new ArrayList<>();
26 this.vectorPartLengthes = new ArrayList<>();
28 setVectorParts(params.vectorPartTargets, params.vectorPartLengthes);
31 public void set(List<String> targets, List<Integer> lengthes)
33 setVectorParts(targets, lengthes);
36 public void addVectorPart(String target, int length)
38 vectorPartTargets.add(target);
39 vectorPartLengthes.add(length);
42 public void clearVectorParts()
44 vectorPartTargets.clear();
45 vectorPartLengthes.clear();
48 private void setVectorParts(List<String> targets, List<Integer> lengthes)
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);
58 public Object getHighLevelState()
60 BitVector result = BitVector.of();
61 for (int partIndex = 0; partIndex < vectorPartTargets.size(); partIndex++)
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?
73 public void setHighLevelState(Object newState)
75 BitVector newStateCasted = (BitVector) newState;
76 for (int partIndex = 0, bitIndex = 0; partIndex < vectorPartTargets.size(); partIndex++)
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;
85 public static class BitVectorSplittingAtomicHighLevelStateHandlerParams
87 public List<String> vectorPartTargets;
88 public List<Integer> vectorPartLengthes;