This commit is contained in:
2020-11-28 14:08:34 +01:00
parent 21d83f93dc
commit 90f09cc222
26 changed files with 324 additions and 477 deletions

View File

@ -13,9 +13,6 @@ package com.minres.scviewer.database.ui;
import java.awt.Color;
import com.minres.scviewer.database.ISignal;
import com.minres.scviewer.database.ITxEvent;
import com.minres.scviewer.database.ITxStream;
import com.minres.scviewer.database.IWaveform;
public class TrackEntry {
@ -105,20 +102,8 @@ public class TrackEntry {
signalColors[1] = highlightedFallbackColor;
}
public boolean isStream(){
return waveform instanceof ITxStream<?>;
}
public ITxStream<? extends ITxEvent> getStream(){
return (ITxStream<?>) waveform;
}
public boolean isSignal(){
return waveform instanceof ISignal<?>;
}
public ISignal<?> getSignal(){
return (ISignal<?>) waveform;
public IWaveform getWaveform(){
return waveform;
}
@Override

View File

@ -23,7 +23,6 @@ import org.eclipse.swt.widgets.Display;
import com.minres.scviewer.database.ITx;
import com.minres.scviewer.database.ITxRelation;
import com.minres.scviewer.database.ITxStream;
import com.minres.scviewer.database.RelationType;
import com.minres.scviewer.database.ui.WaveformColors;
@ -83,14 +82,13 @@ public class ArrowPainter implements IPainter {
deferUpdate = false;
iRect.clear();
oRect.clear();
ITxStream<?> stream = tx.getStream();
IWaveformPainter painter = waveCanvas.wave2painterMap.get(stream);
IWaveformPainter painter = waveCanvas.wave2painterMap.get(tx.getStream());
if (painter == null) { // stream has been added but painter not yet
// created
deferUpdate = true;
return;
}
int laneHeight = painter.getHeight() / stream.getMaxConcurrency();
int laneHeight = painter.getHeight() / tx.getStream().getWidth();
txRectangle = new Rectangle((int) (tx.getBeginTime() / scaleFactor),
waveCanvas.rulerHeight + painter.getVerticalOffset() + laneHeight * tx.getConcurrencyIndex(),
(int) ((tx.getEndTime() - tx.getBeginTime()) / scaleFactor), laneHeight);
@ -102,9 +100,8 @@ public class ArrowPainter implements IPainter {
for (ITxRelation iTxRelation : relations) {
ITx otherTx = useTarget ? iTxRelation.getTarget() : iTxRelation.getSource();
if (waveCanvas.wave2painterMap.containsKey(otherTx.getStream())) {
ITxStream<?> stream = otherTx.getStream();
IWaveformPainter painter = waveCanvas.wave2painterMap.get(stream);
int laneHeight = painter.getHeight() / stream.getMaxConcurrency();
IWaveformPainter painter = waveCanvas.wave2painterMap.get(otherTx.getStream());
int laneHeight = painter.getHeight() / tx.getStream().getWidth();
Rectangle bb = new Rectangle((int) (otherTx.getBeginTime() / scaleFactor),
waveCanvas.rulerHeight + painter.getVerticalOffset()
+ laneHeight * otherTx.getConcurrencyIndex(),

View File

@ -24,26 +24,28 @@ import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import com.minres.scviewer.database.BitVector;
import com.minres.scviewer.database.ISignal;
import com.minres.scviewer.database.DoubleVal;
import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.database.ui.WaveformColors;
public class SignalPainter extends TrackPainter {
private class SignalChange {
long time;
Object value;
IEvent value;
boolean fromMap;
public SignalChange(Entry<Long, ?> entry) {
public SignalChange(Entry<Long, IEvent[]> entry) {
time = entry.getKey();
value = entry.getValue();
value = entry.getValue()[0];
fromMap = true;
}
public void set(Entry<Long, ?> entry, Long actTime) {
public void set(Entry<Long, IEvent[]> entry, Long actTime) {
if (entry != null) {
time = entry.getKey();
value = entry.getValue();
value = entry.getValue()[0];
fromMap = true;
} else {
time = actTime;
@ -84,7 +86,7 @@ public class SignalPainter extends TrackPainter {
}
public void paintArea(Projection proj, Rectangle area) {
ISignal<?> signal = trackEntry.getSignal();
IWaveform signal = trackEntry.waveform;
if (trackEntry.selected)
proj.setBackground(this.waveCanvas.colors[WaveformColors.TRACK_BG_HIGHLITE.ordinal()]);
else
@ -97,8 +99,8 @@ public class SignalPainter extends TrackPainter {
long beginTime = beginPos*scaleFactor;
long endTime = beginTime + area.width*scaleFactor;
Entry<Long, ?> first = signal.getEvents().floorEntry(beginTime);
Entry<Long, ?> last = signal.getEvents().floorEntry(endTime);
Entry<Long, IEvent[]> first = signal.getEvents().floorEntry(beginTime);
Entry<Long, IEvent[]> last = signal.getEvents().floorEntry(endTime);
if (first == null) {
if (last == null)
return;
@ -109,7 +111,7 @@ public class SignalPainter extends TrackPainter {
proj.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]);
proj.setLineStyle(SWT.LINE_SOLID);
proj.setLineWidth(1);
NavigableMap<Long, ?> entries = signal.getEvents().subMap(first.getKey(), false, last.getKey(), true);
NavigableMap<Long, IEvent[]> entries = signal.getEvents().subMap(first.getKey(), false, last.getKey(), true);
SignalChange left = new SignalChange(first);
SignalChange right = new SignalChange(entries.size() > 0 ? entries.firstEntry() : first);
maxPosX = area.x + area.width;
@ -150,7 +152,7 @@ public class SignalPainter extends TrackPainter {
if (xSigChangeEndPos == xSigChangeBeginPos) {
multiple = true;
long eTime = (xSigChangeBeginPos + 1) * this.waveCanvas.getScaleFactor();
Entry<Long, ?> entry = entries.floorEntry(eTime);
Entry<Long, IEvent[]> entry = entries.floorEntry(eTime);
if(entry!=null && entry.getKey()> right.time)
right.set(entry, endTime);
xSigChangeEndPos = getXPosEnd(eTime);
@ -158,8 +160,8 @@ public class SignalPainter extends TrackPainter {
} while (left.time < endTime);
}
private SignalStencil getStencil(GC gc, SignalChange left, NavigableMap<Long, ?> entries) {
Object val = left.value;
private SignalStencil getStencil(GC gc, SignalChange left, NavigableMap<Long, IEvent[]> entries) {
IEvent val = left.value;
if(val instanceof BitVector) {
BitVector bv = (BitVector) val;
if(bv.getWidth()==1)
@ -170,7 +172,7 @@ public class SignalPainter extends TrackPainter {
return new MultiBitStencilAnalog(entries, left.value,
trackEntry.waveDisplay==TrackEntry.WaveDisplay.CONTINOUS,
trackEntry.valueDisplay==TrackEntry.ValueDisplay.SIGNED);
} else if (val instanceof Double)
} else if (val instanceof DoubleVal)
return new RealStencil(entries, left.value, trackEntry.waveDisplay==TrackEntry.WaveDisplay.CONTINOUS);
else
return null;
@ -178,7 +180,7 @@ public class SignalPainter extends TrackPainter {
private interface SignalStencil {
public void draw(Projection proj, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple);
public void draw(Projection proj, Rectangle area, IEvent left, IEvent right, int xBegin, int xEnd, boolean multiple);
}
private class MultiBitStencil implements SignalStencil {
@ -192,7 +194,7 @@ public class SignalPainter extends TrackPainter {
tmpAwtFont = new java.awt.Font(fd.getName(), fd.getStyle(), height);
}
public void draw(Projection proj, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
public void draw(Projection proj, Rectangle area, IEvent left, IEvent right, int xBegin, int xEnd, boolean multiple) {
Color colorBorder = waveCanvas.colors[WaveformColors.SIGNAL0.ordinal()];
BitVector last = (BitVector) left;
if (last.getValue().toString().contains("X")) {
@ -250,18 +252,19 @@ public class SignalPainter extends TrackPainter {
private long minVal;
private long range;
double yRange = (yOffsetB-yOffsetT);
public MultiBitStencilAnalog(NavigableMap<Long, ?> entries, Object left, boolean continous, boolean signed) {
public MultiBitStencilAnalog(NavigableMap<Long, IEvent[]> entries, Object left, boolean continous, boolean signed) {
this.continous=continous;
Collection<?> values = ((NavigableMap<Long, ?>) entries).values();
Collection<IEvent[]> values = entries.values();
minVal=((BitVector) left).toUnsignedValue();
range=2;
if(!values.isEmpty()) {
long maxVal=minVal;
for (Object e : entries.values()) {
long v = ((BitVector)e).toUnsignedValue();
maxVal=Math.max(maxVal, v);
minVal=Math.min(minVal, v);
}
for (IEvent[] tp : entries.values())
for(IEvent e: tp) {
long v = ((BitVector)e).toUnsignedValue();
maxVal=Math.max(maxVal, v);
minVal=Math.min(minVal, v);
}
if(maxVal==minVal) {
maxVal--;
minVal++;
@ -272,7 +275,7 @@ public class SignalPainter extends TrackPainter {
}
public void draw(Projection proj, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
public void draw(Projection proj, Rectangle area, IEvent left, IEvent right, int xBegin, int xEnd, boolean multiple) {
long leftVal = ((BitVector) left).toUnsignedValue();
long rightVal= ((BitVector) right).toUnsignedValue();
proj.setForeground(waveCanvas.colors[WaveformColors.SIGNAL_REAL.ordinal()]);
@ -298,7 +301,7 @@ public class SignalPainter extends TrackPainter {
}
private class SingleBitStencil implements SignalStencil {
public void draw(Projection proj, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
public void draw(Projection proj, Rectangle area, IEvent left, IEvent right, int xBegin, int xEnd, boolean multiple) {
if (multiple) {
proj.setForeground(waveCanvas.colors[WaveformColors.SIGNALU.ordinal()]);
proj.drawLine(xBegin, yOffsetT, xBegin, yOffsetB);
@ -351,9 +354,9 @@ public class SignalPainter extends TrackPainter {
boolean continous=true;
public RealStencil(NavigableMap<Long, ?> entries, Object left, boolean continous) {
public RealStencil(NavigableMap<Long, IEvent[]> entries, Object left, boolean continous) {
this.continous=continous;
Collection<?> values = ((NavigableMap<Long, ?>) entries).values();
Collection<IEvent[]> values = ((NavigableMap<Long, IEvent[]>) entries).values();
minVal=(Double) left;
range=2.0;
if(!values.isEmpty()) {
@ -378,9 +381,9 @@ public class SignalPainter extends TrackPainter {
}
}
public void draw(Projection proj, Rectangle area, Object left, Object right, int xBegin, int xEnd, boolean multiple) {
double leftVal = (Double) left;
double rightVal= (Double) right;
public void draw(Projection proj, Rectangle area, IEvent left, IEvent right, int xBegin, int xEnd, boolean multiple) {
double leftVal = ((DoubleVal) left).value;
double rightVal= ((DoubleVal) right).value;
if(Double.isNaN(leftVal)) {
Color color = waveCanvas.colors[WaveformColors.SIGNAL_NAN.ordinal()];
int width = xEnd - xBegin;

View File

@ -11,7 +11,6 @@
package com.minres.scviewer.database.ui.swt.internal;
import java.util.Collection;
import java.util.List;
import java.util.Map.Entry;
import java.util.NavigableMap;
import java.util.TreeSet;
@ -21,9 +20,11 @@ import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import com.minres.scviewer.database.EventKind;
import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.ITx;
import com.minres.scviewer.database.ITxEvent;
import com.minres.scviewer.database.ITxStream;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.database.ui.WaveformColors;
@ -33,7 +34,7 @@ public class StreamPainter extends TrackPainter{
*
*/
private final WaveformCanvas waveCanvas;
private ITxStream<? extends ITxEvent> stream;
private IWaveform stream;
private int txBase, txHeight;
private boolean even;
private TreeSet<ITx> seenTx;
@ -41,10 +42,10 @@ public class StreamPainter extends TrackPainter{
public StreamPainter(WaveformCanvas waveCanvas, boolean even, TrackEntry trackEntry) {
super(trackEntry, even);
this.waveCanvas = waveCanvas;
this.stream=trackEntry.getStream();
this.stream=trackEntry.waveform;
this.seenTx=new TreeSet<ITx>();
}
/*
* convert java.awt.Color to org.eclipse.swt.graphics.Color
*/
@ -62,7 +63,7 @@ public class StreamPainter extends TrackPainter{
@SuppressWarnings("unchecked")
public void paintArea(Projection proj, Rectangle area) {
if(stream.getEvents().size()==0) return;
int trackHeight=trackEntry.height/stream.getMaxConcurrency();
int trackHeight=trackEntry.height/stream.getWidth();
txBase=trackHeight/5;
txHeight=trackHeight*3/5;
if(trackEntry.selected) {
@ -72,12 +73,12 @@ public class StreamPainter extends TrackPainter{
proj.setBackground(this.waveCanvas.colors[even?WaveformColors.TRACK_BG_EVEN.ordinal():WaveformColors.TRACK_BG_ODD.ordinal()]);
proj.setFillRule(SWT.FILL_EVEN_ODD);
proj.fillRectangle(area);
long scaleFactor = this.waveCanvas.getScaleFactor();
long beginPos = area.x;
long beginTime = beginPos*scaleFactor;
//long endPos = beginPos + area.width;
long endTime = beginTime + area.width*scaleFactor;
long endTime = beginTime + area.width*scaleFactor;
Entry<Long, ?> firstTx=stream.getEvents().floorEntry(beginTime);
Entry<Long, ?> lastTx=stream.getEvents().ceilingEntry(endTime);
@ -87,23 +88,24 @@ public class StreamPainter extends TrackPainter{
proj.setLineStyle(SWT.LINE_SOLID);
proj.setLineWidth(1);
proj.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]);
for( int y1=area.y+trackHeight/2; y1<area.y+trackEntry.height; y1+=trackHeight)
proj.drawLine(area.x, y1, area.x+area.width, y1);
for( int y1=area.y+trackHeight/2; y1<area.y+trackEntry.height; y1+=trackHeight)
proj.drawLine(area.x, y1, area.x+area.width, y1);
if(firstTx==lastTx) {
for(ITxEvent txEvent:(Collection<? extends ITxEvent>)firstTx.getValue())
drawTx(proj, area, txEvent.getTransaction(), false);
}else{
seenTx.clear();
NavigableMap<Long,?> entries = stream.getEvents().subMap(firstTx.getKey(), true, lastTx.getKey(), true);
NavigableMap<Long, IEvent[]> entries = stream.getEvents().subMap(firstTx.getKey(), true, lastTx.getKey(), true);
boolean highlighed=false;
proj.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]);
for(Entry<Long, ?> entry: entries.entrySet())
for(ITxEvent txEvent:(Collection<? extends ITxEvent>)entry.getValue()){
if(txEvent.getType()==ITxEvent.Type.BEGIN)
proj.setForeground(this.waveCanvas.colors[WaveformColors.LINE.ordinal()]);
for(Entry<Long, IEvent[]> entry: entries.entrySet())
for(IEvent evt:entry.getValue()){
ITxEvent txEvent = (ITxEvent) evt;
if(txEvent.getKind()==EventKind.BEGIN)
seenTx.add(txEvent.getTransaction());
if(txEvent.getType()==ITxEvent.Type.END){
if(txEvent.getKind()==EventKind.END){
ITx tx = txEvent.getTransaction();
highlighed|=waveCanvas.currentSelection!=null && waveCanvas.currentSelection.equals(tx);
drawTx(proj, area, tx, false);
@ -114,19 +116,19 @@ public class StreamPainter extends TrackPainter{
drawTx(proj, area, tx, false);
}
if(highlighed){
proj.setForeground(this.waveCanvas.colors[WaveformColors.LINE_HIGHLITE.ordinal()]);
drawTx(proj, area, waveCanvas.currentSelection, true);
proj.setForeground(this.waveCanvas.colors[WaveformColors.LINE_HIGHLITE.ordinal()]);
drawTx(proj, area, waveCanvas.currentSelection, true);
}
}
}
protected void drawTx(Projection proj, Rectangle area, ITx tx, boolean highlighted ) {
// compute colors
java.awt.Color[] fallbackColors = trackEntry.getColors();
java.awt.Color[] transColor = TrackEntry.computeColor( tx.getGenerator().getName(), fallbackColors[0], fallbackColors[1] );
proj.setBackground( toSwtColor( proj.getGC(), transColor[highlighted?1:0] ) );
java.awt.Color[] fallbackColors = trackEntry.getColors();
java.awt.Color[] transColor = TrackEntry.computeColor( tx.getGenerator().getName(), fallbackColors[0], fallbackColors[1] );
proj.setBackground( toSwtColor( proj.getGC(), transColor[highlighted?1:0] ) );
int offset = tx.getConcurrencyIndex()*this.waveCanvas.getTrackHeight();
Rectangle bb = new Rectangle(
(int)(tx.getBeginTime()/this.waveCanvas.getScaleFactor()), area.y+offset+txBase,
@ -154,7 +156,7 @@ public class StreamPainter extends TrackPainter{
public ITx getClicked(Point point) {
int lane=point.y/waveCanvas.getTrackHeight();
Entry<Long, List<ITxEvent>> firstTx=stream.getEvents().floorEntry(point.x*waveCanvas.getScaleFactor());
Entry<Long, IEvent[]> firstTx=stream.getEvents().floorEntry(point.x*waveCanvas.getScaleFactor());
if(firstTx!=null){
do {
ITx tx = getTxFromEntry(lane, point.x, firstTx);
@ -165,31 +167,35 @@ public class StreamPainter extends TrackPainter{
return null;
}
public ITxStream<? extends ITxEvent> getStream() {
public IWaveform getStream() {
return stream;
}
public void setStream(ITxStream<? extends ITxEvent> stream) {
public void setStream(IWaveform stream) {
this.stream = stream;
}
protected ITx getTxFromEntry(int lane, int offset, Entry<Long, List<ITxEvent>> firstTx) {
long timePoint=offset*waveCanvas.getScaleFactor();
for(ITxEvent evt:firstTx.getValue()){
ITx tx=evt.getTransaction();
if(evt.getType()==ITxEvent.Type.BEGIN && tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePoint && tx.getEndTime()>=timePoint){
return evt.getTransaction();
protected ITx getTxFromEntry(int lane, int offset, Entry<Long, IEvent[]> firstTx) {
long timePoint=offset*waveCanvas.getScaleFactor();
for(IEvent evt:firstTx.getValue()){
if(evt instanceof ITxEvent) {
ITx tx=((ITxEvent)evt).getTransaction();
if(evt.getKind()==EventKind.BEGIN && tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePoint && tx.getEndTime()>=timePoint){
return ((ITxEvent)evt).getTransaction();
}
}
}
// now with some fuzziness
timePoint=(offset-5)*waveCanvas.getScaleFactor();
long timePointHigh=(offset+5)*waveCanvas.getScaleFactor();
for(ITxEvent evt:firstTx.getValue()){
ITx tx=evt.getTransaction();
if(evt.getType()==ITxEvent.Type.BEGIN && tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePointHigh && tx.getEndTime()>=timePoint){
return evt.getTransaction();
}
}
timePoint=(offset-5)*waveCanvas.getScaleFactor();
long timePointHigh=(offset+5)*waveCanvas.getScaleFactor();
for(IEvent evt:firstTx.getValue()){
if(evt instanceof ITxEvent) {
ITx tx=((ITxEvent)evt).getTransaction();
if(evt.getKind()==EventKind.BEGIN && tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePointHigh && tx.getEndTime()>=timePoint){
return ((ITxEvent)evt).getTransaction();
}
}
}
return null;
}

View File

@ -16,6 +16,7 @@ import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@ -78,13 +79,15 @@ import org.eclipse.wb.swt.SWTResourceManager;
import com.google.common.collect.Lists;
import com.minres.scviewer.database.BitVector;
import com.minres.scviewer.database.ISignal;
import com.minres.scviewer.database.DoubleVal;
import com.minres.scviewer.database.EventKind;
import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.ITx;
import com.minres.scviewer.database.ITxEvent;
import com.minres.scviewer.database.ITxRelation;
import com.minres.scviewer.database.ITxStream;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.RelationType;
import com.minres.scviewer.database.WaveformType;
import com.minres.scviewer.database.ui.GotoDirection;
import com.minres.scviewer.database.ui.ICursor;
import com.minres.scviewer.database.ui.IWaveformView;
@ -251,17 +254,11 @@ public class WaveformView implements IWaveformView {
Entry<Long, ?> floorEntry=null, ceilEntry=null;
if(o instanceof TrackEntry){
TrackEntry entry = (TrackEntry) o;
if(entry.waveform instanceof ISignal<?>){
NavigableMap<Long, ?> map = ((ISignal<?>)entry.waveform).getEvents();
floorEntry = map.floorEntry(time);
ceilEntry = map.ceilingEntry(time);
} else if (entry.waveform instanceof ITxStream<?>){
NavigableMap<Long, ?> map = ((ITxStream<?>)entry.waveform).getEvents();
floorEntry = map.floorEntry(time);
ceilEntry = map.ceilingEntry(time);
}
NavigableMap<Long, IEvent[]> map = entry.waveform.getEvents();
floorEntry = map.floorEntry(time);
ceilEntry = map.ceilingEntry(time);
} else if(o instanceof ITx){
NavigableMap<Long, ?> map = ((ITx)o).getStream().getEvents();
NavigableMap<Long, IEvent[]> map = ((ITx)o).getStream().getEvents();
floorEntry = map.floorEntry(time);
ceilEntry = map.ceilingEntry(time);
}
@ -522,11 +519,11 @@ public class WaveformView implements IWaveformView {
for (TrackEntry streamEntry : streams) {
streamEntry.height = waveformCanvas.getTrackHeight();
streamEntry.vOffset=trackVerticalHeight;
if (streamEntry.isStream()) {
if (streamEntry.waveform.getType()==WaveformType.TRANSACTION) {
streamEntry.currentValue="";
streamEntry.height *= streamEntry.getStream().getMaxConcurrency();
streamEntry.height *= streamEntry.waveform.getWidth();
painter = new StreamPainter(waveformCanvas, even, streamEntry);
} else if (streamEntry.isSignal()) {
} else if (streamEntry.waveform.getType()==WaveformType.SIGNAL) {
streamEntry.currentValue="---";
painter = new SignalPainter(waveformCanvas, even, streamEntry);
}
@ -563,11 +560,10 @@ public class WaveformView implements IWaveformView {
private void updateValueList(){
final Long time = getCursorTime();
for(TrackEntry entry:streams){
if(entry.isSignal()){
ISignal<?> signal = (ISignal<?>) entry.waveform;
Object value = signal.getWaveformValueBeforeTime(time);
if(value instanceof BitVector){
BitVector bv = (BitVector) value;
if(entry.waveform.getType() == WaveformType.SIGNAL){
IEvent[] value = entry.waveform.getEventsBeforeTime(time);
if(value[0] instanceof BitVector){
BitVector bv = (BitVector) value[0];
if(bv.getWidth()==1)
entry.currentValue="b'"+bv;
else {
@ -583,27 +579,28 @@ public class WaveformView implements IWaveformView {
entry.currentValue="h'"+bv.toHexString();
}
}
} else if(value instanceof Double){
Double val = (Double) value;
} else if(value[0] instanceof DoubleVal){
Double val = ((DoubleVal) value[0]).value;
if(val>0.001)
entry.currentValue=String.format("%1$,.3f", val);
else
entry.currentValue=Double.toString(val);
}
} else if(entry.isStream()){
ITxStream<?> stream = (ITxStream<?>) entry.waveform;
ITx[] resultsList = new ITx[stream.getMaxConcurrency()];
Entry<Long, List<ITxEvent>> firstTx=stream.getEvents().floorEntry(time);
} else if(entry.waveform.getType() == WaveformType.TRANSACTION){
ITx[] resultsList = new ITx[entry.waveform.getWidth()];
Entry<Long, IEvent[]> firstTx=entry.waveform.getEvents().floorEntry(time);
if(firstTx!=null){
do {
for(ITxEvent evt:firstTx.getValue()){
ITx tx=evt.getTransaction();
if(evt.getType()==ITxEvent.Type.BEGIN && tx.getBeginTime()<=time && tx.getEndTime()>=time){
for(IEvent evt:firstTx.getValue()){
if(evt instanceof ITxEvent) {
ITx tx=((ITxEvent)evt).getTransaction();
if(evt.getKind()==EventKind.BEGIN && tx.getBeginTime()<=time && tx.getEndTime()>=time){
if(resultsList[tx.getConcurrencyIndex()]==null)
resultsList[tx.getConcurrencyIndex()]= evt.getTransaction();
resultsList[tx.getConcurrencyIndex()]= ((ITxEvent)evt).getTransaction();
}
}
}
firstTx=stream.getEvents().lowerEntry(firstTx.getKey());
firstTx=entry.waveform.getEvents().lowerEntry(firstTx.getKey());
}while(firstTx!=null && !isArrayFull(resultsList));
entry.currentValue="";
boolean separator=false;
@ -804,15 +801,14 @@ public class WaveformView implements IWaveformView {
else if(currentWaveformSelection.size()!=1) return;
if(selectedWaveform==null)
selectedWaveform = currentWaveformSelection.get(1);
if (selectedWaveform!=null && selectedWaveform.isStream() && currentTxSelection!=null) {
if (selectedWaveform!=null && selectedWaveform.waveform.getType()==WaveformType.TRANSACTION && currentTxSelection!=null) {
if(relationType.equals(IWaveformView.NEXT_PREV_IN_STREAM)){
ITxStream<? extends ITxEvent> stream = selectedWaveform.getStream();
ITx transaction = null;
if (direction == GotoDirection.NEXT) {
List<ITxEvent> thisEntryList = stream.getEvents().get(currentTxSelection.getBeginTime());
ITxEvent[] thisEntryList = (ITxEvent[]) selectedWaveform.waveform.getEvents().get(currentTxSelection.getBeginTime());
boolean meFound=false;
for (ITxEvent evt : thisEntryList) {
if (evt.getType() == ITxEvent.Type.BEGIN) {
if (evt.getKind() == EventKind.BEGIN) {
if(meFound){
transaction = evt.getTransaction();
break;
@ -821,42 +817,42 @@ public class WaveformView implements IWaveformView {
}
}
if (transaction == null){
Entry<Long, List<ITxEvent>> entry = stream.getEvents().higherEntry(currentTxSelection.getBeginTime());
Entry<Long, IEvent[]> entry = selectedWaveform.waveform.getEvents().higherEntry(currentTxSelection.getBeginTime());
if (entry != null) do {
for (ITxEvent evt : entry.getValue()) {
if (evt.getType() == ITxEvent.Type.BEGIN) {
transaction = evt.getTransaction();
for (IEvent evt : entry.getValue()) {
if (evt instanceof ITxEvent && evt.getKind() == EventKind.BEGIN) {
transaction = ((ITxEvent)evt).getTransaction();
break;
}
}
if (transaction == null)
entry = stream.getEvents().higherEntry(entry.getKey());
entry = selectedWaveform.waveform.getEvents().higherEntry(entry.getKey());
} while (entry != null && transaction == null);
}
} else if (direction == GotoDirection.PREV) {
List<ITxEvent> thisEntryList = stream.getEvents().get(currentTxSelection.getBeginTime());
IEvent[] thisEntryList = selectedWaveform.waveform.getEvents().get(currentTxSelection.getBeginTime());
boolean meFound=false;
for (ITxEvent evt : Lists.reverse(thisEntryList)) {
if (evt.getType() == ITxEvent.Type.BEGIN) {
for (IEvent evt : Lists.reverse(Arrays.asList(thisEntryList))) {
if (evt instanceof ITxEvent && evt.getKind() == EventKind.BEGIN) {
if(meFound){
transaction = evt.getTransaction();
transaction = ((ITxEvent)evt).getTransaction();
break;
}
meFound|= evt.getTransaction().equals(currentTxSelection);
meFound|= ((ITxEvent)evt).getTransaction().equals(currentTxSelection);
}
}
if (transaction == null){
Entry<Long, List<ITxEvent>> entry = stream.getEvents().lowerEntry(currentTxSelection.getBeginTime());
Entry<Long, IEvent[]> entry = selectedWaveform.waveform.getEvents().lowerEntry(currentTxSelection.getBeginTime());
if (entry != null)
do {
for (ITxEvent evt : Lists.reverse(entry.getValue())) {
if (evt.getType() == ITxEvent.Type.BEGIN) {
transaction = evt.getTransaction();
for (IEvent evt : Lists.reverse(Arrays.asList(thisEntryList))) {
if (evt instanceof ITxEvent && evt.getKind() == EventKind.BEGIN) {
transaction = ((ITxEvent)evt).getTransaction();
break;
}
}
if (transaction == null)
entry = stream.getEvents().lowerEntry(entry.getKey());
entry = selectedWaveform.waveform.getEvents().lowerEntry(entry.getKey());
} while (entry != null && transaction == null);
}
}
@ -896,8 +892,8 @@ public class WaveformView implements IWaveformView {
}
private boolean streamsVisible(ITxRelation relation) {
final ITxStream<ITxEvent> src = relation.getSource().getStream();
final ITxStream<ITxEvent> tgt = relation.getTarget().getStream();
final IWaveform src = relation.getSource().getStream();
final IWaveform tgt = relation.getTarget().getStream();
return streams.stream().anyMatch(x -> x.waveform == src) && streams.stream().anyMatch(x -> x.waveform == tgt);
}
@ -910,10 +906,10 @@ public class WaveformView implements IWaveformView {
TrackEntry sel = currentWaveformSelection.get(0);
long time = getCursorTime();
NavigableMap<Long, ?> map=null;
if(sel.isStream()){
map=sel.getStream().getEvents();
} else if(sel.isSignal()){
map=sel.getSignal().getEvents();
if(sel.waveform.getType()==WaveformType.TRANSACTION){
map=sel.waveform.getEvents();
} else if(sel.waveform.getType()==WaveformType.SIGNAL){
map=sel.waveform.getEvents();
}
if(map!=null){
Entry<Long, ?> entry=direction==GotoDirection.PREV?map.lowerEntry(time):map.higherEntry(time);
@ -981,15 +977,15 @@ public class WaveformView implements IWaveformView {
if (lastKey == firstKey) {
TrackEntry trackEntry=trackVerticalOffset.get(firstKey);
IWaveform w = trackEntry.waveform;
if (w instanceof ITxStream<?>)
subArea.height *= ((ITxStream<?>) w).getMaxConcurrency();
if (w.getType()==WaveformType.TRANSACTION)
subArea.height *= w.getWidth();
drawTextFormat(gc, subArea, firstKey, w.getFullName(), trackEntry.selected);
} else {
for (Entry<Integer, TrackEntry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true).entrySet()) {
IWaveform w = entry.getValue().waveform;
subArea.height = waveformCanvas.getTrackHeight();
if (w instanceof ITxStream<?>)
subArea.height *= ((ITxStream<?>) w).getMaxConcurrency();
if (w.getType()==WaveformType.TRANSACTION)
subArea.height *= w.getWidth();
drawTextFormat(gc, subArea, entry.getKey(), w.getFullName(), entry.getValue().selected);
}
}
@ -1008,16 +1004,16 @@ public class WaveformView implements IWaveformView {
if (lastKey == firstKey) {
TrackEntry trackEntry=trackVerticalOffset.get(firstKey);
IWaveform w = trackEntry.waveform;
if (w instanceof ITxStream<?>)
subArea.height *= ((ITxStream<?>) w).getMaxConcurrency();
if (w.getType()==WaveformType.TRANSACTION)
subArea.height *= w.getWidth();
drawValue(gc, subArea, firstKey, trackEntry.currentValue, trackEntry.selected);
} else {
for (Entry<Integer, TrackEntry> entry : trackVerticalOffset.subMap(firstKey, true, lastKey, true)
.entrySet()) {
IWaveform w = entry.getValue().waveform;
subArea.height = waveformCanvas.getTrackHeight();
if (w instanceof ITxStream<?>)
subArea.height *= ((ITxStream<?>) w).getMaxConcurrency();
if (w.getType()==WaveformType.TRANSACTION)
subArea.height *= w.getWidth();
drawValue(gc, subArea, entry.getKey(), entry.getValue().currentValue, entry.getValue().selected);
}
}