Merge pull request #1828 from YosysHQ/eddie/celltypes_speedup

kernel: share a single CellTypes within a pass
This commit is contained in:
Eddie Hung 2020-04-01 14:17:45 -07:00 committed by GitHub
commit c90324662c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 50 additions and 31 deletions

View File

@ -380,22 +380,15 @@ struct ModWalker
} }
} }
ModWalker() : design(NULL), module(NULL) ModWalker(RTLIL::Design *design) : design(design), module(NULL)
{ {
ct.setup(design);
} }
ModWalker(RTLIL::Design *design, RTLIL::Module *module, CellTypes *filter_ct = NULL) void setup(RTLIL::Module *module, CellTypes *filter_ct = NULL)
{ {
setup(design, module, filter_ct);
}
void setup(RTLIL::Design *design, RTLIL::Module *module, CellTypes *filter_ct = NULL)
{
this->design = design;
this->module = module; this->module = module;
ct.clear();
ct.setup(design);
sigmap.set(module); sigmap.set(module);
signal_drivers.clear(); signal_drivers.clear();

View File

@ -665,11 +665,17 @@ struct MemoryShareWorker
// Setup and run // Setup and run
// ------------- // -------------
MemoryShareWorker(RTLIL::Design *design, RTLIL::Module *module) : MemoryShareWorker(RTLIL::Design *design) : design(design), modwalker(design) {}
design(design), module(module), sigmap(module)
void operator()(RTLIL::Module* module)
{ {
std::map<std::string, std::pair<std::vector<RTLIL::Cell*>, std::vector<RTLIL::Cell*>>> memindex; std::map<std::string, std::pair<std::vector<RTLIL::Cell*>, std::vector<RTLIL::Cell*>>> memindex;
this->module = module;
sigmap.set(module);
sig_to_mux.clear();
conditions_logic_cache.clear();
sigmap_xmux = sigmap; sigmap_xmux = sigmap;
for (auto cell : module->cells()) for (auto cell : module->cells())
{ {
@ -717,7 +723,7 @@ struct MemoryShareWorker
cone_ct.cell_types.erase("$shift"); cone_ct.cell_types.erase("$shift");
cone_ct.cell_types.erase("$shiftx"); cone_ct.cell_types.erase("$shiftx");
modwalker.setup(design, module, &cone_ct); modwalker.setup(module, &cone_ct);
for (auto &it : memindex) for (auto &it : memindex)
consolidate_wr_using_sat(it.first, it.second.second); consolidate_wr_using_sat(it.first, it.second.second);
@ -755,8 +761,10 @@ struct MemorySharePass : public Pass {
void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE { void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE {
log_header(design, "Executing MEMORY_SHARE pass (consolidating $memrd/$memwr cells).\n"); log_header(design, "Executing MEMORY_SHARE pass (consolidating $memrd/$memwr cells).\n");
extra_args(args, 1, design); extra_args(args, 1, design);
MemoryShareWorker msw(design);
for (auto module : design->selected_modules()) for (auto module : design->selected_modules())
MemoryShareWorker(design, module); msw(module);
} }
} MemorySharePass; } MemorySharePass;

View File

@ -31,9 +31,8 @@ PRIVATE_NAMESPACE_BEGIN
bool did_something; 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); SigMap sigmap(module);
SigPool driven_signals; SigPool driven_signals;
SigPool used_signals; SigPool used_signals;
@ -1803,13 +1802,14 @@ struct OptExprPass : public Pass {
} }
extra_args(args, argidx, design); extra_args(args, argidx, design);
CellTypes ct(design);
for (auto module : design->selected_modules()) for (auto module : design->selected_modules())
{ {
log("Optimizing module %s.\n", log_id(module)); log("Optimizing module %s.\n", log_id(module));
if (undriven) { if (undriven) {
did_something = false; did_something = false;
replace_undriven(design, module); replace_undriven(module, ct);
if (did_something) if (did_something)
design->scratchpad_set_bool("opt.did_something", true); design->scratchpad_set_bool("opt.did_something", true);
} }

View File

@ -41,7 +41,8 @@ struct ShareWorkerConfig
struct ShareWorker struct ShareWorker
{ {
ShareWorkerConfig config; const ShareWorkerConfig config;
int limit;
pool<RTLIL::IdString> generic_ops; pool<RTLIL::IdString> generic_ops;
RTLIL::Design *design; RTLIL::Design *design;
@ -49,7 +50,6 @@ struct ShareWorker
CellTypes fwd_ct, cone_ct; CellTypes fwd_ct, cone_ct;
ModWalker modwalker; ModWalker modwalker;
ModIndex mi;
pool<RTLIL::Cell*> cells_to_remove; pool<RTLIL::Cell*> cells_to_remove;
pool<RTLIL::Cell*> recursion_state; pool<RTLIL::Cell*> recursion_state;
@ -1071,6 +1071,8 @@ struct ShareWorker
ct.setup_internals(); ct.setup_internals();
ct.setup_stdcells(); ct.setup_stdcells();
ModIndex mi(module);
pool<RTLIL::Cell*> queue, covered; pool<RTLIL::Cell*> queue, covered;
queue.insert(cell); queue.insert(cell);
@ -1117,13 +1119,9 @@ struct ShareWorker
module->remove(cell); module->remove(cell);
} }
ShareWorker(ShareWorkerConfig config, RTLIL::Design *design, RTLIL::Module *module) : ShareWorker(ShareWorkerConfig config, RTLIL::Design* design) :
config(config), design(design), module(module), mi(module) 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_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_bin_ops.begin(), config.generic_bin_ops.end());
generic_ops.insert(config.generic_cbin_ops.begin(), config.generic_cbin_ops.end()); generic_ops.insert(config.generic_cbin_ops.begin(), config.generic_cbin_ops.end());
@ -1140,8 +1138,27 @@ struct ShareWorker
cone_ct.cell_types.erase(ID($shr)); cone_ct.cell_types.erase(ID($shr));
cone_ct.cell_types.erase(ID($sshl)); cone_ct.cell_types.erase(ID($sshl));
cone_ct.cell_types.erase(ID($sshr)); cone_ct.cell_types.erase(ID($sshr));
}
modwalker.setup(design, module); void operator()(RTLIL::Module *module) {
this->module = 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();
terminal_bits.clear();
shareable_cells.clear();
forbidden_controls_cache.clear();
activation_patterns_cache.clear();
find_terminal_bits(); find_terminal_bits();
find_shareable_cells(); find_shareable_cells();
@ -1399,8 +1416,8 @@ struct ShareWorker
topo_cell_drivers[cell] = { supercell }; topo_cell_drivers[cell] = { supercell };
topo_cell_drivers[other_cell] = { supercell }; topo_cell_drivers[other_cell] = { supercell };
if (config.limit > 0) if (limit > 0)
config.limit--; limit--;
break; break;
} }
@ -1528,9 +1545,10 @@ struct SharePass : public Pass {
} }
extra_args(args, argidx, design); extra_args(args, argidx, design);
for (auto &mod_it : design->modules_) ShareWorker sw(config, design);
if (design->selected(mod_it.second))
ShareWorker(config, design, mod_it.second); for (auto module : design->selected_modules())
sw(module);
} }
} SharePass; } SharePass;