From: Clifford Wolf Date: Fri, 20 Dec 2013 11:34:34 +0000 (+0100) Subject: Further improved dfflibmap cellmap exploration X-Git-Tag: yosys-0.2.0~234 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=eaf7d9675de7e54ef55b5cd45784c2ea7556e8cf;p=yosys.git Further improved dfflibmap cellmap exploration --- diff --git a/passes/techmap/dfflibmap.cc b/passes/techmap/dfflibmap.cc index c35a09c26..a38ec66b2 100644 --- a/passes/techmap/dfflibmap.cc +++ b/passes/techmap/dfflibmap.cc @@ -473,20 +473,24 @@ struct DfflibmapPass : public Pass { find_cell_sr(libparser.ast, "$_DFFSR_PPN_", true, true, false); find_cell_sr(libparser.ast, "$_DFFSR_PPP_", true, true, true); - bool keep_running; - do { - keep_running = false; - keep_running |= expand_cellmap("$_DFF_?*?_", "R"); - keep_running |= expand_cellmap("$_DFF_??*_", "DQ"); - keep_running |= expand_cellmap("$_DFFSR_?*?_", "S"); - keep_running |= expand_cellmap("$_DFFSR_??*_", "R"); - } while (keep_running); - do { - keep_running = false; - keep_running |= expand_cellmap("$_DFF_*_", "C"); - keep_running |= expand_cellmap("$_DFF_*??_", "C"); - keep_running |= expand_cellmap("$_DFFSR_*??_", "C"); - } while (keep_running); + 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++; + } map_sr_to_arst("$_DFFSR_NNN_", "$_DFF_NN0_"); map_sr_to_arst("$_DFFSR_NNN_", "$_DFF_NN1_");