mirror of https://github.com/YosysHQ/yosys.git
Merge branch 'master' of github.com:cliffordwolf/yosys
This commit is contained in:
commit
c6236c9e97
|
@ -133,6 +133,10 @@ struct BtorDumper
|
||||||
cell_type_translation["$dffsr"] = "next";
|
cell_type_translation["$dffsr"] = "next";
|
||||||
//memories
|
//memories
|
||||||
//nothing here
|
//nothing here
|
||||||
|
//slice
|
||||||
|
cell_type_translation["$slice"] = "slice";
|
||||||
|
//concat
|
||||||
|
cell_type_translation["$concat"] = "concat";
|
||||||
|
|
||||||
//signed cell type translation
|
//signed cell type translation
|
||||||
//binary
|
//binary
|
||||||
|
@ -350,39 +354,25 @@ struct BtorDumper
|
||||||
if (expected_width != s.width)
|
if (expected_width != s.width)
|
||||||
{
|
{
|
||||||
log(" - changing width of sigspec\n");
|
log(" - changing width of sigspec\n");
|
||||||
//TODO: save the new signal in map
|
//TODO: this block may not be needed anymore, due to explicit type conversion by "splice" command
|
||||||
/*if(expected_width > s.width)
|
if(expected_width > s.width)
|
||||||
s.extend_u0(expected_width);
|
|
||||||
else if (expected_width < s.width)
|
|
||||||
s = s.extract(0, expected_width);
|
|
||||||
|
|
||||||
it = sig_ref.find(s);
|
|
||||||
if(it == std::end(sig_ref))
|
|
||||||
{*/
|
|
||||||
if(expected_width > s.width)
|
|
||||||
{
|
|
||||||
//TODO: case the signal is signed
|
|
||||||
++line_num;
|
|
||||||
str = stringf ("%d zero %d", line_num, expected_width - s.width);
|
|
||||||
fprintf(f, "%s\n", str.c_str());
|
|
||||||
++line_num;
|
|
||||||
str = stringf ("%d concat %d %d %d", line_num, expected_width, line_num-1, l);
|
|
||||||
fprintf(f, "%s\n", str.c_str());
|
|
||||||
l = line_num;
|
|
||||||
}
|
|
||||||
else if(expected_width < s.width)
|
|
||||||
{
|
|
||||||
++line_num;
|
|
||||||
str = stringf ("%d slice %d %d %d %d;3", line_num, expected_width, l, expected_width-1, 0);
|
|
||||||
fprintf(f, "%s\n", str.c_str());
|
|
||||||
l = line_num;
|
|
||||||
}
|
|
||||||
/*sig_ref[s] = l;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
l = it->second;
|
//TODO: case the signal is signed
|
||||||
}*/
|
++line_num;
|
||||||
|
str = stringf ("%d zero %d", line_num, expected_width - s.width);
|
||||||
|
fprintf(f, "%s\n", str.c_str());
|
||||||
|
++line_num;
|
||||||
|
str = stringf ("%d concat %d %d %d", line_num, expected_width, line_num-1, l);
|
||||||
|
fprintf(f, "%s\n", str.c_str());
|
||||||
|
l = line_num;
|
||||||
|
}
|
||||||
|
else if(expected_width < s.width)
|
||||||
|
{
|
||||||
|
++line_num;
|
||||||
|
str = stringf ("%d slice %d %d %d %d;3", line_num, expected_width, l, expected_width-1, 0);
|
||||||
|
fprintf(f, "%s\n", str.c_str());
|
||||||
|
l = line_num;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
assert(l>0);
|
assert(l>0);
|
||||||
return l;
|
return l;
|
||||||
|
@ -765,6 +755,39 @@ struct BtorDumper
|
||||||
fprintf(f, "%s\n", str.c_str());
|
fprintf(f, "%s\n", str.c_str());
|
||||||
line_ref[cell->name]=line_num;
|
line_ref[cell->name]=line_num;
|
||||||
}
|
}
|
||||||
|
else if(cell->type == "$slice")
|
||||||
|
{
|
||||||
|
log("writing slice cell\n");
|
||||||
|
const RTLIL::SigSpec* input = &cell->connections.at(RTLIL::IdString("\\A"));
|
||||||
|
int input_width = cell->parameters.at(RTLIL::IdString("\\A_WIDTH")).as_int();
|
||||||
|
assert(input->width == input_width);
|
||||||
|
int input_line = dump_sigspec(input, input_width);
|
||||||
|
const RTLIL::SigSpec* output = &cell->connections.at(RTLIL::IdString("\\Y"));
|
||||||
|
int output_width = cell->parameters.at(RTLIL::IdString("\\Y_WIDTH")).as_int();
|
||||||
|
assert(output->width == output_width);
|
||||||
|
int offset = cell->parameters.at(RTLIL::IdString("\\OFFSET")).as_int();
|
||||||
|
++line_num;
|
||||||
|
str = stringf("%d %s %d %d %d %d", line_num, cell_type_translation.at(cell->type).c_str(), output_width, input_line, output_width+offset-1, offset);
|
||||||
|
fprintf(f, "%s\n", str.c_str());
|
||||||
|
line_ref[cell->name]=line_num;
|
||||||
|
}
|
||||||
|
else if(cell->type == "$concat")
|
||||||
|
{
|
||||||
|
log("writing concat cell\n");
|
||||||
|
const RTLIL::SigSpec* input_a = &cell->connections.at(RTLIL::IdString("\\A"));
|
||||||
|
int input_a_width = cell->parameters.at(RTLIL::IdString("\\A_WIDTH")).as_int();
|
||||||
|
assert(input_a->width == input_a_width);
|
||||||
|
int input_a_line = dump_sigspec(input_a, input_a_width);
|
||||||
|
const RTLIL::SigSpec* input_b = &cell->connections.at(RTLIL::IdString("\\B"));
|
||||||
|
int input_b_width = cell->parameters.at(RTLIL::IdString("\\B_WIDTH")).as_int();
|
||||||
|
assert(input_b->width == input_b_width);
|
||||||
|
int input_b_line = dump_sigspec(input_b, input_b_width);
|
||||||
|
++line_num;
|
||||||
|
str = stringf("%d %s %d %d %d", line_num, cell_type_translation.at(cell->type).c_str(), input_a_width+input_b_width,
|
||||||
|
input_a_line, input_b_line);
|
||||||
|
fprintf(f, "%s\n", str.c_str());
|
||||||
|
line_ref[cell->name]=line_num;
|
||||||
|
}
|
||||||
curr_cell.clear();
|
curr_cell.clear();
|
||||||
return line_num;
|
return line_num;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,10 @@ opt; opt_const -mux_undef; opt;
|
||||||
rename -hide;;;
|
rename -hide;;;
|
||||||
#converting pmux to mux
|
#converting pmux to mux
|
||||||
techmap -share_map pmux2mux.v;;
|
techmap -share_map pmux2mux.v;;
|
||||||
memory -nomap;;
|
#explicit type conversion
|
||||||
|
splice; opt;
|
||||||
|
#extracting memories;
|
||||||
|
memory_dff -wr_only; memory_collect;;
|
||||||
#flatten design
|
#flatten design
|
||||||
flatten;;
|
flatten;;
|
||||||
#converting asyn memory write to syn memory
|
#converting asyn memory write to syn memory
|
||||||
|
|
|
@ -25,7 +25,8 @@ proc;
|
||||||
opt; opt_const -mux_undef; opt;
|
opt; opt_const -mux_undef; opt;
|
||||||
rename -hide;;;
|
rename -hide;;;
|
||||||
techmap -share_map pmux2mux.v;;
|
techmap -share_map pmux2mux.v;;
|
||||||
memory_dff -wr_only
|
splice; opt;
|
||||||
|
memory_dff -wr_only;
|
||||||
memory_collect;;
|
memory_collect;;
|
||||||
flatten;;
|
flatten;;
|
||||||
memory_unpack;
|
memory_unpack;
|
||||||
|
|
Loading…
Reference in New Issue