Skip to content

Commit 983deff

Browse files
committed
dslx: Add max_trace_verbosity flag to DSLX interpreter
1 parent 50d4242 commit 983deff

8 files changed

Lines changed: 69 additions & 4 deletions

File tree

xls/dslx/bytecode/bytecode.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,21 +330,26 @@ class Bytecode {
330330
TraceData& operator=(TraceData&& other) = default;
331331

332332
TraceData(std::vector<FormatStep> steps,
333-
std::vector<ValueFormatDescriptor> value_fmt_descs)
333+
std::vector<ValueFormatDescriptor> value_fmt_descs,
334+
std::optional<int64_t> verbosity = std::nullopt)
334335
: steps_(std::move(steps)),
335-
value_fmt_descs_(std::move(value_fmt_descs)) {}
336+
value_fmt_descs_(std::move(value_fmt_descs)),
337+
verbosity_(verbosity) {}
336338

337339
absl::Span<const FormatStep> steps() const { return steps_; }
338340
absl::Span<const ValueFormatDescriptor> value_fmt_descs() const {
339341
return value_fmt_descs_;
340342
}
343+
const std::optional<int64_t> verbosity() const { return verbosity_; }
341344

342345
private:
343346
std::vector<FormatStep> steps_;
344347

345348
// For default formatting of struct operands we hold metadata that allows us
346349
// to format them in more detail (struct name, fields, etc).
347350
std::vector<ValueFormatDescriptor> value_fmt_descs_;
351+
// Verbosity of the `vtrace` messages
352+
std::optional<int64_t> verbosity_;
348353
};
349354

350355
// Information necessary for channel operations.

xls/dslx/bytecode/bytecode_emitter.cc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1016,9 +1016,19 @@ absl::Status BytecodeEmitter::HandleFormatMacro(const FormatMacro* node) {
10161016

10171017
CHECK(node->macro() == "trace_fmt!" || node->macro() == "vtrace_fmt!")
10181018
<< "Expected trace_fmt! or vtrace_fmt! but got: " << node->macro();
1019+
std::optional<int64_t> verbosity = std::nullopt;
1020+
if (node->verbosity().has_value()) {
1021+
XLS_ASSIGN_OR_RETURN(InterpValue verbosity_val,
1022+
type_info_->GetConstExpr(*node->verbosity()));
1023+
absl::StatusOr<int64_t> verbosity_as_int64 =
1024+
verbosity_val.GetBitValueViaSign();
1025+
if (verbosity_as_int64.ok()) {
1026+
verbosity = *verbosity_as_int64;
1027+
}
1028+
}
10191029
Bytecode::TraceData trace_data(
10201030
std::vector<FormatStep>(node->format().begin(), node->format().end()),
1021-
std::move(value_fmt_descs));
1031+
std::move(value_fmt_descs), verbosity);
10221032
bytecode_.push_back(
10231033
Bytecode(node->span(), Bytecode::Op::kTraceFmt, std::move(trace_data)));
10241034
return absl::OkStatus();

xls/dslx/bytecode/bytecode_interpreter.cc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1437,9 +1437,13 @@ absl::Status BytecodeInterpreter::EvalTraceFmt(const Bytecode& bytecode) {
14371437
bytecode.trace_data());
14381438
XLS_ASSIGN_OR_RETURN(std::string message,
14391439
TraceDataToString(*trace_data, stack_));
1440-
if (options_.trace_hook()) {
1440+
// Exclude "vtrace" messages if the verbosity level is set to a value higher
1441+
// than the verbosity level passed by the "max_trace_verbosity" flag.
1442+
if (options_.trace_hook() &&
1443+
(*trace_data->verbosity() <= *options_.max_trace_verbosity())) {
14411444
options_.trace_hook()(bytecode.source_span(), message);
14421445
}
1446+
14431447
stack_.Push(InterpValue::MakeToken());
14441448
return absl::OkStatus();
14451449
}

xls/dslx/bytecode/bytecode_interpreter_options.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,18 @@ class BytecodeInterpreterOptions {
100100
}
101101
std::optional<int64_t> max_ticks() const { return max_ticks_; }
102102

103+
// Store verbosity level from the `max_trace_verbosity` flag. Used to filter
104+
// `vtrace` messages if their verbosity level is set higher than the verbosity
105+
// level passed by the flag.
106+
BytecodeInterpreterOptions& max_trace_verbosity(
107+
std::optional<int64_t> value) {
108+
max_trace_verbosity_ = value;
109+
return *this;
110+
}
111+
std::optional<int64_t> max_trace_verbosity() const {
112+
return max_trace_verbosity_;
113+
}
114+
103115
void set_validate_final_stack_depth(bool enabled) {
104116
validate_final_stack_depth_ = enabled;
105117
}
@@ -123,6 +135,7 @@ class BytecodeInterpreterOptions {
123135
bool trace_channels_ = false;
124136
bool trace_calls_ = false;
125137
std::optional<int64_t> max_ticks_;
138+
std::optional<int64_t> max_trace_verbosity_;
126139
bool validate_final_stack_depth_ = true;
127140
FormatPreference format_preference_ = FormatPreference::kDefault;
128141
};

