1 package net.mograsim.plugin.launch;
3 import java.util.Arrays;
4 import java.util.function.Consumer;
6 import org.eclipse.core.runtime.PlatformObject;
7 import org.eclipse.core.runtime.Status;
8 import org.eclipse.debug.core.DebugEvent;
9 import org.eclipse.debug.core.DebugException;
10 import org.eclipse.debug.core.DebugPlugin;
11 import org.eclipse.debug.core.ILaunch;
12 import org.eclipse.debug.core.model.IDebugElement;
13 import org.eclipse.debug.core.model.IDebugTarget;
14 import org.eclipse.debug.core.model.IRegister;
15 import org.eclipse.debug.core.model.IRegisterGroup;
16 import org.eclipse.debug.core.model.IValue;
17 import org.eclipse.swt.SWT;
19 import net.mograsim.logic.core.types.BitVector;
20 import net.mograsim.machine.Machine;
21 import net.mograsim.machine.Register;
22 import net.mograsim.plugin.MograsimActivator;
24 public class MachineRegister extends PlatformObject implements IRegister
26 private final MachineRegisterGroup registerGroup;
27 private final Register machineRegister;
29 private final Consumer<BitVector> registerListener;
31 public MachineRegister(MachineRegisterGroup registerGroup, Register machineRegister)
33 this.registerGroup = registerGroup;
34 this.machineRegister = machineRegister;
36 this.registerListener = v -> fireChangeEvent();
37 getMachine().addRegisterListener(machineRegister, registerListener);
39 DebugPlugin.getDefault().addDebugEventListener(es -> Arrays.stream(es).filter(e -> e.getKind() == DebugEvent.TERMINATE).filter(e ->
41 Object source = e.getSource();
42 if (!(source instanceof IDebugElement))
44 return ((IDebugElement) source).getDebugTarget() == getDebugTarget();
45 }).forEach(e -> getMachine().removeRegisterListener(machineRegister, registerListener)));
48 public Machine getMachine()
50 return registerGroup.getMachine();
54 public IValue getValue() throws DebugException
56 return new MachineValue(this);
60 public String getName() throws DebugException
62 return machineRegister.id();// TODO name
66 public String getReferenceTypeName() throws DebugException
72 public boolean hasValueChanged() throws DebugException
79 public String getModelIdentifier()
81 return MograsimActivator.PLUGIN_ID;
85 public IDebugTarget getDebugTarget()
87 return registerGroup.getDebugTarget();
91 public ILaunch getLaunch()
93 return registerGroup.getLaunch();
96 public String getValueString()
98 return getMachine().getRegister(machineRegister).toString();
102 public void setValue(String expression) throws DebugException
104 // TODO exception handling
105 getMachine().setRegister(machineRegister, BitVector.parse(expression));
109 public void setValue(IValue value) throws DebugException
111 if (!"Bitvector".equals(value.getReferenceTypeName()))
112 throw new DebugException(new Status(SWT.ERROR, MograsimActivator.PLUGIN_ID, ""));
113 setValue(value.getValueString());
117 public boolean supportsValueModification()
123 public boolean verifyValue(String expression) throws DebugException
125 // TODO do this prettier; also check length too
128 BitVector.parse(expression);
130 catch (@SuppressWarnings("unused") Exception e)
138 public boolean verifyValue(IValue value) throws DebugException
140 return verifyValue(value.getValueString());
144 public IRegisterGroup getRegisterGroup() throws DebugException
146 return registerGroup;
150 * Fires a change event for this debug element.
152 private void fireChangeEvent()
154 fireEvent(new DebugEvent(this, DebugEvent.CHANGE));
158 * Fires a debug event.
160 * @param event debug event to fire
162 private static void fireEvent(DebugEvent event)
164 DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] { event });