From: Clifford Wolf Date: Fri, 20 Dec 2013 13:21:18 +0000 (+0100) Subject: Cleanup of dfflibmap cellmap exploration code X-Git-Tag: yosys-0.2.0~233 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1fb29050e57b99822db3b111647a87491f935ee9;p=yosys.git Cleanup of dfflibmap cellmap exploration code --- diff --git a/passes/techmap/dfflibmap.cc b/passes/techmap/dfflibmap.cc index a38ec66b2..765a606cf 100644 --- a/passes/techmap/dfflibmap.cc +++ b/passes/techmap/dfflibmap.cc @@ -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_");