From: Clifford Wolf Date: Mon, 29 Dec 2014 02:11:50 +0000 (+0100) Subject: dict/pool changes in ast X-Git-Tag: yosys-0.5~191 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=90bc71dd906935def78048e13e7c9f214af0486c;p=yosys.git dict/pool changes in ast --- diff --git a/frontends/ast/ast.cc b/frontends/ast/ast.cc index 8ef60079b..fbb726922 100644 --- a/frontends/ast/ast.cc +++ b/frontends/ast/ast.cc @@ -180,6 +180,10 @@ bool AstNode::get_bool_attribute(RTLIL::IdString id) // (the optional child arguments make it easier to create AST trees) AstNode::AstNode(AstNodeType type, AstNode *child1, AstNode *child2) { + static unsigned int hashidx_count = 123456789; + hashidx_count = mkhash_xorshift(hashidx_count); + hashidx_ = hashidx_count; + this->type = type; filename = current_filename; linenum = get_line_num(); diff --git a/frontends/ast/ast.h b/frontends/ast/ast.h index 1a7ac576b..180646267 100644 --- a/frontends/ast/ast.h +++ b/frontends/ast/ast.h @@ -142,6 +142,10 @@ namespace AST // The AST is built using instances of this struct struct AstNode { + // for dict<> and pool<> + unsigned int hashidx_; + unsigned int hash() const { return hashidx_; } + // this nodes type AstNodeType type; @@ -207,10 +211,10 @@ namespace AST AstNode *readmem(bool is_readmemh, std::string mem_filename, AstNode *memory, int start_addr, int finish_addr); void expand_genblock(std::string index_var, std::string prefix, std::map &name_map); void replace_ids(const std::string &prefix, const std::map &rules); - void mem2reg_as_needed_pass1(std::map> &mem2reg_places, - std::map &mem2reg_flags, std::map &proc_flags, uint32_t &status_flags); - void mem2reg_as_needed_pass2(std::set &mem2reg_set, AstNode *mod, AstNode *block); - bool mem2reg_check(std::set &mem2reg_set); + void mem2reg_as_needed_pass1(dict> &mem2reg_places, + dict &mem2reg_flags, dict &proc_flags, uint32_t &status_flags); + void mem2reg_as_needed_pass2(pool &mem2reg_set, AstNode *mod, AstNode *block); + bool mem2reg_check(pool &mem2reg_set); void meminfo(int &mem_width, int &mem_size, int &addr_bits); // additional functionality for evaluating constant functions diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index b76701943..2ce2d57dc 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -67,12 +67,12 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, if (!flag_nomem2reg && !get_bool_attribute("\\nomem2reg")) { - std::map> mem2reg_places; - std::map mem2reg_candidates, dummy_proc_flags; + dict> mem2reg_places; + dict mem2reg_candidates, dummy_proc_flags; uint32_t flags = flag_mem2reg ? AstNode::MEM2REG_FL_ALL : 0; mem2reg_as_needed_pass1(mem2reg_places, mem2reg_candidates, dummy_proc_flags, flags); - std::set mem2reg_set; + pool mem2reg_set; for (auto &it : mem2reg_candidates) { AstNode *mem = it.first; @@ -2184,8 +2184,8 @@ void AstNode::replace_ids(const std::string &prefix, const std::map> &mem2reg_places, - std::map &mem2reg_candidates, AstNode *that) +static void mark_memories_assign_lhs_complex(dict> &mem2reg_places, + dict &mem2reg_candidates, AstNode *that) { for (auto &child : that->children) mark_memories_assign_lhs_complex(mem2reg_places, mem2reg_candidates, child); @@ -2199,8 +2199,8 @@ static void mark_memories_assign_lhs_complex(std::map> &mem2reg_places, - std::map &mem2reg_candidates, std::map &proc_flags, uint32_t &flags) +void AstNode::mem2reg_as_needed_pass1(dict> &mem2reg_places, + dict &mem2reg_candidates, dict &proc_flags, uint32_t &flags) { uint32_t children_flags = 0; int ignore_children_counter = 0; @@ -2262,7 +2262,7 @@ void AstNode::mem2reg_as_needed_pass1(std::map> if (type == AST_MODULE && get_bool_attribute("\\mem2reg")) children_flags |= AstNode::MEM2REG_FL_ALL; - std::map *proc_flags_p = NULL; + dict *proc_flags_p = NULL; if (type == AST_ALWAYS) { int count_edge_events = 0; @@ -2271,12 +2271,12 @@ void AstNode::mem2reg_as_needed_pass1(std::map> count_edge_events++; if (count_edge_events != 1) children_flags |= AstNode::MEM2REG_FL_ASYNC; - proc_flags_p = new std::map; + proc_flags_p = new dict; } if (type == AST_INITIAL) { children_flags |= AstNode::MEM2REG_FL_INIT; - proc_flags_p = new std::map; + proc_flags_p = new dict; } uint32_t backup_flags = flags; @@ -2300,7 +2300,7 @@ void AstNode::mem2reg_as_needed_pass1(std::map> } } -bool AstNode::mem2reg_check(std::set &mem2reg_set) +bool AstNode::mem2reg_check(pool &mem2reg_set) { if (type != AST_IDENTIFIER || !id2ast || !mem2reg_set.count(id2ast)) return false; @@ -2312,7 +2312,7 @@ bool AstNode::mem2reg_check(std::set &mem2reg_set) } // actually replace memories with registers -void AstNode::mem2reg_as_needed_pass2(std::set &mem2reg_set, AstNode *mod, AstNode *block) +void AstNode::mem2reg_as_needed_pass2(pool &mem2reg_set, AstNode *mod, AstNode *block) { if (type == AST_BLOCK) block = this; diff --git a/kernel/yosys.h b/kernel/yosys.h index 700a0603d..c0004abce 100644 --- a/kernel/yosys.h +++ b/kernel/yosys.h @@ -159,6 +159,10 @@ namespace RTLIL { struct Monitor; } +namespace AST { + struct AstNode; +} + using RTLIL::IdString; using RTLIL::Const; using RTLIL::SigBit; @@ -174,12 +178,14 @@ namespace hashlib { template<> struct hash_ops : hash_obj_ops {}; template<> struct hash_ops : hash_obj_ops {}; template<> struct hash_ops : hash_obj_ops {}; + template<> struct hash_ops : hash_obj_ops {}; template<> struct hash_ops : hash_obj_ops {}; template<> struct hash_ops : hash_obj_ops {}; template<> struct hash_ops : hash_obj_ops {}; template<> struct hash_ops : hash_obj_ops {}; template<> struct hash_ops : hash_obj_ops {}; + template<> struct hash_ops : hash_obj_ops {}; } void memhasher_on();