80bce7996d09c36603df7814c932f775efb470e5
[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.ArrayList;
4 import java.util.Collections;
5 import java.util.List;
6
7 import net.mograsim.logic.model.am2900.machine.registers.InstrRegister;
8 import net.mograsim.logic.model.am2900.machine.registers.PCRegister;
9 import net.mograsim.logic.model.am2900.machine.registers.muInstrRegister;
10 import net.mograsim.logic.model.am2900.machine.registers.am2901.Am2901RegisterGroup;
11 import net.mograsim.logic.model.am2900.machine.registers.am2904.Am2904RegisterGroup;
12 import net.mograsim.logic.model.am2900.machine.registers.am2910.Am2910RegisterGroup;
13 import net.mograsim.logic.model.model.LogicModelModifiable;
14 import net.mograsim.machine.ISASchema;
15 import net.mograsim.machine.MachineDefinition;
16 import net.mograsim.machine.registers.Register;
17 import net.mograsim.machine.registers.RegisterGroup;
18
19 //we can't use the Singleton pattern here because a MachineDefinition needs a public parameterless constructor
20 //(used for detecting installed machines in plugin.core)
21 public class AbstractAm2900MachineDefinition implements MachineDefinition
22 {
23         public static final String AM2900_TEACHING_MACHINE_ID = "Am2900Teaching";
24         public static final String AM2900_EXPERT_MACHINE_ID = "Am2900Expert";
25         public static final String AM2900_TEACHING_DESCRIPTION = "Am2900 for teaching purposes.\nAll registers are reset to 0 when starting.";
26         public static final String AM2900_EXPERT_DESCRIPTION = "Am2900 \"for experts\".\nOnly the \u00b5PC will be reset to 0 when starting."
27                         + "The microprogram will have to reset the other registers manually, including the PC.";
28
29         public static final List<Register> unsortedRegisters;
30         public static final List<RegisterGroup> registerGroups;
31
32         static
33         {
34                 List<Register> unsortedRegistersModifiable = new ArrayList<>();
35                 unsortedRegistersModifiable.add(muInstrRegister.instance);
36                 unsortedRegistersModifiable.add(InstrRegister.instance);
37                 unsortedRegistersModifiable.add(PCRegister.instance);
38                 unsortedRegisters = Collections.unmodifiableList(unsortedRegistersModifiable);
39                 List<RegisterGroup> registerGroupsModifiable = new ArrayList<>();
40                 registerGroupsModifiable.add(Am2901RegisterGroup.instance);
41                 registerGroupsModifiable.add(Am2904RegisterGroup.instance);
42                 registerGroupsModifiable.add(Am2910RegisterGroup.instance);
43                 registerGroups = Collections.unmodifiableList(registerGroupsModifiable);
44         }
45
46         public final boolean expert;
47
48         protected AbstractAm2900MachineDefinition(boolean expert)
49         {
50                 this.expert = expert;
51         }
52
53         @Override
54         public String getId()
55         {
56                 return expert ? AM2900_EXPERT_MACHINE_ID : AM2900_TEACHING_MACHINE_ID;
57         }
58
59         @Override
60         public String getDescription()
61         {
62                 return expert ? AM2900_EXPERT_DESCRIPTION : AM2900_TEACHING_DESCRIPTION;
63         }
64
65         @Override
66         public Am2900Machine createNew()
67         {
68                 return createNew(new LogicModelModifiable());
69         }
70
71         public Am2900Machine createNew(LogicModelModifiable model)
72         {
73                 return new Am2900Machine(model, this);
74         }
75
76         @Override
77         public ISASchema getISASchema()
78         {
79                 // TODO Auto-generated method stub
80                 return null;
81         }
82
83         @Override
84         public List<Register> getUnsortedRegisters()
85         {
86                 return unsortedRegisters;
87         }
88
89         @Override
90         public List<RegisterGroup> getRegisterGroups()
91         {
92                 return registerGroups;
93         }
94
95         @Override
96         public int getAddressBits()
97         {
98                 return 16;
99         }
100
101         @Override
102         public Am2900MainMemoryDefinition getMainMemoryDefinition()
103         {
104                 return Am2900MainMemoryDefinition.instance;
105         }
106
107         @Override
108         public int hashCode()
109         {
110                 return expert ? 12345 : 54321;
111         }
112
113         @Override
114         public boolean equals(Object obj)
115         {
116                 return obj != null && obj instanceof AbstractAm2900MachineDefinition
117                                 && ((AbstractAm2900MachineDefinition) obj).expert == this.expert;
118         }
119
120         @Override
121         public Am2900MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition()
122         {
123                 return Am2900MicroInstructionMemoryDefinition.instance;
124         }
125
126 }