integration/SoCMemRegion: use type instead of io_region/linker_region and export type to csv/json

Supported types: "cached", "io", "cached+linker", "io+linker", default="cached"
This commit is contained in:
Florent Kermarrec 2019-10-30 16:31:27 +01:00
parent 9fcf297387
commit a0c0a6fd05
4 changed files with 22 additions and 17 deletions

View File

@ -77,11 +77,11 @@ def SoCConstant(value):
return value return value
class SoCMemRegion: class SoCMemRegion:
def __init__(self, origin, length, io_region=False, linker_region=False): def __init__(self, origin, length, type):
assert type in ["cached", "io", "cached+linker", "io+linker"]
self.origin = origin self.origin = origin
self.length = length self.length = length
self.io_region = io_region self.type = type
self.linker_region = linker_region
class SoCCSRRegion: class SoCCSRRegion:
def __init__(self, origin, busword, obj): def __init__(self, origin, busword, obj):

View File

@ -243,7 +243,8 @@ def get_csr_json(csr_regions={}, constants={}, mem_regions={}):
for name, region in mem_regions.items(): for name, region in mem_regions.items():
d["memories"][name.lower()] = { d["memories"][name.lower()] = {
"base": region.origin, "base": region.origin,
"size": region.length "size": region.length,
"type": region.type,
} }
return json.dumps(d, indent=4) return json.dumps(d, indent=4)
@ -264,7 +265,9 @@ def get_csr_csv(csr_regions={}, constants={}, mem_regions={}):
for name, value in d["constants"].items(): for name, value in d["constants"].items():
r += "constant,{},{},,\n".format(name, value) r += "constant,{},{},,\n".format(name, value)
for name in d["memories"].keys(): for name in d["memories"].keys():
r += "memory_region,{},0x{:08x},{:d},\n".format(name, r += "memory_region,{},0x{:08x},{:d},{:s}\n".format(name,
d["memories"][name]["base"], d["memories"][name]["base"],
d["memories"][name]["size"]) d["memories"][name]["size"],
d["memories"][name]["type"],
)
return r return r

View File

@ -379,7 +379,7 @@ class SoCCore(Module):
r0 = regions[n0] r0 = regions[n0]
for n1 in list(regions.keys())[i+1:]: for n1 in list(regions.keys())[i+1:]:
r1 = regions[n1] r1 = regions[n1]
if r0.linker_region or r1.linker_region: if ("linker" in r0.type) or ("linker" in r1.type):
continue continue
if r0.origin >= (r1.origin + r1.length): if r0.origin >= (r1.origin + r1.length):
continue continue
@ -389,14 +389,16 @@ class SoCCore(Module):
i += 1 i += 1
return None return None
def add_memory_region(self, name, origin, length, io_region=False, linker_region=False): def add_memory_region(self, name, origin, length, type="cached", io_region=False):
if io_region: # 2019-10-30: io_region retro-compatibility
deprecated_warning(": io_region replaced by type=\"io\".")
type = "io"
length = 2**log2_int(length, False) length = 2**log2_int(length, False)
if io_region: if "io" in type:
self.check_io_region(name, origin, length) self.check_io_region(name, origin, length)
if name in self.mem_regions.keys(): if name in self.mem_regions.keys():
raise ValueError("Memory region conflict, {} name already used".format(name)) raise ValueError("Memory region conflict, {} name already used".format(name))
self.mem_regions[name] = SoCMemRegion(origin, length, self.mem_regions[name] = SoCMemRegion(origin, length, type)
io_region=io_region, linker_region=linker_region)
overlap = self.check_regions_overlap(self.mem_regions) overlap = self.check_regions_overlap(self.mem_regions)
if overlap is not None: if overlap is not None:
raise ValueError("Memory region conflict between {} and {}".format(overlap[0], overlap[1])) raise ValueError("Memory region conflict between {} and {}".format(overlap[0], overlap[1]))

View File

@ -54,10 +54,10 @@ class CSRRegister:
class CSRMemoryRegion: class CSRMemoryRegion:
def __init__(self, base, size): def __init__(self, base, size, type):
self.base = base self.base = base
self.size = size self.size = size
self.type = type
class CSRBuilder: class CSRBuilder:
def __init__(self, comm, csr_csv, csr_data_width=None): def __init__(self, comm, csr_csv, csr_data_width=None):
@ -115,7 +115,7 @@ class CSRBuilder:
def build_memories(self): def build_memories(self):
d = {} d = {}
for item in self.items: for item in self.items:
group, name, base, size, dummy1 = item group, name, base, size, type = item
if group == "memory_region": if group == "memory_region":
d[name] = CSRMemoryRegion(int(base, 16), int(size)) d[name] = CSRMemoryRegion(int(base, 16), int(size), type)
return CSRElements(d) return CSRElements(d)