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.BooleanImmediate;
17 import net.mograsim.machine.mi.parameters.IntegerClassification;
18 import net.mograsim.machine.mi.parameters.IntegerImmediate;
19 import net.mograsim.machine.mi.parameters.MicroInstructionParameter;
20 import net.mograsim.machine.mi.parameters.MnemonicFamily;
21 import net.mograsim.machine.mi.parameters.MnemonicFamily.MnemonicPair;
22 import net.mograsim.machine.mi.parameters.ParameterClassification;
24 public class MicroprogramMemoryParser
26 public static MicroprogramMemory parseMemory(MicroInstructionDefinition definition, String input) throws IOException
28 try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(input))))
30 return parseMemory(definition, reader);
34 public static MicroprogramMemory parseMemory(MicroInstructionDefinition definition, BufferedReader input)
36 List<MicroInstruction> instructions = new ArrayList<>();
40 while (input.ready() && !"".equals((line = input.readLine())))
41 instructions.add(parse(definition, line));
42 } catch (IOException e)
47 int maxAddress = instructions.size() - 1;
48 MicroprogramMemory memory = MicroprogramMemory
49 .create(MemoryDefinition.create((int) Math.ceil(Math.log(maxAddress)), 0, maxAddress));
51 for (MicroInstruction inst : instructions)
52 memory.setCell(i++, inst);
56 public static MicroInstruction parse(MicroInstructionDefinition definition, String toParse)
58 int size = definition.size();
59 String[] strings = toParse.split(",");
60 if (size != strings.length)
61 throw new MicroprogramMemoryParseException(
62 "String does not match definition! The number of parameters does not match.");
63 MicroInstructionParameter[] params = new MicroInstructionParameter[size];
64 ParameterClassification[] classes = definition.getParameterClassifications();
67 for (int i = 0; i < size; i++)
69 params[i] = classes[i].parse(strings[i]);
71 return new StandardMicroInstruction(params);
74 throw new MicroprogramMemoryParseException(e.getCause());
78 public static void write(MicroprogramMemory memory, String output) throws IOException
80 try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(output)))
82 write(memory, writer);
86 public static void write(MicroprogramMemory memory, OutputStreamWriter output) throws IOException
88 MemoryDefinition def = memory.getDefinition();
89 long min = def.getMinimalAddress(), max = def.getMaximalAddress() + 1;
90 for (long i = min; i < max; i++)
92 output.write(toCSV(memory.getCell(i)) + "\n");
96 private static String toCSV(MicroInstruction inst)
98 int max = inst.getSize() - 1;
99 StringBuilder sb = new StringBuilder();
100 for (int i = 0; i < max; i++)
102 sb.append(inst.getParameter(i).toString());
105 sb.append(inst.getParameter(max).toString());
106 return sb.toString();
109 public static void main(String[] args)
111 MnemonicFamily family = new MnemonicFamily(new MnemonicPair("ZERO", BitVector.SINGLE_0),
112 new MnemonicPair("ONE", BitVector.SINGLE_1));
113 MicroInstructionDefinition def = MicroInstructionDefinition.create(new BooleanClassification(),
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(new BooleanImmediate(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)