xls/dslx/bytecode/bytecode_interpreter_test.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,28 @@ fn main() -> () {
226226
EXPECT_EQ(value, InterpValue::MakeUnit());
227227
}
228228

229+
TEST_F(BytecodeInterpreterTest, VtraceFmtBitsValueDefaultFormat) {
230+
constexpr std::string_view kProgram = R"(
231+
fn main() -> () {
232+
vtrace_fmt!(u32:2, "{}", u32:2);
233+
vtrace_fmt!(u32:6, "{}", u32:6);
234+
vtrace_fmt!(u32:10, "{}", u32:10);
235+
vtrace_fmt!(u32:16, "{}", u32:16);
236+
}
237+
)";
238+
std::vector<std::string> trace_output;
239+
XLS_ASSERT_OK_AND_ASSIGN(
240+
InterpValue value,
241+
Interpret(kProgram, "main", /*args=*/{},
242+
BytecodeInterpreterOptions()
243+
.trace_hook([&](const Span&, std::string_view s) {
244+
trace_output.push_back(std::string{s});
245+
})
246+
.max_trace_verbosity(8)));
247+
EXPECT_THAT(trace_output, ElementsAre("2", "6"));
248+
EXPECT_EQ(value, InterpValue::MakeUnit());
249+
}
250+
229251
TEST_F(BytecodeInterpreterTest, TraceFmtBitsValueHexFormat) {
230252
constexpr std::string_view kProgram = R"(
231253
fn main() -> () {

xls/dslx/interpreter_main.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ ABSL_FLAG(bool, trace_calls, false,
8989
ABSL_FLAG(int64_t, max_ticks, 100000,
9090
"If non-zero, the maximum number of ticks to execute on any proc. If "
9191
"exceeded an error is returned.");
92+
ABSL_FLAG(int64_t, max_trace_verbosity, 0,
93+
"Maximum verbosity for traces. Traces with higher verbosity are "
94+
"stripped from the output. 0 by default.");
9295
ABSL_FLAG(std::string, evaluator, "dslx-interpreter",
9396
"What evaluator should be used to actually execute the dslx test. "
9497
"'dslx-interpreter' is the DSLX bytecode interpreter. 'ir-jit' is "
@@ -169,6 +172,11 @@ absl::StatusOr<TestResult> RealMain(
169172
: TypeInferenceVersion::kVersion1)
170173
: std::nullopt;
171174

175+
std::optional<int64_t> max_trace_verbosity =
176+
absl::GetFlag(FLAGS_max_trace_verbosity) == 0
177+
? std::nullopt
178+
: std::optional<int64_t>(absl::GetFlag(FLAGS_max_trace_verbosity));
179+
172180
RealFilesystem vfs;
173181

174182
XLS_ASSIGN_OR_RETURN(std::string program,
@@ -243,6 +251,7 @@ absl::StatusOr<TestResult> RealMain(
243251
.trace_channels = trace_channels,
244252
.trace_calls = trace_calls,
245253
.max_ticks = max_ticks,
254+
.max_trace_verbosity = max_trace_verbosity,
246255
};
247256

248257
std::unique_ptr<AbstractTestRunner> test_runner = GetTestRunner(evaluator);

xls/dslx/run_routines/run_routines.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,6 +1025,7 @@ absl::StatusOr<TestResultData> AbstractTestRunner::ParseAndTest(
10251025
.trace_channels(options.trace_channels)
10261026
.trace_calls(options.trace_calls)
10271027
.max_ticks(options.max_ticks)
1028+
.max_trace_verbosity(options.max_trace_verbosity)
10281029
.format_preference(options.format_preference);
10291030
if (std::holds_alternative<TestFunction*>(*member)) {
10301031
XLS_ASSIGN_OR_RETURN(

xls/dslx/run_routines/run_routines.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ struct ParseAndTestOptions {
109109
bool trace_channels = false;
110110
bool trace_calls = false;
111111
std::optional<int64_t> max_ticks;
112+
std::optional<int64_t> max_trace_verbosity;
112113
std::function<std::unique_ptr<VirtualizableFilesystem>()> vfs_factory =
113114
nullptr;
114115
};

0 commit comments

Comments
 (0)