fix track and relation handling
This commit is contained in:
parent
351a246238
commit
0d074ea6ae
|
@ -58,12 +58,6 @@ http://www.eclipse.org/legal/epl-v10.html
|
||||||
version="0.0.0"
|
version="0.0.0"
|
||||||
unpack="false"/>
|
unpack="false"/>
|
||||||
|
|
||||||
<plugin
|
|
||||||
id="org.codehaus.groovy"
|
|
||||||
download-size="0"
|
|
||||||
install-size="0"
|
|
||||||
version="0.0.0"/>
|
|
||||||
|
|
||||||
<plugin
|
<plugin
|
||||||
id="com.minres.scviewer.database.vcd"
|
id="com.minres.scviewer.database.vcd"
|
||||||
download-size="0"
|
download-size="0"
|
||||||
|
|
|
@ -8,7 +8,8 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||||
Import-Package: org.osgi.framework;version="1.3.0"
|
Import-Package: org.osgi.framework;version="1.3.0"
|
||||||
Require-Bundle: com.minres.scviewer.database,
|
Require-Bundle: com.minres.scviewer.database,
|
||||||
org.eclipse.osgi.services;bundle-version="3.4.0",
|
org.eclipse.osgi.services;bundle-version="3.4.0",
|
||||||
com.google.guava;bundle-version="15.0.0"
|
com.google.guava;bundle-version="15.0.0",
|
||||||
|
org.eclipse.collections;bundle-version="10.4.0"
|
||||||
Service-Component: OSGI-INF/component.xml
|
Service-Component: OSGI-INF/component.xml
|
||||||
Bundle-ActivationPolicy: lazy
|
Bundle-ActivationPolicy: lazy
|
||||||
Automatic-Module-Name: com.minres.scviewer.database.text
|
Automatic-Module-Name: com.minres.scviewer.database.text
|
||||||
|
|
|
@ -21,7 +21,6 @@ import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.zip.GZIPInputStream;
|
import java.util.zip.GZIPInputStream;
|
||||||
|
@ -41,8 +40,8 @@ import com.minres.scviewer.database.IWaveformDb;
|
||||||
import com.minres.scviewer.database.IWaveformDbLoader;
|
import com.minres.scviewer.database.IWaveformDbLoader;
|
||||||
import com.minres.scviewer.database.InputFormatException;
|
import com.minres.scviewer.database.InputFormatException;
|
||||||
import com.minres.scviewer.database.RelationType;
|
import com.minres.scviewer.database.RelationType;
|
||||||
|
import com.minres.scviewer.database.RelationTypeFactory;
|
||||||
import com.minres.scviewer.database.tx.ITx;
|
import com.minres.scviewer.database.tx.ITx;
|
||||||
import com.minres.scviewer.database.tx.ITxAttributeType;
|
|
||||||
|
|
||||||
public class TextDbLoader implements IWaveformDbLoader{
|
public class TextDbLoader implements IWaveformDbLoader{
|
||||||
|
|
||||||
|
@ -58,7 +57,9 @@ public class TextDbLoader implements IWaveformDbLoader{
|
||||||
|
|
||||||
BTreeMap<Long, ScvTx> transactions;
|
BTreeMap<Long, ScvTx> transactions;
|
||||||
|
|
||||||
BTreeMap<Long[], ScvRelation> relations;
|
BTreeMap<Long[], ScvRelation> relationsIn;
|
||||||
|
|
||||||
|
BTreeMap<Long[], ScvRelation> relationsOut;
|
||||||
|
|
||||||
BTreeMap<String[], TxAttributeType> attributeTypes;
|
BTreeMap<String[], TxAttributeType> attributeTypes;
|
||||||
|
|
||||||
|
@ -97,22 +98,27 @@ public class TextDbLoader implements IWaveformDbLoader{
|
||||||
mapDbFile.delete(); // we just need a file name
|
mapDbFile.delete(); // we just need a file name
|
||||||
mapDbFile.deleteOnExit();
|
mapDbFile.deleteOnExit();
|
||||||
mapDb = DBMaker
|
mapDb = DBMaker
|
||||||
.fileDB(mapDbFile)
|
.memoryDirectDB()
|
||||||
.fileMmapEnableIfSupported()
|
// .fileDB(mapDbFile)
|
||||||
.fileMmapPreclearDisable()
|
// .fileMmapEnable() // Always enable mmap
|
||||||
|
// .fileMmapEnableIfSupported()
|
||||||
|
// .fileMmapPreclearDisable()
|
||||||
|
.allocateStartSize(512*1024*1024)
|
||||||
|
.allocateIncrement(128*1024*1024)
|
||||||
.cleanerHackEnable()
|
.cleanerHackEnable()
|
||||||
.allocateStartSize(64*1024*1024)
|
|
||||||
.allocateIncrement(64*1024*1024)
|
|
||||||
.make();
|
.make();
|
||||||
TreeMapSink<Long, ScvTx> txSink = mapDb.treeMap("transactions", Serializer.LONG,Serializer.JAVA).createFromSink();
|
TreeMapSink<Long, ScvTx> txSink = mapDb.treeMap("transactions", Serializer.LONG,Serializer.JAVA).createFromSink();
|
||||||
relations = mapDb
|
relationsIn = mapDb
|
||||||
.treeMap("relations", new SerializerArrayTuple(Serializer.LONG, Serializer.LONG) ,Serializer.JAVA)
|
.treeMap("relationsIn", new SerializerArrayTuple(Serializer.LONG, Serializer.LONG) ,Serializer.JAVA)
|
||||||
|
.createOrOpen();
|
||||||
|
relationsOut = mapDb
|
||||||
|
.treeMap("relationsOut", new SerializerArrayTuple(Serializer.LONG, Serializer.LONG) ,Serializer.JAVA)
|
||||||
.createOrOpen();
|
.createOrOpen();
|
||||||
attributeTypes = mapDb
|
attributeTypes = mapDb
|
||||||
.treeMap("attributeTypes", new SerializerArrayTuple(Serializer.STRING, Serializer.STRING) ,Serializer.JAVA)
|
.treeMap("attributeTypes", new SerializerArrayTuple(Serializer.STRING, Serializer.STRING) ,Serializer.JAVA)
|
||||||
.createOrOpen();
|
.createOrOpen();
|
||||||
try {
|
try {
|
||||||
parser.setTransactionSink(txSink).setRelationMap(relations);
|
parser.setTransactionSink(txSink).setRelationMaps(relationsIn, relationsOut);
|
||||||
parser.parseInput(gzipped?new GZIPInputStream(new FileInputStream(file)):new FileInputStream(file));
|
parser.parseInput(gzipped?new GZIPInputStream(new FileInputStream(file)):new FileInputStream(file));
|
||||||
} catch(IllegalArgumentException|ArrayIndexOutOfBoundsException e) {
|
} catch(IllegalArgumentException|ArrayIndexOutOfBoundsException e) {
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
|
@ -176,7 +182,9 @@ public class TextDbLoader implements IWaveformDbLoader{
|
||||||
|
|
||||||
private TreeMapSink<Long, ScvTx> txSink;
|
private TreeMapSink<Long, ScvTx> txSink;
|
||||||
|
|
||||||
private BTreeMap<Long[], ScvRelation> relations;
|
private BTreeMap<Long[], ScvRelation> relationsIn;
|
||||||
|
|
||||||
|
private BTreeMap<Long[], ScvRelation> relationsOut;
|
||||||
|
|
||||||
public TextDbParser(TextDbLoader loader) {
|
public TextDbParser(TextDbLoader loader) {
|
||||||
super();
|
super();
|
||||||
|
@ -188,8 +196,9 @@ public class TextDbLoader implements IWaveformDbLoader{
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TextDbParser setRelationMap(BTreeMap<Long[], ScvRelation> relations) {
|
public TextDbParser setRelationMaps(BTreeMap<Long[], ScvRelation> relationsIn, BTreeMap<Long[], ScvRelation> relationsOut) {
|
||||||
this.relations=relations;
|
this.relationsIn=relationsIn;
|
||||||
|
this.relationsOut=relationsOut;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,11 +227,11 @@ public class TextDbLoader implements IWaveformDbLoader{
|
||||||
|
|
||||||
private String parseLine(String curLine, String nextLine) throws IOException{
|
private String parseLine(String curLine, String nextLine) throws IOException{
|
||||||
String[] tokens = curLine.split("\\s+");
|
String[] tokens = curLine.split("\\s+");
|
||||||
if("tx_record_attribute".equals(tokens[0])){//matcher = line =~ /^tx_record_attribute\s+(\d+)\s+"([^"]+)"\s+(\S+)\s*=\s*(.+)$/
|
if("tx_record_attribute".equals(tokens[0])){
|
||||||
Long id = Long.parseLong(tokens[1]);
|
Long id = Long.parseLong(tokens[1]);
|
||||||
String name = tokens[2].substring(1, tokens[2].length());
|
String name = tokens[2].substring(1, tokens[2].length());
|
||||||
DataType type = DataType.valueOf(tokens[3]);
|
DataType type = DataType.valueOf(tokens[3]);
|
||||||
String remaining = tokens.length>5?String.join(" ", Arrays.copyOfRange(tokens, 5, tokens.length-1)):"";
|
String remaining = tokens.length>5?String.join(" ", Arrays.copyOfRange(tokens, 5, tokens.length)):"";
|
||||||
TxAttributeType attrType = getAttrType(name, type, AssociationType.RECORD);
|
TxAttributeType attrType = getAttrType(name, type, AssociationType.RECORD);
|
||||||
transactionsById.get(id).attributes.add(new TxAttribute(attrType, remaining));
|
transactionsById.get(id).attributes.add(new TxAttribute(attrType, remaining));
|
||||||
} else if("tx_begin".equals(tokens[0])){
|
} else if("tx_begin".equals(tokens[0])){
|
||||||
|
@ -245,7 +254,7 @@ public class TextDbLoader implements IWaveformDbLoader{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
txSink.put(tx.id, tx);
|
txSink.put(tx.id, tx);
|
||||||
} else if("tx_end".equals(tokens[0])){//matcher = line =~ /^tx_end\s+(\d+)\s+(\d+)\s+(\d+)\s+([munpf]?s)/
|
} else if("tx_end".equals(tokens[0])){
|
||||||
Long id = Long.parseLong(tokens[1]);
|
Long id = Long.parseLong(tokens[1]);
|
||||||
ScvTx tx = transactionsById.get(id);
|
ScvTx tx = transactionsById.get(id);
|
||||||
assert Long.parseLong(tokens[2])==tx.generatorId;
|
assert Long.parseLong(tokens[2])==tx.generatorId;
|
||||||
|
@ -271,14 +280,15 @@ public class TextDbLoader implements IWaveformDbLoader{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
transactionsById.remove(tx.id);
|
transactionsById.remove(tx.id);
|
||||||
} else if("tx_relation".equals(tokens[0])){//matcher = line =~ /^tx_relation\s+\"(\S+)\"\s+(\d+)\s+(\d+)$/
|
} else if("tx_relation".equals(tokens[0])){
|
||||||
Long tr2= Long.parseLong(tokens[2]);
|
Long tr2= Long.parseLong(tokens[2]);
|
||||||
Long tr1= Long.parseLong(tokens[3]);
|
Long tr1= Long.parseLong(tokens[3]);
|
||||||
String relType=tokens[1].substring(1, tokens[1].length()-2);
|
String relType=tokens[1].substring(1, tokens[1].length()-1);
|
||||||
if(!loader.relationTypes.containsKey(relType))
|
if(!loader.relationTypes.containsKey(relType))
|
||||||
loader.relationTypes.put(relType, RelationType.create(relType));
|
loader.relationTypes.put(relType, RelationTypeFactory.create(relType));
|
||||||
ScvRelation rel = new ScvRelation(loader.relationTypes.get(relType), tr1, tr2);
|
ScvRelation rel = new ScvRelation(loader.relationTypes.get(relType), tr1, tr2);
|
||||||
relations.put(new Long[]{tr1, tr2}, rel);
|
relationsOut.put(new Long[]{tr1, tr2}, rel);
|
||||||
|
relationsIn.put(new Long[]{tr2, tr1}, rel);
|
||||||
} else if("scv_tr_stream".equals(tokens[0])){
|
} else if("scv_tr_stream".equals(tokens[0])){
|
||||||
Matcher matcher = scv_tr_stream.matcher(curLine);
|
Matcher matcher = scv_tr_stream.matcher(curLine);
|
||||||
if (matcher.matches()) {
|
if (matcher.matches()) {
|
||||||
|
|
|
@ -36,13 +36,13 @@ class Tx implements ITx {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<ITxRelation> getIncomingRelations() {
|
public Collection<ITxRelation> getIncomingRelations() {
|
||||||
NavigableMap<Long[], ScvRelation> rels = loader.relations.prefixSubMap(new Long[]{scvTx.getId(), null});
|
NavigableMap<Long[], ScvRelation> rels = loader.relationsIn.prefixSubMap(new Long[]{scvTx.getId()});
|
||||||
return rels.values().stream().map(rel -> new TxRelation(loader, rel)).collect(Collectors.toList());
|
return rels.values().stream().map(rel -> new TxRelation(loader, rel)).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<ITxRelation> getOutgoingRelations() {
|
public Collection<ITxRelation> getOutgoingRelations() {
|
||||||
NavigableMap<Long[], ScvRelation> rels = loader.relations.prefixSubMap(new Long[]{null, scvTx.getId()});
|
NavigableMap<Long[], ScvRelation> rels = loader.relationsOut.prefixSubMap(new Long[]{scvTx.getId()});
|
||||||
return rels.values().stream().map(rel -> new TxRelation(loader, rel)).collect(Collectors.toList());
|
return rels.values().stream().map(rel -> new TxRelation(loader, rel)).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ public class TxAttribute implements ITxAttribute, Serializable {
|
||||||
switch(type.getDataType()){
|
switch(type.getDataType()){
|
||||||
case STRING:
|
case STRING:
|
||||||
case ENUMERATION:
|
case ENUMERATION:
|
||||||
this.value=value.substring(1, value.length()-2);
|
this.value=value.substring(1, value.length()-1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
this.value=value;
|
this.value=value;
|
||||||
|
|
|
@ -167,7 +167,8 @@ public class StreamPainter extends TrackPainter{
|
||||||
for(IEvent evt:firstTx.getValue()){
|
for(IEvent evt:firstTx.getValue()){
|
||||||
if(evt instanceof ITxEvent) {
|
if(evt instanceof ITxEvent) {
|
||||||
ITx tx=((ITxEvent)evt).getTransaction();
|
ITx tx=((ITxEvent)evt).getTransaction();
|
||||||
if(evt.getKind()==EventKind.BEGIN && tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePoint && tx.getEndTime()>=timePoint){
|
if((evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)&&
|
||||||
|
tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePoint && tx.getEndTime()>=timePoint){
|
||||||
return ((ITxEvent)evt).getTransaction();
|
return ((ITxEvent)evt).getTransaction();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -178,7 +179,8 @@ public class StreamPainter extends TrackPainter{
|
||||||
for(IEvent evt:firstTx.getValue()){
|
for(IEvent evt:firstTx.getValue()){
|
||||||
if(evt instanceof ITxEvent) {
|
if(evt instanceof ITxEvent) {
|
||||||
ITx tx=((ITxEvent)evt).getTransaction();
|
ITx tx=((ITxEvent)evt).getTransaction();
|
||||||
if(evt.getKind()==EventKind.BEGIN && tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePointHigh && tx.getEndTime()>=timePoint){
|
if((evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE) &&
|
||||||
|
tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePointHigh && tx.getEndTime()>=timePoint){
|
||||||
return ((ITxEvent)evt).getTransaction();
|
return ((ITxEvent)evt).getTransaction();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -575,7 +575,7 @@ public class WaveformView implements IWaveformView {
|
||||||
for(IEvent evt:firstTx.getValue()){
|
for(IEvent evt:firstTx.getValue()){
|
||||||
if(evt instanceof ITxEvent) {
|
if(evt instanceof ITxEvent) {
|
||||||
ITx tx=((ITxEvent)evt).getTransaction();
|
ITx tx=((ITxEvent)evt).getTransaction();
|
||||||
if(evt.getKind()==EventKind.BEGIN && tx.getBeginTime()<=time && tx.getEndTime()>=time){
|
if((evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE) && tx.getBeginTime()<=time && tx.getEndTime()>=time){
|
||||||
if(resultsList[tx.getConcurrencyIndex()]==null)
|
if(resultsList[tx.getConcurrencyIndex()]==null)
|
||||||
resultsList[tx.getConcurrencyIndex()]= ((ITxEvent)evt).getTransaction();
|
resultsList[tx.getConcurrencyIndex()]= ((ITxEvent)evt).getTransaction();
|
||||||
}
|
}
|
||||||
|
@ -703,7 +703,7 @@ public class WaveformView implements IWaveformView {
|
||||||
} else {
|
} else {
|
||||||
if(!add) currentWaveformSelection.clear();
|
if(!add) currentWaveformSelection.clear();
|
||||||
for(Object sel:((IStructuredSelection) selection).toArray()){
|
for(Object sel:((IStructuredSelection) selection).toArray()){
|
||||||
if (sel instanceof ITx && currentTxSelection != sel){
|
if (sel instanceof ITx){
|
||||||
ITx txSel = (ITx) sel;
|
ITx txSel = (ITx) sel;
|
||||||
TrackEntry trackEntry = getEntryForStream(txSel.getStream());
|
TrackEntry trackEntry = getEntryForStream(txSel.getStream());
|
||||||
if(trackEntry==null && addIfNeeded){
|
if(trackEntry==null && addIfNeeded){
|
||||||
|
@ -711,6 +711,8 @@ public class WaveformView implements IWaveformView {
|
||||||
streams.add(trackEntry);
|
streams.add(trackEntry);
|
||||||
}
|
}
|
||||||
currentTxSelection = txSel;
|
currentTxSelection = txSel;
|
||||||
|
currentWaveformSelection.clear();
|
||||||
|
currentWaveformSelection.add(trackEntry);
|
||||||
selectionChanged = true;
|
selectionChanged = true;
|
||||||
} else if (sel instanceof TrackEntry && !currentWaveformSelection.contains(sel)) {
|
} else if (sel instanceof TrackEntry && !currentWaveformSelection.contains(sel)) {
|
||||||
currentWaveformSelection.add((TrackEntry)sel);
|
currentWaveformSelection.add((TrackEntry)sel);
|
||||||
|
@ -769,32 +771,29 @@ public class WaveformView implements IWaveformView {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void moveSelection(GotoDirection direction, RelationType relationType) {
|
public void moveSelection(GotoDirection direction, RelationType relationType) {
|
||||||
TrackEntry selectedWaveform=null;
|
if(currentWaveformSelection.size() !=1 && currentTxSelection==null) return;
|
||||||
if(currentTxSelection!=null)
|
TrackEntry selectedWaveform=currentWaveformSelection.size() == 1?
|
||||||
selectedWaveform = getEntryForStream(currentTxSelection.getStream());
|
currentWaveformSelection.get(0) : getEntryForStream(currentTxSelection.getStream());
|
||||||
else if(currentWaveformSelection.size()!=1) return;
|
if(selectedWaveform.waveform.getType()==WaveformType.TRANSACTION && currentTxSelection!=null) {
|
||||||
if(selectedWaveform==null)
|
|
||||||
selectedWaveform = currentWaveformSelection.get(1);
|
|
||||||
if (selectedWaveform!=null && selectedWaveform.waveform.getType()==WaveformType.TRANSACTION && currentTxSelection!=null) {
|
|
||||||
if(relationType.equals(IWaveformView.NEXT_PREV_IN_STREAM)){
|
if(relationType.equals(IWaveformView.NEXT_PREV_IN_STREAM)){
|
||||||
ITx transaction = null;
|
ITx transaction = null;
|
||||||
if (direction == GotoDirection.NEXT) {
|
if (direction == GotoDirection.NEXT) {
|
||||||
ITxEvent[] thisEntryList = (ITxEvent[]) selectedWaveform.waveform.getEvents().get(currentTxSelection.getBeginTime());
|
IEvent[] eventsList = selectedWaveform.waveform.getEvents().get(currentTxSelection.getBeginTime());
|
||||||
boolean meFound=false;
|
boolean meFound=false;
|
||||||
for (ITxEvent evt : thisEntryList) {
|
for (IEvent evt : eventsList) {
|
||||||
if (evt.getKind() == EventKind.BEGIN) {
|
if (evt instanceof ITxEvent && evt.getKind() == EventKind.BEGIN || evt.getKind()==EventKind.SINGLE) {
|
||||||
if(meFound){
|
if(meFound){
|
||||||
transaction = evt.getTransaction();
|
transaction = ((ITxEvent)evt).getTransaction();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
meFound|= evt.getTransaction().equals(currentTxSelection);
|
meFound|= ((ITxEvent)evt).getTransaction().equals(currentTxSelection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (transaction == null){
|
if (transaction == null){
|
||||||
Entry<Long, IEvent[]> entry = selectedWaveform.waveform.getEvents().higherEntry(currentTxSelection.getBeginTime());
|
Entry<Long, IEvent[]> entry = selectedWaveform.waveform.getEvents().higherEntry(currentTxSelection.getBeginTime());
|
||||||
if (entry != null) do {
|
if (entry != null) do {
|
||||||
for (IEvent evt : entry.getValue()) {
|
for (IEvent evt : entry.getValue()) {
|
||||||
if (evt instanceof ITxEvent && evt.getKind() == EventKind.BEGIN) {
|
if (evt instanceof ITxEvent && (evt.getKind() == EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)) {
|
||||||
transaction = ((ITxEvent)evt).getTransaction();
|
transaction = ((ITxEvent)evt).getTransaction();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -804,10 +803,10 @@ public class WaveformView implements IWaveformView {
|
||||||
} while (entry != null && transaction == null);
|
} while (entry != null && transaction == null);
|
||||||
}
|
}
|
||||||
} else if (direction == GotoDirection.PREV) {
|
} else if (direction == GotoDirection.PREV) {
|
||||||
IEvent[] thisEntryList = selectedWaveform.waveform.getEvents().get(currentTxSelection.getBeginTime());
|
IEvent[] eventsList = selectedWaveform.waveform.getEvents().get(currentTxSelection.getBeginTime());
|
||||||
boolean meFound=false;
|
boolean meFound=false;
|
||||||
for (IEvent evt : Lists.reverse(Arrays.asList(thisEntryList))) {
|
for (IEvent evt : Lists.reverse(Arrays.asList(eventsList))) {
|
||||||
if (evt instanceof ITxEvent && evt.getKind() == EventKind.BEGIN) {
|
if (evt instanceof ITxEvent && (evt.getKind() == EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)) {
|
||||||
if(meFound){
|
if(meFound){
|
||||||
transaction = ((ITxEvent)evt).getTransaction();
|
transaction = ((ITxEvent)evt).getTransaction();
|
||||||
break;
|
break;
|
||||||
|
@ -817,31 +816,33 @@ public class WaveformView implements IWaveformView {
|
||||||
}
|
}
|
||||||
if (transaction == null){
|
if (transaction == null){
|
||||||
Entry<Long, IEvent[]> entry = selectedWaveform.waveform.getEvents().lowerEntry(currentTxSelection.getBeginTime());
|
Entry<Long, IEvent[]> entry = selectedWaveform.waveform.getEvents().lowerEntry(currentTxSelection.getBeginTime());
|
||||||
if (entry != null)
|
if (entry != null) do {
|
||||||
do {
|
for (IEvent evt : Lists.reverse(Arrays.asList(entry.getValue()))) {
|
||||||
for (IEvent evt : Lists.reverse(Arrays.asList(thisEntryList))) {
|
if (evt instanceof ITxEvent && (evt.getKind() == EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)) {
|
||||||
if (evt instanceof ITxEvent && evt.getKind() == EventKind.BEGIN) {
|
transaction = ((ITxEvent)evt).getTransaction();
|
||||||
transaction = ((ITxEvent)evt).getTransaction();
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (transaction == null)
|
}
|
||||||
entry = selectedWaveform.waveform.getEvents().lowerEntry(entry.getKey());
|
if (transaction == null)
|
||||||
} while (entry != null && transaction == null);
|
entry = selectedWaveform.waveform.getEvents().lowerEntry(entry.getKey());
|
||||||
|
} while (entry != null && transaction == null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (transaction != null) {
|
if (transaction != null) {
|
||||||
setSelection(new StructuredSelection(transaction));
|
setSelection(new StructuredSelection(transaction));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
ITxRelation tx = null;
|
||||||
if (direction == GotoDirection.NEXT) {
|
if (direction == GotoDirection.NEXT) {
|
||||||
Collection<ITxRelation> outRel=currentTxSelection.getOutgoingRelations();
|
Collection<ITxRelation> outRel=currentTxSelection.getOutgoingRelations();
|
||||||
ITxRelation tx = selectTxToNavigateTo(outRel, relationType, true);
|
tx = selectTxToNavigateTo(outRel, relationType, true);
|
||||||
if(tx!=null) setSelection(new StructuredSelection(tx.getTarget()), true);
|
if(tx!=null)
|
||||||
|
setSelection(new StructuredSelection(tx.getTarget()), true);
|
||||||
} else if (direction == GotoDirection.PREV) {
|
} else if (direction == GotoDirection.PREV) {
|
||||||
Collection<ITxRelation> inRel=currentTxSelection.getIncomingRelations();
|
Collection<ITxRelation> inRel=currentTxSelection.getIncomingRelations();
|
||||||
ITxRelation tx = selectTxToNavigateTo(inRel, relationType, false);
|
tx = selectTxToNavigateTo(inRel, relationType, false);
|
||||||
if(tx!=null) setSelection(new StructuredSelection(tx.getSource()), true);
|
if(tx!=null)
|
||||||
|
setSelection(new StructuredSelection(tx.getSource()), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,6 @@ import java.util.TreeMap;
|
||||||
import com.minres.scviewer.database.HierNode;
|
import com.minres.scviewer.database.HierNode;
|
||||||
import com.minres.scviewer.database.IEvent;
|
import com.minres.scviewer.database.IEvent;
|
||||||
import com.minres.scviewer.database.IWaveform;
|
import com.minres.scviewer.database.IWaveform;
|
||||||
import com.minres.scviewer.database.IWaveformDb;
|
|
||||||
import com.minres.scviewer.database.WaveformType;
|
import com.minres.scviewer.database.WaveformType;
|
||||||
|
|
||||||
public class VCDSignal<T extends IEvent> extends HierNode implements IWaveform {
|
public class VCDSignal<T extends IEvent> extends HierNode implements IWaveform {
|
||||||
|
|
|
@ -250,7 +250,7 @@ public class TransactionList extends Composite {
|
||||||
if(trackEntry==null || trackEntry.waveform.getType()!=WaveformType.TRANSACTION) {
|
if(trackEntry==null || trackEntry.waveform.getType()!=WaveformType.TRANSACTION) {
|
||||||
attrNames.clear();
|
attrNames.clear();
|
||||||
tableViewer.setInput(emptyList);
|
tableViewer.setInput(emptyList);
|
||||||
} else {
|
} else if(stream != trackEntry.waveform) {
|
||||||
stream=trackEntry.waveform;
|
stream=trackEntry.waveform;
|
||||||
tableViewer.setInput(emptyList);
|
tableViewer.setInput(emptyList);
|
||||||
new Thread() {
|
new Thread() {
|
||||||
|
@ -267,7 +267,7 @@ public class TransactionList extends Composite {
|
||||||
Collection<IEvent[]> values = stream.getEvents().values();
|
Collection<IEvent[]> values = stream.getEvents().values();
|
||||||
eventList = values.parallelStream().map(Arrays::asList)
|
eventList = values.parallelStream().map(Arrays::asList)
|
||||||
.flatMap(List::stream)
|
.flatMap(List::stream)
|
||||||
.filter(evt -> evt.getKind()==EventKind.BEGIN)
|
.filter(evt -> evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)
|
||||||
.map(evt-> {
|
.map(evt-> {
|
||||||
ITx tx = ((ITxEvent)evt).getTransaction();
|
ITx tx = ((ITxEvent)evt).getTransaction();
|
||||||
for(ITxAttribute attr: tx.getAttributes()) {
|
for(ITxAttribute attr: tx.getAttributes()) {
|
||||||
|
@ -287,7 +287,8 @@ public class TransactionList extends Composite {
|
||||||
txFilter.setSearchProp(attrNames.get(0).getName(), attrNames.get(0).getType());
|
txFilter.setSearchProp(attrNames.get(0).getName(), attrNames.get(0).getType());
|
||||||
if (searchPropComboViewer!=null) {
|
if (searchPropComboViewer!=null) {
|
||||||
searchPropComboViewer.setInput(attrNames);
|
searchPropComboViewer.setInput(attrNames);
|
||||||
searchPropComboViewer.setSelection(new StructuredSelection(searchPropComboViewer.getElementAt(0)));
|
Object sel = searchPropComboViewer.getElementAt(0);
|
||||||
|
if(sel!=null) searchPropComboViewer.setSelection(new StructuredSelection(sel));
|
||||||
}
|
}
|
||||||
tableViewer.refresh(true);
|
tableViewer.refresh(true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,3 +2,11 @@
|
||||||
/.my_db.txlog*
|
/.my_db.txlog*
|
||||||
/EyeQ6_mem_platform.txlog
|
/EyeQ6_mem_platform.txlog
|
||||||
/EyeQ6_mem_platform.vcd
|
/EyeQ6_mem_platform.vcd
|
||||||
|
/hw_cfg7.txlog
|
||||||
|
/hw_cfg7.vcd
|
||||||
|
/hw_cfg_2_gen.txlog
|
||||||
|
/hw_cfg_2_gen.vcd
|
||||||
|
/hw_cfg_2_nc.txlog
|
||||||
|
/hw_cfg_2_nc.vcd
|
||||||
|
/test_05.txlog
|
||||||
|
/test_05.vcd
|
||||||
|
|
Loading…
Reference in New Issue