Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: m-labs/migen
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: c1fe6d1633b9
Choose a base ref
...
head repository: m-labs/migen
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 0e195da3c083
Choose a head ref
  • 2 commits
  • 2 files changed
  • 1 contributor

Commits on Aug 2, 2013

  1. bank/description/AutoCSR: prefix csr/mem only once

    Sebastien Bourdeauducq committed Aug 2, 2013
    Copy the full SHA
    2a296ac View commit details
  2. Copy the full SHA
    0e195da View commit details
Showing with 26 additions and 6 deletions.
  1. +8 −0 migen/bank/csrgen.py
  2. +18 −6 migen/bank/description.py
8 changes: 8 additions & 0 deletions migen/bank/csrgen.py
Original file line number Diff line number Diff line change
@@ -4,6 +4,14 @@
from migen.bus import csr
from migen.bank.description import *

def get_offset(description, name, csr_data_width=8):
offset = 0
for c in description:
if c.name == name:
return offset
offset += (c.size + csr_data_width - 1)//csr_data_width
raise KeyError("CSR not found: "+name)

class Bank(Module):
def __init__(self, description, address=0, bus=None):
if bus is None:
24 changes: 18 additions & 6 deletions migen/bank/description.py
Original file line number Diff line number Diff line change
@@ -84,28 +84,36 @@ def do_finalize(self, busword):
else:
self.sync += If(sc.re, self.storage_full[lo:hi].eq(sc.r))

def csrprefix(prefix, csrs):
def csrprefix(prefix, csrs, done):
for csr in csrs:
csr.name = prefix + csr.name
if csr.huid not in done:
csr.name = prefix + csr.name
done.add(csr.huid)

def memprefix(prefix, memories):
def memprefix(prefix, memories, done):
for memory in memories:
memory.name_override = prefix + memory.name_override
if memory.huid not in done:
memory.name_override = prefix + memory.name_override
done.add(memory.huid)

class AutoCSR:
def get_memories(self):
try:
exclude = self.autocsr_exclude
except AttributeError:
exclude = {}
try:
prefixed = self.__prefixed
except AttributeError:
prefixed = self.__prefixed = set()
r = []
for k, v in self.__dict__.items():
if k not in exclude:
if isinstance(v, Memory):
r.append(v)
elif hasattr(v, "get_memories") and callable(v.get_memories):
memories = v.get_memories()
memprefix(k + "_", memories)
memprefix(k + "_", memories, prefixed)
r += memories
return sorted(r, key=lambda x: x.huid)

@@ -114,13 +122,17 @@ def get_csrs(self):
exclude = self.autocsr_exclude
except AttributeError:
exclude = {}
try:
prefixed = self.__prefixed
except AttributeError:
prefixed = self.__prefixed = set()
r = []
for k, v in self.__dict__.items():
if k not in exclude:
if isinstance(v, _CSRBase):
r.append(v)
elif hasattr(v, "get_csrs") and callable(v.get_csrs):
csrs = v.get_csrs()
csrprefix(k + "_", csrs)
csrprefix(k + "_", csrs, prefixed)
r += csrs
return sorted(r, key=lambda x: x.huid)