Added support for "keep" on modules
authorClifford Wolf <clifford@clifford.at>
Mon, 29 Sep 2014 10:51:54 +0000 (12:51 +0200)
committerClifford Wolf <clifford@clifford.at>
Mon, 29 Sep 2014 10:51:54 +0000 (12:51 +0200)
README
kernel/rtlil.h
passes/opt/opt_clean.cc
passes/opt/opt_share.cc

diff --git a/README b/README
index d7f5aaa4b57413deac681b3a0e304a991836e790..32a47cbfee1a93c677abeb4c6114b90c3b1a4505 100644 (file)
--- a/README
+++ b/README
@@ -273,6 +273,8 @@ Verilog Attributes and non-standard features
 - The "keep" attribute on cells and wires is used to mark objects that should
   never be removed by the optimizer. This is used for example for cells that
   have hidden connections that are not part of the netlist, such as IO pads.
+  Setting the "keep" attribute on a module has the same effect as setting it
+  on all instances of the module.
 
 - The "init" attribute on wires is set by the frontend when a register is
   initialized "FPGA-style" with 'reg foo = val'. It can be used during synthesis
index a0ae8f0828841910e3481939833024e750793474..8df0bfe19ff68932334484998497a3b1b1c9e14e 100644 (file)
@@ -857,6 +857,11 @@ public:
        void check();
        void fixup_parameters(bool set_a_signed = false, bool set_b_signed = false);
 
+       bool has_keep_attr() const {
+               return get_bool_attribute("\\keep") || (module && module->design && module->design->module(type) &&
+                               module->design->module(type)->get_bool_attribute("\\keep"));
+       }
+
        template<typename T> void rewrite_sigspecs(T functor);
 };
 
index d589518aad9bea27f98cca89b861cca7a03277e4..0e5ed238f358c0b91e26bf3305ac9b1b624a864d 100644 (file)
@@ -48,7 +48,7 @@ void rmunused_module_cells(RTLIL::Module *module, bool verbose)
                                wire2driver.insert(sig, cell);
                        }
                }
-               if (cell->type == "$memwr" || cell->type == "$assert" || cell->get_bool_attribute("\\keep"))
+               if (cell->type == "$memwr" || cell->type == "$assert" || cell->has_keep_attr())
                        queue.insert(cell);
                unused.insert(cell);
        }
index 33115349ce6bab350c1ece1523cad9ef4d7099ec..f8bc02205c6ce9fa5d83153f6de4183650481425 100644 (file)
@@ -196,7 +196,7 @@ struct OptShareWorker
                if (!ct.cell_known(cell1->type))
                        return cell1 < cell2;
 
-               if (cell1->get_bool_attribute("\\keep") || cell2->get_bool_attribute("\\keep"))
+               if (cell1->has_keep_attr() || cell2->has_keep_attr())
                        return cell1 < cell2;
 
                bool lt;