public TRecord RoundTripRecord <TRecord>(TRecord record, Endian endian, bool debug) where TRecord : StdfRecord { using (var testStream = new MemoryStream()) { using (var writer = new StdfFileWriter(testStream, endian, debug: true)) { if (typeof(TRecord) != typeof(Far)) { writer.WriteRecord(new Far { CpuType = endian == Endian.Big ? (byte)1 : (byte)2, StdfVersion = 4, }); } writer.WriteRecord(record); } testStream.Seek(0, SeekOrigin.Begin); using (var streamManager = new TestStreamManager(testStream)) { var file = new StdfFile(streamManager, debug) { ThrowOnFormatError = true }; return(file.GetSingleRecord <TRecord>()); } } }
static void Main(string[] args) { var file = new StdfFile(args[0]); StdfFileWriter outFile = null; if (args.Length > 1) { outFile = new StdfFileWriter(args[1]); } try { int bytesWritten = 0; long bytesRead = 0; foreach (var r in file.GetRecords()) { Console.WriteLine("Read Length: {0}", r.Offset - bytesRead); bytesRead = r.Offset; Console.WriteLine("{0}", r.GetType()); DumpRecord(r); if (outFile != null) { bytesWritten = outFile.WriteRecord(r); Console.WriteLine("Written Length: {0}", bytesWritten); } } } finally { if (outFile != null) { outFile.Dispose(); } } }
static void Main(string[] args) { if ((args.Length < 1) || (args.Length > 2)) { Usage(); return; } var stdf = new StdfFile(args[0]); //silly query var query = from r in stdf.GetRecords() select r; Console.WriteLine("There were {0} records!", query.Count()); var testTimes = from prr in stdf.GetRecords().OfExactType <Prr>() let testTime = prr.TestTime where testTime != null select testTime.Value / 1000.0; Console.WriteLine("Average Test Time: {0}", testTimes.Average()); //Get PTR results from failing parts grouped by test number var results = from prr in stdf.GetRecords().OfExactType <Prr>() where prr.Failed ?? false from ptr in prr.GetChildRecords().OfExactType <Ptr>() let result = ptr.Result where result != null group result.Value by ptr.TestNumber into g select new { TestNumber = g.Key, Results = g }; foreach (var test in results) { Console.WriteLine("Test {0}:", test.TestNumber); foreach (var result in test.Results) { Console.WriteLine("\t{0}", result); } } // Output STDF to a new file if (args.Length == 2) { Console.WriteLine("Writing to {0}...", args[1]); using (StdfFileWriter writer = new StdfFileWriter(args[1])) { writer.WriteRecords(stdf.GetRecords()); } } }
public void Finish() { if (reader != null) { reader.Close(); reader.Dispose(); } if (writer != null) { writer.Close(); writer.Dispose(); } file = null; }
static void Main(string[] args) { StdfFile file = new StdfFile(@"c:\temp\test.stdf"); IEnumerable <StdfRecord> records = file.GetRecords(); int i = 0; foreach (var item in records) { i++; Console.WriteLine("STDF Record[{0}]: Type[{1}]", i, item.GetType().ToString()); } Console.ReadKey(); }
public StdfParse(String filePath) { FilePath = filePath; FileName = Path.GetFileName(filePath); ParseDone = false; _stdfFile = null; _sites = new Dictionary <byte, int>(); _rawData = new RawData(); _testChips = new TestChips(RawData.DefaultFixedDataBlockLength); _testItems = new TestItems(RawData.DefaultItemsCapacity); BasicInfo = null; ParsePercent = 0; _filterList = new Dictionary <int, FilterData>(); _defaultSitesSummary = new Dictionary <byte, IChipSummary>(); _defaultSummary = null; }
public void SkippingUnknownRecords() { StdfFile file = new StdfFile(filePath); using (StdfFileReader reader = file.OpenForRead()) { reader.RecordRead += new RecordReadEventHandler(delegate(object o, RecordReadEventArgs e) { Assert.IsNotNull(e.Record); }); try { reader.Read(); } catch (Exception e) { Assert.Fail(e.Message); } } }
public static TRecord GetSingleRecord <TRecord>(this StdfFile file) where TRecord : StdfRecord { StartOfStreamRecord sos = null; Far far = null; TRecord recordOfInterest = null; EndOfStreamRecord eos = null; foreach (var record in file.GetRecordsEnumerable()) { if (sos == null) { sos = (StartOfStreamRecord)record; } else if (far == null) { far = (Far)record; if (typeof(TRecord) == typeof(Far)) { recordOfInterest = (TRecord)(object)far; } } else if (recordOfInterest == null) { recordOfInterest = (TRecord)record; } else if (eos == null) { eos = (EndOfStreamRecord)record; } else { Assert.Fail("There were extra records"); } } Assert.IsNotNull(sos, "No start of stream"); Assert.IsNotNull(recordOfInterest, "No record of interest"); Assert.IsNotNull(eos, "No end of stream"); //TODO: assert things about sos/eos? return(recordOfInterest); }
public void CleanUp() { _stdfFile = null; _rawData = null; _testChips = null; _testItems = null; _sites = null; FilePath = null; FileName = null; //basic file information BasicInfo = null; ExtractDone = null; _filterList = null; _defaultSitesSummary = null; _defaultSummary = null; GC.Collect(); }
private void Load_Click(object sender, RoutedEventArgs e) { var dialog = new OpenFileDialog(); if (dialog.ShowDialog() ?? false) { var file = new StdfFile(new SilverlightStreamManager(dialog.SelectedFile)); //don't throw file.ThrowOnFormatError = false; file.AddFilter(BuiltInFilters.V4ContentSpec); var data = new List <DisplayData>(); var mir = file.GetMir(); if (mir == null) { data.Add(new DisplayData { Field = "Error", Value = "No MIR found" }); } else { data.Add(new DisplayData() { Field = "Lot ID", Value = mir.LotId }); data.Add(new DisplayData() { Field = "Mode Code", Value = mir.ModeCode }); data.Add(new DisplayData() { Field = "Setup Time", Value = mir.SetupTime == null ? "NA" : mir.SetupTime.Value.ToString() }); data.Add(new DisplayData() { Field = "Setup Time", Value = mir.StartTime == null ? "NA" : mir.StartTime.Value.ToString() }); } var mrr = file.GetMrr(); if (mrr == null) { data.Add(new DisplayData { Field = "Error", Value = "No MRR found" }); } else { data.Add(new DisplayData() { Field = "Finish Time", Value = mrr.FinishTime == null ? "NA" : mrr.FinishTime.Value.ToString() }); data.Add(new DisplayData() { Field = "Total Record Count", Value = file.GetRecords().Count().ToString() }); } Data.ItemsSource = data; var errors = from r in file.GetRecords() where r is ErrorRecord || r is UnknownRecord select new ErrorData { Offset = r.Offset, Type = r.GetType().Name, }; Errors.ItemsSource = errors.ToList(); } }
public void Init() { file = new StdfFile(filePath); }
public void ExtractStdf() { if (ParseDone) { return; } //private data bool[] catchedPirFlag = null; TestID[] ptrLastTN = null; int[] InternalID = null; _stdfFile = new StdfFile(FilePath); List <PinMapRecord> listPinMaps = new List <PinMapRecord>(); List <PinGroupRecord> listPinGroups = new List <PinGroupRecord>(); var rs = from r in _stdfFile.GetRecords() select r; int siteIdx; foreach (var r in rs) { if (r.RecordType == StdfFile.PTR) { if (!_sites.TryGetValue(((Ptr)r).SiteNumber, out siteIdx)) { throw new Exception("No Site"); } if (!catchedPirFlag[siteIdx]) { throw new Exception("PIR Data Error"); } TestID testID; //compare with the previous test name to decide the testNO if (ptrLastTN[siteIdx].CompareTestNumber(((Ptr)r).TestNumber)) //it's a sub test { testID = TestID.NewSubTestID(ptrLastTN[siteIdx]); if (!_testItems.ExistTestItem(testID)) { IItemInfo info = _testItems.GetItemInfo(ptrLastTN[siteIdx]); info.SetTestText(((Ptr)r).TestText); _testItems.AddTestItem(testID, info); _rawData.AddItem(); } } else { testID = new TestID(((Ptr)r).TestNumber); if (!_testItems.ExistTestItem(testID)) { _testItems.AddTestItem(testID, new ItemInfo(((Ptr)r).TestText, ((Ptr)r).LowLimit, ((Ptr)r).HighLimit, ((Ptr)r).Units, ((Ptr)r).LowLimitScalingExponent, ((Ptr)r).HighLimitScalingExponent, ((Ptr)r).ResultScalingExponent)); _rawData.AddItem(); } } _rawData.Set(_testItems.GetIndex(testID), InternalID[siteIdx], _testItems.GetItemInfo(testID).GetScaledRst(((Ptr)r).Result)); ptrLastTN[siteIdx] = testID; } else if (r.RecordType == StdfFile.FTR) { if (!_sites.TryGetValue(((Ftr)r).SiteNumber, out siteIdx)) { throw new Exception("No Site"); } if (!catchedPirFlag[siteIdx]) { throw new Exception("PIR Data Error"); } TestID testID; //compare with the previous test name to decide the testNO if (!ptrLastTN[siteIdx].CompareTestNumber(((Ftr)r).TestNumber)) //it's a unused test, ftr do not set sub test { testID = new TestID(((Ftr)r).TestNumber); if (!_testItems.ExistTestItem(testID)) { _testItems.AddTestItem(testID, new ItemInfo(((Ftr)r).TestText, (float)0.5, (float)1.5, "", 0, 0, 0)); _rawData.AddItem(); } _rawData.Set(_testItems.GetIndex(testID), InternalID[siteIdx], ((Ftr)r).Results); ptrLastTN[siteIdx] = testID; } } else if (r.RecordType == StdfFile.MPR) { if (!_sites.TryGetValue(((Mpr)r).SiteNumber, out siteIdx)) { throw new Exception("No Site"); } if (!catchedPirFlag[siteIdx]) { throw new Exception("PIR Data Error"); } TestID testItemID; if (ptrLastTN[siteIdx].CompareTestNumber(((Mpr)r).TestNumber)) //it's a sub test { testItemID = TestID.NewSubTestID(ptrLastTN[siteIdx]); } else { testItemID = new TestID(((Mpr)r).TestNumber); } TestID testID = testItemID; for (uint i = 0; i < ((Mpr)r).Results.Count(); i++) { PinMapRecord pin = new PinMapRecord(); if (siteIdx == 0 && ((Mpr)r).PinIndexes != null) { pin = listPinMaps.Find(x => x.PinIndex == ((Mpr)r).PinIndexes[i]); } //else // throw new Exception("MPR Pin doesn't exist"); if (i > 0) { testID = TestID.NewSubTestID(testID); } if (!_testItems.ExistTestItem(testID)) { _testItems.AddTestItem(testID, new ItemInfo(((Mpr)r).TestText + "<>" + pin.LogicalName, ((Mpr)r).LowLimit, ((Mpr)r).HighLimit, ((Mpr)r).Units, ((Mpr)r).LowLimitScalingExponent, ((Mpr)r).HighLimitScalingExponent, ((Mpr)r).ResultScalingExponent)); _rawData.AddItem(); } _rawData.Set(_testItems.GetIndex(testID), InternalID[siteIdx], _testItems.GetItemInfo(testID).GetScaledRst(((Mpr)r).Results[i])); } ptrLastTN[siteIdx] = testItemID; } else if (r.RecordType == StdfFile.MIR) { BasicInfo = new FileBasicInfo((Mir)r); continue; } else if (r.RecordType == StdfFile.SDR) { for (int i = 0; i < ((Sdr)r).SiteNumbers.Length; i++) { _sites.Add(((Sdr)r).SiteNumbers[i], i); } catchedPirFlag = new bool[((Sdr)r).SiteNumbers.Count()]; InternalID = new int[((Sdr)r).SiteNumbers.Count()]; ptrLastTN = new TestID[((Sdr)r).SiteNumbers.Count()]; } else if (r.RecordType == StdfFile.PMR) { listPinMaps.Add(new PinMapRecord((Pmr)r)); } else if (r.RecordType == StdfFile.PGR) { listPinGroups.Add(new PinGroupRecord((Pgr)r, listPinMaps)); } else if (r.RecordType == StdfFile.PIR) { if (!_sites.TryGetValue(((Pir)r).SiteNumber, out siteIdx)) { throw new Exception("No Site"); } if (!catchedPirFlag[siteIdx]) { catchedPirFlag[siteIdx] = true; } else { throw new Exception("PIR Data Error"); } ptrLastTN[siteIdx] = new TestID(); InternalID[siteIdx] = _rawData.AddChip(); } else if (r.RecordType == StdfFile.BPS) { //do nothing } else if (r.RecordType == StdfFile.EPS) { //do nothing } else if (r.RecordType == StdfFile.PRR) { if (!_sites.TryGetValue(((Prr)r).SiteNumber, out siteIdx)) { throw new Exception("No Site"); } if (!catchedPirFlag[siteIdx]) { throw new Exception("PIR Data Error"); } else { catchedPirFlag[siteIdx] = false; } _testChips.AddChip(new ChipInfo((Prr)r, InternalID[siteIdx])); } else if (r.RecordType == StdfFile.TSR) { var v = ((Tsr)r).TestLabel; if (v != null && v != "") { _testItems.UpdateTestText(new TestID(((Tsr)r).TestNumber), v); } } else if (r.RecordType == StdfFile.MRR) { ((FileBasicInfo)BasicInfo).AddMrr((Mrr)r); } } ParseDone = true; _testChips.UpdateSummary(ref _defaultSitesSummary); _defaultSummary = ChipSummary.Combine(_defaultSitesSummary); OnExtractDone(this); _stdfFile = null; rs = null; GC.Collect(); CreateDefaultFilters(); }