aboutsummaryrefslogtreecommitdiffstats
path: root/passes/pmgen/peepopt.pmg
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2019-04-29 13:38:56 +0200
committerClifford Wolf <clifford@clifford.at>2019-04-29 13:38:56 +0200
commitea547bcaa355239d927a8b43fde37fcfdaf71ffb (patch)
tree207ae80037f68c3f13eb6cf668446ff95e1f17d2 /passes/pmgen/peepopt.pmg
parent9f792c599db0cc466444d58e3c675711deb6349b (diff)
downloadyosys-ea547bcaa355239d927a8b43fde37fcfdaf71ffb.tar.gz
yosys-ea547bcaa355239d927a8b43fde37fcfdaf71ffb.tar.bz2
yosys-ea547bcaa355239d927a8b43fde37fcfdaf71ffb.zip
Add "peepopt" skeleton
Signed-off-by: Clifford Wolf <clifford@clifford.at>
Diffstat (limited to 'passes/pmgen/peepopt.pmg')
-rw-r--r--passes/pmgen/peepopt.pmg34
1 files changed, 34 insertions, 0 deletions
diff --git a/passes/pmgen/peepopt.pmg b/passes/pmgen/peepopt.pmg
new file mode 100644
index 000000000..0a56016b2
--- /dev/null
+++ b/passes/pmgen/peepopt.pmg
@@ -0,0 +1,34 @@
+pattern shiftmul
+
+state <SigSpec> shamt
+
+match shift
+ select shift->type.in($shift, $shiftx, $shr)
+endmatch
+
+code shamt
+ shamt = port(shift, \B);
+ if (shamt[GetSize(shamt)-1] == State::S0) {
+ do {
+ shamt.remove(GetSize(shamt)-1);
+ } while (shamt[GetSize(shamt)-1] == State::S0);
+ } else
+ if (param(shift, \B_SIGNED).as_bool()) {
+ reject;
+ }
+endcode
+
+match mul
+ select mul->type.in($mul)
+ select port(mul, \A).is_fully_const() || port(mul, \B).is_fully_const()
+ index <SigSpec> port(mul, \Y) === shamt
+endmatch
+
+code
+ IdString const_factor_port = port(mul, \A).is_fully_const() ? \A : \B;
+ int const_factor = port(mul, const_factor_port).as_int();
+ if (GetSize(port(shift, \Y)) > const_factor)
+ reject;
+ log_dump(shift, shamt, mul, const_factor);
+ reject;
+endcode