1 from migen
.fhdl
.std
import *
2 from migen
.fhdl
.structure
import _Operator
4 def optree(op
, operands
, lb
=None, ub
=None, default
=None):
20 [optree(op
, operands
, lb
, s
, default
),
21 optree(op
, operands
, s
, ub
, default
)])
23 def split(v
, *counts
):
28 r
.append(v
[offset
:offset
+n
])
34 def displacer(signal
, shift
, output
, n
=None, reverse
=False):
36 return output
.eq(signal
)
41 r
= reversed(range(n
))
44 l
= [Replicate(shift
== i
, w
) & signal
for i
in r
]
45 return output
.eq(Cat(*l
))
47 def chooser(signal
, shift
, output
, n
=None, reverse
=False):
49 return output
.eq(signal
)
59 cases
[i
] = [output
.eq(signal
[s
*w
:(s
+1)*w
])]
60 return Case(shift
, cases
).makedefault()
62 def timeline(trigger
, events
):
63 lastevent
= max([e
[0] for e
in events
])
64 counter
= Signal(max=lastevent
+1)
66 counterlogic
= If(counter
!= 0,
67 counter
.eq(counter
+ 1)
71 # insert counter reset if it doesn't naturally overflow
72 # (test if lastevent+1 is a power of 2)
73 if (lastevent
& (lastevent
+ 1)) != 0:
74 counterlogic
= If(counter
== lastevent
,
82 return trigger
& (counter
== 0)
84 return counter
== e
[0]
85 sync
= [If(get_cond(e
), *e
[1]) for e
in events
]
86 sync
.append(counterlogic
)
89 @DecorateModule(InsertReset
)
90 @DecorateModule(InsertCE
)
91 class FlipFlop(Module
):
92 def __init__(self
, *args
, **kwargs
):
93 self
.d
= Signal(*args
, **kwargs
)
94 self
.q
= Signal(*args
, **kwargs
)
95 self
.sync
+= self
.q
.eq(self
.d
)
97 @DecorateModule(InsertReset
)
98 @DecorateModule(InsertCE
)
99 class Counter(Module
):
100 def __init__(self
, *args
, **kwargs
):
101 self
.value
= Signal(*args
, **kwargs
)
102 self
.width
= flen(self
.value
)
103 self
.sync
+= self
.value
.eq(self
.value
+1)
105 @DecorateModule(InsertReset
)
106 @DecorateModule(InsertCE
)
107 class Timeout(Module
):
108 def __init__(self
, length
):
109 self
.reached
= Signal()
111 value
= Signal(max=length
)
112 self
.sync
+= If(~self
.reached
, value
.eq(value
+1))
113 self
.comb
+= self
.reached
.eq(value
== (length
-1))