diff options
author | Marcelina KoĆcielnicka <mwk@0x04.net> | 2021-10-01 23:50:48 +0200 |
---|---|---|
committer | Marcelina KoĆcielnicka <mwk@0x04.net> | 2021-10-02 20:19:48 +0200 |
commit | 63b9df8693840d17def8abcb0e848112283b0231 (patch) | |
tree | 7cb46fa0119760ef17d9d8d3999090cb71342d40 /kernel/ffmerge.cc | |
parent | ec2b5548fe9b8d291365a84a0c3fc87654643359 (diff) | |
download | yosys-63b9df8693840d17def8abcb0e848112283b0231.tar.gz yosys-63b9df8693840d17def8abcb0e848112283b0231.tar.bz2 yosys-63b9df8693840d17def8abcb0e848112283b0231.zip |
kernel/ff: Refactor FfData to enable FFs with async load.
- *_en is split into *_ce (clock enable) and *_aload (async load aka
latch gate enable), so both can be present at once
- has_d is removed
- has_gclk is added (to have a clear marker for $ff)
- d_is_const and val_d leftovers are removed
- async2sync, clk2fflogic, opt_dff are updated to operate correctly on
FFs with async load
Diffstat (limited to 'kernel/ffmerge.cc')
-rw-r--r-- | kernel/ffmerge.cc | 67 |
1 files changed, 47 insertions, 20 deletions
diff --git a/kernel/ffmerge.cc b/kernel/ffmerge.cc index 6a29acc96..7d62a88cf 100644 --- a/kernel/ffmerge.cc +++ b/kernel/ffmerge.cc @@ -62,22 +62,28 @@ bool FfMergeHelper::find_output_ff(RTLIL::SigSpec sig, FfData &ff, pool<std::pai FfData cur_ff(initvals, cell); - log_assert(cur_ff.has_d); + // Reject latches and $ff. + if (!cur_ff.has_clk) + return false; + log_assert((*sigmap)(cur_ff.sig_d[idx]) == bit); if (!found) { ff.sig_clk = cur_ff.sig_clk; - ff.sig_en = cur_ff.sig_en; + ff.sig_ce = cur_ff.sig_ce; + ff.sig_aload = cur_ff.sig_aload; ff.sig_srst = cur_ff.sig_srst; ff.sig_arst = cur_ff.sig_arst; ff.has_clk = cur_ff.has_clk; - ff.has_en = cur_ff.has_en; + ff.has_ce = cur_ff.has_ce; + ff.has_aload = cur_ff.has_aload; ff.has_srst = cur_ff.has_srst; ff.has_arst = cur_ff.has_arst; ff.has_sr = cur_ff.has_sr; ff.ce_over_srst = cur_ff.ce_over_srst; ff.pol_clk = cur_ff.pol_clk; - ff.pol_en = cur_ff.pol_en; + ff.pol_ce = cur_ff.pol_ce; + ff.pol_aload = cur_ff.pol_aload; ff.pol_arst = cur_ff.pol_arst; ff.pol_srst = cur_ff.pol_srst; ff.pol_clr = cur_ff.pol_clr; @@ -85,7 +91,9 @@ bool FfMergeHelper::find_output_ff(RTLIL::SigSpec sig, FfData &ff, pool<std::pai } else { if (ff.has_clk != cur_ff.has_clk) return false; - if (ff.has_en != cur_ff.has_en) + if (ff.has_ce != cur_ff.has_ce) + return false; + if (ff.has_aload != cur_ff.has_aload) return false; if (ff.has_srst != cur_ff.has_srst) return false; @@ -99,10 +107,16 @@ bool FfMergeHelper::find_output_ff(RTLIL::SigSpec sig, FfData &ff, pool<std::pai if (ff.pol_clk != cur_ff.pol_clk) return false; } - if (ff.has_en) { - if (ff.sig_en != cur_ff.sig_en) + if (ff.has_ce) { + if (ff.sig_ce != cur_ff.sig_ce) + return false; + if (ff.pol_ce != cur_ff.pol_ce) + return false; + } + if (ff.has_aload) { + if (ff.sig_aload != cur_ff.sig_aload) return false; - if (ff.pol_en != cur_ff.pol_en) + if (ff.pol_aload != cur_ff.pol_aload) return false; } if (ff.has_srst) { @@ -110,7 +124,7 @@ bool FfMergeHelper::find_output_ff(RTLIL::SigSpec sig, FfData &ff, pool<std::pai return false; if (ff.pol_srst != cur_ff.pol_srst) return false; - if (ff.has_en && ff.ce_over_srst != cur_ff.ce_over_srst) + if (ff.has_ce && ff.ce_over_srst != cur_ff.ce_over_srst) return false; } if (ff.has_arst) { @@ -129,6 +143,7 @@ bool FfMergeHelper::find_output_ff(RTLIL::SigSpec sig, FfData &ff, pool<std::pai ff.width++; ff.sig_d.append(cur_ff.sig_d[idx]); + ff.sig_ad.append(ff.has_aload ? cur_ff.sig_ad[idx] : State::Sx); ff.sig_q.append(cur_ff.sig_q[idx]); ff.sig_clr.append(ff.has_sr ? cur_ff.sig_clr[idx] : State::S0); ff.sig_set.append(ff.has_sr ? cur_ff.sig_set[idx] : State::S0); @@ -179,28 +194,33 @@ bool FfMergeHelper::find_input_ff(RTLIL::SigSpec sig, FfData &ff, pool<std::pair if (!found) { ff.sig_clk = cur_ff.sig_clk; - ff.sig_en = cur_ff.sig_en; + ff.sig_ce = cur_ff.sig_ce; + ff.sig_aload = cur_ff.sig_aload; ff.sig_srst = cur_ff.sig_srst; ff.sig_arst = cur_ff.sig_arst; - ff.has_d = cur_ff.has_d; ff.has_clk = cur_ff.has_clk; - ff.has_en = cur_ff.has_en; + ff.has_gclk = cur_ff.has_gclk; + ff.has_ce = cur_ff.has_ce; + ff.has_aload = cur_ff.has_aload; ff.has_srst = cur_ff.has_srst; ff.has_arst = cur_ff.has_arst; ff.has_sr = cur_ff.has_sr; ff.ce_over_srst = cur_ff.ce_over_srst; ff.pol_clk = cur_ff.pol_clk; - ff.pol_en = cur_ff.pol_en; + ff.pol_ce = cur_ff.pol_ce; + ff.pol_aload = cur_ff.pol_aload; ff.pol_arst = cur_ff.pol_arst; ff.pol_srst = cur_ff.pol_srst; ff.pol_clr = cur_ff.pol_clr; ff.pol_set = cur_ff.pol_set; } else { - if (ff.has_d != cur_ff.has_d) + if (ff.has_gclk != cur_ff.has_gclk) return false; if (ff.has_clk != cur_ff.has_clk) return false; - if (ff.has_en != cur_ff.has_en) + if (ff.has_ce != cur_ff.has_ce) + return false; + if (ff.has_aload != cur_ff.has_aload) return false; if (ff.has_srst != cur_ff.has_srst) return false; @@ -214,10 +234,16 @@ bool FfMergeHelper::find_input_ff(RTLIL::SigSpec sig, FfData &ff, pool<std::pair if (ff.pol_clk != cur_ff.pol_clk) return false; } - if (ff.has_en) { - if (ff.sig_en != cur_ff.sig_en) + if (ff.has_ce) { + if (ff.sig_ce != cur_ff.sig_ce) + return false; + if (ff.pol_ce != cur_ff.pol_ce) + return false; + } + if (ff.has_aload) { + if (ff.sig_aload != cur_ff.sig_aload) return false; - if (ff.pol_en != cur_ff.pol_en) + if (ff.pol_aload != cur_ff.pol_aload) return false; } if (ff.has_srst) { @@ -225,7 +251,7 @@ bool FfMergeHelper::find_input_ff(RTLIL::SigSpec sig, FfData &ff, pool<std::pair return false; if (ff.pol_srst != cur_ff.pol_srst) return false; - if (ff.has_en && ff.ce_over_srst != cur_ff.ce_over_srst) + if (ff.has_ce && ff.ce_over_srst != cur_ff.ce_over_srst) return false; } if (ff.has_arst) { @@ -243,7 +269,8 @@ bool FfMergeHelper::find_input_ff(RTLIL::SigSpec sig, FfData &ff, pool<std::pair } ff.width++; - ff.sig_d.append(ff.has_d ? cur_ff.sig_d[idx] : State::Sx); + ff.sig_d.append((ff.has_clk || ff.has_gclk) ? cur_ff.sig_d[idx] : State::Sx); + ff.sig_ad.append(ff.has_aload ? cur_ff.sig_ad[idx] : State::Sx); ff.sig_q.append(cur_ff.sig_q[idx]); ff.sig_clr.append(ff.has_sr ? cur_ff.sig_clr[idx] : State::S0); ff.sig_set.append(ff.has_sr ? cur_ff.sig_set[idx] : State::S0); |