| #ifndef _UHDM_AST_H_ | |
| #define _UHDM_AST_H_ 1 | |
| #include "frontends/ast/ast.h" | |
| #include <vector> | |
| #undef cover | |
| #include "uhdmastshared.h" | |
| #include <uhdm/uhdm.h> | |
| YOSYS_NAMESPACE_BEGIN | |
| class UhdmAst | |
| { | |
| private: | |
| // Walks through one-to-many relationships from given parent | |
| // node through the VPI interface, visiting child nodes belonging to | |
| // ChildrenNodeTypes that are present in the given object. | |
| void visit_one_to_many(const std::vector<int> child_node_types, vpiHandle parent_handle, const std::function<void(AST::AstNode *)> &f); | |
| // Walks through one-to-one relationships from given parent | |
| // node through the VPI interface, visiting child nodes belonging to | |
| // ChildrenNodeTypes that are present in the given object. | |
| void visit_one_to_one(const std::vector<int> child_node_types, vpiHandle parent_handle, const std::function<void(AST::AstNode *)> &f); | |
| // Visit children of type vpiRange that belong to the given parent node. | |
| void visit_range(vpiHandle obj_h, const std::function<void(AST::AstNode *)> &f); | |
| // Visit the default expression assigned to a variable. | |
| void visit_default_expr(vpiHandle obj_h); | |
| // Create an AstNode of the specified type with metadata extracted from | |
| // the given vpiHandle. | |
| AST::AstNode *make_ast_node(AST::AstNodeType type, std::vector<AST::AstNode *> children = {}, bool prefer_full_name = false); | |
| // Makes the passed node a cell node of the specified type | |
| void make_cell(vpiHandle obj_h, AST::AstNode *node, AST::AstNode *type); | |
| // Moves a type node to the specified node | |
| void move_type_to_new_typedef(AST::AstNode *current_node, AST::AstNode *type_node); | |
| // Go up the UhdmAst to find a parent node of the specified type | |
| AST::AstNode *find_ancestor(const std::unordered_set<AST::AstNodeType> &types); | |
| // Reports that something went wrong with reading the UHDM file | |
| void report_error(const char *format, ...) const; | |
| // Processes the value connected to the specified node | |
| AST::AstNode *process_value(vpiHandle obj_h); | |
| // The parent UhdmAst | |
| UhdmAst *parent; | |
| // Data shared between all UhdmAst objects | |
| UhdmAstShared &shared; | |
| // The current VPI/UHDM handle | |
| vpiHandle obj_h = 0; | |
| // The current Yosys AST node | |
| AST::AstNode *current_node = nullptr; | |
| // Indentation used for debug printing | |
| std::string indent; | |
| // Mapping of names that should be replaced to new names | |
| std::unordered_map<std::string, std::string> node_renames; | |
| // Functions that process specific types of nodes | |
| void process_design(); | |
| void process_parameter(); | |
| void process_port(); | |
| void process_module(); | |
| void process_struct_typespec(); | |
| void process_union_typespec(); | |
| void process_packed_array_typespec(); | |
| void process_array_typespec(); | |
| void process_typespec_member(); | |
| void process_enum_typespec(); | |
| void process_enum_const(); | |
| void process_custom_var(); | |
| void process_int_var(); | |
| void process_real_var(); | |
| void process_array_var(); | |
| void process_packed_array_var(); | |
| void process_param_assign(); | |
| void process_cont_assign(); | |
| void process_cont_assign_net(); | |
| void process_cont_assign_var_init(); | |
| void process_assignment(); | |
| void process_net(); | |
| void process_packed_array_net(); | |
| void process_array_net(); | |
| void process_package(); | |
| void process_interface(); | |
| void process_modport(); | |
| void process_io_decl(); | |
| void process_always(); | |
| void process_event_control(const UHDM::BaseClass *object); | |
| void process_initial(); | |
| void process_begin(bool is_named); | |
| void process_operation(); | |
| void process_stream_op(); | |
| void process_list_op(); | |
| void process_cast_op(); | |
| void process_inside_op(); | |
| void process_assignment_pattern_op(); | |
| void process_tagged_pattern(); | |
| void process_bit_select(); | |
| void process_part_select(); | |
| void process_indexed_part_select(); | |
| void process_var_select(); | |
| void process_if_else(); | |
| void process_for(); | |
| void process_gen_scope_array(); | |
| void process_gen_scope(); | |
| void process_case(); | |
| void process_case_item(); | |
| void process_range(const UHDM::BaseClass *object); | |
| void process_return(); | |
| void process_function(); | |
| void process_logic_var(); | |
| void process_sys_func_call(); | |
| void process_func_call(); | |
| void process_immediate_assert(); | |
| void process_hier_path(); | |
| void process_logic_typespec(); | |
| void process_int_typespec(); | |
| void process_bit_typespec(); | |
| void process_string_var(); | |
| void process_string_typespec(); | |
| void process_repeat(); | |
| void process_byte_var(); | |
| void process_long_int_var(); | |
| void process_immediate_cover(); | |
| void process_immediate_assume(); | |
| void process_while(); | |
| void simplify_parameter(AST::AstNode *parameter, AST::AstNode *module_node = nullptr); | |
| void process_nonsynthesizable(const UHDM::BaseClass *object); | |
| void process_unsupported_stmt(const UHDM::BaseClass *object); | |
| UhdmAst(UhdmAst *p, UhdmAstShared &s, const std::string &i) : parent(p), shared(s), indent(i) | |
| { | |
| if (parent) | |
| node_renames = parent->node_renames; | |
| } | |
| public: | |
| UhdmAst(UhdmAstShared &s, const std::string &i = "") : UhdmAst(nullptr, s, i) {} | |
| // Visits single VPI object and creates proper AST node | |
| AST::AstNode *process_object(vpiHandle obj_h); | |
| // Visits all VPI design objects and returns created ASTs | |
| AST::AstNode *visit_designs(const std::vector<vpiHandle> &designs); | |
| static const IdString &partial(); | |
| static const IdString &packed_ranges(); | |
| static const IdString &unpacked_ranges(); | |
| // set this attribute to force conversion of multirange wire to single range. It is useful to force-convert some memories. | |
| static const IdString &force_convert(); | |
| static const IdString &is_imported(); | |
| }; | |
| YOSYS_NAMESPACE_END | |
| #endif |