Added RegisterGroups for MachineDefinition
[Mograsim.git] / plugins / net.mograsim.logic.model.am2900 / src / net / mograsim / logic / model / am2900 / machine / AbstractAm2900MachineDefinition.java
1 package net.mograsim.logic.model.am2900.machine;
2
3 import java.util.Collections;
4 import java.util.HashSet;
5 import java.util.Set;
6
7 import net.mograsim.logic.model.am2900.machine.registers.NumberedRegister;
8 import net.mograsim.logic.model.am2900.machine.registers.QRegister;
9 import net.mograsim.logic.model.model.LogicModelModifiable;
10 import net.mograsim.machine.ISASchema;
11 import net.mograsim.machine.MachineDefinition;
12 import net.mograsim.machine.Register;
13 import net.mograsim.machine.RegisterGroup;
14
15 //we can't use the Singleton pattern here because a MachineDefinition needs a public parameterless constructor
16 //(used for detecting installed machines in plugin.core)
17 public class AbstractAm2900MachineDefinition implements MachineDefinition
18 {
19         public static final String SIMPLE_AM2900_MACHINE_ID = "Am2900Simple";
20         public static final String STRICT_AM2900_MACHINE_ID = "Am2900Strict";
21
22         public static final Set<Register> allRegisters;
23
24         static
25         {
26                 Set<Register> allRegistersModifiable = new HashSet<>();
27                 allRegistersModifiable.add(QRegister.instance);
28                 allRegistersModifiable.addAll(NumberedRegister.instancesCorrectOrder);
29                 // TODO MSR, muSR, MIR, IR, PC/BZ...
30                 allRegisters = Collections.unmodifiableSet(allRegistersModifiable);
31         }
32
33         public final boolean strict;
34
35         protected AbstractAm2900MachineDefinition(boolean strict)
36         {
37                 this.strict = strict;
38         }
39
40         @Override
41         public String getId()
42         {
43                 return strict ? STRICT_AM2900_MACHINE_ID : SIMPLE_AM2900_MACHINE_ID;
44         }
45
46         @Override
47         public Am2900Machine createNew()
48         {
49                 return createNew(new LogicModelModifiable());
50         }
51
52         public Am2900Machine createNew(LogicModelModifiable model)
53         {
54                 return new Am2900Machine(model, this);
55         }
56
57         @Override
58         public ISASchema getISASchema()
59         {
60                 // TODO Auto-generated method stub
61                 return null;
62         }
63
64         @Override
65         public Set<Register> getRegisters()
66         {
67                 return allRegisters;
68         }
69
70         @Override
71         public int getAddressBits()
72         {
73                 return 16;
74         }
75
76         @Override
77         public Am2900MainMemoryDefinition getMainMemoryDefinition()
78         {
79                 return Am2900MainMemoryDefinition.instance;
80         }
81
82         @Override
83         public int hashCode()
84         {
85                 return strict ? 12345 : 54321;
86         }
87
88         @Override
89         public boolean equals(Object obj)
90         {
91                 return obj != null && obj instanceof AbstractAm2900MachineDefinition
92                                 && ((AbstractAm2900MachineDefinition) obj).strict == this.strict;
93         }
94
95         @Override
96         public Am2900MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition()
97         {
98                 return Am2900MicroInstructionMemoryDefinition.instance;
99         }
100
101         @Override
102         public Set<RegisterGroup> getRegisterGroups()
103         {
104                 return null; // TODO create groups for am2904, am2901-asmUsable, am2901-internal, ...
105         }
106
107 }