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.registers.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()
99 return getMachine().getRegister(machineRegister).toString();
103 public void setValue(String expression) throws DebugException
106 // TODO exception handling
107 getMachine().setRegister(machineRegister, BitVector.parse(expression));
111 public void setValue(IValue value) throws DebugException
113 if (!"Bitvector".equals(value.getReferenceTypeName()))
114 throw new DebugException(new Status(SWT.ERROR, MograsimActivator.PLUGIN_ID, ""));
115 setValue(value.getValueString());
119 public boolean supportsValueModification()
125 public boolean verifyValue(String expression) throws DebugException
127 // TODO do this prettier; also check length too
130 BitVector.parse(expression);
132 catch (@SuppressWarnings("unused") Exception e)
140 public boolean verifyValue(IValue value) throws DebugException
142 return verifyValue(value.getValueString());
146 public IRegisterGroup getRegisterGroup() throws DebugException
148 return registerGroup;
152 * Fires a change event for this debug element.
154 private void fireChangeEvent()
156 fireEvent(new DebugEvent(this, DebugEvent.CHANGE));
160 * Fires a debug event.
162 * @param event debug event to fire
164 private static void fireEvent(DebugEvent event)
166 DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] { event });