mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-08 20:35:39 -04:00
allows multiple hex values per line in logisim hex files, closes #602
This commit is contained in:
parent
c5e263032a
commit
e1f58e7594
@ -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 {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user