aboutsummaryrefslogtreecommitdiffstats
path: root/backends/btor
diff options
context:
space:
mode:
authorAhmed Irfan <ahmedirfan1983@gmail.com>2014-09-02 14:47:51 +0200
committerAhmed Irfan <ahmedirfan1983@gmail.com>2014-09-02 14:47:51 +0200
commit2446b6fbefc51a0f64e68c44cb44ac2d3b2d538a (patch)
tree0a08f1ae10f18e86ac72d25a8aec662f1d7487fd /backends/btor
parentac896c63e287aeeb7947602af0e5f8b115e0b833 (diff)
downloadyosys-2446b6fbefc51a0f64e68c44cb44ac2d3b2d538a.tar.gz
yosys-2446b6fbefc51a0f64e68c44cb44ac2d3b2d538a.tar.bz2
yosys-2446b6fbefc51a0f64e68c44cb44ac2d3b2d538a.zip
added $pmux cell translation
Diffstat (limited to 'backends/btor')
-rw-r--r--backends/btor/btor.cc40
1 files changed, 38 insertions, 2 deletions
diff --git a/backends/btor/btor.cc b/backends/btor/btor.cc
index 03ef183a5..2eac675e0 100644
--- a/backends/btor/btor.cc
+++ b/backends/btor/btor.cc
@@ -638,7 +638,42 @@ struct BtorDumper
fprintf(f, "%s\n", str.c_str());
line_ref[cell->name]=line_num;
}
- //registers
+ else if(cell->type == "$pmux")
+ {
+ log("writing pmux cell\n");
+ int output_width = cell->parameters.at(RTLIL::IdString("\\WIDTH")).as_int();
+ int select_width = cell->parameters.at(RTLIL::IdString("\\S_WIDTH")).as_int();
+ int default_case = dump_sigspec(&cell->connections.at(RTLIL::IdString("\\A")), output_width);
+ int cases = dump_sigspec(&cell->connections.at(RTLIL::IdString("\\B")), output_width*select_width);
+ int select = dump_sigspec(&cell->connections.at(RTLIL::IdString("\\S")), select_width);
+ int *c = new int[select_width];
+
+ for (int i=0; i<select_width; ++i)
+ {
+ ++line_num;
+ str = stringf ("%d slice 1 %d %d %d", line_num, select, i, i);
+ fprintf(f, "%s\n", str.c_str());
+ c[i] = line_num;
+ ++line_num;
+ str = stringf ("%d slice %d %d %d %d", line_num, output_width, cases, i*output_width+output_width-1,
+ i*output_width);
+ fprintf(f, "%s\n", str.c_str());
+ }
+
+ ++line_num;
+ str = stringf ("%d cond 1 %d %d %d", line_num, c[select_width-1], c[select_width-1]+1, default_case);
+ fprintf(f, "%s\n", str.c_str());
+
+ for (int i=select_width-2; i>=0; --i)
+ {
+ ++line_num;
+ str = stringf ("%d cond 1 %d %d %d", line_num, c[i], c[i]+1, line_num-1);
+ fprintf(f, "%s\n", str.c_str());
+ }
+
+ line_ref[cell->name]=line_num;
+ }
+ //registers
else if(cell->type == "$dff" || cell->type == "$adff" || cell->type == "$dffsr")
{
//TODO: remodelling fo adff cells
@@ -767,7 +802,8 @@ struct BtorDumper
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);
+ 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;
}