1 from nmigen
import (Elaboratable
, Signal
, Module
)
3 # Copyright (C) 2020 Michael Nolan <mtnolan2640@gmail.com>
5 class MaskGen(Elaboratable
):
6 """MaskGen - create a diff mask
8 example: x=5 --> a=0b11111
15 def __init__(self
, width
):
17 self
.shiftwidth
= math
.ceil(math
.log2(width
))
18 self
.mb
= Signal(self
.shiftwidth
, reset_less
=True)
19 self
.me
= Signal(self
.shiftwidth
, reset_less
=True)
21 self
.o
= Signal(width
, reset_less
=True)
23 def elaborate(self
, platform
):
27 x
= Signal
.like(self
.mb
)
28 y
= Signal
.like(self
.mb
)
30 comb
+= x
.eq(64 - self
.mb
)
31 comb
+= y
.eq(63 - self
.me
)
33 mask_a
= Signal
.like(self
.o
)
34 mask_b
= Signal
.like(self
.o
)
36 comb
+= mask_a
.eq((1<<x
) - 1)
37 comb
+= mask_b
.eq((1<<y
) - 1)
40 comb
+= self
.o
.eq(mask_a ^ mask_b
)
42 comb
+= self
.o
.eq(mask_a ^ ~mask_b
)
48 return [self
.mb
, self
.me
, self
.o
]