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 0c57660..3196e8a 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 @@ -25,6 +25,7 @@ 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; @@ -45,17 +46,17 @@ public class FstDbLoader implements IWaveformDbLoader, IFstDatabaseBuilder { /** The max time. */ private long maxTime; - private int timeScale; + private long timeScaleFactor; /** The pcs. */ protected PropertyChangeSupport pcs = new PropertyChangeSupport(this); - static int calculateTimescaleMultipierPower(int power){ - int answer = 1; - if(power<=0){ + static long calculateTimescaleMultipierPower(long time_scale){ + long answer = 1; + if(time_scale<=0){ return answer; } else{ - for(int i = 1; i<= power; i++) + for(int i = 1; i<= time_scale; i++) answer *= 10; return answer; } @@ -94,7 +95,7 @@ public class FstDbLoader implements IWaveformDbLoader, IFstDatabaseBuilder { */ @Override public long getMaxTime() { - return maxTime*calculateTimescaleMultipierPower(15+timeScale); // timescape is 1e(timeScale), we calculate in fs + return maxTime; } /* (non-Javadoc) @@ -149,8 +150,9 @@ public class FstDbLoader implements IWaveformDbLoader, IFstDatabaseBuilder { } public void setMaxTime(long maxTime, int timeScale) { - this.maxTime = maxTime; - this.timeScale=timeScale; + long eff_time_scale=timeScale-IWaveformDb.databaseTimeScale; + this.timeScaleFactor = calculateTimescaleMultipierPower(eff_time_scale); + this.maxTime = maxTime*timeScaleFactor; } /* (non-Javadoc) * @see com.minres.scviewer.database.IWaveformDbLoader#getAllRelationTypes() @@ -182,6 +184,6 @@ public class FstDbLoader implements IWaveformDbLoader, IFstDatabaseBuilder { public void getEvents(int id, int width, IEventList values) { if(values instanceof EventList) - parser.getValueChanges(id, width, calculateTimescaleMultipierPower(15+timeScale), (EventList) values); + parser.getValueChanges(id, width, timeScaleFactor, (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 1166f82..b9c2bfc 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 @@ -37,7 +37,7 @@ class FstFileParser { System.out.println(version); long endTime = FstLibrary.fstReaderGetEndTime(fst); byte timeScale = FstLibrary.fstReaderGetTimescale(fst); - builder.setMaxTime(endTime, timeScale); + builder.setMaxTime(endTime, -timeScale); FstLibrary.fstReaderIterateHierRewind(fst); Pointer p = FstLibrary.fstReaderIterateHier(fst); while(p!=null && !p.equals(Pointer.NULL)) { @@ -77,7 +77,7 @@ class FstFileParser { return false; } - public void getValueChanges(final int id, final int width, int timeScale, final EventList values) { + public void getValueChanges(final int id, final int width, long timeScale, final EventList values) { FstLibrary.fstReaderClrFacProcessMaskAll(fst); FstLibrary.fstReaderSetFacProcessMask(fst, id); FstLibrary.iterateValueChanges(fst, new ValueChangeCallback() { diff --git a/plugins/com.minres.scviewer.database.ftr/src/com/minres/scviewer/database/ftr/FtrDbLoader.java b/plugins/com.minres.scviewer.database.ftr/src/com/minres/scviewer/database/ftr/FtrDbLoader.java index 53a1736..a97afa8 100644 --- a/plugins/com.minres.scviewer.database.ftr/src/com/minres/scviewer/database/ftr/FtrDbLoader.java +++ b/plugins/com.minres.scviewer.database.ftr/src/com/minres/scviewer/database/ftr/FtrDbLoader.java @@ -33,6 +33,7 @@ import com.minres.scviewer.database.AssociationType; import com.minres.scviewer.database.DataType; import com.minres.scviewer.database.EventKind; 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; @@ -327,6 +328,17 @@ public class FtrDbLoader implements IWaveformDbLoader { /** The loader. */ final FtrDbLoader loader; + static long calculateTimescaleMultipierPower(long power){ + long answer = 1; + if(power<=0){ + return answer; + } else{ + for(int i = 1; i<= power; i++) + answer *= 10; + return answer; + } + } + /** * Instantiates a new text db parser. * @@ -347,10 +359,10 @@ public class FtrDbLoader implements IWaveformDbLoader { case 6: { // info CborDecoder cbd = new CborDecoder(new ByteArrayInputStream(readByteString())); long sz = cbd.readArrayLength(); - assert(sz==3); - long time_numerator=cbd.readInt(); - long time_denominator=cbd.readInt(); - loader.time_scale_factor = 1000000000000000l*time_numerator/time_denominator; + assert(sz==2); + long time_scale=cbd.readInt(); + long eff_time_scale=time_scale-IWaveformDb.databaseTimeScale; + loader.time_scale_factor = calculateTimescaleMultipierPower(eff_time_scale); long epoch_tag = cbd.readTag(); assert(epoch_tag==1); cbd.readInt(); // epoch @@ -426,7 +438,7 @@ public class FtrDbLoader implements IWaveformDbLoader { ArrayList lst = new ArrayList<>((int)size); for(long i = 0; i nameToNetMap = new HashMap<>(); - private long picoSecondsPerIncrement; + private long timeScaleFactor; private boolean stripNetWidth; private boolean replaceColon; long currentTime; @@ -121,29 +122,37 @@ class VCDFileParser { nextToken(); } String s = sb.toString(); + int fac =1; switch (s.charAt(s.length() - 2)){ + case 'f': // Nano-seconds + fac = -15; + s = s.substring(0, s.length() - 2).trim(); + break; case 'p': // Nano-seconds - picoSecondsPerIncrement = 1; + fac = -12; s = s.substring(0, s.length() - 2).trim(); break; case 'n': // Nano-seconds - picoSecondsPerIncrement = 1000; + fac = -9; s = s.substring(0, s.length() - 2).trim(); break; case 'u': // Microseconds - picoSecondsPerIncrement = 1000000; + fac = -6; s = s.substring(0, s.length() - 2).trim(); break; case 'm': // Microseconds - picoSecondsPerIncrement = 1000000000; + fac = -3; s = s.substring(0, s.length() - 2).trim(); break; default: // Seconds - picoSecondsPerIncrement = 1000000000000L; + fac = 1; s = s.substring(0, s.length() - 1); break; } - picoSecondsPerIncrement *= Long.parseLong(s); + timeScaleFactor = 1; + for(int i = 1; i<= fac-IWaveformDb.databaseTimeScale; i++) + timeScaleFactor *= 10; + timeScaleFactor = Long.parseLong(s); } private boolean parseDefinition() throws IOException, ParseException { @@ -171,7 +180,7 @@ class VCDFileParser { private boolean parseTransition() throws IOException { if (!nextToken()) return false; if (tokenizer.sval.charAt(0) == '#') { // If the line begins with a #, this is a timestamp. - currentTime = Long.parseLong(tokenizer.sval.substring(1)) * picoSecondsPerIncrement; + currentTime = Long.parseLong(tokenizer.sval.substring(1)) * timeScaleFactor; } else { if(tokenizer.sval.equals("$comment")){ do { diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java index 700cc04..8d1537e 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java @@ -18,6 +18,11 @@ import java.util.List; */ public interface IWaveformDb extends IHierNode { + /** + * the time scale of the database. This is the exponent of the value i.e. -12 is ps + */ + public static final int databaseTimeScale = -15; + /** * Gets the max time. *