build.res: simplify. NFC.
This commit is contained in:
parent
98497b2075
commit
268fe6330e
|
@ -64,7 +64,7 @@ class ConstraintManager:
|
||||||
raise ConstraintError("Resource {}#{} has already been requested"
|
raise ConstraintError("Resource {}#{} has already been requested"
|
||||||
.format(name, number))
|
.format(name, number))
|
||||||
|
|
||||||
def resolve_dir_xdr(subsignal, dir, xdr):
|
def merge_options(subsignal, dir, xdr):
|
||||||
if isinstance(subsignal.io[0], Subsignal):
|
if isinstance(subsignal.io[0], Subsignal):
|
||||||
if dir is None:
|
if dir is None:
|
||||||
dir = dict()
|
dir = dict()
|
||||||
|
@ -81,7 +81,7 @@ class ConstraintManager:
|
||||||
for sub in subsignal.io:
|
for sub in subsignal.io:
|
||||||
sub_dir = dir.get(sub.name, None)
|
sub_dir = dir.get(sub.name, None)
|
||||||
sub_xdr = xdr.get(sub.name, None)
|
sub_xdr = xdr.get(sub.name, None)
|
||||||
dir[sub.name], xdr[sub.name] = resolve_dir_xdr(sub, sub_dir, sub_xdr)
|
dir[sub.name], xdr[sub.name] = merge_options(sub, sub_dir, sub_xdr)
|
||||||
else:
|
else:
|
||||||
if dir is None:
|
if dir is None:
|
||||||
dir = subsignal.io[0].dir
|
dir = subsignal.io[0].dir
|
||||||
|
@ -100,52 +100,39 @@ class ConstraintManager:
|
||||||
.format(subsignal.io[0], xdr))
|
.format(subsignal.io[0], xdr))
|
||||||
return dir, xdr
|
return dir, xdr
|
||||||
|
|
||||||
dir, xdr = resolve_dir_xdr(resource, dir, xdr)
|
def resolve(subsignal, dir, xdr, name):
|
||||||
|
|
||||||
def get_value(subsignal, dir, xdr, name):
|
|
||||||
if isinstance(subsignal.io[0], Subsignal):
|
if isinstance(subsignal.io[0], Subsignal):
|
||||||
fields = OrderedDict()
|
fields = OrderedDict()
|
||||||
for sub in subsignal.io:
|
for sub in subsignal.io:
|
||||||
fields[sub.name] = get_value(sub, dir[sub.name], xdr[sub.name],
|
fields[sub.name] = resolve(sub, dir[sub.name], xdr[sub.name],
|
||||||
"{}__{}".format(name, sub.name))
|
name="{}__{}".format(name, sub.name))
|
||||||
rec = Record([
|
return Record([
|
||||||
(f_name, f.layout) for (f_name, f) in fields.items()
|
(f_name, f.layout) for (f_name, f) in fields.items()
|
||||||
], fields=fields, name=name)
|
], fields=fields, name=name)
|
||||||
return rec
|
|
||||||
elif isinstance(subsignal.io[0], DiffPairs):
|
|
||||||
pairs = subsignal.io[0]
|
|
||||||
return Pin(len(pairs), dir, xdr, name=name)
|
|
||||||
elif isinstance(subsignal.io[0], Pins):
|
|
||||||
pins = subsignal.io[0]
|
|
||||||
return Pin(len(pins), dir, xdr, name=name)
|
|
||||||
else:
|
|
||||||
assert False # :nocov:
|
|
||||||
|
|
||||||
value_name = "{}_{}".format(resource.name, resource.number)
|
elif isinstance(subsignal.io[0], (Pins, DiffPairs)):
|
||||||
value = get_value(resource, dir, xdr, value_name)
|
phys = subsignal.io[0]
|
||||||
|
pin = Pin(len(phys), dir, xdr, name=name)
|
||||||
|
|
||||||
def match_constraints(value, subsignal):
|
if isinstance(phys, Pins):
|
||||||
if isinstance(subsignal.io[0], Subsignal):
|
|
||||||
for sub in subsignal.io:
|
|
||||||
yield from match_constraints(value[sub.name], sub)
|
|
||||||
else:
|
|
||||||
assert isinstance(value, Pin)
|
|
||||||
yield (value, subsignal.io[0], subsignal.extras)
|
|
||||||
|
|
||||||
for (pin, io, extras) in match_constraints(value, resource):
|
|
||||||
if isinstance(io, Pins):
|
|
||||||
port = Signal(pin.width, name="{}_io".format(pin.name))
|
port = Signal(pin.width, name="{}_io".format(pin.name))
|
||||||
self._se_pins.append((pin, port))
|
self._se_pins.append((pin, port))
|
||||||
self._ports.append((port, io.names, extras))
|
self._ports.append((port, phys.names, subsignal.extras))
|
||||||
elif isinstance(io, DiffPairs):
|
|
||||||
|
if isinstance(phys, DiffPairs):
|
||||||
p_port = Signal(pin.width, name="{}_p".format(pin.name))
|
p_port = Signal(pin.width, name="{}_p".format(pin.name))
|
||||||
n_port = Signal(pin.width, name="{}_n".format(pin.name))
|
n_port = Signal(pin.width, name="{}_n".format(pin.name))
|
||||||
self._dp_pins.append((pin, p_port, n_port))
|
self._dp_pins.append((pin, p_port, n_port))
|
||||||
self._ports.append((p_port, io.p.names, extras))
|
self._ports.append((p_port, phys.p.names, subsignal.extras))
|
||||||
self._ports.append((n_port, io.n.names, extras))
|
self._ports.append((n_port, phys.n.names, subsignal.extras))
|
||||||
|
|
||||||
|
return pin
|
||||||
else:
|
else:
|
||||||
assert False # :nocov:
|
assert False # :nocov:
|
||||||
|
|
||||||
|
value = resolve(resource,
|
||||||
|
*merge_options(resource, dir, xdr),
|
||||||
|
name="{}_{}".format(resource.name, resource.number))
|
||||||
self.requested[resource.name, resource.number] = value
|
self.requested[resource.name, resource.number] = value
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue