mirror of https://github.com/YosysHQ/yosys.git
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
970f854c2a
|
@ -1065,43 +1065,46 @@ bool dump_cell_expr(std::ostream &f, std::string indent, RTLIL::Cell *cell)
|
||||||
use_rd_clk = cell->parameters["\\RD_CLK_ENABLE"].extract(i).as_bool();
|
use_rd_clk = cell->parameters["\\RD_CLK_ENABLE"].extract(i).as_bool();
|
||||||
rd_clk_posedge = cell->parameters["\\RD_CLK_POLARITY"].extract(i).as_bool();
|
rd_clk_posedge = cell->parameters["\\RD_CLK_POLARITY"].extract(i).as_bool();
|
||||||
rd_transparent = cell->parameters["\\RD_TRANSPARENT"].extract(i).as_bool();
|
rd_transparent = cell->parameters["\\RD_TRANSPARENT"].extract(i).as_bool();
|
||||||
|
if (use_rd_clk)
|
||||||
{
|
{
|
||||||
std::ostringstream os;
|
|
||||||
dump_sigspec(os, sig_rd_clk);
|
|
||||||
clk_domain_str = stringf("%sedge %s", rd_clk_posedge ? "pos" : "neg", os.str().c_str());
|
|
||||||
if( clk_to_lof_body.count(clk_domain_str) == 0 )
|
|
||||||
clk_to_lof_body[clk_domain_str] = std::vector<std::string>();
|
|
||||||
}
|
|
||||||
if (use_rd_clk && !rd_transparent)
|
|
||||||
{
|
|
||||||
// for clocked read ports make something like:
|
|
||||||
// reg [..] temp_id;
|
|
||||||
// always @(posedge clk)
|
|
||||||
// if (rd_en) temp_id <= array_reg[r_addr];
|
|
||||||
// assign r_data = temp_id;
|
|
||||||
std::string temp_id = next_auto_id();
|
|
||||||
lof_reg_declarations.push_back( stringf("reg [%d:0] %s;\n", sig_rd_data.size() - 1, temp_id.c_str()) );
|
|
||||||
{
|
{
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
if (sig_rd_en != RTLIL::SigBit(true))
|
dump_sigspec(os, sig_rd_clk);
|
||||||
|
clk_domain_str = stringf("%sedge %s", rd_clk_posedge ? "pos" : "neg", os.str().c_str());
|
||||||
|
if( clk_to_lof_body.count(clk_domain_str) == 0 )
|
||||||
|
clk_to_lof_body[clk_domain_str] = std::vector<std::string>();
|
||||||
|
}
|
||||||
|
if (!rd_transparent)
|
||||||
|
{
|
||||||
|
// for clocked read ports make something like:
|
||||||
|
// reg [..] temp_id;
|
||||||
|
// always @(posedge clk)
|
||||||
|
// if (rd_en) temp_id <= array_reg[r_addr];
|
||||||
|
// assign r_data = temp_id;
|
||||||
|
std::string temp_id = next_auto_id();
|
||||||
|
lof_reg_declarations.push_back( stringf("reg [%d:0] %s;\n", sig_rd_data.size() - 1, temp_id.c_str()) );
|
||||||
{
|
{
|
||||||
os << stringf("if (");
|
std::ostringstream os;
|
||||||
dump_sigspec(os, sig_rd_en);
|
if (sig_rd_en != RTLIL::SigBit(true))
|
||||||
os << stringf(") ");
|
{
|
||||||
|
os << stringf("if (");
|
||||||
|
dump_sigspec(os, sig_rd_en);
|
||||||
|
os << stringf(") ");
|
||||||
|
}
|
||||||
|
os << stringf("%s <= %s[", temp_id.c_str(), mem_id.c_str());
|
||||||
|
dump_sigspec(os, sig_rd_addr);
|
||||||
|
os << stringf("];\n");
|
||||||
|
clk_to_lof_body[clk_domain_str].push_back(os.str());
|
||||||
|
}
|
||||||
|
{
|
||||||
|
std::ostringstream os;
|
||||||
|
dump_sigspec(os, sig_rd_data);
|
||||||
|
std::string line = stringf("assign %s = %s;\n", os.str().c_str(), temp_id.c_str());
|
||||||
|
clk_to_lof_body[""].push_back(line);
|
||||||
}
|
}
|
||||||
os << stringf("%s <= %s[", temp_id.c_str(), mem_id.c_str());
|
|
||||||
dump_sigspec(os, sig_rd_addr);
|
|
||||||
os << stringf("];\n");
|
|
||||||
clk_to_lof_body[clk_domain_str].push_back(os.str());
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
std::ostringstream os;
|
|
||||||
dump_sigspec(os, sig_rd_data);
|
|
||||||
std::string line = stringf("assign %s = %s;\n", os.str().c_str(), temp_id.c_str());
|
|
||||||
clk_to_lof_body[""].push_back(line);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (rd_transparent) {
|
|
||||||
// for rd-transparent read-ports make something like:
|
// for rd-transparent read-ports make something like:
|
||||||
// reg [..] temp_id;
|
// reg [..] temp_id;
|
||||||
// always @(posedge clk)
|
// always @(posedge clk)
|
||||||
|
@ -1121,15 +1124,15 @@ bool dump_cell_expr(std::ostream &f, std::string indent, RTLIL::Cell *cell)
|
||||||
std::string line = stringf("assign %s = %s[%s];\n", os.str().c_str(), mem_id.c_str(), temp_id.c_str());
|
std::string line = stringf("assign %s = %s[%s];\n", os.str().c_str(), mem_id.c_str(), temp_id.c_str());
|
||||||
clk_to_lof_body[""].push_back(line);
|
clk_to_lof_body[""].push_back(line);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// for non-clocked read-ports make something like:
|
|
||||||
// assign r_data = array_reg[r_addr];
|
|
||||||
std::ostringstream os, os2;
|
|
||||||
dump_sigspec(os, sig_rd_data);
|
|
||||||
dump_sigspec(os2, sig_rd_addr);
|
|
||||||
std::string line = stringf("assign %s = %s[%s];\n", os.str().c_str(), mem_id.c_str(), os2.str().c_str());
|
|
||||||
clk_to_lof_body[""].push_back(line);
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// for non-clocked read-ports make something like:
|
||||||
|
// assign r_data = array_reg[r_addr];
|
||||||
|
std::ostringstream os, os2;
|
||||||
|
dump_sigspec(os, sig_rd_data);
|
||||||
|
dump_sigspec(os2, sig_rd_addr);
|
||||||
|
std::string line = stringf("assign %s = %s[%s];\n", os.str().c_str(), mem_id.c_str(), os2.str().c_str());
|
||||||
|
clk_to_lof_body[""].push_back(line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -942,16 +942,15 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
|
||||||
|
|
||||||
// simply return the corresponding RTLIL::SigSpec for an AST_CONSTANT node
|
// simply return the corresponding RTLIL::SigSpec for an AST_CONSTANT node
|
||||||
case AST_CONSTANT:
|
case AST_CONSTANT:
|
||||||
|
case AST_REALVALUE:
|
||||||
{
|
{
|
||||||
if (width_hint < 0)
|
if (width_hint < 0)
|
||||||
detectSignWidth(width_hint, sign_hint);
|
detectSignWidth(width_hint, sign_hint);
|
||||||
|
|
||||||
is_signed = sign_hint;
|
is_signed = sign_hint;
|
||||||
return RTLIL::SigSpec(bitsAsConst());
|
|
||||||
}
|
|
||||||
|
|
||||||
case AST_REALVALUE:
|
if (type == AST_CONSTANT)
|
||||||
{
|
return RTLIL::SigSpec(bitsAsConst());
|
||||||
|
|
||||||
RTLIL::SigSpec sig = realAsConst(width_hint);
|
RTLIL::SigSpec sig = realAsConst(width_hint);
|
||||||
log_file_warning(filename, linenum, "converting real value %e to binary %s.\n", realvalue, log_signal(sig));
|
log_file_warning(filename, linenum, "converting real value %e to binary %s.\n", realvalue, log_signal(sig));
|
||||||
return sig;
|
return sig;
|
||||||
|
|
|
@ -72,7 +72,8 @@ struct FsmOpt
|
||||||
|
|
||||||
new_transition_table.swap(fsm_data.transition_table);
|
new_transition_table.swap(fsm_data.transition_table);
|
||||||
new_state_table.swap(fsm_data.state_table);
|
new_state_table.swap(fsm_data.state_table);
|
||||||
fsm_data.reset_state = old_to_new_state.at(fsm_data.reset_state);
|
if (fsm_data.reset_state != -1)
|
||||||
|
fsm_data.reset_state = old_to_new_state.at(fsm_data.reset_state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue