Merge remote-tracking branch 'origin/master' into clifford/specify
[yosys.git] / passes / pmgen / peepopt.cc
1 /*
2 * yosys -- Yosys Open SYnthesis Suite
3 *
4 * Copyright (C) 2012 Clifford Wolf <clifford@clifford.at>
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 *
18 */
19
20 #include "kernel/yosys.h"
21 #include "kernel/sigtools.h"
22
23 USING_YOSYS_NAMESPACE
24 PRIVATE_NAMESPACE_BEGIN
25
26 bool did_something;
27
28 #include "passes/pmgen/peepopt_pm.h"
29
30 struct PeepoptPass : public Pass {
31 PeepoptPass() : Pass("peepopt", "collection of peephole optimizers") { }
32 void help() YS_OVERRIDE
33 {
34 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
35 log("\n");
36 log(" peepopt [options] [selection]\n");
37 log("\n");
38 log("This pass applies a collection of peephole optimizers to the current design.\n");
39 log("\n");
40 }
41 void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
42 {
43 log_header(design, "Executing PEEPOPT pass (run peephole optimizers).\n");
44
45 size_t argidx;
46 for (argidx = 1; argidx < args.size(); argidx++)
47 {
48 // if (args[argidx] == "-singleton") {
49 // singleton_mode = true;
50 // continue;
51 // }
52 break;
53 }
54 extra_args(args, argidx, design);
55
56 for (auto module : design->selected_modules()) {
57 did_something = true;
58 while (did_something) {
59 did_something = false;
60 peepopt_pm pm(module, module->selected_cells());
61 pm.run_shiftmul();
62 pm.run_muldiv();
63 }
64 }
65 }
66 } PeepoptPass;
67
68 PRIVATE_NAMESPACE_END