a28e30d96d9f1358111cbb59e2c59165c74faeba
1 from litex
.gen
.fhdl
.structure
import *
2 from litex
.gen
.fhdl
.module
import Module
3 from litex
.gen
.fhdl
.bitcontainer
import bits_for
11 r
.append(v
[offset
:offset
+n
])
18 def displacer(signal
, shift
, output
, n
=None, reverse
=False):
20 return output
.eq(signal
)
25 r
= reversed(range(n
))
28 l
= [Replicate(shift
== i
, w
) & signal
for i
in r
]
29 return output
.eq(Cat(*l
))
32 def chooser(signal
, shift
, output
, n
=None, reverse
=False):
34 return output
.eq(signal
)
44 cases
[i
] = [output
.eq(signal
[s
*w
:(s
+1)*w
])]
45 return Case(shift
, cases
).makedefault()
48 def timeline(trigger
, events
):
49 lastevent
= max([e
[0] for e
in events
])
50 counter
= Signal(max=lastevent
+1)
52 counterlogic
= If(counter
!= 0,
53 counter
.eq(counter
+ 1)
57 # insert counter reset if it doesn't naturally overflow
58 # (test if lastevent+1 is a power of 2)
59 if (lastevent
& (lastevent
+ 1)) != 0:
60 counterlogic
= If(counter
== lastevent
,
68 return trigger
& (counter
== 0)
70 return counter
== e
[0]
71 sync
= [If(get_cond(e
), *e
[1]) for e
in events
]
72 sync
.append(counterlogic
)
76 class WaitTimer(Module
):
77 def __init__(self
, t
):
83 count
= Signal(bits_for(t
), reset
=t
)
84 self
.comb
+= self
.done
.eq(count
== 0)
87 If(~self
.done
, count
.eq(count
- 1))
88 ).Else(count
.eq(count
.reset
))
91 class BitSlip(Module
):
92 def __init__(self
, dw
):
95 self
.value
= Signal(max=dw
)
100 self
.sync
+= r
.eq(Cat(r
[dw
:], self
.i
))
103 cases
[i
] = self
.o
.eq(r
[i
:dw
+i
])
104 self
.sync
+= Case(self
.value
, cases
)