X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.model.am2900%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fmodel%2Fcomponents%2Fmi%2Fnandbased%2FGUIram4.java;h=de4e2e7b0c1b50acef457178f5cf157e926fa76f;hb=0c8d57e463139a858ae07c4779a06cf3c234e8ff;hp=903a227f6eddf1de9bf650fd38e7526d19a678cc;hpb=b5d8c2d71e27350ea7c9314e40df5bb0584271cd;p=Mograsim.git diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/model/components/mi/nandbased/GUIram4.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/model/components/mi/nandbased/GUIram4.java index 903a227f..de4e2e7b 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/model/components/mi/nandbased/GUIram4.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/model/components/mi/nandbased/GUIram4.java @@ -1,16 +1,22 @@ package net.mograsim.logic.model.model.components.mi.nandbased; +import java.util.Arrays; + import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.core.types.BitVector; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.submodels.SimpleRectangularSubmodelComponent; import net.mograsim.logic.model.model.wires.GUIWire; import net.mograsim.logic.model.model.wires.Pin; import net.mograsim.logic.model.model.wires.WireCrossPoint; import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandler; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.BitVectorSplittingAtomicHighLevelStateHandler; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.DelegatingSubcomponentHighLevelStateHandler; public class GUIram4 extends SimpleRectangularSubmodelComponent { + private StandardHighLevelStateHandler highLevelStateHandler; + public GUIram4(ViewModelModifiable model) { this(model, null); @@ -287,81 +293,43 @@ public class GUIram4 extends SimpleRectangularSubmodelComponent new GUIWire(submodelModifiable, andorA11.getPin("Y4"), QA4 , new Point(195, 770), new Point(195, 895), new Point(325, 895), new Point(325, 350)); //@formatter:on - addHighLevelStateSubcomponentID("c00", cell00); - addHighLevelStateSubcomponentID("c01", cell01); - addHighLevelStateSubcomponentID("c10", cell10); - addHighLevelStateSubcomponentID("c11", cell11); - addAtomicHighLevelStateID("q"); - } + this.highLevelStateHandler = new StandardHighLevelStateHandler(this); + highLevelStateHandler.addSubcomponentHighLevelState("c00", DelegatingSubcomponentHighLevelStateHandler::new).set(cell00, null); + highLevelStateHandler.addSubcomponentHighLevelState("c01", DelegatingSubcomponentHighLevelStateHandler::new).set(cell01, null); + highLevelStateHandler.addSubcomponentHighLevelState("c10", DelegatingSubcomponentHighLevelStateHandler::new).set(cell10, null); + highLevelStateHandler.addSubcomponentHighLevelState("c11", DelegatingSubcomponentHighLevelStateHandler::new).set(cell11, null); - @Override - public void setAtomicHighLevelState(String stateID, Object newState) - { - switch (stateID) - { - case "q": - BitVector newStateCasted = (BitVector) newState; - setHighLevelState("c00.q", newStateCasted.subVector(0, 16)); - setHighLevelState("c01.q", newStateCasted.subVector(16, 32)); - setHighLevelState("c10.q", newStateCasted.subVector(32, 48)); - setHighLevelState("c11.q", newStateCasted.subVector(48, 64)); - break; - default: - // should not happen because we tell SubmodelComponent to only allow these state IDs. - throw new IllegalStateException("Illegal atomic state ID: " + stateID); - } - } - - @Override - protected void setSubcomponentHighLevelState(String subcomponentID, String subcomponentHighLevelStateID, Object newState) - { - if (checkSubcomponentID(subcomponentID)) - setHighLevelState(translateDirectCellAccess(subcomponentID, subcomponentHighLevelStateID), newState); - else - super.setSubcomponentHighLevelState(subcomponentID, subcomponentHighLevelStateID, newState); + highLevelStateHandler.addSubcomponentHighLevelState("c0000", DelegatingSubcomponentHighLevelStateHandler::new).set(cell00, "c00"); + highLevelStateHandler.addSubcomponentHighLevelState("c0001", DelegatingSubcomponentHighLevelStateHandler::new).set(cell01, "c00"); + highLevelStateHandler.addSubcomponentHighLevelState("c0010", DelegatingSubcomponentHighLevelStateHandler::new).set(cell10, "c00"); + highLevelStateHandler.addSubcomponentHighLevelState("c0011", DelegatingSubcomponentHighLevelStateHandler::new).set(cell11, "c00"); + highLevelStateHandler.addSubcomponentHighLevelState("c0100", DelegatingSubcomponentHighLevelStateHandler::new).set(cell00, "c01"); + highLevelStateHandler.addSubcomponentHighLevelState("c0101", DelegatingSubcomponentHighLevelStateHandler::new).set(cell01, "c01"); + highLevelStateHandler.addSubcomponentHighLevelState("c0110", DelegatingSubcomponentHighLevelStateHandler::new).set(cell10, "c01"); + highLevelStateHandler.addSubcomponentHighLevelState("c0111", DelegatingSubcomponentHighLevelStateHandler::new).set(cell11, "c01"); + highLevelStateHandler.addSubcomponentHighLevelState("c1000", DelegatingSubcomponentHighLevelStateHandler::new).set(cell00, "c10"); + highLevelStateHandler.addSubcomponentHighLevelState("c1001", DelegatingSubcomponentHighLevelStateHandler::new).set(cell01, "c10"); + highLevelStateHandler.addSubcomponentHighLevelState("c1010", DelegatingSubcomponentHighLevelStateHandler::new).set(cell10, "c10"); + highLevelStateHandler.addSubcomponentHighLevelState("c1011", DelegatingSubcomponentHighLevelStateHandler::new).set(cell11, "c10"); + highLevelStateHandler.addSubcomponentHighLevelState("c1100", DelegatingSubcomponentHighLevelStateHandler::new).set(cell00, "c11"); + highLevelStateHandler.addSubcomponentHighLevelState("c1101", DelegatingSubcomponentHighLevelStateHandler::new).set(cell01, "c11"); + highLevelStateHandler.addSubcomponentHighLevelState("c1110", DelegatingSubcomponentHighLevelStateHandler::new).set(cell10, "c11"); + highLevelStateHandler.addSubcomponentHighLevelState("c1111", DelegatingSubcomponentHighLevelStateHandler::new).set(cell11, "c11"); + highLevelStateHandler.addAtomicHighLevelState("q", BitVectorSplittingAtomicHighLevelStateHandler::new) + .set(Arrays.asList("c00.q", "c01.q", "c10.q", "c11.q"), Arrays.asList(16, 16, 16, 16)); } @Override - public Object getAtomicHighLevelState(String stateID) + public Object getHighLevelState(String stateID) { - switch (stateID) - { - case "q": - BitVector q00 = (BitVector) getHighLevelState("c00.q"); - BitVector q01 = (BitVector) getHighLevelState("c01.q"); - BitVector q10 = (BitVector) getHighLevelState("c10.q"); - BitVector q11 = (BitVector) getHighLevelState("c11.q"); - return q00.concat(q01).concat(q10).concat(q11); - default: - // should not happen because we tell SubmodelComponent to only allow these state IDs. - throw new IllegalStateException("Illegal atomic state ID: " + stateID); - } + return highLevelStateHandler.getHighLevelState(stateID); } @Override - protected Object getSubcomponentHighLevelState(String subcomponentID, String subcomponentHighLevelStateID) - { - if (checkSubcomponentID(subcomponentID)) - return getHighLevelState(translateDirectCellAccess(subcomponentID, subcomponentHighLevelStateID)); - return super.getSubcomponentHighLevelState(subcomponentID, subcomponentHighLevelStateID); - } - - private static String translateDirectCellAccess(String subcomponentID, String subcomponentHighLevelStateID) - { - return 'c' + subcomponentID.substring(3, 5) + "." + subcomponentID.substring(0, 3) + '.' + subcomponentHighLevelStateID; - } - - private static boolean checkSubcomponentID(String subcomponentID) + public void setHighLevelState(String stateID, Object newState) { - if (subcomponentID.length() != 5 || subcomponentID.charAt(0) != 'c') - return false; - char addr3 = subcomponentID.charAt(1); - char addr2 = subcomponentID.charAt(2); - char addr1 = subcomponentID.charAt(3); - char addr0 = subcomponentID.charAt(4); - return (addr3 == '0' || addr3 == '1') || (addr2 == '0' || addr2 == '1') || (addr1 == '0' || addr1 == '1') - || (addr0 == '0' || addr0 == '1'); + highLevelStateHandler.setHighLevelState(stateID, newState); } static