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> vectorPartWidths;
21 public BitVectorSplittingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context)
26 public BitVectorSplittingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context,
27 BitVectorSplittingAtomicHighLevelStateHandlerParams params)
29 this.component = context.component;
30 this.vectorPartTargets = new ArrayList<>();
31 this.vectorPartWidths = new ArrayList<>();
33 setVectorParts(params.vectorPartTargets, params.vectorPartWidths);
36 public void set(List<String> targets, List<Integer> widths)
38 setVectorParts(targets, widths);
41 public void addVectorPart(String target, int width)
43 vectorPartTargets.add(target);
44 vectorPartWidths.add(width);
48 public void clearVectorParts()
50 vectorPartTargets.clear();
51 vectorPartWidths.clear();
55 private void setVectorParts(List<String> targets, List<Integer> widths)
58 if (targets.size() != widths.size())
59 throw new IllegalArgumentException("Targets list and widths list have different sizes");
60 vectorPartTargets.addAll(targets);
61 vectorPartWidths.addAll(widths);
62 width += widths.stream().mapToInt(Integer::intValue).sum();
66 public Object getHighLevelState()
68 BitVector result = BitVector.of();
69 for (int partIndex = 0; partIndex < vectorPartTargets.size(); partIndex++)
71 Object subStateUncasted = component.getHighLevelState(vectorPartTargets.get(partIndex));
73 if (subStateUncasted instanceof Bit)
74 vectorPart = BitVector.of((Bit) subStateUncasted);
76 vectorPart = (BitVector) subStateUncasted;
77 if (vectorPart.width() != vectorPartWidths.get(partIndex))
78 throw new IllegalArgumentException(
79 "Incorrect vector part width: " + vectorPart.width() + "; expected " + vectorPartWidths.get(partIndex));
80 result = vectorPart.concat(result);
86 public void setHighLevelState(Object newState)
88 BitVector newStateCasted = (BitVector) newState;
89 if (newStateCasted.width() != width)
90 throw new IllegalArgumentException("Incorrect vector width: " + newStateCasted.width() + "; expected " + width);
91 for (int partIndex = vectorPartTargets.size() - 1, bitIndex = 0; partIndex >= 0; partIndex--)
93 int vectorPartWidth = vectorPartWidths.get(partIndex);
94 BitVector vectorPart = newStateCasted.subVector(bitIndex, bitIndex + vectorPartWidth);
95 component.setHighLevelState(vectorPartTargets.get(partIndex), vectorPart);
96 bitIndex += vectorPartWidth;
101 public BitVectorSplittingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifierGetter idGetter)
103 BitVectorSplittingAtomicHighLevelStateHandlerParams params = new BitVectorSplittingAtomicHighLevelStateHandlerParams();
104 params.vectorPartTargets = new ArrayList<>(vectorPartTargets);
105 params.vectorPartWidths = new ArrayList<>(vectorPartWidths);
109 public static class BitVectorSplittingAtomicHighLevelStateHandlerParams
111 public List<String> vectorPartTargets;
112 public List<Integer> vectorPartWidths;
117 StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier
118 .setSnippetSupplier(BitVectorSplittingAtomicHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion.create(
119 BitVectorSplittingAtomicHighLevelStateHandlerParams.class, BitVectorSplittingAtomicHighLevelStateHandler::new));