From 1fd4a94057061b069d6b23b73a05df39c79c0e7b Mon Sep 17 00:00:00 2001 From: Evan Anderson Date: Fri, 9 Feb 2024 11:09:00 -0600 Subject: [PATCH 1/3] Fix sample index handling GetSampleNumber returns 0 for the first sample, so we don't need to subtract one when using AdvanceToAbsPosition. Doing so on recent versions of Logic results in the analyzer completely failing to analyze the waveform since subtracting 1 from a 0 value U64 results in the U64 equaling UINT64_MAX --- src/QSpiAnalyzer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/QSpiAnalyzer.cpp b/src/QSpiAnalyzer.cpp index b797e04..6d35b7e 100644 --- a/src/QSpiAnalyzer.cpp +++ b/src/QSpiAnalyzer.cpp @@ -44,7 +44,7 @@ void QSpiAnalyzer::WorkerThread() } mCurrentSample = mCs->GetSampleNumber(); - mSck->AdvanceToAbsPosition(mCurrentSample - 1); + mSck->AdvanceToAbsPosition(mCurrentSample); MarkChannels(mCs->GetSampleNumber(), AnalyzerResults::Start, mStartStopMask); } else { mCurrentSample = mSck->GetSampleNumber(); From e016e5ff5cc5cb079568aa82eacd020fd4285f79 Mon Sep 17 00:00:00 2001 From: Evan Anderson Date: Fri, 9 Feb 2024 15:38:10 -0600 Subject: [PATCH 2/3] Fix end of transaction sample accounting The end of the transaction is always the same sample as clock for the cycle that is being parsed. --- src/QSpiAnalyzer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/QSpiAnalyzer.cpp b/src/QSpiAnalyzer.cpp index 6d35b7e..130d2fb 100644 --- a/src/QSpiAnalyzer.cpp +++ b/src/QSpiAnalyzer.cpp @@ -336,7 +336,7 @@ void QSpiAnalyzer::GetBlock() Frame result_frame; result_frame.mStartingSampleInclusive = first_sample; - result_frame.mEndingSampleInclusive = WouldAdvancingTheClockToggleEnable () ? mCs->GetSampleOfNextEdge() : mSck->GetSampleOfNextEdge(); + result_frame.mEndingSampleInclusive = mSck->GetSampleNumber(); result_frame.mData1 = data_word; result_frame.mFlags = 0; result_frame.mType = (U8)mTransactionState; @@ -430,7 +430,7 @@ void QSpiAnalyzer::GetDummyBlock() Frame result_frame; result_frame.mStartingSampleInclusive = first_sample; - result_frame.mEndingSampleInclusive = WouldAdvancingTheClockToggleEnable() ? mSck->GetSampleNumber() : mSck->GetSampleOfNextEdge(); + result_frame.mEndingSampleInclusive = mSck->GetSampleNumber(); result_frame.mData1 = 0; result_frame.mFlags = 0; result_frame.mType = (U8)mTransactionState; From ce4ebfc8811bacf74b6bd9866040e5e01ed244d8 Mon Sep 17 00:00:00 2001 From: Evan Anderson Date: Mon, 12 Feb 2024 10:33:47 -0600 Subject: [PATCH 3/3] Cleanup sample labeling errors * Ensure strings are null initialized and terminated * Remove data bit accounting for waveform view * Fix corruption of dummy label on waveform view --- src/QSpiAnalyzerResults.cpp | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/src/QSpiAnalyzerResults.cpp b/src/QSpiAnalyzerResults.cpp index 363c0f0..b0b6f42 100644 --- a/src/QSpiAnalyzerResults.cpp +++ b/src/QSpiAnalyzerResults.cpp @@ -32,14 +32,15 @@ void QSpiAnalyzerResults::GenerateBubbleText(U64 frame_index, Channel &channel, U32 bit_count = GetStateBitCount(mSettings, transaction_state); U32 clock_count = GetStateClockCount(mSettings, transaction_state, data_lines); - char number_str[128]; - char result_str[128]; + char number_str[128] = { 0 }; + char result_str[128] = { 0 }; if (frame.mType == QSpiTypes::DUMMY_STATE) { AddResultString("X"); AddResultString("Dummy"); data_index = 0; + return; } else { @@ -65,12 +66,9 @@ void QSpiAnalyzerResults::GenerateBubbleText(U64 frame_index, Channel &channel, AddResultString(number_str); snprintf(result_str, sizeof(result_str), "Data: %s", number_str); AddResultString(result_str); - snprintf(result_str, sizeof(result_str), "Data %d: %s", data_index++, number_str); break; } - - } AddResultString(result_str); } @@ -101,10 +99,10 @@ void QSpiAnalyzerResults::GenerateExportFile(const char *file, DisplayBase displ continue; } - char time_str[128]; - AnalyzerHelpers::GetTimeString(frame.mStartingSampleInclusive, trigger_sample, sample_rate, time_str, 128); + char time_str[128] = { 0 }; + AnalyzerHelpers::GetTimeString(frame.mStartingSampleInclusive, trigger_sample, sample_rate, time_str, sizeof(time_str)); - char data_str[128] = ""; + char data_str[128] = { 0 }; QSpiTypes::TransactionState transaction_state = (QSpiTypes::TransactionState)frame.mType; QSpiTypes::IOMode data_lines = GetIOMode(mSettings, transaction_state); @@ -112,10 +110,10 @@ void QSpiAnalyzerResults::GenerateExportFile(const char *file, DisplayBase displ U32 clock_count = GetStateClockCount(mSettings, transaction_state, data_lines); if (frame.mType == QSpiTypes::DUMMY_STATE){ - strcpy(data_str, "Dummy"); + strncpy(data_str, "Dummy", sizeof(data_str)); } else{ - AnalyzerHelpers::GetNumberString(frame.mData1, display_base, bit_count, data_str, 128); + AnalyzerHelpers::GetNumberString(frame.mData1, display_base, bit_count, data_str, sizeof(data_str)); } U64 packet_id = GetPacketContainingFrameSequential(i); @@ -144,7 +142,7 @@ void QSpiAnalyzerResults::GenerateFrameTabularText(U64 frame_index, DisplayBase Frame frame = GetFrame(frame_index); - char data_str[128]; + char data_str[128] = { 0 }; QSpiTypes::TransactionState transaction_state = (QSpiTypes::TransactionState)frame.mType; QSpiTypes::IOMode data_lines = GetIOMode(mSettings, transaction_state); U32 bit_count = GetStateBitCount(mSettings, transaction_state); @@ -157,16 +155,11 @@ void QSpiAnalyzerResults::GenerateFrameTabularText(U64 frame_index, DisplayBase if (frame.mType != QSpiTypes::DATA_STATE && data_index > 0) { data_index = 0; - /*ss << " "; - AddTabularText(ss.str().c_str()); - ss.clear();*/ } if (frame.mType == QSpiTypes::DUMMY_STATE) { - /*ss << "Dummy: "; - strcpy(data_str, "(Dummy)");*/ - sprintf(data_str, "(Dummy) %d bits", bit_count); + snprintf(data_str, sizeof(data_str), "(Dummy) %d bits", bit_count); } else { @@ -179,13 +172,11 @@ void QSpiAnalyzerResults::GenerateFrameTabularText(U64 frame_index, DisplayBase ss << "Addr: "; break; case QSpiTypes::DATA_STATE: - sprintf(data_str, "Data %d: ", data_index++); - //ss << "Data: "; - ss << data_str; + snprintf(data_str, sizeof(data_str), "Data %d: ", data_index++); break; } - AnalyzerHelpers::GetNumberString(frame.mData1, display_base, bit_count, data_str, 128); + AnalyzerHelpers::GetNumberString(frame.mData1, display_base, bit_count, data_str, sizeof(data_str)); } ss << data_str;