SCViewer/com.minres.scviewer.databas.../src/com/minres/scviewer/database/vcd/VCDDbLoader.java

229 lines
7.9 KiB
Java
Raw Normal View History

/*******************************************************************************
2015-10-22 00:25:12 +02:00
* Copyright (c) 2015 MINRES Technologies GmbH and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* MINRES Technologies GmbH - initial API and implementation
*******************************************************************************/
2015-01-06 17:14:16 +01:00
package com.minres.scviewer.database.vcd;
import java.io.File;
import java.io.FileInputStream;
import java.util.Collection;
import java.util.Collections;
2015-01-06 17:14:16 +01:00
import java.util.List;
import java.util.NavigableMap;
2015-01-06 17:14:16 +01:00
import java.util.Stack;
2015-01-20 18:50:15 +01:00
import java.util.TreeMap;
2015-01-06 17:14:16 +01:00
import java.util.Vector;
2015-01-09 09:16:40 +01:00
import com.minres.scviewer.database.BitVector;
2015-01-06 17:14:16 +01:00
import com.minres.scviewer.database.ISignal;
import com.minres.scviewer.database.ISignalChange;
import com.minres.scviewer.database.ISignalChangeBitVector;
import com.minres.scviewer.database.ISignalChangeReal;
import com.minres.scviewer.database.ISignalChangeBit;
2015-01-06 17:14:16 +01:00
import com.minres.scviewer.database.IWaveform;
2015-01-20 18:50:15 +01:00
import com.minres.scviewer.database.IWaveformDb;
import com.minres.scviewer.database.IWaveformDbLoader;
2015-01-20 18:50:15 +01:00
import com.minres.scviewer.database.IWaveformEvent;
2015-01-06 17:14:16 +01:00
import com.minres.scviewer.database.InputFormatException;
import com.minres.scviewer.database.RelationType;
2015-01-06 17:14:16 +01:00
/**
* The Class VCDDb.
*/
public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
2015-01-06 17:14:16 +01:00
/** The Constant TIME_RES. */
2015-01-20 18:50:15 +01:00
private static final Long TIME_RES = 1000L; // ps;
2015-01-06 17:14:16 +01:00
/** The db. */
private IWaveformDb db;
2015-01-06 17:14:16 +01:00
/** The module stack. */
private Stack<String> moduleStack;
/** The signals. */
2015-01-20 18:50:15 +01:00
private List<IWaveform<? extends IWaveformEvent>> signals;
2015-01-06 17:14:16 +01:00
/** The max time. */
2015-01-06 17:14:16 +01:00
private long maxTime;
/**
* Instantiates a new VCD db.
*/
public VCDDbLoader() {
2015-01-06 17:14:16 +01:00
}
/** The date bytes. */
private byte[] dateBytes = "$date".getBytes();
2015-01-06 17:14:16 +01:00
/* (non-Javadoc)
* @see com.minres.scviewer.database.ITrDb#load(java.io.File)
*/
2015-01-20 18:50:15 +01:00
@SuppressWarnings("unchecked")
2015-01-06 17:14:16 +01:00
@Override
public boolean load(IWaveformDb db, File file) throws Exception {
this.db=db;
this.maxTime=0;
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[dateBytes.length];
int read = fis.read(buffer, 0, dateBytes.length);
fis.close();
if (read == dateBytes.length)
for (int i = 0; i < dateBytes.length; i++)
if (buffer[i] != dateBytes[i])
return false;
2015-01-20 18:50:15 +01:00
signals = new Vector<IWaveform<? extends IWaveformEvent>>();
2015-01-06 17:14:16 +01:00
moduleStack= new Stack<String>();
boolean res = new VCDFileParser(false).load(new FileInputStream(file), this);
2015-01-06 17:14:16 +01:00
moduleStack=null;
if(!res) throw new InputFormatException();
2015-01-20 18:50:15 +01:00
// calculate max time of database
for(IWaveform<? extends IWaveformEvent> waveform:signals) {
NavigableMap<Long, ? extends ISignalChange> events =((ISignal<? extends ISignalChange>)waveform).getEvents();
if(events.size()>0)
maxTime= Math.max(maxTime, events.lastKey());
}
2015-01-20 18:50:15 +01:00
// extend signals to hav a last value set at max time
for(IWaveform<? extends IWaveformEvent> waveform:signals){
TreeMap<Long,? extends ISignalChange> events = ((VCDSignal<? extends ISignalChange>)waveform).values;
if(events.size()>0 && events.lastKey()<maxTime){
2015-01-20 18:50:15 +01:00
ISignalChange x = events.lastEntry().getValue();
if(x instanceof ISignalChangeBit)
((VCDSignal<ISignalChangeBit>)waveform).values.put(maxTime,
new VCDSignalChangeBit(maxTime, ((ISignalChangeBit)x).getValue()));
else if(x instanceof ISignalChangeBitVector)
((VCDSignal<ISignalChangeBitVector>)waveform).values.put(maxTime,
new VCDSignalChangeBitVector(maxTime, ((ISignalChangeBitVector)x).getValue()));
else if(x instanceof ISignalChangeReal)
((VCDSignal<ISignalChangeReal>)waveform).values.put(maxTime,
new VCDSignalChangeReal(maxTime, ((ISignalChangeReal)x).getValue()));
2015-01-06 17:14:16 +01:00
}
}
return true;
2015-01-06 17:14:16 +01:00
}
/* (non-Javadoc)
* @see com.minres.scviewer.database.ITrDb#getMaxTime()
*/
@Override
2015-01-20 18:50:15 +01:00
public Long getMaxTime() {
return maxTime;
2015-01-06 17:14:16 +01:00
}
/* (non-Javadoc)
* @see com.minres.scviewer.database.ITrDb#getAllWaves()
*/
@Override
2015-01-20 18:50:15 +01:00
public List<IWaveform<? extends IWaveformEvent>> getAllWaves() {
2015-01-06 17:14:16 +01:00
return signals;
}
/* (non-Javadoc)
* @see com.minres.scviewer.database.vcd.ITraceBuilder#enterModule(java.lang.String)
*/
@Override
public void enterModule(String tokenString) {
2018-07-16 13:17:58 +02:00
if(moduleStack.isEmpty()) {
if("SystemC".compareTo(tokenString)!=0) moduleStack.push(tokenString);
} else
2015-01-06 17:14:16 +01:00
moduleStack.push(moduleStack.peek()+"."+tokenString);
}
/* (non-Javadoc)
* @see com.minres.scviewer.database.vcd.ITraceBuilder#exitModule()
*/
@Override
public void exitModule() {
if(!moduleStack.isEmpty()) moduleStack.pop();
}
/* (non-Javadoc)
* @see com.minres.scviewer.database.vcd.ITraceBuilder#newNet(java.lang.String, int, int)
*/
2015-01-20 18:50:15 +01:00
@SuppressWarnings("unchecked")
2015-01-06 17:14:16 +01:00
@Override
2018-07-16 13:17:58 +02:00
public Integer newNet(String name, int i, int width) {
String netName = moduleStack.empty()? name: moduleStack.lastElement()+"."+name;
2015-01-06 17:14:16 +01:00
int id = signals.size();
2015-01-20 18:50:15 +01:00
VCDSignal<? extends IWaveformEvent> signal;
if(width<0) {
signal = i<0 ? new VCDSignal<ISignalChangeReal>(db, id, netName, width) :
new VCDSignal<ISignalChangeReal>((VCDSignal<ISignalChangeReal>)signals.get(i), id, netName);
} else if(width==1){
signal = i<0 ? new VCDSignal<ISignalChangeBit>(db, id, netName) :
new VCDSignal<ISignalChangeBit>((VCDSignal<ISignalChangeBit>)signals.get(i), id, netName);
2015-01-06 17:14:16 +01:00
} else {
signal = i<0 ? new VCDSignal<ISignalChangeBitVector>(db, id, netName, width) :
new VCDSignal<ISignalChangeBitVector>((VCDSignal<VCDSignalChangeBitVector>)signals.get(i), id, netName);
2015-01-06 17:14:16 +01:00
};
signals.add(signal);
return id;
}
/* (non-Javadoc)
* @see com.minres.scviewer.database.vcd.ITraceBuilder#getNetWidth(int)
*/
@Override
public int getNetWidth(int intValue) {
2015-01-20 18:50:15 +01:00
VCDSignal<? extends IWaveformEvent> signal = (VCDSignal<? extends IWaveformEvent>) signals.get(intValue);
2015-01-06 17:14:16 +01:00
return signal.getWidth();
}
/* (non-Javadoc)
* @see com.minres.scviewer.database.vcd.ITraceBuilder#appendTransition(int, long, com.minres.scviewer.database.vcd.BitVector)
*/
@SuppressWarnings("unchecked")
@Override
public void appendTransition(int signalId, long currentTime, char decodedValues) {
2015-01-20 18:50:15 +01:00
VCDSignal<? extends IWaveformEvent> signal = (VCDSignal<? extends IWaveformEvent>) signals.get(signalId);
2018-08-27 16:19:59 +02:00
Long time = currentTime*TIME_RES;
2015-01-06 17:14:16 +01:00
if(signal.getWidth()==1){
((VCDSignal<ISignalChangeBit>)signal).values.put(time, new VCDSignalChangeBit(time, decodedValues));
}
}
/* (non-Javadoc)
* @see com.minres.scviewer.database.vcd.ITraceBuilder#appendTransition(int, long, com.minres.scviewer.database.vcd.BitVector)
*/
@SuppressWarnings("unchecked")
@Override
public void appendTransition(int signalId, long currentTime, BitVector decodedValues) {
VCDSignal<? extends IWaveformEvent> signal = (VCDSignal<? extends IWaveformEvent>) signals.get(signalId);
Long time = currentTime* TIME_RES;
if(signal.getWidth()>1){
((VCDSignal<VCDSignalChangeBitVector>)signal).values.put(time, new VCDSignalChangeBitVector(time, decodedValues));
}
}
/* (non-Javadoc)
* @see com.minres.scviewer.database.vcd.ITraceBuilder#appendTransition(int, long, com.minres.scviewer.database.vcd.BitVector)
*/
@SuppressWarnings("unchecked")
@Override
public void appendTransition(int signalId, long currentTime, double decodedValue) {
VCDSignal<? extends IWaveformEvent> signal = (VCDSignal<? extends IWaveformEvent>) signals.get(signalId);
Long time = currentTime* TIME_RES;
if(signal.getWidth()<0){
((VCDSignal<ISignalChangeReal>)signal).values.put(time, new VCDSignalChangeReal(time, decodedValue));
2015-01-06 17:14:16 +01:00
}
}
/* (non-Javadoc)
* @see com.minres.scviewer.database.IWaveformDbLoader#getAllRelationTypes()
*/
@Override
public Collection<RelationType> getAllRelationTypes(){
return Collections.emptyList();
}
2015-01-06 17:14:16 +01:00
}