da843922df7f4f3c8b80fb966dea7f99c7414651
[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 SIMPLE_AM2900_MACHINE_ID = "Am2900Simple";
24         public static final String STRICT_AM2900_MACHINE_ID = "Am2900Strict";
25         public static final String SIMPLE_AM2900_DESCRIPTION = "Am2900Simple\nTODO Description";
26         public static final String STRICT_AM2900_DESCRIPTION = "Am2900Strict\nTODO Description";
27
28         public static final List<Register> unsortedRegisters;
29         public static final List<RegisterGroup> registerGroups;
30
31         static
32         {
33                 List<Register> unsortedRegistersModifiable = new ArrayList<>();
34                 unsortedRegistersModifiable.add(muInstrRegister.instance);
35                 unsortedRegistersModifiable.add(InstrRegister.instance);
36                 unsortedRegistersModifiable.add(PCRegister.instance);
37                 unsortedRegisters = Collections.unmodifiableList(unsortedRegistersModifiable);
38                 List<RegisterGroup> registerGroupsModifiable = new ArrayList<>();
39                 registerGroupsModifiable.add(Am2901RegisterGroup.instance);
40                 registerGroupsModifiable.add(Am2904RegisterGroup.instance);
41                 registerGroupsModifiable.add(Am2910RegisterGroup.instance);
42                 registerGroups = Collections.unmodifiableList(registerGroupsModifiable);
43         }
44
45         public final boolean strict;
46
47         protected AbstractAm2900MachineDefinition(boolean strict)
48         {
49                 this.strict = strict;
50         }
51
52         @Override
53         public String getId()
54         {
55                 return strict ? STRICT_AM2900_MACHINE_ID : SIMPLE_AM2900_MACHINE_ID;
56         }
57
58         @Override
59         public String getDescription()
60         {
61                 return strict ? STRICT_AM2900_DESCRIPTION : SIMPLE_AM2900_DESCRIPTION;
62         }
63
64         @Override
65         public Am2900Machine createNew()
66         {
67                 return createNew(new LogicModelModifiable());
68         }
69
70         public Am2900Machine createNew(LogicModelModifiable model)
71         {
72                 return new Am2900Machine(model, this);
73         }
74
75         @Override
76         public ISASchema getISASchema()
77         {
78                 // TODO Auto-generated method stub
79                 return null;
80         }
81
82         @Override
83         public List<Register> getUnsortedRegisters()
84         {
85                 return unsortedRegisters;
86         }
87
88         @Override
89         public List<RegisterGroup> getRegisterGroups()
90         {
91                 return registerGroups;
92         }
93
94         @Override
95         public int getAddressBits()
96         {
97                 return 16;
98         }
99
100         @Override
101         public Am2900MainMemoryDefinition getMainMemoryDefinition()
102         {
103                 return Am2900MainMemoryDefinition.instance;
104         }
105
106         @Override
107         public int hashCode()
108         {
109                 return strict ? 12345 : 54321;
110         }
111
112         @Override
113         public boolean equals(Object obj)
114         {
115                 return obj != null && obj instanceof AbstractAm2900MachineDefinition
116                                 && ((AbstractAm2900MachineDefinition) obj).strict == this.strict;
117         }
118
119         @Override
120         public Am2900MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition()
121         {
122                 return Am2900MicroInstructionMemoryDefinition.instance;
123         }
124
125 }