Improved verilog output for ordinary $mux cells
authorClifford Wolf <clifford@clifford.at>
Sat, 2 Aug 2014 19:10:08 +0000 (21:10 +0200)
committerClifford Wolf <clifford@clifford.at>
Sat, 2 Aug 2014 19:10:08 +0000 (21:10 +0200)
backends/verilog/verilog_backend.cc

index e3c930c8bf805c1c1980dedeb32c11f1d6415cea..c691eae600b6b4463703198eab5b8a3377d24ecb 100644 (file)
@@ -544,7 +544,22 @@ bool dump_cell_expr(FILE *f, std::string indent, RTLIL::Cell *cell)
 #undef HANDLE_UNIOP
 #undef HANDLE_BINOP
 
-       if (cell->type == "$mux" || cell->type == "$pmux" || cell->type == "$pmux_safe")
+       if (cell->type == "$mux")
+       {
+               fprintf(f, "%s" "assign ", indent.c_str());
+               dump_sigspec(f, cell->getPort("\\Y"));
+               fprintf(f, " = ");
+               dump_sigspec(f, cell->getPort("\\S"));
+               fprintf(f, " ? ");
+               dump_attributes(f, "", cell->attributes, ' ');
+               dump_sigspec(f, cell->getPort("\\B"));
+               fprintf(f, " : ");
+               dump_sigspec(f, cell->getPort("\\A"));
+               fprintf(f, ";\n");
+               return true;
+       }
+
+       if (cell->type == "$pmux" || cell->type == "$pmux_safe")
        {
                int width = cell->parameters["\\WIDTH"].as_int();
                int s_width = cell->getPort("\\S").size();
@@ -556,10 +571,11 @@ bool dump_cell_expr(FILE *f, std::string indent, RTLIL::Cell *cell)
                fprintf(f, "%s" "  input [%d:0] s;\n", indent.c_str(), s_width-1);
 
                dump_attributes(f, indent + "  ", cell->attributes);
-               if (!noattr)
+               if (cell->type != "$pmux_safe" && !noattr)
                        fprintf(f, "%s" "  (* parallel_case *)\n", indent.c_str());
                fprintf(f, "%s" "  casez (s)", indent.c_str());
-               fprintf(f, noattr ? " // synopsys parallel_case\n" : "\n");
+               if (cell->type != "$pmux_safe")
+                       fprintf(f, noattr ? " // synopsys parallel_case\n" : "\n");
 
                for (int i = 0; i < s_width; i++)
                {