build.res: simplify. NFC.

This commit is contained in:
whitequark 2019-06-03 01:28:34 +00:00
parent 98497b2075
commit 268fe6330e

View file

@ -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): elif isinstance(subsignal.io[0], (Pins, DiffPairs)):
pairs = subsignal.io[0] phys = subsignal.io[0]
return Pin(len(pairs), dir, xdr, name=name) pin = Pin(len(phys), dir, xdr, name=name)
elif isinstance(subsignal.io[0], Pins):
pins = subsignal.io[0] if isinstance(phys, Pins):
return Pin(len(pins), dir, xdr, name=name) port = Signal(pin.width, name="{}_io".format(pin.name))
else: self._se_pins.append((pin, port))
assert False # :nocov: self._ports.append((port, phys.names, subsignal.extras))
value_name = "{}_{}".format(resource.name, resource.number) if isinstance(phys, DiffPairs):
value = get_value(resource, dir, xdr, value_name) p_port = Signal(pin.width, name="{}_p".format(pin.name))
n_port = Signal(pin.width, name="{}_n".format(pin.name))
def match_constraints(value, subsignal): self._dp_pins.append((pin, p_port, n_port))
if isinstance(subsignal.io[0], Subsignal): self._ports.append((p_port, phys.p.names, subsignal.extras))
for sub in subsignal.io: self._ports.append((n_port, phys.n.names, subsignal.extras))
yield from match_constraints(value[sub.name], sub)
else: return pin
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))
self._se_pins.append((pin, port))
self._ports.append((port, io.names, extras))
elif isinstance(io, DiffPairs):
p_port = Signal(pin.width, name="{}_p".format(pin.name))
n_port = Signal(pin.width, name="{}_n".format(pin.name))
self._dp_pins.append((pin, p_port, n_port))
self._ports.append((p_port, io.p.names, extras))
self._ports.append((n_port, io.n.names, extras))
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