diff options
author | Clifford Wolf <clifford@clifford.at> | 2019-04-29 13:38:56 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2019-04-29 13:38:56 +0200 |
commit | ea547bcaa355239d927a8b43fde37fcfdaf71ffb (patch) | |
tree | 207ae80037f68c3f13eb6cf668446ff95e1f17d2 /passes/pmgen/peepopt.pmg | |
parent | 9f792c599db0cc466444d58e3c675711deb6349b (diff) | |
download | yosys-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.pmg | 34 |
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 |