1 package net.mograsim.plugin.launch;
3 import java.util.Arrays;
4 import java.util.function.Consumer;
6 import org.eclipse.core.runtime.IStatus;
7 import org.eclipse.core.runtime.PlatformObject;
8 import org.eclipse.core.runtime.Status;
9 import org.eclipse.debug.core.DebugEvent;
10 import org.eclipse.debug.core.DebugException;
11 import org.eclipse.debug.core.DebugPlugin;
12 import org.eclipse.debug.core.ILaunch;
13 import org.eclipse.debug.core.model.IDebugElement;
14 import org.eclipse.debug.core.model.IDebugTarget;
15 import org.eclipse.debug.core.model.IRegister;
16 import org.eclipse.debug.core.model.IRegisterGroup;
17 import org.eclipse.debug.core.model.IValue;
18 import org.eclipse.swt.SWT;
20 import net.mograsim.logic.core.types.BitVector;
21 import net.mograsim.logic.model.BitVectorFormatter;
22 import net.mograsim.machine.Machine;
23 import net.mograsim.machine.registers.Register;
24 import net.mograsim.plugin.MograsimActivator;
26 public class MachineRegister extends PlatformObject implements IRegister
28 private final MachineRegisterGroup registerGroup;
29 private final Register machineRegister;
31 private final Consumer<BitVector> registerListener;
33 public MachineRegister(MachineRegisterGroup registerGroup, Register machineRegister)
35 this.registerGroup = registerGroup;
36 this.machineRegister = machineRegister;
38 this.registerListener = v -> fireChangeEvent();
39 getMachine().addRegisterListener(machineRegister, registerListener);
41 DebugPlugin.getDefault().addDebugEventListener(es -> Arrays.stream(es).filter(e -> e.getKind() == DebugEvent.TERMINATE).filter(e ->
43 Object source = e.getSource();
44 if (!(source instanceof IDebugElement))
46 return ((IDebugElement) source).getDebugTarget() == getDebugTarget();
47 }).forEach(e -> getMachine().removeRegisterListener(machineRegister, registerListener)));
50 public Machine getMachine()
52 return registerGroup.getMachine();
56 public IValue getValue() throws DebugException
58 return new MachineValue(this);
62 public String getName() throws DebugException
64 return machineRegister.id();// TODO name
68 public String getReferenceTypeName() throws DebugException
74 public boolean hasValueChanged() throws DebugException
81 public String getModelIdentifier()
83 return MograsimActivator.PLUGIN_ID;
87 public IDebugTarget getDebugTarget()
89 return registerGroup.getDebugTarget();
93 public ILaunch getLaunch()
95 return registerGroup.getLaunch();
98 public String getValueString()
100 return BitVectorFormatter.formatAsString(getMachine().getRegister(machineRegister), false);
104 public void setValue(String expression) throws DebugException
106 BitVector bitvector = BitVectorFormatter.parseUserBitVector(expression, machineRegister.getWidth());
107 if (bitvector == null)
108 throw new DebugException(
109 new Status(IStatus.ERROR, MograsimActivator.PLUGIN_ID, "Couldn't parse value string: " + expression, null));
110 getMachine().setRegister(machineRegister, bitvector);
114 public void setValue(IValue value) throws DebugException
116 if (!"Bitvector".equals(value.getReferenceTypeName()))
117 throw new DebugException(new Status(SWT.ERROR, MograsimActivator.PLUGIN_ID, ""));
118 setValue(value.getValueString());
122 public boolean supportsValueModification()
128 public boolean verifyValue(String expression) throws DebugException
130 return BitVectorFormatter.parseUserBitVector(expression, machineRegister.getWidth()) != null;
134 public boolean verifyValue(IValue value) throws DebugException
136 return verifyValue(value.getValueString());
140 public IRegisterGroup getRegisterGroup() throws DebugException
142 return registerGroup;
146 * Fires a change event for this debug element.
148 private void fireChangeEvent()
150 fireEvent(new DebugEvent(this, DebugEvent.CHANGE));
154 * Fires a debug event.
156 * @param event debug event to fire
158 private static void fireEvent(DebugEvent event)
160 DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] { event });