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