Skip to content

Commit ef328d3

Browse files
committed
feat: add packed register type
1 parent 64532c7 commit ef328d3

2 files changed

Lines changed: 31 additions & 5 deletions

File tree

vendor/lowrisc_opentitan/util/reggen/reg_block.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,14 @@ def add_raw(self, where: str, raw: object) -> None:
119119
'reserved': self._handle_reserved,
120120
'skipto': self._handle_skipto,
121121
'window': self._handle_window,
122-
'multireg': self._handle_multireg
122+
'multireg': self._handle_multireg,
123+
'packed': self._handle_packed
123124
}
124125

125126
entry_type = 'register'
126127
entry_body = entry # type: object
127128

128-
for t in ['reserved', 'skipto', 'window', 'multireg']:
129+
for t in ['reserved', 'skipto', 'window', 'multireg', 'packed']:
129130
t_body = entry.get(t)
130131
if t_body is not None:
131132
# Special entries look like { window: { ... } }, so if we
@@ -207,6 +208,25 @@ def _handle_multireg(self, where: str, body: object) -> None:
207208
self.entries.append(mr)
208209
self.offset = mr.next_offset(self._addrsep)
209210

211+
def _handle_packed(self, where: str, body: object) -> None:
212+
reg_bodies = check_list(body, 'packed')
213+
local_offset = 0
214+
for i, body in enumerate(reg_bodies):
215+
reg = Register.from_raw(self._reg_width, self.offset, self._params, body)
216+
if i < len(reg_bodies) - 1:
217+
reg.doesnt_increment_offset = True
218+
219+
byte_width = (reg.get_width() + 7) // 8 * 8
220+
221+
for field in reg.fields:
222+
field.bits = field.bits.make_translated(local_offset)
223+
224+
local_offset += byte_width
225+
self.add_register(reg)
226+
227+
if local_offset > self._reg_width:
228+
raise ValueError(f'Packed register is larger than regwidth ({local_offset} > {self._reg_width})')
229+
210230
def add_register(self, reg: Register) -> None:
211231
assert reg.offset == self.offset
212232

vendor/lowrisc_opentitan/util/reggen/register.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ def __init__(self,
9191
shadowed: bool,
9292
fields: List[Field],
9393
update_err_alert: Optional[str],
94-
storage_err_alert: Optional[str]):
94+
storage_err_alert: Optional[str],
95+
doesnt_increment_offset: bool):
9596
super().__init__(offset)
9697
self.name = name
9798
self.desc = desc
@@ -173,6 +174,7 @@ def __init__(self,
173174

174175
self.update_err_alert = update_err_alert
175176
self.storage_err_alert = storage_err_alert
177+
self.doesnt_increment_offset = doesnt_increment_offset
176178

177179
@staticmethod
178180
def from_raw(reg_width: int,
@@ -261,9 +263,12 @@ def from_raw(reg_width: int,
261263
return Register(offset, name, desc, swaccess, hwaccess,
262264
hwext, hwqe, hwre, regwen,
263265
tags, resval, shadowed, fields,
264-
update_err_alert, storage_err_alert)
266+
update_err_alert, storage_err_alert, False)
265267

266268
def next_offset(self, addrsep: int) -> int:
269+
if self.doesnt_increment_offset:
270+
return self.offset
271+
267272
return self.offset + addrsep
268273

269274
def sw_readable(self) -> bool:
@@ -374,7 +379,7 @@ def make_multi(self,
374379
self.swaccess, self.hwaccess,
375380
self.hwext, self.hwqe, self.hwre, new_regwen,
376381
self.tags, new_resval, self.shadowed, new_fields,
377-
self.update_err_alert, self.storage_err_alert)
382+
self.update_err_alert, self.storage_err_alert, False)
378383

379384
def _asdict(self) -> Dict[str, object]:
380385
rd = {
@@ -388,6 +393,7 @@ def _asdict(self) -> Dict[str, object]:
388393
'hwre': str(self.hwre),
389394
'tags': self.tags,
390395
'shadowed': str(self.shadowed),
396+
'doesnt_increment_offset': str(self.doesnt_increment_offset),
391397
}
392398
if self.regwen is not None:
393399
rd['regwen'] = self.regwen

0 commit comments

Comments
 (0)