39 #include <unordered_map>
40 #include <unordered_set>
72 using identifier_t = ci_string;
73 using ranged_identifier_t = std::pair<ci_string, std::vector<std::vector<u32>>>;
74 using numeral_t = std::vector<BooleanFunction::Value>;
75 using empty_t = std::monostate;
76 using assignment_t = std::variant<identifier_t, ranged_identifier_t, numeral_t, empty_t>;
82 std::string m_type =
"unknown";
83 std::string m_value =
"";
89 std::vector<std::vector<u32>> m_ranges;
90 std::vector<VhdlDataEntry> m_attributes;
91 std::vector<ci_string> m_expanded_names;
96 ci_string m_identifier;
98 std::vector<std::vector<u32>> m_ranges;
99 std::vector<ci_string> m_expanded_identifiers;
102 struct VhdlPortAssignment
104 std::optional<assignment_t> m_port;
105 std::vector<assignment_t> m_assignment;
108 struct VhdlAssignment
110 std::vector<assignment_t> m_variable;
111 std::vector<assignment_t> m_assignment;
118 bool m_is_entity =
false;
119 std::vector<VhdlPortAssignment> m_port_assignments;
120 std::vector<VhdlDataEntry> m_generics;
121 std::vector<VhdlDataEntry> m_attributes;
122 std::vector<std::pair<ci_string, ci_string>> m_expanded_port_assignments;
128 VhdlEntity() =
default;
129 ~VhdlEntity() =
default;
137 bool operator<(
const VhdlEntity& other)
const
139 return m_name < other.m_name;
145 std::vector<VhdlDataEntry> m_attributes;
148 std::vector<std::unique_ptr<VhdlPort>> m_ports;
149 std::map<ci_string, VhdlPort*> m_ports_by_identifier;
150 std::set<ci_string> m_expanded_port_identifiers;
153 std::vector<std::unique_ptr<VhdlSignal>> m_signals;
154 std::map<ci_string, VhdlSignal*> m_signals_by_name;
157 std::vector<VhdlAssignment> m_assignments;
158 std::vector<std::pair<ci_string, ci_string>> m_expanded_assignments;
161 std::vector<std::unique_ptr<VhdlInstance>> m_instances;
162 std::map<ci_string, VhdlInstance*> m_instances_by_name;
165 enum class AttributeTarget
172 using attribute_buffer_t = std::map<AttributeTarget, std::map<ci_string, VhdlDataEntry>>;
174 std::stringstream m_fs;
175 std::filesystem::path m_path;
178 Netlist* m_netlist =
nullptr;
181 std::vector<std::unique_ptr<VhdlEntity>> m_entities;
182 std::unordered_map<ci_string, VhdlEntity*> m_entities_by_name;
183 ci_string m_last_entity;
189 TokenStream<ci_string> m_token_stream;
192 std::unordered_map<ci_string, GateType*> m_gate_types;
193 std::unordered_map<ci_string, GateType*> m_vcc_gate_types;
194 std::unordered_map<ci_string, GateType*> m_gnd_gate_types;
195 std::unordered_map<Net*, std::vector<std::pair<Module*, u32>>> m_module_port_by_net;
196 std::unordered_map<Module*, std::vector<std::pair<std::string, Net*>>> m_module_ports;
197 attribute_buffer_t m_attribute_buffer;
198 std::unordered_map<ci_string, ci_string> m_attribute_types;
201 std::set<ci_string> m_libraries;
204 std::unordered_map<ci_string, u32> m_signal_name_occurrences;
205 std::unordered_map<ci_string, u32> m_instance_name_occurrences;
210 std::unordered_map<ci_string, Net*> m_net_by_name;
211 std::vector<std::pair<ci_string, ci_string>> m_nets_to_merge;
215 Result<std::monostate> parse_tokens();
216 void parse_library();
217 Result<std::monostate> parse_entity();
218 Result<std::monostate> parse_port_definitons(VhdlEntity* vhdl_entity);
219 Result<std::monostate> parse_attribute();
220 Result<std::monostate> parse_architecture();
221 Result<std::monostate> parse_architecture_header(VhdlEntity* vhdl_entity);
222 Result<std::monostate> parse_signal_definition(VhdlEntity* vhdl_entity);
223 Result<std::monostate> parse_architecture_body(VhdlEntity* vhdl_entity);
224 Result<std::monostate> parse_assignment(VhdlEntity* vhdl_entity);
225 Result<std::monostate> parse_instance(VhdlEntity* vhdl_entity);
226 Result<std::monostate> parse_port_assign(VhdlInstance* instance);
227 Result<std::monostate> parse_generic_assign(VhdlInstance* instance);
228 Result<std::monostate> assign_attributes(VhdlEntity* vhdl_entity);
231 Result<std::monostate> construct_netlist(VhdlEntity* top_entity);
232 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);
235 ci_string get_unique_alias(
const ci_string& parent_name,
const ci_string&
name,
const std::unordered_map<ci_string, u32>& name_occurences)
const;
236 std::vector<u32> parse_range(TokenStream<ci_string>& range_stream)
const;
237 Result<std::vector<std::vector<u32>>> parse_signal_ranges(TokenStream<ci_string>& signal_stream)
const;
238 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;
239 std::vector<ci_string> expand_ranges(
const ci_string&
name,
const std::vector<std::vector<u32>>& ranges)
const;
240 Result<std::vector<BooleanFunction::Value>> get_binary_vector(std::string value)
const;
241 Result<std::string> get_hex_from_literal(
const Token<ci_string>& value_token)
const;
242 Result<std::vector<assignment_t>> parse_assignment_expression(TokenStream<ci_string>&& stream)
const;
243 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)