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