diff --git a/com.minres.scviewer.database.test/DatabaseServicesTest.launch b/com.minres.scviewer.database.test/DatabaseServicesTest.launch
index 1681c8c..289c012 100644
--- a/com.minres.scviewer.database.test/DatabaseServicesTest.launch
+++ b/com.minres.scviewer.database.test/DatabaseServicesTest.launch
@@ -31,12 +31,12 @@
-
+
-
-
+
+
diff --git a/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/IVCDDatabaseBuilder.java b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/IVCDDatabaseBuilder.java
index e74f195..3fd9372 100644
--- a/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/IVCDDatabaseBuilder.java
+++ b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/IVCDDatabaseBuilder.java
@@ -52,8 +52,16 @@ public interface IVCDDatabaseBuilder {
*
* @param signalId the int value
* @param currentTime the current time in ps
- * @param decodedValues the decoded values
+ * @param decodedValues the decoded bit values
*/
public void appendTransition(int signalId, long currentTime, BitVector decodedValues);
+ /**
+ * Append transition.
+ *
+ * @param signalId the int value
+ * @param currentTime the current time in ps
+ * @param vValues the real values
+ */
+ public void appendTransition(int signalId, long currentTime, Double values);
}
diff --git a/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java
index eb25d41..bf14aa7 100644
--- a/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java
+++ b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java
@@ -23,6 +23,7 @@ import com.minres.scviewer.database.BitVector;
import com.minres.scviewer.database.ISignal;
import com.minres.scviewer.database.ISignalChange;
import com.minres.scviewer.database.ISignalChangeMulti;
+import com.minres.scviewer.database.ISignalChangeReal;
import com.minres.scviewer.database.ISignalChangeSingle;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformDb;
@@ -166,6 +167,17 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
return signal.getWidth();
}
+ /* (non-Javadoc)
+ * @see com.minres.scviewer.database.vcd.ITraceBuilder#appendTransition(int, long, com.minres.scviewer.database.vcd.BitVector)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void appendTransition(int signalId, long currentTime, Double value) {
+ VCDSignal extends IWaveformEvent> signal = (VCDSignal extends IWaveformEvent>) signals.get(signalId);
+ Long time = currentTime*TIME_RES;
+ ((VCDSignal)signal).values.put(time, new VCDSignalChangeReal(time, value));
+ }
+
/* (non-Javadoc)
* @see com.minres.scviewer.database.vcd.ITraceBuilder#appendTransition(int, long, com.minres.scviewer.database.vcd.BitVector)
*/
@@ -173,7 +185,7 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
@Override
public void appendTransition(int signalId, long currentTime, BitVector decodedValues) {
VCDSignal extends IWaveformEvent> signal = (VCDSignal extends IWaveformEvent>) signals.get(signalId);
- Long time = currentTime* TIME_RES;
+ Long time = currentTime*TIME_RES;
if(signal.getWidth()==1){
((VCDSignal)signal).values.put(time, new VCDSignalChangeSingle(time, decodedValues.getValue()[0]));
} else {
diff --git a/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDFileParser.java b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDFileParser.java
index db80245..0b128ad 100644
--- a/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDFileParser.java
+++ b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDFileParser.java
@@ -147,6 +147,7 @@ class VCDFileParser {
if (tokenizer.sval.charAt(0) == '#') { // If the line begins with a #, this is a timestamp.
currentTime = Long.parseLong(tokenizer.sval.substring(1)) * picoSecondsPerIncrement;
} else {
+ boolean isReal=false;
if(tokenizer.sval.equals("$comment")){
do {
if (!nextToken()) return false;
@@ -161,6 +162,13 @@ class VCDFileParser {
value = tokenizer.sval.substring(1);
nextToken();
id = tokenizer.sval;
+ } else if (tokenizer.sval.charAt(0) == 'r') {
+ // real value net. Value appears first, followed by space,
+ // then identifier
+ value = tokenizer.sval.substring(1);
+ nextToken();
+ id = tokenizer.sval;
+ isReal=true;
} else {
// Single value net. identifier first, then value, no space.
value = tokenizer.sval.substring(0, 1);
@@ -173,40 +181,48 @@ class VCDFileParser {
return true;
}
- int netWidth = traceBuilder.getNetWidth(net);
- BitVector decodedValues = new BitVector(netWidth);
- if (value.equals("z") && netWidth > 1) {
- for (int i = 0; i < netWidth; i++)
- decodedValues.setValue(i, BitVector.VALUE_Z);
- } else if (value.equals("x") && netWidth > 1) {
- for (int i = 0; i < netWidth; i++)
- decodedValues.setValue(i, BitVector.VALUE_X);
+ if(isReal) {
+ if("nan".equals(value)) {
+ traceBuilder.appendTransition(net, currentTime, Double.NaN);
+ } else {
+ traceBuilder.appendTransition(net, currentTime, Double.parseDouble(value));
+ }
} else {
- int stringIndex = 0;
- for (int convertedIndex = netWidth - value.length(); convertedIndex < netWidth; convertedIndex++) {
- switch (value.charAt(stringIndex++)) {
- case 'z':
- decodedValues.setValue(convertedIndex, BitVector.VALUE_Z);
- break;
-
- case '1':
- decodedValues.setValue(convertedIndex, BitVector.VALUE_1);
- break;
-
- case '0':
- decodedValues.setValue(convertedIndex, BitVector.VALUE_0);
- break;
-
- case 'x':
- decodedValues.setValue(convertedIndex, BitVector.VALUE_X);
- break;
-
- default:
- decodedValues.setValue(convertedIndex, BitVector.VALUE_X);
+ int netWidth = traceBuilder.getNetWidth(net);
+ BitVector decodedValues = new BitVector(netWidth);
+ if (value.equals("z") && netWidth > 1) {
+ for (int i = 0; i < netWidth; i++)
+ decodedValues.setValue(i, BitVector.VALUE_Z);
+ } else if (value.equals("x") && netWidth > 1) {
+ for (int i = 0; i < netWidth; i++)
+ decodedValues.setValue(i, BitVector.VALUE_X);
+ } else {
+ int stringIndex = 0;
+ for (int convertedIndex = netWidth - value.length(); convertedIndex < netWidth; convertedIndex++) {
+ switch (value.charAt(stringIndex++)) {
+ case 'z':
+ decodedValues.setValue(convertedIndex, BitVector.VALUE_Z);
+ break;
+
+ case '1':
+ decodedValues.setValue(convertedIndex, BitVector.VALUE_1);
+ break;
+
+ case '0':
+ decodedValues.setValue(convertedIndex, BitVector.VALUE_0);
+ break;
+
+ case 'x':
+ decodedValues.setValue(convertedIndex, BitVector.VALUE_X);
+ break;
+
+ default:
+ decodedValues.setValue(convertedIndex, BitVector.VALUE_X);
+ }
}
}
+ traceBuilder.appendTransition(net, currentTime, decodedValues);
}
- traceBuilder.appendTransition(net, currentTime, decodedValues);
}
return true;
}
diff --git a/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeReal.java b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeReal.java
new file mode 100644
index 0000000..f747256
--- /dev/null
+++ b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeReal.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2015 MINRES Technologies GmbH and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * MINRES Technologies GmbH - initial API and implementation
+ *******************************************************************************/
+package com.minres.scviewer.database.vcd;
+
+import com.minres.scviewer.database.ISignalChangeReal;
+import com.minres.scviewer.database.SignalChange;
+
+public class VCDSignalChangeReal extends SignalChange implements ISignalChangeReal, Cloneable {
+
+ private double value;
+
+ public VCDSignalChangeReal(Long time, double value) {
+ super(time);
+ this.value=value;
+ }
+
+ public double getValue() {
+ return value;
+ }
+
+ public void setValue(double value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return value+"@"+getTime();
+ }
+}
diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/ISignalChangeReal.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/ISignalChangeReal.java
new file mode 100644
index 0000000..e49906b
--- /dev/null
+++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/ISignalChangeReal.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2015 MINRES Technologies GmbH and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * MINRES Technologies GmbH - initial API and implementation
+ *******************************************************************************/
+package com.minres.scviewer.database;
+
+public interface ISignalChangeReal extends ISignalChange{
+
+ public double getValue();
+
+}