1 from nmigen
import (Elaboratable
, Signal
, Module
)
4 class MaskGen(Elaboratable
):
5 """MaskGen - create a diff mask
7 example: x=5 --> a=0b11111
14 def __init__(self
, width
):
16 self
.shiftwidth
= math
.ceil(math
.log2(width
))
17 self
.mb
= Signal(self
.shiftwidth
, reset_less
=True)
18 self
.me
= Signal(self
.shiftwidth
, reset_less
=True)
20 self
.o
= Signal(width
, reset_less
=True)
22 def elaborate(self
, platform
):
26 x
= Signal
.like(self
.mb
)
27 y
= Signal
.like(self
.mb
)
29 comb
+= x
.eq(64 - self
.mb
)
30 comb
+= y
.eq(63 - self
.me
)
32 mask_a
= Signal
.like(self
.o
)
33 mask_b
= Signal
.like(self
.o
)
35 comb
+= mask_a
.eq((1<<x
) - 1)
36 comb
+= mask_b
.eq((1<<y
) - 1)
39 comb
+= self
.o
.eq(mask_a ^ mask_b
)
41 comb
+= self
.o
.eq(mask_a ^ ~mask_b
)
47 return [self
.mb
, self
.me
, self
.o
]