fix track and relation handling
This commit is contained in:
		@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user