1 package net.mograsim.machine.mi;
3 import java.io.BufferedReader;
4 import java.io.FileInputStream;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7 import java.io.InputStreamReader;
8 import java.io.OutputStreamWriter;
9 import java.math.BigInteger;
10 import java.util.ArrayList;
11 import java.util.List;
13 import net.mograsim.logic.core.types.BitVector;
14 import net.mograsim.machine.MemoryDefinition;
15 import net.mograsim.machine.mi.parameters.BooleanClassification;
16 import net.mograsim.machine.mi.parameters.IntegerClassification;
17 import net.mograsim.machine.mi.parameters.IntegerImmediate;
18 import net.mograsim.machine.mi.parameters.MicroInstructionParameter;
19 import net.mograsim.machine.mi.parameters.MnemonicFamily;
20 import net.mograsim.machine.mi.parameters.MnemonicFamily.MnemonicPair;
21 import net.mograsim.machine.mi.parameters.ParameterClassification;
23 public class MicroprogramMemoryParser
25 public static MicroprogramMemory parseMemory(MicroInstructionDefinition definition, String input) throws IOException
27 try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(input))))
29 return parseMemory(definition, reader);
33 public static MicroprogramMemory parseMemory(MicroInstructionDefinition definition, BufferedReader input)
35 List<MicroInstruction> instructions = new ArrayList<>();
39 while (input.ready() && !"".equals((line = input.readLine())))
40 instructions.add(parse(definition, line));
41 } catch (IOException e)
46 int maxAddress = instructions.size() - 1;
47 MicroprogramMemory memory = MicroprogramMemory
48 .create(MemoryDefinition.create((int) Math.ceil(Math.log(maxAddress)), 0, maxAddress));
50 for (MicroInstruction inst : instructions)
51 memory.setCell(i++, inst);
55 public static MicroInstruction parse(MicroInstructionDefinition definition, String toParse)
57 int size = definition.size();
58 String[] strings = toParse.split(",");
59 if (size != strings.length)
60 throw new MicroprogramMemoryParseException(
61 "String does not match definition! The number of parameters does not match.");
62 MicroInstructionParameter[] params = new MicroInstructionParameter[size];
63 ParameterClassification[] classes = definition.getParameterClassifications();
66 for (int i = 0; i < size; i++)
68 params[i] = classes[i].parse(strings[i]);
70 return new StandardMicroInstruction(params);
73 throw new MicroprogramMemoryParseException(e.getCause());
77 public static void write(MicroprogramMemory memory, String output) throws IOException
79 try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(output)))
81 write(memory, writer);
85 public static void write(MicroprogramMemory memory, OutputStreamWriter output) throws IOException
87 MemoryDefinition def = memory.getDefinition();
88 long min = def.getMinimalAddress(), max = def.getMaximalAddress() + 1;
89 for (long i = min; i < max; i++)
91 output.write(toCSV(memory.getCell(i)) + "\n");
95 private static String toCSV(MicroInstruction inst)
97 int max = inst.getSize() - 1;
98 StringBuilder sb = new StringBuilder();
99 for (int i = 0; i < max; i++)
101 sb.append(inst.getParameter(i).toString());
104 sb.append(inst.getParameter(max).toString());
105 return sb.toString();
108 public static void main(String[] args)
110 MnemonicFamily family = new MnemonicFamily(new MnemonicPair("ZERO", BitVector.SINGLE_0),
111 new MnemonicPair("ONE", BitVector.SINGLE_1));
112 BooleanClassification boolClass = new BooleanClassification("H", "L");
113 MicroInstructionDefinition def = MicroInstructionDefinition.create(boolClass,
114 new IntegerClassification(8), family);
115 MicroprogramMemory memory = new StandardMicroprogramMemory(MemoryDefinition.create(4, 0, 16));
116 for (int i = 0; i < 17; i++)
117 memory.setCell(i, new StandardMicroInstruction(boolClass.get(false),
118 new IntegerImmediate(BigInteger.valueOf(i), 8), family.get(i % 2)));
121 write(memory, "test.txt");
122 MicroprogramMemory newMemory = parseMemory(def, "test.txt");
123 write(newMemory, "test2.txt");
124 } catch (IOException e)