// Positive Edge SiliconBlue FF Cells
 
+(* abc9_flop, lib_whitebox *)
 module SB_DFF (
        output `SB_DFF_REG,
        input C, D
 `endif
 endmodule
 
+(* abc9_flop, lib_whitebox *)
 module SB_DFFE (
        output `SB_DFF_REG,
        input C, E, D
 `endif
 endmodule
 
+(* abc9_flop, lib_whitebox *)
 module SB_DFFSR (
        output `SB_DFF_REG,
        input C, R, D
 `endif
 endmodule
 
+(* abc9_flop, lib_whitebox *)
 module SB_DFFSS (
        output `SB_DFF_REG,
        input C, S, D
 `endif
 endmodule
 
+(* abc9_flop, lib_whitebox *)
 module SB_DFFESR (
        output `SB_DFF_REG,
        input C, E, R, D
 `endif
 endmodule
 
+(* abc9_flop, lib_whitebox *)
 module SB_DFFESS (
        output `SB_DFF_REG,
        input C, E, S, D
 
 // Negative Edge SiliconBlue FF Cells
 
+(* abc9_flop, lib_whitebox *)
 module SB_DFFN (
        output `SB_DFF_REG,
        input C, D
 `endif
 endmodule
 
+(* abc9_flop, lib_whitebox *)
 module SB_DFFNE (
        output `SB_DFF_REG,
        input C, E, D
 `endif
 endmodule
 
+(* abc9_flop, lib_whitebox *)
 module SB_DFFNSR (
        output `SB_DFF_REG,
        input C, R, D
 `endif
 endmodule
 
+(* abc9_flop, lib_whitebox *)
 module SB_DFFNR (
        output `SB_DFF_REG,
        input C, R, D
 `endif
 endmodule
 
+(* abc9_flop, lib_whitebox *)
 module SB_DFFNSS (
        output `SB_DFF_REG,
        input C, S, D
 `endif
 endmodule
 
+(* abc9_flop, lib_whitebox *)
 module SB_DFFNESR (
        output `SB_DFF_REG,
        input C, E, R, D
 `endif
 endmodule
 
+(* abc9_flop, lib_whitebox *)
 module SB_DFFNESS (
        output `SB_DFF_REG,
        input C, E, S, D
 
                log("    -noflatten\n");
                log("        do not flatten design before synthesis\n");
                log("\n");
+               log("    -dff\n");
+               log("        run 'abc'/'abc9' with -dff option\n");
+               log("\n");
                log("    -retime\n");
                log("        run 'abc' with '-dff -D 1' options\n");
                log("\n");
        }
 
        string top_opt, blif_file, edif_file, json_file, device_opt;
-       bool nocarry, nodffe, nobram, dsp, flatten, retime, noabc, abc2, vpr, abc9, flowmap;
+       bool nocarry, nodffe, nobram, dsp, flatten, retime, noabc, abc2, vpr, abc9, dff, flowmap;
        int min_ce_use;
 
        void clear_flags() YS_OVERRIDE
                                abc9 = true;
                                continue;
                        }
+                       if (args[argidx] == "-dff") {
+                               dff = true;
+                               continue;
+                       }
                        if (args[argidx] == "-device" && argidx+1 < args.size()) {
                                device_opt = args[++argidx];
                                continue;
                                run(stringf("dff2dffe -unmap-mince %d", min_ce_use));
                                run("simplemap t:$dff");
                        }
-                       run("techmap -D NO_LUT -D NO_ADDER -map +/ice40/cells_map.v");
+                       if ((abc9 && dff) || help_mode)
+                               run("zinit -all", "(-abc9 and -dff only)");
+                       run("techmap -map +/ice40/ff_map.v");
                        run("opt_expr -mux_undef");
                        run("simplemap");
                        run("ice40_ffinit");
                                                k = stringf("synth_ice40.abc9.%s.W", device_opt.c_str());
                                                abc9_opts += stringf(" -W %s", RTLIL::constpad.at(k).c_str());
                                        }
+                                       if (dff)
+                                               abc9_opts += " -dff";
                                        run("abc9 " + abc9_opts);
                                }
                                else
-                                       run("abc -dress -lut 4", "(skip if -noabc)");
+                                       run(stringf("abc -dress -lut 4 %s", dff ? "-dff" : ""), "(skip if -noabc)");
                        }
                        run("ice40_wrapcarry -unwrap");
-                       run("techmap -D NO_LUT -map +/ice40/cells_map.v");
+                       run("techmap -map +/ice40/ff_map.v");
                        run("clean");
                        run("opt_lut -dlogic SB_CARRY:I0=2:I1=1:CI=0");
                }
 
                if (check_label("map_cells"))
                {
-                       if (vpr)
-                               run("techmap -D NO_LUT -map +/ice40/cells_map.v");
-                       else
-                               run("techmap -map +/ice40/cells_map.v", "(with -D NO_LUT in vpr mode)");
+                       if (help_mode)
+                               run("techmap [-map +/ice40/ff_map.v] [-map +/ice40/cells_map.v]", "(skip if -abc9; skip if -vpr)");
+                       else if (vpr)
+                               run("techmap -map +/ice40/ff_map.v");
+                       else {
+                               std::string techmap_args;
+                               if (!abc9)
+                                       techmap_args += " -map +/ice40/ff_map.v";
+                               if (!vpr)
+                                       techmap_args += " -map +/ice40/cells_map.v";
+                               if (!techmap_args.empty())
+                                       run("techmap " + techmap_args);
+                       }
 
                        run("clean");
                }