ice40: Add option to only use CE if it'd be use by more than X FFs
authorSylvain Munaut <tnt@246tNt.com>
Thu, 15 Nov 2018 01:49:35 +0000 (02:49 +0100)
committerSylvain Munaut <tnt@246tNt.com>
Tue, 27 Nov 2018 20:50:42 +0000 (21:50 +0100)
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
techlibs/ice40/synth_ice40.cc

index b0687e5e3c0755bb4b84d588e41008cc8151d1e2..93965a55dbfb16c098220fdce341ac33d9f48735 100644 (file)
@@ -69,6 +69,10 @@ struct SynthIce40Pass : public ScriptPass
                log("    -nodffe\n");
                log("        do not use SB_DFFE* cells in output netlist\n");
                log("\n");
+               log("    -dffe_min_ce_use <min_ce_use>\n");
+               log("        do not use SB_DFFE* cells if the resulting CE line would go to less\n");
+               log("        than min_ce_use SB_DFFE*in output netlist\n");
+               log("\n");
                log("    -nobram\n");
                log("        do not use SB_RAM40_4K* cells in output netlist\n");
                log("\n");
@@ -87,6 +91,7 @@ struct SynthIce40Pass : public ScriptPass
 
        string top_opt, blif_file, edif_file, json_file;
        bool nocarry, nodffe, nobram, flatten, retime, abc2, vpr;
+       int min_ce_use;
 
        void clear_flags() YS_OVERRIDE
        {
@@ -96,6 +101,7 @@ struct SynthIce40Pass : public ScriptPass
                json_file = "";
                nocarry = false;
                nodffe = false;
+               min_ce_use = -1;
                nobram = false;
                flatten = true;
                retime = false;
@@ -155,6 +161,10 @@ struct SynthIce40Pass : public ScriptPass
                                nodffe = true;
                                continue;
                        }
+                       if (args[argidx] == "-dffe_min_ce_use" && argidx+1 < args.size()) {
+                               min_ce_use = std::stoi(args[++argidx]);
+                               continue;
+                       }
                        if (args[argidx] == "-nobram") {
                                nobram = true;
                                continue;
@@ -228,6 +238,10 @@ struct SynthIce40Pass : public ScriptPass
                        run("dffsr2dff");
                        if (!nodffe)
                                run("dff2dffe -direct-match $_DFF_*");
+                       if (min_ce_use >= 0) {
+                               run("opt_merge");
+                               run(stringf("dff2dffe -unmap-mince %d", min_ce_use));
+                       }
                        run("techmap -D NO_LUT -map +/ice40/cells_map.v");
                        run("opt_expr -mux_undef");
                        run("simplemap");