X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fmi%2FMicroInstructionMemoryParser.java;h=b351ca7b749745354694652b55ecc069516ee3fe;hb=38902818500a67f6a55973b9acbd4194f7a82838;hp=3c13f67b8e948b46012e8ae1341152d93c2c1e0c;hpb=46d4c053db9a363185a9dce28fcefbc3bf9d6afd;p=Mograsim.git diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java index 3c13f67b..b351ca7b 100644 --- a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java @@ -1,15 +1,12 @@ package net.mograsim.machine.mi; import java.io.BufferedReader; +import java.io.ByteArrayInputStream; import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.util.Objects; -import net.mograsim.machine.MachineRegistry; -import net.mograsim.machine.MemoryDefinition; import net.mograsim.machine.mi.parameters.MicroInstructionParameter; import net.mograsim.machine.mi.parameters.ParameterClassification; @@ -19,46 +16,22 @@ public class MicroInstructionMemoryParser public static void parseMemory(final MicroInstructionMemory memory, String inputPath) throws IOException { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputPath)))) + try (InputStream input = new FileInputStream(inputPath)) { - parseMemory(memory, reader); - } - } - - public static MicroInstructionMemory parseMemory(String inputPath) throws IOException - { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputPath)))) - { - return parseMemory(reader); - } - } - - /** - * First line must be the machine name, the rest must be in csv format - */ - public static MicroInstructionMemory parseMemory(BufferedReader input) - { - try - { - return parseMemory(input.readLine(), input); - } - catch (IOException e) - { - throw new MicroInstructionMemoryParseException(e); + parseMemory(memory, input); } } /** - * must be in csv format + * @param input The input to parse must be in csv format; The stream is closed after being consumed. + * + * @throws IOException */ - public static MicroInstructionMemory parseMemory(String machineName, BufferedReader input) + public static MicroInstructionMemory parseMemory(MicroInstructionMemoryDefinition memDef, InputStream input) throws IOException { try { - MicroInstructionMemoryDefinition def = Objects - .requireNonNull(MachineRegistry.getinstalledMachines().get(machineName), "Unknown machine: " + machineName) - .getMicroInstructionMemoryDefinition(); - MicroInstructionMemory memory = new StandardMicroInstructionMemory(def); + MicroInstructionMemory memory = new StandardMicroInstructionMemory(memDef); parseMemory(memory, input); return memory; } @@ -69,43 +42,49 @@ public class MicroInstructionMemoryParser } /** - * must be in csv format + * + * @param input The input to parse must be in csv format; The stream is closed after being consumed. + * + * @throws IOException */ - public static void parseMemory(final MicroInstructionMemory memory, BufferedReader input) + public static void parseMemory(final MicroInstructionMemory memory, InputStream input) throws IOException { - MicroInstructionMemoryDefinition def = memory.getDefinition(); - MicroInstructionDefinition miDef = def.getMicroInstructionDefinition(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(input))) + { + MicroInstructionMemoryDefinition def = memory.getDefinition(); + MicroInstructionDefinition miDef = def.getMicroInstructionDefinition(); - long minAddr = def.getMinimalAddress(); - long maxAddr = def.getMaximalAddress(); + long minAddr = def.getMinimalAddress(); + long maxAddr = def.getMaximalAddress(); - String line; - long i = minAddr; - try - { - for (; i <= maxAddr && input.ready() && !"".equals((line = input.readLine())); i++) + String line; + long i = minAddr; + try { - memory.setCell(i, parse(miDef, line)); + for (; i <= maxAddr && reader.ready() && !"".equals((line = reader.readLine())); i++) + { + memory.setCell(i, parse(miDef, line)); + } + } + catch (IOException e) + { + e.printStackTrace(); } - } - catch (IOException e) - { - e.printStackTrace(); - } - for (; i <= maxAddr; i++) - { - memory.setCell(i, miDef.createDefaultInstruction()); + for (; i <= maxAddr; i++) + { + memory.setCell(i, miDef.createDefaultInstruction()); + } } } /** * must be in csv format */ - public static MicroInstruction parse(MicroInstructionDefinition definition, String path) + public static MicroInstruction parse(MicroInstructionDefinition definition, String input) { int size = definition.size(); - String[] strings = path.split(","); + String[] strings = input.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]; @@ -124,43 +103,6 @@ public class MicroInstructionMemoryParser } } - 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, String machineName, String outputPath) throws IOException - { - try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(outputPath))) - { - write(memory, machineName, 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)) + lineSeparator); - } - } - - public static void write(MicroInstructionMemory memory, String machineName, OutputStreamWriter output) throws IOException - { - output.write(machineName + lineSeparator); - 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)) + lineSeparator); - } - } - private static String toCSV(MicroInstruction inst) { int max = inst.getSize() - 1; @@ -173,4 +115,25 @@ public class MicroInstructionMemoryParser sb.append(inst.getParameter(max).toString()); return sb.toString(); } + + public static InputStream write(MicroInstructionMemory memory) + { + return new InputStream() + { + long instIndex = memory.getDefinition().getMinimalAddress(), maxAddress = memory.getDefinition().getMaximalAddress(); + InputStream instStream = new ByteArrayInputStream(new byte[0]); + + @Override + public int read() throws IOException + { + int val = instStream.read(); + if (val == -1 && instIndex <= maxAddress) + { + instStream = new ByteArrayInputStream((toCSV(memory.getCell(instIndex++)) + lineSeparator).getBytes()); + val = instStream.read(); + } + return val; + } + }; + } }