1 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic;
3 import java.util.ArrayList;
6 import net.mograsim.logic.core.types.Bit;
7 import net.mograsim.logic.core.types.BitVector;
8 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
9 import net.mograsim.logic.model.serializing.IdentifierGetter;
10 import net.mograsim.logic.model.snippets.SnippetDefinintion;
11 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.HighLevelStateHandlerContext;
12 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers;
14 public class BitVectorSplittingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler
16 private SubmodelComponent component;
17 private final List<String> vectorPartTargets;
18 private final List<Integer> vectorPartLengthes;
20 public BitVectorSplittingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context)
25 public BitVectorSplittingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context,
26 BitVectorSplittingAtomicHighLevelStateHandlerParams params)
28 this.component = context.component;
29 this.vectorPartTargets = new ArrayList<>();
30 this.vectorPartLengthes = new ArrayList<>();
32 setVectorParts(params.vectorPartTargets, params.vectorPartLengthes);
35 public void set(List<String> targets, List<Integer> lengthes)
37 setVectorParts(targets, lengthes);
40 public void addVectorPart(String target, int length)
42 vectorPartTargets.add(target);
43 vectorPartLengthes.add(length);
46 public void clearVectorParts()
48 vectorPartTargets.clear();
49 vectorPartLengthes.clear();
52 private void setVectorParts(List<String> targets, List<Integer> lengthes)
55 if (targets.size() != lengthes.size())
56 throw new IllegalArgumentException("Targets list and lenghtes list have different sizes");
57 vectorPartTargets.addAll(targets);
58 vectorPartLengthes.addAll(lengthes);
62 public Object getHighLevelState()
64 BitVector result = BitVector.of();
65 for (int partIndex = 0; partIndex < vectorPartTargets.size(); partIndex++)
67 Object subStateUncasted = component.getHighLevelState(vectorPartTargets.get(partIndex));
69 if (subStateUncasted instanceof Bit)
70 vectorPart = BitVector.of((Bit) subStateUncasted);
72 vectorPart = (BitVector) subStateUncasted;
73 if (vectorPart.length() != vectorPartLengthes.get(partIndex))
74 throw new IllegalArgumentException(
75 "Illegal vector part length: " + vectorPart.length() + "; expected " + vectorPartLengthes.get(partIndex));
76 result = vectorPart.concat(result);
82 public void setHighLevelState(Object newState)
84 BitVector newStateCasted = (BitVector) newState;
85 for (int partIndex = vectorPartTargets.size() - 1, bitIndex = 0; partIndex >= 0; partIndex--)
87 int vectorPartLength = vectorPartLengthes.get(partIndex);
88 BitVector vectorPart = newStateCasted.subVector(bitIndex, bitIndex + vectorPartLength);
89 component.setHighLevelState(vectorPartTargets.get(partIndex), vectorPart);
90 bitIndex += vectorPartLength;
95 public BitVectorSplittingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifierGetter idGetter)
97 BitVectorSplittingAtomicHighLevelStateHandlerParams params = new BitVectorSplittingAtomicHighLevelStateHandlerParams();
98 params.vectorPartTargets = new ArrayList<>(vectorPartTargets);
99 params.vectorPartLengthes = new ArrayList<>(vectorPartLengthes);
103 public static class BitVectorSplittingAtomicHighLevelStateHandlerParams
105 public List<String> vectorPartTargets;
106 public List<Integer> vectorPartLengthes;
111 StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier
112 .setSnippetSupplier(BitVectorSplittingAtomicHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion.create(
113 BitVectorSplittingAtomicHighLevelStateHandlerParams.class, BitVectorSplittingAtomicHighLevelStateHandler::new));