40 #include <unordered_map>
41 #include <unordered_set>
75 using identifier_t = ci_string;
76 using ranged_identifier_t = std::pair<ci_string, std::vector<std::vector<u32>>>;
77 using numeral_t = std::vector<BooleanFunction::Value>;
78 using empty_t = std::monostate;
79 using assignment_t = std::variant<identifier_t, ranged_identifier_t, numeral_t, empty_t>;
88 std::string m_type =
"unknown";
89 std::string m_value =
"";
90 std::optional<Parameter> m_parameter;
99 std::vector<std::vector<u32>> m_ranges;
100 std::vector<VhdlDataEntry> m_attributes;
101 std::vector<ci_string> m_expanded_names;
109 ci_string m_identifier;
111 std::vector<std::vector<u32>> m_ranges;
112 std::vector<ci_string> m_expanded_identifiers;
118 struct VhdlPortAssignment
120 std::optional<assignment_t> m_port;
121 std::vector<assignment_t> m_assignment;
127 struct VhdlAssignment
129 std::vector<assignment_t> m_variable;
130 std::vector<assignment_t> m_assignment;
140 bool m_is_entity =
false;
141 std::vector<VhdlPortAssignment> m_port_assignments;
142 std::vector<VhdlDataEntry> m_generics;
143 std::vector<VhdlDataEntry> m_attributes;
144 std::vector<std::pair<ci_string, ci_string>> m_expanded_port_assignments;
153 VhdlEntity() =
default;
154 ~VhdlEntity() =
default;
162 bool operator<(
const VhdlEntity& other)
const
164 return m_name < other.m_name;
170 std::vector<VhdlDataEntry> m_attributes;
173 std::vector<std::unique_ptr<VhdlPort>> m_ports;
174 std::map<ci_string, VhdlPort*> m_ports_by_identifier;
175 std::set<ci_string> m_expanded_port_identifiers;
178 std::vector<std::unique_ptr<VhdlSignal>> m_signals;
179 std::map<ci_string, VhdlSignal*> m_signals_by_name;
182 std::vector<VhdlAssignment> m_assignments;
183 std::vector<std::pair<ci_string, ci_string>> m_expanded_assignments;
186 std::vector<std::unique_ptr<VhdlInstance>> m_instances;
187 std::map<ci_string, VhdlInstance*> m_instances_by_name;
190 enum class AttributeTarget
197 using attribute_buffer_t = std::map<AttributeTarget, std::map<ci_string, VhdlDataEntry>>;
199 std::stringstream m_fs;
200 std::filesystem::path m_path;
203 Netlist* m_netlist =
nullptr;
206 std::vector<std::unique_ptr<VhdlEntity>> m_entities;
207 std::unordered_map<ci_string, VhdlEntity*> m_entities_by_name;
208 ci_string m_last_entity;
214 TokenStream<ci_string> m_token_stream;
217 std::unordered_map<ci_string, GateType*> m_gate_types;
218 std::unordered_map<ci_string, GateType*> m_vcc_gate_types;
219 std::unordered_map<ci_string, GateType*> m_gnd_gate_types;
220 std::unordered_map<Net*, std::vector<std::pair<Module*, u32>>> m_module_port_by_net;
221 std::unordered_map<Module*, std::vector<std::pair<std::string, Net*>>> m_module_ports;
222 attribute_buffer_t m_attribute_buffer;
223 std::unordered_map<ci_string, ci_string> m_attribute_types;
226 std::set<ci_string> m_libraries;
229 std::unordered_map<ci_string, u32> m_signal_name_occurrences;
230 std::unordered_map<ci_string, u32> m_instance_name_occurrences;
235 std::unordered_map<ci_string, Net*> m_net_by_name;
236 std::vector<std::pair<ci_string, ci_string>> m_nets_to_merge;
240 Result<std::monostate> parse_tokens();
241 void parse_library();
242 Result<std::monostate> parse_entity();
243 Result<std::monostate> parse_port_definitons(VhdlEntity* vhdl_entity);
244 Result<std::monostate> parse_attribute();
245 Result<std::monostate> parse_architecture();
246 Result<std::monostate> parse_architecture_header(VhdlEntity* vhdl_entity);
247 Result<std::monostate> parse_signal_definition(VhdlEntity* vhdl_entity);
248 Result<std::monostate> parse_architecture_body(VhdlEntity* vhdl_entity);
249 Result<std::monostate> parse_assignment(VhdlEntity* vhdl_entity);
250 Result<std::monostate> parse_instance(VhdlEntity* vhdl_entity);
251 Result<std::monostate> parse_port_assign(VhdlInstance*
instance);
252 Result<std::monostate> parse_generic_assign(VhdlInstance*
instance);
253 Result<std::monostate> assign_attributes(VhdlEntity* vhdl_entity);
256 Result<std::monostate> construct_netlist(VhdlEntity* top_entity);
257 Result<Module*> instantiate_entity(
const ci_string& instance_name, VhdlEntity* vhdl_entity, Module* parent,
const std::unordered_map<ci_string, ci_string>& parent_module_assignments);
260 ci_string get_unique_alias(
const ci_string& parent_name,
const ci_string&
name,
const std::unordered_map<ci_string, u32>& name_occurences)
const;
261 std::vector<u32> parse_range(TokenStream<ci_string>& range_stream)
const;
262 Result<std::vector<std::vector<u32>>> parse_signal_ranges(TokenStream<ci_string>& signal_stream)
const;
263 void expand_ranges_recursively(std::vector<ci_string>& expanded_names,
const ci_string& current_name,
const std::vector<std::vector<u32>>& ranges,
u32 dimension)
const;
264 std::vector<ci_string> expand_ranges(
const ci_string&
name,
const std::vector<std::vector<u32>>& ranges)
const;
265 Result<std::vector<BooleanFunction::Value>> get_binary_vector(std::string value)
const;
266 Result<std::string> get_hex_from_literal(
const Token<ci_string>& value_token)
const;
267 Result<std::vector<assignment_t>> parse_assignment_expression(TokenStream<ci_string>&& stream)
const;
268 Result<std::vector<ci_string>> expand_assignment_expression(VhdlEntity* vhdl_entity,
const std::vector<assignment_t>& vars)
const;
std::basic_string< char, CaseInsensitiveCharTraits > CaseInsensitiveString
std::unique_ptr< GateLibrary > parse(std::filesystem::path file_path)
std::unique_ptr< BasePluginInterface > instance