Skip to content

Commit da9d4ee

Browse files
committed
Trace: truncate large traces when rendering them (including diffs for MatchTrace)
1 parent 51b6ba0 commit da9d4ee

File tree

3 files changed

+52
-6
lines changed

3 files changed

+52
-6
lines changed

gtestverilog/example/Counter.test.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,5 +75,17 @@ TEST_F(Counter, ShouldSimulate) {
7575
.port(i_simulate_combinatorial).signal( "01" ).repeat(11)
7676
.port(i_simulate_sequential).signal( "10" ).repeat(11);
7777

78+
ASSERT_THAT(testBench.trace, MatchesTrace(traceExpected));
79+
}
80+
81+
TEST_F(Counter, ShouldHandleLargeTraces) {
82+
testBench.reset();
83+
testBench.tick(1000);
84+
85+
const Trace traceExpected = TraceBuilder()
86+
.port(i_clk).signal( "10" ).repeat(1001)
87+
.port(i_simulate_combinatorial).signal( "01" ).repeat(1001)
88+
.port(i_simulate_sequential).signal( "10" ).repeat(1001);
89+
7890
ASSERT_THAT(testBench.trace, MatchesTrace(traceExpected));
7991
}

gtestverilog/lib/MatchesTrace.cpp

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
#include "MatchesTrace.h"
22

3+
#include <algorithm>
4+
35
namespace gtestverilog {
46
namespace matches_trace {
7+
const size_t kMaxTraceRenderSize = 80;
58

69
bool compare(const Trace& actual, const Trace& expected, ::testing::MatchResultListener& listener) {
710
bool hasMatched = true;
@@ -43,18 +46,37 @@ namespace matches_trace {
4346
<< ConsoleColour().reset()
4447
<< "\n";
4548

49+
std::vector<Step> stepsExpectedRender;
50+
std::vector<Step> stepsActualRender;
51+
52+
size_t stepStart = 0;
53+
size_t stepEnd = sizeActual;
54+
55+
if (sizeActual > kMaxTraceRenderSize) {
56+
stepStart = (step > (kMaxTraceRenderSize/2)) ? step - (kMaxTraceRenderSize/2) : 0;
57+
stepEnd = std::min(stepEnd, stepStart + kMaxTraceRenderSize);
58+
59+
listener << "Note: Diff truncated to steps " << stepStart << " to " << stepEnd << "\n";
60+
61+
stepsExpectedRender = std::vector<Step>(stepsExpected.begin() + stepStart, stepsExpected.begin() + stepEnd);
62+
stepsActualRender = std::vector<Step>(stepsActual.begin() + stepStart, stepsActual.begin() + stepEnd);
63+
} else {
64+
stepsExpectedRender = stepsExpected;
65+
stepsActualRender = stepsActual;
66+
}
67+
4668
size_t maxPortLabelSize = expected.getMaxPortLabelSize();
4769

4870
listener << "\n";
4971
listener << "Expected:";
50-
Trace::renderPortDiff(*(listener.stream()), 'v', ConsoleColour::kGreen, maxPortLabelSize-9, portDesc, stepsExpected, stepsActual);
72+
Trace::renderPortDiff(*(listener.stream()), 'v', ConsoleColour::kGreen, maxPortLabelSize-9, portDesc, stepsExpectedRender, stepsActualRender);
5173

52-
Trace::renderPort(*(listener.stream()), maxPortLabelSize, portDesc, stepsExpected);
74+
Trace::renderPort(*(listener.stream()), maxPortLabelSize, portDesc, stepsExpectedRender);
5375

5476
listener << " Actual:";
55-
Trace::renderPortDiff(*(listener.stream()), 'v', ConsoleColour::kRed, maxPortLabelSize-9, portDesc, stepsExpected, stepsActual);
77+
Trace::renderPortDiff(*(listener.stream()), 'v', ConsoleColour::kRed, maxPortLabelSize-9, portDesc, stepsExpectedRender, stepsActualRender);
5678

57-
Trace::renderPort(*(listener.stream()), maxPortLabelSize, portDesc, stepsActual);
79+
Trace::renderPort(*(listener.stream()), maxPortLabelSize, portDesc, stepsActualRender);
5880
}
5981

6082
hasMatched = false;

gtestverilog/lib/Trace.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
#include <cstring>
44
#include <cmath>
5+
#include <iostream>
56

67
namespace gtestverilog {
8+
const size_t kMaxTraceRenderSize = 80;
9+
710
Trace::Trace() {
811
}
912

@@ -137,10 +140,19 @@ namespace gtestverilog {
137140
os << ConsoleColour().reset();
138141

139142
auto& steps = trace.getSteps();
143+
144+
std::vector<Step> stepsRender;
145+
146+
if (steps.size() <= kMaxTraceRenderSize) {
147+
stepsRender = steps;
148+
} else {
149+
stepsRender = std::vector<Step>(steps.begin(), steps.begin() + kMaxTraceRenderSize);
150+
os << "Note: Trace truncated to first " << kMaxTraceRenderSize << " steps\n";
151+
}
140152

141153
size_t maxPortLabelSize = trace.getMaxPortLabelSize();
142154

143-
renderTimeline(os, maxPortLabelSize + 11, steps.size());
155+
renderTimeline(os, maxPortLabelSize + 11, stepsRender.size());
144156

145157
for (uint32_t portId=0; portId<64; portId++) {
146158
if (!trace.hasPort(portId)) {
@@ -149,7 +161,7 @@ namespace gtestverilog {
149161

150162
const PortDescription& portDesc = trace.getPortDescription(portId);
151163

152-
Trace::renderPort(os, maxPortLabelSize, portDesc, steps);
164+
Trace::renderPort(os, maxPortLabelSize, portDesc, stepsRender);
153165
}
154166

155167
return os;

0 commit comments

Comments
 (0)