diff options
author | Eddie Hung <eddie@fpgeh.com> | 2020-03-18 12:21:40 -0700 |
---|---|---|
committer | Eddie Hung <eddie@fpgeh.com> | 2020-03-18 12:21:40 -0700 |
commit | 7ad7f41bc555d7fc77a2201cdc485702505df637 (patch) | |
tree | ca262dbd1d7e7e598228c3bf97898e5fac535b57 /passes/opt | |
parent | a0cc795e85541b0326b6d4396a726142f0d0f8bb (diff) | |
download | yosys-7ad7f41bc555d7fc77a2201cdc485702505df637.tar.gz yosys-7ad7f41bc555d7fc77a2201cdc485702505df637.tar.bz2 yosys-7ad7f41bc555d7fc77a2201cdc485702505df637.zip |
kernel: share a single CellTypes within a pass
Diffstat (limited to 'passes/opt')
-rw-r--r-- | passes/opt/opt_expr.cc | 6 | ||||
-rw-r--r-- | passes/opt/share.cc | 43 |
2 files changed, 32 insertions, 17 deletions
diff --git a/passes/opt/opt_expr.cc b/passes/opt/opt_expr.cc index 4a2f170b8..c13184025 100644 --- a/passes/opt/opt_expr.cc +++ b/passes/opt/opt_expr.cc @@ -31,9 +31,8 @@ PRIVATE_NAMESPACE_BEGIN bool did_something; -void replace_undriven(RTLIL::Design *design, RTLIL::Module *module) +void replace_undriven(RTLIL::Module *module, const CellTypes& ct) { - CellTypes ct(design); SigMap sigmap(module); SigPool driven_signals; SigPool used_signals; @@ -1737,13 +1736,14 @@ struct OptExprPass : public Pass { } extra_args(args, argidx, design); + CellTypes ct(design); for (auto module : design->selected_modules()) { log("Optimizing module %s.\n", log_id(module)); if (undriven) { did_something = false; - replace_undriven(design, module); + replace_undriven(module, ct); if (did_something) design->scratchpad_set_bool("opt.did_something", true); } diff --git a/passes/opt/share.cc b/passes/opt/share.cc index 92ce3fd11..0dea500dd 100644 --- a/passes/opt/share.cc +++ b/passes/opt/share.cc @@ -41,7 +41,8 @@ struct ShareWorkerConfig struct ShareWorker { - ShareWorkerConfig config; + const ShareWorkerConfig config; + int limit; pool<RTLIL::IdString> generic_ops; RTLIL::Design *design; @@ -49,7 +50,6 @@ struct ShareWorker CellTypes fwd_ct, cone_ct; ModWalker modwalker; - ModIndex mi; pool<RTLIL::Cell*> cells_to_remove; pool<RTLIL::Cell*> recursion_state; @@ -1071,6 +1071,8 @@ struct ShareWorker ct.setup_internals(); ct.setup_stdcells(); + ModIndex mi(module); + pool<RTLIL::Cell*> queue, covered; queue.insert(cell); @@ -1117,13 +1119,9 @@ struct ShareWorker module->remove(cell); } - ShareWorker(ShareWorkerConfig config, RTLIL::Design *design, RTLIL::Module *module) : - config(config), design(design), module(module), mi(module) + ShareWorker(ShareWorkerConfig config, RTLIL::Design* design) : + config(config), design(design), modwalker(design) { - #ifndef NDEBUG - bool before_scc = module_has_scc(); - #endif - generic_ops.insert(config.generic_uni_ops.begin(), config.generic_uni_ops.end()); generic_ops.insert(config.generic_bin_ops.begin(), config.generic_bin_ops.end()); generic_ops.insert(config.generic_cbin_ops.begin(), config.generic_cbin_ops.end()); @@ -1140,8 +1138,24 @@ struct ShareWorker cone_ct.cell_types.erase(ID($shr)); cone_ct.cell_types.erase(ID($sshl)); cone_ct.cell_types.erase(ID($sshr)); + } + + void operator()(RTLIL::Module *module) { + this->module = module; - modwalker.setup(design, module); + #ifndef NDEBUG + bool before_scc = module_has_scc(); + #endif + + limit = config.limit; + + modwalker.setup(module); + + cells_to_remove.clear(); + recursion_state.clear();; + topo_cell_drivers.clear(); + topo_bit_drivers.clear(); + exclusive_ctrls.clear(); find_terminal_bits(); find_shareable_cells(); @@ -1399,8 +1413,8 @@ struct ShareWorker topo_cell_drivers[cell] = { supercell }; topo_cell_drivers[other_cell] = { supercell }; - if (config.limit > 0) - config.limit--; + if (limit > 0) + limit--; break; } @@ -1528,9 +1542,10 @@ struct SharePass : public Pass { } extra_args(args, argidx, design); - for (auto &mod_it : design->modules_) - if (design->selected(mod_it.second)) - ShareWorker(config, design, mod_it.second); + ShareWorker sw(config, design); + + for (auto module : design->selected_modules()) + sw(module); } } SharePass; |