Cleanup of dfflibmap cellmap exploration code
authorClifford Wolf <clifford@clifford.at>
Fri, 20 Dec 2013 13:21:18 +0000 (14:21 +0100)
committerClifford Wolf <clifford@clifford.at>
Fri, 20 Dec 2013 13:21:18 +0000 (14:21 +0100)
passes/techmap/dfflibmap.cc

index a38ec66b2bb4b2139c09eefcd0f0c1a6cca731b7..765a606cfd12bd3334add7ac900fa811e51f6b15 100644 (file)
@@ -473,23 +473,26 @@ struct DfflibmapPass : public Pass {
                find_cell_sr(libparser.ast, "$_DFFSR_PPN_", true, true, false);
                find_cell_sr(libparser.ast, "$_DFFSR_PPP_", true, true, true);
 
-               int level = 0;
-               while (level < 3) {
-                       bool did_something = false;
-                       switch (level) {
-                       case 2:
-                               did_something |= expand_cellmap("$_DFF_*_", "C");
-                               did_something |= expand_cellmap("$_DFF_*??_", "C");
-                               did_something |= expand_cellmap("$_DFFSR_*??_", "C");
-                       case 1:
-                               did_something |= expand_cellmap("$_DFF_??*_", "DQ");
-                       case 0:
-                               did_something |= expand_cellmap("$_DFF_?*?_", "R");
-                               did_something |= expand_cellmap("$_DFFSR_?*?_", "S");
-                               did_something |= expand_cellmap("$_DFFSR_??*_", "R");
-                       }
-                       if (!did_something)
-                               level++;
+               // try to implement as many cells as possible just by inverting
+               // the SET and RESET pins. If necessary, implement cell types
+               // by inverting both D and Q. Only invert clock pins if there
+               // is no other way of implementing the cell.
+               while (1)
+               {
+                       if (expand_cellmap("$_DFF_?*?_", "R") ||
+                                       expand_cellmap("$_DFFSR_?*?_", "S") ||
+                                       expand_cellmap("$_DFFSR_??*_", "R"))
+                               continue;
+
+                       if (expand_cellmap("$_DFF_??*_", "DQ"))
+                               continue;
+
+                       if (expand_cellmap("$_DFF_*_", "C") ||
+                                       expand_cellmap("$_DFF_*??_", "C") ||
+                                       expand_cellmap("$_DFFSR_*??_", "C"))
+                               continue;
+
+                       break;
                }
 
                map_sr_to_arst("$_DFFSR_NNN_", "$_DFF_NN0_");