2 # SPDX-License-Identifier: LGPL-2.1-or-later
3 # See Notices.txt for copyright information
5 from nmigen
import Signal
, Module
, Elaboratable
6 from nmigen
.back
.pysim
import Simulator
, Delay
7 from nmigen
.cli
import rtlil
9 from ieee754
.part
.partsig
import PartitionedSignal
10 from ieee754
.part_mux
.part_mux
import PMux
13 # XXX this is for coriolis2 experimentation
14 class TestAddMod2(Elaboratable
):
15 def __init__(self
, width
, partpoints
):
16 self
.partpoints
= partpoints
17 self
.a
= PartitionedSignal(partpoints
, width
)
18 self
.b
= PartitionedSignal(partpoints
, width
)
19 self
.bsig
= Signal(width
)
20 self
.add_output
= Signal(width
)
21 self
.ls_output
= Signal(width
) # left shift
22 self
.ls_scal_output
= Signal(width
) # left shift
23 self
.sub_output
= Signal(width
)
24 self
.eq_output
= Signal(len(partpoints
)+1)
25 self
.gt_output
= Signal(len(partpoints
)+1)
26 self
.ge_output
= Signal(len(partpoints
)+1)
27 self
.ne_output
= Signal(len(partpoints
)+1)
28 self
.lt_output
= Signal(len(partpoints
)+1)
29 self
.le_output
= Signal(len(partpoints
)+1)
30 self
.mux_sel
= Signal(len(partpoints
)+1)
31 self
.mux_out
= Signal(width
)
32 self
.carry_in
= Signal(len(partpoints
)+1)
33 self
.add_carry_out
= Signal(len(partpoints
)+1)
34 self
.sub_carry_out
= Signal(len(partpoints
)+1)
35 self
.neg_output
= Signal(width
)
37 def elaborate(self
, platform
):
44 sync
+= self
.lt_output
.eq(self
.a
< self
.b
)
45 sync
+= self
.ne_output
.eq(self
.a
!= self
.b
)
46 sync
+= self
.le_output
.eq(self
.a
<= self
.b
)
47 sync
+= self
.gt_output
.eq(self
.a
> self
.b
)
48 sync
+= self
.eq_output
.eq(self
.a
== self
.b
)
49 sync
+= self
.ge_output
.eq(self
.a
>= self
.b
)
51 add_out
, add_carry
= self
.a
.add_op(self
.a
, self
.b
,
53 sync
+= self
.add_output
.eq(add_out
)
54 sync
+= self
.add_carry_out
.eq(add_carry
)
56 sub_out
, sub_carry
= self
.a
.sub_op(self
.a
, self
.b
,
58 sync
+= self
.sub_output
.eq(sub_out
)
59 sync
+= self
.sub_carry_out
.eq(sub_carry
)
61 sync
+= self
.neg_output
.eq(-self
.a
)
63 sync
+= self
.ls_output
.eq(self
.a
<< self
.b
)
64 ppts
= self
.partpoints
65 sync
+= self
.mux_out
.eq(PMux(m
, ppts
, self
.mux_sel
, self
.a
, self
.b
))
67 comb
+= self
.bsig
.eq(self
.b
.sig
)
68 sync
+= self
.ls_scal_output
.eq(self
.a
<< self
.bsig
)