CIRCT 23.0.0git
Loading...
Searching...
No Matches
BMCTrace.cpp
Go to the documentation of this file.
1//===- BMCTrace.cpp -------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10
11#include "llvm/ADT/SmallString.h"
12#include <cassert>
13
14circt::bmc::BMCTrace::BMCTrace(llvm::StringRef topName) : topName(topName) {}
15
16size_t circt::bmc::BMCTrace::addSignal(llvm::StringRef name, unsigned width) {
17 assert(!signalIndices.contains(name) && "duplicate trace signal");
18 signalIndices.try_emplace(name, signals.size());
19 signals.push_back({name.str(), width});
20 for (auto &step : recorded)
21 step.resize(signals.size());
22 return signals.size() - 1;
23}
24
26 if (step >= recorded.size())
27 recorded.resize(step + 1, Step(signals.size()));
28}
29
30void circt::bmc::BMCTrace::record(size_t step, size_t signal, Handle handle) {
31 assert(signal < signals.size() && "signal index out of range");
32 ensureStep(step);
33 recorded[step][signal] = handle;
34}
35
36void circt::bmc::BMCTrace::record(size_t step, llvm::StringRef name,
37 unsigned width, Handle handle) {
38 auto it = signalIndices.find(name);
39 size_t signal;
40 if (it == signalIndices.end()) {
41 signal = addSignal(name, width);
42 } else {
43 signal = it->second;
44 assert(signals[signal].width == width && "trace signal width changed");
45 }
46 record(step, signal, handle);
47}
48
49std::optional<circt::bmc::BMCTrace::Handle>
50circt::bmc::BMCTrace::lookup(size_t step, size_t signal) const {
51 if (step >= recorded.size() || signal >= signals.size())
52 return std::nullopt;
53 return recorded[step][signal];
54}
55
56bool circt::bmc::BMCTrace::printTextTrace(llvm::raw_ostream &os,
57 Evaluator evaluate) const {
58 os << "counterexample for " << topName << ":\n";
59 for (size_t step = 0, e = recorded.size(); step != e; ++step) {
60 os << "cycle " << step << ":\n";
61 for (size_t signal = 0, numSignals = signals.size(); signal != numSignals;
62 ++signal) {
63 auto handle = recorded[step][signal];
64 if (!handle)
65 return false;
66 auto value = evaluate(*handle, signals[signal].width);
67 if (!value || value->getBitWidth() != signals[signal].width)
68 return false;
69 llvm::SmallString<40> str;
70 value->toString(str, /*Radix=*/16, /*Signed=*/false,
71 /*formatAsCLiteral=*/false, /*UpperCase=*/false);
72 os << " " << signals[signal].name << " = 0x" << str << "\n";
73 }
74 }
75 return true;
76}
77
79 uint32_t step,
80 const char *name,
81 uint32_t width,
82 BMCTrace::Handle handle) {
83 if (!trace)
84 return;
85 trace->record(step, name, width, handle);
86}
assert(baseType &&"element must be base type")
bool printTextTrace(llvm::raw_ostream &os, Evaluator evaluate) const
Render the trace as cycle-by-cycle text using the provided evaluator to materialize values from recor...
Definition BMCTrace.cpp:56
void ensureStep(size_t step)
Definition BMCTrace.cpp:25
BMCTrace(llvm::StringRef topName="bmc")
Create an empty trace for the given top-level design/module name.
Definition BMCTrace.cpp:14
const void * Handle
Opaque per-signal value reference recorded for a specific cycle.
Definition BMCTrace.h:33
size_t addSignal(llvm::StringRef name, unsigned width)
Register a signal to be tracked and return its stable index.
Definition BMCTrace.cpp:16
std::vector< std::optional< Handle > > Step
Per-cycle storage for all tracked signals.
Definition BMCTrace.h:70
llvm::function_ref< std::optional< llvm::APInt >(Handle, unsigned width)> Evaluator
Callback used to materialize a recorded handle into a concrete value when formatting a trace.
Definition BMCTrace.h:38
void record(size_t step, size_t signal, Handle handle)
Record the value handle for a tracked signal at the given cycle.
Definition BMCTrace.cpp:30
std::optional< Handle > lookup(size_t step, size_t signal) const
Return the recorded handle for a signal at a given cycle, if present.
Definition BMCTrace.cpp:50
void circt_bmc_record_trace(BMCTrace *trace, uint32_t step, const char *name, uint32_t width, BMCTrace::Handle handle)
Runtime entry point called by JIT-compiled BMC code.
Definition BMCTrace.cpp:78