bec2ebdd9587b2af320d5489830158b9fad4cffc
[libreriscv.git] / 3d_gpu / architecture / dynamic_simd / assign.mdwn
1 # PartitionedSignal nmigen-aware eq (assign)
2
3 * <https://bugs.libre-soc.org/show_bug.cgi?id=709>
4
5 For copying (assigning) PartitionedSignal to PartitionedSignal
6 of equal size there is no issue. However if the source has a
7 greater width than the target, *partition-aware* truncation
8 must occur. For the opposite, sign/zero extension must occur.
9 Finally for a Signal or Const, duplication across all Partitions
10 must occur, again, following the rules of zero, sign or unsigned.
11
12 Take two PartitionedSignals (source a, dest b) of 32 bit:
13
14 partition: p p p (3 bits)
15 a : AAA3 AAA2 AAA1 AAA0 (32 bits)
16 b : BBB3 BBB2 BBB1 BBB0 (32 bits)
17
18 For all partition settings this copies verbatim. Also,
19 when A is longer, a truncated version of A is always
20 copied verbatim, regardless of partition settings.
21 However if A
22 is shorter than B:
23
24 partition: p p p (3 bits)
25 a : A7A6 A5A4 A3A2 A1A0 (8 bits)
26 b : BBB3 BBB2 BBB1 BBB0 (16 bits)
27
28 then it matters what the partition settings are:
29
30 | partition | o3 | o2 | o1 | o0 |
31 | --------- | -- | -- | -- | -- |
32 | 000 | [A7A7A7A7] | [A7A7A7A7] | A7A6A5A4 | A3A2A1A0 |
33 | 001 | [A7A7A7A7] | [A7A7]A7A6 | A5A4A3A2 | [A1A1]A1A0 |
34 | 010 | [A7A7A7A7] | A7A6A5A4 | [A3A3A3A3] | A3A2A1A0 |
35 | 011 | [A7A7A7A7] | A7A6A5A4 | [A3A3]A3A2 | [A1A1]A1A0 |
36 | 100 | [A7A7]A7A6 | [A5A5A5A5] | [A5A5]A5A4 | A3A2A1A0 |
37 | 101 | [A7A7]A7A6 | [A5A5A5A5] | A5A4A3A2 | [A1A1]A1A0 |
38 | 110 | [A7A7]A7A6 | [A5A5]A5A4 | [A3A3A3A3] | A3A2A1A0 |
39 | 111 | [A7A7]A7A6 | [A5A5]A5A4 | [A3A3]A3A2 | [A1A1]A1A0 |
40
41 where square brackets are zero if A is unsigned, and contains
42 the specified bits if signed. Here, each partition copies the
43 smaller value (A) into the larger partition (B) then, depending
44 on whether A is signed or unsigned, sign-extends or zero-extends
45 *on a per-partition basis*.
46
47 When the source A is scalar and is equal or larger than
48 the destination it requires copying across multiple
49 partitions:
50
51 partition: p p p (3 bits)
52 a : AAAA AAAA AAAA AAAA (16 bits)
53 b : B7B6 B5B4 B3B2 B1B0 (8 bits)
54
55 The partition options are:
56
57 | partition | o3 | o2 | o1 | o0 |
58 | --------- | -- | -- | -- | -- |
59 | 000 | A7A6 | A5A4 | A3A2 | A1A0 |
60 | 001 | A5A4 | A3A2 | A1A0 | A1A0 |
61 | 010 | A3A2 | A1A0 | A3A2 | A1A0 |
62 | 100 | A1A0 | A5A4 | A3A2 | A1A0 |
63 | 111 | A1A0 | A1A0 | A1A0 | A1A0 |