refactor database class hierarchy

This commit is contained in:
2020-11-28 10:22:22 +01:00
parent db838efc65
commit 21d83f93dc
22 changed files with 217 additions and 190 deletions

View File

@ -24,7 +24,8 @@ import java.util.Vector;
import java.util.zip.GZIPInputStream;
import com.minres.scviewer.database.BitVector;
import com.minres.scviewer.database.ISignal;
import com.minres.scviewer.database.DoubleVal;
import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformDb;
import com.minres.scviewer.database.IWaveformDbLoader;
@ -96,7 +97,7 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
if(!res) throw new InputFormatException();
// calculate max time of database
for(IWaveform waveform:signals) {
NavigableMap<Long, ?> events =((ISignal<?>)waveform).getEvents();
NavigableMap<Long, IEvent[]> events =waveform.getEvents();
if(events.size()>0)
maxTime= Math.max(maxTime, events.lastKey());
}
@ -108,8 +109,8 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
Object val = events.lastEntry().getValue();
if(val instanceof BitVector) {
((VCDSignal<BitVector>)s).addSignalChange(maxTime, (BitVector) val);
} else if(val instanceof Double)
((VCDSignal<Double>)s).addSignalChange(maxTime, (Double) val);
} else if(val instanceof DoubleVal)
((VCDSignal<DoubleVal>)s).addSignalChange(maxTime, (DoubleVal) val);
}
}
}
@ -162,8 +163,8 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
int id = signals.size();
assert(width>=0);
if(width==0) {
signals.add( i<0 ? new VCDSignal<Double>(db, id, netName, width) :
new VCDSignal<Double>((VCDSignal<Double>)signals.get(i), id, netName));
signals.add( i<0 ? new VCDSignal<DoubleVal>(db, id, netName, width) :
new VCDSignal<DoubleVal>((VCDSignal<DoubleVal>)signals.get(i), id, netName));
} else if(width>0){
signals.add( i<0 ? new VCDSignal<BitVector>(db, id, netName, width) :
new VCDSignal<BitVector>((VCDSignal<BitVector>)signals.get(i), id, netName));
@ -188,7 +189,7 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
public void appendTransition(int signalId, long currentTime, BitVector value) {
VCDSignal<BitVector> signal = (VCDSignal<BitVector>) signals.get(signalId);
Long time = currentTime* TIME_RES;
signal.getEvents().put(time, value);
signal.addSignalChange(time, value);
}
/* (non-Javadoc)
@ -197,11 +198,9 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder {
@SuppressWarnings("unchecked")
@Override
public void appendTransition(int signalId, long currentTime, double value) {
VCDSignal<?> signal = (VCDSignal<?>) signals.get(signalId);
VCDSignal<DoubleVal> signal = (VCDSignal<DoubleVal>) signals.get(signalId);
Long time = currentTime* TIME_RES;
if(signal.getWidth()==0){
((VCDSignal<Double>)signal).getEvents().put(time, value);
}
signal.addSignalChange(time, new DoubleVal(value));
}
/* (non-Javadoc)

View File

@ -15,12 +15,11 @@ import java.util.NavigableMap;
import java.util.TreeMap;
import com.minres.scviewer.database.HierNode;
import com.minres.scviewer.database.ISignal;
import com.minres.scviewer.database.IEvent;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.IWaveformDb;
import com.minres.scviewer.database.IWaveformEvent;
public class VCDSignal<T> extends HierNode implements ISignal<T> {
public class VCDSignal<T extends IEvent> extends HierNode implements IWaveform {
private long id;
@ -34,7 +33,7 @@ public class VCDSignal<T> extends HierNode implements ISignal<T> {
private IWaveformDb db;
private TreeMap<Long, T> values;
private NavigableMap<Long, IEvent[]> values;
public VCDSignal(IWaveformDb db, String name) {
this(db, 0, name, 1);
@ -50,17 +49,17 @@ public class VCDSignal<T> extends HierNode implements ISignal<T> {
fullName=name;
this.id=id;
this.width=width;
this.values=new TreeMap<Long, T>();
this.values=new TreeMap<Long, IEvent[]>();
}
@SuppressWarnings("unchecked")
public VCDSignal(ISignal<T> other, int id, String name) {
public VCDSignal(VCDSignal<T> other, int id, String name) {
super(name);
fullName=name;
this.id=id;
assert(other instanceof VCDSignal<?>);
this.width=((VCDSignal<? extends IWaveformEvent>)other).width;
this.values=((VCDSignal<T>)other).values;
VCDSignal<T> o = (VCDSignal<T>)other;
this.width=o.width;
this.values=o.values;
this.db=other.getDb();
}
@ -93,22 +92,30 @@ public class VCDSignal<T> extends HierNode implements ISignal<T> {
}
public void addSignalChange(Long time, T value){
values.put(time, value);
if(values.containsKey(time)) {
IEvent[] oldV = values.get(time);
IEvent[] newV = new IEvent[oldV.length+1];
System.arraycopy(oldV, 0, newV, 0, oldV.length);
newV[oldV.length]=value;
values.put(time, newV);
} else {
values.put(time, new IEvent[] {value});
}
}
@Override
public NavigableMap<Long, T> getEvents() {
public NavigableMap<Long, IEvent[]> getEvents() {
return values;
}
@Override
public T getWaveformValueAtTime(Long time) {
public IEvent[] getEventsAtTime(Long time) {
return values.get(time);
}
@Override
public T getWaveformValueBeforeTime(Long time) {
Entry<Long, T> e = values.floorEntry(time);
public IEvent[] getEventsBeforeTime(Long time) {
Entry<Long, IEvent[]> e = values.floorEntry(time);
if(e==null)
return null;
else
@ -125,6 +132,9 @@ public class VCDSignal<T> extends HierNode implements ISignal<T> {
return dummy.getClass();
}
@Override
public int getMaxConcurrency() {
return 1;
}
}