allows multiple hex values per line in logisim hex files, closes #602

This commit is contained in:
hneemann 2021-01-08 19:27:17 +01:00
parent c5e263032a
commit e1f58e7594
2 changed files with 46 additions and 15 deletions

View File

@ -9,12 +9,13 @@ import de.neemann.digital.core.Bits;
import de.neemann.digital.lang.Lang;
import java.io.*;
import java.util.StringTokenizer;
/**
* Reader to read the original Logisim hex file format
*/
public class LogisimReader implements ValueArrayReader {
private Reader reader;
private final Reader reader;
/**
* Creates a new instance
@ -51,23 +52,28 @@ public class LogisimReader implements ValueArrayReader {
else
line = line.trim();
int rle = 1;
p = line.indexOf('*');
if (p > 0) {
rle = Integer.parseInt(line.substring(0, p));
line = line.substring(p + 1).trim();
}
StringTokenizer tc = new StringTokenizer(line, " \t");
while (tc.hasMoreTokens()) {
String num = tc.nextToken();
int rle = 1;
p = num.indexOf('*');
if (p > 0) {
rle = Integer.parseInt(num.substring(0, p));
num = num.substring(p + 1).trim();
}
if (line.length() > 2 && line.charAt(0) == '0' && (line.charAt(1) == 'x' || line.charAt(1) == 'X'))
line = line.substring(2);
if (num.length() > 2 && num.charAt(0) == '0' && (num.charAt(1) == 'x' || num.charAt(1) == 'X'))
num = num.substring(2);
if (line.length() > 0) {
long v = Bits.decode(line, 0, 16);
for (int i = 0; i < rle; i++) {
valueArray.set(pos, v);
pos++;
if (num.length() > 0) {
long v = Bits.decode(num, 0, 16);
for (int i = 0; i < rle; i++) {
valueArray.set(pos, v);
pos++;
}
}
}
} catch (Bits.NumberFormatException e) {
throw new IOException(e);
}
@ -75,5 +81,4 @@ public class LogisimReader implements ValueArrayReader {
}
}
}

View File

@ -98,5 +98,31 @@ public class LogisimReaderTest extends TestCase {
assertEquals(0xFF, df.getDataWord(16));
}
public void testLoadRLEMultiline() throws Exception {
String data = "v2.0 raw\n#test1 \n 5*0x0 10*0x10 0xAA 0XFF #test";
DataField df = new DataField(1024);
new LogisimReader(new StringReader(data)).read(new DataFieldValueArray(df, 0));
assertEquals(17, df.trim());
assertEquals(0x00, df.getDataWord(0));
assertEquals(0x00, df.getDataWord(1));
assertEquals(0x00, df.getDataWord(2));
assertEquals(0x00, df.getDataWord(3));
assertEquals(0x00, df.getDataWord(4));
assertEquals(0x10, df.getDataWord(5));
assertEquals(0x10, df.getDataWord(6));
assertEquals(0x10, df.getDataWord(7));
assertEquals(0x10, df.getDataWord(8));
assertEquals(0x10, df.getDataWord(9));
assertEquals(0x10, df.getDataWord(10));
assertEquals(0x10, df.getDataWord(11));
assertEquals(0x10, df.getDataWord(12));
assertEquals(0x10, df.getDataWord(13));
assertEquals(0x10, df.getDataWord(14));
assertEquals(0xAA, df.getDataWord(15));
assertEquals(0xFF, df.getDataWord(16));
}
}