39 #include <unordered_map>
40 #include <unordered_set>
74 using identifier_t = std::string;
75 using ranged_identifier_t = std::pair<std::string, std::vector<std::vector<u32>>>;
76 using numeral_t = std::vector<BooleanFunction::Value>;
77 using empty_t = std::monostate;
78 using assignment_t = std::variant<identifier_t, ranged_identifier_t, numeral_t, empty_t>;
83 struct VerilogDataEntry
86 std::string m_type =
"unknown";
87 std::string m_value =
"";
88 std::optional<Parameter> m_parameter;
97 std::vector<std::vector<u32>> m_ranges;
98 std::vector<VerilogDataEntry> m_attributes;
99 std::vector<std::string> m_expanded_names;
107 std::string m_identifier;
112 std::vector<assignment_t> m_expression_parts;
114 std::vector<std::vector<u32>> m_ranges;
115 std::vector<std::string> m_expanded_identifiers;
121 struct VerilogPortAssignment
123 std::optional<std::string> m_port_name;
124 std::vector<assignment_t> m_assignment;
130 struct VerilogAssignment
132 std::vector<assignment_t> m_variable;
133 std::vector<assignment_t> m_assignment;
139 struct VerilogInstance
143 bool m_is_module =
false;
144 std::vector<VerilogPortAssignment> m_port_assignments;
145 std::vector<VerilogDataEntry> m_parameters;
146 std::vector<VerilogDataEntry> m_attributes;
147 std::vector<std::pair<std::string, std::string>> m_expanded_port_assignments;
156 VerilogModule() =
default;
157 ~VerilogModule() =
default;
165 bool operator<(
const VerilogModule& other)
const
167 return m_name < other.m_name;
173 std::vector<VerilogDataEntry> m_attributes;
176 std::vector<std::unique_ptr<VerilogPort>> m_ports;
177 std::map<std::string, VerilogPort*> m_ports_by_identifier;
178 std::map<std::string, VerilogPort*> m_ports_by_expression;
179 std::map<std::string, std::string> m_expanded_port_identifiers_to_expressions;
182 std::vector<std::unique_ptr<VerilogSignal>> m_signals;
183 std::map<std::string, VerilogSignal*> m_signals_by_name;
186 std::vector<VerilogAssignment> m_assignments;
187 std::vector<std::pair<std::string, std::string>> m_expanded_assignments;
190 std::vector<std::unique_ptr<VerilogInstance>> m_instances;
191 std::map<std::string, VerilogInstance*> m_instances_by_name;
194 std::stringstream m_fs;
195 std::filesystem::path m_path;
198 Netlist* m_netlist =
nullptr;
201 std::vector<std::unique_ptr<VerilogModule>> m_modules;
202 std::unordered_map<std::string, VerilogModule*> m_modules_by_name;
203 std::string m_last_module;
206 TokenStream<std::string> m_token_stream;
209 std::unordered_map<std::string, GateType*> m_gate_types;
210 std::unordered_map<std::string, GateType*> m_vcc_gate_types;
211 std::unordered_map<std::string, GateType*> m_gnd_gate_types;
212 std::unordered_map<Net*, std::vector<std::pair<Module*, u32>>> m_module_port_by_net;
213 std::unordered_map<Module*, std::vector<std::tuple<std::string, Net*>>> m_module_ports;
216 std::unordered_map<std::string, u32> m_module_instantiation_count;
217 std::unordered_map<std::string, u32> m_instance_name_occurences;
218 std::unordered_map<std::string, u32> m_net_name_occurences;
223 std::unordered_map<std::string, Net*> m_net_by_name;
224 std::vector<std::pair<std::string, std::string>> m_nets_to_merge;
227 const std::string instance_name_seperator =
"/";
231 Result<std::monostate> parse_tokens();
232 Result<std::monostate> parse_module(std::vector<VerilogDataEntry>& attributes);
233 Result<std::monostate> parse_port_list(VerilogModule*
module);
234 Result<std::monostate> parse_port_declaration_list(VerilogModule*
module);
235 Result<std::monostate> parse_port_definition(VerilogModule*
module, std::vector<VerilogDataEntry>& attributes);
236 Result<std::monostate> parse_signal_definition(VerilogModule*
module, std::vector<VerilogDataEntry>& attributes);
237 Result<std::monostate> parse_assignment(VerilogModule*
module);
238 Result<std::monostate> parse_defparam(VerilogModule*
module);
239 void parse_attribute(std::vector<VerilogDataEntry>& attributes);
240 Result<std::monostate> parse_instance(VerilogModule*
module, std::vector<VerilogDataEntry>& attributes);
241 Result<std::monostate> parse_port_assign(VerilogInstance*
instance);
242 Result<std::vector<VerilogDataEntry>> parse_parameter_assign();
245 Result<std::monostate> construct_netlist(VerilogModule* top_module);
247 instantiate_module(
const std::string& instance_name, VerilogModule* verilog_module, Module* parent,
const std::unordered_map<std::string, std::string>& parent_module_assignments);
250 std::string get_unique_alias(
const std::string& parent_name,
const std::string&
name,
const std::unordered_map<std::string, u32>& name_occurences)
const;
251 std::vector<u32> parse_range(TokenStream<std::string>& stream)
const;
252 void expand_ranges_recursively(std::vector<std::string>& expanded_names,
const std::string& current_name,
const std::vector<std::vector<u32>>& ranges,
u32 dimension)
const;
253 std::vector<std::string> expand_ranges(
const std::string&
name,
const std::vector<std::vector<u32>>& ranges)
const;
254 Result<std::vector<BooleanFunction::Value>> get_binary_vector(std::string value)
const;
255 Result<std::string> get_hex_from_literal(
const Token<std::string>& value_token)
const;
256 Result<std::pair<Parameter, std::string>> parse_parameter_value(
const std::string&
name,
const Token<std::string>& value_token)
const;
257 Result<std::vector<VerilogParser::assignment_t>> parse_assignment_expression(TokenStream<std::string>&& stream)
const;
258 std::vector<std::string> expand_assignment_expression(VerilogModule* verilog_module,
const std::vector<assignment_t>& vars)
const;
const Module * module(const Gate *g, const NodeBoxes &boxes)
std::unique_ptr< GateLibrary > parse(std::filesystem::path file_path)
std::unique_ptr< BasePluginInterface > instance