slang-netlist  0.9.0
Loading...
Searching...
No Matches
ReportDrivers.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include "slang/analysis/AnalysisManager.h"
7#include "slang/analysis/ValueDriver.h"
8#include "slang/ast/ASTVisitor.h"
9#include "slang/ast/EvalContext.h"
10#include "slang/ast/ValuePath.h"
11#include "slang/ast/symbols/ValueSymbol.h"
12
13namespace slang::report {
14
17 : public ast::ASTVisitor<ReportDrivers, ast::VisitFlags::Expressions |
18 ast::VisitFlags::Canonical> {
19
21 static auto driverPathToString(const ast::ValueSymbol &symbol,
22 const analysis::ValueDriver &driver) {
23 ast::EvalContext evalContext(symbol);
24 return driver.path.toString(evalContext);
25 }
26
27 struct DriverInfo {
28 std::string prefix;
29 analysis::DriverKind kind;
31 SourceLocation location;
32 };
33
34 struct ValueInfo {
35 std::string path;
36 SourceLocation location;
37 std::vector<DriverInfo> drivers;
38 };
39
40 ast::Compilation &compilation;
41 analysis::AnalysisManager &analysisManager;
42 std::vector<ValueInfo> values;
43
44public:
45 explicit ReportDrivers(ast::Compilation &compilation,
46 analysis::AnalysisManager &analysisManager)
47 : compilation(compilation), analysisManager(analysisManager) {}
48
50 void report(FormatBuffer &buffer) {
51 auto header =
52 netlist::Utilities::Row{"Value", "Range", "Driver", "Type", "Location"};
53 auto table = netlist::Utilities::Table{};
54
55 for (auto value : values) {
56 auto loc = netlist::Utilities::locationStr(compilation, value.location);
57 table.push_back(netlist::Utilities::Row{value.path, "", "", "", loc});
58
59 for (auto &driver : value.drivers) {
60 auto kind =
61 driver.kind == analysis::DriverKind::Procedural ? "proc" : "cont";
62 auto loc =
63 netlist::Utilities::locationStr(compilation, driver.location);
64 table.push_back(netlist::Utilities::Row{"↳", toString(driver.bounds),
65 driver.prefix, kind, loc});
66 }
67 }
68
69 netlist::Utilities::formatTable(buffer, header, table);
70 }
71
75 void handle(ast::ValueSymbol const &symbol) {
76
77 auto value = ValueInfo{.path = symbol.getHierarchicalPath(),
78 .location = symbol.location,
79 .drivers = {}};
80
81 auto drivers = analysisManager.getDrivers(symbol);
82 for (auto const *driver : drivers) {
83 value.drivers.emplace_back(driverPathToString(symbol, *driver),
84 driver->kind,
85 netlist::DriverBitRange(driver->getBounds()),
86 driver->getSourceRange().start());
87 }
88
89 values.emplace_back(std::move(value));
90 }
91};
92
93} // namespace slang::report
void report(FormatBuffer &buffer)
Renders the collected driver information to the given format buffer.
Definition ReportDrivers.hpp:50
ReportDrivers(ast::Compilation &compilation, analysis::AnalysisManager &analysisManager)
Definition ReportDrivers.hpp:45
void handle(ast::ValueSymbol const &symbol)
Definition ReportDrivers.hpp:75
Definition ReportDrivers.hpp:13
A range over which a symbol is driven.
Definition DriverBitRange.hpp:14
std::vector< Row > Table
Definition Utilities.hpp:33
static auto locationStr(ast::Compilation const &compilation, SourceLocation location)
Return a string representation of a slang SourceLocation.
Definition Utilities.hpp:21
static auto formatTable(FormatBuffer &buffer, const Row &header, const Table &rows, TableFormatConfig cfg={})
Format a table of data into the given format buffer.
Definition Utilities.hpp:44
std::vector< std::string > Row
Definition Utilities.hpp:32