Merge branch threads into development
[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
14 //we can't use the Singleton pattern here because a MachineDefinition needs a public parameterless constructor
15 //(used for detecting installed machines in plugin.core)
16 public class AbstractAm2900MachineDefinition implements MachineDefinition
17 {
18         public static final String SIMPLE_AM2900_MACHINE_ID = "Am2900Simple";
19         public static final String STRICT_AM2900_MACHINE_ID = "Am2900Strict";
20
21         public static final Set<Register> allRegisters;
22
23         static
24         {
25                 Set<Register> allRegistersModifiable = new HashSet<>();
26                 allRegistersModifiable.add(QRegister.instance);
27                 allRegistersModifiable.addAll(NumberedRegister.instancesCorrectOrder);
28                 // TODO MSR, muSR, MIR, IR, PC/BZ...
29                 allRegisters = Collections.unmodifiableSet(allRegistersModifiable);
30         }
31
32         public final boolean strict;
33
34         protected AbstractAm2900MachineDefinition(boolean strict)
35         {
36                 this.strict = strict;
37         }
38
39         @Override
40         public String getId()
41         {
42                 return strict ? STRICT_AM2900_MACHINE_ID : SIMPLE_AM2900_MACHINE_ID;
43         }
44
45         @Override
46         public Am2900Machine createNew()
47         {
48                 return createNew(new LogicModelModifiable());
49         }
50
51         public Am2900Machine createNew(LogicModelModifiable model)
52         {
53                 return new Am2900Machine(model, this);
54         }
55
56         @Override
57         public ISASchema getISASchema()
58         {
59                 // TODO Auto-generated method stub
60                 return null;
61         }
62
63         @Override
64         public Set<Register> getRegisters()
65         {
66                 return allRegisters;
67         }
68
69         @Override
70         public int getAddressBits()
71         {
72                 return 16;
73         }
74
75         @Override
76         public Am2900MainMemoryDefinition getMainMemoryDefinition()
77         {
78                 return Am2900MainMemoryDefinition.instance;
79         }
80
81         @Override
82         public int hashCode()
83         {
84                 return strict ? 12345 : 54321;
85         }
86
87         @Override
88         public boolean equals(Object obj)
89         {
90                 return obj != null && obj instanceof AbstractAm2900MachineDefinition
91                                 && ((AbstractAm2900MachineDefinition) obj).strict == this.strict;
92         }
93
94         @Override
95         public Am2900MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition()
96         {
97                 return Am2900MicroInstructionMemoryDefinition.instance;
98         }
99
100 }