add PartitionedRepl into PartitionedSignal.__Repl__
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 5 Oct 2021 17:25:27 +0000 (18:25 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 5 Oct 2021 17:25:27 +0000 (18:25 +0100)
uses same auto-module-creation as PCat, PMux and PAssign

src/ieee754/part/partsig.py
src/ieee754/part_repl/prepl.py [new file with mode: 0644]

index a3365d3124a1ea871ed18f6c1fe6e39039254f0d..880ea18b310ef227c63198118fafdb712e03cc88 100644 (file)
@@ -27,6 +27,7 @@ from ieee754.part_mul_add.partpoints import make_partition2, PartitionPoints
 from ieee754.part_mux.part_mux import PMux
 from ieee754.part_ass.passign import PAssign
 from ieee754.part_cat.pcat import PCat
+from ieee754.part_repl.prepl import PRepl
 from operator import or_, xor, and_, not_
 
 from nmigen import (Signal, Const)
@@ -93,7 +94,9 @@ class PartitionedSignal(UserValue):
 
     # TODO, http://bugs.libre-riscv.org/show_bug.cgi?id=458
     #def __Part__(self, offset, width, stride=1, *, src_loc_at=0):
-    #def __Repl__(self, count, *, src_loc_at=0):
+
+    def __Repl__(self, count, *, src_loc_at=0):
+        return PRepl(self.m, self, count, self.partpoints)
 
     def __Cat__(self, *args, src_loc_at=0):
         args = [self] + list(args)
diff --git a/src/ieee754/part_repl/prepl.py b/src/ieee754/part_repl/prepl.py
new file mode 100644 (file)
index 0000000..b2b6495
--- /dev/null
@@ -0,0 +1,27 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+# See Notices.txt for copyright information
+
+"""
+Copyright (C) 2021 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
+
+dynamically-partitionable "repl" class, directly equivalent
+to nmigen Repl
+
+See:
+
+* http://libre-riscv.org/3d_gpu/architecture/dynamic_simd/repl
+* http://bugs.libre-riscv.org/show_bug.cgi?id=709
+
+"""
+
+
+
+modcount = 0 # global for now
+def PRepl(m, repl, qty, mask):
+    from ieee754.part_repl.repl import PartitionedRepl # recursion issue
+    global modcount
+    modcount += 1
+    pc = PartitionedRepl(repl, qty, mask)
+    setattr(m.submodules, "repl%d" % modcount, pc)
+    return pc.output
+