pass metadata: fixed some of the output formatting
[yosys.git] / backends / smv / smv.cc
index 7113ebc97f0bfe89a76d0cf266fdd6389ef5d29d..7d4f94adcc3e946fe2c24c764a3c20870f23d40d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  yosys -- Yosys Open SYnthesis Suite
  *
- *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at>
+ *  Copyright (C) 2012  Claire Xenia Wolf <claire@yosyshq.com>
  *
  *  Permission to use, copy, modify, and/or distribute this software for any
  *  purpose with or without fee is hereby granted, provided that the above
@@ -358,7 +358,8 @@ struct SmvWorker
                                continue;
                        }
 
-                       if (cell->type.in(ID($div), ID($mod)))
+                       // SMV has a "mod" operator, but its semantics don't seem to be well-defined - to be safe, don't generate it at all
+                       if (cell->type.in(ID($div)/*, ID($mod), ID($modfloor)*/))
                        {
                                int width_y = GetSize(cell->getPort(ID::Y));
                                int width = max(width_y, GetSize(cell->getPort(ID::A)));
@@ -366,7 +367,7 @@ struct SmvWorker
                                string expr_a, expr_b, op;
 
                                if (cell->type == ID($div))  op = "/";
-                               if (cell->type == ID($mod))  op = "mod";
+                               //if (cell->type == ID($mod))  op = "mod";
 
                                if (cell->getParam(ID::A_SIGNED).as_bool())
                                {
@@ -572,8 +573,22 @@ struct SmvWorker
                                continue;
                        }
 
-                       if (cell->type[0] == '$')
-                               log_error("Found currently unsupported cell type %s (%s.%s).\n", log_id(cell->type), log_id(module), log_id(cell));
+                       if (cell->type[0] == '$') {
+                               if (cell->type.in(ID($dffe), ID($sdff), ID($sdffe), ID($sdffce)) || cell->type.str().substr(0, 6) == "$_SDFF" || (cell->type.str().substr(0, 6) == "$_DFFE" && cell->type.str().size() == 10)) {
+                                       log_error("Unsupported cell type %s for cell %s.%s -- please run `dffunmap` before `write_smv`.\n",
+                                                       log_id(cell->type), log_id(module), log_id(cell));
+                               }
+                               if (cell->type.in(ID($adff), ID($adffe), ID($aldff), ID($aldffe), ID($dffsr), ID($dffsre)) || cell->type.str().substr(0, 5) == "$_DFF" || cell->type.str().substr(0, 7) == "$_ALDFF") {
+                                       log_error("Unsupported cell type %s for cell %s.%s -- please run `async2sync; dffunmap` or `clk2fflogic` before `write_smv`.\n",
+                                                       log_id(cell->type), log_id(module), log_id(cell));
+                               }
+                               if (cell->type.in(ID($sr), ID($dlatch), ID($adlatch), ID($dlatchsr)) || cell->type.str().substr(0, 8) == "$_DLATCH" || cell->type.str().substr(0, 5) == "$_SR_") {
+                                       log_error("Unsupported cell type %s for cell %s.%s -- please run `clk2fflogic` before `write_smv`.\n",
+                                                       log_id(cell->type), log_id(module), log_id(cell));
+                               }
+                               log_error("Unsupported cell type %s for cell %s.%s.\n",
+                                               log_id(cell->type), log_id(module), log_id(cell));
+                       }
 
 //                     f << stringf("    %s : %s;\n", cid(cell->name), cid(cell->type));
 
@@ -701,7 +716,7 @@ struct SmvWorker
 
 struct SmvBackend : public Backend {
        SmvBackend() : Backend("smv", "write design to SMV file") { }
-       void help() YS_OVERRIDE
+       void help() override
        {
                //   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
                log("\n");
@@ -719,13 +734,18 @@ struct SmvBackend : public Backend {
                log("THIS COMMAND IS UNDER CONSTRUCTION\n");
                log("\n");
        }
-       void execute(std::ostream *&f, std::string filename, std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
+       void execute(std::ostream *&f, std::string filename, std::vector<std::string> args, RTLIL::Design *design) override
        {
                std::ifstream template_f;
                bool verbose = false;
 
                log_header(design, "Executing SMV backend.\n");
 
+               log_push();
+               Pass::call(design, "bmuxmap");
+               Pass::call(design, "demuxmap");
+               log_pop();
+
                size_t argidx;
                for (argidx = 1; argidx < args.size(); argidx++)
                {