diff --git a/features/com.minres.scviewer.database.feature/feature.xml b/features/com.minres.scviewer.database.feature/feature.xml
index cf69f50..eed494e 100644
--- a/features/com.minres.scviewer.database.feature/feature.xml
+++ b/features/com.minres.scviewer.database.feature/feature.xml
@@ -58,12 +58,6 @@ http://www.eclipse.org/legal/epl-v10.html
version="0.0.0"
unpack="false"/>
-
-
transactions;
- BTreeMap relations;
+ BTreeMap relationsIn;
+
+ BTreeMap relationsOut;
BTreeMap attributeTypes;
@@ -97,22 +98,27 @@ public class TextDbLoader implements IWaveformDbLoader{
mapDbFile.delete(); // we just need a file name
mapDbFile.deleteOnExit();
mapDb = DBMaker
- .fileDB(mapDbFile)
- .fileMmapEnableIfSupported()
- .fileMmapPreclearDisable()
+ .memoryDirectDB()
+// .fileDB(mapDbFile)
+// .fileMmapEnable() // Always enable mmap
+// .fileMmapEnableIfSupported()
+// .fileMmapPreclearDisable()
+ .allocateStartSize(512*1024*1024)
+ .allocateIncrement(128*1024*1024)
.cleanerHackEnable()
- .allocateStartSize(64*1024*1024)
- .allocateIncrement(64*1024*1024)
.make();
TreeMapSink txSink = mapDb.treeMap("transactions", Serializer.LONG,Serializer.JAVA).createFromSink();
- relations = mapDb
- .treeMap("relations", new SerializerArrayTuple(Serializer.LONG, Serializer.LONG) ,Serializer.JAVA)
+ relationsIn = mapDb
+ .treeMap("relationsIn", new SerializerArrayTuple(Serializer.LONG, Serializer.LONG) ,Serializer.JAVA)
+ .createOrOpen();
+ relationsOut = mapDb
+ .treeMap("relationsOut", new SerializerArrayTuple(Serializer.LONG, Serializer.LONG) ,Serializer.JAVA)
.createOrOpen();
attributeTypes = mapDb
.treeMap("attributeTypes", new SerializerArrayTuple(Serializer.STRING, Serializer.STRING) ,Serializer.JAVA)
.createOrOpen();
try {
- parser.setTransactionSink(txSink).setRelationMap(relations);
+ parser.setTransactionSink(txSink).setRelationMaps(relationsIn, relationsOut);
parser.parseInput(gzipped?new GZIPInputStream(new FileInputStream(file)):new FileInputStream(file));
} catch(IllegalArgumentException|ArrayIndexOutOfBoundsException e) {
} catch(Exception e) {
@@ -176,7 +182,9 @@ public class TextDbLoader implements IWaveformDbLoader{
private TreeMapSink txSink;
- private BTreeMap relations;
+ private BTreeMap relationsIn;
+
+ private BTreeMap relationsOut;
public TextDbParser(TextDbLoader loader) {
super();
@@ -188,8 +196,9 @@ public class TextDbLoader implements IWaveformDbLoader{
return this;
}
- public TextDbParser setRelationMap(BTreeMap relations) {
- this.relations=relations;
+ public TextDbParser setRelationMaps(BTreeMap relationsIn, BTreeMap relationsOut) {
+ this.relationsIn=relationsIn;
+ this.relationsOut=relationsOut;
return this;
}
@@ -218,11 +227,11 @@ public class TextDbLoader implements IWaveformDbLoader{
private String parseLine(String curLine, String nextLine) throws IOException{
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]);
String name = tokens[2].substring(1, tokens[2].length());
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);
transactionsById.get(id).attributes.add(new TxAttribute(attrType, remaining));
} else if("tx_begin".equals(tokens[0])){
@@ -245,7 +254,7 @@ public class TextDbLoader implements IWaveformDbLoader{
}
}
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]);
ScvTx tx = transactionsById.get(id);
assert Long.parseLong(tokens[2])==tx.generatorId;
@@ -271,14 +280,15 @@ public class TextDbLoader implements IWaveformDbLoader{
}
}
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 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))
- loader.relationTypes.put(relType, RelationType.create(relType));
+ loader.relationTypes.put(relType, RelationTypeFactory.create(relType));
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])){
Matcher matcher = scv_tr_stream.matcher(curLine);
if (matcher.matches()) {
diff --git a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.java b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.java
index 1ff96c2..3150bb5 100644
--- a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.java
+++ b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.java
@@ -36,13 +36,13 @@ class Tx implements ITx {
@Override
public Collection getIncomingRelations() {
- NavigableMap rels = loader.relations.prefixSubMap(new Long[]{scvTx.getId(), null});
+ NavigableMap rels = loader.relationsIn.prefixSubMap(new Long[]{scvTx.getId()});
return rels.values().stream().map(rel -> new TxRelation(loader, rel)).collect(Collectors.toList());
}
@Override
public Collection getOutgoingRelations() {
- NavigableMap rels = loader.relations.prefixSubMap(new Long[]{null, scvTx.getId()});
+ NavigableMap rels = loader.relationsOut.prefixSubMap(new Long[]{scvTx.getId()});
return rels.values().stream().map(rel -> new TxRelation(loader, rel)).collect(Collectors.toList());
}
diff --git a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttribute.java b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttribute.java
index 0048bf9..79a0bd7 100644
--- a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttribute.java
+++ b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttribute.java
@@ -36,7 +36,7 @@ public class TxAttribute implements ITxAttribute, Serializable {
switch(type.getDataType()){
case STRING:
case ENUMERATION:
- this.value=value.substring(1, value.length()-2);
+ this.value=value.substring(1, value.length()-1);
break;
default:
this.value=value;
diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java
index 66fd272..6ca51b5 100644
--- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java
+++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java
@@ -167,7 +167,8 @@ public class StreamPainter extends TrackPainter{
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){
+ if((evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)&&
+ tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePoint && tx.getEndTime()>=timePoint){
return ((ITxEvent)evt).getTransaction();
}
}
@@ -178,7 +179,8 @@ public class StreamPainter extends TrackPainter{
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){
+ if((evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE) &&
+ tx.getConcurrencyIndex()==lane && tx.getBeginTime()<=timePointHigh && tx.getEndTime()>=timePoint){
return ((ITxEvent)evt).getTransaction();
}
}
diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java
index 2a83aab..145ac77 100644
--- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java
+++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java
@@ -575,7 +575,7 @@ public class WaveformView implements IWaveformView {
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((evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE) && tx.getBeginTime()<=time && tx.getEndTime()>=time){
if(resultsList[tx.getConcurrencyIndex()]==null)
resultsList[tx.getConcurrencyIndex()]= ((ITxEvent)evt).getTransaction();
}
@@ -703,7 +703,7 @@ public class WaveformView implements IWaveformView {
} else {
if(!add) currentWaveformSelection.clear();
for(Object sel:((IStructuredSelection) selection).toArray()){
- if (sel instanceof ITx && currentTxSelection != sel){
+ if (sel instanceof ITx){
ITx txSel = (ITx) sel;
TrackEntry trackEntry = getEntryForStream(txSel.getStream());
if(trackEntry==null && addIfNeeded){
@@ -711,6 +711,8 @@ public class WaveformView implements IWaveformView {
streams.add(trackEntry);
}
currentTxSelection = txSel;
+ currentWaveformSelection.clear();
+ currentWaveformSelection.add(trackEntry);
selectionChanged = true;
} else if (sel instanceof TrackEntry && !currentWaveformSelection.contains(sel)) {
currentWaveformSelection.add((TrackEntry)sel);
@@ -769,32 +771,29 @@ public class WaveformView implements IWaveformView {
*/
@Override
public void moveSelection(GotoDirection direction, RelationType relationType) {
- TrackEntry selectedWaveform=null;
- if(currentTxSelection!=null)
- selectedWaveform = getEntryForStream(currentTxSelection.getStream());
- else if(currentWaveformSelection.size()!=1) return;
- if(selectedWaveform==null)
- selectedWaveform = currentWaveformSelection.get(1);
- if (selectedWaveform!=null && selectedWaveform.waveform.getType()==WaveformType.TRANSACTION && currentTxSelection!=null) {
+ if(currentWaveformSelection.size() !=1 && currentTxSelection==null) return;
+ TrackEntry selectedWaveform=currentWaveformSelection.size() == 1?
+ currentWaveformSelection.get(0) : getEntryForStream(currentTxSelection.getStream());
+ if(selectedWaveform.waveform.getType()==WaveformType.TRANSACTION && currentTxSelection!=null) {
if(relationType.equals(IWaveformView.NEXT_PREV_IN_STREAM)){
ITx transaction = null;
if (direction == GotoDirection.NEXT) {
- ITxEvent[] thisEntryList = (ITxEvent[]) selectedWaveform.waveform.getEvents().get(currentTxSelection.getBeginTime());
+ IEvent[] eventsList = selectedWaveform.waveform.getEvents().get(currentTxSelection.getBeginTime());
boolean meFound=false;
- for (ITxEvent evt : thisEntryList) {
- if (evt.getKind() == EventKind.BEGIN) {
+ for (IEvent evt : eventsList) {
+ if (evt instanceof ITxEvent && evt.getKind() == EventKind.BEGIN || evt.getKind()==EventKind.SINGLE) {
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 entry = selectedWaveform.waveform.getEvents().higherEntry(currentTxSelection.getBeginTime());
if (entry != null) do {
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();
break;
}
@@ -804,10 +803,10 @@ public class WaveformView implements IWaveformView {
} while (entry != null && transaction == null);
}
} else if (direction == GotoDirection.PREV) {
- IEvent[] thisEntryList = selectedWaveform.waveform.getEvents().get(currentTxSelection.getBeginTime());
+ IEvent[] eventsList = selectedWaveform.waveform.getEvents().get(currentTxSelection.getBeginTime());
boolean meFound=false;
- for (IEvent evt : Lists.reverse(Arrays.asList(thisEntryList))) {
- if (evt instanceof ITxEvent && evt.getKind() == EventKind.BEGIN) {
+ for (IEvent evt : Lists.reverse(Arrays.asList(eventsList))) {
+ if (evt instanceof ITxEvent && (evt.getKind() == EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)) {
if(meFound){
transaction = ((ITxEvent)evt).getTransaction();
break;
@@ -817,31 +816,33 @@ public class WaveformView implements IWaveformView {
}
if (transaction == null){
Entry entry = selectedWaveform.waveform.getEvents().lowerEntry(currentTxSelection.getBeginTime());
- if (entry != null)
- do {
- for (IEvent evt : Lists.reverse(Arrays.asList(thisEntryList))) {
- if (evt instanceof ITxEvent && evt.getKind() == EventKind.BEGIN) {
- transaction = ((ITxEvent)evt).getTransaction();
- break;
- }
+ if (entry != null) do {
+ for (IEvent evt : Lists.reverse(Arrays.asList(entry.getValue()))) {
+ if (evt instanceof ITxEvent && (evt.getKind() == EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)) {
+ transaction = ((ITxEvent)evt).getTransaction();
+ break;
}
- if (transaction == null)
- entry = selectedWaveform.waveform.getEvents().lowerEntry(entry.getKey());
- } while (entry != null && transaction == null);
+ }
+ if (transaction == null)
+ entry = selectedWaveform.waveform.getEvents().lowerEntry(entry.getKey());
+ } while (entry != null && transaction == null);
}
}
if (transaction != null) {
setSelection(new StructuredSelection(transaction));
}
} else {
+ ITxRelation tx = null;
if (direction == GotoDirection.NEXT) {
Collection outRel=currentTxSelection.getOutgoingRelations();
- ITxRelation tx = selectTxToNavigateTo(outRel, relationType, true);
- if(tx!=null) setSelection(new StructuredSelection(tx.getTarget()), true);
+ tx = selectTxToNavigateTo(outRel, relationType, true);
+ if(tx!=null)
+ setSelection(new StructuredSelection(tx.getTarget()), true);
} else if (direction == GotoDirection.PREV) {
Collection inRel=currentTxSelection.getIncomingRelations();
- ITxRelation tx = selectTxToNavigateTo(inRel, relationType, false);
- if(tx!=null) setSelection(new StructuredSelection(tx.getSource()), true);
+ tx = selectTxToNavigateTo(inRel, relationType, false);
+ if(tx!=null)
+ setSelection(new StructuredSelection(tx.getSource()), true);
}
}
}
diff --git a/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignal.java b/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignal.java
index 2060403..78c8863 100644
--- a/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignal.java
+++ b/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDSignal.java
@@ -17,7 +17,6 @@ import java.util.TreeMap;
import com.minres.scviewer.database.HierNode;
import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.IWaveform;
-import com.minres.scviewer.database.IWaveformDb;
import com.minres.scviewer.database.WaveformType;
public class VCDSignal extends HierNode implements IWaveform {
diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionList.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionList.java
index e69ba0f..452bbe9 100644
--- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionList.java
+++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionList.java
@@ -250,7 +250,7 @@ public class TransactionList extends Composite {
if(trackEntry==null || trackEntry.waveform.getType()!=WaveformType.TRANSACTION) {
attrNames.clear();
tableViewer.setInput(emptyList);
- } else {
+ } else if(stream != trackEntry.waveform) {
stream=trackEntry.waveform;
tableViewer.setInput(emptyList);
new Thread() {
@@ -267,7 +267,7 @@ public class TransactionList extends Composite {
Collection values = stream.getEvents().values();
eventList = values.parallelStream().map(Arrays::asList)
.flatMap(List::stream)
- .filter(evt -> evt.getKind()==EventKind.BEGIN)
+ .filter(evt -> evt.getKind()==EventKind.BEGIN || evt.getKind()==EventKind.SINGLE)
.map(evt-> {
ITx tx = ((ITxEvent)evt).getTransaction();
for(ITxAttribute attr: tx.getAttributes()) {
@@ -287,7 +287,8 @@ public class TransactionList extends Composite {
txFilter.setSearchProp(attrNames.get(0).getName(), attrNames.get(0).getType());
if (searchPropComboViewer!=null) {
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);
}
diff --git a/tests/com.minres.scviewer.database.test/inputs/.gitignore b/tests/com.minres.scviewer.database.test/inputs/.gitignore
index 947900c..b60cf0f 100644
--- a/tests/com.minres.scviewer.database.test/inputs/.gitignore
+++ b/tests/com.minres.scviewer.database.test/inputs/.gitignore
@@ -2,3 +2,11 @@
/.my_db.txlog*
/EyeQ6_mem_platform.txlog
/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