From b45c9546eb2444dee6c6af11d100819561f414da Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Sun, 9 Sep 2012 19:33:55 +0200 Subject: [PATCH] fhdl/namer: better handling of indices --- migen/fhdl/namer.py | 54 +++++++++++++++++++++++++++++++---------- migen/fhdl/structure.py | 2 +- migen/fhdl/tracer.py | 3 ++- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/migen/fhdl/namer.py b/migen/fhdl/namer.py index 9d32a9ad..4f5e317e 100644 --- a/migen/fhdl/namer.py +++ b/migen/fhdl/namer.py @@ -8,17 +8,35 @@ def _bin(sig_iters): # advance by one in the trace of each signal status = [] for signal, it in sig_iters: - if it is not None: - step, last = next(it) - status.append((signal, it, step, last)) + step, last = next(it) + status.append((signal, it, step, last)) # build bins accordingly - bins = defaultdict(list) + bins = defaultdict(lambda: defaultdict(list)) for signal, it, (stepname, stepidx), last in status: if last: it = None - bins[stepname].append((stepidx, signal, it)) - return bins + bins[stepname][stepidx].append((signal, it)) + + r = [] + # merge bins when all step indices differ + for stepname, stepname_d in bins.items(): + if all(len(content) == 1 for content in stepname_d.values()): + r.append((stepname, [(stepidx, signal, it) + for stepidx, stepidx_d in stepname_d.items() + for signal, it in stepidx_d])) + else: + for stepidx, stepidx_d in stepname_d.items(): + r.append((stepname, [(stepidx, signal, it) + for signal, it in stepidx_d])) + + #for stepname, content in r: + #print("Bin: " + stepname) + #for stepidx, signal, it in content: + #print(" stepidx:" + str(stepidx) + " " + str(signal) + " " + str(it)) + #print("++++++++++") + + return r def _sets_disjoint(l): for s1, s2 in combinations(l, 2): @@ -35,7 +53,7 @@ def _r_build_pnd(sig_iters): bins_named = [] stepindices = {} - for stepname, next_steps in bins.items(): + for stepname, next_steps in bins: bin_content = [] for stepidx, signal, it in next_steps: if it is None: @@ -50,12 +68,13 @@ def _r_build_pnd(sig_iters): if not _sets_disjoint(name_sets): for prefix, sub_pnd in bins_named: for signal, subname in sub_pnd.items(): - subname = prefix + "_" + subname + subname = (prefix, subname) subnames[signal] = subname mentions[subname].append(signal) else: for prefix, sub_pnd in bins_named: for signal, subname in sub_pnd.items(): + subname = ("", subname) subnames[signal] = subname mentions[subname].append(signal) @@ -64,16 +83,25 @@ def _r_build_pnd(sig_iters): v.sort(key=lambda x: stepindices[x]) r = {} - for stepname, next_steps in bins.items(): + for stepname, next_steps in bins: for stepidx, signal, it in next_steps: if it is None: name = stepname + prefix = "" else: - name = subnames[signal] - if len(mentions[name]) > 1: - r[signal] = name + str(index_id(mentions[name], signal)) + prefix = subnames[signal][0] + name = subnames[signal][1] + mention = mentions[(prefix, name)] + if prefix: + if len(mention) > 1: + r[signal] = prefix + str(index_id(mention, signal)) + "_" + name + else: + r[signal] = prefix + "_" + name else: - r[signal] = name + if len(mention) > 1: + r[signal] = name + str(index_id(mention, signal)) + else: + r[signal] = name return r diff --git a/migen/fhdl/structure.py b/migen/fhdl/structure.py index bf86e162..546066e2 100644 --- a/migen/fhdl/structure.py +++ b/migen/fhdl/structure.py @@ -168,7 +168,7 @@ class Signal(Value): return id(self) def __repr__(self): - return "" + return "" # statements diff --git a/migen/fhdl/tracer.py b/migen/fhdl/tracer.py index d89796ab..1bf33106 100644 --- a/migen/fhdl/tracer.py +++ b/migen/fhdl/tracer.py @@ -61,7 +61,8 @@ def trace_back(varname=None): modules = frame.f_globals["__name__"] modules = modules.split(".") coname = modules[len(modules)-1] - l.insert(0, (coname, -1)) + l.insert(0, (coname, name_to_idx[coname])) + name_to_idx[coname] += 1 else: classname = obj.__class__.__name__.lower() try: -- 2.30.2