+class FPNorm2Mod:
+
+ def __init__(self, width):
+ self.out_norm = Signal(reset_less=True)
+ self.in_z = FPNumBase(width, False)
+ self.out_z = FPNumBase(width, False)
+ self.in_of = Overflow()
+ self.out_of = Overflow()
+
+ def setup(self, m, in_z, out_z, in_of, out_of, out_norm):
+ """ links module to inputs and outputs
+ """
+ m.d.comb += self.in_z.copy(in_z)
+ m.d.comb += out_z.copy(self.out_z)
+ m.d.comb += self.in_of.copy(in_of)
+ m.d.comb += out_of.copy(self.out_of)
+ m.d.comb += out_norm.eq(self.out_norm)
+
+ def elaborate(self, platform):
+ m = Module()
+ m.submodules.norm1_in_overflow = self.in_of
+ m.submodules.norm1_out_overflow = self.out_of
+ m.submodules.norm1_in_z = self.in_z
+ m.submodules.norm1_out_z = self.out_z
+ m.d.comb += self.out_z.copy(self.in_z)
+ m.d.comb += self.out_of.copy(self.in_of)
+ m.d.comb += self.out_norm.eq(self.in_z.exp_lt_n126)
+ with m.If(self.out_norm):
+ m.d.comb += [
+ self.out_z.e.eq(self.in_z.e + 1), # INCREASE exponent
+ self.out_z.m.eq(self.in_z.m >> 1), # shift mantissa DOWN
+ self.out_of.guard.eq(self.in_z.m[0]),
+ self.out_of.m0.eq(self.in_z.m[1]),
+ self.out_of.round_bit.eq(self.in_of.guard),
+ self.out_of.sticky.eq(self.in_of.sticky | self.in_of.round_bit)
+ ]
+
+ return m
+
+