fix track and relation handling

This commit is contained in:
Eyck Jentzsch 2021-01-04 17:39:11 +01:00
parent 351a246238
commit 0d074ea6ae
10 changed files with 85 additions and 69 deletions

View File

@ -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"

View File

@ -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

View File

@ -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()) {

View File

@ -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());
} }

View File

@ -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;

View File

@ -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();
} }
} }

View File

@ -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);
} }
} }
} }

View File

@ -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 {

View File

@ -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);
} }

View File

@ -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