|
1 | 1 | import math |
2 | 2 |
|
3 | | -from amaranth import Elaboratable, Module, Signal, Const |
| 3 | +from amaranth import Elaboratable, Module, Signal, Cat |
4 | 4 |
|
5 | 5 |
|
6 | 6 | class AdderFramework(Elaboratable): |
@@ -68,32 +68,30 @@ def elaborate(self, platform): |
68 | 68 | m.d.comb += p_tmp[i].eq(self._p[i]) |
69 | 69 |
|
70 | 70 | self._calculate_pg() |
| 71 | + o = [Signal() for i in range(self._bits)] |
71 | 72 |
|
72 | 73 | # g is the carry out signal. We need to shift it left one bit then |
73 | | - # xor it with the sum (ie p_tmp). Since we have a list of 1 bit |
74 | | - # signals, just insert a constant zero signal at the head of of the |
75 | | - # list to shift g. |
76 | | - self._g.insert(0, Const(0)) |
| 74 | + # xor it with the sum (ie p_tmp). This means bit 0 is just p. |
| 75 | + m.d.comb += o[0].eq(p_tmp[0]) |
77 | 76 |
|
78 | | - o = Signal(self._bits) |
79 | | - for i in range(self._bits): |
80 | | - # This also flattens the list of bits when writing to o |
81 | | - self._generate_xor(p_tmp[i], self._g[i], o[i]) |
| 77 | + for i in range(1, self._bits): |
| 78 | + self._generate_xor(p_tmp[i], self._g[i - 1], o[i]) |
82 | 79 |
|
83 | 80 | if self._carry_out: |
84 | 81 | carry_out = Signal() |
85 | | - m.d.comb += carry_out.eq(self._g[self._bits]) |
| 82 | + m.d.comb += carry_out.eq(self._g[self._bits - 1]) |
86 | 83 |
|
87 | 84 | if self._register_output: |
88 | 85 | m.d.sync += self.carry_out.eq(carry_out) |
89 | 86 | else: |
90 | 87 | m.d.comb += self.carry_out.eq(carry_out) |
91 | 88 |
|
92 | 89 | o2 = Signal(self._bits, reset_less=True) |
| 90 | + # This also flattens the list of bits when writing to o2 |
93 | 91 | if self._register_output: |
94 | | - m.d.sync += o2.eq(o) |
| 92 | + m.d.sync += o2.eq(Cat(o[n] for n in range(len(o)))) |
95 | 93 | else: |
96 | | - m.d.comb += o2.eq(o) |
| 94 | + m.d.comb += o2.eq(Cat(o[n] for n in range(len(o)))) |
97 | 95 |
|
98 | 96 | m.d.comb += self.o.eq(o2) |
99 | 97 | return m |
|
0 commit comments