2 * yosys -- Yosys Open SYnthesis Suite
4 * Copyright (C) 2012 Clifford Wolf <clifford@clifford.at>
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.
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.
20 #include "kernel/register.h"
21 #include "kernel/bitpattern.h"
22 #include "kernel/log.h"
29 PRIVATE_NAMESPACE_BEGIN
31 void proc_rmdead(RTLIL::SwitchRule
*sw
, int &counter
)
33 BitPatternPool
pool(sw
->signal
);
35 for (size_t i
= 0; i
< sw
->cases
.size(); i
++)
37 bool is_default
= SIZE(sw
->cases
[i
]->compare
) == 0 && (!pool
.empty() || SIZE(sw
->signal
) == 0);
39 for (size_t j
= 0; j
< sw
->cases
[i
]->compare
.size(); j
++) {
40 RTLIL::SigSpec sig
= sw
->cases
[i
]->compare
[j
];
41 if (!sig
.is_fully_const())
44 sw
->cases
[i
]->compare
.erase(sw
->cases
[i
]->compare
.begin() + (j
--));
48 if (sw
->cases
[i
]->compare
.size() == 0) {
50 sw
->cases
.erase(sw
->cases
.begin() + (i
--));
55 sw
->cases
[i
]->compare
.clear();
58 for (auto switch_it
: sw
->cases
[i
]->switches
)
59 proc_rmdead(switch_it
, counter
);
66 struct ProcRmdeadPass
: public Pass
{
67 ProcRmdeadPass() : Pass("proc_rmdead", "eliminate dead trees in decision trees") { }
70 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
72 log(" proc_rmdead [selection]\n");
74 log("This pass identifies unreachable branches in decision trees and removes them.\n");
77 virtual void execute(std::vector
<std::string
> args
, RTLIL::Design
*design
)
79 log_header("Executing PROC_RMDEAD pass (remove dead branches from decision trees).\n");
81 extra_args(args
, 1, design
);
83 int total_counter
= 0;
84 for (auto mod
: design
->modules()) {
85 if (!design
->selected(mod
))
87 for (auto &proc_it
: mod
->processes
) {
88 if (!design
->selected(mod
, proc_it
.second
))
91 for (auto switch_it
: proc_it
.second
->root_case
.switches
)
92 proc_rmdead(switch_it
, counter
);
94 log("Removed %d dead cases from process %s in module %s.\n", counter
,
95 proc_it
.first
.c_str(), log_id(mod
));
96 total_counter
+= counter
;
100 log("Removed a total of %d dead cases.\n", total_counter
);
104 PRIVATE_NAMESPACE_END