38 #include <unordered_map>
39 #include <unordered_set>
71 using identifier_t = std::string;
72 using ranged_identifier_t = std::pair<std::string, std::vector<std::vector<u32>>>;
73 using numeral_t = std::vector<BooleanFunction::Value>;
74 using empty_t = std::monostate;
75 using assignment_t = std::variant<identifier_t, ranged_identifier_t, numeral_t, empty_t>;
77 struct VerilogDataEntry
80 std::string m_type =
"unknown";
81 std::string m_value =
"";
87 std::vector<std::vector<u32>> m_ranges;
88 std::vector<VerilogDataEntry> m_attributes;
89 std::vector<std::string> m_expanded_names;
94 std::string m_identifier;
95 std::string m_expression;
97 std::vector<std::vector<u32>> m_ranges;
98 std::vector<std::string> m_expanded_identifiers;
101 struct VerilogPortAssignment
103 std::optional<std::string> m_port_name;
104 std::vector<assignment_t> m_assignment;
107 struct VerilogAssignment
109 std::vector<assignment_t> m_variable;
110 std::vector<assignment_t> m_assignment;
113 struct VerilogInstance
117 bool m_is_module =
false;
118 std::vector<VerilogPortAssignment> m_port_assignments;
119 std::vector<VerilogDataEntry> m_parameters;
120 std::vector<VerilogDataEntry> m_attributes;
121 std::vector<std::pair<std::string, std::string>> m_expanded_port_assignments;
127 VerilogModule() =
default;
128 ~VerilogModule() =
default;
136 bool operator<(
const VerilogModule& other)
const
138 return m_name < other.m_name;
144 std::vector<VerilogDataEntry> m_attributes;
147 std::vector<std::unique_ptr<VerilogPort>> m_ports;
148 std::map<std::string, VerilogPort*> m_ports_by_identifier;
149 std::map<std::string, VerilogPort*> m_ports_by_expression;
150 std::map<std::string, std::string> m_expanded_port_identifiers_to_expressions;
153 std::vector<std::unique_ptr<VerilogSignal>> m_signals;
154 std::map<std::string, VerilogSignal*> m_signals_by_name;
157 std::vector<VerilogAssignment> m_assignments;
158 std::vector<std::pair<std::string, std::string>> m_expanded_assignments;
161 std::vector<std::unique_ptr<VerilogInstance>> m_instances;
162 std::map<std::string, VerilogInstance*> m_instances_by_name;
165 std::stringstream m_fs;
166 std::filesystem::path m_path;
169 Netlist* m_netlist =
nullptr;
172 std::vector<std::unique_ptr<VerilogModule>> m_modules;
173 std::unordered_map<std::string, VerilogModule*> m_modules_by_name;
174 std::string m_last_module;
177 TokenStream<std::string> m_token_stream;
180 std::unordered_map<std::string, GateType*> m_gate_types;
181 std::unordered_map<std::string, GateType*> m_vcc_gate_types;
182 std::unordered_map<std::string, GateType*> m_gnd_gate_types;
183 std::unordered_map<Net*, std::vector<std::pair<Module*, u32>>> m_module_port_by_net;
184 std::unordered_map<Module*, std::vector<std::tuple<std::string, Net*>>> m_module_ports;
187 std::unordered_map<std::string, u32> m_module_instantiation_count;
188 std::unordered_map<std::string, u32> m_instance_name_occurences;
189 std::unordered_map<std::string, u32> m_net_name_occurences;
194 std::unordered_map<std::string, Net*> m_net_by_name;
195 std::vector<std::pair<std::string, std::string>> m_nets_to_merge;
198 const std::string instance_name_seperator =
"/";
202 Result<std::monostate> parse_tokens();
203 Result<std::monostate> parse_module(std::vector<VerilogDataEntry>& attributes);
204 void parse_port_list(VerilogModule*
module);
205 Result<std::monostate> parse_port_declaration_list(VerilogModule*
module);
206 Result<std::monostate> parse_port_definition(VerilogModule*
module, std::vector<VerilogDataEntry>& attributes);
207 Result<std::monostate> parse_signal_definition(VerilogModule*
module, std::vector<VerilogDataEntry>& attributes);
208 Result<std::monostate> parse_assignment(VerilogModule*
module);
209 Result<std::monostate> parse_defparam(VerilogModule*
module);
210 void parse_attribute(std::vector<VerilogDataEntry>& attributes);
211 Result<std::monostate> parse_instance(VerilogModule*
module, std::vector<VerilogDataEntry>& attributes);
212 Result<std::monostate> parse_port_assign(VerilogInstance* instance);
213 Result<std::vector<VerilogDataEntry>> parse_parameter_assign();
216 Result<std::monostate> construct_netlist(VerilogModule* top_module);
218 instantiate_module(
const std::string& instance_name, VerilogModule* verilog_module, Module* parent,
const std::unordered_map<std::string, std::string>& parent_module_assignments);
221 std::string get_unique_alias(
const std::string& parent_name,
const std::string&
name,
const std::unordered_map<std::string, u32>& name_occurences)
const;
222 std::vector<u32> parse_range(TokenStream<std::string>& stream)
const;
223 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;
224 std::vector<std::string> expand_ranges(
const std::string&
name,
const std::vector<std::vector<u32>>& ranges)
const;
225 Result<std::vector<BooleanFunction::Value>> get_binary_vector(std::string value)
const;
226 Result<std::string> get_hex_from_literal(
const Token<std::string>& value_token)
const;
227 Result<std::pair<std::string, std::string>> parse_parameter_value(
const Token<std::string>& value_token)
const;
228 Result<std::vector<VerilogParser::assignment_t>> parse_assignment_expression(TokenStream<std::string>&& stream)
const;
229 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)