1 package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic;
3 import java.util.ArrayList;
6 import java.util.function.Function;
7 import java.util.stream.Collectors;
9 import net.mograsim.logic.core.types.Bit;
10 import net.mograsim.logic.core.types.BitVector;
11 import net.mograsim.logic.model.model.components.submodels.SubmodelComponent;
12 import net.mograsim.logic.model.model.wires.GUIWire;
13 import net.mograsim.logic.model.serializing.IdentifierGetter;
14 import net.mograsim.logic.model.snippets.SnippetDefinintion;
15 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.HighLevelStateHandlerContext;
16 import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers;
18 public class WireForcingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler
20 private SubmodelComponent component;
21 private int logicWidth;
22 private final List<GUIWire> wiresToForce;
23 private final List<GUIWire> wiresToForceInverted;
25 public WireForcingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context)
30 public WireForcingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context, WireForcingAtomicHighLevelStateHandlerParams params)
32 this.component = context.component;
33 this.wiresToForce = new ArrayList<>();
34 this.wiresToForceInverted = new ArrayList<>();
37 Map<String, GUIWire> wiresByName = component.submodel.getWiresByName();
38 setWiresToForce(params.wiresToForce.stream().map((Function<String, GUIWire>) wiresByName::get).collect(Collectors.toList()),
39 params.wiresToForceInverted.stream().map((Function<String, GUIWire>) wiresByName::get).collect(Collectors.toList()));
43 public void set(List<GUIWire> wiresToForce, List<GUIWire> wiresToForceInverted)
45 setWiresToForce(wiresToForce, wiresToForceInverted);
48 public void setWiresToForce(List<GUIWire> wiresToForce, List<GUIWire> wiresToForceInverted)
51 for (GUIWire wire : wiresToForce)
52 addWireToForce(wire, false);
53 for (GUIWire wire : wiresToForceInverted)
54 addWireToForce(wire, true);
57 public void addWireToForce(GUIWire wire, boolean inverted)
59 if (component.submodel.getWiresByName().get(wire.name) != wire)
60 throw new IllegalArgumentException("Can only force wires belonging to the parent component of this handler");
62 logicWidth = wire.logicWidth;
63 else if (wire.logicWidth != logicWidth)
64 throw new IllegalArgumentException("Can only force wires of the same logic width");
66 wiresToForceInverted.add(wire);
68 wiresToForce.add(wire);
71 public void clearWiresToForce()
74 wiresToForceInverted.clear();
79 public Object getHighLevelState()
81 BitVector result = BitVector.of(Bit.ZERO, logicWidth);
82 for (GUIWire wire : wiresToForceInverted)
83 if (wire.hasLogicModelBinding())
84 result = result.or(wire.getWireValues());
85 result = result.not();
86 for (GUIWire wire : wiresToForce)
87 if (wire.hasLogicModelBinding())
88 result = result.and(wire.getWireValues());
93 public void setHighLevelState(Object newState)
96 if (newState instanceof Bit)
97 vector = BitVector.of((Bit) newState);
99 vector = (BitVector) newState;
100 for (GUIWire wire : wiresToForce)
101 if (wire.hasLogicModelBinding())
102 wire.forceWireValues(vector);
103 vector = vector.not();
104 for (GUIWire wire : wiresToForceInverted)
105 if (wire.hasLogicModelBinding())
106 wire.forceWireValues(vector);
110 public WireForcingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifierGetter idGetter)
112 WireForcingAtomicHighLevelStateHandlerParams params = new WireForcingAtomicHighLevelStateHandlerParams();
113 params.wiresToForce = wiresToForce.stream().map(w -> w.name).collect(Collectors.toList());
114 params.wiresToForceInverted = wiresToForceInverted.stream().map(w -> w.name).collect(Collectors.toList());
118 public static class WireForcingAtomicHighLevelStateHandlerParams
120 public List<String> wiresToForce;
121 public List<String> wiresToForceInverted;
126 StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.setSnippetSupplier(
127 WireForcingAtomicHighLevelStateHandler.class.getCanonicalName(),
128 SnippetDefinintion.create(WireForcingAtomicHighLevelStateHandlerParams.class, WireForcingAtomicHighLevelStateHandler::new));