diff options
author | Clifford Wolf <clifford@clifford.at> | 2014-07-22 20:39:13 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2014-07-22 20:39:38 +0200 |
commit | 7bffde6abdaf6fc2ed090946442f90b2438e6126 (patch) | |
tree | 24091283baf740e0ffd5b347da84771ed28791a7 /frontends/ast/genrtlil.cc | |
parent | 4b4048bc5feba1ab05c7a63f12c0a17879cb7e04 (diff) | |
download | yosys-7bffde6abdaf6fc2ed090946442f90b2438e6126.tar.gz yosys-7bffde6abdaf6fc2ed090946442f90b2438e6126.tar.bz2 yosys-7bffde6abdaf6fc2ed090946442f90b2438e6126.zip |
SigSpec refactoring: change RTLIL::SigSpec::size() to be read-only
Diffstat (limited to 'frontends/ast/genrtlil.cc')
-rw-r--r-- | frontends/ast/genrtlil.cc | 66 |
1 files changed, 11 insertions, 55 deletions
diff --git a/frontends/ast/genrtlil.cc b/frontends/ast/genrtlil.cc index 681b34860..34a3f1ba9 100644 --- a/frontends/ast/genrtlil.cc +++ b/frontends/ast/genrtlil.cc @@ -56,15 +56,6 @@ static RTLIL::SigSpec uniop2rtlil(AstNode *that, std::string type, int result_wi wire->width = result_width; current_module->wires[wire->name] = wire; - RTLIL::SigChunk chunk; - chunk.wire = wire; - chunk.width = wire->width; - chunk.offset = 0; - - RTLIL::SigSpec sig; - sig.chunks().push_back(chunk); - sig.size() = chunk.width; - if (gen_attributes) for (auto &attr : that->attributes) { if (attr.second->type != AST_CONSTANT) @@ -78,8 +69,8 @@ static RTLIL::SigSpec uniop2rtlil(AstNode *that, std::string type, int result_wi cell->connections["\\A"] = arg; cell->parameters["\\Y_WIDTH"] = result_width; - cell->connections["\\Y"] = sig; - return sig; + cell->connections["\\Y"] = wire; + return wire; } // helper function for extending bit width (preferred over SigSpec::extend() because of correct undef propagation in ConstEval) @@ -105,15 +96,6 @@ static void widthExtend(AstNode *that, RTLIL::SigSpec &sig, int width, bool is_s wire->width = width; current_module->wires[wire->name] = wire; - RTLIL::SigChunk chunk; - chunk.wire = wire; - chunk.width = wire->width; - chunk.offset = 0; - - RTLIL::SigSpec new_sig; - new_sig.chunks().push_back(chunk); - new_sig.size() = chunk.width; - if (that != NULL) for (auto &attr : that->attributes) { if (attr.second->type != AST_CONSTANT) @@ -127,8 +109,8 @@ static void widthExtend(AstNode *that, RTLIL::SigSpec &sig, int width, bool is_s cell->connections["\\A"] = sig; cell->parameters["\\Y_WIDTH"] = width; - cell->connections["\\Y"] = new_sig; - sig = new_sig; + cell->connections["\\Y"] = wire; + sig = wire; } // helper function for creating RTLIL code for binary operations @@ -149,15 +131,6 @@ static RTLIL::SigSpec binop2rtlil(AstNode *that, std::string type, int result_wi wire->width = result_width; current_module->wires[wire->name] = wire; - RTLIL::SigChunk chunk; - chunk.wire = wire; - chunk.width = wire->width; - chunk.offset = 0; - - RTLIL::SigSpec sig; - sig.chunks().push_back(chunk); - sig.size() = chunk.width; - for (auto &attr : that->attributes) { if (attr.second->type != AST_CONSTANT) log_error("Attribute `%s' with non-constant value at %s:%d!\n", @@ -175,8 +148,8 @@ static RTLIL::SigSpec binop2rtlil(AstNode *that, std::string type, int result_wi cell->connections["\\B"] = right; cell->parameters["\\Y_WIDTH"] = result_width; - cell->connections["\\Y"] = sig; - return sig; + cell->connections["\\Y"] = wire; + return wire; } // helper function for creating RTLIL code for multiplexers @@ -199,15 +172,6 @@ static RTLIL::SigSpec mux2rtlil(AstNode *that, const RTLIL::SigSpec &cond, const wire->width = left.size(); current_module->wires[wire->name] = wire; - RTLIL::SigChunk chunk; - chunk.wire = wire; - chunk.width = wire->width; - chunk.offset = 0; - - RTLIL::SigSpec sig; - sig.chunks().push_back(chunk); - sig.size() = chunk.width; - for (auto &attr : that->attributes) { if (attr.second->type != AST_CONSTANT) log_error("Attribute `%s' with non-constant value at %s:%d!\n", @@ -220,9 +184,9 @@ static RTLIL::SigSpec mux2rtlil(AstNode *that, const RTLIL::SigSpec &cond, const cell->connections["\\A"] = right; cell->connections["\\B"] = left; cell->connections["\\S"] = cond; - cell->connections["\\Y"] = sig; + cell->connections["\\Y"] = wire; - return sig; + return wire; } // helper class for converting AST always nodes to RTLIL processes @@ -1001,9 +965,7 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint) } } - RTLIL::SigSpec sig; - sig.chunks().push_back(chunk); - sig.size() = chunk.width; + RTLIL::SigSpec sig(chunk); if (genRTLIL_subst_from && genRTLIL_subst_to) sig.replace(*genRTLIL_subst_from, *genRTLIL_subst_to); @@ -1025,14 +987,8 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint) // concatenation of signals can be done directly using RTLIL::SigSpec case AST_CONCAT: { RTLIL::SigSpec sig; - sig.size() = 0; - for (auto it = children.begin(); it != children.end(); it++) { - RTLIL::SigSpec s = (*it)->genRTLIL(); - for (size_t i = 0; i < s.chunks().size(); i++) { - sig.chunks().push_back(s.chunks()[i]); - sig.size() += s.chunks()[i].width; - } - } + for (auto it = children.begin(); it != children.end(); it++) + sig.append((*it)->genRTLIL()); if (sig.size() < width_hint) sig.extend_u0(width_hint, false); return sig; |