Add new $__DFFS* cells
diff --git a/passes/hierarchy/clkpart.cc b/passes/hierarchy/clkpart.cc
index 81983e2..2bc9f49 100644
--- a/passes/hierarchy/clkpart.cc
+++ b/passes/hierarchy/clkpart.cc
@@ -166,7 +166,22 @@
 							ID($_DFF_PN0_), ID($_DFF_PN1_), ID($_DFF_PP0_), ID($_DFF_PP1_)))
 				{
 					bool this_clk_pol = cell->type.in(ID($_DFF_PN0_), ID($_DFF_PN1_), ID($_DFF_PP0_), ID($_DFF_PP1_));
-					log_assert(!enable_mode); // TODO
+					log_assert(!enable_mode); // TODO: Consider async S/R signals
+					key = clkdomain_t(this_clk_pol, assign_map(cell->getPort(ID(C))), true, RTLIL::SigSpec());
+				}
+				else
+				if (cell->type.in(ID($__DFFS_NN0_), ID($__DFFS_NN1_), ID($_DFFS_NP0_), ID($_DFFS_NP1_),
+							ID($__DFFS_PN0_), ID($__DFFS_PN1_), ID($_DFFS_PP0_), ID($_DFFS_PP1_)))
+				{
+					bool this_clk_pol = cell->type.in(ID($_DFFS_PN0_), ID($_DFFS_PN1_), ID($_DFFS_PP0_), ID($_DFFS_PP1_));
+					log_assert(!enable_mode); // TODO: Consider sync S/R signals
+					key = clkdomain_t(this_clk_pol, assign_map(cell->getPort(ID(C))), true, RTLIL::SigSpec());
+				}
+				if (cell->type.in(ID($__DFFSE_NN0_), ID($__DFFSE_NN1_), ID($_DFFSE_NP0_), ID($_DFFSE_NP1_),
+						ID($__DFFSE_PN0_), ID($__DFFSE_PN1_), ID($_DFFSE_PP0_), ID($_DFFSE_PP1_)))
+				{
+					bool this_clk_pol = cell->type.in(ID($_DFF_PN0_), ID($_DFF_PN1_), ID($_DFF_PP0_), ID($_DFF_PP1_));
+					log_assert(!enable_mode); // TODO: Consider sync S/R and enable signals
 					key = clkdomain_t(this_clk_pol, assign_map(cell->getPort(ID(C))), true, RTLIL::SigSpec());
 				}
 				else
diff --git a/passes/hierarchy/submod.cc b/passes/hierarchy/submod.cc
index 211f961..396d76a 100644
--- a/passes/hierarchy/submod.cc
+++ b/passes/hierarchy/submod.cc
@@ -266,6 +266,23 @@
 		ct.setup_stdcells_mem();
 		ct.setup_design(design);
 
+		ct.setup_type(ID($__DFFS_NN0_), {ID(D),ID(C),ID(R)}, {ID(Q)});
+		ct.setup_type(ID($__DFFS_NN1_), {ID(D),ID(C),ID(R)}, {ID(Q)});
+		ct.setup_type(ID($__DFFS_NP0_), {ID(D),ID(C),ID(R)}, {ID(Q)});
+		ct.setup_type(ID($__DFFS_NP1_), {ID(D),ID(C),ID(R)}, {ID(Q)});
+		ct.setup_type(ID($__DFFS_PN0_), {ID(D),ID(C),ID(R)}, {ID(Q)});
+		ct.setup_type(ID($__DFFS_PN1_), {ID(D),ID(C),ID(R)}, {ID(Q)});
+		ct.setup_type(ID($__DFFS_PP0_), {ID(D),ID(C),ID(R)}, {ID(Q)});
+		ct.setup_type(ID($__DFFS_PP1_), {ID(D),ID(C),ID(R)}, {ID(Q)});
+		ct.setup_type(ID($__DFFSE_NN0_), {ID(D),ID(C),ID(R),ID(E)}, {ID(Q)});
+		ct.setup_type(ID($__DFFSE_NN1_), {ID(D),ID(C),ID(R),ID(E)}, {ID(Q)});
+		ct.setup_type(ID($__DFFSE_NP0_), {ID(D),ID(C),ID(R),ID(E)}, {ID(Q)});
+		ct.setup_type(ID($__DFFSE_NP1_), {ID(D),ID(C),ID(R),ID(E)}, {ID(Q)});
+		ct.setup_type(ID($__DFFSE_PN0_), {ID(D),ID(C),ID(R),ID(E)}, {ID(Q)});
+		ct.setup_type(ID($__DFFSE_PN1_), {ID(D),ID(C),ID(R),ID(E)}, {ID(Q)});
+		ct.setup_type(ID($__DFFSE_PP0_), {ID(D),ID(C),ID(R),ID(E)}, {ID(Q)});
+		ct.setup_type(ID($__DFFSE_PP1_), {ID(D),ID(C),ID(R),ID(E)}, {ID(Q)});
+
 		for (auto port : module->ports) {
 			auto wire = module->wire(port);
 			if (wire->port_output)