1 package net.mograsim.machine.registers;
3 import java.util.Arrays;
4 import java.util.HashMap;
6 import java.util.function.Consumer;
8 import net.mograsim.logic.core.types.BitVector;
9 import net.mograsim.logic.model.model.components.ModelComponent;
11 public class HighLevelStateBasedRegister extends SimpleRegister implements ModelComponentBasedRegister
13 private final String[] hlsIDsToConcat;
14 private final int[] hlsWidthes;
16 private final Map<Consumer<BitVector>, Consumer<Object>> modelListenersPerRegisterListener;
18 public HighLevelStateBasedRegister(String id, String hlsID, int logicWidth)
20 this(id, new int[] { logicWidth }, hlsID);
23 public HighLevelStateBasedRegister(String id, int[] hlsWidthes, String... hlsIDsToConcat)
25 super(id, Arrays.stream(hlsWidthes).sum());
26 if (hlsIDsToConcat.length != hlsWidthes.length)
27 throw new IllegalArgumentException();
28 this.hlsIDsToConcat = Arrays.copyOf(hlsIDsToConcat, hlsIDsToConcat.length);
29 this.hlsWidthes = Arrays.copyOf(hlsWidthes, hlsIDsToConcat.length);
31 this.modelListenersPerRegisterListener = new HashMap<>();
35 public BitVector read(ModelComponent component)
37 BitVector result = BitVector.of();
38 for (int i = 0; i < hlsIDsToConcat.length; i++)
40 BitVector hls = (BitVector) component.getHighLevelState(hlsIDsToConcat[i]);
41 if (hls.length() != hlsWidthes[i])
42 throw new IllegalArgumentException();
43 result = result.concat(hls);
49 public void write(ModelComponent component, BitVector value)
51 if (value.length() != getWidth())
52 throw new IllegalArgumentException();
53 for (int i = 0, off = 0; i < hlsIDsToConcat.length; i++)
57 component.setHighLevelState(hlsIDsToConcat[i], value.subVector(oldOff, off));
62 public void addListener(ModelComponent component, Consumer<BitVector> listener)
64 if (modelListenersPerRegisterListener.containsKey(listener))
67 Consumer<Object> modelListener = v -> listener.accept(read(component));
68 for (String hlsID : hlsIDsToConcat)
69 component.addHighLevelStateListener(hlsID, modelListener);
73 public void removeListener(ModelComponent component, Consumer<BitVector> listener)
75 Consumer<Object> modelListener = modelListenersPerRegisterListener.get(listener);
76 if (modelListener == null)
79 for (String hlsID : hlsIDsToConcat)
80 component.removeHighLevelStateListener(hlsID, modelListener);