diff --git a/com.minres.scviewer.database.test/inputs/simple_system.vcd b/com.minres.scviewer.database.test/inputs/simple_system.vcd index 8977649..0345ff2 100755 --- a/com.minres.scviewer.database.test/inputs/simple_system.vcd +++ b/com.minres.scviewer.database.test/inputs/simple_system.vcd @@ -45,6 +45,7 @@ $var wire 1 aaabd s_gpio_29 $end $var wire 1 aaabe s_gpio_30 $end $var wire 1 aaabf s_gpio_31 $end $var wire 1 aaabg s_rst_n $end +$var real 1 bbbbb a_real $end $scope module i_platform $end $var wire 1 aaabh erst_n $end $var wire 64 aabdc s_tlclk [63:0] $end @@ -1621,6 +1622,7 @@ b1110100011010100101001010 aabdd 0aabdv 0aabdw 0aabdx +r0.0 bbbbb $end #10000 @@ -1641,6 +1643,7 @@ $end #1287121272 b1000000000100000000000000000100 aabcr +r1.0 bbbbb #1288121272 b111111110100111110 aaabi @@ -1656,33 +1659,43 @@ b11000000000100000000000000000100 aabcr b111111110100111110 aabcw b101010 aabdb b111111110100111110 aabdc +r2.0 bbbbb #1303801016 b1000 aaacx +r3.0 bbbbb #1311382718 b100000000 aabcu +r2.0 bbbbb #1312689908 b1000000010111110001 aabct +r1.0 bbbbb #1315304288 b10000000000000000000010111110001 aabct +r0.0 bbbbb #1317395792 b101011 aabdb +r-1.0 bbbbb #1345892534 b101100 aabdb +r-2.0 bbbbb #1375173590 b101101 aabdb +r-3.0 bbbbb #1404454646 b101110 aabdb +r-2.0 bbbbb #1437918710 b101111 aabdb +r-1.0 bbbbb #1443670346 b11111111010100 aaabi @@ -1697,6 +1710,7 @@ b11111111010100 aabac b10000000000000010000010111110001 aabct b11111111010100 aabcw b11111111010100 aabdc +r0.0 bbbbb #1444438324 1aaaar diff --git a/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java b/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java index ce9aed8..8f5fb1b 100644 --- a/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java +++ b/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java @@ -92,7 +92,7 @@ public class DatabaseServicesTest { assertTrue(f.exists()); waveformDb.load(f); assertNotNull(waveformDb); - assertEquals(778, waveformDb.getAllWaves().size()); + assertEquals(779, waveformDb.getAllWaves().size()); assertEquals(1, waveformDb.getChildNodes().size()); } 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..812b2ba 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 @@ -34,26 +34,44 @@ public interface IVCDDatabaseBuilder { * * @param netName the net name * @param i the index of the net, -1 if a new one, otherwise the id if the referenced - * @param width the width - * @return the integer + * @param width the width, -1 equals real, 0... is a bit vector + * @return the net id */ public Integer newNet(String netName, int i, int width) ; /** * Gets the net width. * - * @param intValue the int value - * @return the net width + * @param intValue the net id + * @return the net width, -1 means a real-valued net */ - public int getNetWidth(int intValue); + public int getNetWidth(int netId); /** * Append transition. * - * @param signalId the int value + * @param netId the int value * @param currentTime the current time in ps * @param decodedValues the decoded values */ - public void appendTransition(int signalId, long currentTime, BitVector decodedValues); + public void appendTransition(int netId, long currentTime, char decodedValue); + + /** + * Append transition. + * + * @param netId the int value + * @param currentTime the current time in ps + * @param decodedValues the decoded values + */ + public void appendTransition(int netId, long currentTime, BitVector decodedValue); + + /** + * Append transition. + * + * @param netId the int value + * @param currentTime the current time in ps + * @param decodedValue the decoded values + */ + public void appendTransition(int netId, long currentTime, double decodedValue); } 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 e418170..0616e4c 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 @@ -15,6 +15,7 @@ import java.io.FileInputStream; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.NavigableMap; import java.util.Stack; import java.util.TreeMap; import java.util.Vector; @@ -22,8 +23,9 @@ import java.util.Vector; 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.ISignalChangeSingle; +import com.minres.scviewer.database.ISignalChangeBitVector; +import com.minres.scviewer.database.ISignalChangeReal; +import com.minres.scviewer.database.ISignalChangeBit; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDbLoader; @@ -83,20 +85,25 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { moduleStack=null; if(!res) throw new InputFormatException(); // calculate max time of database - for(IWaveform waveform:signals) - maxTime= Math.max(maxTime, ((ISignal)waveform).getEvents().lastKey()); + for(IWaveform waveform:signals) { + NavigableMap events =((ISignal)waveform).getEvents(); + if(events.size()>0) + maxTime= Math.max(maxTime, events.lastKey()); + } // extend signals to hav a last value set at max time for(IWaveform waveform:signals){ TreeMap events = ((VCDSignal)waveform).values; - if(events.lastKey()0 && events.lastKey())waveform).values.put(maxTime, - new VCDSignalChangeSingle(maxTime, ((ISignalChangeSingle)x).getValue())); - else - if(x instanceof ISignalChangeMulti) - ((VCDSignal)waveform).values.put(maxTime, - new VCDSignalChangeMulti(maxTime, ((ISignalChangeMulti)x).getValue())); + if(x instanceof ISignalChangeBit) + ((VCDSignal)waveform).values.put(maxTime, + new VCDSignalChangeBit(maxTime, ((ISignalChangeBit)x).getValue())); + else if(x instanceof ISignalChangeBitVector) + ((VCDSignal)waveform).values.put(maxTime, + new VCDSignalChangeBitVector(maxTime, ((ISignalChangeBitVector)x).getValue())); + else if(x instanceof ISignalChangeReal) + ((VCDSignal)waveform).values.put(maxTime, + new VCDSignalChangeReal(maxTime, ((ISignalChangeReal)x).getValue())); } } return true; @@ -147,12 +154,15 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { String netName = moduleStack.empty()? name: moduleStack.lastElement()+"."+name; int id = signals.size(); VCDSignal signal; - if(width==1){ - signal = i<0 ? new VCDSignal(db, id, netName) : - new VCDSignal((VCDSignal)signals.get(i), id, netName); + if(width<0) { + signal = i<0 ? new VCDSignal(db, id, netName, width) : + new VCDSignal((VCDSignal)signals.get(i), id, netName); + } else if(width==1){ + signal = i<0 ? new VCDSignal(db, id, netName) : + new VCDSignal((VCDSignal)signals.get(i), id, netName); } else { - signal = i<0 ? new VCDSignal(db, id, netName, width) : - new VCDSignal((VCDSignal)signals.get(i), id, netName); + signal = i<0 ? new VCDSignal(db, id, netName, width) : + new VCDSignal((VCDSignal)signals.get(i), id, netName); }; signals.add(signal); return id; @@ -172,13 +182,37 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { */ @SuppressWarnings("unchecked") @Override - public void appendTransition(int signalId, long currentTime, BitVector decodedValues) { + public void appendTransition(int signalId, long currentTime, char decodedValues) { VCDSignal signal = (VCDSignal) signals.get(signalId); Long time = currentTime* TIME_RES; if(signal.getWidth()==1){ - ((VCDSignal)signal).values.put(time, new VCDSignalChangeSingle(time, decodedValues.getValue()[0])); - } else { - ((VCDSignal)signal).values.put(time, new VCDSignalChangeMulti(time, decodedValues)); + ((VCDSignal)signal).values.put(time, new VCDSignalChangeBit(time, decodedValues)); + } + } + + /* (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, BitVector decodedValues) { + VCDSignal signal = (VCDSignal) signals.get(signalId); + Long time = currentTime* TIME_RES; + if(signal.getWidth()>1){ + ((VCDSignal)signal).values.put(time, new VCDSignalChangeBitVector(time, decodedValues)); + } + } + + /* (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 decodedValue) { + VCDSignal signal = (VCDSignal) signals.get(signalId); + Long time = currentTime* TIME_RES; + if(signal.getWidth()<0){ + ((VCDSignal)signal).values.put(time, new VCDSignalChangeReal(time, decodedValue)); } } 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..c714dec 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 @@ -61,9 +61,11 @@ class VCDFileParser { private void parseVar() throws Exception { nextToken(); // type + String type = tokenizer.sval; nextToken(); // size int width = Integer.parseInt(tokenizer.sval); - + if("real".equals(type)) + width*=-1; nextToken(); String id = tokenizer.sval; nextToken(); @@ -153,7 +155,8 @@ class VCDFileParser { } while (!tokenizer.sval.equals("$end")); return true; } - if (tokenizer.sval.equals("$dumpvars") || tokenizer.sval.equals("$end")) return true; + if (tokenizer.sval.equals("$dumpvars") || tokenizer.sval.equals("$end")) + return true; String value, id; if (tokenizer.sval.charAt(0) == 'b') { // Multiple value net. Value appears first, followed by space, @@ -161,6 +164,12 @@ class VCDFileParser { value = tokenizer.sval.substring(1); nextToken(); id = tokenizer.sval; + }else if (tokenizer.sval.charAt(0) == 'r') { + // Multiple value net. Value appears first, followed by space, + // then identifier + value = tokenizer.sval.substring(1); + nextToken(); + id = tokenizer.sval; } else { // Single value net. identifier first, then value, no space. value = tokenizer.sval.substring(0, 1); @@ -174,39 +183,46 @@ class VCDFileParser { } 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(netWidth<0) { + 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); + 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); + } } } + if(netWidth==1) + traceBuilder.appendTransition(net, currentTime, decodedValues.getValue()[0]); + else + 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/VCDSignalChangeSingle.java b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeBit.java similarity index 80% rename from com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeSingle.java rename to com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeBit.java index a8fc14b..b24870c 100644 --- a/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeSingle.java +++ b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeBit.java @@ -10,14 +10,14 @@ *******************************************************************************/ package com.minres.scviewer.database.vcd; -import com.minres.scviewer.database.ISignalChangeSingle; +import com.minres.scviewer.database.ISignalChangeBit; import com.minres.scviewer.database.SignalChange; -public class VCDSignalChangeSingle extends SignalChange implements ISignalChangeSingle, Cloneable { +public class VCDSignalChangeBit extends SignalChange implements ISignalChangeBit, Cloneable { private char value; - public VCDSignalChangeSingle(Long time, char value) { + public VCDSignalChangeBit(Long time, char value) { super(time); this.value=value; } diff --git a/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeMulti.java b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeBitVector.java similarity index 77% rename from com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeMulti.java rename to com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeBitVector.java index e38c50f..10b8714 100644 --- a/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeMulti.java +++ b/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignalChangeBitVector.java @@ -11,18 +11,18 @@ package com.minres.scviewer.database.vcd; import com.minres.scviewer.database.BitVector; -import com.minres.scviewer.database.ISignalChangeMulti; +import com.minres.scviewer.database.ISignalChangeBitVector; import com.minres.scviewer.database.SignalChange; -public class VCDSignalChangeMulti extends SignalChange implements ISignalChangeMulti, Cloneable { +public class VCDSignalChangeBitVector extends SignalChange implements ISignalChangeBitVector, Cloneable { private BitVector value; - public VCDSignalChangeMulti(Long time) { + public VCDSignalChangeBitVector(Long time) { super(time); } - public VCDSignalChangeMulti(Long time, BitVector decodedValues) { + public VCDSignalChangeBitVector(Long time, BitVector decodedValues) { super(time); this.value=decodedValues; } 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/ISignalChangeSingle.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/ISignalChangeBit.java similarity index 91% rename from com.minres.scviewer.database/src/com/minres/scviewer/database/ISignalChangeSingle.java rename to com.minres.scviewer.database/src/com/minres/scviewer/database/ISignalChangeBit.java index 1319685..3cf747e 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/ISignalChangeSingle.java +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/ISignalChangeBit.java @@ -10,7 +10,7 @@ *******************************************************************************/ package com.minres.scviewer.database; -public interface ISignalChangeSingle extends ISignalChange{ +public interface ISignalChangeBit extends ISignalChange{ public char getValue(); diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/ISignalChangeMulti.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/ISignalChangeBitVector.java similarity index 90% rename from com.minres.scviewer.database/src/com/minres/scviewer/database/ISignalChangeMulti.java rename to com.minres.scviewer.database/src/com/minres/scviewer/database/ISignalChangeBitVector.java index ec9b770..be94346 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/ISignalChangeMulti.java +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/ISignalChangeBitVector.java @@ -10,8 +10,7 @@ *******************************************************************************/ package com.minres.scviewer.database; - -public interface ISignalChangeMulti extends ISignalChange { +public interface ISignalChangeBitVector extends ISignalChange { public BitVector getValue(); 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(); + +}