From e44e4d0a0560b29844cd7dc0826949ea0158ced1 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 27 Feb 2023 13:09:38 +0100 Subject: [PATCH] adds working FST reader implementation --- .../build.properties | 3 +- .../csrc/fst/CMakeLists.txt | 2 +- .../csrc/fst/build.sh | 2 + .../csrc/fst/fst_helper.c | 31 +++ .../linux-x86-64/libfstapi.so | Bin 213952 -> 214208 bytes .../scviewer/database/fst/FstDbLoader.java | 100 +++------ .../scviewer/database/fst/FstFileParser.java | 76 ++++++- .../scviewer/database/fst/FstLibrary.java | 211 +++++++++++++----- .../scviewer/database/fst/FstSignal.java | 41 ++-- .../scviewer/database/fst/HelloWorld.java | 27 --- .../database/fst/IFstDatabaseBuilder.java | 23 +- .../database/test/DatabaseServicesTest.java | 2 +- 12 files changed, 321 insertions(+), 197 deletions(-) create mode 100644 plugins/com.minres.scviewer.database.fst/csrc/fst/build.sh create mode 100644 plugins/com.minres.scviewer.database.fst/csrc/fst/fst_helper.c delete mode 100644 plugins/com.minres.scviewer.database.fst/src/com/minres/scviewer/database/fst/HelloWorld.java 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 1ee4ab41da8950303ddbcc53883a541abff0142e..6d37269661eb83199d347a946f4788f2c73ac3f6 100644 GIT binary patch delta 19861 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 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);