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
31
84
86auto toString(OperationKind kind) -> std::string_view;
87
90auto toSymbol(OperationKind kind) -> std::string_view;
91
93auto operationKindFromString(std::string_view str)
94 -> std::optional<OperationKind>;
95
98class NetlistNode : public Node<NetlistNode, NetlistEdge> {
99 friend class NetlistBuilder;
100
101public:
102 size_t ID;
104
109 bool placeholder{false};
110
112 : ID(nextID.fetch_add(1, std::memory_order_relaxed)), kind(kind) {};
113
114 ~NetlistNode() override = default;
115
116 template <typename T> auto as() -> T & {
117 SLANG_ASSERT(T::isKind(kind));
118 return *(static_cast<T *>(this));
119 }
120
121 template <typename T> auto as() const -> const T & {
122 SLANG_ASSERT(T::isKind(kind));
123 return const_cast<T &>(*(static_cast<const T *>(this)));
124 }
125
126 virtual auto getHierarchicalPath() const -> std::optional<std::string_view> {
127 return std::nullopt;
128 }
129
130 virtual auto getBounds() const -> std::optional<DriverBitRange> {
131 return std::nullopt;
132 }
133
134 virtual auto getLocation() const -> std::optional<TextLocation> {
135 return std::nullopt;
136 }
137
138private:
139 static std::atomic<size_t> nextID;
140};
141
142class Port : public NetlistNode {
143public:
144 std::string name;
145 std::string hierarchicalPath;
147 ast::ArgumentDirection direction;
149
150 Port(std::string name, std::string hierarchicalPath, TextLocation location,
151 ast::ArgumentDirection direction, DriverBitRange bounds)
152 : NetlistNode(NodeKind::Port), name(std::move(name)),
154 direction(direction), bounds(std::move(bounds)) {}
155
156 static auto isKind(NodeKind otherKind) -> bool {
157 return otherKind == NodeKind::Port;
158 }
159
160 auto isInput() const { return direction == ast::ArgumentDirection::In; }
161 auto isOutput() const { return direction == ast::ArgumentDirection::Out; }
162
164 auto isDriven() const -> bool { return inDegree() > 0; }
165
166 auto getHierarchicalPath() const -> std::optional<std::string_view> override {
167 return hierarchicalPath;
168 }
169
170 auto getBounds() const -> std::optional<DriverBitRange> override {
171 return bounds;
172 }
173
174 auto getLocation() const -> std::optional<TextLocation> override {
175 return location;
176 }
177};
178
179class Variable : public NetlistNode {
180public:
181 std::string name;
182 std::string hierarchicalPath;
185
191
192 static auto isKind(NodeKind otherKind) -> bool {
193 return otherKind == NodeKind::Variable;
194 }
195
196 auto getHierarchicalPath() const -> std::optional<std::string_view> override {
197 return hierarchicalPath;
198 }
199
200 auto getBounds() const -> std::optional<DriverBitRange> override {
201 return bounds;
202 }
203
204 auto getLocation() const -> std::optional<TextLocation> override {
205 return location;
206 }
207};
208
209class State : public NetlistNode {
210public:
211 std::string name;
212 std::string hierarchicalPath;
215
218 : NetlistNode(NodeKind::State), name(std::move(name)),
220 bounds(std::move(bounds)) {}
221
222 static auto isKind(NodeKind otherKind) -> bool {
223 return otherKind == NodeKind::State;
224 }
225
226 auto getHierarchicalPath() const -> std::optional<std::string_view> override {
227 return hierarchicalPath;
228 }
229
230 auto getBounds() const -> std::optional<DriverBitRange> override {
231 return bounds;
232 }
233
234 auto getLocation() const -> std::optional<TextLocation> override {
235 return location;
236 }
237};
238
239class Assignment : public NetlistNode {
240public:
242
245
246 static auto isKind(NodeKind otherKind) -> bool {
247 return otherKind == NodeKind::Assignment;
248 }
249
250 auto getLocation() const -> std::optional<TextLocation> override {
251 return location;
252 }
253};
254
255class Conditional : public NetlistNode {
256public:
258
261
262 static auto isKind(NodeKind otherKind) -> bool {
263 return otherKind == NodeKind::Conditional;
264 }
265
266 auto getLocation() const -> std::optional<TextLocation> override {
267 return location;
268 }
269};
270
271class Case : public NetlistNode {
272public:
274
277
278 static auto isKind(NodeKind otherKind) -> bool {
279 return otherKind == NodeKind::Case;
280 }
281
282 auto getLocation() const -> std::optional<TextLocation> override {
283 return location;
284 }
285};
286
287class Merge : public NetlistNode {
288public:
290
291 static auto isKind(NodeKind otherKind) -> bool {
292 return otherKind == NodeKind::Merge;
293 }
294};
295
298class Constant : public NetlistNode {
299public:
300 ConstantValue value;
301 uint64_t width;
303
304 Constant(ConstantValue value, uint64_t width, TextLocation location)
307
308 static auto isKind(NodeKind otherKind) -> bool {
309 return otherKind == NodeKind::Constant;
310 }
311
312 auto getLocation() const -> std::optional<TextLocation> override {
313 return location;
314 }
315};
316
321class Operation : public NetlistNode {
322public:
324 uint64_t width;
327
332
333 static auto isKind(NodeKind otherKind) -> bool {
334 return otherKind == NodeKind::Operation;
335 }
336
337 auto getLocation() const -> std::optional<TextLocation> override {
338 return location;
339 }
340};
341
342} // namespace slang::netlist
Definition NetlistNode.hpp:239
Assignment(TextLocation location)
Definition NetlistNode.hpp:243
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:250
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:246
TextLocation location
Definition NetlistNode.hpp:241
Definition NetlistNode.hpp:271
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:282
TextLocation location
Definition NetlistNode.hpp:273
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:278
Case(TextLocation location)
Definition NetlistNode.hpp:275
Definition NetlistNode.hpp:255
Conditional(TextLocation location)
Definition NetlistNode.hpp:259
TextLocation location
Definition NetlistNode.hpp:257
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:266
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:262
Definition NetlistNode.hpp:298
ConstantValue value
Definition NetlistNode.hpp:300
TextLocation location
Definition NetlistNode.hpp:302
Constant(ConstantValue value, uint64_t width, TextLocation location)
Definition NetlistNode.hpp:304
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:308
uint64_t width
Definition NetlistNode.hpp:301
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:312
Definition NetlistNode.hpp:287
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:291
Merge()
Definition NetlistNode.hpp:289
~NetlistNode() override=default
bool placeholder
Definition NetlistNode.hpp:109
friend class NetlistBuilder
Definition NetlistNode.hpp:99
NodeKind kind
Definition NetlistNode.hpp:103
size_t ID
Definition NetlistNode.hpp:102
virtual auto getHierarchicalPath() const -> std::optional< std::string_view >
Definition NetlistNode.hpp:126
virtual auto getBounds() const -> std::optional< DriverBitRange >
Definition NetlistNode.hpp:130
auto as() -> T &
Definition NetlistNode.hpp:116
virtual auto getLocation() const -> std::optional< TextLocation >
Definition NetlistNode.hpp:134
auto as() const -> const T &
Definition NetlistNode.hpp:121
NetlistNode(NodeKind kind)
Definition NetlistNode.hpp:111
auto inDegree() const -> size_t
Definition DirectedGraph.hpp:271
Definition NetlistNode.hpp:321
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:333
bool isSigned
Definition NetlistNode.hpp:325
uint64_t width
Definition NetlistNode.hpp:324
TextLocation location
Definition NetlistNode.hpp:326
OperationKind op
Definition NetlistNode.hpp:323
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:337
Operation(OperationKind op, uint64_t width, bool isSigned, TextLocation location)
Definition NetlistNode.hpp:328
Definition NetlistNode.hpp:142
ast::ArgumentDirection direction
Definition NetlistNode.hpp:147
auto getBounds() const -> std::optional< DriverBitRange > override
Definition NetlistNode.hpp:170
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:156
auto isInput() const
Definition NetlistNode.hpp:160
std::string name
Definition NetlistNode.hpp:144
DriverBitRange bounds
Definition NetlistNode.hpp:148
auto isDriven() const -> bool
Return true if any other node drives this port.
Definition NetlistNode.hpp:164
auto getHierarchicalPath() const -> std::optional< std::string_view > override
Definition NetlistNode.hpp:166
auto isOutput() const
Definition NetlistNode.hpp:161
std::string hierarchicalPath
Definition NetlistNode.hpp:145
TextLocation location
Definition NetlistNode.hpp:146
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:174
Port(std::string name, std::string hierarchicalPath, TextLocation location, ast::ArgumentDirection direction, DriverBitRange bounds)
Definition NetlistNode.hpp:150
Definition NetlistNode.hpp:209
std::string name
Definition NetlistNode.hpp:211
State(std::string name, std::string hierarchicalPath, TextLocation location, DriverBitRange bounds)
Definition NetlistNode.hpp:216
std::string hierarchicalPath
Definition NetlistNode.hpp:212
TextLocation location
Definition NetlistNode.hpp:213
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:222
DriverBitRange bounds
Definition NetlistNode.hpp:214
auto getHierarchicalPath() const -> std::optional< std::string_view > override
Definition NetlistNode.hpp:226
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:234
auto getBounds() const -> std::optional< DriverBitRange > override
Definition NetlistNode.hpp:230
Definition NetlistNode.hpp:179
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:204
auto getBounds() const -> std::optional< DriverBitRange > override
Definition NetlistNode.hpp:200
auto getHierarchicalPath() const -> std::optional< std::string_view > override
Definition NetlistNode.hpp:196
std::string name
Definition NetlistNode.hpp:181
Variable(std::string name, std::string hierarchicalPath, TextLocation location, DriverBitRange bounds)
Definition NetlistNode.hpp:186
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:192
std::string hierarchicalPath
Definition NetlistNode.hpp:182
DriverBitRange bounds
Definition NetlistNode.hpp:184
TextLocation location
Definition NetlistNode.hpp:183
Definition FormatBuffer.hpp:9
auto operationKindFromString(std::string_view str) -> std::optional< OperationKind >
The operation kind named by str, or nullopt if it names none.
auto toSymbol(OperationKind kind) -> std::string_view
OperationKind
Definition NetlistNode.hpp:35
@ UnaryPlus
Definition NetlistNode.hpp:37
@ Divide
Definition NetlistNode.hpp:51
@ LogicalAnd
Definition NetlistNode.hpp:72
@ CaseInequality
Definition NetlistNode.hpp:63
@ LogicalShiftRight
Definition NetlistNode.hpp:78
@ WildcardEquality
Definition NetlistNode.hpp:64
@ LogicalEquivalence
Definition NetlistNode.hpp:75
@ Subtract
Definition NetlistNode.hpp:49
@ LessThanEqual
Definition NetlistNode.hpp:70
@ LogicalNot
Definition NetlistNode.hpp:40
@ BitwiseXnor
Definition NetlistNode.hpp:58
@ ReductionOr
Definition NetlistNode.hpp:42
@ GreaterThanEqual
Definition NetlistNode.hpp:68
@ BitwiseAnd
Definition NetlistNode.hpp:55
@ LogicalOr
Definition NetlistNode.hpp:73
@ WildcardInequality
Definition NetlistNode.hpp:65
@ Mod
Definition NetlistNode.hpp:52
@ BitwiseOr
Definition NetlistNode.hpp:56
@ ReductionNand
Definition NetlistNode.hpp:44
@ Inequality
Definition NetlistNode.hpp:61
@ UnaryMinus
Definition NetlistNode.hpp:38
@ Equality
Definition NetlistNode.hpp:60
@ LogicalShiftLeft
Definition NetlistNode.hpp:77
@ CaseEquality
Definition NetlistNode.hpp:62
@ ArithmeticShiftRight
Definition NetlistNode.hpp:80
@ ArithmeticShiftLeft
Definition NetlistNode.hpp:79
@ LessThan
Definition NetlistNode.hpp:69
@ BitwiseNot
Definition NetlistNode.hpp:39
@ BitwiseXor
Definition NetlistNode.hpp:57
@ Power
Definition NetlistNode.hpp:53
@ ReductionXnor
Definition NetlistNode.hpp:46
@ ReductionNor
Definition NetlistNode.hpp:45
@ Multiply
Definition NetlistNode.hpp:50
@ ReductionXor
Definition NetlistNode.hpp:43
@ ReductionAnd
Definition NetlistNode.hpp:41
@ Add
Definition NetlistNode.hpp:48
@ LogicalImplication
Definition NetlistNode.hpp:74
@ GreaterThan
Definition NetlistNode.hpp:67
NodeKind
Definition NetlistNode.hpp:19
@ Case
Definition NetlistNode.hpp:25
@ Operation
Definition NetlistNode.hpp:29
@ 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