--- /dev/null
+package net.mograsim.machine.mi;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+
+import net.mograsim.machine.MemoryDefinition;
+import net.mograsim.machine.mi.parameters.MicroInstructionParameter;
+import net.mograsim.machine.mi.parameters.ParameterClassification;
+
+public class MicroInstructionMemoryParser
+{
+ public static void parseMemory(final MicroInstructionMemory memory, String inputPath) throws IOException
+ {
+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputPath))))
+ {
+ parseMemory(memory, reader);
+ }
+ }
+
+ public static void parseMemory(final MicroInstructionMemory memory, BufferedReader input)
+ {
+ MicroInstructionMemoryDefinition def = memory.getDefinition();
+ MicroInstructionDefinition miDef = def.getMicroInstructionDefinition();
+
+ long minAddr = def.getMinimalAddress();
+ long maxAddr = def.getMaximalAddress();
+
+ String line;
+ long i = minAddr;
+ try
+ {
+ for (; i <= maxAddr && input.ready() && !"".equals((line = input.readLine())); i++)
+ {
+ long iFinal = i;
+ memory.setCell(i, parse(() -> memory.notifyObservers(iFinal), miDef, line));
+ }
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+
+ for (; i <= maxAddr; i++)
+ {
+ long iFinal = i;
+ memory.setCell(i, miDef.createDefaultInstruction(() -> memory.notifyObservers(iFinal)));
+ }
+ }
+
+ public static MicroInstruction parse(Runnable updateCallback, MicroInstructionDefinition definition, String toParse)
+ {
+ int size = definition.size();
+ String[] strings = toParse.split(",");
+ if (size != strings.length)
+ throw new MicroInstructionMemoryParseException("String does not match definition! The number of parameters does not match.");
+ MicroInstructionParameter[] params = new MicroInstructionParameter[size];
+ ParameterClassification[] classes = definition.getParameterClassifications();
+ try
+ {
+ for (int i = 0; i < size; i++)
+ {
+ params[i] = classes[i].parse(strings[i]);
+ }
+ return new StandardMicroInstruction(updateCallback, params);
+ }
+ catch (Exception e)
+ {
+ throw new MicroInstructionMemoryParseException(e.getCause());
+ }
+ }
+
+ public static void write(MicroInstructionMemory memory, String outputPath) throws IOException
+ {
+ try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(outputPath)))
+ {
+ write(memory, writer);
+ }
+ }
+
+ public static void write(MicroInstructionMemory memory, OutputStreamWriter output) throws IOException
+ {
+ MemoryDefinition def = memory.getDefinition();
+ long min = def.getMinimalAddress(), max = def.getMaximalAddress() + 1;
+ for (long i = min; i < max; i++)
+ {
+ output.write(toCSV(memory.getCell(i)) + "\n");
+ }
+ }
+
+ private static String toCSV(MicroInstruction inst)
+ {
+ int max = inst.getSize() - 1;
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < max; i++)
+ {
+ sb.append(inst.getParameter(i).toString());
+ sb.append(",");
+ }
+ sb.append(inst.getParameter(max).toString());
+ return sb.toString();
+ }
+}