+ s_latches = []
+ for i in range(self.shadow_wid):
+ sl = SRLatch(sync=False)
+ setattr(m.submodules, "shadow%d" % i, sl)
+ s_latches.append(sl)
+
+ # shadow / recover (optional: shadow_wid > 0)
+ if self.shadow_wid:
+ recover = self.go_die_o
+ si = Signal(self.shadow_wid, reset_less=True)
+ sq = Signal(self.shadow_wid, reset_less=True)
+ shadown = Signal(reset_less=True)
+ recfail = Signal(self.shadow_wid, reset_less=True)
+ l = self.shadow_i & Cat(*([self.issue_i] * self.shadow_wid))
+ q_l = []
+ for i, s in enumerate(l):
+ m.d.comb += s_latches[i].s.eq(s) # issue_i & shadow_i[i]
+ m.d.comb += s_latches[i].r.eq(self.s_good_i[i])
+ q_l.append(s_latches[i].q)
+ m.d.comb += sq.eq(Cat(*q_l))
+ m.d.comb += shadown.eq(~sq.bool())
+ m.d.comb += recfail.eq(sq & self.s_fail_i)
+ m.d.comb += recover.eq(recfail.bool())
+ else:
+ shadown = Const(1)
+ recover = Const(0)