diff --git a/plugins/com.minres.scviewer.database.fst/build.properties b/plugins/com.minres.scviewer.database.fst/build.properties index 1e681be..36acffb 100644 --- a/plugins/com.minres.scviewer.database.fst/build.properties +++ b/plugins/com.minres.scviewer.database.fst/build.properties @@ -4,4 +4,5 @@ bin.includes = META-INF/,\ .,\ lib/jna-5.13.0.jar,\ lib/jna-jpms-5.13.0.jar,\ - linux-x86-64/ + linux-x86-64/,\ + OSGI-INF/ diff --git a/plugins/com.minres.scviewer.database.fst/csrc/fst/CMakeLists.txt b/plugins/com.minres.scviewer.database.fst/csrc/fst/CMakeLists.txt index 9b43064..0f1e669 100644 --- a/plugins/com.minres.scviewer.database.fst/csrc/fst/CMakeLists.txt +++ b/plugins/com.minres.scviewer.database.fst/csrc/fst/CMakeLists.txt @@ -5,7 +5,7 @@ project (fstlib VERSION 1.0.0) set(BUILD_SHARED_LIBS ON) find_package(ZLIB REQUIRED) -add_library(fstapi fstapi.c lz4.c fastlz.c) +add_library(fstapi fstapi.c lz4.c fastlz.c fst_helper.c) target_include_directories(fstapi PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIRS}) target_link_libraries(fstapi PRIVATE ${ZLIB_LIBRARIES}) # hack to avoid creating dummy config.h diff --git a/plugins/com.minres.scviewer.database.fst/csrc/fst/build.sh b/plugins/com.minres.scviewer.database.fst/csrc/fst/build.sh new file mode 100644 index 0000000..4d26b06 --- /dev/null +++ b/plugins/com.minres.scviewer.database.fst/csrc/fst/build.sh @@ -0,0 +1,2 @@ +cmake -B build -S . -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=../../linux-x86-64 +cmake --build build --target install diff --git a/plugins/com.minres.scviewer.database.fst/csrc/fst/fst_helper.c b/plugins/com.minres.scviewer.database.fst/csrc/fst/fst_helper.c new file mode 100644 index 0000000..63d5ca1 --- /dev/null +++ b/plugins/com.minres.scviewer.database.fst/csrc/fst/fst_helper.c @@ -0,0 +1,31 @@ +#include "fstapi.h" + +int getHierType(struct fstHier * hier){ + return hier->htyp; +} + +void getHierScope(struct fstHier* h, struct fstHierScope* scope){ + if(h->htyp==FST_HT_SCOPE) + *scope=h->u.scope; +} + +void getHierVar(struct fstHier* h, struct fstHierVar* var){ + if(h->htyp==FST_HT_VAR) + *var=h->u.var; +} + +void getHierAttr(struct fstHier* h, struct fstHierAttr* attr){ + if(h->htyp==FST_HT_ATTRBEGIN) + *attr=h->u.attr; +} + +typedef void (*value_change_callback)(uint64_t time, fstHandle facidx, const char *value); + +static void forward_cb(void *user_callback_data_pointer, uint64_t time, fstHandle facidx, const unsigned char *value) { + //fprintf(stderr, "val: %s @ %ld\n", value, time); + ((value_change_callback)user_callback_data_pointer)(time, facidx, value); +} + +void iterateValueChanges(void* ctx, value_change_callback vcc) { + fstReaderIterBlocks(ctx, forward_cb, vcc, NULL); +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.fst/linux-x86-64/libfstapi.so b/plugins/com.minres.scviewer.database.fst/linux-x86-64/libfstapi.so index 1ee4ab4..6d37269 100644 Binary files a/plugins/com.minres.scviewer.database.fst/linux-x86-64/libfstapi.so and b/plugins/com.minres.scviewer.database.fst/linux-x86-64/libfstapi.so differ diff --git a/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstDbLoader.java b/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstDbLoader.java index 2712963..0c57660 100644 --- a/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstDbLoader.java +++ b/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstDbLoader.java @@ -13,22 +13,18 @@ package com.minres.scviewer.database.fst; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; import java.util.ArrayDeque; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Vector; -import java.util.zip.GZIPInputStream; import com.google.common.collect.Iterables; import com.minres.scviewer.database.BitVector; import com.minres.scviewer.database.DoubleVal; +import com.minres.scviewer.database.EventList; import com.minres.scviewer.database.IEventList; import com.minres.scviewer.database.IWaveform; -import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDbLoader; import com.minres.scviewer.database.InputFormatException; import com.minres.scviewer.database.RelationType; @@ -39,59 +35,56 @@ import com.minres.scviewer.database.RelationType; public class FstDbLoader implements IWaveformDbLoader, IFstDatabaseBuilder { - /** The Constant TIME_RES. */ - private static final Long TIME_RES = 1000L; // ps - /** The module stack. */ private ArrayDeque moduleStack; /** The signals. */ private List signals; + FstFileParser parser; /** The max time. */ private long maxTime; + private int timeScale; + /** The pcs. */ protected PropertyChangeSupport pcs = new PropertyChangeSupport(this); + static int calculateTimescaleMultipierPower(int power){ + int answer = 1; + if(power<=0){ + return answer; + } else{ + for(int i = 1; i<= power; i++) + answer *= 10; + return answer; + } + } + /* (non-Javadoc) * @see com.minres.scviewer.database.ITrDb#load(java.io.File) */ - @SuppressWarnings("unchecked") @Override - public void load(IWaveformDb db, File file) throws InputFormatException { + public void load(File file) throws InputFormatException { dispose(); this.maxTime=0; boolean res = false; signals = new Vector<>(); moduleStack= new ArrayDeque<>(); - res = new FstFileParser(file).load(this); + parser = new FstFileParser(file); + res = parser.open(this); moduleStack=null; if(!res) throw new InputFormatException("Could not parse VCD file"); // calculate max time of this database - for(IWaveform waveform:signals) { - IEventList events =waveform.getEvents(); - if(!events.isEmpty()) - maxTime= Math.max(maxTime, events.lastKey()); - } - // extend signals to have a last value set at max time - for(IWaveform s:signals){ - if(s instanceof FstSignal) { - IEventList events = ((FstSignal)s).getEvents(); - if(events.size()>0 && events.lastKey())s).addSignalChange(maxTime, (BitVector) val); - } else if(val instanceof DoubleVal) - ((FstSignal)s).addSignalChange(maxTime, (DoubleVal) val); - } - } - } pcs.firePropertyChange(IWaveformDbLoader.LOADING_FINISHED, null, null); } public void dispose() { + if(parser!=null) { + parser.close(); + parser=null; + } moduleStack=null; signals=null; } @@ -101,7 +94,7 @@ public class FstDbLoader implements IWaveformDbLoader, IFstDatabaseBuilder { */ @Override public long getMaxTime() { - return maxTime; + return maxTime*calculateTimescaleMultipierPower(15+timeScale); // timescape is 1e(timeScale), we calculate in fs } /* (non-Javadoc) @@ -136,20 +129,14 @@ public class FstDbLoader implements IWaveformDbLoader, IFstDatabaseBuilder { /* (non-Javadoc) * @see com.minres.scviewer.database.vcd.ITraceBuilder#newNet(java.lang.String, int, int) */ - @SuppressWarnings("unchecked") @Override - public Integer newNet(String name, int i, int width) { + public void newNet(String name, int handle, int width, boolean alias) { String netName = moduleStack.isEmpty()? name: moduleStack.peek()+"."+name; - int id = signals.size(); - if(width==0) { - signals.add( i<0 ? new FstSignal(id, netName, width) : - new FstSignal((FstSignal)signals.get(i), id, netName)); - } else if(width>0){ - signals.add( i<0 ? new FstSignal(id, netName, width) : - new FstSignal((FstSignal)signals.get(i), id, netName)); - } + IWaveform signal = width==0? + new FstSignal(this, handle, netName, width): + new FstSignal(this, handle, netName, width); + signals.add(signal); pcs.firePropertyChange(IWaveformDbLoader.SIGNAL_ADDED, null, Iterables.getLast(signals)); - return id; } /* (non-Javadoc) @@ -161,28 +148,10 @@ public class FstDbLoader implements IWaveformDbLoader, IFstDatabaseBuilder { return signal.getRowCount(); } - /* (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 value) { - FstSignal signal = (FstSignal) signals.get(signalId); - Long time = currentTime* TIME_RES; - signal.addSignalChange(time, value); - } - - /* (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 value) { - FstSignal signal = (FstSignal) signals.get(signalId); - Long time = currentTime* TIME_RES; - signal.addSignalChange(time, new DoubleVal(value)); - } - + public void setMaxTime(long maxTime, int timeScale) { + this.maxTime = maxTime; + this.timeScale=timeScale; + } /* (non-Javadoc) * @see com.minres.scviewer.database.IWaveformDbLoader#getAllRelationTypes() */ @@ -211,5 +180,8 @@ public class FstDbLoader implements IWaveformDbLoader, IFstDatabaseBuilder { pcs.removePropertyChangeListener(l); } - + public void getEvents(int id, int width, IEventList values) { + if(values instanceof EventList) + parser.getValueChanges(id, width, calculateTimescaleMultipierPower(15+timeScale), (EventList) values); + } } diff --git a/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstFileParser.java b/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstFileParser.java index d057e88..68e56c1 100644 --- a/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstFileParser.java +++ b/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstFileParser.java @@ -10,30 +10,84 @@ *******************************************************************************/ package com.minres.scviewer.database.fst; -import java.io.*; -import java.text.ParseException; -import java.util.*; +import java.io.File; -import com.minres.scviewer.database.BitValue; import com.minres.scviewer.database.BitVector; +import com.minres.scviewer.database.EventList; +import com.minres.scviewer.database.fst.FstLibrary.HierAttr; +import com.minres.scviewer.database.fst.FstLibrary.HierScope; +import com.minres.scviewer.database.fst.FstLibrary.HierType; +import com.minres.scviewer.database.fst.FstLibrary.HierVar; +import com.minres.scviewer.database.fst.FstLibrary.ValueChangeCallback; import com.sun.jna.Pointer; class FstFileParser { long currentTime; final File file; + Pointer fst; public FstFileParser(File file) { this.file=file; } - public boolean load(IFstDatabaseBuilder builder) { - Pointer ctx = FstLibrary.fstReaderOpen(file.getAbsolutePath()); - if(!ctx.equals(Pointer.NULL)) { - String version = FstLibrary.fstReaderGetVersionString(ctx); + public boolean open(IFstDatabaseBuilder builder) { + fst = FstLibrary.fstReaderOpen(file.getAbsolutePath()); + if(!fst.equals(Pointer.NULL)) { + String version = FstLibrary.fstReaderGetVersionString(fst); System.out.println(version); - FstLibrary.fstReaderClose(ctx); - } - return false; + long endTime = FstLibrary.fstReaderGetEndTime(fst); + byte timeScale = FstLibrary.fstReaderGetTimescale(fst); + builder.setMaxTime(endTime, timeScale); + FstLibrary.fstReaderIterateHierRewind(fst); + Pointer p = FstLibrary.fstReaderIterateHier(fst); + while(p!=null && !p.equals(Pointer.NULL)) { + int hierType = FstLibrary.getHierType(p); + HierType type = HierType.values()[hierType]; + switch(type) { + case HT_SCOPE: + HierScope scope = new HierScope(); + FstLibrary.getHierScope(p, scope); + builder.enterModule(scope.name); + break; + case HT_UPSCOPE: + builder.exitModule(); + break; + case HT_VAR: + HierVar v = new HierVar(); + FstLibrary.getHierVar(p, v); + builder.newNet(v.name, v.handle, v.length, v.is_alias!=0); + break; + case HT_ATTRBEGIN: + HierAttr attr = new HierAttr(); + FstLibrary.getHierAttr(p, attr); + break; + case HT_ATTREND: + break; + case HT_TREEBEGIN: + break; + case HT_TREEEND: + break; + default: + break; + } + p = FstLibrary.fstReaderIterateHier(fst); + } + return true; + } else + return false; + } + + public void getValueChanges(final int id, final int width, int timeScale, final EventList values) { + FstLibrary.fstReaderSetFacProcessMask(fst, id); + FstLibrary.iterateValueChanges(fst, new ValueChangeCallback() { + @Override + public void callback(long time, int facidx, String value) { + values.put(time*timeScale, BitVector.fromString(width, value)); + } + }); + } + public void close() { + FstLibrary.fstReaderClose(fst); } } diff --git a/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstLibrary.java b/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstLibrary.java index 4b9df63..5b6871b 100644 --- a/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstLibrary.java +++ b/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstLibrary.java @@ -3,9 +3,12 @@ package com.minres.scviewer.database.fst; import com.sun.jna.Native; import com.sun.jna.Platform; import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import com.sun.jna.Structure.FieldOrder; +import com.sun.jna.Callback; public class FstLibrary { - public enum FstScopeType { + public static enum ScopeType { MIN(0), VCD_MODULE(0), VCD_TASK(1), @@ -31,74 +34,178 @@ public class FstLibrary { VHDL_GENERATE(20), VHDL_PACKAGE(21), MAX(21), - FST_ST_GEN_ATTRBEGIN(252), - FST_ST_GEN_ATTREND(253), + ST_GEN_ATTRBEGIN(252), + ST_GEN_ATTREND(253), - FST_ST_VCD_SCOPE(254), - FST_ST_VCD_UPSCOPE(255); + ST_VCD_SCOPE(254), + ST_VCD_UPSCOPE(255); public final int label; - private FstScopeType(int label) { + private ScopeType(int label) { this.label = label; } }; + public static enum HierType { + HT_SCOPE(0), + HT_UPSCOPE(1), + HT_VAR(2), + HT_ATTRBEGIN(3), + HT_ATTREND(4), + HT_TREEBEGIN(5), + HT_TREEEND(6); + public final int type; + private HierType(int type) { + this.type = type; + } + }; + public static enum VarType { + FST_VT_VCD_EVENT (0), + FST_VT_VCD_INTEGER (1), + FST_VT_VCD_PARAMETER (2), + FST_VT_VCD_REAL (3), + FST_VT_VCD_REAL_PARAMETER (4), + FST_VT_VCD_REG (5), + FST_VT_VCD_SUPPLY0 (6), + FST_VT_VCD_SUPPLY1 (7), + FST_VT_VCD_TIME (8), + FST_VT_VCD_TRI (9), + FST_VT_VCD_TRIAND (10), + FST_VT_VCD_TRIOR (11), + FST_VT_VCD_TRIREG (12), + FST_VT_VCD_TRI0 (13), + FST_VT_VCD_TRI1 (14), + FST_VT_VCD_WAND (15), + FST_VT_VCD_WIRE (16), + FST_VT_VCD_WOR (17), + FST_VT_VCD_PORT (18), + FST_VT_VCD_SPARRAY (19), /* used to define the rownum (index) port for a sparse array */ + FST_VT_VCD_REALTIME (20), - + FST_VT_GEN_STRING (21), /* generic string type (max len is defined dynamically via fstWriterEmitVariableLengthValueChange) */ + + FST_VT_SV_BIT (22), + FST_VT_SV_LOGIC (23), + FST_VT_SV_INT (24), /* declare as size = 32 */ + FST_VT_SV_SHORTINT (25), /* declare as size = 16 */ + FST_VT_SV_LONGINT (26), /* declare as size = 64 */ + FST_VT_SV_BYTE (27), /* declare as size = 8 */ + FST_VT_SV_ENUM (28), /* declare as appropriate type range */ + FST_VT_SV_SHORTREAL (29); /* declare and emit same as FST_VT_VCD_REAL (needs to be emitted as double, not a float) */ + public final int varType; + private VarType(int varType) { + this.varType = varType; + } + }; + + public static enum AttrType { + FST_AT_MISC ( 0), /* self-contained: does not need matching FST_HT_ATTREND */ + FST_AT_ARRAY ( 1), + FST_AT_ENUM ( 2), + FST_AT_PACK ( 3); + public final int attrType; + private AttrType(int attrType) { + this.attrType = attrType; + } + }; + + @FieldOrder({"type","name","component", "name_length", "component_length"}) + public static class HierScope extends Structure { + public byte type; /* FST_ST_MIN ... FST_ST_MAX */ + public String name; + public String component; + public int name_length; /* strlen(u.scope.name) */ + public int component_length; /* strlen(u.scope.component) */ + }; + + @FieldOrder({"type","direction","svt_workspace", "sdt_workspace", "sxt_workspace", "name","length","handle","name_length", "is_alias"}) + public static class HierVar extends Structure { + public byte type; /* FST_VT_MIN ... FST_VT_MAX */ + public byte direction; /* FST_VD_MIN ... FST_VD_MAX */ + public byte svt_workspace; /* zeroed out by FST reader, for client code use */ + public byte sdt_workspace; /* zeroed out by FST reader, for client code use */ + public int sxt_workspace; /* zeroed out by FST reader, for client code use */ + public String name; + public int length; + public int handle; /*fstHandle*/ + public int name_length; /* strlen(u.var.name) */ + public int is_alias; + }; + + @FieldOrder({"type","subtype","name", "arg", "arg_from_name", "name_length"}) + public static class HierAttr extends Structure { + public byte type; /* FST_AT_MIN ... FST_AT_MAX */ + public byte subtype; /* from fstMiscType, fstArrayType, fstEnumValueType, fstPackType */ + public String name; + public long arg; /* number of array elements, struct members, or some other payload (possibly ignored) */ + public long arg_from_name; /* for when name is overloaded as a variable-length integer (FST_AT_MISC + FST_MT_SOURCESTEM) */ + public long name_length; /* strlen(u.attr.name) */ + }; + + public static native Pointer fstReaderOpen(String name); + public static native Pointer fstReaderOpenForUtilitiesOnly(); public static native void fstReaderClose(Pointer ctx); - public static native String fstReaderGetVersionString(Pointer ctx); - public static native String fstReaderGetDateString(Pointer ctx); - public static native int fstReaderGetFileType(Pointer ctx); - public static native long fstReaderGetVarCount(Pointer ctx); - public static native long fstReaderGetScopeCount(Pointer ctx); - public static native long fstReaderGetAliasCount(Pointer ctx); - public static native long fstReaderGetValueChangeSectionCount(Pointer ctx); - public static native long fstReaderGetStartTime(Pointer ctx); - public static native long fstReaderGetEndTime(Pointer ctx); - public static native byte fstReaderGetTimescale(Pointer ctx); - public static native long fstReaderGetTimezero(Pointer ctx); + public static native String fstReaderGetVersionString(Pointer ctx); + public static native String fstReaderGetDateString(Pointer ctx); + public static native int fstReaderGetFileType(Pointer ctx); + public static native long fstReaderGetVarCount(Pointer ctx); + public static native long fstReaderGetScopeCount(Pointer ctx); + public static native long fstReaderGetAliasCount(Pointer ctx); + public static native long fstReaderGetValueChangeSectionCount(Pointer ctx); + public static native long fstReaderGetStartTime(Pointer ctx); + public static native long fstReaderGetEndTime(Pointer ctx); + public static native byte fstReaderGetTimescale(Pointer ctx); + public static native long fstReaderGetTimezero(Pointer ctx); + public static native int fstReaderGetMaxHandle(Pointer ctx); - public static native void fstReaderResetScope(Pointer ctx); - public static native String fstReaderPushScope(Pointer ctx, String nam, Pointer user_info); - public static native String fstReaderPopScope(Pointer ctx); - public static native int fstReaderGetCurrentScopeLen(Pointer ctx); + public static native void fstReaderResetScope(Pointer ctx); + public static native String fstReaderPushScope(Pointer ctx, String nam, Pointer user_info); + public static native String fstReaderPopScope(Pointer ctx); + public static native int fstReaderGetCurrentScopeLen(Pointer ctx); + public static native String fstReaderGetCurrentFlatScope(Pointer ctx); - /* - void fstReaderClrFacProcessMask(Pointer ctx, fstHandle facidx); - void fstReaderClrFacProcessMaskAll(Pointer ctx); - String fstReaderGetCurrentFlatScope(Pointer ctx); - Pointer fstReaderGetCurrentScopeUserInfo(Pointer ctx); - int fstReaderGetDoubleEndianMatchState(Pointer ctx); - long fstReaderGetDumpActivityChangeTime(Pointer ctx, int idx); - byte fstReaderGetDumpActivityChangeValue(Pointer ctx, int idx); - int fstReaderGetFacProcessMask(Pointer ctx, fstHandle facidx); - int fstReaderGetFseekFailed(Pointer ctx); - fstHandle fstReaderGetMaxHandle(Pointer ctx); - long fstReaderGetMemoryUsedByWriter(Pointer ctx); - int fstReaderGetNumberDumpActivityChanges(Pointer ctx); - String fstReaderGetValueFromHandleAtTime(Pointer ctx, long tim, fstHandle facidx, Stringbuf); - struct fstHier *fstReaderIterateHier(Pointer ctx); - int fstReaderIterateHierRewind(Pointer ctx); - int fstReaderIterBlocks(Pointer ctx, - void (*value_change_callback)(Pointer user_callback_data_pointer, long time, fstHandle facidx, const unsigned Stringvalue), - Pointer user_callback_data_pointer, FILE *vcdhandle); - int fstReaderIterBlocks2(Pointer ctx, + public static native int fstReaderGetNumberDumpActivityChanges(Pointer ctx); + public static native long fstReaderGetDumpActivityChangeTime(Pointer ctx, int idx); + public static native byte fstReaderGetDumpActivityChangeValue(Pointer ctx, int idx); + + public static native int fstReaderIterateHierRewind(Pointer ctx); + public static native Pointer fstReaderIterateHier(Pointer ctx); + public static native int getHierType(Pointer hier); + public static native void getHierScope(Pointer hier, HierScope scope); + public static native void getHierVar(Pointer hier, HierVar scope); + public static native void getHierAttr(Pointer hier, HierAttr scope); + public static native int fstReaderGetFacProcessMask(Pointer ctx, int facidx); + public static native void fstReaderSetFacProcessMask(Pointer ctx, int facidx); + public static native void fstReaderClrFacProcessMask(Pointer ctx, int facidx); + public static native void fstReaderSetFacProcessMaskAll(Pointer ctx); + public static native void fstReaderClrFacProcessMaskAll(Pointer ctx); + + public interface ValueChangeCallback extends Callback { + void callback(long time, int facidx, String value); + } + + public static native void iterateValueChanges(Pointer ctx, ValueChangeCallback vcc); + + /* untranslated functions: + int fstReaderIterBlocks(Pointer ctx, ValueChangeCallback vcc, Pointer user_callback_data_pointer, Pointer vcdhandle); + Pointer fstReaderGetCurrentScopeUserInfo(Pointer ctx); + int fstReaderGetDoubleEndianMatchState(Pointer ctx); + int fstReaderGetFseekFailed(Pointer ctx); + long fstReaderGetMemoryUsedByWriter(Pointer ctx); + String fstReaderGetValueFromHandleAtTime(Pointer ctx, long tim, fstHandle facidx, Stringbuf); + int fstReaderIterBlocks2(Pointer ctx, void (*value_change_callback)(Pointer user_callback_data_pointer, long time, fstHandle facidx, const unsigned Stringvalue), void (*value_change_callback_varlen)(Pointer user_callback_data_pointer, long time, fstHandle facidx, const unsigned Stringvalue, int len), Pointer user_callback_data_pointer, FILE *vcdhandle); - void fstReaderIterBlocksSetNativeDoublesOnCallback(Pointer ctx, int enable); - Pointer fstReaderOpenForUtilitiesOnly(void); - int fstReaderProcessHier(Pointer ctx, FILE *vcdhandle); - void fstReaderSetFacProcessMask(Pointer ctx, fstHandle facidx); - void fstReaderSetFacProcessMaskAll(Pointer ctx); - void fstReaderSetLimitTimeRange(Pointer ctx, long start_time, long end_time); - void fstReaderSetUnlimitedTimeRange(Pointer ctx); - void fstReaderSetVcdExtensions(Pointer ctx, int enable); + void fstReaderIterBlocksSetNativeDoublesOnCallback(Pointer ctx, int enable); + int fstReaderProcessHier(Pointer ctx, FILE *vcdhandle); + void fstReaderSetLimitTimeRange(Pointer ctx, long start_time, long end_time); + void fstReaderSetUnlimitedTimeRange(Pointer ctx); + void fstReaderSetVcdExtensions(Pointer ctx, int enable); */ static { - System.setProperty("jna.debug_load", "true"); -// System.out.println(System.getProperty("jna.library.path", "UNKNOWN")); +// System.setProperty("jna.debug_load", "true"); Native.register("fstapi"); } diff --git a/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstSignal.java b/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstSignal.java index 036d012..8ba21f4 100644 --- a/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstSignal.java +++ b/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/FstSignal.java @@ -20,25 +20,28 @@ import com.minres.scviewer.database.WaveformType; public class FstSignal extends HierNode implements IWaveform { - private long id; + private final FstDbLoader loader; + + private final int id; - private String fullName; + private final String fullName; private final int width; - private IEventList values; + private final IEventList values; - public FstSignal(String name) { - this(0, name, 1); + public FstSignal(FstDbLoader loader, String name) { + this(loader, 0, name, 1); } - public FstSignal(int id, String name) { - this(id,name,1); + public FstSignal(FstDbLoader loader, int id, String name) { + this(loader, id,name,1); } - public FstSignal(int id, String name, int width) { + public FstSignal(FstDbLoader loader, int id, String name, int width) { super(name); fullName=name; + this.loader=loader; this.id=id; this.width=width; this.values=new EventList(); @@ -47,6 +50,7 @@ public class FstSignal extends HierNode implements IWaveform { public FstSignal(FstSignal o, int id, String name) { super(name); fullName=name; + this.loader=o.loader; this.id=id; this.width=o.width; this.values=o.values; @@ -57,36 +61,30 @@ public class FstSignal extends HierNode implements IWaveform { return fullName; } - public void setId(int id) { - this.id=id; - } - @Override public long getId() { return id; } - public void addSignalChange(Long time, T value){ - values.put(time, value); - } - @Override public IEventList getEvents() { + if(values.size()==0) + loader.getEvents(id, width, values); return values; } @Override public IEvent[] getEventsAtTime(long time) { - return values.get(time); + return getEvents().get(time); } @Override public IEvent[] getEventsBeforeTime(long time) { - EventEntry e = values.floorEntry(time); + EventEntry e = getEvents().floorEntry(time); if(e==null) return new IEvent[] {}; else - return values.floorEntry(time).events; + return getEvents().floorEntry(time).events; } @Override @@ -101,6 +99,11 @@ public class FstSignal extends HierNode implements IWaveform { @Override public int getRowCount() { + return 1; + } + + @Override + public int getWidth() { return width; } diff --git a/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/HelloWorld.java b/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/HelloWorld.java deleted file mode 100644 index 7e5339d..0000000 --- a/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/HelloWorld.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.minres.scviewer.database.fst; - -import com.sun.jna.Library; -import com.sun.jna.Native; -import com.sun.jna.Platform; - -/** Simple example of JNA interface mapping and usage. */ -public class HelloWorld { - - // This is the standard, stable way of mapping, which supports extensive - // customization and mapping of Java to native types. - - public interface CLibrary extends Library { - CLibrary INSTANCE = (CLibrary) - Native.load((Platform.isWindows() ? "msvcrt" : "c"), - CLibrary.class); - - void printf(String format, Object... args); - } - - public static void main(String[] args) { - CLibrary.INSTANCE.printf("Hello, World\n"); - for (int i=0;i < args.length;i++) { - CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]); - } - } -} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/IFstDatabaseBuilder.java b/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/IFstDatabaseBuilder.java index df61ca6..fa9cc81 100644 --- a/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/IFstDatabaseBuilder.java +++ b/plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/IFstDatabaseBuilder.java @@ -10,8 +10,6 @@ *******************************************************************************/ package com.minres.scviewer.database.fst; -import com.minres.scviewer.database.BitVector; - /** * The Interface IVCDDatabaseBuilder. It allows to add VCD events into the database */ @@ -37,7 +35,7 @@ public interface IFstDatabaseBuilder { * @param width the width, -1 equals real, 0... is a bit vector * @return the net id */ - public Integer newNet(String netName, int i, int width) ; + public void newNet(String netName, int handle, int width, boolean alias) ; /** * Gets the net width. @@ -47,22 +45,5 @@ public interface IFstDatabaseBuilder { */ public int getNetWidth(int netId); - /** - * Append transition. - * - * @param netId the int value - * @param currentTime the current time in ps - * @param decodedValues the decoded values - */ - public void appendTransition(int netId, long currentTime, BitVector decodedValue); - - /** - * Append transition. - * - * @param netId the int value - * @param currentTime the current time in ps - * @param decodedValue the decoded values - */ - public void appendTransition(int netId, long currentTime, double decodedValue); - + public void setMaxTime(long time, int timeScale); } diff --git a/tests/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java b/tests/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java index 04168f3..bbf42d1 100644 --- a/tests/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java +++ b/tests/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java @@ -189,7 +189,7 @@ public class DatabaseServicesTest { List waves= waveformDb.getAllWaves(); assertEquals(14, waves.size()); assertEquals(2, waveformDb.getChildNodes().size()); - IWaveform bus_data_wave = waves.get(0); + IWaveform bus_data_wave = waves.get(12); EventEntry bus_data_entry = bus_data_wave.getEvents().floorEntry(1400000000L); assertEquals("00001011", bus_data_entry.events[0].toString()); IWaveform rw_wave = waves.get(2);