39 #include <unordered_map>
40 #include <unordered_set>
74 using identifier_t = ci_string;
75 using ranged_identifier_t = std::pair<ci_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>;
87 std::string m_type =
"unknown";
88 std::string m_value =
"";
97 std::vector<std::vector<u32>> m_ranges;
98 std::vector<VhdlDataEntry> m_attributes;
99 std::vector<ci_string> m_expanded_names;
107 ci_string m_identifier;
109 std::vector<std::vector<u32>> m_ranges;
110 std::vector<ci_string> m_expanded_identifiers;
116 struct VhdlPortAssignment
118 std::optional<assignment_t> m_port;
119 std::vector<assignment_t> m_assignment;
125 struct VhdlAssignment
127 std::vector<assignment_t> m_variable;
128 std::vector<assignment_t> m_assignment;
138 bool m_is_entity =
false;
139 std::vector<VhdlPortAssignment> m_port_assignments;
140 std::vector<VhdlDataEntry> m_generics;
141 std::vector<VhdlDataEntry> m_attributes;
142 std::vector<std::pair<ci_string, ci_string>> m_expanded_port_assignments;
151 VhdlEntity() =
default;
152 ~VhdlEntity() =
default;
160 bool operator<(
const VhdlEntity& other)
const
162 return m_name < other.m_name;
168 std::vector<VhdlDataEntry> m_attributes;
171 std::vector<std::unique_ptr<VhdlPort>> m_ports;
172 std::map<ci_string, VhdlPort*> m_ports_by_identifier;
173 std::set<ci_string> m_expanded_port_identifiers;
176 std::vector<std::unique_ptr<VhdlSignal>> m_signals;
177 std::map<ci_string, VhdlSignal*> m_signals_by_name;
180 std::vector<VhdlAssignment> m_assignments;
181 std::vector<std::pair<ci_string, ci_string>> m_expanded_assignments;
184 std::vector<std::unique_ptr<VhdlInstance>> m_instances;
185 std::map<ci_string, VhdlInstance*> m_instances_by_name;
188 enum class AttributeTarget
195 using attribute_buffer_t = std::map<AttributeTarget, std::map<ci_string, VhdlDataEntry>>;
197 std::stringstream m_fs;
198 std::filesystem::path m_path;
201 Netlist* m_netlist =
nullptr;
204 std::vector<std::unique_ptr<VhdlEntity>> m_entities;
205 std::unordered_map<ci_string, VhdlEntity*> m_entities_by_name;
206 ci_string m_last_entity;
212 TokenStream<ci_string> m_token_stream;
215 std::unordered_map<ci_string, GateType*> m_gate_types;
216 std::unordered_map<ci_string, GateType*> m_vcc_gate_types;
217 std::unordered_map<ci_string, GateType*> m_gnd_gate_types;
218 std::unordered_map<Net*, std::vector<std::pair<Module*, u32>>> m_module_port_by_net;
219 std::unordered_map<Module*, std::vector<std::pair<std::string, Net*>>> m_module_ports;
220 attribute_buffer_t m_attribute_buffer;
221 std::unordered_map<ci_string, ci_string> m_attribute_types;
224 std::set<ci_string> m_libraries;
227 std::unordered_map<ci_string, u32> m_signal_name_occurrences;
228 std::unordered_map<ci_string, u32> m_instance_name_occurrences;
233 std::unordered_map<ci_string, Net*> m_net_by_name;
234 std::vector<std::pair<ci_string, ci_string>> m_nets_to_merge;
238 Result<std::monostate> parse_tokens();
239 void parse_library();
240 Result<std::monostate> parse_entity();
241 Result<std::monostate> parse_port_definitons(VhdlEntity* vhdl_entity);
242 Result<std::monostate> parse_attribute();
243 Result<std::monostate> parse_architecture();
244 Result<std::monostate> parse_architecture_header(VhdlEntity* vhdl_entity);
245 Result<std::monostate> parse_signal_definition(VhdlEntity* vhdl_entity);
246 Result<std::monostate> parse_architecture_body(VhdlEntity* vhdl_entity);
247 Result<std::monostate> parse_assignment(VhdlEntity* vhdl_entity);
248 Result<std::monostate> parse_instance(VhdlEntity* vhdl_entity);
249 Result<std::monostate> parse_port_assign(VhdlInstance* instance);
250 Result<std::monostate> parse_generic_assign(VhdlInstance* instance);
251 Result<std::monostate> assign_attributes(VhdlEntity* vhdl_entity);
254 Result<std::monostate> construct_netlist(VhdlEntity* top_entity);
255 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);
258 ci_string get_unique_alias(
const ci_string& parent_name,
const ci_string&
name,
const std::unordered_map<ci_string, u32>& name_occurences)
const;
259 std::vector<u32> parse_range(TokenStream<ci_string>& range_stream)
const;
260 Result<std::vector<std::vector<u32>>> parse_signal_ranges(TokenStream<ci_string>& signal_stream)
const;
261 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;
262 std::vector<ci_string> expand_ranges(
const ci_string&
name,
const std::vector<std::vector<u32>>& ranges)
const;
263 Result<std::vector<BooleanFunction::Value>> get_binary_vector(std::string value)
const;
264 Result<std::string> get_hex_from_literal(
const Token<ci_string>& value_token)
const;
265 Result<std::vector<assignment_t>> parse_assignment_expression(TokenStream<ci_string>&& stream)
const;
266 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)