slang-netlist  0.12.0
Loading...
Searching...
No Matches
NetlistNode.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <atomic>
4#include <optional>
5#include <string>
6#include <string_view>
7#include <utility>
8
13
14#include "slang/ast/SemanticFacts.h"
15#include "slang/numeric/ConstantValue.h"
16
17namespace slang::netlist {
18
30
33class NetlistNode : public Node<NetlistNode, NetlistEdge> {
34 friend class NetlistBuilder;
35
36public:
37 size_t ID;
39
44 bool placeholder{false};
45
47 : ID(nextID.fetch_add(1, std::memory_order_relaxed)), kind(kind) {};
48
49 ~NetlistNode() override = default;
50
51 template <typename T> auto as() -> T & {
52 SLANG_ASSERT(T::isKind(kind));
53 return *(static_cast<T *>(this));
54 }
55
56 template <typename T> auto as() const -> const T & {
57 SLANG_ASSERT(T::isKind(kind));
58 return const_cast<T &>(*(static_cast<const T *>(this)));
59 }
60
61 virtual auto getHierarchicalPath() const -> std::optional<std::string_view> {
62 return std::nullopt;
63 }
64
65 virtual auto getBounds() const -> std::optional<DriverBitRange> {
66 return std::nullopt;
67 }
68
69 virtual auto getLocation() const -> std::optional<TextLocation> {
70 return std::nullopt;
71 }
72
73private:
74 static std::atomic<size_t> nextID;
75};
76
77class Port : public NetlistNode {
78public:
79 std::string name;
80 std::string hierarchicalPath;
82 ast::ArgumentDirection direction;
84
85 Port(std::string name, std::string hierarchicalPath, TextLocation location,
86 ast::ArgumentDirection direction, DriverBitRange bounds)
87 : NetlistNode(NodeKind::Port), name(std::move(name)),
89 direction(direction), bounds(std::move(bounds)) {}
90
91 static auto isKind(NodeKind otherKind) -> bool {
92 return otherKind == NodeKind::Port;
93 }
94
95 auto isInput() const { return direction == ast::ArgumentDirection::In; }
96 auto isOutput() const { return direction == ast::ArgumentDirection::Out; }
97
99 auto isDriven() const -> bool { return inDegree() > 0; }
100
101 auto getHierarchicalPath() const -> std::optional<std::string_view> override {
102 return hierarchicalPath;
103 }
104
105 auto getBounds() const -> std::optional<DriverBitRange> override {
106 return bounds;
107 }
108
109 auto getLocation() const -> std::optional<TextLocation> override {
110 return location;
111 }
112};
113
114class Variable : public NetlistNode {
115public:
116 std::string name;
117 std::string hierarchicalPath;
120
126
127 static auto isKind(NodeKind otherKind) -> bool {
128 return otherKind == NodeKind::Variable;
129 }
130
131 auto getHierarchicalPath() const -> std::optional<std::string_view> override {
132 return hierarchicalPath;
133 }
134
135 auto getBounds() const -> std::optional<DriverBitRange> override {
136 return bounds;
137 }
138
139 auto getLocation() const -> std::optional<TextLocation> override {
140 return location;
141 }
142};
143
144class State : public NetlistNode {
145public:
146 std::string name;
147 std::string hierarchicalPath;
150
153 : NetlistNode(NodeKind::State), name(std::move(name)),
155 bounds(std::move(bounds)) {}
156
157 static auto isKind(NodeKind otherKind) -> bool {
158 return otherKind == NodeKind::State;
159 }
160
161 auto getHierarchicalPath() const -> std::optional<std::string_view> override {
162 return hierarchicalPath;
163 }
164
165 auto getBounds() const -> std::optional<DriverBitRange> override {
166 return bounds;
167 }
168
169 auto getLocation() const -> std::optional<TextLocation> override {
170 return location;
171 }
172};
173
174class Assignment : public NetlistNode {
175public:
177
180
181 static auto isKind(NodeKind otherKind) -> bool {
182 return otherKind == NodeKind::Assignment;
183 }
184
185 auto getLocation() const -> std::optional<TextLocation> override {
186 return location;
187 }
188};
189
190class Conditional : public NetlistNode {
191public:
193
196
197 static auto isKind(NodeKind otherKind) -> bool {
198 return otherKind == NodeKind::Conditional;
199 }
200
201 auto getLocation() const -> std::optional<TextLocation> override {
202 return location;
203 }
204};
205
206class Case : public NetlistNode {
207public:
209
212
213 static auto isKind(NodeKind otherKind) -> bool {
214 return otherKind == NodeKind::Case;
215 }
216
217 auto getLocation() const -> std::optional<TextLocation> override {
218 return location;
219 }
220};
221
222class Merge : public NetlistNode {
223public:
225
226 static auto isKind(NodeKind otherKind) -> bool {
227 return otherKind == NodeKind::Merge;
228 }
229};
230
233class Constant : public NetlistNode {
234public:
235 ConstantValue value;
236 uint64_t width;
238
239 Constant(ConstantValue value, uint64_t width, TextLocation location)
242
243 static auto isKind(NodeKind otherKind) -> bool {
244 return otherKind == NodeKind::Constant;
245 }
246
247 auto getLocation() const -> std::optional<TextLocation> override {
248 return location;
249 }
250};
251
252} // namespace slang::netlist
Definition NetlistNode.hpp:174
Assignment(TextLocation location)
Definition NetlistNode.hpp:178
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:185
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:181
TextLocation location
Definition NetlistNode.hpp:176
Definition NetlistNode.hpp:206
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:217
TextLocation location
Definition NetlistNode.hpp:208
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:213
Case(TextLocation location)
Definition NetlistNode.hpp:210
Definition NetlistNode.hpp:190
Conditional(TextLocation location)
Definition NetlistNode.hpp:194
TextLocation location
Definition NetlistNode.hpp:192
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:201
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:197
Definition NetlistNode.hpp:233
ConstantValue value
Definition NetlistNode.hpp:235
TextLocation location
Definition NetlistNode.hpp:237
Constant(ConstantValue value, uint64_t width, TextLocation location)
Definition NetlistNode.hpp:239
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:243
uint64_t width
Definition NetlistNode.hpp:236
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:247
Definition NetlistNode.hpp:222
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:226
Merge()
Definition NetlistNode.hpp:224
~NetlistNode() override=default
bool placeholder
Definition NetlistNode.hpp:44
friend class NetlistBuilder
Definition NetlistNode.hpp:34
NodeKind kind
Definition NetlistNode.hpp:38
size_t ID
Definition NetlistNode.hpp:37
virtual auto getHierarchicalPath() const -> std::optional< std::string_view >
Definition NetlistNode.hpp:61
virtual auto getBounds() const -> std::optional< DriverBitRange >
Definition NetlistNode.hpp:65
auto as() -> T &
Definition NetlistNode.hpp:51
virtual auto getLocation() const -> std::optional< TextLocation >
Definition NetlistNode.hpp:69
auto as() const -> const T &
Definition NetlistNode.hpp:56
NetlistNode(NodeKind kind)
Definition NetlistNode.hpp:46
auto inDegree() const -> size_t
Definition DirectedGraph.hpp:271
Definition NetlistNode.hpp:77
ast::ArgumentDirection direction
Definition NetlistNode.hpp:82
auto getBounds() const -> std::optional< DriverBitRange > override
Definition NetlistNode.hpp:105
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:91
auto isInput() const
Definition NetlistNode.hpp:95
std::string name
Definition NetlistNode.hpp:79
DriverBitRange bounds
Definition NetlistNode.hpp:83
auto isDriven() const -> bool
Return true if any other node drives this port.
Definition NetlistNode.hpp:99
auto getHierarchicalPath() const -> std::optional< std::string_view > override
Definition NetlistNode.hpp:101
auto isOutput() const
Definition NetlistNode.hpp:96
std::string hierarchicalPath
Definition NetlistNode.hpp:80
TextLocation location
Definition NetlistNode.hpp:81
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:109
Port(std::string name, std::string hierarchicalPath, TextLocation location, ast::ArgumentDirection direction, DriverBitRange bounds)
Definition NetlistNode.hpp:85
Definition NetlistNode.hpp:144
std::string name
Definition NetlistNode.hpp:146
State(std::string name, std::string hierarchicalPath, TextLocation location, DriverBitRange bounds)
Definition NetlistNode.hpp:151
std::string hierarchicalPath
Definition NetlistNode.hpp:147
TextLocation location
Definition NetlistNode.hpp:148
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:157
DriverBitRange bounds
Definition NetlistNode.hpp:149
auto getHierarchicalPath() const -> std::optional< std::string_view > override
Definition NetlistNode.hpp:161
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:169
auto getBounds() const -> std::optional< DriverBitRange > override
Definition NetlistNode.hpp:165
Definition NetlistNode.hpp:114
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:139
auto getBounds() const -> std::optional< DriverBitRange > override
Definition NetlistNode.hpp:135
auto getHierarchicalPath() const -> std::optional< std::string_view > override
Definition NetlistNode.hpp:131
std::string name
Definition NetlistNode.hpp:116
Variable(std::string name, std::string hierarchicalPath, TextLocation location, DriverBitRange bounds)
Definition NetlistNode.hpp:121
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:127
std::string hierarchicalPath
Definition NetlistNode.hpp:117
DriverBitRange bounds
Definition NetlistNode.hpp:119
TextLocation location
Definition NetlistNode.hpp:118
Definition FormatBuffer.hpp:9
NodeKind
Definition NetlistNode.hpp:19
@ Case
Definition NetlistNode.hpp:25
@ State
Definition NetlistNode.hpp:27
@ Variable
Definition NetlistNode.hpp:22
@ Port
Definition NetlistNode.hpp:21
@ Merge
Definition NetlistNode.hpp:26
@ None
Definition NetlistNode.hpp:20
@ Conditional
Definition NetlistNode.hpp:24
@ Constant
Definition NetlistNode.hpp:28
@ Assignment
Definition NetlistNode.hpp:23
A range over which a symbol is driven.
Definition DriverBitRange.hpp:14
Definition TextLocation.hpp:71