Moved TODOs from getting_started.md to the source code
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / launch / MachineRegister.java
1 package net.mograsim.plugin.launch;
2
3 import java.util.Arrays;
4 import java.util.function.Consumer;
5
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;
18
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;
23
24 public class MachineRegister extends PlatformObject implements IRegister
25 {
26         private final MachineRegisterGroup registerGroup;
27         private final Register machineRegister;
28
29         private final Consumer<BitVector> registerListener;
30
31         public MachineRegister(MachineRegisterGroup registerGroup, Register machineRegister)
32         {
33                 this.registerGroup = registerGroup;
34                 this.machineRegister = machineRegister;
35
36                 this.registerListener = v -> fireChangeEvent();
37                 getMachine().addRegisterListener(machineRegister, registerListener);
38
39                 DebugPlugin.getDefault().addDebugEventListener(es -> Arrays.stream(es).filter(e -> e.getKind() == DebugEvent.TERMINATE).filter(e ->
40                 {
41                         Object source = e.getSource();
42                         if (!(source instanceof IDebugElement))
43                                 return false;
44                         return ((IDebugElement) source).getDebugTarget() == getDebugTarget();
45                 }).forEach(e -> getMachine().removeRegisterListener(machineRegister, registerListener)));
46         }
47
48         public Machine getMachine()
49         {
50                 return registerGroup.getMachine();
51         }
52
53         @Override
54         public IValue getValue() throws DebugException
55         {
56                 return new MachineValue(this);
57         }
58
59         @Override
60         public String getName() throws DebugException
61         {
62                 return machineRegister.id();// TODO name
63         }
64
65         @Override
66         public String getReferenceTypeName() throws DebugException
67         {
68                 return "BitVector";
69         }
70
71         @Override
72         public boolean hasValueChanged() throws DebugException
73         {
74                 // TODO
75                 return false;
76         }
77
78         @Override
79         public String getModelIdentifier()
80         {
81                 return MograsimActivator.PLUGIN_ID;
82         }
83
84         @Override
85         public IDebugTarget getDebugTarget()
86         {
87                 return registerGroup.getDebugTarget();
88         }
89
90         @Override
91         public ILaunch getLaunch()
92         {
93                 return registerGroup.getLaunch();
94         }
95
96         public String getValueString()
97         {
98                 // TODO view in hex
99                 return getMachine().getRegister(machineRegister).toString();
100         }
101
102         @Override
103         public void setValue(String expression) throws DebugException
104         {
105                 // TODO support hex
106                 // TODO exception handling
107                 getMachine().setRegister(machineRegister, BitVector.parse(expression));
108         }
109
110         @Override
111         public void setValue(IValue value) throws DebugException
112         {
113                 if (!"Bitvector".equals(value.getReferenceTypeName()))
114                         throw new DebugException(new Status(SWT.ERROR, MograsimActivator.PLUGIN_ID, ""));
115                 setValue(value.getValueString());
116         }
117
118         @Override
119         public boolean supportsValueModification()
120         {
121                 return true;
122         }
123
124         @Override
125         public boolean verifyValue(String expression) throws DebugException
126         {
127                 // TODO do this prettier; also check length too
128                 try
129                 {
130                         BitVector.parse(expression);
131                 }
132                 catch (@SuppressWarnings("unused") Exception e)
133                 {
134                         return false;
135                 }
136                 return true;
137         }
138
139         @Override
140         public boolean verifyValue(IValue value) throws DebugException
141         {
142                 return verifyValue(value.getValueString());
143         }
144
145         @Override
146         public IRegisterGroup getRegisterGroup() throws DebugException
147         {
148                 return registerGroup;
149         }
150
151         /**
152          * Fires a change event for this debug element.
153          */
154         private void fireChangeEvent()
155         {
156                 fireEvent(new DebugEvent(this, DebugEvent.CHANGE));
157         }
158
159         /**
160          * Fires a debug event.
161          *
162          * @param event debug event to fire
163          */
164         private static void fireEvent(DebugEvent event)
165         {
166                 DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] { event });
167         }
168 }