X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fmi%2FMicroprogramMemoryParser.java;h=1e34762b9250482d84c09920380f42b88d18c0d6;hb=3813eb83f6c17041dcb67d7d2744c66a8bfdb18d;hp=065ba15241d9e1ab4468522db2f67df029c36984;hpb=976f7f2be00457b5cda2489545635ccd076c9afd;p=Mograsim.git diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemoryParser.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemoryParser.java index 065ba152..1e34762b 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemoryParser.java +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroprogramMemoryParser.java @@ -7,6 +7,8 @@ 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; @@ -21,28 +23,34 @@ import net.mograsim.machine.mi.parameters.ParameterClassification; public class MicroprogramMemoryParser { - public static void parse(MicroprogramMemory memory, long startAddress, MicroInstructionDefinition definition, String input) throws IOException + public static MicroprogramMemory parseMemory(MicroInstructionDefinition definition, String input) throws IOException { try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(input)))) { - parse(memory, startAddress, definition, reader); + return parseMemory(definition, reader); } } - public static void parse(MicroprogramMemory memory, long startAddress, MicroInstructionDefinition definition, - BufferedReader input) + public static MicroprogramMemory parseMemory(MicroInstructionDefinition definition, BufferedReader input) { - MemoryDefinition def = memory.getDefinition(); - long minAddress = Long.max(startAddress, def.getMinimalAddress()), maxAddress = def.getMaximalAddress(); + List instructions = new ArrayList<>(); try { String line; - for (long i = minAddress; i < maxAddress && input.ready() && !"".equals((line = input.readLine())); i++) - memory.setCell(i, parse(definition, line)); + while (input.ready() && !"".equals((line = input.readLine()))) + instructions.add(parse(definition, line)); } catch (IOException e) { e.printStackTrace(); } + + int maxAddress = instructions.size() - 1; + MicroprogramMemory memory = MicroprogramMemory + .create(MemoryDefinition.create((int) Math.ceil(Math.log(maxAddress)), 0, maxAddress)); + int i = 0; + for (MicroInstruction inst : instructions) + memory.setCell(i++, inst); + return memory; } public static MicroInstruction parse(MicroInstructionDefinition definition, String toParse) @@ -50,40 +58,46 @@ public class MicroprogramMemoryParser int size = definition.size(); String[] strings = toParse.split(","); if (size != strings.length) - throw new IllegalArgumentException( + throw new MicroprogramMemoryParseException( "String does not match definition! The number of parameters does not match."); MicroInstructionParameter[] params = new MicroInstructionParameter[size]; ParameterClassification[] classes = definition.getParameterClassifications(); - for (int i = 0; i < size; i++) + try { - params[i] = classes[i].parse(strings[i]); + for (int i = 0; i < size; i++) + { + params[i] = classes[i].parse(strings[i]); + } + return new StandardMicroInstruction(params); + } catch (Exception e) + { + throw new MicroprogramMemoryParseException(e.getCause()); } - return new StandardMicroInstruction(params); } - - public static void write(MicroprogramMemory memory, long startAddress, long endAddress, String output) throws IOException + + public static void write(MicroprogramMemory memory, String output) throws IOException { - try(OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(output))) + try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(output))) { - write(memory, startAddress, endAddress, writer); + write(memory, writer); } } - - public static void write(MicroprogramMemory memory, long startAddress, long endAddress, OutputStreamWriter output) throws IOException + + public static void write(MicroprogramMemory memory, OutputStreamWriter output) throws IOException { MemoryDefinition def = memory.getDefinition(); - long min = Long.max(def.getMinimalAddress(), startAddress), max = Long.min(def.getMaximalAddress(), endAddress) + 1; - for(long i = min; i < max; i++) + 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++) + for (int i = 0; i < max; i++) { sb.append(inst.getParameter(i).toString()); sb.append(","); @@ -91,4 +105,26 @@ public class MicroprogramMemoryParser sb.append(inst.getParameter(max).toString()); return sb.toString(); } + + public static void main(String[] args) + { + MnemonicFamily family = new MnemonicFamily(new MnemonicPair("ZERO", BitVector.SINGLE_0), + new MnemonicPair("ONE", BitVector.SINGLE_1)); + MicroInstructionDefinition def = MicroInstructionDefinition.create(new BooleanClassification(), + new IntegerClassification(8), family); + MicroprogramMemory memory = new StandardMicroprogramMemory(MemoryDefinition.create(4, 0, 16)); + for (int i = 0; i < 17; i++) + memory.setCell(i, new StandardMicroInstruction(new BooleanImmediate(false), + new IntegerImmediate(BigInteger.valueOf(i), 8), family.get(i % 2))); + try + { + write(memory, "test.txt"); + MicroprogramMemory newMemory = parseMemory(def, "test.txt"); + write(newMemory, "test2.txt"); + } catch (IOException e) + { + e.printStackTrace(); + } + + } }