38 #include <unordered_map>
39 #include <unordered_set>
73 using identifier_t = std::string;
74 using ranged_identifier_t = std::pair<std::string, std::vector<std::vector<u32>>>;
75 using numeral_t = std::vector<BooleanFunction::Value>;
76 using empty_t = std::monostate;
77 using assignment_t = std::variant<identifier_t, ranged_identifier_t, numeral_t, empty_t>;
82 struct VerilogDataEntry
85 std::string m_type =
"unknown";
86 std::string m_value =
"";
95 std::vector<std::vector<u32>> m_ranges;
96 std::vector<VerilogDataEntry> m_attributes;
97 std::vector<std::string> m_expanded_names;
105 std::string m_identifier;
110 std::vector<assignment_t> m_expression_parts;
112 std::vector<std::vector<u32>> m_ranges;
113 std::vector<std::string> m_expanded_identifiers;
119 struct VerilogPortAssignment
121 std::optional<std::string> m_port_name;
122 std::vector<assignment_t> m_assignment;
128 struct VerilogAssignment
130 std::vector<assignment_t> m_variable;
131 std::vector<assignment_t> m_assignment;
137 struct VerilogInstance
141 bool m_is_module =
false;
142 std::vector<VerilogPortAssignment> m_port_assignments;
143 std::vector<VerilogDataEntry> m_parameters;
144 std::vector<VerilogDataEntry> m_attributes;
145 std::vector<std::pair<std::string, std::string>> m_expanded_port_assignments;
154 VerilogModule() =
default;
155 ~VerilogModule() =
default;
163 bool operator<(
const VerilogModule& other)
const
165 return m_name < other.m_name;
171 std::vector<VerilogDataEntry> m_attributes;
174 std::vector<std::unique_ptr<VerilogPort>> m_ports;
175 std::map<std::string, VerilogPort*> m_ports_by_identifier;
176 std::map<std::string, VerilogPort*> m_ports_by_expression;
177 std::map<std::string, std::string> m_expanded_port_identifiers_to_expressions;
180 std::vector<std::unique_ptr<VerilogSignal>> m_signals;
181 std::map<std::string, VerilogSignal*> m_signals_by_name;
184 std::vector<VerilogAssignment> m_assignments;
185 std::vector<std::pair<std::string, std::string>> m_expanded_assignments;
188 std::vector<std::unique_ptr<VerilogInstance>> m_instances;
189 std::map<std::string, VerilogInstance*> m_instances_by_name;
192 std::stringstream m_fs;
193 std::filesystem::path m_path;
196 Netlist* m_netlist =
nullptr;
199 std::vector<std::unique_ptr<VerilogModule>> m_modules;
200 std::unordered_map<std::string, VerilogModule*> m_modules_by_name;
201 std::string m_last_module;
204 TokenStream<std::string> m_token_stream;
207 std::unordered_map<std::string, GateType*> m_gate_types;
208 std::unordered_map<std::string, GateType*> m_vcc_gate_types;
209 std::unordered_map<std::string, GateType*> m_gnd_gate_types;
210 std::unordered_map<Net*, std::vector<std::pair<Module*, u32>>> m_module_port_by_net;
211 std::unordered_map<Module*, std::vector<std::tuple<std::string, Net*>>> m_module_ports;
214 std::unordered_map<std::string, u32> m_module_instantiation_count;
215 std::unordered_map<std::string, u32> m_instance_name_occurences;
216 std::unordered_map<std::string, u32> m_net_name_occurences;
221 std::unordered_map<std::string, Net*> m_net_by_name;
222 std::vector<std::pair<std::string, std::string>> m_nets_to_merge;
225 const std::string instance_name_seperator =
"/";
229 Result<std::monostate> parse_tokens();
230 Result<std::monostate> parse_module(std::vector<VerilogDataEntry>& attributes);
231 Result<std::monostate> parse_port_list(VerilogModule*
module);
232 Result<std::monostate> parse_port_declaration_list(VerilogModule*
module);
233 Result<std::monostate> parse_port_definition(VerilogModule*
module, std::vector<VerilogDataEntry>& attributes);
234 Result<std::monostate> parse_signal_definition(VerilogModule*
module, std::vector<VerilogDataEntry>& attributes);
235 Result<std::monostate> parse_assignment(VerilogModule*
module);
236 Result<std::monostate> parse_defparam(VerilogModule*
module);
237 void parse_attribute(std::vector<VerilogDataEntry>& attributes);
238 Result<std::monostate> parse_instance(VerilogModule*
module, std::vector<VerilogDataEntry>& attributes);
239 Result<std::monostate> parse_port_assign(VerilogInstance*
instance);
240 Result<std::vector<VerilogDataEntry>> parse_parameter_assign();
243 Result<std::monostate> construct_netlist(VerilogModule* top_module);
245 instantiate_module(
const std::string& instance_name, VerilogModule* verilog_module, Module* parent,
const std::unordered_map<std::string, std::string>& parent_module_assignments);
248 std::string get_unique_alias(
const std::string& parent_name,
const std::string&
name,
const std::unordered_map<std::string, u32>& name_occurences)
const;
249 std::vector<u32> parse_range(TokenStream<std::string>& stream)
const;
250 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;
251 std::vector<std::string> expand_ranges(
const std::string&
name,
const std::vector<std::vector<u32>>& ranges)
const;
252 Result<std::vector<BooleanFunction::Value>> get_binary_vector(std::string value)
const;
253 Result<std::string> get_hex_from_literal(
const Token<std::string>& value_token)
const;
254 Result<std::pair<std::string, std::string>> parse_parameter_value(
const Token<std::string>& value_token)
const;
255 Result<std::vector<VerilogParser::assignment_t>> parse_assignment_expression(TokenStream<std::string>&& stream)
const;
256 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