X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fsnippets%2Fhighlevelstatehandlers%2Fstandard%2Fatomic%2FBitVectorSplittingAtomicHighLevelStateHandler.java;h=b17af6ff078993bbf5d148da558a324df663f4ef;hb=4d7f92457692ef00a591084390dc191f84c99628;hp=4b1139beeaf02bdadde4643cb09350df458f94f0;hpb=a393b0a2a9899707af54c9ee77a01f28ac967bd1;p=Mograsim.git diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java index 4b1139be..b17af6ff 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java @@ -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 vectorPartTargets; private final List vectorPartLengthes; + private int length; public BitVectorSplittingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context) { @@ -37,21 +42,24 @@ public class BitVectorSplittingAtomicHighLevelStateHandler implements AtomicHigh { vectorPartTargets.add(target); vectorPartLengthes.add(length); + this.length += length; } public void clearVectorParts() { vectorPartTargets.clear(); vectorPartLengthes.clear(); + length = 0; } private void setVectorParts(List targets, List lengthes) { clearVectorParts(); if (targets.size() != lengthes.size()) - throw new IllegalArgumentException("Targets list and lenghtes list have different sizes"); + throw new IllegalArgumentException("Targets list and lengthes list have different sizes"); vectorPartTargets.addAll(targets); vectorPartLengthes.addAll(lengthes); + length += lengthes.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)); + Object subStateUncasted = component.getHighLevelState(vectorPartTargets.get(partIndex)); + BitVector vectorPart; + if (subStateUncasted instanceof Bit) + vectorPart = BitVector.of((Bit) subStateUncasted); + else + vectorPart = (BitVector) subStateUncasted; 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? + "Incorrect vector part length: " + vectorPart.length() + "; expected " + vectorPartLengthes.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.length() != length) + throw new IllegalArgumentException("Incorrect vector length: " + newStateCasted.length() + "; expected " + length); + 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 vectorPartTargets; public List vectorPartLengthes; } + + static + { + StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier + .setSnippetSupplier(BitVectorSplittingAtomicHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion.create( + BitVectorSplittingAtomicHighLevelStateHandlerParams.class, BitVectorSplittingAtomicHighLevelStateHandler::new)); + } } \ No newline at end of file