Restructured register system
[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.model.LogicModelModifiable;
8 import net.mograsim.machine.ISASchema;
9 import net.mograsim.machine.MachineDefinition;
10 import net.mograsim.machine.registers.Register;
11 import net.mograsim.machine.registers.RegisterGroup;
12
13 //we can't use the Singleton pattern here because a MachineDefinition needs a public parameterless constructor
14 //(used for detecting installed machines in plugin.core)
15 public class AbstractAm2900MachineDefinition implements MachineDefinition
16 {
17         public static final String SIMPLE_AM2900_MACHINE_ID = "Am2900Simple";
18         public static final String STRICT_AM2900_MACHINE_ID = "Am2900Strict";
19
20         public static final List<Register> unsortedRegisters;
21         public static final List<RegisterGroup> registerGroups;
22
23         static
24         {
25                 List<Register> unsortedRegistersModifiable = new ArrayList<>();
26                 // TODO MIR, IR, PC/BZ...
27                 unsortedRegisters = Collections.unmodifiableList(unsortedRegistersModifiable);
28                 List<RegisterGroup> registerGroupsModifiable = new ArrayList<>();
29                 // TODO Am2901, Am2904, Am2910
30                 registerGroups = Collections.unmodifiableList(registerGroupsModifiable);
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 List<Register> getUnsortedRegisters()
66         {
67                 return unsortedRegisters;
68         }
69
70         @Override
71         public List<RegisterGroup> getRegisterGroups()
72         {
73                 return registerGroups;
74         }
75
76         @Override
77         public int getAddressBits()
78         {
79                 return 16;
80         }
81
82         @Override
83         public Am2900MainMemoryDefinition getMainMemoryDefinition()
84         {
85                 return Am2900MainMemoryDefinition.instance;
86         }
87
88         @Override
89         public int hashCode()
90         {
91                 return strict ? 12345 : 54321;
92         }
93
94         @Override
95         public boolean equals(Object obj)
96         {
97                 return obj != null && obj instanceof AbstractAm2900MachineDefinition
98                                 && ((AbstractAm2900MachineDefinition) obj).strict == this.strict;
99         }
100
101         @Override
102         public Am2900MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition()
103         {
104                 return Am2900MicroInstructionMemoryDefinition.instance;
105         }
106
107 }