1 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic;
3 import java.util.ArrayList;
4 import java.util.Collections;
7 import net.mograsim.logic.core.types.Bit;
8 import net.mograsim.logic.core.types.BitVector;
9 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
10 import net.mograsim.logic.model.serializing.IdentifyParams;
11 import net.mograsim.logic.model.snippets.SnippetDefinintion;
12 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.HighLevelStateHandlerContext;
13 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers;
15 public class BitVectorSplittingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler
17 private final SubmodelComponent component;
18 private final List<String> vectorPartTargets;
19 private final List<String> vectorPartTargetsUnmodifiable;
20 private final List<Integer> vectorPartLengthes;
21 private final List<Integer> vectorPartLengthesUnmodifiable;
24 public BitVectorSplittingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context)
29 public BitVectorSplittingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context,
30 BitVectorSplittingAtomicHighLevelStateHandlerParams params)
32 this.component = context.component;
33 this.vectorPartTargets = new ArrayList<>();
34 this.vectorPartTargetsUnmodifiable = Collections.unmodifiableList(vectorPartTargets);
35 this.vectorPartLengthes = new ArrayList<>();
36 this.vectorPartLengthesUnmodifiable = Collections.unmodifiableList(vectorPartLengthes);
38 setVectorParts(params.vectorPartTargets, params.vectorPartLengthes);
41 public void set(List<String> targets, List<Integer> lengthes)
43 setVectorParts(targets, lengthes);
46 public void addVectorPart(String target, int length)
48 vectorPartTargets.add(target);
49 vectorPartLengthes.add(length);
50 this.length += length;
53 public void clearVectorParts()
55 vectorPartTargets.clear();
56 vectorPartLengthes.clear();
60 private void setVectorParts(List<String> targets, List<Integer> lengthes)
63 if (targets.size() != lengthes.size())
64 throw new IllegalArgumentException("Targets list and lengthes list have different sizes");
65 vectorPartTargets.addAll(targets);
66 vectorPartLengthes.addAll(lengthes);
67 length += lengthes.stream().mapToInt(Integer::intValue).sum();
70 public List<String> getVectorPartTargets()
72 return vectorPartTargetsUnmodifiable;
75 public List<Integer> getVectorPartLenghtes()
77 return vectorPartLengthesUnmodifiable;
81 public Object getHighLevelState()
83 BitVector result = BitVector.of();
84 for (int partIndex = 0; partIndex < vectorPartTargets.size(); partIndex++)
86 Object subStateUncasted = component.getHighLevelState(vectorPartTargets.get(partIndex));
88 if (subStateUncasted instanceof Bit)
89 vectorPart = BitVector.of((Bit) subStateUncasted);
91 vectorPart = (BitVector) subStateUncasted;
92 if (vectorPart.length() != vectorPartLengthes.get(partIndex))
93 throw new IllegalArgumentException(
94 "Incorrect vector part length: " + vectorPart.length() + "; expected " + vectorPartLengthes.get(partIndex));
95 result = result.concat(vectorPart);
101 public void setHighLevelState(Object newState)
103 BitVector newStateCasted = (BitVector) newState;
104 if (newStateCasted.length() != length)
105 throw new IllegalArgumentException("Incorrect vector length: " + newStateCasted.length() + "; expected " + length);
106 for (int partIndex = 0, bitIndex = 0; partIndex < vectorPartTargets.size(); partIndex++)
108 int vectorPartLength = vectorPartLengthes.get(partIndex);
109 BitVector vectorPart = newStateCasted.subVector(bitIndex, bitIndex + vectorPartLength);
110 component.setHighLevelState(vectorPartTargets.get(partIndex), vectorPart);
111 bitIndex += vectorPartLength;
116 public String getIDForSerializing(IdentifyParams idParams)
118 return "bitVectorSplitting";
122 public BitVectorSplittingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams)
124 BitVectorSplittingAtomicHighLevelStateHandlerParams params = new BitVectorSplittingAtomicHighLevelStateHandlerParams();
125 params.vectorPartTargets = new ArrayList<>(vectorPartTargets);
126 params.vectorPartLengthes = new ArrayList<>(vectorPartLengthes);
130 public static class BitVectorSplittingAtomicHighLevelStateHandlerParams
132 public List<String> vectorPartTargets;
133 public List<Integer> vectorPartLengthes;
138 StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier
139 .setSnippetSupplier(BitVectorSplittingAtomicHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion.create(
140 BitVectorSplittingAtomicHighLevelStateHandlerParams.class, BitVectorSplittingAtomicHighLevelStateHandler::new));