Updated Am2900Machine and -Definition; Added MachineContext
[Mograsim.git] / net.mograsim.machine / src / net / mograsim / machine / mi / MicroInstructionDefinition.java
1 package net.mograsim.machine.mi;
2
3 import java.math.BigInteger;
4
5 import net.mograsim.machine.mi.parameters.IntegerClassification;
6 import net.mograsim.machine.mi.parameters.IntegerImmediate;
7 import net.mograsim.machine.mi.parameters.MicroInstructionParameter;
8 import net.mograsim.machine.mi.parameters.MnemonicFamily;
9 import net.mograsim.machine.mi.parameters.ParameterClassification;
10 import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType;
11
12 public interface MicroInstructionDefinition
13 {
14         /**
15          * @return The {@link ParameterClassification}s of which a MicroInstruction is composed.
16          */
17         public ParameterClassification[] getParameterClassifications();
18         
19         /**
20          * @throws IndexOutOfBoundsException
21          */
22         public ParameterClassification getParameterClassification(int index);
23         
24         
25         /**
26          * @return The amount of {@link MicroInstructionParameter}s in a {@link MicroInstruction} that follows this definition.
27          */
28         public default int size()
29         {
30                 return getParameterClassifications().length;
31         }
32         
33         public default MicroInstruction createDefaultInstruction()
34         {
35                 int size = size();
36                 MicroInstructionParameter[] params = new MicroInstructionParameter[size];
37                 ParameterClassification[] classes = getParameterClassifications();
38                 for(int i = 0; i < size; i++)
39                 {
40                         MicroInstructionParameter newParam;
41                         ParameterClassification classification = classes[i];
42                         ParameterType type = classification.getExpectedType();
43                         switch(type)
44                         {
45                         case BOOLEAN_IMMEDIATE:
46                         case MNEMONIC:
47                                 newParam = ((MnemonicFamily) classification).get(0);
48                                 break;
49                         case INTEGER_IMMEDIATE:
50                                 newParam = new IntegerImmediate(BigInteger.valueOf(0), ((IntegerClassification) classification).getExpectedBits());
51                                 break;
52                         default:
53                                 throw new IllegalStateException("Unknown ParameterType " + type);
54                         }
55                         params[i] = newParam;
56                 }
57                 return new StandardMicroInstruction(params);
58         }
59         
60         public static MicroInstructionDefinition create(ParameterClassification... classes)
61         {
62                 return new StandardMicroInstructionDefinition(classes);
63         }
64 }