Grrr
[yosys.git] / techlibs / xilinx / synth_xilinx.cc
index b022972c925666186cb08922b124bf6dc7af545c..dfe4c647b7ae381b735232260b8bbfe3ef802fe5 100644 (file)
@@ -67,6 +67,12 @@ struct SynthXilinxPass : public ScriptPass
                log("    -nosrl\n");
                log("        disable inference of shift registers\n");
                log("\n");
+               log("    -nocarry\n");
+               log("        do not use XORCY/MUXCY/CARRY4 cells in output netlist\n");
+               log("\n");
+               log("    -nowidelut\n");
+               log("        do not use MUXF[78] resources to implement LUTs larger than LUT6s\n");
+               log("\n");
                log("    -run <from_label>:<to_label>\n");
                log("        only run the commands between the labels (see below). an empty\n");
                log("        from label is synonymous to 'begin', and empty to label is\n");
@@ -85,7 +91,7 @@ struct SynthXilinxPass : public ScriptPass
        }
 
        std::string top_opt, edif_file, blif_file, arch;
-       bool flatten, retime, vpr, nobram, nodram, nosrl;
+       bool flatten, retime, vpr, nobram, nodram, nosrl, nocarry, nowidelut;
 
        void clear_flags() YS_OVERRIDE
        {
@@ -98,6 +104,8 @@ struct SynthXilinxPass : public ScriptPass
                nobram = false;
                nodram = false;
                nosrl = false;
+               nocarry = false;
+               nowidelut = false;
                arch = "xc7";
        }
 
@@ -141,6 +149,14 @@ struct SynthXilinxPass : public ScriptPass
                                retime = true;
                                continue;
                        }
+                       if (args[argidx] == "-nocarry") {
+                               nocarry = true;
+                               continue;
+                       }
+                       if (args[argidx] == "-nowidelut") {
+                               nowidelut = true;
+                               continue;
+                       }
                        if (args[argidx] == "-vpr") {
                                vpr = true;
                                continue;
@@ -229,11 +245,6 @@ struct SynthXilinxPass : public ScriptPass
                        run("dff2dffe");
                        run("opt -full");
 
-                       if (!vpr || help_mode)
-                               run("techmap -map +/xilinx/arith_map.v");
-                       else
-                               run("techmap -map +/xilinx/arith_map.v -D _EXPLICIT_CARRY");
-
                        if (!nosrl || help_mode) {
                                // shregmap operates on bit-level flops, not word-level,
                                //   so break those down here
@@ -242,7 +253,15 @@ struct SynthXilinxPass : public ScriptPass
                                run("shregmap -tech xilinx -minlen 3", "(skip if '-nosrl')");
                        }
 
-                       run("techmap");
+                       if (help_mode)
+                               run("techmap -map +/techmap.v [-map +/xilinx/arith_map.v]", "(skip if '-nocarry')");
+                       else if (!nocarry) {
+                               if (!vpr)
+                                       run("techmap -map +/techmap.v -map +/xilinx/arith_map.v");
+                               else
+                                       run("techmap -map +/techmap.v -map +/xilinx/arith_map.v -D _EXPLICIT_CARRY");
+                       }
+
                        run("opt -fast");
                }
 
@@ -253,7 +272,9 @@ struct SynthXilinxPass : public ScriptPass
 
                if (check_label("map_luts")) {
                        if (help_mode)
-                               run("abc -luts 2:2,3,6:5,10,20 [-dff]");
+                               run("abc -luts 2:2,3,6:5[,10,20] [-dff]", "(skip if 'nowidelut', only for '-retime')");
+                       else if (nowidelut)
+                               run("abc -luts 2:2,3,6:5" + string(retime ? " -dff" : ""));
                        else
                                run("abc -luts 2:2,3,6:5,10,20" + string(retime ? " -dff" : ""));
                        run("clean");
@@ -269,7 +290,7 @@ struct SynthXilinxPass : public ScriptPass
 
                if (check_label("check")) {
                        run("hierarchy -check");
-                       run("stat");
+                       run("stat -tech xilinx");
                        run("check -noinit");
                }