[Libre-soc-bugs] [Bug 713] PartitionedSignal enhancement to add partition-context-aware lengths

bugzilla-daemon at libre-soc.org bugzilla-daemon at libre-soc.org
Wed Oct 6 22:03:43 BST 2021


https://bugs.libre-soc.org/show_bug.cgi?id=713

--- Comment #20 from Jacob Lifshay <programmerjake at gmail.com> ---
wip layout demo script:
from collections.abc import Mapping
from pprint import pprint
# stuff to let it run as stand-alone script
class Shape:
    @staticmethod
    def cast(v):
        if isinstance(v, Shape):
            return v
        assert isinstance(v, int)
        return Shape(v, False)

    def __init__(self, width=1, signed=False):
        self.width = width
        self.signed = signed

    def __repr__(self):
        if self.signed:
            return f"signed({self.width})"
        return f"unsigned({self.width})"

def signed(w):
    return Shape(w, True)

def unsigned(w):
    return Shape(w, False)

def PartitionPoints(pp):
    return pp

# main fn
def layout(elwid, part_counts, lane_shapes):
    if not isinstance(lane_shapes, Mapping):
        lane_shapes = {i: lane_shapes for i in part_counts}
    lane_shapes = {i: Shape.cast(lane_shapes[i]) for i in part_counts}
    signed = lane_shapes[0].signed
    assert all(i.signed == signed for i in lane_shapes.values())
    part_wid = -min(-lane_shapes[i].width // c for i, c in part_counts.items())
    part_count = max(part_counts.values())
    width = part_wid * part_count
    points = {}
    for i, c in part_counts.items():
        def add_p(p):
            points[p] = points.get(p, False) | (elwid == i)
        for start in range(0, part_count, c):
            add_p(start * part_wid) # start of lane
            add_p(start * part_wid + lane_shapes[i].width) # start of padding
    points.pop(0, None)
    points.pop(width, None)
    return (PartitionPoints(points), Shape(width, signed), lane_shapes,
        part_wid, part_count)


part_counts = {
    0: 1,
    1: 1,
    2: 2,
    3: 4,
}

for i in range(4):
    pprint((i, layout(i, part_counts, unsigned(3))))

for i in range(4):
    l = {0: signed(5), 1: signed(6), 2: signed(12), 3: signed(24)}
    pprint((i, layout(i, part_counts, l)))

-- 
You are receiving this mail because:
You are on the CC list for the bug.


More information about the libre-soc-bugs mailing list