Further renaming of length to width
[Mograsim.git] / net.mograsim.logic.model / src / net / mograsim / logic / model / snippets / highlevelstatehandlers / standard / atomic / BitVectorSplittingAtomicHighLevelStateHandler.java
index 4b1139b..f26c872 100644 (file)
@@ -3,15 +3,20 @@ package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic
 import java.util.ArrayList;
 import java.util.List;
 
+import net.mograsim.logic.core.types.Bit;
 import net.mograsim.logic.core.types.BitVector;
 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
+import net.mograsim.logic.model.serializing.IdentifierGetter;
+import net.mograsim.logic.model.snippets.SnippetDefinintion;
 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.HighLevelStateHandlerContext;
+import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers;
 
 public class BitVectorSplittingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler
 {
        private SubmodelComponent component;
        private final List<String> vectorPartTargets;
-       private final List<Integer> vectorPartLengthes;
+       private final List<Integer> vectorPartWidths;
+       private int width;
 
        public BitVectorSplittingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context)
        {
@@ -23,35 +28,38 @@ public class BitVectorSplittingAtomicHighLevelStateHandler implements AtomicHigh
        {
                this.component = context.component;
                this.vectorPartTargets = new ArrayList<>();
-               this.vectorPartLengthes = new ArrayList<>();
+               this.vectorPartWidths = new ArrayList<>();
                if (params != null)
-                       setVectorParts(params.vectorPartTargets, params.vectorPartLengthes);
+                       setVectorParts(params.vectorPartTargets, params.vectorPartWidths);
        }
 
-       public void set(List<String> targets, List<Integer> lengthes)
+       public void set(List<String> targets, List<Integer> widths)
        {
-               setVectorParts(targets, lengthes);
+               setVectorParts(targets, widths);
        }
 
-       public void addVectorPart(String target, int length)
+       public void addVectorPart(String target, int width)
        {
                vectorPartTargets.add(target);
-               vectorPartLengthes.add(length);
+               vectorPartWidths.add(width);
+               this.width += width;
        }
 
        public void clearVectorParts()
        {
                vectorPartTargets.clear();
-               vectorPartLengthes.clear();
+               vectorPartWidths.clear();
+               width = 0;
        }
 
-       private void setVectorParts(List<String> targets, List<Integer> lengthes)
+       private void setVectorParts(List<String> targets, List<Integer> widths)
        {
                clearVectorParts();
-               if (targets.size() != lengthes.size())
-                       throw new IllegalArgumentException("Targets list and lenghtes list have different sizes");
+               if (targets.size() != widths.size())
+                       throw new IllegalArgumentException("Targets list and widths list have different sizes");
                vectorPartTargets.addAll(targets);
-               vectorPartLengthes.addAll(lengthes);
+               vectorPartWidths.addAll(widths);
+               width += widths.stream().mapToInt(Integer::intValue).sum();
        }
 
        @Override
@@ -60,11 +68,16 @@ public class BitVectorSplittingAtomicHighLevelStateHandler implements AtomicHigh
                BitVector result = BitVector.of();
                for (int partIndex = 0; partIndex < vectorPartTargets.size(); partIndex++)
                {
-                       BitVector vectorPart = (BitVector) component.getHighLevelState(vectorPartTargets.get(partIndex));
-                       if (vectorPart.length() != vectorPartLengthes.get(partIndex))
+                       Object subStateUncasted = component.getHighLevelState(vectorPartTargets.get(partIndex));
+                       BitVector vectorPart;
+                       if (subStateUncasted instanceof Bit)
+                               vectorPart = BitVector.of((Bit) subStateUncasted);
+                       else
+                               vectorPart = (BitVector) subStateUncasted;
+                       if (vectorPart.width() != vectorPartWidths.get(partIndex))
                                throw new IllegalArgumentException(
-                                               "Illegal vector part length: " + vectorPart.length() + "; expected " + vectorPartLengthes.get(partIndex));
-                       result = result.concat(vectorPart);// TODO is the bit order correct?
+                                               "Incorrect vector part width: " + vectorPart.width() + "; expected " + vectorPartWidths.get(partIndex));
+                       result = vectorPart.concat(result);
                }
                return result;
        }
@@ -73,18 +86,36 @@ public class BitVectorSplittingAtomicHighLevelStateHandler implements AtomicHigh
        public void setHighLevelState(Object newState)
        {
                BitVector newStateCasted = (BitVector) newState;
-               for (int partIndex = 0, bitIndex = 0; partIndex < vectorPartTargets.size(); partIndex++)
+               if (newStateCasted.width() != width)
+                       throw new IllegalArgumentException("Incorrect vector width: " + newStateCasted.width() + "; expected " + width);
+               for (int partIndex = vectorPartTargets.size() - 1, bitIndex = 0; partIndex >= 0; partIndex--)
                {
-                       int vectorPartLength = vectorPartLengthes.get(partIndex);
-                       BitVector vectorPart = newStateCasted.subVector(bitIndex, vectorPartLength);// TODO is the bit order correct?
+                       int vectorPartWidth = vectorPartWidths.get(partIndex);
+                       BitVector vectorPart = newStateCasted.subVector(bitIndex, bitIndex + vectorPartWidth);
                        component.setHighLevelState(vectorPartTargets.get(partIndex), vectorPart);
-                       bitIndex += vectorPartLength;
+                       bitIndex += vectorPartWidth;
                }
        }
 
+       @Override
+       public BitVectorSplittingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifierGetter idGetter)
+       {
+               BitVectorSplittingAtomicHighLevelStateHandlerParams params = new BitVectorSplittingAtomicHighLevelStateHandlerParams();
+               params.vectorPartTargets = new ArrayList<>(vectorPartTargets);
+               params.vectorPartWidths = new ArrayList<>(vectorPartWidths);
+               return params;
+       }
+
        public static class BitVectorSplittingAtomicHighLevelStateHandlerParams
        {
                public List<String> vectorPartTargets;
-               public List<Integer> vectorPartLengthes;
+               public List<Integer> vectorPartWidths;
+       }
+
+       static
+       {
+               StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier
+                               .setSnippetSupplier(BitVectorSplittingAtomicHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion.create(
+                                               BitVectorSplittingAtomicHighLevelStateHandlerParams.class, BitVectorSplittingAtomicHighLevelStateHandler::new));
        }
 }
\ No newline at end of file