Implemented painter concept
This commit is contained in:
@ -2,25 +2,21 @@ package com.minres.scviewer.database.vcd;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
import java.util.TreeMap;
|
||||
import java.util.Vector;
|
||||
|
||||
import com.minres.scviewer.database.BitVector;
|
||||
import com.minres.scviewer.database.EventTime;
|
||||
import com.minres.scviewer.database.HierNode;
|
||||
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.IWaveformDb;
|
||||
import com.minres.scviewer.database.IHierNode;
|
||||
import com.minres.scviewer.database.ITxStream;
|
||||
import com.minres.scviewer.database.IWaveform;
|
||||
import com.minres.scviewer.database.IWaveformDb;
|
||||
import com.minres.scviewer.database.IWaveformDbLoader;
|
||||
import com.minres.scviewer.database.IWaveformEvent;
|
||||
import com.minres.scviewer.database.InputFormatException;
|
||||
import com.minres.scviewer.database.SignalChange;
|
||||
|
||||
// TODO: Auto-generated Javadoc
|
||||
/**
|
||||
@ -29,7 +25,7 @@ import com.minres.scviewer.database.SignalChange;
|
||||
public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
|
||||
|
||||
|
||||
private static final EventTime.Unit TIME_RES = EventTime.Unit.PS;
|
||||
private static final Long TIME_RES = 1000L; // ps;
|
||||
|
||||
private IWaveformDb db;
|
||||
|
||||
@ -37,7 +33,7 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
|
||||
private Stack<String> moduleStack;
|
||||
|
||||
/** The signals. */
|
||||
private List<IWaveform> signals;
|
||||
private List<IWaveform<? extends IWaveformEvent>> signals;
|
||||
|
||||
private long maxTime;
|
||||
|
||||
@ -54,6 +50,7 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
|
||||
/* (non-Javadoc)
|
||||
* @see com.minres.scviewer.database.ITrDb#load(java.io.File)
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public boolean load(IWaveformDb db, File file) throws Exception {
|
||||
this.db=db;
|
||||
@ -66,18 +63,26 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
|
||||
if (buffer[i] != x[i])
|
||||
return false;
|
||||
|
||||
signals = new Vector<IWaveform>();
|
||||
signals = new Vector<IWaveform<? extends IWaveformEvent>>();
|
||||
moduleStack= new Stack<String>();
|
||||
boolean res = new VCDFileParser(false).load(new FileInputStream(file), this);
|
||||
moduleStack=null;
|
||||
if(!res) throw new InputFormatException();
|
||||
EventTime lastTime=new EventTime(maxTime, TIME_RES);
|
||||
for(IWaveform signal:signals){
|
||||
ISignalChange change = ((ISignal<ISignalChange>)signal).getSignalChanges().last();
|
||||
if(lastTime.compareTo(change.getTime())>0){
|
||||
ISignalChange lastChange = change.duplicate();
|
||||
((SignalChange)lastChange).setTime(lastTime);
|
||||
((ISignal<ISignalChange>)signal).getSignalChanges().add(lastChange);
|
||||
// calculate max time of database
|
||||
for(IWaveform<? extends IWaveformEvent> waveform:signals)
|
||||
maxTime= Math.max(maxTime, ((ISignal<? extends ISignalChange>)waveform).getEvents().lastKey());
|
||||
// extend signals to hav a last value set at max time
|
||||
for(IWaveform<? extends IWaveformEvent> waveform:signals){
|
||||
TreeMap<Long,? extends ISignalChange> events = ((VCDSignal<? extends ISignalChange>)waveform).values;
|
||||
if(events.lastKey()<maxTime){
|
||||
ISignalChange x = events.lastEntry().getValue();
|
||||
if(x instanceof ISignalChangeSingle)
|
||||
((VCDSignal<ISignalChangeSingle>)waveform).values.put(maxTime,
|
||||
new VCDSignalChangeSingle(maxTime, ((ISignalChangeSingle)x).getValue()));
|
||||
else
|
||||
if(x instanceof ISignalChangeMulti)
|
||||
((VCDSignal<ISignalChangeMulti>)waveform).values.put(maxTime,
|
||||
new VCDSignalChangeMulti(maxTime, ((ISignalChangeMulti)x).getValue()));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
@ -87,15 +92,15 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
|
||||
* @see com.minres.scviewer.database.ITrDb#getMaxTime()
|
||||
*/
|
||||
@Override
|
||||
public EventTime getMaxTime() {
|
||||
return new EventTime(maxTime, TIME_RES);
|
||||
public Long getMaxTime() {
|
||||
return maxTime* TIME_RES;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.minres.scviewer.database.ITrDb#getAllWaves()
|
||||
*/
|
||||
@Override
|
||||
public List<IWaveform> getAllWaves() {
|
||||
public List<IWaveform<? extends IWaveformEvent>> getAllWaves() {
|
||||
return signals;
|
||||
}
|
||||
|
||||
@ -122,16 +127,17 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
|
||||
/* (non-Javadoc)
|
||||
* @see com.minres.scviewer.database.vcd.ITraceBuilder#newNet(java.lang.String, int, int)
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public Integer newNet(String netName, int i, int width) {
|
||||
int id = signals.size();
|
||||
VCDSignal<? extends ISignalChange> signal;
|
||||
VCDSignal<? extends IWaveformEvent> signal;
|
||||
if(width==1){
|
||||
signal = i<0 ? new VCDSignal<ISignalChangeSingle>(db, id, netName) :
|
||||
new VCDSignal<ISignalChangeSingle>(signals.get(i), id, netName);
|
||||
new VCDSignal<ISignalChangeSingle>((VCDSignal<ISignalChangeSingle>)signals.get(i), id, netName);
|
||||
} else {
|
||||
signal = i<0 ? new VCDSignal<ISignalChangeMulti>(db, id, netName, width) :
|
||||
new VCDSignal<ISignalChangeMulti>(signals.get(i), id, netName);
|
||||
new VCDSignal<ISignalChangeMulti>((VCDSignal<VCDSignalChangeMulti>)signals.get(i), id, netName);
|
||||
};
|
||||
signals.add(signal);
|
||||
return id;
|
||||
@ -140,10 +146,9 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
|
||||
/* (non-Javadoc)
|
||||
* @see com.minres.scviewer.database.vcd.ITraceBuilder#getNetWidth(int)
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public int getNetWidth(int intValue) {
|
||||
VCDSignal<? extends ISignalChange> signal = (VCDSignal<? extends ISignalChange>) signals.get(intValue);
|
||||
VCDSignal<? extends IWaveformEvent> signal = (VCDSignal<? extends IWaveformEvent>) signals.get(intValue);
|
||||
return signal.getWidth();
|
||||
}
|
||||
|
||||
@ -152,17 +157,14 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public void appendTransition(int intValue, long fCurrentTime, BitVector decodedValues) {
|
||||
VCDSignal<? extends ISignalChange> signal = (VCDSignal<? extends ISignalChange>) signals.get(intValue);
|
||||
EventTime time = new EventTime(fCurrentTime, TIME_RES);
|
||||
public void appendTransition(int signalId, long fCurrentTime, BitVector decodedValues) {
|
||||
VCDSignal<? extends IWaveformEvent> signal = (VCDSignal<? extends IWaveformEvent>) signals.get(signalId);
|
||||
Long time = fCurrentTime* TIME_RES;
|
||||
if(signal.getWidth()==1){
|
||||
VCDSignalChangeSingle change = new VCDSignalChangeSingle(time, decodedValues.getValue()[0]);
|
||||
((VCDSignal<ISignalChangeSingle>)signal).addSignalChange(change);
|
||||
((VCDSignal<ISignalChangeSingle>)signal).values.put(time, new VCDSignalChangeSingle(time, decodedValues.getValue()[0]));
|
||||
} else {
|
||||
VCDSignalChangeMulti change = new VCDSignalChangeMulti(time, decodedValues);
|
||||
((VCDSignal<VCDSignalChangeMulti>)signal).addSignalChange(change);
|
||||
((VCDSignal<VCDSignalChangeMulti>)signal).values.put(time, new VCDSignalChangeMulti(time, decodedValues));
|
||||
}
|
||||
maxTime= Math.max(maxTime, fCurrentTime);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,15 +1,18 @@
|
||||
package com.minres.scviewer.database.vcd;
|
||||
|
||||
import java.util.NavigableSet;
|
||||
import java.util.TreeSet;
|
||||
import java.util.Collection;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.NavigableMap;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import com.minres.scviewer.database.EventTime;
|
||||
import com.google.common.collect.Ordering;
|
||||
import com.google.common.collect.TreeMultimap;
|
||||
import com.minres.scviewer.database.HierNode;
|
||||
import com.minres.scviewer.database.ISignal;
|
||||
import com.minres.scviewer.database.ISignalChange;
|
||||
import com.minres.scviewer.database.IWaveformEvent;
|
||||
import com.minres.scviewer.database.IWaveform;
|
||||
import com.minres.scviewer.database.IWaveformDb;
|
||||
import com.minres.scviewer.database.SignalChange;
|
||||
|
||||
public class VCDSignal<T extends ISignalChange> extends HierNode implements ISignal<T> {
|
||||
|
||||
@ -23,7 +26,7 @@ public class VCDSignal<T extends ISignalChange> extends HierNode implements ISig
|
||||
|
||||
private IWaveformDb db;
|
||||
|
||||
TreeSet<ISignalChange> values;
|
||||
TreeMap<Long, T> values;
|
||||
|
||||
public VCDSignal(IWaveformDb db, String name) {
|
||||
this(db, 0, name, 1);
|
||||
@ -39,16 +42,16 @@ public class VCDSignal<T extends ISignalChange> extends HierNode implements ISig
|
||||
fullName=name;
|
||||
this.id=id;
|
||||
this.width=width;
|
||||
this.values=new TreeSet<ISignalChange>();
|
||||
this.values=new TreeMap<Long, T>();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public VCDSignal(IWaveform other, int id, String name) {
|
||||
public VCDSignal(IWaveform<? extends ISignalChange> other, int id, String name) {
|
||||
super(name);
|
||||
fullName=name;
|
||||
this.id=id;
|
||||
assert(other instanceof VCDSignal<?>);
|
||||
this.width=((VCDSignal<? extends ISignalChange>)other).width;
|
||||
this.width=((VCDSignal<? extends IWaveformEvent>)other).width;
|
||||
this.values=((VCDSignal<T>)other).values;
|
||||
this.db=other.getDb();
|
||||
}
|
||||
@ -82,29 +85,19 @@ public class VCDSignal<T extends ISignalChange> extends HierNode implements ISig
|
||||
}
|
||||
|
||||
public void addSignalChange(T change){
|
||||
values.add(change);
|
||||
values.put(change.getTime(), change);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NavigableSet<ISignalChange> getSignalChanges() {
|
||||
public NavigableMap<Long, T> getEvents() {
|
||||
return values;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public T getSignalChangeByTime(EventTime time) {
|
||||
return (T) values.floor(new SignalChange(time));
|
||||
public T getWaveformEventsAtTime(Long time) {
|
||||
return values.get(time);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NavigableSet<ISignalChange> getSignalChangesByTimes(EventTime start, EventTime end) {
|
||||
ISignalChange low = values.floor(new SignalChange(start));
|
||||
ISignalChange high = values.ceiling(new SignalChange(end));
|
||||
if(high!=null)
|
||||
return values.subSet(low, true, high, true);
|
||||
else
|
||||
return values.subSet(low, true, values.last(), true);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
package com.minres.scviewer.database.vcd;
|
||||
|
||||
import com.minres.scviewer.database.BitVector;
|
||||
import com.minres.scviewer.database.EventTime;
|
||||
import com.minres.scviewer.database.ISignalChangeMulti;
|
||||
import com.minres.scviewer.database.SignalChange;
|
||||
|
||||
@ -9,11 +8,11 @@ public class VCDSignalChangeMulti extends SignalChange implements ISignalChangeM
|
||||
|
||||
private BitVector value;
|
||||
|
||||
public VCDSignalChangeMulti(EventTime time) {
|
||||
public VCDSignalChangeMulti(Long time) {
|
||||
super(time);
|
||||
}
|
||||
|
||||
public VCDSignalChangeMulti(EventTime time, BitVector decodedValues) {
|
||||
public VCDSignalChangeMulti(Long time, BitVector decodedValues) {
|
||||
super(time);
|
||||
this.value=decodedValues;
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
package com.minres.scviewer.database.vcd;
|
||||
|
||||
import com.minres.scviewer.database.EventTime;
|
||||
import com.minres.scviewer.database.ISignalChangeSingle;
|
||||
import com.minres.scviewer.database.SignalChange;
|
||||
|
||||
@ -8,7 +7,7 @@ public class VCDSignalChangeSingle extends SignalChange implements ISignalChange
|
||||
|
||||
private char value;
|
||||
|
||||
public VCDSignalChangeSingle(EventTime time, char value) {
|
||||
public VCDSignalChangeSingle(Long time, char value) {
|
||||
super(time);
|
||||
this.value=value;
|
||||
}
|
||||
|
Reference in New Issue
Block a user