mirror of
https://github.com/Silicon1602/srdl2sv.git
synced 2024-12-22 15:08:39 +00:00
Repair multi-enumerations in one regfile bug
When a regfile did use enumerations from multiple scopes this messed up the eventual packages because every regfile only assumed 1 scope. This is fixed now. TODO: Check what happens if enums are defined in the register scope.
This commit is contained in:
parent
d3bfdeb3f0
commit
8756945a6d
@ -303,11 +303,12 @@ class AddrMap(Component):
|
|||||||
|
|
||||||
# First go through all registers in this scope to generate a package
|
# First go through all registers in this scope to generate a package
|
||||||
package_rtl = []
|
package_rtl = []
|
||||||
enum_rtl = []
|
|
||||||
rtl_return = dict()
|
rtl_return = dict()
|
||||||
|
|
||||||
# Need to keep track of enum names since they shall be unique
|
# Need to keep track of enum names since they shall be unique
|
||||||
# per scope
|
# per scope
|
||||||
|
enum_rtl = dict()
|
||||||
|
enum_rtl[self.name] = []
|
||||||
enum_members = dict()
|
enum_members = dict()
|
||||||
|
|
||||||
for i in self.registers.values():
|
for i in self.registers.values():
|
||||||
@ -344,26 +345,33 @@ class AddrMap(Component):
|
|||||||
max_name_width = max_name_width,
|
max_name_width = max_name_width,
|
||||||
name = var[0]))
|
name = var[0]))
|
||||||
|
|
||||||
enum_rtl.append(
|
enum_rtl[self.name].append(
|
||||||
AddrMap.templ_dict['enum_declaration']['rtl'].format(
|
AddrMap.templ_dict['enum_declaration']['rtl'].format(
|
||||||
width=value.width-1,
|
width=value.width-1,
|
||||||
name = key,
|
name = key,
|
||||||
enum_var_list = ',\n'.join(variable_list)))
|
enum_var_list = ',\n'.join(variable_list)))
|
||||||
|
|
||||||
package_rtl =\
|
|
||||||
AddrMap.templ_dict['package_declaration']['rtl'].format(
|
|
||||||
name = self.name,
|
|
||||||
pkg_content = '\n\n'.join(enum_rtl))
|
|
||||||
|
|
||||||
|
|
||||||
rtl_return[self.name] = AddrMap.add_tabs(
|
|
||||||
package_rtl,
|
|
||||||
tab_width,
|
|
||||||
real_tabs)
|
|
||||||
|
|
||||||
# Invoke get_package_rtl method from regfiles
|
# Invoke get_package_rtl method from regfiles
|
||||||
[rtl_return.update(x.get_package_rtl(tab_width, real_tabs))
|
for regfile in self.regfiles.values():
|
||||||
for x in self.regfiles.values()]
|
for key, value in regfile.get_package_rtl().items():
|
||||||
|
if key in enum_rtl:
|
||||||
|
enum_rtl[key] = [*enum_rtl[key], *value]
|
||||||
|
else:
|
||||||
|
enum_rtl[key] = value
|
||||||
|
|
||||||
|
# Create RTL to return
|
||||||
|
for key, value in enum_rtl.items():
|
||||||
|
package_rtl =\
|
||||||
|
AddrMap.templ_dict['package_declaration']['rtl'].format(
|
||||||
|
name = key,
|
||||||
|
pkg_content = '\n\n'.join(enum_rtl[key]))
|
||||||
|
|
||||||
|
|
||||||
|
rtl_return[key] = AddrMap.add_tabs(
|
||||||
|
package_rtl,
|
||||||
|
tab_width,
|
||||||
|
real_tabs)
|
||||||
|
|
||||||
return rtl_return
|
return rtl_return
|
||||||
|
|
||||||
|
@ -200,25 +200,23 @@ class RegFile(Component):
|
|||||||
|
|
||||||
return names
|
return names
|
||||||
|
|
||||||
def get_package_rtl(self, tab_width: int = 4, real_tabs = False) -> dict():
|
def get_package_rtl(self) -> dict():
|
||||||
if not self.config['enums']:
|
if not self.config['enums']:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# First go through all registers in this scope to generate a package
|
# First go through all registers in this scope to generate a package
|
||||||
package_rtl = []
|
package_rtl = []
|
||||||
enum_rtl = []
|
enum_rtl = dict()
|
||||||
rtl_return = list()
|
rtl_return = list()
|
||||||
|
|
||||||
# Need to keep track of enum names since they shall be unique
|
# Need to keep track of enum names since they shall be unique
|
||||||
# per scope
|
# per scope
|
||||||
enum_members = dict()
|
enum_members = dict()
|
||||||
enum_found = False
|
|
||||||
|
|
||||||
for i in self.registers.values():
|
for i in self.registers.values():
|
||||||
for key, value in i.get_typedefs().items():
|
for key, value in i.get_typedefs().items():
|
||||||
if not enum_found:
|
if value.scope not in enum_rtl:
|
||||||
enum_found = True
|
enum_rtl[value.scope] = []
|
||||||
scope = value.scope
|
|
||||||
|
|
||||||
variable_list = []
|
variable_list = []
|
||||||
|
|
||||||
@ -241,7 +239,7 @@ class RegFile(Component):
|
|||||||
"Exiting...".format(
|
"Exiting...".format(
|
||||||
var[0],
|
var[0],
|
||||||
enum_members[var[0]],
|
enum_members[var[0]],
|
||||||
"::".join([self.name, key])))
|
"::".join([value.scope, key])))
|
||||||
|
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
@ -252,27 +250,13 @@ class RegFile(Component):
|
|||||||
max_name_width = max_name_width,
|
max_name_width = max_name_width,
|
||||||
name = var[0]))
|
name = var[0]))
|
||||||
|
|
||||||
enum_rtl.append(
|
enum_rtl[value.scope].append(
|
||||||
RegFile.templ_dict['enum_declaration']['rtl'].format(
|
RegFile.templ_dict['enum_declaration']['rtl'].format(
|
||||||
width=value.width-1,
|
width=value.width-1,
|
||||||
name = key,
|
name = key,
|
||||||
enum_var_list = ',\n'.join(variable_list)))
|
enum_var_list = ',\n'.join(variable_list)))
|
||||||
|
|
||||||
if enum_found:
|
return enum_rtl
|
||||||
package_rtl =\
|
|
||||||
RegFile.templ_dict['package_declaration']['rtl'].format(
|
|
||||||
name = scope,
|
|
||||||
pkg_content = '\n\n'.join(enum_rtl))
|
|
||||||
|
|
||||||
|
|
||||||
return {scope:
|
|
||||||
RegFile.add_tabs(
|
|
||||||
package_rtl,
|
|
||||||
tab_width,
|
|
||||||
real_tabs)
|
|
||||||
}
|
|
||||||
else:
|
|
||||||
return {None: None}
|
|
||||||
|
|
||||||
def get_regwidth(self) -> int:
|
def get_regwidth(self) -> int:
|
||||||
return self.regwidth
|
return self.regwidth
|
||||||
|
Loading…
Reference in New Issue
Block a user