18 renderImpl(
netlist, buffer,
nullptr);
25 std::unordered_set<NetlistNode const *>
const &nodes) {
26 renderImpl(
netlist, buffer, &nodes);
33 static auto escapeLabel(std::string_view text) -> std::string {
34 constexpr std::string_view metacharacters =
"|<>{}\"\\";
36 result.reserve(text.size());
38 if (metacharacters.find(c) != std::string_view::npos) {
39 result.push_back(
'\\');
46 static void writeNode(FormatBuffer &buffer, NetlistNode
const &node) {
49 auto const &portNode = node.as<
Port>();
50 buffer.format(
" N{} [label=\"{} port {}\"]\n", node.ID,
51 toString(portNode.direction), escapeLabel(portNode.name));
55 auto const &varNode = node.as<
Variable>();
56 buffer.format(
" N{} [label=\"Variable {}\"]\n", node.ID,
57 escapeLabel(varNode.name));
61 buffer.format(
" N{} [label=\"Assignment\"]\n", node.ID);
65 buffer.format(
" N{} [label=\"Case\"]\n", node.ID);
69 buffer.format(
" N{} [label=\"Conditional\"]\n", node.ID);
73 buffer.format(
" N{} [label=\"Merge\"]\n", node.ID);
77 auto const &state = node.as<
State>();
78 buffer.format(
" N{} [label=\"{} {}\"]\n", node.ID,
79 escapeLabel(state.name),
toString(state.bounds));
83 auto const &constNode = node.as<
Constant>();
84 buffer.format(
" N{} [label=\"Const {}\"]\n", node.ID,
85 escapeLabel(constNode.value.toString()));
89 auto const &opNode = node.as<
Operation>();
92 buffer.format(
" N{} [label=\"Op {} [{}]\"]\n", node.ID,
93 escapeLabel(
toString(opNode.op)), opNode.width);
102 renderImpl(NetlistGraph
const &netlist, FormatBuffer &buffer,
103 std::unordered_set<NetlistNode const *>
const *filter) {
104 auto included = [&](NetlistNode
const &node) {
105 return filter ==
nullptr || filter->count(&node) != 0;
108 buffer.append(
"digraph {\n");
109 buffer.append(
" node [shape=record];\n");
110 for (
auto const &node : netlist) {
111 if (!included(*node)) {
114 writeNode(buffer, *node);
116 for (
auto const &node : netlist) {
117 if (!included(*node)) {
120 for (
auto const &edge : node->getOutEdges()) {
121 if (edge->disabled) {
124 if (!included(edge->getTargetNode())) {
127 if (edge->symbol !=
nullptr && !edge->symbol->empty()) {
128 buffer.format(
" N{} -> N{} [label=\"{}{}\"]\n", node->ID,
129 edge->getTargetNode().ID,
130 escapeLabel(edge->symbol->name),
133 buffer.format(
" N{} -> N{}\n", node->ID, edge->getTargetNode().ID);
137 buffer.append(
"}\n");
static auto render(NetlistGraph const &netlist, FormatBuffer &buffer)
Render the whole netlist graph.
Definition NetlistDot.hpp:17
static auto render(NetlistGraph const &netlist, FormatBuffer &buffer, std::unordered_set< NetlistNode const * > const &nodes)
Definition NetlistDot.hpp:24