Serializing now serializes everything; among many other things:
[Mograsim.git] / net.mograsim.logic.model / src / net / mograsim / logic / model / snippets / highlevelstatehandlers / standard / atomic / BitVectorSplittingAtomicHighLevelStateHandler.java
index c4a56b0..dd7af34 100644 (file)
@@ -6,7 +6,10 @@ 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
 {
@@ -70,7 +73,7 @@ public class BitVectorSplittingAtomicHighLevelStateHandler implements AtomicHigh
                        if (vectorPart.length() != vectorPartLengthes.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?
+                       result = vectorPart.concat(result);
                }
                return result;
        }
@@ -79,18 +82,34 @@ public class BitVectorSplittingAtomicHighLevelStateHandler implements AtomicHigh
        public void setHighLevelState(Object newState)
        {
                BitVector newStateCasted = (BitVector) newState;
-               for (int partIndex = 0, bitIndex = 0; partIndex < vectorPartTargets.size(); partIndex++)
+               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?
+                       BitVector vectorPart = newStateCasted.subVector(bitIndex, bitIndex + vectorPartLength);
                        component.setHighLevelState(vectorPartTargets.get(partIndex), vectorPart);
                        bitIndex += vectorPartLength;
                }
        }
 
+       @Override
+       public BitVectorSplittingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifierGetter idGetter)
+       {
+               BitVectorSplittingAtomicHighLevelStateHandlerParams params = new BitVectorSplittingAtomicHighLevelStateHandlerParams();
+               params.vectorPartTargets = new ArrayList<>(vectorPartTargets);
+               params.vectorPartLengthes = new ArrayList<>(vectorPartLengthes);
+               return params;
+       }
+
        public static class BitVectorSplittingAtomicHighLevelStateHandlerParams
        {
                public List<String> vectorPartTargets;
                public List<Integer> vectorPartLengthes;
        }
+
+       static
+       {
+               StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier
+                               .setSnippetSupplier(BitVectorSplittingAtomicHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion.create(
+                                               BitVectorSplittingAtomicHighLevelStateHandlerParams.class, BitVectorSplittingAtomicHighLevelStateHandler::new));
+       }
 }
\ No newline at end of file