X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fmi%2FMicroInstructionMemoryParser.java;h=d049e37776e0ec39466d81b200727110552eb564;hb=93f106a691015a63a6c5af27406b94303385698a;hp=44d009818dde349d63207712aa465b705e0cf6b5;hpb=2fe86b9ccd64afbe485b8290db9f11b93d9943bf;p=Mograsim.git diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java index 44d00981..d049e377 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java @@ -6,59 +6,57 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.List; -import net.mograsim.logic.core.types.BitVector; import net.mograsim.machine.MemoryDefinition; -import net.mograsim.machine.mi.parameters.BooleanClassification; -import net.mograsim.machine.mi.parameters.IntegerClassification; -import net.mograsim.machine.mi.parameters.IntegerImmediate; import net.mograsim.machine.mi.parameters.MicroInstructionParameter; -import net.mograsim.machine.mi.parameters.MnemonicFamily; -import net.mograsim.machine.mi.parameters.MnemonicFamily.MnemonicPair; import net.mograsim.machine.mi.parameters.ParameterClassification; public class MicroInstructionMemoryParser { - public static MicroInstructionMemory parseMemory(MicroInstructionDefinition definition, String input) throws IOException + public static void parseMemory(final MicroInstructionMemory memory, String inputPath) throws IOException { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(input)))) + try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputPath)))) { - return parseMemory(definition, reader); + parseMemory(memory, reader); } } - public static MicroInstructionMemory parseMemory(MicroInstructionDefinition definition, BufferedReader input) + public static void parseMemory(final MicroInstructionMemory memory, BufferedReader input) { - List instructions = new ArrayList<>(); + MicroInstructionMemoryDefinition def = memory.getDefinition(); + MicroInstructionDefinition miDef = def.getMicroInstructionDefinition(); + + long minAddr = def.getMinimalAddress(); + long maxAddr = def.getMaximalAddress(); + + String line; + long i = minAddr; try { - String line; - while (input.ready() && !"".equals((line = input.readLine()))) - instructions.add(parse(definition, line)); - } catch (IOException e) + 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(); } - int maxAddress = instructions.size() - 1; - MicroInstructionMemory memory = MicroInstructionMemory - .create(MemoryDefinition.create((int) Math.ceil(Math.log(maxAddress)), 0, maxAddress)); - int i = 0; - for (MicroInstruction inst : instructions) - memory.setCell(i++, inst); - return memory; + for (; i <= maxAddr; i++) + { + long iFinal = i; + memory.setCell(i, miDef.createDefaultInstruction(() -> memory.notifyObservers(iFinal))); + } } - public static MicroInstruction parse(MicroInstructionDefinition definition, String toParse) + 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."); + 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 @@ -67,16 +65,17 @@ public class MicroInstructionMemoryParser { params[i] = classes[i].parse(strings[i]); } - return new StandardMicroInstruction(params); - } catch (Exception e) + return new StandardMicroInstruction(updateCallback, params); + } + catch (Exception e) { throw new MicroInstructionMemoryParseException(e.getCause()); } } - public static void write(MicroInstructionMemory memory, String output) throws IOException + public static void write(MicroInstructionMemory memory, String outputPath) throws IOException { - try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(output))) + try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(outputPath))) { write(memory, writer); }