slang-netlist  0.9.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
41 : ID(nextID.fetch_add(1, std::memory_order_relaxed)), kind(kind) {};
42
43 ~NetlistNode() override = default;
44
45 template <typename T> auto as() -> T & {
46 SLANG_ASSERT(T::isKind(kind));
47 return *(static_cast<T *>(this));
48 }
49
50 template <typename T> auto as() const -> const T & {
51 SLANG_ASSERT(T::isKind(kind));
52 return const_cast<T &>(*(static_cast<const T *>(this)));
53 }
54
55 virtual auto getHierarchicalPath() const -> std::optional<std::string_view> {
56 return std::nullopt;
57 }
58
59 virtual auto getBounds() const -> std::optional<DriverBitRange> {
60 return std::nullopt;
61 }
62
63 virtual auto getLocation() const -> std::optional<TextLocation> {
64 return std::nullopt;
65 }
66
67private:
68 static std::atomic<size_t> nextID;
69};
70
71class Port : public NetlistNode {
72public:
73 std::string name;
74 std::string hierarchicalPath;
76 ast::ArgumentDirection direction;
78
79 Port(std::string name, std::string hierarchicalPath, TextLocation location,
80 ast::ArgumentDirection direction, DriverBitRange bounds)
81 : NetlistNode(NodeKind::Port), name(std::move(name)),
83 direction(direction), bounds(std::move(bounds)) {}
84
85 static auto isKind(NodeKind otherKind) -> bool {
86 return otherKind == NodeKind::Port;
87 }
88
89 auto isInput() const { return direction == ast::ArgumentDirection::In; }
90 auto isOutput() const { return direction == ast::ArgumentDirection::Out; }
91
93 auto isDriven() const -> bool { return inDegree() > 0; }
94
95 auto getHierarchicalPath() const -> std::optional<std::string_view> override {
96 return hierarchicalPath;
97 }
98
99 auto getBounds() const -> std::optional<DriverBitRange> override {
100 return bounds;
101 }
102
103 auto getLocation() const -> std::optional<TextLocation> override {
104 return location;
105 }
106};
107
108class Variable : public NetlistNode {
109public:
110 std::string name;
111 std::string hierarchicalPath;
114
120
121 static auto isKind(NodeKind otherKind) -> bool {
122 return otherKind == NodeKind::Variable;
123 }
124
125 auto getHierarchicalPath() const -> std::optional<std::string_view> override {
126 return hierarchicalPath;
127 }
128
129 auto getBounds() const -> std::optional<DriverBitRange> override {
130 return bounds;
131 }
132
133 auto getLocation() const -> std::optional<TextLocation> override {
134 return location;
135 }
136};
137
138class State : public NetlistNode {
139public:
140 std::string name;
141 std::string hierarchicalPath;
144
147 : NetlistNode(NodeKind::State), name(std::move(name)),
149 bounds(std::move(bounds)) {}
150
151 static auto isKind(NodeKind otherKind) -> bool {
152 return otherKind == NodeKind::State;
153 }
154
155 auto getHierarchicalPath() const -> std::optional<std::string_view> override {
156 return hierarchicalPath;
157 }
158
159 auto getBounds() const -> std::optional<DriverBitRange> override {
160 return bounds;
161 }
162
163 auto getLocation() const -> std::optional<TextLocation> override {
164 return location;
165 }
166};
167
168class Assignment : public NetlistNode {
169public:
171
174
175 static auto isKind(NodeKind otherKind) -> bool {
176 return otherKind == NodeKind::Assignment;
177 }
178
179 auto getLocation() const -> std::optional<TextLocation> override {
180 return location;
181 }
182};
183
184class Conditional : public NetlistNode {
185public:
187
190
191 static auto isKind(NodeKind otherKind) -> bool {
192 return otherKind == NodeKind::Conditional;
193 }
194
195 auto getLocation() const -> std::optional<TextLocation> override {
196 return location;
197 }
198};
199
200class Case : public NetlistNode {
201public:
203
206
207 static auto isKind(NodeKind otherKind) -> bool {
208 return otherKind == NodeKind::Case;
209 }
210
211 auto getLocation() const -> std::optional<TextLocation> override {
212 return location;
213 }
214};
215
216class Merge : public NetlistNode {
217public:
219
220 static auto isKind(NodeKind otherKind) -> bool {
221 return otherKind == NodeKind::Merge;
222 }
223};
224
227class Constant : public NetlistNode {
228public:
229 ConstantValue value;
230 uint64_t width;
232
233 Constant(ConstantValue value, uint64_t width, TextLocation location)
236
237 static auto isKind(NodeKind otherKind) -> bool {
238 return otherKind == NodeKind::Constant;
239 }
240
241 auto getLocation() const -> std::optional<TextLocation> override {
242 return location;
243 }
244};
245
246} // namespace slang::netlist
Definition NetlistNode.hpp:168
Assignment(TextLocation location)
Definition NetlistNode.hpp:172
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:179
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:175
TextLocation location
Definition NetlistNode.hpp:170
Definition NetlistNode.hpp:200
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:211
TextLocation location
Definition NetlistNode.hpp:202
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:207
Case(TextLocation location)
Definition NetlistNode.hpp:204
Definition NetlistNode.hpp:184
Conditional(TextLocation location)
Definition NetlistNode.hpp:188
TextLocation location
Definition NetlistNode.hpp:186
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:195
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:191
Definition NetlistNode.hpp:227
ConstantValue value
Definition NetlistNode.hpp:229
TextLocation location
Definition NetlistNode.hpp:231
Constant(ConstantValue value, uint64_t width, TextLocation location)
Definition NetlistNode.hpp:233
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:237
uint64_t width
Definition NetlistNode.hpp:230
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:241
Definition NetlistNode.hpp:216
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:220
Merge()
Definition NetlistNode.hpp:218
~NetlistNode() override=default
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:55
virtual auto getBounds() const -> std::optional< DriverBitRange >
Definition NetlistNode.hpp:59
auto as() -> T &
Definition NetlistNode.hpp:45
virtual auto getLocation() const -> std::optional< TextLocation >
Definition NetlistNode.hpp:63
auto as() const -> const T &
Definition NetlistNode.hpp:50
NetlistNode(NodeKind kind)
Definition NetlistNode.hpp:40
auto inDegree() const -> size_t
Definition DirectedGraph.hpp:259
Definition NetlistNode.hpp:71
ast::ArgumentDirection direction
Definition NetlistNode.hpp:76
auto getBounds() const -> std::optional< DriverBitRange > override
Definition NetlistNode.hpp:99
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:85
auto isInput() const
Definition NetlistNode.hpp:89
std::string name
Definition NetlistNode.hpp:73
DriverBitRange bounds
Definition NetlistNode.hpp:77
auto isDriven() const -> bool
Return true if any other node drives this port.
Definition NetlistNode.hpp:93
auto getHierarchicalPath() const -> std::optional< std::string_view > override
Definition NetlistNode.hpp:95
auto isOutput() const
Definition NetlistNode.hpp:90
std::string hierarchicalPath
Definition NetlistNode.hpp:74
TextLocation location
Definition NetlistNode.hpp:75
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:103
Port(std::string name, std::string hierarchicalPath, TextLocation location, ast::ArgumentDirection direction, DriverBitRange bounds)
Definition NetlistNode.hpp:79
Definition NetlistNode.hpp:138
std::string name
Definition NetlistNode.hpp:140
State(std::string name, std::string hierarchicalPath, TextLocation location, DriverBitRange bounds)
Definition NetlistNode.hpp:145
std::string hierarchicalPath
Definition NetlistNode.hpp:141
TextLocation location
Definition NetlistNode.hpp:142
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:151
DriverBitRange bounds
Definition NetlistNode.hpp:143
auto getHierarchicalPath() const -> std::optional< std::string_view > override
Definition NetlistNode.hpp:155
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:163
auto getBounds() const -> std::optional< DriverBitRange > override
Definition NetlistNode.hpp:159
Definition NetlistNode.hpp:108
auto getLocation() const -> std::optional< TextLocation > override
Definition NetlistNode.hpp:133
auto getBounds() const -> std::optional< DriverBitRange > override
Definition NetlistNode.hpp:129
auto getHierarchicalPath() const -> std::optional< std::string_view > override
Definition NetlistNode.hpp:125
std::string name
Definition NetlistNode.hpp:110
Variable(std::string name, std::string hierarchicalPath, TextLocation location, DriverBitRange bounds)
Definition NetlistNode.hpp:115
static auto isKind(NodeKind otherKind) -> bool
Definition NetlistNode.hpp:121
std::string hierarchicalPath
Definition NetlistNode.hpp:111
DriverBitRange bounds
Definition NetlistNode.hpp:113
TextLocation location
Definition NetlistNode.hpp:112
Definition Utilities.hpp:16
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